File python3.8-compatibility-pr-s-235.patch of Package salt

From c205f1b0d091866408ee1eae324260480a1b70b4 Mon Sep 17 00:00:00 2001
From: Jochen Breuer <jbreuer@suse.de>
Date: Fri, 8 May 2020 15:56:35 +0200
Subject: [PATCH] Python3.8 compatibility PR's (#235)

* Update static requirements to include Py3.8 and Py3.9 (except windows)

Windows required package pywin32 doesn't state that it support any
python version above Py3.7

* Allow running the test suite against Py3.8 and Py3.9

* Fix deprecation warnings for imports from collections

DeprecationWarning: Using or importing the ABCs from `collections`
instead of from `collections.abc` is deprecated since Python 3.3, and in
3.9 it will stop working.

Therefore try to import the abstract base classes from `collections.abc`
before falling back to `collections`.

Signed-off-by: Benjamin Drung <benjamin.drung@cloud.ionos.com>

* Support distro.linux_distribution

Salt fails on Python 3.8:

```
======================================================================
ERROR: unit.grains.test_core (unittest.loader._FailedTest)
----------------------------------------------------------------------
ImportError: Failed to import test module: unit.grains.test_core
Traceback (most recent call last):
  File "/usr/lib/python3.8/unittest/loader.py", line 436, in _find_test_path
    module = self._get_module_from_name(name)
  File "/usr/lib/python3.8/unittest/loader.py", line 377, in _get_module_from_name
    __import__(name)
  File "tests/unit/grains/test_core.py", line 37, in <module>
    import salt.grains.core as core
  File "salt/grains/core.py", line 40, in <module>
    from platform import _supported_dists
ImportError: cannot import name '_supported_dists' from 'platform' (/usr/lib/python3.8/platform.py)
```

So only try to import `_supported_dists` from `platform` for Python <=
3.7. Otherwise rely on the external `distro` module to  not need any
special handling.

Addresses parts of #55835
Signed-off-by: Benjamin Drung <benjamin.drung@cloud.ionos.com>

* Fix RuntimeError: dictionary keys changed during iteration

The following unit tests fail on Python 3.8:

```
======================================================================
ERROR: test_state_config (unit.renderers.test_stateconf.StateConfigRendererTestCase)
[CPU:0.0%|MEM:56.6%]
----------------------------------------------------------------------
Traceback (most recent call last):
  File "/<<PKGBUILDDIR>>/tests/unit/renderers/test_stateconf.py", line 74, in test_state_config
    result = self._render_sls('''
  File "/<<PKGBUILDDIR>>/tests/unit/renderers/test_stateconf.py", line 66, in _render_sls
    return self._renderers['stateconf'](
  File "/<<PKGBUILDDIR>>/salt/renderers/stateconf.py", line 227, in render
    for k in six.iterkeys(tmplctx):  # iterate over a copy of keys
RuntimeError: dictionary keys changed during iteration

======================================================================
ERROR: test_apply_cloud_providers_config_extend (unit.test_config.ConfigTestCase)
[CPU:0.0%|MEM:56.6%]
----------------------------------------------------------------------
Traceback (most recent call last):
  File "/<<PKGBUILDDIR>>/tests/unit/test_config.py", line 1243, in test_apply_cloud_providers_config_extend
    salt.config.apply_cloud_providers_config(
  File "/<<PKGBUILDDIR>>/salt/config/__init__.py", line 3196, in apply_cloud_providers_config
    for driver, details in six.iteritems(entries):
RuntimeError: dictionary keys changed during iteration

======================================================================
ERROR: test_apply_cloud_providers_config_extend_multiple (unit.test_config.ConfigTestCase)
[CPU:0.0%|MEM:56.6%]
----------------------------------------------------------------------
Traceback (most recent call last):
  File "/<<PKGBUILDDIR>>/tests/unit/test_config.py", line 1334, in test_apply_cloud_providers_config_extend_multiple
    self.assertEqual(ret, salt.config.apply_cloud_providers_config(overrides, defaults=DEFAULT))
  File "/<<PKGBUILDDIR>>/salt/config/__init__.py", line 3196, in apply_cloud_providers_config
    for driver, details in six.iteritems(entries):
RuntimeError: dictionary keys changed during iteration

======================================================================
```

Replace the affected for loop of the first case by a dictionary
comprehension to construct the modified dictionary. For the remaining
cases, switch from `iteritems` to `iterkeys`, since the dictionary
values will be modified.

Signed-off-by: Benjamin Drung <benjamin.drung@cloud.ionos.com>

* Update PyTestSalt requirement(because we now bundle tornado)

* Run the full test suite on Arch under Py3

* Fix deprecation warnings for imports from collections

DeprecationWarning: Using or importing the ABCs from `collections`
instead of from `collections.abc` is deprecated since Python 3.3, and in
3.9 it will stop working.

Therefore try to import the abstract base classes from `collections.abc`
before falling back to `collections`.

Signed-off-by: Benjamin Drung <benjamin.drung@cloud.ionos.com>

* Replace deprecated inspect.formatargspec

Python 3.7 raises a deprecation warning:

salt/utils/decorators/signature.py:31: DeprecationWarning:
`formatargspec` is deprecated since Python 3.5. Use `signature` and the
`Signature` object directly

`inspect.formatargspec` is only used in
`salt.utils.decorators.signature.identical_signature_wrapper` which is
only used in `salt.utils.decorators.path` for decorating the `which` and
`which_bin` functions. The function `identical_signature_wrapper` can be
simply replaced by Python's `functools.wraps` which is available since
at least Python 2.7.

When inspecting those wrapped functions, the underlying function (stored
in the `__wrapped__` attribute) needs to be inspect instead.

fixes #50911
Signed-off-by: Benjamin Drung <benjamin.drung@cloud.ionos.com>

Co-authored-by: Pedro Algarvio <pedro@algarvio.me>
Co-authored-by: Benjamin Drung <benjamin.drung@cloud.ionos.com>
---
 requirements/static/py3.8/cloud.txt         | 115 ++++++++++++++++++
 requirements/static/py3.8/darwin-crypto.txt |   8 ++
 requirements/static/py3.8/darwin.txt        | 123 ++++++++++++++++++++
 requirements/static/py3.8/docs.txt          |  30 +++++
 requirements/static/py3.8/lint.txt          |  16 +++
 requirements/static/py3.8/linux-crypto.txt  |   8 ++
 requirements/static/py3.8/linux.txt         | 119 +++++++++++++++++++
 requirements/static/py3.9/cloud.txt         | 115 ++++++++++++++++++
 requirements/static/py3.9/darwin-crypto.txt |   8 ++
 requirements/static/py3.9/darwin.txt        | 123 ++++++++++++++++++++
 requirements/static/py3.9/docs.txt          |  30 +++++
 requirements/static/py3.9/lint.txt          |  16 +++
 requirements/static/py3.9/linux-crypto.txt  |   8 ++
 requirements/static/py3.9/linux.txt         | 119 +++++++++++++++++++
 salt/ext/tornado/httputil.py                |  38 +++---
 salt/utils/args.py                          |  60 ++++------
 salt/utils/jinja.py                         |   7 ++
 salt/utils/oset.py                          |   2 +
 18 files changed, 893 insertions(+), 52 deletions(-)
 create mode 100644 requirements/static/py3.8/cloud.txt
 create mode 100644 requirements/static/py3.8/darwin-crypto.txt
 create mode 100644 requirements/static/py3.8/darwin.txt
 create mode 100644 requirements/static/py3.8/docs.txt
 create mode 100644 requirements/static/py3.8/lint.txt
 create mode 100644 requirements/static/py3.8/linux-crypto.txt
 create mode 100644 requirements/static/py3.8/linux.txt
 create mode 100644 requirements/static/py3.9/cloud.txt
 create mode 100644 requirements/static/py3.9/darwin-crypto.txt
 create mode 100644 requirements/static/py3.9/darwin.txt
 create mode 100644 requirements/static/py3.9/docs.txt
 create mode 100644 requirements/static/py3.9/lint.txt
 create mode 100644 requirements/static/py3.9/linux-crypto.txt
 create mode 100644 requirements/static/py3.9/linux.txt

diff --git a/requirements/static/py3.8/cloud.txt b/requirements/static/py3.8/cloud.txt
new file mode 100644
index 0000000000..ab03f2b2f3
--- /dev/null
+++ b/requirements/static/py3.8/cloud.txt
@@ -0,0 +1,115 @@
+#
+# This file is autogenerated by pip-compile
+# To update, run:
+#
+#    pip-compile -o requirements/static/py3.8/cloud.txt -v requirements/static/cloud.in
+#
+adal==1.2.1               # via azure-datalake-store, msrestazure
+asn1crypto==0.24.0        # via cryptography
+azure-applicationinsights==0.1.0  # via azure
+azure-batch==4.1.3        # via azure
+azure-common==1.1.18      # via azure-applicationinsights, azure-batch, azure-cosmosdb-table, azure-eventgrid, azure-graphrbac, azure-keyvault, azure-loganalytics, azure-mgmt-advisor, azure-mgmt-applicationinsights, azure-mgmt-authorization, azure-mgmt-batch, azure-mgmt-batchai, azure-mgmt-billing, azure-mgmt-cdn, azure-mgmt-cognitiveservices, azure-mgmt-commerce, azure-mgmt-compute, azure-mgmt-consumption, azure-mgmt-containerinstance, azure-mgmt-containerregistry, azure-mgmt-containerservice, azure-mgmt-cosmosdb, azure-mgmt-datafactory, azure-mgmt-datalake-analytics, azure-mgmt-datalake-store, azure-mgmt-datamigration, azure-mgmt-devspaces, azure-mgmt-devtestlabs, azure-mgmt-dns, azure-mgmt-eventgrid, azure-mgmt-eventhub, azure-mgmt-hanaonazure, azure-mgmt-iotcentral, azure-mgmt-iothub, azure-mgmt-iothubprovisioningservices, azure-mgmt-keyvault, azure-mgmt-loganalytics, azure-mgmt-logic, azure-mgmt-machinelearningcompute, azure-mgmt-managementgroups, azure-mgmt-managementpartner, azure-mgmt-maps, azure-mgmt-marketplaceordering, azure-mgmt-media, azure-mgmt-monitor, azure-mgmt-msi, azure-mgmt-network, azure-mgmt-notificationhubs, azure-mgmt-policyinsights, azure-mgmt-powerbiembedded, azure-mgmt-rdbms, azure-mgmt-recoveryservices, azure-mgmt-recoveryservicesbackup, azure-mgmt-redis, azure-mgmt-relay, azure-mgmt-reservations, azure-mgmt-resource, azure-mgmt-scheduler, azure-mgmt-search, azure-mgmt-servicebus, azure-mgmt-servicefabric, azure-mgmt-signalr, azure-mgmt-sql, azure-mgmt-storage, azure-mgmt-subscription, azure-mgmt-trafficmanager, azure-mgmt-web, azure-servicebus, azure-servicefabric, azure-servicemanagement-legacy, azure-storage-blob, azure-storage-common, azure-storage-file, azure-storage-queue
+azure-cosmosdb-nspkg==2.0.2  # via azure-cosmosdb-table
+azure-cosmosdb-table==1.0.5  # via azure
+azure-datalake-store==0.0.44  # via azure
+azure-eventgrid==1.2.0    # via azure
+azure-graphrbac==0.40.0   # via azure
+azure-keyvault==1.1.0     # via azure
+azure-loganalytics==0.1.0  # via azure
+azure-mgmt-advisor==1.0.1  # via azure-mgmt
+azure-mgmt-applicationinsights==0.1.1  # via azure-mgmt
+azure-mgmt-authorization==0.50.0  # via azure-mgmt
+azure-mgmt-batch==5.0.1   # via azure-mgmt
+azure-mgmt-batchai==2.0.0  # via azure-mgmt
+azure-mgmt-billing==0.2.0  # via azure-mgmt
+azure-mgmt-cdn==3.1.0     # via azure-mgmt
+azure-mgmt-cognitiveservices==3.0.0  # via azure-mgmt
+azure-mgmt-commerce==1.0.1  # via azure-mgmt
+azure-mgmt-compute==4.6.0  # via azure-mgmt
+azure-mgmt-consumption==2.0.0  # via azure-mgmt
+azure-mgmt-containerinstance==1.4.1  # via azure-mgmt
+azure-mgmt-containerregistry==2.7.0  # via azure-mgmt
+azure-mgmt-containerservice==4.4.0  # via azure-mgmt
+azure-mgmt-cosmosdb==0.4.1  # via azure-mgmt
+azure-mgmt-datafactory==0.6.0  # via azure-mgmt
+azure-mgmt-datalake-analytics==0.6.0  # via azure-mgmt
+azure-mgmt-datalake-nspkg==3.0.1  # via azure-mgmt-datalake-analytics, azure-mgmt-datalake-store
+azure-mgmt-datalake-store==0.5.0  # via azure-mgmt
+azure-mgmt-datamigration==1.0.0  # via azure-mgmt
+azure-mgmt-devspaces==0.1.0  # via azure-mgmt
+azure-mgmt-devtestlabs==2.2.0  # via azure-mgmt
+azure-mgmt-dns==2.1.0     # via azure-mgmt
+azure-mgmt-eventgrid==1.0.0  # via azure-mgmt
+azure-mgmt-eventhub==2.5.0  # via azure-mgmt
+azure-mgmt-hanaonazure==0.1.1  # via azure-mgmt
+azure-mgmt-iotcentral==0.1.0  # via azure-mgmt
+azure-mgmt-iothub==0.5.0  # via azure-mgmt
+azure-mgmt-iothubprovisioningservices==0.2.0  # via azure-mgmt
+azure-mgmt-keyvault==1.1.0  # via azure-mgmt
+azure-mgmt-loganalytics==0.2.0  # via azure-mgmt
+azure-mgmt-logic==3.0.0   # via azure-mgmt
+azure-mgmt-machinelearningcompute==0.4.1  # via azure-mgmt
+azure-mgmt-managementgroups==0.1.0  # via azure-mgmt
+azure-mgmt-managementpartner==0.1.0  # via azure-mgmt
+azure-mgmt-maps==0.1.0    # via azure-mgmt
+azure-mgmt-marketplaceordering==0.1.0  # via azure-mgmt
+azure-mgmt-media==1.0.0   # via azure-mgmt
+azure-mgmt-monitor==0.5.2  # via azure-mgmt
+azure-mgmt-msi==0.2.0     # via azure-mgmt
+azure-mgmt-network==2.6.0  # via azure-mgmt
+azure-mgmt-notificationhubs==2.0.0  # via azure-mgmt
+azure-mgmt-nspkg==3.0.2   # via azure-mgmt-advisor, azure-mgmt-applicationinsights, azure-mgmt-authorization, azure-mgmt-batch, azure-mgmt-batchai, azure-mgmt-billing, azure-mgmt-cognitiveservices, azure-mgmt-commerce, azure-mgmt-consumption, azure-mgmt-cosmosdb, azure-mgmt-datafactory, azure-mgmt-datalake-nspkg, azure-mgmt-datamigration, azure-mgmt-devspaces, azure-mgmt-devtestlabs, azure-mgmt-dns, azure-mgmt-eventgrid, azure-mgmt-hanaonazure, azure-mgmt-iotcentral, azure-mgmt-iothub, azure-mgmt-iothubprovisioningservices, azure-mgmt-keyvault, azure-mgmt-loganalytics, azure-mgmt-logic, azure-mgmt-machinelearningcompute, azure-mgmt-managementgroups, azure-mgmt-managementpartner, azure-mgmt-maps, azure-mgmt-marketplaceordering, azure-mgmt-monitor, azure-mgmt-msi, azure-mgmt-notificationhubs, azure-mgmt-policyinsights, azure-mgmt-powerbiembedded, azure-mgmt-recoveryservices, azure-mgmt-recoveryservicesbackup, azure-mgmt-redis, azure-mgmt-relay, azure-mgmt-reservations, azure-mgmt-scheduler, azure-mgmt-search, azure-mgmt-servicefabric, azure-mgmt-signalr, azure-mgmt-sql, azure-mgmt-storage, azure-mgmt-subscription, azure-mgmt-trafficmanager, azure-mgmt-web
+azure-mgmt-policyinsights==0.1.0  # via azure-mgmt
+azure-mgmt-powerbiembedded==2.0.0  # via azure-mgmt
+azure-mgmt-rdbms==1.8.0   # via azure-mgmt
+azure-mgmt-recoveryservices==0.3.0  # via azure-mgmt
+azure-mgmt-recoveryservicesbackup==0.3.0  # via azure-mgmt
+azure-mgmt-redis==5.0.0   # via azure-mgmt
+azure-mgmt-relay==0.1.0   # via azure-mgmt
+azure-mgmt-reservations==0.2.1  # via azure-mgmt
+azure-mgmt-resource==2.1.0  # via azure-mgmt
+azure-mgmt-scheduler==2.0.0  # via azure-mgmt
+azure-mgmt-search==2.0.0  # via azure-mgmt
+azure-mgmt-servicebus==0.5.3  # via azure-mgmt
+azure-mgmt-servicefabric==0.2.0  # via azure-mgmt
+azure-mgmt-signalr==0.1.1  # via azure-mgmt
+azure-mgmt-sql==0.9.1     # via azure-mgmt
+azure-mgmt-storage==2.0.0  # via azure-mgmt
+azure-mgmt-subscription==0.2.0  # via azure-mgmt
+azure-mgmt-trafficmanager==0.50.0  # via azure-mgmt
+azure-mgmt-web==0.35.0    # via azure-mgmt
+azure-mgmt==4.0.0         # via azure
+azure-nspkg==3.0.2        # via azure-applicationinsights, azure-batch, azure-cosmosdb-nspkg, azure-eventgrid, azure-graphrbac, azure-keyvault, azure-loganalytics, azure-mgmt-nspkg, azure-servicebus, azure-servicefabric, azure-servicemanagement-legacy
+azure-servicebus==0.21.1  # via azure
+azure-servicefabric==6.3.0.0  # via azure
+azure-servicemanagement-legacy==0.20.6  # via azure
+azure-storage-blob==1.5.0  # via azure
+azure-storage-common==1.4.0  # via azure-cosmosdb-table, azure-storage-blob, azure-storage-file, azure-storage-queue
+azure-storage-file==1.4.0  # via azure
+azure-storage-queue==1.4.0  # via azure
+azure==4.0.0
+certifi==2019.3.9         # via msrest, requests
+cffi==1.12.2              # via azure-datalake-store, cryptography
+chardet==3.0.4            # via requests
+cryptography==2.6.1       # via adal, azure-cosmosdb-table, azure-keyvault, azure-storage-common, requests-ntlm, smbprotocol
+idna==2.8                 # via requests
+isodate==0.6.0            # via msrest
+msrest==0.6.6             # via azure-applicationinsights, azure-eventgrid, azure-keyvault, azure-loganalytics, azure-mgmt-cdn, azure-mgmt-compute, azure-mgmt-containerinstance, azure-mgmt-containerregistry, azure-mgmt-containerservice, azure-mgmt-dns, azure-mgmt-eventhub, azure-mgmt-keyvault, azure-mgmt-media, azure-mgmt-network, azure-mgmt-rdbms, azure-mgmt-resource, azure-mgmt-servicebus, azure-mgmt-servicefabric, azure-mgmt-signalr, azure-servicefabric, msrestazure
+msrestazure==0.6.0        # via azure-batch, azure-eventgrid, azure-graphrbac, azure-keyvault, azure-mgmt-advisor, azure-mgmt-applicationinsights, azure-mgmt-authorization, azure-mgmt-batch, azure-mgmt-batchai, azure-mgmt-billing, azure-mgmt-cdn, azure-mgmt-cognitiveservices, azure-mgmt-commerce, azure-mgmt-compute, azure-mgmt-consumption, azure-mgmt-containerinstance, azure-mgmt-containerregistry, azure-mgmt-containerservice, azure-mgmt-cosmosdb, azure-mgmt-datafactory, azure-mgmt-datalake-analytics, azure-mgmt-datalake-store, azure-mgmt-datamigration, azure-mgmt-devspaces, azure-mgmt-devtestlabs, azure-mgmt-dns, azure-mgmt-eventgrid, azure-mgmt-eventhub, azure-mgmt-hanaonazure, azure-mgmt-iotcentral, azure-mgmt-iothub, azure-mgmt-iothubprovisioningservices, azure-mgmt-keyvault, azure-mgmt-loganalytics, azure-mgmt-logic, azure-mgmt-machinelearningcompute, azure-mgmt-managementgroups, azure-mgmt-managementpartner, azure-mgmt-maps, azure-mgmt-marketplaceordering, azure-mgmt-media, azure-mgmt-monitor, azure-mgmt-msi, azure-mgmt-network, azure-mgmt-notificationhubs, azure-mgmt-policyinsights, azure-mgmt-powerbiembedded, azure-mgmt-rdbms, azure-mgmt-recoveryservices, azure-mgmt-recoveryservicesbackup, azure-mgmt-redis, azure-mgmt-relay, azure-mgmt-reservations, azure-mgmt-resource, azure-mgmt-scheduler, azure-mgmt-search, azure-mgmt-servicebus, azure-mgmt-servicefabric, azure-mgmt-signalr, azure-mgmt-sql, azure-mgmt-storage, azure-mgmt-subscription, azure-mgmt-trafficmanager, azure-mgmt-web
+netaddr==0.7.19
+ntlm-auth==1.3.0          # via requests-ntlm, smbprotocol
+oauthlib==3.0.1           # via requests-oauthlib
+profitbricks==4.1.3
+pyasn1==0.4.5             # via smbprotocol
+pycparser==2.19           # via cffi
+pyjwt==1.7.1              # via adal
+pypsexec==0.1.0
+python-dateutil==2.8.0    # via adal, azure-cosmosdb-table, azure-storage-common
+pywinrm==0.3.0
+requests-ntlm==1.1.0      # via pywinrm
+requests-oauthlib==1.2.0  # via msrest
+requests==2.21.0          # via adal, azure-cosmosdb-table, azure-datalake-store, azure-keyvault, azure-servicebus, azure-servicemanagement-legacy, azure-storage-common, msrest, profitbricks, pywinrm, requests-ntlm, requests-oauthlib
+six==1.12.0               # via cryptography, isodate, profitbricks, pypsexec, python-dateutil, pywinrm, smbprotocol
+smbprotocol==0.1.1        # via pypsexec
+urllib3==1.24.2           # via requests
+xmltodict==0.12.0         # via pywinrm
diff --git a/requirements/static/py3.8/darwin-crypto.txt b/requirements/static/py3.8/darwin-crypto.txt
new file mode 100644
index 0000000000..b1edfefdab
--- /dev/null
+++ b/requirements/static/py3.8/darwin-crypto.txt
@@ -0,0 +1,8 @@
+#
+# This file is autogenerated by pip-compile
+# To update, run:
+#
+#    pip-compile -o requirements/static/py3.8/darwin-crypto.txt -v requirements/static/crypto.in
+#
+m2crypto==0.35.2
+pycryptodomex==3.9.0
diff --git a/requirements/static/py3.8/darwin.txt b/requirements/static/py3.8/darwin.txt
new file mode 100644
index 0000000000..95bcd7748d
--- /dev/null
+++ b/requirements/static/py3.8/darwin.txt
@@ -0,0 +1,123 @@
+#
+# This file is autogenerated by pip-compile
+# To update, run:
+#
+#    pip-compile -o requirements/static/py3.8/darwin.txt -v pkg/osx/req.txt pkg/osx/req_ext.txt requirements/base.txt requirements/zeromq.txt requirements/pytest.txt requirements/static/darwin.in
+#
+apache-libcloud==2.4.0
+appdirs==1.4.3            # via virtualenv
+argh==0.26.2              # via watchdog
+asn1crypto==1.3.0         # via certvalidator, cryptography, oscrypto
+atomicwrites==1.3.0       # via pytest
+attrs==19.1.0             # via pytest
+aws-xray-sdk==0.95        # via moto
+backports.functools-lru-cache==1.5  # via cheroot
+backports.ssl_match_hostname==3.7.0.1
+bcrypt==3.1.6             # via paramiko
+boto3==1.9.132
+boto==2.49.0
+botocore==1.12.132        # via boto3, moto, s3transfer
+cachetools==3.1.0         # via google-auth
+certifi==2019.3.9
+certvalidator==0.11.1     # via vcert
+cffi==1.12.2
+chardet==3.0.4            # via requests
+cheetah3==3.1.0
+cheroot==6.5.5            # via cherrypy
+cherrypy==17.4.1
+click==7.0
+clustershell==1.8.1
+contextlib2==0.5.5        # via cherrypy
+croniter==0.3.29
+cryptography==2.6.1
+distlib==0.3.0            # via virtualenv
+dnspython==1.16.0
+docker-pycreds==0.4.0     # via docker
+docker==3.7.2
+docutils==0.14            # via botocore
+ecdsa==0.13.3             # via python-jose
+enum34==1.1.6
+filelock==3.0.12          # via virtualenv
+future==0.17.1            # via python-jose
+genshi==0.7.3
+gitdb2==2.0.5             # via gitpython
+gitpython==2.1.15
+google-auth==1.6.3        # via kubernetes
+idna==2.8
+ipaddress==1.0.22
+jaraco.functools==2.0     # via tempora
+jinja2==2.10.1
+jmespath==0.9.4
+jsondiff==1.1.1           # via moto
+jsonpickle==1.1           # via aws-xray-sdk
+jsonschema==2.6.0
+junos-eznc==2.2.0
+jxmlease==1.0.1
+keyring==5.7.1
+kubernetes==3.0.0
+linode-python==1.1.1
+lxml==4.3.3               # via junos-eznc, ncclient
+mako==1.0.7
+markupsafe==1.1.1
+mock==3.0.5
+more-itertools==5.0.0
+moto==1.3.7
+msgpack-python==0.5.6
+msgpack==0.5.6
+ncclient==0.6.4           # via junos-eznc
+netaddr==0.7.19           # via junos-eznc
+oscrypto==1.2.0           # via certvalidator
+packaging==19.2           # via pytest
+paramiko==2.4.2           # via junos-eznc, ncclient, scp
+pathtools==0.1.2          # via watchdog
+pluggy==0.13.1            # via pytest
+portend==2.4              # via cherrypy
+psutil==5.6.6
+py==1.8.0                 # via pytest
+pyaml==19.4.1             # via moto
+pyasn1-modules==0.2.4     # via google-auth
+pyasn1==0.4.5
+pycparser==2.19
+pycryptodome==3.8.1
+pynacl==1.3.0             # via paramiko
+pyopenssl==19.0.0
+pyparsing==2.4.5          # via packaging
+pyserial==3.4             # via junos-eznc
+pytest-helpers-namespace==2019.1.8
+pytest-salt-runtests-bridge==2019.7.10
+pytest-salt==2020.1.27
+pytest-tempdir==2019.10.12
+pytest==4.6.6
+python-dateutil==2.8.0
+python-etcd==0.4.5
+python-gnupg==0.4.4
+python-jose==2.0.2        # via moto
+pytz==2019.1              # via moto, tempora
+pyvmomi==6.7.1.2018.12
+pyyaml==5.1.2
+pyzmq==18.0.1 ; python_version != "3.4"
+requests==2.21.0
+responses==0.10.6         # via moto
+rfc3987==1.3.8
+rsa==4.0                  # via google-auth
+s3transfer==0.2.0         # via boto3
+salttesting==2017.6.1
+scp==0.13.2               # via junos-eznc
+setproctitle==1.1.10
+six==1.12.0               # via bcrypt, cheroot, cherrypy, cryptography, docker, docker-pycreds, google-auth, junos-eznc, kubernetes, mock, more-itertools, moto, ncclient, packaging, pynacl, pyopenssl, pytest, python-dateutil, python-jose, pyvmomi, responses, salttesting, tempora, vcert, virtualenv, websocket-client
+smmap2==2.0.5             # via gitdb2
+strict-rfc3339==0.7
+tempora==1.14.1           # via portend
+timelib==0.2.4
+urllib3==1.24.2           # via botocore, kubernetes, python-etcd, requests
+vcert==0.7.3
+virtualenv==20.0.10
+vultr==1.0.1
+watchdog==0.9.0
+wcwidth==0.1.7            # via pytest
+websocket-client==0.40.0  # via docker, kubernetes
+werkzeug==0.15.6          # via moto
+wrapt==1.11.1             # via aws-xray-sdk
+xmltodict==0.12.0         # via moto
+yamlordereddictloader==0.4.0
+zc.lockfile==1.4          # via cherrypy
diff --git a/requirements/static/py3.8/docs.txt b/requirements/static/py3.8/docs.txt
new file mode 100644
index 0000000000..ab3ce4ada7
--- /dev/null
+++ b/requirements/static/py3.8/docs.txt
@@ -0,0 +1,30 @@
+#
+# This file is autogenerated by pip-compile
+# To update, run:
+#
+#    pip-compile -o requirements/static/py3.8/docs.txt -v requirements/static/docs.in
+#
+alabaster==0.7.12         # via sphinx
+babel==2.7.0              # via sphinx
+certifi==2019.3.9         # via requests
+chardet==3.0.4            # via requests
+docutils==0.14            # via sphinx
+idna==2.8                 # via requests
+imagesize==1.1.0          # via sphinx
+jinja2==2.10.1            # via sphinx
+markupsafe==1.1.1         # via jinja2
+packaging==19.0           # via sphinx
+pygments==2.4.2           # via sphinx
+pyparsing==2.4.0          # via packaging
+pytz==2019.1              # via babel
+requests==2.22.0          # via sphinx
+six==1.12.0               # via packaging
+snowballstemmer==1.2.1    # via sphinx
+sphinx==2.0.1
+sphinxcontrib-applehelp==1.0.1  # via sphinx
+sphinxcontrib-devhelp==1.0.1  # via sphinx
+sphinxcontrib-htmlhelp==1.0.2  # via sphinx
+sphinxcontrib-jsmath==1.0.1  # via sphinx
+sphinxcontrib-qthelp==1.0.2  # via sphinx
+sphinxcontrib-serializinghtml==1.1.3  # via sphinx
+urllib3==1.25.3           # via requests
diff --git a/requirements/static/py3.8/lint.txt b/requirements/static/py3.8/lint.txt
new file mode 100644
index 0000000000..f027cab8e5
--- /dev/null
+++ b/requirements/static/py3.8/lint.txt
@@ -0,0 +1,16 @@
+#
+# This file is autogenerated by pip-compile
+# To update, run:
+#
+#    pip-compile -o requirements/static/py3.8/lint.txt -v requirements/static/lint.in
+#
+astroid==2.3.3            # via pylint
+isort==4.3.17             # via pylint
+lazy-object-proxy==1.4.3  # via astroid
+mccabe==0.6.1             # via pylint
+modernize==0.5            # via saltpylint
+pycodestyle==2.5.0        # via saltpylint
+pylint==2.4.4
+saltpylint==2019.11.14
+six==1.12.0               # via astroid
+wrapt==1.11.1             # via astroid
diff --git a/requirements/static/py3.8/linux-crypto.txt b/requirements/static/py3.8/linux-crypto.txt
new file mode 100644
index 0000000000..f625936c6e
--- /dev/null
+++ b/requirements/static/py3.8/linux-crypto.txt
@@ -0,0 +1,8 @@
+#
+# This file is autogenerated by pip-compile
+# To update, run:
+#
+#    pip-compile -o requirements/static/py3.8/linux-crypto.txt -v requirements/static/crypto.in
+#
+m2crypto==0.35.2
+pycryptodomex==3.9.3
diff --git a/requirements/static/py3.8/linux.txt b/requirements/static/py3.8/linux.txt
new file mode 100644
index 0000000000..5d42a310fa
--- /dev/null
+++ b/requirements/static/py3.8/linux.txt
@@ -0,0 +1,119 @@
+#
+# This file is autogenerated by pip-compile
+# To update, run:
+#
+#    pip-compile -o requirements/static/py3.8/linux.txt -v requirements/base.txt requirements/zeromq.txt requirements/pytest.txt requirements/static/linux.in
+#
+apache-libcloud==2.0.0
+argh==0.26.2              # via watchdog
+asn1crypto==1.3.0         # via certvalidator, cryptography, oscrypto
+atomicwrites==1.3.0       # via pytest
+attrs==19.1.0             # via pytest
+aws-xray-sdk==0.95        # via moto
+backports.functools-lru-cache==1.5  # via cheroot
+bcrypt==3.1.6             # via paramiko
+boto3==1.9.132
+boto==2.49.0
+botocore==1.12.132        # via boto3, moto, s3transfer
+cachetools==3.1.0         # via google-auth
+certifi==2019.3.9
+certvalidator==0.11.1     # via vcert
+cffi==1.12.2
+chardet==3.0.4            # via requests
+cheetah3==3.1.0
+cheroot==6.5.4            # via cherrypy
+cherrypy==17.3.0
+contextlib2==0.5.5        # via cherrypy
+croniter==0.3.29
+cryptography==2.6.1       # via moto, paramiko, pyopenssl, vcert
+dnspython==1.16.0
+docker-pycreds==0.4.0     # via docker
+docker==3.7.2
+docutils==0.14            # via botocore
+ecdsa==0.13.3             # via python-jose
+future==0.17.1            # via python-jose
+genshi==0.7.3
+gitdb2==2.0.5             # via gitpython
+gitpython==2.1.11
+google-auth==1.6.3        # via kubernetes
+hgtools==8.1.1
+idna==2.8                 # via requests
+ipaddress==1.0.22         # via kubernetes
+jaraco.functools==2.0     # via tempora
+jinja2==2.10.1
+jmespath==0.9.4
+jsondiff==1.1.1           # via moto
+jsonpickle==1.1           # via aws-xray-sdk
+jsonschema==2.6.0
+junos-eznc==2.2.0
+jxmlease==1.0.1
+kazoo==2.6.1
+keyring==5.7.1
+kubernetes==3.0.0
+libnacl==1.7.1
+lxml==4.3.3               # via junos-eznc, ncclient
+mako==1.1.0
+markupsafe==1.1.1
+mock==3.0.5
+more-itertools==5.0.0
+moto==1.3.7
+msgpack==0.5.6
+ncclient==0.6.4           # via junos-eznc
+netaddr==0.7.19           # via junos-eznc
+oscrypto==1.2.0           # via certvalidator
+packaging==19.2           # via pytest
+paramiko==2.4.2
+pathtools==0.1.2          # via watchdog
+pluggy==0.13.0            # via pytest
+portend==2.4              # via cherrypy
+psutil==5.6.1
+py==1.8.0                 # via pytest
+pyaml==19.4.1             # via moto
+pyasn1-modules==0.2.4     # via google-auth
+pyasn1==0.4.5             # via paramiko, pyasn1-modules, rsa
+pycparser==2.19           # via cffi
+pycrypto==2.6.1 ; sys_platform not in "win32,darwin"
+pycryptodome==3.8.1       # via python-jose
+pygit2==0.28.2
+pyinotify==0.9.6
+pynacl==1.3.0             # via paramiko
+pyopenssl==19.0.0
+pyparsing==2.4.5          # via packaging
+pyserial==3.4             # via junos-eznc
+pytest-helpers-namespace==2019.1.8
+pytest-salt-runtests-bridge==2019.7.10
+pytest-salt==2020.1.27
+pytest-tempdir==2019.10.12
+pytest==4.6.6
+python-dateutil==2.8.0    # via botocore, croniter, kubernetes, moto, vcert
+python-etcd==0.4.5
+python-gnupg==0.4.4
+python-jose==2.0.2        # via moto
+pytz==2019.1              # via moto, tempora
+pyvmomi==6.7.1.2018.12
+pyyaml==5.1.2
+pyzmq==18.0.1 ; python_version != "3.4"
+requests==2.21.0
+responses==0.10.6         # via moto
+rfc3987==1.3.8
+rsa==4.0                  # via google-auth
+s3transfer==0.2.0         # via boto3
+salttesting==2017.6.1
+scp==0.13.2               # via junos-eznc
+setproctitle==1.1.10
+setuptools-scm==3.2.0
+six==1.12.0               # via bcrypt, cheroot, cherrypy, cryptography, docker, docker-pycreds, google-auth, junos-eznc, kazoo, kubernetes, mock, more-itertools, moto, ncclient, packaging, pygit2, pynacl, pyopenssl, pytest, python-dateutil, python-jose, pyvmomi, responses, salttesting, tempora, vcert, websocket-client
+smmap2==2.0.5             # via gitdb2
+strict-rfc3339==0.7
+tempora==1.14.1           # via portend
+timelib==0.2.4
+urllib3==1.24.2           # via botocore, kubernetes, python-etcd, requests
+vcert==0.7.3
+virtualenv==16.4.3
+watchdog==0.9.0
+wcwidth==0.1.7            # via pytest
+websocket-client==0.40.0  # via docker, kubernetes
+werkzeug==0.15.6          # via moto
+wrapt==1.11.1             # via aws-xray-sdk
+xmltodict==0.12.0         # via moto
+zc.lockfile==1.4          # via cherrypy
diff --git a/requirements/static/py3.9/cloud.txt b/requirements/static/py3.9/cloud.txt
new file mode 100644
index 0000000000..cc569aa714
--- /dev/null
+++ b/requirements/static/py3.9/cloud.txt
@@ -0,0 +1,115 @@
+#
+# This file is autogenerated by pip-compile
+# To update, run:
+#
+#    pip-compile -o requirements/static/py3.9/cloud.txt -v requirements/static/cloud.in
+#
+adal==1.2.1               # via azure-datalake-store, msrestazure
+asn1crypto==0.24.0        # via cryptography
+azure-applicationinsights==0.1.0  # via azure
+azure-batch==4.1.3        # via azure
+azure-common==1.1.18      # via azure-applicationinsights, azure-batch, azure-cosmosdb-table, azure-eventgrid, azure-graphrbac, azure-keyvault, azure-loganalytics, azure-mgmt-advisor, azure-mgmt-applicationinsights, azure-mgmt-authorization, azure-mgmt-batch, azure-mgmt-batchai, azure-mgmt-billing, azure-mgmt-cdn, azure-mgmt-cognitiveservices, azure-mgmt-commerce, azure-mgmt-compute, azure-mgmt-consumption, azure-mgmt-containerinstance, azure-mgmt-containerregistry, azure-mgmt-containerservice, azure-mgmt-cosmosdb, azure-mgmt-datafactory, azure-mgmt-datalake-analytics, azure-mgmt-datalake-store, azure-mgmt-datamigration, azure-mgmt-devspaces, azure-mgmt-devtestlabs, azure-mgmt-dns, azure-mgmt-eventgrid, azure-mgmt-eventhub, azure-mgmt-hanaonazure, azure-mgmt-iotcentral, azure-mgmt-iothub, azure-mgmt-iothubprovisioningservices, azure-mgmt-keyvault, azure-mgmt-loganalytics, azure-mgmt-logic, azure-mgmt-machinelearningcompute, azure-mgmt-managementgroups, azure-mgmt-managementpartner, azure-mgmt-maps, azure-mgmt-marketplaceordering, azure-mgmt-media, azure-mgmt-monitor, azure-mgmt-msi, azure-mgmt-network, azure-mgmt-notificationhubs, azure-mgmt-policyinsights, azure-mgmt-powerbiembedded, azure-mgmt-rdbms, azure-mgmt-recoveryservices, azure-mgmt-recoveryservicesbackup, azure-mgmt-redis, azure-mgmt-relay, azure-mgmt-reservations, azure-mgmt-resource, azure-mgmt-scheduler, azure-mgmt-search, azure-mgmt-servicebus, azure-mgmt-servicefabric, azure-mgmt-signalr, azure-mgmt-sql, azure-mgmt-storage, azure-mgmt-subscription, azure-mgmt-trafficmanager, azure-mgmt-web, azure-servicebus, azure-servicefabric, azure-servicemanagement-legacy, azure-storage-blob, azure-storage-common, azure-storage-file, azure-storage-queue
+azure-cosmosdb-nspkg==2.0.2  # via azure-cosmosdb-table
+azure-cosmosdb-table==1.0.5  # via azure
+azure-datalake-store==0.0.44  # via azure
+azure-eventgrid==1.2.0    # via azure
+azure-graphrbac==0.40.0   # via azure
+azure-keyvault==1.1.0     # via azure
+azure-loganalytics==0.1.0  # via azure
+azure-mgmt-advisor==1.0.1  # via azure-mgmt
+azure-mgmt-applicationinsights==0.1.1  # via azure-mgmt
+azure-mgmt-authorization==0.50.0  # via azure-mgmt
+azure-mgmt-batch==5.0.1   # via azure-mgmt
+azure-mgmt-batchai==2.0.0  # via azure-mgmt
+azure-mgmt-billing==0.2.0  # via azure-mgmt
+azure-mgmt-cdn==3.1.0     # via azure-mgmt
+azure-mgmt-cognitiveservices==3.0.0  # via azure-mgmt
+azure-mgmt-commerce==1.0.1  # via azure-mgmt
+azure-mgmt-compute==4.6.0  # via azure-mgmt
+azure-mgmt-consumption==2.0.0  # via azure-mgmt
+azure-mgmt-containerinstance==1.4.1  # via azure-mgmt
+azure-mgmt-containerregistry==2.7.0  # via azure-mgmt
+azure-mgmt-containerservice==4.4.0  # via azure-mgmt
+azure-mgmt-cosmosdb==0.4.1  # via azure-mgmt
+azure-mgmt-datafactory==0.6.0  # via azure-mgmt
+azure-mgmt-datalake-analytics==0.6.0  # via azure-mgmt
+azure-mgmt-datalake-nspkg==3.0.1  # via azure-mgmt-datalake-analytics, azure-mgmt-datalake-store
+azure-mgmt-datalake-store==0.5.0  # via azure-mgmt
+azure-mgmt-datamigration==1.0.0  # via azure-mgmt
+azure-mgmt-devspaces==0.1.0  # via azure-mgmt
+azure-mgmt-devtestlabs==2.2.0  # via azure-mgmt
+azure-mgmt-dns==2.1.0     # via azure-mgmt
+azure-mgmt-eventgrid==1.0.0  # via azure-mgmt
+azure-mgmt-eventhub==2.5.0  # via azure-mgmt
+azure-mgmt-hanaonazure==0.1.1  # via azure-mgmt
+azure-mgmt-iotcentral==0.1.0  # via azure-mgmt
+azure-mgmt-iothub==0.5.0  # via azure-mgmt
+azure-mgmt-iothubprovisioningservices==0.2.0  # via azure-mgmt
+azure-mgmt-keyvault==1.1.0  # via azure-mgmt
+azure-mgmt-loganalytics==0.2.0  # via azure-mgmt
+azure-mgmt-logic==3.0.0   # via azure-mgmt
+azure-mgmt-machinelearningcompute==0.4.1  # via azure-mgmt
+azure-mgmt-managementgroups==0.1.0  # via azure-mgmt
+azure-mgmt-managementpartner==0.1.0  # via azure-mgmt
+azure-mgmt-maps==0.1.0    # via azure-mgmt
+azure-mgmt-marketplaceordering==0.1.0  # via azure-mgmt
+azure-mgmt-media==1.0.0   # via azure-mgmt
+azure-mgmt-monitor==0.5.2  # via azure-mgmt
+azure-mgmt-msi==0.2.0     # via azure-mgmt
+azure-mgmt-network==2.6.0  # via azure-mgmt
+azure-mgmt-notificationhubs==2.0.0  # via azure-mgmt
+azure-mgmt-nspkg==3.0.2   # via azure-mgmt-advisor, azure-mgmt-applicationinsights, azure-mgmt-authorization, azure-mgmt-batch, azure-mgmt-batchai, azure-mgmt-billing, azure-mgmt-cognitiveservices, azure-mgmt-commerce, azure-mgmt-consumption, azure-mgmt-cosmosdb, azure-mgmt-datafactory, azure-mgmt-datalake-nspkg, azure-mgmt-datamigration, azure-mgmt-devspaces, azure-mgmt-devtestlabs, azure-mgmt-dns, azure-mgmt-eventgrid, azure-mgmt-hanaonazure, azure-mgmt-iotcentral, azure-mgmt-iothub, azure-mgmt-iothubprovisioningservices, azure-mgmt-keyvault, azure-mgmt-loganalytics, azure-mgmt-logic, azure-mgmt-machinelearningcompute, azure-mgmt-managementgroups, azure-mgmt-managementpartner, azure-mgmt-maps, azure-mgmt-marketplaceordering, azure-mgmt-monitor, azure-mgmt-msi, azure-mgmt-notificationhubs, azure-mgmt-policyinsights, azure-mgmt-powerbiembedded, azure-mgmt-recoveryservices, azure-mgmt-recoveryservicesbackup, azure-mgmt-redis, azure-mgmt-relay, azure-mgmt-reservations, azure-mgmt-scheduler, azure-mgmt-search, azure-mgmt-servicefabric, azure-mgmt-signalr, azure-mgmt-sql, azure-mgmt-storage, azure-mgmt-subscription, azure-mgmt-trafficmanager, azure-mgmt-web
+azure-mgmt-policyinsights==0.1.0  # via azure-mgmt
+azure-mgmt-powerbiembedded==2.0.0  # via azure-mgmt
+azure-mgmt-rdbms==1.8.0   # via azure-mgmt
+azure-mgmt-recoveryservices==0.3.0  # via azure-mgmt
+azure-mgmt-recoveryservicesbackup==0.3.0  # via azure-mgmt
+azure-mgmt-redis==5.0.0   # via azure-mgmt
+azure-mgmt-relay==0.1.0   # via azure-mgmt
+azure-mgmt-reservations==0.2.1  # via azure-mgmt
+azure-mgmt-resource==2.1.0  # via azure-mgmt
+azure-mgmt-scheduler==2.0.0  # via azure-mgmt
+azure-mgmt-search==2.0.0  # via azure-mgmt
+azure-mgmt-servicebus==0.5.3  # via azure-mgmt
+azure-mgmt-servicefabric==0.2.0  # via azure-mgmt
+azure-mgmt-signalr==0.1.1  # via azure-mgmt
+azure-mgmt-sql==0.9.1     # via azure-mgmt
+azure-mgmt-storage==2.0.0  # via azure-mgmt
+azure-mgmt-subscription==0.2.0  # via azure-mgmt
+azure-mgmt-trafficmanager==0.50.0  # via azure-mgmt
+azure-mgmt-web==0.35.0    # via azure-mgmt
+azure-mgmt==4.0.0         # via azure
+azure-nspkg==3.0.2        # via azure-applicationinsights, azure-batch, azure-cosmosdb-nspkg, azure-eventgrid, azure-graphrbac, azure-keyvault, azure-loganalytics, azure-mgmt-nspkg, azure-servicebus, azure-servicefabric, azure-servicemanagement-legacy
+azure-servicebus==0.21.1  # via azure
+azure-servicefabric==6.3.0.0  # via azure
+azure-servicemanagement-legacy==0.20.6  # via azure
+azure-storage-blob==1.5.0  # via azure
+azure-storage-common==1.4.0  # via azure-cosmosdb-table, azure-storage-blob, azure-storage-file, azure-storage-queue
+azure-storage-file==1.4.0  # via azure
+azure-storage-queue==1.4.0  # via azure
+azure==4.0.0
+certifi==2019.3.9         # via msrest, requests
+cffi==1.12.2              # via azure-datalake-store, cryptography
+chardet==3.0.4            # via requests
+cryptography==2.6.1       # via adal, azure-cosmosdb-table, azure-keyvault, azure-storage-common, requests-ntlm, smbprotocol
+idna==2.8                 # via requests
+isodate==0.6.0            # via msrest
+msrest==0.6.6             # via azure-applicationinsights, azure-eventgrid, azure-keyvault, azure-loganalytics, azure-mgmt-cdn, azure-mgmt-compute, azure-mgmt-containerinstance, azure-mgmt-containerregistry, azure-mgmt-containerservice, azure-mgmt-dns, azure-mgmt-eventhub, azure-mgmt-keyvault, azure-mgmt-media, azure-mgmt-network, azure-mgmt-rdbms, azure-mgmt-resource, azure-mgmt-servicebus, azure-mgmt-servicefabric, azure-mgmt-signalr, azure-servicefabric, msrestazure
+msrestazure==0.6.0        # via azure-batch, azure-eventgrid, azure-graphrbac, azure-keyvault, azure-mgmt-advisor, azure-mgmt-applicationinsights, azure-mgmt-authorization, azure-mgmt-batch, azure-mgmt-batchai, azure-mgmt-billing, azure-mgmt-cdn, azure-mgmt-cognitiveservices, azure-mgmt-commerce, azure-mgmt-compute, azure-mgmt-consumption, azure-mgmt-containerinstance, azure-mgmt-containerregistry, azure-mgmt-containerservice, azure-mgmt-cosmosdb, azure-mgmt-datafactory, azure-mgmt-datalake-analytics, azure-mgmt-datalake-store, azure-mgmt-datamigration, azure-mgmt-devspaces, azure-mgmt-devtestlabs, azure-mgmt-dns, azure-mgmt-eventgrid, azure-mgmt-eventhub, azure-mgmt-hanaonazure, azure-mgmt-iotcentral, azure-mgmt-iothub, azure-mgmt-iothubprovisioningservices, azure-mgmt-keyvault, azure-mgmt-loganalytics, azure-mgmt-logic, azure-mgmt-machinelearningcompute, azure-mgmt-managementgroups, azure-mgmt-managementpartner, azure-mgmt-maps, azure-mgmt-marketplaceordering, azure-mgmt-media, azure-mgmt-monitor, azure-mgmt-msi, azure-mgmt-network, azure-mgmt-notificationhubs, azure-mgmt-policyinsights, azure-mgmt-powerbiembedded, azure-mgmt-rdbms, azure-mgmt-recoveryservices, azure-mgmt-recoveryservicesbackup, azure-mgmt-redis, azure-mgmt-relay, azure-mgmt-reservations, azure-mgmt-resource, azure-mgmt-scheduler, azure-mgmt-search, azure-mgmt-servicebus, azure-mgmt-servicefabric, azure-mgmt-signalr, azure-mgmt-sql, azure-mgmt-storage, azure-mgmt-subscription, azure-mgmt-trafficmanager, azure-mgmt-web
+netaddr==0.7.19
+ntlm-auth==1.3.0          # via requests-ntlm, smbprotocol
+oauthlib==3.0.1           # via requests-oauthlib
+profitbricks==4.1.3
+pyasn1==0.4.5             # via smbprotocol
+pycparser==2.19           # via cffi
+pyjwt==1.7.1              # via adal
+pypsexec==0.1.0
+python-dateutil==2.8.0    # via adal, azure-cosmosdb-table, azure-storage-common
+pywinrm==0.3.0
+requests-ntlm==1.1.0      # via pywinrm
+requests-oauthlib==1.2.0  # via msrest
+requests==2.21.0          # via adal, azure-cosmosdb-table, azure-datalake-store, azure-keyvault, azure-servicebus, azure-servicemanagement-legacy, azure-storage-common, msrest, profitbricks, pywinrm, requests-ntlm, requests-oauthlib
+six==1.12.0               # via cryptography, isodate, profitbricks, pypsexec, python-dateutil, pywinrm, smbprotocol
+smbprotocol==0.1.1        # via pypsexec
+urllib3==1.24.2           # via requests
+xmltodict==0.12.0         # via pywinrm
diff --git a/requirements/static/py3.9/darwin-crypto.txt b/requirements/static/py3.9/darwin-crypto.txt
new file mode 100644
index 0000000000..838b5c329f
--- /dev/null
+++ b/requirements/static/py3.9/darwin-crypto.txt
@@ -0,0 +1,8 @@
+#
+# This file is autogenerated by pip-compile
+# To update, run:
+#
+#    pip-compile -o requirements/static/py3.9/darwin-crypto.txt -v requirements/static/crypto.in
+#
+m2crypto==0.35.2
+pycryptodomex==3.9.0
diff --git a/requirements/static/py3.9/darwin.txt b/requirements/static/py3.9/darwin.txt
new file mode 100644
index 0000000000..419f8ee1d1
--- /dev/null
+++ b/requirements/static/py3.9/darwin.txt
@@ -0,0 +1,123 @@
+#
+# This file is autogenerated by pip-compile
+# To update, run:
+#
+#    pip-compile -o requirements/static/py3.9/darwin.txt -v pkg/osx/req.txt pkg/osx/req_ext.txt requirements/base.txt requirements/zeromq.txt requirements/pytest.txt requirements/static/darwin.in
+#
+apache-libcloud==2.4.0
+appdirs==1.4.3            # via virtualenv
+argh==0.26.2              # via watchdog
+asn1crypto==1.3.0         # via certvalidator, cryptography, oscrypto
+atomicwrites==1.3.0       # via pytest
+attrs==19.1.0             # via pytest
+aws-xray-sdk==0.95        # via moto
+backports.functools-lru-cache==1.5  # via cheroot
+backports.ssl_match_hostname==3.7.0.1
+bcrypt==3.1.6             # via paramiko
+boto3==1.9.132
+boto==2.49.0
+botocore==1.12.132        # via boto3, moto, s3transfer
+cachetools==3.1.0         # via google-auth
+certifi==2019.3.9
+certvalidator==0.11.1     # via vcert
+cffi==1.12.2
+chardet==3.0.4            # via requests
+cheetah3==3.1.0
+cheroot==6.5.5            # via cherrypy
+cherrypy==17.4.1
+click==7.0
+clustershell==1.8.1
+contextlib2==0.5.5        # via cherrypy
+croniter==0.3.29
+cryptography==2.6.1
+distlib==0.3.0            # via virtualenv
+dnspython==1.16.0
+docker-pycreds==0.4.0     # via docker
+docker==3.7.2
+docutils==0.14            # via botocore
+ecdsa==0.13.3             # via python-jose
+enum34==1.1.6
+filelock==3.0.12          # via virtualenv
+future==0.17.1            # via python-jose
+genshi==0.7.3
+gitdb2==2.0.5             # via gitpython
+gitpython==2.1.15
+google-auth==1.6.3        # via kubernetes
+idna==2.8
+ipaddress==1.0.22
+jaraco.functools==2.0     # via tempora
+jinja2==2.10.1
+jmespath==0.9.4
+jsondiff==1.1.1           # via moto
+jsonpickle==1.1           # via aws-xray-sdk
+jsonschema==2.6.0
+junos-eznc==2.2.0
+jxmlease==1.0.1
+keyring==5.7.1
+kubernetes==3.0.0
+linode-python==1.1.1
+lxml==4.3.3               # via junos-eznc, ncclient
+mako==1.0.7
+markupsafe==1.1.1
+mock==3.0.5
+more-itertools==5.0.0
+moto==1.3.7
+msgpack-python==0.5.6
+msgpack==0.5.6
+ncclient==0.6.4           # via junos-eznc
+netaddr==0.7.19           # via junos-eznc
+oscrypto==1.2.0           # via certvalidator
+packaging==19.2           # via pytest
+paramiko==2.4.2           # via junos-eznc, ncclient, scp
+pathtools==0.1.2          # via watchdog
+pluggy==0.13.1            # via pytest
+portend==2.4              # via cherrypy
+psutil==5.6.6
+py==1.8.0                 # via pytest
+pyaml==19.4.1             # via moto
+pyasn1-modules==0.2.4     # via google-auth
+pyasn1==0.4.5
+pycparser==2.19
+pycryptodome==3.8.1
+pynacl==1.3.0             # via paramiko
+pyopenssl==19.0.0
+pyparsing==2.4.5          # via packaging
+pyserial==3.4             # via junos-eznc
+pytest-helpers-namespace==2019.1.8
+pytest-salt-runtests-bridge==2019.7.10
+pytest-salt==2020.1.27
+pytest-tempdir==2019.10.12
+pytest==4.6.6
+python-dateutil==2.8.0
+python-etcd==0.4.5
+python-gnupg==0.4.4
+python-jose==2.0.2        # via moto
+pytz==2019.1              # via moto, tempora
+pyvmomi==6.7.1.2018.12
+pyyaml==5.1.2
+pyzmq==18.0.1 ; python_version != "3.4"
+requests==2.21.0
+responses==0.10.6         # via moto
+rfc3987==1.3.8
+rsa==4.0                  # via google-auth
+s3transfer==0.2.0         # via boto3
+salttesting==2017.6.1
+scp==0.13.2               # via junos-eznc
+setproctitle==1.1.10
+six==1.12.0               # via bcrypt, cheroot, cherrypy, cryptography, docker, docker-pycreds, google-auth, junos-eznc, kubernetes, mock, more-itertools, moto, ncclient, packaging, pynacl, pyopenssl, pytest, python-dateutil, python-jose, pyvmomi, responses, salttesting, tempora, vcert, virtualenv, websocket-client
+smmap2==2.0.5             # via gitdb2
+strict-rfc3339==0.7
+tempora==1.14.1           # via portend
+timelib==0.2.4
+urllib3==1.24.2           # via botocore, kubernetes, python-etcd, requests
+vcert==0.7.3
+virtualenv==20.0.10
+vultr==1.0.1
+watchdog==0.9.0
+wcwidth==0.1.7            # via pytest
+websocket-client==0.40.0  # via docker, kubernetes
+werkzeug==0.15.6          # via moto
+wrapt==1.11.1             # via aws-xray-sdk
+xmltodict==0.12.0         # via moto
+yamlordereddictloader==0.4.0
+zc.lockfile==1.4          # via cherrypy
diff --git a/requirements/static/py3.9/docs.txt b/requirements/static/py3.9/docs.txt
new file mode 100644
index 0000000000..89552f5688
--- /dev/null
+++ b/requirements/static/py3.9/docs.txt
@@ -0,0 +1,30 @@
+#
+# This file is autogenerated by pip-compile
+# To update, run:
+#
+#    pip-compile -o requirements/static/py3.9/docs.txt -v requirements/static/docs.in
+#
+alabaster==0.7.12         # via sphinx
+babel==2.7.0              # via sphinx
+certifi==2019.3.9         # via requests
+chardet==3.0.4            # via requests
+docutils==0.14            # via sphinx
+idna==2.8                 # via requests
+imagesize==1.1.0          # via sphinx
+jinja2==2.10.1            # via sphinx
+markupsafe==1.1.1         # via jinja2
+packaging==19.0           # via sphinx
+pygments==2.4.2           # via sphinx
+pyparsing==2.4.0          # via packaging
+pytz==2019.1              # via babel
+requests==2.22.0          # via sphinx
+six==1.12.0               # via packaging
+snowballstemmer==1.2.1    # via sphinx
+sphinx==2.0.1
+sphinxcontrib-applehelp==1.0.1  # via sphinx
+sphinxcontrib-devhelp==1.0.1  # via sphinx
+sphinxcontrib-htmlhelp==1.0.2  # via sphinx
+sphinxcontrib-jsmath==1.0.1  # via sphinx
+sphinxcontrib-qthelp==1.0.2  # via sphinx
+sphinxcontrib-serializinghtml==1.1.3  # via sphinx
+urllib3==1.25.3           # via requests
diff --git a/requirements/static/py3.9/lint.txt b/requirements/static/py3.9/lint.txt
new file mode 100644
index 0000000000..bb8a2756a3
--- /dev/null
+++ b/requirements/static/py3.9/lint.txt
@@ -0,0 +1,16 @@
+#
+# This file is autogenerated by pip-compile
+# To update, run:
+#
+#    pip-compile -o requirements/static/py3.9/lint.txt -v requirements/static/lint.in
+#
+astroid==2.3.3            # via pylint
+isort==4.3.17             # via pylint
+lazy-object-proxy==1.4.3  # via astroid
+mccabe==0.6.1             # via pylint
+modernize==0.5            # via saltpylint
+pycodestyle==2.5.0        # via saltpylint
+pylint==2.4.4
+saltpylint==2019.11.14
+six==1.12.0               # via astroid
+wrapt==1.11.1             # via astroid
diff --git a/requirements/static/py3.9/linux-crypto.txt b/requirements/static/py3.9/linux-crypto.txt
new file mode 100644
index 0000000000..148f8bec31
--- /dev/null
+++ b/requirements/static/py3.9/linux-crypto.txt
@@ -0,0 +1,8 @@
+#
+# This file is autogenerated by pip-compile
+# To update, run:
+#
+#    pip-compile -o requirements/static/py3.9/linux-crypto.txt -v requirements/static/crypto.in
+#
+m2crypto==0.35.2
+pycryptodomex==3.9.3
diff --git a/requirements/static/py3.9/linux.txt b/requirements/static/py3.9/linux.txt
new file mode 100644
index 0000000000..b7eb8320de
--- /dev/null
+++ b/requirements/static/py3.9/linux.txt
@@ -0,0 +1,119 @@
+#
+# This file is autogenerated by pip-compile
+# To update, run:
+#
+#    pip-compile -o requirements/static/py3.9/linux.txt -v requirements/base.txt requirements/zeromq.txt requirements/pytest.txt requirements/static/linux.in
+#
+apache-libcloud==2.0.0
+argh==0.26.2              # via watchdog
+asn1crypto==1.3.0         # via certvalidator, cryptography, oscrypto
+atomicwrites==1.3.0       # via pytest
+attrs==19.1.0             # via pytest
+aws-xray-sdk==0.95        # via moto
+backports.functools-lru-cache==1.5  # via cheroot
+bcrypt==3.1.6             # via paramiko
+boto3==1.9.132
+boto==2.49.0
+botocore==1.12.132        # via boto3, moto, s3transfer
+cachetools==3.1.0         # via google-auth
+certifi==2019.3.9
+certvalidator==0.11.1     # via vcert
+cffi==1.12.2
+chardet==3.0.4            # via requests
+cheetah3==3.1.0
+cheroot==6.5.4            # via cherrypy
+cherrypy==17.3.0
+contextlib2==0.5.5        # via cherrypy
+croniter==0.3.29
+cryptography==2.6.1       # via moto, paramiko, pyopenssl, vcert
+dnspython==1.16.0
+docker-pycreds==0.4.0     # via docker
+docker==3.7.2
+docutils==0.14            # via botocore
+ecdsa==0.13.3             # via python-jose
+future==0.17.1            # via python-jose
+genshi==0.7.3
+gitdb2==2.0.5             # via gitpython
+gitpython==2.1.11
+google-auth==1.6.3        # via kubernetes
+hgtools==8.1.1
+idna==2.8                 # via requests
+ipaddress==1.0.22         # via kubernetes
+jaraco.functools==2.0     # via tempora
+jinja2==2.10.1
+jmespath==0.9.4
+jsondiff==1.1.1           # via moto
+jsonpickle==1.1           # via aws-xray-sdk
+jsonschema==2.6.0
+junos-eznc==2.2.0
+jxmlease==1.0.1
+kazoo==2.6.1
+keyring==5.7.1
+kubernetes==3.0.0
+libnacl==1.7.1
+lxml==4.3.3               # via junos-eznc, ncclient
+mako==1.1.0
+markupsafe==1.1.1
+mock==3.0.5
+more-itertools==5.0.0
+moto==1.3.7
+msgpack==0.5.6
+ncclient==0.6.4           # via junos-eznc
+netaddr==0.7.19           # via junos-eznc
+oscrypto==1.2.0           # via certvalidator
+packaging==19.2           # via pytest
+paramiko==2.4.2
+pathtools==0.1.2          # via watchdog
+pluggy==0.13.0            # via pytest
+portend==2.4              # via cherrypy
+psutil==5.6.1
+py==1.8.0                 # via pytest
+pyaml==19.4.1             # via moto
+pyasn1-modules==0.2.4     # via google-auth
+pyasn1==0.4.5             # via paramiko, pyasn1-modules, rsa
+pycparser==2.19           # via cffi
+pycrypto==2.6.1 ; sys_platform not in "win32,darwin"
+pycryptodome==3.8.1       # via python-jose
+pygit2==0.28.2
+pyinotify==0.9.6
+pynacl==1.3.0             # via paramiko
+pyopenssl==19.0.0
+pyparsing==2.4.5          # via packaging
+pyserial==3.4             # via junos-eznc
+pytest-helpers-namespace==2019.1.8
+pytest-salt-runtests-bridge==2019.7.10
+pytest-salt==2020.1.27
+pytest-tempdir==2019.10.12
+pytest==4.6.6
+python-dateutil==2.8.0    # via botocore, croniter, kubernetes, moto, vcert
+python-etcd==0.4.5
+python-gnupg==0.4.4
+python-jose==2.0.2        # via moto
+pytz==2019.1              # via moto, tempora
+pyvmomi==6.7.1.2018.12
+pyyaml==5.1.2
+pyzmq==18.0.1 ; python_version != "3.4"
+requests==2.21.0
+responses==0.10.6         # via moto
+rfc3987==1.3.8
+rsa==4.0                  # via google-auth
+s3transfer==0.2.0         # via boto3
+salttesting==2017.6.1
+scp==0.13.2               # via junos-eznc
+setproctitle==1.1.10
+setuptools-scm==3.2.0
+six==1.12.0               # via bcrypt, cheroot, cherrypy, cryptography, docker, docker-pycreds, google-auth, junos-eznc, kazoo, kubernetes, mock, more-itertools, moto, ncclient, packaging, pygit2, pynacl, pyopenssl, pytest, python-dateutil, python-jose, pyvmomi, responses, salttesting, tempora, vcert, websocket-client
+smmap2==2.0.5             # via gitdb2
+strict-rfc3339==0.7
+tempora==1.14.1           # via portend
+timelib==0.2.4
+urllib3==1.24.2           # via botocore, kubernetes, python-etcd, requests
+vcert==0.7.3
+virtualenv==16.4.3
+watchdog==0.9.0
+wcwidth==0.1.7            # via pytest
+websocket-client==0.40.0  # via docker, kubernetes
+werkzeug==0.15.6          # via moto
+wrapt==1.11.1             # via aws-xray-sdk
+xmltodict==0.12.0         # via moto
+zc.lockfile==1.4          # via cherrypy
diff --git a/salt/ext/tornado/httputil.py b/salt/ext/tornado/httputil.py
index c7a5ac7c3c..35ed279143 100644
--- a/salt/ext/tornado/httputil.py
+++ b/salt/ext/tornado/httputil.py
@@ -21,7 +21,6 @@ via `tornado.web.RequestHandler.request`.
 """
 # pylint: skip-file
 
-from __future__ import absolute_import, division, print_function
 
 import calendar
 import collections
@@ -37,6 +36,13 @@ from salt.ext.tornado.escape import native_str, parse_qs_bytes, utf8
 from salt.ext.tornado.log import gen_log
 from salt.ext.tornado.util import PY3, ObjectDict
 
+try:
+    from collections.abc import MutableMapping
+except ImportError:
+    # pylint: disable=no-name-in-module
+    from collections import MutableMapping
+
+
 if PY3:
     import http.cookies as Cookie
     from http.client import responses
@@ -87,7 +93,7 @@ class _NormalizedHeaderCache(dict):
     """
 
     def __init__(self, size):
-        super(_NormalizedHeaderCache, self).__init__()
+        super().__init__()
         self.size = size
         self.queue = collections.deque()
 
@@ -244,13 +250,13 @@ class HTTPHeaders(MutableMapping):
     def __str__(self):
         lines = []
         for name, value in self.get_all():
-            lines.append("%s: %s\n" % (name, value))
+            lines.append("{}: {}\n".format(name, value))
         return "".join(lines)
 
     __unicode__ = __str__
 
 
-class HTTPServerRequest(object):
+class HTTPServerRequest:
     """A single HTTP request.
 
     All attributes are type `str` unless otherwise noted.
@@ -485,8 +491,8 @@ class HTTPServerRequest(object):
 
     def __repr__(self):
         attrs = ("protocol", "host", "method", "uri", "version", "remote_ip")
-        args = ", ".join(["%s=%r" % (n, getattr(self, n)) for n in attrs])
-        return "%s(%s, headers=%s)" % (
+        args = ", ".join(["{}={!r}".format(n, getattr(self, n)) for n in attrs])
+        return "{}({}, headers={})".format(
             self.__class__.__name__,
             args,
             dict(self.headers),
@@ -512,7 +518,7 @@ class HTTPOutputError(Exception):
     pass
 
 
-class HTTPServerConnectionDelegate(object):
+class HTTPServerConnectionDelegate:
     """Implement this interface to handle requests from `.HTTPServer`.
 
     .. versionadded:: 4.0
@@ -539,7 +545,7 @@ class HTTPServerConnectionDelegate(object):
         pass
 
 
-class HTTPMessageDelegate(object):
+class HTTPMessageDelegate:
     """Implement this interface to handle an HTTP request or response.
 
     .. versionadded:: 4.0
@@ -580,7 +586,7 @@ class HTTPMessageDelegate(object):
         pass
 
 
-class HTTPConnection(object):
+class HTTPConnection:
     """Applications use this interface to write their responses.
 
     .. versionadded:: 4.0
@@ -640,7 +646,7 @@ def url_concat(url, args):
         parsed_query = parse_qsl(parsed_url.query, keep_blank_values=True)
         parsed_query.extend(args)
     else:
-        err = "'args' parameter should be dict, list or tuple. Not {0}".format(
+        err = "'args' parameter should be dict, list or tuple. Not {}".format(
             type(args)
         )
         raise TypeError(err)
@@ -733,7 +739,7 @@ def _get_content_range(start, end, total):
     """
     start = start or 0
     end = (end or total) - 1
-    return "bytes %s-%s/%s" % (start, end, total)
+    return "bytes {}-{}/{}".format(start, end, total)
 
 
 def _int_or_none(val):
@@ -950,7 +956,7 @@ def _encode_header(key, pdict):
             out.append(k)
         else:
             # TODO: quote if necessary.
-            out.append("%s=%s" % (k, v))
+            out.append("{}={}".format(k, v))
     return "; ".join(out)
 
 
@@ -1044,13 +1050,13 @@ def parse_cookie(cookie):
     .. versionadded:: 4.4.2
     """
     cookiedict = {}
-    for chunk in cookie.split(str(";")):
-        if str("=") in chunk:
-            key, val = chunk.split(str("="), 1)
+    for chunk in cookie.split(";"):
+        if "=" in chunk:
+            key, val = chunk.split("=", 1)
         else:
             # Assume an empty name per
             # https://bugzilla.mozilla.org/show_bug.cgi?id=169091
-            key, val = str(""), chunk
+            key, val = "", chunk
         key, val = key.strip(), val.strip()
         if key or val:
             # unquote using Python's algorithm.
diff --git a/salt/utils/args.py b/salt/utils/args.py
index 102402500c..e43c527015 100644
--- a/salt/utils/args.py
+++ b/salt/utils/args.py
@@ -263,43 +263,31 @@ def get_function_argspec(func, is_class_method=None):
     if hasattr(func, "__wrapped__"):
         func = func.__wrapped__
 
-    if is_class_method is True:
-        aspec = _getargspec(func)
-        del aspec.args[0]  # self
-    elif inspect.isfunction(func):
-        aspec = _getargspec(func)
-    elif inspect.ismethod(func):
-        aspec = _getargspec(func)
-        del aspec.args[0]  # self
-    elif isinstance(func, object):
-        aspec = _getargspec(func.__call__)
-        del aspec.args[0]  # self
+    try:
+        sig = inspect.signature(func)
+    except TypeError:
+        raise TypeError("Cannot inspect argument list for '{}'".format(func))
     else:
-        try:
-            sig = inspect.signature(func)
-        except TypeError:
-            raise TypeError("Cannot inspect argument list for '{}'".format(func))
-        else:
-            # argspec-related functions are deprecated in Python 3 in favor of
-            # the new inspect.Signature class, and will be removed at some
-            # point in the Python 3 lifecycle. So, build a namedtuple which
-            # looks like the result of a Python 2 argspec.
-            _ArgSpec = namedtuple("ArgSpec", "args varargs keywords defaults")
-            args = []
-            defaults = []
-            varargs = keywords = None
-            for param in sig.parameters.values():
-                if param.kind == param.POSITIONAL_OR_KEYWORD:
-                    args.append(param.name)
-                    if param.default is not inspect._empty:
-                        defaults.append(param.default)
-                elif param.kind == param.VAR_POSITIONAL:
-                    varargs = param.name
-                elif param.kind == param.VAR_KEYWORD:
-                    keywords = param.name
-            if is_class_method:
-                del args[0]
-            aspec = _ArgSpec(args, varargs, keywords, tuple(defaults) or None)
+        # argspec-related functions are deprecated in Python 3 in favor of
+        # the new inspect.Signature class, and will be removed at some
+        # point in the Python 3 lifecycle. So, build a namedtuple which
+        # looks like the result of a Python 2 argspec.
+        _ArgSpec = namedtuple("ArgSpec", "args varargs keywords defaults")
+        args = []
+        defaults = []
+        varargs = keywords = None
+        for param in sig.parameters.values():
+            if param.kind == param.POSITIONAL_OR_KEYWORD:
+                args.append(param.name)
+                if param.default is not inspect._empty:
+                    defaults.append(param.default)
+            elif param.kind == param.VAR_POSITIONAL:
+                varargs = param.name
+            elif param.kind == param.VAR_KEYWORD:
+                keywords = param.name
+        if is_class_method:
+            del args[0]
+        aspec = _ArgSpec(args, varargs, keywords, tuple(defaults) or None)
 
     return aspec
 
diff --git a/salt/utils/jinja.py b/salt/utils/jinja.py
index c5a30ba04e..997d4b1697 100644
--- a/salt/utils/jinja.py
+++ b/salt/utils/jinja.py
@@ -34,6 +34,13 @@ from salt.utils.decorators.jinja import jinja_filter, jinja_global, jinja_test
 from salt.utils.odict import OrderedDict
 from salt.utils.versions import LooseVersion
 
+try:
+    from collections.abc import Hashable
+except ImportError:
+    # pylint: disable=no-name-in-module
+    from collections import Hashable
+
+
 log = logging.getLogger(__name__)
 
 __all__ = ["SaltCacheLoader", "SerializerExtension"]
diff --git a/salt/utils/oset.py b/salt/utils/oset.py
index 31a6a4acca..84c262e15f 100644
--- a/salt/utils/oset.py
+++ b/salt/utils/oset.py
@@ -20,9 +20,11 @@ Rob Speer's changes are as follows:
     - added a __getstate__ and __setstate__ so it can be pickled
     - added __getitem__
 """
+
 try:
     from collections.abc import MutableSet
 except ImportError:
+    # pylint: disable=no-name-in-module
     from collections import MutableSet
 
 SLICE_ALL = slice(None)
-- 
2.29.2
openSUSE Build Service is sponsored by