prompt: We are currently solving the following issue within our repository. Here is the issue text:
  --- BEGIN ISSUE ---
  chore: Replace deprecated bootstrap features with alternatives
  ### Description
  
  Throughout the code. As suggested by @NGPixel.
  
  ### Code of Conduct
  
  - [X] I agree to follow the [IETF's Code of Conduct](https://github.com/ietf-tools/.github/blob/main/CODE_OF_CONDUCT.md)
  
  --- END ISSUE ---
  
  Below are some code segments, each from a relevant file. One or more of these files may contain bugs.
  --- BEGIN FILES ---
  Path: `ietf/ietfauth/widgets.py`
  Content:
  ```
  1 from django.forms import PasswordInput
  2 from django.utils.safestring import mark_safe
  3 from django.utils.translation import gettext as _
  4 
  5 # The PasswordStrengthInput and PasswordConfirmationInput widgets come from the
  6 # django-password-strength project, https://pypi.org/project/django-password-strength/
  7 #
  8 # Original license:
  9 #
  10 # Copyright &copy; 2015 A.J. May and individual contributors. All rights reserved.
  11 #
  12 # Redistribution and use in source and binary forms, with or without modification, are permitted provided that the 
  13 # following conditions are met:
  14 #
  15 # 1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following
  16 # disclaimer.
  17 # 
  18 # 2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the 
  19 # following disclaimer in the documentation and/or other materials provided with the distribution.
  20 # 
  21 # 3. Neither the name of the copyright holder nor the names of its contributors may be used to endorse or promote 
  22 # products derived from this software without specific prior written permission.
  23 # 
  24 # THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, 
  25 # INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE 
  26 # DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 
  27 # SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR 
  28 # SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, 
  29 # WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE 
  30 # USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
  31 #
  32 
  33 class PasswordStrengthInput(PasswordInput):
  34     """
  35     Form widget to show the user how strong his/her password is.
  36     """
  37 
  38     def render(self, name, value, attrs=None, renderer=None):
  39         strength_markup = """
  40         <div style="margin-top: 10px;">
  41             <div class="progress" style="margin-bottom: 10px;">
  42                 <div class="progress-bar progress-bar-warning password_strength_bar" role="progressbar" aria-valuenow="0" aria-valuemin="0" aria-valuemax="5" style="width: 0%%"></div>
  43             </div>
  44             <p class="text-muted password_strength_info hidden">
  45                 <span class="label label-danger">
  46                     %s
  47                 </span>
  48                 <span style="margin-left:5px;">
  49                     %s
  50                 </span>
  51             </p>
  52         </div>
  53         """ % (
  54             _("Warning"),
  55             _(
  56                 'This password would take <em class="password_strength_time"></em> to crack.'
  57             ),
  58         )
  59 
  60         try:
  61             self.attrs["class"] = "%s password_strength".strip() % self.attrs["class"]
  62         except KeyError:
  63             self.attrs["class"] = "password_strength"
  64 
  65         return mark_safe(
  66             super(PasswordInput, self).render(name, value, attrs, renderer)
  67             + strength_markup
  68         )
  69 
  70     class Media:
  71         js = (
  72             "ietf/js/zxcvbn.js",
  73             "ietf/js/password_strength.js",
  74         )
  75 
  76 
  77 class PasswordConfirmationInput(PasswordInput):
  78     """
  79     Form widget to confirm the users password by letting him/her type it again.
  80     """
  81 
  82     def __init__(self, confirm_with=None, attrs=None, render_value=False):
  83         super(PasswordConfirmationInput, self).__init__(attrs, render_value)
  84         self.confirm_with = confirm_with
  85 
  86     def render(self, name, value, attrs=None, renderer=None):
  87         if self.confirm_with:
  88             self.attrs["data-confirm-with"] = "id_%s" % self.confirm_with
  89             
  90         confirmation_markup = """
  91         <div style="margin-top: 10px;" class="hidden password_strength_info">
  92             <p class="text-muted">
  93                 <span class="label label-danger">
  94                     %s
  95                 </span>
  96                 <span style="margin-left:5px;">%s</span>
  97             </p>
  98         </div>
  99         """ % (
  100             _("Warning"),
  101             _("Your passwords don't match."),
  102         )
  103 
  104         try:
  105             self.attrs["class"] = (
  106                 "%s password_confirmation".strip() % self.attrs["class"]
  107             )
  108         except KeyError:
  109             self.attrs["class"] = "password_confirmation"
  110 
  111         return mark_safe(
  112             super(PasswordInput, self).render(name, value, attrs, renderer)
  113             + confirmation_markup
  114         )
  115
  ```
  --- END FILES ---
  
  Please first localize the bug based on the issue statement, and then generate a patch according to the `git diff` format fenced by three backticks.
  
  Here is an example:
  
  ```diff
  diff --git a/examples/server_async.py b/examples/server_async.py
  --- a/examples/server_async.py
  +++ b/examples/server_async.py
  @@ -313,4 +313,4 @@
   
   
   if __name__ == "__main__":
  -    asyncio.run(run_async_server("."), debug=True)
  +    asyncio.run(run_async_server(), debug=True)
  diff --git a/examples/server_sync.py b/examples/server_sync.py
  --- a/examples/server_sync.py
  +++ b/examples/server_sync.py
  @@ -313,5 +313,5 @@
   
   
   if __name__ == "__main__":
  -    server = run_sync_server(".")
  +    server = run_sync_server()
       server.shutdown()
  
  ```
  
golden_diff: diff --git a/ietf/ietfauth/widgets.py b/ietf/ietfauth/widgets.py
  --- a/ietf/ietfauth/widgets.py
  +++ b/ietf/ietfauth/widgets.py
  @@ -41,7 +41,7 @@
               <div class="progress" style="margin-bottom: 10px;">
                   <div class="progress-bar progress-bar-warning password_strength_bar" role="progressbar" aria-valuenow="0" aria-valuemin="0" aria-valuemax="5" style="width: 0%%"></div>
               </div>
  -            <p class="text-muted password_strength_info hidden">
  +            <p class="text-body-secondary password_strength_info hidden">
                   <span class="label label-danger">
                       %s
                   </span>
  @@ -89,7 +89,7 @@
               
           confirmation_markup = """
           <div style="margin-top: 10px;" class="hidden password_strength_info">
  -            <p class="text-muted">
  +            <p class="text-body-secondary">
                   <span class="label label-danger">
                       %s
                   </span>
  
verification_info: {"golden_diff": "diff --git a/ietf/ietfauth/widgets.py b/ietf/ietfauth/widgets.py\n--- a/ietf/ietfauth/widgets.py\n+++ b/ietf/ietfauth/widgets.py\n@@ -41,7 +41,7 @@\n             <div class=\"progress\" style=\"margin-bottom: 10px;\">\n                 <div class=\"progress-bar progress-bar-warning password_strength_bar\" role=\"progressbar\" aria-valuenow=\"0\" aria-valuemin=\"0\" aria-valuemax=\"5\" style=\"width: 0%%\"></div>\n             </div>\n-            <p class=\"text-muted password_strength_info hidden\">\n+            <p class=\"text-body-secondary password_strength_info hidden\">\n                 <span class=\"label label-danger\">\n                     %s\n                 </span>\n@@ -89,7 +89,7 @@\n             \n         confirmation_markup = \"\"\"\n         <div style=\"margin-top: 10px;\" class=\"hidden password_strength_info\">\n-            <p class=\"text-muted\">\n+            <p class=\"text-body-secondary\">\n                 <span class=\"label label-danger\">\n                     %s\n                 </span>\n", "issue": "chore: Replace deprecated bootstrap features with alternatives\n### Description\n\nThroughout the code. As suggested by @NGPixel.\n\n### Code of Conduct\n\n- [X] I agree to follow the [IETF's Code of Conduct](https://github.com/ietf-tools/.github/blob/main/CODE_OF_CONDUCT.md)\n", "before_files": [{"content": "from django.forms import PasswordInput\nfrom django.utils.safestring import mark_safe\nfrom django.utils.translation import gettext as _\n\n# The PasswordStrengthInput and PasswordConfirmationInput widgets come from the\n# django-password-strength project, https://pypi.org/project/django-password-strength/\n#\n# Original license:\n#\n# Copyright &copy; 2015 A.J. May and individual contributors. All rights reserved.\n#\n# Redistribution and use in source and binary forms, with or without modification, are permitted provided that the \n# following conditions are met:\n#\n# 1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following\n# disclaimer.\n# \n# 2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the \n# following disclaimer in the documentation and/or other materials provided with the distribution.\n# \n# 3. Neither the name of the copyright holder nor the names of its contributors may be used to endorse or promote \n# products derived from this software without specific prior written permission.\n# \n# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, \n# INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE \n# DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, \n# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR \n# SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, \n# WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE \n# USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n#\n\nclass PasswordStrengthInput(PasswordInput):\n    \"\"\"\n    Form widget to show the user how strong his/her password is.\n    \"\"\"\n\n    def render(self, name, value, attrs=None, renderer=None):\n        strength_markup = \"\"\"\n        <div style=\"margin-top: 10px;\">\n            <div class=\"progress\" style=\"margin-bottom: 10px;\">\n                <div class=\"progress-bar progress-bar-warning password_strength_bar\" role=\"progressbar\" aria-valuenow=\"0\" aria-valuemin=\"0\" aria-valuemax=\"5\" style=\"width: 0%%\"></div>\n            </div>\n            <p class=\"text-muted password_strength_info hidden\">\n                <span class=\"label label-danger\">\n                    %s\n                </span>\n                <span style=\"margin-left:5px;\">\n                    %s\n                </span>\n            </p>\n        </div>\n        \"\"\" % (\n            _(\"Warning\"),\n            _(\n                'This password would take <em class=\"password_strength_time\"></em> to crack.'\n            ),\n        )\n\n        try:\n            self.attrs[\"class\"] = \"%s password_strength\".strip() % self.attrs[\"class\"]\n        except KeyError:\n            self.attrs[\"class\"] = \"password_strength\"\n\n        return mark_safe(\n            super(PasswordInput, self).render(name, value, attrs, renderer)\n            + strength_markup\n        )\n\n    class Media:\n        js = (\n            \"ietf/js/zxcvbn.js\",\n            \"ietf/js/password_strength.js\",\n        )\n\n\nclass PasswordConfirmationInput(PasswordInput):\n    \"\"\"\n    Form widget to confirm the users password by letting him/her type it again.\n    \"\"\"\n\n    def __init__(self, confirm_with=None, attrs=None, render_value=False):\n        super(PasswordConfirmationInput, self).__init__(attrs, render_value)\n        self.confirm_with = confirm_with\n\n    def render(self, name, value, attrs=None, renderer=None):\n        if self.confirm_with:\n            self.attrs[\"data-confirm-with\"] = \"id_%s\" % self.confirm_with\n            \n        confirmation_markup = \"\"\"\n        <div style=\"margin-top: 10px;\" class=\"hidden password_strength_info\">\n            <p class=\"text-muted\">\n                <span class=\"label label-danger\">\n                    %s\n                </span>\n                <span style=\"margin-left:5px;\">%s</span>\n            </p>\n        </div>\n        \"\"\" % (\n            _(\"Warning\"),\n            _(\"Your passwords don't match.\"),\n        )\n\n        try:\n            self.attrs[\"class\"] = (\n                \"%s password_confirmation\".strip() % self.attrs[\"class\"]\n            )\n        except KeyError:\n            self.attrs[\"class\"] = \"password_confirmation\"\n\n        return mark_safe(\n            super(PasswordInput, self).render(name, value, attrs, renderer)\n            + confirmation_markup\n        )\n", "path": "ietf/ietfauth/widgets.py"}], "after_files": [{"content": "from django.forms import PasswordInput\nfrom django.utils.safestring import mark_safe\nfrom django.utils.translation import gettext as _\n\n# The PasswordStrengthInput and PasswordConfirmationInput widgets come from the\n# django-password-strength project, https://pypi.org/project/django-password-strength/\n#\n# Original license:\n#\n# Copyright &copy; 2015 A.J. May and individual contributors. All rights reserved.\n#\n# Redistribution and use in source and binary forms, with or without modification, are permitted provided that the \n# following conditions are met:\n#\n# 1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following\n# disclaimer.\n# \n# 2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the \n# following disclaimer in the documentation and/or other materials provided with the distribution.\n# \n# 3. Neither the name of the copyright holder nor the names of its contributors may be used to endorse or promote \n# products derived from this software without specific prior written permission.\n# \n# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, \n# INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE \n# DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, \n# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR \n# SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, \n# WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE \n# USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n#\n\nclass PasswordStrengthInput(PasswordInput):\n    \"\"\"\n    Form widget to show the user how strong his/her password is.\n    \"\"\"\n\n    def render(self, name, value, attrs=None, renderer=None):\n        strength_markup = \"\"\"\n        <div style=\"margin-top: 10px;\">\n            <div class=\"progress\" style=\"margin-bottom: 10px;\">\n                <div class=\"progress-bar progress-bar-warning password_strength_bar\" role=\"progressbar\" aria-valuenow=\"0\" aria-valuemin=\"0\" aria-valuemax=\"5\" style=\"width: 0%%\"></div>\n            </div>\n            <p class=\"text-body-secondary password_strength_info hidden\">\n                <span class=\"label label-danger\">\n                    %s\n                </span>\n                <span style=\"margin-left:5px;\">\n                    %s\n                </span>\n            </p>\n        </div>\n        \"\"\" % (\n            _(\"Warning\"),\n            _(\n                'This password would take <em class=\"password_strength_time\"></em> to crack.'\n            ),\n        )\n\n        try:\n            self.attrs[\"class\"] = \"%s password_strength\".strip() % self.attrs[\"class\"]\n        except KeyError:\n            self.attrs[\"class\"] = \"password_strength\"\n\n        return mark_safe(\n            super(PasswordInput, self).render(name, value, attrs, renderer)\n            + strength_markup\n        )\n\n    class Media:\n        js = (\n            \"ietf/js/zxcvbn.js\",\n            \"ietf/js/password_strength.js\",\n        )\n\n\nclass PasswordConfirmationInput(PasswordInput):\n    \"\"\"\n    Form widget to confirm the users password by letting him/her type it again.\n    \"\"\"\n\n    def __init__(self, confirm_with=None, attrs=None, render_value=False):\n        super(PasswordConfirmationInput, self).__init__(attrs, render_value)\n        self.confirm_with = confirm_with\n\n    def render(self, name, value, attrs=None, renderer=None):\n        if self.confirm_with:\n            self.attrs[\"data-confirm-with\"] = \"id_%s\" % self.confirm_with\n            \n        confirmation_markup = \"\"\"\n        <div style=\"margin-top: 10px;\" class=\"hidden password_strength_info\">\n            <p class=\"text-body-secondary\">\n                <span class=\"label label-danger\">\n                    %s\n                </span>\n                <span style=\"margin-left:5px;\">%s</span>\n            </p>\n        </div>\n        \"\"\" % (\n            _(\"Warning\"),\n            _(\"Your passwords don't match.\"),\n        )\n\n        try:\n            self.attrs[\"class\"] = (\n                \"%s password_confirmation\".strip() % self.attrs[\"class\"]\n            )\n        except KeyError:\n            self.attrs[\"class\"] = \"password_confirmation\"\n\n        return mark_safe(\n            super(PasswordInput, self).render(name, value, attrs, renderer)\n            + confirmation_markup\n        )\n", "path": "ietf/ietfauth/widgets.py"}]}