From 1e6efc8bf365db6b86c6694a13d38a54ba15aea9 Mon Sep 17 00:00:00 2001 From: Packit <hello@packit.dev> Date: Thu, 15 Jun 2023 17:53:23 +0000 Subject: [PATCH] [packit] 0.16.21 upstream release Upstream tag: v0.16.21 Upstream commit: 46259648 --- .gitignore | 1 + README.packit | 2 +- python-awscrt.spec | 5 +- python3.12.patch | 510 --------------------------------------------- sources | 2 +- 5 files changed, 4 insertions(+), 516 deletions(-) delete mode 100644 python3.12.patch diff --git a/.gitignore b/.gitignore index 44d7737..c446c11 100644 --- a/.gitignore +++ b/.gitignore @@ -3,3 +3,4 @@ /awscrt-0.16.17.tar.gz /awscrt-0.16.18.tar.gz /awscrt-0.16.19.tar.gz +/awscrt-0.16.21.tar.gz diff --git a/README.packit b/README.packit index 01582f6..07bc213 100644 --- a/README.packit +++ b/README.packit @@ -1,3 +1,3 @@ This repository is maintained by packit. https://packit.dev/ -The file was generated using packit 0.76.0. +The file was generated using packit 0.76.0.post10+g0dcb396. diff --git a/python-awscrt.spec b/python-awscrt.spec index 5fe3264..af530ca 100644 --- a/python-awscrt.spec +++ b/python-awscrt.spec @@ -3,7 +3,7 @@ Python bindings for the AWS Common Runtime} Name: python-awscrt -Version: 0.16.19 +Version: 0.16.21 Release: %autorelease Summary: Python bindings for the AWS Common Runtime @@ -19,9 +19,6 @@ Source0: %{pypi_source awscrt} # one test requires internet connection, skip it Patch0: skip-test-requiring-network.patch -# backport of https://github.com/awslabs/aws-crt-python/commit/7431e2d562f622a782b89c4ef8f22de5e710e236 -Patch1: python3.12.patch - BuildRequires: python%{python3_pkgversion}-devel BuildRequires: gcc diff --git a/python3.12.patch b/python3.12.patch deleted file mode 100644 index a1b239a..0000000 --- a/python3.12.patch +++ /dev/null @@ -1,510 +0,0 @@ -diff --git a/setup.py b/setup.py -index 36a8cdc..0b106b2 100644 ---- a/setup.py -+++ b/setup.py -@@ -14,10 +14,11 @@ import shutil - import subprocess - import sys - import sysconfig -+from wheel.bdist_wheel import bdist_wheel - - - def is_64bit(): -- return sys.maxsize > 2**32 -+ return sys.maxsize > 2 ** 32 - - - def is_32bit(): -@@ -152,7 +153,6 @@ AWS_LIBS.append(AwsLib('aws-c-auth')) - AWS_LIBS.append(AwsLib('aws-c-mqtt')) - AWS_LIBS.append(AwsLib('aws-c-s3')) - -- - PROJECT_DIR = os.path.dirname(os.path.realpath(__file__)) - - VERSION_RE = re.compile(r""".*__version__ = ["'](.*?)['"]""", re.S) -@@ -283,11 +283,23 @@ class awscrt_build_ext(setuptools.command.build_ext.build_ext): - super().run() - - -+class bdist_wheel_abi3(bdist_wheel): -+ def get_tag(self): -+ python, abi, plat = super().get_tag() -+ if python.startswith("cp") and sys.version_info >= (3, 11): -+ # on CPython, our wheels are abi3 and compatible back to 3.11 -+ return "cp311", "abi3", plat -+ -+ return python, abi, plat -+ -+ - def awscrt_ext(): - # fetch the CFLAGS/LDFLAGS from env - extra_compile_args = os.environ.get('CFLAGS', '').split() - extra_link_args = os.environ.get('LDFLAGS', '').split() - extra_objects = [] -+ define_macros = [] -+ py_limited_api = False - - libraries = [x.libname for x in AWS_LIBS] - -@@ -350,6 +362,10 @@ def awscrt_ext(): - if not is_macos_universal2(): - extra_link_args += ['-Wl,-fatal_warnings'] - -+ if sys.version_info >= (3, 11): -+ define_macros.append(('Py_LIMITED_API', '0x030B0000')) -+ py_limited_api = True -+ - return setuptools.Extension( - '_awscrt', - language='c', -@@ -357,7 +373,9 @@ def awscrt_ext(): - sources=glob.glob('source/*.c'), - extra_compile_args=extra_compile_args, - extra_link_args=extra_link_args, -- extra_objects=extra_objects -+ extra_objects=extra_objects, -+ define_macros=define_macros, -+ py_limited_api=py_limited_api, - ) - - -@@ -392,6 +410,6 @@ setuptools.setup( - ], - python_requires='>=3.7', - ext_modules=[awscrt_ext()], -- cmdclass={'build_ext': awscrt_build_ext}, -+ cmdclass={'build_ext': awscrt_build_ext, "bdist_wheel": bdist_wheel_abi3}, - test_suite='test', - ) -diff --git a/source/auth_credentials.c b/source/auth_credentials.c -index 80bca19..66b1afa 100644 ---- a/source/auth_credentials.c -+++ b/source/auth_credentials.c -@@ -513,7 +513,7 @@ PyObject *aws_py_credentials_provider_new_chain(PyObject *self, PyObject *args) - if (!providers_pyseq) { - goto done; - } -- size_t provider_count = (size_t)PySequence_Fast_GET_SIZE(providers_pyseq); -+ size_t provider_count = (size_t)PySequence_Size(providers_pyseq); - if (provider_count == 0) { - PyErr_SetString(PyExc_ValueError, "Must supply at least one AwsCredentialsProvider."); - goto done; -@@ -526,8 +526,9 @@ PyObject *aws_py_credentials_provider_new_chain(PyObject *self, PyObject *args) - } - - for (size_t i = 0; i < provider_count; ++i) { -- PyObject *provider_py = PySequence_Fast_GET_ITEM(providers_pyseq, i); -+ PyObject *provider_py = PySequence_GetItem(providers_pyseq, i); /* new reference */ - providers_carray[i] = aws_py_get_credentials_provider(provider_py); -+ Py_XDECREF(provider_py); - if (!providers_carray[i]) { - goto done; - } -@@ -724,7 +725,7 @@ PyObject *aws_py_credentials_provider_new_cognito(PyObject *self, PyObject *args - goto done; - } - -- logins_count = (size_t)PySequence_Fast_GET_SIZE(logins_pyseq); -+ logins_count = (size_t)PySequence_Size(logins_pyseq); - if (logins_count > 0) { - - logins_carray = -@@ -735,7 +736,7 @@ PyObject *aws_py_credentials_provider_new_cognito(PyObject *self, PyObject *args - } - - for (size_t i = 0; i < logins_count; ++i) { -- PyObject *login_tuple_py = PySequence_Fast_GET_ITEM(logins_pyseq, i); -+ PyObject *login_tuple_py = PySequence_GetItem(logins_pyseq, i); /* New reference */ - struct aws_cognito_identity_provider_token_pair *login_entry = &logins_carray[i]; - AWS_ZERO_STRUCT(*login_entry); - -@@ -750,8 +751,10 @@ PyObject *aws_py_credentials_provider_new_cognito(PyObject *self, PyObject *args - PyExc_TypeError, - "cognito credentials provider: logins[%zu] is invalid, should be type (str, str)", - i); -+ Py_XDECREF(login_tuple_py); - goto done; - } -+ Py_XDECREF(login_tuple_py); - } - } - } -diff --git a/source/event_stream_headers.c b/source/event_stream_headers.c -index f8ae4ef..cfb1ac3 100644 ---- a/source/event_stream_headers.c -+++ b/source/event_stream_headers.c -@@ -166,19 +166,20 @@ bool aws_py_event_stream_native_headers_init(struct aws_array_list *native_heade - bool success = false; - PyObject *sequence_py = NULL; - -- sequence_py = PySequence_Fast(headers_py, "Expected sequence of Headers"); /* New reference */ -+ sequence_py = PySequence_Fast(headers_py, "Expected sequence of Headers"); - if (!sequence_py) { - goto done; - } - -- const Py_ssize_t count = PySequence_Fast_GET_SIZE(sequence_py); -+ const Py_ssize_t count = PySequence_Size(sequence_py); - for (Py_ssize_t i = 0; i < count; ++i) { -- /* Borrowed reference, don't need to decref */ -- PyObject *header_py = PySequence_Fast_GET_ITEM(sequence_py, i); -+ PyObject *header_py = PySequence_GetItem(sequence_py, i); /* New Reference */ - - if (!s_add_native_header(native_headers, header_py)) { -+ Py_XDECREF(header_py); - goto done; - } -+ Py_XDECREF(header_py); - } - - success = true; -@@ -270,7 +271,7 @@ PyObject *aws_py_event_stream_python_headers_create( - goto error; - } - -- PyList_SET_ITEM(list_py, i, tuple_py); /* steals reference to tuple */ -+ PyList_SetItem(list_py, i, tuple_py); /* steals reference to tuple */ - } - - return list_py; -diff --git a/source/http_headers.c b/source/http_headers.c -index 187cd7c..66974f9 100644 ---- a/source/http_headers.c -+++ b/source/http_headers.c -@@ -85,6 +85,29 @@ PyObject *aws_py_http_headers_add(PyObject *self, PyObject *args) { - Py_RETURN_NONE; - } - -+static bool s_py_http_headers_add_pair(PyObject *py_pair, struct aws_http_headers *headers) { -+ -+ const char *type_errmsg = "List of (name,value) pairs expected."; -+ if (!PyTuple_Check(py_pair) || PyTuple_Size(py_pair) != 2) { -+ PyErr_SetString(PyExc_TypeError, type_errmsg); -+ return false; -+ } -+ -+ struct aws_byte_cursor name = aws_byte_cursor_from_pyunicode(PyTuple_GetItem(py_pair, 0) /* Borrowed reference */); -+ struct aws_byte_cursor value = aws_byte_cursor_from_pyunicode(PyTuple_GetItem(py_pair, 1) /* Borrowed reference */); -+ if (!name.ptr || !value.ptr) { -+ PyErr_SetString(PyExc_TypeError, type_errmsg); -+ return false; -+ } -+ -+ if (aws_http_headers_add(headers, name, value)) { -+ PyErr_SetAwsLastError(); -+ return false; -+ } -+ -+ return true; -+} -+ - PyObject *aws_py_http_headers_add_pairs(PyObject *self, PyObject *args) { - PyObject *py_pairs; - S_HEADERS_METHOD_START("O", &py_pairs); -@@ -96,25 +119,12 @@ PyObject *aws_py_http_headers_add_pairs(PyObject *self, PyObject *args) { - return NULL; - } - -- const Py_ssize_t count = PySequence_Fast_GET_SIZE(py_sequence); -+ const Py_ssize_t count = PySequence_Size(py_pairs); - for (Py_ssize_t i = 0; i < count; ++i) { -- /* XYZ_GET_ITEM() calls returns borrowed references */ -- PyObject *py_pair = PySequence_Fast_GET_ITEM(py_sequence, i); -- -- if (!PyTuple_Check(py_pair) || PyTuple_GET_SIZE(py_pair) != 2) { -- PyErr_SetString(PyExc_TypeError, type_errmsg); -- goto done; -- } -- -- struct aws_byte_cursor name = aws_byte_cursor_from_pyunicode(PyTuple_GET_ITEM(py_pair, 0)); -- struct aws_byte_cursor value = aws_byte_cursor_from_pyunicode(PyTuple_GET_ITEM(py_pair, 1)); -- if (!name.ptr || !value.ptr) { -- PyErr_SetString(PyExc_TypeError, type_errmsg); -- goto done; -- } -- -- if (aws_http_headers_add(headers, name, value)) { -- PyErr_SetAwsLastError(); -+ PyObject *py_pair = PySequence_GetItem(py_sequence, i); /* New Reference */ -+ bool success = s_py_http_headers_add_pair(py_pair, headers); -+ Py_DECREF(py_pair); -+ if (!success) { - goto done; - } - } -@@ -175,8 +185,8 @@ static PyObject *s_py_tuple_from_header(struct aws_http_header header) { - goto error; - } - -- PyTuple_SET_ITEM(py_pair, 0, py_name); -- PyTuple_SET_ITEM(py_pair, 1, py_value); -+ PyTuple_SetItem(py_pair, 0, py_name); /* Steals a reference */ -+ PyTuple_SetItem(py_pair, 1, py_value); /* Steals a reference */ - return py_pair; - - error: -diff --git a/source/http_stream.c b/source/http_stream.c -index 18ed406..bf70218 100644 ---- a/source/http_stream.c -+++ b/source/http_stream.c -@@ -121,7 +121,7 @@ static int s_on_incoming_header_block_done( - goto done; - } - -- PyList_SET_ITEM(header_list, i, tuple); /* steals reference to tuple */ -+ PyList_SetItem(header_list, i, tuple); /* steals reference to tuple */ - } - - /* TODO: handle informational and trailing headers */ -diff --git a/source/module.c b/source/module.c -index ca8a0d9..f120daa 100644 ---- a/source/module.c -+++ b/source/module.c -@@ -531,20 +531,12 @@ void *aws_py_get_binding(PyObject *obj, const char *capsule_name, const char *cl - - PyObject *py_binding = PyObject_GetAttrString(obj, "_binding"); /* new reference */ - if (!py_binding) { -- return PyErr_Format( -- PyExc_TypeError, -- "Expected valid '%s', received '%s' (no '_binding' attribute)", -- class_name, -- Py_TYPE(obj)->tp_name); -+ return PyErr_Format(PyExc_TypeError, "Expected valid '%s' (no '_binding' attribute)", class_name); - } - - void *binding = NULL; - if (!PyCapsule_CheckExact(py_binding)) { -- PyErr_Format( -- PyExc_TypeError, -- "Expected valid '%s', received '%s' ('_binding' attribute is not a capsule)", -- class_name, -- Py_TYPE(obj)->tp_name); -+ PyErr_Format(PyExc_TypeError, "Expected valid '%s' ('_binding' attribute is not a capsule)", class_name); - goto done; - } - -@@ -552,9 +544,8 @@ void *aws_py_get_binding(PyObject *obj, const char *capsule_name, const char *cl - if (!binding) { - PyErr_Format( - PyExc_TypeError, -- "Expected valid '%s', received '%s' ('_binding' attribute does not contain '%s')", -+ "Expected valid '%s' ('_binding' attribute does not contain '%s')", - class_name, -- Py_TYPE(obj)->tp_name, - capsule_name); - goto done; - } -diff --git a/source/mqtt5_client.c b/source/mqtt5_client.c -index e07eb91..c43c90c 100644 ---- a/source/mqtt5_client.c -+++ b/source/mqtt5_client.c -@@ -200,7 +200,7 @@ static PyObject *s_aws_set_user_properties_to_PyObject( - Py_XDECREF(user_properties_list); - return NULL; - } -- PyList_SET_ITEM(user_properties_list, i, tuple); /* Steals reference to tuple */ -+ PyList_SetItem(user_properties_list, i, tuple); /* Steals reference to tuple */ - } - return user_properties_list; - } -@@ -237,8 +237,10 @@ static void s_on_publish_received(const struct aws_mqtt5_packet_publish_view *pu - } - - for (size_t i = 0; i < subscription_identifier_count; ++i) { -- PyList_SET_ITEM( -- subscription_identifier_list, i, PyLong_FromLongLong(publish_packet->subscription_identifiers[i])); -+ PyList_SetItem( -+ subscription_identifier_list, -+ i, -+ PyLong_FromLongLong(publish_packet->subscription_identifiers[i])); /* Steals a reference */ - } - - user_properties_list = s_aws_set_user_properties_to_PyObject(publish_packet->user_properties, user_property_count); -@@ -1629,7 +1631,7 @@ static void s_on_subscribe_complete_fn( - } - - for (size_t i = 0; i < reason_codes_count; ++i) { -- PyList_SET_ITEM(reason_codes_list, i, PyLong_FromLong(suback->reason_codes[i])); -+ PyList_SetItem(reason_codes_list, i, PyLong_FromLong(suback->reason_codes[i])); /* Steals a reference */ - } - } - -@@ -1860,7 +1862,7 @@ static void s_on_unsubscribe_complete_fn( - } - - for (size_t i = 0; i < reason_codes_count; ++i) { -- PyList_SET_ITEM(reason_codes_list, i, PyLong_FromLong(unsuback->reason_codes[i])); -+ PyList_SetItem(reason_codes_list, i, PyLong_FromLong(unsuback->reason_codes[i])); /* Steals a reference */ - } - } - -@@ -2030,23 +2032,35 @@ PyObject *aws_py_mqtt5_client_get_stats(PyObject *self, PyObject *args) { - goto done; - } - -- PyTuple_SET_ITEM(result, 0, PyLong_FromUnsignedLongLong((unsigned long long)stats.incomplete_operation_count)); -- if (PyTuple_GET_ITEM(result, 0) == NULL) { -+ PyTuple_SetItem( -+ result, -+ 0, -+ PyLong_FromUnsignedLongLong((unsigned long long)stats.incomplete_operation_count)); /* Steals a reference */ -+ if (PyTuple_GetItem(result, 0) == NULL) { /* Borrowed reference */ - goto done; - } - -- PyTuple_SET_ITEM(result, 1, PyLong_FromUnsignedLongLong((unsigned long long)stats.incomplete_operation_size)); -- if (PyTuple_GET_ITEM(result, 1) == NULL) { -+ PyTuple_SetItem( -+ result, -+ 1, -+ PyLong_FromUnsignedLongLong((unsigned long long)stats.incomplete_operation_size)); /* Steals a reference */ -+ if (PyTuple_GetItem(result, 1) == NULL) { /* Borrowed reference */ - goto done; - } - -- PyTuple_SET_ITEM(result, 2, PyLong_FromUnsignedLongLong((unsigned long long)stats.unacked_operation_count)); -- if (PyTuple_GET_ITEM(result, 2) == NULL) { -+ PyTuple_SetItem( -+ result, -+ 2, -+ PyLong_FromUnsignedLongLong((unsigned long long)stats.unacked_operation_count)); /* Steals a reference */ -+ if (PyTuple_GetItem(result, 2) == NULL) { /* Borrowed reference */ - goto done; - } - -- PyTuple_SET_ITEM(result, 3, PyLong_FromUnsignedLongLong((unsigned long long)stats.unacked_operation_size)); -- if (PyTuple_GET_ITEM(result, 3) == NULL) { -+ PyTuple_SetItem( -+ result, -+ 3, -+ PyLong_FromUnsignedLongLong((unsigned long long)stats.unacked_operation_size)); /* Steals a reference */ -+ if (PyTuple_GetItem(result, 3) == NULL) { /* Borrowed reference */ - goto done; - } - -diff --git a/source/mqtt_client_connection.c b/source/mqtt_client_connection.c -index bd06d29..96e7ec6 100644 ---- a/source/mqtt_client_connection.c -+++ b/source/mqtt_client_connection.c -@@ -1063,7 +1063,7 @@ static void s_suback_multi_callback( - goto done_prepping_args; - } - -- PyList_SET_ITEM(topic_qos_list, i, tuple); /* Steals reference to tuple */ -+ PyList_SetItem(topic_qos_list, i, tuple); /* Steals reference to tuple */ - } - - done_prepping_args:; -@@ -1202,23 +1202,35 @@ PyObject *aws_py_mqtt_client_connection_get_stats(PyObject *self, PyObject *args - goto done; - } - -- PyTuple_SET_ITEM(result, 0, PyLong_FromUnsignedLongLong((unsigned long long)stats.incomplete_operation_count)); -- if (PyTuple_GET_ITEM(result, 0) == NULL) { -+ PyTuple_SetItem( -+ result, -+ 0, -+ PyLong_FromUnsignedLongLong((unsigned long long)stats.incomplete_operation_count)); /* Steals a reference */ -+ if (PyTuple_GetItem(result, 0) == NULL) { /* Borrowed reference */ - goto done; - } - -- PyTuple_SET_ITEM(result, 1, PyLong_FromUnsignedLongLong((unsigned long long)stats.incomplete_operation_size)); -- if (PyTuple_GET_ITEM(result, 1) == NULL) { -+ PyTuple_SetItem( -+ result, -+ 1, -+ PyLong_FromUnsignedLongLong((unsigned long long)stats.incomplete_operation_size)); /* Steals a reference */ -+ if (PyTuple_GetItem(result, 1) == NULL) { /* Borrowed reference */ - goto done; - } - -- PyTuple_SET_ITEM(result, 2, PyLong_FromUnsignedLongLong((unsigned long long)stats.unacked_operation_count)); -- if (PyTuple_GET_ITEM(result, 2) == NULL) { -+ PyTuple_SetItem( -+ result, -+ 2, -+ PyLong_FromUnsignedLongLong((unsigned long long)stats.unacked_operation_count)); /* Steals a reference */ -+ if (PyTuple_GetItem(result, 2) == NULL) { /* Borrowed reference */ - goto done; - } - -- PyTuple_SET_ITEM(result, 3, PyLong_FromUnsignedLongLong((unsigned long long)stats.unacked_operation_size)); -- if (PyTuple_GET_ITEM(result, 3) == NULL) { -+ PyTuple_SetItem( -+ result, -+ 3, -+ PyLong_FromUnsignedLongLong((unsigned long long)stats.unacked_operation_size)); /* Steals a reference */ -+ if (PyTuple_GetItem(result, 3) == NULL) { /* Borrowed reference */ - goto done; - } - -diff --git a/source/s3_meta_request.c b/source/s3_meta_request.c -index 88a7c19..f7ffa56 100644 ---- a/source/s3_meta_request.c -+++ b/source/s3_meta_request.c -@@ -69,7 +69,7 @@ static PyObject *s_get_py_headers(const struct aws_http_headers *headers) { - if (!tuple) { - goto error; - } -- PyList_SET_ITEM(header_list, i, tuple); /* steals reference to tuple */ -+ PyList_SetItem(header_list, i, tuple); /* steals reference to tuple */ - } - return header_list; - error: -diff --git a/source/websocket.c b/source/websocket.c -index 2b056ee..95f9d8e 100644 ---- a/source/websocket.c -+++ b/source/websocket.c -@@ -211,13 +211,13 @@ static void s_websocket_on_connection_setup( - - PyObject *name_py = PyUnicode_FromAwsByteCursor(&header_i->name); - AWS_FATAL_ASSERT(name_py && "header name wrangling failed"); -- PyTuple_SET_ITEM(tuple_py, 0, name_py); -+ PyTuple_SetItem(tuple_py, 0, name_py); /* Steals a reference */ - - PyObject *value_py = PyUnicode_FromAwsByteCursor(&header_i->value); - AWS_FATAL_ASSERT(value_py && "header value wrangling failed"); -- PyTuple_SET_ITEM(tuple_py, 1, value_py); -+ PyTuple_SetItem(tuple_py, 1, value_py); /* Steals a reference */ - -- PyList_SET_ITEM(headers_py, i, tuple_py); -+ PyList_SetItem(headers_py, i, tuple_py); /* Steals a reference */ - } - } - -@@ -580,13 +580,13 @@ PyObject *aws_py_websocket_create_handshake_request(PyObject *self, PyObject *ar - if (!request_binding_py) { - goto cleanup; - } -- PyTuple_SET_ITEM(tuple_py, 0, request_binding_py); /* steals reference to request_binding_py */ -+ PyTuple_SetItem(tuple_py, 0, request_binding_py); /* steals reference to request_binding_py */ - - PyObject *headers_binding_py = aws_py_http_headers_new_from_native(aws_http_message_get_headers(request)); - if (!headers_binding_py) { - goto cleanup; - } -- PyTuple_SET_ITEM(tuple_py, 1, headers_binding_py); /* steals reference to headers_binding_py */ -+ PyTuple_SetItem(tuple_py, 1, headers_binding_py); /* steals reference to headers_binding_py */ - - /* Success! */ - success = true; -diff --git a/test/test_http_client.py b/test/test_http_client.py -index dd2631a..14a6d75 100644 ---- a/test/test_http_client.py -+++ b/test/test_http_client.py -@@ -57,10 +57,9 @@ class TestClient(NativeResourceTest): - - self.server = HTTPServer((self.hostname, 0), TestRequestHandler) - if secure: -- self.server.socket = ssl.wrap_socket(self.server.socket, -- keyfile="test/resources/unittest.key", -- certfile='test/resources/unittest.crt', -- server_side=True) -+ context = ssl.SSLContext() -+ context.load_cert_chain(certfile='test/resources/unittest.crt', keyfile="test/resources/unittest.key") -+ self.server.socket = context.wrap_socket(self.server.socket, server_side=True) - self.port = self.server.server_address[1] - - # put requests are stored in this dict diff --git a/sources b/sources index e384f5c..7421f4b 100644 --- a/sources +++ b/sources @@ -1 +1 @@ -SHA512 (awscrt-0.16.19.tar.gz) = d3ff1a1e913c9f77d10cc33137f3a2652898d26d047ca932731b84e702a152e2d472cd91da62fdbc3f5f1c502c9dfc2a84cdcc3269944e92b5a0b93d0eb39f43 +SHA512 (awscrt-0.16.21.tar.gz) = e93cce14adf9f0c8578f5de6c290362187e2b7bc96f91150ae247df10b5ef9439118c4248a3883f95a579d2c0ac2aea4561a61f346d9e89b10248c4f1c049b4b