diff --git a/bleach/_vendor/01_html5lib_six.patch b/bleach/_vendor/01_html5lib_six.patch
new file mode 100644
index 00000000..40df7611
--- /dev/null
+++ b/bleach/_vendor/01_html5lib_six.patch
@@ -0,0 +1,167 @@
+diff --git bleach/_vendor/html5lib/_inputstream.py bleach/_vendor/html5lib/_inputstream.py
+index 0207dd2..0976251 100644
+--- bleach/_vendor/html5lib/_inputstream.py
++++ bleach/_vendor/html5lib/_inputstream.py
+@@ -1,7 +1,7 @@
+ from __future__ import absolute_import, division, unicode_literals
+
+-from six import text_type
+-from six.moves import http_client, urllib
++from bleach.six_shim import text_type
++from bleach.six_shim import http_client, urllib
+
+ import codecs
+ import re
+diff --git bleach/_vendor/html5lib/_tokenizer.py bleach/_vendor/html5lib/_tokenizer.py
+index 4748a19..d884801 100644
+--- bleach/_vendor/html5lib/_tokenizer.py
++++ bleach/_vendor/html5lib/_tokenizer.py
+@@ -1,6 +1,6 @@
+ from __future__ import absolute_import, division, unicode_literals
+
+-from six import unichr as chr
++from bleach.six_shim import unichr as chr
+
+ from collections import deque, OrderedDict
+ from sys import version_info
+diff --git bleach/_vendor/html5lib/_trie/py.py bleach/_vendor/html5lib/_trie/py.py
+index c2ba3da..56f66bd 100644
+--- bleach/_vendor/html5lib/_trie/py.py
++++ bleach/_vendor/html5lib/_trie/py.py
+@@ -1,5 +1,5 @@
+ from __future__ import absolute_import, division, unicode_literals
+-from six import text_type
++from bleach.six_shim import text_type
+
+ from bisect import bisect_left
+
+diff --git bleach/_vendor/html5lib/_utils.py bleach/_vendor/html5lib/_utils.py
+index 9ea5794..635bb02 100644
+--- bleach/_vendor/html5lib/_utils.py
++++ bleach/_vendor/html5lib/_utils.py
+@@ -7,7 +7,7 @@ try:
+ except ImportError:
+ from collections import Mapping
+
+-from six import text_type, PY3
++from bleach.six_shim import text_type, PY3
+
+ if PY3:
+ import xml.etree.ElementTree as default_etree
+diff --git bleach/_vendor/html5lib/filters/lint.py bleach/_vendor/html5lib/filters/lint.py
+index acd4d7a..1340d97 100644
+--- bleach/_vendor/html5lib/filters/lint.py
++++ bleach/_vendor/html5lib/filters/lint.py
+@@ -1,6 +1,6 @@
+ from __future__ import absolute_import, division, unicode_literals
+
+-from six import text_type
++from bleach.six_shim import text_type
+
+ from . import base
+ from ..constants import namespaces, voidElements
+diff --git bleach/_vendor/html5lib/filters/sanitizer.py bleach/_vendor/html5lib/filters/sanitizer.py
+index 70ef906..5c31e97 100644
+--- bleach/_vendor/html5lib/filters/sanitizer.py
++++ bleach/_vendor/html5lib/filters/sanitizer.py
+@@ -12,7 +12,7 @@ import re
+ import warnings
+ from xml.sax.saxutils import escape, unescape
+
+-from six.moves import urllib_parse as urlparse
++from bleach.six_shim import urllib_parse as urlparse
+
+ from . import base
+ from ..constants import namespaces, prefixes
+diff --git bleach/_vendor/html5lib/html5parser.py bleach/_vendor/html5lib/html5parser.py
+index 74d829d..5427b7d 100644
+--- bleach/_vendor/html5lib/html5parser.py
++++ bleach/_vendor/html5lib/html5parser.py
+@@ -1,5 +1,5 @@
+ from __future__ import absolute_import, division, unicode_literals
+-from six import with_metaclass, viewkeys
++from bleach.six_shim import viewkeys
+
+ import types
+
+@@ -423,7 +423,7 @@ def getPhases(debug):
+ return type
+
+ # pylint:disable=unused-argument
+- class Phase(with_metaclass(getMetaclass(debug, log))):
++ class Phase(metaclass=getMetaclass(debug, log)):
+ """Base class for helper object that implements each phase of processing
+ """
+ __slots__ = ("parser", "tree", "__startTagCache", "__endTagCache")
+diff --git bleach/_vendor/html5lib/serializer.py bleach/_vendor/html5lib/serializer.py
+index c66df68..5666f49 100644
+--- bleach/_vendor/html5lib/serializer.py
++++ bleach/_vendor/html5lib/serializer.py
+@@ -1,5 +1,5 @@
+ from __future__ import absolute_import, division, unicode_literals
+-from six import text_type
++from bleach.six_shim import text_type
+
+ import re
+
+diff --git bleach/_vendor/html5lib/treebuilders/base.py bleach/_vendor/html5lib/treebuilders/base.py
+index e4a3d71..2869da0 100644
+--- bleach/_vendor/html5lib/treebuilders/base.py
++++ bleach/_vendor/html5lib/treebuilders/base.py
+@@ -1,5 +1,5 @@
+ from __future__ import absolute_import, division, unicode_literals
+-from six import text_type
++from bleach.six_shim import text_type
+
+ from ..constants import scopingElements, tableInsertModeElements, namespaces
+
+diff --git bleach/_vendor/html5lib/treebuilders/etree.py bleach/_vendor/html5lib/treebuilders/etree.py
+index 086bed4..5ccfc4d 100644
+--- bleach/_vendor/html5lib/treebuilders/etree.py
++++ bleach/_vendor/html5lib/treebuilders/etree.py
+@@ -1,7 +1,7 @@
+ from __future__ import absolute_import, division, unicode_literals
+ # pylint:disable=protected-access
+
+-from six import text_type
++from bleach.six_shim import text_type
+
+ import re
+
+diff --git bleach/_vendor/html5lib/treebuilders/etree_lxml.py bleach/_vendor/html5lib/treebuilders/etree_lxml.py
+index e73de61..f462232 100644
+--- bleach/_vendor/html5lib/treebuilders/etree_lxml.py
++++ bleach/_vendor/html5lib/treebuilders/etree_lxml.py
+@@ -28,7 +28,7 @@ from . import etree as etree_builders
+ from .. import _ihatexml
+
+ import lxml.etree as etree
+-from six import PY3, binary_type
++from bleach.six_shim import PY3, binary_type
+
+
+ fullTree = True
+diff --git bleach/_vendor/html5lib/treewalkers/etree.py bleach/_vendor/html5lib/treewalkers/etree.py
+index 4465337..a9d9450 100644
+--- bleach/_vendor/html5lib/treewalkers/etree.py
++++ bleach/_vendor/html5lib/treewalkers/etree.py
+@@ -3,7 +3,7 @@ from __future__ import absolute_import, division, unicode_literals
+ from collections import OrderedDict
+ import re
+
+-from six import string_types
++from bleach.six_shim import string_types
+
+ from . import base
+ from .._utils import moduleFactoryFactory
+diff --git bleach/_vendor/html5lib/treewalkers/etree_lxml.py bleach/_vendor/html5lib/treewalkers/etree_lxml.py
+index a614ac5..ef42163 100644
+--- bleach/_vendor/html5lib/treewalkers/etree_lxml.py
++++ bleach/_vendor/html5lib/treewalkers/etree_lxml.py
+@@ -1,5 +1,5 @@
+ from __future__ import absolute_import, division, unicode_literals
+-from six import text_type
++from bleach.six_shim import text_type
+
+ from collections import OrderedDict
+
diff --git a/bleach/_vendor/html5lib/_inputstream.py b/bleach/_vendor/html5lib/_inputstream.py
index 0207dd21..09762517 100644
--- a/bleach/_vendor/html5lib/_inputstream.py
+++ b/bleach/_vendor/html5lib/_inputstream.py
@@ -1,7 +1,7 @@
from __future__ import absolute_import, division, unicode_literals
-from six import text_type
-from six.moves import http_client, urllib
+from bleach.six_shim import text_type
+from bleach.six_shim import http_client, urllib
import codecs
import re
diff --git a/bleach/_vendor/html5lib/_tokenizer.py b/bleach/_vendor/html5lib/_tokenizer.py
index 4748a197..d8848016 100644
--- a/bleach/_vendor/html5lib/_tokenizer.py
+++ b/bleach/_vendor/html5lib/_tokenizer.py
@@ -1,6 +1,6 @@
from __future__ import absolute_import, division, unicode_literals
-from six import unichr as chr
+from bleach.six_shim import unichr as chr
from collections import deque, OrderedDict
from sys import version_info
diff --git a/bleach/_vendor/html5lib/_trie/py.py b/bleach/_vendor/html5lib/_trie/py.py
index c2ba3da7..56f66bd5 100644
--- a/bleach/_vendor/html5lib/_trie/py.py
+++ b/bleach/_vendor/html5lib/_trie/py.py
@@ -1,5 +1,5 @@
from __future__ import absolute_import, division, unicode_literals
-from six import text_type
+from bleach.six_shim import text_type
from bisect import bisect_left
diff --git a/bleach/_vendor/html5lib/_utils.py b/bleach/_vendor/html5lib/_utils.py
index 9ea57942..635bb024 100644
--- a/bleach/_vendor/html5lib/_utils.py
+++ b/bleach/_vendor/html5lib/_utils.py
@@ -7,7 +7,7 @@
except ImportError:
from collections import Mapping
-from six import text_type, PY3
+from bleach.six_shim import text_type, PY3
if PY3:
import xml.etree.ElementTree as default_etree
diff --git a/bleach/_vendor/html5lib/filters/lint.py b/bleach/_vendor/html5lib/filters/lint.py
index acd4d7a2..1340d972 100644
--- a/bleach/_vendor/html5lib/filters/lint.py
+++ b/bleach/_vendor/html5lib/filters/lint.py
@@ -1,6 +1,6 @@
from __future__ import absolute_import, division, unicode_literals
-from six import text_type
+from bleach.six_shim import text_type
from . import base
from ..constants import namespaces, voidElements
diff --git a/bleach/_vendor/html5lib/filters/sanitizer.py b/bleach/_vendor/html5lib/filters/sanitizer.py
index 70ef9066..5c31e974 100644
--- a/bleach/_vendor/html5lib/filters/sanitizer.py
+++ b/bleach/_vendor/html5lib/filters/sanitizer.py
@@ -12,7 +12,7 @@
import warnings
from xml.sax.saxutils import escape, unescape
-from six.moves import urllib_parse as urlparse
+from bleach.six_shim import urllib_parse as urlparse
from . import base
from ..constants import namespaces, prefixes
diff --git a/bleach/_vendor/html5lib/html5parser.py b/bleach/_vendor/html5lib/html5parser.py
index 74d829d9..5427b7dd 100644
--- a/bleach/_vendor/html5lib/html5parser.py
+++ b/bleach/_vendor/html5lib/html5parser.py
@@ -1,5 +1,5 @@
from __future__ import absolute_import, division, unicode_literals
-from six import with_metaclass, viewkeys
+from bleach.six_shim import viewkeys
import types
@@ -423,7 +423,7 @@ def getMetaclass(use_metaclass, metaclass_func):
return type
# pylint:disable=unused-argument
- class Phase(with_metaclass(getMetaclass(debug, log))):
+ class Phase(metaclass=getMetaclass(debug, log)):
"""Base class for helper object that implements each phase of processing
"""
__slots__ = ("parser", "tree", "__startTagCache", "__endTagCache")
diff --git a/bleach/_vendor/html5lib/serializer.py b/bleach/_vendor/html5lib/serializer.py
index c66df683..5666f49a 100644
--- a/bleach/_vendor/html5lib/serializer.py
+++ b/bleach/_vendor/html5lib/serializer.py
@@ -1,5 +1,5 @@
from __future__ import absolute_import, division, unicode_literals
-from six import text_type
+from bleach.six_shim import text_type
import re
diff --git a/bleach/_vendor/html5lib/treebuilders/base.py b/bleach/_vendor/html5lib/treebuilders/base.py
index e4a3d710..2869da00 100644
--- a/bleach/_vendor/html5lib/treebuilders/base.py
+++ b/bleach/_vendor/html5lib/treebuilders/base.py
@@ -1,5 +1,5 @@
from __future__ import absolute_import, division, unicode_literals
-from six import text_type
+from bleach.six_shim import text_type
from ..constants import scopingElements, tableInsertModeElements, namespaces
diff --git a/bleach/_vendor/html5lib/treebuilders/etree.py b/bleach/_vendor/html5lib/treebuilders/etree.py
index 086bed4e..5ccfc4d6 100644
--- a/bleach/_vendor/html5lib/treebuilders/etree.py
+++ b/bleach/_vendor/html5lib/treebuilders/etree.py
@@ -1,7 +1,7 @@
from __future__ import absolute_import, division, unicode_literals
# pylint:disable=protected-access
-from six import text_type
+from bleach.six_shim import text_type
import re
diff --git a/bleach/_vendor/html5lib/treebuilders/etree_lxml.py b/bleach/_vendor/html5lib/treebuilders/etree_lxml.py
index e73de61a..f4622322 100644
--- a/bleach/_vendor/html5lib/treebuilders/etree_lxml.py
+++ b/bleach/_vendor/html5lib/treebuilders/etree_lxml.py
@@ -28,7 +28,7 @@
from .. import _ihatexml
import lxml.etree as etree
-from six import PY3, binary_type
+from bleach.six_shim import PY3, binary_type
fullTree = True
diff --git a/bleach/_vendor/html5lib/treewalkers/etree.py b/bleach/_vendor/html5lib/treewalkers/etree.py
index 44653372..a9d9450c 100644
--- a/bleach/_vendor/html5lib/treewalkers/etree.py
+++ b/bleach/_vendor/html5lib/treewalkers/etree.py
@@ -3,7 +3,7 @@
from collections import OrderedDict
import re
-from six import string_types
+from bleach.six_shim import string_types
from . import base
from .._utils import moduleFactoryFactory
diff --git a/bleach/_vendor/html5lib/treewalkers/etree_lxml.py b/bleach/_vendor/html5lib/treewalkers/etree_lxml.py
index a614ac5b..ef42163b 100644
--- a/bleach/_vendor/html5lib/treewalkers/etree_lxml.py
+++ b/bleach/_vendor/html5lib/treewalkers/etree_lxml.py
@@ -1,5 +1,5 @@
from __future__ import absolute_import, division, unicode_literals
-from six import text_type
+from bleach.six_shim import text_type
from collections import OrderedDict
diff --git a/bleach/_vendor/vendor_install.sh b/bleach/_vendor/vendor_install.sh
index 6e61c348..6c896ee4 100755
--- a/bleach/_vendor/vendor_install.sh
+++ b/bleach/_vendor/vendor_install.sh
@@ -7,8 +7,12 @@ set -o pipefail
BLEACH_VENDOR_DIR=${BLEACH_VENDOR_DIR:-"."}
DEST=${DEST:-"."}
+# Install with no dependencies
pip install --no-binary all --no-compile --no-deps -r "${BLEACH_VENDOR_DIR}/vendor.txt" --target "${DEST}"
+# Apply patches
+(cd "${DEST}" && patch -p2 < 01_html5lib_six.patch)
+
# install Python 3.6.14 urllib.urlparse for #536
curl --proto '=https' --tlsv1.2 -o "${DEST}/parse.py" https://raw.githubusercontent.com/python/cpython/v3.6.14/Lib/urllib/parse.py
(cd "${DEST}" && sha256sum parse.py > parse.py.SHA256SUM)
diff --git a/scripts/vendor_verify.sh b/scripts/vendor_verify.sh
index 6a0fe317..679bae48 100755
--- a/scripts/vendor_verify.sh
+++ b/scripts/vendor_verify.sh
@@ -5,7 +5,8 @@ set -e
# Install vendored packages into /tmp and then compare with what's in
# bleach/_vendor/.
-DEST=/tmp/vendor-test
+export DEST=/tmp/vendor-test
+export BLEACH_VENDOR_DIR=bleach/_vendor
if [[ -e "${DEST}" ]]; then
echo "${DEST} exists. Please remove."
@@ -14,11 +15,16 @@ fi
mkdir "${DEST}"
-# Get versions of pip and python
+# Get diagnostic information
pip --version
+echo "DEST: ${DEST}"
+echo "BLEACH_VENDOR_DIR: ${BLEACH_VENDOR_DIR}"
+
+# Copy patch files to dest directory
+cp bleach/_vendor/*.patch "${DEST}"
# Install vendored dependencies into temp directory
-BLEACH_VENDOR_DIR=bleach/_vendor DEST="${DEST}" bleach/_vendor/vendor_install.sh
+bleach/_vendor/vendor_install.sh
# Diff contents of temp directory and bleach/_vendor/ excluding vendoring
# infrastructure