From efe8fdf9235dba64280b35a2aec3a1b9cf083700 Mon Sep 17 00:00:00 2001 From: Thomas Hodnemyr Date: Thu, 8 Sep 2022 02:10:30 +0200 Subject: [PATCH] Update1 --- .gitignore | 1 + requirements.txt | Bin 0 -> 398 bytes .../site-packages/_distutils_hack/__init__.py | 128 + .../__pycache__/__init__.cpython-310.pyc | Bin 0 -> 5133 bytes .../__pycache__/override.cpython-310.pyc | Bin 0 -> 239 bytes .../site-packages/_distutils_hack/override.py | 1 + .../aiohttp-3.8.1.dist-info/INSTALLER | 1 + .../aiohttp-3.8.1.dist-info/LICENSE.txt | 13 + .../aiohttp-3.8.1.dist-info/METADATA | 255 + .../aiohttp-3.8.1.dist-info/RECORD | 123 + .../aiohttp-3.8.1.dist-info/WHEEL | 5 + .../aiohttp-3.8.1.dist-info/top_level.txt | 1 + .../aiohttp/.hash/_cparser.pxd.hash | 1 + .../aiohttp/.hash/_find_header.pxd.hash | 1 + .../aiohttp/.hash/_helpers.pyi.hash | 1 + .../aiohttp/.hash/_helpers.pyx.hash | 1 + .../aiohttp/.hash/_http_parser.pyx.hash | 1 + .../aiohttp/.hash/_http_writer.pyx.hash | 1 + .../aiohttp/.hash/_websocket.pyx.hash | 1 + .../site-packages/aiohttp/.hash/hdrs.py.hash | 1 + .../Lib/site-packages/aiohttp/__init__.py | 216 + .../__pycache__/__init__.cpython-310.pyc | Bin 0 -> 3693 bytes .../aiohttp/__pycache__/abc.cpython-310.pyc | Bin 0 -> 8524 bytes .../__pycache__/base_protocol.cpython-310.pyc | Bin 0 -> 2624 bytes .../__pycache__/client.cpython-310.pyc | Bin 0 -> 29762 bytes .../client_exceptions.cpython-310.pyc | Bin 0 -> 11000 bytes .../__pycache__/client_proto.cpython-310.pyc | Bin 0 -> 6155 bytes .../__pycache__/client_reqrep.cpython-310.pyc | Bin 0 -> 28014 bytes .../__pycache__/client_ws.cpython-310.pyc | Bin 0 -> 8970 bytes .../__pycache__/connector.cpython-310.pyc | Bin 0 -> 35557 bytes .../__pycache__/cookiejar.cpython-310.pyc | Bin 0 -> 10670 bytes .../__pycache__/formdata.cpython-310.pyc | Bin 0 -> 4553 bytes .../aiohttp/__pycache__/hdrs.cpython-310.pyc | Bin 0 -> 5301 bytes .../__pycache__/helpers.cpython-310.pyc | Bin 0 -> 25955 bytes .../aiohttp/__pycache__/http.cpython-310.pyc | Bin 0 -> 1259 bytes .../http_exceptions.cpython-310.pyc | Bin 0 -> 4266 bytes .../__pycache__/http_parser.cpython-310.pyc | Bin 0 -> 18052 bytes .../http_websocket.cpython-310.pyc | Bin 0 -> 15099 bytes .../__pycache__/http_writer.cpython-310.pyc | Bin 0 -> 5678 bytes .../aiohttp/__pycache__/locks.cpython-310.pyc | Bin 0 -> 1653 bytes .../aiohttp/__pycache__/log.cpython-310.pyc | Bin 0 -> 460 bytes .../__pycache__/multipart.cpython-310.pyc | Bin 0 -> 26399 bytes .../__pycache__/payload.cpython-310.pyc | Bin 0 -> 13741 bytes .../payload_streamer.cpython-310.pyc | Bin 0 -> 3268 bytes .../__pycache__/pytest_plugin.cpython-310.pyc | Bin 0 -> 9811 bytes .../__pycache__/resolver.cpython-310.pyc | Bin 0 -> 4037 bytes .../__pycache__/streams.cpython-310.pyc | Bin 0 -> 18687 bytes .../__pycache__/tcp_helpers.cpython-310.pyc | Bin 0 -> 1149 bytes .../__pycache__/test_utils.cpython-310.pyc | Bin 0 -> 21443 bytes .../__pycache__/tracing.cpython-310.pyc | Bin 0 -> 14367 bytes .../__pycache__/typedefs.cpython-310.pyc | Bin 0 -> 1515 bytes .../aiohttp/__pycache__/web.cpython-310.pyc | Bin 0 -> 10128 bytes .../__pycache__/web_app.cpython-310.pyc | Bin 0 -> 15204 bytes .../web_exceptions.cpython-310.pyc | Bin 0 -> 11254 bytes .../web_fileresponse.cpython-310.pyc | Bin 0 -> 6082 bytes .../__pycache__/web_log.cpython-310.pyc | Bin 0 -> 7211 bytes .../web_middlewares.cpython-310.pyc | Bin 0 -> 3914 bytes .../__pycache__/web_protocol.cpython-310.pyc | Bin 0 -> 16708 bytes .../__pycache__/web_request.cpython-310.pyc | Bin 0 -> 23878 bytes .../__pycache__/web_response.cpython-310.pyc | Bin 0 -> 21186 bytes .../__pycache__/web_routedef.cpython-310.pyc | Bin 0 -> 7537 bytes .../__pycache__/web_runner.cpython-310.pyc | Bin 0 -> 11666 bytes .../__pycache__/web_server.cpython-310.pyc | Bin 0 -> 2802 bytes .../web_urldispatcher.cpython-310.pyc | Bin 0 -> 41618 bytes .../__pycache__/web_ws.cpython-310.pyc | Bin 0 -> 13403 bytes .../__pycache__/worker.cpython-310.pyc | Bin 0 -> 6910 bytes .../Lib/site-packages/aiohttp/_cparser.pxd | 190 + .../Lib/site-packages/aiohttp/_find_header.c | 9870 +++++++ .../Lib/site-packages/aiohttp/_find_header.h | 14 + .../site-packages/aiohttp/_find_header.pxd | 2 + .../Lib/site-packages/aiohttp/_headers.pxi | 83 + .../Lib/site-packages/aiohttp/_helpers.c | 5467 ++++ .../aiohttp/_helpers.cp310-win_amd64.pyd | Bin 0 -> 48640 bytes .../Lib/site-packages/aiohttp/_helpers.pyi | 6 + .../Lib/site-packages/aiohttp/_helpers.pyx | 35 + .../Lib/site-packages/aiohttp/_http_parser.c | 23880 ++++++++++++++++ .../aiohttp/_http_parser.cp310-win_amd64.pyd | Bin 0 -> 242688 bytes .../site-packages/aiohttp/_http_parser.pyx | 818 + .../Lib/site-packages/aiohttp/_http_writer.c | 6047 ++++ .../aiohttp/_http_writer.cp310-win_amd64.pyd | Bin 0 -> 44544 bytes .../site-packages/aiohttp/_http_writer.pyx | 163 + .../Lib/site-packages/aiohttp/_websocket.c | 3622 +++ .../aiohttp/_websocket.cp310-win_amd64.pyd | Bin 0 -> 28160 bytes .../Lib/site-packages/aiohttp/_websocket.pyx | 56 + sbsheriff/Lib/site-packages/aiohttp/abc.py | 207 + .../site-packages/aiohttp/base_protocol.py | 87 + sbsheriff/Lib/site-packages/aiohttp/client.py | 1302 + .../aiohttp/client_exceptions.py | 342 + .../Lib/site-packages/aiohttp/client_proto.py | 251 + .../site-packages/aiohttp/client_reqrep.py | 1133 + .../Lib/site-packages/aiohttp/client_ws.py | 300 + .../Lib/site-packages/aiohttp/connector.py | 1449 + .../Lib/site-packages/aiohttp/cookiejar.py | 413 + .../Lib/site-packages/aiohttp/formdata.py | 172 + sbsheriff/Lib/site-packages/aiohttp/hdrs.py | 114 + .../Lib/site-packages/aiohttp/helpers.py | 875 + sbsheriff/Lib/site-packages/aiohttp/http.py | 72 + .../site-packages/aiohttp/http_exceptions.py | 105 + .../Lib/site-packages/aiohttp/http_parser.py | 956 + .../site-packages/aiohttp/http_websocket.py | 701 + .../Lib/site-packages/aiohttp/http_writer.py | 200 + sbsheriff/Lib/site-packages/aiohttp/locks.py | 41 + sbsheriff/Lib/site-packages/aiohttp/log.py | 8 + .../Lib/site-packages/aiohttp/multipart.py | 963 + .../Lib/site-packages/aiohttp/payload.py | 465 + .../site-packages/aiohttp/payload_streamer.py | 75 + sbsheriff/Lib/site-packages/aiohttp/py.typed | 1 + .../site-packages/aiohttp/pytest_plugin.py | 391 + .../Lib/site-packages/aiohttp/resolver.py | 160 + .../Lib/site-packages/aiohttp/streams.py | 660 + .../Lib/site-packages/aiohttp/tcp_helpers.py | 38 + .../Lib/site-packages/aiohttp/test_utils.py | 698 + .../Lib/site-packages/aiohttp/tracing.py | 472 + .../Lib/site-packages/aiohttp/typedefs.py | 64 + sbsheriff/Lib/site-packages/aiohttp/web.py | 586 + .../Lib/site-packages/aiohttp/web_app.py | 557 + .../site-packages/aiohttp/web_exceptions.py | 441 + .../site-packages/aiohttp/web_fileresponse.py | 288 + .../Lib/site-packages/aiohttp/web_log.py | 208 + .../site-packages/aiohttp/web_middlewares.py | 119 + .../Lib/site-packages/aiohttp/web_protocol.py | 681 + .../Lib/site-packages/aiohttp/web_request.py | 874 + .../Lib/site-packages/aiohttp/web_response.py | 825 + .../Lib/site-packages/aiohttp/web_routedef.py | 213 + .../Lib/site-packages/aiohttp/web_runner.py | 381 + .../Lib/site-packages/aiohttp/web_server.py | 62 + .../aiohttp/web_urldispatcher.py | 1220 + sbsheriff/Lib/site-packages/aiohttp/web_ws.py | 487 + sbsheriff/Lib/site-packages/aiohttp/worker.py | 269 + .../aiosignal-1.2.0.dist-info/INSTALLER | 1 + .../aiosignal-1.2.0.dist-info/LICENSE | 201 + .../aiosignal-1.2.0.dist-info/METADATA | 208 + .../aiosignal-1.2.0.dist-info/RECORD | 10 + .../aiosignal-1.2.0.dist-info/WHEEL | 5 + .../aiosignal-1.2.0.dist-info/top_level.txt | 1 + .../Lib/site-packages/aiosignal/__init__.py | 36 + .../Lib/site-packages/aiosignal/__init__.pyi | 12 + .../__pycache__/__init__.cpython-310.pyc | Bin 0 -> 1344 bytes .../Lib/site-packages/aiosignal/py.typed | 0 .../async_timeout-4.0.2.dist-info/INSTALLER | 1 + .../async_timeout-4.0.2.dist-info/LICENSE | 13 + .../async_timeout-4.0.2.dist-info/METADATA | 133 + .../async_timeout-4.0.2.dist-info/RECORD | 10 + .../async_timeout-4.0.2.dist-info/WHEEL | 5 + .../top_level.txt | 1 + .../async_timeout-4.0.2.dist-info/zip-safe | 1 + .../site-packages/async_timeout/__init__.py | 247 + .../__pycache__/__init__.cpython-310.pyc | Bin 0 -> 6895 bytes .../Lib/site-packages/async_timeout/py.typed | 1 + sbsheriff/Lib/site-packages/attr/__init__.py | 79 + sbsheriff/Lib/site-packages/attr/__init__.pyi | 486 + .../attr/__pycache__/__init__.cpython-310.pyc | Bin 0 -> 1625 bytes .../attr/__pycache__/_cmp.cpython-310.pyc | Bin 0 -> 3788 bytes .../attr/__pycache__/_compat.cpython-310.pyc | Bin 0 -> 4071 bytes .../attr/__pycache__/_config.cpython-310.pyc | Bin 0 -> 997 bytes .../attr/__pycache__/_funcs.cpython-310.pyc | Bin 0 -> 10180 bytes .../attr/__pycache__/_make.cpython-310.pyc | Bin 0 -> 72344 bytes .../__pycache__/_next_gen.cpython-310.pyc | Bin 0 -> 5090 bytes .../__pycache__/_version_info.cpython-310.pyc | Bin 0 -> 2323 bytes .../__pycache__/converters.cpython-310.pyc | Bin 0 -> 3534 bytes .../__pycache__/exceptions.cpython-310.pyc | Bin 0 -> 3047 bytes .../attr/__pycache__/filters.cpython-310.pyc | Bin 0 -> 1556 bytes .../attr/__pycache__/setters.cpython-310.pyc | Bin 0 -> 1516 bytes .../__pycache__/validators.cpython-310.pyc | Bin 0 -> 16525 bytes sbsheriff/Lib/site-packages/attr/_cmp.py | 155 + sbsheriff/Lib/site-packages/attr/_cmp.pyi | 13 + sbsheriff/Lib/site-packages/attr/_compat.py | 185 + sbsheriff/Lib/site-packages/attr/_config.py | 31 + sbsheriff/Lib/site-packages/attr/_funcs.py | 420 + sbsheriff/Lib/site-packages/attr/_make.py | 3006 ++ sbsheriff/Lib/site-packages/attr/_next_gen.py | 220 + .../Lib/site-packages/attr/_version_info.py | 86 + .../Lib/site-packages/attr/_version_info.pyi | 9 + .../Lib/site-packages/attr/converters.py | 144 + .../Lib/site-packages/attr/converters.pyi | 13 + .../Lib/site-packages/attr/exceptions.py | 92 + .../Lib/site-packages/attr/exceptions.pyi | 17 + sbsheriff/Lib/site-packages/attr/filters.py | 51 + sbsheriff/Lib/site-packages/attr/filters.pyi | 6 + sbsheriff/Lib/site-packages/attr/py.typed | 0 sbsheriff/Lib/site-packages/attr/setters.py | 73 + sbsheriff/Lib/site-packages/attr/setters.pyi | 19 + .../Lib/site-packages/attr/validators.py | 594 + .../Lib/site-packages/attr/validators.pyi | 80 + .../attrs-22.1.0.dist-info/AUTHORS.rst | 11 + .../attrs-22.1.0.dist-info/INSTALLER | 1 + .../attrs-22.1.0.dist-info/LICENSE | 21 + .../attrs-22.1.0.dist-info/METADATA | 240 + .../attrs-22.1.0.dist-info/RECORD | 56 + .../attrs-22.1.0.dist-info/WHEEL | 6 + .../attrs-22.1.0.dist-info/top_level.txt | 2 + sbsheriff/Lib/site-packages/attrs/__init__.py | 70 + .../Lib/site-packages/attrs/__init__.pyi | 66 + .../__pycache__/__init__.cpython-310.pyc | Bin 0 -> 1075 bytes .../__pycache__/converters.cpython-310.pyc | Bin 0 -> 212 bytes .../__pycache__/exceptions.cpython-310.pyc | Bin 0 -> 212 bytes .../attrs/__pycache__/filters.cpython-310.pyc | Bin 0 -> 206 bytes .../attrs/__pycache__/setters.cpython-310.pyc | Bin 0 -> 206 bytes .../__pycache__/validators.cpython-310.pyc | Bin 0 -> 212 bytes .../Lib/site-packages/attrs/converters.py | 3 + .../Lib/site-packages/attrs/exceptions.py | 3 + sbsheriff/Lib/site-packages/attrs/filters.py | 3 + sbsheriff/Lib/site-packages/attrs/py.typed | 0 sbsheriff/Lib/site-packages/attrs/setters.py | 3 + .../Lib/site-packages/attrs/validators.py | 3 + .../INSTALLER | 1 + .../LICENSE | 21 + .../METADATA | 269 + .../charset_normalizer-2.1.1.dist-info/RECORD | 33 + .../charset_normalizer-2.1.1.dist-info/WHEEL | 5 + .../entry_points.txt | 2 + .../top_level.txt | 1 + .../charset_normalizer/__init__.py | 56 + .../__pycache__/__init__.cpython-310.pyc | Bin 0 -> 1727 bytes .../__pycache__/api.cpython-310.pyc | Bin 0 -> 11063 bytes .../__pycache__/cd.cpython-310.pyc | Bin 0 -> 8628 bytes .../__pycache__/constant.cpython-310.pyc | Bin 0 -> 17451 bytes .../__pycache__/legacy.cpython-310.pyc | Bin 0 -> 2907 bytes .../__pycache__/md.cpython-310.pyc | Bin 0 -> 13967 bytes .../__pycache__/models.cpython-310.pyc | Bin 0 -> 13266 bytes .../__pycache__/utils.cpython-310.pyc | Bin 0 -> 8915 bytes .../__pycache__/version.cpython-310.pyc | Bin 0 -> 275 bytes .../site-packages/charset_normalizer/api.py | 584 + .../charset_normalizer/assets/__init__.py | 1122 + .../__pycache__/__init__.cpython-310.pyc | Bin 0 -> 7742 bytes .../site-packages/charset_normalizer/cd.py | 339 + .../charset_normalizer/cli/__init__.py | 0 .../cli/__pycache__/__init__.cpython-310.pyc | Bin 0 -> 195 bytes .../__pycache__/normalizer.cpython-310.pyc | Bin 0 -> 6285 bytes .../charset_normalizer/cli/normalizer.py | 295 + .../charset_normalizer/constant.py | 497 + .../charset_normalizer/legacy.py | 95 + .../site-packages/charset_normalizer/md.py | 553 + .../charset_normalizer/models.py | 401 + .../site-packages/charset_normalizer/py.typed | 0 .../site-packages/charset_normalizer/utils.py | 424 + .../charset_normalizer/version.py | 6 + .../disnake-2.5.2.dist-info/INSTALLER | 1 + .../disnake-2.5.2.dist-info/LICENSE | 22 + .../disnake-2.5.2.dist-info/METADATA | 156 + .../disnake-2.5.2.dist-info/RECORD | 256 + .../disnake-2.5.2.dist-info/REQUESTED | 0 .../disnake-2.5.2.dist-info/WHEEL | 5 + .../disnake-2.5.2.dist-info/top_level.txt | 1 + .../Lib/site-packages/disnake/__init__.py | 82 + .../Lib/site-packages/disnake/__main__.py | 341 + .../__pycache__/__init__.cpython-310.pyc | Bin 0 -> 2200 bytes .../__pycache__/__main__.cpython-310.pyc | Bin 0 -> 9233 bytes .../disnake/__pycache__/abc.cpython-310.pyc | Bin 0 -> 54242 bytes .../__pycache__/activity.cpython-310.pyc | Bin 0 -> 25816 bytes .../__pycache__/app_commands.cpython-310.pyc | Bin 0 -> 28623 bytes .../__pycache__/appinfo.cpython-310.pyc | Bin 0 -> 11151 bytes .../disnake/__pycache__/asset.cpython-310.pyc | Bin 0 -> 14670 bytes .../__pycache__/audit_logs.cpython-310.pyc | Bin 0 -> 21393 bytes .../__pycache__/backoff.cpython-310.pyc | Bin 0 -> 4262 bytes .../disnake/__pycache__/bans.cpython-310.pyc | Bin 0 -> 1717 bytes .../__pycache__/channel.cpython-310.pyc | Bin 0 -> 99832 bytes .../__pycache__/client.cpython-310.pyc | Bin 0 -> 81792 bytes .../__pycache__/colour.cpython-310.pyc | Bin 0 -> 12567 bytes .../__pycache__/components.cpython-310.pyc | Bin 0 -> 14187 bytes .../context_managers.cpython-310.pyc | Bin 0 -> 3612 bytes .../custom_warnings.cpython-310.pyc | Bin 0 -> 1140 bytes .../__pycache__/embeds.cpython-310.pyc | Bin 0 -> 22633 bytes .../disnake/__pycache__/emoji.cpython-310.pyc | Bin 0 -> 9739 bytes .../disnake/__pycache__/enums.cpython-310.pyc | Bin 0 -> 22474 bytes .../__pycache__/errors.cpython-310.pyc | Bin 0 -> 13338 bytes .../disnake/__pycache__/file.cpython-310.pyc | Bin 0 -> 4239 bytes .../disnake/__pycache__/flags.cpython-310.pyc | Bin 0 -> 44156 bytes .../__pycache__/gateway.cpython-310.pyc | Bin 0 -> 32857 bytes .../disnake/__pycache__/guild.cpython-310.pyc | Bin 0 -> 130029 bytes .../__pycache__/guild_preview.cpython-310.pyc | Bin 0 -> 5023 bytes .../guild_scheduled_event.cpython-310.pyc | Bin 0 -> 15514 bytes .../disnake/__pycache__/http.cpython-310.pyc | Bin 0 -> 64112 bytes .../disnake/__pycache__/i18n.cpython-310.pyc | Bin 0 -> 13398 bytes .../__pycache__/integrations.cpython-310.pyc | Bin 0 -> 12987 bytes .../__pycache__/invite.cpython-310.pyc | Bin 0 -> 18671 bytes .../__pycache__/iterators.cpython-310.pyc | Bin 0 -> 29885 bytes .../__pycache__/member.cpython-310.pyc | Bin 0 -> 36516 bytes .../__pycache__/mentions.cpython-310.pyc | Bin 0 -> 5970 bytes .../__pycache__/message.cpython-310.pyc | Bin 0 -> 74881 bytes .../__pycache__/mixins.cpython-310.pyc | Bin 0 -> 2248 bytes .../__pycache__/object.cpython-310.pyc | Bin 0 -> 3535 bytes .../__pycache__/oggparse.cpython-310.pyc | Bin 0 -> 4132 bytes .../disnake/__pycache__/opus.cpython-310.pyc | Bin 0 -> 15444 bytes .../__pycache__/partial_emoji.cpython-310.pyc | Bin 0 -> 9046 bytes .../__pycache__/permissions.cpython-310.pyc | Bin 0 -> 31186 bytes .../__pycache__/player.cpython-310.pyc | Bin 0 -> 26296 bytes .../__pycache__/raw_models.cpython-310.pyc | Bin 0 -> 14270 bytes .../__pycache__/reaction.cpython-310.pyc | Bin 0 -> 7973 bytes .../disnake/__pycache__/role.cpython-310.pyc | Bin 0 -> 16460 bytes .../disnake/__pycache__/shard.cpython-310.pyc | Bin 0 -> 19926 bytes .../stage_instance.cpython-310.pyc | Bin 0 -> 7994 bytes .../disnake/__pycache__/state.cpython-310.pyc | Bin 0 -> 65747 bytes .../__pycache__/sticker.cpython-310.pyc | Bin 0 -> 17571 bytes .../disnake/__pycache__/team.cpython-310.pyc | Bin 0 -> 5492 bytes .../__pycache__/template.cpython-310.pyc | Bin 0 -> 10845 bytes .../__pycache__/threads.cpython-310.pyc | Bin 0 -> 30529 bytes .../disnake/__pycache__/user.cpython-310.pyc | Bin 0 -> 17563 bytes .../disnake/__pycache__/utils.cpython-310.pyc | Bin 0 -> 41723 bytes .../__pycache__/voice_client.cpython-310.pyc | Bin 0 -> 22652 bytes .../__pycache__/voice_region.cpython-310.pyc | Bin 0 -> 2800 bytes .../welcome_screen.cpython-310.pyc | Bin 0 -> 7308 bytes .../__pycache__/widget.cpython-310.pyc | Bin 0 -> 14893 bytes sbsheriff/Lib/site-packages/disnake/abc.py | 1807 ++ .../Lib/site-packages/disnake/activity.py | 878 + .../Lib/site-packages/disnake/app_commands.py | 997 + .../Lib/site-packages/disnake/appinfo.py | 358 + sbsheriff/Lib/site-packages/disnake/asset.py | 489 + .../Lib/site-packages/disnake/audit_logs.py | 648 + .../Lib/site-packages/disnake/backoff.py | 106 + sbsheriff/Lib/site-packages/disnake/bans.py | 35 + .../disnake/bin/libopus-0.x64.dll | Bin 0 -> 441856 bytes .../disnake/bin/libopus-0.x86.dll | Bin 0 -> 366080 bytes .../Lib/site-packages/disnake/channel.py | 3147 ++ sbsheriff/Lib/site-packages/disnake/client.py | 2504 ++ sbsheriff/Lib/site-packages/disnake/colour.py | 326 + .../Lib/site-packages/disnake/components.py | 491 + .../site-packages/disnake/context_managers.py | 91 + .../site-packages/disnake/custom_warnings.py | 48 + sbsheriff/Lib/site-packages/disnake/embeds.py | 816 + sbsheriff/Lib/site-packages/disnake/emoji.py | 264 + sbsheriff/Lib/site-packages/disnake/enums.py | 812 + sbsheriff/Lib/site-packages/disnake/errors.py | 401 + .../disnake/ext/commands/__init__.py | 24 + .../__pycache__/__init__.cpython-310.pyc | Bin 0 -> 705 bytes .../__pycache__/_types.cpython-310.pyc | Bin 0 -> 2084 bytes .../__pycache__/base_core.cpython-310.pyc | Bin 0 -> 21826 bytes .../commands/__pycache__/bot.cpython-310.pyc | Bin 0 -> 12197 bytes .../__pycache__/bot_base.cpython-310.pyc | Bin 0 -> 19671 bytes .../commands/__pycache__/cog.cpython-310.pyc | Bin 0 -> 29362 bytes .../common_bot_base.cpython-310.pyc | Bin 0 -> 20728 bytes .../__pycache__/context.cpython-310.pyc | Bin 0 -> 14368 bytes .../__pycache__/converter.cpython-310.pyc | Bin 0 -> 39181 bytes .../__pycache__/cooldowns.cpython-310.pyc | Bin 0 -> 14051 bytes .../commands/__pycache__/core.cpython-310.pyc | Bin 0 -> 68157 bytes .../ctx_menus_core.cpython-310.pyc | Bin 0 -> 11893 bytes .../custom_warnings.cpython-310.pyc | Bin 0 -> 1637 bytes .../__pycache__/errors.cpython-310.pyc | Bin 0 -> 38075 bytes .../__pycache__/flags.cpython-310.pyc | Bin 0 -> 16675 bytes .../commands/__pycache__/help.cpython-310.pyc | Bin 0 -> 45598 bytes .../interaction_bot_base.cpython-310.pyc | Bin 0 -> 39350 bytes .../__pycache__/params.cpython-310.pyc | Bin 0 -> 30811 bytes .../__pycache__/slash_core.cpython-310.pyc | Bin 0 -> 24498 bytes .../commands/__pycache__/view.cpython-310.pyc | Bin 0 -> 5033 bytes .../disnake/ext/commands/_types.py | 53 + .../disnake/ext/commands/base_core.py | 708 + .../site-packages/disnake/ext/commands/bot.py | 275 + .../disnake/ext/commands/bot_base.py | 618 + .../site-packages/disnake/ext/commands/cog.py | 909 + .../disnake/ext/commands/common_bot_base.py | 652 + .../disnake/ext/commands/context.py | 415 + .../disnake/ext/commands/converter.py | 1302 + .../disnake/ext/commands/cooldowns.py | 403 + .../disnake/ext/commands/core.py | 2333 ++ .../disnake/ext/commands/ctx_menus_core.py | 395 + .../disnake/ext/commands/custom_warnings.py | 34 + .../disnake/ext/commands/errors.py | 1159 + .../disnake/ext/commands/flags.py | 641 + .../disnake/ext/commands/help.py | 1349 + .../ext/commands/interaction_bot_base.py | 1273 + .../disnake/ext/commands/params.py | 1039 + .../disnake/ext/commands/slash_core.py | 785 + .../disnake/ext/commands/view.py | 195 + .../disnake/ext/mypy_plugin/__init__.py | 43 + .../__pycache__/__init__.cpython-310.pyc | Bin 0 -> 1676 bytes .../disnake/ext/tasks/__init__.py | 764 + .../__pycache__/__init__.cpython-310.pyc | Bin 0 -> 23996 bytes sbsheriff/Lib/site-packages/disnake/file.py | 135 + sbsheriff/Lib/site-packages/disnake/flags.py | 1235 + .../Lib/site-packages/disnake/gateway.py | 1078 + sbsheriff/Lib/site-packages/disnake/guild.py | 4074 +++ .../site-packages/disnake/guild_preview.py | 136 + .../disnake/guild_scheduled_event.py | 471 + sbsheriff/Lib/site-packages/disnake/http.py | 2528 ++ sbsheriff/Lib/site-packages/disnake/i18n.py | 448 + .../Lib/site-packages/disnake/integrations.py | 393 + .../disnake/interactions/__init__.py | 10 + .../__pycache__/__init__.cpython-310.pyc | Bin 0 -> 360 bytes .../application_command.cpython-310.pyc | Bin 0 -> 16736 bytes .../__pycache__/base.cpython-310.pyc | Bin 0 -> 49353 bytes .../__pycache__/message.cpython-310.pyc | Bin 0 -> 4896 bytes .../__pycache__/modal.cpython-310.pyc | Bin 0 -> 6359 bytes .../interactions/application_command.py | 553 + .../disnake/interactions/base.py | 1528 + .../disnake/interactions/message.py | 148 + .../disnake/interactions/modal.py | 150 + sbsheriff/Lib/site-packages/disnake/invite.py | 557 + .../Lib/site-packages/disnake/iterators.py | 981 + sbsheriff/Lib/site-packages/disnake/member.py | 1126 + .../Lib/site-packages/disnake/mentions.py | 153 + .../Lib/site-packages/disnake/message.py | 2252 ++ sbsheriff/Lib/site-packages/disnake/mixins.py | 50 + sbsheriff/Lib/site-packages/disnake/object.py | 91 + .../Lib/site-packages/disnake/oggparse.py | 124 + sbsheriff/Lib/site-packages/disnake/opus.py | 517 + .../site-packages/disnake/partial_emoji.py | 271 + .../Lib/site-packages/disnake/permissions.py | 948 + sbsheriff/Lib/site-packages/disnake/player.py | 803 + sbsheriff/Lib/site-packages/disnake/py.typed | 0 .../Lib/site-packages/disnake/raw_models.py | 402 + .../Lib/site-packages/disnake/reaction.py | 223 + sbsheriff/Lib/site-packages/disnake/role.py | 527 + sbsheriff/Lib/site-packages/disnake/shard.py | 576 + .../site-packages/disnake/stage_instance.py | 229 + sbsheriff/Lib/site-packages/disnake/state.py | 2103 ++ .../Lib/site-packages/disnake/sticker.py | 532 + sbsheriff/Lib/site-packages/disnake/team.py | 146 + .../Lib/site-packages/disnake/template.py | 323 + .../Lib/site-packages/disnake/threads.py | 930 + .../site-packages/disnake/types/__init__.py | 10 + .../__pycache__/__init__.cpython-310.pyc | Bin 0 -> 371 bytes .../__pycache__/activity.cpython-310.pyc | Bin 0 -> 4230 bytes .../types/__pycache__/appinfo.cpython-310.pyc | Bin 0 -> 3170 bytes .../__pycache__/audit_log.cpython-310.pyc | Bin 0 -> 7348 bytes .../types/__pycache__/channel.cpython-310.pyc | Bin 0 -> 6635 bytes .../__pycache__/components.cpython-310.pyc | Bin 0 -> 3703 bytes .../types/__pycache__/embed.cpython-310.pyc | Bin 0 -> 3400 bytes .../types/__pycache__/emoji.cpython-310.pyc | Bin 0 -> 2207 bytes .../types/__pycache__/gateway.cpython-310.pyc | Bin 0 -> 6932 bytes .../types/__pycache__/guild.cpython-310.pyc | Bin 0 -> 6311 bytes .../guild_scheduled_event.cpython-310.pyc | Bin 0 -> 3053 bytes .../__pycache__/integration.cpython-310.pyc | Bin 0 -> 3241 bytes .../__pycache__/interactions.cpython-310.pyc | Bin 0 -> 10012 bytes .../types/__pycache__/invite.cpython-310.pyc | Bin 0 -> 3805 bytes .../types/__pycache__/member.cpython-310.pyc | Bin 0 -> 2506 bytes .../types/__pycache__/message.cpython-310.pyc | Bin 0 -> 5285 bytes .../__pycache__/raw_models.cpython-310.pyc | Bin 0 -> 4637 bytes .../types/__pycache__/role.cpython-310.pyc | Bin 0 -> 2260 bytes .../__pycache__/snowflake.cpython-310.pyc | Bin 0 -> 1456 bytes .../types/__pycache__/sticker.cpython-310.pyc | Bin 0 -> 3376 bytes .../types/__pycache__/team.cpython-310.pyc | Bin 0 -> 2075 bytes .../__pycache__/template.cpython-310.pyc | Bin 0 -> 2202 bytes .../types/__pycache__/threads.cpython-310.pyc | Bin 0 -> 3365 bytes .../types/__pycache__/user.cpython-310.pyc | Bin 0 -> 2126 bytes .../types/__pycache__/voice.cpython-310.pyc | Bin 0 -> 3497 bytes .../types/__pycache__/webhook.cpython-310.pyc | Bin 0 -> 2970 bytes .../welcome_screen.cpython-310.pyc | Bin 0 -> 2034 bytes .../types/__pycache__/widget.cpython-310.pyc | Bin 0 -> 2770 bytes .../site-packages/disnake/types/activity.py | 115 + .../site-packages/disnake/types/appinfo.py | 81 + .../site-packages/disnake/types/audit_log.py | 301 + .../site-packages/disnake/types/channel.py | 186 + .../site-packages/disnake/types/components.py | 100 + .../Lib/site-packages/disnake/types/embed.py | 96 + .../Lib/site-packages/disnake/types/emoji.py | 48 + .../site-packages/disnake/types/gateway.py | 243 + .../Lib/site-packages/disnake/types/guild.py | 178 + .../disnake/types/guild_scheduled_event.py | 68 + .../disnake/types/integration.py | 84 + .../disnake/types/interactions.py | 300 + .../Lib/site-packages/disnake/types/invite.py | 100 + .../Lib/site-packages/disnake/types/member.py | 57 + .../site-packages/disnake/types/message.py | 143 + .../site-packages/disnake/types/raw_models.py | 124 + .../Lib/site-packages/disnake/types/role.py | 53 + .../site-packages/disnake/types/snowflake.py | 29 + .../site-packages/disnake/types/sticker.py | 92 + .../Lib/site-packages/disnake/types/team.py | 46 + .../site-packages/disnake/types/template.py | 51 + .../site-packages/disnake/types/threads.py | 83 + .../Lib/site-packages/disnake/types/user.py | 50 + .../Lib/site-packages/disnake/types/voice.py | 85 + .../site-packages/disnake/types/webhook.py | 73 + .../disnake/types/welcome_screen.py | 42 + .../Lib/site-packages/disnake/types/widget.py | 65 + .../Lib/site-packages/disnake/ui/__init__.py | 18 + .../ui/__pycache__/__init__.cpython-310.pyc | Bin 0 -> 511 bytes .../ui/__pycache__/action_row.cpython-310.pyc | Bin 0 -> 10083 bytes .../ui/__pycache__/button.cpython-310.pyc | Bin 0 -> 10479 bytes .../ui/__pycache__/item.cpython-310.pyc | Bin 0 -> 6749 bytes .../ui/__pycache__/modal.cpython-310.pyc | Bin 0 -> 9881 bytes .../ui/__pycache__/select.cpython-310.pyc | Bin 0 -> 14754 bytes .../ui/__pycache__/text_input.cpython-310.pyc | Bin 0 -> 5991 bytes .../ui/__pycache__/view.cpython-310.pyc | Bin 0 -> 19029 bytes .../site-packages/disnake/ui/action_row.py | 313 + .../Lib/site-packages/disnake/ui/button.py | 295 + .../Lib/site-packages/disnake/ui/item.py | 184 + .../Lib/site-packages/disnake/ui/modal.py | 277 + .../Lib/site-packages/disnake/ui/select.py | 372 + .../site-packages/disnake/ui/text_input.py | 174 + .../Lib/site-packages/disnake/ui/view.py | 561 + sbsheriff/Lib/site-packages/disnake/user.py | 515 + sbsheriff/Lib/site-packages/disnake/utils.py | 1327 + .../Lib/site-packages/disnake/voice_client.py | 692 + .../Lib/site-packages/disnake/voice_region.py | 73 + .../site-packages/disnake/webhook/__init__.py | 17 + .../__pycache__/__init__.cpython-310.pyc | Bin 0 -> 458 bytes .../__pycache__/async_.cpython-310.pyc | Bin 0 -> 54220 bytes .../webhook/__pycache__/sync.cpython-310.pyc | Bin 0 -> 34295 bytes .../site-packages/disnake/webhook/async_.py | 1878 ++ .../Lib/site-packages/disnake/webhook/sync.py | 1197 + .../site-packages/disnake/welcome_screen.py | 224 + sbsheriff/Lib/site-packages/disnake/widget.py | 455 + .../site-packages/distutils-precedence.pth | 1 + .../Lib/site-packages/dotenv/__init__.py | 49 + .../Lib/site-packages/dotenv/__main__.py | 6 + .../__pycache__/__init__.cpython-310.pyc | Bin 0 -> 1260 bytes .../__pycache__/__main__.cpython-310.pyc | Bin 0 -> 328 bytes .../dotenv/__pycache__/cli.cpython-310.pyc | Bin 0 -> 5198 bytes .../__pycache__/ipython.cpython-310.pyc | Bin 0 -> 1486 bytes .../dotenv/__pycache__/main.cpython-310.pyc | Bin 0 -> 10217 bytes .../dotenv/__pycache__/parser.cpython-310.pyc | Bin 0 -> 5881 bytes .../__pycache__/variables.cpython-310.pyc | Bin 0 -> 3528 bytes .../__pycache__/version.cpython-310.pyc | Bin 0 -> 200 bytes sbsheriff/Lib/site-packages/dotenv/cli.py | 174 + sbsheriff/Lib/site-packages/dotenv/ipython.py | 39 + sbsheriff/Lib/site-packages/dotenv/main.py | 378 + sbsheriff/Lib/site-packages/dotenv/parser.py | 182 + sbsheriff/Lib/site-packages/dotenv/py.typed | 1 + .../Lib/site-packages/dotenv/variables.py | 88 + sbsheriff/Lib/site-packages/dotenv/version.py | 1 + .../frozenlist-1.3.1.dist-info/INSTALLER | 1 + .../frozenlist-1.3.1.dist-info/LICENSE | 201 + .../frozenlist-1.3.1.dist-info/METADATA | 150 + .../frozenlist-1.3.1.dist-info/RECORD | 12 + .../frozenlist-1.3.1.dist-info/WHEEL | 5 + .../frozenlist-1.3.1.dist-info/top_level.txt | 1 + .../Lib/site-packages/frozenlist/__init__.py | 96 + .../Lib/site-packages/frozenlist/__init__.pyi | 47 + .../__pycache__/__init__.cpython-310.pyc | Bin 0 -> 3266 bytes .../_frozenlist.cp310-win_amd64.pyd | Bin 0 -> 52224 bytes .../site-packages/frozenlist/_frozenlist.pyx | 123 + .../Lib/site-packages/frozenlist/py.typed | 1 + .../idna-3.3.dist-info/INSTALLER | 1 + .../idna-3.3.dist-info/LICENSE.md | 29 + .../site-packages/idna-3.3.dist-info/METADATA | 236 + .../site-packages/idna-3.3.dist-info/RECORD | 23 + .../site-packages/idna-3.3.dist-info/WHEEL | 5 + .../idna-3.3.dist-info/top_level.txt | 1 + sbsheriff/Lib/site-packages/idna/__init__.py | 44 + .../idna/__pycache__/__init__.cpython-310.pyc | Bin 0 -> 836 bytes .../idna/__pycache__/codec.cpython-310.pyc | Bin 0 -> 2807 bytes .../idna/__pycache__/compat.cpython-310.pyc | Bin 0 -> 736 bytes .../idna/__pycache__/core.cpython-310.pyc | Bin 0 -> 9579 bytes .../idna/__pycache__/idnadata.cpython-310.pyc | Bin 0 -> 38214 bytes .../__pycache__/intranges.cpython-310.pyc | Bin 0 -> 1973 bytes .../__pycache__/package_data.cpython-310.pyc | Bin 0 -> 200 bytes .../__pycache__/uts46data.cpython-310.pyc | Bin 0 -> 150935 bytes sbsheriff/Lib/site-packages/idna/codec.py | 112 + sbsheriff/Lib/site-packages/idna/compat.py | 13 + sbsheriff/Lib/site-packages/idna/core.py | 397 + sbsheriff/Lib/site-packages/idna/idnadata.py | 2137 ++ sbsheriff/Lib/site-packages/idna/intranges.py | 54 + .../Lib/site-packages/idna/package_data.py | 2 + sbsheriff/Lib/site-packages/idna/py.typed | 0 sbsheriff/Lib/site-packages/idna/uts46data.py | 8512 ++++++ .../multidict-6.0.2.dist-info/INSTALLER | 1 + .../multidict-6.0.2.dist-info/LICENSE | 13 + .../multidict-6.0.2.dist-info/METADATA | 131 + .../multidict-6.0.2.dist-info/RECORD | 19 + .../multidict-6.0.2.dist-info/WHEEL | 5 + .../multidict-6.0.2.dist-info/top_level.txt | 1 + .../Lib/site-packages/multidict/__init__.py | 48 + .../Lib/site-packages/multidict/__init__.pyi | 155 + .../__pycache__/__init__.cpython-310.pyc | Bin 0 -> 865 bytes .../__pycache__/_abc.cpython-310.pyc | Bin 0 -> 1943 bytes .../__pycache__/_compat.cpython-310.pyc | Bin 0 -> 474 bytes .../_multidict_base.cpython-310.pyc | Bin 0 -> 3267 bytes .../__pycache__/_multidict_py.cpython-310.pyc | Bin 0 -> 16165 bytes sbsheriff/Lib/site-packages/multidict/_abc.py | 48 + .../Lib/site-packages/multidict/_compat.py | 14 + .../multidict/_multidict.cp310-win_amd64.pyd | Bin 0 -> 46592 bytes .../multidict/_multidict_base.py | 144 + .../site-packages/multidict/_multidict_py.py | 520 + .../Lib/site-packages/multidict/py.typed | 1 + .../pip-22.0.4.dist-info/INSTALLER | 1 + .../pip-22.0.4.dist-info/LICENSE.txt | 20 + .../pip-22.0.4.dist-info/METADATA | 92 + .../site-packages/pip-22.0.4.dist-info/RECORD | 1053 + .../pip-22.0.4.dist-info/REQUESTED | 0 .../site-packages/pip-22.0.4.dist-info/WHEEL | 5 + .../pip-22.0.4.dist-info/entry_points.txt | 5 + .../pip-22.0.4.dist-info/top_level.txt | 1 + sbsheriff/Lib/site-packages/pip/__init__.py | 13 + sbsheriff/Lib/site-packages/pip/__main__.py | 31 + .../pip/__pycache__/__init__.cpython-310.pyc | Bin 0 -> 632 bytes .../pip/__pycache__/__main__.cpython-310.pyc | Bin 0 -> 594 bytes .../site-packages/pip/_internal/__init__.py | 19 + .../__pycache__/__init__.cpython-310.pyc | Bin 0 -> 753 bytes .../__pycache__/build_env.cpython-310.pyc | Bin 0 -> 9597 bytes .../__pycache__/cache.cpython-310.pyc | Bin 0 -> 8380 bytes .../__pycache__/configuration.cpython-310.pyc | Bin 0 -> 11126 bytes .../__pycache__/exceptions.cpython-310.pyc | Bin 0 -> 23125 bytes .../__pycache__/main.cpython-310.pyc | Bin 0 -> 618 bytes .../__pycache__/pyproject.cpython-310.pyc | Bin 0 -> 3537 bytes .../self_outdated_check.cpython-310.pyc | Bin 0 -> 4577 bytes .../__pycache__/wheel_builder.cpython-310.pyc | Bin 0 -> 9139 bytes .../site-packages/pip/_internal/build_env.py | 296 + .../Lib/site-packages/pip/_internal/cache.py | 264 + .../pip/_internal/cli/__init__.py | 4 + .../cli/__pycache__/__init__.cpython-310.pyc | Bin 0 -> 273 bytes .../autocompletion.cpython-310.pyc | Bin 0 -> 5308 bytes .../__pycache__/base_command.cpython-310.pyc | Bin 0 -> 6348 bytes .../__pycache__/cmdoptions.cpython-310.pyc | Bin 0 -> 22548 bytes .../command_context.cpython-310.pyc | Bin 0 -> 1307 bytes .../cli/__pycache__/main.cpython-310.pyc | Bin 0 -> 1371 bytes .../__pycache__/main_parser.cpython-310.pyc | Bin 0 -> 2157 bytes .../cli/__pycache__/parser.cpython-310.pyc | Bin 0 -> 9944 bytes .../__pycache__/progress_bars.cpython-310.pyc | Bin 0 -> 9233 bytes .../__pycache__/req_command.cpython-310.pyc | Bin 0 -> 13534 bytes .../cli/__pycache__/spinners.cpython-310.pyc | Bin 0 -> 4947 bytes .../__pycache__/status_codes.cpython-310.pyc | Bin 0 -> 352 bytes .../pip/_internal/cli/autocompletion.py | 171 + .../pip/_internal/cli/base_command.py | 223 + .../pip/_internal/cli/cmdoptions.py | 1018 + .../pip/_internal/cli/command_context.py | 27 + .../site-packages/pip/_internal/cli/main.py | 70 + .../pip/_internal/cli/main_parser.py | 87 + .../site-packages/pip/_internal/cli/parser.py | 292 + .../pip/_internal/cli/progress_bars.py | 321 + .../pip/_internal/cli/req_command.py | 506 + .../pip/_internal/cli/spinners.py | 157 + .../pip/_internal/cli/status_codes.py | 6 + .../pip/_internal/commands/__init__.py | 127 + .../__pycache__/__init__.cpython-310.pyc | Bin 0 -> 3136 bytes .../__pycache__/cache.cpython-310.pyc | Bin 0 -> 6177 bytes .../__pycache__/check.cpython-310.pyc | Bin 0 -> 1570 bytes .../__pycache__/completion.cpython-310.pyc | Bin 0 -> 3137 bytes .../__pycache__/configuration.cpython-310.pyc | Bin 0 -> 8319 bytes .../__pycache__/debug.cpython-310.pyc | Bin 0 -> 6686 bytes .../__pycache__/download.cpython-310.pyc | Bin 0 -> 3984 bytes .../__pycache__/freeze.cpython-310.pyc | Bin 0 -> 2635 bytes .../commands/__pycache__/hash.cpython-310.pyc | Bin 0 -> 2149 bytes .../commands/__pycache__/help.cpython-310.pyc | Bin 0 -> 1310 bytes .../__pycache__/index.cpython-310.pyc | Bin 0 -> 4633 bytes .../__pycache__/install.cpython-310.pyc | Bin 0 -> 17796 bytes .../commands/__pycache__/list.cpython-310.pyc | Bin 0 -> 10260 bytes .../__pycache__/search.cpython-310.pyc | Bin 0 -> 5363 bytes .../commands/__pycache__/show.cpython-310.pyc | Bin 0 -> 6116 bytes .../__pycache__/uninstall.cpython-310.pyc | Bin 0 -> 3107 bytes .../__pycache__/wheel.cpython-310.pyc | Bin 0 -> 4839 bytes .../pip/_internal/commands/cache.py | 223 + .../pip/_internal/commands/check.py | 53 + .../pip/_internal/commands/completion.py | 96 + .../pip/_internal/commands/configuration.py | 266 + .../pip/_internal/commands/debug.py | 202 + .../pip/_internal/commands/download.py | 140 + .../pip/_internal/commands/freeze.py | 97 + .../pip/_internal/commands/hash.py | 59 + .../pip/_internal/commands/help.py | 41 + .../pip/_internal/commands/index.py | 139 + .../pip/_internal/commands/install.py | 771 + .../pip/_internal/commands/list.py | 361 + .../pip/_internal/commands/search.py | 174 + .../pip/_internal/commands/show.py | 178 + .../pip/_internal/commands/uninstall.py | 105 + .../pip/_internal/commands/wheel.py | 178 + .../pip/_internal/configuration.py | 366 + .../pip/_internal/distributions/__init__.py | 21 + .../__pycache__/__init__.cpython-310.pyc | Bin 0 -> 800 bytes .../__pycache__/base.cpython-310.pyc | Bin 0 -> 1857 bytes .../__pycache__/installed.cpython-310.pyc | Bin 0 -> 1234 bytes .../__pycache__/sdist.cpython-310.pyc | Bin 0 -> 4446 bytes .../__pycache__/wheel.cpython-310.pyc | Bin 0 -> 1601 bytes .../pip/_internal/distributions/base.py | 36 + .../pip/_internal/distributions/installed.py | 20 + .../pip/_internal/distributions/sdist.py | 127 + .../pip/_internal/distributions/wheel.py | 31 + .../site-packages/pip/_internal/exceptions.py | 658 + .../pip/_internal/index/__init__.py | 2 + .../__pycache__/__init__.cpython-310.pyc | Bin 0 -> 227 bytes .../__pycache__/collector.cpython-310.pyc | Bin 0 -> 18065 bytes .../package_finder.cpython-310.pyc | Bin 0 -> 28121 bytes .../index/__pycache__/sources.cpython-310.pyc | Bin 0 -> 7120 bytes .../pip/_internal/index/collector.py | 610 + .../pip/_internal/index/package_finder.py | 1004 + .../pip/_internal/index/sources.py | 224 + .../pip/_internal/locations/__init__.py | 520 + .../__pycache__/__init__.cpython-310.pyc | Bin 0 -> 12387 bytes .../__pycache__/_distutils.cpython-310.pyc | Bin 0 -> 4655 bytes .../__pycache__/_sysconfig.cpython-310.pyc | Bin 0 -> 6238 bytes .../__pycache__/base.cpython-310.pyc | Bin 0 -> 1537 bytes .../pip/_internal/locations/_distutils.py | 169 + .../pip/_internal/locations/_sysconfig.py | 219 + .../pip/_internal/locations/base.py | 52 + .../Lib/site-packages/pip/_internal/main.py | 12 + .../pip/_internal/metadata/__init__.py | 62 + .../__pycache__/__init__.cpython-310.pyc | Bin 0 -> 2293 bytes .../metadata/__pycache__/base.cpython-310.pyc | Bin 0 -> 20847 bytes .../__pycache__/pkg_resources.cpython-310.pyc | Bin 0 -> 9863 bytes .../pip/_internal/metadata/base.py | 546 + .../pip/_internal/metadata/pkg_resources.py | 256 + .../pip/_internal/models/__init__.py | 2 + .../__pycache__/__init__.cpython-310.pyc | Bin 0 -> 261 bytes .../__pycache__/candidate.cpython-310.pyc | Bin 0 -> 1413 bytes .../__pycache__/direct_url.cpython-310.pyc | Bin 0 -> 7290 bytes .../format_control.cpython-310.pyc | Bin 0 -> 2738 bytes .../models/__pycache__/index.cpython-310.pyc | Bin 0 -> 1230 bytes .../models/__pycache__/link.cpython-310.pyc | Bin 0 -> 10162 bytes .../models/__pycache__/scheme.cpython-310.pyc | Bin 0 -> 1029 bytes .../__pycache__/search_scope.cpython-310.pyc | Bin 0 -> 3484 bytes .../selection_prefs.cpython-310.pyc | Bin 0 -> 1691 bytes .../__pycache__/target_python.cpython-310.pyc | Bin 0 -> 3446 bytes .../models/__pycache__/wheel.cpython-310.pyc | Bin 0 -> 4337 bytes .../pip/_internal/models/candidate.py | 34 + .../pip/_internal/models/direct_url.py | 220 + .../pip/_internal/models/format_control.py | 80 + .../pip/_internal/models/index.py | 28 + .../pip/_internal/models/link.py | 288 + .../pip/_internal/models/scheme.py | 31 + .../pip/_internal/models/search_scope.py | 129 + .../pip/_internal/models/selection_prefs.py | 51 + .../pip/_internal/models/target_python.py | 110 + .../pip/_internal/models/wheel.py | 89 + .../pip/_internal/network/__init__.py | 2 + .../__pycache__/__init__.cpython-310.pyc | Bin 0 -> 249 bytes .../network/__pycache__/auth.cpython-310.pyc | Bin 0 -> 7529 bytes .../network/__pycache__/cache.cpython-310.pyc | Bin 0 -> 2930 bytes .../__pycache__/download.cpython-310.pyc | Bin 0 -> 5496 bytes .../__pycache__/lazy_wheel.cpython-310.pyc | Bin 0 -> 8404 bytes .../__pycache__/session.cpython-310.pyc | Bin 0 -> 10735 bytes .../network/__pycache__/utils.cpython-310.pyc | Bin 0 -> 1445 bytes .../__pycache__/xmlrpc.cpython-310.pyc | Bin 0 -> 2062 bytes .../pip/_internal/network/auth.py | 323 + .../pip/_internal/network/cache.py | 69 + .../pip/_internal/network/download.py | 185 + .../pip/_internal/network/lazy_wheel.py | 210 + .../pip/_internal/network/session.py | 454 + .../pip/_internal/network/utils.py | 96 + .../pip/_internal/network/xmlrpc.py | 60 + .../pip/_internal/operations/__init__.py | 0 .../__pycache__/__init__.cpython-310.pyc | Bin 0 -> 197 bytes .../__pycache__/check.cpython-310.pyc | Bin 0 -> 4010 bytes .../__pycache__/freeze.cpython-310.pyc | Bin 0 -> 6195 bytes .../__pycache__/prepare.cpython-310.pyc | Bin 0 -> 14893 bytes .../_internal/operations/build/__init__.py | 0 .../__pycache__/__init__.cpython-310.pyc | Bin 0 -> 203 bytes .../__pycache__/metadata.cpython-310.pyc | Bin 0 -> 1430 bytes .../metadata_editable.cpython-310.pyc | Bin 0 -> 1464 bytes .../metadata_legacy.cpython-310.pyc | Bin 0 -> 2375 bytes .../build/__pycache__/wheel.cpython-310.pyc | Bin 0 -> 1220 bytes .../wheel_editable.cpython-310.pyc | Bin 0 -> 1444 bytes .../__pycache__/wheel_legacy.cpython-310.pyc | Bin 0 -> 2760 bytes .../_internal/operations/build/metadata.py | 39 + .../operations/build/metadata_editable.py | 41 + .../operations/build/metadata_legacy.py | 74 + .../pip/_internal/operations/build/wheel.py | 37 + .../operations/build/wheel_editable.py | 46 + .../operations/build/wheel_legacy.py | 102 + .../pip/_internal/operations/check.py | 149 + .../pip/_internal/operations/freeze.py | 254 + .../_internal/operations/install/__init__.py | 2 + .../__pycache__/__init__.cpython-310.pyc | Bin 0 -> 261 bytes .../editable_legacy.cpython-310.pyc | Bin 0 -> 1548 bytes .../__pycache__/legacy.cpython-310.pyc | Bin 0 -> 3332 bytes .../install/__pycache__/wheel.cpython-310.pyc | Bin 0 -> 21094 bytes .../operations/install/editable_legacy.py | 47 + .../_internal/operations/install/legacy.py | 120 + .../pip/_internal/operations/install/wheel.py | 738 + .../pip/_internal/operations/prepare.py | 642 + .../site-packages/pip/_internal/pyproject.py | 168 + .../pip/_internal/req/__init__.py | 94 + .../req/__pycache__/__init__.cpython-310.pyc | Bin 0 -> 2597 bytes .../__pycache__/constructors.cpython-310.pyc | Bin 0 -> 12162 bytes .../req/__pycache__/req_file.cpython-310.pyc | Bin 0 -> 13492 bytes .../__pycache__/req_install.cpython-310.pyc | Bin 0 -> 22177 bytes .../req/__pycache__/req_set.cpython-310.pyc | Bin 0 -> 5839 bytes .../__pycache__/req_tracker.cpython-310.pyc | Bin 0 -> 4305 bytes .../__pycache__/req_uninstall.cpython-310.pyc | Bin 0 -> 18947 bytes .../pip/_internal/req/constructors.py | 490 + .../pip/_internal/req/req_file.py | 536 + .../pip/_internal/req/req_install.py | 858 + .../pip/_internal/req/req_set.py | 189 + .../pip/_internal/req/req_tracker.py | 124 + .../pip/_internal/req/req_uninstall.py | 633 + .../pip/_internal/resolution/__init__.py | 0 .../__pycache__/__init__.cpython-310.pyc | Bin 0 -> 197 bytes .../__pycache__/base.cpython-310.pyc | Bin 0 -> 1049 bytes .../pip/_internal/resolution/base.py | 20 + .../_internal/resolution/legacy/__init__.py | 0 .../__pycache__/__init__.cpython-310.pyc | Bin 0 -> 204 bytes .../__pycache__/resolver.cpython-310.pyc | Bin 0 -> 12291 bytes .../_internal/resolution/legacy/resolver.py | 467 + .../resolution/resolvelib/__init__.py | 0 .../__pycache__/__init__.cpython-310.pyc | Bin 0 -> 208 bytes .../__pycache__/base.cpython-310.pyc | Bin 0 -> 6451 bytes .../__pycache__/candidates.cpython-310.pyc | Bin 0 -> 18362 bytes .../__pycache__/factory.cpython-310.pyc | Bin 0 -> 19216 bytes .../found_candidates.cpython-310.pyc | Bin 0 -> 4868 bytes .../__pycache__/provider.cpython-310.pyc | Bin 0 -> 7710 bytes .../__pycache__/reporter.cpython-310.pyc | Bin 0 -> 3177 bytes .../__pycache__/requirements.cpython-310.pyc | Bin 0 -> 7466 bytes .../__pycache__/resolver.cpython-310.pyc | Bin 0 -> 8228 bytes .../_internal/resolution/resolvelib/base.py | 141 + .../resolution/resolvelib/candidates.py | 547 + .../resolution/resolvelib/factory.py | 739 + .../resolution/resolvelib/found_candidates.py | 155 + .../resolution/resolvelib/provider.py | 248 + .../resolution/resolvelib/reporter.py | 68 + .../resolution/resolvelib/requirements.py | 166 + .../resolution/resolvelib/resolver.py | 298 + .../pip/_internal/self_outdated_check.py | 189 + .../pip/_internal/utils/__init__.py | 0 .../__pycache__/__init__.cpython-310.pyc | Bin 0 -> 192 bytes .../utils/__pycache__/_log.cpython-310.pyc | Bin 0 -> 1520 bytes .../utils/__pycache__/appdirs.cpython-310.pyc | Bin 0 -> 1618 bytes .../utils/__pycache__/compat.cpython-310.pyc | Bin 0 -> 1508 bytes .../compatibility_tags.cpython-310.pyc | Bin 0 -> 4077 bytes .../__pycache__/datetime.cpython-310.pyc | Bin 0 -> 515 bytes .../__pycache__/deprecation.cpython-310.pyc | Bin 0 -> 3317 bytes .../direct_url_helpers.cpython-310.pyc | Bin 0 -> 2083 bytes .../distutils_args.cpython-310.pyc | Bin 0 -> 1099 bytes .../__pycache__/egg_link.cpython-310.pyc | Bin 0 -> 2148 bytes .../__pycache__/encoding.cpython-310.pyc | Bin 0 -> 1305 bytes .../__pycache__/entrypoints.cpython-310.pyc | Bin 0 -> 1302 bytes .../__pycache__/filesystem.cpython-310.pyc | Bin 0 -> 5160 bytes .../__pycache__/filetypes.cpython-310.pyc | Bin 0 -> 942 bytes .../utils/__pycache__/glibc.cpython-310.pyc | Bin 0 -> 1671 bytes .../utils/__pycache__/hashes.cpython-310.pyc | Bin 0 -> 5194 bytes .../inject_securetransport.cpython-310.pyc | Bin 0 -> 987 bytes .../utils/__pycache__/logging.cpython-310.pyc | Bin 0 -> 9633 bytes .../utils/__pycache__/misc.cpython-310.pyc | Bin 0 -> 18715 bytes .../utils/__pycache__/models.cpython-310.pyc | Bin 0 -> 1988 bytes .../__pycache__/packaging.cpython-310.pyc | Bin 0 -> 2080 bytes .../setuptools_build.cpython-310.pyc | Bin 0 -> 4595 bytes .../__pycache__/subprocess.cpython-310.pyc | Bin 0 -> 5774 bytes .../__pycache__/temp_dir.cpython-310.pyc | Bin 0 -> 7297 bytes .../__pycache__/unpacking.cpython-310.pyc | Bin 0 -> 6666 bytes .../utils/__pycache__/urls.cpython-310.pyc | Bin 0 -> 1593 bytes .../__pycache__/virtualenv.cpython-310.pyc | Bin 0 -> 3288 bytes .../utils/__pycache__/wheel.cpython-310.pyc | Bin 0 -> 4413 bytes .../site-packages/pip/_internal/utils/_log.py | 38 + .../pip/_internal/utils/appdirs.py | 52 + .../pip/_internal/utils/compat.py | 63 + .../pip/_internal/utils/compatibility_tags.py | 165 + .../pip/_internal/utils/datetime.py | 11 + .../pip/_internal/utils/deprecation.py | 120 + .../pip/_internal/utils/direct_url_helpers.py | 87 + .../pip/_internal/utils/distutils_args.py | 42 + .../pip/_internal/utils/egg_link.py | 75 + .../pip/_internal/utils/encoding.py | 36 + .../pip/_internal/utils/entrypoints.py | 27 + .../pip/_internal/utils/filesystem.py | 182 + .../pip/_internal/utils/filetypes.py | 27 + .../pip/_internal/utils/glibc.py | 88 + .../pip/_internal/utils/hashes.py | 144 + .../_internal/utils/inject_securetransport.py | 35 + .../pip/_internal/utils/logging.py | 343 + .../site-packages/pip/_internal/utils/misc.py | 629 + .../pip/_internal/utils/models.py | 39 + .../pip/_internal/utils/packaging.py | 57 + .../pip/_internal/utils/setuptools_build.py | 195 + .../pip/_internal/utils/subprocess.py | 260 + .../pip/_internal/utils/temp_dir.py | 246 + .../pip/_internal/utils/unpacking.py | 258 + .../site-packages/pip/_internal/utils/urls.py | 62 + .../pip/_internal/utils/virtualenv.py | 104 + .../pip/_internal/utils/wheel.py | 136 + .../pip/_internal/vcs/__init__.py | 15 + .../vcs/__pycache__/__init__.cpython-310.pyc | Bin 0 -> 515 bytes .../vcs/__pycache__/bazaar.cpython-310.pyc | Bin 0 -> 3342 bytes .../vcs/__pycache__/git.cpython-310.pyc | Bin 0 -> 12545 bytes .../vcs/__pycache__/mercurial.cpython-310.pyc | Bin 0 -> 5061 bytes .../__pycache__/subversion.cpython-310.pyc | Bin 0 -> 8449 bytes .../versioncontrol.cpython-310.pyc | Bin 0 -> 21144 bytes .../site-packages/pip/_internal/vcs/bazaar.py | 101 + .../site-packages/pip/_internal/vcs/git.py | 526 + .../pip/_internal/vcs/mercurial.py | 163 + .../pip/_internal/vcs/subversion.py | 324 + .../pip/_internal/vcs/versioncontrol.py | 705 + .../pip/_internal/wheel_builder.py | 377 + .../Lib/site-packages/pip/_vendor/__init__.py | 111 + .../__pycache__/__init__.cpython-310.pyc | Bin 0 -> 2915 bytes .../__pycache__/distro.cpython-310.pyc | Bin 0 -> 38233 bytes .../_vendor/__pycache__/six.cpython-310.pyc | Bin 0 -> 27586 bytes .../typing_extensions.cpython-310.pyc | Bin 0 -> 66598 bytes .../pip/_vendor/cachecontrol/__init__.py | 18 + .../__pycache__/__init__.cpython-310.pyc | Bin 0 -> 643 bytes .../__pycache__/_cmd.cpython-310.pyc | Bin 0 -> 1581 bytes .../__pycache__/adapter.cpython-310.pyc | Bin 0 -> 3157 bytes .../__pycache__/cache.cpython-310.pyc | Bin 0 -> 1847 bytes .../__pycache__/compat.cpython-310.pyc | Bin 0 -> 757 bytes .../__pycache__/controller.cpython-310.pyc | Bin 0 -> 8217 bytes .../__pycache__/filewrapper.cpython-310.pyc | Bin 0 -> 2793 bytes .../__pycache__/heuristics.cpython-310.pyc | Bin 0 -> 4717 bytes .../__pycache__/serialize.cpython-310.pyc | Bin 0 -> 4252 bytes .../__pycache__/wrapper.cpython-310.pyc | Bin 0 -> 688 bytes .../pip/_vendor/cachecontrol/_cmd.py | 61 + .../pip/_vendor/cachecontrol/adapter.py | 137 + .../pip/_vendor/cachecontrol/cache.py | 43 + .../_vendor/cachecontrol/caches/__init__.py | 6 + .../__pycache__/__init__.cpython-310.pyc | Bin 0 -> 294 bytes .../__pycache__/file_cache.cpython-310.pyc | Bin 0 -> 3368 bytes .../__pycache__/redis_cache.cpython-310.pyc | Bin 0 -> 1574 bytes .../_vendor/cachecontrol/caches/file_cache.py | 150 + .../cachecontrol/caches/redis_cache.py | 37 + .../pip/_vendor/cachecontrol/compat.py | 32 + .../pip/_vendor/cachecontrol/controller.py | 415 + .../pip/_vendor/cachecontrol/filewrapper.py | 111 + .../pip/_vendor/cachecontrol/heuristics.py | 139 + .../pip/_vendor/cachecontrol/serialize.py | 186 + .../pip/_vendor/cachecontrol/wrapper.py | 33 + .../pip/_vendor/certifi/__init__.py | 3 + .../pip/_vendor/certifi/__main__.py | 12 + .../__pycache__/__init__.cpython-310.pyc | Bin 0 -> 276 bytes .../__pycache__/__main__.cpython-310.pyc | Bin 0 -> 455 bytes .../certifi/__pycache__/core.cpython-310.pyc | Bin 0 -> 1550 bytes .../pip/_vendor/certifi/cacert.pem | 4362 +++ .../site-packages/pip/_vendor/certifi/core.py | 76 + .../pip/_vendor/chardet/__init__.py | 83 + .../__pycache__/__init__.cpython-310.pyc | Bin 0 -> 1900 bytes .../__pycache__/big5freq.cpython-310.pyc | Bin 0 -> 27179 bytes .../__pycache__/big5prober.cpython-310.pyc | Bin 0 -> 1130 bytes .../chardistribution.cpython-310.pyc | Bin 0 -> 5740 bytes .../charsetgroupprober.cpython-310.pyc | Bin 0 -> 2229 bytes .../__pycache__/charsetprober.cpython-310.pyc | Bin 0 -> 3483 bytes .../codingstatemachine.cpython-310.pyc | Bin 0 -> 2902 bytes .../__pycache__/compat.cpython-310.pyc | Bin 0 -> 401 bytes .../__pycache__/cp949prober.cpython-310.pyc | Bin 0 -> 1137 bytes .../chardet/__pycache__/enums.cpython-310.pyc | Bin 0 -> 2584 bytes .../__pycache__/escprober.cpython-310.pyc | Bin 0 -> 2631 bytes .../chardet/__pycache__/escsm.cpython-310.pyc | Bin 0 -> 8378 bytes .../__pycache__/eucjpprober.cpython-310.pyc | Bin 0 -> 2435 bytes .../__pycache__/euckrfreq.cpython-310.pyc | Bin 0 -> 12063 bytes .../__pycache__/euckrprober.cpython-310.pyc | Bin 0 -> 1138 bytes .../__pycache__/euctwfreq.cpython-310.pyc | Bin 0 -> 27183 bytes .../__pycache__/euctwprober.cpython-310.pyc | Bin 0 -> 1138 bytes .../__pycache__/gb2312freq.cpython-310.pyc | Bin 0 -> 19107 bytes .../__pycache__/gb2312prober.cpython-310.pyc | Bin 0 -> 1146 bytes .../__pycache__/hebrewprober.cpython-310.pyc | Bin 0 -> 3023 bytes .../__pycache__/jisfreq.cpython-310.pyc | Bin 0 -> 22135 bytes .../__pycache__/jpcntx.cpython-310.pyc | Bin 0 -> 37642 bytes .../langbulgarianmodel.cpython-310.pyc | Bin 0 -> 47923 bytes .../langgreekmodel.cpython-310.pyc | Bin 0 -> 46113 bytes .../langhebrewmodel.cpython-310.pyc | Bin 0 -> 44562 bytes .../langhungarianmodel.cpython-310.pyc | Bin 0 -> 47883 bytes .../langrussianmodel.cpython-310.pyc | Bin 0 -> 61016 bytes .../__pycache__/langthaimodel.cpython-310.pyc | Bin 0 -> 44738 bytes .../langturkishmodel.cpython-310.pyc | Bin 0 -> 44579 bytes .../__pycache__/latin1prober.cpython-310.pyc | Bin 0 -> 4429 bytes .../mbcharsetprober.cpython-310.pyc | Bin 0 -> 2250 bytes .../mbcsgroupprober.cpython-310.pyc | Bin 0 -> 1133 bytes .../__pycache__/mbcssm.cpython-310.pyc | Bin 0 -> 18760 bytes .../sbcharsetprober.cpython-310.pyc | Bin 0 -> 3079 bytes .../sbcsgroupprober.cpython-310.pyc | Bin 0 -> 1702 bytes .../__pycache__/sjisprober.cpython-310.pyc | Bin 0 -> 2473 bytes .../universaldetector.cpython-310.pyc | Bin 0 -> 5825 bytes .../__pycache__/utf8prober.cpython-310.pyc | Bin 0 -> 1982 bytes .../__pycache__/version.cpython-310.pyc | Bin 0 -> 439 bytes .../pip/_vendor/chardet/big5freq.py | 386 + .../pip/_vendor/chardet/big5prober.py | 47 + .../pip/_vendor/chardet/chardistribution.py | 233 + .../pip/_vendor/chardet/charsetgroupprober.py | 107 + .../pip/_vendor/chardet/charsetprober.py | 145 + .../pip/_vendor/chardet/cli/__init__.py | 1 + .../cli/__pycache__/__init__.cpython-310.pyc | Bin 0 -> 196 bytes .../__pycache__/chardetect.cpython-310.pyc | Bin 0 -> 2695 bytes .../pip/_vendor/chardet/cli/chardetect.py | 84 + .../pip/_vendor/chardet/codingstatemachine.py | 88 + .../pip/_vendor/chardet/compat.py | 36 + .../pip/_vendor/chardet/cp949prober.py | 49 + .../pip/_vendor/chardet/enums.py | 76 + .../pip/_vendor/chardet/escprober.py | 101 + .../pip/_vendor/chardet/escsm.py | 246 + .../pip/_vendor/chardet/eucjpprober.py | 92 + .../pip/_vendor/chardet/euckrfreq.py | 195 + .../pip/_vendor/chardet/euckrprober.py | 47 + .../pip/_vendor/chardet/euctwfreq.py | 387 + .../pip/_vendor/chardet/euctwprober.py | 46 + .../pip/_vendor/chardet/gb2312freq.py | 283 + .../pip/_vendor/chardet/gb2312prober.py | 46 + .../pip/_vendor/chardet/hebrewprober.py | 292 + .../pip/_vendor/chardet/jisfreq.py | 325 + .../pip/_vendor/chardet/jpcntx.py | 233 + .../pip/_vendor/chardet/langbulgarianmodel.py | 4650 +++ .../pip/_vendor/chardet/langgreekmodel.py | 4398 +++ .../pip/_vendor/chardet/langhebrewmodel.py | 4383 +++ .../pip/_vendor/chardet/langhungarianmodel.py | 4650 +++ .../pip/_vendor/chardet/langrussianmodel.py | 5718 ++++ .../pip/_vendor/chardet/langthaimodel.py | 4383 +++ .../pip/_vendor/chardet/langturkishmodel.py | 4383 +++ .../pip/_vendor/chardet/latin1prober.py | 145 + .../pip/_vendor/chardet/mbcharsetprober.py | 91 + .../pip/_vendor/chardet/mbcsgroupprober.py | 54 + .../pip/_vendor/chardet/mbcssm.py | 572 + .../pip/_vendor/chardet/metadata/__init__.py | 0 .../__pycache__/__init__.cpython-310.pyc | Bin 0 -> 201 bytes .../__pycache__/languages.cpython-310.pyc | Bin 0 -> 7963 bytes .../pip/_vendor/chardet/metadata/languages.py | 310 + .../pip/_vendor/chardet/sbcharsetprober.py | 145 + .../pip/_vendor/chardet/sbcsgroupprober.py | 83 + .../pip/_vendor/chardet/sjisprober.py | 92 + .../pip/_vendor/chardet/universaldetector.py | 286 + .../pip/_vendor/chardet/utf8prober.py | 82 + .../pip/_vendor/chardet/version.py | 9 + .../pip/_vendor/colorama/__init__.py | 6 + .../__pycache__/__init__.cpython-310.pyc | Bin 0 -> 444 bytes .../colorama/__pycache__/ansi.cpython-310.pyc | Bin 0 -> 3005 bytes .../__pycache__/ansitowin32.cpython-310.pyc | Bin 0 -> 7903 bytes .../__pycache__/initialise.cpython-310.pyc | Bin 0 -> 1691 bytes .../__pycache__/win32.cpython-310.pyc | Bin 0 -> 3951 bytes .../__pycache__/winterm.cpython-310.pyc | Bin 0 -> 4568 bytes .../pip/_vendor/colorama/ansi.py | 102 + .../pip/_vendor/colorama/ansitowin32.py | 258 + .../pip/_vendor/colorama/initialise.py | 80 + .../pip/_vendor/colorama/win32.py | 152 + .../pip/_vendor/colorama/winterm.py | 169 + .../pip/_vendor/distlib/__init__.py | 23 + .../__pycache__/__init__.cpython-310.pyc | Bin 0 -> 1063 bytes .../__pycache__/compat.cpython-310.pyc | Bin 0 -> 31537 bytes .../__pycache__/database.cpython-310.pyc | Bin 0 -> 42617 bytes .../distlib/__pycache__/index.cpython-310.pyc | Bin 0 -> 17318 bytes .../__pycache__/locators.cpython-310.pyc | Bin 0 -> 38384 bytes .../__pycache__/manifest.cpython-310.pyc | Bin 0 -> 10231 bytes .../__pycache__/markers.cpython-310.pyc | Bin 0 -> 4955 bytes .../__pycache__/metadata.cpython-310.pyc | Bin 0 -> 26563 bytes .../__pycache__/resources.cpython-310.pyc | Bin 0 -> 11037 bytes .../__pycache__/scripts.cpython-310.pyc | Bin 0 -> 11255 bytes .../distlib/__pycache__/util.cpython-310.pyc | Bin 0 -> 52575 bytes .../__pycache__/version.cpython-310.pyc | Bin 0 -> 20152 bytes .../distlib/__pycache__/wheel.cpython-310.pyc | Bin 0 -> 27310 bytes .../pip/_vendor/distlib/_backport/__init__.py | 6 + .../__pycache__/__init__.cpython-310.pyc | Bin 0 -> 484 bytes .../__pycache__/misc.cpython-310.pyc | Bin 0 -> 1106 bytes .../__pycache__/shutil.cpython-310.pyc | Bin 0 -> 21543 bytes .../__pycache__/sysconfig.cpython-310.pyc | Bin 0 -> 15898 bytes .../__pycache__/tarfile.cpython-310.pyc | Bin 0 -> 62481 bytes .../pip/_vendor/distlib/_backport/misc.py | 41 + .../pip/_vendor/distlib/_backport/shutil.py | 764 + .../_vendor/distlib/_backport/sysconfig.cfg | 84 + .../_vendor/distlib/_backport/sysconfig.py | 786 + .../pip/_vendor/distlib/_backport/tarfile.py | 2607 ++ .../pip/_vendor/distlib/compat.py | 1122 + .../pip/_vendor/distlib/database.py | 1339 + .../pip/_vendor/distlib/index.py | 509 + .../pip/_vendor/distlib/locators.py | 1300 + .../pip/_vendor/distlib/manifest.py | 393 + .../pip/_vendor/distlib/markers.py | 147 + .../pip/_vendor/distlib/metadata.py | 1058 + .../pip/_vendor/distlib/resources.py | 358 + .../pip/_vendor/distlib/scripts.py | 429 + .../site-packages/pip/_vendor/distlib/t32.exe | Bin 0 -> 96768 bytes .../pip/_vendor/distlib/t64-arm.exe | Bin 0 -> 180736 bytes .../site-packages/pip/_vendor/distlib/t64.exe | Bin 0 -> 105984 bytes .../site-packages/pip/_vendor/distlib/util.py | 1969 ++ .../pip/_vendor/distlib/version.py | 739 + .../site-packages/pip/_vendor/distlib/w32.exe | Bin 0 -> 90112 bytes .../pip/_vendor/distlib/w64-arm.exe | Bin 0 -> 166400 bytes .../site-packages/pip/_vendor/distlib/w64.exe | Bin 0 -> 99840 bytes .../pip/_vendor/distlib/wheel.py | 1053 + .../Lib/site-packages/pip/_vendor/distro.py | 1386 + .../pip/_vendor/html5lib/__init__.py | 35 + .../__pycache__/__init__.cpython-310.pyc | Bin 0 -> 1303 bytes .../__pycache__/_ihatexml.cpython-310.pyc | Bin 0 -> 13860 bytes .../__pycache__/_inputstream.cpython-310.pyc | Bin 0 -> 21679 bytes .../__pycache__/_tokenizer.cpython-310.pyc | Bin 0 -> 37361 bytes .../__pycache__/_utils.cpython-310.pyc | Bin 0 -> 4797 bytes .../__pycache__/constants.cpython-310.pyc | Bin 0 -> 161262 bytes .../__pycache__/html5parser.cpython-310.pyc | Bin 0 -> 88520 bytes .../__pycache__/serializer.cpython-310.pyc | Bin 0 -> 10744 bytes .../pip/_vendor/html5lib/_ihatexml.py | 289 + .../pip/_vendor/html5lib/_inputstream.py | 918 + .../pip/_vendor/html5lib/_tokenizer.py | 1735 ++ .../pip/_vendor/html5lib/_trie/__init__.py | 5 + .../__pycache__/__init__.cpython-310.pyc | Bin 0 -> 353 bytes .../_trie/__pycache__/_base.cpython-310.pyc | Bin 0 -> 1605 bytes .../_trie/__pycache__/py.cpython-310.pyc | Bin 0 -> 2268 bytes .../pip/_vendor/html5lib/_trie/_base.py | 40 + .../pip/_vendor/html5lib/_trie/py.py | 67 + .../pip/_vendor/html5lib/_utils.py | 159 + .../pip/_vendor/html5lib/constants.py | 2946 ++ .../pip/_vendor/html5lib/filters/__init__.py | 0 .../__pycache__/__init__.cpython-310.pyc | Bin 0 -> 201 bytes .../alphabeticalattributes.cpython-310.pyc | Bin 0 -> 1331 bytes .../filters/__pycache__/base.cpython-310.pyc | Bin 0 -> 871 bytes .../inject_meta_charset.cpython-310.pyc | Bin 0 -> 1869 bytes .../filters/__pycache__/lint.cpython-310.pyc | Bin 0 -> 2577 bytes .../__pycache__/optionaltags.cpython-310.pyc | Bin 0 -> 2730 bytes .../__pycache__/sanitizer.cpython-310.pyc | Bin 0 -> 20035 bytes .../__pycache__/whitespace.cpython-310.pyc | Bin 0 -> 1377 bytes .../filters/alphabeticalattributes.py | 29 + .../pip/_vendor/html5lib/filters/base.py | 12 + .../html5lib/filters/inject_meta_charset.py | 73 + .../pip/_vendor/html5lib/filters/lint.py | 93 + .../_vendor/html5lib/filters/optionaltags.py | 207 + .../pip/_vendor/html5lib/filters/sanitizer.py | 916 + .../_vendor/html5lib/filters/whitespace.py | 38 + .../pip/_vendor/html5lib/html5parser.py | 2795 ++ .../pip/_vendor/html5lib/serializer.py | 409 + .../_vendor/html5lib/treeadapters/__init__.py | 30 + .../__pycache__/__init__.cpython-310.pyc | Bin 0 -> 942 bytes .../__pycache__/genshi.cpython-310.pyc | Bin 0 -> 1554 bytes .../__pycache__/sax.cpython-310.pyc | Bin 0 -> 1461 bytes .../_vendor/html5lib/treeadapters/genshi.py | 54 + .../pip/_vendor/html5lib/treeadapters/sax.py | 50 + .../_vendor/html5lib/treebuilders/__init__.py | 88 + .../__pycache__/__init__.cpython-310.pyc | Bin 0 -> 3333 bytes .../__pycache__/base.cpython-310.pyc | Bin 0 -> 11326 bytes .../__pycache__/dom.cpython-310.pyc | Bin 0 -> 9413 bytes .../__pycache__/etree.cpython-310.pyc | Bin 0 -> 11713 bytes .../__pycache__/etree_lxml.cpython-310.pyc | Bin 0 -> 13032 bytes .../pip/_vendor/html5lib/treebuilders/base.py | 417 + .../pip/_vendor/html5lib/treebuilders/dom.py | 239 + .../_vendor/html5lib/treebuilders/etree.py | 343 + .../html5lib/treebuilders/etree_lxml.py | 392 + .../_vendor/html5lib/treewalkers/__init__.py | 154 + .../__pycache__/__init__.cpython-310.pyc | Bin 0 -> 3983 bytes .../__pycache__/base.cpython-310.pyc | Bin 0 -> 6944 bytes .../__pycache__/dom.cpython-310.pyc | Bin 0 -> 1715 bytes .../__pycache__/etree.cpython-310.pyc | Bin 0 -> 3473 bytes .../__pycache__/etree_lxml.cpython-310.pyc | Bin 0 -> 6560 bytes .../__pycache__/genshi.cpython-310.pyc | Bin 0 -> 1921 bytes .../pip/_vendor/html5lib/treewalkers/base.py | 252 + .../pip/_vendor/html5lib/treewalkers/dom.py | 43 + .../pip/_vendor/html5lib/treewalkers/etree.py | 131 + .../html5lib/treewalkers/etree_lxml.py | 215 + .../_vendor/html5lib/treewalkers/genshi.py | 69 + .../pip/_vendor/idna/__init__.py | 44 + .../idna/__pycache__/__init__.cpython-310.pyc | Bin 0 -> 848 bytes .../idna/__pycache__/codec.cpython-310.pyc | Bin 0 -> 2819 bytes .../idna/__pycache__/compat.cpython-310.pyc | Bin 0 -> 748 bytes .../idna/__pycache__/core.cpython-310.pyc | Bin 0 -> 9591 bytes .../idna/__pycache__/idnadata.cpython-310.pyc | Bin 0 -> 38226 bytes .../__pycache__/intranges.cpython-310.pyc | Bin 0 -> 1985 bytes .../__pycache__/package_data.cpython-310.pyc | Bin 0 -> 212 bytes .../__pycache__/uts46data.cpython-310.pyc | Bin 0 -> 150947 bytes .../site-packages/pip/_vendor/idna/codec.py | 112 + .../site-packages/pip/_vendor/idna/compat.py | 13 + .../site-packages/pip/_vendor/idna/core.py | 397 + .../pip/_vendor/idna/idnadata.py | 2137 ++ .../pip/_vendor/idna/intranges.py | 54 + .../pip/_vendor/idna/package_data.py | 2 + .../pip/_vendor/idna/uts46data.py | 8512 ++++++ .../pip/_vendor/msgpack/__init__.py | 54 + .../__pycache__/__init__.cpython-310.pyc | Bin 0 -> 1428 bytes .../__pycache__/_version.cpython-310.pyc | Bin 0 -> 219 bytes .../__pycache__/exceptions.cpython-310.pyc | Bin 0 -> 1809 bytes .../msgpack/__pycache__/ext.cpython-310.pyc | Bin 0 -> 6317 bytes .../__pycache__/fallback.cpython-310.pyc | Bin 0 -> 25446 bytes .../pip/_vendor/msgpack/_version.py | 1 + .../pip/_vendor/msgpack/exceptions.py | 48 + .../site-packages/pip/_vendor/msgpack/ext.py | 193 + .../pip/_vendor/msgpack/fallback.py | 1012 + .../pip/_vendor/packaging/__about__.py | 26 + .../pip/_vendor/packaging/__init__.py | 25 + .../__pycache__/__about__.cpython-310.pyc | Bin 0 -> 591 bytes .../__pycache__/__init__.cpython-310.pyc | Bin 0 -> 447 bytes .../__pycache__/_manylinux.cpython-310.pyc | Bin 0 -> 7301 bytes .../__pycache__/_musllinux.cpython-310.pyc | Bin 0 -> 4613 bytes .../__pycache__/_structures.cpython-310.pyc | Bin 0 -> 2706 bytes .../__pycache__/markers.cpython-310.pyc | Bin 0 -> 9290 bytes .../__pycache__/requirements.cpython-310.pyc | Bin 0 -> 3976 bytes .../__pycache__/specifiers.cpython-310.pyc | Bin 0 -> 21528 bytes .../__pycache__/tags.cpython-310.pyc | Bin 0 -> 12197 bytes .../__pycache__/utils.cpython-310.pyc | Bin 0 -> 3576 bytes .../__pycache__/version.cpython-310.pyc | Bin 0 -> 12926 bytes .../pip/_vendor/packaging/_manylinux.py | 301 + .../pip/_vendor/packaging/_musllinux.py | 136 + .../pip/_vendor/packaging/_structures.py | 61 + .../pip/_vendor/packaging/markers.py | 304 + .../pip/_vendor/packaging/requirements.py | 146 + .../pip/_vendor/packaging/specifiers.py | 802 + .../pip/_vendor/packaging/tags.py | 487 + .../pip/_vendor/packaging/utils.py | 136 + .../pip/_vendor/packaging/version.py | 504 + .../pip/_vendor/pep517/__init__.py | 6 + .../__pycache__/__init__.cpython-310.pyc | Bin 0 -> 314 bytes .../pep517/__pycache__/build.cpython-310.pyc | Bin 0 -> 3597 bytes .../pep517/__pycache__/check.cpython-310.pyc | Bin 0 -> 4561 bytes .../__pycache__/colorlog.cpython-310.pyc | Bin 0 -> 2965 bytes .../pep517/__pycache__/compat.cpython-310.pyc | Bin 0 -> 1538 bytes .../__pycache__/dirtools.cpython-310.pyc | Bin 0 -> 1356 bytes .../__pycache__/envbuild.cpython-310.pyc | Bin 0 -> 4379 bytes .../pep517/__pycache__/meta.cpython-310.pyc | Bin 0 -> 2961 bytes .../__pycache__/wrappers.cpython-310.pyc | Bin 0 -> 12307 bytes .../site-packages/pip/_vendor/pep517/build.py | 127 + .../site-packages/pip/_vendor/pep517/check.py | 207 + .../pip/_vendor/pep517/colorlog.py | 115 + .../pip/_vendor/pep517/compat.py | 51 + .../pip/_vendor/pep517/dirtools.py | 44 + .../pip/_vendor/pep517/envbuild.py | 171 + .../pip/_vendor/pep517/in_process/__init__.py | 17 + .../__pycache__/__init__.cpython-310.pyc | Bin 0 -> 922 bytes .../__pycache__/_in_process.cpython-310.pyc | Bin 0 -> 10069 bytes .../_vendor/pep517/in_process/_in_process.py | 363 + .../site-packages/pip/_vendor/pep517/meta.py | 92 + .../pip/_vendor/pep517/wrappers.py | 375 + .../pip/_vendor/pkg_resources/__init__.py | 3296 +++ .../__pycache__/__init__.cpython-310.pyc | Bin 0 -> 99891 bytes .../__pycache__/py31compat.cpython-310.pyc | Bin 0 -> 661 bytes .../pip/_vendor/pkg_resources/py31compat.py | 23 + .../pip/_vendor/platformdirs/__init__.py | 331 + .../pip/_vendor/platformdirs/__main__.py | 46 + .../__pycache__/__init__.cpython-310.pyc | Bin 0 -> 10477 bytes .../__pycache__/__main__.cpython-310.pyc | Bin 0 -> 1237 bytes .../__pycache__/android.cpython-310.pyc | Bin 0 -> 4269 bytes .../__pycache__/api.cpython-310.pyc | Bin 0 -> 5203 bytes .../__pycache__/macos.cpython-310.pyc | Bin 0 -> 3191 bytes .../__pycache__/unix.cpython-310.pyc | Bin 0 -> 6892 bytes .../__pycache__/version.cpython-310.pyc | Bin 0 -> 296 bytes .../__pycache__/windows.cpython-310.pyc | Bin 0 -> 6435 bytes .../pip/_vendor/platformdirs/android.py | 119 + .../pip/_vendor/platformdirs/api.py | 156 + .../pip/_vendor/platformdirs/macos.py | 64 + .../pip/_vendor/platformdirs/unix.py | 181 + .../pip/_vendor/platformdirs/version.py | 4 + .../pip/_vendor/platformdirs/windows.py | 182 + .../pip/_vendor/progress/__init__.py | 189 + .../__pycache__/__init__.cpython-310.pyc | Bin 0 -> 5733 bytes .../progress/__pycache__/bar.cpython-310.pyc | Bin 0 -> 2696 bytes .../__pycache__/colors.cpython-310.pyc | Bin 0 -> 1489 bytes .../__pycache__/counter.cpython-310.pyc | Bin 0 -> 1560 bytes .../__pycache__/spinner.cpython-310.pyc | Bin 0 -> 1390 bytes .../site-packages/pip/_vendor/progress/bar.py | 93 + .../pip/_vendor/progress/colors.py | 79 + .../pip/_vendor/progress/counter.py | 47 + .../pip/_vendor/progress/spinner.py | 45 + .../pip/_vendor/pygments/__init__.py | 83 + .../pip/_vendor/pygments/__main__.py | 17 + .../__pycache__/__init__.cpython-310.pyc | Bin 0 -> 3001 bytes .../__pycache__/__main__.cpython-310.pyc | Bin 0 -> 589 bytes .../__pycache__/cmdline.cpython-310.pyc | Bin 0 -> 15454 bytes .../__pycache__/console.cpython-310.pyc | Bin 0 -> 1884 bytes .../__pycache__/filter.cpython-310.pyc | Bin 0 -> 2655 bytes .../__pycache__/formatter.cpython-310.pyc | Bin 0 -> 3011 bytes .../__pycache__/lexer.cpython-310.pyc | Bin 0 -> 24367 bytes .../__pycache__/modeline.cpython-310.pyc | Bin 0 -> 1193 bytes .../__pycache__/plugin.cpython-310.pyc | Bin 0 -> 2045 bytes .../__pycache__/regexopt.cpython-310.pyc | Bin 0 -> 2957 bytes .../__pycache__/scanner.cpython-310.pyc | Bin 0 -> 3558 bytes .../__pycache__/sphinxext.cpython-310.pyc | Bin 0 -> 4543 bytes .../__pycache__/style.cpython-310.pyc | Bin 0 -> 4580 bytes .../__pycache__/token.cpython-310.pyc | Bin 0 -> 4652 bytes .../__pycache__/unistring.cpython-310.pyc | Bin 0 -> 31206 bytes .../pygments/__pycache__/util.cpython-310.pyc | Bin 0 -> 9163 bytes .../pip/_vendor/pygments/cmdline.py | 663 + .../pip/_vendor/pygments/console.py | 70 + .../pip/_vendor/pygments/filter.py | 71 + .../pip/_vendor/pygments/filters/__init__.py | 937 + .../__pycache__/__init__.cpython-310.pyc | Bin 0 -> 29518 bytes .../pip/_vendor/pygments/formatter.py | 94 + .../_vendor/pygments/formatters/__init__.py | 153 + .../__pycache__/__init__.cpython-310.pyc | Bin 0 -> 4669 bytes .../__pycache__/_mapping.cpython-310.pyc | Bin 0 -> 5536 bytes .../__pycache__/bbcode.cpython-310.pyc | Bin 0 -> 3086 bytes .../__pycache__/groff.cpython-310.pyc | Bin 0 -> 4359 bytes .../__pycache__/html.cpython-310.pyc | Bin 0 -> 29072 bytes .../__pycache__/img.cpython-310.pyc | Bin 0 -> 17498 bytes .../__pycache__/irc.cpython-310.pyc | Bin 0 -> 4589 bytes .../__pycache__/latex.cpython-310.pyc | Bin 0 -> 13495 bytes .../__pycache__/other.cpython-310.pyc | Bin 0 -> 4805 bytes .../__pycache__/pangomarkup.cpython-310.pyc | Bin 0 -> 2105 bytes .../__pycache__/rtf.cpython-310.pyc | Bin 0 -> 4135 bytes .../__pycache__/svg.cpython-310.pyc | Bin 0 -> 6333 bytes .../__pycache__/terminal.cpython-310.pyc | Bin 0 -> 4000 bytes .../__pycache__/terminal256.cpython-310.pyc | Bin 0 -> 9250 bytes .../_vendor/pygments/formatters/_mapping.py | 84 + .../pip/_vendor/pygments/formatters/bbcode.py | 108 + .../pip/_vendor/pygments/formatters/groff.py | 168 + .../pip/_vendor/pygments/formatters/html.py | 983 + .../pip/_vendor/pygments/formatters/img.py | 641 + .../pip/_vendor/pygments/formatters/irc.py | 179 + .../pip/_vendor/pygments/formatters/latex.py | 511 + .../pip/_vendor/pygments/formatters/other.py | 161 + .../pygments/formatters/pangomarkup.py | 83 + .../pip/_vendor/pygments/formatters/rtf.py | 146 + .../pip/_vendor/pygments/formatters/svg.py | 188 + .../_vendor/pygments/formatters/terminal.py | 127 + .../pygments/formatters/terminal256.py | 338 + .../pip/_vendor/pygments/lexer.py | 879 + .../pip/_vendor/pygments/lexers/__init__.py | 341 + .../__pycache__/__init__.cpython-310.pyc | Bin 0 -> 9185 bytes .../__pycache__/_mapping.cpython-310.pyc | Bin 0 -> 58123 bytes .../lexers/__pycache__/python.cpython-310.pyc | Bin 0 -> 29384 bytes .../pip/_vendor/pygments/lexers/_mapping.py | 580 + .../pip/_vendor/pygments/lexers/python.py | 1188 + .../pip/_vendor/pygments/modeline.py | 43 + .../pip/_vendor/pygments/plugin.py | 69 + .../pip/_vendor/pygments/regexopt.py | 91 + .../pip/_vendor/pygments/scanner.py | 104 + .../pip/_vendor/pygments/sphinxext.py | 155 + .../pip/_vendor/pygments/style.py | 197 + .../pip/_vendor/pygments/styles/__init__.py | 93 + .../__pycache__/__init__.cpython-310.pyc | Bin 0 -> 3221 bytes .../pip/_vendor/pygments/token.py | 212 + .../pip/_vendor/pygments/unistring.py | 153 + .../pip/_vendor/pygments/util.py | 308 + .../pip/_vendor/pyparsing/__init__.py | 328 + .../__pycache__/__init__.cpython-310.pyc | Bin 0 -> 7126 bytes .../__pycache__/actions.cpython-310.pyc | Bin 0 -> 7183 bytes .../__pycache__/common.cpython-310.pyc | Bin 0 -> 10106 bytes .../__pycache__/core.cpython-310.pyc | Bin 0 -> 175300 bytes .../__pycache__/exceptions.cpython-310.pyc | Bin 0 -> 9073 bytes .../__pycache__/helpers.cpython-310.pyc | Bin 0 -> 34768 bytes .../__pycache__/results.cpython-310.pyc | Bin 0 -> 24786 bytes .../__pycache__/testing.cpython-310.pyc | Bin 0 -> 12103 bytes .../__pycache__/unicode.cpython-310.pyc | Bin 0 -> 9815 bytes .../__pycache__/util.cpython-310.pyc | Bin 0 -> 8606 bytes .../pip/_vendor/pyparsing/actions.py | 207 + .../pip/_vendor/pyparsing/common.py | 424 + .../pip/_vendor/pyparsing/core.py | 5789 ++++ .../pip/_vendor/pyparsing/diagram/__init__.py | 593 + .../__pycache__/__init__.cpython-310.pyc | Bin 0 -> 15658 bytes .../pip/_vendor/pyparsing/exceptions.py | 267 + .../pip/_vendor/pyparsing/helpers.py | 1069 + .../pip/_vendor/pyparsing/results.py | 760 + .../pip/_vendor/pyparsing/testing.py | 331 + .../pip/_vendor/pyparsing/unicode.py | 332 + .../pip/_vendor/pyparsing/util.py | 235 + .../pip/_vendor/requests/__init__.py | 154 + .../__pycache__/__init__.cpython-310.pyc | Bin 0 -> 4039 bytes .../__pycache__/__version__.cpython-310.pyc | Bin 0 -> 556 bytes .../_internal_utils.cpython-310.pyc | Bin 0 -> 1308 bytes .../__pycache__/adapters.cpython-310.pyc | Bin 0 -> 17044 bytes .../requests/__pycache__/api.cpython-310.pyc | Bin 0 -> 6655 bytes .../requests/__pycache__/auth.cpython-310.pyc | Bin 0 -> 8098 bytes .../__pycache__/certs.cpython-310.pyc | Bin 0 -> 640 bytes .../__pycache__/compat.cpython-310.pyc | Bin 0 -> 1675 bytes .../__pycache__/cookies.cpython-310.pyc | Bin 0 -> 18700 bytes .../__pycache__/exceptions.cpython-310.pyc | Bin 0 -> 5249 bytes .../requests/__pycache__/help.cpython-310.pyc | Bin 0 -> 2908 bytes .../__pycache__/hooks.cpython-310.pyc | Bin 0 -> 995 bytes .../__pycache__/models.cpython-310.pyc | Bin 0 -> 24314 bytes .../__pycache__/packages.cpython-310.pyc | Bin 0 -> 509 bytes .../__pycache__/sessions.cpython-310.pyc | Bin 0 -> 19630 bytes .../__pycache__/status_codes.cpython-310.pyc | Bin 0 -> 4672 bytes .../__pycache__/structures.cpython-310.pyc | Bin 0 -> 4454 bytes .../__pycache__/utils.cpython-310.pyc | Bin 0 -> 24397 bytes .../pip/_vendor/requests/__version__.py | 14 + .../pip/_vendor/requests/_internal_utils.py | 42 + .../pip/_vendor/requests/adapters.py | 538 + .../site-packages/pip/_vendor/requests/api.py | 159 + .../pip/_vendor/requests/auth.py | 305 + .../pip/_vendor/requests/certs.py | 18 + .../pip/_vendor/requests/compat.py | 77 + .../pip/_vendor/requests/cookies.py | 549 + .../pip/_vendor/requests/exceptions.py | 133 + .../pip/_vendor/requests/help.py | 132 + .../pip/_vendor/requests/hooks.py | 34 + .../pip/_vendor/requests/models.py | 973 + .../pip/_vendor/requests/packages.py | 16 + .../pip/_vendor/requests/sessions.py | 771 + .../pip/_vendor/requests/status_codes.py | 123 + .../pip/_vendor/requests/structures.py | 105 + .../pip/_vendor/requests/utils.py | 1060 + .../pip/_vendor/resolvelib/__init__.py | 26 + .../__pycache__/__init__.cpython-310.pyc | Bin 0 -> 607 bytes .../__pycache__/providers.cpython-310.pyc | Bin 0 -> 6658 bytes .../__pycache__/reporters.cpython-310.pyc | Bin 0 -> 2578 bytes .../__pycache__/resolvers.cpython-310.pyc | Bin 0 -> 15131 bytes .../__pycache__/structs.cpython-310.pyc | Bin 0 -> 7164 bytes .../pip/_vendor/resolvelib/compat/__init__.py | 0 .../__pycache__/__init__.cpython-310.pyc | Bin 0 -> 202 bytes .../collections_abc.cpython-310.pyc | Bin 0 -> 378 bytes .../resolvelib/compat/collections_abc.py | 6 + .../pip/_vendor/resolvelib/providers.py | 133 + .../pip/_vendor/resolvelib/reporters.py | 43 + .../pip/_vendor/resolvelib/resolvers.py | 482 + .../pip/_vendor/resolvelib/structs.py | 165 + .../pip/_vendor/rich/__init__.py | 172 + .../pip/_vendor/rich/__main__.py | 280 + .../rich/__pycache__/__init__.cpython-310.pyc | Bin 0 -> 5892 bytes .../rich/__pycache__/__main__.cpython-310.pyc | Bin 0 -> 7326 bytes .../__pycache__/_cell_widths.cpython-310.pyc | Bin 0 -> 7815 bytes .../__pycache__/_emoji_codes.cpython-310.pyc | Bin 0 -> 360055 bytes .../_emoji_replace.cpython-310.pyc | Bin 0 -> 1195 bytes .../__pycache__/_extension.cpython-310.pyc | Bin 0 -> 496 bytes .../rich/__pycache__/_inspect.cpython-310.pyc | Bin 0 -> 6613 bytes .../__pycache__/_log_render.cpython-310.pyc | Bin 0 -> 2641 bytes .../rich/__pycache__/_loop.cpython-310.pyc | Bin 0 -> 1293 bytes .../__pycache__/_lru_cache.cpython-310.pyc | Bin 0 -> 1576 bytes .../__pycache__/_palettes.cpython-310.pyc | Bin 0 -> 5098 bytes .../rich/__pycache__/_pick.cpython-310.pyc | Bin 0 -> 641 bytes .../rich/__pycache__/_ratio.cpython-310.pyc | Bin 0 -> 5160 bytes .../__pycache__/_spinners.cpython-310.pyc | Bin 0 -> 15214 bytes .../rich/__pycache__/_stack.cpython-310.pyc | Bin 0 -> 839 bytes .../rich/__pycache__/_timer.cpython-310.pyc | Bin 0 -> 688 bytes .../rich/__pycache__/_windows.cpython-310.pyc | Bin 0 -> 1879 bytes .../rich/__pycache__/_wrap.cpython-310.pyc | Bin 0 -> 1517 bytes .../rich/__pycache__/abc.cpython-310.pyc | Bin 0 -> 1315 bytes .../rich/__pycache__/align.cpython-310.pyc | Bin 0 -> 7969 bytes .../rich/__pycache__/ansi.cpython-310.pyc | Bin 0 -> 6018 bytes .../rich/__pycache__/bar.cpython-310.pyc | Bin 0 -> 2984 bytes .../rich/__pycache__/box.cpython-310.pyc | Bin 0 -> 7758 bytes .../rich/__pycache__/cells.cpython-310.pyc | Bin 0 -> 3500 bytes .../rich/__pycache__/color.cpython-310.pyc | Bin 0 -> 16756 bytes .../__pycache__/color_triplet.cpython-310.pyc | Bin 0 -> 1438 bytes .../rich/__pycache__/columns.cpython-310.pyc | Bin 0 -> 6198 bytes .../rich/__pycache__/console.cpython-310.pyc | Bin 0 -> 70445 bytes .../__pycache__/constrain.cpython-310.pyc | Bin 0 -> 1755 bytes .../__pycache__/containers.cpython-310.pyc | Bin 0 -> 6487 bytes .../rich/__pycache__/control.cpython-310.pyc | Bin 0 -> 6830 bytes .../default_styles.cpython-310.pyc | Bin 0 -> 6030 bytes .../rich/__pycache__/diagnose.cpython-310.pyc | Bin 0 -> 356 bytes .../rich/__pycache__/emoji.cpython-310.pyc | Bin 0 -> 3268 bytes .../rich/__pycache__/errors.cpython-310.pyc | Bin 0 -> 1528 bytes .../__pycache__/file_proxy.cpython-310.pyc | Bin 0 -> 2265 bytes .../rich/__pycache__/filesize.cpython-310.pyc | Bin 0 -> 2617 bytes .../__pycache__/highlighter.cpython-310.pyc | Bin 0 -> 5344 bytes .../rich/__pycache__/json.cpython-310.pyc | Bin 0 -> 4748 bytes .../rich/__pycache__/jupyter.cpython-310.pyc | Bin 0 -> 3827 bytes .../rich/__pycache__/layout.cpython-310.pyc | Bin 0 -> 14679 bytes .../rich/__pycache__/live.cpython-310.pyc | Bin 0 -> 11569 bytes .../__pycache__/live_render.cpython-310.pyc | Bin 0 -> 3403 bytes .../rich/__pycache__/logging.cpython-310.pyc | Bin 0 -> 9297 bytes .../rich/__pycache__/markup.cpython-310.pyc | Bin 0 -> 5914 bytes .../rich/__pycache__/measure.cpython-310.pyc | Bin 0 -> 5059 bytes .../rich/__pycache__/padding.cpython-310.pyc | Bin 0 -> 4483 bytes .../rich/__pycache__/pager.cpython-310.pyc | Bin 0 -> 1496 bytes .../rich/__pycache__/palette.cpython-310.pyc | Bin 0 -> 3709 bytes .../rich/__pycache__/panel.cpython-310.pyc | Bin 0 -> 6392 bytes .../rich/__pycache__/pretty.cpython-310.pyc | Bin 0 -> 25110 bytes .../rich/__pycache__/progress.cpython-310.pyc | Bin 0 -> 33338 bytes .../__pycache__/progress_bar.cpython-310.pyc | Bin 0 -> 6708 bytes .../rich/__pycache__/prompt.cpython-310.pyc | Bin 0 -> 11302 bytes .../rich/__pycache__/protocol.cpython-310.pyc | Bin 0 -> 1372 bytes .../rich/__pycache__/region.cpython-310.pyc | Bin 0 -> 528 bytes .../rich/__pycache__/repr.cpython-310.pyc | Bin 0 -> 4041 bytes .../rich/__pycache__/rule.cpython-310.pyc | Bin 0 -> 3738 bytes .../rich/__pycache__/scope.cpython-310.pyc | Bin 0 -> 2989 bytes .../rich/__pycache__/screen.cpython-310.pyc | Bin 0 -> 1880 bytes .../rich/__pycache__/segment.cpython-310.pyc | Bin 0 -> 20570 bytes .../rich/__pycache__/spinner.cpython-310.pyc | Bin 0 -> 4400 bytes .../rich/__pycache__/status.cpython-310.pyc | Bin 0 -> 4594 bytes .../rich/__pycache__/style.cpython-310.pyc | Bin 0 -> 20523 bytes .../rich/__pycache__/styled.cpython-310.pyc | Bin 0 -> 1764 bytes .../rich/__pycache__/syntax.cpython-310.pyc | Bin 0 -> 19039 bytes .../rich/__pycache__/table.cpython-310.pyc | Bin 0 -> 26983 bytes .../rich/__pycache__/tabulate.cpython-310.pyc | Bin 0 -> 1757 bytes .../terminal_theme.cpython-310.pyc | Bin 0 -> 1721 bytes .../rich/__pycache__/text.cpython-310.pyc | Bin 0 -> 39297 bytes .../rich/__pycache__/theme.cpython-310.pyc | Bin 0 -> 4701 bytes .../rich/__pycache__/themes.cpython-310.pyc | Bin 0 -> 294 bytes .../__pycache__/traceback.cpython-310.pyc | Bin 0 -> 19540 bytes .../rich/__pycache__/tree.cpython-310.pyc | Bin 0 -> 7318 bytes .../pip/_vendor/rich/_cell_widths.py | 451 + .../pip/_vendor/rich/_emoji_codes.py | 3610 +++ .../pip/_vendor/rich/_emoji_replace.py | 32 + .../pip/_vendor/rich/_extension.py | 10 + .../pip/_vendor/rich/_inspect.py | 210 + .../pip/_vendor/rich/_log_render.py | 94 + .../site-packages/pip/_vendor/rich/_loop.py | 43 + .../pip/_vendor/rich/_lru_cache.py | 34 + .../pip/_vendor/rich/_palettes.py | 309 + .../site-packages/pip/_vendor/rich/_pick.py | 17 + .../site-packages/pip/_vendor/rich/_ratio.py | 160 + .../pip/_vendor/rich/_spinners.py | 848 + .../site-packages/pip/_vendor/rich/_stack.py | 16 + .../site-packages/pip/_vendor/rich/_timer.py | 19 + .../pip/_vendor/rich/_windows.py | 72 + .../site-packages/pip/_vendor/rich/_wrap.py | 55 + .../Lib/site-packages/pip/_vendor/rich/abc.py | 33 + .../site-packages/pip/_vendor/rich/align.py | 312 + .../site-packages/pip/_vendor/rich/ansi.py | 228 + .../Lib/site-packages/pip/_vendor/rich/bar.py | 94 + .../Lib/site-packages/pip/_vendor/rich/box.py | 483 + .../site-packages/pip/_vendor/rich/cells.py | 147 + .../site-packages/pip/_vendor/rich/color.py | 581 + .../pip/_vendor/rich/color_triplet.py | 38 + .../site-packages/pip/_vendor/rich/columns.py | 187 + .../site-packages/pip/_vendor/rich/console.py | 2211 ++ .../pip/_vendor/rich/constrain.py | 37 + .../pip/_vendor/rich/containers.py | 167 + .../site-packages/pip/_vendor/rich/control.py | 175 + .../pip/_vendor/rich/default_styles.py | 183 + .../pip/_vendor/rich/diagnose.py | 6 + .../site-packages/pip/_vendor/rich/emoji.py | 96 + .../site-packages/pip/_vendor/rich/errors.py | 34 + .../pip/_vendor/rich/file_proxy.py | 54 + .../pip/_vendor/rich/filesize.py | 89 + .../pip/_vendor/rich/highlighter.py | 147 + .../site-packages/pip/_vendor/rich/json.py | 140 + .../site-packages/pip/_vendor/rich/jupyter.py | 92 + .../site-packages/pip/_vendor/rich/layout.py | 444 + .../site-packages/pip/_vendor/rich/live.py | 365 + .../pip/_vendor/rich/live_render.py | 113 + .../site-packages/pip/_vendor/rich/logging.py | 268 + .../site-packages/pip/_vendor/rich/markup.py | 244 + .../site-packages/pip/_vendor/rich/measure.py | 149 + .../site-packages/pip/_vendor/rich/padding.py | 141 + .../site-packages/pip/_vendor/rich/pager.py | 34 + .../site-packages/pip/_vendor/rich/palette.py | 100 + .../site-packages/pip/_vendor/rich/panel.py | 250 + .../site-packages/pip/_vendor/rich/pretty.py | 903 + .../pip/_vendor/rich/progress.py | 1036 + .../pip/_vendor/rich/progress_bar.py | 216 + .../site-packages/pip/_vendor/rich/prompt.py | 376 + .../pip/_vendor/rich/protocol.py | 42 + .../site-packages/pip/_vendor/rich/region.py | 10 + .../site-packages/pip/_vendor/rich/repr.py | 151 + .../site-packages/pip/_vendor/rich/rule.py | 115 + .../site-packages/pip/_vendor/rich/scope.py | 86 + .../site-packages/pip/_vendor/rich/screen.py | 54 + .../site-packages/pip/_vendor/rich/segment.py | 720 + .../site-packages/pip/_vendor/rich/spinner.py | 134 + .../site-packages/pip/_vendor/rich/status.py | 132 + .../site-packages/pip/_vendor/rich/style.py | 785 + .../site-packages/pip/_vendor/rich/styled.py | 42 + .../site-packages/pip/_vendor/rich/syntax.py | 735 + .../site-packages/pip/_vendor/rich/table.py | 968 + .../pip/_vendor/rich/tabulate.py | 51 + .../pip/_vendor/rich/terminal_theme.py | 55 + .../site-packages/pip/_vendor/rich/text.py | 1282 + .../site-packages/pip/_vendor/rich/theme.py | 112 + .../site-packages/pip/_vendor/rich/themes.py | 5 + .../pip/_vendor/rich/traceback.py | 678 + .../site-packages/pip/_vendor/rich/tree.py | 249 + .../Lib/site-packages/pip/_vendor/six.py | 998 + .../pip/_vendor/tenacity/__init__.py | 517 + .../__pycache__/__init__.cpython-310.pyc | Bin 0 -> 16375 bytes .../__pycache__/_asyncio.cpython-310.pyc | Bin 0 -> 2615 bytes .../__pycache__/_utils.cpython-310.pyc | Bin 0 -> 1228 bytes .../__pycache__/after.cpython-310.pyc | Bin 0 -> 1232 bytes .../__pycache__/before.cpython-310.pyc | Bin 0 -> 1110 bytes .../__pycache__/before_sleep.cpython-310.pyc | Bin 0 -> 1412 bytes .../tenacity/__pycache__/nap.cpython-310.pyc | Bin 0 -> 1200 bytes .../__pycache__/retry.cpython-310.pyc | Bin 0 -> 8430 bytes .../tenacity/__pycache__/stop.cpython-310.pyc | Bin 0 -> 4018 bytes .../__pycache__/tornadoweb.cpython-310.pyc | Bin 0 -> 1765 bytes .../tenacity/__pycache__/wait.cpython-310.pyc | Bin 0 -> 7962 bytes .../pip/_vendor/tenacity/_asyncio.py | 92 + .../pip/_vendor/tenacity/_utils.py | 68 + .../pip/_vendor/tenacity/after.py | 46 + .../pip/_vendor/tenacity/before.py | 41 + .../pip/_vendor/tenacity/before_sleep.py | 58 + .../site-packages/pip/_vendor/tenacity/nap.py | 43 + .../pip/_vendor/tenacity/retry.py | 213 + .../pip/_vendor/tenacity/stop.py | 96 + .../pip/_vendor/tenacity/tornadoweb.py | 59 + .../pip/_vendor/tenacity/wait.py | 191 + .../pip/_vendor/tomli/__init__.py | 6 + .../__pycache__/__init__.cpython-310.pyc | Bin 0 -> 380 bytes .../tomli/__pycache__/_parser.cpython-310.pyc | Bin 0 -> 16334 bytes .../tomli/__pycache__/_re.cpython-310.pyc | Bin 0 -> 2424 bytes .../pip/_vendor/tomli/_parser.py | 703 + .../site-packages/pip/_vendor/tomli/_re.py | 83 + .../pip/_vendor/typing_extensions.py | 2296 ++ .../pip/_vendor/urllib3/__init__.py | 85 + .../__pycache__/__init__.cpython-310.pyc | Bin 0 -> 2190 bytes .../__pycache__/_collections.cpython-310.pyc | Bin 0 -> 10864 bytes .../__pycache__/_version.cpython-310.pyc | Bin 0 -> 214 bytes .../__pycache__/connection.cpython-310.pyc | Bin 0 -> 13645 bytes .../connectionpool.cpython-310.pyc | Bin 0 -> 25375 bytes .../__pycache__/exceptions.cpython-310.pyc | Bin 0 -> 10995 bytes .../__pycache__/fields.cpython-310.pyc | Bin 0 -> 8186 bytes .../__pycache__/filepost.cpython-310.pyc | Bin 0 -> 2751 bytes .../__pycache__/poolmanager.cpython-310.pyc | Bin 0 -> 15203 bytes .../__pycache__/request.cpython-310.pyc | Bin 0 -> 5627 bytes .../__pycache__/response.cpython-310.pyc | Bin 0 -> 20928 bytes .../pip/_vendor/urllib3/_collections.py | 337 + .../pip/_vendor/urllib3/_version.py | 2 + .../pip/_vendor/urllib3/connection.py | 569 + .../pip/_vendor/urllib3/connectionpool.py | 1108 + .../pip/_vendor/urllib3/contrib/__init__.py | 0 .../__pycache__/__init__.cpython-310.pyc | Bin 0 -> 200 bytes .../_appengine_environ.cpython-310.pyc | Bin 0 -> 1380 bytes .../__pycache__/appengine.cpython-310.pyc | Bin 0 -> 8196 bytes .../__pycache__/ntlmpool.cpython-310.pyc | Bin 0 -> 3635 bytes .../__pycache__/pyopenssl.cpython-310.pyc | Bin 0 -> 15539 bytes .../securetransport.cpython-310.pyc | Bin 0 -> 21942 bytes .../contrib/__pycache__/socks.cpython-310.pyc | Bin 0 -> 5602 bytes .../urllib3/contrib/_appengine_environ.py | 36 + .../contrib/_securetransport/__init__.py | 0 .../__pycache__/__init__.cpython-310.pyc | Bin 0 -> 217 bytes .../__pycache__/bindings.cpython-310.pyc | Bin 0 -> 10713 bytes .../__pycache__/low_level.cpython-310.pyc | Bin 0 -> 9100 bytes .../contrib/_securetransport/bindings.py | 519 + .../contrib/_securetransport/low_level.py | 397 + .../pip/_vendor/urllib3/contrib/appengine.py | 314 + .../pip/_vendor/urllib3/contrib/ntlmpool.py | 130 + .../pip/_vendor/urllib3/contrib/pyopenssl.py | 511 + .../urllib3/contrib/securetransport.py | 922 + .../pip/_vendor/urllib3/contrib/socks.py | 216 + .../pip/_vendor/urllib3/exceptions.py | 323 + .../pip/_vendor/urllib3/fields.py | 274 + .../pip/_vendor/urllib3/filepost.py | 98 + .../pip/_vendor/urllib3/packages/__init__.py | 0 .../__pycache__/__init__.cpython-310.pyc | Bin 0 -> 201 bytes .../packages/__pycache__/six.cpython-310.pyc | Bin 0 -> 27661 bytes .../urllib3/packages/backports/__init__.py | 0 .../__pycache__/__init__.cpython-310.pyc | Bin 0 -> 211 bytes .../__pycache__/makefile.cpython-310.pyc | Bin 0 -> 1311 bytes .../urllib3/packages/backports/makefile.py | 51 + .../pip/_vendor/urllib3/packages/six.py | 1077 + .../pip/_vendor/urllib3/poolmanager.py | 536 + .../pip/_vendor/urllib3/request.py | 170 + .../pip/_vendor/urllib3/response.py | 821 + .../pip/_vendor/urllib3/util/__init__.py | 49 + .../util/__pycache__/__init__.cpython-310.pyc | Bin 0 -> 1110 bytes .../__pycache__/connection.cpython-310.pyc | Bin 0 -> 3438 bytes .../util/__pycache__/proxy.cpython-310.pyc | Bin 0 -> 1345 bytes .../util/__pycache__/queue.cpython-310.pyc | Bin 0 -> 1065 bytes .../util/__pycache__/request.cpython-310.pyc | Bin 0 -> 3473 bytes .../util/__pycache__/response.cpython-310.pyc | Bin 0 -> 2358 bytes .../util/__pycache__/retry.cpython-310.pyc | Bin 0 -> 16143 bytes .../util/__pycache__/ssl_.cpython-310.pyc | Bin 0 -> 11312 bytes .../ssl_match_hostname.cpython-310.pyc | Bin 0 -> 3282 bytes .../__pycache__/ssltransport.cpython-310.pyc | Bin 0 -> 7400 bytes .../util/__pycache__/timeout.cpython-310.pyc | Bin 0 -> 8942 bytes .../util/__pycache__/url.cpython-310.pyc | Bin 0 -> 10685 bytes .../util/__pycache__/wait.cpython-310.pyc | Bin 0 -> 3094 bytes .../pip/_vendor/urllib3/util/connection.py | 149 + .../pip/_vendor/urllib3/util/proxy.py | 57 + .../pip/_vendor/urllib3/util/queue.py | 22 + .../pip/_vendor/urllib3/util/request.py | 143 + .../pip/_vendor/urllib3/util/response.py | 107 + .../pip/_vendor/urllib3/util/retry.py | 620 + .../pip/_vendor/urllib3/util/ssl_.py | 495 + .../urllib3/util/ssl_match_hostname.py | 161 + .../pip/_vendor/urllib3/util/ssltransport.py | 221 + .../pip/_vendor/urllib3/util/timeout.py | 268 + .../pip/_vendor/urllib3/util/url.py | 432 + .../pip/_vendor/urllib3/util/wait.py | 153 + .../Lib/site-packages/pip/_vendor/vendor.txt | 25 + .../pip/_vendor/webencodings/__init__.py | 342 + .../__pycache__/__init__.cpython-310.pyc | Bin 0 -> 9747 bytes .../__pycache__/labels.cpython-310.pyc | Bin 0 -> 5237 bytes .../__pycache__/mklabels.cpython-310.pyc | Bin 0 -> 1942 bytes .../__pycache__/tests.cpython-310.pyc | Bin 0 -> 5044 bytes .../x_user_defined.cpython-310.pyc | Bin 0 -> 2593 bytes .../pip/_vendor/webencodings/labels.py | 231 + .../pip/_vendor/webencodings/mklabels.py | 59 + .../pip/_vendor/webencodings/tests.py | 153 + .../_vendor/webencodings/x_user_defined.py | 325 + sbsheriff/Lib/site-packages/pip/py.typed | 4 + .../site-packages/pkg_resources/__init__.py | 3288 +++ .../__pycache__/__init__.cpython-310.pyc | Bin 0 -> 100043 bytes .../pkg_resources/_vendor/__init__.py | 0 .../__pycache__/__init__.cpython-310.pyc | Bin 0 -> 194 bytes .../__pycache__/appdirs.cpython-310.pyc | Bin 0 -> 20255 bytes .../__pycache__/pyparsing.cpython-310.pyc | Bin 0 -> 198810 bytes .../pkg_resources/_vendor/appdirs.py | 608 + .../_vendor/packaging/__about__.py | 27 + .../_vendor/packaging/__init__.py | 26 + .../__pycache__/__about__.cpython-310.pyc | Bin 0 -> 710 bytes .../__pycache__/__init__.cpython-310.pyc | Bin 0 -> 556 bytes .../__pycache__/_compat.cpython-310.pyc | Bin 0 -> 1156 bytes .../__pycache__/_structures.cpython-310.pyc | Bin 0 -> 2700 bytes .../__pycache__/_typing.cpython-310.pyc | Bin 0 -> 1512 bytes .../__pycache__/markers.cpython-310.pyc | Bin 0 -> 9197 bytes .../__pycache__/requirements.cpython-310.pyc | Bin 0 -> 4102 bytes .../__pycache__/specifiers.cpython-310.pyc | Bin 0 -> 20463 bytes .../__pycache__/tags.cpython-310.pyc | Bin 0 -> 17342 bytes .../__pycache__/utils.cpython-310.pyc | Bin 0 -> 1647 bytes .../__pycache__/version.cpython-310.pyc | Bin 0 -> 13027 bytes .../_vendor/packaging/_compat.py | 38 + .../_vendor/packaging/_structures.py | 86 + .../_vendor/packaging/_typing.py | 48 + .../_vendor/packaging/markers.py | 328 + .../_vendor/packaging/requirements.py | 145 + .../_vendor/packaging/specifiers.py | 863 + .../pkg_resources/_vendor/packaging/tags.py | 751 + .../pkg_resources/_vendor/packaging/utils.py | 65 + .../_vendor/packaging/version.py | 535 + .../pkg_resources/_vendor/pyparsing.py | 5742 ++++ .../pkg_resources/extern/__init__.py | 73 + .../__pycache__/__init__.cpython-310.pyc | Bin 0 -> 2902 bytes .../__pycache__/setup.cpython-310.pyc | Bin 0 -> 322 bytes .../data/my-test-package-source/setup.py | 6 + .../python_dotenv-0.21.0.dist-info/INSTALLER | 1 + .../python_dotenv-0.21.0.dist-info/LICENSE | 87 + .../python_dotenv-0.21.0.dist-info/METADATA | 632 + .../python_dotenv-0.21.0.dist-info/RECORD | 26 + .../python_dotenv-0.21.0.dist-info/REQUESTED | 0 .../python_dotenv-0.21.0.dist-info/WHEEL | 5 + .../entry_points.txt | 2 + .../top_level.txt | 1 + .../setuptools-58.1.0.dist-info/INSTALLER | 1 + .../setuptools-58.1.0.dist-info/LICENSE | 19 + .../setuptools-58.1.0.dist-info/METADATA | 119 + .../setuptools-58.1.0.dist-info/RECORD | 296 + .../setuptools-58.1.0.dist-info/REQUESTED | 0 .../setuptools-58.1.0.dist-info/WHEEL | 5 + .../entry_points.txt | 56 + .../setuptools-58.1.0.dist-info/top_level.txt | 3 + .../Lib/site-packages/setuptools/__init__.py | 242 + .../__pycache__/__init__.cpython-310.pyc | Bin 0 -> 8598 bytes .../_deprecation_warning.cpython-310.pyc | Bin 0 -> 555 bytes .../__pycache__/_imp.cpython-310.pyc | Bin 0 -> 2081 bytes .../__pycache__/archive_util.cpython-310.pyc | Bin 0 -> 5851 bytes .../__pycache__/build_meta.cpython-310.pyc | Bin 0 -> 9123 bytes .../__pycache__/config.cpython-310.pyc | Bin 0 -> 20911 bytes .../__pycache__/dep_util.cpython-310.pyc | Bin 0 -> 862 bytes .../__pycache__/depends.cpython-310.pyc | Bin 0 -> 5275 bytes .../__pycache__/dist.cpython-310.pyc | Bin 0 -> 36258 bytes .../__pycache__/errors.cpython-310.pyc | Bin 0 -> 855 bytes .../__pycache__/extension.cpython-310.pyc | Bin 0 -> 1951 bytes .../__pycache__/glob.cpython-310.pyc | Bin 0 -> 3740 bytes .../__pycache__/installer.cpython-310.pyc | Bin 0 -> 2758 bytes .../__pycache__/launch.cpython-310.pyc | Bin 0 -> 912 bytes .../__pycache__/monkey.cpython-310.pyc | Bin 0 -> 4640 bytes .../__pycache__/msvc.cpython-310.pyc | Bin 0 -> 42644 bytes .../__pycache__/namespaces.cpython-310.pyc | Bin 0 -> 3623 bytes .../__pycache__/package_index.cpython-310.pyc | Bin 0 -> 32497 bytes .../__pycache__/py34compat.cpython-310.pyc | Bin 0 -> 487 bytes .../__pycache__/sandbox.cpython-310.pyc | Bin 0 -> 15763 bytes .../__pycache__/unicode_utils.cpython-310.pyc | Bin 0 -> 1117 bytes .../__pycache__/version.cpython-310.pyc | Bin 0 -> 329 bytes .../__pycache__/wheel.cpython-310.pyc | Bin 0 -> 7355 bytes .../windows_support.cpython-310.pyc | Bin 0 -> 1030 bytes .../setuptools/_deprecation_warning.py | 7 + .../setuptools/_distutils/__init__.py | 15 + .../__pycache__/__init__.cpython-310.pyc | Bin 0 -> 461 bytes .../__pycache__/_msvccompiler.cpython-310.pyc | Bin 0 -> 13840 bytes .../__pycache__/archive_util.cpython-310.pyc | Bin 0 -> 6568 bytes .../__pycache__/bcppcompiler.cpython-310.pyc | Bin 0 -> 6555 bytes .../__pycache__/ccompiler.cpython-310.pyc | Bin 0 -> 33282 bytes .../__pycache__/cmd.cpython-310.pyc | Bin 0 -> 13955 bytes .../__pycache__/config.cpython-310.pyc | Bin 0 -> 3596 bytes .../__pycache__/core.cpython-310.pyc | Bin 0 -> 6663 bytes .../cygwinccompiler.cpython-310.pyc | Bin 0 -> 8749 bytes .../__pycache__/debug.cpython-310.pyc | Bin 0 -> 257 bytes .../__pycache__/dep_util.cpython-310.pyc | Bin 0 -> 2778 bytes .../__pycache__/dir_util.cpython-310.pyc | Bin 0 -> 5889 bytes .../__pycache__/dist.cpython-310.pyc | Bin 0 -> 34054 bytes .../__pycache__/errors.cpython-310.pyc | Bin 0 -> 4999 bytes .../__pycache__/extension.cpython-310.pyc | Bin 0 -> 7013 bytes .../__pycache__/fancy_getopt.cpython-310.pyc | Bin 0 -> 10639 bytes .../__pycache__/file_util.cpython-310.pyc | Bin 0 -> 5983 bytes .../__pycache__/filelist.cpython-310.pyc | Bin 0 -> 10829 bytes .../__pycache__/log.cpython-310.pyc | Bin 0 -> 2314 bytes .../__pycache__/msvc9compiler.cpython-310.pyc | Bin 0 -> 17569 bytes .../__pycache__/msvccompiler.cpython-310.pyc | Bin 0 -> 14788 bytes .../__pycache__/py35compat.cpython-310.pyc | Bin 0 -> 633 bytes .../__pycache__/py38compat.cpython-310.pyc | Bin 0 -> 430 bytes .../__pycache__/spawn.cpython-310.pyc | Bin 0 -> 2900 bytes .../__pycache__/sysconfig.cpython-310.pyc | Bin 0 -> 12567 bytes .../__pycache__/text_file.cpython-310.pyc | Bin 0 -> 8476 bytes .../__pycache__/unixccompiler.cpython-310.pyc | Bin 0 -> 6834 bytes .../__pycache__/util.cpython-310.pyc | Bin 0 -> 14220 bytes .../__pycache__/version.cpython-310.pyc | Bin 0 -> 7364 bytes .../versionpredicate.cpython-310.pyc | Bin 0 -> 5194 bytes .../setuptools/_distutils/_msvccompiler.py | 561 + .../setuptools/_distutils/archive_util.py | 256 + .../setuptools/_distutils/bcppcompiler.py | 393 + .../setuptools/_distutils/ccompiler.py | 1123 + .../setuptools/_distutils/cmd.py | 403 + .../setuptools/_distutils/command/__init__.py | 31 + .../__pycache__/__init__.cpython-310.pyc | Bin 0 -> 536 bytes .../command/__pycache__/bdist.cpython-310.pyc | Bin 0 -> 3670 bytes .../__pycache__/bdist_dumb.cpython-310.pyc | Bin 0 -> 3651 bytes .../__pycache__/bdist_msi.cpython-310.pyc | Bin 0 -> 19727 bytes .../__pycache__/bdist_rpm.cpython-310.pyc | Bin 0 -> 12293 bytes .../__pycache__/bdist_wininst.cpython-310.pyc | Bin 0 -> 8636 bytes .../command/__pycache__/build.cpython-310.pyc | Bin 0 -> 3898 bytes .../__pycache__/build_clib.cpython-310.pyc | Bin 0 -> 4875 bytes .../__pycache__/build_ext.cpython-310.pyc | Bin 0 -> 16272 bytes .../__pycache__/build_py.cpython-310.pyc | Bin 0 -> 9894 bytes .../__pycache__/build_scripts.cpython-310.pyc | Bin 0 -> 4017 bytes .../command/__pycache__/check.cpython-310.pyc | Bin 0 -> 5014 bytes .../command/__pycache__/clean.cpython-310.pyc | Bin 0 -> 2153 bytes .../__pycache__/config.cpython-310.pyc | Bin 0 -> 10335 bytes .../__pycache__/install.cpython-310.pyc | Bin 0 -> 13869 bytes .../__pycache__/install_data.cpython-310.pyc | Bin 0 -> 2352 bytes .../install_egg_info.cpython-310.pyc | Bin 0 -> 3093 bytes .../install_headers.cpython-310.pyc | Bin 0 -> 1775 bytes .../__pycache__/install_lib.cpython-310.pyc | Bin 0 -> 5177 bytes .../install_scripts.cpython-310.pyc | Bin 0 -> 2204 bytes .../__pycache__/py37compat.cpython-310.pyc | Bin 0 -> 1049 bytes .../__pycache__/register.cpython-310.pyc | Bin 0 -> 8688 bytes .../command/__pycache__/sdist.cpython-310.pyc | Bin 0 -> 14504 bytes .../__pycache__/upload.cpython-310.pyc | Bin 0 -> 5380 bytes .../setuptools/_distutils/command/bdist.py | 143 + .../_distutils/command/bdist_dumb.py | 123 + .../_distutils/command/bdist_msi.py | 749 + .../_distutils/command/bdist_rpm.py | 579 + .../_distutils/command/bdist_wininst.py | 377 + .../setuptools/_distutils/command/build.py | 157 + .../_distutils/command/build_clib.py | 209 + .../_distutils/command/build_ext.py | 757 + .../setuptools/_distutils/command/build_py.py | 392 + .../_distutils/command/build_scripts.py | 152 + .../setuptools/_distutils/command/check.py | 148 + .../setuptools/_distutils/command/clean.py | 76 + .../setuptools/_distutils/command/config.py | 344 + .../setuptools/_distutils/command/install.py | 678 + .../_distutils/command/install_data.py | 79 + .../_distutils/command/install_egg_info.py | 77 + .../_distutils/command/install_headers.py | 47 + .../_distutils/command/install_lib.py | 217 + .../_distutils/command/install_scripts.py | 60 + .../_distutils/command/py37compat.py | 30 + .../setuptools/_distutils/command/register.py | 304 + .../setuptools/_distutils/command/sdist.py | 494 + .../setuptools/_distutils/command/upload.py | 214 + .../setuptools/_distutils/config.py | 130 + .../setuptools/_distutils/core.py | 234 + .../setuptools/_distutils/cygwinccompiler.py | 414 + .../setuptools/_distutils/debug.py | 5 + .../setuptools/_distutils/dep_util.py | 92 + .../setuptools/_distutils/dir_util.py | 210 + .../setuptools/_distutils/dist.py | 1257 + .../setuptools/_distutils/errors.py | 97 + .../setuptools/_distutils/extension.py | 240 + .../setuptools/_distutils/fancy_getopt.py | 457 + .../setuptools/_distutils/file_util.py | 238 + .../setuptools/_distutils/filelist.py | 355 + .../setuptools/_distutils/log.py | 77 + .../setuptools/_distutils/msvc9compiler.py | 788 + .../setuptools/_distutils/msvccompiler.py | 643 + .../setuptools/_distutils/py35compat.py | 19 + .../setuptools/_distutils/py38compat.py | 7 + .../setuptools/_distutils/spawn.py | 106 + .../setuptools/_distutils/sysconfig.py | 578 + .../setuptools/_distutils/text_file.py | 286 + .../setuptools/_distutils/unixccompiler.py | 332 + .../setuptools/_distutils/util.py | 535 + .../setuptools/_distutils/version.py | 347 + .../setuptools/_distutils/versionpredicate.py | 166 + .../Lib/site-packages/setuptools/_imp.py | 82 + .../setuptools/_vendor/__init__.py | 0 .../__pycache__/__init__.cpython-310.pyc | Bin 0 -> 191 bytes .../__pycache__/ordered_set.cpython-310.pyc | Bin 0 -> 16327 bytes .../__pycache__/pyparsing.cpython-310.pyc | Bin 0 -> 198807 bytes .../_vendor/more_itertools/__init__.py | 4 + .../__pycache__/__init__.cpython-310.pyc | Bin 0 -> 272 bytes .../__pycache__/more.cpython-310.pyc | Bin 0 -> 110002 bytes .../__pycache__/recipes.cpython-310.pyc | Bin 0 -> 17972 bytes .../setuptools/_vendor/more_itertools/more.py | 3825 +++ .../_vendor/more_itertools/recipes.py | 620 + .../setuptools/_vendor/ordered_set.py | 488 + .../setuptools/_vendor/packaging/__about__.py | 27 + .../setuptools/_vendor/packaging/__init__.py | 26 + .../__pycache__/__about__.cpython-310.pyc | Bin 0 -> 707 bytes .../__pycache__/__init__.cpython-310.pyc | Bin 0 -> 553 bytes .../__pycache__/_compat.cpython-310.pyc | Bin 0 -> 1153 bytes .../__pycache__/_structures.cpython-310.pyc | Bin 0 -> 2697 bytes .../__pycache__/_typing.cpython-310.pyc | Bin 0 -> 1509 bytes .../__pycache__/markers.cpython-310.pyc | Bin 0 -> 9191 bytes .../__pycache__/requirements.cpython-310.pyc | Bin 0 -> 4096 bytes .../__pycache__/specifiers.cpython-310.pyc | Bin 0 -> 20460 bytes .../__pycache__/tags.cpython-310.pyc | Bin 0 -> 17339 bytes .../__pycache__/utils.cpython-310.pyc | Bin 0 -> 1644 bytes .../__pycache__/version.cpython-310.pyc | Bin 0 -> 13024 bytes .../setuptools/_vendor/packaging/_compat.py | 38 + .../_vendor/packaging/_structures.py | 86 + .../setuptools/_vendor/packaging/_typing.py | 48 + .../setuptools/_vendor/packaging/markers.py | 328 + .../_vendor/packaging/requirements.py | 145 + .../_vendor/packaging/specifiers.py | 863 + .../setuptools/_vendor/packaging/tags.py | 751 + .../setuptools/_vendor/packaging/utils.py | 65 + .../setuptools/_vendor/packaging/version.py | 535 + .../setuptools/_vendor/pyparsing.py | 5742 ++++ .../site-packages/setuptools/archive_util.py | 205 + .../site-packages/setuptools/build_meta.py | 281 + .../Lib/site-packages/setuptools/cli-32.exe | Bin 0 -> 65536 bytes .../Lib/site-packages/setuptools/cli-64.exe | Bin 0 -> 74752 bytes .../Lib/site-packages/setuptools/cli.exe | Bin 0 -> 65536 bytes .../setuptools/command/__init__.py | 8 + .../__pycache__/__init__.cpython-310.pyc | Bin 0 -> 380 bytes .../command/__pycache__/alias.cpython-310.pyc | Bin 0 -> 2382 bytes .../__pycache__/bdist_egg.cpython-310.pyc | Bin 0 -> 13108 bytes .../__pycache__/bdist_rpm.cpython-310.pyc | Bin 0 -> 1595 bytes .../__pycache__/build_clib.cpython-310.pyc | Bin 0 -> 2471 bytes .../__pycache__/build_ext.cpython-310.pyc | Bin 0 -> 9898 bytes .../__pycache__/build_py.cpython-310.pyc | Bin 0 -> 7875 bytes .../__pycache__/develop.cpython-310.pyc | Bin 0 -> 6158 bytes .../__pycache__/dist_info.cpython-310.pyc | Bin 0 -> 1400 bytes .../__pycache__/easy_install.cpython-310.pyc | Bin 0 -> 63732 bytes .../__pycache__/egg_info.cpython-310.pyc | Bin 0 -> 22026 bytes .../__pycache__/install.cpython-310.pyc | Bin 0 -> 4057 bytes .../install_egg_info.cpython-310.pyc | Bin 0 -> 2434 bytes .../__pycache__/install_lib.cpython-310.pyc | Bin 0 -> 4177 bytes .../install_scripts.cpython-310.pyc | Bin 0 -> 2435 bytes .../__pycache__/py36compat.cpython-310.pyc | Bin 0 -> 4542 bytes .../__pycache__/register.cpython-310.pyc | Bin 0 -> 846 bytes .../__pycache__/rotate.cpython-310.pyc | Bin 0 -> 2513 bytes .../__pycache__/saveopts.cpython-310.pyc | Bin 0 -> 932 bytes .../command/__pycache__/sdist.cpython-310.pyc | Bin 0 -> 6533 bytes .../__pycache__/setopt.cpython-310.pyc | Bin 0 -> 4694 bytes .../command/__pycache__/test.cpython-310.pyc | Bin 0 -> 8138 bytes .../__pycache__/upload.cpython-310.pyc | Bin 0 -> 819 bytes .../__pycache__/upload_docs.cpython-310.pyc | Bin 0 -> 6188 bytes .../site-packages/setuptools/command/alias.py | 78 + .../setuptools/command/bdist_egg.py | 456 + .../setuptools/command/bdist_rpm.py | 40 + .../setuptools/command/build_clib.py | 101 + .../setuptools/command/build_ext.py | 328 + .../setuptools/command/build_py.py | 232 + .../setuptools/command/develop.py | 193 + .../setuptools/command/dist_info.py | 36 + .../setuptools/command/easy_install.py | 2290 ++ .../setuptools/command/egg_info.py | 734 + .../setuptools/command/install.py | 125 + .../setuptools/command/install_egg_info.py | 62 + .../setuptools/command/install_lib.py | 122 + .../setuptools/command/install_scripts.py | 69 + .../setuptools/command/launcher manifest.xml | 15 + .../setuptools/command/py36compat.py | 134 + .../setuptools/command/register.py | 18 + .../setuptools/command/rotate.py | 64 + .../setuptools/command/saveopts.py | 22 + .../site-packages/setuptools/command/sdist.py | 189 + .../setuptools/command/setopt.py | 149 + .../site-packages/setuptools/command/test.py | 252 + .../setuptools/command/upload.py | 17 + .../setuptools/command/upload_docs.py | 202 + .../Lib/site-packages/setuptools/config.py | 749 + .../Lib/site-packages/setuptools/dep_util.py | 25 + .../Lib/site-packages/setuptools/depends.py | 175 + .../Lib/site-packages/setuptools/dist.py | 1150 + .../Lib/site-packages/setuptools/errors.py | 16 + .../Lib/site-packages/setuptools/extension.py | 55 + .../setuptools/extern/__init__.py | 73 + .../__pycache__/__init__.cpython-310.pyc | Bin 0 -> 2941 bytes .../Lib/site-packages/setuptools/glob.py | 167 + .../Lib/site-packages/setuptools/gui-32.exe | Bin 0 -> 65536 bytes .../Lib/site-packages/setuptools/gui-64.exe | Bin 0 -> 75264 bytes .../Lib/site-packages/setuptools/gui.exe | Bin 0 -> 65536 bytes .../Lib/site-packages/setuptools/installer.py | 97 + .../Lib/site-packages/setuptools/launch.py | 36 + .../Lib/site-packages/setuptools/monkey.py | 177 + .../Lib/site-packages/setuptools/msvc.py | 1805 ++ .../site-packages/setuptools/namespaces.py | 107 + .../site-packages/setuptools/package_index.py | 1119 + .../site-packages/setuptools/py34compat.py | 13 + .../Lib/site-packages/setuptools/sandbox.py | 530 + .../setuptools/script (dev).tmpl | 6 + .../Lib/site-packages/setuptools/script.tmpl | 3 + .../site-packages/setuptools/unicode_utils.py | 42 + .../Lib/site-packages/setuptools/version.py | 6 + .../Lib/site-packages/setuptools/wheel.py | 213 + .../setuptools/windows_support.py | 29 + .../yarl-1.8.1.dist-info/INSTALLER | 1 + .../yarl-1.8.1.dist-info/LICENSE | 13 + .../yarl-1.8.1.dist-info/METADATA | 867 + .../site-packages/yarl-1.8.1.dist-info/RECORD | 19 + .../site-packages/yarl-1.8.1.dist-info/WHEEL | 5 + .../yarl-1.8.1.dist-info/top_level.txt | 1 + sbsheriff/Lib/site-packages/yarl/__init__.py | 5 + sbsheriff/Lib/site-packages/yarl/__init__.pyi | 118 + .../yarl/__pycache__/__init__.cpython-310.pyc | Bin 0 -> 319 bytes .../yarl/__pycache__/_quoting.cpython-310.pyc | Bin 0 -> 515 bytes .../__pycache__/_quoting_py.cpython-310.pyc | Bin 0 -> 4313 bytes .../yarl/__pycache__/_url.cpython-310.pyc | Bin 0 -> 27849 bytes sbsheriff/Lib/site-packages/yarl/_quoting.py | 18 + .../yarl/_quoting_c.cp310-win_amd64.pyd | Bin 0 -> 67584 bytes .../Lib/site-packages/yarl/_quoting_c.pyi | 16 + .../Lib/site-packages/yarl/_quoting_c.pyx | 371 + .../Lib/site-packages/yarl/_quoting_py.py | 197 + sbsheriff/Lib/site-packages/yarl/_url.py | 1159 + sbsheriff/Lib/site-packages/yarl/py.typed | 1 + sbsheriff/Scripts/Activate.ps1 | 443 + sbsheriff/Scripts/activate | 69 + sbsheriff/Scripts/activate.bat | 34 + sbsheriff/Scripts/deactivate.bat | 22 + sbsheriff/Scripts/dotenv.exe | Bin 0 -> 106370 bytes sbsheriff/Scripts/normalizer.exe | Bin 0 -> 106402 bytes sbsheriff/Scripts/pip.exe | Bin 0 -> 106379 bytes sbsheriff/Scripts/pip3.10.exe | Bin 0 -> 106379 bytes sbsheriff/Scripts/pip3.exe | Bin 0 -> 106379 bytes sbsheriff/Scripts/python.exe | Bin 0 -> 264176 bytes sbsheriff/Scripts/pythonw.exe | Bin 0 -> 252912 bytes sbsheriff/pyvenv.cfg | 3 + 1945 files changed, 419801 insertions(+) create mode 100644 .gitignore create mode 100644 requirements.txt create mode 100644 sbsheriff/Lib/site-packages/_distutils_hack/__init__.py create mode 100644 sbsheriff/Lib/site-packages/_distutils_hack/__pycache__/__init__.cpython-310.pyc create mode 100644 sbsheriff/Lib/site-packages/_distutils_hack/__pycache__/override.cpython-310.pyc create mode 100644 sbsheriff/Lib/site-packages/_distutils_hack/override.py create mode 100644 sbsheriff/Lib/site-packages/aiohttp-3.8.1.dist-info/INSTALLER create mode 100644 sbsheriff/Lib/site-packages/aiohttp-3.8.1.dist-info/LICENSE.txt create mode 100644 sbsheriff/Lib/site-packages/aiohttp-3.8.1.dist-info/METADATA create mode 100644 sbsheriff/Lib/site-packages/aiohttp-3.8.1.dist-info/RECORD create mode 100644 sbsheriff/Lib/site-packages/aiohttp-3.8.1.dist-info/WHEEL create mode 100644 sbsheriff/Lib/site-packages/aiohttp-3.8.1.dist-info/top_level.txt create mode 100644 sbsheriff/Lib/site-packages/aiohttp/.hash/_cparser.pxd.hash create mode 100644 sbsheriff/Lib/site-packages/aiohttp/.hash/_find_header.pxd.hash create mode 100644 sbsheriff/Lib/site-packages/aiohttp/.hash/_helpers.pyi.hash create mode 100644 sbsheriff/Lib/site-packages/aiohttp/.hash/_helpers.pyx.hash create mode 100644 sbsheriff/Lib/site-packages/aiohttp/.hash/_http_parser.pyx.hash create mode 100644 sbsheriff/Lib/site-packages/aiohttp/.hash/_http_writer.pyx.hash create mode 100644 sbsheriff/Lib/site-packages/aiohttp/.hash/_websocket.pyx.hash create mode 100644 sbsheriff/Lib/site-packages/aiohttp/.hash/hdrs.py.hash create mode 100644 sbsheriff/Lib/site-packages/aiohttp/__init__.py create mode 100644 sbsheriff/Lib/site-packages/aiohttp/__pycache__/__init__.cpython-310.pyc create mode 100644 sbsheriff/Lib/site-packages/aiohttp/__pycache__/abc.cpython-310.pyc create mode 100644 sbsheriff/Lib/site-packages/aiohttp/__pycache__/base_protocol.cpython-310.pyc create mode 100644 sbsheriff/Lib/site-packages/aiohttp/__pycache__/client.cpython-310.pyc create mode 100644 sbsheriff/Lib/site-packages/aiohttp/__pycache__/client_exceptions.cpython-310.pyc create mode 100644 sbsheriff/Lib/site-packages/aiohttp/__pycache__/client_proto.cpython-310.pyc create mode 100644 sbsheriff/Lib/site-packages/aiohttp/__pycache__/client_reqrep.cpython-310.pyc create mode 100644 sbsheriff/Lib/site-packages/aiohttp/__pycache__/client_ws.cpython-310.pyc create mode 100644 sbsheriff/Lib/site-packages/aiohttp/__pycache__/connector.cpython-310.pyc create mode 100644 sbsheriff/Lib/site-packages/aiohttp/__pycache__/cookiejar.cpython-310.pyc create mode 100644 sbsheriff/Lib/site-packages/aiohttp/__pycache__/formdata.cpython-310.pyc create mode 100644 sbsheriff/Lib/site-packages/aiohttp/__pycache__/hdrs.cpython-310.pyc create mode 100644 sbsheriff/Lib/site-packages/aiohttp/__pycache__/helpers.cpython-310.pyc create mode 100644 sbsheriff/Lib/site-packages/aiohttp/__pycache__/http.cpython-310.pyc create mode 100644 sbsheriff/Lib/site-packages/aiohttp/__pycache__/http_exceptions.cpython-310.pyc create mode 100644 sbsheriff/Lib/site-packages/aiohttp/__pycache__/http_parser.cpython-310.pyc create mode 100644 sbsheriff/Lib/site-packages/aiohttp/__pycache__/http_websocket.cpython-310.pyc create mode 100644 sbsheriff/Lib/site-packages/aiohttp/__pycache__/http_writer.cpython-310.pyc create mode 100644 sbsheriff/Lib/site-packages/aiohttp/__pycache__/locks.cpython-310.pyc create mode 100644 sbsheriff/Lib/site-packages/aiohttp/__pycache__/log.cpython-310.pyc create mode 100644 sbsheriff/Lib/site-packages/aiohttp/__pycache__/multipart.cpython-310.pyc create mode 100644 sbsheriff/Lib/site-packages/aiohttp/__pycache__/payload.cpython-310.pyc create mode 100644 sbsheriff/Lib/site-packages/aiohttp/__pycache__/payload_streamer.cpython-310.pyc create mode 100644 sbsheriff/Lib/site-packages/aiohttp/__pycache__/pytest_plugin.cpython-310.pyc create mode 100644 sbsheriff/Lib/site-packages/aiohttp/__pycache__/resolver.cpython-310.pyc create mode 100644 sbsheriff/Lib/site-packages/aiohttp/__pycache__/streams.cpython-310.pyc create mode 100644 sbsheriff/Lib/site-packages/aiohttp/__pycache__/tcp_helpers.cpython-310.pyc create mode 100644 sbsheriff/Lib/site-packages/aiohttp/__pycache__/test_utils.cpython-310.pyc create mode 100644 sbsheriff/Lib/site-packages/aiohttp/__pycache__/tracing.cpython-310.pyc create mode 100644 sbsheriff/Lib/site-packages/aiohttp/__pycache__/typedefs.cpython-310.pyc create mode 100644 sbsheriff/Lib/site-packages/aiohttp/__pycache__/web.cpython-310.pyc create mode 100644 sbsheriff/Lib/site-packages/aiohttp/__pycache__/web_app.cpython-310.pyc create mode 100644 sbsheriff/Lib/site-packages/aiohttp/__pycache__/web_exceptions.cpython-310.pyc create mode 100644 sbsheriff/Lib/site-packages/aiohttp/__pycache__/web_fileresponse.cpython-310.pyc create mode 100644 sbsheriff/Lib/site-packages/aiohttp/__pycache__/web_log.cpython-310.pyc create mode 100644 sbsheriff/Lib/site-packages/aiohttp/__pycache__/web_middlewares.cpython-310.pyc create mode 100644 sbsheriff/Lib/site-packages/aiohttp/__pycache__/web_protocol.cpython-310.pyc create mode 100644 sbsheriff/Lib/site-packages/aiohttp/__pycache__/web_request.cpython-310.pyc create mode 100644 sbsheriff/Lib/site-packages/aiohttp/__pycache__/web_response.cpython-310.pyc create mode 100644 sbsheriff/Lib/site-packages/aiohttp/__pycache__/web_routedef.cpython-310.pyc create mode 100644 sbsheriff/Lib/site-packages/aiohttp/__pycache__/web_runner.cpython-310.pyc create mode 100644 sbsheriff/Lib/site-packages/aiohttp/__pycache__/web_server.cpython-310.pyc create mode 100644 sbsheriff/Lib/site-packages/aiohttp/__pycache__/web_urldispatcher.cpython-310.pyc create mode 100644 sbsheriff/Lib/site-packages/aiohttp/__pycache__/web_ws.cpython-310.pyc create mode 100644 sbsheriff/Lib/site-packages/aiohttp/__pycache__/worker.cpython-310.pyc create mode 100644 sbsheriff/Lib/site-packages/aiohttp/_cparser.pxd create mode 100644 sbsheriff/Lib/site-packages/aiohttp/_find_header.c create mode 100644 sbsheriff/Lib/site-packages/aiohttp/_find_header.h create mode 100644 sbsheriff/Lib/site-packages/aiohttp/_find_header.pxd create mode 100644 sbsheriff/Lib/site-packages/aiohttp/_headers.pxi create mode 100644 sbsheriff/Lib/site-packages/aiohttp/_helpers.c create mode 100644 sbsheriff/Lib/site-packages/aiohttp/_helpers.cp310-win_amd64.pyd create mode 100644 sbsheriff/Lib/site-packages/aiohttp/_helpers.pyi create mode 100644 sbsheriff/Lib/site-packages/aiohttp/_helpers.pyx create mode 100644 sbsheriff/Lib/site-packages/aiohttp/_http_parser.c create mode 100644 sbsheriff/Lib/site-packages/aiohttp/_http_parser.cp310-win_amd64.pyd create mode 100644 sbsheriff/Lib/site-packages/aiohttp/_http_parser.pyx create mode 100644 sbsheriff/Lib/site-packages/aiohttp/_http_writer.c create mode 100644 sbsheriff/Lib/site-packages/aiohttp/_http_writer.cp310-win_amd64.pyd create mode 100644 sbsheriff/Lib/site-packages/aiohttp/_http_writer.pyx create mode 100644 sbsheriff/Lib/site-packages/aiohttp/_websocket.c create mode 100644 sbsheriff/Lib/site-packages/aiohttp/_websocket.cp310-win_amd64.pyd create mode 100644 sbsheriff/Lib/site-packages/aiohttp/_websocket.pyx create mode 100644 sbsheriff/Lib/site-packages/aiohttp/abc.py create mode 100644 sbsheriff/Lib/site-packages/aiohttp/base_protocol.py create mode 100644 sbsheriff/Lib/site-packages/aiohttp/client.py create mode 100644 sbsheriff/Lib/site-packages/aiohttp/client_exceptions.py create mode 100644 sbsheriff/Lib/site-packages/aiohttp/client_proto.py create mode 100644 sbsheriff/Lib/site-packages/aiohttp/client_reqrep.py create mode 100644 sbsheriff/Lib/site-packages/aiohttp/client_ws.py create mode 100644 sbsheriff/Lib/site-packages/aiohttp/connector.py create mode 100644 sbsheriff/Lib/site-packages/aiohttp/cookiejar.py create mode 100644 sbsheriff/Lib/site-packages/aiohttp/formdata.py create mode 100644 sbsheriff/Lib/site-packages/aiohttp/hdrs.py create mode 100644 sbsheriff/Lib/site-packages/aiohttp/helpers.py create mode 100644 sbsheriff/Lib/site-packages/aiohttp/http.py create mode 100644 sbsheriff/Lib/site-packages/aiohttp/http_exceptions.py create mode 100644 sbsheriff/Lib/site-packages/aiohttp/http_parser.py create mode 100644 sbsheriff/Lib/site-packages/aiohttp/http_websocket.py create mode 100644 sbsheriff/Lib/site-packages/aiohttp/http_writer.py create mode 100644 sbsheriff/Lib/site-packages/aiohttp/locks.py create mode 100644 sbsheriff/Lib/site-packages/aiohttp/log.py create mode 100644 sbsheriff/Lib/site-packages/aiohttp/multipart.py create mode 100644 sbsheriff/Lib/site-packages/aiohttp/payload.py create mode 100644 sbsheriff/Lib/site-packages/aiohttp/payload_streamer.py create mode 100644 sbsheriff/Lib/site-packages/aiohttp/py.typed create mode 100644 sbsheriff/Lib/site-packages/aiohttp/pytest_plugin.py create mode 100644 sbsheriff/Lib/site-packages/aiohttp/resolver.py create mode 100644 sbsheriff/Lib/site-packages/aiohttp/streams.py create mode 100644 sbsheriff/Lib/site-packages/aiohttp/tcp_helpers.py create mode 100644 sbsheriff/Lib/site-packages/aiohttp/test_utils.py create mode 100644 sbsheriff/Lib/site-packages/aiohttp/tracing.py create mode 100644 sbsheriff/Lib/site-packages/aiohttp/typedefs.py create mode 100644 sbsheriff/Lib/site-packages/aiohttp/web.py create mode 100644 sbsheriff/Lib/site-packages/aiohttp/web_app.py create mode 100644 sbsheriff/Lib/site-packages/aiohttp/web_exceptions.py create mode 100644 sbsheriff/Lib/site-packages/aiohttp/web_fileresponse.py create mode 100644 sbsheriff/Lib/site-packages/aiohttp/web_log.py create mode 100644 sbsheriff/Lib/site-packages/aiohttp/web_middlewares.py create mode 100644 sbsheriff/Lib/site-packages/aiohttp/web_protocol.py create mode 100644 sbsheriff/Lib/site-packages/aiohttp/web_request.py create mode 100644 sbsheriff/Lib/site-packages/aiohttp/web_response.py create mode 100644 sbsheriff/Lib/site-packages/aiohttp/web_routedef.py create mode 100644 sbsheriff/Lib/site-packages/aiohttp/web_runner.py create mode 100644 sbsheriff/Lib/site-packages/aiohttp/web_server.py create mode 100644 sbsheriff/Lib/site-packages/aiohttp/web_urldispatcher.py create mode 100644 sbsheriff/Lib/site-packages/aiohttp/web_ws.py create mode 100644 sbsheriff/Lib/site-packages/aiohttp/worker.py create mode 100644 sbsheriff/Lib/site-packages/aiosignal-1.2.0.dist-info/INSTALLER create mode 100644 sbsheriff/Lib/site-packages/aiosignal-1.2.0.dist-info/LICENSE create mode 100644 sbsheriff/Lib/site-packages/aiosignal-1.2.0.dist-info/METADATA create mode 100644 sbsheriff/Lib/site-packages/aiosignal-1.2.0.dist-info/RECORD create mode 100644 sbsheriff/Lib/site-packages/aiosignal-1.2.0.dist-info/WHEEL create mode 100644 sbsheriff/Lib/site-packages/aiosignal-1.2.0.dist-info/top_level.txt create mode 100644 sbsheriff/Lib/site-packages/aiosignal/__init__.py create mode 100644 sbsheriff/Lib/site-packages/aiosignal/__init__.pyi create mode 100644 sbsheriff/Lib/site-packages/aiosignal/__pycache__/__init__.cpython-310.pyc create mode 100644 sbsheriff/Lib/site-packages/aiosignal/py.typed create mode 100644 sbsheriff/Lib/site-packages/async_timeout-4.0.2.dist-info/INSTALLER create mode 100644 sbsheriff/Lib/site-packages/async_timeout-4.0.2.dist-info/LICENSE create mode 100644 sbsheriff/Lib/site-packages/async_timeout-4.0.2.dist-info/METADATA create mode 100644 sbsheriff/Lib/site-packages/async_timeout-4.0.2.dist-info/RECORD create mode 100644 sbsheriff/Lib/site-packages/async_timeout-4.0.2.dist-info/WHEEL create mode 100644 sbsheriff/Lib/site-packages/async_timeout-4.0.2.dist-info/top_level.txt create mode 100644 sbsheriff/Lib/site-packages/async_timeout-4.0.2.dist-info/zip-safe create mode 100644 sbsheriff/Lib/site-packages/async_timeout/__init__.py create mode 100644 sbsheriff/Lib/site-packages/async_timeout/__pycache__/__init__.cpython-310.pyc create mode 100644 sbsheriff/Lib/site-packages/async_timeout/py.typed create mode 100644 sbsheriff/Lib/site-packages/attr/__init__.py create mode 100644 sbsheriff/Lib/site-packages/attr/__init__.pyi create mode 100644 sbsheriff/Lib/site-packages/attr/__pycache__/__init__.cpython-310.pyc create mode 100644 sbsheriff/Lib/site-packages/attr/__pycache__/_cmp.cpython-310.pyc create mode 100644 sbsheriff/Lib/site-packages/attr/__pycache__/_compat.cpython-310.pyc create mode 100644 sbsheriff/Lib/site-packages/attr/__pycache__/_config.cpython-310.pyc create mode 100644 sbsheriff/Lib/site-packages/attr/__pycache__/_funcs.cpython-310.pyc create mode 100644 sbsheriff/Lib/site-packages/attr/__pycache__/_make.cpython-310.pyc create mode 100644 sbsheriff/Lib/site-packages/attr/__pycache__/_next_gen.cpython-310.pyc create mode 100644 sbsheriff/Lib/site-packages/attr/__pycache__/_version_info.cpython-310.pyc create mode 100644 sbsheriff/Lib/site-packages/attr/__pycache__/converters.cpython-310.pyc create mode 100644 sbsheriff/Lib/site-packages/attr/__pycache__/exceptions.cpython-310.pyc create mode 100644 sbsheriff/Lib/site-packages/attr/__pycache__/filters.cpython-310.pyc create mode 100644 sbsheriff/Lib/site-packages/attr/__pycache__/setters.cpython-310.pyc create mode 100644 sbsheriff/Lib/site-packages/attr/__pycache__/validators.cpython-310.pyc create mode 100644 sbsheriff/Lib/site-packages/attr/_cmp.py create mode 100644 sbsheriff/Lib/site-packages/attr/_cmp.pyi create mode 100644 sbsheriff/Lib/site-packages/attr/_compat.py create mode 100644 sbsheriff/Lib/site-packages/attr/_config.py create mode 100644 sbsheriff/Lib/site-packages/attr/_funcs.py create mode 100644 sbsheriff/Lib/site-packages/attr/_make.py create mode 100644 sbsheriff/Lib/site-packages/attr/_next_gen.py create mode 100644 sbsheriff/Lib/site-packages/attr/_version_info.py create mode 100644 sbsheriff/Lib/site-packages/attr/_version_info.pyi create mode 100644 sbsheriff/Lib/site-packages/attr/converters.py create mode 100644 sbsheriff/Lib/site-packages/attr/converters.pyi create mode 100644 sbsheriff/Lib/site-packages/attr/exceptions.py create mode 100644 sbsheriff/Lib/site-packages/attr/exceptions.pyi create mode 100644 sbsheriff/Lib/site-packages/attr/filters.py create mode 100644 sbsheriff/Lib/site-packages/attr/filters.pyi create mode 100644 sbsheriff/Lib/site-packages/attr/py.typed create mode 100644 sbsheriff/Lib/site-packages/attr/setters.py create mode 100644 sbsheriff/Lib/site-packages/attr/setters.pyi create mode 100644 sbsheriff/Lib/site-packages/attr/validators.py create mode 100644 sbsheriff/Lib/site-packages/attr/validators.pyi create mode 100644 sbsheriff/Lib/site-packages/attrs-22.1.0.dist-info/AUTHORS.rst create mode 100644 sbsheriff/Lib/site-packages/attrs-22.1.0.dist-info/INSTALLER create mode 100644 sbsheriff/Lib/site-packages/attrs-22.1.0.dist-info/LICENSE create mode 100644 sbsheriff/Lib/site-packages/attrs-22.1.0.dist-info/METADATA create mode 100644 sbsheriff/Lib/site-packages/attrs-22.1.0.dist-info/RECORD create mode 100644 sbsheriff/Lib/site-packages/attrs-22.1.0.dist-info/WHEEL create mode 100644 sbsheriff/Lib/site-packages/attrs-22.1.0.dist-info/top_level.txt create mode 100644 sbsheriff/Lib/site-packages/attrs/__init__.py create mode 100644 sbsheriff/Lib/site-packages/attrs/__init__.pyi create mode 100644 sbsheriff/Lib/site-packages/attrs/__pycache__/__init__.cpython-310.pyc create mode 100644 sbsheriff/Lib/site-packages/attrs/__pycache__/converters.cpython-310.pyc create mode 100644 sbsheriff/Lib/site-packages/attrs/__pycache__/exceptions.cpython-310.pyc create mode 100644 sbsheriff/Lib/site-packages/attrs/__pycache__/filters.cpython-310.pyc create mode 100644 sbsheriff/Lib/site-packages/attrs/__pycache__/setters.cpython-310.pyc create mode 100644 sbsheriff/Lib/site-packages/attrs/__pycache__/validators.cpython-310.pyc create mode 100644 sbsheriff/Lib/site-packages/attrs/converters.py create mode 100644 sbsheriff/Lib/site-packages/attrs/exceptions.py create mode 100644 sbsheriff/Lib/site-packages/attrs/filters.py create mode 100644 sbsheriff/Lib/site-packages/attrs/py.typed create mode 100644 sbsheriff/Lib/site-packages/attrs/setters.py create mode 100644 sbsheriff/Lib/site-packages/attrs/validators.py create mode 100644 sbsheriff/Lib/site-packages/charset_normalizer-2.1.1.dist-info/INSTALLER create mode 100644 sbsheriff/Lib/site-packages/charset_normalizer-2.1.1.dist-info/LICENSE create mode 100644 sbsheriff/Lib/site-packages/charset_normalizer-2.1.1.dist-info/METADATA create mode 100644 sbsheriff/Lib/site-packages/charset_normalizer-2.1.1.dist-info/RECORD create mode 100644 sbsheriff/Lib/site-packages/charset_normalizer-2.1.1.dist-info/WHEEL create mode 100644 sbsheriff/Lib/site-packages/charset_normalizer-2.1.1.dist-info/entry_points.txt create mode 100644 sbsheriff/Lib/site-packages/charset_normalizer-2.1.1.dist-info/top_level.txt create mode 100644 sbsheriff/Lib/site-packages/charset_normalizer/__init__.py create mode 100644 sbsheriff/Lib/site-packages/charset_normalizer/__pycache__/__init__.cpython-310.pyc create mode 100644 sbsheriff/Lib/site-packages/charset_normalizer/__pycache__/api.cpython-310.pyc create mode 100644 sbsheriff/Lib/site-packages/charset_normalizer/__pycache__/cd.cpython-310.pyc create mode 100644 sbsheriff/Lib/site-packages/charset_normalizer/__pycache__/constant.cpython-310.pyc create mode 100644 sbsheriff/Lib/site-packages/charset_normalizer/__pycache__/legacy.cpython-310.pyc create mode 100644 sbsheriff/Lib/site-packages/charset_normalizer/__pycache__/md.cpython-310.pyc create mode 100644 sbsheriff/Lib/site-packages/charset_normalizer/__pycache__/models.cpython-310.pyc create mode 100644 sbsheriff/Lib/site-packages/charset_normalizer/__pycache__/utils.cpython-310.pyc create mode 100644 sbsheriff/Lib/site-packages/charset_normalizer/__pycache__/version.cpython-310.pyc create mode 100644 sbsheriff/Lib/site-packages/charset_normalizer/api.py create mode 100644 sbsheriff/Lib/site-packages/charset_normalizer/assets/__init__.py create mode 100644 sbsheriff/Lib/site-packages/charset_normalizer/assets/__pycache__/__init__.cpython-310.pyc create mode 100644 sbsheriff/Lib/site-packages/charset_normalizer/cd.py create mode 100644 sbsheriff/Lib/site-packages/charset_normalizer/cli/__init__.py create mode 100644 sbsheriff/Lib/site-packages/charset_normalizer/cli/__pycache__/__init__.cpython-310.pyc create mode 100644 sbsheriff/Lib/site-packages/charset_normalizer/cli/__pycache__/normalizer.cpython-310.pyc create mode 100644 sbsheriff/Lib/site-packages/charset_normalizer/cli/normalizer.py create mode 100644 sbsheriff/Lib/site-packages/charset_normalizer/constant.py create mode 100644 sbsheriff/Lib/site-packages/charset_normalizer/legacy.py create mode 100644 sbsheriff/Lib/site-packages/charset_normalizer/md.py create mode 100644 sbsheriff/Lib/site-packages/charset_normalizer/models.py create mode 100644 sbsheriff/Lib/site-packages/charset_normalizer/py.typed create mode 100644 sbsheriff/Lib/site-packages/charset_normalizer/utils.py create mode 100644 sbsheriff/Lib/site-packages/charset_normalizer/version.py create mode 100644 sbsheriff/Lib/site-packages/disnake-2.5.2.dist-info/INSTALLER create mode 100644 sbsheriff/Lib/site-packages/disnake-2.5.2.dist-info/LICENSE create mode 100644 sbsheriff/Lib/site-packages/disnake-2.5.2.dist-info/METADATA create mode 100644 sbsheriff/Lib/site-packages/disnake-2.5.2.dist-info/RECORD create mode 100644 sbsheriff/Lib/site-packages/disnake-2.5.2.dist-info/REQUESTED create mode 100644 sbsheriff/Lib/site-packages/disnake-2.5.2.dist-info/WHEEL create mode 100644 sbsheriff/Lib/site-packages/disnake-2.5.2.dist-info/top_level.txt create mode 100644 sbsheriff/Lib/site-packages/disnake/__init__.py create mode 100644 sbsheriff/Lib/site-packages/disnake/__main__.py create mode 100644 sbsheriff/Lib/site-packages/disnake/__pycache__/__init__.cpython-310.pyc create mode 100644 sbsheriff/Lib/site-packages/disnake/__pycache__/__main__.cpython-310.pyc create mode 100644 sbsheriff/Lib/site-packages/disnake/__pycache__/abc.cpython-310.pyc create mode 100644 sbsheriff/Lib/site-packages/disnake/__pycache__/activity.cpython-310.pyc create mode 100644 sbsheriff/Lib/site-packages/disnake/__pycache__/app_commands.cpython-310.pyc create mode 100644 sbsheriff/Lib/site-packages/disnake/__pycache__/appinfo.cpython-310.pyc create mode 100644 sbsheriff/Lib/site-packages/disnake/__pycache__/asset.cpython-310.pyc create mode 100644 sbsheriff/Lib/site-packages/disnake/__pycache__/audit_logs.cpython-310.pyc create mode 100644 sbsheriff/Lib/site-packages/disnake/__pycache__/backoff.cpython-310.pyc create mode 100644 sbsheriff/Lib/site-packages/disnake/__pycache__/bans.cpython-310.pyc create mode 100644 sbsheriff/Lib/site-packages/disnake/__pycache__/channel.cpython-310.pyc create mode 100644 sbsheriff/Lib/site-packages/disnake/__pycache__/client.cpython-310.pyc create mode 100644 sbsheriff/Lib/site-packages/disnake/__pycache__/colour.cpython-310.pyc create mode 100644 sbsheriff/Lib/site-packages/disnake/__pycache__/components.cpython-310.pyc create mode 100644 sbsheriff/Lib/site-packages/disnake/__pycache__/context_managers.cpython-310.pyc create mode 100644 sbsheriff/Lib/site-packages/disnake/__pycache__/custom_warnings.cpython-310.pyc create mode 100644 sbsheriff/Lib/site-packages/disnake/__pycache__/embeds.cpython-310.pyc create mode 100644 sbsheriff/Lib/site-packages/disnake/__pycache__/emoji.cpython-310.pyc create mode 100644 sbsheriff/Lib/site-packages/disnake/__pycache__/enums.cpython-310.pyc create mode 100644 sbsheriff/Lib/site-packages/disnake/__pycache__/errors.cpython-310.pyc create mode 100644 sbsheriff/Lib/site-packages/disnake/__pycache__/file.cpython-310.pyc create mode 100644 sbsheriff/Lib/site-packages/disnake/__pycache__/flags.cpython-310.pyc create mode 100644 sbsheriff/Lib/site-packages/disnake/__pycache__/gateway.cpython-310.pyc create mode 100644 sbsheriff/Lib/site-packages/disnake/__pycache__/guild.cpython-310.pyc create mode 100644 sbsheriff/Lib/site-packages/disnake/__pycache__/guild_preview.cpython-310.pyc create mode 100644 sbsheriff/Lib/site-packages/disnake/__pycache__/guild_scheduled_event.cpython-310.pyc create mode 100644 sbsheriff/Lib/site-packages/disnake/__pycache__/http.cpython-310.pyc create mode 100644 sbsheriff/Lib/site-packages/disnake/__pycache__/i18n.cpython-310.pyc create mode 100644 sbsheriff/Lib/site-packages/disnake/__pycache__/integrations.cpython-310.pyc create mode 100644 sbsheriff/Lib/site-packages/disnake/__pycache__/invite.cpython-310.pyc create mode 100644 sbsheriff/Lib/site-packages/disnake/__pycache__/iterators.cpython-310.pyc create mode 100644 sbsheriff/Lib/site-packages/disnake/__pycache__/member.cpython-310.pyc create mode 100644 sbsheriff/Lib/site-packages/disnake/__pycache__/mentions.cpython-310.pyc create mode 100644 sbsheriff/Lib/site-packages/disnake/__pycache__/message.cpython-310.pyc create mode 100644 sbsheriff/Lib/site-packages/disnake/__pycache__/mixins.cpython-310.pyc create mode 100644 sbsheriff/Lib/site-packages/disnake/__pycache__/object.cpython-310.pyc create mode 100644 sbsheriff/Lib/site-packages/disnake/__pycache__/oggparse.cpython-310.pyc create mode 100644 sbsheriff/Lib/site-packages/disnake/__pycache__/opus.cpython-310.pyc create mode 100644 sbsheriff/Lib/site-packages/disnake/__pycache__/partial_emoji.cpython-310.pyc create mode 100644 sbsheriff/Lib/site-packages/disnake/__pycache__/permissions.cpython-310.pyc create mode 100644 sbsheriff/Lib/site-packages/disnake/__pycache__/player.cpython-310.pyc create mode 100644 sbsheriff/Lib/site-packages/disnake/__pycache__/raw_models.cpython-310.pyc create mode 100644 sbsheriff/Lib/site-packages/disnake/__pycache__/reaction.cpython-310.pyc create mode 100644 sbsheriff/Lib/site-packages/disnake/__pycache__/role.cpython-310.pyc create mode 100644 sbsheriff/Lib/site-packages/disnake/__pycache__/shard.cpython-310.pyc create mode 100644 sbsheriff/Lib/site-packages/disnake/__pycache__/stage_instance.cpython-310.pyc create mode 100644 sbsheriff/Lib/site-packages/disnake/__pycache__/state.cpython-310.pyc create mode 100644 sbsheriff/Lib/site-packages/disnake/__pycache__/sticker.cpython-310.pyc create mode 100644 sbsheriff/Lib/site-packages/disnake/__pycache__/team.cpython-310.pyc create mode 100644 sbsheriff/Lib/site-packages/disnake/__pycache__/template.cpython-310.pyc create mode 100644 sbsheriff/Lib/site-packages/disnake/__pycache__/threads.cpython-310.pyc create mode 100644 sbsheriff/Lib/site-packages/disnake/__pycache__/user.cpython-310.pyc create mode 100644 sbsheriff/Lib/site-packages/disnake/__pycache__/utils.cpython-310.pyc create mode 100644 sbsheriff/Lib/site-packages/disnake/__pycache__/voice_client.cpython-310.pyc create mode 100644 sbsheriff/Lib/site-packages/disnake/__pycache__/voice_region.cpython-310.pyc create mode 100644 sbsheriff/Lib/site-packages/disnake/__pycache__/welcome_screen.cpython-310.pyc create mode 100644 sbsheriff/Lib/site-packages/disnake/__pycache__/widget.cpython-310.pyc create mode 100644 sbsheriff/Lib/site-packages/disnake/abc.py create mode 100644 sbsheriff/Lib/site-packages/disnake/activity.py create mode 100644 sbsheriff/Lib/site-packages/disnake/app_commands.py create mode 100644 sbsheriff/Lib/site-packages/disnake/appinfo.py create mode 100644 sbsheriff/Lib/site-packages/disnake/asset.py create mode 100644 sbsheriff/Lib/site-packages/disnake/audit_logs.py create mode 100644 sbsheriff/Lib/site-packages/disnake/backoff.py create mode 100644 sbsheriff/Lib/site-packages/disnake/bans.py create mode 100644 sbsheriff/Lib/site-packages/disnake/bin/libopus-0.x64.dll create mode 100644 sbsheriff/Lib/site-packages/disnake/bin/libopus-0.x86.dll create mode 100644 sbsheriff/Lib/site-packages/disnake/channel.py create mode 100644 sbsheriff/Lib/site-packages/disnake/client.py create mode 100644 sbsheriff/Lib/site-packages/disnake/colour.py create mode 100644 sbsheriff/Lib/site-packages/disnake/components.py create mode 100644 sbsheriff/Lib/site-packages/disnake/context_managers.py create mode 100644 sbsheriff/Lib/site-packages/disnake/custom_warnings.py create mode 100644 sbsheriff/Lib/site-packages/disnake/embeds.py create mode 100644 sbsheriff/Lib/site-packages/disnake/emoji.py create mode 100644 sbsheriff/Lib/site-packages/disnake/enums.py create mode 100644 sbsheriff/Lib/site-packages/disnake/errors.py create mode 100644 sbsheriff/Lib/site-packages/disnake/ext/commands/__init__.py create mode 100644 sbsheriff/Lib/site-packages/disnake/ext/commands/__pycache__/__init__.cpython-310.pyc create mode 100644 sbsheriff/Lib/site-packages/disnake/ext/commands/__pycache__/_types.cpython-310.pyc create mode 100644 sbsheriff/Lib/site-packages/disnake/ext/commands/__pycache__/base_core.cpython-310.pyc create mode 100644 sbsheriff/Lib/site-packages/disnake/ext/commands/__pycache__/bot.cpython-310.pyc create mode 100644 sbsheriff/Lib/site-packages/disnake/ext/commands/__pycache__/bot_base.cpython-310.pyc create mode 100644 sbsheriff/Lib/site-packages/disnake/ext/commands/__pycache__/cog.cpython-310.pyc create mode 100644 sbsheriff/Lib/site-packages/disnake/ext/commands/__pycache__/common_bot_base.cpython-310.pyc create mode 100644 sbsheriff/Lib/site-packages/disnake/ext/commands/__pycache__/context.cpython-310.pyc create mode 100644 sbsheriff/Lib/site-packages/disnake/ext/commands/__pycache__/converter.cpython-310.pyc create mode 100644 sbsheriff/Lib/site-packages/disnake/ext/commands/__pycache__/cooldowns.cpython-310.pyc create mode 100644 sbsheriff/Lib/site-packages/disnake/ext/commands/__pycache__/core.cpython-310.pyc create mode 100644 sbsheriff/Lib/site-packages/disnake/ext/commands/__pycache__/ctx_menus_core.cpython-310.pyc create mode 100644 sbsheriff/Lib/site-packages/disnake/ext/commands/__pycache__/custom_warnings.cpython-310.pyc create mode 100644 sbsheriff/Lib/site-packages/disnake/ext/commands/__pycache__/errors.cpython-310.pyc create mode 100644 sbsheriff/Lib/site-packages/disnake/ext/commands/__pycache__/flags.cpython-310.pyc create mode 100644 sbsheriff/Lib/site-packages/disnake/ext/commands/__pycache__/help.cpython-310.pyc create mode 100644 sbsheriff/Lib/site-packages/disnake/ext/commands/__pycache__/interaction_bot_base.cpython-310.pyc create mode 100644 sbsheriff/Lib/site-packages/disnake/ext/commands/__pycache__/params.cpython-310.pyc create mode 100644 sbsheriff/Lib/site-packages/disnake/ext/commands/__pycache__/slash_core.cpython-310.pyc create mode 100644 sbsheriff/Lib/site-packages/disnake/ext/commands/__pycache__/view.cpython-310.pyc create mode 100644 sbsheriff/Lib/site-packages/disnake/ext/commands/_types.py create mode 100644 sbsheriff/Lib/site-packages/disnake/ext/commands/base_core.py create mode 100644 sbsheriff/Lib/site-packages/disnake/ext/commands/bot.py create mode 100644 sbsheriff/Lib/site-packages/disnake/ext/commands/bot_base.py create mode 100644 sbsheriff/Lib/site-packages/disnake/ext/commands/cog.py create mode 100644 sbsheriff/Lib/site-packages/disnake/ext/commands/common_bot_base.py create mode 100644 sbsheriff/Lib/site-packages/disnake/ext/commands/context.py create mode 100644 sbsheriff/Lib/site-packages/disnake/ext/commands/converter.py create mode 100644 sbsheriff/Lib/site-packages/disnake/ext/commands/cooldowns.py create mode 100644 sbsheriff/Lib/site-packages/disnake/ext/commands/core.py create mode 100644 sbsheriff/Lib/site-packages/disnake/ext/commands/ctx_menus_core.py create mode 100644 sbsheriff/Lib/site-packages/disnake/ext/commands/custom_warnings.py create mode 100644 sbsheriff/Lib/site-packages/disnake/ext/commands/errors.py create mode 100644 sbsheriff/Lib/site-packages/disnake/ext/commands/flags.py create mode 100644 sbsheriff/Lib/site-packages/disnake/ext/commands/help.py create mode 100644 sbsheriff/Lib/site-packages/disnake/ext/commands/interaction_bot_base.py create mode 100644 sbsheriff/Lib/site-packages/disnake/ext/commands/params.py create mode 100644 sbsheriff/Lib/site-packages/disnake/ext/commands/slash_core.py create mode 100644 sbsheriff/Lib/site-packages/disnake/ext/commands/view.py create mode 100644 sbsheriff/Lib/site-packages/disnake/ext/mypy_plugin/__init__.py create mode 100644 sbsheriff/Lib/site-packages/disnake/ext/mypy_plugin/__pycache__/__init__.cpython-310.pyc create mode 100644 sbsheriff/Lib/site-packages/disnake/ext/tasks/__init__.py create mode 100644 sbsheriff/Lib/site-packages/disnake/ext/tasks/__pycache__/__init__.cpython-310.pyc create mode 100644 sbsheriff/Lib/site-packages/disnake/file.py create mode 100644 sbsheriff/Lib/site-packages/disnake/flags.py create mode 100644 sbsheriff/Lib/site-packages/disnake/gateway.py create mode 100644 sbsheriff/Lib/site-packages/disnake/guild.py create mode 100644 sbsheriff/Lib/site-packages/disnake/guild_preview.py create mode 100644 sbsheriff/Lib/site-packages/disnake/guild_scheduled_event.py create mode 100644 sbsheriff/Lib/site-packages/disnake/http.py create mode 100644 sbsheriff/Lib/site-packages/disnake/i18n.py create mode 100644 sbsheriff/Lib/site-packages/disnake/integrations.py create mode 100644 sbsheriff/Lib/site-packages/disnake/interactions/__init__.py create mode 100644 sbsheriff/Lib/site-packages/disnake/interactions/__pycache__/__init__.cpython-310.pyc create mode 100644 sbsheriff/Lib/site-packages/disnake/interactions/__pycache__/application_command.cpython-310.pyc create mode 100644 sbsheriff/Lib/site-packages/disnake/interactions/__pycache__/base.cpython-310.pyc create mode 100644 sbsheriff/Lib/site-packages/disnake/interactions/__pycache__/message.cpython-310.pyc create mode 100644 sbsheriff/Lib/site-packages/disnake/interactions/__pycache__/modal.cpython-310.pyc create mode 100644 sbsheriff/Lib/site-packages/disnake/interactions/application_command.py create mode 100644 sbsheriff/Lib/site-packages/disnake/interactions/base.py create mode 100644 sbsheriff/Lib/site-packages/disnake/interactions/message.py create mode 100644 sbsheriff/Lib/site-packages/disnake/interactions/modal.py create mode 100644 sbsheriff/Lib/site-packages/disnake/invite.py create mode 100644 sbsheriff/Lib/site-packages/disnake/iterators.py create mode 100644 sbsheriff/Lib/site-packages/disnake/member.py create mode 100644 sbsheriff/Lib/site-packages/disnake/mentions.py create mode 100644 sbsheriff/Lib/site-packages/disnake/message.py create mode 100644 sbsheriff/Lib/site-packages/disnake/mixins.py create mode 100644 sbsheriff/Lib/site-packages/disnake/object.py create mode 100644 sbsheriff/Lib/site-packages/disnake/oggparse.py create mode 100644 sbsheriff/Lib/site-packages/disnake/opus.py create mode 100644 sbsheriff/Lib/site-packages/disnake/partial_emoji.py create mode 100644 sbsheriff/Lib/site-packages/disnake/permissions.py create mode 100644 sbsheriff/Lib/site-packages/disnake/player.py create mode 100644 sbsheriff/Lib/site-packages/disnake/py.typed create mode 100644 sbsheriff/Lib/site-packages/disnake/raw_models.py create mode 100644 sbsheriff/Lib/site-packages/disnake/reaction.py create mode 100644 sbsheriff/Lib/site-packages/disnake/role.py create mode 100644 sbsheriff/Lib/site-packages/disnake/shard.py create mode 100644 sbsheriff/Lib/site-packages/disnake/stage_instance.py create mode 100644 sbsheriff/Lib/site-packages/disnake/state.py create mode 100644 sbsheriff/Lib/site-packages/disnake/sticker.py create mode 100644 sbsheriff/Lib/site-packages/disnake/team.py create mode 100644 sbsheriff/Lib/site-packages/disnake/template.py create mode 100644 sbsheriff/Lib/site-packages/disnake/threads.py create mode 100644 sbsheriff/Lib/site-packages/disnake/types/__init__.py create mode 100644 sbsheriff/Lib/site-packages/disnake/types/__pycache__/__init__.cpython-310.pyc create mode 100644 sbsheriff/Lib/site-packages/disnake/types/__pycache__/activity.cpython-310.pyc create mode 100644 sbsheriff/Lib/site-packages/disnake/types/__pycache__/appinfo.cpython-310.pyc create mode 100644 sbsheriff/Lib/site-packages/disnake/types/__pycache__/audit_log.cpython-310.pyc create mode 100644 sbsheriff/Lib/site-packages/disnake/types/__pycache__/channel.cpython-310.pyc create mode 100644 sbsheriff/Lib/site-packages/disnake/types/__pycache__/components.cpython-310.pyc create mode 100644 sbsheriff/Lib/site-packages/disnake/types/__pycache__/embed.cpython-310.pyc create mode 100644 sbsheriff/Lib/site-packages/disnake/types/__pycache__/emoji.cpython-310.pyc create mode 100644 sbsheriff/Lib/site-packages/disnake/types/__pycache__/gateway.cpython-310.pyc create mode 100644 sbsheriff/Lib/site-packages/disnake/types/__pycache__/guild.cpython-310.pyc create mode 100644 sbsheriff/Lib/site-packages/disnake/types/__pycache__/guild_scheduled_event.cpython-310.pyc create mode 100644 sbsheriff/Lib/site-packages/disnake/types/__pycache__/integration.cpython-310.pyc create mode 100644 sbsheriff/Lib/site-packages/disnake/types/__pycache__/interactions.cpython-310.pyc create mode 100644 sbsheriff/Lib/site-packages/disnake/types/__pycache__/invite.cpython-310.pyc create mode 100644 sbsheriff/Lib/site-packages/disnake/types/__pycache__/member.cpython-310.pyc create mode 100644 sbsheriff/Lib/site-packages/disnake/types/__pycache__/message.cpython-310.pyc create mode 100644 sbsheriff/Lib/site-packages/disnake/types/__pycache__/raw_models.cpython-310.pyc create mode 100644 sbsheriff/Lib/site-packages/disnake/types/__pycache__/role.cpython-310.pyc create mode 100644 sbsheriff/Lib/site-packages/disnake/types/__pycache__/snowflake.cpython-310.pyc create mode 100644 sbsheriff/Lib/site-packages/disnake/types/__pycache__/sticker.cpython-310.pyc create mode 100644 sbsheriff/Lib/site-packages/disnake/types/__pycache__/team.cpython-310.pyc create mode 100644 sbsheriff/Lib/site-packages/disnake/types/__pycache__/template.cpython-310.pyc create mode 100644 sbsheriff/Lib/site-packages/disnake/types/__pycache__/threads.cpython-310.pyc create mode 100644 sbsheriff/Lib/site-packages/disnake/types/__pycache__/user.cpython-310.pyc create mode 100644 sbsheriff/Lib/site-packages/disnake/types/__pycache__/voice.cpython-310.pyc create mode 100644 sbsheriff/Lib/site-packages/disnake/types/__pycache__/webhook.cpython-310.pyc create mode 100644 sbsheriff/Lib/site-packages/disnake/types/__pycache__/welcome_screen.cpython-310.pyc create mode 100644 sbsheriff/Lib/site-packages/disnake/types/__pycache__/widget.cpython-310.pyc create mode 100644 sbsheriff/Lib/site-packages/disnake/types/activity.py create mode 100644 sbsheriff/Lib/site-packages/disnake/types/appinfo.py create mode 100644 sbsheriff/Lib/site-packages/disnake/types/audit_log.py create mode 100644 sbsheriff/Lib/site-packages/disnake/types/channel.py create mode 100644 sbsheriff/Lib/site-packages/disnake/types/components.py create mode 100644 sbsheriff/Lib/site-packages/disnake/types/embed.py create mode 100644 sbsheriff/Lib/site-packages/disnake/types/emoji.py create mode 100644 sbsheriff/Lib/site-packages/disnake/types/gateway.py create mode 100644 sbsheriff/Lib/site-packages/disnake/types/guild.py create mode 100644 sbsheriff/Lib/site-packages/disnake/types/guild_scheduled_event.py create mode 100644 sbsheriff/Lib/site-packages/disnake/types/integration.py create mode 100644 sbsheriff/Lib/site-packages/disnake/types/interactions.py create mode 100644 sbsheriff/Lib/site-packages/disnake/types/invite.py create mode 100644 sbsheriff/Lib/site-packages/disnake/types/member.py create mode 100644 sbsheriff/Lib/site-packages/disnake/types/message.py create mode 100644 sbsheriff/Lib/site-packages/disnake/types/raw_models.py create mode 100644 sbsheriff/Lib/site-packages/disnake/types/role.py create mode 100644 sbsheriff/Lib/site-packages/disnake/types/snowflake.py create mode 100644 sbsheriff/Lib/site-packages/disnake/types/sticker.py create mode 100644 sbsheriff/Lib/site-packages/disnake/types/team.py create mode 100644 sbsheriff/Lib/site-packages/disnake/types/template.py create mode 100644 sbsheriff/Lib/site-packages/disnake/types/threads.py create mode 100644 sbsheriff/Lib/site-packages/disnake/types/user.py create mode 100644 sbsheriff/Lib/site-packages/disnake/types/voice.py create mode 100644 sbsheriff/Lib/site-packages/disnake/types/webhook.py create mode 100644 sbsheriff/Lib/site-packages/disnake/types/welcome_screen.py create mode 100644 sbsheriff/Lib/site-packages/disnake/types/widget.py create mode 100644 sbsheriff/Lib/site-packages/disnake/ui/__init__.py create mode 100644 sbsheriff/Lib/site-packages/disnake/ui/__pycache__/__init__.cpython-310.pyc create mode 100644 sbsheriff/Lib/site-packages/disnake/ui/__pycache__/action_row.cpython-310.pyc create mode 100644 sbsheriff/Lib/site-packages/disnake/ui/__pycache__/button.cpython-310.pyc create mode 100644 sbsheriff/Lib/site-packages/disnake/ui/__pycache__/item.cpython-310.pyc create mode 100644 sbsheriff/Lib/site-packages/disnake/ui/__pycache__/modal.cpython-310.pyc create mode 100644 sbsheriff/Lib/site-packages/disnake/ui/__pycache__/select.cpython-310.pyc create mode 100644 sbsheriff/Lib/site-packages/disnake/ui/__pycache__/text_input.cpython-310.pyc create mode 100644 sbsheriff/Lib/site-packages/disnake/ui/__pycache__/view.cpython-310.pyc create mode 100644 sbsheriff/Lib/site-packages/disnake/ui/action_row.py create mode 100644 sbsheriff/Lib/site-packages/disnake/ui/button.py create mode 100644 sbsheriff/Lib/site-packages/disnake/ui/item.py create mode 100644 sbsheriff/Lib/site-packages/disnake/ui/modal.py create mode 100644 sbsheriff/Lib/site-packages/disnake/ui/select.py create mode 100644 sbsheriff/Lib/site-packages/disnake/ui/text_input.py create mode 100644 sbsheriff/Lib/site-packages/disnake/ui/view.py create mode 100644 sbsheriff/Lib/site-packages/disnake/user.py create mode 100644 sbsheriff/Lib/site-packages/disnake/utils.py create mode 100644 sbsheriff/Lib/site-packages/disnake/voice_client.py create mode 100644 sbsheriff/Lib/site-packages/disnake/voice_region.py create mode 100644 sbsheriff/Lib/site-packages/disnake/webhook/__init__.py create mode 100644 sbsheriff/Lib/site-packages/disnake/webhook/__pycache__/__init__.cpython-310.pyc create mode 100644 sbsheriff/Lib/site-packages/disnake/webhook/__pycache__/async_.cpython-310.pyc create mode 100644 sbsheriff/Lib/site-packages/disnake/webhook/__pycache__/sync.cpython-310.pyc create mode 100644 sbsheriff/Lib/site-packages/disnake/webhook/async_.py create mode 100644 sbsheriff/Lib/site-packages/disnake/webhook/sync.py create mode 100644 sbsheriff/Lib/site-packages/disnake/welcome_screen.py create mode 100644 sbsheriff/Lib/site-packages/disnake/widget.py create mode 100644 sbsheriff/Lib/site-packages/distutils-precedence.pth create mode 100644 sbsheriff/Lib/site-packages/dotenv/__init__.py create mode 100644 sbsheriff/Lib/site-packages/dotenv/__main__.py create mode 100644 sbsheriff/Lib/site-packages/dotenv/__pycache__/__init__.cpython-310.pyc create mode 100644 sbsheriff/Lib/site-packages/dotenv/__pycache__/__main__.cpython-310.pyc create mode 100644 sbsheriff/Lib/site-packages/dotenv/__pycache__/cli.cpython-310.pyc create mode 100644 sbsheriff/Lib/site-packages/dotenv/__pycache__/ipython.cpython-310.pyc create mode 100644 sbsheriff/Lib/site-packages/dotenv/__pycache__/main.cpython-310.pyc create mode 100644 sbsheriff/Lib/site-packages/dotenv/__pycache__/parser.cpython-310.pyc create mode 100644 sbsheriff/Lib/site-packages/dotenv/__pycache__/variables.cpython-310.pyc create mode 100644 sbsheriff/Lib/site-packages/dotenv/__pycache__/version.cpython-310.pyc create mode 100644 sbsheriff/Lib/site-packages/dotenv/cli.py create mode 100644 sbsheriff/Lib/site-packages/dotenv/ipython.py create mode 100644 sbsheriff/Lib/site-packages/dotenv/main.py create mode 100644 sbsheriff/Lib/site-packages/dotenv/parser.py create mode 100644 sbsheriff/Lib/site-packages/dotenv/py.typed create mode 100644 sbsheriff/Lib/site-packages/dotenv/variables.py create mode 100644 sbsheriff/Lib/site-packages/dotenv/version.py create mode 100644 sbsheriff/Lib/site-packages/frozenlist-1.3.1.dist-info/INSTALLER create mode 100644 sbsheriff/Lib/site-packages/frozenlist-1.3.1.dist-info/LICENSE create mode 100644 sbsheriff/Lib/site-packages/frozenlist-1.3.1.dist-info/METADATA create mode 100644 sbsheriff/Lib/site-packages/frozenlist-1.3.1.dist-info/RECORD create mode 100644 sbsheriff/Lib/site-packages/frozenlist-1.3.1.dist-info/WHEEL create mode 100644 sbsheriff/Lib/site-packages/frozenlist-1.3.1.dist-info/top_level.txt create mode 100644 sbsheriff/Lib/site-packages/frozenlist/__init__.py create mode 100644 sbsheriff/Lib/site-packages/frozenlist/__init__.pyi create mode 100644 sbsheriff/Lib/site-packages/frozenlist/__pycache__/__init__.cpython-310.pyc create mode 100644 sbsheriff/Lib/site-packages/frozenlist/_frozenlist.cp310-win_amd64.pyd create mode 100644 sbsheriff/Lib/site-packages/frozenlist/_frozenlist.pyx create mode 100644 sbsheriff/Lib/site-packages/frozenlist/py.typed create mode 100644 sbsheriff/Lib/site-packages/idna-3.3.dist-info/INSTALLER create mode 100644 sbsheriff/Lib/site-packages/idna-3.3.dist-info/LICENSE.md create mode 100644 sbsheriff/Lib/site-packages/idna-3.3.dist-info/METADATA create mode 100644 sbsheriff/Lib/site-packages/idna-3.3.dist-info/RECORD create mode 100644 sbsheriff/Lib/site-packages/idna-3.3.dist-info/WHEEL create mode 100644 sbsheriff/Lib/site-packages/idna-3.3.dist-info/top_level.txt create mode 100644 sbsheriff/Lib/site-packages/idna/__init__.py create mode 100644 sbsheriff/Lib/site-packages/idna/__pycache__/__init__.cpython-310.pyc create mode 100644 sbsheriff/Lib/site-packages/idna/__pycache__/codec.cpython-310.pyc create mode 100644 sbsheriff/Lib/site-packages/idna/__pycache__/compat.cpython-310.pyc create mode 100644 sbsheriff/Lib/site-packages/idna/__pycache__/core.cpython-310.pyc create mode 100644 sbsheriff/Lib/site-packages/idna/__pycache__/idnadata.cpython-310.pyc create mode 100644 sbsheriff/Lib/site-packages/idna/__pycache__/intranges.cpython-310.pyc create mode 100644 sbsheriff/Lib/site-packages/idna/__pycache__/package_data.cpython-310.pyc create mode 100644 sbsheriff/Lib/site-packages/idna/__pycache__/uts46data.cpython-310.pyc create mode 100644 sbsheriff/Lib/site-packages/idna/codec.py create mode 100644 sbsheriff/Lib/site-packages/idna/compat.py create mode 100644 sbsheriff/Lib/site-packages/idna/core.py create mode 100644 sbsheriff/Lib/site-packages/idna/idnadata.py create mode 100644 sbsheriff/Lib/site-packages/idna/intranges.py create mode 100644 sbsheriff/Lib/site-packages/idna/package_data.py create mode 100644 sbsheriff/Lib/site-packages/idna/py.typed create mode 100644 sbsheriff/Lib/site-packages/idna/uts46data.py create mode 100644 sbsheriff/Lib/site-packages/multidict-6.0.2.dist-info/INSTALLER create mode 100644 sbsheriff/Lib/site-packages/multidict-6.0.2.dist-info/LICENSE create mode 100644 sbsheriff/Lib/site-packages/multidict-6.0.2.dist-info/METADATA create mode 100644 sbsheriff/Lib/site-packages/multidict-6.0.2.dist-info/RECORD create mode 100644 sbsheriff/Lib/site-packages/multidict-6.0.2.dist-info/WHEEL create mode 100644 sbsheriff/Lib/site-packages/multidict-6.0.2.dist-info/top_level.txt create mode 100644 sbsheriff/Lib/site-packages/multidict/__init__.py create mode 100644 sbsheriff/Lib/site-packages/multidict/__init__.pyi create mode 100644 sbsheriff/Lib/site-packages/multidict/__pycache__/__init__.cpython-310.pyc create mode 100644 sbsheriff/Lib/site-packages/multidict/__pycache__/_abc.cpython-310.pyc create mode 100644 sbsheriff/Lib/site-packages/multidict/__pycache__/_compat.cpython-310.pyc create mode 100644 sbsheriff/Lib/site-packages/multidict/__pycache__/_multidict_base.cpython-310.pyc create mode 100644 sbsheriff/Lib/site-packages/multidict/__pycache__/_multidict_py.cpython-310.pyc create mode 100644 sbsheriff/Lib/site-packages/multidict/_abc.py create mode 100644 sbsheriff/Lib/site-packages/multidict/_compat.py create mode 100644 sbsheriff/Lib/site-packages/multidict/_multidict.cp310-win_amd64.pyd create mode 100644 sbsheriff/Lib/site-packages/multidict/_multidict_base.py create mode 100644 sbsheriff/Lib/site-packages/multidict/_multidict_py.py create mode 100644 sbsheriff/Lib/site-packages/multidict/py.typed create mode 100644 sbsheriff/Lib/site-packages/pip-22.0.4.dist-info/INSTALLER create mode 100644 sbsheriff/Lib/site-packages/pip-22.0.4.dist-info/LICENSE.txt create mode 100644 sbsheriff/Lib/site-packages/pip-22.0.4.dist-info/METADATA create mode 100644 sbsheriff/Lib/site-packages/pip-22.0.4.dist-info/RECORD create mode 100644 sbsheriff/Lib/site-packages/pip-22.0.4.dist-info/REQUESTED create mode 100644 sbsheriff/Lib/site-packages/pip-22.0.4.dist-info/WHEEL create mode 100644 sbsheriff/Lib/site-packages/pip-22.0.4.dist-info/entry_points.txt create mode 100644 sbsheriff/Lib/site-packages/pip-22.0.4.dist-info/top_level.txt create mode 100644 sbsheriff/Lib/site-packages/pip/__init__.py create mode 100644 sbsheriff/Lib/site-packages/pip/__main__.py create mode 100644 sbsheriff/Lib/site-packages/pip/__pycache__/__init__.cpython-310.pyc create mode 100644 sbsheriff/Lib/site-packages/pip/__pycache__/__main__.cpython-310.pyc create mode 100644 sbsheriff/Lib/site-packages/pip/_internal/__init__.py create mode 100644 sbsheriff/Lib/site-packages/pip/_internal/__pycache__/__init__.cpython-310.pyc create mode 100644 sbsheriff/Lib/site-packages/pip/_internal/__pycache__/build_env.cpython-310.pyc create mode 100644 sbsheriff/Lib/site-packages/pip/_internal/__pycache__/cache.cpython-310.pyc create mode 100644 sbsheriff/Lib/site-packages/pip/_internal/__pycache__/configuration.cpython-310.pyc create mode 100644 sbsheriff/Lib/site-packages/pip/_internal/__pycache__/exceptions.cpython-310.pyc create mode 100644 sbsheriff/Lib/site-packages/pip/_internal/__pycache__/main.cpython-310.pyc create mode 100644 sbsheriff/Lib/site-packages/pip/_internal/__pycache__/pyproject.cpython-310.pyc create mode 100644 sbsheriff/Lib/site-packages/pip/_internal/__pycache__/self_outdated_check.cpython-310.pyc create mode 100644 sbsheriff/Lib/site-packages/pip/_internal/__pycache__/wheel_builder.cpython-310.pyc create mode 100644 sbsheriff/Lib/site-packages/pip/_internal/build_env.py create mode 100644 sbsheriff/Lib/site-packages/pip/_internal/cache.py create mode 100644 sbsheriff/Lib/site-packages/pip/_internal/cli/__init__.py create mode 100644 sbsheriff/Lib/site-packages/pip/_internal/cli/__pycache__/__init__.cpython-310.pyc create mode 100644 sbsheriff/Lib/site-packages/pip/_internal/cli/__pycache__/autocompletion.cpython-310.pyc create mode 100644 sbsheriff/Lib/site-packages/pip/_internal/cli/__pycache__/base_command.cpython-310.pyc create mode 100644 sbsheriff/Lib/site-packages/pip/_internal/cli/__pycache__/cmdoptions.cpython-310.pyc create mode 100644 sbsheriff/Lib/site-packages/pip/_internal/cli/__pycache__/command_context.cpython-310.pyc create mode 100644 sbsheriff/Lib/site-packages/pip/_internal/cli/__pycache__/main.cpython-310.pyc create mode 100644 sbsheriff/Lib/site-packages/pip/_internal/cli/__pycache__/main_parser.cpython-310.pyc create mode 100644 sbsheriff/Lib/site-packages/pip/_internal/cli/__pycache__/parser.cpython-310.pyc create mode 100644 sbsheriff/Lib/site-packages/pip/_internal/cli/__pycache__/progress_bars.cpython-310.pyc create mode 100644 sbsheriff/Lib/site-packages/pip/_internal/cli/__pycache__/req_command.cpython-310.pyc create mode 100644 sbsheriff/Lib/site-packages/pip/_internal/cli/__pycache__/spinners.cpython-310.pyc create mode 100644 sbsheriff/Lib/site-packages/pip/_internal/cli/__pycache__/status_codes.cpython-310.pyc create mode 100644 sbsheriff/Lib/site-packages/pip/_internal/cli/autocompletion.py create mode 100644 sbsheriff/Lib/site-packages/pip/_internal/cli/base_command.py create mode 100644 sbsheriff/Lib/site-packages/pip/_internal/cli/cmdoptions.py create mode 100644 sbsheriff/Lib/site-packages/pip/_internal/cli/command_context.py create mode 100644 sbsheriff/Lib/site-packages/pip/_internal/cli/main.py create mode 100644 sbsheriff/Lib/site-packages/pip/_internal/cli/main_parser.py create mode 100644 sbsheriff/Lib/site-packages/pip/_internal/cli/parser.py create mode 100644 sbsheriff/Lib/site-packages/pip/_internal/cli/progress_bars.py create mode 100644 sbsheriff/Lib/site-packages/pip/_internal/cli/req_command.py create mode 100644 sbsheriff/Lib/site-packages/pip/_internal/cli/spinners.py create mode 100644 sbsheriff/Lib/site-packages/pip/_internal/cli/status_codes.py create mode 100644 sbsheriff/Lib/site-packages/pip/_internal/commands/__init__.py create mode 100644 sbsheriff/Lib/site-packages/pip/_internal/commands/__pycache__/__init__.cpython-310.pyc create mode 100644 sbsheriff/Lib/site-packages/pip/_internal/commands/__pycache__/cache.cpython-310.pyc create mode 100644 sbsheriff/Lib/site-packages/pip/_internal/commands/__pycache__/check.cpython-310.pyc create mode 100644 sbsheriff/Lib/site-packages/pip/_internal/commands/__pycache__/completion.cpython-310.pyc create mode 100644 sbsheriff/Lib/site-packages/pip/_internal/commands/__pycache__/configuration.cpython-310.pyc create mode 100644 sbsheriff/Lib/site-packages/pip/_internal/commands/__pycache__/debug.cpython-310.pyc create mode 100644 sbsheriff/Lib/site-packages/pip/_internal/commands/__pycache__/download.cpython-310.pyc create mode 100644 sbsheriff/Lib/site-packages/pip/_internal/commands/__pycache__/freeze.cpython-310.pyc create mode 100644 sbsheriff/Lib/site-packages/pip/_internal/commands/__pycache__/hash.cpython-310.pyc create mode 100644 sbsheriff/Lib/site-packages/pip/_internal/commands/__pycache__/help.cpython-310.pyc create mode 100644 sbsheriff/Lib/site-packages/pip/_internal/commands/__pycache__/index.cpython-310.pyc create mode 100644 sbsheriff/Lib/site-packages/pip/_internal/commands/__pycache__/install.cpython-310.pyc create mode 100644 sbsheriff/Lib/site-packages/pip/_internal/commands/__pycache__/list.cpython-310.pyc create mode 100644 sbsheriff/Lib/site-packages/pip/_internal/commands/__pycache__/search.cpython-310.pyc create mode 100644 sbsheriff/Lib/site-packages/pip/_internal/commands/__pycache__/show.cpython-310.pyc create mode 100644 sbsheriff/Lib/site-packages/pip/_internal/commands/__pycache__/uninstall.cpython-310.pyc create mode 100644 sbsheriff/Lib/site-packages/pip/_internal/commands/__pycache__/wheel.cpython-310.pyc create mode 100644 sbsheriff/Lib/site-packages/pip/_internal/commands/cache.py create mode 100644 sbsheriff/Lib/site-packages/pip/_internal/commands/check.py create mode 100644 sbsheriff/Lib/site-packages/pip/_internal/commands/completion.py create mode 100644 sbsheriff/Lib/site-packages/pip/_internal/commands/configuration.py create mode 100644 sbsheriff/Lib/site-packages/pip/_internal/commands/debug.py create mode 100644 sbsheriff/Lib/site-packages/pip/_internal/commands/download.py create mode 100644 sbsheriff/Lib/site-packages/pip/_internal/commands/freeze.py create mode 100644 sbsheriff/Lib/site-packages/pip/_internal/commands/hash.py create mode 100644 sbsheriff/Lib/site-packages/pip/_internal/commands/help.py create mode 100644 sbsheriff/Lib/site-packages/pip/_internal/commands/index.py create mode 100644 sbsheriff/Lib/site-packages/pip/_internal/commands/install.py create mode 100644 sbsheriff/Lib/site-packages/pip/_internal/commands/list.py create mode 100644 sbsheriff/Lib/site-packages/pip/_internal/commands/search.py create mode 100644 sbsheriff/Lib/site-packages/pip/_internal/commands/show.py create mode 100644 sbsheriff/Lib/site-packages/pip/_internal/commands/uninstall.py create mode 100644 sbsheriff/Lib/site-packages/pip/_internal/commands/wheel.py create mode 100644 sbsheriff/Lib/site-packages/pip/_internal/configuration.py create mode 100644 sbsheriff/Lib/site-packages/pip/_internal/distributions/__init__.py create mode 100644 sbsheriff/Lib/site-packages/pip/_internal/distributions/__pycache__/__init__.cpython-310.pyc create mode 100644 sbsheriff/Lib/site-packages/pip/_internal/distributions/__pycache__/base.cpython-310.pyc create mode 100644 sbsheriff/Lib/site-packages/pip/_internal/distributions/__pycache__/installed.cpython-310.pyc create mode 100644 sbsheriff/Lib/site-packages/pip/_internal/distributions/__pycache__/sdist.cpython-310.pyc create mode 100644 sbsheriff/Lib/site-packages/pip/_internal/distributions/__pycache__/wheel.cpython-310.pyc create mode 100644 sbsheriff/Lib/site-packages/pip/_internal/distributions/base.py create mode 100644 sbsheriff/Lib/site-packages/pip/_internal/distributions/installed.py create mode 100644 sbsheriff/Lib/site-packages/pip/_internal/distributions/sdist.py create mode 100644 sbsheriff/Lib/site-packages/pip/_internal/distributions/wheel.py create mode 100644 sbsheriff/Lib/site-packages/pip/_internal/exceptions.py create mode 100644 sbsheriff/Lib/site-packages/pip/_internal/index/__init__.py create mode 100644 sbsheriff/Lib/site-packages/pip/_internal/index/__pycache__/__init__.cpython-310.pyc create mode 100644 sbsheriff/Lib/site-packages/pip/_internal/index/__pycache__/collector.cpython-310.pyc create mode 100644 sbsheriff/Lib/site-packages/pip/_internal/index/__pycache__/package_finder.cpython-310.pyc create mode 100644 sbsheriff/Lib/site-packages/pip/_internal/index/__pycache__/sources.cpython-310.pyc create mode 100644 sbsheriff/Lib/site-packages/pip/_internal/index/collector.py create mode 100644 sbsheriff/Lib/site-packages/pip/_internal/index/package_finder.py create mode 100644 sbsheriff/Lib/site-packages/pip/_internal/index/sources.py create mode 100644 sbsheriff/Lib/site-packages/pip/_internal/locations/__init__.py create mode 100644 sbsheriff/Lib/site-packages/pip/_internal/locations/__pycache__/__init__.cpython-310.pyc create mode 100644 sbsheriff/Lib/site-packages/pip/_internal/locations/__pycache__/_distutils.cpython-310.pyc create mode 100644 sbsheriff/Lib/site-packages/pip/_internal/locations/__pycache__/_sysconfig.cpython-310.pyc create mode 100644 sbsheriff/Lib/site-packages/pip/_internal/locations/__pycache__/base.cpython-310.pyc create mode 100644 sbsheriff/Lib/site-packages/pip/_internal/locations/_distutils.py create mode 100644 sbsheriff/Lib/site-packages/pip/_internal/locations/_sysconfig.py create mode 100644 sbsheriff/Lib/site-packages/pip/_internal/locations/base.py create mode 100644 sbsheriff/Lib/site-packages/pip/_internal/main.py create mode 100644 sbsheriff/Lib/site-packages/pip/_internal/metadata/__init__.py create mode 100644 sbsheriff/Lib/site-packages/pip/_internal/metadata/__pycache__/__init__.cpython-310.pyc create mode 100644 sbsheriff/Lib/site-packages/pip/_internal/metadata/__pycache__/base.cpython-310.pyc create mode 100644 sbsheriff/Lib/site-packages/pip/_internal/metadata/__pycache__/pkg_resources.cpython-310.pyc create mode 100644 sbsheriff/Lib/site-packages/pip/_internal/metadata/base.py create mode 100644 sbsheriff/Lib/site-packages/pip/_internal/metadata/pkg_resources.py create mode 100644 sbsheriff/Lib/site-packages/pip/_internal/models/__init__.py create mode 100644 sbsheriff/Lib/site-packages/pip/_internal/models/__pycache__/__init__.cpython-310.pyc create mode 100644 sbsheriff/Lib/site-packages/pip/_internal/models/__pycache__/candidate.cpython-310.pyc create mode 100644 sbsheriff/Lib/site-packages/pip/_internal/models/__pycache__/direct_url.cpython-310.pyc create mode 100644 sbsheriff/Lib/site-packages/pip/_internal/models/__pycache__/format_control.cpython-310.pyc create mode 100644 sbsheriff/Lib/site-packages/pip/_internal/models/__pycache__/index.cpython-310.pyc create mode 100644 sbsheriff/Lib/site-packages/pip/_internal/models/__pycache__/link.cpython-310.pyc create mode 100644 sbsheriff/Lib/site-packages/pip/_internal/models/__pycache__/scheme.cpython-310.pyc create mode 100644 sbsheriff/Lib/site-packages/pip/_internal/models/__pycache__/search_scope.cpython-310.pyc create mode 100644 sbsheriff/Lib/site-packages/pip/_internal/models/__pycache__/selection_prefs.cpython-310.pyc create mode 100644 sbsheriff/Lib/site-packages/pip/_internal/models/__pycache__/target_python.cpython-310.pyc create mode 100644 sbsheriff/Lib/site-packages/pip/_internal/models/__pycache__/wheel.cpython-310.pyc create mode 100644 sbsheriff/Lib/site-packages/pip/_internal/models/candidate.py create mode 100644 sbsheriff/Lib/site-packages/pip/_internal/models/direct_url.py create mode 100644 sbsheriff/Lib/site-packages/pip/_internal/models/format_control.py create mode 100644 sbsheriff/Lib/site-packages/pip/_internal/models/index.py create mode 100644 sbsheriff/Lib/site-packages/pip/_internal/models/link.py create mode 100644 sbsheriff/Lib/site-packages/pip/_internal/models/scheme.py create mode 100644 sbsheriff/Lib/site-packages/pip/_internal/models/search_scope.py create mode 100644 sbsheriff/Lib/site-packages/pip/_internal/models/selection_prefs.py create mode 100644 sbsheriff/Lib/site-packages/pip/_internal/models/target_python.py create mode 100644 sbsheriff/Lib/site-packages/pip/_internal/models/wheel.py create mode 100644 sbsheriff/Lib/site-packages/pip/_internal/network/__init__.py create mode 100644 sbsheriff/Lib/site-packages/pip/_internal/network/__pycache__/__init__.cpython-310.pyc create mode 100644 sbsheriff/Lib/site-packages/pip/_internal/network/__pycache__/auth.cpython-310.pyc create mode 100644 sbsheriff/Lib/site-packages/pip/_internal/network/__pycache__/cache.cpython-310.pyc create mode 100644 sbsheriff/Lib/site-packages/pip/_internal/network/__pycache__/download.cpython-310.pyc create mode 100644 sbsheriff/Lib/site-packages/pip/_internal/network/__pycache__/lazy_wheel.cpython-310.pyc create mode 100644 sbsheriff/Lib/site-packages/pip/_internal/network/__pycache__/session.cpython-310.pyc create mode 100644 sbsheriff/Lib/site-packages/pip/_internal/network/__pycache__/utils.cpython-310.pyc create mode 100644 sbsheriff/Lib/site-packages/pip/_internal/network/__pycache__/xmlrpc.cpython-310.pyc create mode 100644 sbsheriff/Lib/site-packages/pip/_internal/network/auth.py create mode 100644 sbsheriff/Lib/site-packages/pip/_internal/network/cache.py create mode 100644 sbsheriff/Lib/site-packages/pip/_internal/network/download.py create mode 100644 sbsheriff/Lib/site-packages/pip/_internal/network/lazy_wheel.py create mode 100644 sbsheriff/Lib/site-packages/pip/_internal/network/session.py create mode 100644 sbsheriff/Lib/site-packages/pip/_internal/network/utils.py create mode 100644 sbsheriff/Lib/site-packages/pip/_internal/network/xmlrpc.py create mode 100644 sbsheriff/Lib/site-packages/pip/_internal/operations/__init__.py create mode 100644 sbsheriff/Lib/site-packages/pip/_internal/operations/__pycache__/__init__.cpython-310.pyc create mode 100644 sbsheriff/Lib/site-packages/pip/_internal/operations/__pycache__/check.cpython-310.pyc create mode 100644 sbsheriff/Lib/site-packages/pip/_internal/operations/__pycache__/freeze.cpython-310.pyc create mode 100644 sbsheriff/Lib/site-packages/pip/_internal/operations/__pycache__/prepare.cpython-310.pyc create mode 100644 sbsheriff/Lib/site-packages/pip/_internal/operations/build/__init__.py create mode 100644 sbsheriff/Lib/site-packages/pip/_internal/operations/build/__pycache__/__init__.cpython-310.pyc create mode 100644 sbsheriff/Lib/site-packages/pip/_internal/operations/build/__pycache__/metadata.cpython-310.pyc create mode 100644 sbsheriff/Lib/site-packages/pip/_internal/operations/build/__pycache__/metadata_editable.cpython-310.pyc create mode 100644 sbsheriff/Lib/site-packages/pip/_internal/operations/build/__pycache__/metadata_legacy.cpython-310.pyc create mode 100644 sbsheriff/Lib/site-packages/pip/_internal/operations/build/__pycache__/wheel.cpython-310.pyc create mode 100644 sbsheriff/Lib/site-packages/pip/_internal/operations/build/__pycache__/wheel_editable.cpython-310.pyc create mode 100644 sbsheriff/Lib/site-packages/pip/_internal/operations/build/__pycache__/wheel_legacy.cpython-310.pyc create mode 100644 sbsheriff/Lib/site-packages/pip/_internal/operations/build/metadata.py create mode 100644 sbsheriff/Lib/site-packages/pip/_internal/operations/build/metadata_editable.py create mode 100644 sbsheriff/Lib/site-packages/pip/_internal/operations/build/metadata_legacy.py create mode 100644 sbsheriff/Lib/site-packages/pip/_internal/operations/build/wheel.py create mode 100644 sbsheriff/Lib/site-packages/pip/_internal/operations/build/wheel_editable.py create mode 100644 sbsheriff/Lib/site-packages/pip/_internal/operations/build/wheel_legacy.py create mode 100644 sbsheriff/Lib/site-packages/pip/_internal/operations/check.py create mode 100644 sbsheriff/Lib/site-packages/pip/_internal/operations/freeze.py create mode 100644 sbsheriff/Lib/site-packages/pip/_internal/operations/install/__init__.py create mode 100644 sbsheriff/Lib/site-packages/pip/_internal/operations/install/__pycache__/__init__.cpython-310.pyc create mode 100644 sbsheriff/Lib/site-packages/pip/_internal/operations/install/__pycache__/editable_legacy.cpython-310.pyc create mode 100644 sbsheriff/Lib/site-packages/pip/_internal/operations/install/__pycache__/legacy.cpython-310.pyc create mode 100644 sbsheriff/Lib/site-packages/pip/_internal/operations/install/__pycache__/wheel.cpython-310.pyc create mode 100644 sbsheriff/Lib/site-packages/pip/_internal/operations/install/editable_legacy.py create mode 100644 sbsheriff/Lib/site-packages/pip/_internal/operations/install/legacy.py create mode 100644 sbsheriff/Lib/site-packages/pip/_internal/operations/install/wheel.py create mode 100644 sbsheriff/Lib/site-packages/pip/_internal/operations/prepare.py create mode 100644 sbsheriff/Lib/site-packages/pip/_internal/pyproject.py create mode 100644 sbsheriff/Lib/site-packages/pip/_internal/req/__init__.py create mode 100644 sbsheriff/Lib/site-packages/pip/_internal/req/__pycache__/__init__.cpython-310.pyc create mode 100644 sbsheriff/Lib/site-packages/pip/_internal/req/__pycache__/constructors.cpython-310.pyc create mode 100644 sbsheriff/Lib/site-packages/pip/_internal/req/__pycache__/req_file.cpython-310.pyc create mode 100644 sbsheriff/Lib/site-packages/pip/_internal/req/__pycache__/req_install.cpython-310.pyc create mode 100644 sbsheriff/Lib/site-packages/pip/_internal/req/__pycache__/req_set.cpython-310.pyc create mode 100644 sbsheriff/Lib/site-packages/pip/_internal/req/__pycache__/req_tracker.cpython-310.pyc create mode 100644 sbsheriff/Lib/site-packages/pip/_internal/req/__pycache__/req_uninstall.cpython-310.pyc create mode 100644 sbsheriff/Lib/site-packages/pip/_internal/req/constructors.py create mode 100644 sbsheriff/Lib/site-packages/pip/_internal/req/req_file.py create mode 100644 sbsheriff/Lib/site-packages/pip/_internal/req/req_install.py create mode 100644 sbsheriff/Lib/site-packages/pip/_internal/req/req_set.py create mode 100644 sbsheriff/Lib/site-packages/pip/_internal/req/req_tracker.py create mode 100644 sbsheriff/Lib/site-packages/pip/_internal/req/req_uninstall.py create mode 100644 sbsheriff/Lib/site-packages/pip/_internal/resolution/__init__.py create mode 100644 sbsheriff/Lib/site-packages/pip/_internal/resolution/__pycache__/__init__.cpython-310.pyc create mode 100644 sbsheriff/Lib/site-packages/pip/_internal/resolution/__pycache__/base.cpython-310.pyc create mode 100644 sbsheriff/Lib/site-packages/pip/_internal/resolution/base.py create mode 100644 sbsheriff/Lib/site-packages/pip/_internal/resolution/legacy/__init__.py create mode 100644 sbsheriff/Lib/site-packages/pip/_internal/resolution/legacy/__pycache__/__init__.cpython-310.pyc create mode 100644 sbsheriff/Lib/site-packages/pip/_internal/resolution/legacy/__pycache__/resolver.cpython-310.pyc create mode 100644 sbsheriff/Lib/site-packages/pip/_internal/resolution/legacy/resolver.py create mode 100644 sbsheriff/Lib/site-packages/pip/_internal/resolution/resolvelib/__init__.py create mode 100644 sbsheriff/Lib/site-packages/pip/_internal/resolution/resolvelib/__pycache__/__init__.cpython-310.pyc create mode 100644 sbsheriff/Lib/site-packages/pip/_internal/resolution/resolvelib/__pycache__/base.cpython-310.pyc create mode 100644 sbsheriff/Lib/site-packages/pip/_internal/resolution/resolvelib/__pycache__/candidates.cpython-310.pyc create mode 100644 sbsheriff/Lib/site-packages/pip/_internal/resolution/resolvelib/__pycache__/factory.cpython-310.pyc create mode 100644 sbsheriff/Lib/site-packages/pip/_internal/resolution/resolvelib/__pycache__/found_candidates.cpython-310.pyc create mode 100644 sbsheriff/Lib/site-packages/pip/_internal/resolution/resolvelib/__pycache__/provider.cpython-310.pyc create mode 100644 sbsheriff/Lib/site-packages/pip/_internal/resolution/resolvelib/__pycache__/reporter.cpython-310.pyc create mode 100644 sbsheriff/Lib/site-packages/pip/_internal/resolution/resolvelib/__pycache__/requirements.cpython-310.pyc create mode 100644 sbsheriff/Lib/site-packages/pip/_internal/resolution/resolvelib/__pycache__/resolver.cpython-310.pyc create mode 100644 sbsheriff/Lib/site-packages/pip/_internal/resolution/resolvelib/base.py create mode 100644 sbsheriff/Lib/site-packages/pip/_internal/resolution/resolvelib/candidates.py create mode 100644 sbsheriff/Lib/site-packages/pip/_internal/resolution/resolvelib/factory.py create mode 100644 sbsheriff/Lib/site-packages/pip/_internal/resolution/resolvelib/found_candidates.py create mode 100644 sbsheriff/Lib/site-packages/pip/_internal/resolution/resolvelib/provider.py create mode 100644 sbsheriff/Lib/site-packages/pip/_internal/resolution/resolvelib/reporter.py create mode 100644 sbsheriff/Lib/site-packages/pip/_internal/resolution/resolvelib/requirements.py create mode 100644 sbsheriff/Lib/site-packages/pip/_internal/resolution/resolvelib/resolver.py create mode 100644 sbsheriff/Lib/site-packages/pip/_internal/self_outdated_check.py create mode 100644 sbsheriff/Lib/site-packages/pip/_internal/utils/__init__.py create mode 100644 sbsheriff/Lib/site-packages/pip/_internal/utils/__pycache__/__init__.cpython-310.pyc create mode 100644 sbsheriff/Lib/site-packages/pip/_internal/utils/__pycache__/_log.cpython-310.pyc create mode 100644 sbsheriff/Lib/site-packages/pip/_internal/utils/__pycache__/appdirs.cpython-310.pyc create mode 100644 sbsheriff/Lib/site-packages/pip/_internal/utils/__pycache__/compat.cpython-310.pyc create mode 100644 sbsheriff/Lib/site-packages/pip/_internal/utils/__pycache__/compatibility_tags.cpython-310.pyc create mode 100644 sbsheriff/Lib/site-packages/pip/_internal/utils/__pycache__/datetime.cpython-310.pyc create mode 100644 sbsheriff/Lib/site-packages/pip/_internal/utils/__pycache__/deprecation.cpython-310.pyc create mode 100644 sbsheriff/Lib/site-packages/pip/_internal/utils/__pycache__/direct_url_helpers.cpython-310.pyc create mode 100644 sbsheriff/Lib/site-packages/pip/_internal/utils/__pycache__/distutils_args.cpython-310.pyc create mode 100644 sbsheriff/Lib/site-packages/pip/_internal/utils/__pycache__/egg_link.cpython-310.pyc create mode 100644 sbsheriff/Lib/site-packages/pip/_internal/utils/__pycache__/encoding.cpython-310.pyc create mode 100644 sbsheriff/Lib/site-packages/pip/_internal/utils/__pycache__/entrypoints.cpython-310.pyc create mode 100644 sbsheriff/Lib/site-packages/pip/_internal/utils/__pycache__/filesystem.cpython-310.pyc create mode 100644 sbsheriff/Lib/site-packages/pip/_internal/utils/__pycache__/filetypes.cpython-310.pyc create mode 100644 sbsheriff/Lib/site-packages/pip/_internal/utils/__pycache__/glibc.cpython-310.pyc create mode 100644 sbsheriff/Lib/site-packages/pip/_internal/utils/__pycache__/hashes.cpython-310.pyc create mode 100644 sbsheriff/Lib/site-packages/pip/_internal/utils/__pycache__/inject_securetransport.cpython-310.pyc create mode 100644 sbsheriff/Lib/site-packages/pip/_internal/utils/__pycache__/logging.cpython-310.pyc create mode 100644 sbsheriff/Lib/site-packages/pip/_internal/utils/__pycache__/misc.cpython-310.pyc create mode 100644 sbsheriff/Lib/site-packages/pip/_internal/utils/__pycache__/models.cpython-310.pyc create mode 100644 sbsheriff/Lib/site-packages/pip/_internal/utils/__pycache__/packaging.cpython-310.pyc create mode 100644 sbsheriff/Lib/site-packages/pip/_internal/utils/__pycache__/setuptools_build.cpython-310.pyc create mode 100644 sbsheriff/Lib/site-packages/pip/_internal/utils/__pycache__/subprocess.cpython-310.pyc create mode 100644 sbsheriff/Lib/site-packages/pip/_internal/utils/__pycache__/temp_dir.cpython-310.pyc create mode 100644 sbsheriff/Lib/site-packages/pip/_internal/utils/__pycache__/unpacking.cpython-310.pyc create mode 100644 sbsheriff/Lib/site-packages/pip/_internal/utils/__pycache__/urls.cpython-310.pyc create mode 100644 sbsheriff/Lib/site-packages/pip/_internal/utils/__pycache__/virtualenv.cpython-310.pyc create mode 100644 sbsheriff/Lib/site-packages/pip/_internal/utils/__pycache__/wheel.cpython-310.pyc create mode 100644 sbsheriff/Lib/site-packages/pip/_internal/utils/_log.py create mode 100644 sbsheriff/Lib/site-packages/pip/_internal/utils/appdirs.py create mode 100644 sbsheriff/Lib/site-packages/pip/_internal/utils/compat.py create mode 100644 sbsheriff/Lib/site-packages/pip/_internal/utils/compatibility_tags.py create mode 100644 sbsheriff/Lib/site-packages/pip/_internal/utils/datetime.py create mode 100644 sbsheriff/Lib/site-packages/pip/_internal/utils/deprecation.py create mode 100644 sbsheriff/Lib/site-packages/pip/_internal/utils/direct_url_helpers.py create mode 100644 sbsheriff/Lib/site-packages/pip/_internal/utils/distutils_args.py create mode 100644 sbsheriff/Lib/site-packages/pip/_internal/utils/egg_link.py create mode 100644 sbsheriff/Lib/site-packages/pip/_internal/utils/encoding.py create mode 100644 sbsheriff/Lib/site-packages/pip/_internal/utils/entrypoints.py create mode 100644 sbsheriff/Lib/site-packages/pip/_internal/utils/filesystem.py create mode 100644 sbsheriff/Lib/site-packages/pip/_internal/utils/filetypes.py create mode 100644 sbsheriff/Lib/site-packages/pip/_internal/utils/glibc.py create mode 100644 sbsheriff/Lib/site-packages/pip/_internal/utils/hashes.py create mode 100644 sbsheriff/Lib/site-packages/pip/_internal/utils/inject_securetransport.py create mode 100644 sbsheriff/Lib/site-packages/pip/_internal/utils/logging.py create mode 100644 sbsheriff/Lib/site-packages/pip/_internal/utils/misc.py create mode 100644 sbsheriff/Lib/site-packages/pip/_internal/utils/models.py create mode 100644 sbsheriff/Lib/site-packages/pip/_internal/utils/packaging.py create mode 100644 sbsheriff/Lib/site-packages/pip/_internal/utils/setuptools_build.py create mode 100644 sbsheriff/Lib/site-packages/pip/_internal/utils/subprocess.py create mode 100644 sbsheriff/Lib/site-packages/pip/_internal/utils/temp_dir.py create mode 100644 sbsheriff/Lib/site-packages/pip/_internal/utils/unpacking.py create mode 100644 sbsheriff/Lib/site-packages/pip/_internal/utils/urls.py create mode 100644 sbsheriff/Lib/site-packages/pip/_internal/utils/virtualenv.py create mode 100644 sbsheriff/Lib/site-packages/pip/_internal/utils/wheel.py create mode 100644 sbsheriff/Lib/site-packages/pip/_internal/vcs/__init__.py create mode 100644 sbsheriff/Lib/site-packages/pip/_internal/vcs/__pycache__/__init__.cpython-310.pyc create mode 100644 sbsheriff/Lib/site-packages/pip/_internal/vcs/__pycache__/bazaar.cpython-310.pyc create mode 100644 sbsheriff/Lib/site-packages/pip/_internal/vcs/__pycache__/git.cpython-310.pyc create mode 100644 sbsheriff/Lib/site-packages/pip/_internal/vcs/__pycache__/mercurial.cpython-310.pyc create mode 100644 sbsheriff/Lib/site-packages/pip/_internal/vcs/__pycache__/subversion.cpython-310.pyc create mode 100644 sbsheriff/Lib/site-packages/pip/_internal/vcs/__pycache__/versioncontrol.cpython-310.pyc create mode 100644 sbsheriff/Lib/site-packages/pip/_internal/vcs/bazaar.py create mode 100644 sbsheriff/Lib/site-packages/pip/_internal/vcs/git.py create mode 100644 sbsheriff/Lib/site-packages/pip/_internal/vcs/mercurial.py create mode 100644 sbsheriff/Lib/site-packages/pip/_internal/vcs/subversion.py create mode 100644 sbsheriff/Lib/site-packages/pip/_internal/vcs/versioncontrol.py create mode 100644 sbsheriff/Lib/site-packages/pip/_internal/wheel_builder.py create mode 100644 sbsheriff/Lib/site-packages/pip/_vendor/__init__.py create mode 100644 sbsheriff/Lib/site-packages/pip/_vendor/__pycache__/__init__.cpython-310.pyc create mode 100644 sbsheriff/Lib/site-packages/pip/_vendor/__pycache__/distro.cpython-310.pyc create mode 100644 sbsheriff/Lib/site-packages/pip/_vendor/__pycache__/six.cpython-310.pyc create mode 100644 sbsheriff/Lib/site-packages/pip/_vendor/__pycache__/typing_extensions.cpython-310.pyc create mode 100644 sbsheriff/Lib/site-packages/pip/_vendor/cachecontrol/__init__.py create mode 100644 sbsheriff/Lib/site-packages/pip/_vendor/cachecontrol/__pycache__/__init__.cpython-310.pyc create mode 100644 sbsheriff/Lib/site-packages/pip/_vendor/cachecontrol/__pycache__/_cmd.cpython-310.pyc create mode 100644 sbsheriff/Lib/site-packages/pip/_vendor/cachecontrol/__pycache__/adapter.cpython-310.pyc create mode 100644 sbsheriff/Lib/site-packages/pip/_vendor/cachecontrol/__pycache__/cache.cpython-310.pyc create mode 100644 sbsheriff/Lib/site-packages/pip/_vendor/cachecontrol/__pycache__/compat.cpython-310.pyc create mode 100644 sbsheriff/Lib/site-packages/pip/_vendor/cachecontrol/__pycache__/controller.cpython-310.pyc create mode 100644 sbsheriff/Lib/site-packages/pip/_vendor/cachecontrol/__pycache__/filewrapper.cpython-310.pyc create mode 100644 sbsheriff/Lib/site-packages/pip/_vendor/cachecontrol/__pycache__/heuristics.cpython-310.pyc create mode 100644 sbsheriff/Lib/site-packages/pip/_vendor/cachecontrol/__pycache__/serialize.cpython-310.pyc create mode 100644 sbsheriff/Lib/site-packages/pip/_vendor/cachecontrol/__pycache__/wrapper.cpython-310.pyc create mode 100644 sbsheriff/Lib/site-packages/pip/_vendor/cachecontrol/_cmd.py create mode 100644 sbsheriff/Lib/site-packages/pip/_vendor/cachecontrol/adapter.py create mode 100644 sbsheriff/Lib/site-packages/pip/_vendor/cachecontrol/cache.py create mode 100644 sbsheriff/Lib/site-packages/pip/_vendor/cachecontrol/caches/__init__.py create mode 100644 sbsheriff/Lib/site-packages/pip/_vendor/cachecontrol/caches/__pycache__/__init__.cpython-310.pyc create mode 100644 sbsheriff/Lib/site-packages/pip/_vendor/cachecontrol/caches/__pycache__/file_cache.cpython-310.pyc create mode 100644 sbsheriff/Lib/site-packages/pip/_vendor/cachecontrol/caches/__pycache__/redis_cache.cpython-310.pyc create mode 100644 sbsheriff/Lib/site-packages/pip/_vendor/cachecontrol/caches/file_cache.py create mode 100644 sbsheriff/Lib/site-packages/pip/_vendor/cachecontrol/caches/redis_cache.py create mode 100644 sbsheriff/Lib/site-packages/pip/_vendor/cachecontrol/compat.py create mode 100644 sbsheriff/Lib/site-packages/pip/_vendor/cachecontrol/controller.py create mode 100644 sbsheriff/Lib/site-packages/pip/_vendor/cachecontrol/filewrapper.py create mode 100644 sbsheriff/Lib/site-packages/pip/_vendor/cachecontrol/heuristics.py create mode 100644 sbsheriff/Lib/site-packages/pip/_vendor/cachecontrol/serialize.py create mode 100644 sbsheriff/Lib/site-packages/pip/_vendor/cachecontrol/wrapper.py create mode 100644 sbsheriff/Lib/site-packages/pip/_vendor/certifi/__init__.py create mode 100644 sbsheriff/Lib/site-packages/pip/_vendor/certifi/__main__.py create mode 100644 sbsheriff/Lib/site-packages/pip/_vendor/certifi/__pycache__/__init__.cpython-310.pyc create mode 100644 sbsheriff/Lib/site-packages/pip/_vendor/certifi/__pycache__/__main__.cpython-310.pyc create mode 100644 sbsheriff/Lib/site-packages/pip/_vendor/certifi/__pycache__/core.cpython-310.pyc create mode 100644 sbsheriff/Lib/site-packages/pip/_vendor/certifi/cacert.pem create mode 100644 sbsheriff/Lib/site-packages/pip/_vendor/certifi/core.py create mode 100644 sbsheriff/Lib/site-packages/pip/_vendor/chardet/__init__.py create mode 100644 sbsheriff/Lib/site-packages/pip/_vendor/chardet/__pycache__/__init__.cpython-310.pyc create mode 100644 sbsheriff/Lib/site-packages/pip/_vendor/chardet/__pycache__/big5freq.cpython-310.pyc create mode 100644 sbsheriff/Lib/site-packages/pip/_vendor/chardet/__pycache__/big5prober.cpython-310.pyc create mode 100644 sbsheriff/Lib/site-packages/pip/_vendor/chardet/__pycache__/chardistribution.cpython-310.pyc create mode 100644 sbsheriff/Lib/site-packages/pip/_vendor/chardet/__pycache__/charsetgroupprober.cpython-310.pyc create mode 100644 sbsheriff/Lib/site-packages/pip/_vendor/chardet/__pycache__/charsetprober.cpython-310.pyc create mode 100644 sbsheriff/Lib/site-packages/pip/_vendor/chardet/__pycache__/codingstatemachine.cpython-310.pyc create mode 100644 sbsheriff/Lib/site-packages/pip/_vendor/chardet/__pycache__/compat.cpython-310.pyc create mode 100644 sbsheriff/Lib/site-packages/pip/_vendor/chardet/__pycache__/cp949prober.cpython-310.pyc create mode 100644 sbsheriff/Lib/site-packages/pip/_vendor/chardet/__pycache__/enums.cpython-310.pyc create mode 100644 sbsheriff/Lib/site-packages/pip/_vendor/chardet/__pycache__/escprober.cpython-310.pyc create mode 100644 sbsheriff/Lib/site-packages/pip/_vendor/chardet/__pycache__/escsm.cpython-310.pyc create mode 100644 sbsheriff/Lib/site-packages/pip/_vendor/chardet/__pycache__/eucjpprober.cpython-310.pyc create mode 100644 sbsheriff/Lib/site-packages/pip/_vendor/chardet/__pycache__/euckrfreq.cpython-310.pyc create mode 100644 sbsheriff/Lib/site-packages/pip/_vendor/chardet/__pycache__/euckrprober.cpython-310.pyc create mode 100644 sbsheriff/Lib/site-packages/pip/_vendor/chardet/__pycache__/euctwfreq.cpython-310.pyc create mode 100644 sbsheriff/Lib/site-packages/pip/_vendor/chardet/__pycache__/euctwprober.cpython-310.pyc create mode 100644 sbsheriff/Lib/site-packages/pip/_vendor/chardet/__pycache__/gb2312freq.cpython-310.pyc create mode 100644 sbsheriff/Lib/site-packages/pip/_vendor/chardet/__pycache__/gb2312prober.cpython-310.pyc create mode 100644 sbsheriff/Lib/site-packages/pip/_vendor/chardet/__pycache__/hebrewprober.cpython-310.pyc create mode 100644 sbsheriff/Lib/site-packages/pip/_vendor/chardet/__pycache__/jisfreq.cpython-310.pyc create mode 100644 sbsheriff/Lib/site-packages/pip/_vendor/chardet/__pycache__/jpcntx.cpython-310.pyc create mode 100644 sbsheriff/Lib/site-packages/pip/_vendor/chardet/__pycache__/langbulgarianmodel.cpython-310.pyc create mode 100644 sbsheriff/Lib/site-packages/pip/_vendor/chardet/__pycache__/langgreekmodel.cpython-310.pyc create mode 100644 sbsheriff/Lib/site-packages/pip/_vendor/chardet/__pycache__/langhebrewmodel.cpython-310.pyc create mode 100644 sbsheriff/Lib/site-packages/pip/_vendor/chardet/__pycache__/langhungarianmodel.cpython-310.pyc create mode 100644 sbsheriff/Lib/site-packages/pip/_vendor/chardet/__pycache__/langrussianmodel.cpython-310.pyc create mode 100644 sbsheriff/Lib/site-packages/pip/_vendor/chardet/__pycache__/langthaimodel.cpython-310.pyc create mode 100644 sbsheriff/Lib/site-packages/pip/_vendor/chardet/__pycache__/langturkishmodel.cpython-310.pyc create mode 100644 sbsheriff/Lib/site-packages/pip/_vendor/chardet/__pycache__/latin1prober.cpython-310.pyc create mode 100644 sbsheriff/Lib/site-packages/pip/_vendor/chardet/__pycache__/mbcharsetprober.cpython-310.pyc create mode 100644 sbsheriff/Lib/site-packages/pip/_vendor/chardet/__pycache__/mbcsgroupprober.cpython-310.pyc create mode 100644 sbsheriff/Lib/site-packages/pip/_vendor/chardet/__pycache__/mbcssm.cpython-310.pyc create mode 100644 sbsheriff/Lib/site-packages/pip/_vendor/chardet/__pycache__/sbcharsetprober.cpython-310.pyc create mode 100644 sbsheriff/Lib/site-packages/pip/_vendor/chardet/__pycache__/sbcsgroupprober.cpython-310.pyc create mode 100644 sbsheriff/Lib/site-packages/pip/_vendor/chardet/__pycache__/sjisprober.cpython-310.pyc create mode 100644 sbsheriff/Lib/site-packages/pip/_vendor/chardet/__pycache__/universaldetector.cpython-310.pyc create mode 100644 sbsheriff/Lib/site-packages/pip/_vendor/chardet/__pycache__/utf8prober.cpython-310.pyc create mode 100644 sbsheriff/Lib/site-packages/pip/_vendor/chardet/__pycache__/version.cpython-310.pyc create mode 100644 sbsheriff/Lib/site-packages/pip/_vendor/chardet/big5freq.py create mode 100644 sbsheriff/Lib/site-packages/pip/_vendor/chardet/big5prober.py create mode 100644 sbsheriff/Lib/site-packages/pip/_vendor/chardet/chardistribution.py create mode 100644 sbsheriff/Lib/site-packages/pip/_vendor/chardet/charsetgroupprober.py create mode 100644 sbsheriff/Lib/site-packages/pip/_vendor/chardet/charsetprober.py create mode 100644 sbsheriff/Lib/site-packages/pip/_vendor/chardet/cli/__init__.py create mode 100644 sbsheriff/Lib/site-packages/pip/_vendor/chardet/cli/__pycache__/__init__.cpython-310.pyc create mode 100644 sbsheriff/Lib/site-packages/pip/_vendor/chardet/cli/__pycache__/chardetect.cpython-310.pyc create mode 100644 sbsheriff/Lib/site-packages/pip/_vendor/chardet/cli/chardetect.py create mode 100644 sbsheriff/Lib/site-packages/pip/_vendor/chardet/codingstatemachine.py create mode 100644 sbsheriff/Lib/site-packages/pip/_vendor/chardet/compat.py create mode 100644 sbsheriff/Lib/site-packages/pip/_vendor/chardet/cp949prober.py create mode 100644 sbsheriff/Lib/site-packages/pip/_vendor/chardet/enums.py create mode 100644 sbsheriff/Lib/site-packages/pip/_vendor/chardet/escprober.py create mode 100644 sbsheriff/Lib/site-packages/pip/_vendor/chardet/escsm.py create mode 100644 sbsheriff/Lib/site-packages/pip/_vendor/chardet/eucjpprober.py create mode 100644 sbsheriff/Lib/site-packages/pip/_vendor/chardet/euckrfreq.py create mode 100644 sbsheriff/Lib/site-packages/pip/_vendor/chardet/euckrprober.py create mode 100644 sbsheriff/Lib/site-packages/pip/_vendor/chardet/euctwfreq.py create mode 100644 sbsheriff/Lib/site-packages/pip/_vendor/chardet/euctwprober.py create mode 100644 sbsheriff/Lib/site-packages/pip/_vendor/chardet/gb2312freq.py create mode 100644 sbsheriff/Lib/site-packages/pip/_vendor/chardet/gb2312prober.py create mode 100644 sbsheriff/Lib/site-packages/pip/_vendor/chardet/hebrewprober.py create mode 100644 sbsheriff/Lib/site-packages/pip/_vendor/chardet/jisfreq.py create mode 100644 sbsheriff/Lib/site-packages/pip/_vendor/chardet/jpcntx.py create mode 100644 sbsheriff/Lib/site-packages/pip/_vendor/chardet/langbulgarianmodel.py create mode 100644 sbsheriff/Lib/site-packages/pip/_vendor/chardet/langgreekmodel.py create mode 100644 sbsheriff/Lib/site-packages/pip/_vendor/chardet/langhebrewmodel.py create mode 100644 sbsheriff/Lib/site-packages/pip/_vendor/chardet/langhungarianmodel.py create mode 100644 sbsheriff/Lib/site-packages/pip/_vendor/chardet/langrussianmodel.py create mode 100644 sbsheriff/Lib/site-packages/pip/_vendor/chardet/langthaimodel.py create mode 100644 sbsheriff/Lib/site-packages/pip/_vendor/chardet/langturkishmodel.py create mode 100644 sbsheriff/Lib/site-packages/pip/_vendor/chardet/latin1prober.py create mode 100644 sbsheriff/Lib/site-packages/pip/_vendor/chardet/mbcharsetprober.py create mode 100644 sbsheriff/Lib/site-packages/pip/_vendor/chardet/mbcsgroupprober.py create mode 100644 sbsheriff/Lib/site-packages/pip/_vendor/chardet/mbcssm.py create mode 100644 sbsheriff/Lib/site-packages/pip/_vendor/chardet/metadata/__init__.py create mode 100644 sbsheriff/Lib/site-packages/pip/_vendor/chardet/metadata/__pycache__/__init__.cpython-310.pyc create mode 100644 sbsheriff/Lib/site-packages/pip/_vendor/chardet/metadata/__pycache__/languages.cpython-310.pyc create mode 100644 sbsheriff/Lib/site-packages/pip/_vendor/chardet/metadata/languages.py create mode 100644 sbsheriff/Lib/site-packages/pip/_vendor/chardet/sbcharsetprober.py create mode 100644 sbsheriff/Lib/site-packages/pip/_vendor/chardet/sbcsgroupprober.py create mode 100644 sbsheriff/Lib/site-packages/pip/_vendor/chardet/sjisprober.py create mode 100644 sbsheriff/Lib/site-packages/pip/_vendor/chardet/universaldetector.py create mode 100644 sbsheriff/Lib/site-packages/pip/_vendor/chardet/utf8prober.py create mode 100644 sbsheriff/Lib/site-packages/pip/_vendor/chardet/version.py create mode 100644 sbsheriff/Lib/site-packages/pip/_vendor/colorama/__init__.py create mode 100644 sbsheriff/Lib/site-packages/pip/_vendor/colorama/__pycache__/__init__.cpython-310.pyc create mode 100644 sbsheriff/Lib/site-packages/pip/_vendor/colorama/__pycache__/ansi.cpython-310.pyc create mode 100644 sbsheriff/Lib/site-packages/pip/_vendor/colorama/__pycache__/ansitowin32.cpython-310.pyc create mode 100644 sbsheriff/Lib/site-packages/pip/_vendor/colorama/__pycache__/initialise.cpython-310.pyc create mode 100644 sbsheriff/Lib/site-packages/pip/_vendor/colorama/__pycache__/win32.cpython-310.pyc create mode 100644 sbsheriff/Lib/site-packages/pip/_vendor/colorama/__pycache__/winterm.cpython-310.pyc create mode 100644 sbsheriff/Lib/site-packages/pip/_vendor/colorama/ansi.py create mode 100644 sbsheriff/Lib/site-packages/pip/_vendor/colorama/ansitowin32.py create mode 100644 sbsheriff/Lib/site-packages/pip/_vendor/colorama/initialise.py create mode 100644 sbsheriff/Lib/site-packages/pip/_vendor/colorama/win32.py create mode 100644 sbsheriff/Lib/site-packages/pip/_vendor/colorama/winterm.py create mode 100644 sbsheriff/Lib/site-packages/pip/_vendor/distlib/__init__.py create mode 100644 sbsheriff/Lib/site-packages/pip/_vendor/distlib/__pycache__/__init__.cpython-310.pyc create mode 100644 sbsheriff/Lib/site-packages/pip/_vendor/distlib/__pycache__/compat.cpython-310.pyc create mode 100644 sbsheriff/Lib/site-packages/pip/_vendor/distlib/__pycache__/database.cpython-310.pyc create mode 100644 sbsheriff/Lib/site-packages/pip/_vendor/distlib/__pycache__/index.cpython-310.pyc create mode 100644 sbsheriff/Lib/site-packages/pip/_vendor/distlib/__pycache__/locators.cpython-310.pyc create mode 100644 sbsheriff/Lib/site-packages/pip/_vendor/distlib/__pycache__/manifest.cpython-310.pyc create mode 100644 sbsheriff/Lib/site-packages/pip/_vendor/distlib/__pycache__/markers.cpython-310.pyc create mode 100644 sbsheriff/Lib/site-packages/pip/_vendor/distlib/__pycache__/metadata.cpython-310.pyc create mode 100644 sbsheriff/Lib/site-packages/pip/_vendor/distlib/__pycache__/resources.cpython-310.pyc create mode 100644 sbsheriff/Lib/site-packages/pip/_vendor/distlib/__pycache__/scripts.cpython-310.pyc create mode 100644 sbsheriff/Lib/site-packages/pip/_vendor/distlib/__pycache__/util.cpython-310.pyc create mode 100644 sbsheriff/Lib/site-packages/pip/_vendor/distlib/__pycache__/version.cpython-310.pyc create mode 100644 sbsheriff/Lib/site-packages/pip/_vendor/distlib/__pycache__/wheel.cpython-310.pyc create mode 100644 sbsheriff/Lib/site-packages/pip/_vendor/distlib/_backport/__init__.py create mode 100644 sbsheriff/Lib/site-packages/pip/_vendor/distlib/_backport/__pycache__/__init__.cpython-310.pyc create mode 100644 sbsheriff/Lib/site-packages/pip/_vendor/distlib/_backport/__pycache__/misc.cpython-310.pyc create mode 100644 sbsheriff/Lib/site-packages/pip/_vendor/distlib/_backport/__pycache__/shutil.cpython-310.pyc create mode 100644 sbsheriff/Lib/site-packages/pip/_vendor/distlib/_backport/__pycache__/sysconfig.cpython-310.pyc create mode 100644 sbsheriff/Lib/site-packages/pip/_vendor/distlib/_backport/__pycache__/tarfile.cpython-310.pyc create mode 100644 sbsheriff/Lib/site-packages/pip/_vendor/distlib/_backport/misc.py create mode 100644 sbsheriff/Lib/site-packages/pip/_vendor/distlib/_backport/shutil.py create mode 100644 sbsheriff/Lib/site-packages/pip/_vendor/distlib/_backport/sysconfig.cfg create mode 100644 sbsheriff/Lib/site-packages/pip/_vendor/distlib/_backport/sysconfig.py create mode 100644 sbsheriff/Lib/site-packages/pip/_vendor/distlib/_backport/tarfile.py create mode 100644 sbsheriff/Lib/site-packages/pip/_vendor/distlib/compat.py create mode 100644 sbsheriff/Lib/site-packages/pip/_vendor/distlib/database.py create mode 100644 sbsheriff/Lib/site-packages/pip/_vendor/distlib/index.py create mode 100644 sbsheriff/Lib/site-packages/pip/_vendor/distlib/locators.py create mode 100644 sbsheriff/Lib/site-packages/pip/_vendor/distlib/manifest.py create mode 100644 sbsheriff/Lib/site-packages/pip/_vendor/distlib/markers.py create mode 100644 sbsheriff/Lib/site-packages/pip/_vendor/distlib/metadata.py create mode 100644 sbsheriff/Lib/site-packages/pip/_vendor/distlib/resources.py create mode 100644 sbsheriff/Lib/site-packages/pip/_vendor/distlib/scripts.py create mode 100644 sbsheriff/Lib/site-packages/pip/_vendor/distlib/t32.exe create mode 100644 sbsheriff/Lib/site-packages/pip/_vendor/distlib/t64-arm.exe create mode 100644 sbsheriff/Lib/site-packages/pip/_vendor/distlib/t64.exe create mode 100644 sbsheriff/Lib/site-packages/pip/_vendor/distlib/util.py create mode 100644 sbsheriff/Lib/site-packages/pip/_vendor/distlib/version.py create mode 100644 sbsheriff/Lib/site-packages/pip/_vendor/distlib/w32.exe create mode 100644 sbsheriff/Lib/site-packages/pip/_vendor/distlib/w64-arm.exe create mode 100644 sbsheriff/Lib/site-packages/pip/_vendor/distlib/w64.exe create mode 100644 sbsheriff/Lib/site-packages/pip/_vendor/distlib/wheel.py create mode 100644 sbsheriff/Lib/site-packages/pip/_vendor/distro.py create mode 100644 sbsheriff/Lib/site-packages/pip/_vendor/html5lib/__init__.py create mode 100644 sbsheriff/Lib/site-packages/pip/_vendor/html5lib/__pycache__/__init__.cpython-310.pyc create mode 100644 sbsheriff/Lib/site-packages/pip/_vendor/html5lib/__pycache__/_ihatexml.cpython-310.pyc create mode 100644 sbsheriff/Lib/site-packages/pip/_vendor/html5lib/__pycache__/_inputstream.cpython-310.pyc create mode 100644 sbsheriff/Lib/site-packages/pip/_vendor/html5lib/__pycache__/_tokenizer.cpython-310.pyc create mode 100644 sbsheriff/Lib/site-packages/pip/_vendor/html5lib/__pycache__/_utils.cpython-310.pyc create mode 100644 sbsheriff/Lib/site-packages/pip/_vendor/html5lib/__pycache__/constants.cpython-310.pyc create mode 100644 sbsheriff/Lib/site-packages/pip/_vendor/html5lib/__pycache__/html5parser.cpython-310.pyc create mode 100644 sbsheriff/Lib/site-packages/pip/_vendor/html5lib/__pycache__/serializer.cpython-310.pyc create mode 100644 sbsheriff/Lib/site-packages/pip/_vendor/html5lib/_ihatexml.py create mode 100644 sbsheriff/Lib/site-packages/pip/_vendor/html5lib/_inputstream.py create mode 100644 sbsheriff/Lib/site-packages/pip/_vendor/html5lib/_tokenizer.py create mode 100644 sbsheriff/Lib/site-packages/pip/_vendor/html5lib/_trie/__init__.py create mode 100644 sbsheriff/Lib/site-packages/pip/_vendor/html5lib/_trie/__pycache__/__init__.cpython-310.pyc create mode 100644 sbsheriff/Lib/site-packages/pip/_vendor/html5lib/_trie/__pycache__/_base.cpython-310.pyc create mode 100644 sbsheriff/Lib/site-packages/pip/_vendor/html5lib/_trie/__pycache__/py.cpython-310.pyc create mode 100644 sbsheriff/Lib/site-packages/pip/_vendor/html5lib/_trie/_base.py create mode 100644 sbsheriff/Lib/site-packages/pip/_vendor/html5lib/_trie/py.py create mode 100644 sbsheriff/Lib/site-packages/pip/_vendor/html5lib/_utils.py create mode 100644 sbsheriff/Lib/site-packages/pip/_vendor/html5lib/constants.py create mode 100644 sbsheriff/Lib/site-packages/pip/_vendor/html5lib/filters/__init__.py create mode 100644 sbsheriff/Lib/site-packages/pip/_vendor/html5lib/filters/__pycache__/__init__.cpython-310.pyc create mode 100644 sbsheriff/Lib/site-packages/pip/_vendor/html5lib/filters/__pycache__/alphabeticalattributes.cpython-310.pyc create mode 100644 sbsheriff/Lib/site-packages/pip/_vendor/html5lib/filters/__pycache__/base.cpython-310.pyc create mode 100644 sbsheriff/Lib/site-packages/pip/_vendor/html5lib/filters/__pycache__/inject_meta_charset.cpython-310.pyc create mode 100644 sbsheriff/Lib/site-packages/pip/_vendor/html5lib/filters/__pycache__/lint.cpython-310.pyc create mode 100644 sbsheriff/Lib/site-packages/pip/_vendor/html5lib/filters/__pycache__/optionaltags.cpython-310.pyc create mode 100644 sbsheriff/Lib/site-packages/pip/_vendor/html5lib/filters/__pycache__/sanitizer.cpython-310.pyc create mode 100644 sbsheriff/Lib/site-packages/pip/_vendor/html5lib/filters/__pycache__/whitespace.cpython-310.pyc create mode 100644 sbsheriff/Lib/site-packages/pip/_vendor/html5lib/filters/alphabeticalattributes.py create mode 100644 sbsheriff/Lib/site-packages/pip/_vendor/html5lib/filters/base.py create mode 100644 sbsheriff/Lib/site-packages/pip/_vendor/html5lib/filters/inject_meta_charset.py create mode 100644 sbsheriff/Lib/site-packages/pip/_vendor/html5lib/filters/lint.py create mode 100644 sbsheriff/Lib/site-packages/pip/_vendor/html5lib/filters/optionaltags.py create mode 100644 sbsheriff/Lib/site-packages/pip/_vendor/html5lib/filters/sanitizer.py create mode 100644 sbsheriff/Lib/site-packages/pip/_vendor/html5lib/filters/whitespace.py create mode 100644 sbsheriff/Lib/site-packages/pip/_vendor/html5lib/html5parser.py create mode 100644 sbsheriff/Lib/site-packages/pip/_vendor/html5lib/serializer.py create mode 100644 sbsheriff/Lib/site-packages/pip/_vendor/html5lib/treeadapters/__init__.py create mode 100644 sbsheriff/Lib/site-packages/pip/_vendor/html5lib/treeadapters/__pycache__/__init__.cpython-310.pyc create mode 100644 sbsheriff/Lib/site-packages/pip/_vendor/html5lib/treeadapters/__pycache__/genshi.cpython-310.pyc create mode 100644 sbsheriff/Lib/site-packages/pip/_vendor/html5lib/treeadapters/__pycache__/sax.cpython-310.pyc create mode 100644 sbsheriff/Lib/site-packages/pip/_vendor/html5lib/treeadapters/genshi.py create mode 100644 sbsheriff/Lib/site-packages/pip/_vendor/html5lib/treeadapters/sax.py create mode 100644 sbsheriff/Lib/site-packages/pip/_vendor/html5lib/treebuilders/__init__.py create mode 100644 sbsheriff/Lib/site-packages/pip/_vendor/html5lib/treebuilders/__pycache__/__init__.cpython-310.pyc create mode 100644 sbsheriff/Lib/site-packages/pip/_vendor/html5lib/treebuilders/__pycache__/base.cpython-310.pyc create mode 100644 sbsheriff/Lib/site-packages/pip/_vendor/html5lib/treebuilders/__pycache__/dom.cpython-310.pyc create mode 100644 sbsheriff/Lib/site-packages/pip/_vendor/html5lib/treebuilders/__pycache__/etree.cpython-310.pyc create mode 100644 sbsheriff/Lib/site-packages/pip/_vendor/html5lib/treebuilders/__pycache__/etree_lxml.cpython-310.pyc create mode 100644 sbsheriff/Lib/site-packages/pip/_vendor/html5lib/treebuilders/base.py create mode 100644 sbsheriff/Lib/site-packages/pip/_vendor/html5lib/treebuilders/dom.py create mode 100644 sbsheriff/Lib/site-packages/pip/_vendor/html5lib/treebuilders/etree.py create mode 100644 sbsheriff/Lib/site-packages/pip/_vendor/html5lib/treebuilders/etree_lxml.py create mode 100644 sbsheriff/Lib/site-packages/pip/_vendor/html5lib/treewalkers/__init__.py create mode 100644 sbsheriff/Lib/site-packages/pip/_vendor/html5lib/treewalkers/__pycache__/__init__.cpython-310.pyc create mode 100644 sbsheriff/Lib/site-packages/pip/_vendor/html5lib/treewalkers/__pycache__/base.cpython-310.pyc create mode 100644 sbsheriff/Lib/site-packages/pip/_vendor/html5lib/treewalkers/__pycache__/dom.cpython-310.pyc create mode 100644 sbsheriff/Lib/site-packages/pip/_vendor/html5lib/treewalkers/__pycache__/etree.cpython-310.pyc create mode 100644 sbsheriff/Lib/site-packages/pip/_vendor/html5lib/treewalkers/__pycache__/etree_lxml.cpython-310.pyc create mode 100644 sbsheriff/Lib/site-packages/pip/_vendor/html5lib/treewalkers/__pycache__/genshi.cpython-310.pyc create mode 100644 sbsheriff/Lib/site-packages/pip/_vendor/html5lib/treewalkers/base.py create mode 100644 sbsheriff/Lib/site-packages/pip/_vendor/html5lib/treewalkers/dom.py create mode 100644 sbsheriff/Lib/site-packages/pip/_vendor/html5lib/treewalkers/etree.py create mode 100644 sbsheriff/Lib/site-packages/pip/_vendor/html5lib/treewalkers/etree_lxml.py create mode 100644 sbsheriff/Lib/site-packages/pip/_vendor/html5lib/treewalkers/genshi.py create mode 100644 sbsheriff/Lib/site-packages/pip/_vendor/idna/__init__.py create mode 100644 sbsheriff/Lib/site-packages/pip/_vendor/idna/__pycache__/__init__.cpython-310.pyc create mode 100644 sbsheriff/Lib/site-packages/pip/_vendor/idna/__pycache__/codec.cpython-310.pyc create mode 100644 sbsheriff/Lib/site-packages/pip/_vendor/idna/__pycache__/compat.cpython-310.pyc create mode 100644 sbsheriff/Lib/site-packages/pip/_vendor/idna/__pycache__/core.cpython-310.pyc create mode 100644 sbsheriff/Lib/site-packages/pip/_vendor/idna/__pycache__/idnadata.cpython-310.pyc create mode 100644 sbsheriff/Lib/site-packages/pip/_vendor/idna/__pycache__/intranges.cpython-310.pyc create mode 100644 sbsheriff/Lib/site-packages/pip/_vendor/idna/__pycache__/package_data.cpython-310.pyc create mode 100644 sbsheriff/Lib/site-packages/pip/_vendor/idna/__pycache__/uts46data.cpython-310.pyc create mode 100644 sbsheriff/Lib/site-packages/pip/_vendor/idna/codec.py create mode 100644 sbsheriff/Lib/site-packages/pip/_vendor/idna/compat.py create mode 100644 sbsheriff/Lib/site-packages/pip/_vendor/idna/core.py create mode 100644 sbsheriff/Lib/site-packages/pip/_vendor/idna/idnadata.py create mode 100644 sbsheriff/Lib/site-packages/pip/_vendor/idna/intranges.py create mode 100644 sbsheriff/Lib/site-packages/pip/_vendor/idna/package_data.py create mode 100644 sbsheriff/Lib/site-packages/pip/_vendor/idna/uts46data.py create mode 100644 sbsheriff/Lib/site-packages/pip/_vendor/msgpack/__init__.py create mode 100644 sbsheriff/Lib/site-packages/pip/_vendor/msgpack/__pycache__/__init__.cpython-310.pyc create mode 100644 sbsheriff/Lib/site-packages/pip/_vendor/msgpack/__pycache__/_version.cpython-310.pyc create mode 100644 sbsheriff/Lib/site-packages/pip/_vendor/msgpack/__pycache__/exceptions.cpython-310.pyc create mode 100644 sbsheriff/Lib/site-packages/pip/_vendor/msgpack/__pycache__/ext.cpython-310.pyc create mode 100644 sbsheriff/Lib/site-packages/pip/_vendor/msgpack/__pycache__/fallback.cpython-310.pyc create mode 100644 sbsheriff/Lib/site-packages/pip/_vendor/msgpack/_version.py create mode 100644 sbsheriff/Lib/site-packages/pip/_vendor/msgpack/exceptions.py create mode 100644 sbsheriff/Lib/site-packages/pip/_vendor/msgpack/ext.py create mode 100644 sbsheriff/Lib/site-packages/pip/_vendor/msgpack/fallback.py create mode 100644 sbsheriff/Lib/site-packages/pip/_vendor/packaging/__about__.py create mode 100644 sbsheriff/Lib/site-packages/pip/_vendor/packaging/__init__.py create mode 100644 sbsheriff/Lib/site-packages/pip/_vendor/packaging/__pycache__/__about__.cpython-310.pyc create mode 100644 sbsheriff/Lib/site-packages/pip/_vendor/packaging/__pycache__/__init__.cpython-310.pyc create mode 100644 sbsheriff/Lib/site-packages/pip/_vendor/packaging/__pycache__/_manylinux.cpython-310.pyc create mode 100644 sbsheriff/Lib/site-packages/pip/_vendor/packaging/__pycache__/_musllinux.cpython-310.pyc create mode 100644 sbsheriff/Lib/site-packages/pip/_vendor/packaging/__pycache__/_structures.cpython-310.pyc create mode 100644 sbsheriff/Lib/site-packages/pip/_vendor/packaging/__pycache__/markers.cpython-310.pyc create mode 100644 sbsheriff/Lib/site-packages/pip/_vendor/packaging/__pycache__/requirements.cpython-310.pyc create mode 100644 sbsheriff/Lib/site-packages/pip/_vendor/packaging/__pycache__/specifiers.cpython-310.pyc create mode 100644 sbsheriff/Lib/site-packages/pip/_vendor/packaging/__pycache__/tags.cpython-310.pyc create mode 100644 sbsheriff/Lib/site-packages/pip/_vendor/packaging/__pycache__/utils.cpython-310.pyc create mode 100644 sbsheriff/Lib/site-packages/pip/_vendor/packaging/__pycache__/version.cpython-310.pyc create mode 100644 sbsheriff/Lib/site-packages/pip/_vendor/packaging/_manylinux.py create mode 100644 sbsheriff/Lib/site-packages/pip/_vendor/packaging/_musllinux.py create mode 100644 sbsheriff/Lib/site-packages/pip/_vendor/packaging/_structures.py create mode 100644 sbsheriff/Lib/site-packages/pip/_vendor/packaging/markers.py create mode 100644 sbsheriff/Lib/site-packages/pip/_vendor/packaging/requirements.py create mode 100644 sbsheriff/Lib/site-packages/pip/_vendor/packaging/specifiers.py create mode 100644 sbsheriff/Lib/site-packages/pip/_vendor/packaging/tags.py create mode 100644 sbsheriff/Lib/site-packages/pip/_vendor/packaging/utils.py create mode 100644 sbsheriff/Lib/site-packages/pip/_vendor/packaging/version.py create mode 100644 sbsheriff/Lib/site-packages/pip/_vendor/pep517/__init__.py create mode 100644 sbsheriff/Lib/site-packages/pip/_vendor/pep517/__pycache__/__init__.cpython-310.pyc create mode 100644 sbsheriff/Lib/site-packages/pip/_vendor/pep517/__pycache__/build.cpython-310.pyc create mode 100644 sbsheriff/Lib/site-packages/pip/_vendor/pep517/__pycache__/check.cpython-310.pyc create mode 100644 sbsheriff/Lib/site-packages/pip/_vendor/pep517/__pycache__/colorlog.cpython-310.pyc create mode 100644 sbsheriff/Lib/site-packages/pip/_vendor/pep517/__pycache__/compat.cpython-310.pyc create mode 100644 sbsheriff/Lib/site-packages/pip/_vendor/pep517/__pycache__/dirtools.cpython-310.pyc create mode 100644 sbsheriff/Lib/site-packages/pip/_vendor/pep517/__pycache__/envbuild.cpython-310.pyc create mode 100644 sbsheriff/Lib/site-packages/pip/_vendor/pep517/__pycache__/meta.cpython-310.pyc create mode 100644 sbsheriff/Lib/site-packages/pip/_vendor/pep517/__pycache__/wrappers.cpython-310.pyc create mode 100644 sbsheriff/Lib/site-packages/pip/_vendor/pep517/build.py create mode 100644 sbsheriff/Lib/site-packages/pip/_vendor/pep517/check.py create mode 100644 sbsheriff/Lib/site-packages/pip/_vendor/pep517/colorlog.py create mode 100644 sbsheriff/Lib/site-packages/pip/_vendor/pep517/compat.py create mode 100644 sbsheriff/Lib/site-packages/pip/_vendor/pep517/dirtools.py create mode 100644 sbsheriff/Lib/site-packages/pip/_vendor/pep517/envbuild.py create mode 100644 sbsheriff/Lib/site-packages/pip/_vendor/pep517/in_process/__init__.py create mode 100644 sbsheriff/Lib/site-packages/pip/_vendor/pep517/in_process/__pycache__/__init__.cpython-310.pyc create mode 100644 sbsheriff/Lib/site-packages/pip/_vendor/pep517/in_process/__pycache__/_in_process.cpython-310.pyc create mode 100644 sbsheriff/Lib/site-packages/pip/_vendor/pep517/in_process/_in_process.py create mode 100644 sbsheriff/Lib/site-packages/pip/_vendor/pep517/meta.py create mode 100644 sbsheriff/Lib/site-packages/pip/_vendor/pep517/wrappers.py create mode 100644 sbsheriff/Lib/site-packages/pip/_vendor/pkg_resources/__init__.py create mode 100644 sbsheriff/Lib/site-packages/pip/_vendor/pkg_resources/__pycache__/__init__.cpython-310.pyc create mode 100644 sbsheriff/Lib/site-packages/pip/_vendor/pkg_resources/__pycache__/py31compat.cpython-310.pyc create mode 100644 sbsheriff/Lib/site-packages/pip/_vendor/pkg_resources/py31compat.py create mode 100644 sbsheriff/Lib/site-packages/pip/_vendor/platformdirs/__init__.py create mode 100644 sbsheriff/Lib/site-packages/pip/_vendor/platformdirs/__main__.py create mode 100644 sbsheriff/Lib/site-packages/pip/_vendor/platformdirs/__pycache__/__init__.cpython-310.pyc create mode 100644 sbsheriff/Lib/site-packages/pip/_vendor/platformdirs/__pycache__/__main__.cpython-310.pyc create mode 100644 sbsheriff/Lib/site-packages/pip/_vendor/platformdirs/__pycache__/android.cpython-310.pyc create mode 100644 sbsheriff/Lib/site-packages/pip/_vendor/platformdirs/__pycache__/api.cpython-310.pyc create mode 100644 sbsheriff/Lib/site-packages/pip/_vendor/platformdirs/__pycache__/macos.cpython-310.pyc create mode 100644 sbsheriff/Lib/site-packages/pip/_vendor/platformdirs/__pycache__/unix.cpython-310.pyc create mode 100644 sbsheriff/Lib/site-packages/pip/_vendor/platformdirs/__pycache__/version.cpython-310.pyc create mode 100644 sbsheriff/Lib/site-packages/pip/_vendor/platformdirs/__pycache__/windows.cpython-310.pyc create mode 100644 sbsheriff/Lib/site-packages/pip/_vendor/platformdirs/android.py create mode 100644 sbsheriff/Lib/site-packages/pip/_vendor/platformdirs/api.py create mode 100644 sbsheriff/Lib/site-packages/pip/_vendor/platformdirs/macos.py create mode 100644 sbsheriff/Lib/site-packages/pip/_vendor/platformdirs/unix.py create mode 100644 sbsheriff/Lib/site-packages/pip/_vendor/platformdirs/version.py create mode 100644 sbsheriff/Lib/site-packages/pip/_vendor/platformdirs/windows.py create mode 100644 sbsheriff/Lib/site-packages/pip/_vendor/progress/__init__.py create mode 100644 sbsheriff/Lib/site-packages/pip/_vendor/progress/__pycache__/__init__.cpython-310.pyc create mode 100644 sbsheriff/Lib/site-packages/pip/_vendor/progress/__pycache__/bar.cpython-310.pyc create mode 100644 sbsheriff/Lib/site-packages/pip/_vendor/progress/__pycache__/colors.cpython-310.pyc create mode 100644 sbsheriff/Lib/site-packages/pip/_vendor/progress/__pycache__/counter.cpython-310.pyc create mode 100644 sbsheriff/Lib/site-packages/pip/_vendor/progress/__pycache__/spinner.cpython-310.pyc create mode 100644 sbsheriff/Lib/site-packages/pip/_vendor/progress/bar.py create mode 100644 sbsheriff/Lib/site-packages/pip/_vendor/progress/colors.py create mode 100644 sbsheriff/Lib/site-packages/pip/_vendor/progress/counter.py create mode 100644 sbsheriff/Lib/site-packages/pip/_vendor/progress/spinner.py create mode 100644 sbsheriff/Lib/site-packages/pip/_vendor/pygments/__init__.py create mode 100644 sbsheriff/Lib/site-packages/pip/_vendor/pygments/__main__.py create mode 100644 sbsheriff/Lib/site-packages/pip/_vendor/pygments/__pycache__/__init__.cpython-310.pyc create mode 100644 sbsheriff/Lib/site-packages/pip/_vendor/pygments/__pycache__/__main__.cpython-310.pyc create mode 100644 sbsheriff/Lib/site-packages/pip/_vendor/pygments/__pycache__/cmdline.cpython-310.pyc create mode 100644 sbsheriff/Lib/site-packages/pip/_vendor/pygments/__pycache__/console.cpython-310.pyc create mode 100644 sbsheriff/Lib/site-packages/pip/_vendor/pygments/__pycache__/filter.cpython-310.pyc create mode 100644 sbsheriff/Lib/site-packages/pip/_vendor/pygments/__pycache__/formatter.cpython-310.pyc create mode 100644 sbsheriff/Lib/site-packages/pip/_vendor/pygments/__pycache__/lexer.cpython-310.pyc create mode 100644 sbsheriff/Lib/site-packages/pip/_vendor/pygments/__pycache__/modeline.cpython-310.pyc create mode 100644 sbsheriff/Lib/site-packages/pip/_vendor/pygments/__pycache__/plugin.cpython-310.pyc create mode 100644 sbsheriff/Lib/site-packages/pip/_vendor/pygments/__pycache__/regexopt.cpython-310.pyc create mode 100644 sbsheriff/Lib/site-packages/pip/_vendor/pygments/__pycache__/scanner.cpython-310.pyc create mode 100644 sbsheriff/Lib/site-packages/pip/_vendor/pygments/__pycache__/sphinxext.cpython-310.pyc create mode 100644 sbsheriff/Lib/site-packages/pip/_vendor/pygments/__pycache__/style.cpython-310.pyc create mode 100644 sbsheriff/Lib/site-packages/pip/_vendor/pygments/__pycache__/token.cpython-310.pyc create mode 100644 sbsheriff/Lib/site-packages/pip/_vendor/pygments/__pycache__/unistring.cpython-310.pyc create mode 100644 sbsheriff/Lib/site-packages/pip/_vendor/pygments/__pycache__/util.cpython-310.pyc create mode 100644 sbsheriff/Lib/site-packages/pip/_vendor/pygments/cmdline.py create mode 100644 sbsheriff/Lib/site-packages/pip/_vendor/pygments/console.py create mode 100644 sbsheriff/Lib/site-packages/pip/_vendor/pygments/filter.py create mode 100644 sbsheriff/Lib/site-packages/pip/_vendor/pygments/filters/__init__.py create mode 100644 sbsheriff/Lib/site-packages/pip/_vendor/pygments/filters/__pycache__/__init__.cpython-310.pyc create mode 100644 sbsheriff/Lib/site-packages/pip/_vendor/pygments/formatter.py create mode 100644 sbsheriff/Lib/site-packages/pip/_vendor/pygments/formatters/__init__.py create mode 100644 sbsheriff/Lib/site-packages/pip/_vendor/pygments/formatters/__pycache__/__init__.cpython-310.pyc create mode 100644 sbsheriff/Lib/site-packages/pip/_vendor/pygments/formatters/__pycache__/_mapping.cpython-310.pyc create mode 100644 sbsheriff/Lib/site-packages/pip/_vendor/pygments/formatters/__pycache__/bbcode.cpython-310.pyc create mode 100644 sbsheriff/Lib/site-packages/pip/_vendor/pygments/formatters/__pycache__/groff.cpython-310.pyc create mode 100644 sbsheriff/Lib/site-packages/pip/_vendor/pygments/formatters/__pycache__/html.cpython-310.pyc create mode 100644 sbsheriff/Lib/site-packages/pip/_vendor/pygments/formatters/__pycache__/img.cpython-310.pyc create mode 100644 sbsheriff/Lib/site-packages/pip/_vendor/pygments/formatters/__pycache__/irc.cpython-310.pyc create mode 100644 sbsheriff/Lib/site-packages/pip/_vendor/pygments/formatters/__pycache__/latex.cpython-310.pyc create mode 100644 sbsheriff/Lib/site-packages/pip/_vendor/pygments/formatters/__pycache__/other.cpython-310.pyc create mode 100644 sbsheriff/Lib/site-packages/pip/_vendor/pygments/formatters/__pycache__/pangomarkup.cpython-310.pyc create mode 100644 sbsheriff/Lib/site-packages/pip/_vendor/pygments/formatters/__pycache__/rtf.cpython-310.pyc create mode 100644 sbsheriff/Lib/site-packages/pip/_vendor/pygments/formatters/__pycache__/svg.cpython-310.pyc create mode 100644 sbsheriff/Lib/site-packages/pip/_vendor/pygments/formatters/__pycache__/terminal.cpython-310.pyc create mode 100644 sbsheriff/Lib/site-packages/pip/_vendor/pygments/formatters/__pycache__/terminal256.cpython-310.pyc create mode 100644 sbsheriff/Lib/site-packages/pip/_vendor/pygments/formatters/_mapping.py create mode 100644 sbsheriff/Lib/site-packages/pip/_vendor/pygments/formatters/bbcode.py create mode 100644 sbsheriff/Lib/site-packages/pip/_vendor/pygments/formatters/groff.py create mode 100644 sbsheriff/Lib/site-packages/pip/_vendor/pygments/formatters/html.py create mode 100644 sbsheriff/Lib/site-packages/pip/_vendor/pygments/formatters/img.py create mode 100644 sbsheriff/Lib/site-packages/pip/_vendor/pygments/formatters/irc.py create mode 100644 sbsheriff/Lib/site-packages/pip/_vendor/pygments/formatters/latex.py create mode 100644 sbsheriff/Lib/site-packages/pip/_vendor/pygments/formatters/other.py create mode 100644 sbsheriff/Lib/site-packages/pip/_vendor/pygments/formatters/pangomarkup.py create mode 100644 sbsheriff/Lib/site-packages/pip/_vendor/pygments/formatters/rtf.py create mode 100644 sbsheriff/Lib/site-packages/pip/_vendor/pygments/formatters/svg.py create mode 100644 sbsheriff/Lib/site-packages/pip/_vendor/pygments/formatters/terminal.py create mode 100644 sbsheriff/Lib/site-packages/pip/_vendor/pygments/formatters/terminal256.py create mode 100644 sbsheriff/Lib/site-packages/pip/_vendor/pygments/lexer.py create mode 100644 sbsheriff/Lib/site-packages/pip/_vendor/pygments/lexers/__init__.py create mode 100644 sbsheriff/Lib/site-packages/pip/_vendor/pygments/lexers/__pycache__/__init__.cpython-310.pyc create mode 100644 sbsheriff/Lib/site-packages/pip/_vendor/pygments/lexers/__pycache__/_mapping.cpython-310.pyc create mode 100644 sbsheriff/Lib/site-packages/pip/_vendor/pygments/lexers/__pycache__/python.cpython-310.pyc create mode 100644 sbsheriff/Lib/site-packages/pip/_vendor/pygments/lexers/_mapping.py create mode 100644 sbsheriff/Lib/site-packages/pip/_vendor/pygments/lexers/python.py create mode 100644 sbsheriff/Lib/site-packages/pip/_vendor/pygments/modeline.py create mode 100644 sbsheriff/Lib/site-packages/pip/_vendor/pygments/plugin.py create mode 100644 sbsheriff/Lib/site-packages/pip/_vendor/pygments/regexopt.py create mode 100644 sbsheriff/Lib/site-packages/pip/_vendor/pygments/scanner.py create mode 100644 sbsheriff/Lib/site-packages/pip/_vendor/pygments/sphinxext.py create mode 100644 sbsheriff/Lib/site-packages/pip/_vendor/pygments/style.py create mode 100644 sbsheriff/Lib/site-packages/pip/_vendor/pygments/styles/__init__.py create mode 100644 sbsheriff/Lib/site-packages/pip/_vendor/pygments/styles/__pycache__/__init__.cpython-310.pyc create mode 100644 sbsheriff/Lib/site-packages/pip/_vendor/pygments/token.py create mode 100644 sbsheriff/Lib/site-packages/pip/_vendor/pygments/unistring.py create mode 100644 sbsheriff/Lib/site-packages/pip/_vendor/pygments/util.py create mode 100644 sbsheriff/Lib/site-packages/pip/_vendor/pyparsing/__init__.py create mode 100644 sbsheriff/Lib/site-packages/pip/_vendor/pyparsing/__pycache__/__init__.cpython-310.pyc create mode 100644 sbsheriff/Lib/site-packages/pip/_vendor/pyparsing/__pycache__/actions.cpython-310.pyc create mode 100644 sbsheriff/Lib/site-packages/pip/_vendor/pyparsing/__pycache__/common.cpython-310.pyc create mode 100644 sbsheriff/Lib/site-packages/pip/_vendor/pyparsing/__pycache__/core.cpython-310.pyc create mode 100644 sbsheriff/Lib/site-packages/pip/_vendor/pyparsing/__pycache__/exceptions.cpython-310.pyc create mode 100644 sbsheriff/Lib/site-packages/pip/_vendor/pyparsing/__pycache__/helpers.cpython-310.pyc create mode 100644 sbsheriff/Lib/site-packages/pip/_vendor/pyparsing/__pycache__/results.cpython-310.pyc create mode 100644 sbsheriff/Lib/site-packages/pip/_vendor/pyparsing/__pycache__/testing.cpython-310.pyc create mode 100644 sbsheriff/Lib/site-packages/pip/_vendor/pyparsing/__pycache__/unicode.cpython-310.pyc create mode 100644 sbsheriff/Lib/site-packages/pip/_vendor/pyparsing/__pycache__/util.cpython-310.pyc create mode 100644 sbsheriff/Lib/site-packages/pip/_vendor/pyparsing/actions.py create mode 100644 sbsheriff/Lib/site-packages/pip/_vendor/pyparsing/common.py create mode 100644 sbsheriff/Lib/site-packages/pip/_vendor/pyparsing/core.py create mode 100644 sbsheriff/Lib/site-packages/pip/_vendor/pyparsing/diagram/__init__.py create mode 100644 sbsheriff/Lib/site-packages/pip/_vendor/pyparsing/diagram/__pycache__/__init__.cpython-310.pyc create mode 100644 sbsheriff/Lib/site-packages/pip/_vendor/pyparsing/exceptions.py create mode 100644 sbsheriff/Lib/site-packages/pip/_vendor/pyparsing/helpers.py create mode 100644 sbsheriff/Lib/site-packages/pip/_vendor/pyparsing/results.py create mode 100644 sbsheriff/Lib/site-packages/pip/_vendor/pyparsing/testing.py create mode 100644 sbsheriff/Lib/site-packages/pip/_vendor/pyparsing/unicode.py create mode 100644 sbsheriff/Lib/site-packages/pip/_vendor/pyparsing/util.py create mode 100644 sbsheriff/Lib/site-packages/pip/_vendor/requests/__init__.py create mode 100644 sbsheriff/Lib/site-packages/pip/_vendor/requests/__pycache__/__init__.cpython-310.pyc create mode 100644 sbsheriff/Lib/site-packages/pip/_vendor/requests/__pycache__/__version__.cpython-310.pyc create mode 100644 sbsheriff/Lib/site-packages/pip/_vendor/requests/__pycache__/_internal_utils.cpython-310.pyc create mode 100644 sbsheriff/Lib/site-packages/pip/_vendor/requests/__pycache__/adapters.cpython-310.pyc create mode 100644 sbsheriff/Lib/site-packages/pip/_vendor/requests/__pycache__/api.cpython-310.pyc create mode 100644 sbsheriff/Lib/site-packages/pip/_vendor/requests/__pycache__/auth.cpython-310.pyc create mode 100644 sbsheriff/Lib/site-packages/pip/_vendor/requests/__pycache__/certs.cpython-310.pyc create mode 100644 sbsheriff/Lib/site-packages/pip/_vendor/requests/__pycache__/compat.cpython-310.pyc create mode 100644 sbsheriff/Lib/site-packages/pip/_vendor/requests/__pycache__/cookies.cpython-310.pyc create mode 100644 sbsheriff/Lib/site-packages/pip/_vendor/requests/__pycache__/exceptions.cpython-310.pyc create mode 100644 sbsheriff/Lib/site-packages/pip/_vendor/requests/__pycache__/help.cpython-310.pyc create mode 100644 sbsheriff/Lib/site-packages/pip/_vendor/requests/__pycache__/hooks.cpython-310.pyc create mode 100644 sbsheriff/Lib/site-packages/pip/_vendor/requests/__pycache__/models.cpython-310.pyc create mode 100644 sbsheriff/Lib/site-packages/pip/_vendor/requests/__pycache__/packages.cpython-310.pyc create mode 100644 sbsheriff/Lib/site-packages/pip/_vendor/requests/__pycache__/sessions.cpython-310.pyc create mode 100644 sbsheriff/Lib/site-packages/pip/_vendor/requests/__pycache__/status_codes.cpython-310.pyc create mode 100644 sbsheriff/Lib/site-packages/pip/_vendor/requests/__pycache__/structures.cpython-310.pyc create mode 100644 sbsheriff/Lib/site-packages/pip/_vendor/requests/__pycache__/utils.cpython-310.pyc create mode 100644 sbsheriff/Lib/site-packages/pip/_vendor/requests/__version__.py create mode 100644 sbsheriff/Lib/site-packages/pip/_vendor/requests/_internal_utils.py create mode 100644 sbsheriff/Lib/site-packages/pip/_vendor/requests/adapters.py create mode 100644 sbsheriff/Lib/site-packages/pip/_vendor/requests/api.py create mode 100644 sbsheriff/Lib/site-packages/pip/_vendor/requests/auth.py create mode 100644 sbsheriff/Lib/site-packages/pip/_vendor/requests/certs.py create mode 100644 sbsheriff/Lib/site-packages/pip/_vendor/requests/compat.py create mode 100644 sbsheriff/Lib/site-packages/pip/_vendor/requests/cookies.py create mode 100644 sbsheriff/Lib/site-packages/pip/_vendor/requests/exceptions.py create mode 100644 sbsheriff/Lib/site-packages/pip/_vendor/requests/help.py create mode 100644 sbsheriff/Lib/site-packages/pip/_vendor/requests/hooks.py create mode 100644 sbsheriff/Lib/site-packages/pip/_vendor/requests/models.py create mode 100644 sbsheriff/Lib/site-packages/pip/_vendor/requests/packages.py create mode 100644 sbsheriff/Lib/site-packages/pip/_vendor/requests/sessions.py create mode 100644 sbsheriff/Lib/site-packages/pip/_vendor/requests/status_codes.py create mode 100644 sbsheriff/Lib/site-packages/pip/_vendor/requests/structures.py create mode 100644 sbsheriff/Lib/site-packages/pip/_vendor/requests/utils.py create mode 100644 sbsheriff/Lib/site-packages/pip/_vendor/resolvelib/__init__.py create mode 100644 sbsheriff/Lib/site-packages/pip/_vendor/resolvelib/__pycache__/__init__.cpython-310.pyc create mode 100644 sbsheriff/Lib/site-packages/pip/_vendor/resolvelib/__pycache__/providers.cpython-310.pyc create mode 100644 sbsheriff/Lib/site-packages/pip/_vendor/resolvelib/__pycache__/reporters.cpython-310.pyc create mode 100644 sbsheriff/Lib/site-packages/pip/_vendor/resolvelib/__pycache__/resolvers.cpython-310.pyc create mode 100644 sbsheriff/Lib/site-packages/pip/_vendor/resolvelib/__pycache__/structs.cpython-310.pyc create mode 100644 sbsheriff/Lib/site-packages/pip/_vendor/resolvelib/compat/__init__.py create mode 100644 sbsheriff/Lib/site-packages/pip/_vendor/resolvelib/compat/__pycache__/__init__.cpython-310.pyc create mode 100644 sbsheriff/Lib/site-packages/pip/_vendor/resolvelib/compat/__pycache__/collections_abc.cpython-310.pyc create mode 100644 sbsheriff/Lib/site-packages/pip/_vendor/resolvelib/compat/collections_abc.py create mode 100644 sbsheriff/Lib/site-packages/pip/_vendor/resolvelib/providers.py create mode 100644 sbsheriff/Lib/site-packages/pip/_vendor/resolvelib/reporters.py create mode 100644 sbsheriff/Lib/site-packages/pip/_vendor/resolvelib/resolvers.py create mode 100644 sbsheriff/Lib/site-packages/pip/_vendor/resolvelib/structs.py create mode 100644 sbsheriff/Lib/site-packages/pip/_vendor/rich/__init__.py create mode 100644 sbsheriff/Lib/site-packages/pip/_vendor/rich/__main__.py create mode 100644 sbsheriff/Lib/site-packages/pip/_vendor/rich/__pycache__/__init__.cpython-310.pyc create mode 100644 sbsheriff/Lib/site-packages/pip/_vendor/rich/__pycache__/__main__.cpython-310.pyc create mode 100644 sbsheriff/Lib/site-packages/pip/_vendor/rich/__pycache__/_cell_widths.cpython-310.pyc create mode 100644 sbsheriff/Lib/site-packages/pip/_vendor/rich/__pycache__/_emoji_codes.cpython-310.pyc create mode 100644 sbsheriff/Lib/site-packages/pip/_vendor/rich/__pycache__/_emoji_replace.cpython-310.pyc create mode 100644 sbsheriff/Lib/site-packages/pip/_vendor/rich/__pycache__/_extension.cpython-310.pyc create mode 100644 sbsheriff/Lib/site-packages/pip/_vendor/rich/__pycache__/_inspect.cpython-310.pyc create mode 100644 sbsheriff/Lib/site-packages/pip/_vendor/rich/__pycache__/_log_render.cpython-310.pyc create mode 100644 sbsheriff/Lib/site-packages/pip/_vendor/rich/__pycache__/_loop.cpython-310.pyc create mode 100644 sbsheriff/Lib/site-packages/pip/_vendor/rich/__pycache__/_lru_cache.cpython-310.pyc create mode 100644 sbsheriff/Lib/site-packages/pip/_vendor/rich/__pycache__/_palettes.cpython-310.pyc create mode 100644 sbsheriff/Lib/site-packages/pip/_vendor/rich/__pycache__/_pick.cpython-310.pyc create mode 100644 sbsheriff/Lib/site-packages/pip/_vendor/rich/__pycache__/_ratio.cpython-310.pyc create mode 100644 sbsheriff/Lib/site-packages/pip/_vendor/rich/__pycache__/_spinners.cpython-310.pyc create mode 100644 sbsheriff/Lib/site-packages/pip/_vendor/rich/__pycache__/_stack.cpython-310.pyc create mode 100644 sbsheriff/Lib/site-packages/pip/_vendor/rich/__pycache__/_timer.cpython-310.pyc create mode 100644 sbsheriff/Lib/site-packages/pip/_vendor/rich/__pycache__/_windows.cpython-310.pyc create mode 100644 sbsheriff/Lib/site-packages/pip/_vendor/rich/__pycache__/_wrap.cpython-310.pyc create mode 100644 sbsheriff/Lib/site-packages/pip/_vendor/rich/__pycache__/abc.cpython-310.pyc create mode 100644 sbsheriff/Lib/site-packages/pip/_vendor/rich/__pycache__/align.cpython-310.pyc create mode 100644 sbsheriff/Lib/site-packages/pip/_vendor/rich/__pycache__/ansi.cpython-310.pyc create mode 100644 sbsheriff/Lib/site-packages/pip/_vendor/rich/__pycache__/bar.cpython-310.pyc create mode 100644 sbsheriff/Lib/site-packages/pip/_vendor/rich/__pycache__/box.cpython-310.pyc create mode 100644 sbsheriff/Lib/site-packages/pip/_vendor/rich/__pycache__/cells.cpython-310.pyc create mode 100644 sbsheriff/Lib/site-packages/pip/_vendor/rich/__pycache__/color.cpython-310.pyc create mode 100644 sbsheriff/Lib/site-packages/pip/_vendor/rich/__pycache__/color_triplet.cpython-310.pyc create mode 100644 sbsheriff/Lib/site-packages/pip/_vendor/rich/__pycache__/columns.cpython-310.pyc create mode 100644 sbsheriff/Lib/site-packages/pip/_vendor/rich/__pycache__/console.cpython-310.pyc create mode 100644 sbsheriff/Lib/site-packages/pip/_vendor/rich/__pycache__/constrain.cpython-310.pyc create mode 100644 sbsheriff/Lib/site-packages/pip/_vendor/rich/__pycache__/containers.cpython-310.pyc create mode 100644 sbsheriff/Lib/site-packages/pip/_vendor/rich/__pycache__/control.cpython-310.pyc create mode 100644 sbsheriff/Lib/site-packages/pip/_vendor/rich/__pycache__/default_styles.cpython-310.pyc create mode 100644 sbsheriff/Lib/site-packages/pip/_vendor/rich/__pycache__/diagnose.cpython-310.pyc create mode 100644 sbsheriff/Lib/site-packages/pip/_vendor/rich/__pycache__/emoji.cpython-310.pyc create mode 100644 sbsheriff/Lib/site-packages/pip/_vendor/rich/__pycache__/errors.cpython-310.pyc create mode 100644 sbsheriff/Lib/site-packages/pip/_vendor/rich/__pycache__/file_proxy.cpython-310.pyc create mode 100644 sbsheriff/Lib/site-packages/pip/_vendor/rich/__pycache__/filesize.cpython-310.pyc create mode 100644 sbsheriff/Lib/site-packages/pip/_vendor/rich/__pycache__/highlighter.cpython-310.pyc create mode 100644 sbsheriff/Lib/site-packages/pip/_vendor/rich/__pycache__/json.cpython-310.pyc create mode 100644 sbsheriff/Lib/site-packages/pip/_vendor/rich/__pycache__/jupyter.cpython-310.pyc create mode 100644 sbsheriff/Lib/site-packages/pip/_vendor/rich/__pycache__/layout.cpython-310.pyc create mode 100644 sbsheriff/Lib/site-packages/pip/_vendor/rich/__pycache__/live.cpython-310.pyc create mode 100644 sbsheriff/Lib/site-packages/pip/_vendor/rich/__pycache__/live_render.cpython-310.pyc create mode 100644 sbsheriff/Lib/site-packages/pip/_vendor/rich/__pycache__/logging.cpython-310.pyc create mode 100644 sbsheriff/Lib/site-packages/pip/_vendor/rich/__pycache__/markup.cpython-310.pyc create mode 100644 sbsheriff/Lib/site-packages/pip/_vendor/rich/__pycache__/measure.cpython-310.pyc create mode 100644 sbsheriff/Lib/site-packages/pip/_vendor/rich/__pycache__/padding.cpython-310.pyc create mode 100644 sbsheriff/Lib/site-packages/pip/_vendor/rich/__pycache__/pager.cpython-310.pyc create mode 100644 sbsheriff/Lib/site-packages/pip/_vendor/rich/__pycache__/palette.cpython-310.pyc create mode 100644 sbsheriff/Lib/site-packages/pip/_vendor/rich/__pycache__/panel.cpython-310.pyc create mode 100644 sbsheriff/Lib/site-packages/pip/_vendor/rich/__pycache__/pretty.cpython-310.pyc create mode 100644 sbsheriff/Lib/site-packages/pip/_vendor/rich/__pycache__/progress.cpython-310.pyc create mode 100644 sbsheriff/Lib/site-packages/pip/_vendor/rich/__pycache__/progress_bar.cpython-310.pyc create mode 100644 sbsheriff/Lib/site-packages/pip/_vendor/rich/__pycache__/prompt.cpython-310.pyc create mode 100644 sbsheriff/Lib/site-packages/pip/_vendor/rich/__pycache__/protocol.cpython-310.pyc create mode 100644 sbsheriff/Lib/site-packages/pip/_vendor/rich/__pycache__/region.cpython-310.pyc create mode 100644 sbsheriff/Lib/site-packages/pip/_vendor/rich/__pycache__/repr.cpython-310.pyc create mode 100644 sbsheriff/Lib/site-packages/pip/_vendor/rich/__pycache__/rule.cpython-310.pyc create mode 100644 sbsheriff/Lib/site-packages/pip/_vendor/rich/__pycache__/scope.cpython-310.pyc create mode 100644 sbsheriff/Lib/site-packages/pip/_vendor/rich/__pycache__/screen.cpython-310.pyc create mode 100644 sbsheriff/Lib/site-packages/pip/_vendor/rich/__pycache__/segment.cpython-310.pyc create mode 100644 sbsheriff/Lib/site-packages/pip/_vendor/rich/__pycache__/spinner.cpython-310.pyc create mode 100644 sbsheriff/Lib/site-packages/pip/_vendor/rich/__pycache__/status.cpython-310.pyc create mode 100644 sbsheriff/Lib/site-packages/pip/_vendor/rich/__pycache__/style.cpython-310.pyc create mode 100644 sbsheriff/Lib/site-packages/pip/_vendor/rich/__pycache__/styled.cpython-310.pyc create mode 100644 sbsheriff/Lib/site-packages/pip/_vendor/rich/__pycache__/syntax.cpython-310.pyc create mode 100644 sbsheriff/Lib/site-packages/pip/_vendor/rich/__pycache__/table.cpython-310.pyc create mode 100644 sbsheriff/Lib/site-packages/pip/_vendor/rich/__pycache__/tabulate.cpython-310.pyc create mode 100644 sbsheriff/Lib/site-packages/pip/_vendor/rich/__pycache__/terminal_theme.cpython-310.pyc create mode 100644 sbsheriff/Lib/site-packages/pip/_vendor/rich/__pycache__/text.cpython-310.pyc create mode 100644 sbsheriff/Lib/site-packages/pip/_vendor/rich/__pycache__/theme.cpython-310.pyc create mode 100644 sbsheriff/Lib/site-packages/pip/_vendor/rich/__pycache__/themes.cpython-310.pyc create mode 100644 sbsheriff/Lib/site-packages/pip/_vendor/rich/__pycache__/traceback.cpython-310.pyc create mode 100644 sbsheriff/Lib/site-packages/pip/_vendor/rich/__pycache__/tree.cpython-310.pyc create mode 100644 sbsheriff/Lib/site-packages/pip/_vendor/rich/_cell_widths.py create mode 100644 sbsheriff/Lib/site-packages/pip/_vendor/rich/_emoji_codes.py create mode 100644 sbsheriff/Lib/site-packages/pip/_vendor/rich/_emoji_replace.py create mode 100644 sbsheriff/Lib/site-packages/pip/_vendor/rich/_extension.py create mode 100644 sbsheriff/Lib/site-packages/pip/_vendor/rich/_inspect.py create mode 100644 sbsheriff/Lib/site-packages/pip/_vendor/rich/_log_render.py create mode 100644 sbsheriff/Lib/site-packages/pip/_vendor/rich/_loop.py create mode 100644 sbsheriff/Lib/site-packages/pip/_vendor/rich/_lru_cache.py create mode 100644 sbsheriff/Lib/site-packages/pip/_vendor/rich/_palettes.py create mode 100644 sbsheriff/Lib/site-packages/pip/_vendor/rich/_pick.py create mode 100644 sbsheriff/Lib/site-packages/pip/_vendor/rich/_ratio.py create mode 100644 sbsheriff/Lib/site-packages/pip/_vendor/rich/_spinners.py create mode 100644 sbsheriff/Lib/site-packages/pip/_vendor/rich/_stack.py create mode 100644 sbsheriff/Lib/site-packages/pip/_vendor/rich/_timer.py create mode 100644 sbsheriff/Lib/site-packages/pip/_vendor/rich/_windows.py create mode 100644 sbsheriff/Lib/site-packages/pip/_vendor/rich/_wrap.py create mode 100644 sbsheriff/Lib/site-packages/pip/_vendor/rich/abc.py create mode 100644 sbsheriff/Lib/site-packages/pip/_vendor/rich/align.py create mode 100644 sbsheriff/Lib/site-packages/pip/_vendor/rich/ansi.py create mode 100644 sbsheriff/Lib/site-packages/pip/_vendor/rich/bar.py create mode 100644 sbsheriff/Lib/site-packages/pip/_vendor/rich/box.py create mode 100644 sbsheriff/Lib/site-packages/pip/_vendor/rich/cells.py create mode 100644 sbsheriff/Lib/site-packages/pip/_vendor/rich/color.py create mode 100644 sbsheriff/Lib/site-packages/pip/_vendor/rich/color_triplet.py create mode 100644 sbsheriff/Lib/site-packages/pip/_vendor/rich/columns.py create mode 100644 sbsheriff/Lib/site-packages/pip/_vendor/rich/console.py create mode 100644 sbsheriff/Lib/site-packages/pip/_vendor/rich/constrain.py create mode 100644 sbsheriff/Lib/site-packages/pip/_vendor/rich/containers.py create mode 100644 sbsheriff/Lib/site-packages/pip/_vendor/rich/control.py create mode 100644 sbsheriff/Lib/site-packages/pip/_vendor/rich/default_styles.py create mode 100644 sbsheriff/Lib/site-packages/pip/_vendor/rich/diagnose.py create mode 100644 sbsheriff/Lib/site-packages/pip/_vendor/rich/emoji.py create mode 100644 sbsheriff/Lib/site-packages/pip/_vendor/rich/errors.py create mode 100644 sbsheriff/Lib/site-packages/pip/_vendor/rich/file_proxy.py create mode 100644 sbsheriff/Lib/site-packages/pip/_vendor/rich/filesize.py create mode 100644 sbsheriff/Lib/site-packages/pip/_vendor/rich/highlighter.py create mode 100644 sbsheriff/Lib/site-packages/pip/_vendor/rich/json.py create mode 100644 sbsheriff/Lib/site-packages/pip/_vendor/rich/jupyter.py create mode 100644 sbsheriff/Lib/site-packages/pip/_vendor/rich/layout.py create mode 100644 sbsheriff/Lib/site-packages/pip/_vendor/rich/live.py create mode 100644 sbsheriff/Lib/site-packages/pip/_vendor/rich/live_render.py create mode 100644 sbsheriff/Lib/site-packages/pip/_vendor/rich/logging.py create mode 100644 sbsheriff/Lib/site-packages/pip/_vendor/rich/markup.py create mode 100644 sbsheriff/Lib/site-packages/pip/_vendor/rich/measure.py create mode 100644 sbsheriff/Lib/site-packages/pip/_vendor/rich/padding.py create mode 100644 sbsheriff/Lib/site-packages/pip/_vendor/rich/pager.py create mode 100644 sbsheriff/Lib/site-packages/pip/_vendor/rich/palette.py create mode 100644 sbsheriff/Lib/site-packages/pip/_vendor/rich/panel.py create mode 100644 sbsheriff/Lib/site-packages/pip/_vendor/rich/pretty.py create mode 100644 sbsheriff/Lib/site-packages/pip/_vendor/rich/progress.py create mode 100644 sbsheriff/Lib/site-packages/pip/_vendor/rich/progress_bar.py create mode 100644 sbsheriff/Lib/site-packages/pip/_vendor/rich/prompt.py create mode 100644 sbsheriff/Lib/site-packages/pip/_vendor/rich/protocol.py create mode 100644 sbsheriff/Lib/site-packages/pip/_vendor/rich/region.py create mode 100644 sbsheriff/Lib/site-packages/pip/_vendor/rich/repr.py create mode 100644 sbsheriff/Lib/site-packages/pip/_vendor/rich/rule.py create mode 100644 sbsheriff/Lib/site-packages/pip/_vendor/rich/scope.py create mode 100644 sbsheriff/Lib/site-packages/pip/_vendor/rich/screen.py create mode 100644 sbsheriff/Lib/site-packages/pip/_vendor/rich/segment.py create mode 100644 sbsheriff/Lib/site-packages/pip/_vendor/rich/spinner.py create mode 100644 sbsheriff/Lib/site-packages/pip/_vendor/rich/status.py create mode 100644 sbsheriff/Lib/site-packages/pip/_vendor/rich/style.py create mode 100644 sbsheriff/Lib/site-packages/pip/_vendor/rich/styled.py create mode 100644 sbsheriff/Lib/site-packages/pip/_vendor/rich/syntax.py create mode 100644 sbsheriff/Lib/site-packages/pip/_vendor/rich/table.py create mode 100644 sbsheriff/Lib/site-packages/pip/_vendor/rich/tabulate.py create mode 100644 sbsheriff/Lib/site-packages/pip/_vendor/rich/terminal_theme.py create mode 100644 sbsheriff/Lib/site-packages/pip/_vendor/rich/text.py create mode 100644 sbsheriff/Lib/site-packages/pip/_vendor/rich/theme.py create mode 100644 sbsheriff/Lib/site-packages/pip/_vendor/rich/themes.py create mode 100644 sbsheriff/Lib/site-packages/pip/_vendor/rich/traceback.py create mode 100644 sbsheriff/Lib/site-packages/pip/_vendor/rich/tree.py create mode 100644 sbsheriff/Lib/site-packages/pip/_vendor/six.py create mode 100644 sbsheriff/Lib/site-packages/pip/_vendor/tenacity/__init__.py create mode 100644 sbsheriff/Lib/site-packages/pip/_vendor/tenacity/__pycache__/__init__.cpython-310.pyc create mode 100644 sbsheriff/Lib/site-packages/pip/_vendor/tenacity/__pycache__/_asyncio.cpython-310.pyc create mode 100644 sbsheriff/Lib/site-packages/pip/_vendor/tenacity/__pycache__/_utils.cpython-310.pyc create mode 100644 sbsheriff/Lib/site-packages/pip/_vendor/tenacity/__pycache__/after.cpython-310.pyc create mode 100644 sbsheriff/Lib/site-packages/pip/_vendor/tenacity/__pycache__/before.cpython-310.pyc create mode 100644 sbsheriff/Lib/site-packages/pip/_vendor/tenacity/__pycache__/before_sleep.cpython-310.pyc create mode 100644 sbsheriff/Lib/site-packages/pip/_vendor/tenacity/__pycache__/nap.cpython-310.pyc create mode 100644 sbsheriff/Lib/site-packages/pip/_vendor/tenacity/__pycache__/retry.cpython-310.pyc create mode 100644 sbsheriff/Lib/site-packages/pip/_vendor/tenacity/__pycache__/stop.cpython-310.pyc create mode 100644 sbsheriff/Lib/site-packages/pip/_vendor/tenacity/__pycache__/tornadoweb.cpython-310.pyc create mode 100644 sbsheriff/Lib/site-packages/pip/_vendor/tenacity/__pycache__/wait.cpython-310.pyc create mode 100644 sbsheriff/Lib/site-packages/pip/_vendor/tenacity/_asyncio.py create mode 100644 sbsheriff/Lib/site-packages/pip/_vendor/tenacity/_utils.py create mode 100644 sbsheriff/Lib/site-packages/pip/_vendor/tenacity/after.py create mode 100644 sbsheriff/Lib/site-packages/pip/_vendor/tenacity/before.py create mode 100644 sbsheriff/Lib/site-packages/pip/_vendor/tenacity/before_sleep.py create mode 100644 sbsheriff/Lib/site-packages/pip/_vendor/tenacity/nap.py create mode 100644 sbsheriff/Lib/site-packages/pip/_vendor/tenacity/retry.py create mode 100644 sbsheriff/Lib/site-packages/pip/_vendor/tenacity/stop.py create mode 100644 sbsheriff/Lib/site-packages/pip/_vendor/tenacity/tornadoweb.py create mode 100644 sbsheriff/Lib/site-packages/pip/_vendor/tenacity/wait.py create mode 100644 sbsheriff/Lib/site-packages/pip/_vendor/tomli/__init__.py create mode 100644 sbsheriff/Lib/site-packages/pip/_vendor/tomli/__pycache__/__init__.cpython-310.pyc create mode 100644 sbsheriff/Lib/site-packages/pip/_vendor/tomli/__pycache__/_parser.cpython-310.pyc create mode 100644 sbsheriff/Lib/site-packages/pip/_vendor/tomli/__pycache__/_re.cpython-310.pyc create mode 100644 sbsheriff/Lib/site-packages/pip/_vendor/tomli/_parser.py create mode 100644 sbsheriff/Lib/site-packages/pip/_vendor/tomli/_re.py create mode 100644 sbsheriff/Lib/site-packages/pip/_vendor/typing_extensions.py create mode 100644 sbsheriff/Lib/site-packages/pip/_vendor/urllib3/__init__.py create mode 100644 sbsheriff/Lib/site-packages/pip/_vendor/urllib3/__pycache__/__init__.cpython-310.pyc create mode 100644 sbsheriff/Lib/site-packages/pip/_vendor/urllib3/__pycache__/_collections.cpython-310.pyc create mode 100644 sbsheriff/Lib/site-packages/pip/_vendor/urllib3/__pycache__/_version.cpython-310.pyc create mode 100644 sbsheriff/Lib/site-packages/pip/_vendor/urllib3/__pycache__/connection.cpython-310.pyc create mode 100644 sbsheriff/Lib/site-packages/pip/_vendor/urllib3/__pycache__/connectionpool.cpython-310.pyc create mode 100644 sbsheriff/Lib/site-packages/pip/_vendor/urllib3/__pycache__/exceptions.cpython-310.pyc create mode 100644 sbsheriff/Lib/site-packages/pip/_vendor/urllib3/__pycache__/fields.cpython-310.pyc create mode 100644 sbsheriff/Lib/site-packages/pip/_vendor/urllib3/__pycache__/filepost.cpython-310.pyc create mode 100644 sbsheriff/Lib/site-packages/pip/_vendor/urllib3/__pycache__/poolmanager.cpython-310.pyc create mode 100644 sbsheriff/Lib/site-packages/pip/_vendor/urllib3/__pycache__/request.cpython-310.pyc create mode 100644 sbsheriff/Lib/site-packages/pip/_vendor/urllib3/__pycache__/response.cpython-310.pyc create mode 100644 sbsheriff/Lib/site-packages/pip/_vendor/urllib3/_collections.py create mode 100644 sbsheriff/Lib/site-packages/pip/_vendor/urllib3/_version.py create mode 100644 sbsheriff/Lib/site-packages/pip/_vendor/urllib3/connection.py create mode 100644 sbsheriff/Lib/site-packages/pip/_vendor/urllib3/connectionpool.py create mode 100644 sbsheriff/Lib/site-packages/pip/_vendor/urllib3/contrib/__init__.py create mode 100644 sbsheriff/Lib/site-packages/pip/_vendor/urllib3/contrib/__pycache__/__init__.cpython-310.pyc create mode 100644 sbsheriff/Lib/site-packages/pip/_vendor/urllib3/contrib/__pycache__/_appengine_environ.cpython-310.pyc create mode 100644 sbsheriff/Lib/site-packages/pip/_vendor/urllib3/contrib/__pycache__/appengine.cpython-310.pyc create mode 100644 sbsheriff/Lib/site-packages/pip/_vendor/urllib3/contrib/__pycache__/ntlmpool.cpython-310.pyc create mode 100644 sbsheriff/Lib/site-packages/pip/_vendor/urllib3/contrib/__pycache__/pyopenssl.cpython-310.pyc create mode 100644 sbsheriff/Lib/site-packages/pip/_vendor/urllib3/contrib/__pycache__/securetransport.cpython-310.pyc create mode 100644 sbsheriff/Lib/site-packages/pip/_vendor/urllib3/contrib/__pycache__/socks.cpython-310.pyc create mode 100644 sbsheriff/Lib/site-packages/pip/_vendor/urllib3/contrib/_appengine_environ.py create mode 100644 sbsheriff/Lib/site-packages/pip/_vendor/urllib3/contrib/_securetransport/__init__.py create mode 100644 sbsheriff/Lib/site-packages/pip/_vendor/urllib3/contrib/_securetransport/__pycache__/__init__.cpython-310.pyc create mode 100644 sbsheriff/Lib/site-packages/pip/_vendor/urllib3/contrib/_securetransport/__pycache__/bindings.cpython-310.pyc create mode 100644 sbsheriff/Lib/site-packages/pip/_vendor/urllib3/contrib/_securetransport/__pycache__/low_level.cpython-310.pyc create mode 100644 sbsheriff/Lib/site-packages/pip/_vendor/urllib3/contrib/_securetransport/bindings.py create mode 100644 sbsheriff/Lib/site-packages/pip/_vendor/urllib3/contrib/_securetransport/low_level.py create mode 100644 sbsheriff/Lib/site-packages/pip/_vendor/urllib3/contrib/appengine.py create mode 100644 sbsheriff/Lib/site-packages/pip/_vendor/urllib3/contrib/ntlmpool.py create mode 100644 sbsheriff/Lib/site-packages/pip/_vendor/urllib3/contrib/pyopenssl.py create mode 100644 sbsheriff/Lib/site-packages/pip/_vendor/urllib3/contrib/securetransport.py create mode 100644 sbsheriff/Lib/site-packages/pip/_vendor/urllib3/contrib/socks.py create mode 100644 sbsheriff/Lib/site-packages/pip/_vendor/urllib3/exceptions.py create mode 100644 sbsheriff/Lib/site-packages/pip/_vendor/urllib3/fields.py create mode 100644 sbsheriff/Lib/site-packages/pip/_vendor/urllib3/filepost.py create mode 100644 sbsheriff/Lib/site-packages/pip/_vendor/urllib3/packages/__init__.py create mode 100644 sbsheriff/Lib/site-packages/pip/_vendor/urllib3/packages/__pycache__/__init__.cpython-310.pyc create mode 100644 sbsheriff/Lib/site-packages/pip/_vendor/urllib3/packages/__pycache__/six.cpython-310.pyc create mode 100644 sbsheriff/Lib/site-packages/pip/_vendor/urllib3/packages/backports/__init__.py create mode 100644 sbsheriff/Lib/site-packages/pip/_vendor/urllib3/packages/backports/__pycache__/__init__.cpython-310.pyc create mode 100644 sbsheriff/Lib/site-packages/pip/_vendor/urllib3/packages/backports/__pycache__/makefile.cpython-310.pyc create mode 100644 sbsheriff/Lib/site-packages/pip/_vendor/urllib3/packages/backports/makefile.py create mode 100644 sbsheriff/Lib/site-packages/pip/_vendor/urllib3/packages/six.py create mode 100644 sbsheriff/Lib/site-packages/pip/_vendor/urllib3/poolmanager.py create mode 100644 sbsheriff/Lib/site-packages/pip/_vendor/urllib3/request.py create mode 100644 sbsheriff/Lib/site-packages/pip/_vendor/urllib3/response.py create mode 100644 sbsheriff/Lib/site-packages/pip/_vendor/urllib3/util/__init__.py create mode 100644 sbsheriff/Lib/site-packages/pip/_vendor/urllib3/util/__pycache__/__init__.cpython-310.pyc create mode 100644 sbsheriff/Lib/site-packages/pip/_vendor/urllib3/util/__pycache__/connection.cpython-310.pyc create mode 100644 sbsheriff/Lib/site-packages/pip/_vendor/urllib3/util/__pycache__/proxy.cpython-310.pyc create mode 100644 sbsheriff/Lib/site-packages/pip/_vendor/urllib3/util/__pycache__/queue.cpython-310.pyc create mode 100644 sbsheriff/Lib/site-packages/pip/_vendor/urllib3/util/__pycache__/request.cpython-310.pyc create mode 100644 sbsheriff/Lib/site-packages/pip/_vendor/urllib3/util/__pycache__/response.cpython-310.pyc create mode 100644 sbsheriff/Lib/site-packages/pip/_vendor/urllib3/util/__pycache__/retry.cpython-310.pyc create mode 100644 sbsheriff/Lib/site-packages/pip/_vendor/urllib3/util/__pycache__/ssl_.cpython-310.pyc create mode 100644 sbsheriff/Lib/site-packages/pip/_vendor/urllib3/util/__pycache__/ssl_match_hostname.cpython-310.pyc create mode 100644 sbsheriff/Lib/site-packages/pip/_vendor/urllib3/util/__pycache__/ssltransport.cpython-310.pyc create mode 100644 sbsheriff/Lib/site-packages/pip/_vendor/urllib3/util/__pycache__/timeout.cpython-310.pyc create mode 100644 sbsheriff/Lib/site-packages/pip/_vendor/urllib3/util/__pycache__/url.cpython-310.pyc create mode 100644 sbsheriff/Lib/site-packages/pip/_vendor/urllib3/util/__pycache__/wait.cpython-310.pyc create mode 100644 sbsheriff/Lib/site-packages/pip/_vendor/urllib3/util/connection.py create mode 100644 sbsheriff/Lib/site-packages/pip/_vendor/urllib3/util/proxy.py create mode 100644 sbsheriff/Lib/site-packages/pip/_vendor/urllib3/util/queue.py create mode 100644 sbsheriff/Lib/site-packages/pip/_vendor/urllib3/util/request.py create mode 100644 sbsheriff/Lib/site-packages/pip/_vendor/urllib3/util/response.py create mode 100644 sbsheriff/Lib/site-packages/pip/_vendor/urllib3/util/retry.py create mode 100644 sbsheriff/Lib/site-packages/pip/_vendor/urllib3/util/ssl_.py create mode 100644 sbsheriff/Lib/site-packages/pip/_vendor/urllib3/util/ssl_match_hostname.py create mode 100644 sbsheriff/Lib/site-packages/pip/_vendor/urllib3/util/ssltransport.py create mode 100644 sbsheriff/Lib/site-packages/pip/_vendor/urllib3/util/timeout.py create mode 100644 sbsheriff/Lib/site-packages/pip/_vendor/urllib3/util/url.py create mode 100644 sbsheriff/Lib/site-packages/pip/_vendor/urllib3/util/wait.py create mode 100644 sbsheriff/Lib/site-packages/pip/_vendor/vendor.txt create mode 100644 sbsheriff/Lib/site-packages/pip/_vendor/webencodings/__init__.py create mode 100644 sbsheriff/Lib/site-packages/pip/_vendor/webencodings/__pycache__/__init__.cpython-310.pyc create mode 100644 sbsheriff/Lib/site-packages/pip/_vendor/webencodings/__pycache__/labels.cpython-310.pyc create mode 100644 sbsheriff/Lib/site-packages/pip/_vendor/webencodings/__pycache__/mklabels.cpython-310.pyc create mode 100644 sbsheriff/Lib/site-packages/pip/_vendor/webencodings/__pycache__/tests.cpython-310.pyc create mode 100644 sbsheriff/Lib/site-packages/pip/_vendor/webencodings/__pycache__/x_user_defined.cpython-310.pyc create mode 100644 sbsheriff/Lib/site-packages/pip/_vendor/webencodings/labels.py create mode 100644 sbsheriff/Lib/site-packages/pip/_vendor/webencodings/mklabels.py create mode 100644 sbsheriff/Lib/site-packages/pip/_vendor/webencodings/tests.py create mode 100644 sbsheriff/Lib/site-packages/pip/_vendor/webencodings/x_user_defined.py create mode 100644 sbsheriff/Lib/site-packages/pip/py.typed create mode 100644 sbsheriff/Lib/site-packages/pkg_resources/__init__.py create mode 100644 sbsheriff/Lib/site-packages/pkg_resources/__pycache__/__init__.cpython-310.pyc create mode 100644 sbsheriff/Lib/site-packages/pkg_resources/_vendor/__init__.py create mode 100644 sbsheriff/Lib/site-packages/pkg_resources/_vendor/__pycache__/__init__.cpython-310.pyc create mode 100644 sbsheriff/Lib/site-packages/pkg_resources/_vendor/__pycache__/appdirs.cpython-310.pyc create mode 100644 sbsheriff/Lib/site-packages/pkg_resources/_vendor/__pycache__/pyparsing.cpython-310.pyc create mode 100644 sbsheriff/Lib/site-packages/pkg_resources/_vendor/appdirs.py create mode 100644 sbsheriff/Lib/site-packages/pkg_resources/_vendor/packaging/__about__.py create mode 100644 sbsheriff/Lib/site-packages/pkg_resources/_vendor/packaging/__init__.py create mode 100644 sbsheriff/Lib/site-packages/pkg_resources/_vendor/packaging/__pycache__/__about__.cpython-310.pyc create mode 100644 sbsheriff/Lib/site-packages/pkg_resources/_vendor/packaging/__pycache__/__init__.cpython-310.pyc create mode 100644 sbsheriff/Lib/site-packages/pkg_resources/_vendor/packaging/__pycache__/_compat.cpython-310.pyc create mode 100644 sbsheriff/Lib/site-packages/pkg_resources/_vendor/packaging/__pycache__/_structures.cpython-310.pyc create mode 100644 sbsheriff/Lib/site-packages/pkg_resources/_vendor/packaging/__pycache__/_typing.cpython-310.pyc create mode 100644 sbsheriff/Lib/site-packages/pkg_resources/_vendor/packaging/__pycache__/markers.cpython-310.pyc create mode 100644 sbsheriff/Lib/site-packages/pkg_resources/_vendor/packaging/__pycache__/requirements.cpython-310.pyc create mode 100644 sbsheriff/Lib/site-packages/pkg_resources/_vendor/packaging/__pycache__/specifiers.cpython-310.pyc create mode 100644 sbsheriff/Lib/site-packages/pkg_resources/_vendor/packaging/__pycache__/tags.cpython-310.pyc create mode 100644 sbsheriff/Lib/site-packages/pkg_resources/_vendor/packaging/__pycache__/utils.cpython-310.pyc create mode 100644 sbsheriff/Lib/site-packages/pkg_resources/_vendor/packaging/__pycache__/version.cpython-310.pyc create mode 100644 sbsheriff/Lib/site-packages/pkg_resources/_vendor/packaging/_compat.py create mode 100644 sbsheriff/Lib/site-packages/pkg_resources/_vendor/packaging/_structures.py create mode 100644 sbsheriff/Lib/site-packages/pkg_resources/_vendor/packaging/_typing.py create mode 100644 sbsheriff/Lib/site-packages/pkg_resources/_vendor/packaging/markers.py create mode 100644 sbsheriff/Lib/site-packages/pkg_resources/_vendor/packaging/requirements.py create mode 100644 sbsheriff/Lib/site-packages/pkg_resources/_vendor/packaging/specifiers.py create mode 100644 sbsheriff/Lib/site-packages/pkg_resources/_vendor/packaging/tags.py create mode 100644 sbsheriff/Lib/site-packages/pkg_resources/_vendor/packaging/utils.py create mode 100644 sbsheriff/Lib/site-packages/pkg_resources/_vendor/packaging/version.py create mode 100644 sbsheriff/Lib/site-packages/pkg_resources/_vendor/pyparsing.py create mode 100644 sbsheriff/Lib/site-packages/pkg_resources/extern/__init__.py create mode 100644 sbsheriff/Lib/site-packages/pkg_resources/extern/__pycache__/__init__.cpython-310.pyc create mode 100644 sbsheriff/Lib/site-packages/pkg_resources/tests/data/my-test-package-source/__pycache__/setup.cpython-310.pyc create mode 100644 sbsheriff/Lib/site-packages/pkg_resources/tests/data/my-test-package-source/setup.py create mode 100644 sbsheriff/Lib/site-packages/python_dotenv-0.21.0.dist-info/INSTALLER create mode 100644 sbsheriff/Lib/site-packages/python_dotenv-0.21.0.dist-info/LICENSE create mode 100644 sbsheriff/Lib/site-packages/python_dotenv-0.21.0.dist-info/METADATA create mode 100644 sbsheriff/Lib/site-packages/python_dotenv-0.21.0.dist-info/RECORD create mode 100644 sbsheriff/Lib/site-packages/python_dotenv-0.21.0.dist-info/REQUESTED create mode 100644 sbsheriff/Lib/site-packages/python_dotenv-0.21.0.dist-info/WHEEL create mode 100644 sbsheriff/Lib/site-packages/python_dotenv-0.21.0.dist-info/entry_points.txt create mode 100644 sbsheriff/Lib/site-packages/python_dotenv-0.21.0.dist-info/top_level.txt create mode 100644 sbsheriff/Lib/site-packages/setuptools-58.1.0.dist-info/INSTALLER create mode 100644 sbsheriff/Lib/site-packages/setuptools-58.1.0.dist-info/LICENSE create mode 100644 sbsheriff/Lib/site-packages/setuptools-58.1.0.dist-info/METADATA create mode 100644 sbsheriff/Lib/site-packages/setuptools-58.1.0.dist-info/RECORD create mode 100644 sbsheriff/Lib/site-packages/setuptools-58.1.0.dist-info/REQUESTED create mode 100644 sbsheriff/Lib/site-packages/setuptools-58.1.0.dist-info/WHEEL create mode 100644 sbsheriff/Lib/site-packages/setuptools-58.1.0.dist-info/entry_points.txt create mode 100644 sbsheriff/Lib/site-packages/setuptools-58.1.0.dist-info/top_level.txt create mode 100644 sbsheriff/Lib/site-packages/setuptools/__init__.py create mode 100644 sbsheriff/Lib/site-packages/setuptools/__pycache__/__init__.cpython-310.pyc create mode 100644 sbsheriff/Lib/site-packages/setuptools/__pycache__/_deprecation_warning.cpython-310.pyc create mode 100644 sbsheriff/Lib/site-packages/setuptools/__pycache__/_imp.cpython-310.pyc create mode 100644 sbsheriff/Lib/site-packages/setuptools/__pycache__/archive_util.cpython-310.pyc create mode 100644 sbsheriff/Lib/site-packages/setuptools/__pycache__/build_meta.cpython-310.pyc create mode 100644 sbsheriff/Lib/site-packages/setuptools/__pycache__/config.cpython-310.pyc create mode 100644 sbsheriff/Lib/site-packages/setuptools/__pycache__/dep_util.cpython-310.pyc create mode 100644 sbsheriff/Lib/site-packages/setuptools/__pycache__/depends.cpython-310.pyc create mode 100644 sbsheriff/Lib/site-packages/setuptools/__pycache__/dist.cpython-310.pyc create mode 100644 sbsheriff/Lib/site-packages/setuptools/__pycache__/errors.cpython-310.pyc create mode 100644 sbsheriff/Lib/site-packages/setuptools/__pycache__/extension.cpython-310.pyc create mode 100644 sbsheriff/Lib/site-packages/setuptools/__pycache__/glob.cpython-310.pyc create mode 100644 sbsheriff/Lib/site-packages/setuptools/__pycache__/installer.cpython-310.pyc create mode 100644 sbsheriff/Lib/site-packages/setuptools/__pycache__/launch.cpython-310.pyc create mode 100644 sbsheriff/Lib/site-packages/setuptools/__pycache__/monkey.cpython-310.pyc create mode 100644 sbsheriff/Lib/site-packages/setuptools/__pycache__/msvc.cpython-310.pyc create mode 100644 sbsheriff/Lib/site-packages/setuptools/__pycache__/namespaces.cpython-310.pyc create mode 100644 sbsheriff/Lib/site-packages/setuptools/__pycache__/package_index.cpython-310.pyc create mode 100644 sbsheriff/Lib/site-packages/setuptools/__pycache__/py34compat.cpython-310.pyc create mode 100644 sbsheriff/Lib/site-packages/setuptools/__pycache__/sandbox.cpython-310.pyc create mode 100644 sbsheriff/Lib/site-packages/setuptools/__pycache__/unicode_utils.cpython-310.pyc create mode 100644 sbsheriff/Lib/site-packages/setuptools/__pycache__/version.cpython-310.pyc create mode 100644 sbsheriff/Lib/site-packages/setuptools/__pycache__/wheel.cpython-310.pyc create mode 100644 sbsheriff/Lib/site-packages/setuptools/__pycache__/windows_support.cpython-310.pyc create mode 100644 sbsheriff/Lib/site-packages/setuptools/_deprecation_warning.py create mode 100644 sbsheriff/Lib/site-packages/setuptools/_distutils/__init__.py create mode 100644 sbsheriff/Lib/site-packages/setuptools/_distutils/__pycache__/__init__.cpython-310.pyc create mode 100644 sbsheriff/Lib/site-packages/setuptools/_distutils/__pycache__/_msvccompiler.cpython-310.pyc create mode 100644 sbsheriff/Lib/site-packages/setuptools/_distutils/__pycache__/archive_util.cpython-310.pyc create mode 100644 sbsheriff/Lib/site-packages/setuptools/_distutils/__pycache__/bcppcompiler.cpython-310.pyc create mode 100644 sbsheriff/Lib/site-packages/setuptools/_distutils/__pycache__/ccompiler.cpython-310.pyc create mode 100644 sbsheriff/Lib/site-packages/setuptools/_distutils/__pycache__/cmd.cpython-310.pyc create mode 100644 sbsheriff/Lib/site-packages/setuptools/_distutils/__pycache__/config.cpython-310.pyc create mode 100644 sbsheriff/Lib/site-packages/setuptools/_distutils/__pycache__/core.cpython-310.pyc create mode 100644 sbsheriff/Lib/site-packages/setuptools/_distutils/__pycache__/cygwinccompiler.cpython-310.pyc create mode 100644 sbsheriff/Lib/site-packages/setuptools/_distutils/__pycache__/debug.cpython-310.pyc create mode 100644 sbsheriff/Lib/site-packages/setuptools/_distutils/__pycache__/dep_util.cpython-310.pyc create mode 100644 sbsheriff/Lib/site-packages/setuptools/_distutils/__pycache__/dir_util.cpython-310.pyc create mode 100644 sbsheriff/Lib/site-packages/setuptools/_distutils/__pycache__/dist.cpython-310.pyc create mode 100644 sbsheriff/Lib/site-packages/setuptools/_distutils/__pycache__/errors.cpython-310.pyc create mode 100644 sbsheriff/Lib/site-packages/setuptools/_distutils/__pycache__/extension.cpython-310.pyc create mode 100644 sbsheriff/Lib/site-packages/setuptools/_distutils/__pycache__/fancy_getopt.cpython-310.pyc create mode 100644 sbsheriff/Lib/site-packages/setuptools/_distutils/__pycache__/file_util.cpython-310.pyc create mode 100644 sbsheriff/Lib/site-packages/setuptools/_distutils/__pycache__/filelist.cpython-310.pyc create mode 100644 sbsheriff/Lib/site-packages/setuptools/_distutils/__pycache__/log.cpython-310.pyc create mode 100644 sbsheriff/Lib/site-packages/setuptools/_distutils/__pycache__/msvc9compiler.cpython-310.pyc create mode 100644 sbsheriff/Lib/site-packages/setuptools/_distutils/__pycache__/msvccompiler.cpython-310.pyc create mode 100644 sbsheriff/Lib/site-packages/setuptools/_distutils/__pycache__/py35compat.cpython-310.pyc create mode 100644 sbsheriff/Lib/site-packages/setuptools/_distutils/__pycache__/py38compat.cpython-310.pyc create mode 100644 sbsheriff/Lib/site-packages/setuptools/_distutils/__pycache__/spawn.cpython-310.pyc create mode 100644 sbsheriff/Lib/site-packages/setuptools/_distutils/__pycache__/sysconfig.cpython-310.pyc create mode 100644 sbsheriff/Lib/site-packages/setuptools/_distutils/__pycache__/text_file.cpython-310.pyc create mode 100644 sbsheriff/Lib/site-packages/setuptools/_distutils/__pycache__/unixccompiler.cpython-310.pyc create mode 100644 sbsheriff/Lib/site-packages/setuptools/_distutils/__pycache__/util.cpython-310.pyc create mode 100644 sbsheriff/Lib/site-packages/setuptools/_distutils/__pycache__/version.cpython-310.pyc create mode 100644 sbsheriff/Lib/site-packages/setuptools/_distutils/__pycache__/versionpredicate.cpython-310.pyc create mode 100644 sbsheriff/Lib/site-packages/setuptools/_distutils/_msvccompiler.py create mode 100644 sbsheriff/Lib/site-packages/setuptools/_distutils/archive_util.py create mode 100644 sbsheriff/Lib/site-packages/setuptools/_distutils/bcppcompiler.py create mode 100644 sbsheriff/Lib/site-packages/setuptools/_distutils/ccompiler.py create mode 100644 sbsheriff/Lib/site-packages/setuptools/_distutils/cmd.py create mode 100644 sbsheriff/Lib/site-packages/setuptools/_distutils/command/__init__.py create mode 100644 sbsheriff/Lib/site-packages/setuptools/_distutils/command/__pycache__/__init__.cpython-310.pyc create mode 100644 sbsheriff/Lib/site-packages/setuptools/_distutils/command/__pycache__/bdist.cpython-310.pyc create mode 100644 sbsheriff/Lib/site-packages/setuptools/_distutils/command/__pycache__/bdist_dumb.cpython-310.pyc create mode 100644 sbsheriff/Lib/site-packages/setuptools/_distutils/command/__pycache__/bdist_msi.cpython-310.pyc create mode 100644 sbsheriff/Lib/site-packages/setuptools/_distutils/command/__pycache__/bdist_rpm.cpython-310.pyc create mode 100644 sbsheriff/Lib/site-packages/setuptools/_distutils/command/__pycache__/bdist_wininst.cpython-310.pyc create mode 100644 sbsheriff/Lib/site-packages/setuptools/_distutils/command/__pycache__/build.cpython-310.pyc create mode 100644 sbsheriff/Lib/site-packages/setuptools/_distutils/command/__pycache__/build_clib.cpython-310.pyc create mode 100644 sbsheriff/Lib/site-packages/setuptools/_distutils/command/__pycache__/build_ext.cpython-310.pyc create mode 100644 sbsheriff/Lib/site-packages/setuptools/_distutils/command/__pycache__/build_py.cpython-310.pyc create mode 100644 sbsheriff/Lib/site-packages/setuptools/_distutils/command/__pycache__/build_scripts.cpython-310.pyc create mode 100644 sbsheriff/Lib/site-packages/setuptools/_distutils/command/__pycache__/check.cpython-310.pyc create mode 100644 sbsheriff/Lib/site-packages/setuptools/_distutils/command/__pycache__/clean.cpython-310.pyc create mode 100644 sbsheriff/Lib/site-packages/setuptools/_distutils/command/__pycache__/config.cpython-310.pyc create mode 100644 sbsheriff/Lib/site-packages/setuptools/_distutils/command/__pycache__/install.cpython-310.pyc create mode 100644 sbsheriff/Lib/site-packages/setuptools/_distutils/command/__pycache__/install_data.cpython-310.pyc create mode 100644 sbsheriff/Lib/site-packages/setuptools/_distutils/command/__pycache__/install_egg_info.cpython-310.pyc create mode 100644 sbsheriff/Lib/site-packages/setuptools/_distutils/command/__pycache__/install_headers.cpython-310.pyc create mode 100644 sbsheriff/Lib/site-packages/setuptools/_distutils/command/__pycache__/install_lib.cpython-310.pyc create mode 100644 sbsheriff/Lib/site-packages/setuptools/_distutils/command/__pycache__/install_scripts.cpython-310.pyc create mode 100644 sbsheriff/Lib/site-packages/setuptools/_distutils/command/__pycache__/py37compat.cpython-310.pyc create mode 100644 sbsheriff/Lib/site-packages/setuptools/_distutils/command/__pycache__/register.cpython-310.pyc create mode 100644 sbsheriff/Lib/site-packages/setuptools/_distutils/command/__pycache__/sdist.cpython-310.pyc create mode 100644 sbsheriff/Lib/site-packages/setuptools/_distutils/command/__pycache__/upload.cpython-310.pyc create mode 100644 sbsheriff/Lib/site-packages/setuptools/_distutils/command/bdist.py create mode 100644 sbsheriff/Lib/site-packages/setuptools/_distutils/command/bdist_dumb.py create mode 100644 sbsheriff/Lib/site-packages/setuptools/_distutils/command/bdist_msi.py create mode 100644 sbsheriff/Lib/site-packages/setuptools/_distutils/command/bdist_rpm.py create mode 100644 sbsheriff/Lib/site-packages/setuptools/_distutils/command/bdist_wininst.py create mode 100644 sbsheriff/Lib/site-packages/setuptools/_distutils/command/build.py create mode 100644 sbsheriff/Lib/site-packages/setuptools/_distutils/command/build_clib.py create mode 100644 sbsheriff/Lib/site-packages/setuptools/_distutils/command/build_ext.py create mode 100644 sbsheriff/Lib/site-packages/setuptools/_distutils/command/build_py.py create mode 100644 sbsheriff/Lib/site-packages/setuptools/_distutils/command/build_scripts.py create mode 100644 sbsheriff/Lib/site-packages/setuptools/_distutils/command/check.py create mode 100644 sbsheriff/Lib/site-packages/setuptools/_distutils/command/clean.py create mode 100644 sbsheriff/Lib/site-packages/setuptools/_distutils/command/config.py create mode 100644 sbsheriff/Lib/site-packages/setuptools/_distutils/command/install.py create mode 100644 sbsheriff/Lib/site-packages/setuptools/_distutils/command/install_data.py create mode 100644 sbsheriff/Lib/site-packages/setuptools/_distutils/command/install_egg_info.py create mode 100644 sbsheriff/Lib/site-packages/setuptools/_distutils/command/install_headers.py create mode 100644 sbsheriff/Lib/site-packages/setuptools/_distutils/command/install_lib.py create mode 100644 sbsheriff/Lib/site-packages/setuptools/_distutils/command/install_scripts.py create mode 100644 sbsheriff/Lib/site-packages/setuptools/_distutils/command/py37compat.py create mode 100644 sbsheriff/Lib/site-packages/setuptools/_distutils/command/register.py create mode 100644 sbsheriff/Lib/site-packages/setuptools/_distutils/command/sdist.py create mode 100644 sbsheriff/Lib/site-packages/setuptools/_distutils/command/upload.py create mode 100644 sbsheriff/Lib/site-packages/setuptools/_distutils/config.py create mode 100644 sbsheriff/Lib/site-packages/setuptools/_distutils/core.py create mode 100644 sbsheriff/Lib/site-packages/setuptools/_distutils/cygwinccompiler.py create mode 100644 sbsheriff/Lib/site-packages/setuptools/_distutils/debug.py create mode 100644 sbsheriff/Lib/site-packages/setuptools/_distutils/dep_util.py create mode 100644 sbsheriff/Lib/site-packages/setuptools/_distutils/dir_util.py create mode 100644 sbsheriff/Lib/site-packages/setuptools/_distutils/dist.py create mode 100644 sbsheriff/Lib/site-packages/setuptools/_distutils/errors.py create mode 100644 sbsheriff/Lib/site-packages/setuptools/_distutils/extension.py create mode 100644 sbsheriff/Lib/site-packages/setuptools/_distutils/fancy_getopt.py create mode 100644 sbsheriff/Lib/site-packages/setuptools/_distutils/file_util.py create mode 100644 sbsheriff/Lib/site-packages/setuptools/_distutils/filelist.py create mode 100644 sbsheriff/Lib/site-packages/setuptools/_distutils/log.py create mode 100644 sbsheriff/Lib/site-packages/setuptools/_distutils/msvc9compiler.py create mode 100644 sbsheriff/Lib/site-packages/setuptools/_distutils/msvccompiler.py create mode 100644 sbsheriff/Lib/site-packages/setuptools/_distutils/py35compat.py create mode 100644 sbsheriff/Lib/site-packages/setuptools/_distutils/py38compat.py create mode 100644 sbsheriff/Lib/site-packages/setuptools/_distutils/spawn.py create mode 100644 sbsheriff/Lib/site-packages/setuptools/_distutils/sysconfig.py create mode 100644 sbsheriff/Lib/site-packages/setuptools/_distutils/text_file.py create mode 100644 sbsheriff/Lib/site-packages/setuptools/_distutils/unixccompiler.py create mode 100644 sbsheriff/Lib/site-packages/setuptools/_distutils/util.py create mode 100644 sbsheriff/Lib/site-packages/setuptools/_distutils/version.py create mode 100644 sbsheriff/Lib/site-packages/setuptools/_distutils/versionpredicate.py create mode 100644 sbsheriff/Lib/site-packages/setuptools/_imp.py create mode 100644 sbsheriff/Lib/site-packages/setuptools/_vendor/__init__.py create mode 100644 sbsheriff/Lib/site-packages/setuptools/_vendor/__pycache__/__init__.cpython-310.pyc create mode 100644 sbsheriff/Lib/site-packages/setuptools/_vendor/__pycache__/ordered_set.cpython-310.pyc create mode 100644 sbsheriff/Lib/site-packages/setuptools/_vendor/__pycache__/pyparsing.cpython-310.pyc create mode 100644 sbsheriff/Lib/site-packages/setuptools/_vendor/more_itertools/__init__.py create mode 100644 sbsheriff/Lib/site-packages/setuptools/_vendor/more_itertools/__pycache__/__init__.cpython-310.pyc create mode 100644 sbsheriff/Lib/site-packages/setuptools/_vendor/more_itertools/__pycache__/more.cpython-310.pyc create mode 100644 sbsheriff/Lib/site-packages/setuptools/_vendor/more_itertools/__pycache__/recipes.cpython-310.pyc create mode 100644 sbsheriff/Lib/site-packages/setuptools/_vendor/more_itertools/more.py create mode 100644 sbsheriff/Lib/site-packages/setuptools/_vendor/more_itertools/recipes.py create mode 100644 sbsheriff/Lib/site-packages/setuptools/_vendor/ordered_set.py create mode 100644 sbsheriff/Lib/site-packages/setuptools/_vendor/packaging/__about__.py create mode 100644 sbsheriff/Lib/site-packages/setuptools/_vendor/packaging/__init__.py create mode 100644 sbsheriff/Lib/site-packages/setuptools/_vendor/packaging/__pycache__/__about__.cpython-310.pyc create mode 100644 sbsheriff/Lib/site-packages/setuptools/_vendor/packaging/__pycache__/__init__.cpython-310.pyc create mode 100644 sbsheriff/Lib/site-packages/setuptools/_vendor/packaging/__pycache__/_compat.cpython-310.pyc create mode 100644 sbsheriff/Lib/site-packages/setuptools/_vendor/packaging/__pycache__/_structures.cpython-310.pyc create mode 100644 sbsheriff/Lib/site-packages/setuptools/_vendor/packaging/__pycache__/_typing.cpython-310.pyc create mode 100644 sbsheriff/Lib/site-packages/setuptools/_vendor/packaging/__pycache__/markers.cpython-310.pyc create mode 100644 sbsheriff/Lib/site-packages/setuptools/_vendor/packaging/__pycache__/requirements.cpython-310.pyc create mode 100644 sbsheriff/Lib/site-packages/setuptools/_vendor/packaging/__pycache__/specifiers.cpython-310.pyc create mode 100644 sbsheriff/Lib/site-packages/setuptools/_vendor/packaging/__pycache__/tags.cpython-310.pyc create mode 100644 sbsheriff/Lib/site-packages/setuptools/_vendor/packaging/__pycache__/utils.cpython-310.pyc create mode 100644 sbsheriff/Lib/site-packages/setuptools/_vendor/packaging/__pycache__/version.cpython-310.pyc create mode 100644 sbsheriff/Lib/site-packages/setuptools/_vendor/packaging/_compat.py create mode 100644 sbsheriff/Lib/site-packages/setuptools/_vendor/packaging/_structures.py create mode 100644 sbsheriff/Lib/site-packages/setuptools/_vendor/packaging/_typing.py create mode 100644 sbsheriff/Lib/site-packages/setuptools/_vendor/packaging/markers.py create mode 100644 sbsheriff/Lib/site-packages/setuptools/_vendor/packaging/requirements.py create mode 100644 sbsheriff/Lib/site-packages/setuptools/_vendor/packaging/specifiers.py create mode 100644 sbsheriff/Lib/site-packages/setuptools/_vendor/packaging/tags.py create mode 100644 sbsheriff/Lib/site-packages/setuptools/_vendor/packaging/utils.py create mode 100644 sbsheriff/Lib/site-packages/setuptools/_vendor/packaging/version.py create mode 100644 sbsheriff/Lib/site-packages/setuptools/_vendor/pyparsing.py create mode 100644 sbsheriff/Lib/site-packages/setuptools/archive_util.py create mode 100644 sbsheriff/Lib/site-packages/setuptools/build_meta.py create mode 100644 sbsheriff/Lib/site-packages/setuptools/cli-32.exe create mode 100644 sbsheriff/Lib/site-packages/setuptools/cli-64.exe create mode 100644 sbsheriff/Lib/site-packages/setuptools/cli.exe create mode 100644 sbsheriff/Lib/site-packages/setuptools/command/__init__.py create mode 100644 sbsheriff/Lib/site-packages/setuptools/command/__pycache__/__init__.cpython-310.pyc create mode 100644 sbsheriff/Lib/site-packages/setuptools/command/__pycache__/alias.cpython-310.pyc create mode 100644 sbsheriff/Lib/site-packages/setuptools/command/__pycache__/bdist_egg.cpython-310.pyc create mode 100644 sbsheriff/Lib/site-packages/setuptools/command/__pycache__/bdist_rpm.cpython-310.pyc create mode 100644 sbsheriff/Lib/site-packages/setuptools/command/__pycache__/build_clib.cpython-310.pyc create mode 100644 sbsheriff/Lib/site-packages/setuptools/command/__pycache__/build_ext.cpython-310.pyc create mode 100644 sbsheriff/Lib/site-packages/setuptools/command/__pycache__/build_py.cpython-310.pyc create mode 100644 sbsheriff/Lib/site-packages/setuptools/command/__pycache__/develop.cpython-310.pyc create mode 100644 sbsheriff/Lib/site-packages/setuptools/command/__pycache__/dist_info.cpython-310.pyc create mode 100644 sbsheriff/Lib/site-packages/setuptools/command/__pycache__/easy_install.cpython-310.pyc create mode 100644 sbsheriff/Lib/site-packages/setuptools/command/__pycache__/egg_info.cpython-310.pyc create mode 100644 sbsheriff/Lib/site-packages/setuptools/command/__pycache__/install.cpython-310.pyc create mode 100644 sbsheriff/Lib/site-packages/setuptools/command/__pycache__/install_egg_info.cpython-310.pyc create mode 100644 sbsheriff/Lib/site-packages/setuptools/command/__pycache__/install_lib.cpython-310.pyc create mode 100644 sbsheriff/Lib/site-packages/setuptools/command/__pycache__/install_scripts.cpython-310.pyc create mode 100644 sbsheriff/Lib/site-packages/setuptools/command/__pycache__/py36compat.cpython-310.pyc create mode 100644 sbsheriff/Lib/site-packages/setuptools/command/__pycache__/register.cpython-310.pyc create mode 100644 sbsheriff/Lib/site-packages/setuptools/command/__pycache__/rotate.cpython-310.pyc create mode 100644 sbsheriff/Lib/site-packages/setuptools/command/__pycache__/saveopts.cpython-310.pyc create mode 100644 sbsheriff/Lib/site-packages/setuptools/command/__pycache__/sdist.cpython-310.pyc create mode 100644 sbsheriff/Lib/site-packages/setuptools/command/__pycache__/setopt.cpython-310.pyc create mode 100644 sbsheriff/Lib/site-packages/setuptools/command/__pycache__/test.cpython-310.pyc create mode 100644 sbsheriff/Lib/site-packages/setuptools/command/__pycache__/upload.cpython-310.pyc create mode 100644 sbsheriff/Lib/site-packages/setuptools/command/__pycache__/upload_docs.cpython-310.pyc create mode 100644 sbsheriff/Lib/site-packages/setuptools/command/alias.py create mode 100644 sbsheriff/Lib/site-packages/setuptools/command/bdist_egg.py create mode 100644 sbsheriff/Lib/site-packages/setuptools/command/bdist_rpm.py create mode 100644 sbsheriff/Lib/site-packages/setuptools/command/build_clib.py create mode 100644 sbsheriff/Lib/site-packages/setuptools/command/build_ext.py create mode 100644 sbsheriff/Lib/site-packages/setuptools/command/build_py.py create mode 100644 sbsheriff/Lib/site-packages/setuptools/command/develop.py create mode 100644 sbsheriff/Lib/site-packages/setuptools/command/dist_info.py create mode 100644 sbsheriff/Lib/site-packages/setuptools/command/easy_install.py create mode 100644 sbsheriff/Lib/site-packages/setuptools/command/egg_info.py create mode 100644 sbsheriff/Lib/site-packages/setuptools/command/install.py create mode 100644 sbsheriff/Lib/site-packages/setuptools/command/install_egg_info.py create mode 100644 sbsheriff/Lib/site-packages/setuptools/command/install_lib.py create mode 100644 sbsheriff/Lib/site-packages/setuptools/command/install_scripts.py create mode 100644 sbsheriff/Lib/site-packages/setuptools/command/launcher manifest.xml create mode 100644 sbsheriff/Lib/site-packages/setuptools/command/py36compat.py create mode 100644 sbsheriff/Lib/site-packages/setuptools/command/register.py create mode 100644 sbsheriff/Lib/site-packages/setuptools/command/rotate.py create mode 100644 sbsheriff/Lib/site-packages/setuptools/command/saveopts.py create mode 100644 sbsheriff/Lib/site-packages/setuptools/command/sdist.py create mode 100644 sbsheriff/Lib/site-packages/setuptools/command/setopt.py create mode 100644 sbsheriff/Lib/site-packages/setuptools/command/test.py create mode 100644 sbsheriff/Lib/site-packages/setuptools/command/upload.py create mode 100644 sbsheriff/Lib/site-packages/setuptools/command/upload_docs.py create mode 100644 sbsheriff/Lib/site-packages/setuptools/config.py create mode 100644 sbsheriff/Lib/site-packages/setuptools/dep_util.py create mode 100644 sbsheriff/Lib/site-packages/setuptools/depends.py create mode 100644 sbsheriff/Lib/site-packages/setuptools/dist.py create mode 100644 sbsheriff/Lib/site-packages/setuptools/errors.py create mode 100644 sbsheriff/Lib/site-packages/setuptools/extension.py create mode 100644 sbsheriff/Lib/site-packages/setuptools/extern/__init__.py create mode 100644 sbsheriff/Lib/site-packages/setuptools/extern/__pycache__/__init__.cpython-310.pyc create mode 100644 sbsheriff/Lib/site-packages/setuptools/glob.py create mode 100644 sbsheriff/Lib/site-packages/setuptools/gui-32.exe create mode 100644 sbsheriff/Lib/site-packages/setuptools/gui-64.exe create mode 100644 sbsheriff/Lib/site-packages/setuptools/gui.exe create mode 100644 sbsheriff/Lib/site-packages/setuptools/installer.py create mode 100644 sbsheriff/Lib/site-packages/setuptools/launch.py create mode 100644 sbsheriff/Lib/site-packages/setuptools/monkey.py create mode 100644 sbsheriff/Lib/site-packages/setuptools/msvc.py create mode 100644 sbsheriff/Lib/site-packages/setuptools/namespaces.py create mode 100644 sbsheriff/Lib/site-packages/setuptools/package_index.py create mode 100644 sbsheriff/Lib/site-packages/setuptools/py34compat.py create mode 100644 sbsheriff/Lib/site-packages/setuptools/sandbox.py create mode 100644 sbsheriff/Lib/site-packages/setuptools/script (dev).tmpl create mode 100644 sbsheriff/Lib/site-packages/setuptools/script.tmpl create mode 100644 sbsheriff/Lib/site-packages/setuptools/unicode_utils.py create mode 100644 sbsheriff/Lib/site-packages/setuptools/version.py create mode 100644 sbsheriff/Lib/site-packages/setuptools/wheel.py create mode 100644 sbsheriff/Lib/site-packages/setuptools/windows_support.py create mode 100644 sbsheriff/Lib/site-packages/yarl-1.8.1.dist-info/INSTALLER create mode 100644 sbsheriff/Lib/site-packages/yarl-1.8.1.dist-info/LICENSE create mode 100644 sbsheriff/Lib/site-packages/yarl-1.8.1.dist-info/METADATA create mode 100644 sbsheriff/Lib/site-packages/yarl-1.8.1.dist-info/RECORD create mode 100644 sbsheriff/Lib/site-packages/yarl-1.8.1.dist-info/WHEEL create mode 100644 sbsheriff/Lib/site-packages/yarl-1.8.1.dist-info/top_level.txt create mode 100644 sbsheriff/Lib/site-packages/yarl/__init__.py create mode 100644 sbsheriff/Lib/site-packages/yarl/__init__.pyi create mode 100644 sbsheriff/Lib/site-packages/yarl/__pycache__/__init__.cpython-310.pyc create mode 100644 sbsheriff/Lib/site-packages/yarl/__pycache__/_quoting.cpython-310.pyc create mode 100644 sbsheriff/Lib/site-packages/yarl/__pycache__/_quoting_py.cpython-310.pyc create mode 100644 sbsheriff/Lib/site-packages/yarl/__pycache__/_url.cpython-310.pyc create mode 100644 sbsheriff/Lib/site-packages/yarl/_quoting.py create mode 100644 sbsheriff/Lib/site-packages/yarl/_quoting_c.cp310-win_amd64.pyd create mode 100644 sbsheriff/Lib/site-packages/yarl/_quoting_c.pyi create mode 100644 sbsheriff/Lib/site-packages/yarl/_quoting_c.pyx create mode 100644 sbsheriff/Lib/site-packages/yarl/_quoting_py.py create mode 100644 sbsheriff/Lib/site-packages/yarl/_url.py create mode 100644 sbsheriff/Lib/site-packages/yarl/py.typed create mode 100644 sbsheriff/Scripts/Activate.ps1 create mode 100644 sbsheriff/Scripts/activate create mode 100644 sbsheriff/Scripts/activate.bat create mode 100644 sbsheriff/Scripts/deactivate.bat create mode 100644 sbsheriff/Scripts/dotenv.exe create mode 100644 sbsheriff/Scripts/normalizer.exe create mode 100644 sbsheriff/Scripts/pip.exe create mode 100644 sbsheriff/Scripts/pip3.10.exe create mode 100644 sbsheriff/Scripts/pip3.exe create mode 100644 sbsheriff/Scripts/python.exe create mode 100644 sbsheriff/Scripts/pythonw.exe create mode 100644 sbsheriff/pyvenv.cfg diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..03bd412 --- /dev/null +++ b/.gitignore @@ -0,0 +1 @@ +*.env diff --git a/requirements.txt b/requirements.txt new file mode 100644 index 0000000000000000000000000000000000000000..d63b94a8720d680591a8eabe025bd1b95b4abf1c GIT binary patch literal 398 zcmYL_;SRw-5QOKq#G_QSMf~wFLUEx^TuFF%e7o0bE}PtDW@l&i``Ice>ZFc$(}q`T zrZrV+s);h5U>$X(yEvx=uc&#?NqT|qRG<>nszLL?-}DyFGk(^yO?M^7DpxVJthB?) z*3kx5fo7y@eQ(ek-FrW0{sxbGb|!ashG9F++mgyV4@^a$zT)4w*_kO=+MG0K?;67m tYWLfc;{xB%K*Bt^Vru@^zmdMfd1StT7wH=QPxq2}W5$;!9Pc>Z`UhJXJK+ET literal 0 HcmV?d00001 diff --git a/sbsheriff/Lib/site-packages/_distutils_hack/__init__.py b/sbsheriff/Lib/site-packages/_distutils_hack/__init__.py new file mode 100644 index 0000000..5f40996 --- /dev/null +++ b/sbsheriff/Lib/site-packages/_distutils_hack/__init__.py @@ -0,0 +1,128 @@ +import sys +import os +import re +import importlib +import warnings + + +is_pypy = '__pypy__' in sys.builtin_module_names + + +warnings.filterwarnings('ignore', + r'.+ distutils\b.+ deprecated', + DeprecationWarning) + + +def warn_distutils_present(): + if 'distutils' not in sys.modules: + return + if is_pypy and sys.version_info < (3, 7): + # PyPy for 3.6 unconditionally imports distutils, so bypass the warning + # https://foss.heptapod.net/pypy/pypy/-/blob/be829135bc0d758997b3566062999ee8b23872b4/lib-python/3/site.py#L250 + return + warnings.warn( + "Distutils was imported before Setuptools, but importing Setuptools " + "also replaces the `distutils` module in `sys.modules`. This may lead " + "to undesirable behaviors or errors. To avoid these issues, avoid " + "using distutils directly, ensure that setuptools is installed in the " + "traditional way (e.g. not an editable install), and/or make sure " + "that setuptools is always imported before distutils.") + + +def clear_distutils(): + if 'distutils' not in sys.modules: + return + warnings.warn("Setuptools is replacing distutils.") + mods = [name for name in sys.modules if re.match(r'distutils\b', name)] + for name in mods: + del sys.modules[name] + + +def enabled(): + """ + Allow selection of distutils by environment variable. + """ + which = os.environ.get('SETUPTOOLS_USE_DISTUTILS', 'stdlib') + return which == 'local' + + +def ensure_local_distutils(): + clear_distutils() + distutils = importlib.import_module('setuptools._distutils') + distutils.__name__ = 'distutils' + sys.modules['distutils'] = distutils + + # sanity check that submodules load as expected + core = importlib.import_module('distutils.core') + assert '_distutils' in core.__file__, core.__file__ + + +def do_override(): + """ + Ensure that the local copy of distutils is preferred over stdlib. + + See https://github.com/pypa/setuptools/issues/417#issuecomment-392298401 + for more motivation. + """ + if enabled(): + warn_distutils_present() + ensure_local_distutils() + + +class DistutilsMetaFinder: + def find_spec(self, fullname, path, target=None): + if path is not None: + return + + method_name = 'spec_for_{fullname}'.format(**locals()) + method = getattr(self, method_name, lambda: None) + return method() + + def spec_for_distutils(self): + import importlib.abc + import importlib.util + + class DistutilsLoader(importlib.abc.Loader): + + def create_module(self, spec): + return importlib.import_module('setuptools._distutils') + + def exec_module(self, module): + pass + + return importlib.util.spec_from_loader('distutils', DistutilsLoader()) + + def spec_for_pip(self): + """ + Ensure stdlib distutils when running under pip. + See pypa/pip#8761 for rationale. + """ + if self.pip_imported_during_build(): + return + clear_distutils() + self.spec_for_distutils = lambda: None + + @staticmethod + def pip_imported_during_build(): + """ + Detect if pip is being imported in a build script. Ref #2355. + """ + import traceback + return any( + frame.f_globals['__file__'].endswith('setup.py') + for frame, line in traceback.walk_stack(None) + ) + + +DISTUTILS_FINDER = DistutilsMetaFinder() + + +def add_shim(): + sys.meta_path.insert(0, DISTUTILS_FINDER) + + +def remove_shim(): + try: + sys.meta_path.remove(DISTUTILS_FINDER) + except ValueError: + pass diff --git a/sbsheriff/Lib/site-packages/_distutils_hack/__pycache__/__init__.cpython-310.pyc b/sbsheriff/Lib/site-packages/_distutils_hack/__pycache__/__init__.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..4453a4dcbc40b3965262864e0e966f2b7eef99ec GIT binary patch literal 5133 zcmbtYO>^7E8Qujz2%;ofkrUTx(gv;5B%H=n>^O<-s?LYyq;4HLjqGH~Q3eLNOA#_i z(7T{yvC>Rid8Wyw)BXc#rk7m%b8zh`=iYLN`@9Phq$E3?OfiGS?qad~?E60N$0Au+ zC^KBcSD$ZnDvbS`8q-$^jrVZtzoQUL@R&97CvR}mwi=ds+6~)0orWVU$u>({tl>)M zU`E)&k=~)rnJ5YO5o^qf8R6ks7PF#^=bV@m^LWmS1yR9s;UgwaiN!}uEbd#4imdFj z#wqcPSi-wSaauf!=QDz@vFdZ*02Qk@yddcB^ml?FbEA!3qU7*}+An<(>2#1rv0iUd zOZJs)g{c%R`e^#H(YTIV*H8$avQ56l)r??kEVa}k+P1LnGqq@XoP(0E4>`7j_f@B! z%@zw)t#4?qZ)Q-0`<$`WF$8}*)PB_MCkg=krfdVGzb4Z`KTVQYzwS2&>F9mb+n9Re zhp|q4CHryMlG;x@(!W=%chB!8Vh~F|>iPHdj;`fReXr)<=|tM^hC6;NL*b{1Kj;am zBNa9=yeT{3R+K31C(4&fp@uIKKio*TshLIY8+&jAQH<@CbOSLJ_4=(hFnAW5<6@);4N>FG>Bd=S#dY;6|TSv2;%? z17J72Fa4)262_S6q-YDIwW^!h5KT5Sl1(-fX~ULmeoHD1G(psBCz-b$svb6}Glyzl zGc^w_n&R8w`qlNj8l%_OQWZU1UzJQ#*-SFoVijqci z8XjRntp%DF7vXSmui@4&qS(L+UzBP71GtM_erPFcm;b|hV8M3yaITQadb4U}mXcYi z8>X!eHEM5UPA}}ri6Ybjrp(GKG0du!boZ;(?bNYpeT*q|Qs#@?fb&$@g=p1PIFdP3f9zG@S|CIGN3wR z6p_v5zLvJWkXM7;{xif1B2^Gfm_U8)C`Mn^GAm>b&3jxRXL45;7*S4^yg>3H(zqZ3 z-DUeMSLcq)32lgFM28=vlCpi!FXcvB7L^p!OkA^u|1yfbG38syftr>5R?^=&$_|(& zJVqOy9L_d@Tk~_Z*UDy^H7Wg0n)db8<>iei?F^cbTXz{DGhCjCc{%s^%a<;^bIw#T zhRAmQ%_|o#Ub%efjSFTnL@q=fc>HdXMq43KHD_VHY8!SK?_~BrB|u|T#(L*O5)ecc z3Aq9>Xb*)uLxOX@Q)JLb=!LfNZ13TzFQSl)5)ULDWnl^X5l7nLh!Ro)N4R1J&ysY7 zCuSePzcprzIOnp{tK&fYu}s4cBg8^gZxN}-7r6yWc8s-NLS+|e&44SH2r2j`6HWx` z?z4aLzwtdM1*vzD=l}uRxA#iBrTv_^!_&GiTLGjL{INZVW8&K0i5(FU$VdK%AkYe5 z^ZIdVO+@Cc#9_B7!fSQv#1LxDuyfN&|>4#}2bJI{^Og7h*X(tiJdNMa}Okp<4oh<;|1WHXF)TV{TJKN4+uA6(?cEuF0m@d_f}CeGCfs*$u)NuuQmAxkIh^2w)zzf zC;C*~#wfTT&eXzYE2|V?r$#4_%%)B^pC)rm*J7>%m2?qEh!`W0<q}tLY>5Md~9GUZ>f76uThcA%nXE1@oAcJ2%8`q%5GNGu$-( zpHh`kT*`yYRF<;ckv(4xdXz_-1BdeaQ9ln4^c@8v6Lrvg?(#ctU+^iKC=*1&aW+E( z>nF_hDSVqESm7_#YuL{QZbhlf@Z$H1hwx1$in*_Zn|vNGg7JYZ5CerR1O2gZQqE=;!Y|@X~qzB62o03#B-WMIrLL5D@D_^%%)K6>vr?TyzyZGi?Z%x!@ z9BBOre{3Kj|E%eL8O5I|(O+1%_V^wWe1uE(Jf-|_X`dmpc>sujW~-lJ=+HAs2hKfp zr1`V$U?WbNNYpb=_JrO>f`Wn1U|?2iD}>L?iKE_$Y;1OAL-ypuzPgqW1`0LSpB&~| zmB;1B!}p#f>*O<^dy(TB9gT>rP>rSi&#x;y1WW ze(K>E>3LqoDp$CoH%Ewu_T;!i2chwCCAAN&(a#QqCgS7h6qU_l`7p?n1f1HXO0&h{ z=n;H)v%Y%c(tOhCjr``jc>4$c)j zr#U#r*&j^Lb{>up1&;BFS)hQ}WV5X7Tvt&?d)Eh@1N&&T^on#dpGg7IFUkyvEqrXzfqCe07 zKji5%ohI{a`W)5B!i>ty4veS_j3?svR`LLQjdZ0cK6@ruP{1hLu5IBbg7ckM@)o^W O@L{ep@1FPUdFQ{g@eE%8 literal 0 HcmV?d00001 diff --git a/sbsheriff/Lib/site-packages/_distutils_hack/__pycache__/override.cpython-310.pyc b/sbsheriff/Lib/site-packages/_distutils_hack/__pycache__/override.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..6be7f5ccf9668bad74eb1ce265da1d8dd4e33303 GIT binary patch literal 239 zcmZ9GJqiLr425U55=FH21S0s;i-@45*och`gk2}AL6=#QQPkFpXz7(~y@i#tf*?M~ zdwEU1xN5bmg3isxsvYuKlwU=mjKWAg7%HnS`l@eAE34j}d%?JG7J@8h?wO8ef(Iksah5QxV~ZdgWJ*&b$# +Maintainer-email: team@aiohttp.org +License: Apache 2 +Project-URL: Chat: Gitter, https://gitter.im/aio-libs/Lobby +Project-URL: CI: GitHub Actions, https://github.com/aio-libs/aiohttp/actions?query=workflow%3ACI +Project-URL: Coverage: codecov, https://codecov.io/github/aio-libs/aiohttp +Project-URL: Docs: Changelog, https://docs.aiohttp.org/en/stable/changes.html +Project-URL: Docs: RTD, https://docs.aiohttp.org +Project-URL: GitHub: issues, https://github.com/aio-libs/aiohttp/issues +Project-URL: GitHub: repo, https://github.com/aio-libs/aiohttp +Platform: UNKNOWN +Classifier: Development Status :: 5 - Production/Stable +Classifier: Framework :: AsyncIO +Classifier: Intended Audience :: Developers +Classifier: License :: OSI Approved :: Apache Software License +Classifier: Operating System :: POSIX +Classifier: Operating System :: MacOS :: MacOS X +Classifier: Operating System :: Microsoft :: Windows +Classifier: Programming Language :: Python +Classifier: Programming Language :: Python :: 3 +Classifier: Programming Language :: Python :: 3.6 +Classifier: Programming Language :: Python :: 3.7 +Classifier: Programming Language :: Python :: 3.8 +Classifier: Programming Language :: Python :: 3.9 +Classifier: Programming Language :: Python :: 3.10 +Classifier: Topic :: Internet :: WWW/HTTP +Requires-Python: >=3.6 +Description-Content-Type: text/x-rst +License-File: LICENSE.txt +Requires-Dist: attrs (>=17.3.0) +Requires-Dist: charset-normalizer (<3.0,>=2.0) +Requires-Dist: multidict (<7.0,>=4.5) +Requires-Dist: async-timeout (<5.0,>=4.0.0a3) +Requires-Dist: yarl (<2.0,>=1.0) +Requires-Dist: frozenlist (>=1.1.1) +Requires-Dist: aiosignal (>=1.1.2) +Requires-Dist: idna-ssl (>=1.0) ; python_version < "3.7" +Requires-Dist: asynctest (==0.13.0) ; python_version < "3.8" +Requires-Dist: typing-extensions (>=3.7.4) ; python_version < "3.8" +Provides-Extra: speedups +Requires-Dist: aiodns ; extra == 'speedups' +Requires-Dist: Brotli ; extra == 'speedups' +Requires-Dist: cchardet ; extra == 'speedups' + +================================== +Async http client/server framework +================================== + +.. image:: https://raw.githubusercontent.com/aio-libs/aiohttp/master/docs/aiohttp-plain.svg + :height: 64px + :width: 64px + :alt: aiohttp logo + +| + +.. image:: https://github.com/aio-libs/aiohttp/workflows/CI/badge.svg + :target: https://github.com/aio-libs/aiohttp/actions?query=workflow%3ACI + :alt: GitHub Actions status for master branch + +.. image:: https://codecov.io/gh/aio-libs/aiohttp/branch/master/graph/badge.svg + :target: https://codecov.io/gh/aio-libs/aiohttp + :alt: codecov.io status for master branch + +.. image:: https://badge.fury.io/py/aiohttp.svg + :target: https://pypi.org/project/aiohttp + :alt: Latest PyPI package version + +.. image:: https://readthedocs.org/projects/aiohttp/badge/?version=latest + :target: https://docs.aiohttp.org/ + :alt: Latest Read The Docs + +.. image:: https://img.shields.io/discourse/status?server=https%3A%2F%2Faio-libs.discourse.group + :target: https://aio-libs.discourse.group + :alt: Discourse status + +.. image:: https://badges.gitter.im/Join%20Chat.svg + :target: https://gitter.im/aio-libs/Lobby + :alt: Chat on Gitter + + +Key Features +============ + +- Supports both client and server side of HTTP protocol. +- Supports both client and server Web-Sockets out-of-the-box and avoids + Callback Hell. +- Provides Web-server with middlewares and plugable routing. + + +Getting started +=============== + +Client +------ + +To get something from the web: + +.. code-block:: python + + import aiohttp + import asyncio + + async def main(): + + async with aiohttp.ClientSession() as session: + async with session.get('http://python.org') as response: + + print("Status:", response.status) + print("Content-type:", response.headers['content-type']) + + html = await response.text() + print("Body:", html[:15], "...") + + loop = asyncio.get_event_loop() + loop.run_until_complete(main()) + +This prints: + +.. code-block:: + + Status: 200 + Content-type: text/html; charset=utf-8 + Body: ... + +Coming from `requests `_ ? Read `why we need so many lines `_. + +Server +------ + +An example using a simple server: + +.. code-block:: python + + # examples/server_simple.py + from aiohttp import web + + async def handle(request): + name = request.match_info.get('name', "Anonymous") + text = "Hello, " + name + return web.Response(text=text) + + async def wshandle(request): + ws = web.WebSocketResponse() + await ws.prepare(request) + + async for msg in ws: + if msg.type == web.WSMsgType.text: + await ws.send_str("Hello, {}".format(msg.data)) + elif msg.type == web.WSMsgType.binary: + await ws.send_bytes(msg.data) + elif msg.type == web.WSMsgType.close: + break + + return ws + + + app = web.Application() + app.add_routes([web.get('/', handle), + web.get('/echo', wshandle), + web.get('/{name}', handle)]) + + if __name__ == '__main__': + web.run_app(app) + + +Documentation +============= + +https://aiohttp.readthedocs.io/ + + +Demos +===== + +https://github.com/aio-libs/aiohttp-demos + + +External links +============== + +* `Third party libraries + `_ +* `Built with aiohttp + `_ +* `Powered by aiohttp + `_ + +Feel free to make a Pull Request for adding your link to these pages! + + +Communication channels +====================== + +*aio-libs discourse group*: https://aio-libs.discourse.group + +*gitter chat* https://gitter.im/aio-libs/Lobby + +We support `Stack Overflow +`_. +Please add *aiohttp* tag to your question there. + +Requirements +============ + +- Python >= 3.6 +- async-timeout_ +- attrs_ +- charset-normalizer_ +- multidict_ +- yarl_ + +Optionally you may install the cChardet_ and aiodns_ libraries (highly +recommended for sake of speed). + +.. _charset-normalizer: https://pypi.org/project/charset-normalizer +.. _aiodns: https://pypi.python.org/pypi/aiodns +.. _attrs: https://github.com/python-attrs/attrs +.. _multidict: https://pypi.python.org/pypi/multidict +.. _yarl: https://pypi.python.org/pypi/yarl +.. _async-timeout: https://pypi.python.org/pypi/async_timeout +.. _cChardet: https://pypi.python.org/pypi/cchardet + +License +======= + +``aiohttp`` is offered under the Apache 2 license. + + +Keepsafe +======== + +The aiohttp community would like to thank Keepsafe +(https://www.getkeepsafe.com) for its support in the early days of +the project. + + +Source code +=========== + +The latest developer version is available in a GitHub repository: +https://github.com/aio-libs/aiohttp + +Benchmarks +========== + +If you are interested in efficiency, the AsyncIO community maintains a +list of benchmarks on the official wiki: +https://github.com/python/asyncio/wiki/Benchmarks + + diff --git a/sbsheriff/Lib/site-packages/aiohttp-3.8.1.dist-info/RECORD b/sbsheriff/Lib/site-packages/aiohttp-3.8.1.dist-info/RECORD new file mode 100644 index 0000000..9f37d8f --- /dev/null +++ b/sbsheriff/Lib/site-packages/aiohttp-3.8.1.dist-info/RECORD @@ -0,0 +1,123 @@ +aiohttp-3.8.1.dist-info/INSTALLER,sha256=zuuue4knoyJ-UwPPXg8fezS7VCrXJQrAP7zeNuwvFQg,4 +aiohttp-3.8.1.dist-info/LICENSE.txt,sha256=CbjEGhGLCTtscH6PL7yug73to6It6fLb8uojWPX1VSs,612 +aiohttp-3.8.1.dist-info/METADATA,sha256=leqF7e_6a-kaeZYF95OmGuHmBJSrszA1eeLyVjzT9t4,7322 +aiohttp-3.8.1.dist-info/RECORD,, +aiohttp-3.8.1.dist-info/WHEEL,sha256=C6CHup2HLC2Rld8AL5u9w89MYULjdaP5k0k7SG83CcI,102 +aiohttp-3.8.1.dist-info/top_level.txt,sha256=iv-JIaacmTl-hSho3QmphcKnbRRYx1st47yjz_178Ro,8 +aiohttp/.hash/_cparser.pxd.hash,sha256=1tLMUc3IzMppOVKW99LKG1TD6szTXGSaCfHgiPOL9aA,108 +aiohttp/.hash/_find_header.pxd.hash,sha256=TxG5w4etbVd6sfm5JWbdf5PW6LnuXRQnlMoFBVGKN2E,112 +aiohttp/.hash/_helpers.pyi.hash,sha256=D1pTrCkUaJ3by1XeGH_nE-amt7XdjfRHcm9oRtoGhHQ,108 +aiohttp/.hash/_helpers.pyx.hash,sha256=MA4zlNd5xukP4VDAbnoId0Azv8HxCpwLWie2gSMPLsw,108 +aiohttp/.hash/_http_parser.pyx.hash,sha256=AVrrJ4SFdluXTl9VvGvjt7SkdGSf8PtkKTM8DeneYKk,112 +aiohttp/.hash/_http_writer.pyx.hash,sha256=oqW0CdYfKNwSX0PKREN8Qz_Mi4aaioGCIPbEvsaEgaM,112 +aiohttp/.hash/_websocket.pyx.hash,sha256=8AcsJ5Tb8lZ9_QVXor_1Xbtl5igK1iP5rtEZZ0iA2AE,110 +aiohttp/.hash/hdrs.py.hash,sha256=Vfr7WRlz3YbkgRFBfXksCI8mA7PXUMhs37jnv0kiqWQ,103 +aiohttp/__init__.py,sha256=G_kbDNtxPNUC9qfqDv2MTeuN3WLCRnuqbidkZ7tkVcY,7086 +aiohttp/__pycache__/__init__.cpython-310.pyc,, +aiohttp/__pycache__/abc.cpython-310.pyc,, +aiohttp/__pycache__/base_protocol.cpython-310.pyc,, +aiohttp/__pycache__/client.cpython-310.pyc,, +aiohttp/__pycache__/client_exceptions.cpython-310.pyc,, +aiohttp/__pycache__/client_proto.cpython-310.pyc,, +aiohttp/__pycache__/client_reqrep.cpython-310.pyc,, +aiohttp/__pycache__/client_ws.cpython-310.pyc,, +aiohttp/__pycache__/connector.cpython-310.pyc,, +aiohttp/__pycache__/cookiejar.cpython-310.pyc,, +aiohttp/__pycache__/formdata.cpython-310.pyc,, +aiohttp/__pycache__/hdrs.cpython-310.pyc,, +aiohttp/__pycache__/helpers.cpython-310.pyc,, +aiohttp/__pycache__/http.cpython-310.pyc,, +aiohttp/__pycache__/http_exceptions.cpython-310.pyc,, +aiohttp/__pycache__/http_parser.cpython-310.pyc,, +aiohttp/__pycache__/http_websocket.cpython-310.pyc,, +aiohttp/__pycache__/http_writer.cpython-310.pyc,, +aiohttp/__pycache__/locks.cpython-310.pyc,, +aiohttp/__pycache__/log.cpython-310.pyc,, +aiohttp/__pycache__/multipart.cpython-310.pyc,, +aiohttp/__pycache__/payload.cpython-310.pyc,, +aiohttp/__pycache__/payload_streamer.cpython-310.pyc,, +aiohttp/__pycache__/pytest_plugin.cpython-310.pyc,, +aiohttp/__pycache__/resolver.cpython-310.pyc,, +aiohttp/__pycache__/streams.cpython-310.pyc,, +aiohttp/__pycache__/tcp_helpers.cpython-310.pyc,, +aiohttp/__pycache__/test_utils.cpython-310.pyc,, +aiohttp/__pycache__/tracing.cpython-310.pyc,, +aiohttp/__pycache__/typedefs.cpython-310.pyc,, +aiohttp/__pycache__/web.cpython-310.pyc,, +aiohttp/__pycache__/web_app.cpython-310.pyc,, +aiohttp/__pycache__/web_exceptions.cpython-310.pyc,, +aiohttp/__pycache__/web_fileresponse.cpython-310.pyc,, +aiohttp/__pycache__/web_log.cpython-310.pyc,, +aiohttp/__pycache__/web_middlewares.cpython-310.pyc,, +aiohttp/__pycache__/web_protocol.cpython-310.pyc,, +aiohttp/__pycache__/web_request.cpython-310.pyc,, +aiohttp/__pycache__/web_response.cpython-310.pyc,, +aiohttp/__pycache__/web_routedef.cpython-310.pyc,, +aiohttp/__pycache__/web_runner.cpython-310.pyc,, +aiohttp/__pycache__/web_server.cpython-310.pyc,, +aiohttp/__pycache__/web_urldispatcher.cpython-310.pyc,, +aiohttp/__pycache__/web_ws.cpython-310.pyc,, +aiohttp/__pycache__/worker.cpython-310.pyc,, +aiohttp/_cparser.pxd,sha256=rEtEshtn54wSf_ZCJ0EBjRyVBkIOv_oh17BcaNOd6V8,5188 +aiohttp/_find_header.c,sha256=-d1A3pkkpirVX5CDQaTSSTjdjXekmOjt-bqYcEQWbXc,197440 +aiohttp/_find_header.h,sha256=HistyxY7K3xEJ53Y5xEfwrDVDkfcV0zQ9mkzMgzi_jo,184 +aiohttp/_find_header.pxd,sha256=BFUSmxhemBtblqxzjzH3x03FfxaWlTyuAIOz8YZ5_nM,70 +aiohttp/_headers.pxi,sha256=1MhCe6Un_KI1tpO85HnDfzVO94BhcirLanAOys5FIHA,2090 +aiohttp/_helpers.c,sha256=6o0WiV3O6QP3w7CeIXWnzaDAiXlKzFsede2S_72iXP8,212983 +aiohttp/_helpers.cp310-win_amd64.pyd,sha256=AlUQN6TC_o2jmmttAQ-yqw5uNyfT4gPj369HuKhSydk,48640 +aiohttp/_helpers.pyi,sha256=2Hd5IC0Zf4YTEJ412suyyhsh1kVyVDv5g4stgyo2Ksc,208 +aiohttp/_helpers.pyx,sha256=tgl7fZh0QMT6cjf4jSJ8iaO6DdQD3GON2-SH4N5_ETg,1084 +aiohttp/_http_parser.c,sha256=mbsJXw0OQc-RGRss03ciJZCU6-32n_RVnMOgf8cAbVo,978189 +aiohttp/_http_parser.cp310-win_amd64.pyd,sha256=rdJt48AOrZ9HnXtR6i9O2Q-0C4Xod0PBZDFZ6MtItcY,242688 +aiohttp/_http_parser.pyx,sha256=DPA0SE8XjJwda86m1u3Fyr-WrjU1ngA0TQ0QM8nP9RI,27389 +aiohttp/_http_writer.c,sha256=AEz-QiTHIfIhi7PNrEHU4jXNYfQakG4MCxLmkZyPfrw,221272 +aiohttp/_http_writer.cp310-win_amd64.pyd,sha256=18pFazvctCmnuK12XvKqWaUIk8UAM0Rx4m0TlSYr7UA,44544 +aiohttp/_http_writer.pyx,sha256=8CBLytO2rx1kdpWe9HYSznhLXdeZWyE-3xI7jaGasag,4738 +aiohttp/_websocket.c,sha256=AGp31tkjXHaLdSFcI_6Cl7wGWqKLmMdk0OwLE0AdJNg,138422 +aiohttp/_websocket.cp310-win_amd64.pyd,sha256=T3F3aSJPovW8mgoUQqffh40qYA9mQ31UQEt5rtSI-Ls,28160 +aiohttp/_websocket.pyx,sha256=o9J7yi9c2-jTBjE3dUkXxhDWKvRWJz5GZfyLsgJQa38,1617 +aiohttp/abc.py,sha256=ZAnm9bpefUtEZmyn8sq1MSPqYugcKeQpzyuAwKGFXuw,5720 +aiohttp/base_protocol.py,sha256=0v3CthN_KxvGbfM8_FxJ9BPTUqS9i12FwAmZwa2udU8,2787 +aiohttp/client.py,sha256=c6I3s4pJjewThnygoBc9S8J0OyKFi2iWUrpLuZUhn08,46228 +aiohttp/client_exceptions.py,sha256=_UcHK3XARTA97iKZVyV4pxcXIrZaNMXo2uP-i1_RbcI,9619 +aiohttp/client_proto.py,sha256=znDiFu6aO85uYH2RAQZYXoN2useLY9K_DssswchyYKQ,8447 +aiohttp/client_reqrep.py,sha256=TIHaRXXdl_8pqxizifwaM25pW2_JmkfTM92KS93MuPI,38019 +aiohttp/client_ws.py,sha256=R8hACPfspjbzGmBLMR4wd94-ZhHlMnrtxMT86SDYMWg,10840 +aiohttp/connector.py,sha256=5jfOr8HbliCAKsCeaDr_HBr1kMhvrmGX5Gtl70vl3MI,52303 +aiohttp/cookiejar.py,sha256=qougeR1yU3JYyjIdbdELuERxgyQaAuXtYWw7HnbXqiY,13983 +aiohttp/formdata.py,sha256=dAEgBnFO9xcbmyf8Dbl5pB38GF1JPOwS9sFoG7rBsDo,6294 +aiohttp/hdrs.py,sha256=ygDnAqYCot8NMQyjck2r9CzpTspAOXpHknNl-yxIybY,4838 +aiohttp/helpers.py,sha256=hWYfMH8hdLea0u67N12xOPE7seloFKyWm99UNMWhBvs,27118 +aiohttp/http.py,sha256=NKlSh1UEf-ZoYBYI0IoAUq0jy_-wKyJQ-aT0GjQCy7k,1896 +aiohttp/http_exceptions.py,sha256=rLwhCbFrOpQ_ntr3GnxaxD3oRnTTNM1utmDDBUbdVTU,2691 +aiohttp/http_parser.py,sha256=M36gf2QvuBhpflaADhYMIch-GfD6lqQxgsgQANnxgF8,33546 +aiohttp/http_websocket.py,sha256=xeG_CKBaRiCy_bntLl4My63styputcl1zpGY2wtOmHY,26060 +aiohttp/http_writer.py,sha256=SglEj4FTKratNnHijo9Zhy5ZdXSy_0nClm_WzA6UoZs,6176 +aiohttp/locks.py,sha256=fIuR6LrO3cyaSR7hwUzftTM-tnOhkVfm8NVyn8EwPis,1193 +aiohttp/log.py,sha256=zYUTvXsMQ9Sz1yNN8kXwd5Qxu49a1FzjZ_wQqriEc8M,333 +aiohttp/multipart.py,sha256=0m5kNFTUrOWs_fhKWEjhnZYirZhAakTLgrWy0SQbnH0,33400 +aiohttp/payload.py,sha256=vycRTUCM-57LyZ7hVrLffJfulBeT3rhO6A-YxYmUoDk,14165 +aiohttp/payload_streamer.py,sha256=6bbqsfgysHzfUTJIUlqad1wRklVuLmNHVtScv_mWhGY,2187 +aiohttp/py.typed,sha256=3VVwXUAWVEVX7sDwyYDnW5ZdBC9_Z9AJAFfLCleUW0k,8 +aiohttp/pytest_plugin.py,sha256=26CllzLUw-JGrwfXYIK-XGbDMCDwbIaomV7Sk4WZVG4,12163 +aiohttp/resolver.py,sha256=UWM-6HJkOLwkGveoesBnGv-pJePtpE7js6ujYi7XHoc,5252 +aiohttp/streams.py,sha256=jDR3ZtPlDjaL35Oe5HcLq0LvoYXIGEbSRUnqZKEfiNk,21500 +aiohttp/tcp_helpers.py,sha256=jPHZyIHbIAqyWS0QShT_ZgKLMiDW7s_124IPc4irTU8,1000 +aiohttp/test_utils.py,sha256=hLOEAJzOfM69LGMx74xrLutS_xZMI_6-AVkPDpWyNx4,21917 +aiohttp/tracing.py,sha256=RoYBPZQqvV2pIRbeaSUGe-cElR2FdQYBZOaMnPPRJXE,15777 +aiohttp/typedefs.py,sha256=E-iS7tNE3CrcMAjz5uiwr_Zlp4CKpCU99hzAKw08g14,1830 +aiohttp/web.py,sha256=hrZ6KRXbBLLQ1XThCoL-696TApjFiYDB6vXyOsv9lBc,18515 +aiohttp/web_app.py,sha256=pQwAAMSlu89p4Vt0DRG5_c4nvOzXHi3MBSlCCiQTH14,17825 +aiohttp/web_exceptions.py,sha256=ydzJJKwJWHOKzjzh0XtZNzZ5NCb0Me8DKmlKy2qvijw,10547 +aiohttp/web_fileresponse.py,sha256=tRRZyBNPL579Ac8Q2mSF7qjHIkV42z9VyVEkvQLOJlQ,11072 +aiohttp/web_log.py,sha256=3TaiQcu9N5teUfLn71__htAnhPgE90vneVM_YCk5Zlc,7773 +aiohttp/web_middlewares.py,sha256=qmHNhOdhTtJZjChDiBlF9M-SGxF3vz2koDnxMPrlNCA,4256 +aiohttp/web_protocol.py,sha256=YOCCQYDGXZ3XQ-931PDL_JEgIDyzyNMcHRlfXyzbMe0,23229 +aiohttp/web_request.py,sha256=T5N94hz58iBnFK8ugKI02t_mJ_KRosuII3ytrb07f6I,28762 +aiohttp/web_response.py,sha256=hCk7LNxI90k1XUKOLQDWF5hs0mlD15INxibeXbj_LXg,28392 +aiohttp/web_routedef.py,sha256=zz6VaH5Mm4lAnplxoCMEVDnh1BfTGJiAWLOHalMgtRA,6253 +aiohttp/web_runner.py,sha256=QEIbQwHXwQHoHVzKxJ1V5mcxcfLZv-h9kSzcqA6REk4,11570 +aiohttp/web_server.py,sha256=iKc9a4fQS14-3ivqzBiBp742m8vEexRZiSzeKTW7NCo,2120 +aiohttp/web_urldispatcher.py,sha256=ZlkWuhY_Nl6mO7x9Aqn3-5XRle1v1G58_ynmPtJXpI8,40767 +aiohttp/web_ws.py,sha256=YAEf_B2OXOCtZnvH2V2AM4E2FHVeIo7Gg_4t5wlx1R8,17746 +aiohttp/worker.py,sha256=isIbXTFiV-oNOeI6hxRGW2My6O3MW2ImqOqjNaP9auE,9048 diff --git a/sbsheriff/Lib/site-packages/aiohttp-3.8.1.dist-info/WHEEL b/sbsheriff/Lib/site-packages/aiohttp-3.8.1.dist-info/WHEEL new file mode 100644 index 0000000..ab9f74a --- /dev/null +++ b/sbsheriff/Lib/site-packages/aiohttp-3.8.1.dist-info/WHEEL @@ -0,0 +1,5 @@ +Wheel-Version: 1.0 +Generator: bdist_wheel (0.37.0) +Root-Is-Purelib: false +Tag: cp310-cp310-win_amd64 + diff --git a/sbsheriff/Lib/site-packages/aiohttp-3.8.1.dist-info/top_level.txt b/sbsheriff/Lib/site-packages/aiohttp-3.8.1.dist-info/top_level.txt new file mode 100644 index 0000000..ee4ba4f --- /dev/null +++ b/sbsheriff/Lib/site-packages/aiohttp-3.8.1.dist-info/top_level.txt @@ -0,0 +1 @@ +aiohttp diff --git a/sbsheriff/Lib/site-packages/aiohttp/.hash/_cparser.pxd.hash b/sbsheriff/Lib/site-packages/aiohttp/.hash/_cparser.pxd.hash new file mode 100644 index 0000000..cd588d0 --- /dev/null +++ b/sbsheriff/Lib/site-packages/aiohttp/.hash/_cparser.pxd.hash @@ -0,0 +1 @@ +ac4b44b21b67e78c127ff6422741018d1c9506420ebffa21d7b05c68d39de95f *D:/a/aiohttp/aiohttp/aiohttp/_cparser.pxd diff --git a/sbsheriff/Lib/site-packages/aiohttp/.hash/_find_header.pxd.hash b/sbsheriff/Lib/site-packages/aiohttp/.hash/_find_header.pxd.hash new file mode 100644 index 0000000..8af9f81 --- /dev/null +++ b/sbsheriff/Lib/site-packages/aiohttp/.hash/_find_header.pxd.hash @@ -0,0 +1 @@ +0455129b185e981b5b96ac738f31f7c74dc57f1696953cae0083b3f18679fe73 *D:/a/aiohttp/aiohttp/aiohttp/_find_header.pxd diff --git a/sbsheriff/Lib/site-packages/aiohttp/.hash/_helpers.pyi.hash b/sbsheriff/Lib/site-packages/aiohttp/.hash/_helpers.pyi.hash new file mode 100644 index 0000000..82a670d --- /dev/null +++ b/sbsheriff/Lib/site-packages/aiohttp/.hash/_helpers.pyi.hash @@ -0,0 +1 @@ +d87779202d197f8613109e35dacbb2ca1b21d64572543bf9838b2d832a362ac7 *D:/a/aiohttp/aiohttp/aiohttp/_helpers.pyi diff --git a/sbsheriff/Lib/site-packages/aiohttp/.hash/_helpers.pyx.hash b/sbsheriff/Lib/site-packages/aiohttp/.hash/_helpers.pyx.hash new file mode 100644 index 0000000..251b846 --- /dev/null +++ b/sbsheriff/Lib/site-packages/aiohttp/.hash/_helpers.pyx.hash @@ -0,0 +1 @@ +b6097b7d987440c4fa7237f88d227c89a3ba0dd403dc638ddbe487e0de7f1138 *D:/a/aiohttp/aiohttp/aiohttp/_helpers.pyx diff --git a/sbsheriff/Lib/site-packages/aiohttp/.hash/_http_parser.pyx.hash b/sbsheriff/Lib/site-packages/aiohttp/.hash/_http_parser.pyx.hash new file mode 100644 index 0000000..dec528a --- /dev/null +++ b/sbsheriff/Lib/site-packages/aiohttp/.hash/_http_parser.pyx.hash @@ -0,0 +1 @@ +0cf034484f178c9c1d6bcea6d6edc5cabf96ae35359e00344d0d1033c9cff512 *D:/a/aiohttp/aiohttp/aiohttp/_http_parser.pyx diff --git a/sbsheriff/Lib/site-packages/aiohttp/.hash/_http_writer.pyx.hash b/sbsheriff/Lib/site-packages/aiohttp/.hash/_http_writer.pyx.hash new file mode 100644 index 0000000..11278aa --- /dev/null +++ b/sbsheriff/Lib/site-packages/aiohttp/.hash/_http_writer.pyx.hash @@ -0,0 +1 @@ +f0204bcad3b6af1d6476959ef47612ce784b5dd7995b213edf123b8da19ab1a8 *D:/a/aiohttp/aiohttp/aiohttp/_http_writer.pyx diff --git a/sbsheriff/Lib/site-packages/aiohttp/.hash/_websocket.pyx.hash b/sbsheriff/Lib/site-packages/aiohttp/.hash/_websocket.pyx.hash new file mode 100644 index 0000000..1a3346e --- /dev/null +++ b/sbsheriff/Lib/site-packages/aiohttp/.hash/_websocket.pyx.hash @@ -0,0 +1 @@ +a3d27bca2f5cdbe8d3063137754917c610d62af456273e4665fc8bb202506b7f *D:/a/aiohttp/aiohttp/aiohttp/_websocket.pyx diff --git a/sbsheriff/Lib/site-packages/aiohttp/.hash/hdrs.py.hash b/sbsheriff/Lib/site-packages/aiohttp/.hash/hdrs.py.hash new file mode 100644 index 0000000..7b005e7 --- /dev/null +++ b/sbsheriff/Lib/site-packages/aiohttp/.hash/hdrs.py.hash @@ -0,0 +1 @@ +ca00e702a602a2df0d310ca3724dabf42ce94eca40397a47927365fb2c48c9b6 *D:/a/aiohttp/aiohttp/aiohttp/hdrs.py diff --git a/sbsheriff/Lib/site-packages/aiohttp/__init__.py b/sbsheriff/Lib/site-packages/aiohttp/__init__.py new file mode 100644 index 0000000..4bbcef2 --- /dev/null +++ b/sbsheriff/Lib/site-packages/aiohttp/__init__.py @@ -0,0 +1,216 @@ +__version__ = "3.8.1" + +from typing import Tuple + +from . import hdrs as hdrs +from .client import ( + BaseConnector as BaseConnector, + ClientConnectionError as ClientConnectionError, + ClientConnectorCertificateError as ClientConnectorCertificateError, + ClientConnectorError as ClientConnectorError, + ClientConnectorSSLError as ClientConnectorSSLError, + ClientError as ClientError, + ClientHttpProxyError as ClientHttpProxyError, + ClientOSError as ClientOSError, + ClientPayloadError as ClientPayloadError, + ClientProxyConnectionError as ClientProxyConnectionError, + ClientRequest as ClientRequest, + ClientResponse as ClientResponse, + ClientResponseError as ClientResponseError, + ClientSession as ClientSession, + ClientSSLError as ClientSSLError, + ClientTimeout as ClientTimeout, + ClientWebSocketResponse as ClientWebSocketResponse, + ContentTypeError as ContentTypeError, + Fingerprint as Fingerprint, + InvalidURL as InvalidURL, + NamedPipeConnector as NamedPipeConnector, + RequestInfo as RequestInfo, + ServerConnectionError as ServerConnectionError, + ServerDisconnectedError as ServerDisconnectedError, + ServerFingerprintMismatch as ServerFingerprintMismatch, + ServerTimeoutError as ServerTimeoutError, + TCPConnector as TCPConnector, + TooManyRedirects as TooManyRedirects, + UnixConnector as UnixConnector, + WSServerHandshakeError as WSServerHandshakeError, + request as request, +) +from .cookiejar import CookieJar as CookieJar, DummyCookieJar as DummyCookieJar +from .formdata import FormData as FormData +from .helpers import BasicAuth, ChainMapProxy, ETag +from .http import ( + HttpVersion as HttpVersion, + HttpVersion10 as HttpVersion10, + HttpVersion11 as HttpVersion11, + WebSocketError as WebSocketError, + WSCloseCode as WSCloseCode, + WSMessage as WSMessage, + WSMsgType as WSMsgType, +) +from .multipart import ( + BadContentDispositionHeader as BadContentDispositionHeader, + BadContentDispositionParam as BadContentDispositionParam, + BodyPartReader as BodyPartReader, + MultipartReader as MultipartReader, + MultipartWriter as MultipartWriter, + content_disposition_filename as content_disposition_filename, + parse_content_disposition as parse_content_disposition, +) +from .payload import ( + PAYLOAD_REGISTRY as PAYLOAD_REGISTRY, + AsyncIterablePayload as AsyncIterablePayload, + BufferedReaderPayload as BufferedReaderPayload, + BytesIOPayload as BytesIOPayload, + BytesPayload as BytesPayload, + IOBasePayload as IOBasePayload, + JsonPayload as JsonPayload, + Payload as Payload, + StringIOPayload as StringIOPayload, + StringPayload as StringPayload, + TextIOPayload as TextIOPayload, + get_payload as get_payload, + payload_type as payload_type, +) +from .payload_streamer import streamer as streamer +from .resolver import ( + AsyncResolver as AsyncResolver, + DefaultResolver as DefaultResolver, + ThreadedResolver as ThreadedResolver, +) +from .streams import ( + EMPTY_PAYLOAD as EMPTY_PAYLOAD, + DataQueue as DataQueue, + EofStream as EofStream, + FlowControlDataQueue as FlowControlDataQueue, + StreamReader as StreamReader, +) +from .tracing import ( + TraceConfig as TraceConfig, + TraceConnectionCreateEndParams as TraceConnectionCreateEndParams, + TraceConnectionCreateStartParams as TraceConnectionCreateStartParams, + TraceConnectionQueuedEndParams as TraceConnectionQueuedEndParams, + TraceConnectionQueuedStartParams as TraceConnectionQueuedStartParams, + TraceConnectionReuseconnParams as TraceConnectionReuseconnParams, + TraceDnsCacheHitParams as TraceDnsCacheHitParams, + TraceDnsCacheMissParams as TraceDnsCacheMissParams, + TraceDnsResolveHostEndParams as TraceDnsResolveHostEndParams, + TraceDnsResolveHostStartParams as TraceDnsResolveHostStartParams, + TraceRequestChunkSentParams as TraceRequestChunkSentParams, + TraceRequestEndParams as TraceRequestEndParams, + TraceRequestExceptionParams as TraceRequestExceptionParams, + TraceRequestRedirectParams as TraceRequestRedirectParams, + TraceRequestStartParams as TraceRequestStartParams, + TraceResponseChunkReceivedParams as TraceResponseChunkReceivedParams, +) + +__all__: Tuple[str, ...] = ( + "hdrs", + # client + "BaseConnector", + "ClientConnectionError", + "ClientConnectorCertificateError", + "ClientConnectorError", + "ClientConnectorSSLError", + "ClientError", + "ClientHttpProxyError", + "ClientOSError", + "ClientPayloadError", + "ClientProxyConnectionError", + "ClientResponse", + "ClientRequest", + "ClientResponseError", + "ClientSSLError", + "ClientSession", + "ClientTimeout", + "ClientWebSocketResponse", + "ContentTypeError", + "Fingerprint", + "InvalidURL", + "RequestInfo", + "ServerConnectionError", + "ServerDisconnectedError", + "ServerFingerprintMismatch", + "ServerTimeoutError", + "TCPConnector", + "TooManyRedirects", + "UnixConnector", + "NamedPipeConnector", + "WSServerHandshakeError", + "request", + # cookiejar + "CookieJar", + "DummyCookieJar", + # formdata + "FormData", + # helpers + "BasicAuth", + "ChainMapProxy", + "ETag", + # http + "HttpVersion", + "HttpVersion10", + "HttpVersion11", + "WSMsgType", + "WSCloseCode", + "WSMessage", + "WebSocketError", + # multipart + "BadContentDispositionHeader", + "BadContentDispositionParam", + "BodyPartReader", + "MultipartReader", + "MultipartWriter", + "content_disposition_filename", + "parse_content_disposition", + # payload + "AsyncIterablePayload", + "BufferedReaderPayload", + "BytesIOPayload", + "BytesPayload", + "IOBasePayload", + "JsonPayload", + "PAYLOAD_REGISTRY", + "Payload", + "StringIOPayload", + "StringPayload", + "TextIOPayload", + "get_payload", + "payload_type", + # payload_streamer + "streamer", + # resolver + "AsyncResolver", + "DefaultResolver", + "ThreadedResolver", + # streams + "DataQueue", + "EMPTY_PAYLOAD", + "EofStream", + "FlowControlDataQueue", + "StreamReader", + # tracing + "TraceConfig", + "TraceConnectionCreateEndParams", + "TraceConnectionCreateStartParams", + "TraceConnectionQueuedEndParams", + "TraceConnectionQueuedStartParams", + "TraceConnectionReuseconnParams", + "TraceDnsCacheHitParams", + "TraceDnsCacheMissParams", + "TraceDnsResolveHostEndParams", + "TraceDnsResolveHostStartParams", + "TraceRequestChunkSentParams", + "TraceRequestEndParams", + "TraceRequestExceptionParams", + "TraceRequestRedirectParams", + "TraceRequestStartParams", + "TraceResponseChunkReceivedParams", +) + +try: + from .worker import GunicornUVLoopWebWorker, GunicornWebWorker + + __all__ += ("GunicornWebWorker", "GunicornUVLoopWebWorker") +except ImportError: # pragma: no cover + pass diff --git a/sbsheriff/Lib/site-packages/aiohttp/__pycache__/__init__.cpython-310.pyc b/sbsheriff/Lib/site-packages/aiohttp/__pycache__/__init__.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..147d51bbddc05cc0b39b5a5808a90b8d3b09aeaa GIT binary patch literal 3693 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 ot=(yBZM_YRfM4`03Cx_ssT0nt&U*8l(j literal 0 HcmV?d00001 diff --git a/sbsheriff/Lib/site-packages/aiohttp/__pycache__/base_protocol.cpython-310.pyc b/sbsheriff/Lib/site-packages/aiohttp/__pycache__/base_protocol.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..079ebbfbc10d530911c2344ea3d2186eaf240dff GIT binary patch literal 2624 zcmb_e&2JM&6rY)0uh$#fNx+2f0!1qL0PV3tZB?MO1tAv^s;ZXN(Pn2tHeK(!Gh-l; zktpF0NshVqKj?okS5BOJYgM)H&3Y3%3hJe6?em-O_xrt%*`n2o2t2=CJDa=(?JYKD zA0HZD!mDqA5Jb?7^zol%bjbQ_==D8HgeUyWAJ+OcO1>eYCW1Fa1d?n9J6^vo=ql;f z-@$s)>oOaDH!^9F$C>q$Sethg`n%LFm}JEBLdY!MN^tJ%b6~|Q=#`{T1?e+E`<`IZ z->l*J>%KeJ?+4)Bmdqe2<$yS)M>%~<8Vgv}6vI=*+|)z?8x z=!9_a3P|7tB(MU~bJBM`H9=O%KI?t0>aYMD;A@$!t2Q+Di8=v)e-7^68ho#%(t}l_ z(ielT+1u(R%s8@wSfk3H%4*tbNp25L7WyF#*98*18Vqa z%FWHumJK;i^VD#@3}@*kh=5kVh;5&mKL=eJ11q8t-99&G#oWX>Q_u_#Ugv>3pr9#w z#uRANmvjQ&7*lo8c>r3wY>((m@b3w-Mx&|nHqz2SnCNk4 z_L&1@gEF9w0&C-}p{$U70DEY3Y=k_s5M)T()c@OO+vn$S&aayTikzb{4(J0=9MCHW z&q2GoT}K^(QSt-Hn?5m~@l9>r+d5C7kCGorPM?>-c>oqct5dLDH&7S~ss*C*%rqx# z`?i5NTpJsCPpLxLlfA;+AC59Pl(~_j>})CyB@~xY9Eb8l82AJSuYfq-ztwKY z^;|u{NIr<>%g`{y&`ma>JM1Mh-UO=24x?nkpr$}Isa#i6xX9LHy_F|vVH;1X;-zXZ z;C$Nk${ck5Wkwxwj$NE7i9@I{pTa^NfM`NGLPB1c3)CZ%ttVe3??>_zY*Q5mtc(z- zOfR7Qpm{GD;38w9I@sef6p-%vdj#_p=3symbshSkc2?O6tzbf{RvE%|wNSx5%wBZ{ z`_6)}EzDrBRJt3lV&oc*pGPqtuXB{(E%7Q zi+2w$xyyKZH+1ya&SC#!35>Y(o#874TWl+VAT^S&kKxvn>MHgHdLxyYP)Na1uBsb$ zLuMnXdN4!d#lT)6M-^9C|2ju&`}Arq7j~Iigk`<%GG0@83`LaNi1T3~#u@5O&VL!l z*>t4Axy}lsIWH|-zP+a5;!e!HXHc0Q!Z(0IE7WNe7f@ggQkbH)g#mq-C?DYf`lKAV zS4D~H;=m0QhvDHgyu%b`2;SokZAg6DX+(|4kD@5-ge$f7vYP?amkgS%5nOfd9GA0w l_nB2<*DhIYSbfL1mB$@w!_P`SzQ9XCqrXC^r%krv{R;~dRE7Wm literal 0 HcmV?d00001 diff --git a/sbsheriff/Lib/site-packages/aiohttp/__pycache__/client.cpython-310.pyc b/sbsheriff/Lib/site-packages/aiohttp/__pycache__/client.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..875b52431fc98e8e64865078a141356606821a97 GIT binary patch literal 29762 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 Pffe}yR&-}jTeklPu1b=h literal 0 HcmV?d00001 diff --git a/sbsheriff/Lib/site-packages/aiohttp/__pycache__/client_reqrep.cpython-310.pyc b/sbsheriff/Lib/site-packages/aiohttp/__pycache__/client_reqrep.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..4863e37b5756d90304110121ac2dd6f9b92909c3 GIT binary patch literal 28014 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 literal 0 HcmV?d00001 diff --git a/sbsheriff/Lib/site-packages/aiohttp/__pycache__/connector.cpython-310.pyc b/sbsheriff/Lib/site-packages/aiohttp/__pycache__/connector.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..87693205b1b6b0b0db0a028e7412c8a7de9b6a9b GIT binary patch literal 35557 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 F{x{0ob?g8D literal 0 HcmV?d00001 diff --git a/sbsheriff/Lib/site-packages/aiohttp/__pycache__/cookiejar.cpython-310.pyc b/sbsheriff/Lib/site-packages/aiohttp/__pycache__/cookiejar.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..c60524bbfa8f143f6f7cbfaf795830e881d4db15 GIT binary patch literal 10670 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 N&8gA{(gzc_{};_8^63Bo literal 0 HcmV?d00001 diff --git a/sbsheriff/Lib/site-packages/aiohttp/__pycache__/formdata.cpython-310.pyc b/sbsheriff/Lib/site-packages/aiohttp/__pycache__/formdata.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..de0822a415abe7e2b98d87aba24f9c161e7e7fcf GIT binary patch literal 4553 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 literal 0 HcmV?d00001 diff --git a/sbsheriff/Lib/site-packages/aiohttp/__pycache__/hdrs.cpython-310.pyc b/sbsheriff/Lib/site-packages/aiohttp/__pycache__/hdrs.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..27576007b7f6020d1a0852afae7cb23be6e083a9 GIT binary patch literal 5301 zcmd7WXLH*|8V7Jvq)3UXl;ongDTxzDPH4wToZ>i+VGIq$2ov z|IBp#-xHC@zo>Ed&mbCC@h>=!)TA# zqpCfM_Lx1U+T&=a?QzwfKzq_otM(MyhwKT}K8*Geds4NJqCIU-srCbxBVt&Lh*2>n z#zk68h)FTEHE16~MU1{Pf9qqY>Teu>J8B<>_p_Z~I|)0Y>=fG!?5MH_*&c#TD|?vj zH0%LokFY%oJErUm+heff%4XTl!cHiAob3tNNo5(fbFfp&&a*uUn^AUw?J3xU%ARI> z2KJD$i)_!r9#-}o+w-u~%3ff*1bal;i)@!+k1BhK?F#ISvX|Me!X8tmv0a1BD$BCv zU}u%-Y;&;3mCdu|VNWP4uw92`lr69oVds=BvXx-xm6h2luqTz>U^8GBl$mT6>?vhc zwk6op%9hzyV9zL9WwT)ymA%5Y276Z7t8A~qo>S(qy$*X`S&eNS_JXoHTLX4UnPA(1 zy{K%HZ3}i;nalPD>?LK}Y)#k|Wjkyw*vra1wq4j&WpA?iFily&7Q(J6yUBJ7mR0r^ z+ih4**&bUPrYrjh+ecw@%09;SaoD`FPq2LwmRI&Ewok(f%HC%C4D7nH&$4|EwxI0u zY+ryCm3@)zORz;{UuOFXtfcI#Y+r+wm3^J<8?cJ9Z?b(0c0<{>*}elalzo@&doWYk z_t|~`vy}ai?HyQE**k1Mf-NcgG22gI%gTPr_A}UuvY)fP3tLt8F553)wz6Nc{R;Mq zvR||P2DYZ`w`{+Iy{hazw%@~EQ}ze8Kf)Yke`5PH>~&>-Vf!nrrtEKQe}}Cr`v>kE zeP(3#{q~W(WmRVKqSg?8FjMzhL0D^r!MP9UW?Gt!%9tra{E53k=+E|j5CeZOfPnSS zxvg4LM$gKDMcv9fT4~izX3M3Lp0(sKQ?C`z>sn3@vhmB7(W^vGFY1;qhq$8K zNR}&Bp5gHbLIiT8JA#4tb+dh#-VK6G)@y~n*UT)|Zf7(MbC}9Z z)4^G_jB?Rg)K(lCZRS9|)@*ujWwO3#h*s#0LzPstRb18k`k5^}KCY z;BUFSP|#&OR|^GFvvhkXhdF~?kk9E*4iltM;_q)KaxPXjc9mQKOWLyIdRW_(aoy79 z?F6POE|g4QPGYaLlW4m>_JJgzVCbejIOq9q)%=EN$ica?v8)+6JtyOHzPE!k%8N3d z_b_@qkBzTAP}sm85!SclKw%EM0=CC?nhg8XhASEw({0s-Ow*g#q2>yD&M^z6EcPK( zmAsbdb{|1Ssa(>#W6-#rlT71w&hI3w+S=Ja@+97_mJW=aS`cD4qcz=ILZ%jUz2a!a z!V*5SSi?HgZ_$)2Q^{lh3Uo*?u1>JIJhr<2p(Ei#b+{kI~ zIJCcb2^%%-28Z`o<5)tk?ltA%{pC0utDG$t+ei1;>$kC$(D;Eoy1$3Mg8hU(!fdDa z_gN5oGQGceL0@f8+*5TyPTW&=K_*P$-@*w>n7V-C9 zSoLm`&N0?_p@{1Az577=p7n1htGk;%o`GbtTA4R+SCg@-QD~>C0X7iq)vZvbs`z}m z-IlPJmumi=j4x@%svTQ$YcjS}(Aq=Gcyz)p%jxT67Qaj`*ZdYeDkQOzOZ12^ zzP!A=f2xt}pJ-z%y{U{Pj7crW)NIBA#=LHi-(A5Q!uZ`Kyg8)ruHnlq({~r~m7cB3 zq~kQay5q=LuouWgxVMWh?DyeO&mP>l*$mx=TMvDD{*%MF95e?Ux3%H<2`Wi<>K&ox zhfhz57%as1cAQ$P<%PUW29D#?|IYYB6eAR46lsb{ibE7fD5fbMpg2x(g5o5_DT*12 z2Pqz+c$nfe#Um7tQklAg028E#5pxC6?qHrnRpxCBpQnV;Mid~8~DSX6x5r26R?ThtA_y11) OXKHvV`v3TQH2Ob5rKS@A literal 0 HcmV?d00001 diff --git a/sbsheriff/Lib/site-packages/aiohttp/__pycache__/helpers.cpython-310.pyc b/sbsheriff/Lib/site-packages/aiohttp/__pycache__/helpers.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..8ebc1a91d133f4b5bcf20d21a73012fba996bc3b GIT binary patch literal 25955 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 z z==+$gM*^AampERD3<^ZCWnfzsD)jh(h6Jf7f{e>A*w&jeHX7MG*k1laR(S>aIde$= z9nV4Bg~lh?1LwnF?iYf{OqvPx3=@86QqQmeyTysb=X^oqJpKE8@(m_$Ac5Kfmp(&R zd{evnpEF+!NB@dfC-`m`zDHYTkTX68Oy>`D1R@V2n#!f&ATXp$cA@pd+>HhZ77DM> z&qy2nI6q^J}X;P9{!(9@5y2n7y)LySQrd3^X| z20rqNlfd_aP9GUKb6$U)h5iL!jGlctzh{4NdMY?Q?ZlY5Yp0VascIqbd1a>$z$}hI zL14R1m=>8);>uDK~&tCb5G?|250~4<>)h^DeJ4={X^t(=CuePp>-Q4L8Vi*BQNL|(7c0WJ1B)46` z(;%=kb@KVaGv|&C965i?kq7&s8zaP?kd*r^i>D7=0bIq3GsUpzB(?5N~9nI$*i0M43IC(jQpErCq^1J)$mizGcD zP>aM(u7oip4hCPaWt3RN`vOusByKbyuk@FO0Mq(AYoz<|MH$G;45UxXXRB;8jgMNT zV8G-bWobBT@YOti?=fbkKa3^#HIbNw{X90ln|G%V-=&FRUpA~N;6s1^U(B%oI=wby zZH#U{)R)L?!$-2BW;Uo>yxXbZ8lTJhu(x+}B9nnZ90r=~ld1Sdqt`Ms%f8-6KRC*+ z+t+8?S$>QwM$^t~+(CpVHjb!yCzT35$7M3mM?C59bIN;}ZiL2JJ+>W(-e9G+nF;j2 z{cXTND}>KI4LwnETREAozWyG&r+fVqne@8;bLG|qcX2RC9}<_$}O;X4Qjj& zb>4smZ$gtV!*ce$6t#F8+I$68_$sXOHCW^8u+BGNgLk0AH(`@+!4}_!ZN39L*+1pz z4!;X``7Z48E_C@lxQBcNJ_xG6eaH$IAF&V->vOMnv6Ecivo`>$rQJN+_5l@(u80-iU3)@unBjyJf*7JpA zLRGV<+-{NGXTMxBnJzxJb4n)hOtJ;n>ibuVsAJsQpEA|Xs61-H*_LVzUGMP8sp~xQ zjvd#1_}EeH1@-;O<6F)|?g!^5)flp|8&96IG|N>rZ~cCj@;k&(gefL(4c)^imh3PN zn5qojn{>#O)4@Dps(K|o_A>RRY^G`pJ0ZEYp)3;jG%p#}<*jqD|6lh&)!bAtpXcY= z9bsb0Ri*E^z0(udaaGfG`cIv{=bnBy7(VPfVjBZQhhURnivZ_T6J>%50S&OQ2x z8CYcB$9Cg73?B6lk|41f_{0F3_YHtlNYoDbAD3^yb@mS@p#Ki-AVA z!4(_JtfB9V%QU=INJ4UPnXX&GixaQ1Zogkms<0|~o*zY?r_8fha6eVGn=25`khw!K zW-c7ozx5?M8Vq`i;XU$aL4*aV2$oN-6gwFIhbHzYAA*0}!!Jia;{S4l0}#F(Jz_6L zGR33DBAntq^5i)a;n~?pj&H0d;dmr*JU>tT$#c9Ma&*&-tP9CpmA~R~a2c_$>EcQ{ ev#gc%WxZCY>0SMca;I*Tj9pVV-js{xn|}djSz@99 literal 0 HcmV?d00001 diff --git a/sbsheriff/Lib/site-packages/aiohttp/__pycache__/http_exceptions.cpython-310.pyc b/sbsheriff/Lib/site-packages/aiohttp/__pycache__/http_exceptions.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..57cce6341cd6bf41dfd61288a1b5168b2449ba93 GIT binary patch literal 4266 zcmb7H&2JmW72la%E|;Vz(Xu|Q+HN;#nwYJvv}w@~)eVf;MjSw9jo5AhLg;qI8H(GG zyUfhejtKQ6134AwJu#3Rb?+Zj>@}DAoSV`n`MudCDN1tFt}vr{^Yz}m-}_=xuU9R6 z|9E4gbBNIwM4bE_5Vz3uKhX)RZ3!lLpAC4M5A3$hEMW_$?+i-q62_&r`>rKiQGRBL zvMe9kZ4b03DxfRU16=`K6*bT`Spi)Iy&&qK>xQm@UKC59mt+m=3!od~0_Y2du7h3{ z7eQY%^djgLu?l+CoL>UHCe}f(8@d7dlGp&fVdx8>zb7t(zHI1aapj@aygGh$J9&De zFQ3T1-%Hb>uVg<=rSRoP9XU*+B-WcRpaHANGw=6iBJ5|S$1zr3Fq&uCLU8-N`=fpu z-HAFW=!^Go(F2uqq}EZqcUP%Ib?A0cTJ`Zg>?JDgj8eawC|`vU3GL5zY5!@I_WaIBr^&$YBtl;I2Y6bzC;c!Meoux% zDqUPg>s$G0^Kf%u)9@({ZTZ)dLXk~B-&3sQ+lu?&K!~|D;I3Ca=}7**r5msMb419N~R+fcjzE}HX8W> zN4t%tzmM(!NR5~(AFu-}unuhW?0}=^!h)6=_~rM~mFDuMlQ~-UyQkP4S*ngL$A7xL zwewg*gF6pX6@9dGM?Tqss?}guMSDF zASmEJ`-DHY@pRrASEr`&yC$E#_lT(loH6gsyG4*$IS6#Bg5XCWG%0zRjW3@slG%4g zq7u#+iPkVMvXC^E037J;=Oswxw2s-$G2il!+1qg9N)UAVq1Hh_iiyL43s#WaGszESF#Hf#(5gURJM`1tbLk|{72N%y9o}#yBb`+~$(twTTypF@oN z8)xvsF8N>XbG!v(o4WClot5-xhzLh2%$!i|Y51fuz}Y6IR?i6Xk1;zRz<<9)hxYS_L*Qa6MGGZeu<_jcfiEB#}v)I zRID$_m*&NSNOrdJAl&aKp|~3(7EiL``06{MmcDUFlYNHyraV3A){%2sT8d#OG&mEK zT!5_iOM=g{ASTVcR7^!Nhs3&_#3|CryjbhStS<{`i+tHqZ{XOu{F_*~MT--Y$x$vR(>3R5GPOL%;{q`EA^v6lxDTClOhHOIvPt8 zYFZsKlF3J7lEX&RKSf8e<}-$L!c8i%DU}>hT5+D2KW7wsknim-W&S+=lv?A(ccHmK zqNJbp!q^{s{_cJ%wSR5A)byYBBo!+m*}b2!P4xqCX*zjG+QeABNgeT4CML|xnnKup zG!qzHdyP5YH0<%piAT@E5?43q2I`L7(~e^TlgTMRq)mo{>1IKQ0?;;^ri9~JoIBqj zk<1!j`&!YSGbm29sp%~f6a|yEbY!W^kuW$C22cZnsAiunw2?fJFv>vC&Fb&PPr`mA z@)|F*dqNc`aa=d~XiR(zN?RDDz#(OaT-6TPXUGbIf6o8PQXANzY9_p%^8zg^C>8m_ zH8q;k8ka_C_r|ZYB|SnRyoZWk>P|S6q$ zDj(A1>G~HmdIcTw(E^Rl#5s`u5sR7%#3~ZaGKw*zo3%MT%wY9SLrE%7zoPDc0QKkC z_XjkS);#NVrfB92gj90Srzw0*AuQ)^h@TlbcyPoy_w%wkvdqIYOh=kbQc)qHj73vQ zZ%uPL2vbE*5u}_lK~Psxe!vdd6g}j5l#~T}CeH&ucw3Gh%FG6p695BjQTWFa04ciB zC?s>J96Nyu0b+!jpkf3(2bDi#V}XhXR6Ht?*XABLLj}J8=vsd67b<)b=nVh3slmvrv&5QlXMn?oNIKo2t>2BkDDrFsaq#I7O*OQD`@j w!Pu60sNs1+F;np}?`B>czfDg!zo;CmVK1OiZP<-h8r6o|aEiZbqq0)@7JWr%DgXcg literal 0 HcmV?d00001 diff --git a/sbsheriff/Lib/site-packages/aiohttp/__pycache__/http_parser.cpython-310.pyc b/sbsheriff/Lib/site-packages/aiohttp/__pycache__/http_parser.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..4d26b34a20dcb38e9ed4e318e2dc095abb2c0a4f GIT binary patch literal 18052 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 Xxqx&&qM4Aj`3ar%om>Wz`|bY+1`m~r literal 0 HcmV?d00001 diff --git a/sbsheriff/Lib/site-packages/aiohttp/__pycache__/http_websocket.cpython-310.pyc b/sbsheriff/Lib/site-packages/aiohttp/__pycache__/http_websocket.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..d57031e0b0fbc3d0cd8be4742a28c36717413d83 GIT binary patch literal 15099 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 literal 0 HcmV?d00001 diff --git a/sbsheriff/Lib/site-packages/aiohttp/__pycache__/http_writer.cpython-310.pyc b/sbsheriff/Lib/site-packages/aiohttp/__pycache__/http_writer.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..cc6352af5763a315143ef0e0576e5202e8d74af4 GIT binary patch literal 5678 zcmaJ_&2!tv6$cg|NP?ukE%`Hs-6S@XMsYgrG)-JLj%>%8ap=U7odi{ifw)TvG6^sX z(2h9N#Hrm=r{`XJkY{?yt%qLPTPOcPk9+MYGri@|8K;f=dkd2Kuv>EQ@b>NZ+xLF& zEs|QzHSqiMxnoW5sA2qr3j2R06yCv;UN8-V8@|C!&f2DL>NoQl-d5Y{*uLE<_=S$+ zJDs9m?3Dacr|g$aYHzpQPQ|Z)FL0+_?bQ65=8Nr#&ZIx7`BHnTGwn}~!`{DvtCoE{LpLt~aC-^KRbG!=ae9PfS_&lU1#Yz8Ee^&4Gh0baJv}uUbTc>PQr?w%^Z2#Ug=>Lh9-#6+D{j=Aztm{e94l}{MZYWbBQ!k9c%Op#h zNqg}d(s!foDC=^(t;(10hfx-;w}mP#h3&TH+(y_De6`ml>CJ8yC2`nRh1)Thx~VEl z%kTHvS#%|8X5ZkP49Mm#ucw&|o7qYxMcDaBMwyV1SKkd&@xgFzlxvNf!PSpfuQpbe zZ#GuywyN&$penTfJ6JPjQnh`BH!d73zR{#@?EhIPyn`ow0Yn%u8N+9{4PgnJn-}vp zyJ&E0#i-kI0*zFm6K*9EuP9Drqh3&@Ac(Q`AW&`)bQ0cc6JHI2&w62dSYt(TrY3_R zjN>E=NjGT_d}TT}B%r7eTryWYlV{rRyW^ zMzp?`LS?UY!{*&^L!@hAlx#v5uM-LGYjrMmxAnTGXqOI%Yn05Ysbx>5_8rPEaTK3E zqo4|UyhC082{KYp*({s9e{^Jy`oM|AiMpT&r?d``@1i9NLbBYc4$ z<;VWObj@)w&rb~dl=w-0>XG9w@E0)BY3>b2I>XPxYmV|)_Ko!-e+i=>!zy0p=TLi` zn>g-QWerWp`y4ca6mH61&$P1PsYsxdXIj@GdxRp z(gw)D92f!U7QNYkfm+-Eh1r1uFF+kli&|3BwPj7+frZ-2zy_^y18cP!*QEBTnkon5 z^_JmVaoSB}2Fo1t@+9V0PFutq*`_M$tq86v>%CS>$RLgSLRFGp*6n3^!45>y!nn<( z)0HAkRW0B$jN*VmKu9$a9Ms4ZmG`RzK4Pb$-I6CTvz}g_B944+&jaK!S{IxtilZzD zs4^w@aEc|nr)B7-W4 zxS4SDRV6?LBpcgJ!q3sq21AcFa?#_uJ9BD!+gE=Xj}7T%lt-AqMoUPXf%(`(#*rU!|ICt( zAfCo{FH5{;J4taQ-q) ztLQ6fl(7~`o8+XV#jo+C4t)1Z(gO^=hmbWecA?Y9<}%9HF=l2C%#1x`@-&dt%52j2 zU5iS)K+wnL4)sM$Lf=K=c8k;-QZrp7jEAhGYd_5U?f_A@N(1|DK`!OoQNrX>JVB;R zlHVYQ+d(!-QjGGU9>tV9s4Gjs?R=bhW7p*c%v2Z@1~7c?ET9)wU&&7st*Zm;t}VY9 zF!`k(t%};(V`H>48h8IwFZTbY)1%bWmgglckB3=ECJ=gXN2E`SuImkd`X~vu&)2;u z=1~*gntB2m9r}%0A80JSW*DE#ymjIAQe=T)3(%gM*>IeW$Tky>24rqcWPO4!9-I)9 z<+0Dx2ko_b2!vv!p9)F@7~Fm4Lvc0?zU z+xH@IUpevmHZ~!DL5=KYh+UA|tI`Mv|R6<@MiFO1swz{)t+I!Zg%6Tw{ z&-k@5iy(T~@a4N0<0hW;O%V3LEl-&)o516;s%hiz!UtUP2E-^T+j!3)*Fr1J+5ajP z`!feTL?4u@V82-}4cbvGRB;$O<#9~&48V?kgK+K{-+;}JEQow#0N>bwt?mMDHHuJP z!}_miOTt-w))Q&=I%0Yk`KW+l&?PaqZe$d;0SKemuGNdISO?G# z(MaB+mKG9;!ih$2pkNVJlr1KE)=2FVi07YhRKU);}N%OjQ~NH?8k<7R8zi;ake1e-!SX2Yx}kc5$WLyqzc4BuupWH5G0&kp8H*zgzEXp>&HDTc8yPha<8;3}$c>jLNj&VXrNloDF%h3p}v z=Y^EUdiNJ~#d!kN`WV*sYBi#r->V_V@UUQ=DvmSaP0{WO`Md;71I{05oAkAUJ*bxE zO#A5}G|-bElWWuw($I{u)H`_BPsmxkvgKjAk z!D?_bUZQ)-3SCpCboqLIQ6Y(ZjfSAh4OX0OOA5TIygIru=zZl0`;TZs%2U;hA6&V5 z?egs#tHH|Zt;?%d-}^*a0Ae{$O(>;Qg&d^`d6m7MByA0w@-{X2n20vPy+l}Zl=e#Ws~XHP;k zkg`|zx0$O_Yw-G5@@+0#sN`eNVs5#QS6Pd)%zfUb!Gt7p$L^*d0OU$S%y3PBEEgNcfxj0 z=oAgsz_FUcu38P!ur)&EKhc^ATc=Fy8YX7ja+5lZ0eYNnL8|k08*jZ;I%xWk^avQb zYdkit7%gnoTOQdwEx2wews=9Aca?eX@Q%wDH$*Hx@5)PmrAcTu_TXis ze?I7LKO3hOFSZlpE9s@hakoCJxqX}9v|s3Dt=HbfYz16qJE^j_k|@@YiO@DynqL{7 zT7a4HAppmGcu_~5JNaK|f#h2=<~))E*#%oatBOIulV%V|ALZP+oNT*G=15tvBqd7P zmn68?&M7Gf_~j0LL_Yf6n$LNd0Iu1 H#h(5b=UP;g literal 0 HcmV?d00001 diff --git a/sbsheriff/Lib/site-packages/aiohttp/__pycache__/locks.cpython-310.pyc b/sbsheriff/Lib/site-packages/aiohttp/__pycache__/locks.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..c128ceb9b7cb51906633f129c9640a04db7b4773 GIT binary patch literal 1653 zcmZ`(&2Aev5GJ`lTFa7>xNaIFEwG28g${9VJrqUZ)Hd1zfdkYo0tjjedP&)9uXfiY zWyOL5^v4e(AARo|^bvaFwWq#9FYOH10-Qi4G@~JBI6vPEx9WD=1lI4LZe_P2A%EfK z{t95T17to2CW)j488rWNKw-}cHVy{CI2?rIXb@5I4UvHiuZawQV}n@IL(-4_hP&jT zAGqLodF7%#bum#cd0E@MDn*f@_Wp`svjb#~fGL7;229dHAejo!BJ@8BWhCS45F+$s zOSM$8<>SJ6BG;~?!I}(Id&Fd0u7lOOd>}ir3sOghkkLc8v45#b`@J%g!oJk|T334Z zr$0-Dxhk`~N{cExPft}*E1hPAFlM{mPGP;$qBf~LRp|It8O@VpCCGr3!OM;ipAz(1R#b^*U1?rMuAfRFrTHobFs!x)y~Q zgNJkkw=f@*kLyCEQkndu-1gyISX5Q*Vy)~%mj@XGNS6y`q+KBMF|awE6As-4PAyvm zHzfVh||1lO%+RZ*x6yKGz}o38Vz$gR?* z&s=C!G14&vz9o7C{{A`I{bKlo0qyY6>iqR^PhAd;t@QX<=O;ocZUEDKG#Z-YrSu{{ z9vblYtQOh1I8kOO^6J#u`ZGk@Y}Z#V;XE&M%lQK=GyxXVn6_z;&Yt>=-x`DMrL_y7 zxc>)i6Z|xQ&B+;Eup2@Fx=)?X8Cf9ry}O}rP!1Q-oZe7MX5Bgc4pRJ^>x&_7u{Von=DaML(*XDd&$w`57hx3bxDDE^Z&SjNxuGis`d-VL+ zSS>Q^W4wT8t#Jl5PL1n+EsWY=FSVBU&nLLSm vVXv!E({K66x(Bk0?Ntq*rN%2l>;rqdRjys~WmDBxIJExNB_yGnbR+l=`>BvD literal 0 HcmV?d00001 diff --git a/sbsheriff/Lib/site-packages/aiohttp/__pycache__/log.cpython-310.pyc b/sbsheriff/Lib/site-packages/aiohttp/__pycache__/log.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..61d37adce2b25e76ddf0f24063c841a8eb111215 GIT binary patch literal 460 zcmYk3zfQw25XS8!ZPK6w7Q;xq-sy-o`WrLIp*U6vYD85jEw z1hocLADNB~B=zZmz$#sU9(r51sPbHv`F4b5L?N6POqp%S52maIuQh kMVteQ-D@uCmZR1C*1KL-*=qqe^iK>!N*?nqpLZkV|L+uyivR!s literal 0 HcmV?d00001 diff --git a/sbsheriff/Lib/site-packages/aiohttp/__pycache__/multipart.cpython-310.pyc b/sbsheriff/Lib/site-packages/aiohttp/__pycache__/multipart.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..57336add16dfea497b800a190e2d110ef259739d GIT binary patch literal 26399 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 literal 0 HcmV?d00001 diff --git a/sbsheriff/Lib/site-packages/aiohttp/__pycache__/payload.cpython-310.pyc b/sbsheriff/Lib/site-packages/aiohttp/__pycache__/payload.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..4ec33af3b8319cdf4d5e56e54a98139ad9c94d40 GIT binary patch literal 13741 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 literal 0 HcmV?d00001 diff --git a/sbsheriff/Lib/site-packages/aiohttp/__pycache__/payload_streamer.cpython-310.pyc b/sbsheriff/Lib/site-packages/aiohttp/__pycache__/payload_streamer.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..8782208ec54f5de4c6be91295d0d6e576874b081 GIT binary patch literal 3268 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 literal 0 HcmV?d00001 diff --git a/sbsheriff/Lib/site-packages/aiohttp/__pycache__/resolver.cpython-310.pyc b/sbsheriff/Lib/site-packages/aiohttp/__pycache__/resolver.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..bd360cba9070ce5ccaa52d576bc7fc95e1de3521 GIT binary patch literal 4037 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 olO<k literal 0 HcmV?d00001 diff --git a/sbsheriff/Lib/site-packages/aiohttp/__pycache__/tcp_helpers.cpython-310.pyc b/sbsheriff/Lib/site-packages/aiohttp/__pycache__/tcp_helpers.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..c00e05d78b84f9fd8939ad1d962f673f2a453352 GIT binary patch literal 1149 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 literal 0 HcmV?d00001 diff --git a/sbsheriff/Lib/site-packages/aiohttp/__pycache__/tracing.cpython-310.pyc b/sbsheriff/Lib/site-packages/aiohttp/__pycache__/tracing.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..ce045baeda2df1f880ea0e93851189cd5ac710b9 GIT binary patch literal 14367 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 ZJ36H2Qobh*y!V*E2cHCl`JR!~{{jx(zLNj| literal 0 HcmV?d00001 diff --git a/sbsheriff/Lib/site-packages/aiohttp/__pycache__/typedefs.cpython-310.pyc b/sbsheriff/Lib/site-packages/aiohttp/__pycache__/typedefs.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..1fe84d5e5f26b7c6fe68730c243167746dd55e89 GIT binary patch literal 1515 zcmZWoTXWk)6xQlyS-vK5(gy03(vrl5rnFoh7=|IWT@r9Elglt{-SNoQaiT;knO!B0 z^N)DvH}E6&m8bj#9w=wmNfSUj`u5zubB^|`(o)Gc@cDgZaj={-j6aof_d%QSJ-*@( zVi=(jlGvcrolv56lbX1jvBhj^Glx3Nr7p|S9P_Bh@-)wU>azkZ5XH0NA}i4nE7LNo z&v(m1I&|J=$tydg$x%n&(nFfKo{6OdXE^1udVn0Z3W|Gk$!;q zA$H zo#m^L>>G{hm74H&!;__hUv}HQ=0>~u)8_UM(ppa@GQU0!qAcjgAiZV~$5UxD1Fogq zRxlbx$&qvp&PEvH941kkG#puIZf>2$S=5RKnXKMXc6oY%X>Xn7_u|xLMM_p2Wc$x2a^$msz$?<{;NPhGfht;knUE>1;kf)O$~JA z_Tbku5Sc9RXB+~y2V#^a0@f}ox1={%_w8k2%6x+#|CZlJI$uP%tfpdZH^`1V(JAP_ z#@Et55osdLR7guqgmklsItp$ol4_gV3LFKl0`>QB^(j1$fWLw|pb(qq>aXJk1w{oV z1!V+kPXZqE3W~CL4qV{j_M&8%@>vx!r=X_dW~Q}!aFIcxqJ(t9Gd2>m)@r|AKkOXz ze%#;L?zOj@JFWJfbmBA!|LbhEr%nqGf);yshDK-ZYI;u8@4X)!t=!7fAr_CbY_vAe z!w`I4^|_$>w8qfCJyq%SCm9HtS6je&Fp)k3mh#DY1Y??eh2}^c%Yy2?oea_t_*7|u zR%o%4rUEt~K#!pQUNF9qJ)HCo$2&x8I%aw?#Pxj@bpEdO=01z-gxA3`w-F>^j77bh z+5cwnr|N4I{PlD5o9>~&%3UlLU36P;-W6HOS)WHo*iug%1CNHouIS%Lov7axQ3lUO z!QeDF0?`ekR2|lHoFIfS6li&vd1kdn@M^?#$LXr5^0;!p<>k`{k oR<){R*0fEVs8u%0q)e7bjTFg(Y2t3bGcA+o^|$?Q)~%ZV05uz+F#rGn literal 0 HcmV?d00001 diff --git a/sbsheriff/Lib/site-packages/aiohttp/__pycache__/web.cpython-310.pyc b/sbsheriff/Lib/site-packages/aiohttp/__pycache__/web.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..6363dde533913ff2b51894448625f39bf01bdf05 GIT binary patch literal 10128 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 E2@%mpjQ{`u literal 0 HcmV?d00001 diff --git a/sbsheriff/Lib/site-packages/aiohttp/__pycache__/web_app.cpython-310.pyc b/sbsheriff/Lib/site-packages/aiohttp/__pycache__/web_app.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..6a2b568f22065fe39d768051b1c3d8467c6a0a23 GIT binary patch literal 15204 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 literal 0 HcmV?d00001 diff --git a/sbsheriff/Lib/site-packages/aiohttp/__pycache__/web_exceptions.cpython-310.pyc b/sbsheriff/Lib/site-packages/aiohttp/__pycache__/web_exceptions.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..f7126a3266ad0396ad613e8b4ce252015c755c62 GIT binary patch literal 11254 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 C`=C?+ literal 0 HcmV?d00001 diff --git a/sbsheriff/Lib/site-packages/aiohttp/__pycache__/web_fileresponse.cpython-310.pyc b/sbsheriff/Lib/site-packages/aiohttp/__pycache__/web_fileresponse.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..7105e77f29920e6680e5c568474dfd4582aafa0b GIT binary patch literal 6082 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 J?rNQ}{~rS5P`dyC literal 0 HcmV?d00001 diff --git a/sbsheriff/Lib/site-packages/aiohttp/__pycache__/web_middlewares.cpython-310.pyc b/sbsheriff/Lib/site-packages/aiohttp/__pycache__/web_middlewares.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..9852a91e889eb75c6faa9515dab01d180981799d GIT binary patch literal 3914 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 literal 0 HcmV?d00001 diff --git a/sbsheriff/Lib/site-packages/aiohttp/__pycache__/web_protocol.cpython-310.pyc b/sbsheriff/Lib/site-packages/aiohttp/__pycache__/web_protocol.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..5105294b56dc81237a9fc14ce753e75c1db8cb1d GIT binary patch literal 16708 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 literal 0 HcmV?d00001 diff --git a/sbsheriff/Lib/site-packages/aiohttp/__pycache__/web_request.cpython-310.pyc b/sbsheriff/Lib/site-packages/aiohttp/__pycache__/web_request.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..b466e6c7c718c1c66f88001ca47dc33bd17c1fe7 GIT binary patch literal 23878 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�WH#+vviKA1N`gtY2v0KC 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 MC-#NtZ}{2&3sXrT_5c6? literal 0 HcmV?d00001 diff --git a/sbsheriff/Lib/site-packages/aiohttp/__pycache__/web_response.cpython-310.pyc b/sbsheriff/Lib/site-packages/aiohttp/__pycache__/web_response.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..a9b3fdc7972cc5a7f9d555b67fadc80d503e6ae6 GIT binary patch literal 21186 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 W%R@~sDsqwqs>p4q$nA9YyZ;Z-r5(%w literal 0 HcmV?d00001 diff --git a/sbsheriff/Lib/site-packages/aiohttp/__pycache__/web_routedef.cpython-310.pyc b/sbsheriff/Lib/site-packages/aiohttp/__pycache__/web_routedef.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..1e32be59ac102ae51c5b1d3a590eaa2d3fcf766c GIT binary patch literal 7537 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 literal 0 HcmV?d00001 diff --git a/sbsheriff/Lib/site-packages/aiohttp/__pycache__/web_runner.cpython-310.pyc b/sbsheriff/Lib/site-packages/aiohttp/__pycache__/web_runner.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..a9350d6354275026bcd40acb907ddca759f15055 GIT binary patch literal 11666 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%0ASW6;asIR-@p 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 ShDk?OM*?P9x0%xM9r-`5+i4^K literal 0 HcmV?d00001 diff --git a/sbsheriff/Lib/site-packages/aiohttp/__pycache__/worker.cpython-310.pyc b/sbsheriff/Lib/site-packages/aiohttp/__pycache__/worker.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..bec0b01c2fbf0ad4516503202276ea2a556f93a4 GIT binary patch literal 6910 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 +#ifndef offsetof + #define offsetof(type, member) ( (size_t) & ((type*)0) -> member ) +#endif +#if !defined(WIN32) && !defined(MS_WINDOWS) + #ifndef __stdcall + #define __stdcall + #endif + #ifndef __cdecl + #define __cdecl + #endif + #ifndef __fastcall + #define __fastcall + #endif +#endif +#ifndef DL_IMPORT + #define DL_IMPORT(t) t +#endif +#ifndef DL_EXPORT + #define DL_EXPORT(t) t +#endif +#define __PYX_COMMA , +#ifndef HAVE_LONG_LONG + #if PY_VERSION_HEX >= 0x02070000 + #define HAVE_LONG_LONG + #endif +#endif +#ifndef PY_LONG_LONG + #define PY_LONG_LONG LONG_LONG +#endif +#ifndef Py_HUGE_VAL + #define Py_HUGE_VAL HUGE_VAL +#endif +#ifdef PYPY_VERSION + #define CYTHON_COMPILING_IN_PYPY 1 + #define CYTHON_COMPILING_IN_PYSTON 0 + #define CYTHON_COMPILING_IN_CPYTHON 0 + #undef CYTHON_USE_TYPE_SLOTS + #define CYTHON_USE_TYPE_SLOTS 0 + #undef CYTHON_USE_PYTYPE_LOOKUP + #define CYTHON_USE_PYTYPE_LOOKUP 0 + #if PY_VERSION_HEX < 0x03050000 + #undef CYTHON_USE_ASYNC_SLOTS + #define CYTHON_USE_ASYNC_SLOTS 0 + #elif !defined(CYTHON_USE_ASYNC_SLOTS) + #define CYTHON_USE_ASYNC_SLOTS 1 + #endif + #undef CYTHON_USE_PYLIST_INTERNALS + #define CYTHON_USE_PYLIST_INTERNALS 0 + #undef CYTHON_USE_UNICODE_INTERNALS + #define CYTHON_USE_UNICODE_INTERNALS 0 + #undef CYTHON_USE_UNICODE_WRITER + #define CYTHON_USE_UNICODE_WRITER 0 + #undef CYTHON_USE_PYLONG_INTERNALS + #define CYTHON_USE_PYLONG_INTERNALS 0 + #undef CYTHON_AVOID_BORROWED_REFS + #define CYTHON_AVOID_BORROWED_REFS 1 + #undef CYTHON_ASSUME_SAFE_MACROS + #define CYTHON_ASSUME_SAFE_MACROS 0 + #undef CYTHON_UNPACK_METHODS + #define CYTHON_UNPACK_METHODS 0 + #undef CYTHON_FAST_THREAD_STATE + #define CYTHON_FAST_THREAD_STATE 0 + #undef CYTHON_FAST_PYCALL + #define CYTHON_FAST_PYCALL 0 + #undef CYTHON_PEP489_MULTI_PHASE_INIT + #define CYTHON_PEP489_MULTI_PHASE_INIT 0 + #undef CYTHON_USE_TP_FINALIZE + #define CYTHON_USE_TP_FINALIZE 0 + #undef CYTHON_USE_DICT_VERSIONS + #define CYTHON_USE_DICT_VERSIONS 0 + #undef CYTHON_USE_EXC_INFO_STACK + #define CYTHON_USE_EXC_INFO_STACK 0 +#elif defined(PYSTON_VERSION) + #define CYTHON_COMPILING_IN_PYPY 0 + #define CYTHON_COMPILING_IN_PYSTON 1 + #define CYTHON_COMPILING_IN_CPYTHON 0 + #ifndef CYTHON_USE_TYPE_SLOTS + #define CYTHON_USE_TYPE_SLOTS 1 + #endif + #undef CYTHON_USE_PYTYPE_LOOKUP + #define CYTHON_USE_PYTYPE_LOOKUP 0 + #undef CYTHON_USE_ASYNC_SLOTS + #define CYTHON_USE_ASYNC_SLOTS 0 + #undef CYTHON_USE_PYLIST_INTERNALS + #define CYTHON_USE_PYLIST_INTERNALS 0 + #ifndef CYTHON_USE_UNICODE_INTERNALS + #define CYTHON_USE_UNICODE_INTERNALS 1 + #endif + #undef CYTHON_USE_UNICODE_WRITER + #define CYTHON_USE_UNICODE_WRITER 0 + #undef CYTHON_USE_PYLONG_INTERNALS + #define CYTHON_USE_PYLONG_INTERNALS 0 + #ifndef CYTHON_AVOID_BORROWED_REFS + #define CYTHON_AVOID_BORROWED_REFS 0 + #endif + #ifndef CYTHON_ASSUME_SAFE_MACROS + #define CYTHON_ASSUME_SAFE_MACROS 1 + #endif + #ifndef CYTHON_UNPACK_METHODS + #define CYTHON_UNPACK_METHODS 1 + #endif + #undef CYTHON_FAST_THREAD_STATE + #define CYTHON_FAST_THREAD_STATE 0 + #undef CYTHON_FAST_PYCALL + #define CYTHON_FAST_PYCALL 0 + #undef CYTHON_PEP489_MULTI_PHASE_INIT + #define CYTHON_PEP489_MULTI_PHASE_INIT 0 + #undef CYTHON_USE_TP_FINALIZE + #define CYTHON_USE_TP_FINALIZE 0 + #undef CYTHON_USE_DICT_VERSIONS + #define CYTHON_USE_DICT_VERSIONS 0 + #undef CYTHON_USE_EXC_INFO_STACK + #define CYTHON_USE_EXC_INFO_STACK 0 +#else + #define CYTHON_COMPILING_IN_PYPY 0 + #define CYTHON_COMPILING_IN_PYSTON 0 + #define CYTHON_COMPILING_IN_CPYTHON 1 + #ifndef CYTHON_USE_TYPE_SLOTS + #define CYTHON_USE_TYPE_SLOTS 1 + #endif + #if PY_VERSION_HEX < 0x02070000 + #undef CYTHON_USE_PYTYPE_LOOKUP + #define CYTHON_USE_PYTYPE_LOOKUP 0 + #elif !defined(CYTHON_USE_PYTYPE_LOOKUP) + #define CYTHON_USE_PYTYPE_LOOKUP 1 + #endif + #if PY_MAJOR_VERSION < 3 + #undef CYTHON_USE_ASYNC_SLOTS + #define CYTHON_USE_ASYNC_SLOTS 0 + #elif !defined(CYTHON_USE_ASYNC_SLOTS) + #define CYTHON_USE_ASYNC_SLOTS 1 + #endif + #if PY_VERSION_HEX < 0x02070000 + #undef CYTHON_USE_PYLONG_INTERNALS + #define CYTHON_USE_PYLONG_INTERNALS 0 + #elif !defined(CYTHON_USE_PYLONG_INTERNALS) + #define CYTHON_USE_PYLONG_INTERNALS 1 + #endif + #ifndef CYTHON_USE_PYLIST_INTERNALS + #define CYTHON_USE_PYLIST_INTERNALS 1 + #endif + #ifndef CYTHON_USE_UNICODE_INTERNALS + #define CYTHON_USE_UNICODE_INTERNALS 1 + #endif + #if PY_VERSION_HEX < 0x030300F0 + #undef CYTHON_USE_UNICODE_WRITER + #define CYTHON_USE_UNICODE_WRITER 0 + #elif !defined(CYTHON_USE_UNICODE_WRITER) + #define CYTHON_USE_UNICODE_WRITER 1 + #endif + #ifndef CYTHON_AVOID_BORROWED_REFS + #define CYTHON_AVOID_BORROWED_REFS 0 + #endif + #ifndef CYTHON_ASSUME_SAFE_MACROS + #define CYTHON_ASSUME_SAFE_MACROS 1 + #endif + #ifndef CYTHON_UNPACK_METHODS + #define CYTHON_UNPACK_METHODS 1 + #endif + #ifndef CYTHON_FAST_THREAD_STATE + #define CYTHON_FAST_THREAD_STATE 1 + #endif + #ifndef CYTHON_FAST_PYCALL + #define CYTHON_FAST_PYCALL 1 + #endif + #ifndef CYTHON_PEP489_MULTI_PHASE_INIT + #define CYTHON_PEP489_MULTI_PHASE_INIT (PY_VERSION_HEX >= 0x03050000) + #endif + #ifndef CYTHON_USE_TP_FINALIZE + #define CYTHON_USE_TP_FINALIZE (PY_VERSION_HEX >= 0x030400a1) + #endif + #ifndef CYTHON_USE_DICT_VERSIONS + #define CYTHON_USE_DICT_VERSIONS (PY_VERSION_HEX >= 0x030600B1) + #endif + #ifndef CYTHON_USE_EXC_INFO_STACK + #define CYTHON_USE_EXC_INFO_STACK (PY_VERSION_HEX >= 0x030700A3) + #endif +#endif +#if !defined(CYTHON_FAST_PYCCALL) +#define CYTHON_FAST_PYCCALL (CYTHON_FAST_PYCALL && PY_VERSION_HEX >= 0x030600B1) +#endif +#if CYTHON_USE_PYLONG_INTERNALS + #include "longintrepr.h" + #undef SHIFT + #undef BASE + #undef MASK + #ifdef SIZEOF_VOID_P + enum { __pyx_check_sizeof_voidp = 1 / (int)(SIZEOF_VOID_P == sizeof(void*)) }; + #endif +#endif +#ifndef __has_attribute + #define __has_attribute(x) 0 +#endif +#ifndef __has_cpp_attribute + #define __has_cpp_attribute(x) 0 +#endif +#ifndef CYTHON_RESTRICT + #if defined(__GNUC__) + #define CYTHON_RESTRICT __restrict__ + #elif defined(_MSC_VER) && _MSC_VER >= 1400 + #define CYTHON_RESTRICT __restrict + #elif defined (__STDC_VERSION__) && __STDC_VERSION__ >= 199901L + #define CYTHON_RESTRICT restrict + #else + #define CYTHON_RESTRICT + #endif +#endif +#ifndef CYTHON_UNUSED +# if defined(__GNUC__) +# if !(defined(__cplusplus)) || (__GNUC__ > 3 || (__GNUC__ == 3 && __GNUC_MINOR__ >= 4)) +# define CYTHON_UNUSED __attribute__ ((__unused__)) +# else +# define CYTHON_UNUSED +# endif +# elif defined(__ICC) || (defined(__INTEL_COMPILER) && !defined(_MSC_VER)) +# define CYTHON_UNUSED __attribute__ ((__unused__)) +# else +# define CYTHON_UNUSED +# endif +#endif +#ifndef CYTHON_MAYBE_UNUSED_VAR +# if defined(__cplusplus) + template void CYTHON_MAYBE_UNUSED_VAR( const T& ) { } +# else +# define CYTHON_MAYBE_UNUSED_VAR(x) (void)(x) +# endif +#endif +#ifndef CYTHON_NCP_UNUSED +# if CYTHON_COMPILING_IN_CPYTHON +# define CYTHON_NCP_UNUSED +# else +# define CYTHON_NCP_UNUSED CYTHON_UNUSED +# endif +#endif +#define __Pyx_void_to_None(void_result) ((void)(void_result), Py_INCREF(Py_None), Py_None) +#ifdef _MSC_VER + #ifndef _MSC_STDINT_H_ + #if _MSC_VER < 1300 + typedef unsigned char uint8_t; + typedef unsigned int uint32_t; + #else + typedef unsigned __int8 uint8_t; + typedef unsigned __int32 uint32_t; + #endif + #endif +#else + #include +#endif +#ifndef CYTHON_FALLTHROUGH + #if defined(__cplusplus) && __cplusplus >= 201103L + #if __has_cpp_attribute(fallthrough) + #define CYTHON_FALLTHROUGH [[fallthrough]] + #elif __has_cpp_attribute(clang::fallthrough) + #define CYTHON_FALLTHROUGH [[clang::fallthrough]] + #elif __has_cpp_attribute(gnu::fallthrough) + #define CYTHON_FALLTHROUGH [[gnu::fallthrough]] + #endif + #endif + #ifndef CYTHON_FALLTHROUGH + #if __has_attribute(fallthrough) + #define CYTHON_FALLTHROUGH __attribute__((fallthrough)) + #else + #define CYTHON_FALLTHROUGH + #endif + #endif + #if defined(__clang__ ) && defined(__apple_build_version__) + #if __apple_build_version__ < 7000000 + #undef CYTHON_FALLTHROUGH + #define CYTHON_FALLTHROUGH + #endif + #endif +#endif + +#ifndef CYTHON_INLINE + #if defined(__clang__) + #define CYTHON_INLINE __inline__ __attribute__ ((__unused__)) + #elif defined(__GNUC__) + #define CYTHON_INLINE __inline__ + #elif defined(_MSC_VER) + #define CYTHON_INLINE __inline + #elif defined (__STDC_VERSION__) && __STDC_VERSION__ >= 199901L + #define CYTHON_INLINE inline + #else + #define CYTHON_INLINE + #endif +#endif + +#if CYTHON_COMPILING_IN_PYPY && PY_VERSION_HEX < 0x02070600 && !defined(Py_OptimizeFlag) + #define Py_OptimizeFlag 0 +#endif +#define __PYX_BUILD_PY_SSIZE_T "n" +#define CYTHON_FORMAT_SSIZE_T "z" +#if PY_MAJOR_VERSION < 3 + #define __Pyx_BUILTIN_MODULE_NAME "__builtin__" + #define __Pyx_PyCode_New(a, k, l, s, f, code, c, n, v, fv, cell, fn, name, fline, lnos)\ + PyCode_New(a+k, l, s, f, code, c, n, v, fv, cell, fn, name, fline, lnos) + #define __Pyx_DefaultClassType PyClass_Type +#else + #define __Pyx_BUILTIN_MODULE_NAME "builtins" +#if PY_VERSION_HEX >= 0x030800A4 && PY_VERSION_HEX < 0x030800B2 + #define __Pyx_PyCode_New(a, k, l, s, f, code, c, n, v, fv, cell, fn, name, fline, lnos)\ + PyCode_New(a, 0, k, l, s, f, code, c, n, v, fv, cell, fn, name, fline, lnos) +#else + #define __Pyx_PyCode_New(a, k, l, s, f, code, c, n, v, fv, cell, fn, name, fline, lnos)\ + PyCode_New(a, k, l, s, f, code, c, n, v, fv, cell, fn, name, fline, lnos) +#endif + #define __Pyx_DefaultClassType PyType_Type +#endif +#ifndef Py_TPFLAGS_CHECKTYPES + #define Py_TPFLAGS_CHECKTYPES 0 +#endif +#ifndef Py_TPFLAGS_HAVE_INDEX + #define Py_TPFLAGS_HAVE_INDEX 0 +#endif +#ifndef Py_TPFLAGS_HAVE_NEWBUFFER + #define Py_TPFLAGS_HAVE_NEWBUFFER 0 +#endif +#ifndef Py_TPFLAGS_HAVE_FINALIZE + #define Py_TPFLAGS_HAVE_FINALIZE 0 +#endif +#ifndef METH_STACKLESS + #define METH_STACKLESS 0 +#endif +#if PY_VERSION_HEX <= 0x030700A3 || !defined(METH_FASTCALL) + #ifndef METH_FASTCALL + #define METH_FASTCALL 0x80 + #endif + typedef PyObject *(*__Pyx_PyCFunctionFast) (PyObject *self, PyObject *const *args, Py_ssize_t nargs); + typedef PyObject *(*__Pyx_PyCFunctionFastWithKeywords) (PyObject *self, PyObject *const *args, + Py_ssize_t nargs, PyObject *kwnames); +#else + #define __Pyx_PyCFunctionFast _PyCFunctionFast + #define __Pyx_PyCFunctionFastWithKeywords _PyCFunctionFastWithKeywords +#endif +#if CYTHON_FAST_PYCCALL +#define __Pyx_PyFastCFunction_Check(func)\ + ((PyCFunction_Check(func) && (METH_FASTCALL == (PyCFunction_GET_FLAGS(func) & ~(METH_CLASS | METH_STATIC | METH_COEXIST | METH_KEYWORDS | METH_STACKLESS))))) +#else +#define __Pyx_PyFastCFunction_Check(func) 0 +#endif +#if CYTHON_COMPILING_IN_PYPY && !defined(PyObject_Malloc) + #define PyObject_Malloc(s) PyMem_Malloc(s) + #define PyObject_Free(p) PyMem_Free(p) + #define PyObject_Realloc(p) PyMem_Realloc(p) +#endif +#if CYTHON_COMPILING_IN_CPYTHON && PY_VERSION_HEX < 0x030400A1 + #define PyMem_RawMalloc(n) PyMem_Malloc(n) + #define PyMem_RawRealloc(p, n) PyMem_Realloc(p, n) + #define PyMem_RawFree(p) PyMem_Free(p) +#endif +#if CYTHON_COMPILING_IN_PYSTON + #define __Pyx_PyCode_HasFreeVars(co) PyCode_HasFreeVars(co) + #define __Pyx_PyFrame_SetLineNumber(frame, lineno) PyFrame_SetLineNumber(frame, lineno) +#else + #define __Pyx_PyCode_HasFreeVars(co) (PyCode_GetNumFree(co) > 0) + #define __Pyx_PyFrame_SetLineNumber(frame, lineno) (frame)->f_lineno = (lineno) +#endif +#if !CYTHON_FAST_THREAD_STATE || PY_VERSION_HEX < 0x02070000 + #define __Pyx_PyThreadState_Current PyThreadState_GET() +#elif PY_VERSION_HEX >= 0x03060000 + #define __Pyx_PyThreadState_Current _PyThreadState_UncheckedGet() +#elif PY_VERSION_HEX >= 0x03000000 + #define __Pyx_PyThreadState_Current PyThreadState_GET() +#else + #define __Pyx_PyThreadState_Current _PyThreadState_Current +#endif +#if PY_VERSION_HEX < 0x030700A2 && !defined(PyThread_tss_create) && !defined(Py_tss_NEEDS_INIT) +#include "pythread.h" +#define Py_tss_NEEDS_INIT 0 +typedef int Py_tss_t; +static CYTHON_INLINE int PyThread_tss_create(Py_tss_t *key) { + *key = PyThread_create_key(); + return 0; +} +static CYTHON_INLINE Py_tss_t * PyThread_tss_alloc(void) { + Py_tss_t *key = (Py_tss_t *)PyObject_Malloc(sizeof(Py_tss_t)); + *key = Py_tss_NEEDS_INIT; + return key; +} +static CYTHON_INLINE void PyThread_tss_free(Py_tss_t *key) { + PyObject_Free(key); +} +static CYTHON_INLINE int PyThread_tss_is_created(Py_tss_t *key) { + return *key != Py_tss_NEEDS_INIT; +} +static CYTHON_INLINE void PyThread_tss_delete(Py_tss_t *key) { + PyThread_delete_key(*key); + *key = Py_tss_NEEDS_INIT; +} +static CYTHON_INLINE int PyThread_tss_set(Py_tss_t *key, void *value) { + return PyThread_set_key_value(*key, value); +} +static CYTHON_INLINE void * PyThread_tss_get(Py_tss_t *key) { + return PyThread_get_key_value(*key); +} +#endif +#if CYTHON_COMPILING_IN_CPYTHON || defined(_PyDict_NewPresized) +#define __Pyx_PyDict_NewPresized(n) ((n <= 8) ? PyDict_New() : _PyDict_NewPresized(n)) +#else +#define __Pyx_PyDict_NewPresized(n) PyDict_New() +#endif +#if PY_MAJOR_VERSION >= 3 || CYTHON_FUTURE_DIVISION + #define __Pyx_PyNumber_Divide(x,y) PyNumber_TrueDivide(x,y) + #define __Pyx_PyNumber_InPlaceDivide(x,y) PyNumber_InPlaceTrueDivide(x,y) +#else + #define __Pyx_PyNumber_Divide(x,y) PyNumber_Divide(x,y) + #define __Pyx_PyNumber_InPlaceDivide(x,y) PyNumber_InPlaceDivide(x,y) +#endif +#if CYTHON_COMPILING_IN_CPYTHON && PY_VERSION_HEX >= 0x030500A1 && CYTHON_USE_UNICODE_INTERNALS +#define __Pyx_PyDict_GetItemStr(dict, name) _PyDict_GetItem_KnownHash(dict, name, ((PyASCIIObject *) name)->hash) +#else +#define __Pyx_PyDict_GetItemStr(dict, name) PyDict_GetItem(dict, name) +#endif +#if PY_VERSION_HEX > 0x03030000 && defined(PyUnicode_KIND) + #define CYTHON_PEP393_ENABLED 1 + #if defined(PyUnicode_IS_READY) + #define __Pyx_PyUnicode_READY(op) (likely(PyUnicode_IS_READY(op)) ?\ + 0 : _PyUnicode_Ready((PyObject *)(op))) + #else + #define __Pyx_PyUnicode_READY(op) (0) + #endif + #define __Pyx_PyUnicode_GET_LENGTH(u) PyUnicode_GET_LENGTH(u) + #define __Pyx_PyUnicode_READ_CHAR(u, i) PyUnicode_READ_CHAR(u, i) + #define __Pyx_PyUnicode_MAX_CHAR_VALUE(u) PyUnicode_MAX_CHAR_VALUE(u) + #define __Pyx_PyUnicode_KIND(u) PyUnicode_KIND(u) + #define __Pyx_PyUnicode_DATA(u) PyUnicode_DATA(u) + #define __Pyx_PyUnicode_READ(k, d, i) PyUnicode_READ(k, d, i) + #define __Pyx_PyUnicode_WRITE(k, d, i, ch) PyUnicode_WRITE(k, d, i, ch) + #if defined(PyUnicode_IS_READY) && defined(PyUnicode_GET_SIZE) + #if CYTHON_COMPILING_IN_CPYTHON && PY_VERSION_HEX >= 0x03090000 + #define __Pyx_PyUnicode_IS_TRUE(u) (0 != (likely(PyUnicode_IS_READY(u)) ? PyUnicode_GET_LENGTH(u) : ((PyCompactUnicodeObject *)(u))->wstr_length)) + #else + #define __Pyx_PyUnicode_IS_TRUE(u) (0 != (likely(PyUnicode_IS_READY(u)) ? PyUnicode_GET_LENGTH(u) : PyUnicode_GET_SIZE(u))) + #endif + #else + #define __Pyx_PyUnicode_IS_TRUE(u) (0 != PyUnicode_GET_LENGTH(u)) + #endif +#else + #define CYTHON_PEP393_ENABLED 0 + #define PyUnicode_1BYTE_KIND 1 + #define PyUnicode_2BYTE_KIND 2 + #define PyUnicode_4BYTE_KIND 4 + #define __Pyx_PyUnicode_READY(op) (0) + #define __Pyx_PyUnicode_GET_LENGTH(u) PyUnicode_GET_SIZE(u) + #define __Pyx_PyUnicode_READ_CHAR(u, i) ((Py_UCS4)(PyUnicode_AS_UNICODE(u)[i])) + #define __Pyx_PyUnicode_MAX_CHAR_VALUE(u) ((sizeof(Py_UNICODE) == 2) ? 65535 : 1114111) + #define __Pyx_PyUnicode_KIND(u) (sizeof(Py_UNICODE)) + #define __Pyx_PyUnicode_DATA(u) ((void*)PyUnicode_AS_UNICODE(u)) + #define __Pyx_PyUnicode_READ(k, d, i) ((void)(k), (Py_UCS4)(((Py_UNICODE*)d)[i])) + #define __Pyx_PyUnicode_WRITE(k, d, i, ch) (((void)(k)), ((Py_UNICODE*)d)[i] = ch) + #define __Pyx_PyUnicode_IS_TRUE(u) (0 != PyUnicode_GET_SIZE(u)) +#endif +#if CYTHON_COMPILING_IN_PYPY + #define __Pyx_PyUnicode_Concat(a, b) PyNumber_Add(a, b) + #define __Pyx_PyUnicode_ConcatSafe(a, b) PyNumber_Add(a, b) +#else + #define __Pyx_PyUnicode_Concat(a, b) PyUnicode_Concat(a, b) + #define __Pyx_PyUnicode_ConcatSafe(a, b) ((unlikely((a) == Py_None) || unlikely((b) == Py_None)) ?\ + PyNumber_Add(a, b) : __Pyx_PyUnicode_Concat(a, b)) +#endif +#if CYTHON_COMPILING_IN_PYPY && !defined(PyUnicode_Contains) + #define PyUnicode_Contains(u, s) PySequence_Contains(u, s) +#endif +#if CYTHON_COMPILING_IN_PYPY && !defined(PyByteArray_Check) + #define PyByteArray_Check(obj) PyObject_TypeCheck(obj, &PyByteArray_Type) +#endif +#if CYTHON_COMPILING_IN_PYPY && !defined(PyObject_Format) + #define PyObject_Format(obj, fmt) PyObject_CallMethod(obj, "__format__", "O", fmt) +#endif +#define __Pyx_PyString_FormatSafe(a, b) ((unlikely((a) == Py_None || (PyString_Check(b) && !PyString_CheckExact(b)))) ? PyNumber_Remainder(a, b) : __Pyx_PyString_Format(a, b)) +#define __Pyx_PyUnicode_FormatSafe(a, b) ((unlikely((a) == Py_None || (PyUnicode_Check(b) && !PyUnicode_CheckExact(b)))) ? PyNumber_Remainder(a, b) : PyUnicode_Format(a, b)) +#if PY_MAJOR_VERSION >= 3 + #define __Pyx_PyString_Format(a, b) PyUnicode_Format(a, b) +#else + #define __Pyx_PyString_Format(a, b) PyString_Format(a, b) +#endif +#if PY_MAJOR_VERSION < 3 && !defined(PyObject_ASCII) + #define PyObject_ASCII(o) PyObject_Repr(o) +#endif +#if PY_MAJOR_VERSION >= 3 + #define PyBaseString_Type PyUnicode_Type + #define PyStringObject PyUnicodeObject + #define PyString_Type PyUnicode_Type + #define PyString_Check PyUnicode_Check + #define PyString_CheckExact PyUnicode_CheckExact +#ifndef PyObject_Unicode + #define PyObject_Unicode PyObject_Str +#endif +#endif +#if PY_MAJOR_VERSION >= 3 + #define __Pyx_PyBaseString_Check(obj) PyUnicode_Check(obj) + #define __Pyx_PyBaseString_CheckExact(obj) PyUnicode_CheckExact(obj) +#else + #define __Pyx_PyBaseString_Check(obj) (PyString_Check(obj) || PyUnicode_Check(obj)) + #define __Pyx_PyBaseString_CheckExact(obj) (PyString_CheckExact(obj) || PyUnicode_CheckExact(obj)) +#endif +#ifndef PySet_CheckExact + #define PySet_CheckExact(obj) (Py_TYPE(obj) == &PySet_Type) +#endif +#if PY_VERSION_HEX >= 0x030900A4 + #define __Pyx_SET_REFCNT(obj, refcnt) Py_SET_REFCNT(obj, refcnt) + #define __Pyx_SET_SIZE(obj, size) Py_SET_SIZE(obj, size) +#else + #define __Pyx_SET_REFCNT(obj, refcnt) Py_REFCNT(obj) = (refcnt) + #define __Pyx_SET_SIZE(obj, size) Py_SIZE(obj) = (size) +#endif +#if CYTHON_ASSUME_SAFE_MACROS + #define __Pyx_PySequence_SIZE(seq) Py_SIZE(seq) +#else + #define __Pyx_PySequence_SIZE(seq) PySequence_Size(seq) +#endif +#if PY_MAJOR_VERSION >= 3 + #define PyIntObject PyLongObject + #define PyInt_Type PyLong_Type + #define PyInt_Check(op) PyLong_Check(op) + #define PyInt_CheckExact(op) PyLong_CheckExact(op) + #define PyInt_FromString PyLong_FromString + #define PyInt_FromUnicode PyLong_FromUnicode + #define PyInt_FromLong PyLong_FromLong + #define PyInt_FromSize_t PyLong_FromSize_t + #define PyInt_FromSsize_t PyLong_FromSsize_t + #define PyInt_AsLong PyLong_AsLong + #define PyInt_AS_LONG PyLong_AS_LONG + #define PyInt_AsSsize_t PyLong_AsSsize_t + #define PyInt_AsUnsignedLongMask PyLong_AsUnsignedLongMask + #define PyInt_AsUnsignedLongLongMask PyLong_AsUnsignedLongLongMask + #define PyNumber_Int PyNumber_Long +#endif +#if PY_MAJOR_VERSION >= 3 + #define PyBoolObject PyLongObject +#endif +#if PY_MAJOR_VERSION >= 3 && CYTHON_COMPILING_IN_PYPY + #ifndef PyUnicode_InternFromString + #define PyUnicode_InternFromString(s) PyUnicode_FromString(s) + #endif +#endif +#if PY_VERSION_HEX < 0x030200A4 + typedef long Py_hash_t; + #define __Pyx_PyInt_FromHash_t PyInt_FromLong + #define __Pyx_PyInt_AsHash_t PyInt_AsLong +#else + #define __Pyx_PyInt_FromHash_t PyInt_FromSsize_t + #define __Pyx_PyInt_AsHash_t PyInt_AsSsize_t +#endif +#if PY_MAJOR_VERSION >= 3 + #define __Pyx_PyMethod_New(func, self, klass) ((self) ? ((void)(klass), PyMethod_New(func, self)) : __Pyx_NewRef(func)) +#else + #define __Pyx_PyMethod_New(func, self, klass) PyMethod_New(func, self, klass) +#endif +#if CYTHON_USE_ASYNC_SLOTS + #if PY_VERSION_HEX >= 0x030500B1 + #define __Pyx_PyAsyncMethodsStruct PyAsyncMethods + #define __Pyx_PyType_AsAsync(obj) (Py_TYPE(obj)->tp_as_async) + #else + #define __Pyx_PyType_AsAsync(obj) ((__Pyx_PyAsyncMethodsStruct*) (Py_TYPE(obj)->tp_reserved)) + #endif +#else + #define __Pyx_PyType_AsAsync(obj) NULL +#endif +#ifndef __Pyx_PyAsyncMethodsStruct + typedef struct { + unaryfunc am_await; + unaryfunc am_aiter; + unaryfunc am_anext; + } __Pyx_PyAsyncMethodsStruct; +#endif + +#if defined(WIN32) || defined(MS_WINDOWS) + #define _USE_MATH_DEFINES +#endif +#include +#ifdef NAN +#define __PYX_NAN() ((float) NAN) +#else +static CYTHON_INLINE float __PYX_NAN() { + float value; + memset(&value, 0xFF, sizeof(value)); + return value; +} +#endif +#if defined(__CYGWIN__) && defined(_LDBL_EQ_DBL) +#define __Pyx_truncl trunc +#else +#define __Pyx_truncl truncl +#endif + +#define __PYX_MARK_ERR_POS(f_index, lineno) \ + { __pyx_filename = __pyx_f[f_index]; (void)__pyx_filename; __pyx_lineno = lineno; (void)__pyx_lineno; __pyx_clineno = __LINE__; (void)__pyx_clineno; } +#define __PYX_ERR(f_index, lineno, Ln_error) \ + { __PYX_MARK_ERR_POS(f_index, lineno) goto Ln_error; } + +#ifndef __PYX_EXTERN_C + #ifdef __cplusplus + #define __PYX_EXTERN_C extern "C" + #else + #define __PYX_EXTERN_C extern + #endif +#endif + +#define __PYX_HAVE__aiohttp___helpers +#define __PYX_HAVE_API__aiohttp___helpers +/* Early includes */ +#ifdef _OPENMP +#include +#endif /* _OPENMP */ + +#if defined(PYREX_WITHOUT_ASSERTIONS) && !defined(CYTHON_WITHOUT_ASSERTIONS) +#define CYTHON_WITHOUT_ASSERTIONS +#endif + +typedef struct {PyObject **p; const char *s; const Py_ssize_t n; const char* encoding; + const char is_unicode; const char is_str; const char intern; } __Pyx_StringTabEntry; + +#define __PYX_DEFAULT_STRING_ENCODING_IS_ASCII 0 +#define __PYX_DEFAULT_STRING_ENCODING_IS_UTF8 0 +#define __PYX_DEFAULT_STRING_ENCODING_IS_DEFAULT (PY_MAJOR_VERSION >= 3 && __PYX_DEFAULT_STRING_ENCODING_IS_UTF8) +#define __PYX_DEFAULT_STRING_ENCODING "" +#define __Pyx_PyObject_FromString __Pyx_PyBytes_FromString +#define __Pyx_PyObject_FromStringAndSize __Pyx_PyBytes_FromStringAndSize +#define __Pyx_uchar_cast(c) ((unsigned char)c) +#define __Pyx_long_cast(x) ((long)x) +#define __Pyx_fits_Py_ssize_t(v, type, is_signed) (\ + (sizeof(type) < sizeof(Py_ssize_t)) ||\ + (sizeof(type) > sizeof(Py_ssize_t) &&\ + likely(v < (type)PY_SSIZE_T_MAX ||\ + v == (type)PY_SSIZE_T_MAX) &&\ + (!is_signed || likely(v > (type)PY_SSIZE_T_MIN ||\ + v == (type)PY_SSIZE_T_MIN))) ||\ + (sizeof(type) == sizeof(Py_ssize_t) &&\ + (is_signed || likely(v < (type)PY_SSIZE_T_MAX ||\ + v == (type)PY_SSIZE_T_MAX))) ) +static CYTHON_INLINE int __Pyx_is_valid_index(Py_ssize_t i, Py_ssize_t limit) { + return (size_t) i < (size_t) limit; +} +#if defined (__cplusplus) && __cplusplus >= 201103L + #include + #define __Pyx_sst_abs(value) std::abs(value) +#elif SIZEOF_INT >= SIZEOF_SIZE_T + #define __Pyx_sst_abs(value) abs(value) +#elif SIZEOF_LONG >= SIZEOF_SIZE_T + #define __Pyx_sst_abs(value) labs(value) +#elif defined (_MSC_VER) + #define __Pyx_sst_abs(value) ((Py_ssize_t)_abs64(value)) +#elif defined (__STDC_VERSION__) && __STDC_VERSION__ >= 199901L + #define __Pyx_sst_abs(value) llabs(value) +#elif defined (__GNUC__) + #define __Pyx_sst_abs(value) __builtin_llabs(value) +#else + #define __Pyx_sst_abs(value) ((value<0) ? -value : value) +#endif +static CYTHON_INLINE const char* __Pyx_PyObject_AsString(PyObject*); +static CYTHON_INLINE const char* __Pyx_PyObject_AsStringAndSize(PyObject*, Py_ssize_t* length); +#define __Pyx_PyByteArray_FromString(s) PyByteArray_FromStringAndSize((const char*)s, strlen((const char*)s)) +#define __Pyx_PyByteArray_FromStringAndSize(s, l) PyByteArray_FromStringAndSize((const char*)s, l) +#define __Pyx_PyBytes_FromString PyBytes_FromString +#define __Pyx_PyBytes_FromStringAndSize PyBytes_FromStringAndSize +static CYTHON_INLINE PyObject* __Pyx_PyUnicode_FromString(const char*); +#if PY_MAJOR_VERSION < 3 + #define __Pyx_PyStr_FromString __Pyx_PyBytes_FromString + #define __Pyx_PyStr_FromStringAndSize __Pyx_PyBytes_FromStringAndSize +#else + #define __Pyx_PyStr_FromString __Pyx_PyUnicode_FromString + #define __Pyx_PyStr_FromStringAndSize __Pyx_PyUnicode_FromStringAndSize +#endif +#define __Pyx_PyBytes_AsWritableString(s) ((char*) PyBytes_AS_STRING(s)) +#define __Pyx_PyBytes_AsWritableSString(s) ((signed char*) PyBytes_AS_STRING(s)) +#define __Pyx_PyBytes_AsWritableUString(s) ((unsigned char*) PyBytes_AS_STRING(s)) +#define __Pyx_PyBytes_AsString(s) ((const char*) PyBytes_AS_STRING(s)) +#define __Pyx_PyBytes_AsSString(s) ((const signed char*) PyBytes_AS_STRING(s)) +#define __Pyx_PyBytes_AsUString(s) ((const unsigned char*) PyBytes_AS_STRING(s)) +#define __Pyx_PyObject_AsWritableString(s) ((char*) __Pyx_PyObject_AsString(s)) +#define __Pyx_PyObject_AsWritableSString(s) ((signed char*) __Pyx_PyObject_AsString(s)) +#define __Pyx_PyObject_AsWritableUString(s) ((unsigned char*) __Pyx_PyObject_AsString(s)) +#define __Pyx_PyObject_AsSString(s) ((const signed char*) __Pyx_PyObject_AsString(s)) +#define __Pyx_PyObject_AsUString(s) ((const unsigned char*) __Pyx_PyObject_AsString(s)) +#define __Pyx_PyObject_FromCString(s) __Pyx_PyObject_FromString((const char*)s) +#define __Pyx_PyBytes_FromCString(s) __Pyx_PyBytes_FromString((const char*)s) +#define __Pyx_PyByteArray_FromCString(s) __Pyx_PyByteArray_FromString((const char*)s) +#define __Pyx_PyStr_FromCString(s) __Pyx_PyStr_FromString((const char*)s) +#define __Pyx_PyUnicode_FromCString(s) __Pyx_PyUnicode_FromString((const char*)s) +static CYTHON_INLINE size_t __Pyx_Py_UNICODE_strlen(const Py_UNICODE *u) { + const Py_UNICODE *u_end = u; + while (*u_end++) ; + return (size_t)(u_end - u - 1); +} +#define __Pyx_PyUnicode_FromUnicode(u) PyUnicode_FromUnicode(u, __Pyx_Py_UNICODE_strlen(u)) +#define __Pyx_PyUnicode_FromUnicodeAndLength PyUnicode_FromUnicode +#define __Pyx_PyUnicode_AsUnicode PyUnicode_AsUnicode +#define __Pyx_NewRef(obj) (Py_INCREF(obj), obj) +#define __Pyx_Owned_Py_None(b) __Pyx_NewRef(Py_None) +static CYTHON_INLINE PyObject * __Pyx_PyBool_FromLong(long b); +static CYTHON_INLINE int __Pyx_PyObject_IsTrue(PyObject*); +static CYTHON_INLINE int __Pyx_PyObject_IsTrueAndDecref(PyObject*); +static CYTHON_INLINE PyObject* __Pyx_PyNumber_IntOrLong(PyObject* x); +#define __Pyx_PySequence_Tuple(obj)\ + (likely(PyTuple_CheckExact(obj)) ? __Pyx_NewRef(obj) : PySequence_Tuple(obj)) +static CYTHON_INLINE Py_ssize_t __Pyx_PyIndex_AsSsize_t(PyObject*); +static CYTHON_INLINE PyObject * __Pyx_PyInt_FromSize_t(size_t); +#if CYTHON_ASSUME_SAFE_MACROS +#define __pyx_PyFloat_AsDouble(x) (PyFloat_CheckExact(x) ? PyFloat_AS_DOUBLE(x) : PyFloat_AsDouble(x)) +#else +#define __pyx_PyFloat_AsDouble(x) PyFloat_AsDouble(x) +#endif +#define __pyx_PyFloat_AsFloat(x) ((float) __pyx_PyFloat_AsDouble(x)) +#if PY_MAJOR_VERSION >= 3 +#define __Pyx_PyNumber_Int(x) (PyLong_CheckExact(x) ? __Pyx_NewRef(x) : PyNumber_Long(x)) +#else +#define __Pyx_PyNumber_Int(x) (PyInt_CheckExact(x) ? __Pyx_NewRef(x) : PyNumber_Int(x)) +#endif +#define __Pyx_PyNumber_Float(x) (PyFloat_CheckExact(x) ? __Pyx_NewRef(x) : PyNumber_Float(x)) +#if PY_MAJOR_VERSION < 3 && __PYX_DEFAULT_STRING_ENCODING_IS_ASCII +static int __Pyx_sys_getdefaultencoding_not_ascii; +static int __Pyx_init_sys_getdefaultencoding_params(void) { + PyObject* sys; + PyObject* default_encoding = NULL; + PyObject* ascii_chars_u = NULL; + PyObject* ascii_chars_b = NULL; + const char* default_encoding_c; + sys = PyImport_ImportModule("sys"); + if (!sys) goto bad; + default_encoding = PyObject_CallMethod(sys, (char*) "getdefaultencoding", NULL); + Py_DECREF(sys); + if (!default_encoding) goto bad; + default_encoding_c = PyBytes_AsString(default_encoding); + if (!default_encoding_c) goto bad; + if (strcmp(default_encoding_c, "ascii") == 0) { + __Pyx_sys_getdefaultencoding_not_ascii = 0; + } else { + char ascii_chars[128]; + int c; + for (c = 0; c < 128; c++) { + ascii_chars[c] = c; + } + __Pyx_sys_getdefaultencoding_not_ascii = 1; + ascii_chars_u = PyUnicode_DecodeASCII(ascii_chars, 128, NULL); + if (!ascii_chars_u) goto bad; + ascii_chars_b = PyUnicode_AsEncodedString(ascii_chars_u, default_encoding_c, NULL); + if (!ascii_chars_b || !PyBytes_Check(ascii_chars_b) || memcmp(ascii_chars, PyBytes_AS_STRING(ascii_chars_b), 128) != 0) { + PyErr_Format( + PyExc_ValueError, + "This module compiled with c_string_encoding=ascii, but default encoding '%.200s' is not a superset of ascii.", + default_encoding_c); + goto bad; + } + Py_DECREF(ascii_chars_u); + Py_DECREF(ascii_chars_b); + } + Py_DECREF(default_encoding); + return 0; +bad: + Py_XDECREF(default_encoding); + Py_XDECREF(ascii_chars_u); + Py_XDECREF(ascii_chars_b); + return -1; +} +#endif +#if __PYX_DEFAULT_STRING_ENCODING_IS_DEFAULT && PY_MAJOR_VERSION >= 3 +#define __Pyx_PyUnicode_FromStringAndSize(c_str, size) PyUnicode_DecodeUTF8(c_str, size, NULL) +#else +#define __Pyx_PyUnicode_FromStringAndSize(c_str, size) PyUnicode_Decode(c_str, size, __PYX_DEFAULT_STRING_ENCODING, NULL) +#if __PYX_DEFAULT_STRING_ENCODING_IS_DEFAULT +static char* __PYX_DEFAULT_STRING_ENCODING; +static int __Pyx_init_sys_getdefaultencoding_params(void) { + PyObject* sys; + PyObject* default_encoding = NULL; + char* default_encoding_c; + sys = PyImport_ImportModule("sys"); + if (!sys) goto bad; + default_encoding = PyObject_CallMethod(sys, (char*) (const char*) "getdefaultencoding", NULL); + Py_DECREF(sys); + if (!default_encoding) goto bad; + default_encoding_c = PyBytes_AsString(default_encoding); + if (!default_encoding_c) goto bad; + __PYX_DEFAULT_STRING_ENCODING = (char*) malloc(strlen(default_encoding_c) + 1); + if (!__PYX_DEFAULT_STRING_ENCODING) goto bad; + strcpy(__PYX_DEFAULT_STRING_ENCODING, default_encoding_c); + Py_DECREF(default_encoding); + return 0; +bad: + Py_XDECREF(default_encoding); + return -1; +} +#endif +#endif + + +/* Test for GCC > 2.95 */ +#if defined(__GNUC__) && (__GNUC__ > 2 || (__GNUC__ == 2 && (__GNUC_MINOR__ > 95))) + #define likely(x) __builtin_expect(!!(x), 1) + #define unlikely(x) __builtin_expect(!!(x), 0) +#else /* !__GNUC__ or GCC < 2.95 */ + #define likely(x) (x) + #define unlikely(x) (x) +#endif /* __GNUC__ */ +static CYTHON_INLINE void __Pyx_pretend_to_initialize(void* ptr) { (void)ptr; } + +static PyObject *__pyx_m = NULL; +static PyObject *__pyx_d; +static PyObject *__pyx_b; +static PyObject *__pyx_cython_runtime = NULL; +static PyObject *__pyx_empty_tuple; +static PyObject *__pyx_empty_bytes; +static PyObject *__pyx_empty_unicode; +static int __pyx_lineno; +static int __pyx_clineno = 0; +static const char * __pyx_cfilenm= __FILE__; +static const char *__pyx_filename; + + +static const char *__pyx_f[] = { + "aiohttp\\_helpers.pyx", + "stringsource", +}; + +/*--- Type declarations ---*/ +struct __pyx_obj_7aiohttp_8_helpers_reify; + +/* "aiohttp/_helpers.pyx":1 + * cdef class reify: # <<<<<<<<<<<<<< + * """Use as a class method decorator. It operates almost exactly like + * the Python `@property` decorator, but it puts the result of the + */ +struct __pyx_obj_7aiohttp_8_helpers_reify { + PyObject_HEAD + PyObject *wrapped; + PyObject *name; +}; + + +/* --- Runtime support code (head) --- */ +/* Refnanny.proto */ +#ifndef CYTHON_REFNANNY + #define CYTHON_REFNANNY 0 +#endif +#if CYTHON_REFNANNY + typedef struct { + void (*INCREF)(void*, PyObject*, int); + void (*DECREF)(void*, PyObject*, int); + void (*GOTREF)(void*, PyObject*, int); + void (*GIVEREF)(void*, PyObject*, int); + void* (*SetupContext)(const char*, int, const char*); + void (*FinishContext)(void**); + } __Pyx_RefNannyAPIStruct; + static __Pyx_RefNannyAPIStruct *__Pyx_RefNanny = NULL; + static __Pyx_RefNannyAPIStruct *__Pyx_RefNannyImportAPI(const char *modname); + #define __Pyx_RefNannyDeclarations void *__pyx_refnanny = NULL; +#ifdef WITH_THREAD + #define __Pyx_RefNannySetupContext(name, acquire_gil)\ + if (acquire_gil) {\ + PyGILState_STATE __pyx_gilstate_save = PyGILState_Ensure();\ + __pyx_refnanny = __Pyx_RefNanny->SetupContext((name), __LINE__, __FILE__);\ + PyGILState_Release(__pyx_gilstate_save);\ + } else {\ + __pyx_refnanny = __Pyx_RefNanny->SetupContext((name), __LINE__, __FILE__);\ + } +#else + #define __Pyx_RefNannySetupContext(name, acquire_gil)\ + __pyx_refnanny = __Pyx_RefNanny->SetupContext((name), __LINE__, __FILE__) +#endif + #define __Pyx_RefNannyFinishContext()\ + __Pyx_RefNanny->FinishContext(&__pyx_refnanny) + #define __Pyx_INCREF(r) __Pyx_RefNanny->INCREF(__pyx_refnanny, (PyObject *)(r), __LINE__) + #define __Pyx_DECREF(r) __Pyx_RefNanny->DECREF(__pyx_refnanny, (PyObject *)(r), __LINE__) + #define __Pyx_GOTREF(r) __Pyx_RefNanny->GOTREF(__pyx_refnanny, (PyObject *)(r), __LINE__) + #define __Pyx_GIVEREF(r) __Pyx_RefNanny->GIVEREF(__pyx_refnanny, (PyObject *)(r), __LINE__) + #define __Pyx_XINCREF(r) do { if((r) != NULL) {__Pyx_INCREF(r); }} while(0) + #define __Pyx_XDECREF(r) do { if((r) != NULL) {__Pyx_DECREF(r); }} while(0) + #define __Pyx_XGOTREF(r) do { if((r) != NULL) {__Pyx_GOTREF(r); }} while(0) + #define __Pyx_XGIVEREF(r) do { if((r) != NULL) {__Pyx_GIVEREF(r);}} while(0) +#else + #define __Pyx_RefNannyDeclarations + #define __Pyx_RefNannySetupContext(name, acquire_gil) + #define __Pyx_RefNannyFinishContext() + #define __Pyx_INCREF(r) Py_INCREF(r) + #define __Pyx_DECREF(r) Py_DECREF(r) + #define __Pyx_GOTREF(r) + #define __Pyx_GIVEREF(r) + #define __Pyx_XINCREF(r) Py_XINCREF(r) + #define __Pyx_XDECREF(r) Py_XDECREF(r) + #define __Pyx_XGOTREF(r) + #define __Pyx_XGIVEREF(r) +#endif +#define __Pyx_XDECREF_SET(r, v) do {\ + PyObject *tmp = (PyObject *) r;\ + r = v; __Pyx_XDECREF(tmp);\ + } while (0) +#define __Pyx_DECREF_SET(r, v) do {\ + PyObject *tmp = (PyObject *) r;\ + r = v; __Pyx_DECREF(tmp);\ + } while (0) +#define __Pyx_CLEAR(r) do { PyObject* tmp = ((PyObject*)(r)); r = NULL; __Pyx_DECREF(tmp);} while(0) +#define __Pyx_XCLEAR(r) do { if((r) != NULL) {PyObject* tmp = ((PyObject*)(r)); r = NULL; __Pyx_DECREF(tmp);}} while(0) + +/* PyObjectGetAttrStr.proto */ +#if CYTHON_USE_TYPE_SLOTS +static CYTHON_INLINE PyObject* __Pyx_PyObject_GetAttrStr(PyObject* obj, PyObject* attr_name); +#else +#define __Pyx_PyObject_GetAttrStr(o,n) PyObject_GetAttr(o,n) +#endif + +/* GetBuiltinName.proto */ +static PyObject *__Pyx_GetBuiltinName(PyObject *name); + +/* RaiseDoubleKeywords.proto */ +static void __Pyx_RaiseDoubleKeywordsError(const char* func_name, PyObject* kw_name); + +/* ParseKeywords.proto */ +static int __Pyx_ParseOptionalKeywords(PyObject *kwds, PyObject **argnames[],\ + PyObject *kwds2, PyObject *values[], Py_ssize_t num_pos_args,\ + const char* function_name); + +/* RaiseArgTupleInvalid.proto */ +static void __Pyx_RaiseArgtupleInvalid(const char* func_name, int exact, + Py_ssize_t num_min, Py_ssize_t num_max, Py_ssize_t num_found); + +/* GetItemInt.proto */ +#define __Pyx_GetItemInt(o, i, type, is_signed, to_py_func, is_list, wraparound, boundscheck)\ + (__Pyx_fits_Py_ssize_t(i, type, is_signed) ?\ + __Pyx_GetItemInt_Fast(o, (Py_ssize_t)i, is_list, wraparound, boundscheck) :\ + (is_list ? (PyErr_SetString(PyExc_IndexError, "list index out of range"), (PyObject*)NULL) :\ + __Pyx_GetItemInt_Generic(o, to_py_func(i)))) +#define __Pyx_GetItemInt_List(o, i, type, is_signed, to_py_func, is_list, wraparound, boundscheck)\ + (__Pyx_fits_Py_ssize_t(i, type, is_signed) ?\ + __Pyx_GetItemInt_List_Fast(o, (Py_ssize_t)i, wraparound, boundscheck) :\ + (PyErr_SetString(PyExc_IndexError, "list index out of range"), (PyObject*)NULL)) +static CYTHON_INLINE PyObject *__Pyx_GetItemInt_List_Fast(PyObject *o, Py_ssize_t i, + int wraparound, int boundscheck); +#define __Pyx_GetItemInt_Tuple(o, i, type, is_signed, to_py_func, is_list, wraparound, boundscheck)\ + (__Pyx_fits_Py_ssize_t(i, type, is_signed) ?\ + __Pyx_GetItemInt_Tuple_Fast(o, (Py_ssize_t)i, wraparound, boundscheck) :\ + (PyErr_SetString(PyExc_IndexError, "tuple index out of range"), (PyObject*)NULL)) +static CYTHON_INLINE PyObject *__Pyx_GetItemInt_Tuple_Fast(PyObject *o, Py_ssize_t i, + int wraparound, int boundscheck); +static PyObject *__Pyx_GetItemInt_Generic(PyObject *o, PyObject* j); +static CYTHON_INLINE PyObject *__Pyx_GetItemInt_Fast(PyObject *o, Py_ssize_t i, + int is_list, int wraparound, int boundscheck); + +/* ObjectGetItem.proto */ +#if CYTHON_USE_TYPE_SLOTS +static CYTHON_INLINE PyObject *__Pyx_PyObject_GetItem(PyObject *obj, PyObject* key); +#else +#define __Pyx_PyObject_GetItem(obj, key) PyObject_GetItem(obj, key) +#endif + +/* GetTopmostException.proto */ +#if CYTHON_USE_EXC_INFO_STACK +static _PyErr_StackItem * __Pyx_PyErr_GetTopmostException(PyThreadState *tstate); +#endif + +/* PyThreadStateGet.proto */ +#if CYTHON_FAST_THREAD_STATE +#define __Pyx_PyThreadState_declare PyThreadState *__pyx_tstate; +#define __Pyx_PyThreadState_assign __pyx_tstate = __Pyx_PyThreadState_Current; +#define __Pyx_PyErr_Occurred() __pyx_tstate->curexc_type +#else +#define __Pyx_PyThreadState_declare +#define __Pyx_PyThreadState_assign +#define __Pyx_PyErr_Occurred() PyErr_Occurred() +#endif + +/* SaveResetException.proto */ +#if CYTHON_FAST_THREAD_STATE +#define __Pyx_ExceptionSave(type, value, tb) __Pyx__ExceptionSave(__pyx_tstate, type, value, tb) +static CYTHON_INLINE void __Pyx__ExceptionSave(PyThreadState *tstate, PyObject **type, PyObject **value, PyObject **tb); +#define __Pyx_ExceptionReset(type, value, tb) __Pyx__ExceptionReset(__pyx_tstate, type, value, tb) +static CYTHON_INLINE void __Pyx__ExceptionReset(PyThreadState *tstate, PyObject *type, PyObject *value, PyObject *tb); +#else +#define __Pyx_ExceptionSave(type, value, tb) PyErr_GetExcInfo(type, value, tb) +#define __Pyx_ExceptionReset(type, value, tb) PyErr_SetExcInfo(type, value, tb) +#endif + +/* PyErrExceptionMatches.proto */ +#if CYTHON_FAST_THREAD_STATE +#define __Pyx_PyErr_ExceptionMatches(err) __Pyx_PyErr_ExceptionMatchesInState(__pyx_tstate, err) +static CYTHON_INLINE int __Pyx_PyErr_ExceptionMatchesInState(PyThreadState* tstate, PyObject* err); +#else +#define __Pyx_PyErr_ExceptionMatches(err) PyErr_ExceptionMatches(err) +#endif + +/* GetException.proto */ +#if CYTHON_FAST_THREAD_STATE +#define __Pyx_GetException(type, value, tb) __Pyx__GetException(__pyx_tstate, type, value, tb) +static int __Pyx__GetException(PyThreadState *tstate, PyObject **type, PyObject **value, PyObject **tb); +#else +static int __Pyx_GetException(PyObject **type, PyObject **value, PyObject **tb); +#endif + +/* PyCFunctionFastCall.proto */ +#if CYTHON_FAST_PYCCALL +static CYTHON_INLINE PyObject *__Pyx_PyCFunction_FastCall(PyObject *func, PyObject **args, Py_ssize_t nargs); +#else +#define __Pyx_PyCFunction_FastCall(func, args, nargs) (assert(0), NULL) +#endif + +/* PyFunctionFastCall.proto */ +#if CYTHON_FAST_PYCALL +#define __Pyx_PyFunction_FastCall(func, args, nargs)\ + __Pyx_PyFunction_FastCallDict((func), (args), (nargs), NULL) +#if 1 || PY_VERSION_HEX < 0x030600B1 +static PyObject *__Pyx_PyFunction_FastCallDict(PyObject *func, PyObject **args, Py_ssize_t nargs, PyObject *kwargs); +#else +#define __Pyx_PyFunction_FastCallDict(func, args, nargs, kwargs) _PyFunction_FastCallDict(func, args, nargs, kwargs) +#endif +#define __Pyx_BUILD_ASSERT_EXPR(cond)\ + (sizeof(char [1 - 2*!(cond)]) - 1) +#ifndef Py_MEMBER_SIZE +#define Py_MEMBER_SIZE(type, member) sizeof(((type *)0)->member) +#endif + static size_t __pyx_pyframe_localsplus_offset = 0; + #include "frameobject.h" + #define __Pxy_PyFrame_Initialize_Offsets()\ + ((void)__Pyx_BUILD_ASSERT_EXPR(sizeof(PyFrameObject) == offsetof(PyFrameObject, f_localsplus) + Py_MEMBER_SIZE(PyFrameObject, f_localsplus)),\ + (void)(__pyx_pyframe_localsplus_offset = ((size_t)PyFrame_Type.tp_basicsize) - Py_MEMBER_SIZE(PyFrameObject, f_localsplus))) + #define __Pyx_PyFrame_GetLocalsplus(frame)\ + (assert(__pyx_pyframe_localsplus_offset), (PyObject **)(((char *)(frame)) + __pyx_pyframe_localsplus_offset)) +#endif + +/* PyObjectCall.proto */ +#if CYTHON_COMPILING_IN_CPYTHON +static CYTHON_INLINE PyObject* __Pyx_PyObject_Call(PyObject *func, PyObject *arg, PyObject *kw); +#else +#define __Pyx_PyObject_Call(func, arg, kw) PyObject_Call(func, arg, kw) +#endif + +/* PyObjectCall2Args.proto */ +static CYTHON_UNUSED PyObject* __Pyx_PyObject_Call2Args(PyObject* function, PyObject* arg1, PyObject* arg2); + +/* PyObjectCallMethO.proto */ +#if CYTHON_COMPILING_IN_CPYTHON +static CYTHON_INLINE PyObject* __Pyx_PyObject_CallMethO(PyObject *func, PyObject *arg); +#endif + +/* PyObjectCallOneArg.proto */ +static CYTHON_INLINE PyObject* __Pyx_PyObject_CallOneArg(PyObject *func, PyObject *arg); + +/* PyErrFetchRestore.proto */ +#if CYTHON_FAST_THREAD_STATE +#define __Pyx_PyErr_Clear() __Pyx_ErrRestore(NULL, NULL, NULL) +#define __Pyx_ErrRestoreWithState(type, value, tb) __Pyx_ErrRestoreInState(PyThreadState_GET(), type, value, tb) +#define __Pyx_ErrFetchWithState(type, value, tb) __Pyx_ErrFetchInState(PyThreadState_GET(), type, value, tb) +#define __Pyx_ErrRestore(type, value, tb) __Pyx_ErrRestoreInState(__pyx_tstate, type, value, tb) +#define __Pyx_ErrFetch(type, value, tb) __Pyx_ErrFetchInState(__pyx_tstate, type, value, tb) +static CYTHON_INLINE void __Pyx_ErrRestoreInState(PyThreadState *tstate, PyObject *type, PyObject *value, PyObject *tb); +static CYTHON_INLINE void __Pyx_ErrFetchInState(PyThreadState *tstate, PyObject **type, PyObject **value, PyObject **tb); +#if CYTHON_COMPILING_IN_CPYTHON +#define __Pyx_PyErr_SetNone(exc) (Py_INCREF(exc), __Pyx_ErrRestore((exc), NULL, NULL)) +#else +#define __Pyx_PyErr_SetNone(exc) PyErr_SetNone(exc) +#endif +#else +#define __Pyx_PyErr_Clear() PyErr_Clear() +#define __Pyx_PyErr_SetNone(exc) PyErr_SetNone(exc) +#define __Pyx_ErrRestoreWithState(type, value, tb) PyErr_Restore(type, value, tb) +#define __Pyx_ErrFetchWithState(type, value, tb) PyErr_Fetch(type, value, tb) +#define __Pyx_ErrRestoreInState(tstate, type, value, tb) PyErr_Restore(type, value, tb) +#define __Pyx_ErrFetchInState(tstate, type, value, tb) PyErr_Fetch(type, value, tb) +#define __Pyx_ErrRestore(type, value, tb) PyErr_Restore(type, value, tb) +#define __Pyx_ErrFetch(type, value, tb) PyErr_Fetch(type, value, tb) +#endif + +/* RaiseException.proto */ +static void __Pyx_Raise(PyObject *type, PyObject *value, PyObject *tb, PyObject *cause); + +/* GetAttr.proto */ +static CYTHON_INLINE PyObject *__Pyx_GetAttr(PyObject *, PyObject *); + +/* GetAttr3.proto */ +static CYTHON_INLINE PyObject *__Pyx_GetAttr3(PyObject *, PyObject *, PyObject *); + +/* PyDictVersioning.proto */ +#if CYTHON_USE_DICT_VERSIONS && CYTHON_USE_TYPE_SLOTS +#define __PYX_DICT_VERSION_INIT ((PY_UINT64_T) -1) +#define __PYX_GET_DICT_VERSION(dict) (((PyDictObject*)(dict))->ma_version_tag) +#define __PYX_UPDATE_DICT_CACHE(dict, value, cache_var, version_var)\ + (version_var) = __PYX_GET_DICT_VERSION(dict);\ + (cache_var) = (value); +#define __PYX_PY_DICT_LOOKUP_IF_MODIFIED(VAR, DICT, LOOKUP) {\ + static PY_UINT64_T __pyx_dict_version = 0;\ + static PyObject *__pyx_dict_cached_value = NULL;\ + if (likely(__PYX_GET_DICT_VERSION(DICT) == __pyx_dict_version)) {\ + (VAR) = __pyx_dict_cached_value;\ + } else {\ + (VAR) = __pyx_dict_cached_value = (LOOKUP);\ + __pyx_dict_version = __PYX_GET_DICT_VERSION(DICT);\ + }\ +} +static CYTHON_INLINE PY_UINT64_T __Pyx_get_tp_dict_version(PyObject *obj); +static CYTHON_INLINE PY_UINT64_T __Pyx_get_object_dict_version(PyObject *obj); +static CYTHON_INLINE int __Pyx_object_dict_version_matches(PyObject* obj, PY_UINT64_T tp_dict_version, PY_UINT64_T obj_dict_version); +#else +#define __PYX_GET_DICT_VERSION(dict) (0) +#define __PYX_UPDATE_DICT_CACHE(dict, value, cache_var, version_var) +#define __PYX_PY_DICT_LOOKUP_IF_MODIFIED(VAR, DICT, LOOKUP) (VAR) = (LOOKUP); +#endif + +/* GetModuleGlobalName.proto */ +#if CYTHON_USE_DICT_VERSIONS +#define __Pyx_GetModuleGlobalName(var, name) {\ + static PY_UINT64_T __pyx_dict_version = 0;\ + static PyObject *__pyx_dict_cached_value = NULL;\ + (var) = (likely(__pyx_dict_version == __PYX_GET_DICT_VERSION(__pyx_d))) ?\ + (likely(__pyx_dict_cached_value) ? __Pyx_NewRef(__pyx_dict_cached_value) : __Pyx_GetBuiltinName(name)) :\ + __Pyx__GetModuleGlobalName(name, &__pyx_dict_version, &__pyx_dict_cached_value);\ +} +#define __Pyx_GetModuleGlobalNameUncached(var, name) {\ + PY_UINT64_T __pyx_dict_version;\ + PyObject *__pyx_dict_cached_value;\ + (var) = __Pyx__GetModuleGlobalName(name, &__pyx_dict_version, &__pyx_dict_cached_value);\ +} +static PyObject *__Pyx__GetModuleGlobalName(PyObject *name, PY_UINT64_T *dict_version, PyObject **dict_cached_value); +#else +#define __Pyx_GetModuleGlobalName(var, name) (var) = __Pyx__GetModuleGlobalName(name) +#define __Pyx_GetModuleGlobalNameUncached(var, name) (var) = __Pyx__GetModuleGlobalName(name) +static CYTHON_INLINE PyObject *__Pyx__GetModuleGlobalName(PyObject *name); +#endif + +/* Import.proto */ +static PyObject *__Pyx_Import(PyObject *name, PyObject *from_list, int level); + +/* ImportFrom.proto */ +static PyObject* __Pyx_ImportFrom(PyObject* module, PyObject* name); + +/* HasAttr.proto */ +static CYTHON_INLINE int __Pyx_HasAttr(PyObject *, PyObject *); + +/* PyObject_GenericGetAttrNoDict.proto */ +#if CYTHON_USE_TYPE_SLOTS && CYTHON_USE_PYTYPE_LOOKUP && PY_VERSION_HEX < 0x03070000 +static CYTHON_INLINE PyObject* __Pyx_PyObject_GenericGetAttrNoDict(PyObject* obj, PyObject* attr_name); +#else +#define __Pyx_PyObject_GenericGetAttrNoDict PyObject_GenericGetAttr +#endif + +/* PyObject_GenericGetAttr.proto */ +#if CYTHON_USE_TYPE_SLOTS && CYTHON_USE_PYTYPE_LOOKUP && PY_VERSION_HEX < 0x03070000 +static PyObject* __Pyx_PyObject_GenericGetAttr(PyObject* obj, PyObject* attr_name); +#else +#define __Pyx_PyObject_GenericGetAttr PyObject_GenericGetAttr +#endif + +/* PyObjectGetAttrStrNoError.proto */ +static CYTHON_INLINE PyObject* __Pyx_PyObject_GetAttrStrNoError(PyObject* obj, PyObject* attr_name); + +/* SetupReduce.proto */ +static int __Pyx_setup_reduce(PyObject* type_obj); + +/* CLineInTraceback.proto */ +#ifdef CYTHON_CLINE_IN_TRACEBACK +#define __Pyx_CLineForTraceback(tstate, c_line) (((CYTHON_CLINE_IN_TRACEBACK)) ? c_line : 0) +#else +static int __Pyx_CLineForTraceback(PyThreadState *tstate, int c_line); +#endif + +/* CodeObjectCache.proto */ +typedef struct { + PyCodeObject* code_object; + int code_line; +} __Pyx_CodeObjectCacheEntry; +struct __Pyx_CodeObjectCache { + int count; + int max_count; + __Pyx_CodeObjectCacheEntry* entries; +}; +static struct __Pyx_CodeObjectCache __pyx_code_cache = {0,0,NULL}; +static int __pyx_bisect_code_objects(__Pyx_CodeObjectCacheEntry* entries, int count, int code_line); +static PyCodeObject *__pyx_find_code_object(int code_line); +static void __pyx_insert_code_object(int code_line, PyCodeObject* code_object); + +/* AddTraceback.proto */ +static void __Pyx_AddTraceback(const char *funcname, int c_line, + int py_line, const char *filename); + +/* GCCDiagnostics.proto */ +#if defined(__GNUC__) && (__GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ >= 6)) +#define __Pyx_HAS_GCC_DIAGNOSTIC +#endif + +/* CIntFromPy.proto */ +static CYTHON_INLINE long __Pyx_PyInt_As_long(PyObject *); + +/* CIntToPy.proto */ +static CYTHON_INLINE PyObject* __Pyx_PyInt_From_long(long value); + +/* CIntFromPy.proto */ +static CYTHON_INLINE int __Pyx_PyInt_As_int(PyObject *); + +/* FastTypeChecks.proto */ +#if CYTHON_COMPILING_IN_CPYTHON +#define __Pyx_TypeCheck(obj, type) __Pyx_IsSubtype(Py_TYPE(obj), (PyTypeObject *)type) +static CYTHON_INLINE int __Pyx_IsSubtype(PyTypeObject *a, PyTypeObject *b); +static CYTHON_INLINE int __Pyx_PyErr_GivenExceptionMatches(PyObject *err, PyObject *type); +static CYTHON_INLINE int __Pyx_PyErr_GivenExceptionMatches2(PyObject *err, PyObject *type1, PyObject *type2); +#else +#define __Pyx_TypeCheck(obj, type) PyObject_TypeCheck(obj, (PyTypeObject *)type) +#define __Pyx_PyErr_GivenExceptionMatches(err, type) PyErr_GivenExceptionMatches(err, type) +#define __Pyx_PyErr_GivenExceptionMatches2(err, type1, type2) (PyErr_GivenExceptionMatches(err, type1) || PyErr_GivenExceptionMatches(err, type2)) +#endif +#define __Pyx_PyException_Check(obj) __Pyx_TypeCheck(obj, PyExc_Exception) + +/* CheckBinaryVersion.proto */ +static int __Pyx_check_binary_version(void); + +/* InitStrings.proto */ +static int __Pyx_InitStrings(__Pyx_StringTabEntry *t); + + +/* Module declarations from 'aiohttp._helpers' */ +static PyTypeObject *__pyx_ptype_7aiohttp_8_helpers_reify = 0; +static PyObject *__pyx_f_7aiohttp_8_helpers___pyx_unpickle_reify__set_state(struct __pyx_obj_7aiohttp_8_helpers_reify *, PyObject *); /*proto*/ +#define __Pyx_MODULE_NAME "aiohttp._helpers" +extern int __pyx_module_is_main_aiohttp___helpers; +int __pyx_module_is_main_aiohttp___helpers = 0; + +/* Implementation of 'aiohttp._helpers' */ +static PyObject *__pyx_builtin_KeyError; +static PyObject *__pyx_builtin_AttributeError; +static const char __pyx_k_doc[] = "__doc__"; +static const char __pyx_k_new[] = "__new__"; +static const char __pyx_k_dict[] = "__dict__"; +static const char __pyx_k_main[] = "__main__"; +static const char __pyx_k_name[] = "__name__"; +static const char __pyx_k_test[] = "__test__"; +static const char __pyx_k_cache[] = "_cache"; +static const char __pyx_k_reify[] = "reify"; +static const char __pyx_k_import[] = "__import__"; +static const char __pyx_k_pickle[] = "pickle"; +static const char __pyx_k_reduce[] = "__reduce__"; +static const char __pyx_k_update[] = "update"; +static const char __pyx_k_wrapped[] = "wrapped"; +static const char __pyx_k_KeyError[] = "KeyError"; +static const char __pyx_k_getstate[] = "__getstate__"; +static const char __pyx_k_pyx_type[] = "__pyx_type"; +static const char __pyx_k_setstate[] = "__setstate__"; +static const char __pyx_k_pyx_state[] = "__pyx_state"; +static const char __pyx_k_reduce_ex[] = "__reduce_ex__"; +static const char __pyx_k_pyx_result[] = "__pyx_result"; +static const char __pyx_k_PickleError[] = "PickleError"; +static const char __pyx_k_pyx_checksum[] = "__pyx_checksum"; +static const char __pyx_k_stringsource[] = "stringsource"; +static const char __pyx_k_reduce_cython[] = "__reduce_cython__"; +static const char __pyx_k_AttributeError[] = "AttributeError"; +static const char __pyx_k_pyx_PickleError[] = "__pyx_PickleError"; +static const char __pyx_k_setstate_cython[] = "__setstate_cython__"; +static const char __pyx_k_aiohttp__helpers[] = "aiohttp._helpers"; +static const char __pyx_k_cline_in_traceback[] = "cline_in_traceback"; +static const char __pyx_k_pyx_unpickle_reify[] = "__pyx_unpickle_reify"; +static const char __pyx_k_reified_property_is_read_only[] = "reified property is read-only"; +static const char __pyx_k_Incompatible_checksums_s_vs_0x77[] = "Incompatible checksums (%s vs 0x770cb8f = (name, wrapped))"; +static PyObject *__pyx_n_s_AttributeError; +static PyObject *__pyx_kp_s_Incompatible_checksums_s_vs_0x77; +static PyObject *__pyx_n_s_KeyError; +static PyObject *__pyx_n_s_PickleError; +static PyObject *__pyx_n_s_aiohttp__helpers; +static PyObject *__pyx_n_s_cache; +static PyObject *__pyx_n_s_cline_in_traceback; +static PyObject *__pyx_n_s_dict; +static PyObject *__pyx_n_s_doc; +static PyObject *__pyx_n_s_getstate; +static PyObject *__pyx_n_s_import; +static PyObject *__pyx_n_s_main; +static PyObject *__pyx_n_s_name; +static PyObject *__pyx_n_s_new; +static PyObject *__pyx_n_s_pickle; +static PyObject *__pyx_n_s_pyx_PickleError; +static PyObject *__pyx_n_s_pyx_checksum; +static PyObject *__pyx_n_s_pyx_result; +static PyObject *__pyx_n_s_pyx_state; +static PyObject *__pyx_n_s_pyx_type; +static PyObject *__pyx_n_s_pyx_unpickle_reify; +static PyObject *__pyx_n_s_reduce; +static PyObject *__pyx_n_s_reduce_cython; +static PyObject *__pyx_n_s_reduce_ex; +static PyObject *__pyx_kp_u_reified_property_is_read_only; +static PyObject *__pyx_n_s_reify; +static PyObject *__pyx_n_s_setstate; +static PyObject *__pyx_n_s_setstate_cython; +static PyObject *__pyx_kp_s_stringsource; +static PyObject *__pyx_n_s_test; +static PyObject *__pyx_n_s_update; +static PyObject *__pyx_n_s_wrapped; +static int __pyx_pf_7aiohttp_8_helpers_5reify___init__(struct __pyx_obj_7aiohttp_8_helpers_reify *__pyx_v_self, PyObject *__pyx_v_wrapped); /* proto */ +static PyObject *__pyx_pf_7aiohttp_8_helpers_5reify_7__doc_____get__(struct __pyx_obj_7aiohttp_8_helpers_reify *__pyx_v_self); /* proto */ +static PyObject *__pyx_pf_7aiohttp_8_helpers_5reify_2__get__(struct __pyx_obj_7aiohttp_8_helpers_reify *__pyx_v_self, PyObject *__pyx_v_inst, CYTHON_UNUSED PyObject *__pyx_v_owner); /* proto */ +static int __pyx_pf_7aiohttp_8_helpers_5reify_4__set__(CYTHON_UNUSED struct __pyx_obj_7aiohttp_8_helpers_reify *__pyx_v_self, CYTHON_UNUSED PyObject *__pyx_v_inst, CYTHON_UNUSED PyObject *__pyx_v_value); /* proto */ +static PyObject *__pyx_pf_7aiohttp_8_helpers_5reify_6__reduce_cython__(struct __pyx_obj_7aiohttp_8_helpers_reify *__pyx_v_self); /* proto */ +static PyObject *__pyx_pf_7aiohttp_8_helpers_5reify_8__setstate_cython__(struct __pyx_obj_7aiohttp_8_helpers_reify *__pyx_v_self, PyObject *__pyx_v___pyx_state); /* proto */ +static PyObject *__pyx_pf_7aiohttp_8_helpers___pyx_unpickle_reify(CYTHON_UNUSED PyObject *__pyx_self, PyObject *__pyx_v___pyx_type, long __pyx_v___pyx_checksum, PyObject *__pyx_v___pyx_state); /* proto */ +static PyObject *__pyx_tp_new_7aiohttp_8_helpers_reify(PyTypeObject *t, PyObject *a, PyObject *k); /*proto*/ +static PyObject *__pyx_int_124832655; +static PyObject *__pyx_tuple_; +static PyObject *__pyx_tuple__2; +static PyObject *__pyx_codeobj__3; +/* Late includes */ + +/* "aiohttp/_helpers.pyx":13 + * cdef object name + * + * def __init__(self, wrapped): # <<<<<<<<<<<<<< + * self.wrapped = wrapped + * self.name = wrapped.__name__ + */ + +/* Python wrapper */ +static int __pyx_pw_7aiohttp_8_helpers_5reify_1__init__(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/ +static int __pyx_pw_7aiohttp_8_helpers_5reify_1__init__(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds) { + PyObject *__pyx_v_wrapped = 0; + int __pyx_lineno = 0; + const char *__pyx_filename = NULL; + int __pyx_clineno = 0; + int __pyx_r; + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("__init__ (wrapper)", 0); + { + static PyObject **__pyx_pyargnames[] = {&__pyx_n_s_wrapped,0}; + PyObject* values[1] = {0}; + if (unlikely(__pyx_kwds)) { + Py_ssize_t kw_args; + const Py_ssize_t pos_args = PyTuple_GET_SIZE(__pyx_args); + switch (pos_args) { + case 1: values[0] = PyTuple_GET_ITEM(__pyx_args, 0); + CYTHON_FALLTHROUGH; + case 0: break; + default: goto __pyx_L5_argtuple_error; + } + kw_args = PyDict_Size(__pyx_kwds); + switch (pos_args) { + case 0: + if (likely((values[0] = __Pyx_PyDict_GetItemStr(__pyx_kwds, __pyx_n_s_wrapped)) != 0)) kw_args--; + else goto __pyx_L5_argtuple_error; + } + if (unlikely(kw_args > 0)) { + if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, pos_args, "__init__") < 0)) __PYX_ERR(0, 13, __pyx_L3_error) + } + } else if (PyTuple_GET_SIZE(__pyx_args) != 1) { + goto __pyx_L5_argtuple_error; + } else { + values[0] = PyTuple_GET_ITEM(__pyx_args, 0); + } + __pyx_v_wrapped = values[0]; + } + goto __pyx_L4_argument_unpacking_done; + __pyx_L5_argtuple_error:; + __Pyx_RaiseArgtupleInvalid("__init__", 1, 1, 1, PyTuple_GET_SIZE(__pyx_args)); __PYX_ERR(0, 13, __pyx_L3_error) + __pyx_L3_error:; + __Pyx_AddTraceback("aiohttp._helpers.reify.__init__", __pyx_clineno, __pyx_lineno, __pyx_filename); + __Pyx_RefNannyFinishContext(); + return -1; + __pyx_L4_argument_unpacking_done:; + __pyx_r = __pyx_pf_7aiohttp_8_helpers_5reify___init__(((struct __pyx_obj_7aiohttp_8_helpers_reify *)__pyx_v_self), __pyx_v_wrapped); + + /* function exit code */ + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +static int __pyx_pf_7aiohttp_8_helpers_5reify___init__(struct __pyx_obj_7aiohttp_8_helpers_reify *__pyx_v_self, PyObject *__pyx_v_wrapped) { + int __pyx_r; + __Pyx_RefNannyDeclarations + PyObject *__pyx_t_1 = NULL; + int __pyx_lineno = 0; + const char *__pyx_filename = NULL; + int __pyx_clineno = 0; + __Pyx_RefNannySetupContext("__init__", 0); + + /* "aiohttp/_helpers.pyx":14 + * + * def __init__(self, wrapped): + * self.wrapped = wrapped # <<<<<<<<<<<<<< + * self.name = wrapped.__name__ + * + */ + __Pyx_INCREF(__pyx_v_wrapped); + __Pyx_GIVEREF(__pyx_v_wrapped); + __Pyx_GOTREF(__pyx_v_self->wrapped); + __Pyx_DECREF(__pyx_v_self->wrapped); + __pyx_v_self->wrapped = __pyx_v_wrapped; + + /* "aiohttp/_helpers.pyx":15 + * def __init__(self, wrapped): + * self.wrapped = wrapped + * self.name = wrapped.__name__ # <<<<<<<<<<<<<< + * + * @property + */ + __pyx_t_1 = __Pyx_PyObject_GetAttrStr(__pyx_v_wrapped, __pyx_n_s_name); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 15, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __Pyx_GIVEREF(__pyx_t_1); + __Pyx_GOTREF(__pyx_v_self->name); + __Pyx_DECREF(__pyx_v_self->name); + __pyx_v_self->name = __pyx_t_1; + __pyx_t_1 = 0; + + /* "aiohttp/_helpers.pyx":13 + * cdef object name + * + * def __init__(self, wrapped): # <<<<<<<<<<<<<< + * self.wrapped = wrapped + * self.name = wrapped.__name__ + */ + + /* function exit code */ + __pyx_r = 0; + goto __pyx_L0; + __pyx_L1_error:; + __Pyx_XDECREF(__pyx_t_1); + __Pyx_AddTraceback("aiohttp._helpers.reify.__init__", __pyx_clineno, __pyx_lineno, __pyx_filename); + __pyx_r = -1; + __pyx_L0:; + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +/* "aiohttp/_helpers.pyx":18 + * + * @property + * def __doc__(self): # <<<<<<<<<<<<<< + * return self.wrapped.__doc__ + * + */ + +/* Python wrapper */ +static PyObject *__pyx_pw_7aiohttp_8_helpers_5reify_7__doc___1__get__(PyObject *__pyx_v_self); /*proto*/ +static PyObject *__pyx_pw_7aiohttp_8_helpers_5reify_7__doc___1__get__(PyObject *__pyx_v_self) { + PyObject *__pyx_r = 0; + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("__get__ (wrapper)", 0); + __pyx_r = __pyx_pf_7aiohttp_8_helpers_5reify_7__doc_____get__(((struct __pyx_obj_7aiohttp_8_helpers_reify *)__pyx_v_self)); + + /* function exit code */ + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +static PyObject *__pyx_pf_7aiohttp_8_helpers_5reify_7__doc_____get__(struct __pyx_obj_7aiohttp_8_helpers_reify *__pyx_v_self) { + PyObject *__pyx_r = NULL; + __Pyx_RefNannyDeclarations + PyObject *__pyx_t_1 = NULL; + int __pyx_lineno = 0; + const char *__pyx_filename = NULL; + int __pyx_clineno = 0; + __Pyx_RefNannySetupContext("__get__", 0); + + /* "aiohttp/_helpers.pyx":19 + * @property + * def __doc__(self): + * return self.wrapped.__doc__ # <<<<<<<<<<<<<< + * + * def __get__(self, inst, owner): + */ + __Pyx_XDECREF(__pyx_r); + __pyx_t_1 = __Pyx_PyObject_GetAttrStr(__pyx_v_self->wrapped, __pyx_n_s_doc); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 19, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __pyx_r = __pyx_t_1; + __pyx_t_1 = 0; + goto __pyx_L0; + + /* "aiohttp/_helpers.pyx":18 + * + * @property + * def __doc__(self): # <<<<<<<<<<<<<< + * return self.wrapped.__doc__ + * + */ + + /* function exit code */ + __pyx_L1_error:; + __Pyx_XDECREF(__pyx_t_1); + __Pyx_AddTraceback("aiohttp._helpers.reify.__doc__.__get__", __pyx_clineno, __pyx_lineno, __pyx_filename); + __pyx_r = NULL; + __pyx_L0:; + __Pyx_XGIVEREF(__pyx_r); + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +/* "aiohttp/_helpers.pyx":21 + * return self.wrapped.__doc__ + * + * def __get__(self, inst, owner): # <<<<<<<<<<<<<< + * try: + * try: + */ + +/* Python wrapper */ +static PyObject *__pyx_pw_7aiohttp_8_helpers_5reify_3__get__(PyObject *__pyx_v_self, PyObject *__pyx_v_inst, PyObject *__pyx_v_owner); /*proto*/ +static PyObject *__pyx_pw_7aiohttp_8_helpers_5reify_3__get__(PyObject *__pyx_v_self, PyObject *__pyx_v_inst, PyObject *__pyx_v_owner) { + PyObject *__pyx_r = 0; + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("__get__ (wrapper)", 0); + __pyx_r = __pyx_pf_7aiohttp_8_helpers_5reify_2__get__(((struct __pyx_obj_7aiohttp_8_helpers_reify *)__pyx_v_self), ((PyObject *)__pyx_v_inst), ((PyObject *)__pyx_v_owner)); + + /* function exit code */ + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +static PyObject *__pyx_pf_7aiohttp_8_helpers_5reify_2__get__(struct __pyx_obj_7aiohttp_8_helpers_reify *__pyx_v_self, PyObject *__pyx_v_inst, CYTHON_UNUSED PyObject *__pyx_v_owner) { + PyObject *__pyx_v_val = NULL; + PyObject *__pyx_r = NULL; + __Pyx_RefNannyDeclarations + PyObject *__pyx_t_1 = NULL; + PyObject *__pyx_t_2 = NULL; + PyObject *__pyx_t_3 = NULL; + PyObject *__pyx_t_4 = NULL; + PyObject *__pyx_t_5 = NULL; + PyObject *__pyx_t_6 = NULL; + PyObject *__pyx_t_7 = NULL; + PyObject *__pyx_t_8 = NULL; + int __pyx_t_9; + PyObject *__pyx_t_10 = NULL; + PyObject *__pyx_t_11 = NULL; + PyObject *__pyx_t_12 = NULL; + PyObject *__pyx_t_13 = NULL; + int __pyx_t_14; + int __pyx_t_15; + int __pyx_lineno = 0; + const char *__pyx_filename = NULL; + int __pyx_clineno = 0; + __Pyx_RefNannySetupContext("__get__", 0); + + /* "aiohttp/_helpers.pyx":22 + * + * def __get__(self, inst, owner): + * try: # <<<<<<<<<<<<<< + * try: + * return inst._cache[self.name] + */ + { + __Pyx_PyThreadState_declare + __Pyx_PyThreadState_assign + __Pyx_ExceptionSave(&__pyx_t_1, &__pyx_t_2, &__pyx_t_3); + __Pyx_XGOTREF(__pyx_t_1); + __Pyx_XGOTREF(__pyx_t_2); + __Pyx_XGOTREF(__pyx_t_3); + /*try:*/ { + + /* "aiohttp/_helpers.pyx":23 + * def __get__(self, inst, owner): + * try: + * try: # <<<<<<<<<<<<<< + * return inst._cache[self.name] + * except KeyError: + */ + { + __Pyx_PyThreadState_declare + __Pyx_PyThreadState_assign + __Pyx_ExceptionSave(&__pyx_t_4, &__pyx_t_5, &__pyx_t_6); + __Pyx_XGOTREF(__pyx_t_4); + __Pyx_XGOTREF(__pyx_t_5); + __Pyx_XGOTREF(__pyx_t_6); + /*try:*/ { + + /* "aiohttp/_helpers.pyx":24 + * try: + * try: + * return inst._cache[self.name] # <<<<<<<<<<<<<< + * except KeyError: + * val = self.wrapped(inst) + */ + __Pyx_XDECREF(__pyx_r); + __pyx_t_7 = __Pyx_PyObject_GetAttrStr(__pyx_v_inst, __pyx_n_s_cache); if (unlikely(!__pyx_t_7)) __PYX_ERR(0, 24, __pyx_L9_error) + __Pyx_GOTREF(__pyx_t_7); + __pyx_t_8 = __Pyx_PyObject_GetItem(__pyx_t_7, __pyx_v_self->name); if (unlikely(!__pyx_t_8)) __PYX_ERR(0, 24, __pyx_L9_error) + __Pyx_GOTREF(__pyx_t_8); + __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0; + __pyx_r = __pyx_t_8; + __pyx_t_8 = 0; + goto __pyx_L13_try_return; + + /* "aiohttp/_helpers.pyx":23 + * def __get__(self, inst, owner): + * try: + * try: # <<<<<<<<<<<<<< + * return inst._cache[self.name] + * except KeyError: + */ + } + __pyx_L9_error:; + __Pyx_XDECREF(__pyx_t_7); __pyx_t_7 = 0; + __Pyx_XDECREF(__pyx_t_8); __pyx_t_8 = 0; + + /* "aiohttp/_helpers.pyx":25 + * try: + * return inst._cache[self.name] + * except KeyError: # <<<<<<<<<<<<<< + * val = self.wrapped(inst) + * inst._cache[self.name] = val + */ + __pyx_t_9 = __Pyx_PyErr_ExceptionMatches(__pyx_builtin_KeyError); + if (__pyx_t_9) { + __Pyx_AddTraceback("aiohttp._helpers.reify.__get__", __pyx_clineno, __pyx_lineno, __pyx_filename); + if (__Pyx_GetException(&__pyx_t_8, &__pyx_t_7, &__pyx_t_10) < 0) __PYX_ERR(0, 25, __pyx_L11_except_error) + __Pyx_GOTREF(__pyx_t_8); + __Pyx_GOTREF(__pyx_t_7); + __Pyx_GOTREF(__pyx_t_10); + + /* "aiohttp/_helpers.pyx":26 + * return inst._cache[self.name] + * except KeyError: + * val = self.wrapped(inst) # <<<<<<<<<<<<<< + * inst._cache[self.name] = val + * return val + */ + __Pyx_INCREF(__pyx_v_self->wrapped); + __pyx_t_12 = __pyx_v_self->wrapped; __pyx_t_13 = NULL; + if (CYTHON_UNPACK_METHODS && likely(PyMethod_Check(__pyx_t_12))) { + __pyx_t_13 = PyMethod_GET_SELF(__pyx_t_12); + if (likely(__pyx_t_13)) { + PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_12); + __Pyx_INCREF(__pyx_t_13); + __Pyx_INCREF(function); + __Pyx_DECREF_SET(__pyx_t_12, function); + } + } + __pyx_t_11 = (__pyx_t_13) ? __Pyx_PyObject_Call2Args(__pyx_t_12, __pyx_t_13, __pyx_v_inst) : __Pyx_PyObject_CallOneArg(__pyx_t_12, __pyx_v_inst); + __Pyx_XDECREF(__pyx_t_13); __pyx_t_13 = 0; + if (unlikely(!__pyx_t_11)) __PYX_ERR(0, 26, __pyx_L11_except_error) + __Pyx_GOTREF(__pyx_t_11); + __Pyx_DECREF(__pyx_t_12); __pyx_t_12 = 0; + __pyx_v_val = __pyx_t_11; + __pyx_t_11 = 0; + + /* "aiohttp/_helpers.pyx":27 + * except KeyError: + * val = self.wrapped(inst) + * inst._cache[self.name] = val # <<<<<<<<<<<<<< + * return val + * except AttributeError: + */ + __pyx_t_11 = __Pyx_PyObject_GetAttrStr(__pyx_v_inst, __pyx_n_s_cache); if (unlikely(!__pyx_t_11)) __PYX_ERR(0, 27, __pyx_L11_except_error) + __Pyx_GOTREF(__pyx_t_11); + if (unlikely(PyObject_SetItem(__pyx_t_11, __pyx_v_self->name, __pyx_v_val) < 0)) __PYX_ERR(0, 27, __pyx_L11_except_error) + __Pyx_DECREF(__pyx_t_11); __pyx_t_11 = 0; + + /* "aiohttp/_helpers.pyx":28 + * val = self.wrapped(inst) + * inst._cache[self.name] = val + * return val # <<<<<<<<<<<<<< + * except AttributeError: + * if inst is None: + */ + __Pyx_XDECREF(__pyx_r); + __Pyx_INCREF(__pyx_v_val); + __pyx_r = __pyx_v_val; + __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0; + __Pyx_DECREF(__pyx_t_8); __pyx_t_8 = 0; + __Pyx_DECREF(__pyx_t_10); __pyx_t_10 = 0; + goto __pyx_L12_except_return; + } + goto __pyx_L11_except_error; + __pyx_L11_except_error:; + + /* "aiohttp/_helpers.pyx":23 + * def __get__(self, inst, owner): + * try: + * try: # <<<<<<<<<<<<<< + * return inst._cache[self.name] + * except KeyError: + */ + __Pyx_XGIVEREF(__pyx_t_4); + __Pyx_XGIVEREF(__pyx_t_5); + __Pyx_XGIVEREF(__pyx_t_6); + __Pyx_ExceptionReset(__pyx_t_4, __pyx_t_5, __pyx_t_6); + goto __pyx_L3_error; + __pyx_L13_try_return:; + __Pyx_XGIVEREF(__pyx_t_4); + __Pyx_XGIVEREF(__pyx_t_5); + __Pyx_XGIVEREF(__pyx_t_6); + __Pyx_ExceptionReset(__pyx_t_4, __pyx_t_5, __pyx_t_6); + goto __pyx_L7_try_return; + __pyx_L12_except_return:; + __Pyx_XGIVEREF(__pyx_t_4); + __Pyx_XGIVEREF(__pyx_t_5); + __Pyx_XGIVEREF(__pyx_t_6); + __Pyx_ExceptionReset(__pyx_t_4, __pyx_t_5, __pyx_t_6); + goto __pyx_L7_try_return; + } + + /* "aiohttp/_helpers.pyx":22 + * + * def __get__(self, inst, owner): + * try: # <<<<<<<<<<<<<< + * try: + * return inst._cache[self.name] + */ + } + __pyx_L3_error:; + __Pyx_XDECREF(__pyx_t_10); __pyx_t_10 = 0; + __Pyx_XDECREF(__pyx_t_11); __pyx_t_11 = 0; + __Pyx_XDECREF(__pyx_t_12); __pyx_t_12 = 0; + __Pyx_XDECREF(__pyx_t_13); __pyx_t_13 = 0; + __Pyx_XDECREF(__pyx_t_7); __pyx_t_7 = 0; + __Pyx_XDECREF(__pyx_t_8); __pyx_t_8 = 0; + + /* "aiohttp/_helpers.pyx":29 + * inst._cache[self.name] = val + * return val + * except AttributeError: # <<<<<<<<<<<<<< + * if inst is None: + * return self + */ + __pyx_t_9 = __Pyx_PyErr_ExceptionMatches(__pyx_builtin_AttributeError); + if (__pyx_t_9) { + __Pyx_AddTraceback("aiohttp._helpers.reify.__get__", __pyx_clineno, __pyx_lineno, __pyx_filename); + if (__Pyx_GetException(&__pyx_t_10, &__pyx_t_7, &__pyx_t_8) < 0) __PYX_ERR(0, 29, __pyx_L5_except_error) + __Pyx_GOTREF(__pyx_t_10); + __Pyx_GOTREF(__pyx_t_7); + __Pyx_GOTREF(__pyx_t_8); + + /* "aiohttp/_helpers.pyx":30 + * return val + * except AttributeError: + * if inst is None: # <<<<<<<<<<<<<< + * return self + * raise + */ + __pyx_t_14 = (__pyx_v_inst == Py_None); + __pyx_t_15 = (__pyx_t_14 != 0); + if (__pyx_t_15) { + + /* "aiohttp/_helpers.pyx":31 + * except AttributeError: + * if inst is None: + * return self # <<<<<<<<<<<<<< + * raise + * + */ + __Pyx_XDECREF(__pyx_r); + __Pyx_INCREF(((PyObject *)__pyx_v_self)); + __pyx_r = ((PyObject *)__pyx_v_self); + __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0; + __Pyx_DECREF(__pyx_t_8); __pyx_t_8 = 0; + __Pyx_DECREF(__pyx_t_10); __pyx_t_10 = 0; + goto __pyx_L6_except_return; + + /* "aiohttp/_helpers.pyx":30 + * return val + * except AttributeError: + * if inst is None: # <<<<<<<<<<<<<< + * return self + * raise + */ + } + + /* "aiohttp/_helpers.pyx":32 + * if inst is None: + * return self + * raise # <<<<<<<<<<<<<< + * + * def __set__(self, inst, value): + */ + __Pyx_GIVEREF(__pyx_t_10); + __Pyx_GIVEREF(__pyx_t_7); + __Pyx_XGIVEREF(__pyx_t_8); + __Pyx_ErrRestoreWithState(__pyx_t_10, __pyx_t_7, __pyx_t_8); + __pyx_t_10 = 0; __pyx_t_7 = 0; __pyx_t_8 = 0; + __PYX_ERR(0, 32, __pyx_L5_except_error) + } + goto __pyx_L5_except_error; + __pyx_L5_except_error:; + + /* "aiohttp/_helpers.pyx":22 + * + * def __get__(self, inst, owner): + * try: # <<<<<<<<<<<<<< + * try: + * return inst._cache[self.name] + */ + __Pyx_XGIVEREF(__pyx_t_1); + __Pyx_XGIVEREF(__pyx_t_2); + __Pyx_XGIVEREF(__pyx_t_3); + __Pyx_ExceptionReset(__pyx_t_1, __pyx_t_2, __pyx_t_3); + goto __pyx_L1_error; + __pyx_L7_try_return:; + __Pyx_XGIVEREF(__pyx_t_1); + __Pyx_XGIVEREF(__pyx_t_2); + __Pyx_XGIVEREF(__pyx_t_3); + __Pyx_ExceptionReset(__pyx_t_1, __pyx_t_2, __pyx_t_3); + goto __pyx_L0; + __pyx_L6_except_return:; + __Pyx_XGIVEREF(__pyx_t_1); + __Pyx_XGIVEREF(__pyx_t_2); + __Pyx_XGIVEREF(__pyx_t_3); + __Pyx_ExceptionReset(__pyx_t_1, __pyx_t_2, __pyx_t_3); + goto __pyx_L0; + } + + /* "aiohttp/_helpers.pyx":21 + * return self.wrapped.__doc__ + * + * def __get__(self, inst, owner): # <<<<<<<<<<<<<< + * try: + * try: + */ + + /* function exit code */ + __pyx_L1_error:; + __Pyx_XDECREF(__pyx_t_7); + __Pyx_XDECREF(__pyx_t_8); + __Pyx_XDECREF(__pyx_t_10); + __Pyx_XDECREF(__pyx_t_11); + __Pyx_XDECREF(__pyx_t_12); + __Pyx_XDECREF(__pyx_t_13); + __Pyx_AddTraceback("aiohttp._helpers.reify.__get__", __pyx_clineno, __pyx_lineno, __pyx_filename); + __pyx_r = NULL; + __pyx_L0:; + __Pyx_XDECREF(__pyx_v_val); + __Pyx_XGIVEREF(__pyx_r); + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +/* "aiohttp/_helpers.pyx":34 + * raise + * + * def __set__(self, inst, value): # <<<<<<<<<<<<<< + * raise AttributeError("reified property is read-only") + */ + +/* Python wrapper */ +static int __pyx_pw_7aiohttp_8_helpers_5reify_5__set__(PyObject *__pyx_v_self, PyObject *__pyx_v_inst, PyObject *__pyx_v_value); /*proto*/ +static int __pyx_pw_7aiohttp_8_helpers_5reify_5__set__(PyObject *__pyx_v_self, PyObject *__pyx_v_inst, PyObject *__pyx_v_value) { + int __pyx_r; + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("__set__ (wrapper)", 0); + __pyx_r = __pyx_pf_7aiohttp_8_helpers_5reify_4__set__(((struct __pyx_obj_7aiohttp_8_helpers_reify *)__pyx_v_self), ((PyObject *)__pyx_v_inst), ((PyObject *)__pyx_v_value)); + + /* function exit code */ + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +static int __pyx_pf_7aiohttp_8_helpers_5reify_4__set__(CYTHON_UNUSED struct __pyx_obj_7aiohttp_8_helpers_reify *__pyx_v_self, CYTHON_UNUSED PyObject *__pyx_v_inst, CYTHON_UNUSED PyObject *__pyx_v_value) { + int __pyx_r; + __Pyx_RefNannyDeclarations + PyObject *__pyx_t_1 = NULL; + int __pyx_lineno = 0; + const char *__pyx_filename = NULL; + int __pyx_clineno = 0; + __Pyx_RefNannySetupContext("__set__", 0); + + /* "aiohttp/_helpers.pyx":35 + * + * def __set__(self, inst, value): + * raise AttributeError("reified property is read-only") # <<<<<<<<<<<<<< + */ + __pyx_t_1 = __Pyx_PyObject_Call(__pyx_builtin_AttributeError, __pyx_tuple_, NULL); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 35, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __Pyx_Raise(__pyx_t_1, 0, 0, 0); + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + __PYX_ERR(0, 35, __pyx_L1_error) + + /* "aiohttp/_helpers.pyx":34 + * raise + * + * def __set__(self, inst, value): # <<<<<<<<<<<<<< + * raise AttributeError("reified property is read-only") + */ + + /* function exit code */ + __pyx_L1_error:; + __Pyx_XDECREF(__pyx_t_1); + __Pyx_AddTraceback("aiohttp._helpers.reify.__set__", __pyx_clineno, __pyx_lineno, __pyx_filename); + __pyx_r = -1; + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +/* "(tree fragment)":1 + * def __reduce_cython__(self): # <<<<<<<<<<<<<< + * cdef tuple state + * cdef object _dict + */ + +/* Python wrapper */ +static PyObject *__pyx_pw_7aiohttp_8_helpers_5reify_7__reduce_cython__(PyObject *__pyx_v_self, CYTHON_UNUSED PyObject *unused); /*proto*/ +static PyObject *__pyx_pw_7aiohttp_8_helpers_5reify_7__reduce_cython__(PyObject *__pyx_v_self, CYTHON_UNUSED PyObject *unused) { + PyObject *__pyx_r = 0; + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("__reduce_cython__ (wrapper)", 0); + __pyx_r = __pyx_pf_7aiohttp_8_helpers_5reify_6__reduce_cython__(((struct __pyx_obj_7aiohttp_8_helpers_reify *)__pyx_v_self)); + + /* function exit code */ + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +static PyObject *__pyx_pf_7aiohttp_8_helpers_5reify_6__reduce_cython__(struct __pyx_obj_7aiohttp_8_helpers_reify *__pyx_v_self) { + PyObject *__pyx_v_state = 0; + PyObject *__pyx_v__dict = 0; + int __pyx_v_use_setstate; + PyObject *__pyx_r = NULL; + __Pyx_RefNannyDeclarations + PyObject *__pyx_t_1 = NULL; + int __pyx_t_2; + int __pyx_t_3; + PyObject *__pyx_t_4 = NULL; + int __pyx_t_5; + PyObject *__pyx_t_6 = NULL; + int __pyx_lineno = 0; + const char *__pyx_filename = NULL; + int __pyx_clineno = 0; + __Pyx_RefNannySetupContext("__reduce_cython__", 0); + + /* "(tree fragment)":5 + * cdef object _dict + * cdef bint use_setstate + * state = (self.name, self.wrapped) # <<<<<<<<<<<<<< + * _dict = getattr(self, '__dict__', None) + * if _dict is not None: + */ + __pyx_t_1 = PyTuple_New(2); if (unlikely(!__pyx_t_1)) __PYX_ERR(1, 5, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __Pyx_INCREF(__pyx_v_self->name); + __Pyx_GIVEREF(__pyx_v_self->name); + PyTuple_SET_ITEM(__pyx_t_1, 0, __pyx_v_self->name); + __Pyx_INCREF(__pyx_v_self->wrapped); + __Pyx_GIVEREF(__pyx_v_self->wrapped); + PyTuple_SET_ITEM(__pyx_t_1, 1, __pyx_v_self->wrapped); + __pyx_v_state = ((PyObject*)__pyx_t_1); + __pyx_t_1 = 0; + + /* "(tree fragment)":6 + * cdef bint use_setstate + * state = (self.name, self.wrapped) + * _dict = getattr(self, '__dict__', None) # <<<<<<<<<<<<<< + * if _dict is not None: + * state += (_dict,) + */ + __pyx_t_1 = __Pyx_GetAttr3(((PyObject *)__pyx_v_self), __pyx_n_s_dict, Py_None); if (unlikely(!__pyx_t_1)) __PYX_ERR(1, 6, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __pyx_v__dict = __pyx_t_1; + __pyx_t_1 = 0; + + /* "(tree fragment)":7 + * state = (self.name, self.wrapped) + * _dict = getattr(self, '__dict__', None) + * if _dict is not None: # <<<<<<<<<<<<<< + * state += (_dict,) + * use_setstate = True + */ + __pyx_t_2 = (__pyx_v__dict != Py_None); + __pyx_t_3 = (__pyx_t_2 != 0); + if (__pyx_t_3) { + + /* "(tree fragment)":8 + * _dict = getattr(self, '__dict__', None) + * if _dict is not None: + * state += (_dict,) # <<<<<<<<<<<<<< + * use_setstate = True + * else: + */ + __pyx_t_1 = PyTuple_New(1); if (unlikely(!__pyx_t_1)) __PYX_ERR(1, 8, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __Pyx_INCREF(__pyx_v__dict); + __Pyx_GIVEREF(__pyx_v__dict); + PyTuple_SET_ITEM(__pyx_t_1, 0, __pyx_v__dict); + __pyx_t_4 = PyNumber_InPlaceAdd(__pyx_v_state, __pyx_t_1); if (unlikely(!__pyx_t_4)) __PYX_ERR(1, 8, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_4); + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + __Pyx_DECREF_SET(__pyx_v_state, ((PyObject*)__pyx_t_4)); + __pyx_t_4 = 0; + + /* "(tree fragment)":9 + * if _dict is not None: + * state += (_dict,) + * use_setstate = True # <<<<<<<<<<<<<< + * else: + * use_setstate = self.name is not None or self.wrapped is not None + */ + __pyx_v_use_setstate = 1; + + /* "(tree fragment)":7 + * state = (self.name, self.wrapped) + * _dict = getattr(self, '__dict__', None) + * if _dict is not None: # <<<<<<<<<<<<<< + * state += (_dict,) + * use_setstate = True + */ + goto __pyx_L3; + } + + /* "(tree fragment)":11 + * use_setstate = True + * else: + * use_setstate = self.name is not None or self.wrapped is not None # <<<<<<<<<<<<<< + * if use_setstate: + * return __pyx_unpickle_reify, (type(self), 0x770cb8f, None), state + */ + /*else*/ { + __pyx_t_2 = (__pyx_v_self->name != Py_None); + __pyx_t_5 = (__pyx_t_2 != 0); + if (!__pyx_t_5) { + } else { + __pyx_t_3 = __pyx_t_5; + goto __pyx_L4_bool_binop_done; + } + __pyx_t_5 = (__pyx_v_self->wrapped != Py_None); + __pyx_t_2 = (__pyx_t_5 != 0); + __pyx_t_3 = __pyx_t_2; + __pyx_L4_bool_binop_done:; + __pyx_v_use_setstate = __pyx_t_3; + } + __pyx_L3:; + + /* "(tree fragment)":12 + * else: + * use_setstate = self.name is not None or self.wrapped is not None + * if use_setstate: # <<<<<<<<<<<<<< + * return __pyx_unpickle_reify, (type(self), 0x770cb8f, None), state + * else: + */ + __pyx_t_3 = (__pyx_v_use_setstate != 0); + if (__pyx_t_3) { + + /* "(tree fragment)":13 + * use_setstate = self.name is not None or self.wrapped is not None + * if use_setstate: + * return __pyx_unpickle_reify, (type(self), 0x770cb8f, None), state # <<<<<<<<<<<<<< + * else: + * return __pyx_unpickle_reify, (type(self), 0x770cb8f, state) + */ + __Pyx_XDECREF(__pyx_r); + __Pyx_GetModuleGlobalName(__pyx_t_4, __pyx_n_s_pyx_unpickle_reify); if (unlikely(!__pyx_t_4)) __PYX_ERR(1, 13, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_4); + __pyx_t_1 = PyTuple_New(3); if (unlikely(!__pyx_t_1)) __PYX_ERR(1, 13, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __Pyx_INCREF(((PyObject *)Py_TYPE(((PyObject *)__pyx_v_self)))); + __Pyx_GIVEREF(((PyObject *)Py_TYPE(((PyObject *)__pyx_v_self)))); + PyTuple_SET_ITEM(__pyx_t_1, 0, ((PyObject *)Py_TYPE(((PyObject *)__pyx_v_self)))); + __Pyx_INCREF(__pyx_int_124832655); + __Pyx_GIVEREF(__pyx_int_124832655); + PyTuple_SET_ITEM(__pyx_t_1, 1, __pyx_int_124832655); + __Pyx_INCREF(Py_None); + __Pyx_GIVEREF(Py_None); + PyTuple_SET_ITEM(__pyx_t_1, 2, Py_None); + __pyx_t_6 = PyTuple_New(3); if (unlikely(!__pyx_t_6)) __PYX_ERR(1, 13, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_6); + __Pyx_GIVEREF(__pyx_t_4); + PyTuple_SET_ITEM(__pyx_t_6, 0, __pyx_t_4); + __Pyx_GIVEREF(__pyx_t_1); + PyTuple_SET_ITEM(__pyx_t_6, 1, __pyx_t_1); + __Pyx_INCREF(__pyx_v_state); + __Pyx_GIVEREF(__pyx_v_state); + PyTuple_SET_ITEM(__pyx_t_6, 2, __pyx_v_state); + __pyx_t_4 = 0; + __pyx_t_1 = 0; + __pyx_r = __pyx_t_6; + __pyx_t_6 = 0; + goto __pyx_L0; + + /* "(tree fragment)":12 + * else: + * use_setstate = self.name is not None or self.wrapped is not None + * if use_setstate: # <<<<<<<<<<<<<< + * return __pyx_unpickle_reify, (type(self), 0x770cb8f, None), state + * else: + */ + } + + /* "(tree fragment)":15 + * return __pyx_unpickle_reify, (type(self), 0x770cb8f, None), state + * else: + * return __pyx_unpickle_reify, (type(self), 0x770cb8f, state) # <<<<<<<<<<<<<< + * def __setstate_cython__(self, __pyx_state): + * __pyx_unpickle_reify__set_state(self, __pyx_state) + */ + /*else*/ { + __Pyx_XDECREF(__pyx_r); + __Pyx_GetModuleGlobalName(__pyx_t_6, __pyx_n_s_pyx_unpickle_reify); if (unlikely(!__pyx_t_6)) __PYX_ERR(1, 15, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_6); + __pyx_t_1 = PyTuple_New(3); if (unlikely(!__pyx_t_1)) __PYX_ERR(1, 15, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __Pyx_INCREF(((PyObject *)Py_TYPE(((PyObject *)__pyx_v_self)))); + __Pyx_GIVEREF(((PyObject *)Py_TYPE(((PyObject *)__pyx_v_self)))); + PyTuple_SET_ITEM(__pyx_t_1, 0, ((PyObject *)Py_TYPE(((PyObject *)__pyx_v_self)))); + __Pyx_INCREF(__pyx_int_124832655); + __Pyx_GIVEREF(__pyx_int_124832655); + PyTuple_SET_ITEM(__pyx_t_1, 1, __pyx_int_124832655); + __Pyx_INCREF(__pyx_v_state); + __Pyx_GIVEREF(__pyx_v_state); + PyTuple_SET_ITEM(__pyx_t_1, 2, __pyx_v_state); + __pyx_t_4 = PyTuple_New(2); if (unlikely(!__pyx_t_4)) __PYX_ERR(1, 15, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_4); + __Pyx_GIVEREF(__pyx_t_6); + PyTuple_SET_ITEM(__pyx_t_4, 0, __pyx_t_6); + __Pyx_GIVEREF(__pyx_t_1); + PyTuple_SET_ITEM(__pyx_t_4, 1, __pyx_t_1); + __pyx_t_6 = 0; + __pyx_t_1 = 0; + __pyx_r = __pyx_t_4; + __pyx_t_4 = 0; + goto __pyx_L0; + } + + /* "(tree fragment)":1 + * def __reduce_cython__(self): # <<<<<<<<<<<<<< + * cdef tuple state + * cdef object _dict + */ + + /* function exit code */ + __pyx_L1_error:; + __Pyx_XDECREF(__pyx_t_1); + __Pyx_XDECREF(__pyx_t_4); + __Pyx_XDECREF(__pyx_t_6); + __Pyx_AddTraceback("aiohttp._helpers.reify.__reduce_cython__", __pyx_clineno, __pyx_lineno, __pyx_filename); + __pyx_r = NULL; + __pyx_L0:; + __Pyx_XDECREF(__pyx_v_state); + __Pyx_XDECREF(__pyx_v__dict); + __Pyx_XGIVEREF(__pyx_r); + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +/* "(tree fragment)":16 + * else: + * return __pyx_unpickle_reify, (type(self), 0x770cb8f, state) + * def __setstate_cython__(self, __pyx_state): # <<<<<<<<<<<<<< + * __pyx_unpickle_reify__set_state(self, __pyx_state) + */ + +/* Python wrapper */ +static PyObject *__pyx_pw_7aiohttp_8_helpers_5reify_9__setstate_cython__(PyObject *__pyx_v_self, PyObject *__pyx_v___pyx_state); /*proto*/ +static PyObject *__pyx_pw_7aiohttp_8_helpers_5reify_9__setstate_cython__(PyObject *__pyx_v_self, PyObject *__pyx_v___pyx_state) { + PyObject *__pyx_r = 0; + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("__setstate_cython__ (wrapper)", 0); + __pyx_r = __pyx_pf_7aiohttp_8_helpers_5reify_8__setstate_cython__(((struct __pyx_obj_7aiohttp_8_helpers_reify *)__pyx_v_self), ((PyObject *)__pyx_v___pyx_state)); + + /* function exit code */ + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +static PyObject *__pyx_pf_7aiohttp_8_helpers_5reify_8__setstate_cython__(struct __pyx_obj_7aiohttp_8_helpers_reify *__pyx_v_self, PyObject *__pyx_v___pyx_state) { + PyObject *__pyx_r = NULL; + __Pyx_RefNannyDeclarations + PyObject *__pyx_t_1 = NULL; + int __pyx_lineno = 0; + const char *__pyx_filename = NULL; + int __pyx_clineno = 0; + __Pyx_RefNannySetupContext("__setstate_cython__", 0); + + /* "(tree fragment)":17 + * return __pyx_unpickle_reify, (type(self), 0x770cb8f, state) + * def __setstate_cython__(self, __pyx_state): + * __pyx_unpickle_reify__set_state(self, __pyx_state) # <<<<<<<<<<<<<< + */ + if (!(likely(PyTuple_CheckExact(__pyx_v___pyx_state))||((__pyx_v___pyx_state) == Py_None)||(PyErr_Format(PyExc_TypeError, "Expected %.16s, got %.200s", "tuple", Py_TYPE(__pyx_v___pyx_state)->tp_name), 0))) __PYX_ERR(1, 17, __pyx_L1_error) + __pyx_t_1 = __pyx_f_7aiohttp_8_helpers___pyx_unpickle_reify__set_state(__pyx_v_self, ((PyObject*)__pyx_v___pyx_state)); if (unlikely(!__pyx_t_1)) __PYX_ERR(1, 17, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + + /* "(tree fragment)":16 + * else: + * return __pyx_unpickle_reify, (type(self), 0x770cb8f, state) + * def __setstate_cython__(self, __pyx_state): # <<<<<<<<<<<<<< + * __pyx_unpickle_reify__set_state(self, __pyx_state) + */ + + /* function exit code */ + __pyx_r = Py_None; __Pyx_INCREF(Py_None); + goto __pyx_L0; + __pyx_L1_error:; + __Pyx_XDECREF(__pyx_t_1); + __Pyx_AddTraceback("aiohttp._helpers.reify.__setstate_cython__", __pyx_clineno, __pyx_lineno, __pyx_filename); + __pyx_r = NULL; + __pyx_L0:; + __Pyx_XGIVEREF(__pyx_r); + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +/* "(tree fragment)":1 + * def __pyx_unpickle_reify(__pyx_type, long __pyx_checksum, __pyx_state): # <<<<<<<<<<<<<< + * cdef object __pyx_PickleError + * cdef object __pyx_result + */ + +/* Python wrapper */ +static PyObject *__pyx_pw_7aiohttp_8_helpers_1__pyx_unpickle_reify(PyObject *__pyx_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/ +static PyMethodDef __pyx_mdef_7aiohttp_8_helpers_1__pyx_unpickle_reify = {"__pyx_unpickle_reify", (PyCFunction)(void*)(PyCFunctionWithKeywords)__pyx_pw_7aiohttp_8_helpers_1__pyx_unpickle_reify, METH_VARARGS|METH_KEYWORDS, 0}; +static PyObject *__pyx_pw_7aiohttp_8_helpers_1__pyx_unpickle_reify(PyObject *__pyx_self, PyObject *__pyx_args, PyObject *__pyx_kwds) { + PyObject *__pyx_v___pyx_type = 0; + long __pyx_v___pyx_checksum; + PyObject *__pyx_v___pyx_state = 0; + int __pyx_lineno = 0; + const char *__pyx_filename = NULL; + int __pyx_clineno = 0; + PyObject *__pyx_r = 0; + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("__pyx_unpickle_reify (wrapper)", 0); + { + static PyObject **__pyx_pyargnames[] = {&__pyx_n_s_pyx_type,&__pyx_n_s_pyx_checksum,&__pyx_n_s_pyx_state,0}; + PyObject* values[3] = {0,0,0}; + if (unlikely(__pyx_kwds)) { + Py_ssize_t kw_args; + const Py_ssize_t pos_args = PyTuple_GET_SIZE(__pyx_args); + switch (pos_args) { + case 3: values[2] = PyTuple_GET_ITEM(__pyx_args, 2); + CYTHON_FALLTHROUGH; + case 2: values[1] = PyTuple_GET_ITEM(__pyx_args, 1); + CYTHON_FALLTHROUGH; + case 1: values[0] = PyTuple_GET_ITEM(__pyx_args, 0); + CYTHON_FALLTHROUGH; + case 0: break; + default: goto __pyx_L5_argtuple_error; + } + kw_args = PyDict_Size(__pyx_kwds); + switch (pos_args) { + case 0: + if (likely((values[0] = __Pyx_PyDict_GetItemStr(__pyx_kwds, __pyx_n_s_pyx_type)) != 0)) kw_args--; + else goto __pyx_L5_argtuple_error; + CYTHON_FALLTHROUGH; + case 1: + if (likely((values[1] = __Pyx_PyDict_GetItemStr(__pyx_kwds, __pyx_n_s_pyx_checksum)) != 0)) kw_args--; + else { + __Pyx_RaiseArgtupleInvalid("__pyx_unpickle_reify", 1, 3, 3, 1); __PYX_ERR(1, 1, __pyx_L3_error) + } + CYTHON_FALLTHROUGH; + case 2: + if (likely((values[2] = __Pyx_PyDict_GetItemStr(__pyx_kwds, __pyx_n_s_pyx_state)) != 0)) kw_args--; + else { + __Pyx_RaiseArgtupleInvalid("__pyx_unpickle_reify", 1, 3, 3, 2); __PYX_ERR(1, 1, __pyx_L3_error) + } + } + if (unlikely(kw_args > 0)) { + if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, pos_args, "__pyx_unpickle_reify") < 0)) __PYX_ERR(1, 1, __pyx_L3_error) + } + } else if (PyTuple_GET_SIZE(__pyx_args) != 3) { + goto __pyx_L5_argtuple_error; + } else { + values[0] = PyTuple_GET_ITEM(__pyx_args, 0); + values[1] = PyTuple_GET_ITEM(__pyx_args, 1); + values[2] = PyTuple_GET_ITEM(__pyx_args, 2); + } + __pyx_v___pyx_type = values[0]; + __pyx_v___pyx_checksum = __Pyx_PyInt_As_long(values[1]); if (unlikely((__pyx_v___pyx_checksum == (long)-1) && PyErr_Occurred())) __PYX_ERR(1, 1, __pyx_L3_error) + __pyx_v___pyx_state = values[2]; + } + goto __pyx_L4_argument_unpacking_done; + __pyx_L5_argtuple_error:; + __Pyx_RaiseArgtupleInvalid("__pyx_unpickle_reify", 1, 3, 3, PyTuple_GET_SIZE(__pyx_args)); __PYX_ERR(1, 1, __pyx_L3_error) + __pyx_L3_error:; + __Pyx_AddTraceback("aiohttp._helpers.__pyx_unpickle_reify", __pyx_clineno, __pyx_lineno, __pyx_filename); + __Pyx_RefNannyFinishContext(); + return NULL; + __pyx_L4_argument_unpacking_done:; + __pyx_r = __pyx_pf_7aiohttp_8_helpers___pyx_unpickle_reify(__pyx_self, __pyx_v___pyx_type, __pyx_v___pyx_checksum, __pyx_v___pyx_state); + + /* function exit code */ + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +static PyObject *__pyx_pf_7aiohttp_8_helpers___pyx_unpickle_reify(CYTHON_UNUSED PyObject *__pyx_self, PyObject *__pyx_v___pyx_type, long __pyx_v___pyx_checksum, PyObject *__pyx_v___pyx_state) { + PyObject *__pyx_v___pyx_PickleError = 0; + PyObject *__pyx_v___pyx_result = 0; + PyObject *__pyx_r = NULL; + __Pyx_RefNannyDeclarations + int __pyx_t_1; + PyObject *__pyx_t_2 = NULL; + PyObject *__pyx_t_3 = NULL; + PyObject *__pyx_t_4 = NULL; + PyObject *__pyx_t_5 = NULL; + int __pyx_t_6; + int __pyx_lineno = 0; + const char *__pyx_filename = NULL; + int __pyx_clineno = 0; + __Pyx_RefNannySetupContext("__pyx_unpickle_reify", 0); + + /* "(tree fragment)":4 + * cdef object __pyx_PickleError + * cdef object __pyx_result + * if __pyx_checksum != 0x770cb8f: # <<<<<<<<<<<<<< + * from pickle import PickleError as __pyx_PickleError + * raise __pyx_PickleError("Incompatible checksums (%s vs 0x770cb8f = (name, wrapped))" % __pyx_checksum) + */ + __pyx_t_1 = ((__pyx_v___pyx_checksum != 0x770cb8f) != 0); + if (__pyx_t_1) { + + /* "(tree fragment)":5 + * cdef object __pyx_result + * if __pyx_checksum != 0x770cb8f: + * from pickle import PickleError as __pyx_PickleError # <<<<<<<<<<<<<< + * raise __pyx_PickleError("Incompatible checksums (%s vs 0x770cb8f = (name, wrapped))" % __pyx_checksum) + * __pyx_result = reify.__new__(__pyx_type) + */ + __pyx_t_2 = PyList_New(1); if (unlikely(!__pyx_t_2)) __PYX_ERR(1, 5, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_2); + __Pyx_INCREF(__pyx_n_s_PickleError); + __Pyx_GIVEREF(__pyx_n_s_PickleError); + PyList_SET_ITEM(__pyx_t_2, 0, __pyx_n_s_PickleError); + __pyx_t_3 = __Pyx_Import(__pyx_n_s_pickle, __pyx_t_2, 0); if (unlikely(!__pyx_t_3)) __PYX_ERR(1, 5, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_3); + __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; + __pyx_t_2 = __Pyx_ImportFrom(__pyx_t_3, __pyx_n_s_PickleError); if (unlikely(!__pyx_t_2)) __PYX_ERR(1, 5, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_2); + __Pyx_INCREF(__pyx_t_2); + __pyx_v___pyx_PickleError = __pyx_t_2; + __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; + __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; + + /* "(tree fragment)":6 + * if __pyx_checksum != 0x770cb8f: + * from pickle import PickleError as __pyx_PickleError + * raise __pyx_PickleError("Incompatible checksums (%s vs 0x770cb8f = (name, wrapped))" % __pyx_checksum) # <<<<<<<<<<<<<< + * __pyx_result = reify.__new__(__pyx_type) + * if __pyx_state is not None: + */ + __pyx_t_2 = __Pyx_PyInt_From_long(__pyx_v___pyx_checksum); if (unlikely(!__pyx_t_2)) __PYX_ERR(1, 6, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_2); + __pyx_t_4 = __Pyx_PyString_Format(__pyx_kp_s_Incompatible_checksums_s_vs_0x77, __pyx_t_2); if (unlikely(!__pyx_t_4)) __PYX_ERR(1, 6, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_4); + __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; + __Pyx_INCREF(__pyx_v___pyx_PickleError); + __pyx_t_2 = __pyx_v___pyx_PickleError; __pyx_t_5 = NULL; + if (CYTHON_UNPACK_METHODS && unlikely(PyMethod_Check(__pyx_t_2))) { + __pyx_t_5 = PyMethod_GET_SELF(__pyx_t_2); + if (likely(__pyx_t_5)) { + PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_2); + __Pyx_INCREF(__pyx_t_5); + __Pyx_INCREF(function); + __Pyx_DECREF_SET(__pyx_t_2, function); + } + } + __pyx_t_3 = (__pyx_t_5) ? __Pyx_PyObject_Call2Args(__pyx_t_2, __pyx_t_5, __pyx_t_4) : __Pyx_PyObject_CallOneArg(__pyx_t_2, __pyx_t_4); + __Pyx_XDECREF(__pyx_t_5); __pyx_t_5 = 0; + __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; + if (unlikely(!__pyx_t_3)) __PYX_ERR(1, 6, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_3); + __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; + __Pyx_Raise(__pyx_t_3, 0, 0, 0); + __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; + __PYX_ERR(1, 6, __pyx_L1_error) + + /* "(tree fragment)":4 + * cdef object __pyx_PickleError + * cdef object __pyx_result + * if __pyx_checksum != 0x770cb8f: # <<<<<<<<<<<<<< + * from pickle import PickleError as __pyx_PickleError + * raise __pyx_PickleError("Incompatible checksums (%s vs 0x770cb8f = (name, wrapped))" % __pyx_checksum) + */ + } + + /* "(tree fragment)":7 + * from pickle import PickleError as __pyx_PickleError + * raise __pyx_PickleError("Incompatible checksums (%s vs 0x770cb8f = (name, wrapped))" % __pyx_checksum) + * __pyx_result = reify.__new__(__pyx_type) # <<<<<<<<<<<<<< + * if __pyx_state is not None: + * __pyx_unpickle_reify__set_state( __pyx_result, __pyx_state) + */ + __pyx_t_2 = __Pyx_PyObject_GetAttrStr(((PyObject *)__pyx_ptype_7aiohttp_8_helpers_reify), __pyx_n_s_new); if (unlikely(!__pyx_t_2)) __PYX_ERR(1, 7, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_2); + __pyx_t_4 = NULL; + if (CYTHON_UNPACK_METHODS && likely(PyMethod_Check(__pyx_t_2))) { + __pyx_t_4 = PyMethod_GET_SELF(__pyx_t_2); + if (likely(__pyx_t_4)) { + PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_2); + __Pyx_INCREF(__pyx_t_4); + __Pyx_INCREF(function); + __Pyx_DECREF_SET(__pyx_t_2, function); + } + } + __pyx_t_3 = (__pyx_t_4) ? __Pyx_PyObject_Call2Args(__pyx_t_2, __pyx_t_4, __pyx_v___pyx_type) : __Pyx_PyObject_CallOneArg(__pyx_t_2, __pyx_v___pyx_type); + __Pyx_XDECREF(__pyx_t_4); __pyx_t_4 = 0; + if (unlikely(!__pyx_t_3)) __PYX_ERR(1, 7, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_3); + __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; + __pyx_v___pyx_result = __pyx_t_3; + __pyx_t_3 = 0; + + /* "(tree fragment)":8 + * raise __pyx_PickleError("Incompatible checksums (%s vs 0x770cb8f = (name, wrapped))" % __pyx_checksum) + * __pyx_result = reify.__new__(__pyx_type) + * if __pyx_state is not None: # <<<<<<<<<<<<<< + * __pyx_unpickle_reify__set_state( __pyx_result, __pyx_state) + * return __pyx_result + */ + __pyx_t_1 = (__pyx_v___pyx_state != Py_None); + __pyx_t_6 = (__pyx_t_1 != 0); + if (__pyx_t_6) { + + /* "(tree fragment)":9 + * __pyx_result = reify.__new__(__pyx_type) + * if __pyx_state is not None: + * __pyx_unpickle_reify__set_state( __pyx_result, __pyx_state) # <<<<<<<<<<<<<< + * return __pyx_result + * cdef __pyx_unpickle_reify__set_state(reify __pyx_result, tuple __pyx_state): + */ + if (!(likely(PyTuple_CheckExact(__pyx_v___pyx_state))||((__pyx_v___pyx_state) == Py_None)||(PyErr_Format(PyExc_TypeError, "Expected %.16s, got %.200s", "tuple", Py_TYPE(__pyx_v___pyx_state)->tp_name), 0))) __PYX_ERR(1, 9, __pyx_L1_error) + __pyx_t_3 = __pyx_f_7aiohttp_8_helpers___pyx_unpickle_reify__set_state(((struct __pyx_obj_7aiohttp_8_helpers_reify *)__pyx_v___pyx_result), ((PyObject*)__pyx_v___pyx_state)); if (unlikely(!__pyx_t_3)) __PYX_ERR(1, 9, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_3); + __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; + + /* "(tree fragment)":8 + * raise __pyx_PickleError("Incompatible checksums (%s vs 0x770cb8f = (name, wrapped))" % __pyx_checksum) + * __pyx_result = reify.__new__(__pyx_type) + * if __pyx_state is not None: # <<<<<<<<<<<<<< + * __pyx_unpickle_reify__set_state( __pyx_result, __pyx_state) + * return __pyx_result + */ + } + + /* "(tree fragment)":10 + * if __pyx_state is not None: + * __pyx_unpickle_reify__set_state( __pyx_result, __pyx_state) + * return __pyx_result # <<<<<<<<<<<<<< + * cdef __pyx_unpickle_reify__set_state(reify __pyx_result, tuple __pyx_state): + * __pyx_result.name = __pyx_state[0]; __pyx_result.wrapped = __pyx_state[1] + */ + __Pyx_XDECREF(__pyx_r); + __Pyx_INCREF(__pyx_v___pyx_result); + __pyx_r = __pyx_v___pyx_result; + goto __pyx_L0; + + /* "(tree fragment)":1 + * def __pyx_unpickle_reify(__pyx_type, long __pyx_checksum, __pyx_state): # <<<<<<<<<<<<<< + * cdef object __pyx_PickleError + * cdef object __pyx_result + */ + + /* function exit code */ + __pyx_L1_error:; + __Pyx_XDECREF(__pyx_t_2); + __Pyx_XDECREF(__pyx_t_3); + __Pyx_XDECREF(__pyx_t_4); + __Pyx_XDECREF(__pyx_t_5); + __Pyx_AddTraceback("aiohttp._helpers.__pyx_unpickle_reify", __pyx_clineno, __pyx_lineno, __pyx_filename); + __pyx_r = NULL; + __pyx_L0:; + __Pyx_XDECREF(__pyx_v___pyx_PickleError); + __Pyx_XDECREF(__pyx_v___pyx_result); + __Pyx_XGIVEREF(__pyx_r); + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +/* "(tree fragment)":11 + * __pyx_unpickle_reify__set_state( __pyx_result, __pyx_state) + * return __pyx_result + * cdef __pyx_unpickle_reify__set_state(reify __pyx_result, tuple __pyx_state): # <<<<<<<<<<<<<< + * __pyx_result.name = __pyx_state[0]; __pyx_result.wrapped = __pyx_state[1] + * if len(__pyx_state) > 2 and hasattr(__pyx_result, '__dict__'): + */ + +static PyObject *__pyx_f_7aiohttp_8_helpers___pyx_unpickle_reify__set_state(struct __pyx_obj_7aiohttp_8_helpers_reify *__pyx_v___pyx_result, PyObject *__pyx_v___pyx_state) { + PyObject *__pyx_r = NULL; + __Pyx_RefNannyDeclarations + PyObject *__pyx_t_1 = NULL; + int __pyx_t_2; + Py_ssize_t __pyx_t_3; + int __pyx_t_4; + int __pyx_t_5; + PyObject *__pyx_t_6 = NULL; + PyObject *__pyx_t_7 = NULL; + PyObject *__pyx_t_8 = NULL; + int __pyx_lineno = 0; + const char *__pyx_filename = NULL; + int __pyx_clineno = 0; + __Pyx_RefNannySetupContext("__pyx_unpickle_reify__set_state", 0); + + /* "(tree fragment)":12 + * return __pyx_result + * cdef __pyx_unpickle_reify__set_state(reify __pyx_result, tuple __pyx_state): + * __pyx_result.name = __pyx_state[0]; __pyx_result.wrapped = __pyx_state[1] # <<<<<<<<<<<<<< + * if len(__pyx_state) > 2 and hasattr(__pyx_result, '__dict__'): + * __pyx_result.__dict__.update(__pyx_state[2]) + */ + if (unlikely(__pyx_v___pyx_state == Py_None)) { + PyErr_SetString(PyExc_TypeError, "'NoneType' object is not subscriptable"); + __PYX_ERR(1, 12, __pyx_L1_error) + } + __pyx_t_1 = __Pyx_GetItemInt_Tuple(__pyx_v___pyx_state, 0, long, 1, __Pyx_PyInt_From_long, 0, 0, 1); if (unlikely(!__pyx_t_1)) __PYX_ERR(1, 12, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __Pyx_GIVEREF(__pyx_t_1); + __Pyx_GOTREF(__pyx_v___pyx_result->name); + __Pyx_DECREF(__pyx_v___pyx_result->name); + __pyx_v___pyx_result->name = __pyx_t_1; + __pyx_t_1 = 0; + if (unlikely(__pyx_v___pyx_state == Py_None)) { + PyErr_SetString(PyExc_TypeError, "'NoneType' object is not subscriptable"); + __PYX_ERR(1, 12, __pyx_L1_error) + } + __pyx_t_1 = __Pyx_GetItemInt_Tuple(__pyx_v___pyx_state, 1, long, 1, __Pyx_PyInt_From_long, 0, 0, 1); if (unlikely(!__pyx_t_1)) __PYX_ERR(1, 12, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __Pyx_GIVEREF(__pyx_t_1); + __Pyx_GOTREF(__pyx_v___pyx_result->wrapped); + __Pyx_DECREF(__pyx_v___pyx_result->wrapped); + __pyx_v___pyx_result->wrapped = __pyx_t_1; + __pyx_t_1 = 0; + + /* "(tree fragment)":13 + * cdef __pyx_unpickle_reify__set_state(reify __pyx_result, tuple __pyx_state): + * __pyx_result.name = __pyx_state[0]; __pyx_result.wrapped = __pyx_state[1] + * if len(__pyx_state) > 2 and hasattr(__pyx_result, '__dict__'): # <<<<<<<<<<<<<< + * __pyx_result.__dict__.update(__pyx_state[2]) + */ + if (unlikely(__pyx_v___pyx_state == Py_None)) { + PyErr_SetString(PyExc_TypeError, "object of type 'NoneType' has no len()"); + __PYX_ERR(1, 13, __pyx_L1_error) + } + __pyx_t_3 = PyTuple_GET_SIZE(__pyx_v___pyx_state); if (unlikely(__pyx_t_3 == ((Py_ssize_t)-1))) __PYX_ERR(1, 13, __pyx_L1_error) + __pyx_t_4 = ((__pyx_t_3 > 2) != 0); + if (__pyx_t_4) { + } else { + __pyx_t_2 = __pyx_t_4; + goto __pyx_L4_bool_binop_done; + } + __pyx_t_4 = __Pyx_HasAttr(((PyObject *)__pyx_v___pyx_result), __pyx_n_s_dict); if (unlikely(__pyx_t_4 == ((int)-1))) __PYX_ERR(1, 13, __pyx_L1_error) + __pyx_t_5 = (__pyx_t_4 != 0); + __pyx_t_2 = __pyx_t_5; + __pyx_L4_bool_binop_done:; + if (__pyx_t_2) { + + /* "(tree fragment)":14 + * __pyx_result.name = __pyx_state[0]; __pyx_result.wrapped = __pyx_state[1] + * if len(__pyx_state) > 2 and hasattr(__pyx_result, '__dict__'): + * __pyx_result.__dict__.update(__pyx_state[2]) # <<<<<<<<<<<<<< + */ + __pyx_t_6 = __Pyx_PyObject_GetAttrStr(((PyObject *)__pyx_v___pyx_result), __pyx_n_s_dict); if (unlikely(!__pyx_t_6)) __PYX_ERR(1, 14, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_6); + __pyx_t_7 = __Pyx_PyObject_GetAttrStr(__pyx_t_6, __pyx_n_s_update); if (unlikely(!__pyx_t_7)) __PYX_ERR(1, 14, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_7); + __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0; + if (unlikely(__pyx_v___pyx_state == Py_None)) { + PyErr_SetString(PyExc_TypeError, "'NoneType' object is not subscriptable"); + __PYX_ERR(1, 14, __pyx_L1_error) + } + __pyx_t_6 = __Pyx_GetItemInt_Tuple(__pyx_v___pyx_state, 2, long, 1, __Pyx_PyInt_From_long, 0, 0, 1); if (unlikely(!__pyx_t_6)) __PYX_ERR(1, 14, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_6); + __pyx_t_8 = NULL; + if (CYTHON_UNPACK_METHODS && likely(PyMethod_Check(__pyx_t_7))) { + __pyx_t_8 = PyMethod_GET_SELF(__pyx_t_7); + if (likely(__pyx_t_8)) { + PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_7); + __Pyx_INCREF(__pyx_t_8); + __Pyx_INCREF(function); + __Pyx_DECREF_SET(__pyx_t_7, function); + } + } + __pyx_t_1 = (__pyx_t_8) ? __Pyx_PyObject_Call2Args(__pyx_t_7, __pyx_t_8, __pyx_t_6) : __Pyx_PyObject_CallOneArg(__pyx_t_7, __pyx_t_6); + __Pyx_XDECREF(__pyx_t_8); __pyx_t_8 = 0; + __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0; + if (unlikely(!__pyx_t_1)) __PYX_ERR(1, 14, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0; + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + + /* "(tree fragment)":13 + * cdef __pyx_unpickle_reify__set_state(reify __pyx_result, tuple __pyx_state): + * __pyx_result.name = __pyx_state[0]; __pyx_result.wrapped = __pyx_state[1] + * if len(__pyx_state) > 2 and hasattr(__pyx_result, '__dict__'): # <<<<<<<<<<<<<< + * __pyx_result.__dict__.update(__pyx_state[2]) + */ + } + + /* "(tree fragment)":11 + * __pyx_unpickle_reify__set_state( __pyx_result, __pyx_state) + * return __pyx_result + * cdef __pyx_unpickle_reify__set_state(reify __pyx_result, tuple __pyx_state): # <<<<<<<<<<<<<< + * __pyx_result.name = __pyx_state[0]; __pyx_result.wrapped = __pyx_state[1] + * if len(__pyx_state) > 2 and hasattr(__pyx_result, '__dict__'): + */ + + /* function exit code */ + __pyx_r = Py_None; __Pyx_INCREF(Py_None); + goto __pyx_L0; + __pyx_L1_error:; + __Pyx_XDECREF(__pyx_t_1); + __Pyx_XDECREF(__pyx_t_6); + __Pyx_XDECREF(__pyx_t_7); + __Pyx_XDECREF(__pyx_t_8); + __Pyx_AddTraceback("aiohttp._helpers.__pyx_unpickle_reify__set_state", __pyx_clineno, __pyx_lineno, __pyx_filename); + __pyx_r = 0; + __pyx_L0:; + __Pyx_XGIVEREF(__pyx_r); + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +static PyObject *__pyx_tp_new_7aiohttp_8_helpers_reify(PyTypeObject *t, CYTHON_UNUSED PyObject *a, CYTHON_UNUSED PyObject *k) { + struct __pyx_obj_7aiohttp_8_helpers_reify *p; + PyObject *o; + if (likely((t->tp_flags & Py_TPFLAGS_IS_ABSTRACT) == 0)) { + o = (*t->tp_alloc)(t, 0); + } else { + o = (PyObject *) PyBaseObject_Type.tp_new(t, __pyx_empty_tuple, 0); + } + if (unlikely(!o)) return 0; + p = ((struct __pyx_obj_7aiohttp_8_helpers_reify *)o); + p->wrapped = Py_None; Py_INCREF(Py_None); + p->name = Py_None; Py_INCREF(Py_None); + return o; +} + +static void __pyx_tp_dealloc_7aiohttp_8_helpers_reify(PyObject *o) { + struct __pyx_obj_7aiohttp_8_helpers_reify *p = (struct __pyx_obj_7aiohttp_8_helpers_reify *)o; + #if CYTHON_USE_TP_FINALIZE + if (unlikely(PyType_HasFeature(Py_TYPE(o), Py_TPFLAGS_HAVE_FINALIZE) && Py_TYPE(o)->tp_finalize) && !_PyGC_FINALIZED(o)) { + if (PyObject_CallFinalizerFromDealloc(o)) return; + } + #endif + PyObject_GC_UnTrack(o); + Py_CLEAR(p->wrapped); + Py_CLEAR(p->name); + (*Py_TYPE(o)->tp_free)(o); +} + +static int __pyx_tp_traverse_7aiohttp_8_helpers_reify(PyObject *o, visitproc v, void *a) { + int e; + struct __pyx_obj_7aiohttp_8_helpers_reify *p = (struct __pyx_obj_7aiohttp_8_helpers_reify *)o; + if (p->wrapped) { + e = (*v)(p->wrapped, a); if (e) return e; + } + if (p->name) { + e = (*v)(p->name, a); if (e) return e; + } + return 0; +} + +static int __pyx_tp_clear_7aiohttp_8_helpers_reify(PyObject *o) { + PyObject* tmp; + struct __pyx_obj_7aiohttp_8_helpers_reify *p = (struct __pyx_obj_7aiohttp_8_helpers_reify *)o; + tmp = ((PyObject*)p->wrapped); + p->wrapped = Py_None; Py_INCREF(Py_None); + Py_XDECREF(tmp); + tmp = ((PyObject*)p->name); + p->name = Py_None; Py_INCREF(Py_None); + Py_XDECREF(tmp); + return 0; +} + +static PyObject *__pyx_tp_descr_get_7aiohttp_8_helpers_reify(PyObject *o, PyObject *i, PyObject *c) { + PyObject *r = 0; + if (!i) i = Py_None; + if (!c) c = Py_None; + r = __pyx_pw_7aiohttp_8_helpers_5reify_3__get__(o, i, c); + return r; +} + +static int __pyx_tp_descr_set_7aiohttp_8_helpers_reify(PyObject *o, PyObject *i, PyObject *v) { + if (v) { + return __pyx_pw_7aiohttp_8_helpers_5reify_5__set__(o, i, v); + } + else { + PyErr_SetString(PyExc_NotImplementedError, "__delete__"); + return -1; + } +} + +static PyObject *__pyx_getprop_7aiohttp_8_helpers_5reify___doc__(PyObject *o, CYTHON_UNUSED void *x) { + return __pyx_pw_7aiohttp_8_helpers_5reify_7__doc___1__get__(o); +} + +static PyMethodDef __pyx_methods_7aiohttp_8_helpers_reify[] = { + {"__reduce_cython__", (PyCFunction)__pyx_pw_7aiohttp_8_helpers_5reify_7__reduce_cython__, METH_NOARGS, 0}, + {"__setstate_cython__", (PyCFunction)__pyx_pw_7aiohttp_8_helpers_5reify_9__setstate_cython__, METH_O, 0}, + {0, 0, 0, 0} +}; + +static struct PyGetSetDef __pyx_getsets_7aiohttp_8_helpers_reify[] = { + {(char *)"__doc__", __pyx_getprop_7aiohttp_8_helpers_5reify___doc__, 0, (char *)0, 0}, + {0, 0, 0, 0, 0} +}; + +static PyTypeObject __pyx_type_7aiohttp_8_helpers_reify = { + PyVarObject_HEAD_INIT(0, 0) + "aiohttp._helpers.reify", /*tp_name*/ + sizeof(struct __pyx_obj_7aiohttp_8_helpers_reify), /*tp_basicsize*/ + 0, /*tp_itemsize*/ + __pyx_tp_dealloc_7aiohttp_8_helpers_reify, /*tp_dealloc*/ + #if PY_VERSION_HEX < 0x030800b4 + 0, /*tp_print*/ + #endif + #if PY_VERSION_HEX >= 0x030800b4 + 0, /*tp_vectorcall_offset*/ + #endif + 0, /*tp_getattr*/ + 0, /*tp_setattr*/ + #if PY_MAJOR_VERSION < 3 + 0, /*tp_compare*/ + #endif + #if PY_MAJOR_VERSION >= 3 + 0, /*tp_as_async*/ + #endif + 0, /*tp_repr*/ + 0, /*tp_as_number*/ + 0, /*tp_as_sequence*/ + 0, /*tp_as_mapping*/ + 0, /*tp_hash*/ + 0, /*tp_call*/ + 0, /*tp_str*/ + 0, /*tp_getattro*/ + 0, /*tp_setattro*/ + 0, /*tp_as_buffer*/ + Py_TPFLAGS_DEFAULT|Py_TPFLAGS_HAVE_VERSION_TAG|Py_TPFLAGS_CHECKTYPES|Py_TPFLAGS_HAVE_NEWBUFFER|Py_TPFLAGS_BASETYPE|Py_TPFLAGS_HAVE_GC, /*tp_flags*/ + "Use as a class method decorator. It operates almost exactly like\n the Python `@property` decorator, but it puts the result of the\n method it decorates into the instance dict after the first call,\n effectively replacing the function it decorates with an instance\n variable. It is, in Python parlance, a data descriptor.\n\n ", /*tp_doc*/ + __pyx_tp_traverse_7aiohttp_8_helpers_reify, /*tp_traverse*/ + __pyx_tp_clear_7aiohttp_8_helpers_reify, /*tp_clear*/ + 0, /*tp_richcompare*/ + 0, /*tp_weaklistoffset*/ + 0, /*tp_iter*/ + 0, /*tp_iternext*/ + __pyx_methods_7aiohttp_8_helpers_reify, /*tp_methods*/ + 0, /*tp_members*/ + __pyx_getsets_7aiohttp_8_helpers_reify, /*tp_getset*/ + 0, /*tp_base*/ + 0, /*tp_dict*/ + __pyx_tp_descr_get_7aiohttp_8_helpers_reify, /*tp_descr_get*/ + __pyx_tp_descr_set_7aiohttp_8_helpers_reify, /*tp_descr_set*/ + 0, /*tp_dictoffset*/ + __pyx_pw_7aiohttp_8_helpers_5reify_1__init__, /*tp_init*/ + 0, /*tp_alloc*/ + __pyx_tp_new_7aiohttp_8_helpers_reify, /*tp_new*/ + 0, /*tp_free*/ + 0, /*tp_is_gc*/ + 0, /*tp_bases*/ + 0, /*tp_mro*/ + 0, /*tp_cache*/ + 0, /*tp_subclasses*/ + 0, /*tp_weaklist*/ + 0, /*tp_del*/ + 0, /*tp_version_tag*/ + #if PY_VERSION_HEX >= 0x030400a1 + 0, /*tp_finalize*/ + #endif + #if PY_VERSION_HEX >= 0x030800b1 + 0, /*tp_vectorcall*/ + #endif + #if PY_VERSION_HEX >= 0x030800b4 && PY_VERSION_HEX < 0x03090000 + 0, /*tp_print*/ + #endif +}; + +static PyMethodDef __pyx_methods[] = { + {0, 0, 0, 0} +}; + +#if PY_MAJOR_VERSION >= 3 +#if CYTHON_PEP489_MULTI_PHASE_INIT +static PyObject* __pyx_pymod_create(PyObject *spec, PyModuleDef *def); /*proto*/ +static int __pyx_pymod_exec__helpers(PyObject* module); /*proto*/ +static PyModuleDef_Slot __pyx_moduledef_slots[] = { + {Py_mod_create, (void*)__pyx_pymod_create}, + {Py_mod_exec, (void*)__pyx_pymod_exec__helpers}, + {0, NULL} +}; +#endif + +static struct PyModuleDef __pyx_moduledef = { + PyModuleDef_HEAD_INIT, + "_helpers", + 0, /* m_doc */ + #if CYTHON_PEP489_MULTI_PHASE_INIT + 0, /* m_size */ + #else + -1, /* m_size */ + #endif + __pyx_methods /* m_methods */, + #if CYTHON_PEP489_MULTI_PHASE_INIT + __pyx_moduledef_slots, /* m_slots */ + #else + NULL, /* m_reload */ + #endif + NULL, /* m_traverse */ + NULL, /* m_clear */ + NULL /* m_free */ +}; +#endif +#ifndef CYTHON_SMALL_CODE +#if defined(__clang__) + #define CYTHON_SMALL_CODE +#elif defined(__GNUC__) && (__GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ >= 3)) + #define CYTHON_SMALL_CODE __attribute__((cold)) +#else + #define CYTHON_SMALL_CODE +#endif +#endif + +static __Pyx_StringTabEntry __pyx_string_tab[] = { + {&__pyx_n_s_AttributeError, __pyx_k_AttributeError, sizeof(__pyx_k_AttributeError), 0, 0, 1, 1}, + {&__pyx_kp_s_Incompatible_checksums_s_vs_0x77, __pyx_k_Incompatible_checksums_s_vs_0x77, sizeof(__pyx_k_Incompatible_checksums_s_vs_0x77), 0, 0, 1, 0}, + {&__pyx_n_s_KeyError, __pyx_k_KeyError, sizeof(__pyx_k_KeyError), 0, 0, 1, 1}, + {&__pyx_n_s_PickleError, __pyx_k_PickleError, sizeof(__pyx_k_PickleError), 0, 0, 1, 1}, + {&__pyx_n_s_aiohttp__helpers, __pyx_k_aiohttp__helpers, sizeof(__pyx_k_aiohttp__helpers), 0, 0, 1, 1}, + {&__pyx_n_s_cache, __pyx_k_cache, sizeof(__pyx_k_cache), 0, 0, 1, 1}, + {&__pyx_n_s_cline_in_traceback, __pyx_k_cline_in_traceback, sizeof(__pyx_k_cline_in_traceback), 0, 0, 1, 1}, + {&__pyx_n_s_dict, __pyx_k_dict, sizeof(__pyx_k_dict), 0, 0, 1, 1}, + {&__pyx_n_s_doc, __pyx_k_doc, sizeof(__pyx_k_doc), 0, 0, 1, 1}, + {&__pyx_n_s_getstate, __pyx_k_getstate, sizeof(__pyx_k_getstate), 0, 0, 1, 1}, + {&__pyx_n_s_import, __pyx_k_import, sizeof(__pyx_k_import), 0, 0, 1, 1}, + {&__pyx_n_s_main, __pyx_k_main, sizeof(__pyx_k_main), 0, 0, 1, 1}, + {&__pyx_n_s_name, __pyx_k_name, sizeof(__pyx_k_name), 0, 0, 1, 1}, + {&__pyx_n_s_new, __pyx_k_new, sizeof(__pyx_k_new), 0, 0, 1, 1}, + {&__pyx_n_s_pickle, __pyx_k_pickle, sizeof(__pyx_k_pickle), 0, 0, 1, 1}, + {&__pyx_n_s_pyx_PickleError, __pyx_k_pyx_PickleError, sizeof(__pyx_k_pyx_PickleError), 0, 0, 1, 1}, + {&__pyx_n_s_pyx_checksum, __pyx_k_pyx_checksum, sizeof(__pyx_k_pyx_checksum), 0, 0, 1, 1}, + {&__pyx_n_s_pyx_result, __pyx_k_pyx_result, sizeof(__pyx_k_pyx_result), 0, 0, 1, 1}, + {&__pyx_n_s_pyx_state, __pyx_k_pyx_state, sizeof(__pyx_k_pyx_state), 0, 0, 1, 1}, + {&__pyx_n_s_pyx_type, __pyx_k_pyx_type, sizeof(__pyx_k_pyx_type), 0, 0, 1, 1}, + {&__pyx_n_s_pyx_unpickle_reify, __pyx_k_pyx_unpickle_reify, sizeof(__pyx_k_pyx_unpickle_reify), 0, 0, 1, 1}, + {&__pyx_n_s_reduce, __pyx_k_reduce, sizeof(__pyx_k_reduce), 0, 0, 1, 1}, + {&__pyx_n_s_reduce_cython, __pyx_k_reduce_cython, sizeof(__pyx_k_reduce_cython), 0, 0, 1, 1}, + {&__pyx_n_s_reduce_ex, __pyx_k_reduce_ex, sizeof(__pyx_k_reduce_ex), 0, 0, 1, 1}, + {&__pyx_kp_u_reified_property_is_read_only, __pyx_k_reified_property_is_read_only, sizeof(__pyx_k_reified_property_is_read_only), 0, 1, 0, 0}, + {&__pyx_n_s_reify, __pyx_k_reify, sizeof(__pyx_k_reify), 0, 0, 1, 1}, + {&__pyx_n_s_setstate, __pyx_k_setstate, sizeof(__pyx_k_setstate), 0, 0, 1, 1}, + {&__pyx_n_s_setstate_cython, __pyx_k_setstate_cython, sizeof(__pyx_k_setstate_cython), 0, 0, 1, 1}, + {&__pyx_kp_s_stringsource, __pyx_k_stringsource, sizeof(__pyx_k_stringsource), 0, 0, 1, 0}, + {&__pyx_n_s_test, __pyx_k_test, sizeof(__pyx_k_test), 0, 0, 1, 1}, + {&__pyx_n_s_update, __pyx_k_update, sizeof(__pyx_k_update), 0, 0, 1, 1}, + {&__pyx_n_s_wrapped, __pyx_k_wrapped, sizeof(__pyx_k_wrapped), 0, 0, 1, 1}, + {0, 0, 0, 0, 0, 0, 0} +}; +static CYTHON_SMALL_CODE int __Pyx_InitCachedBuiltins(void) { + __pyx_builtin_KeyError = __Pyx_GetBuiltinName(__pyx_n_s_KeyError); if (!__pyx_builtin_KeyError) __PYX_ERR(0, 25, __pyx_L1_error) + __pyx_builtin_AttributeError = __Pyx_GetBuiltinName(__pyx_n_s_AttributeError); if (!__pyx_builtin_AttributeError) __PYX_ERR(0, 29, __pyx_L1_error) + return 0; + __pyx_L1_error:; + return -1; +} + +static CYTHON_SMALL_CODE int __Pyx_InitCachedConstants(void) { + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("__Pyx_InitCachedConstants", 0); + + /* "aiohttp/_helpers.pyx":35 + * + * def __set__(self, inst, value): + * raise AttributeError("reified property is read-only") # <<<<<<<<<<<<<< + */ + __pyx_tuple_ = PyTuple_Pack(1, __pyx_kp_u_reified_property_is_read_only); if (unlikely(!__pyx_tuple_)) __PYX_ERR(0, 35, __pyx_L1_error) + __Pyx_GOTREF(__pyx_tuple_); + __Pyx_GIVEREF(__pyx_tuple_); + + /* "(tree fragment)":1 + * def __pyx_unpickle_reify(__pyx_type, long __pyx_checksum, __pyx_state): # <<<<<<<<<<<<<< + * cdef object __pyx_PickleError + * cdef object __pyx_result + */ + __pyx_tuple__2 = PyTuple_Pack(5, __pyx_n_s_pyx_type, __pyx_n_s_pyx_checksum, __pyx_n_s_pyx_state, __pyx_n_s_pyx_PickleError, __pyx_n_s_pyx_result); if (unlikely(!__pyx_tuple__2)) __PYX_ERR(1, 1, __pyx_L1_error) + __Pyx_GOTREF(__pyx_tuple__2); + __Pyx_GIVEREF(__pyx_tuple__2); + __pyx_codeobj__3 = (PyObject*)__Pyx_PyCode_New(3, 0, 5, 0, CO_OPTIMIZED|CO_NEWLOCALS, __pyx_empty_bytes, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_tuple__2, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_kp_s_stringsource, __pyx_n_s_pyx_unpickle_reify, 1, __pyx_empty_bytes); if (unlikely(!__pyx_codeobj__3)) __PYX_ERR(1, 1, __pyx_L1_error) + __Pyx_RefNannyFinishContext(); + return 0; + __pyx_L1_error:; + __Pyx_RefNannyFinishContext(); + return -1; +} + +static CYTHON_SMALL_CODE int __Pyx_InitGlobals(void) { + if (__Pyx_InitStrings(__pyx_string_tab) < 0) __PYX_ERR(0, 1, __pyx_L1_error); + __pyx_int_124832655 = PyInt_FromLong(124832655L); if (unlikely(!__pyx_int_124832655)) __PYX_ERR(0, 1, __pyx_L1_error) + return 0; + __pyx_L1_error:; + return -1; +} + +static CYTHON_SMALL_CODE int __Pyx_modinit_global_init_code(void); /*proto*/ +static CYTHON_SMALL_CODE int __Pyx_modinit_variable_export_code(void); /*proto*/ +static CYTHON_SMALL_CODE int __Pyx_modinit_function_export_code(void); /*proto*/ +static CYTHON_SMALL_CODE int __Pyx_modinit_type_init_code(void); /*proto*/ +static CYTHON_SMALL_CODE int __Pyx_modinit_type_import_code(void); /*proto*/ +static CYTHON_SMALL_CODE int __Pyx_modinit_variable_import_code(void); /*proto*/ +static CYTHON_SMALL_CODE int __Pyx_modinit_function_import_code(void); /*proto*/ + +static int __Pyx_modinit_global_init_code(void) { + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("__Pyx_modinit_global_init_code", 0); + /*--- Global init code ---*/ + __Pyx_RefNannyFinishContext(); + return 0; +} + +static int __Pyx_modinit_variable_export_code(void) { + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("__Pyx_modinit_variable_export_code", 0); + /*--- Variable export code ---*/ + __Pyx_RefNannyFinishContext(); + return 0; +} + +static int __Pyx_modinit_function_export_code(void) { + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("__Pyx_modinit_function_export_code", 0); + /*--- Function export code ---*/ + __Pyx_RefNannyFinishContext(); + return 0; +} + +static int __Pyx_modinit_type_init_code(void) { + __Pyx_RefNannyDeclarations + int __pyx_lineno = 0; + const char *__pyx_filename = NULL; + int __pyx_clineno = 0; + __Pyx_RefNannySetupContext("__Pyx_modinit_type_init_code", 0); + /*--- Type init code ---*/ + if (PyType_Ready(&__pyx_type_7aiohttp_8_helpers_reify) < 0) __PYX_ERR(0, 1, __pyx_L1_error) + #if PY_VERSION_HEX < 0x030800B1 + __pyx_type_7aiohttp_8_helpers_reify.tp_print = 0; + #endif + if ((CYTHON_USE_TYPE_SLOTS && CYTHON_USE_PYTYPE_LOOKUP) && likely(!__pyx_type_7aiohttp_8_helpers_reify.tp_dictoffset && __pyx_type_7aiohttp_8_helpers_reify.tp_getattro == PyObject_GenericGetAttr)) { + __pyx_type_7aiohttp_8_helpers_reify.tp_getattro = __Pyx_PyObject_GenericGetAttr; + } + if (PyObject_SetAttr(__pyx_m, __pyx_n_s_reify, (PyObject *)&__pyx_type_7aiohttp_8_helpers_reify) < 0) __PYX_ERR(0, 1, __pyx_L1_error) + if (__Pyx_setup_reduce((PyObject*)&__pyx_type_7aiohttp_8_helpers_reify) < 0) __PYX_ERR(0, 1, __pyx_L1_error) + __pyx_ptype_7aiohttp_8_helpers_reify = &__pyx_type_7aiohttp_8_helpers_reify; + __Pyx_RefNannyFinishContext(); + return 0; + __pyx_L1_error:; + __Pyx_RefNannyFinishContext(); + return -1; +} + +static int __Pyx_modinit_type_import_code(void) { + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("__Pyx_modinit_type_import_code", 0); + /*--- Type import code ---*/ + __Pyx_RefNannyFinishContext(); + return 0; +} + +static int __Pyx_modinit_variable_import_code(void) { + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("__Pyx_modinit_variable_import_code", 0); + /*--- Variable import code ---*/ + __Pyx_RefNannyFinishContext(); + return 0; +} + +static int __Pyx_modinit_function_import_code(void) { + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("__Pyx_modinit_function_import_code", 0); + /*--- Function import code ---*/ + __Pyx_RefNannyFinishContext(); + return 0; +} + + +#ifndef CYTHON_NO_PYINIT_EXPORT +#define __Pyx_PyMODINIT_FUNC PyMODINIT_FUNC +#elif PY_MAJOR_VERSION < 3 +#ifdef __cplusplus +#define __Pyx_PyMODINIT_FUNC extern "C" void +#else +#define __Pyx_PyMODINIT_FUNC void +#endif +#else +#ifdef __cplusplus +#define __Pyx_PyMODINIT_FUNC extern "C" PyObject * +#else +#define __Pyx_PyMODINIT_FUNC PyObject * +#endif +#endif + + +#if PY_MAJOR_VERSION < 3 +__Pyx_PyMODINIT_FUNC init_helpers(void) CYTHON_SMALL_CODE; /*proto*/ +__Pyx_PyMODINIT_FUNC init_helpers(void) +#else +__Pyx_PyMODINIT_FUNC PyInit__helpers(void) CYTHON_SMALL_CODE; /*proto*/ +__Pyx_PyMODINIT_FUNC PyInit__helpers(void) +#if CYTHON_PEP489_MULTI_PHASE_INIT +{ + return PyModuleDef_Init(&__pyx_moduledef); +} +static CYTHON_SMALL_CODE int __Pyx_check_single_interpreter(void) { + #if PY_VERSION_HEX >= 0x030700A1 + static PY_INT64_T main_interpreter_id = -1; + PY_INT64_T current_id = PyInterpreterState_GetID(PyThreadState_Get()->interp); + if (main_interpreter_id == -1) { + main_interpreter_id = current_id; + return (unlikely(current_id == -1)) ? -1 : 0; + } else if (unlikely(main_interpreter_id != current_id)) + #else + static PyInterpreterState *main_interpreter = NULL; + PyInterpreterState *current_interpreter = PyThreadState_Get()->interp; + if (!main_interpreter) { + main_interpreter = current_interpreter; + } else if (unlikely(main_interpreter != current_interpreter)) + #endif + { + PyErr_SetString( + PyExc_ImportError, + "Interpreter change detected - this module can only be loaded into one interpreter per process."); + return -1; + } + return 0; +} +static CYTHON_SMALL_CODE int __Pyx_copy_spec_to_module(PyObject *spec, PyObject *moddict, const char* from_name, const char* to_name, int allow_none) { + PyObject *value = PyObject_GetAttrString(spec, from_name); + int result = 0; + if (likely(value)) { + if (allow_none || value != Py_None) { + result = PyDict_SetItemString(moddict, to_name, value); + } + Py_DECREF(value); + } else if (PyErr_ExceptionMatches(PyExc_AttributeError)) { + PyErr_Clear(); + } else { + result = -1; + } + return result; +} +static CYTHON_SMALL_CODE PyObject* __pyx_pymod_create(PyObject *spec, CYTHON_UNUSED PyModuleDef *def) { + PyObject *module = NULL, *moddict, *modname; + if (__Pyx_check_single_interpreter()) + return NULL; + if (__pyx_m) + return __Pyx_NewRef(__pyx_m); + modname = PyObject_GetAttrString(spec, "name"); + if (unlikely(!modname)) goto bad; + module = PyModule_NewObject(modname); + Py_DECREF(modname); + if (unlikely(!module)) goto bad; + moddict = PyModule_GetDict(module); + if (unlikely(!moddict)) goto bad; + if (unlikely(__Pyx_copy_spec_to_module(spec, moddict, "loader", "__loader__", 1) < 0)) goto bad; + if (unlikely(__Pyx_copy_spec_to_module(spec, moddict, "origin", "__file__", 1) < 0)) goto bad; + if (unlikely(__Pyx_copy_spec_to_module(spec, moddict, "parent", "__package__", 1) < 0)) goto bad; + if (unlikely(__Pyx_copy_spec_to_module(spec, moddict, "submodule_search_locations", "__path__", 0) < 0)) goto bad; + return module; +bad: + Py_XDECREF(module); + return NULL; +} + + +static CYTHON_SMALL_CODE int __pyx_pymod_exec__helpers(PyObject *__pyx_pyinit_module) +#endif +#endif +{ + PyObject *__pyx_t_1 = NULL; + int __pyx_lineno = 0; + const char *__pyx_filename = NULL; + int __pyx_clineno = 0; + __Pyx_RefNannyDeclarations + #if CYTHON_PEP489_MULTI_PHASE_INIT + if (__pyx_m) { + if (__pyx_m == __pyx_pyinit_module) return 0; + PyErr_SetString(PyExc_RuntimeError, "Module '_helpers' has already been imported. Re-initialisation is not supported."); + return -1; + } + #elif PY_MAJOR_VERSION >= 3 + if (__pyx_m) return __Pyx_NewRef(__pyx_m); + #endif + #if CYTHON_REFNANNY +__Pyx_RefNanny = __Pyx_RefNannyImportAPI("refnanny"); +if (!__Pyx_RefNanny) { + PyErr_Clear(); + __Pyx_RefNanny = __Pyx_RefNannyImportAPI("Cython.Runtime.refnanny"); + if (!__Pyx_RefNanny) + Py_FatalError("failed to import 'refnanny' module"); +} +#endif + __Pyx_RefNannySetupContext("__Pyx_PyMODINIT_FUNC PyInit__helpers(void)", 0); + if (__Pyx_check_binary_version() < 0) __PYX_ERR(0, 1, __pyx_L1_error) + #ifdef __Pxy_PyFrame_Initialize_Offsets + __Pxy_PyFrame_Initialize_Offsets(); + #endif + __pyx_empty_tuple = PyTuple_New(0); if (unlikely(!__pyx_empty_tuple)) __PYX_ERR(0, 1, __pyx_L1_error) + __pyx_empty_bytes = PyBytes_FromStringAndSize("", 0); if (unlikely(!__pyx_empty_bytes)) __PYX_ERR(0, 1, __pyx_L1_error) + __pyx_empty_unicode = PyUnicode_FromStringAndSize("", 0); if (unlikely(!__pyx_empty_unicode)) __PYX_ERR(0, 1, __pyx_L1_error) + #ifdef __Pyx_CyFunction_USED + if (__pyx_CyFunction_init() < 0) __PYX_ERR(0, 1, __pyx_L1_error) + #endif + #ifdef __Pyx_FusedFunction_USED + if (__pyx_FusedFunction_init() < 0) __PYX_ERR(0, 1, __pyx_L1_error) + #endif + #ifdef __Pyx_Coroutine_USED + if (__pyx_Coroutine_init() < 0) __PYX_ERR(0, 1, __pyx_L1_error) + #endif + #ifdef __Pyx_Generator_USED + if (__pyx_Generator_init() < 0) __PYX_ERR(0, 1, __pyx_L1_error) + #endif + #ifdef __Pyx_AsyncGen_USED + if (__pyx_AsyncGen_init() < 0) __PYX_ERR(0, 1, __pyx_L1_error) + #endif + #ifdef __Pyx_StopAsyncIteration_USED + if (__pyx_StopAsyncIteration_init() < 0) __PYX_ERR(0, 1, __pyx_L1_error) + #endif + /*--- Library function declarations ---*/ + /*--- Threads initialization code ---*/ + #if defined(WITH_THREAD) && PY_VERSION_HEX < 0x030700F0 && defined(__PYX_FORCE_INIT_THREADS) && __PYX_FORCE_INIT_THREADS + PyEval_InitThreads(); + #endif + /*--- Module creation code ---*/ + #if CYTHON_PEP489_MULTI_PHASE_INIT + __pyx_m = __pyx_pyinit_module; + Py_INCREF(__pyx_m); + #else + #if PY_MAJOR_VERSION < 3 + __pyx_m = Py_InitModule4("_helpers", __pyx_methods, 0, 0, PYTHON_API_VERSION); Py_XINCREF(__pyx_m); + #else + __pyx_m = PyModule_Create(&__pyx_moduledef); + #endif + if (unlikely(!__pyx_m)) __PYX_ERR(0, 1, __pyx_L1_error) + #endif + __pyx_d = PyModule_GetDict(__pyx_m); if (unlikely(!__pyx_d)) __PYX_ERR(0, 1, __pyx_L1_error) + Py_INCREF(__pyx_d); + __pyx_b = PyImport_AddModule(__Pyx_BUILTIN_MODULE_NAME); if (unlikely(!__pyx_b)) __PYX_ERR(0, 1, __pyx_L1_error) + Py_INCREF(__pyx_b); + __pyx_cython_runtime = PyImport_AddModule((char *) "cython_runtime"); if (unlikely(!__pyx_cython_runtime)) __PYX_ERR(0, 1, __pyx_L1_error) + Py_INCREF(__pyx_cython_runtime); + if (PyObject_SetAttrString(__pyx_m, "__builtins__", __pyx_b) < 0) __PYX_ERR(0, 1, __pyx_L1_error); + /*--- Initialize various global constants etc. ---*/ + if (__Pyx_InitGlobals() < 0) __PYX_ERR(0, 1, __pyx_L1_error) + #if PY_MAJOR_VERSION < 3 && (__PYX_DEFAULT_STRING_ENCODING_IS_ASCII || __PYX_DEFAULT_STRING_ENCODING_IS_DEFAULT) + if (__Pyx_init_sys_getdefaultencoding_params() < 0) __PYX_ERR(0, 1, __pyx_L1_error) + #endif + if (__pyx_module_is_main_aiohttp___helpers) { + if (PyObject_SetAttr(__pyx_m, __pyx_n_s_name, __pyx_n_s_main) < 0) __PYX_ERR(0, 1, __pyx_L1_error) + } + #if PY_MAJOR_VERSION >= 3 + { + PyObject *modules = PyImport_GetModuleDict(); if (unlikely(!modules)) __PYX_ERR(0, 1, __pyx_L1_error) + if (!PyDict_GetItemString(modules, "aiohttp._helpers")) { + if (unlikely(PyDict_SetItemString(modules, "aiohttp._helpers", __pyx_m) < 0)) __PYX_ERR(0, 1, __pyx_L1_error) + } + } + #endif + /*--- Builtin init code ---*/ + if (__Pyx_InitCachedBuiltins() < 0) __PYX_ERR(0, 1, __pyx_L1_error) + /*--- Constants init code ---*/ + if (__Pyx_InitCachedConstants() < 0) __PYX_ERR(0, 1, __pyx_L1_error) + /*--- Global type/function init code ---*/ + (void)__Pyx_modinit_global_init_code(); + (void)__Pyx_modinit_variable_export_code(); + (void)__Pyx_modinit_function_export_code(); + if (unlikely(__Pyx_modinit_type_init_code() < 0)) __PYX_ERR(0, 1, __pyx_L1_error) + (void)__Pyx_modinit_type_import_code(); + (void)__Pyx_modinit_variable_import_code(); + (void)__Pyx_modinit_function_import_code(); + /*--- Execution code ---*/ + #if defined(__Pyx_Generator_USED) || defined(__Pyx_Coroutine_USED) + if (__Pyx_patch_abc() < 0) __PYX_ERR(0, 1, __pyx_L1_error) + #endif + + /* "(tree fragment)":1 + * def __pyx_unpickle_reify(__pyx_type, long __pyx_checksum, __pyx_state): # <<<<<<<<<<<<<< + * cdef object __pyx_PickleError + * cdef object __pyx_result + */ + __pyx_t_1 = PyCFunction_NewEx(&__pyx_mdef_7aiohttp_8_helpers_1__pyx_unpickle_reify, NULL, __pyx_n_s_aiohttp__helpers); if (unlikely(!__pyx_t_1)) __PYX_ERR(1, 1, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + if (PyDict_SetItem(__pyx_d, __pyx_n_s_pyx_unpickle_reify, __pyx_t_1) < 0) __PYX_ERR(1, 1, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + + /* "aiohttp/_helpers.pyx":1 + * cdef class reify: # <<<<<<<<<<<<<< + * """Use as a class method decorator. It operates almost exactly like + * the Python `@property` decorator, but it puts the result of the + */ + __pyx_t_1 = __Pyx_PyDict_NewPresized(0); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 1, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + if (PyDict_SetItem(__pyx_d, __pyx_n_s_test, __pyx_t_1) < 0) __PYX_ERR(0, 1, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + + /*--- Wrapped vars code ---*/ + + goto __pyx_L0; + __pyx_L1_error:; + __Pyx_XDECREF(__pyx_t_1); + if (__pyx_m) { + if (__pyx_d) { + __Pyx_AddTraceback("init aiohttp._helpers", __pyx_clineno, __pyx_lineno, __pyx_filename); + } + Py_CLEAR(__pyx_m); + } else if (!PyErr_Occurred()) { + PyErr_SetString(PyExc_ImportError, "init aiohttp._helpers"); + } + __pyx_L0:; + __Pyx_RefNannyFinishContext(); + #if CYTHON_PEP489_MULTI_PHASE_INIT + return (__pyx_m != NULL) ? 0 : -1; + #elif PY_MAJOR_VERSION >= 3 + return __pyx_m; + #else + return; + #endif +} + +/* --- Runtime support code --- */ +/* Refnanny */ +#if CYTHON_REFNANNY +static __Pyx_RefNannyAPIStruct *__Pyx_RefNannyImportAPI(const char *modname) { + PyObject *m = NULL, *p = NULL; + void *r = NULL; + m = PyImport_ImportModule(modname); + if (!m) goto end; + p = PyObject_GetAttrString(m, "RefNannyAPI"); + if (!p) goto end; + r = PyLong_AsVoidPtr(p); +end: + Py_XDECREF(p); + Py_XDECREF(m); + return (__Pyx_RefNannyAPIStruct *)r; +} +#endif + +/* PyObjectGetAttrStr */ +#if CYTHON_USE_TYPE_SLOTS +static CYTHON_INLINE PyObject* __Pyx_PyObject_GetAttrStr(PyObject* obj, PyObject* attr_name) { + PyTypeObject* tp = Py_TYPE(obj); + if (likely(tp->tp_getattro)) + return tp->tp_getattro(obj, attr_name); +#if PY_MAJOR_VERSION < 3 + if (likely(tp->tp_getattr)) + return tp->tp_getattr(obj, PyString_AS_STRING(attr_name)); +#endif + return PyObject_GetAttr(obj, attr_name); +} +#endif + +/* GetBuiltinName */ +static PyObject *__Pyx_GetBuiltinName(PyObject *name) { + PyObject* result = __Pyx_PyObject_GetAttrStr(__pyx_b, name); + if (unlikely(!result)) { + PyErr_Format(PyExc_NameError, +#if PY_MAJOR_VERSION >= 3 + "name '%U' is not defined", name); +#else + "name '%.200s' is not defined", PyString_AS_STRING(name)); +#endif + } + return result; +} + +/* RaiseDoubleKeywords */ +static void __Pyx_RaiseDoubleKeywordsError( + const char* func_name, + PyObject* kw_name) +{ + PyErr_Format(PyExc_TypeError, + #if PY_MAJOR_VERSION >= 3 + "%s() got multiple values for keyword argument '%U'", func_name, kw_name); + #else + "%s() got multiple values for keyword argument '%s'", func_name, + PyString_AsString(kw_name)); + #endif +} + +/* ParseKeywords */ +static int __Pyx_ParseOptionalKeywords( + PyObject *kwds, + PyObject **argnames[], + PyObject *kwds2, + PyObject *values[], + Py_ssize_t num_pos_args, + const char* function_name) +{ + PyObject *key = 0, *value = 0; + Py_ssize_t pos = 0; + PyObject*** name; + PyObject*** first_kw_arg = argnames + num_pos_args; + while (PyDict_Next(kwds, &pos, &key, &value)) { + name = first_kw_arg; + while (*name && (**name != key)) name++; + if (*name) { + values[name-argnames] = value; + continue; + } + name = first_kw_arg; + #if PY_MAJOR_VERSION < 3 + if (likely(PyString_Check(key))) { + while (*name) { + if ((CYTHON_COMPILING_IN_PYPY || PyString_GET_SIZE(**name) == PyString_GET_SIZE(key)) + && _PyString_Eq(**name, key)) { + values[name-argnames] = value; + break; + } + name++; + } + if (*name) continue; + else { + PyObject*** argname = argnames; + while (argname != first_kw_arg) { + if ((**argname == key) || ( + (CYTHON_COMPILING_IN_PYPY || PyString_GET_SIZE(**argname) == PyString_GET_SIZE(key)) + && _PyString_Eq(**argname, key))) { + goto arg_passed_twice; + } + argname++; + } + } + } else + #endif + if (likely(PyUnicode_Check(key))) { + while (*name) { + int cmp = (**name == key) ? 0 : + #if !CYTHON_COMPILING_IN_PYPY && PY_MAJOR_VERSION >= 3 + (__Pyx_PyUnicode_GET_LENGTH(**name) != __Pyx_PyUnicode_GET_LENGTH(key)) ? 1 : + #endif + PyUnicode_Compare(**name, key); + if (cmp < 0 && unlikely(PyErr_Occurred())) goto bad; + if (cmp == 0) { + values[name-argnames] = value; + break; + } + name++; + } + if (*name) continue; + else { + PyObject*** argname = argnames; + while (argname != first_kw_arg) { + int cmp = (**argname == key) ? 0 : + #if !CYTHON_COMPILING_IN_PYPY && PY_MAJOR_VERSION >= 3 + (__Pyx_PyUnicode_GET_LENGTH(**argname) != __Pyx_PyUnicode_GET_LENGTH(key)) ? 1 : + #endif + PyUnicode_Compare(**argname, key); + if (cmp < 0 && unlikely(PyErr_Occurred())) goto bad; + if (cmp == 0) goto arg_passed_twice; + argname++; + } + } + } else + goto invalid_keyword_type; + if (kwds2) { + if (unlikely(PyDict_SetItem(kwds2, key, value))) goto bad; + } else { + goto invalid_keyword; + } + } + return 0; +arg_passed_twice: + __Pyx_RaiseDoubleKeywordsError(function_name, key); + goto bad; +invalid_keyword_type: + PyErr_Format(PyExc_TypeError, + "%.200s() keywords must be strings", function_name); + goto bad; +invalid_keyword: + PyErr_Format(PyExc_TypeError, + #if PY_MAJOR_VERSION < 3 + "%.200s() got an unexpected keyword argument '%.200s'", + function_name, PyString_AsString(key)); + #else + "%s() got an unexpected keyword argument '%U'", + function_name, key); + #endif +bad: + return -1; +} + +/* RaiseArgTupleInvalid */ +static void __Pyx_RaiseArgtupleInvalid( + const char* func_name, + int exact, + Py_ssize_t num_min, + Py_ssize_t num_max, + Py_ssize_t num_found) +{ + Py_ssize_t num_expected; + const char *more_or_less; + if (num_found < num_min) { + num_expected = num_min; + more_or_less = "at least"; + } else { + num_expected = num_max; + more_or_less = "at most"; + } + if (exact) { + more_or_less = "exactly"; + } + PyErr_Format(PyExc_TypeError, + "%.200s() takes %.8s %" CYTHON_FORMAT_SSIZE_T "d positional argument%.1s (%" CYTHON_FORMAT_SSIZE_T "d given)", + func_name, more_or_less, num_expected, + (num_expected == 1) ? "" : "s", num_found); +} + +/* GetItemInt */ +static PyObject *__Pyx_GetItemInt_Generic(PyObject *o, PyObject* j) { + PyObject *r; + if (!j) return NULL; + r = PyObject_GetItem(o, j); + Py_DECREF(j); + return r; +} +static CYTHON_INLINE PyObject *__Pyx_GetItemInt_List_Fast(PyObject *o, Py_ssize_t i, + CYTHON_NCP_UNUSED int wraparound, + CYTHON_NCP_UNUSED int boundscheck) { +#if CYTHON_ASSUME_SAFE_MACROS && !CYTHON_AVOID_BORROWED_REFS + Py_ssize_t wrapped_i = i; + if (wraparound & unlikely(i < 0)) { + wrapped_i += PyList_GET_SIZE(o); + } + if ((!boundscheck) || likely(__Pyx_is_valid_index(wrapped_i, PyList_GET_SIZE(o)))) { + PyObject *r = PyList_GET_ITEM(o, wrapped_i); + Py_INCREF(r); + return r; + } + return __Pyx_GetItemInt_Generic(o, PyInt_FromSsize_t(i)); +#else + return PySequence_GetItem(o, i); +#endif +} +static CYTHON_INLINE PyObject *__Pyx_GetItemInt_Tuple_Fast(PyObject *o, Py_ssize_t i, + CYTHON_NCP_UNUSED int wraparound, + CYTHON_NCP_UNUSED int boundscheck) { +#if CYTHON_ASSUME_SAFE_MACROS && !CYTHON_AVOID_BORROWED_REFS + Py_ssize_t wrapped_i = i; + if (wraparound & unlikely(i < 0)) { + wrapped_i += PyTuple_GET_SIZE(o); + } + if ((!boundscheck) || likely(__Pyx_is_valid_index(wrapped_i, PyTuple_GET_SIZE(o)))) { + PyObject *r = PyTuple_GET_ITEM(o, wrapped_i); + Py_INCREF(r); + return r; + } + return __Pyx_GetItemInt_Generic(o, PyInt_FromSsize_t(i)); +#else + return PySequence_GetItem(o, i); +#endif +} +static CYTHON_INLINE PyObject *__Pyx_GetItemInt_Fast(PyObject *o, Py_ssize_t i, int is_list, + CYTHON_NCP_UNUSED int wraparound, + CYTHON_NCP_UNUSED int boundscheck) { +#if CYTHON_ASSUME_SAFE_MACROS && !CYTHON_AVOID_BORROWED_REFS && CYTHON_USE_TYPE_SLOTS + if (is_list || PyList_CheckExact(o)) { + Py_ssize_t n = ((!wraparound) | likely(i >= 0)) ? i : i + PyList_GET_SIZE(o); + if ((!boundscheck) || (likely(__Pyx_is_valid_index(n, PyList_GET_SIZE(o))))) { + PyObject *r = PyList_GET_ITEM(o, n); + Py_INCREF(r); + return r; + } + } + else if (PyTuple_CheckExact(o)) { + Py_ssize_t n = ((!wraparound) | likely(i >= 0)) ? i : i + PyTuple_GET_SIZE(o); + if ((!boundscheck) || likely(__Pyx_is_valid_index(n, PyTuple_GET_SIZE(o)))) { + PyObject *r = PyTuple_GET_ITEM(o, n); + Py_INCREF(r); + return r; + } + } else { + PySequenceMethods *m = Py_TYPE(o)->tp_as_sequence; + if (likely(m && m->sq_item)) { + if (wraparound && unlikely(i < 0) && likely(m->sq_length)) { + Py_ssize_t l = m->sq_length(o); + if (likely(l >= 0)) { + i += l; + } else { + if (!PyErr_ExceptionMatches(PyExc_OverflowError)) + return NULL; + PyErr_Clear(); + } + } + return m->sq_item(o, i); + } + } +#else + if (is_list || PySequence_Check(o)) { + return PySequence_GetItem(o, i); + } +#endif + return __Pyx_GetItemInt_Generic(o, PyInt_FromSsize_t(i)); +} + +/* ObjectGetItem */ +#if CYTHON_USE_TYPE_SLOTS +static PyObject *__Pyx_PyObject_GetIndex(PyObject *obj, PyObject* index) { + PyObject *runerr; + Py_ssize_t key_value; + PySequenceMethods *m = Py_TYPE(obj)->tp_as_sequence; + if (unlikely(!(m && m->sq_item))) { + PyErr_Format(PyExc_TypeError, "'%.200s' object is not subscriptable", Py_TYPE(obj)->tp_name); + return NULL; + } + key_value = __Pyx_PyIndex_AsSsize_t(index); + if (likely(key_value != -1 || !(runerr = PyErr_Occurred()))) { + return __Pyx_GetItemInt_Fast(obj, key_value, 0, 1, 1); + } + if (PyErr_GivenExceptionMatches(runerr, PyExc_OverflowError)) { + PyErr_Clear(); + PyErr_Format(PyExc_IndexError, "cannot fit '%.200s' into an index-sized integer", Py_TYPE(index)->tp_name); + } + return NULL; +} +static PyObject *__Pyx_PyObject_GetItem(PyObject *obj, PyObject* key) { + PyMappingMethods *m = Py_TYPE(obj)->tp_as_mapping; + if (likely(m && m->mp_subscript)) { + return m->mp_subscript(obj, key); + } + return __Pyx_PyObject_GetIndex(obj, key); +} +#endif + +/* GetTopmostException */ +#if CYTHON_USE_EXC_INFO_STACK +static _PyErr_StackItem * +__Pyx_PyErr_GetTopmostException(PyThreadState *tstate) +{ + _PyErr_StackItem *exc_info = tstate->exc_info; + while ((exc_info->exc_type == NULL || exc_info->exc_type == Py_None) && + exc_info->previous_item != NULL) + { + exc_info = exc_info->previous_item; + } + return exc_info; +} +#endif + +/* SaveResetException */ +#if CYTHON_FAST_THREAD_STATE +static CYTHON_INLINE void __Pyx__ExceptionSave(PyThreadState *tstate, PyObject **type, PyObject **value, PyObject **tb) { + #if CYTHON_USE_EXC_INFO_STACK + _PyErr_StackItem *exc_info = __Pyx_PyErr_GetTopmostException(tstate); + *type = exc_info->exc_type; + *value = exc_info->exc_value; + *tb = exc_info->exc_traceback; + #else + *type = tstate->exc_type; + *value = tstate->exc_value; + *tb = tstate->exc_traceback; + #endif + Py_XINCREF(*type); + Py_XINCREF(*value); + Py_XINCREF(*tb); +} +static CYTHON_INLINE void __Pyx__ExceptionReset(PyThreadState *tstate, PyObject *type, PyObject *value, PyObject *tb) { + PyObject *tmp_type, *tmp_value, *tmp_tb; + #if CYTHON_USE_EXC_INFO_STACK + _PyErr_StackItem *exc_info = tstate->exc_info; + tmp_type = exc_info->exc_type; + tmp_value = exc_info->exc_value; + tmp_tb = exc_info->exc_traceback; + exc_info->exc_type = type; + exc_info->exc_value = value; + exc_info->exc_traceback = tb; + #else + tmp_type = tstate->exc_type; + tmp_value = tstate->exc_value; + tmp_tb = tstate->exc_traceback; + tstate->exc_type = type; + tstate->exc_value = value; + tstate->exc_traceback = tb; + #endif + Py_XDECREF(tmp_type); + Py_XDECREF(tmp_value); + Py_XDECREF(tmp_tb); +} +#endif + +/* PyErrExceptionMatches */ +#if CYTHON_FAST_THREAD_STATE +static int __Pyx_PyErr_ExceptionMatchesTuple(PyObject *exc_type, PyObject *tuple) { + Py_ssize_t i, n; + n = PyTuple_GET_SIZE(tuple); +#if PY_MAJOR_VERSION >= 3 + for (i=0; icurexc_type; + if (exc_type == err) return 1; + if (unlikely(!exc_type)) return 0; + if (unlikely(PyTuple_Check(err))) + return __Pyx_PyErr_ExceptionMatchesTuple(exc_type, err); + return __Pyx_PyErr_GivenExceptionMatches(exc_type, err); +} +#endif + +/* GetException */ +#if CYTHON_FAST_THREAD_STATE +static int __Pyx__GetException(PyThreadState *tstate, PyObject **type, PyObject **value, PyObject **tb) +#else +static int __Pyx_GetException(PyObject **type, PyObject **value, PyObject **tb) +#endif +{ + PyObject *local_type, *local_value, *local_tb; +#if CYTHON_FAST_THREAD_STATE + PyObject *tmp_type, *tmp_value, *tmp_tb; + local_type = tstate->curexc_type; + local_value = tstate->curexc_value; + local_tb = tstate->curexc_traceback; + tstate->curexc_type = 0; + tstate->curexc_value = 0; + tstate->curexc_traceback = 0; +#else + PyErr_Fetch(&local_type, &local_value, &local_tb); +#endif + PyErr_NormalizeException(&local_type, &local_value, &local_tb); +#if CYTHON_FAST_THREAD_STATE + if (unlikely(tstate->curexc_type)) +#else + if (unlikely(PyErr_Occurred())) +#endif + goto bad; + #if PY_MAJOR_VERSION >= 3 + if (local_tb) { + if (unlikely(PyException_SetTraceback(local_value, local_tb) < 0)) + goto bad; + } + #endif + Py_XINCREF(local_tb); + Py_XINCREF(local_type); + Py_XINCREF(local_value); + *type = local_type; + *value = local_value; + *tb = local_tb; +#if CYTHON_FAST_THREAD_STATE + #if CYTHON_USE_EXC_INFO_STACK + { + _PyErr_StackItem *exc_info = tstate->exc_info; + tmp_type = exc_info->exc_type; + tmp_value = exc_info->exc_value; + tmp_tb = exc_info->exc_traceback; + exc_info->exc_type = local_type; + exc_info->exc_value = local_value; + exc_info->exc_traceback = local_tb; + } + #else + tmp_type = tstate->exc_type; + tmp_value = tstate->exc_value; + tmp_tb = tstate->exc_traceback; + tstate->exc_type = local_type; + tstate->exc_value = local_value; + tstate->exc_traceback = local_tb; + #endif + Py_XDECREF(tmp_type); + Py_XDECREF(tmp_value); + Py_XDECREF(tmp_tb); +#else + PyErr_SetExcInfo(local_type, local_value, local_tb); +#endif + return 0; +bad: + *type = 0; + *value = 0; + *tb = 0; + Py_XDECREF(local_type); + Py_XDECREF(local_value); + Py_XDECREF(local_tb); + return -1; +} + +/* PyCFunctionFastCall */ +#if CYTHON_FAST_PYCCALL +static CYTHON_INLINE PyObject * __Pyx_PyCFunction_FastCall(PyObject *func_obj, PyObject **args, Py_ssize_t nargs) { + PyCFunctionObject *func = (PyCFunctionObject*)func_obj; + PyCFunction meth = PyCFunction_GET_FUNCTION(func); + PyObject *self = PyCFunction_GET_SELF(func); + int flags = PyCFunction_GET_FLAGS(func); + assert(PyCFunction_Check(func)); + assert(METH_FASTCALL == (flags & ~(METH_CLASS | METH_STATIC | METH_COEXIST | METH_KEYWORDS | METH_STACKLESS))); + assert(nargs >= 0); + assert(nargs == 0 || args != NULL); + /* _PyCFunction_FastCallDict() must not be called with an exception set, + because it may clear it (directly or indirectly) and so the + caller loses its exception */ + assert(!PyErr_Occurred()); + if ((PY_VERSION_HEX < 0x030700A0) || unlikely(flags & METH_KEYWORDS)) { + return (*((__Pyx_PyCFunctionFastWithKeywords)(void*)meth)) (self, args, nargs, NULL); + } else { + return (*((__Pyx_PyCFunctionFast)(void*)meth)) (self, args, nargs); + } +} +#endif + +/* PyFunctionFastCall */ +#if CYTHON_FAST_PYCALL +static PyObject* __Pyx_PyFunction_FastCallNoKw(PyCodeObject *co, PyObject **args, Py_ssize_t na, + PyObject *globals) { + PyFrameObject *f; + PyThreadState *tstate = __Pyx_PyThreadState_Current; + PyObject **fastlocals; + Py_ssize_t i; + PyObject *result; + assert(globals != NULL); + /* XXX Perhaps we should create a specialized + PyFrame_New() that doesn't take locals, but does + take builtins without sanity checking them. + */ + assert(tstate != NULL); + f = PyFrame_New(tstate, co, globals, NULL); + if (f == NULL) { + return NULL; + } + fastlocals = __Pyx_PyFrame_GetLocalsplus(f); + for (i = 0; i < na; i++) { + Py_INCREF(*args); + fastlocals[i] = *args++; + } + result = PyEval_EvalFrameEx(f,0); + ++tstate->recursion_depth; + Py_DECREF(f); + --tstate->recursion_depth; + return result; +} +#if 1 || PY_VERSION_HEX < 0x030600B1 +static PyObject *__Pyx_PyFunction_FastCallDict(PyObject *func, PyObject **args, Py_ssize_t nargs, PyObject *kwargs) { + PyCodeObject *co = (PyCodeObject *)PyFunction_GET_CODE(func); + PyObject *globals = PyFunction_GET_GLOBALS(func); + PyObject *argdefs = PyFunction_GET_DEFAULTS(func); + PyObject *closure; +#if PY_MAJOR_VERSION >= 3 + PyObject *kwdefs; +#endif + PyObject *kwtuple, **k; + PyObject **d; + Py_ssize_t nd; + Py_ssize_t nk; + PyObject *result; + assert(kwargs == NULL || PyDict_Check(kwargs)); + nk = kwargs ? PyDict_Size(kwargs) : 0; + if (Py_EnterRecursiveCall((char*)" while calling a Python object")) { + return NULL; + } + if ( +#if PY_MAJOR_VERSION >= 3 + co->co_kwonlyargcount == 0 && +#endif + likely(kwargs == NULL || nk == 0) && + co->co_flags == (CO_OPTIMIZED | CO_NEWLOCALS | CO_NOFREE)) { + if (argdefs == NULL && co->co_argcount == nargs) { + result = __Pyx_PyFunction_FastCallNoKw(co, args, nargs, globals); + goto done; + } + else if (nargs == 0 && argdefs != NULL + && co->co_argcount == Py_SIZE(argdefs)) { + /* function called with no arguments, but all parameters have + a default value: use default values as arguments .*/ + args = &PyTuple_GET_ITEM(argdefs, 0); + result =__Pyx_PyFunction_FastCallNoKw(co, args, Py_SIZE(argdefs), globals); + goto done; + } + } + if (kwargs != NULL) { + Py_ssize_t pos, i; + kwtuple = PyTuple_New(2 * nk); + if (kwtuple == NULL) { + result = NULL; + goto done; + } + k = &PyTuple_GET_ITEM(kwtuple, 0); + pos = i = 0; + while (PyDict_Next(kwargs, &pos, &k[i], &k[i+1])) { + Py_INCREF(k[i]); + Py_INCREF(k[i+1]); + i += 2; + } + nk = i / 2; + } + else { + kwtuple = NULL; + k = NULL; + } + closure = PyFunction_GET_CLOSURE(func); +#if PY_MAJOR_VERSION >= 3 + kwdefs = PyFunction_GET_KW_DEFAULTS(func); +#endif + if (argdefs != NULL) { + d = &PyTuple_GET_ITEM(argdefs, 0); + nd = Py_SIZE(argdefs); + } + else { + d = NULL; + nd = 0; + } +#if PY_MAJOR_VERSION >= 3 + result = PyEval_EvalCodeEx((PyObject*)co, globals, (PyObject *)NULL, + args, (int)nargs, + k, (int)nk, + d, (int)nd, kwdefs, closure); +#else + result = PyEval_EvalCodeEx(co, globals, (PyObject *)NULL, + args, (int)nargs, + k, (int)nk, + d, (int)nd, closure); +#endif + Py_XDECREF(kwtuple); +done: + Py_LeaveRecursiveCall(); + return result; +} +#endif +#endif + +/* PyObjectCall */ +#if CYTHON_COMPILING_IN_CPYTHON +static CYTHON_INLINE PyObject* __Pyx_PyObject_Call(PyObject *func, PyObject *arg, PyObject *kw) { + PyObject *result; + ternaryfunc call = Py_TYPE(func)->tp_call; + if (unlikely(!call)) + return PyObject_Call(func, arg, kw); + if (unlikely(Py_EnterRecursiveCall((char*)" while calling a Python object"))) + return NULL; + result = (*call)(func, arg, kw); + Py_LeaveRecursiveCall(); + if (unlikely(!result) && unlikely(!PyErr_Occurred())) { + PyErr_SetString( + PyExc_SystemError, + "NULL result without error in PyObject_Call"); + } + return result; +} +#endif + +/* PyObjectCall2Args */ +static CYTHON_UNUSED PyObject* __Pyx_PyObject_Call2Args(PyObject* function, PyObject* arg1, PyObject* arg2) { + PyObject *args, *result = NULL; + #if CYTHON_FAST_PYCALL + if (PyFunction_Check(function)) { + PyObject *args[2] = {arg1, arg2}; + return __Pyx_PyFunction_FastCall(function, args, 2); + } + #endif + #if CYTHON_FAST_PYCCALL + if (__Pyx_PyFastCFunction_Check(function)) { + PyObject *args[2] = {arg1, arg2}; + return __Pyx_PyCFunction_FastCall(function, args, 2); + } + #endif + args = PyTuple_New(2); + if (unlikely(!args)) goto done; + Py_INCREF(arg1); + PyTuple_SET_ITEM(args, 0, arg1); + Py_INCREF(arg2); + PyTuple_SET_ITEM(args, 1, arg2); + Py_INCREF(function); + result = __Pyx_PyObject_Call(function, args, NULL); + Py_DECREF(args); + Py_DECREF(function); +done: + return result; +} + +/* PyObjectCallMethO */ +#if CYTHON_COMPILING_IN_CPYTHON +static CYTHON_INLINE PyObject* __Pyx_PyObject_CallMethO(PyObject *func, PyObject *arg) { + PyObject *self, *result; + PyCFunction cfunc; + cfunc = PyCFunction_GET_FUNCTION(func); + self = PyCFunction_GET_SELF(func); + if (unlikely(Py_EnterRecursiveCall((char*)" while calling a Python object"))) + return NULL; + result = cfunc(self, arg); + Py_LeaveRecursiveCall(); + if (unlikely(!result) && unlikely(!PyErr_Occurred())) { + PyErr_SetString( + PyExc_SystemError, + "NULL result without error in PyObject_Call"); + } + return result; +} +#endif + +/* PyObjectCallOneArg */ +#if CYTHON_COMPILING_IN_CPYTHON +static PyObject* __Pyx__PyObject_CallOneArg(PyObject *func, PyObject *arg) { + PyObject *result; + PyObject *args = PyTuple_New(1); + if (unlikely(!args)) return NULL; + Py_INCREF(arg); + PyTuple_SET_ITEM(args, 0, arg); + result = __Pyx_PyObject_Call(func, args, NULL); + Py_DECREF(args); + return result; +} +static CYTHON_INLINE PyObject* __Pyx_PyObject_CallOneArg(PyObject *func, PyObject *arg) { +#if CYTHON_FAST_PYCALL + if (PyFunction_Check(func)) { + return __Pyx_PyFunction_FastCall(func, &arg, 1); + } +#endif + if (likely(PyCFunction_Check(func))) { + if (likely(PyCFunction_GET_FLAGS(func) & METH_O)) { + return __Pyx_PyObject_CallMethO(func, arg); +#if CYTHON_FAST_PYCCALL + } else if (__Pyx_PyFastCFunction_Check(func)) { + return __Pyx_PyCFunction_FastCall(func, &arg, 1); +#endif + } + } + return __Pyx__PyObject_CallOneArg(func, arg); +} +#else +static CYTHON_INLINE PyObject* __Pyx_PyObject_CallOneArg(PyObject *func, PyObject *arg) { + PyObject *result; + PyObject *args = PyTuple_Pack(1, arg); + if (unlikely(!args)) return NULL; + result = __Pyx_PyObject_Call(func, args, NULL); + Py_DECREF(args); + return result; +} +#endif + +/* PyErrFetchRestore */ +#if CYTHON_FAST_THREAD_STATE +static CYTHON_INLINE void __Pyx_ErrRestoreInState(PyThreadState *tstate, PyObject *type, PyObject *value, PyObject *tb) { + PyObject *tmp_type, *tmp_value, *tmp_tb; + tmp_type = tstate->curexc_type; + tmp_value = tstate->curexc_value; + tmp_tb = tstate->curexc_traceback; + tstate->curexc_type = type; + tstate->curexc_value = value; + tstate->curexc_traceback = tb; + Py_XDECREF(tmp_type); + Py_XDECREF(tmp_value); + Py_XDECREF(tmp_tb); +} +static CYTHON_INLINE void __Pyx_ErrFetchInState(PyThreadState *tstate, PyObject **type, PyObject **value, PyObject **tb) { + *type = tstate->curexc_type; + *value = tstate->curexc_value; + *tb = tstate->curexc_traceback; + tstate->curexc_type = 0; + tstate->curexc_value = 0; + tstate->curexc_traceback = 0; +} +#endif + +/* RaiseException */ +#if PY_MAJOR_VERSION < 3 +static void __Pyx_Raise(PyObject *type, PyObject *value, PyObject *tb, + CYTHON_UNUSED PyObject *cause) { + __Pyx_PyThreadState_declare + Py_XINCREF(type); + if (!value || value == Py_None) + value = NULL; + else + Py_INCREF(value); + if (!tb || tb == Py_None) + tb = NULL; + else { + Py_INCREF(tb); + if (!PyTraceBack_Check(tb)) { + PyErr_SetString(PyExc_TypeError, + "raise: arg 3 must be a traceback or None"); + goto raise_error; + } + } + if (PyType_Check(type)) { +#if CYTHON_COMPILING_IN_PYPY + if (!value) { + Py_INCREF(Py_None); + value = Py_None; + } +#endif + PyErr_NormalizeException(&type, &value, &tb); + } else { + if (value) { + PyErr_SetString(PyExc_TypeError, + "instance exception may not have a separate value"); + goto raise_error; + } + value = type; + type = (PyObject*) Py_TYPE(type); + Py_INCREF(type); + if (!PyType_IsSubtype((PyTypeObject *)type, (PyTypeObject *)PyExc_BaseException)) { + PyErr_SetString(PyExc_TypeError, + "raise: exception class must be a subclass of BaseException"); + goto raise_error; + } + } + __Pyx_PyThreadState_assign + __Pyx_ErrRestore(type, value, tb); + return; +raise_error: + Py_XDECREF(value); + Py_XDECREF(type); + Py_XDECREF(tb); + return; +} +#else +static void __Pyx_Raise(PyObject *type, PyObject *value, PyObject *tb, PyObject *cause) { + PyObject* owned_instance = NULL; + if (tb == Py_None) { + tb = 0; + } else if (tb && !PyTraceBack_Check(tb)) { + PyErr_SetString(PyExc_TypeError, + "raise: arg 3 must be a traceback or None"); + goto bad; + } + if (value == Py_None) + value = 0; + if (PyExceptionInstance_Check(type)) { + if (value) { + PyErr_SetString(PyExc_TypeError, + "instance exception may not have a separate value"); + goto bad; + } + value = type; + type = (PyObject*) Py_TYPE(value); + } else if (PyExceptionClass_Check(type)) { + PyObject *instance_class = NULL; + if (value && PyExceptionInstance_Check(value)) { + instance_class = (PyObject*) Py_TYPE(value); + if (instance_class != type) { + int is_subclass = PyObject_IsSubclass(instance_class, type); + if (!is_subclass) { + instance_class = NULL; + } else if (unlikely(is_subclass == -1)) { + goto bad; + } else { + type = instance_class; + } + } + } + if (!instance_class) { + PyObject *args; + if (!value) + args = PyTuple_New(0); + else if (PyTuple_Check(value)) { + Py_INCREF(value); + args = value; + } else + args = PyTuple_Pack(1, value); + if (!args) + goto bad; + owned_instance = PyObject_Call(type, args, NULL); + Py_DECREF(args); + if (!owned_instance) + goto bad; + value = owned_instance; + if (!PyExceptionInstance_Check(value)) { + PyErr_Format(PyExc_TypeError, + "calling %R should have returned an instance of " + "BaseException, not %R", + type, Py_TYPE(value)); + goto bad; + } + } + } else { + PyErr_SetString(PyExc_TypeError, + "raise: exception class must be a subclass of BaseException"); + goto bad; + } + if (cause) { + PyObject *fixed_cause; + if (cause == Py_None) { + fixed_cause = NULL; + } else if (PyExceptionClass_Check(cause)) { + fixed_cause = PyObject_CallObject(cause, NULL); + if (fixed_cause == NULL) + goto bad; + } else if (PyExceptionInstance_Check(cause)) { + fixed_cause = cause; + Py_INCREF(fixed_cause); + } else { + PyErr_SetString(PyExc_TypeError, + "exception causes must derive from " + "BaseException"); + goto bad; + } + PyException_SetCause(value, fixed_cause); + } + PyErr_SetObject(type, value); + if (tb) { +#if CYTHON_COMPILING_IN_PYPY + PyObject *tmp_type, *tmp_value, *tmp_tb; + PyErr_Fetch(&tmp_type, &tmp_value, &tmp_tb); + Py_INCREF(tb); + PyErr_Restore(tmp_type, tmp_value, tb); + Py_XDECREF(tmp_tb); +#else + PyThreadState *tstate = __Pyx_PyThreadState_Current; + PyObject* tmp_tb = tstate->curexc_traceback; + if (tb != tmp_tb) { + Py_INCREF(tb); + tstate->curexc_traceback = tb; + Py_XDECREF(tmp_tb); + } +#endif + } +bad: + Py_XDECREF(owned_instance); + return; +} +#endif + +/* GetAttr */ +static CYTHON_INLINE PyObject *__Pyx_GetAttr(PyObject *o, PyObject *n) { +#if CYTHON_USE_TYPE_SLOTS +#if PY_MAJOR_VERSION >= 3 + if (likely(PyUnicode_Check(n))) +#else + if (likely(PyString_Check(n))) +#endif + return __Pyx_PyObject_GetAttrStr(o, n); +#endif + return PyObject_GetAttr(o, n); +} + +/* GetAttr3 */ +static PyObject *__Pyx_GetAttr3Default(PyObject *d) { + __Pyx_PyThreadState_declare + __Pyx_PyThreadState_assign + if (unlikely(!__Pyx_PyErr_ExceptionMatches(PyExc_AttributeError))) + return NULL; + __Pyx_PyErr_Clear(); + Py_INCREF(d); + return d; +} +static CYTHON_INLINE PyObject *__Pyx_GetAttr3(PyObject *o, PyObject *n, PyObject *d) { + PyObject *r = __Pyx_GetAttr(o, n); + return (likely(r)) ? r : __Pyx_GetAttr3Default(d); +} + +/* PyDictVersioning */ +#if CYTHON_USE_DICT_VERSIONS && CYTHON_USE_TYPE_SLOTS +static CYTHON_INLINE PY_UINT64_T __Pyx_get_tp_dict_version(PyObject *obj) { + PyObject *dict = Py_TYPE(obj)->tp_dict; + return likely(dict) ? __PYX_GET_DICT_VERSION(dict) : 0; +} +static CYTHON_INLINE PY_UINT64_T __Pyx_get_object_dict_version(PyObject *obj) { + PyObject **dictptr = NULL; + Py_ssize_t offset = Py_TYPE(obj)->tp_dictoffset; + if (offset) { +#if CYTHON_COMPILING_IN_CPYTHON + dictptr = (likely(offset > 0)) ? (PyObject **) ((char *)obj + offset) : _PyObject_GetDictPtr(obj); +#else + dictptr = _PyObject_GetDictPtr(obj); +#endif + } + return (dictptr && *dictptr) ? __PYX_GET_DICT_VERSION(*dictptr) : 0; +} +static CYTHON_INLINE int __Pyx_object_dict_version_matches(PyObject* obj, PY_UINT64_T tp_dict_version, PY_UINT64_T obj_dict_version) { + PyObject *dict = Py_TYPE(obj)->tp_dict; + if (unlikely(!dict) || unlikely(tp_dict_version != __PYX_GET_DICT_VERSION(dict))) + return 0; + return obj_dict_version == __Pyx_get_object_dict_version(obj); +} +#endif + +/* GetModuleGlobalName */ +#if CYTHON_USE_DICT_VERSIONS +static PyObject *__Pyx__GetModuleGlobalName(PyObject *name, PY_UINT64_T *dict_version, PyObject **dict_cached_value) +#else +static CYTHON_INLINE PyObject *__Pyx__GetModuleGlobalName(PyObject *name) +#endif +{ + PyObject *result; +#if !CYTHON_AVOID_BORROWED_REFS +#if CYTHON_COMPILING_IN_CPYTHON && PY_VERSION_HEX >= 0x030500A1 + result = _PyDict_GetItem_KnownHash(__pyx_d, name, ((PyASCIIObject *) name)->hash); + __PYX_UPDATE_DICT_CACHE(__pyx_d, result, *dict_cached_value, *dict_version) + if (likely(result)) { + return __Pyx_NewRef(result); + } else if (unlikely(PyErr_Occurred())) { + return NULL; + } +#else + result = PyDict_GetItem(__pyx_d, name); + __PYX_UPDATE_DICT_CACHE(__pyx_d, result, *dict_cached_value, *dict_version) + if (likely(result)) { + return __Pyx_NewRef(result); + } +#endif +#else + result = PyObject_GetItem(__pyx_d, name); + __PYX_UPDATE_DICT_CACHE(__pyx_d, result, *dict_cached_value, *dict_version) + if (likely(result)) { + return __Pyx_NewRef(result); + } + PyErr_Clear(); +#endif + return __Pyx_GetBuiltinName(name); +} + +/* Import */ +static PyObject *__Pyx_Import(PyObject *name, PyObject *from_list, int level) { + PyObject *empty_list = 0; + PyObject *module = 0; + PyObject *global_dict = 0; + PyObject *empty_dict = 0; + PyObject *list; + #if PY_MAJOR_VERSION < 3 + PyObject *py_import; + py_import = __Pyx_PyObject_GetAttrStr(__pyx_b, __pyx_n_s_import); + if (!py_import) + goto bad; + #endif + if (from_list) + list = from_list; + else { + empty_list = PyList_New(0); + if (!empty_list) + goto bad; + list = empty_list; + } + global_dict = PyModule_GetDict(__pyx_m); + if (!global_dict) + goto bad; + empty_dict = PyDict_New(); + if (!empty_dict) + goto bad; + { + #if PY_MAJOR_VERSION >= 3 + if (level == -1) { + if ((1) && (strchr(__Pyx_MODULE_NAME, '.'))) { + module = PyImport_ImportModuleLevelObject( + name, global_dict, empty_dict, list, 1); + if (!module) { + if (!PyErr_ExceptionMatches(PyExc_ImportError)) + goto bad; + PyErr_Clear(); + } + } + level = 0; + } + #endif + if (!module) { + #if PY_MAJOR_VERSION < 3 + PyObject *py_level = PyInt_FromLong(level); + if (!py_level) + goto bad; + module = PyObject_CallFunctionObjArgs(py_import, + name, global_dict, empty_dict, list, py_level, (PyObject *)NULL); + Py_DECREF(py_level); + #else + module = PyImport_ImportModuleLevelObject( + name, global_dict, empty_dict, list, level); + #endif + } + } +bad: + #if PY_MAJOR_VERSION < 3 + Py_XDECREF(py_import); + #endif + Py_XDECREF(empty_list); + Py_XDECREF(empty_dict); + return module; +} + +/* ImportFrom */ +static PyObject* __Pyx_ImportFrom(PyObject* module, PyObject* name) { + PyObject* value = __Pyx_PyObject_GetAttrStr(module, name); + if (unlikely(!value) && PyErr_ExceptionMatches(PyExc_AttributeError)) { + PyErr_Format(PyExc_ImportError, + #if PY_MAJOR_VERSION < 3 + "cannot import name %.230s", PyString_AS_STRING(name)); + #else + "cannot import name %S", name); + #endif + } + return value; +} + +/* HasAttr */ +static CYTHON_INLINE int __Pyx_HasAttr(PyObject *o, PyObject *n) { + PyObject *r; + if (unlikely(!__Pyx_PyBaseString_Check(n))) { + PyErr_SetString(PyExc_TypeError, + "hasattr(): attribute name must be string"); + return -1; + } + r = __Pyx_GetAttr(o, n); + if (unlikely(!r)) { + PyErr_Clear(); + return 0; + } else { + Py_DECREF(r); + return 1; + } +} + +/* PyObject_GenericGetAttrNoDict */ +#if CYTHON_USE_TYPE_SLOTS && CYTHON_USE_PYTYPE_LOOKUP && PY_VERSION_HEX < 0x03070000 +static PyObject *__Pyx_RaiseGenericGetAttributeError(PyTypeObject *tp, PyObject *attr_name) { + PyErr_Format(PyExc_AttributeError, +#if PY_MAJOR_VERSION >= 3 + "'%.50s' object has no attribute '%U'", + tp->tp_name, attr_name); +#else + "'%.50s' object has no attribute '%.400s'", + tp->tp_name, PyString_AS_STRING(attr_name)); +#endif + return NULL; +} +static CYTHON_INLINE PyObject* __Pyx_PyObject_GenericGetAttrNoDict(PyObject* obj, PyObject* attr_name) { + PyObject *descr; + PyTypeObject *tp = Py_TYPE(obj); + if (unlikely(!PyString_Check(attr_name))) { + return PyObject_GenericGetAttr(obj, attr_name); + } + assert(!tp->tp_dictoffset); + descr = _PyType_Lookup(tp, attr_name); + if (unlikely(!descr)) { + return __Pyx_RaiseGenericGetAttributeError(tp, attr_name); + } + Py_INCREF(descr); + #if PY_MAJOR_VERSION < 3 + if (likely(PyType_HasFeature(Py_TYPE(descr), Py_TPFLAGS_HAVE_CLASS))) + #endif + { + descrgetfunc f = Py_TYPE(descr)->tp_descr_get; + if (unlikely(f)) { + PyObject *res = f(descr, obj, (PyObject *)tp); + Py_DECREF(descr); + return res; + } + } + return descr; +} +#endif + +/* PyObject_GenericGetAttr */ +#if CYTHON_USE_TYPE_SLOTS && CYTHON_USE_PYTYPE_LOOKUP && PY_VERSION_HEX < 0x03070000 +static PyObject* __Pyx_PyObject_GenericGetAttr(PyObject* obj, PyObject* attr_name) { + if (unlikely(Py_TYPE(obj)->tp_dictoffset)) { + return PyObject_GenericGetAttr(obj, attr_name); + } + return __Pyx_PyObject_GenericGetAttrNoDict(obj, attr_name); +} +#endif + +/* PyObjectGetAttrStrNoError */ +static void __Pyx_PyObject_GetAttrStr_ClearAttributeError(void) { + __Pyx_PyThreadState_declare + __Pyx_PyThreadState_assign + if (likely(__Pyx_PyErr_ExceptionMatches(PyExc_AttributeError))) + __Pyx_PyErr_Clear(); +} +static CYTHON_INLINE PyObject* __Pyx_PyObject_GetAttrStrNoError(PyObject* obj, PyObject* attr_name) { + PyObject *result; +#if CYTHON_COMPILING_IN_CPYTHON && CYTHON_USE_TYPE_SLOTS && PY_VERSION_HEX >= 0x030700B1 + PyTypeObject* tp = Py_TYPE(obj); + if (likely(tp->tp_getattro == PyObject_GenericGetAttr)) { + return _PyObject_GenericGetAttrWithDict(obj, attr_name, NULL, 1); + } +#endif + result = __Pyx_PyObject_GetAttrStr(obj, attr_name); + if (unlikely(!result)) { + __Pyx_PyObject_GetAttrStr_ClearAttributeError(); + } + return result; +} + +/* SetupReduce */ +static int __Pyx_setup_reduce_is_named(PyObject* meth, PyObject* name) { + int ret; + PyObject *name_attr; + name_attr = __Pyx_PyObject_GetAttrStr(meth, __pyx_n_s_name); + if (likely(name_attr)) { + ret = PyObject_RichCompareBool(name_attr, name, Py_EQ); + } else { + ret = -1; + } + if (unlikely(ret < 0)) { + PyErr_Clear(); + ret = 0; + } + Py_XDECREF(name_attr); + return ret; +} +static int __Pyx_setup_reduce(PyObject* type_obj) { + int ret = 0; + PyObject *object_reduce = NULL; + PyObject *object_reduce_ex = NULL; + PyObject *reduce = NULL; + PyObject *reduce_ex = NULL; + PyObject *reduce_cython = NULL; + PyObject *setstate = NULL; + PyObject *setstate_cython = NULL; +#if CYTHON_USE_PYTYPE_LOOKUP + if (_PyType_Lookup((PyTypeObject*)type_obj, __pyx_n_s_getstate)) goto __PYX_GOOD; +#else + if (PyObject_HasAttr(type_obj, __pyx_n_s_getstate)) goto __PYX_GOOD; +#endif +#if CYTHON_USE_PYTYPE_LOOKUP + object_reduce_ex = _PyType_Lookup(&PyBaseObject_Type, __pyx_n_s_reduce_ex); if (!object_reduce_ex) goto __PYX_BAD; +#else + object_reduce_ex = __Pyx_PyObject_GetAttrStr((PyObject*)&PyBaseObject_Type, __pyx_n_s_reduce_ex); if (!object_reduce_ex) goto __PYX_BAD; +#endif + reduce_ex = __Pyx_PyObject_GetAttrStr(type_obj, __pyx_n_s_reduce_ex); if (unlikely(!reduce_ex)) goto __PYX_BAD; + if (reduce_ex == object_reduce_ex) { +#if CYTHON_USE_PYTYPE_LOOKUP + object_reduce = _PyType_Lookup(&PyBaseObject_Type, __pyx_n_s_reduce); if (!object_reduce) goto __PYX_BAD; +#else + object_reduce = __Pyx_PyObject_GetAttrStr((PyObject*)&PyBaseObject_Type, __pyx_n_s_reduce); if (!object_reduce) goto __PYX_BAD; +#endif + reduce = __Pyx_PyObject_GetAttrStr(type_obj, __pyx_n_s_reduce); if (unlikely(!reduce)) goto __PYX_BAD; + if (reduce == object_reduce || __Pyx_setup_reduce_is_named(reduce, __pyx_n_s_reduce_cython)) { + reduce_cython = __Pyx_PyObject_GetAttrStrNoError(type_obj, __pyx_n_s_reduce_cython); + if (likely(reduce_cython)) { + ret = PyDict_SetItem(((PyTypeObject*)type_obj)->tp_dict, __pyx_n_s_reduce, reduce_cython); if (unlikely(ret < 0)) goto __PYX_BAD; + ret = PyDict_DelItem(((PyTypeObject*)type_obj)->tp_dict, __pyx_n_s_reduce_cython); if (unlikely(ret < 0)) goto __PYX_BAD; + } else if (reduce == object_reduce || PyErr_Occurred()) { + goto __PYX_BAD; + } + setstate = __Pyx_PyObject_GetAttrStr(type_obj, __pyx_n_s_setstate); + if (!setstate) PyErr_Clear(); + if (!setstate || __Pyx_setup_reduce_is_named(setstate, __pyx_n_s_setstate_cython)) { + setstate_cython = __Pyx_PyObject_GetAttrStrNoError(type_obj, __pyx_n_s_setstate_cython); + if (likely(setstate_cython)) { + ret = PyDict_SetItem(((PyTypeObject*)type_obj)->tp_dict, __pyx_n_s_setstate, setstate_cython); if (unlikely(ret < 0)) goto __PYX_BAD; + ret = PyDict_DelItem(((PyTypeObject*)type_obj)->tp_dict, __pyx_n_s_setstate_cython); if (unlikely(ret < 0)) goto __PYX_BAD; + } else if (!setstate || PyErr_Occurred()) { + goto __PYX_BAD; + } + } + PyType_Modified((PyTypeObject*)type_obj); + } + } + goto __PYX_GOOD; +__PYX_BAD: + if (!PyErr_Occurred()) + PyErr_Format(PyExc_RuntimeError, "Unable to initialize pickling for %s", ((PyTypeObject*)type_obj)->tp_name); + ret = -1; +__PYX_GOOD: +#if !CYTHON_USE_PYTYPE_LOOKUP + Py_XDECREF(object_reduce); + Py_XDECREF(object_reduce_ex); +#endif + Py_XDECREF(reduce); + Py_XDECREF(reduce_ex); + Py_XDECREF(reduce_cython); + Py_XDECREF(setstate); + Py_XDECREF(setstate_cython); + return ret; +} + +/* CLineInTraceback */ +#ifndef CYTHON_CLINE_IN_TRACEBACK +static int __Pyx_CLineForTraceback(CYTHON_NCP_UNUSED PyThreadState *tstate, int c_line) { + PyObject *use_cline; + PyObject *ptype, *pvalue, *ptraceback; +#if CYTHON_COMPILING_IN_CPYTHON + PyObject **cython_runtime_dict; +#endif + if (unlikely(!__pyx_cython_runtime)) { + return c_line; + } + __Pyx_ErrFetchInState(tstate, &ptype, &pvalue, &ptraceback); +#if CYTHON_COMPILING_IN_CPYTHON + cython_runtime_dict = _PyObject_GetDictPtr(__pyx_cython_runtime); + if (likely(cython_runtime_dict)) { + __PYX_PY_DICT_LOOKUP_IF_MODIFIED( + use_cline, *cython_runtime_dict, + __Pyx_PyDict_GetItemStr(*cython_runtime_dict, __pyx_n_s_cline_in_traceback)) + } else +#endif + { + PyObject *use_cline_obj = __Pyx_PyObject_GetAttrStr(__pyx_cython_runtime, __pyx_n_s_cline_in_traceback); + if (use_cline_obj) { + use_cline = PyObject_Not(use_cline_obj) ? Py_False : Py_True; + Py_DECREF(use_cline_obj); + } else { + PyErr_Clear(); + use_cline = NULL; + } + } + if (!use_cline) { + c_line = 0; + PyObject_SetAttr(__pyx_cython_runtime, __pyx_n_s_cline_in_traceback, Py_False); + } + else if (use_cline == Py_False || (use_cline != Py_True && PyObject_Not(use_cline) != 0)) { + c_line = 0; + } + __Pyx_ErrRestoreInState(tstate, ptype, pvalue, ptraceback); + return c_line; +} +#endif + +/* CodeObjectCache */ +static int __pyx_bisect_code_objects(__Pyx_CodeObjectCacheEntry* entries, int count, int code_line) { + int start = 0, mid = 0, end = count - 1; + if (end >= 0 && code_line > entries[end].code_line) { + return count; + } + while (start < end) { + mid = start + (end - start) / 2; + if (code_line < entries[mid].code_line) { + end = mid; + } else if (code_line > entries[mid].code_line) { + start = mid + 1; + } else { + return mid; + } + } + if (code_line <= entries[mid].code_line) { + return mid; + } else { + return mid + 1; + } +} +static PyCodeObject *__pyx_find_code_object(int code_line) { + PyCodeObject* code_object; + int pos; + if (unlikely(!code_line) || unlikely(!__pyx_code_cache.entries)) { + return NULL; + } + pos = __pyx_bisect_code_objects(__pyx_code_cache.entries, __pyx_code_cache.count, code_line); + if (unlikely(pos >= __pyx_code_cache.count) || unlikely(__pyx_code_cache.entries[pos].code_line != code_line)) { + return NULL; + } + code_object = __pyx_code_cache.entries[pos].code_object; + Py_INCREF(code_object); + return code_object; +} +static void __pyx_insert_code_object(int code_line, PyCodeObject* code_object) { + int pos, i; + __Pyx_CodeObjectCacheEntry* entries = __pyx_code_cache.entries; + if (unlikely(!code_line)) { + return; + } + if (unlikely(!entries)) { + entries = (__Pyx_CodeObjectCacheEntry*)PyMem_Malloc(64*sizeof(__Pyx_CodeObjectCacheEntry)); + if (likely(entries)) { + __pyx_code_cache.entries = entries; + __pyx_code_cache.max_count = 64; + __pyx_code_cache.count = 1; + entries[0].code_line = code_line; + entries[0].code_object = code_object; + Py_INCREF(code_object); + } + return; + } + pos = __pyx_bisect_code_objects(__pyx_code_cache.entries, __pyx_code_cache.count, code_line); + if ((pos < __pyx_code_cache.count) && unlikely(__pyx_code_cache.entries[pos].code_line == code_line)) { + PyCodeObject* tmp = entries[pos].code_object; + entries[pos].code_object = code_object; + Py_DECREF(tmp); + return; + } + if (__pyx_code_cache.count == __pyx_code_cache.max_count) { + int new_max = __pyx_code_cache.max_count + 64; + entries = (__Pyx_CodeObjectCacheEntry*)PyMem_Realloc( + __pyx_code_cache.entries, ((size_t)new_max) * sizeof(__Pyx_CodeObjectCacheEntry)); + if (unlikely(!entries)) { + return; + } + __pyx_code_cache.entries = entries; + __pyx_code_cache.max_count = new_max; + } + for (i=__pyx_code_cache.count; i>pos; i--) { + entries[i] = entries[i-1]; + } + entries[pos].code_line = code_line; + entries[pos].code_object = code_object; + __pyx_code_cache.count++; + Py_INCREF(code_object); +} + +/* AddTraceback */ +#include "compile.h" +#include "frameobject.h" +#include "traceback.h" +static PyCodeObject* __Pyx_CreateCodeObjectForTraceback( + const char *funcname, int c_line, + int py_line, const char *filename) { + PyCodeObject *py_code = 0; + PyObject *py_srcfile = 0; + PyObject *py_funcname = 0; + #if PY_MAJOR_VERSION < 3 + py_srcfile = PyString_FromString(filename); + #else + py_srcfile = PyUnicode_FromString(filename); + #endif + if (!py_srcfile) goto bad; + if (c_line) { + #if PY_MAJOR_VERSION < 3 + py_funcname = PyString_FromFormat( "%s (%s:%d)", funcname, __pyx_cfilenm, c_line); + #else + py_funcname = PyUnicode_FromFormat( "%s (%s:%d)", funcname, __pyx_cfilenm, c_line); + #endif + } + else { + #if PY_MAJOR_VERSION < 3 + py_funcname = PyString_FromString(funcname); + #else + py_funcname = PyUnicode_FromString(funcname); + #endif + } + if (!py_funcname) goto bad; + py_code = __Pyx_PyCode_New( + 0, + 0, + 0, + 0, + 0, + __pyx_empty_bytes, /*PyObject *code,*/ + __pyx_empty_tuple, /*PyObject *consts,*/ + __pyx_empty_tuple, /*PyObject *names,*/ + __pyx_empty_tuple, /*PyObject *varnames,*/ + __pyx_empty_tuple, /*PyObject *freevars,*/ + __pyx_empty_tuple, /*PyObject *cellvars,*/ + py_srcfile, /*PyObject *filename,*/ + py_funcname, /*PyObject *name,*/ + py_line, + __pyx_empty_bytes /*PyObject *lnotab*/ + ); + Py_DECREF(py_srcfile); + Py_DECREF(py_funcname); + return py_code; +bad: + Py_XDECREF(py_srcfile); + Py_XDECREF(py_funcname); + return NULL; +} +static void __Pyx_AddTraceback(const char *funcname, int c_line, + int py_line, const char *filename) { + PyCodeObject *py_code = 0; + PyFrameObject *py_frame = 0; + PyThreadState *tstate = __Pyx_PyThreadState_Current; + if (c_line) { + c_line = __Pyx_CLineForTraceback(tstate, c_line); + } + py_code = __pyx_find_code_object(c_line ? -c_line : py_line); + if (!py_code) { + py_code = __Pyx_CreateCodeObjectForTraceback( + funcname, c_line, py_line, filename); + if (!py_code) goto bad; + __pyx_insert_code_object(c_line ? -c_line : py_line, py_code); + } + py_frame = PyFrame_New( + tstate, /*PyThreadState *tstate,*/ + py_code, /*PyCodeObject *code,*/ + __pyx_d, /*PyObject *globals,*/ + 0 /*PyObject *locals*/ + ); + if (!py_frame) goto bad; + __Pyx_PyFrame_SetLineNumber(py_frame, py_line); + PyTraceBack_Here(py_frame); +bad: + Py_XDECREF(py_code); + Py_XDECREF(py_frame); +} + +/* CIntFromPyVerify */ +#define __PYX_VERIFY_RETURN_INT(target_type, func_type, func_value)\ + __PYX__VERIFY_RETURN_INT(target_type, func_type, func_value, 0) +#define __PYX_VERIFY_RETURN_INT_EXC(target_type, func_type, func_value)\ + __PYX__VERIFY_RETURN_INT(target_type, func_type, func_value, 1) +#define __PYX__VERIFY_RETURN_INT(target_type, func_type, func_value, exc)\ + {\ + func_type value = func_value;\ + if (sizeof(target_type) < sizeof(func_type)) {\ + if (unlikely(value != (func_type) (target_type) value)) {\ + func_type zero = 0;\ + if (exc && unlikely(value == (func_type)-1 && PyErr_Occurred()))\ + return (target_type) -1;\ + if (is_unsigned && unlikely(value < zero))\ + goto raise_neg_overflow;\ + else\ + goto raise_overflow;\ + }\ + }\ + return (target_type) value;\ + } + +/* CIntFromPy */ +static CYTHON_INLINE long __Pyx_PyInt_As_long(PyObject *x) { +#ifdef __Pyx_HAS_GCC_DIAGNOSTIC +#pragma GCC diagnostic push +#pragma GCC diagnostic ignored "-Wconversion" +#endif + const long neg_one = (long) -1, const_zero = (long) 0; +#ifdef __Pyx_HAS_GCC_DIAGNOSTIC +#pragma GCC diagnostic pop +#endif + const int is_unsigned = neg_one > const_zero; +#if PY_MAJOR_VERSION < 3 + if (likely(PyInt_Check(x))) { + if (sizeof(long) < sizeof(long)) { + __PYX_VERIFY_RETURN_INT(long, long, PyInt_AS_LONG(x)) + } else { + long val = PyInt_AS_LONG(x); + if (is_unsigned && unlikely(val < 0)) { + goto raise_neg_overflow; + } + return (long) val; + } + } else +#endif + if (likely(PyLong_Check(x))) { + if (is_unsigned) { +#if CYTHON_USE_PYLONG_INTERNALS + const digit* digits = ((PyLongObject*)x)->ob_digit; + switch (Py_SIZE(x)) { + case 0: return (long) 0; + case 1: __PYX_VERIFY_RETURN_INT(long, digit, digits[0]) + case 2: + if (8 * sizeof(long) > 1 * PyLong_SHIFT) { + if (8 * sizeof(unsigned long) > 2 * PyLong_SHIFT) { + __PYX_VERIFY_RETURN_INT(long, unsigned long, (((((unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) + } else if (8 * sizeof(long) >= 2 * PyLong_SHIFT) { + return (long) (((((long)digits[1]) << PyLong_SHIFT) | (long)digits[0])); + } + } + break; + case 3: + if (8 * sizeof(long) > 2 * PyLong_SHIFT) { + if (8 * sizeof(unsigned long) > 3 * PyLong_SHIFT) { + __PYX_VERIFY_RETURN_INT(long, unsigned long, (((((((unsigned long)digits[2]) << PyLong_SHIFT) | (unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) + } else if (8 * sizeof(long) >= 3 * PyLong_SHIFT) { + return (long) (((((((long)digits[2]) << PyLong_SHIFT) | (long)digits[1]) << PyLong_SHIFT) | (long)digits[0])); + } + } + break; + case 4: + if (8 * sizeof(long) > 3 * PyLong_SHIFT) { + if (8 * sizeof(unsigned long) > 4 * PyLong_SHIFT) { + __PYX_VERIFY_RETURN_INT(long, unsigned long, (((((((((unsigned long)digits[3]) << PyLong_SHIFT) | (unsigned long)digits[2]) << PyLong_SHIFT) | (unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) + } else if (8 * sizeof(long) >= 4 * PyLong_SHIFT) { + return (long) (((((((((long)digits[3]) << PyLong_SHIFT) | (long)digits[2]) << PyLong_SHIFT) | (long)digits[1]) << PyLong_SHIFT) | (long)digits[0])); + } + } + break; + } +#endif +#if CYTHON_COMPILING_IN_CPYTHON + if (unlikely(Py_SIZE(x) < 0)) { + goto raise_neg_overflow; + } +#else + { + int result = PyObject_RichCompareBool(x, Py_False, Py_LT); + if (unlikely(result < 0)) + return (long) -1; + if (unlikely(result == 1)) + goto raise_neg_overflow; + } +#endif + if (sizeof(long) <= sizeof(unsigned long)) { + __PYX_VERIFY_RETURN_INT_EXC(long, unsigned long, PyLong_AsUnsignedLong(x)) +#ifdef HAVE_LONG_LONG + } else if (sizeof(long) <= sizeof(unsigned PY_LONG_LONG)) { + __PYX_VERIFY_RETURN_INT_EXC(long, unsigned PY_LONG_LONG, PyLong_AsUnsignedLongLong(x)) +#endif + } + } else { +#if CYTHON_USE_PYLONG_INTERNALS + const digit* digits = ((PyLongObject*)x)->ob_digit; + switch (Py_SIZE(x)) { + case 0: return (long) 0; + case -1: __PYX_VERIFY_RETURN_INT(long, sdigit, (sdigit) (-(sdigit)digits[0])) + case 1: __PYX_VERIFY_RETURN_INT(long, digit, +digits[0]) + case -2: + if (8 * sizeof(long) - 1 > 1 * PyLong_SHIFT) { + if (8 * sizeof(unsigned long) > 2 * PyLong_SHIFT) { + __PYX_VERIFY_RETURN_INT(long, long, -(long) (((((unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) + } else if (8 * sizeof(long) - 1 > 2 * PyLong_SHIFT) { + return (long) (((long)-1)*(((((long)digits[1]) << PyLong_SHIFT) | (long)digits[0]))); + } + } + break; + case 2: + if (8 * sizeof(long) > 1 * PyLong_SHIFT) { + if (8 * sizeof(unsigned long) > 2 * PyLong_SHIFT) { + __PYX_VERIFY_RETURN_INT(long, unsigned long, (((((unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) + } else if (8 * sizeof(long) - 1 > 2 * PyLong_SHIFT) { + return (long) ((((((long)digits[1]) << PyLong_SHIFT) | (long)digits[0]))); + } + } + break; + case -3: + if (8 * sizeof(long) - 1 > 2 * PyLong_SHIFT) { + if (8 * sizeof(unsigned long) > 3 * PyLong_SHIFT) { + __PYX_VERIFY_RETURN_INT(long, long, -(long) (((((((unsigned long)digits[2]) << PyLong_SHIFT) | (unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) + } else if (8 * sizeof(long) - 1 > 3 * PyLong_SHIFT) { + return (long) (((long)-1)*(((((((long)digits[2]) << PyLong_SHIFT) | (long)digits[1]) << PyLong_SHIFT) | (long)digits[0]))); + } + } + break; + case 3: + if (8 * sizeof(long) > 2 * PyLong_SHIFT) { + if (8 * sizeof(unsigned long) > 3 * PyLong_SHIFT) { + __PYX_VERIFY_RETURN_INT(long, unsigned long, (((((((unsigned long)digits[2]) << PyLong_SHIFT) | (unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) + } else if (8 * sizeof(long) - 1 > 3 * PyLong_SHIFT) { + return (long) ((((((((long)digits[2]) << PyLong_SHIFT) | (long)digits[1]) << PyLong_SHIFT) | (long)digits[0]))); + } + } + break; + case -4: + if (8 * sizeof(long) - 1 > 3 * PyLong_SHIFT) { + if (8 * sizeof(unsigned long) > 4 * PyLong_SHIFT) { + __PYX_VERIFY_RETURN_INT(long, long, -(long) (((((((((unsigned long)digits[3]) << PyLong_SHIFT) | (unsigned long)digits[2]) << PyLong_SHIFT) | (unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) + } else if (8 * sizeof(long) - 1 > 4 * PyLong_SHIFT) { + return (long) (((long)-1)*(((((((((long)digits[3]) << PyLong_SHIFT) | (long)digits[2]) << PyLong_SHIFT) | (long)digits[1]) << PyLong_SHIFT) | (long)digits[0]))); + } + } + break; + case 4: + if (8 * sizeof(long) > 3 * PyLong_SHIFT) { + if (8 * sizeof(unsigned long) > 4 * PyLong_SHIFT) { + __PYX_VERIFY_RETURN_INT(long, unsigned long, (((((((((unsigned long)digits[3]) << PyLong_SHIFT) | (unsigned long)digits[2]) << PyLong_SHIFT) | (unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) + } else if (8 * sizeof(long) - 1 > 4 * PyLong_SHIFT) { + return (long) ((((((((((long)digits[3]) << PyLong_SHIFT) | (long)digits[2]) << PyLong_SHIFT) | (long)digits[1]) << PyLong_SHIFT) | (long)digits[0]))); + } + } + break; + } +#endif + if (sizeof(long) <= sizeof(long)) { + __PYX_VERIFY_RETURN_INT_EXC(long, long, PyLong_AsLong(x)) +#ifdef HAVE_LONG_LONG + } else if (sizeof(long) <= sizeof(PY_LONG_LONG)) { + __PYX_VERIFY_RETURN_INT_EXC(long, PY_LONG_LONG, PyLong_AsLongLong(x)) +#endif + } + } + { +#if CYTHON_COMPILING_IN_PYPY && !defined(_PyLong_AsByteArray) + PyErr_SetString(PyExc_RuntimeError, + "_PyLong_AsByteArray() not available in PyPy, cannot convert large numbers"); +#else + long val; + PyObject *v = __Pyx_PyNumber_IntOrLong(x); + #if PY_MAJOR_VERSION < 3 + if (likely(v) && !PyLong_Check(v)) { + PyObject *tmp = v; + v = PyNumber_Long(tmp); + Py_DECREF(tmp); + } + #endif + if (likely(v)) { + int one = 1; int is_little = (int)*(unsigned char *)&one; + unsigned char *bytes = (unsigned char *)&val; + int ret = _PyLong_AsByteArray((PyLongObject *)v, + bytes, sizeof(val), + is_little, !is_unsigned); + Py_DECREF(v); + if (likely(!ret)) + return val; + } +#endif + return (long) -1; + } + } else { + long val; + PyObject *tmp = __Pyx_PyNumber_IntOrLong(x); + if (!tmp) return (long) -1; + val = __Pyx_PyInt_As_long(tmp); + Py_DECREF(tmp); + return val; + } +raise_overflow: + PyErr_SetString(PyExc_OverflowError, + "value too large to convert to long"); + return (long) -1; +raise_neg_overflow: + PyErr_SetString(PyExc_OverflowError, + "can't convert negative value to long"); + return (long) -1; +} + +/* CIntToPy */ +static CYTHON_INLINE PyObject* __Pyx_PyInt_From_long(long value) { +#ifdef __Pyx_HAS_GCC_DIAGNOSTIC +#pragma GCC diagnostic push +#pragma GCC diagnostic ignored "-Wconversion" +#endif + const long neg_one = (long) -1, const_zero = (long) 0; +#ifdef __Pyx_HAS_GCC_DIAGNOSTIC +#pragma GCC diagnostic pop +#endif + const int is_unsigned = neg_one > const_zero; + if (is_unsigned) { + if (sizeof(long) < sizeof(long)) { + return PyInt_FromLong((long) value); + } else if (sizeof(long) <= sizeof(unsigned long)) { + return PyLong_FromUnsignedLong((unsigned long) value); +#ifdef HAVE_LONG_LONG + } else if (sizeof(long) <= sizeof(unsigned PY_LONG_LONG)) { + return PyLong_FromUnsignedLongLong((unsigned PY_LONG_LONG) value); +#endif + } + } else { + if (sizeof(long) <= sizeof(long)) { + return PyInt_FromLong((long) value); +#ifdef HAVE_LONG_LONG + } else if (sizeof(long) <= sizeof(PY_LONG_LONG)) { + return PyLong_FromLongLong((PY_LONG_LONG) value); +#endif + } + } + { + int one = 1; int little = (int)*(unsigned char *)&one; + unsigned char *bytes = (unsigned char *)&value; + return _PyLong_FromByteArray(bytes, sizeof(long), + little, !is_unsigned); + } +} + +/* CIntFromPy */ +static CYTHON_INLINE int __Pyx_PyInt_As_int(PyObject *x) { +#ifdef __Pyx_HAS_GCC_DIAGNOSTIC +#pragma GCC diagnostic push +#pragma GCC diagnostic ignored "-Wconversion" +#endif + const int neg_one = (int) -1, const_zero = (int) 0; +#ifdef __Pyx_HAS_GCC_DIAGNOSTIC +#pragma GCC diagnostic pop +#endif + const int is_unsigned = neg_one > const_zero; +#if PY_MAJOR_VERSION < 3 + if (likely(PyInt_Check(x))) { + if (sizeof(int) < sizeof(long)) { + __PYX_VERIFY_RETURN_INT(int, long, PyInt_AS_LONG(x)) + } else { + long val = PyInt_AS_LONG(x); + if (is_unsigned && unlikely(val < 0)) { + goto raise_neg_overflow; + } + return (int) val; + } + } else +#endif + if (likely(PyLong_Check(x))) { + if (is_unsigned) { +#if CYTHON_USE_PYLONG_INTERNALS + const digit* digits = ((PyLongObject*)x)->ob_digit; + switch (Py_SIZE(x)) { + case 0: return (int) 0; + case 1: __PYX_VERIFY_RETURN_INT(int, digit, digits[0]) + case 2: + if (8 * sizeof(int) > 1 * PyLong_SHIFT) { + if (8 * sizeof(unsigned long) > 2 * PyLong_SHIFT) { + __PYX_VERIFY_RETURN_INT(int, unsigned long, (((((unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) + } else if (8 * sizeof(int) >= 2 * PyLong_SHIFT) { + return (int) (((((int)digits[1]) << PyLong_SHIFT) | (int)digits[0])); + } + } + break; + case 3: + if (8 * sizeof(int) > 2 * PyLong_SHIFT) { + if (8 * sizeof(unsigned long) > 3 * PyLong_SHIFT) { + __PYX_VERIFY_RETURN_INT(int, unsigned long, (((((((unsigned long)digits[2]) << PyLong_SHIFT) | (unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) + } else if (8 * sizeof(int) >= 3 * PyLong_SHIFT) { + return (int) (((((((int)digits[2]) << PyLong_SHIFT) | (int)digits[1]) << PyLong_SHIFT) | (int)digits[0])); + } + } + break; + case 4: + if (8 * sizeof(int) > 3 * PyLong_SHIFT) { + if (8 * sizeof(unsigned long) > 4 * PyLong_SHIFT) { + __PYX_VERIFY_RETURN_INT(int, unsigned long, (((((((((unsigned long)digits[3]) << PyLong_SHIFT) | (unsigned long)digits[2]) << PyLong_SHIFT) | (unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) + } else if (8 * sizeof(int) >= 4 * PyLong_SHIFT) { + return (int) (((((((((int)digits[3]) << PyLong_SHIFT) | (int)digits[2]) << PyLong_SHIFT) | (int)digits[1]) << PyLong_SHIFT) | (int)digits[0])); + } + } + break; + } +#endif +#if CYTHON_COMPILING_IN_CPYTHON + if (unlikely(Py_SIZE(x) < 0)) { + goto raise_neg_overflow; + } +#else + { + int result = PyObject_RichCompareBool(x, Py_False, Py_LT); + if (unlikely(result < 0)) + return (int) -1; + if (unlikely(result == 1)) + goto raise_neg_overflow; + } +#endif + if (sizeof(int) <= sizeof(unsigned long)) { + __PYX_VERIFY_RETURN_INT_EXC(int, unsigned long, PyLong_AsUnsignedLong(x)) +#ifdef HAVE_LONG_LONG + } else if (sizeof(int) <= sizeof(unsigned PY_LONG_LONG)) { + __PYX_VERIFY_RETURN_INT_EXC(int, unsigned PY_LONG_LONG, PyLong_AsUnsignedLongLong(x)) +#endif + } + } else { +#if CYTHON_USE_PYLONG_INTERNALS + const digit* digits = ((PyLongObject*)x)->ob_digit; + switch (Py_SIZE(x)) { + case 0: return (int) 0; + case -1: __PYX_VERIFY_RETURN_INT(int, sdigit, (sdigit) (-(sdigit)digits[0])) + case 1: __PYX_VERIFY_RETURN_INT(int, digit, +digits[0]) + case -2: + if (8 * sizeof(int) - 1 > 1 * PyLong_SHIFT) { + if (8 * sizeof(unsigned long) > 2 * PyLong_SHIFT) { + __PYX_VERIFY_RETURN_INT(int, long, -(long) (((((unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) + } else if (8 * sizeof(int) - 1 > 2 * PyLong_SHIFT) { + return (int) (((int)-1)*(((((int)digits[1]) << PyLong_SHIFT) | (int)digits[0]))); + } + } + break; + case 2: + if (8 * sizeof(int) > 1 * PyLong_SHIFT) { + if (8 * sizeof(unsigned long) > 2 * PyLong_SHIFT) { + __PYX_VERIFY_RETURN_INT(int, unsigned long, (((((unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) + } else if (8 * sizeof(int) - 1 > 2 * PyLong_SHIFT) { + return (int) ((((((int)digits[1]) << PyLong_SHIFT) | (int)digits[0]))); + } + } + break; + case -3: + if (8 * sizeof(int) - 1 > 2 * PyLong_SHIFT) { + if (8 * sizeof(unsigned long) > 3 * PyLong_SHIFT) { + __PYX_VERIFY_RETURN_INT(int, long, -(long) (((((((unsigned long)digits[2]) << PyLong_SHIFT) | (unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) + } else if (8 * sizeof(int) - 1 > 3 * PyLong_SHIFT) { + return (int) (((int)-1)*(((((((int)digits[2]) << PyLong_SHIFT) | (int)digits[1]) << PyLong_SHIFT) | (int)digits[0]))); + } + } + break; + case 3: + if (8 * sizeof(int) > 2 * PyLong_SHIFT) { + if (8 * sizeof(unsigned long) > 3 * PyLong_SHIFT) { + __PYX_VERIFY_RETURN_INT(int, unsigned long, (((((((unsigned long)digits[2]) << PyLong_SHIFT) | (unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) + } else if (8 * sizeof(int) - 1 > 3 * PyLong_SHIFT) { + return (int) ((((((((int)digits[2]) << PyLong_SHIFT) | (int)digits[1]) << PyLong_SHIFT) | (int)digits[0]))); + } + } + break; + case -4: + if (8 * sizeof(int) - 1 > 3 * PyLong_SHIFT) { + if (8 * sizeof(unsigned long) > 4 * PyLong_SHIFT) { + __PYX_VERIFY_RETURN_INT(int, long, -(long) (((((((((unsigned long)digits[3]) << PyLong_SHIFT) | (unsigned long)digits[2]) << PyLong_SHIFT) | (unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) + } else if (8 * sizeof(int) - 1 > 4 * PyLong_SHIFT) { + return (int) (((int)-1)*(((((((((int)digits[3]) << PyLong_SHIFT) | (int)digits[2]) << PyLong_SHIFT) | (int)digits[1]) << PyLong_SHIFT) | (int)digits[0]))); + } + } + break; + case 4: + if (8 * sizeof(int) > 3 * PyLong_SHIFT) { + if (8 * sizeof(unsigned long) > 4 * PyLong_SHIFT) { + __PYX_VERIFY_RETURN_INT(int, unsigned long, (((((((((unsigned long)digits[3]) << PyLong_SHIFT) | (unsigned long)digits[2]) << PyLong_SHIFT) | (unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) + } else if (8 * sizeof(int) - 1 > 4 * PyLong_SHIFT) { + return (int) ((((((((((int)digits[3]) << PyLong_SHIFT) | (int)digits[2]) << PyLong_SHIFT) | (int)digits[1]) << PyLong_SHIFT) | (int)digits[0]))); + } + } + break; + } +#endif + if (sizeof(int) <= sizeof(long)) { + __PYX_VERIFY_RETURN_INT_EXC(int, long, PyLong_AsLong(x)) +#ifdef HAVE_LONG_LONG + } else if (sizeof(int) <= sizeof(PY_LONG_LONG)) { + __PYX_VERIFY_RETURN_INT_EXC(int, PY_LONG_LONG, PyLong_AsLongLong(x)) +#endif + } + } + { +#if CYTHON_COMPILING_IN_PYPY && !defined(_PyLong_AsByteArray) + PyErr_SetString(PyExc_RuntimeError, + "_PyLong_AsByteArray() not available in PyPy, cannot convert large numbers"); +#else + int val; + PyObject *v = __Pyx_PyNumber_IntOrLong(x); + #if PY_MAJOR_VERSION < 3 + if (likely(v) && !PyLong_Check(v)) { + PyObject *tmp = v; + v = PyNumber_Long(tmp); + Py_DECREF(tmp); + } + #endif + if (likely(v)) { + int one = 1; int is_little = (int)*(unsigned char *)&one; + unsigned char *bytes = (unsigned char *)&val; + int ret = _PyLong_AsByteArray((PyLongObject *)v, + bytes, sizeof(val), + is_little, !is_unsigned); + Py_DECREF(v); + if (likely(!ret)) + return val; + } +#endif + return (int) -1; + } + } else { + int val; + PyObject *tmp = __Pyx_PyNumber_IntOrLong(x); + if (!tmp) return (int) -1; + val = __Pyx_PyInt_As_int(tmp); + Py_DECREF(tmp); + return val; + } +raise_overflow: + PyErr_SetString(PyExc_OverflowError, + "value too large to convert to int"); + return (int) -1; +raise_neg_overflow: + PyErr_SetString(PyExc_OverflowError, + "can't convert negative value to int"); + return (int) -1; +} + +/* FastTypeChecks */ +#if CYTHON_COMPILING_IN_CPYTHON +static int __Pyx_InBases(PyTypeObject *a, PyTypeObject *b) { + while (a) { + a = a->tp_base; + if (a == b) + return 1; + } + return b == &PyBaseObject_Type; +} +static CYTHON_INLINE int __Pyx_IsSubtype(PyTypeObject *a, PyTypeObject *b) { + PyObject *mro; + if (a == b) return 1; + mro = a->tp_mro; + if (likely(mro)) { + Py_ssize_t i, n; + n = PyTuple_GET_SIZE(mro); + for (i = 0; i < n; i++) { + if (PyTuple_GET_ITEM(mro, i) == (PyObject *)b) + return 1; + } + return 0; + } + return __Pyx_InBases(a, b); +} +#if PY_MAJOR_VERSION == 2 +static int __Pyx_inner_PyErr_GivenExceptionMatches2(PyObject *err, PyObject* exc_type1, PyObject* exc_type2) { + PyObject *exception, *value, *tb; + int res; + __Pyx_PyThreadState_declare + __Pyx_PyThreadState_assign + __Pyx_ErrFetch(&exception, &value, &tb); + res = exc_type1 ? PyObject_IsSubclass(err, exc_type1) : 0; + if (unlikely(res == -1)) { + PyErr_WriteUnraisable(err); + res = 0; + } + if (!res) { + res = PyObject_IsSubclass(err, exc_type2); + if (unlikely(res == -1)) { + PyErr_WriteUnraisable(err); + res = 0; + } + } + __Pyx_ErrRestore(exception, value, tb); + return res; +} +#else +static CYTHON_INLINE int __Pyx_inner_PyErr_GivenExceptionMatches2(PyObject *err, PyObject* exc_type1, PyObject *exc_type2) { + int res = exc_type1 ? __Pyx_IsSubtype((PyTypeObject*)err, (PyTypeObject*)exc_type1) : 0; + if (!res) { + res = __Pyx_IsSubtype((PyTypeObject*)err, (PyTypeObject*)exc_type2); + } + return res; +} +#endif +static int __Pyx_PyErr_GivenExceptionMatchesTuple(PyObject *exc_type, PyObject *tuple) { + Py_ssize_t i, n; + assert(PyExceptionClass_Check(exc_type)); + n = PyTuple_GET_SIZE(tuple); +#if PY_MAJOR_VERSION >= 3 + for (i=0; ip) { + #if PY_MAJOR_VERSION < 3 + if (t->is_unicode) { + *t->p = PyUnicode_DecodeUTF8(t->s, t->n - 1, NULL); + } else if (t->intern) { + *t->p = PyString_InternFromString(t->s); + } else { + *t->p = PyString_FromStringAndSize(t->s, t->n - 1); + } + #else + if (t->is_unicode | t->is_str) { + if (t->intern) { + *t->p = PyUnicode_InternFromString(t->s); + } else if (t->encoding) { + *t->p = PyUnicode_Decode(t->s, t->n - 1, t->encoding, NULL); + } else { + *t->p = PyUnicode_FromStringAndSize(t->s, t->n - 1); + } + } else { + *t->p = PyBytes_FromStringAndSize(t->s, t->n - 1); + } + #endif + if (!*t->p) + return -1; + if (PyObject_Hash(*t->p) == -1) + return -1; + ++t; + } + return 0; +} + +static CYTHON_INLINE PyObject* __Pyx_PyUnicode_FromString(const char* c_str) { + return __Pyx_PyUnicode_FromStringAndSize(c_str, (Py_ssize_t)strlen(c_str)); +} +static CYTHON_INLINE const char* __Pyx_PyObject_AsString(PyObject* o) { + Py_ssize_t ignore; + return __Pyx_PyObject_AsStringAndSize(o, &ignore); +} +#if __PYX_DEFAULT_STRING_ENCODING_IS_ASCII || __PYX_DEFAULT_STRING_ENCODING_IS_DEFAULT +#if !CYTHON_PEP393_ENABLED +static const char* __Pyx_PyUnicode_AsStringAndSize(PyObject* o, Py_ssize_t *length) { + char* defenc_c; + PyObject* defenc = _PyUnicode_AsDefaultEncodedString(o, NULL); + if (!defenc) return NULL; + defenc_c = PyBytes_AS_STRING(defenc); +#if __PYX_DEFAULT_STRING_ENCODING_IS_ASCII + { + char* end = defenc_c + PyBytes_GET_SIZE(defenc); + char* c; + for (c = defenc_c; c < end; c++) { + if ((unsigned char) (*c) >= 128) { + PyUnicode_AsASCIIString(o); + return NULL; + } + } + } +#endif + *length = PyBytes_GET_SIZE(defenc); + return defenc_c; +} +#else +static CYTHON_INLINE const char* __Pyx_PyUnicode_AsStringAndSize(PyObject* o, Py_ssize_t *length) { + if (unlikely(__Pyx_PyUnicode_READY(o) == -1)) return NULL; +#if __PYX_DEFAULT_STRING_ENCODING_IS_ASCII + if (likely(PyUnicode_IS_ASCII(o))) { + *length = PyUnicode_GET_LENGTH(o); + return PyUnicode_AsUTF8(o); + } else { + PyUnicode_AsASCIIString(o); + return NULL; + } +#else + return PyUnicode_AsUTF8AndSize(o, length); +#endif +} +#endif +#endif +static CYTHON_INLINE const char* __Pyx_PyObject_AsStringAndSize(PyObject* o, Py_ssize_t *length) { +#if __PYX_DEFAULT_STRING_ENCODING_IS_ASCII || __PYX_DEFAULT_STRING_ENCODING_IS_DEFAULT + if ( +#if PY_MAJOR_VERSION < 3 && __PYX_DEFAULT_STRING_ENCODING_IS_ASCII + __Pyx_sys_getdefaultencoding_not_ascii && +#endif + PyUnicode_Check(o)) { + return __Pyx_PyUnicode_AsStringAndSize(o, length); + } else +#endif +#if (!CYTHON_COMPILING_IN_PYPY) || (defined(PyByteArray_AS_STRING) && defined(PyByteArray_GET_SIZE)) + if (PyByteArray_Check(o)) { + *length = PyByteArray_GET_SIZE(o); + return PyByteArray_AS_STRING(o); + } else +#endif + { + char* result; + int r = PyBytes_AsStringAndSize(o, &result, length); + if (unlikely(r < 0)) { + return NULL; + } else { + return result; + } + } +} +static CYTHON_INLINE int __Pyx_PyObject_IsTrue(PyObject* x) { + int is_true = x == Py_True; + if (is_true | (x == Py_False) | (x == Py_None)) return is_true; + else return PyObject_IsTrue(x); +} +static CYTHON_INLINE int __Pyx_PyObject_IsTrueAndDecref(PyObject* x) { + int retval; + if (unlikely(!x)) return -1; + retval = __Pyx_PyObject_IsTrue(x); + Py_DECREF(x); + return retval; +} +static PyObject* __Pyx_PyNumber_IntOrLongWrongResultType(PyObject* result, const char* type_name) { +#if PY_MAJOR_VERSION >= 3 + if (PyLong_Check(result)) { + if (PyErr_WarnFormat(PyExc_DeprecationWarning, 1, + "__int__ returned non-int (type %.200s). " + "The ability to return an instance of a strict subclass of int " + "is deprecated, and may be removed in a future version of Python.", + Py_TYPE(result)->tp_name)) { + Py_DECREF(result); + return NULL; + } + return result; + } +#endif + PyErr_Format(PyExc_TypeError, + "__%.4s__ returned non-%.4s (type %.200s)", + type_name, type_name, Py_TYPE(result)->tp_name); + Py_DECREF(result); + return NULL; +} +static CYTHON_INLINE PyObject* __Pyx_PyNumber_IntOrLong(PyObject* x) { +#if CYTHON_USE_TYPE_SLOTS + PyNumberMethods *m; +#endif + const char *name = NULL; + PyObject *res = NULL; +#if PY_MAJOR_VERSION < 3 + if (likely(PyInt_Check(x) || PyLong_Check(x))) +#else + if (likely(PyLong_Check(x))) +#endif + return __Pyx_NewRef(x); +#if CYTHON_USE_TYPE_SLOTS + m = Py_TYPE(x)->tp_as_number; + #if PY_MAJOR_VERSION < 3 + if (m && m->nb_int) { + name = "int"; + res = m->nb_int(x); + } + else if (m && m->nb_long) { + name = "long"; + res = m->nb_long(x); + } + #else + if (likely(m && m->nb_int)) { + name = "int"; + res = m->nb_int(x); + } + #endif +#else + if (!PyBytes_CheckExact(x) && !PyUnicode_CheckExact(x)) { + res = PyNumber_Int(x); + } +#endif + if (likely(res)) { +#if PY_MAJOR_VERSION < 3 + if (unlikely(!PyInt_Check(res) && !PyLong_Check(res))) { +#else + if (unlikely(!PyLong_CheckExact(res))) { +#endif + return __Pyx_PyNumber_IntOrLongWrongResultType(res, name); + } + } + else if (!PyErr_Occurred()) { + PyErr_SetString(PyExc_TypeError, + "an integer is required"); + } + return res; +} +static CYTHON_INLINE Py_ssize_t __Pyx_PyIndex_AsSsize_t(PyObject* b) { + Py_ssize_t ival; + PyObject *x; +#if PY_MAJOR_VERSION < 3 + if (likely(PyInt_CheckExact(b))) { + if (sizeof(Py_ssize_t) >= sizeof(long)) + return PyInt_AS_LONG(b); + else + return PyInt_AsSsize_t(b); + } +#endif + if (likely(PyLong_CheckExact(b))) { + #if CYTHON_USE_PYLONG_INTERNALS + const digit* digits = ((PyLongObject*)b)->ob_digit; + const Py_ssize_t size = Py_SIZE(b); + if (likely(__Pyx_sst_abs(size) <= 1)) { + ival = likely(size) ? digits[0] : 0; + if (size == -1) ival = -ival; + return ival; + } else { + switch (size) { + case 2: + if (8 * sizeof(Py_ssize_t) > 2 * PyLong_SHIFT) { + return (Py_ssize_t) (((((size_t)digits[1]) << PyLong_SHIFT) | (size_t)digits[0])); + } + break; + case -2: + if (8 * sizeof(Py_ssize_t) > 2 * PyLong_SHIFT) { + return -(Py_ssize_t) (((((size_t)digits[1]) << PyLong_SHIFT) | (size_t)digits[0])); + } + break; + case 3: + if (8 * sizeof(Py_ssize_t) > 3 * PyLong_SHIFT) { + return (Py_ssize_t) (((((((size_t)digits[2]) << PyLong_SHIFT) | (size_t)digits[1]) << PyLong_SHIFT) | (size_t)digits[0])); + } + break; + case -3: + if (8 * sizeof(Py_ssize_t) > 3 * PyLong_SHIFT) { + return -(Py_ssize_t) (((((((size_t)digits[2]) << PyLong_SHIFT) | (size_t)digits[1]) << PyLong_SHIFT) | (size_t)digits[0])); + } + break; + case 4: + if (8 * sizeof(Py_ssize_t) > 4 * PyLong_SHIFT) { + return (Py_ssize_t) (((((((((size_t)digits[3]) << PyLong_SHIFT) | (size_t)digits[2]) << PyLong_SHIFT) | (size_t)digits[1]) << PyLong_SHIFT) | (size_t)digits[0])); + } + break; + case -4: + if (8 * sizeof(Py_ssize_t) > 4 * PyLong_SHIFT) { + return -(Py_ssize_t) (((((((((size_t)digits[3]) << PyLong_SHIFT) | (size_t)digits[2]) << PyLong_SHIFT) | (size_t)digits[1]) << PyLong_SHIFT) | (size_t)digits[0])); + } + break; + } + } + #endif + return PyLong_AsSsize_t(b); + } + x = PyNumber_Index(b); + if (!x) return -1; + ival = PyInt_AsSsize_t(x); + Py_DECREF(x); + return ival; +} +static CYTHON_INLINE PyObject * __Pyx_PyBool_FromLong(long b) { + return b ? __Pyx_NewRef(Py_True) : __Pyx_NewRef(Py_False); +} +static CYTHON_INLINE PyObject * __Pyx_PyInt_FromSize_t(size_t ival) { + return PyInt_FromSize_t(ival); +} + + +#endif /* Py_PYTHON_H */ diff --git a/sbsheriff/Lib/site-packages/aiohttp/_helpers.cp310-win_amd64.pyd b/sbsheriff/Lib/site-packages/aiohttp/_helpers.cp310-win_amd64.pyd new file mode 100644 index 0000000000000000000000000000000000000000..5e286d73d104785febf8e1949f1b8e5e5ab2e87d GIT binary patch literal 48640 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 z∓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 aT2VU6M7by*m7;3YiMkO@|G)g!13v*%C>sp` literal 0 HcmV?d00001 diff --git a/sbsheriff/Lib/site-packages/aiohttp/_helpers.pyi b/sbsheriff/Lib/site-packages/aiohttp/_helpers.pyi new file mode 100644 index 0000000..1e35893 --- /dev/null +++ b/sbsheriff/Lib/site-packages/aiohttp/_helpers.pyi @@ -0,0 +1,6 @@ +from typing import Any + +class reify: + def __init__(self, wrapped: Any) -> None: ... + def __get__(self, inst: Any, owner: Any) -> Any: ... + def __set__(self, inst: Any, value: Any) -> None: ... diff --git a/sbsheriff/Lib/site-packages/aiohttp/_helpers.pyx b/sbsheriff/Lib/site-packages/aiohttp/_helpers.pyx new file mode 100644 index 0000000..665f367 --- /dev/null +++ b/sbsheriff/Lib/site-packages/aiohttp/_helpers.pyx @@ -0,0 +1,35 @@ +cdef class reify: + """Use as a class method decorator. It operates almost exactly like + the Python `@property` decorator, but it puts the result of the + method it decorates into the instance dict after the first call, + effectively replacing the function it decorates with an instance + variable. It is, in Python parlance, a data descriptor. + + """ + + cdef object wrapped + cdef object name + + def __init__(self, wrapped): + self.wrapped = wrapped + self.name = wrapped.__name__ + + @property + def __doc__(self): + return self.wrapped.__doc__ + + def __get__(self, inst, owner): + try: + try: + return inst._cache[self.name] + except KeyError: + val = self.wrapped(inst) + inst._cache[self.name] = val + return val + except AttributeError: + if inst is None: + return self + raise + + def __set__(self, inst, value): + raise AttributeError("reified property is read-only") diff --git a/sbsheriff/Lib/site-packages/aiohttp/_http_parser.c b/sbsheriff/Lib/site-packages/aiohttp/_http_parser.c new file mode 100644 index 0000000..640de7b --- /dev/null +++ b/sbsheriff/Lib/site-packages/aiohttp/_http_parser.c @@ -0,0 +1,23880 @@ +/* Generated by Cython 0.29.24 */ + +#ifndef PY_SSIZE_T_CLEAN +#define PY_SSIZE_T_CLEAN +#endif /* PY_SSIZE_T_CLEAN */ +#include "Python.h" +#ifndef Py_PYTHON_H + #error Python headers needed to compile C extensions, please install development version of Python. +#elif PY_VERSION_HEX < 0x02060000 || (0x03000000 <= PY_VERSION_HEX && PY_VERSION_HEX < 0x03030000) + #error Cython requires Python 2.6+ or Python 3.3+. +#else +#define CYTHON_ABI "0_29_24" +#define CYTHON_HEX_VERSION 0x001D18F0 +#define CYTHON_FUTURE_DIVISION 1 +#include +#ifndef offsetof + #define offsetof(type, member) ( (size_t) & ((type*)0) -> member ) +#endif +#if !defined(WIN32) && !defined(MS_WINDOWS) + #ifndef __stdcall + #define __stdcall + #endif + #ifndef __cdecl + #define __cdecl + #endif + #ifndef __fastcall + #define __fastcall + #endif +#endif +#ifndef DL_IMPORT + #define DL_IMPORT(t) t +#endif +#ifndef DL_EXPORT + #define DL_EXPORT(t) t +#endif +#define __PYX_COMMA , +#ifndef HAVE_LONG_LONG + #if PY_VERSION_HEX >= 0x02070000 + #define HAVE_LONG_LONG + #endif +#endif +#ifndef PY_LONG_LONG + #define PY_LONG_LONG LONG_LONG +#endif +#ifndef Py_HUGE_VAL + #define Py_HUGE_VAL HUGE_VAL +#endif +#ifdef PYPY_VERSION + #define CYTHON_COMPILING_IN_PYPY 1 + #define CYTHON_COMPILING_IN_PYSTON 0 + #define CYTHON_COMPILING_IN_CPYTHON 0 + #undef CYTHON_USE_TYPE_SLOTS + #define CYTHON_USE_TYPE_SLOTS 0 + #undef CYTHON_USE_PYTYPE_LOOKUP + #define CYTHON_USE_PYTYPE_LOOKUP 0 + #if PY_VERSION_HEX < 0x03050000 + #undef CYTHON_USE_ASYNC_SLOTS + #define CYTHON_USE_ASYNC_SLOTS 0 + #elif !defined(CYTHON_USE_ASYNC_SLOTS) + #define CYTHON_USE_ASYNC_SLOTS 1 + #endif + #undef CYTHON_USE_PYLIST_INTERNALS + #define CYTHON_USE_PYLIST_INTERNALS 0 + #undef CYTHON_USE_UNICODE_INTERNALS + #define CYTHON_USE_UNICODE_INTERNALS 0 + #undef CYTHON_USE_UNICODE_WRITER + #define CYTHON_USE_UNICODE_WRITER 0 + #undef CYTHON_USE_PYLONG_INTERNALS + #define CYTHON_USE_PYLONG_INTERNALS 0 + #undef CYTHON_AVOID_BORROWED_REFS + #define CYTHON_AVOID_BORROWED_REFS 1 + #undef CYTHON_ASSUME_SAFE_MACROS + #define CYTHON_ASSUME_SAFE_MACROS 0 + #undef CYTHON_UNPACK_METHODS + #define CYTHON_UNPACK_METHODS 0 + #undef CYTHON_FAST_THREAD_STATE + #define CYTHON_FAST_THREAD_STATE 0 + #undef CYTHON_FAST_PYCALL + #define CYTHON_FAST_PYCALL 0 + #undef CYTHON_PEP489_MULTI_PHASE_INIT + #define CYTHON_PEP489_MULTI_PHASE_INIT 0 + #undef CYTHON_USE_TP_FINALIZE + #define CYTHON_USE_TP_FINALIZE 0 + #undef CYTHON_USE_DICT_VERSIONS + #define CYTHON_USE_DICT_VERSIONS 0 + #undef CYTHON_USE_EXC_INFO_STACK + #define CYTHON_USE_EXC_INFO_STACK 0 +#elif defined(PYSTON_VERSION) + #define CYTHON_COMPILING_IN_PYPY 0 + #define CYTHON_COMPILING_IN_PYSTON 1 + #define CYTHON_COMPILING_IN_CPYTHON 0 + #ifndef CYTHON_USE_TYPE_SLOTS + #define CYTHON_USE_TYPE_SLOTS 1 + #endif + #undef CYTHON_USE_PYTYPE_LOOKUP + #define CYTHON_USE_PYTYPE_LOOKUP 0 + #undef CYTHON_USE_ASYNC_SLOTS + #define CYTHON_USE_ASYNC_SLOTS 0 + #undef CYTHON_USE_PYLIST_INTERNALS + #define CYTHON_USE_PYLIST_INTERNALS 0 + #ifndef CYTHON_USE_UNICODE_INTERNALS + #define CYTHON_USE_UNICODE_INTERNALS 1 + #endif + #undef CYTHON_USE_UNICODE_WRITER + #define CYTHON_USE_UNICODE_WRITER 0 + #undef CYTHON_USE_PYLONG_INTERNALS + #define CYTHON_USE_PYLONG_INTERNALS 0 + #ifndef CYTHON_AVOID_BORROWED_REFS + #define CYTHON_AVOID_BORROWED_REFS 0 + #endif + #ifndef CYTHON_ASSUME_SAFE_MACROS + #define CYTHON_ASSUME_SAFE_MACROS 1 + #endif + #ifndef CYTHON_UNPACK_METHODS + #define CYTHON_UNPACK_METHODS 1 + #endif + #undef CYTHON_FAST_THREAD_STATE + #define CYTHON_FAST_THREAD_STATE 0 + #undef CYTHON_FAST_PYCALL + #define CYTHON_FAST_PYCALL 0 + #undef CYTHON_PEP489_MULTI_PHASE_INIT + #define CYTHON_PEP489_MULTI_PHASE_INIT 0 + #undef CYTHON_USE_TP_FINALIZE + #define CYTHON_USE_TP_FINALIZE 0 + #undef CYTHON_USE_DICT_VERSIONS + #define CYTHON_USE_DICT_VERSIONS 0 + #undef CYTHON_USE_EXC_INFO_STACK + #define CYTHON_USE_EXC_INFO_STACK 0 +#else + #define CYTHON_COMPILING_IN_PYPY 0 + #define CYTHON_COMPILING_IN_PYSTON 0 + #define CYTHON_COMPILING_IN_CPYTHON 1 + #ifndef CYTHON_USE_TYPE_SLOTS + #define CYTHON_USE_TYPE_SLOTS 1 + #endif + #if PY_VERSION_HEX < 0x02070000 + #undef CYTHON_USE_PYTYPE_LOOKUP + #define CYTHON_USE_PYTYPE_LOOKUP 0 + #elif !defined(CYTHON_USE_PYTYPE_LOOKUP) + #define CYTHON_USE_PYTYPE_LOOKUP 1 + #endif + #if PY_MAJOR_VERSION < 3 + #undef CYTHON_USE_ASYNC_SLOTS + #define CYTHON_USE_ASYNC_SLOTS 0 + #elif !defined(CYTHON_USE_ASYNC_SLOTS) + #define CYTHON_USE_ASYNC_SLOTS 1 + #endif + #if PY_VERSION_HEX < 0x02070000 + #undef CYTHON_USE_PYLONG_INTERNALS + #define CYTHON_USE_PYLONG_INTERNALS 0 + #elif !defined(CYTHON_USE_PYLONG_INTERNALS) + #define CYTHON_USE_PYLONG_INTERNALS 1 + #endif + #ifndef CYTHON_USE_PYLIST_INTERNALS + #define CYTHON_USE_PYLIST_INTERNALS 1 + #endif + #ifndef CYTHON_USE_UNICODE_INTERNALS + #define CYTHON_USE_UNICODE_INTERNALS 1 + #endif + #if PY_VERSION_HEX < 0x030300F0 + #undef CYTHON_USE_UNICODE_WRITER + #define CYTHON_USE_UNICODE_WRITER 0 + #elif !defined(CYTHON_USE_UNICODE_WRITER) + #define CYTHON_USE_UNICODE_WRITER 1 + #endif + #ifndef CYTHON_AVOID_BORROWED_REFS + #define CYTHON_AVOID_BORROWED_REFS 0 + #endif + #ifndef CYTHON_ASSUME_SAFE_MACROS + #define CYTHON_ASSUME_SAFE_MACROS 1 + #endif + #ifndef CYTHON_UNPACK_METHODS + #define CYTHON_UNPACK_METHODS 1 + #endif + #ifndef CYTHON_FAST_THREAD_STATE + #define CYTHON_FAST_THREAD_STATE 1 + #endif + #ifndef CYTHON_FAST_PYCALL + #define CYTHON_FAST_PYCALL 1 + #endif + #ifndef CYTHON_PEP489_MULTI_PHASE_INIT + #define CYTHON_PEP489_MULTI_PHASE_INIT (PY_VERSION_HEX >= 0x03050000) + #endif + #ifndef CYTHON_USE_TP_FINALIZE + #define CYTHON_USE_TP_FINALIZE (PY_VERSION_HEX >= 0x030400a1) + #endif + #ifndef CYTHON_USE_DICT_VERSIONS + #define CYTHON_USE_DICT_VERSIONS (PY_VERSION_HEX >= 0x030600B1) + #endif + #ifndef CYTHON_USE_EXC_INFO_STACK + #define CYTHON_USE_EXC_INFO_STACK (PY_VERSION_HEX >= 0x030700A3) + #endif +#endif +#if !defined(CYTHON_FAST_PYCCALL) +#define CYTHON_FAST_PYCCALL (CYTHON_FAST_PYCALL && PY_VERSION_HEX >= 0x030600B1) +#endif +#if CYTHON_USE_PYLONG_INTERNALS + #include "longintrepr.h" + #undef SHIFT + #undef BASE + #undef MASK + #ifdef SIZEOF_VOID_P + enum { __pyx_check_sizeof_voidp = 1 / (int)(SIZEOF_VOID_P == sizeof(void*)) }; + #endif +#endif +#ifndef __has_attribute + #define __has_attribute(x) 0 +#endif +#ifndef __has_cpp_attribute + #define __has_cpp_attribute(x) 0 +#endif +#ifndef CYTHON_RESTRICT + #if defined(__GNUC__) + #define CYTHON_RESTRICT __restrict__ + #elif defined(_MSC_VER) && _MSC_VER >= 1400 + #define CYTHON_RESTRICT __restrict + #elif defined (__STDC_VERSION__) && __STDC_VERSION__ >= 199901L + #define CYTHON_RESTRICT restrict + #else + #define CYTHON_RESTRICT + #endif +#endif +#ifndef CYTHON_UNUSED +# if defined(__GNUC__) +# if !(defined(__cplusplus)) || (__GNUC__ > 3 || (__GNUC__ == 3 && __GNUC_MINOR__ >= 4)) +# define CYTHON_UNUSED __attribute__ ((__unused__)) +# else +# define CYTHON_UNUSED +# endif +# elif defined(__ICC) || (defined(__INTEL_COMPILER) && !defined(_MSC_VER)) +# define CYTHON_UNUSED __attribute__ ((__unused__)) +# else +# define CYTHON_UNUSED +# endif +#endif +#ifndef CYTHON_MAYBE_UNUSED_VAR +# if defined(__cplusplus) + template void CYTHON_MAYBE_UNUSED_VAR( const T& ) { } +# else +# define CYTHON_MAYBE_UNUSED_VAR(x) (void)(x) +# endif +#endif +#ifndef CYTHON_NCP_UNUSED +# if CYTHON_COMPILING_IN_CPYTHON +# define CYTHON_NCP_UNUSED +# else +# define CYTHON_NCP_UNUSED CYTHON_UNUSED +# endif +#endif +#define __Pyx_void_to_None(void_result) ((void)(void_result), Py_INCREF(Py_None), Py_None) +#ifdef _MSC_VER + #ifndef _MSC_STDINT_H_ + #if _MSC_VER < 1300 + typedef unsigned char uint8_t; + typedef unsigned int uint32_t; + #else + typedef unsigned __int8 uint8_t; + typedef unsigned __int32 uint32_t; + #endif + #endif +#else + #include +#endif +#ifndef CYTHON_FALLTHROUGH + #if defined(__cplusplus) && __cplusplus >= 201103L + #if __has_cpp_attribute(fallthrough) + #define CYTHON_FALLTHROUGH [[fallthrough]] + #elif __has_cpp_attribute(clang::fallthrough) + #define CYTHON_FALLTHROUGH [[clang::fallthrough]] + #elif __has_cpp_attribute(gnu::fallthrough) + #define CYTHON_FALLTHROUGH [[gnu::fallthrough]] + #endif + #endif + #ifndef CYTHON_FALLTHROUGH + #if __has_attribute(fallthrough) + #define CYTHON_FALLTHROUGH __attribute__((fallthrough)) + #else + #define CYTHON_FALLTHROUGH + #endif + #endif + #if defined(__clang__ ) && defined(__apple_build_version__) + #if __apple_build_version__ < 7000000 + #undef CYTHON_FALLTHROUGH + #define CYTHON_FALLTHROUGH + #endif + #endif +#endif + +#ifndef CYTHON_INLINE + #if defined(__clang__) + #define CYTHON_INLINE __inline__ __attribute__ ((__unused__)) + #elif defined(__GNUC__) + #define CYTHON_INLINE __inline__ + #elif defined(_MSC_VER) + #define CYTHON_INLINE __inline + #elif defined (__STDC_VERSION__) && __STDC_VERSION__ >= 199901L + #define CYTHON_INLINE inline + #else + #define CYTHON_INLINE + #endif +#endif + +#if CYTHON_COMPILING_IN_PYPY && PY_VERSION_HEX < 0x02070600 && !defined(Py_OptimizeFlag) + #define Py_OptimizeFlag 0 +#endif +#define __PYX_BUILD_PY_SSIZE_T "n" +#define CYTHON_FORMAT_SSIZE_T "z" +#if PY_MAJOR_VERSION < 3 + #define __Pyx_BUILTIN_MODULE_NAME "__builtin__" + #define __Pyx_PyCode_New(a, k, l, s, f, code, c, n, v, fv, cell, fn, name, fline, lnos)\ + PyCode_New(a+k, l, s, f, code, c, n, v, fv, cell, fn, name, fline, lnos) + #define __Pyx_DefaultClassType PyClass_Type +#else + #define __Pyx_BUILTIN_MODULE_NAME "builtins" +#if PY_VERSION_HEX >= 0x030800A4 && PY_VERSION_HEX < 0x030800B2 + #define __Pyx_PyCode_New(a, k, l, s, f, code, c, n, v, fv, cell, fn, name, fline, lnos)\ + PyCode_New(a, 0, k, l, s, f, code, c, n, v, fv, cell, fn, name, fline, lnos) +#else + #define __Pyx_PyCode_New(a, k, l, s, f, code, c, n, v, fv, cell, fn, name, fline, lnos)\ + PyCode_New(a, k, l, s, f, code, c, n, v, fv, cell, fn, name, fline, lnos) +#endif + #define __Pyx_DefaultClassType PyType_Type +#endif +#ifndef Py_TPFLAGS_CHECKTYPES + #define Py_TPFLAGS_CHECKTYPES 0 +#endif +#ifndef Py_TPFLAGS_HAVE_INDEX + #define Py_TPFLAGS_HAVE_INDEX 0 +#endif +#ifndef Py_TPFLAGS_HAVE_NEWBUFFER + #define Py_TPFLAGS_HAVE_NEWBUFFER 0 +#endif +#ifndef Py_TPFLAGS_HAVE_FINALIZE + #define Py_TPFLAGS_HAVE_FINALIZE 0 +#endif +#ifndef METH_STACKLESS + #define METH_STACKLESS 0 +#endif +#if PY_VERSION_HEX <= 0x030700A3 || !defined(METH_FASTCALL) + #ifndef METH_FASTCALL + #define METH_FASTCALL 0x80 + #endif + typedef PyObject *(*__Pyx_PyCFunctionFast) (PyObject *self, PyObject *const *args, Py_ssize_t nargs); + typedef PyObject *(*__Pyx_PyCFunctionFastWithKeywords) (PyObject *self, PyObject *const *args, + Py_ssize_t nargs, PyObject *kwnames); +#else + #define __Pyx_PyCFunctionFast _PyCFunctionFast + #define __Pyx_PyCFunctionFastWithKeywords _PyCFunctionFastWithKeywords +#endif +#if CYTHON_FAST_PYCCALL +#define __Pyx_PyFastCFunction_Check(func)\ + ((PyCFunction_Check(func) && (METH_FASTCALL == (PyCFunction_GET_FLAGS(func) & ~(METH_CLASS | METH_STATIC | METH_COEXIST | METH_KEYWORDS | METH_STACKLESS))))) +#else +#define __Pyx_PyFastCFunction_Check(func) 0 +#endif +#if CYTHON_COMPILING_IN_PYPY && !defined(PyObject_Malloc) + #define PyObject_Malloc(s) PyMem_Malloc(s) + #define PyObject_Free(p) PyMem_Free(p) + #define PyObject_Realloc(p) PyMem_Realloc(p) +#endif +#if CYTHON_COMPILING_IN_CPYTHON && PY_VERSION_HEX < 0x030400A1 + #define PyMem_RawMalloc(n) PyMem_Malloc(n) + #define PyMem_RawRealloc(p, n) PyMem_Realloc(p, n) + #define PyMem_RawFree(p) PyMem_Free(p) +#endif +#if CYTHON_COMPILING_IN_PYSTON + #define __Pyx_PyCode_HasFreeVars(co) PyCode_HasFreeVars(co) + #define __Pyx_PyFrame_SetLineNumber(frame, lineno) PyFrame_SetLineNumber(frame, lineno) +#else + #define __Pyx_PyCode_HasFreeVars(co) (PyCode_GetNumFree(co) > 0) + #define __Pyx_PyFrame_SetLineNumber(frame, lineno) (frame)->f_lineno = (lineno) +#endif +#if !CYTHON_FAST_THREAD_STATE || PY_VERSION_HEX < 0x02070000 + #define __Pyx_PyThreadState_Current PyThreadState_GET() +#elif PY_VERSION_HEX >= 0x03060000 + #define __Pyx_PyThreadState_Current _PyThreadState_UncheckedGet() +#elif PY_VERSION_HEX >= 0x03000000 + #define __Pyx_PyThreadState_Current PyThreadState_GET() +#else + #define __Pyx_PyThreadState_Current _PyThreadState_Current +#endif +#if PY_VERSION_HEX < 0x030700A2 && !defined(PyThread_tss_create) && !defined(Py_tss_NEEDS_INIT) +#include "pythread.h" +#define Py_tss_NEEDS_INIT 0 +typedef int Py_tss_t; +static CYTHON_INLINE int PyThread_tss_create(Py_tss_t *key) { + *key = PyThread_create_key(); + return 0; +} +static CYTHON_INLINE Py_tss_t * PyThread_tss_alloc(void) { + Py_tss_t *key = (Py_tss_t *)PyObject_Malloc(sizeof(Py_tss_t)); + *key = Py_tss_NEEDS_INIT; + return key; +} +static CYTHON_INLINE void PyThread_tss_free(Py_tss_t *key) { + PyObject_Free(key); +} +static CYTHON_INLINE int PyThread_tss_is_created(Py_tss_t *key) { + return *key != Py_tss_NEEDS_INIT; +} +static CYTHON_INLINE void PyThread_tss_delete(Py_tss_t *key) { + PyThread_delete_key(*key); + *key = Py_tss_NEEDS_INIT; +} +static CYTHON_INLINE int PyThread_tss_set(Py_tss_t *key, void *value) { + return PyThread_set_key_value(*key, value); +} +static CYTHON_INLINE void * PyThread_tss_get(Py_tss_t *key) { + return PyThread_get_key_value(*key); +} +#endif +#if CYTHON_COMPILING_IN_CPYTHON || defined(_PyDict_NewPresized) +#define __Pyx_PyDict_NewPresized(n) ((n <= 8) ? PyDict_New() : _PyDict_NewPresized(n)) +#else +#define __Pyx_PyDict_NewPresized(n) PyDict_New() +#endif +#if PY_MAJOR_VERSION >= 3 || CYTHON_FUTURE_DIVISION + #define __Pyx_PyNumber_Divide(x,y) PyNumber_TrueDivide(x,y) + #define __Pyx_PyNumber_InPlaceDivide(x,y) PyNumber_InPlaceTrueDivide(x,y) +#else + #define __Pyx_PyNumber_Divide(x,y) PyNumber_Divide(x,y) + #define __Pyx_PyNumber_InPlaceDivide(x,y) PyNumber_InPlaceDivide(x,y) +#endif +#if CYTHON_COMPILING_IN_CPYTHON && PY_VERSION_HEX >= 0x030500A1 && CYTHON_USE_UNICODE_INTERNALS +#define __Pyx_PyDict_GetItemStr(dict, name) _PyDict_GetItem_KnownHash(dict, name, ((PyASCIIObject *) name)->hash) +#else +#define __Pyx_PyDict_GetItemStr(dict, name) PyDict_GetItem(dict, name) +#endif +#if PY_VERSION_HEX > 0x03030000 && defined(PyUnicode_KIND) + #define CYTHON_PEP393_ENABLED 1 + #if defined(PyUnicode_IS_READY) + #define __Pyx_PyUnicode_READY(op) (likely(PyUnicode_IS_READY(op)) ?\ + 0 : _PyUnicode_Ready((PyObject *)(op))) + #else + #define __Pyx_PyUnicode_READY(op) (0) + #endif + #define __Pyx_PyUnicode_GET_LENGTH(u) PyUnicode_GET_LENGTH(u) + #define __Pyx_PyUnicode_READ_CHAR(u, i) PyUnicode_READ_CHAR(u, i) + #define __Pyx_PyUnicode_MAX_CHAR_VALUE(u) PyUnicode_MAX_CHAR_VALUE(u) + #define __Pyx_PyUnicode_KIND(u) PyUnicode_KIND(u) + #define __Pyx_PyUnicode_DATA(u) PyUnicode_DATA(u) + #define __Pyx_PyUnicode_READ(k, d, i) PyUnicode_READ(k, d, i) + #define __Pyx_PyUnicode_WRITE(k, d, i, ch) PyUnicode_WRITE(k, d, i, ch) + #if defined(PyUnicode_IS_READY) && defined(PyUnicode_GET_SIZE) + #if CYTHON_COMPILING_IN_CPYTHON && PY_VERSION_HEX >= 0x03090000 + #define __Pyx_PyUnicode_IS_TRUE(u) (0 != (likely(PyUnicode_IS_READY(u)) ? PyUnicode_GET_LENGTH(u) : ((PyCompactUnicodeObject *)(u))->wstr_length)) + #else + #define __Pyx_PyUnicode_IS_TRUE(u) (0 != (likely(PyUnicode_IS_READY(u)) ? PyUnicode_GET_LENGTH(u) : PyUnicode_GET_SIZE(u))) + #endif + #else + #define __Pyx_PyUnicode_IS_TRUE(u) (0 != PyUnicode_GET_LENGTH(u)) + #endif +#else + #define CYTHON_PEP393_ENABLED 0 + #define PyUnicode_1BYTE_KIND 1 + #define PyUnicode_2BYTE_KIND 2 + #define PyUnicode_4BYTE_KIND 4 + #define __Pyx_PyUnicode_READY(op) (0) + #define __Pyx_PyUnicode_GET_LENGTH(u) PyUnicode_GET_SIZE(u) + #define __Pyx_PyUnicode_READ_CHAR(u, i) ((Py_UCS4)(PyUnicode_AS_UNICODE(u)[i])) + #define __Pyx_PyUnicode_MAX_CHAR_VALUE(u) ((sizeof(Py_UNICODE) == 2) ? 65535 : 1114111) + #define __Pyx_PyUnicode_KIND(u) (sizeof(Py_UNICODE)) + #define __Pyx_PyUnicode_DATA(u) ((void*)PyUnicode_AS_UNICODE(u)) + #define __Pyx_PyUnicode_READ(k, d, i) ((void)(k), (Py_UCS4)(((Py_UNICODE*)d)[i])) + #define __Pyx_PyUnicode_WRITE(k, d, i, ch) (((void)(k)), ((Py_UNICODE*)d)[i] = ch) + #define __Pyx_PyUnicode_IS_TRUE(u) (0 != PyUnicode_GET_SIZE(u)) +#endif +#if CYTHON_COMPILING_IN_PYPY + #define __Pyx_PyUnicode_Concat(a, b) PyNumber_Add(a, b) + #define __Pyx_PyUnicode_ConcatSafe(a, b) PyNumber_Add(a, b) +#else + #define __Pyx_PyUnicode_Concat(a, b) PyUnicode_Concat(a, b) + #define __Pyx_PyUnicode_ConcatSafe(a, b) ((unlikely((a) == Py_None) || unlikely((b) == Py_None)) ?\ + PyNumber_Add(a, b) : __Pyx_PyUnicode_Concat(a, b)) +#endif +#if CYTHON_COMPILING_IN_PYPY && !defined(PyUnicode_Contains) + #define PyUnicode_Contains(u, s) PySequence_Contains(u, s) +#endif +#if CYTHON_COMPILING_IN_PYPY && !defined(PyByteArray_Check) + #define PyByteArray_Check(obj) PyObject_TypeCheck(obj, &PyByteArray_Type) +#endif +#if CYTHON_COMPILING_IN_PYPY && !defined(PyObject_Format) + #define PyObject_Format(obj, fmt) PyObject_CallMethod(obj, "__format__", "O", fmt) +#endif +#define __Pyx_PyString_FormatSafe(a, b) ((unlikely((a) == Py_None || (PyString_Check(b) && !PyString_CheckExact(b)))) ? PyNumber_Remainder(a, b) : __Pyx_PyString_Format(a, b)) +#define __Pyx_PyUnicode_FormatSafe(a, b) ((unlikely((a) == Py_None || (PyUnicode_Check(b) && !PyUnicode_CheckExact(b)))) ? PyNumber_Remainder(a, b) : PyUnicode_Format(a, b)) +#if PY_MAJOR_VERSION >= 3 + #define __Pyx_PyString_Format(a, b) PyUnicode_Format(a, b) +#else + #define __Pyx_PyString_Format(a, b) PyString_Format(a, b) +#endif +#if PY_MAJOR_VERSION < 3 && !defined(PyObject_ASCII) + #define PyObject_ASCII(o) PyObject_Repr(o) +#endif +#if PY_MAJOR_VERSION >= 3 + #define PyBaseString_Type PyUnicode_Type + #define PyStringObject PyUnicodeObject + #define PyString_Type PyUnicode_Type + #define PyString_Check PyUnicode_Check + #define PyString_CheckExact PyUnicode_CheckExact +#ifndef PyObject_Unicode + #define PyObject_Unicode PyObject_Str +#endif +#endif +#if PY_MAJOR_VERSION >= 3 + #define __Pyx_PyBaseString_Check(obj) PyUnicode_Check(obj) + #define __Pyx_PyBaseString_CheckExact(obj) PyUnicode_CheckExact(obj) +#else + #define __Pyx_PyBaseString_Check(obj) (PyString_Check(obj) || PyUnicode_Check(obj)) + #define __Pyx_PyBaseString_CheckExact(obj) (PyString_CheckExact(obj) || PyUnicode_CheckExact(obj)) +#endif +#ifndef PySet_CheckExact + #define PySet_CheckExact(obj) (Py_TYPE(obj) == &PySet_Type) +#endif +#if PY_VERSION_HEX >= 0x030900A4 + #define __Pyx_SET_REFCNT(obj, refcnt) Py_SET_REFCNT(obj, refcnt) + #define __Pyx_SET_SIZE(obj, size) Py_SET_SIZE(obj, size) +#else + #define __Pyx_SET_REFCNT(obj, refcnt) Py_REFCNT(obj) = (refcnt) + #define __Pyx_SET_SIZE(obj, size) Py_SIZE(obj) = (size) +#endif +#if CYTHON_ASSUME_SAFE_MACROS + #define __Pyx_PySequence_SIZE(seq) Py_SIZE(seq) +#else + #define __Pyx_PySequence_SIZE(seq) PySequence_Size(seq) +#endif +#if PY_MAJOR_VERSION >= 3 + #define PyIntObject PyLongObject + #define PyInt_Type PyLong_Type + #define PyInt_Check(op) PyLong_Check(op) + #define PyInt_CheckExact(op) PyLong_CheckExact(op) + #define PyInt_FromString PyLong_FromString + #define PyInt_FromUnicode PyLong_FromUnicode + #define PyInt_FromLong PyLong_FromLong + #define PyInt_FromSize_t PyLong_FromSize_t + #define PyInt_FromSsize_t PyLong_FromSsize_t + #define PyInt_AsLong PyLong_AsLong + #define PyInt_AS_LONG PyLong_AS_LONG + #define PyInt_AsSsize_t PyLong_AsSsize_t + #define PyInt_AsUnsignedLongMask PyLong_AsUnsignedLongMask + #define PyInt_AsUnsignedLongLongMask PyLong_AsUnsignedLongLongMask + #define PyNumber_Int PyNumber_Long +#endif +#if PY_MAJOR_VERSION >= 3 + #define PyBoolObject PyLongObject +#endif +#if PY_MAJOR_VERSION >= 3 && CYTHON_COMPILING_IN_PYPY + #ifndef PyUnicode_InternFromString + #define PyUnicode_InternFromString(s) PyUnicode_FromString(s) + #endif +#endif +#if PY_VERSION_HEX < 0x030200A4 + typedef long Py_hash_t; + #define __Pyx_PyInt_FromHash_t PyInt_FromLong + #define __Pyx_PyInt_AsHash_t PyInt_AsLong +#else + #define __Pyx_PyInt_FromHash_t PyInt_FromSsize_t + #define __Pyx_PyInt_AsHash_t PyInt_AsSsize_t +#endif +#if PY_MAJOR_VERSION >= 3 + #define __Pyx_PyMethod_New(func, self, klass) ((self) ? ((void)(klass), PyMethod_New(func, self)) : __Pyx_NewRef(func)) +#else + #define __Pyx_PyMethod_New(func, self, klass) PyMethod_New(func, self, klass) +#endif +#if CYTHON_USE_ASYNC_SLOTS + #if PY_VERSION_HEX >= 0x030500B1 + #define __Pyx_PyAsyncMethodsStruct PyAsyncMethods + #define __Pyx_PyType_AsAsync(obj) (Py_TYPE(obj)->tp_as_async) + #else + #define __Pyx_PyType_AsAsync(obj) ((__Pyx_PyAsyncMethodsStruct*) (Py_TYPE(obj)->tp_reserved)) + #endif +#else + #define __Pyx_PyType_AsAsync(obj) NULL +#endif +#ifndef __Pyx_PyAsyncMethodsStruct + typedef struct { + unaryfunc am_await; + unaryfunc am_aiter; + unaryfunc am_anext; + } __Pyx_PyAsyncMethodsStruct; +#endif + +#if defined(WIN32) || defined(MS_WINDOWS) + #define _USE_MATH_DEFINES +#endif +#include +#ifdef NAN +#define __PYX_NAN() ((float) NAN) +#else +static CYTHON_INLINE float __PYX_NAN() { + float value; + memset(&value, 0xFF, sizeof(value)); + return value; +} +#endif +#if defined(__CYGWIN__) && defined(_LDBL_EQ_DBL) +#define __Pyx_truncl trunc +#else +#define __Pyx_truncl truncl +#endif + +#define __PYX_MARK_ERR_POS(f_index, lineno) \ + { __pyx_filename = __pyx_f[f_index]; (void)__pyx_filename; __pyx_lineno = lineno; (void)__pyx_lineno; __pyx_clineno = __LINE__; (void)__pyx_clineno; } +#define __PYX_ERR(f_index, lineno, Ln_error) \ + { __PYX_MARK_ERR_POS(f_index, lineno) goto Ln_error; } + +#ifndef __PYX_EXTERN_C + #ifdef __cplusplus + #define __PYX_EXTERN_C extern "C" + #else + #define __PYX_EXTERN_C extern + #endif +#endif + +#define __PYX_HAVE__aiohttp___http_parser +#define __PYX_HAVE_API__aiohttp___http_parser +/* Early includes */ +#include +#include +#include "pythread.h" +#include +#include +#include "../vendor/llhttp/build/llhttp.h" +#include "_find_header.h" +#ifdef _OPENMP +#include +#endif /* _OPENMP */ + +#if defined(PYREX_WITHOUT_ASSERTIONS) && !defined(CYTHON_WITHOUT_ASSERTIONS) +#define CYTHON_WITHOUT_ASSERTIONS +#endif + +typedef struct {PyObject **p; const char *s; const Py_ssize_t n; const char* encoding; + const char is_unicode; const char is_str; const char intern; } __Pyx_StringTabEntry; + +#define __PYX_DEFAULT_STRING_ENCODING_IS_ASCII 0 +#define __PYX_DEFAULT_STRING_ENCODING_IS_UTF8 0 +#define __PYX_DEFAULT_STRING_ENCODING_IS_DEFAULT (PY_MAJOR_VERSION >= 3 && __PYX_DEFAULT_STRING_ENCODING_IS_UTF8) +#define __PYX_DEFAULT_STRING_ENCODING "" +#define __Pyx_PyObject_FromString __Pyx_PyBytes_FromString +#define __Pyx_PyObject_FromStringAndSize __Pyx_PyBytes_FromStringAndSize +#define __Pyx_uchar_cast(c) ((unsigned char)c) +#define __Pyx_long_cast(x) ((long)x) +#define __Pyx_fits_Py_ssize_t(v, type, is_signed) (\ + (sizeof(type) < sizeof(Py_ssize_t)) ||\ + (sizeof(type) > sizeof(Py_ssize_t) &&\ + likely(v < (type)PY_SSIZE_T_MAX ||\ + v == (type)PY_SSIZE_T_MAX) &&\ + (!is_signed || likely(v > (type)PY_SSIZE_T_MIN ||\ + v == (type)PY_SSIZE_T_MIN))) ||\ + (sizeof(type) == sizeof(Py_ssize_t) &&\ + (is_signed || likely(v < (type)PY_SSIZE_T_MAX ||\ + v == (type)PY_SSIZE_T_MAX))) ) +static CYTHON_INLINE int __Pyx_is_valid_index(Py_ssize_t i, Py_ssize_t limit) { + return (size_t) i < (size_t) limit; +} +#if defined (__cplusplus) && __cplusplus >= 201103L + #include + #define __Pyx_sst_abs(value) std::abs(value) +#elif SIZEOF_INT >= SIZEOF_SIZE_T + #define __Pyx_sst_abs(value) abs(value) +#elif SIZEOF_LONG >= SIZEOF_SIZE_T + #define __Pyx_sst_abs(value) labs(value) +#elif defined (_MSC_VER) + #define __Pyx_sst_abs(value) ((Py_ssize_t)_abs64(value)) +#elif defined (__STDC_VERSION__) && __STDC_VERSION__ >= 199901L + #define __Pyx_sst_abs(value) llabs(value) +#elif defined (__GNUC__) + #define __Pyx_sst_abs(value) __builtin_llabs(value) +#else + #define __Pyx_sst_abs(value) ((value<0) ? -value : value) +#endif +static CYTHON_INLINE const char* __Pyx_PyObject_AsString(PyObject*); +static CYTHON_INLINE const char* __Pyx_PyObject_AsStringAndSize(PyObject*, Py_ssize_t* length); +#define __Pyx_PyByteArray_FromString(s) PyByteArray_FromStringAndSize((const char*)s, strlen((const char*)s)) +#define __Pyx_PyByteArray_FromStringAndSize(s, l) PyByteArray_FromStringAndSize((const char*)s, l) +#define __Pyx_PyBytes_FromString PyBytes_FromString +#define __Pyx_PyBytes_FromStringAndSize PyBytes_FromStringAndSize +static CYTHON_INLINE PyObject* __Pyx_PyUnicode_FromString(const char*); +#if PY_MAJOR_VERSION < 3 + #define __Pyx_PyStr_FromString __Pyx_PyBytes_FromString + #define __Pyx_PyStr_FromStringAndSize __Pyx_PyBytes_FromStringAndSize +#else + #define __Pyx_PyStr_FromString __Pyx_PyUnicode_FromString + #define __Pyx_PyStr_FromStringAndSize __Pyx_PyUnicode_FromStringAndSize +#endif +#define __Pyx_PyBytes_AsWritableString(s) ((char*) PyBytes_AS_STRING(s)) +#define __Pyx_PyBytes_AsWritableSString(s) ((signed char*) PyBytes_AS_STRING(s)) +#define __Pyx_PyBytes_AsWritableUString(s) ((unsigned char*) PyBytes_AS_STRING(s)) +#define __Pyx_PyBytes_AsString(s) ((const char*) PyBytes_AS_STRING(s)) +#define __Pyx_PyBytes_AsSString(s) ((const signed char*) PyBytes_AS_STRING(s)) +#define __Pyx_PyBytes_AsUString(s) ((const unsigned char*) PyBytes_AS_STRING(s)) +#define __Pyx_PyObject_AsWritableString(s) ((char*) __Pyx_PyObject_AsString(s)) +#define __Pyx_PyObject_AsWritableSString(s) ((signed char*) __Pyx_PyObject_AsString(s)) +#define __Pyx_PyObject_AsWritableUString(s) ((unsigned char*) __Pyx_PyObject_AsString(s)) +#define __Pyx_PyObject_AsSString(s) ((const signed char*) __Pyx_PyObject_AsString(s)) +#define __Pyx_PyObject_AsUString(s) ((const unsigned char*) __Pyx_PyObject_AsString(s)) +#define __Pyx_PyObject_FromCString(s) __Pyx_PyObject_FromString((const char*)s) +#define __Pyx_PyBytes_FromCString(s) __Pyx_PyBytes_FromString((const char*)s) +#define __Pyx_PyByteArray_FromCString(s) __Pyx_PyByteArray_FromString((const char*)s) +#define __Pyx_PyStr_FromCString(s) __Pyx_PyStr_FromString((const char*)s) +#define __Pyx_PyUnicode_FromCString(s) __Pyx_PyUnicode_FromString((const char*)s) +static CYTHON_INLINE size_t __Pyx_Py_UNICODE_strlen(const Py_UNICODE *u) { + const Py_UNICODE *u_end = u; + while (*u_end++) ; + return (size_t)(u_end - u - 1); +} +#define __Pyx_PyUnicode_FromUnicode(u) PyUnicode_FromUnicode(u, __Pyx_Py_UNICODE_strlen(u)) +#define __Pyx_PyUnicode_FromUnicodeAndLength PyUnicode_FromUnicode +#define __Pyx_PyUnicode_AsUnicode PyUnicode_AsUnicode +#define __Pyx_NewRef(obj) (Py_INCREF(obj), obj) +#define __Pyx_Owned_Py_None(b) __Pyx_NewRef(Py_None) +static CYTHON_INLINE PyObject * __Pyx_PyBool_FromLong(long b); +static CYTHON_INLINE int __Pyx_PyObject_IsTrue(PyObject*); +static CYTHON_INLINE int __Pyx_PyObject_IsTrueAndDecref(PyObject*); +static CYTHON_INLINE PyObject* __Pyx_PyNumber_IntOrLong(PyObject* x); +#define __Pyx_PySequence_Tuple(obj)\ + (likely(PyTuple_CheckExact(obj)) ? __Pyx_NewRef(obj) : PySequence_Tuple(obj)) +static CYTHON_INLINE Py_ssize_t __Pyx_PyIndex_AsSsize_t(PyObject*); +static CYTHON_INLINE PyObject * __Pyx_PyInt_FromSize_t(size_t); +#if CYTHON_ASSUME_SAFE_MACROS +#define __pyx_PyFloat_AsDouble(x) (PyFloat_CheckExact(x) ? PyFloat_AS_DOUBLE(x) : PyFloat_AsDouble(x)) +#else +#define __pyx_PyFloat_AsDouble(x) PyFloat_AsDouble(x) +#endif +#define __pyx_PyFloat_AsFloat(x) ((float) __pyx_PyFloat_AsDouble(x)) +#if PY_MAJOR_VERSION >= 3 +#define __Pyx_PyNumber_Int(x) (PyLong_CheckExact(x) ? __Pyx_NewRef(x) : PyNumber_Long(x)) +#else +#define __Pyx_PyNumber_Int(x) (PyInt_CheckExact(x) ? __Pyx_NewRef(x) : PyNumber_Int(x)) +#endif +#define __Pyx_PyNumber_Float(x) (PyFloat_CheckExact(x) ? __Pyx_NewRef(x) : PyNumber_Float(x)) +#if PY_MAJOR_VERSION < 3 && __PYX_DEFAULT_STRING_ENCODING_IS_ASCII +static int __Pyx_sys_getdefaultencoding_not_ascii; +static int __Pyx_init_sys_getdefaultencoding_params(void) { + PyObject* sys; + PyObject* default_encoding = NULL; + PyObject* ascii_chars_u = NULL; + PyObject* ascii_chars_b = NULL; + const char* default_encoding_c; + sys = PyImport_ImportModule("sys"); + if (!sys) goto bad; + default_encoding = PyObject_CallMethod(sys, (char*) "getdefaultencoding", NULL); + Py_DECREF(sys); + if (!default_encoding) goto bad; + default_encoding_c = PyBytes_AsString(default_encoding); + if (!default_encoding_c) goto bad; + if (strcmp(default_encoding_c, "ascii") == 0) { + __Pyx_sys_getdefaultencoding_not_ascii = 0; + } else { + char ascii_chars[128]; + int c; + for (c = 0; c < 128; c++) { + ascii_chars[c] = c; + } + __Pyx_sys_getdefaultencoding_not_ascii = 1; + ascii_chars_u = PyUnicode_DecodeASCII(ascii_chars, 128, NULL); + if (!ascii_chars_u) goto bad; + ascii_chars_b = PyUnicode_AsEncodedString(ascii_chars_u, default_encoding_c, NULL); + if (!ascii_chars_b || !PyBytes_Check(ascii_chars_b) || memcmp(ascii_chars, PyBytes_AS_STRING(ascii_chars_b), 128) != 0) { + PyErr_Format( + PyExc_ValueError, + "This module compiled with c_string_encoding=ascii, but default encoding '%.200s' is not a superset of ascii.", + default_encoding_c); + goto bad; + } + Py_DECREF(ascii_chars_u); + Py_DECREF(ascii_chars_b); + } + Py_DECREF(default_encoding); + return 0; +bad: + Py_XDECREF(default_encoding); + Py_XDECREF(ascii_chars_u); + Py_XDECREF(ascii_chars_b); + return -1; +} +#endif +#if __PYX_DEFAULT_STRING_ENCODING_IS_DEFAULT && PY_MAJOR_VERSION >= 3 +#define __Pyx_PyUnicode_FromStringAndSize(c_str, size) PyUnicode_DecodeUTF8(c_str, size, NULL) +#else +#define __Pyx_PyUnicode_FromStringAndSize(c_str, size) PyUnicode_Decode(c_str, size, __PYX_DEFAULT_STRING_ENCODING, NULL) +#if __PYX_DEFAULT_STRING_ENCODING_IS_DEFAULT +static char* __PYX_DEFAULT_STRING_ENCODING; +static int __Pyx_init_sys_getdefaultencoding_params(void) { + PyObject* sys; + PyObject* default_encoding = NULL; + char* default_encoding_c; + sys = PyImport_ImportModule("sys"); + if (!sys) goto bad; + default_encoding = PyObject_CallMethod(sys, (char*) (const char*) "getdefaultencoding", NULL); + Py_DECREF(sys); + if (!default_encoding) goto bad; + default_encoding_c = PyBytes_AsString(default_encoding); + if (!default_encoding_c) goto bad; + __PYX_DEFAULT_STRING_ENCODING = (char*) malloc(strlen(default_encoding_c) + 1); + if (!__PYX_DEFAULT_STRING_ENCODING) goto bad; + strcpy(__PYX_DEFAULT_STRING_ENCODING, default_encoding_c); + Py_DECREF(default_encoding); + return 0; +bad: + Py_XDECREF(default_encoding); + return -1; +} +#endif +#endif + + +/* Test for GCC > 2.95 */ +#if defined(__GNUC__) && (__GNUC__ > 2 || (__GNUC__ == 2 && (__GNUC_MINOR__ > 95))) + #define likely(x) __builtin_expect(!!(x), 1) + #define unlikely(x) __builtin_expect(!!(x), 0) +#else /* !__GNUC__ or GCC < 2.95 */ + #define likely(x) (x) + #define unlikely(x) (x) +#endif /* __GNUC__ */ +static CYTHON_INLINE void __Pyx_pretend_to_initialize(void* ptr) { (void)ptr; } + +static PyObject *__pyx_m = NULL; +static PyObject *__pyx_d; +static PyObject *__pyx_b; +static PyObject *__pyx_cython_runtime = NULL; +static PyObject *__pyx_empty_tuple; +static PyObject *__pyx_empty_bytes; +static PyObject *__pyx_empty_unicode; +static int __pyx_lineno; +static int __pyx_clineno = 0; +static const char * __pyx_cfilenm= __FILE__; +static const char *__pyx_filename; + + +static const char *__pyx_f[] = { + "aiohttp\\_http_parser.pyx", + "stringsource", + "type.pxd", + "bool.pxd", + "complex.pxd", + "aiohttp\\_headers.pxi", +}; + +/*--- Type declarations ---*/ +struct __pyx_obj_7aiohttp_12_http_parser_RawRequestMessage; +struct __pyx_obj_7aiohttp_12_http_parser_RawResponseMessage; +struct __pyx_obj_7aiohttp_12_http_parser_HttpParser; +struct __pyx_obj_7aiohttp_12_http_parser_HttpRequestParser; +struct __pyx_obj_7aiohttp_12_http_parser_HttpResponseParser; +struct __pyx_obj_7aiohttp_12_http_parser___pyx_scope_struct____repr__; +struct __pyx_obj_7aiohttp_12_http_parser___pyx_scope_struct_1_genexpr; +struct __pyx_obj_7aiohttp_12_http_parser___pyx_scope_struct_2___repr__; +struct __pyx_obj_7aiohttp_12_http_parser___pyx_scope_struct_3_genexpr; +struct __pyx_opt_args_7aiohttp_12_http_parser_10HttpParser__init; + +/* "aiohttp/_http_parser.pyx":328 + * + * cdef _init( + * self, cparser.llhttp_type mode, # <<<<<<<<<<<<<< + * object protocol, object loop, int limit, + * object timer=None, + */ +struct __pyx_opt_args_7aiohttp_12_http_parser_10HttpParser__init { + int __pyx_n; + PyObject *timer; + size_t max_line_size; + size_t max_headers; + size_t max_field_size; + PyObject *payload_exception; + int response_with_body; + int read_until_eof; + int auto_decompress; +}; + +/* "aiohttp/_http_parser.pyx":110 + * + * @cython.freelist(DEFAULT_FREELIST_SIZE) + * cdef class RawRequestMessage: # <<<<<<<<<<<<<< + * cdef readonly str method + * cdef readonly str path + */ +struct __pyx_obj_7aiohttp_12_http_parser_RawRequestMessage { + PyObject_HEAD + PyObject *method; + PyObject *path; + PyObject *version; + PyObject *headers; + PyObject *raw_headers; + PyObject *should_close; + PyObject *compression; + PyObject *upgrade; + PyObject *chunked; + PyObject *url; +}; + + +/* "aiohttp/_http_parser.pyx":210 + * + * @cython.freelist(DEFAULT_FREELIST_SIZE) + * cdef class RawResponseMessage: # <<<<<<<<<<<<<< + * cdef readonly object version # HttpVersion + * cdef readonly int code + */ +struct __pyx_obj_7aiohttp_12_http_parser_RawResponseMessage { + PyObject_HEAD + PyObject *version; + int code; + PyObject *reason; + PyObject *headers; + PyObject *raw_headers; + PyObject *should_close; + PyObject *compression; + PyObject *upgrade; + PyObject *chunked; +}; + + +/* "aiohttp/_http_parser.pyx":272 + * + * @cython.internal + * cdef class HttpParser: # <<<<<<<<<<<<<< + * + * cdef: + */ +struct __pyx_obj_7aiohttp_12_http_parser_HttpParser { + PyObject_HEAD + struct __pyx_vtabstruct_7aiohttp_12_http_parser_HttpParser *__pyx_vtab; + llhttp_t *_cparser; + llhttp_settings_t *_csettings; + PyObject *_raw_name; + PyObject *_raw_value; + int _has_value; + PyObject *_protocol; + PyObject *_loop; + PyObject *_timer; + size_t _max_line_size; + size_t _max_field_size; + size_t _max_headers; + int _response_with_body; + int _read_until_eof; + int _started; + PyObject *_url; + PyObject *_buf; + PyObject *_path; + PyObject *_reason; + PyObject *_headers; + PyObject *_raw_headers; + int _upgraded; + PyObject *_messages; + PyObject *_payload; + int _payload_error; + PyObject *_payload_exception; + PyObject *_last_error; + int _auto_decompress; + int _limit; + PyObject *_content_encoding; + Py_buffer py_buf; +}; + + +/* "aiohttp/_http_parser.pyx":568 + * + * + * cdef class HttpRequestParser(HttpParser): # <<<<<<<<<<<<<< + * + * def __init__( + */ +struct __pyx_obj_7aiohttp_12_http_parser_HttpRequestParser { + struct __pyx_obj_7aiohttp_12_http_parser_HttpParser __pyx_base; +}; + + +/* "aiohttp/_http_parser.pyx":621 + * + * + * cdef class HttpResponseParser(HttpParser): # <<<<<<<<<<<<<< + * + * def __init__( + */ +struct __pyx_obj_7aiohttp_12_http_parser_HttpResponseParser { + struct __pyx_obj_7aiohttp_12_http_parser_HttpParser __pyx_base; +}; + + +/* "aiohttp/_http_parser.pyx":135 + * self.url = url + * + * def __repr__(self): # <<<<<<<<<<<<<< + * info = [] + * info.append(("method", self.method)) + */ +struct __pyx_obj_7aiohttp_12_http_parser___pyx_scope_struct____repr__ { + PyObject_HEAD + PyObject *__pyx_v_info; +}; + + +/* "aiohttp/_http_parser.pyx":147 + * info.append(("chunked", self.chunked)) + * info.append(("url", self.url)) + * sinfo = ', '.join(name + '=' + repr(val) for name, val in info) # <<<<<<<<<<<<<< + * return '' + * + */ +struct __pyx_obj_7aiohttp_12_http_parser___pyx_scope_struct_1_genexpr { + PyObject_HEAD + struct __pyx_obj_7aiohttp_12_http_parser___pyx_scope_struct____repr__ *__pyx_outer_scope; + PyObject *__pyx_v_name; + PyObject *__pyx_v_val; +}; + + +/* "aiohttp/_http_parser.pyx":233 + * self.chunked = chunked + * + * def __repr__(self): # <<<<<<<<<<<<<< + * info = [] + * info.append(("version", self.version)) + */ +struct __pyx_obj_7aiohttp_12_http_parser___pyx_scope_struct_2___repr__ { + PyObject_HEAD + PyObject *__pyx_v_info; +}; + + +/* "aiohttp/_http_parser.pyx":244 + * info.append(("upgrade", self.upgrade)) + * info.append(("chunked", self.chunked)) + * sinfo = ', '.join(name + '=' + repr(val) for name, val in info) # <<<<<<<<<<<<<< + * return '' + * + */ +struct __pyx_obj_7aiohttp_12_http_parser___pyx_scope_struct_3_genexpr { + PyObject_HEAD + struct __pyx_obj_7aiohttp_12_http_parser___pyx_scope_struct_2___repr__ *__pyx_outer_scope; + PyObject *__pyx_v_name; + PyObject *__pyx_v_val; +}; + + + +/* "aiohttp/_http_parser.pyx":272 + * + * @cython.internal + * cdef class HttpParser: # <<<<<<<<<<<<<< + * + * cdef: + */ + +struct __pyx_vtabstruct_7aiohttp_12_http_parser_HttpParser { + PyObject *(*_init)(struct __pyx_obj_7aiohttp_12_http_parser_HttpParser *, enum llhttp_type, PyObject *, PyObject *, int, struct __pyx_opt_args_7aiohttp_12_http_parser_10HttpParser__init *__pyx_optional_args); + PyObject *(*_process_header)(struct __pyx_obj_7aiohttp_12_http_parser_HttpParser *); + PyObject *(*_on_header_field)(struct __pyx_obj_7aiohttp_12_http_parser_HttpParser *, char *, size_t); + PyObject *(*_on_header_value)(struct __pyx_obj_7aiohttp_12_http_parser_HttpParser *, char *, size_t); + PyObject *(*_on_headers_complete)(struct __pyx_obj_7aiohttp_12_http_parser_HttpParser *); + PyObject *(*_on_message_complete)(struct __pyx_obj_7aiohttp_12_http_parser_HttpParser *); + PyObject *(*_on_chunk_header)(struct __pyx_obj_7aiohttp_12_http_parser_HttpParser *); + PyObject *(*_on_chunk_complete)(struct __pyx_obj_7aiohttp_12_http_parser_HttpParser *); + PyObject *(*_on_status_complete)(struct __pyx_obj_7aiohttp_12_http_parser_HttpParser *); + PyObject *(*http_version)(struct __pyx_obj_7aiohttp_12_http_parser_HttpParser *); +}; +static struct __pyx_vtabstruct_7aiohttp_12_http_parser_HttpParser *__pyx_vtabptr_7aiohttp_12_http_parser_HttpParser; +static CYTHON_INLINE PyObject *__pyx_f_7aiohttp_12_http_parser_10HttpParser_http_version(struct __pyx_obj_7aiohttp_12_http_parser_HttpParser *); + + +/* "aiohttp/_http_parser.pyx":568 + * + * + * cdef class HttpRequestParser(HttpParser): # <<<<<<<<<<<<<< + * + * def __init__( + */ + +struct __pyx_vtabstruct_7aiohttp_12_http_parser_HttpRequestParser { + struct __pyx_vtabstruct_7aiohttp_12_http_parser_HttpParser __pyx_base; +}; +static struct __pyx_vtabstruct_7aiohttp_12_http_parser_HttpRequestParser *__pyx_vtabptr_7aiohttp_12_http_parser_HttpRequestParser; + + +/* "aiohttp/_http_parser.pyx":621 + * + * + * cdef class HttpResponseParser(HttpParser): # <<<<<<<<<<<<<< + * + * def __init__( + */ + +struct __pyx_vtabstruct_7aiohttp_12_http_parser_HttpResponseParser { + struct __pyx_vtabstruct_7aiohttp_12_http_parser_HttpParser __pyx_base; +}; +static struct __pyx_vtabstruct_7aiohttp_12_http_parser_HttpResponseParser *__pyx_vtabptr_7aiohttp_12_http_parser_HttpResponseParser; + +/* --- Runtime support code (head) --- */ +/* Refnanny.proto */ +#ifndef CYTHON_REFNANNY + #define CYTHON_REFNANNY 0 +#endif +#if CYTHON_REFNANNY + typedef struct { + void (*INCREF)(void*, PyObject*, int); + void (*DECREF)(void*, PyObject*, int); + void (*GOTREF)(void*, PyObject*, int); + void (*GIVEREF)(void*, PyObject*, int); + void* (*SetupContext)(const char*, int, const char*); + void (*FinishContext)(void**); + } __Pyx_RefNannyAPIStruct; + static __Pyx_RefNannyAPIStruct *__Pyx_RefNanny = NULL; + static __Pyx_RefNannyAPIStruct *__Pyx_RefNannyImportAPI(const char *modname); + #define __Pyx_RefNannyDeclarations void *__pyx_refnanny = NULL; +#ifdef WITH_THREAD + #define __Pyx_RefNannySetupContext(name, acquire_gil)\ + if (acquire_gil) {\ + PyGILState_STATE __pyx_gilstate_save = PyGILState_Ensure();\ + __pyx_refnanny = __Pyx_RefNanny->SetupContext((name), __LINE__, __FILE__);\ + PyGILState_Release(__pyx_gilstate_save);\ + } else {\ + __pyx_refnanny = __Pyx_RefNanny->SetupContext((name), __LINE__, __FILE__);\ + } +#else + #define __Pyx_RefNannySetupContext(name, acquire_gil)\ + __pyx_refnanny = __Pyx_RefNanny->SetupContext((name), __LINE__, __FILE__) +#endif + #define __Pyx_RefNannyFinishContext()\ + __Pyx_RefNanny->FinishContext(&__pyx_refnanny) + #define __Pyx_INCREF(r) __Pyx_RefNanny->INCREF(__pyx_refnanny, (PyObject *)(r), __LINE__) + #define __Pyx_DECREF(r) __Pyx_RefNanny->DECREF(__pyx_refnanny, (PyObject *)(r), __LINE__) + #define __Pyx_GOTREF(r) __Pyx_RefNanny->GOTREF(__pyx_refnanny, (PyObject *)(r), __LINE__) + #define __Pyx_GIVEREF(r) __Pyx_RefNanny->GIVEREF(__pyx_refnanny, (PyObject *)(r), __LINE__) + #define __Pyx_XINCREF(r) do { if((r) != NULL) {__Pyx_INCREF(r); }} while(0) + #define __Pyx_XDECREF(r) do { if((r) != NULL) {__Pyx_DECREF(r); }} while(0) + #define __Pyx_XGOTREF(r) do { if((r) != NULL) {__Pyx_GOTREF(r); }} while(0) + #define __Pyx_XGIVEREF(r) do { if((r) != NULL) {__Pyx_GIVEREF(r);}} while(0) +#else + #define __Pyx_RefNannyDeclarations + #define __Pyx_RefNannySetupContext(name, acquire_gil) + #define __Pyx_RefNannyFinishContext() + #define __Pyx_INCREF(r) Py_INCREF(r) + #define __Pyx_DECREF(r) Py_DECREF(r) + #define __Pyx_GOTREF(r) + #define __Pyx_GIVEREF(r) + #define __Pyx_XINCREF(r) Py_XINCREF(r) + #define __Pyx_XDECREF(r) Py_XDECREF(r) + #define __Pyx_XGOTREF(r) + #define __Pyx_XGIVEREF(r) +#endif +#define __Pyx_XDECREF_SET(r, v) do {\ + PyObject *tmp = (PyObject *) r;\ + r = v; __Pyx_XDECREF(tmp);\ + } while (0) +#define __Pyx_DECREF_SET(r, v) do {\ + PyObject *tmp = (PyObject *) r;\ + r = v; __Pyx_DECREF(tmp);\ + } while (0) +#define __Pyx_CLEAR(r) do { PyObject* tmp = ((PyObject*)(r)); r = NULL; __Pyx_DECREF(tmp);} while(0) +#define __Pyx_XCLEAR(r) do { if((r) != NULL) {PyObject* tmp = ((PyObject*)(r)); r = NULL; __Pyx_DECREF(tmp);}} while(0) + +/* PyObjectGetAttrStr.proto */ +#if CYTHON_USE_TYPE_SLOTS +static CYTHON_INLINE PyObject* __Pyx_PyObject_GetAttrStr(PyObject* obj, PyObject* attr_name); +#else +#define __Pyx_PyObject_GetAttrStr(o,n) PyObject_GetAttr(o,n) +#endif + +/* GetBuiltinName.proto */ +static PyObject *__Pyx_GetBuiltinName(PyObject *name); + +/* GetItemInt.proto */ +#define __Pyx_GetItemInt(o, i, type, is_signed, to_py_func, is_list, wraparound, boundscheck)\ + (__Pyx_fits_Py_ssize_t(i, type, is_signed) ?\ + __Pyx_GetItemInt_Fast(o, (Py_ssize_t)i, is_list, wraparound, boundscheck) :\ + (is_list ? (PyErr_SetString(PyExc_IndexError, "list index out of range"), (PyObject*)NULL) :\ + __Pyx_GetItemInt_Generic(o, to_py_func(i)))) +#define __Pyx_GetItemInt_List(o, i, type, is_signed, to_py_func, is_list, wraparound, boundscheck)\ + (__Pyx_fits_Py_ssize_t(i, type, is_signed) ?\ + __Pyx_GetItemInt_List_Fast(o, (Py_ssize_t)i, wraparound, boundscheck) :\ + (PyErr_SetString(PyExc_IndexError, "list index out of range"), (PyObject*)NULL)) +static CYTHON_INLINE PyObject *__Pyx_GetItemInt_List_Fast(PyObject *o, Py_ssize_t i, + int wraparound, int boundscheck); +#define __Pyx_GetItemInt_Tuple(o, i, type, is_signed, to_py_func, is_list, wraparound, boundscheck)\ + (__Pyx_fits_Py_ssize_t(i, type, is_signed) ?\ + __Pyx_GetItemInt_Tuple_Fast(o, (Py_ssize_t)i, wraparound, boundscheck) :\ + (PyErr_SetString(PyExc_IndexError, "tuple index out of range"), (PyObject*)NULL)) +static CYTHON_INLINE PyObject *__Pyx_GetItemInt_Tuple_Fast(PyObject *o, Py_ssize_t i, + int wraparound, int boundscheck); +static PyObject *__Pyx_GetItemInt_Generic(PyObject *o, PyObject* j); +static CYTHON_INLINE PyObject *__Pyx_GetItemInt_Fast(PyObject *o, Py_ssize_t i, + int is_list, int wraparound, int boundscheck); + +/* decode_c_string_utf16.proto */ +static CYTHON_INLINE PyObject *__Pyx_PyUnicode_DecodeUTF16(const char *s, Py_ssize_t size, const char *errors) { + int byteorder = 0; + return PyUnicode_DecodeUTF16(s, size, errors, &byteorder); +} +static CYTHON_INLINE PyObject *__Pyx_PyUnicode_DecodeUTF16LE(const char *s, Py_ssize_t size, const char *errors) { + int byteorder = -1; + return PyUnicode_DecodeUTF16(s, size, errors, &byteorder); +} +static CYTHON_INLINE PyObject *__Pyx_PyUnicode_DecodeUTF16BE(const char *s, Py_ssize_t size, const char *errors) { + int byteorder = 1; + return PyUnicode_DecodeUTF16(s, size, errors, &byteorder); +} + +/* decode_c_bytes.proto */ +static CYTHON_INLINE PyObject* __Pyx_decode_c_bytes( + const char* cstring, Py_ssize_t length, Py_ssize_t start, Py_ssize_t stop, + const char* encoding, const char* errors, + PyObject* (*decode_func)(const char *s, Py_ssize_t size, const char *errors)); + +/* decode_bytes.proto */ +static CYTHON_INLINE PyObject* __Pyx_decode_bytes( + PyObject* string, Py_ssize_t start, Py_ssize_t stop, + const char* encoding, const char* errors, + PyObject* (*decode_func)(const char *s, Py_ssize_t size, const char *errors)) { + return __Pyx_decode_c_bytes( + PyBytes_AS_STRING(string), PyBytes_GET_SIZE(string), + start, stop, encoding, errors, decode_func); +} + +/* RaiseArgTupleInvalid.proto */ +static void __Pyx_RaiseArgtupleInvalid(const char* func_name, int exact, + Py_ssize_t num_min, Py_ssize_t num_max, Py_ssize_t num_found); + +/* RaiseDoubleKeywords.proto */ +static void __Pyx_RaiseDoubleKeywordsError(const char* func_name, PyObject* kw_name); + +/* ParseKeywords.proto */ +static int __Pyx_ParseOptionalKeywords(PyObject *kwds, PyObject **argnames[],\ + PyObject *kwds2, PyObject *values[], Py_ssize_t num_pos_args,\ + const char* function_name); + +/* None.proto */ +static CYTHON_INLINE void __Pyx_RaiseClosureNameError(const char *varname); + +/* RaiseTooManyValuesToUnpack.proto */ +static CYTHON_INLINE void __Pyx_RaiseTooManyValuesError(Py_ssize_t expected); + +/* RaiseNeedMoreValuesToUnpack.proto */ +static CYTHON_INLINE void __Pyx_RaiseNeedMoreValuesError(Py_ssize_t index); + +/* IterFinish.proto */ +static CYTHON_INLINE int __Pyx_IterFinish(void); + +/* UnpackItemEndCheck.proto */ +static int __Pyx_IternextUnpackEndCheck(PyObject *retval, Py_ssize_t expected); + +/* ListCompAppend.proto */ +#if CYTHON_USE_PYLIST_INTERNALS && CYTHON_ASSUME_SAFE_MACROS +static CYTHON_INLINE int __Pyx_ListComp_Append(PyObject* list, PyObject* x) { + PyListObject* L = (PyListObject*) list; + Py_ssize_t len = Py_SIZE(list); + if (likely(L->allocated > len)) { + Py_INCREF(x); + PyList_SET_ITEM(list, len, x); + __Pyx_SET_SIZE(list, len + 1); + return 0; + } + return PyList_Append(list, x); +} +#else +#define __Pyx_ListComp_Append(L,x) PyList_Append(L,x) +#endif + +/* ListAppend.proto */ +#if CYTHON_USE_PYLIST_INTERNALS && CYTHON_ASSUME_SAFE_MACROS +static CYTHON_INLINE int __Pyx_PyList_Append(PyObject* list, PyObject* x) { + PyListObject* L = (PyListObject*) list; + Py_ssize_t len = Py_SIZE(list); + if (likely(L->allocated > len) & likely(len > (L->allocated >> 1))) { + Py_INCREF(x); + PyList_SET_ITEM(list, len, x); + __Pyx_SET_SIZE(list, len + 1); + return 0; + } + return PyList_Append(list, x); +} +#else +#define __Pyx_PyList_Append(L,x) PyList_Append(L,x) +#endif + +/* KeywordStringCheck.proto */ +static int __Pyx_CheckKeywordStrings(PyObject *kwdict, const char* function_name, int kw_allowed); + +/* ExtTypeTest.proto */ +static CYTHON_INLINE int __Pyx_TypeTest(PyObject *obj, PyTypeObject *type); + +/* PyDictContains.proto */ +static CYTHON_INLINE int __Pyx_PyDict_ContainsTF(PyObject* item, PyObject* dict, int eq) { + int result = PyDict_Contains(dict, item); + return unlikely(result < 0) ? result : (result == (eq == Py_EQ)); +} + +/* DictGetItem.proto */ +#if PY_MAJOR_VERSION >= 3 && !CYTHON_COMPILING_IN_PYPY +static PyObject *__Pyx_PyDict_GetItem(PyObject *d, PyObject* key); +#define __Pyx_PyObject_Dict_GetItem(obj, name)\ + (likely(PyDict_CheckExact(obj)) ?\ + __Pyx_PyDict_GetItem(obj, name) : PyObject_GetItem(obj, name)) +#else +#define __Pyx_PyDict_GetItem(d, key) PyObject_GetItem(d, key) +#define __Pyx_PyObject_Dict_GetItem(obj, name) PyObject_GetItem(obj, name) +#endif + +/* PyErrExceptionMatches.proto */ +#if CYTHON_FAST_THREAD_STATE +#define __Pyx_PyErr_ExceptionMatches(err) __Pyx_PyErr_ExceptionMatchesInState(__pyx_tstate, err) +static CYTHON_INLINE int __Pyx_PyErr_ExceptionMatchesInState(PyThreadState* tstate, PyObject* err); +#else +#define __Pyx_PyErr_ExceptionMatches(err) PyErr_ExceptionMatches(err) +#endif + +/* PyThreadStateGet.proto */ +#if CYTHON_FAST_THREAD_STATE +#define __Pyx_PyThreadState_declare PyThreadState *__pyx_tstate; +#define __Pyx_PyThreadState_assign __pyx_tstate = __Pyx_PyThreadState_Current; +#define __Pyx_PyErr_Occurred() __pyx_tstate->curexc_type +#else +#define __Pyx_PyThreadState_declare +#define __Pyx_PyThreadState_assign +#define __Pyx_PyErr_Occurred() PyErr_Occurred() +#endif + +/* PyErrFetchRestore.proto */ +#if CYTHON_FAST_THREAD_STATE +#define __Pyx_PyErr_Clear() __Pyx_ErrRestore(NULL, NULL, NULL) +#define __Pyx_ErrRestoreWithState(type, value, tb) __Pyx_ErrRestoreInState(PyThreadState_GET(), type, value, tb) +#define __Pyx_ErrFetchWithState(type, value, tb) __Pyx_ErrFetchInState(PyThreadState_GET(), type, value, tb) +#define __Pyx_ErrRestore(type, value, tb) __Pyx_ErrRestoreInState(__pyx_tstate, type, value, tb) +#define __Pyx_ErrFetch(type, value, tb) __Pyx_ErrFetchInState(__pyx_tstate, type, value, tb) +static CYTHON_INLINE void __Pyx_ErrRestoreInState(PyThreadState *tstate, PyObject *type, PyObject *value, PyObject *tb); +static CYTHON_INLINE void __Pyx_ErrFetchInState(PyThreadState *tstate, PyObject **type, PyObject **value, PyObject **tb); +#if CYTHON_COMPILING_IN_CPYTHON +#define __Pyx_PyErr_SetNone(exc) (Py_INCREF(exc), __Pyx_ErrRestore((exc), NULL, NULL)) +#else +#define __Pyx_PyErr_SetNone(exc) PyErr_SetNone(exc) +#endif +#else +#define __Pyx_PyErr_Clear() PyErr_Clear() +#define __Pyx_PyErr_SetNone(exc) PyErr_SetNone(exc) +#define __Pyx_ErrRestoreWithState(type, value, tb) PyErr_Restore(type, value, tb) +#define __Pyx_ErrFetchWithState(type, value, tb) PyErr_Fetch(type, value, tb) +#define __Pyx_ErrRestoreInState(tstate, type, value, tb) PyErr_Restore(type, value, tb) +#define __Pyx_ErrFetchInState(tstate, type, value, tb) PyErr_Fetch(type, value, tb) +#define __Pyx_ErrRestore(type, value, tb) PyErr_Restore(type, value, tb) +#define __Pyx_ErrFetch(type, value, tb) PyErr_Fetch(type, value, tb) +#endif + +/* GetAttr.proto */ +static CYTHON_INLINE PyObject *__Pyx_GetAttr(PyObject *, PyObject *); + +/* GetAttr3.proto */ +static CYTHON_INLINE PyObject *__Pyx_GetAttr3(PyObject *, PyObject *, PyObject *); + +/* PyDictVersioning.proto */ +#if CYTHON_USE_DICT_VERSIONS && CYTHON_USE_TYPE_SLOTS +#define __PYX_DICT_VERSION_INIT ((PY_UINT64_T) -1) +#define __PYX_GET_DICT_VERSION(dict) (((PyDictObject*)(dict))->ma_version_tag) +#define __PYX_UPDATE_DICT_CACHE(dict, value, cache_var, version_var)\ + (version_var) = __PYX_GET_DICT_VERSION(dict);\ + (cache_var) = (value); +#define __PYX_PY_DICT_LOOKUP_IF_MODIFIED(VAR, DICT, LOOKUP) {\ + static PY_UINT64_T __pyx_dict_version = 0;\ + static PyObject *__pyx_dict_cached_value = NULL;\ + if (likely(__PYX_GET_DICT_VERSION(DICT) == __pyx_dict_version)) {\ + (VAR) = __pyx_dict_cached_value;\ + } else {\ + (VAR) = __pyx_dict_cached_value = (LOOKUP);\ + __pyx_dict_version = __PYX_GET_DICT_VERSION(DICT);\ + }\ +} +static CYTHON_INLINE PY_UINT64_T __Pyx_get_tp_dict_version(PyObject *obj); +static CYTHON_INLINE PY_UINT64_T __Pyx_get_object_dict_version(PyObject *obj); +static CYTHON_INLINE int __Pyx_object_dict_version_matches(PyObject* obj, PY_UINT64_T tp_dict_version, PY_UINT64_T obj_dict_version); +#else +#define __PYX_GET_DICT_VERSION(dict) (0) +#define __PYX_UPDATE_DICT_CACHE(dict, value, cache_var, version_var) +#define __PYX_PY_DICT_LOOKUP_IF_MODIFIED(VAR, DICT, LOOKUP) (VAR) = (LOOKUP); +#endif + +/* GetModuleGlobalName.proto */ +#if CYTHON_USE_DICT_VERSIONS +#define __Pyx_GetModuleGlobalName(var, name) {\ + static PY_UINT64_T __pyx_dict_version = 0;\ + static PyObject *__pyx_dict_cached_value = NULL;\ + (var) = (likely(__pyx_dict_version == __PYX_GET_DICT_VERSION(__pyx_d))) ?\ + (likely(__pyx_dict_cached_value) ? __Pyx_NewRef(__pyx_dict_cached_value) : __Pyx_GetBuiltinName(name)) :\ + __Pyx__GetModuleGlobalName(name, &__pyx_dict_version, &__pyx_dict_cached_value);\ +} +#define __Pyx_GetModuleGlobalNameUncached(var, name) {\ + PY_UINT64_T __pyx_dict_version;\ + PyObject *__pyx_dict_cached_value;\ + (var) = __Pyx__GetModuleGlobalName(name, &__pyx_dict_version, &__pyx_dict_cached_value);\ +} +static PyObject *__Pyx__GetModuleGlobalName(PyObject *name, PY_UINT64_T *dict_version, PyObject **dict_cached_value); +#else +#define __Pyx_GetModuleGlobalName(var, name) (var) = __Pyx__GetModuleGlobalName(name) +#define __Pyx_GetModuleGlobalNameUncached(var, name) (var) = __Pyx__GetModuleGlobalName(name) +static CYTHON_INLINE PyObject *__Pyx__GetModuleGlobalName(PyObject *name); +#endif + +/* PyFunctionFastCall.proto */ +#if CYTHON_FAST_PYCALL +#define __Pyx_PyFunction_FastCall(func, args, nargs)\ + __Pyx_PyFunction_FastCallDict((func), (args), (nargs), NULL) +#if 1 || PY_VERSION_HEX < 0x030600B1 +static PyObject *__Pyx_PyFunction_FastCallDict(PyObject *func, PyObject **args, Py_ssize_t nargs, PyObject *kwargs); +#else +#define __Pyx_PyFunction_FastCallDict(func, args, nargs, kwargs) _PyFunction_FastCallDict(func, args, nargs, kwargs) +#endif +#define __Pyx_BUILD_ASSERT_EXPR(cond)\ + (sizeof(char [1 - 2*!(cond)]) - 1) +#ifndef Py_MEMBER_SIZE +#define Py_MEMBER_SIZE(type, member) sizeof(((type *)0)->member) +#endif + static size_t __pyx_pyframe_localsplus_offset = 0; + #include "frameobject.h" + #define __Pxy_PyFrame_Initialize_Offsets()\ + ((void)__Pyx_BUILD_ASSERT_EXPR(sizeof(PyFrameObject) == offsetof(PyFrameObject, f_localsplus) + Py_MEMBER_SIZE(PyFrameObject, f_localsplus)),\ + (void)(__pyx_pyframe_localsplus_offset = ((size_t)PyFrame_Type.tp_basicsize) - Py_MEMBER_SIZE(PyFrameObject, f_localsplus))) + #define __Pyx_PyFrame_GetLocalsplus(frame)\ + (assert(__pyx_pyframe_localsplus_offset), (PyObject **)(((char *)(frame)) + __pyx_pyframe_localsplus_offset)) +#endif + +/* PyObjectCall.proto */ +#if CYTHON_COMPILING_IN_CPYTHON +static CYTHON_INLINE PyObject* __Pyx_PyObject_Call(PyObject *func, PyObject *arg, PyObject *kw); +#else +#define __Pyx_PyObject_Call(func, arg, kw) PyObject_Call(func, arg, kw) +#endif + +/* PyObjectCallMethO.proto */ +#if CYTHON_COMPILING_IN_CPYTHON +static CYTHON_INLINE PyObject* __Pyx_PyObject_CallMethO(PyObject *func, PyObject *arg); +#endif + +/* PyObjectCallNoArg.proto */ +#if CYTHON_COMPILING_IN_CPYTHON +static CYTHON_INLINE PyObject* __Pyx_PyObject_CallNoArg(PyObject *func); +#else +#define __Pyx_PyObject_CallNoArg(func) __Pyx_PyObject_Call(func, __pyx_empty_tuple, NULL) +#endif + +/* PyCFunctionFastCall.proto */ +#if CYTHON_FAST_PYCCALL +static CYTHON_INLINE PyObject *__Pyx_PyCFunction_FastCall(PyObject *func, PyObject **args, Py_ssize_t nargs); +#else +#define __Pyx_PyCFunction_FastCall(func, args, nargs) (assert(0), NULL) +#endif + +/* PyObjectCallOneArg.proto */ +static CYTHON_INLINE PyObject* __Pyx_PyObject_CallOneArg(PyObject *func, PyObject *arg); + +/* PyObjectCall2Args.proto */ +static CYTHON_UNUSED PyObject* __Pyx_PyObject_Call2Args(PyObject* function, PyObject* arg1, PyObject* arg2); + +/* PySequenceContains.proto */ +static CYTHON_INLINE int __Pyx_PySequence_ContainsTF(PyObject* item, PyObject* seq, int eq) { + int result = PySequence_Contains(seq, item); + return unlikely(result < 0) ? result : (result == (eq == Py_EQ)); +} + +/* RaiseException.proto */ +static void __Pyx_Raise(PyObject *type, PyObject *value, PyObject *tb, PyObject *cause); + +/* IncludeStringH.proto */ +#include + +/* BytesEquals.proto */ +static CYTHON_INLINE int __Pyx_PyBytes_Equals(PyObject* s1, PyObject* s2, int equals); + +/* UnicodeEquals.proto */ +static CYTHON_INLINE int __Pyx_PyUnicode_Equals(PyObject* s1, PyObject* s2, int equals); + +/* SliceObject.proto */ +static CYTHON_INLINE PyObject* __Pyx_PyObject_GetSlice( + PyObject* obj, Py_ssize_t cstart, Py_ssize_t cstop, + PyObject** py_start, PyObject** py_stop, PyObject** py_slice, + int has_cstart, int has_cstop, int wraparound); + +/* decode_bytearray.proto */ +static CYTHON_INLINE PyObject* __Pyx_decode_bytearray( + PyObject* string, Py_ssize_t start, Py_ssize_t stop, + const char* encoding, const char* errors, + PyObject* (*decode_func)(const char *s, Py_ssize_t size, const char *errors)) { + return __Pyx_decode_c_bytes( + PyByteArray_AS_STRING(string), PyByteArray_GET_SIZE(string), + start, stop, encoding, errors, decode_func); +} + +/* PyUnicode_Substring.proto */ +static CYTHON_INLINE PyObject* __Pyx_PyUnicode_Substring( + PyObject* text, Py_ssize_t start, Py_ssize_t stop); + +/* GetException.proto */ +#if CYTHON_FAST_THREAD_STATE +#define __Pyx_GetException(type, value, tb) __Pyx__GetException(__pyx_tstate, type, value, tb) +static int __Pyx__GetException(PyThreadState *tstate, PyObject **type, PyObject **value, PyObject **tb); +#else +static int __Pyx_GetException(PyObject **type, PyObject **value, PyObject **tb); +#endif + +/* SwapException.proto */ +#if CYTHON_FAST_THREAD_STATE +#define __Pyx_ExceptionSwap(type, value, tb) __Pyx__ExceptionSwap(__pyx_tstate, type, value, tb) +static CYTHON_INLINE void __Pyx__ExceptionSwap(PyThreadState *tstate, PyObject **type, PyObject **value, PyObject **tb); +#else +static CYTHON_INLINE void __Pyx_ExceptionSwap(PyObject **type, PyObject **value, PyObject **tb); +#endif + +/* GetTopmostException.proto */ +#if CYTHON_USE_EXC_INFO_STACK +static _PyErr_StackItem * __Pyx_PyErr_GetTopmostException(PyThreadState *tstate); +#endif + +/* SaveResetException.proto */ +#if CYTHON_FAST_THREAD_STATE +#define __Pyx_ExceptionSave(type, value, tb) __Pyx__ExceptionSave(__pyx_tstate, type, value, tb) +static CYTHON_INLINE void __Pyx__ExceptionSave(PyThreadState *tstate, PyObject **type, PyObject **value, PyObject **tb); +#define __Pyx_ExceptionReset(type, value, tb) __Pyx__ExceptionReset(__pyx_tstate, type, value, tb) +static CYTHON_INLINE void __Pyx__ExceptionReset(PyThreadState *tstate, PyObject *type, PyObject *value, PyObject *tb); +#else +#define __Pyx_ExceptionSave(type, value, tb) PyErr_GetExcInfo(type, value, tb) +#define __Pyx_ExceptionReset(type, value, tb) PyErr_SetExcInfo(type, value, tb) +#endif + +/* Import.proto */ +static PyObject *__Pyx_Import(PyObject *name, PyObject *from_list, int level); + +/* ImportFrom.proto */ +static PyObject* __Pyx_ImportFrom(PyObject* module, PyObject* name); + +/* HasAttr.proto */ +static CYTHON_INLINE int __Pyx_HasAttr(PyObject *, PyObject *); + +/* PyObject_GenericGetAttrNoDict.proto */ +#if CYTHON_USE_TYPE_SLOTS && CYTHON_USE_PYTYPE_LOOKUP && PY_VERSION_HEX < 0x03070000 +static CYTHON_INLINE PyObject* __Pyx_PyObject_GenericGetAttrNoDict(PyObject* obj, PyObject* attr_name); +#else +#define __Pyx_PyObject_GenericGetAttrNoDict PyObject_GenericGetAttr +#endif + +/* PyObject_GenericGetAttr.proto */ +#if CYTHON_USE_TYPE_SLOTS && CYTHON_USE_PYTYPE_LOOKUP && PY_VERSION_HEX < 0x03070000 +static PyObject* __Pyx_PyObject_GenericGetAttr(PyObject* obj, PyObject* attr_name); +#else +#define __Pyx_PyObject_GenericGetAttr PyObject_GenericGetAttr +#endif + +/* PyObjectGetAttrStrNoError.proto */ +static CYTHON_INLINE PyObject* __Pyx_PyObject_GetAttrStrNoError(PyObject* obj, PyObject* attr_name); + +/* SetupReduce.proto */ +static int __Pyx_setup_reduce(PyObject* type_obj); + +/* SetVTable.proto */ +static int __Pyx_SetVtable(PyObject *dict, void *vtable); + +/* TypeImport.proto */ +#ifndef __PYX_HAVE_RT_ImportType_proto +#define __PYX_HAVE_RT_ImportType_proto +enum __Pyx_ImportType_CheckSize { + __Pyx_ImportType_CheckSize_Error = 0, + __Pyx_ImportType_CheckSize_Warn = 1, + __Pyx_ImportType_CheckSize_Ignore = 2 +}; +static PyTypeObject *__Pyx_ImportType(PyObject* module, const char *module_name, const char *class_name, size_t size, enum __Pyx_ImportType_CheckSize check_size); +#endif + +/* decode_c_string.proto */ +static CYTHON_INLINE PyObject* __Pyx_decode_c_string( + const char* cstring, Py_ssize_t start, Py_ssize_t stop, + const char* encoding, const char* errors, + PyObject* (*decode_func)(const char *s, Py_ssize_t size, const char *errors)); + +/* CLineInTraceback.proto */ +#ifdef CYTHON_CLINE_IN_TRACEBACK +#define __Pyx_CLineForTraceback(tstate, c_line) (((CYTHON_CLINE_IN_TRACEBACK)) ? c_line : 0) +#else +static int __Pyx_CLineForTraceback(PyThreadState *tstate, int c_line); +#endif + +/* CodeObjectCache.proto */ +typedef struct { + PyCodeObject* code_object; + int code_line; +} __Pyx_CodeObjectCacheEntry; +struct __Pyx_CodeObjectCache { + int count; + int max_count; + __Pyx_CodeObjectCacheEntry* entries; +}; +static struct __Pyx_CodeObjectCache __pyx_code_cache = {0,0,NULL}; +static int __pyx_bisect_code_objects(__Pyx_CodeObjectCacheEntry* entries, int count, int code_line); +static PyCodeObject *__pyx_find_code_object(int code_line); +static void __pyx_insert_code_object(int code_line, PyCodeObject* code_object); + +/* AddTraceback.proto */ +static void __Pyx_AddTraceback(const char *funcname, int c_line, + int py_line, const char *filename); + +/* GCCDiagnostics.proto */ +#if defined(__GNUC__) && (__GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ >= 6)) +#define __Pyx_HAS_GCC_DIAGNOSTIC +#endif + +/* CIntToPy.proto */ +static CYTHON_INLINE PyObject* __Pyx_PyInt_From_int(int value); + +/* CIntFromPy.proto */ +static CYTHON_INLINE int __Pyx_PyInt_As_int(PyObject *); + +/* CIntFromPy.proto */ +static CYTHON_INLINE enum llhttp_method __Pyx_PyInt_As_enum__llhttp_method(PyObject *); + +/* CIntFromPy.proto */ +static CYTHON_INLINE size_t __Pyx_PyInt_As_size_t(PyObject *); + +/* CIntFromPy.proto */ +static CYTHON_INLINE long __Pyx_PyInt_As_long(PyObject *); + +/* CIntToPy.proto */ +static CYTHON_INLINE PyObject* __Pyx_PyInt_From_uint8_t(uint8_t value); + +/* CIntToPy.proto */ +static CYTHON_INLINE PyObject* __Pyx_PyInt_From_long(long value); + +/* FastTypeChecks.proto */ +#if CYTHON_COMPILING_IN_CPYTHON +#define __Pyx_TypeCheck(obj, type) __Pyx_IsSubtype(Py_TYPE(obj), (PyTypeObject *)type) +static CYTHON_INLINE int __Pyx_IsSubtype(PyTypeObject *a, PyTypeObject *b); +static CYTHON_INLINE int __Pyx_PyErr_GivenExceptionMatches(PyObject *err, PyObject *type); +static CYTHON_INLINE int __Pyx_PyErr_GivenExceptionMatches2(PyObject *err, PyObject *type1, PyObject *type2); +#else +#define __Pyx_TypeCheck(obj, type) PyObject_TypeCheck(obj, (PyTypeObject *)type) +#define __Pyx_PyErr_GivenExceptionMatches(err, type) PyErr_GivenExceptionMatches(err, type) +#define __Pyx_PyErr_GivenExceptionMatches2(err, type1, type2) (PyErr_GivenExceptionMatches(err, type1) || PyErr_GivenExceptionMatches(err, type2)) +#endif +#define __Pyx_PyException_Check(obj) __Pyx_TypeCheck(obj, PyExc_Exception) + +/* FetchCommonType.proto */ +static PyTypeObject* __Pyx_FetchCommonType(PyTypeObject* type); + +/* PyObjectGetMethod.proto */ +static int __Pyx_PyObject_GetMethod(PyObject *obj, PyObject *name, PyObject **method); + +/* PyObjectCallMethod1.proto */ +static PyObject* __Pyx_PyObject_CallMethod1(PyObject* obj, PyObject* method_name, PyObject* arg); + +/* CoroutineBase.proto */ +typedef PyObject *(*__pyx_coroutine_body_t)(PyObject *, PyThreadState *, PyObject *); +#if CYTHON_USE_EXC_INFO_STACK +#define __Pyx_ExcInfoStruct _PyErr_StackItem +#else +typedef struct { + PyObject *exc_type; + PyObject *exc_value; + PyObject *exc_traceback; +} __Pyx_ExcInfoStruct; +#endif +typedef struct { + PyObject_HEAD + __pyx_coroutine_body_t body; + PyObject *closure; + __Pyx_ExcInfoStruct gi_exc_state; + PyObject *gi_weakreflist; + PyObject *classobj; + PyObject *yieldfrom; + PyObject *gi_name; + PyObject *gi_qualname; + PyObject *gi_modulename; + PyObject *gi_code; + PyObject *gi_frame; + int resume_label; + char is_running; +} __pyx_CoroutineObject; +static __pyx_CoroutineObject *__Pyx__Coroutine_New( + PyTypeObject *type, __pyx_coroutine_body_t body, PyObject *code, PyObject *closure, + PyObject *name, PyObject *qualname, PyObject *module_name); +static __pyx_CoroutineObject *__Pyx__Coroutine_NewInit( + __pyx_CoroutineObject *gen, __pyx_coroutine_body_t body, PyObject *code, PyObject *closure, + PyObject *name, PyObject *qualname, PyObject *module_name); +static CYTHON_INLINE void __Pyx_Coroutine_ExceptionClear(__Pyx_ExcInfoStruct *self); +static int __Pyx_Coroutine_clear(PyObject *self); +static PyObject *__Pyx_Coroutine_Send(PyObject *self, PyObject *value); +static PyObject *__Pyx_Coroutine_Close(PyObject *self); +static PyObject *__Pyx_Coroutine_Throw(PyObject *gen, PyObject *args); +#if CYTHON_USE_EXC_INFO_STACK +#define __Pyx_Coroutine_SwapException(self) +#define __Pyx_Coroutine_ResetAndClearException(self) __Pyx_Coroutine_ExceptionClear(&(self)->gi_exc_state) +#else +#define __Pyx_Coroutine_SwapException(self) {\ + __Pyx_ExceptionSwap(&(self)->gi_exc_state.exc_type, &(self)->gi_exc_state.exc_value, &(self)->gi_exc_state.exc_traceback);\ + __Pyx_Coroutine_ResetFrameBackpointer(&(self)->gi_exc_state);\ + } +#define __Pyx_Coroutine_ResetAndClearException(self) {\ + __Pyx_ExceptionReset((self)->gi_exc_state.exc_type, (self)->gi_exc_state.exc_value, (self)->gi_exc_state.exc_traceback);\ + (self)->gi_exc_state.exc_type = (self)->gi_exc_state.exc_value = (self)->gi_exc_state.exc_traceback = NULL;\ + } +#endif +#if CYTHON_FAST_THREAD_STATE +#define __Pyx_PyGen_FetchStopIterationValue(pvalue)\ + __Pyx_PyGen__FetchStopIterationValue(__pyx_tstate, pvalue) +#else +#define __Pyx_PyGen_FetchStopIterationValue(pvalue)\ + __Pyx_PyGen__FetchStopIterationValue(__Pyx_PyThreadState_Current, pvalue) +#endif +static int __Pyx_PyGen__FetchStopIterationValue(PyThreadState *tstate, PyObject **pvalue); +static CYTHON_INLINE void __Pyx_Coroutine_ResetFrameBackpointer(__Pyx_ExcInfoStruct *exc_state); + +/* PatchModuleWithCoroutine.proto */ +static PyObject* __Pyx_Coroutine_patch_module(PyObject* module, const char* py_code); + +/* PatchGeneratorABC.proto */ +static int __Pyx_patch_abc(void); + +/* Generator.proto */ +#define __Pyx_Generator_USED +static PyTypeObject *__pyx_GeneratorType = 0; +#define __Pyx_Generator_CheckExact(obj) (Py_TYPE(obj) == __pyx_GeneratorType) +#define __Pyx_Generator_New(body, code, closure, name, qualname, module_name)\ + __Pyx__Coroutine_New(__pyx_GeneratorType, body, code, closure, name, qualname, module_name) +static PyObject *__Pyx_Generator_Next(PyObject *self); +static int __pyx_Generator_init(void); + +/* CheckBinaryVersion.proto */ +static int __Pyx_check_binary_version(void); + +/* InitStrings.proto */ +static int __Pyx_InitStrings(__Pyx_StringTabEntry *t); + +static PyObject *__pyx_f_7aiohttp_12_http_parser_10HttpParser__init(struct __pyx_obj_7aiohttp_12_http_parser_HttpParser *__pyx_v_self, enum llhttp_type __pyx_v_mode, PyObject *__pyx_v_protocol, PyObject *__pyx_v_loop, int __pyx_v_limit, struct __pyx_opt_args_7aiohttp_12_http_parser_10HttpParser__init *__pyx_optional_args); /* proto*/ +static PyObject *__pyx_f_7aiohttp_12_http_parser_10HttpParser__process_header(struct __pyx_obj_7aiohttp_12_http_parser_HttpParser *__pyx_v_self); /* proto*/ +static PyObject *__pyx_f_7aiohttp_12_http_parser_10HttpParser__on_header_field(struct __pyx_obj_7aiohttp_12_http_parser_HttpParser *__pyx_v_self, char *__pyx_v_at, size_t __pyx_v_length); /* proto*/ +static PyObject *__pyx_f_7aiohttp_12_http_parser_10HttpParser__on_header_value(struct __pyx_obj_7aiohttp_12_http_parser_HttpParser *__pyx_v_self, char *__pyx_v_at, size_t __pyx_v_length); /* proto*/ +static PyObject *__pyx_f_7aiohttp_12_http_parser_10HttpParser__on_headers_complete(struct __pyx_obj_7aiohttp_12_http_parser_HttpParser *__pyx_v_self); /* proto*/ +static PyObject *__pyx_f_7aiohttp_12_http_parser_10HttpParser__on_message_complete(struct __pyx_obj_7aiohttp_12_http_parser_HttpParser *__pyx_v_self); /* proto*/ +static PyObject *__pyx_f_7aiohttp_12_http_parser_10HttpParser__on_chunk_header(struct __pyx_obj_7aiohttp_12_http_parser_HttpParser *__pyx_v_self); /* proto*/ +static PyObject *__pyx_f_7aiohttp_12_http_parser_10HttpParser__on_chunk_complete(struct __pyx_obj_7aiohttp_12_http_parser_HttpParser *__pyx_v_self); /* proto*/ +static PyObject *__pyx_f_7aiohttp_12_http_parser_10HttpParser__on_status_complete(CYTHON_UNUSED struct __pyx_obj_7aiohttp_12_http_parser_HttpParser *__pyx_v_self); /* proto*/ +static CYTHON_INLINE PyObject *__pyx_f_7aiohttp_12_http_parser_10HttpParser_http_version(struct __pyx_obj_7aiohttp_12_http_parser_HttpParser *__pyx_v_self); /* proto*/ +static PyObject *__pyx_f_7aiohttp_12_http_parser_17HttpRequestParser__on_status_complete(struct __pyx_obj_7aiohttp_12_http_parser_HttpRequestParser *__pyx_v_self); /* proto*/ +static PyObject *__pyx_f_7aiohttp_12_http_parser_18HttpResponseParser__on_status_complete(struct __pyx_obj_7aiohttp_12_http_parser_HttpResponseParser *__pyx_v_self); /* proto*/ + +/* Module declarations from 'cpython.version' */ + +/* Module declarations from '__builtin__' */ + +/* Module declarations from 'cpython.type' */ +static PyTypeObject *__pyx_ptype_7cpython_4type_type = 0; + +/* Module declarations from 'libc.string' */ + +/* Module declarations from 'libc.stdio' */ + +/* Module declarations from 'cpython.object' */ + +/* Module declarations from 'cpython.ref' */ + +/* Module declarations from 'cpython.exc' */ + +/* Module declarations from 'cpython.module' */ + +/* Module declarations from 'cpython.mem' */ + +/* Module declarations from 'cpython.tuple' */ + +/* Module declarations from 'cpython.list' */ + +/* Module declarations from 'cpython.sequence' */ + +/* Module declarations from 'cpython.mapping' */ + +/* Module declarations from 'cpython.iterator' */ + +/* Module declarations from 'cpython.number' */ + +/* Module declarations from 'cpython.int' */ + +/* Module declarations from '__builtin__' */ + +/* Module declarations from 'cpython.bool' */ +static PyTypeObject *__pyx_ptype_7cpython_4bool_bool = 0; + +/* Module declarations from 'cpython.long' */ + +/* Module declarations from 'cpython.float' */ + +/* Module declarations from '__builtin__' */ + +/* Module declarations from 'cpython.complex' */ +static PyTypeObject *__pyx_ptype_7cpython_7complex_complex = 0; + +/* Module declarations from 'cpython.string' */ + +/* Module declarations from 'cpython.unicode' */ + +/* Module declarations from 'cpython.dict' */ + +/* Module declarations from 'cpython.instance' */ + +/* Module declarations from 'cpython.function' */ + +/* Module declarations from 'cpython.method' */ + +/* Module declarations from 'cpython.weakref' */ + +/* Module declarations from 'cpython.getargs' */ + +/* Module declarations from 'cpython.pythread' */ + +/* Module declarations from 'cpython.pystate' */ + +/* Module declarations from 'cpython.cobject' */ + +/* Module declarations from 'cpython.oldbuffer' */ + +/* Module declarations from 'cpython.set' */ + +/* Module declarations from 'cpython.buffer' */ + +/* Module declarations from 'cpython.bytes' */ + +/* Module declarations from 'cpython.pycapsule' */ + +/* Module declarations from 'cpython' */ + +/* Module declarations from 'libc.limits' */ + +/* Module declarations from 'cython' */ + +/* Module declarations from 'aiohttp' */ + +/* Module declarations from 'libc.stdint' */ + +/* Module declarations from 'aiohttp._cparser' */ + +/* Module declarations from 'aiohttp._find_header' */ + +/* Module declarations from 'aiohttp._http_parser' */ +static PyTypeObject *__pyx_ptype_7aiohttp_12_http_parser_RawRequestMessage = 0; +static PyTypeObject *__pyx_ptype_7aiohttp_12_http_parser_RawResponseMessage = 0; +static PyTypeObject *__pyx_ptype_7aiohttp_12_http_parser_HttpParser = 0; +static PyTypeObject *__pyx_ptype_7aiohttp_12_http_parser_HttpRequestParser = 0; +static PyTypeObject *__pyx_ptype_7aiohttp_12_http_parser_HttpResponseParser = 0; +static PyTypeObject *__pyx_ptype_7aiohttp_12_http_parser___pyx_scope_struct____repr__ = 0; +static PyTypeObject *__pyx_ptype_7aiohttp_12_http_parser___pyx_scope_struct_1_genexpr = 0; +static PyTypeObject *__pyx_ptype_7aiohttp_12_http_parser___pyx_scope_struct_2___repr__ = 0; +static PyTypeObject *__pyx_ptype_7aiohttp_12_http_parser___pyx_scope_struct_3_genexpr = 0; +static PyObject *__pyx_v_7aiohttp_12_http_parser_headers = 0; +static PyObject *__pyx_v_7aiohttp_12_http_parser_URL = 0; +static PyObject *__pyx_v_7aiohttp_12_http_parser_URL_build = 0; +static PyObject *__pyx_v_7aiohttp_12_http_parser_CIMultiDict = 0; +static PyObject *__pyx_v_7aiohttp_12_http_parser_CIMultiDictProxy = 0; +static PyObject *__pyx_v_7aiohttp_12_http_parser_HttpVersion = 0; +static PyObject *__pyx_v_7aiohttp_12_http_parser_HttpVersion10 = 0; +static PyObject *__pyx_v_7aiohttp_12_http_parser_HttpVersion11 = 0; +static PyObject *__pyx_v_7aiohttp_12_http_parser_SEC_WEBSOCKET_KEY1 = 0; +static PyObject *__pyx_v_7aiohttp_12_http_parser_CONTENT_ENCODING = 0; +static PyObject *__pyx_v_7aiohttp_12_http_parser_EMPTY_PAYLOAD = 0; +static PyObject *__pyx_v_7aiohttp_12_http_parser_StreamReader = 0; +static PyObject *__pyx_v_7aiohttp_12_http_parser_DeflateBuffer = 0; +static PyObject *__pyx_v_7aiohttp_12_http_parser__http_method = 0; +static CYTHON_INLINE PyObject *__pyx_f_7aiohttp_12_http_parser_extend(PyObject *, char const *, size_t); /*proto*/ +static CYTHON_INLINE PyObject *__pyx_f_7aiohttp_12_http_parser_http_method_str(int); /*proto*/ +static CYTHON_INLINE PyObject *__pyx_f_7aiohttp_12_http_parser_find_header(PyObject *); /*proto*/ +static PyObject *__pyx_f_7aiohttp_12_http_parser__new_request_message(PyObject *, PyObject *, PyObject *, PyObject *, PyObject *, int, PyObject *, int, int, PyObject *); /*proto*/ +static PyObject *__pyx_f_7aiohttp_12_http_parser__new_response_message(PyObject *, int, PyObject *, PyObject *, PyObject *, int, PyObject *, int, int); /*proto*/ +static int __pyx_f_7aiohttp_12_http_parser_cb_on_message_begin(llhttp_t *); /*proto*/ +static int __pyx_f_7aiohttp_12_http_parser_cb_on_url(llhttp_t *, char const *, size_t); /*proto*/ +static int __pyx_f_7aiohttp_12_http_parser_cb_on_status(llhttp_t *, char const *, size_t); /*proto*/ +static int __pyx_f_7aiohttp_12_http_parser_cb_on_header_field(llhttp_t *, char const *, size_t); /*proto*/ +static int __pyx_f_7aiohttp_12_http_parser_cb_on_header_value(llhttp_t *, char const *, size_t); /*proto*/ +static int __pyx_f_7aiohttp_12_http_parser_cb_on_headers_complete(llhttp_t *); /*proto*/ +static int __pyx_f_7aiohttp_12_http_parser_cb_on_body(llhttp_t *, char const *, size_t); /*proto*/ +static int __pyx_f_7aiohttp_12_http_parser_cb_on_message_complete(llhttp_t *); /*proto*/ +static int __pyx_f_7aiohttp_12_http_parser_cb_on_chunk_header(llhttp_t *); /*proto*/ +static int __pyx_f_7aiohttp_12_http_parser_cb_on_chunk_complete(llhttp_t *); /*proto*/ +static PyObject *__pyx_f_7aiohttp_12_http_parser_parser_error_from_errno(llhttp_t *); /*proto*/ +static PyObject *__pyx_f_7aiohttp_12_http_parser___pyx_unpickle_RawRequestMessage__set_state(struct __pyx_obj_7aiohttp_12_http_parser_RawRequestMessage *, PyObject *); /*proto*/ +static PyObject *__pyx_f_7aiohttp_12_http_parser___pyx_unpickle_RawResponseMessage__set_state(struct __pyx_obj_7aiohttp_12_http_parser_RawResponseMessage *, PyObject *); /*proto*/ +#define __Pyx_MODULE_NAME "aiohttp._http_parser" +extern int __pyx_module_is_main_aiohttp___http_parser; +int __pyx_module_is_main_aiohttp___http_parser = 0; + +/* Implementation of 'aiohttp._http_parser' */ +static PyObject *__pyx_builtin_range; +static PyObject *__pyx_builtin_MemoryError; +static PyObject *__pyx_builtin_TypeError; +static PyObject *__pyx_builtin_BaseException; +static const char __pyx_k_[] = "="; +static const char __pyx_k_i[] = "i"; +static const char __pyx_k_TE[] = "TE"; +static const char __pyx_k__2[] = ", "; +static const char __pyx_k__3[] = ")>"; +static const char __pyx_k__4[] = ""; +static const char __pyx_k__7[] = "?"; +static const char __pyx_k__8[] = "#"; +static const char __pyx_k_br[] = "br"; +static const char __pyx_k_AGE[] = "AGE"; +static const char __pyx_k_URI[] = "URI"; +static const char __pyx_k_URL[] = "URL"; +static const char __pyx_k_VIA[] = "VIA"; +static const char __pyx_k_add[] = "add"; +static const char __pyx_k_all[] = "__all__"; +static const char __pyx_k_new[] = "__new__"; +static const char __pyx_k_url[] = "url"; +static const char __pyx_k_DATE[] = "DATE"; +static const char __pyx_k_ETAG[] = "ETAG"; +static const char __pyx_k_FROM[] = "FROM"; +static const char __pyx_k_HOST[] = "HOST"; +static const char __pyx_k_LINK[] = "LINK"; +static const char __pyx_k_VARY[] = "VARY"; +static const char __pyx_k_args[] = "args"; +static const char __pyx_k_code[] = "code"; +static const char __pyx_k_dict[] = "__dict__"; +static const char __pyx_k_gzip[] = "gzip"; +static const char __pyx_k_hdrs[] = "hdrs"; +static const char __pyx_k_loop[] = "loop"; +static const char __pyx_k_main[] = "__main__"; +static const char __pyx_k_name[] = "__name__"; +static const char __pyx_k_path[] = "path"; +static const char __pyx_k_send[] = "send"; +static const char __pyx_k_test[] = "__test__"; +static const char __pyx_k_yarl[] = "yarl"; +static const char __pyx_k_ALLOW[] = "ALLOW"; +static const char __pyx_k_RANGE[] = "RANGE"; +static const char __pyx_k_URL_2[] = "_URL"; +static const char __pyx_k_build[] = "build"; +static const char __pyx_k_close[] = "close"; +static const char __pyx_k_limit[] = "limit"; +static const char __pyx_k_lower[] = "lower"; +static const char __pyx_k_range[] = "range"; +static const char __pyx_k_throw[] = "throw"; +static const char __pyx_k_timer[] = "timer"; +static const char __pyx_k_ACCEPT[] = "ACCEPT"; +static const char __pyx_k_COOKIE[] = "COOKIE"; +static const char __pyx_k_DIGEST[] = "DIGEST"; +static const char __pyx_k_EXPECT[] = "EXPECT"; +static const char __pyx_k_ORIGIN[] = "ORIGIN"; +static const char __pyx_k_PRAGMA[] = "PRAGMA"; +static const char __pyx_k_SERVER[] = "SERVER"; +static const char __pyx_k_import[] = "__import__"; +static const char __pyx_k_method[] = "method"; +static const char __pyx_k_pickle[] = "pickle"; +static const char __pyx_k_reason[] = "reason"; +static const char __pyx_k_reduce[] = "__reduce__"; +static const char __pyx_k_update[] = "update"; +static const char __pyx_k_EXPIRES[] = "EXPIRES"; +static const char __pyx_k_REFERER[] = "REFERER"; +static const char __pyx_k_TRAILER[] = "TRAILER"; +static const char __pyx_k_UPGRADE[] = "UPGRADE"; +static const char __pyx_k_WARNING[] = "WARNING"; +static const char __pyx_k_aiohttp[] = "aiohttp"; +static const char __pyx_k_chunked[] = "chunked"; +static const char __pyx_k_deflate[] = "deflate"; +static const char __pyx_k_encoded[] = "encoded"; +static const char __pyx_k_genexpr[] = "genexpr"; +static const char __pyx_k_headers[] = "headers"; +static const char __pyx_k_streams[] = "streams"; +static const char __pyx_k_unknown[] = ""; +static const char __pyx_k_upgrade[] = "upgrade"; +static const char __pyx_k_version[] = "version"; +static const char __pyx_k_IF_MATCH[] = "IF_MATCH"; +static const char __pyx_k_IF_RANGE[] = "IF_RANGE"; +static const char __pyx_k_LOCATION[] = "LOCATION"; +static const char __pyx_k_feed_eof[] = "feed_eof"; +static const char __pyx_k_fragment[] = "fragment"; +static const char __pyx_k_getstate[] = "__getstate__"; +static const char __pyx_k_protocol[] = "protocol"; +static const char __pyx_k_pyx_type[] = "__pyx_type"; +static const char __pyx_k_setstate[] = "__setstate__"; +static const char __pyx_k_FORWARDED[] = "FORWARDED"; +static const char __pyx_k_TypeError[] = "TypeError"; +static const char __pyx_k_feed_data[] = "feed_data"; +static const char __pyx_k_multidict[] = "multidict"; +static const char __pyx_k_pyx_state[] = "__pyx_state"; +static const char __pyx_k_reduce_ex[] = "__reduce_ex__"; +static const char __pyx_k_CONNECTION[] = "CONNECTION"; +static const char __pyx_k_KEEP_ALIVE[] = "KEEP_ALIVE"; +static const char __pyx_k_SET_COOKIE[] = "SET_COOKIE"; +static const char __pyx_k_USER_AGENT[] = "USER_AGENT"; +static const char __pyx_k_pyx_result[] = "__pyx_result"; +static const char __pyx_k_pyx_vtable[] = "__pyx_vtable__"; +static const char __pyx_k_CIMultiDict[] = "CIMultiDict"; +static const char __pyx_k_CONTENT_MD5[] = "CONTENT_MD5"; +static const char __pyx_k_DESTINATION[] = "DESTINATION"; +static const char __pyx_k_HttpVersion[] = "HttpVersion"; +static const char __pyx_k_LineTooLong[] = "LineTooLong"; +static const char __pyx_k_MemoryError[] = "MemoryError"; +static const char __pyx_k_PickleError[] = "PickleError"; +static const char __pyx_k_RETRY_AFTER[] = "RETRY_AFTER"; +static const char __pyx_k_WANT_DIGEST[] = "WANT_DIGEST"; +static const char __pyx_k_compression[] = "compression"; +static const char __pyx_k_http_parser[] = "http_parser"; +static const char __pyx_k_http_writer[] = "http_writer"; +static const char __pyx_k_max_headers[] = "max_headers"; +static const char __pyx_k_raw_headers[] = "raw_headers"; +static const char __pyx_k_CONTENT_TYPE[] = "CONTENT_TYPE"; +static const char __pyx_k_MAX_FORWARDS[] = "MAX_FORWARDS"; +static const char __pyx_k_StreamReader[] = "StreamReader"; +static const char __pyx_k_pyx_checksum[] = "__pyx_checksum"; +static const char __pyx_k_query_string[] = "query_string"; +static const char __pyx_k_should_close[] = "should_close"; +static const char __pyx_k_stringsource[] = "stringsource"; +static const char __pyx_k_ACCEPT_RANGES[] = "ACCEPT_RANGES"; +static const char __pyx_k_AUTHORIZATION[] = "AUTHORIZATION"; +static const char __pyx_k_BadStatusLine[] = "BadStatusLine"; +static const char __pyx_k_BaseException[] = "BaseException"; +static const char __pyx_k_CACHE_CONTROL[] = "CACHE_CONTROL"; +static const char __pyx_k_CIMultiDict_2[] = "_CIMultiDict"; +static const char __pyx_k_CONTENT_RANGE[] = "CONTENT_RANGE"; +static const char __pyx_k_DeflateBuffer[] = "DeflateBuffer"; +static const char __pyx_k_EMPTY_PAYLOAD[] = "EMPTY_PAYLOAD"; +static const char __pyx_k_HttpVersion10[] = "HttpVersion10"; +static const char __pyx_k_HttpVersion11[] = "HttpVersion11"; +static const char __pyx_k_HttpVersion_2[] = "_HttpVersion"; +static const char __pyx_k_IF_NONE_MATCH[] = "IF_NONE_MATCH"; +static const char __pyx_k_InvalidHeader[] = "InvalidHeader"; +static const char __pyx_k_LAST_EVENT_ID[] = "LAST_EVENT_ID"; +static const char __pyx_k_LAST_MODIFIED[] = "LAST_MODIFIED"; +static const char __pyx_k_max_line_size[] = "max_line_size"; +static const char __pyx_k_reduce_cython[] = "__reduce_cython__"; +static const char __pyx_k_set_exception[] = "set_exception"; +static const char __pyx_k_ACCEPT_CHARSET[] = "ACCEPT_CHARSET"; +static const char __pyx_k_BadHttpMessage[] = "BadHttpMessage"; +static const char __pyx_k_CONTENT_LENGTH[] = "CONTENT_LENGTH"; +static const char __pyx_k_StreamReader_2[] = "_StreamReader"; +static const char __pyx_k_max_field_size[] = "max_field_size"; +static const char __pyx_k_read_until_eof[] = "read_until_eof"; +static const char __pyx_k_ACCEPT_ENCODING[] = "ACCEPT_ENCODING"; +static const char __pyx_k_ACCEPT_LANGUAGE[] = "ACCEPT_LANGUAGE"; +static const char __pyx_k_DeflateBuffer_2[] = "_DeflateBuffer"; +static const char __pyx_k_EMPTY_PAYLOAD_2[] = "_EMPTY_PAYLOAD"; +static const char __pyx_k_HttpVersion10_2[] = "_HttpVersion10"; +static const char __pyx_k_HttpVersion11_2[] = "_HttpVersion11"; +static const char __pyx_k_InvalidURLError[] = "InvalidURLError"; +static const char __pyx_k_X_FORWARDED_FOR[] = "X_FORWARDED_FOR"; +static const char __pyx_k_auto_decompress[] = "auto_decompress"; +static const char __pyx_k_http_exceptions[] = "http_exceptions"; +static const char __pyx_k_pyx_PickleError[] = "__pyx_PickleError"; +static const char __pyx_k_setstate_cython[] = "__setstate_cython__"; +static const char __pyx_k_CIMultiDictProxy[] = "CIMultiDictProxy"; +static const char __pyx_k_CONTENT_ENCODING[] = "CONTENT_ENCODING"; +static const char __pyx_k_CONTENT_LANGUAGE[] = "CONTENT_LANGUAGE"; +static const char __pyx_k_CONTENT_LOCATION[] = "CONTENT_LOCATION"; +static const char __pyx_k_WWW_AUTHENTICATE[] = "WWW_AUTHENTICATE"; +static const char __pyx_k_X_FORWARDED_HOST[] = "X_FORWARDED_HOST"; +static const char __pyx_k_HttpRequestParser[] = "HttpRequestParser"; +static const char __pyx_k_IF_MODIFIED_SINCE[] = "IF_MODIFIED_SINCE"; +static const char __pyx_k_RawRequestMessage[] = "_http_method[i] + */ + +static CYTHON_INLINE PyObject *__pyx_f_7aiohttp_12_http_parser_http_method_str(int __pyx_v_i) { + PyObject *__pyx_r = NULL; + __Pyx_RefNannyDeclarations + int __pyx_t_1; + PyObject *__pyx_t_2 = NULL; + int __pyx_lineno = 0; + const char *__pyx_filename = NULL; + int __pyx_clineno = 0; + __Pyx_RefNannySetupContext("http_method_str", 0); + + /* "aiohttp/_http_parser.pyx":93 + * + * cdef inline str http_method_str(int i): + * if i < METHODS_COUNT: # <<<<<<<<<<<<<< + * return _http_method[i] + * else: + */ + __pyx_t_1 = ((__pyx_v_i < 46) != 0); + if (__pyx_t_1) { + + /* "aiohttp/_http_parser.pyx":94 + * cdef inline str http_method_str(int i): + * if i < METHODS_COUNT: + * return _http_method[i] # <<<<<<<<<<<<<< + * else: + * return "" + */ + __Pyx_XDECREF(__pyx_r); + if (unlikely(__pyx_v_7aiohttp_12_http_parser__http_method == Py_None)) { + PyErr_SetString(PyExc_TypeError, "'NoneType' object is not subscriptable"); + __PYX_ERR(0, 94, __pyx_L1_error) + } + __pyx_t_2 = __Pyx_GetItemInt_List(__pyx_v_7aiohttp_12_http_parser__http_method, __pyx_v_i, int, 1, __Pyx_PyInt_From_int, 1, 1, 1); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 94, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_2); + __Pyx_INCREF(((PyObject*)__pyx_t_2)); + __pyx_r = ((PyObject*)__pyx_t_2); + __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; + goto __pyx_L0; + + /* "aiohttp/_http_parser.pyx":93 + * + * cdef inline str http_method_str(int i): + * if i < METHODS_COUNT: # <<<<<<<<<<<<<< + * return _http_method[i] + * else: + */ + } + + /* "aiohttp/_http_parser.pyx":96 + * return _http_method[i] + * else: + * return "" # <<<<<<<<<<<<<< + * + * cdef inline object find_header(bytes raw_header): + */ + /*else*/ { + __Pyx_XDECREF(__pyx_r); + __Pyx_INCREF(__pyx_kp_u_unknown); + __pyx_r = __pyx_kp_u_unknown; + goto __pyx_L0; + } + + /* "aiohttp/_http_parser.pyx":92 + * + * + * cdef inline str http_method_str(int i): # <<<<<<<<<<<<<< + * if i < METHODS_COUNT: + * return _http_method[i] + */ + + /* function exit code */ + __pyx_L1_error:; + __Pyx_XDECREF(__pyx_t_2); + __Pyx_AddTraceback("aiohttp._http_parser.http_method_str", __pyx_clineno, __pyx_lineno, __pyx_filename); + __pyx_r = 0; + __pyx_L0:; + __Pyx_XGIVEREF(__pyx_r); + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +/* "aiohttp/_http_parser.pyx":98 + * return "" + * + * cdef inline object find_header(bytes raw_header): # <<<<<<<<<<<<<< + * cdef Py_ssize_t size + * cdef char *buf + */ + +static CYTHON_INLINE PyObject *__pyx_f_7aiohttp_12_http_parser_find_header(PyObject *__pyx_v_raw_header) { + Py_ssize_t __pyx_v_size; + char *__pyx_v_buf; + int __pyx_v_idx; + PyObject *__pyx_r = NULL; + __Pyx_RefNannyDeclarations + int __pyx_t_1; + int __pyx_t_2; + PyObject *__pyx_t_3 = NULL; + int __pyx_lineno = 0; + const char *__pyx_filename = NULL; + int __pyx_clineno = 0; + __Pyx_RefNannySetupContext("find_header", 0); + + /* "aiohttp/_http_parser.pyx":102 + * cdef char *buf + * cdef int idx + * PyBytes_AsStringAndSize(raw_header, &buf, &size) # <<<<<<<<<<<<<< + * idx = _find_header.find_header(buf, size) + * if idx == -1: + */ + __pyx_t_1 = PyBytes_AsStringAndSize(__pyx_v_raw_header, (&__pyx_v_buf), (&__pyx_v_size)); if (unlikely(__pyx_t_1 == ((int)-1))) __PYX_ERR(0, 102, __pyx_L1_error) + + /* "aiohttp/_http_parser.pyx":103 + * cdef int idx + * PyBytes_AsStringAndSize(raw_header, &buf, &size) + * idx = _find_header.find_header(buf, size) # <<<<<<<<<<<<<< + * if idx == -1: + * return raw_header.decode('utf-8', 'surrogateescape') + */ + __pyx_v_idx = find_header(__pyx_v_buf, __pyx_v_size); + + /* "aiohttp/_http_parser.pyx":104 + * PyBytes_AsStringAndSize(raw_header, &buf, &size) + * idx = _find_header.find_header(buf, size) + * if idx == -1: # <<<<<<<<<<<<<< + * return raw_header.decode('utf-8', 'surrogateescape') + * return headers[idx] + */ + __pyx_t_2 = ((__pyx_v_idx == -1L) != 0); + if (__pyx_t_2) { + + /* "aiohttp/_http_parser.pyx":105 + * idx = _find_header.find_header(buf, size) + * if idx == -1: + * return raw_header.decode('utf-8', 'surrogateescape') # <<<<<<<<<<<<<< + * return headers[idx] + * + */ + __Pyx_XDECREF(__pyx_r); + if (unlikely(__pyx_v_raw_header == Py_None)) { + PyErr_Format(PyExc_AttributeError, "'NoneType' object has no attribute '%.30s'", "decode"); + __PYX_ERR(0, 105, __pyx_L1_error) + } + __pyx_t_3 = __Pyx_decode_bytes(__pyx_v_raw_header, 0, PY_SSIZE_T_MAX, NULL, ((char const *)"surrogateescape"), PyUnicode_DecodeUTF8); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 105, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_3); + __pyx_r = __pyx_t_3; + __pyx_t_3 = 0; + goto __pyx_L0; + + /* "aiohttp/_http_parser.pyx":104 + * PyBytes_AsStringAndSize(raw_header, &buf, &size) + * idx = _find_header.find_header(buf, size) + * if idx == -1: # <<<<<<<<<<<<<< + * return raw_header.decode('utf-8', 'surrogateescape') + * return headers[idx] + */ + } + + /* "aiohttp/_http_parser.pyx":106 + * if idx == -1: + * return raw_header.decode('utf-8', 'surrogateescape') + * return headers[idx] # <<<<<<<<<<<<<< + * + * + */ + __Pyx_XDECREF(__pyx_r); + if (unlikely(__pyx_v_7aiohttp_12_http_parser_headers == Py_None)) { + PyErr_SetString(PyExc_TypeError, "'NoneType' object is not subscriptable"); + __PYX_ERR(0, 106, __pyx_L1_error) + } + __pyx_t_3 = __Pyx_GetItemInt_Tuple(__pyx_v_7aiohttp_12_http_parser_headers, __pyx_v_idx, int, 1, __Pyx_PyInt_From_int, 0, 1, 1); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 106, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_3); + __pyx_r = __pyx_t_3; + __pyx_t_3 = 0; + goto __pyx_L0; + + /* "aiohttp/_http_parser.pyx":98 + * return "" + * + * cdef inline object find_header(bytes raw_header): # <<<<<<<<<<<<<< + * cdef Py_ssize_t size + * cdef char *buf + */ + + /* function exit code */ + __pyx_L1_error:; + __Pyx_XDECREF(__pyx_t_3); + __Pyx_AddTraceback("aiohttp._http_parser.find_header", __pyx_clineno, __pyx_lineno, __pyx_filename); + __pyx_r = 0; + __pyx_L0:; + __Pyx_XGIVEREF(__pyx_r); + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +/* "aiohttp/_http_parser.pyx":122 + * cdef readonly object url # yarl.URL + * + * def __init__(self, method, path, version, headers, raw_headers, # <<<<<<<<<<<<<< + * should_close, compression, upgrade, chunked, url): + * self.method = method + */ + +/* Python wrapper */ +static int __pyx_pw_7aiohttp_12_http_parser_17RawRequestMessage_1__init__(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/ +static int __pyx_pw_7aiohttp_12_http_parser_17RawRequestMessage_1__init__(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds) { + PyObject *__pyx_v_method = 0; + PyObject *__pyx_v_path = 0; + PyObject *__pyx_v_version = 0; + PyObject *__pyx_v_headers = 0; + PyObject *__pyx_v_raw_headers = 0; + PyObject *__pyx_v_should_close = 0; + PyObject *__pyx_v_compression = 0; + PyObject *__pyx_v_upgrade = 0; + PyObject *__pyx_v_chunked = 0; + PyObject *__pyx_v_url = 0; + int __pyx_lineno = 0; + const char *__pyx_filename = NULL; + int __pyx_clineno = 0; + int __pyx_r; + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("__init__ (wrapper)", 0); + { + static PyObject **__pyx_pyargnames[] = {&__pyx_n_s_method,&__pyx_n_s_path,&__pyx_n_s_version,&__pyx_n_s_headers,&__pyx_n_s_raw_headers,&__pyx_n_s_should_close,&__pyx_n_s_compression,&__pyx_n_s_upgrade,&__pyx_n_s_chunked,&__pyx_n_s_url,0}; + PyObject* values[10] = {0,0,0,0,0,0,0,0,0,0}; + if (unlikely(__pyx_kwds)) { + Py_ssize_t kw_args; + const Py_ssize_t pos_args = PyTuple_GET_SIZE(__pyx_args); + switch (pos_args) { + case 10: values[9] = PyTuple_GET_ITEM(__pyx_args, 9); + CYTHON_FALLTHROUGH; + case 9: values[8] = PyTuple_GET_ITEM(__pyx_args, 8); + CYTHON_FALLTHROUGH; + case 8: values[7] = PyTuple_GET_ITEM(__pyx_args, 7); + CYTHON_FALLTHROUGH; + case 7: values[6] = PyTuple_GET_ITEM(__pyx_args, 6); + CYTHON_FALLTHROUGH; + case 6: values[5] = PyTuple_GET_ITEM(__pyx_args, 5); + CYTHON_FALLTHROUGH; + case 5: values[4] = PyTuple_GET_ITEM(__pyx_args, 4); + CYTHON_FALLTHROUGH; + case 4: values[3] = PyTuple_GET_ITEM(__pyx_args, 3); + CYTHON_FALLTHROUGH; + case 3: values[2] = PyTuple_GET_ITEM(__pyx_args, 2); + CYTHON_FALLTHROUGH; + case 2: values[1] = PyTuple_GET_ITEM(__pyx_args, 1); + CYTHON_FALLTHROUGH; + case 1: values[0] = PyTuple_GET_ITEM(__pyx_args, 0); + CYTHON_FALLTHROUGH; + case 0: break; + default: goto __pyx_L5_argtuple_error; + } + kw_args = PyDict_Size(__pyx_kwds); + switch (pos_args) { + case 0: + if (likely((values[0] = __Pyx_PyDict_GetItemStr(__pyx_kwds, __pyx_n_s_method)) != 0)) kw_args--; + else goto __pyx_L5_argtuple_error; + CYTHON_FALLTHROUGH; + case 1: + if (likely((values[1] = __Pyx_PyDict_GetItemStr(__pyx_kwds, __pyx_n_s_path)) != 0)) kw_args--; + else { + __Pyx_RaiseArgtupleInvalid("__init__", 1, 10, 10, 1); __PYX_ERR(0, 122, __pyx_L3_error) + } + CYTHON_FALLTHROUGH; + case 2: + if (likely((values[2] = __Pyx_PyDict_GetItemStr(__pyx_kwds, __pyx_n_s_version)) != 0)) kw_args--; + else { + __Pyx_RaiseArgtupleInvalid("__init__", 1, 10, 10, 2); __PYX_ERR(0, 122, __pyx_L3_error) + } + CYTHON_FALLTHROUGH; + case 3: + if (likely((values[3] = __Pyx_PyDict_GetItemStr(__pyx_kwds, __pyx_n_s_headers)) != 0)) kw_args--; + else { + __Pyx_RaiseArgtupleInvalid("__init__", 1, 10, 10, 3); __PYX_ERR(0, 122, __pyx_L3_error) + } + CYTHON_FALLTHROUGH; + case 4: + if (likely((values[4] = __Pyx_PyDict_GetItemStr(__pyx_kwds, __pyx_n_s_raw_headers)) != 0)) kw_args--; + else { + __Pyx_RaiseArgtupleInvalid("__init__", 1, 10, 10, 4); __PYX_ERR(0, 122, __pyx_L3_error) + } + CYTHON_FALLTHROUGH; + case 5: + if (likely((values[5] = __Pyx_PyDict_GetItemStr(__pyx_kwds, __pyx_n_s_should_close)) != 0)) kw_args--; + else { + __Pyx_RaiseArgtupleInvalid("__init__", 1, 10, 10, 5); __PYX_ERR(0, 122, __pyx_L3_error) + } + CYTHON_FALLTHROUGH; + case 6: + if (likely((values[6] = __Pyx_PyDict_GetItemStr(__pyx_kwds, __pyx_n_s_compression)) != 0)) kw_args--; + else { + __Pyx_RaiseArgtupleInvalid("__init__", 1, 10, 10, 6); __PYX_ERR(0, 122, __pyx_L3_error) + } + CYTHON_FALLTHROUGH; + case 7: + if (likely((values[7] = __Pyx_PyDict_GetItemStr(__pyx_kwds, __pyx_n_s_upgrade)) != 0)) kw_args--; + else { + __Pyx_RaiseArgtupleInvalid("__init__", 1, 10, 10, 7); __PYX_ERR(0, 122, __pyx_L3_error) + } + CYTHON_FALLTHROUGH; + case 8: + if (likely((values[8] = __Pyx_PyDict_GetItemStr(__pyx_kwds, __pyx_n_s_chunked)) != 0)) kw_args--; + else { + __Pyx_RaiseArgtupleInvalid("__init__", 1, 10, 10, 8); __PYX_ERR(0, 122, __pyx_L3_error) + } + CYTHON_FALLTHROUGH; + case 9: + if (likely((values[9] = __Pyx_PyDict_GetItemStr(__pyx_kwds, __pyx_n_s_url)) != 0)) kw_args--; + else { + __Pyx_RaiseArgtupleInvalid("__init__", 1, 10, 10, 9); __PYX_ERR(0, 122, __pyx_L3_error) + } + } + if (unlikely(kw_args > 0)) { + if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, pos_args, "__init__") < 0)) __PYX_ERR(0, 122, __pyx_L3_error) + } + } else if (PyTuple_GET_SIZE(__pyx_args) != 10) { + goto __pyx_L5_argtuple_error; + } else { + values[0] = PyTuple_GET_ITEM(__pyx_args, 0); + values[1] = PyTuple_GET_ITEM(__pyx_args, 1); + values[2] = PyTuple_GET_ITEM(__pyx_args, 2); + values[3] = PyTuple_GET_ITEM(__pyx_args, 3); + values[4] = PyTuple_GET_ITEM(__pyx_args, 4); + values[5] = PyTuple_GET_ITEM(__pyx_args, 5); + values[6] = PyTuple_GET_ITEM(__pyx_args, 6); + values[7] = PyTuple_GET_ITEM(__pyx_args, 7); + values[8] = PyTuple_GET_ITEM(__pyx_args, 8); + values[9] = PyTuple_GET_ITEM(__pyx_args, 9); + } + __pyx_v_method = values[0]; + __pyx_v_path = values[1]; + __pyx_v_version = values[2]; + __pyx_v_headers = values[3]; + __pyx_v_raw_headers = values[4]; + __pyx_v_should_close = values[5]; + __pyx_v_compression = values[6]; + __pyx_v_upgrade = values[7]; + __pyx_v_chunked = values[8]; + __pyx_v_url = values[9]; + } + goto __pyx_L4_argument_unpacking_done; + __pyx_L5_argtuple_error:; + __Pyx_RaiseArgtupleInvalid("__init__", 1, 10, 10, PyTuple_GET_SIZE(__pyx_args)); __PYX_ERR(0, 122, __pyx_L3_error) + __pyx_L3_error:; + __Pyx_AddTraceback("aiohttp._http_parser.RawRequestMessage.__init__", __pyx_clineno, __pyx_lineno, __pyx_filename); + __Pyx_RefNannyFinishContext(); + return -1; + __pyx_L4_argument_unpacking_done:; + __pyx_r = __pyx_pf_7aiohttp_12_http_parser_17RawRequestMessage___init__(((struct __pyx_obj_7aiohttp_12_http_parser_RawRequestMessage *)__pyx_v_self), __pyx_v_method, __pyx_v_path, __pyx_v_version, __pyx_v_headers, __pyx_v_raw_headers, __pyx_v_should_close, __pyx_v_compression, __pyx_v_upgrade, __pyx_v_chunked, __pyx_v_url); + + /* function exit code */ + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +static int __pyx_pf_7aiohttp_12_http_parser_17RawRequestMessage___init__(struct __pyx_obj_7aiohttp_12_http_parser_RawRequestMessage *__pyx_v_self, PyObject *__pyx_v_method, PyObject *__pyx_v_path, PyObject *__pyx_v_version, PyObject *__pyx_v_headers, PyObject *__pyx_v_raw_headers, PyObject *__pyx_v_should_close, PyObject *__pyx_v_compression, PyObject *__pyx_v_upgrade, PyObject *__pyx_v_chunked, PyObject *__pyx_v_url) { + int __pyx_r; + __Pyx_RefNannyDeclarations + PyObject *__pyx_t_1 = NULL; + int __pyx_lineno = 0; + const char *__pyx_filename = NULL; + int __pyx_clineno = 0; + __Pyx_RefNannySetupContext("__init__", 0); + + /* "aiohttp/_http_parser.pyx":124 + * def __init__(self, method, path, version, headers, raw_headers, + * should_close, compression, upgrade, chunked, url): + * self.method = method # <<<<<<<<<<<<<< + * self.path = path + * self.version = version + */ + if (!(likely(PyUnicode_CheckExact(__pyx_v_method))||((__pyx_v_method) == Py_None)||(PyErr_Format(PyExc_TypeError, "Expected %.16s, got %.200s", "unicode", Py_TYPE(__pyx_v_method)->tp_name), 0))) __PYX_ERR(0, 124, __pyx_L1_error) + __pyx_t_1 = __pyx_v_method; + __Pyx_INCREF(__pyx_t_1); + __Pyx_GIVEREF(__pyx_t_1); + __Pyx_GOTREF(__pyx_v_self->method); + __Pyx_DECREF(__pyx_v_self->method); + __pyx_v_self->method = ((PyObject*)__pyx_t_1); + __pyx_t_1 = 0; + + /* "aiohttp/_http_parser.pyx":125 + * should_close, compression, upgrade, chunked, url): + * self.method = method + * self.path = path # <<<<<<<<<<<<<< + * self.version = version + * self.headers = headers + */ + if (!(likely(PyUnicode_CheckExact(__pyx_v_path))||((__pyx_v_path) == Py_None)||(PyErr_Format(PyExc_TypeError, "Expected %.16s, got %.200s", "unicode", Py_TYPE(__pyx_v_path)->tp_name), 0))) __PYX_ERR(0, 125, __pyx_L1_error) + __pyx_t_1 = __pyx_v_path; + __Pyx_INCREF(__pyx_t_1); + __Pyx_GIVEREF(__pyx_t_1); + __Pyx_GOTREF(__pyx_v_self->path); + __Pyx_DECREF(__pyx_v_self->path); + __pyx_v_self->path = ((PyObject*)__pyx_t_1); + __pyx_t_1 = 0; + + /* "aiohttp/_http_parser.pyx":126 + * self.method = method + * self.path = path + * self.version = version # <<<<<<<<<<<<<< + * self.headers = headers + * self.raw_headers = raw_headers + */ + __Pyx_INCREF(__pyx_v_version); + __Pyx_GIVEREF(__pyx_v_version); + __Pyx_GOTREF(__pyx_v_self->version); + __Pyx_DECREF(__pyx_v_self->version); + __pyx_v_self->version = __pyx_v_version; + + /* "aiohttp/_http_parser.pyx":127 + * self.path = path + * self.version = version + * self.headers = headers # <<<<<<<<<<<<<< + * self.raw_headers = raw_headers + * self.should_close = should_close + */ + __Pyx_INCREF(__pyx_v_headers); + __Pyx_GIVEREF(__pyx_v_headers); + __Pyx_GOTREF(__pyx_v_self->headers); + __Pyx_DECREF(__pyx_v_self->headers); + __pyx_v_self->headers = __pyx_v_headers; + + /* "aiohttp/_http_parser.pyx":128 + * self.version = version + * self.headers = headers + * self.raw_headers = raw_headers # <<<<<<<<<<<<<< + * self.should_close = should_close + * self.compression = compression + */ + __Pyx_INCREF(__pyx_v_raw_headers); + __Pyx_GIVEREF(__pyx_v_raw_headers); + __Pyx_GOTREF(__pyx_v_self->raw_headers); + __Pyx_DECREF(__pyx_v_self->raw_headers); + __pyx_v_self->raw_headers = __pyx_v_raw_headers; + + /* "aiohttp/_http_parser.pyx":129 + * self.headers = headers + * self.raw_headers = raw_headers + * self.should_close = should_close # <<<<<<<<<<<<<< + * self.compression = compression + * self.upgrade = upgrade + */ + __Pyx_INCREF(__pyx_v_should_close); + __Pyx_GIVEREF(__pyx_v_should_close); + __Pyx_GOTREF(__pyx_v_self->should_close); + __Pyx_DECREF(__pyx_v_self->should_close); + __pyx_v_self->should_close = __pyx_v_should_close; + + /* "aiohttp/_http_parser.pyx":130 + * self.raw_headers = raw_headers + * self.should_close = should_close + * self.compression = compression # <<<<<<<<<<<<<< + * self.upgrade = upgrade + * self.chunked = chunked + */ + __Pyx_INCREF(__pyx_v_compression); + __Pyx_GIVEREF(__pyx_v_compression); + __Pyx_GOTREF(__pyx_v_self->compression); + __Pyx_DECREF(__pyx_v_self->compression); + __pyx_v_self->compression = __pyx_v_compression; + + /* "aiohttp/_http_parser.pyx":131 + * self.should_close = should_close + * self.compression = compression + * self.upgrade = upgrade # <<<<<<<<<<<<<< + * self.chunked = chunked + * self.url = url + */ + __Pyx_INCREF(__pyx_v_upgrade); + __Pyx_GIVEREF(__pyx_v_upgrade); + __Pyx_GOTREF(__pyx_v_self->upgrade); + __Pyx_DECREF(__pyx_v_self->upgrade); + __pyx_v_self->upgrade = __pyx_v_upgrade; + + /* "aiohttp/_http_parser.pyx":132 + * self.compression = compression + * self.upgrade = upgrade + * self.chunked = chunked # <<<<<<<<<<<<<< + * self.url = url + * + */ + __Pyx_INCREF(__pyx_v_chunked); + __Pyx_GIVEREF(__pyx_v_chunked); + __Pyx_GOTREF(__pyx_v_self->chunked); + __Pyx_DECREF(__pyx_v_self->chunked); + __pyx_v_self->chunked = __pyx_v_chunked; + + /* "aiohttp/_http_parser.pyx":133 + * self.upgrade = upgrade + * self.chunked = chunked + * self.url = url # <<<<<<<<<<<<<< + * + * def __repr__(self): + */ + __Pyx_INCREF(__pyx_v_url); + __Pyx_GIVEREF(__pyx_v_url); + __Pyx_GOTREF(__pyx_v_self->url); + __Pyx_DECREF(__pyx_v_self->url); + __pyx_v_self->url = __pyx_v_url; + + /* "aiohttp/_http_parser.pyx":122 + * cdef readonly object url # yarl.URL + * + * def __init__(self, method, path, version, headers, raw_headers, # <<<<<<<<<<<<<< + * should_close, compression, upgrade, chunked, url): + * self.method = method + */ + + /* function exit code */ + __pyx_r = 0; + goto __pyx_L0; + __pyx_L1_error:; + __Pyx_XDECREF(__pyx_t_1); + __Pyx_AddTraceback("aiohttp._http_parser.RawRequestMessage.__init__", __pyx_clineno, __pyx_lineno, __pyx_filename); + __pyx_r = -1; + __pyx_L0:; + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +/* "aiohttp/_http_parser.pyx":135 + * self.url = url + * + * def __repr__(self): # <<<<<<<<<<<<<< + * info = [] + * info.append(("method", self.method)) + */ + +/* Python wrapper */ +static PyObject *__pyx_pw_7aiohttp_12_http_parser_17RawRequestMessage_3__repr__(PyObject *__pyx_v_self); /*proto*/ +static PyObject *__pyx_pw_7aiohttp_12_http_parser_17RawRequestMessage_3__repr__(PyObject *__pyx_v_self) { + PyObject *__pyx_r = 0; + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("__repr__ (wrapper)", 0); + __pyx_r = __pyx_pf_7aiohttp_12_http_parser_17RawRequestMessage_2__repr__(((struct __pyx_obj_7aiohttp_12_http_parser_RawRequestMessage *)__pyx_v_self)); + + /* function exit code */ + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} +static PyObject *__pyx_gb_7aiohttp_12_http_parser_17RawRequestMessage_8__repr___2generator(__pyx_CoroutineObject *__pyx_generator, CYTHON_UNUSED PyThreadState *__pyx_tstate, PyObject *__pyx_sent_value); /* proto */ + +/* "aiohttp/_http_parser.pyx":147 + * info.append(("chunked", self.chunked)) + * info.append(("url", self.url)) + * sinfo = ', '.join(name + '=' + repr(val) for name, val in info) # <<<<<<<<<<<<<< + * return '' + * + */ + +static PyObject *__pyx_pf_7aiohttp_12_http_parser_17RawRequestMessage_8__repr___genexpr(PyObject *__pyx_self) { + struct __pyx_obj_7aiohttp_12_http_parser___pyx_scope_struct_1_genexpr *__pyx_cur_scope; + PyObject *__pyx_r = NULL; + __Pyx_RefNannyDeclarations + int __pyx_lineno = 0; + const char *__pyx_filename = NULL; + int __pyx_clineno = 0; + __Pyx_RefNannySetupContext("genexpr", 0); + __pyx_cur_scope = (struct __pyx_obj_7aiohttp_12_http_parser___pyx_scope_struct_1_genexpr *)__pyx_tp_new_7aiohttp_12_http_parser___pyx_scope_struct_1_genexpr(__pyx_ptype_7aiohttp_12_http_parser___pyx_scope_struct_1_genexpr, __pyx_empty_tuple, NULL); + if (unlikely(!__pyx_cur_scope)) { + __pyx_cur_scope = ((struct __pyx_obj_7aiohttp_12_http_parser___pyx_scope_struct_1_genexpr *)Py_None); + __Pyx_INCREF(Py_None); + __PYX_ERR(0, 147, __pyx_L1_error) + } else { + __Pyx_GOTREF(__pyx_cur_scope); + } + __pyx_cur_scope->__pyx_outer_scope = (struct __pyx_obj_7aiohttp_12_http_parser___pyx_scope_struct____repr__ *) __pyx_self; + __Pyx_INCREF(((PyObject *)__pyx_cur_scope->__pyx_outer_scope)); + __Pyx_GIVEREF(__pyx_cur_scope->__pyx_outer_scope); + { + __pyx_CoroutineObject *gen = __Pyx_Generator_New((__pyx_coroutine_body_t) __pyx_gb_7aiohttp_12_http_parser_17RawRequestMessage_8__repr___2generator, NULL, (PyObject *) __pyx_cur_scope, __pyx_n_s_genexpr, __pyx_n_s_repr___locals_genexpr, __pyx_n_s_aiohttp__http_parser); if (unlikely(!gen)) __PYX_ERR(0, 147, __pyx_L1_error) + __Pyx_DECREF(__pyx_cur_scope); + __Pyx_RefNannyFinishContext(); + return (PyObject *) gen; + } + + /* function exit code */ + __pyx_L1_error:; + __Pyx_AddTraceback("aiohttp._http_parser.RawRequestMessage.__repr__.genexpr", __pyx_clineno, __pyx_lineno, __pyx_filename); + __pyx_r = NULL; + __Pyx_DECREF(((PyObject *)__pyx_cur_scope)); + __Pyx_XGIVEREF(__pyx_r); + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +static PyObject *__pyx_gb_7aiohttp_12_http_parser_17RawRequestMessage_8__repr___2generator(__pyx_CoroutineObject *__pyx_generator, CYTHON_UNUSED PyThreadState *__pyx_tstate, PyObject *__pyx_sent_value) /* generator body */ +{ + struct __pyx_obj_7aiohttp_12_http_parser___pyx_scope_struct_1_genexpr *__pyx_cur_scope = ((struct __pyx_obj_7aiohttp_12_http_parser___pyx_scope_struct_1_genexpr *)__pyx_generator->closure); + PyObject *__pyx_r = NULL; + PyObject *__pyx_t_1 = NULL; + Py_ssize_t __pyx_t_2; + PyObject *__pyx_t_3 = NULL; + PyObject *__pyx_t_4 = NULL; + PyObject *__pyx_t_5 = NULL; + PyObject *__pyx_t_6 = NULL; + PyObject *(*__pyx_t_7)(PyObject *); + int __pyx_lineno = 0; + const char *__pyx_filename = NULL; + int __pyx_clineno = 0; + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("genexpr", 0); + switch (__pyx_generator->resume_label) { + case 0: goto __pyx_L3_first_run; + default: /* CPython raises the right error here */ + __Pyx_RefNannyFinishContext(); + return NULL; + } + __pyx_L3_first_run:; + if (unlikely(!__pyx_sent_value)) __PYX_ERR(0, 147, __pyx_L1_error) + __pyx_r = PyList_New(0); if (unlikely(!__pyx_r)) __PYX_ERR(0, 147, __pyx_L1_error) + __Pyx_GOTREF(__pyx_r); + if (unlikely(!__pyx_cur_scope->__pyx_outer_scope->__pyx_v_info)) { __Pyx_RaiseClosureNameError("info"); __PYX_ERR(0, 147, __pyx_L1_error) } + if (unlikely(__pyx_cur_scope->__pyx_outer_scope->__pyx_v_info == Py_None)) { + PyErr_SetString(PyExc_TypeError, "'NoneType' object is not iterable"); + __PYX_ERR(0, 147, __pyx_L1_error) + } + __pyx_t_1 = __pyx_cur_scope->__pyx_outer_scope->__pyx_v_info; __Pyx_INCREF(__pyx_t_1); __pyx_t_2 = 0; + for (;;) { + if (__pyx_t_2 >= PyList_GET_SIZE(__pyx_t_1)) break; + #if CYTHON_ASSUME_SAFE_MACROS && !CYTHON_AVOID_BORROWED_REFS + __pyx_t_3 = PyList_GET_ITEM(__pyx_t_1, __pyx_t_2); __Pyx_INCREF(__pyx_t_3); __pyx_t_2++; if (unlikely(0 < 0)) __PYX_ERR(0, 147, __pyx_L1_error) + #else + __pyx_t_3 = PySequence_ITEM(__pyx_t_1, __pyx_t_2); __pyx_t_2++; if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 147, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_3); + #endif + if ((likely(PyTuple_CheckExact(__pyx_t_3))) || (PyList_CheckExact(__pyx_t_3))) { + PyObject* sequence = __pyx_t_3; + Py_ssize_t size = __Pyx_PySequence_SIZE(sequence); + if (unlikely(size != 2)) { + if (size > 2) __Pyx_RaiseTooManyValuesError(2); + else if (size >= 0) __Pyx_RaiseNeedMoreValuesError(size); + __PYX_ERR(0, 147, __pyx_L1_error) + } + #if CYTHON_ASSUME_SAFE_MACROS && !CYTHON_AVOID_BORROWED_REFS + if (likely(PyTuple_CheckExact(sequence))) { + __pyx_t_4 = PyTuple_GET_ITEM(sequence, 0); + __pyx_t_5 = PyTuple_GET_ITEM(sequence, 1); + } else { + __pyx_t_4 = PyList_GET_ITEM(sequence, 0); + __pyx_t_5 = PyList_GET_ITEM(sequence, 1); + } + __Pyx_INCREF(__pyx_t_4); + __Pyx_INCREF(__pyx_t_5); + #else + __pyx_t_4 = PySequence_ITEM(sequence, 0); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 147, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_4); + __pyx_t_5 = PySequence_ITEM(sequence, 1); if (unlikely(!__pyx_t_5)) __PYX_ERR(0, 147, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_5); + #endif + __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; + } else { + Py_ssize_t index = -1; + __pyx_t_6 = PyObject_GetIter(__pyx_t_3); if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 147, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_6); + __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; + __pyx_t_7 = Py_TYPE(__pyx_t_6)->tp_iternext; + index = 0; __pyx_t_4 = __pyx_t_7(__pyx_t_6); if (unlikely(!__pyx_t_4)) goto __pyx_L6_unpacking_failed; + __Pyx_GOTREF(__pyx_t_4); + index = 1; __pyx_t_5 = __pyx_t_7(__pyx_t_6); if (unlikely(!__pyx_t_5)) goto __pyx_L6_unpacking_failed; + __Pyx_GOTREF(__pyx_t_5); + if (__Pyx_IternextUnpackEndCheck(__pyx_t_7(__pyx_t_6), 2) < 0) __PYX_ERR(0, 147, __pyx_L1_error) + __pyx_t_7 = NULL; + __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0; + goto __pyx_L7_unpacking_done; + __pyx_L6_unpacking_failed:; + __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0; + __pyx_t_7 = NULL; + if (__Pyx_IterFinish() == 0) __Pyx_RaiseNeedMoreValuesError(index); + __PYX_ERR(0, 147, __pyx_L1_error) + __pyx_L7_unpacking_done:; + } + __Pyx_XGOTREF(__pyx_cur_scope->__pyx_v_name); + __Pyx_XDECREF_SET(__pyx_cur_scope->__pyx_v_name, __pyx_t_4); + __Pyx_GIVEREF(__pyx_t_4); + __pyx_t_4 = 0; + __Pyx_XGOTREF(__pyx_cur_scope->__pyx_v_val); + __Pyx_XDECREF_SET(__pyx_cur_scope->__pyx_v_val, __pyx_t_5); + __Pyx_GIVEREF(__pyx_t_5); + __pyx_t_5 = 0; + __pyx_t_3 = PyNumber_Add(__pyx_cur_scope->__pyx_v_name, __pyx_kp_u_); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 147, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_3); + __pyx_t_5 = PyObject_Repr(__pyx_cur_scope->__pyx_v_val); if (unlikely(!__pyx_t_5)) __PYX_ERR(0, 147, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_5); + __pyx_t_4 = PyNumber_Add(__pyx_t_3, __pyx_t_5); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 147, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_4); + __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; + __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0; + if (unlikely(__Pyx_ListComp_Append(__pyx_r, (PyObject*)__pyx_t_4))) __PYX_ERR(0, 147, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; + } + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + CYTHON_MAYBE_UNUSED_VAR(__pyx_cur_scope); + + /* function exit code */ + goto __pyx_L0; + __pyx_L1_error:; + __Pyx_XDECREF(__pyx_r); __pyx_r = 0; + __Pyx_XDECREF(__pyx_t_1); + __Pyx_XDECREF(__pyx_t_3); + __Pyx_XDECREF(__pyx_t_4); + __Pyx_XDECREF(__pyx_t_5); + __Pyx_XDECREF(__pyx_t_6); + __Pyx_AddTraceback("genexpr", __pyx_clineno, __pyx_lineno, __pyx_filename); + __pyx_L0:; + __Pyx_XGIVEREF(__pyx_r); + #if !CYTHON_USE_EXC_INFO_STACK + __Pyx_Coroutine_ResetAndClearException(__pyx_generator); + #endif + __pyx_generator->resume_label = -1; + __Pyx_Coroutine_clear((PyObject*)__pyx_generator); + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +/* "aiohttp/_http_parser.pyx":135 + * self.url = url + * + * def __repr__(self): # <<<<<<<<<<<<<< + * info = [] + * info.append(("method", self.method)) + */ + +static PyObject *__pyx_pf_7aiohttp_12_http_parser_17RawRequestMessage_2__repr__(struct __pyx_obj_7aiohttp_12_http_parser_RawRequestMessage *__pyx_v_self) { + struct __pyx_obj_7aiohttp_12_http_parser___pyx_scope_struct____repr__ *__pyx_cur_scope; + PyObject *__pyx_v_sinfo = NULL; + PyObject *__pyx_gb_7aiohttp_12_http_parser_17RawRequestMessage_8__repr___2generator = 0; + PyObject *__pyx_r = NULL; + __Pyx_RefNannyDeclarations + PyObject *__pyx_t_1 = NULL; + int __pyx_t_2; + PyObject *__pyx_t_3 = NULL; + int __pyx_lineno = 0; + const char *__pyx_filename = NULL; + int __pyx_clineno = 0; + __Pyx_RefNannySetupContext("__repr__", 0); + __pyx_cur_scope = (struct __pyx_obj_7aiohttp_12_http_parser___pyx_scope_struct____repr__ *)__pyx_tp_new_7aiohttp_12_http_parser___pyx_scope_struct____repr__(__pyx_ptype_7aiohttp_12_http_parser___pyx_scope_struct____repr__, __pyx_empty_tuple, NULL); + if (unlikely(!__pyx_cur_scope)) { + __pyx_cur_scope = ((struct __pyx_obj_7aiohttp_12_http_parser___pyx_scope_struct____repr__ *)Py_None); + __Pyx_INCREF(Py_None); + __PYX_ERR(0, 135, __pyx_L1_error) + } else { + __Pyx_GOTREF(__pyx_cur_scope); + } + + /* "aiohttp/_http_parser.pyx":136 + * + * def __repr__(self): + * info = [] # <<<<<<<<<<<<<< + * info.append(("method", self.method)) + * info.append(("path", self.path)) + */ + __pyx_t_1 = PyList_New(0); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 136, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __Pyx_GIVEREF(__pyx_t_1); + __pyx_cur_scope->__pyx_v_info = ((PyObject*)__pyx_t_1); + __pyx_t_1 = 0; + + /* "aiohttp/_http_parser.pyx":137 + * def __repr__(self): + * info = [] + * info.append(("method", self.method)) # <<<<<<<<<<<<<< + * info.append(("path", self.path)) + * info.append(("version", self.version)) + */ + __pyx_t_1 = PyTuple_New(2); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 137, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __Pyx_INCREF(__pyx_n_u_method); + __Pyx_GIVEREF(__pyx_n_u_method); + PyTuple_SET_ITEM(__pyx_t_1, 0, __pyx_n_u_method); + __Pyx_INCREF(__pyx_v_self->method); + __Pyx_GIVEREF(__pyx_v_self->method); + PyTuple_SET_ITEM(__pyx_t_1, 1, __pyx_v_self->method); + __pyx_t_2 = __Pyx_PyList_Append(__pyx_cur_scope->__pyx_v_info, __pyx_t_1); if (unlikely(__pyx_t_2 == ((int)-1))) __PYX_ERR(0, 137, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + + /* "aiohttp/_http_parser.pyx":138 + * info = [] + * info.append(("method", self.method)) + * info.append(("path", self.path)) # <<<<<<<<<<<<<< + * info.append(("version", self.version)) + * info.append(("headers", self.headers)) + */ + __pyx_t_1 = PyTuple_New(2); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 138, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __Pyx_INCREF(__pyx_n_u_path); + __Pyx_GIVEREF(__pyx_n_u_path); + PyTuple_SET_ITEM(__pyx_t_1, 0, __pyx_n_u_path); + __Pyx_INCREF(__pyx_v_self->path); + __Pyx_GIVEREF(__pyx_v_self->path); + PyTuple_SET_ITEM(__pyx_t_1, 1, __pyx_v_self->path); + __pyx_t_2 = __Pyx_PyList_Append(__pyx_cur_scope->__pyx_v_info, __pyx_t_1); if (unlikely(__pyx_t_2 == ((int)-1))) __PYX_ERR(0, 138, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + + /* "aiohttp/_http_parser.pyx":139 + * info.append(("method", self.method)) + * info.append(("path", self.path)) + * info.append(("version", self.version)) # <<<<<<<<<<<<<< + * info.append(("headers", self.headers)) + * info.append(("raw_headers", self.raw_headers)) + */ + __pyx_t_1 = PyTuple_New(2); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 139, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __Pyx_INCREF(__pyx_n_u_version); + __Pyx_GIVEREF(__pyx_n_u_version); + PyTuple_SET_ITEM(__pyx_t_1, 0, __pyx_n_u_version); + __Pyx_INCREF(__pyx_v_self->version); + __Pyx_GIVEREF(__pyx_v_self->version); + PyTuple_SET_ITEM(__pyx_t_1, 1, __pyx_v_self->version); + __pyx_t_2 = __Pyx_PyList_Append(__pyx_cur_scope->__pyx_v_info, __pyx_t_1); if (unlikely(__pyx_t_2 == ((int)-1))) __PYX_ERR(0, 139, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + + /* "aiohttp/_http_parser.pyx":140 + * info.append(("path", self.path)) + * info.append(("version", self.version)) + * info.append(("headers", self.headers)) # <<<<<<<<<<<<<< + * info.append(("raw_headers", self.raw_headers)) + * info.append(("should_close", self.should_close)) + */ + __pyx_t_1 = PyTuple_New(2); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 140, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __Pyx_INCREF(__pyx_n_u_headers); + __Pyx_GIVEREF(__pyx_n_u_headers); + PyTuple_SET_ITEM(__pyx_t_1, 0, __pyx_n_u_headers); + __Pyx_INCREF(__pyx_v_self->headers); + __Pyx_GIVEREF(__pyx_v_self->headers); + PyTuple_SET_ITEM(__pyx_t_1, 1, __pyx_v_self->headers); + __pyx_t_2 = __Pyx_PyList_Append(__pyx_cur_scope->__pyx_v_info, __pyx_t_1); if (unlikely(__pyx_t_2 == ((int)-1))) __PYX_ERR(0, 140, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + + /* "aiohttp/_http_parser.pyx":141 + * info.append(("version", self.version)) + * info.append(("headers", self.headers)) + * info.append(("raw_headers", self.raw_headers)) # <<<<<<<<<<<<<< + * info.append(("should_close", self.should_close)) + * info.append(("compression", self.compression)) + */ + __pyx_t_1 = PyTuple_New(2); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 141, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __Pyx_INCREF(__pyx_n_u_raw_headers); + __Pyx_GIVEREF(__pyx_n_u_raw_headers); + PyTuple_SET_ITEM(__pyx_t_1, 0, __pyx_n_u_raw_headers); + __Pyx_INCREF(__pyx_v_self->raw_headers); + __Pyx_GIVEREF(__pyx_v_self->raw_headers); + PyTuple_SET_ITEM(__pyx_t_1, 1, __pyx_v_self->raw_headers); + __pyx_t_2 = __Pyx_PyList_Append(__pyx_cur_scope->__pyx_v_info, __pyx_t_1); if (unlikely(__pyx_t_2 == ((int)-1))) __PYX_ERR(0, 141, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + + /* "aiohttp/_http_parser.pyx":142 + * info.append(("headers", self.headers)) + * info.append(("raw_headers", self.raw_headers)) + * info.append(("should_close", self.should_close)) # <<<<<<<<<<<<<< + * info.append(("compression", self.compression)) + * info.append(("upgrade", self.upgrade)) + */ + __pyx_t_1 = PyTuple_New(2); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 142, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __Pyx_INCREF(__pyx_n_u_should_close); + __Pyx_GIVEREF(__pyx_n_u_should_close); + PyTuple_SET_ITEM(__pyx_t_1, 0, __pyx_n_u_should_close); + __Pyx_INCREF(__pyx_v_self->should_close); + __Pyx_GIVEREF(__pyx_v_self->should_close); + PyTuple_SET_ITEM(__pyx_t_1, 1, __pyx_v_self->should_close); + __pyx_t_2 = __Pyx_PyList_Append(__pyx_cur_scope->__pyx_v_info, __pyx_t_1); if (unlikely(__pyx_t_2 == ((int)-1))) __PYX_ERR(0, 142, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + + /* "aiohttp/_http_parser.pyx":143 + * info.append(("raw_headers", self.raw_headers)) + * info.append(("should_close", self.should_close)) + * info.append(("compression", self.compression)) # <<<<<<<<<<<<<< + * info.append(("upgrade", self.upgrade)) + * info.append(("chunked", self.chunked)) + */ + __pyx_t_1 = PyTuple_New(2); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 143, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __Pyx_INCREF(__pyx_n_u_compression); + __Pyx_GIVEREF(__pyx_n_u_compression); + PyTuple_SET_ITEM(__pyx_t_1, 0, __pyx_n_u_compression); + __Pyx_INCREF(__pyx_v_self->compression); + __Pyx_GIVEREF(__pyx_v_self->compression); + PyTuple_SET_ITEM(__pyx_t_1, 1, __pyx_v_self->compression); + __pyx_t_2 = __Pyx_PyList_Append(__pyx_cur_scope->__pyx_v_info, __pyx_t_1); if (unlikely(__pyx_t_2 == ((int)-1))) __PYX_ERR(0, 143, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + + /* "aiohttp/_http_parser.pyx":144 + * info.append(("should_close", self.should_close)) + * info.append(("compression", self.compression)) + * info.append(("upgrade", self.upgrade)) # <<<<<<<<<<<<<< + * info.append(("chunked", self.chunked)) + * info.append(("url", self.url)) + */ + __pyx_t_1 = PyTuple_New(2); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 144, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __Pyx_INCREF(__pyx_n_u_upgrade); + __Pyx_GIVEREF(__pyx_n_u_upgrade); + PyTuple_SET_ITEM(__pyx_t_1, 0, __pyx_n_u_upgrade); + __Pyx_INCREF(__pyx_v_self->upgrade); + __Pyx_GIVEREF(__pyx_v_self->upgrade); + PyTuple_SET_ITEM(__pyx_t_1, 1, __pyx_v_self->upgrade); + __pyx_t_2 = __Pyx_PyList_Append(__pyx_cur_scope->__pyx_v_info, __pyx_t_1); if (unlikely(__pyx_t_2 == ((int)-1))) __PYX_ERR(0, 144, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + + /* "aiohttp/_http_parser.pyx":145 + * info.append(("compression", self.compression)) + * info.append(("upgrade", self.upgrade)) + * info.append(("chunked", self.chunked)) # <<<<<<<<<<<<<< + * info.append(("url", self.url)) + * sinfo = ', '.join(name + '=' + repr(val) for name, val in info) + */ + __pyx_t_1 = PyTuple_New(2); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 145, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __Pyx_INCREF(__pyx_n_u_chunked); + __Pyx_GIVEREF(__pyx_n_u_chunked); + PyTuple_SET_ITEM(__pyx_t_1, 0, __pyx_n_u_chunked); + __Pyx_INCREF(__pyx_v_self->chunked); + __Pyx_GIVEREF(__pyx_v_self->chunked); + PyTuple_SET_ITEM(__pyx_t_1, 1, __pyx_v_self->chunked); + __pyx_t_2 = __Pyx_PyList_Append(__pyx_cur_scope->__pyx_v_info, __pyx_t_1); if (unlikely(__pyx_t_2 == ((int)-1))) __PYX_ERR(0, 145, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + + /* "aiohttp/_http_parser.pyx":146 + * info.append(("upgrade", self.upgrade)) + * info.append(("chunked", self.chunked)) + * info.append(("url", self.url)) # <<<<<<<<<<<<<< + * sinfo = ', '.join(name + '=' + repr(val) for name, val in info) + * return '' + */ + __pyx_t_1 = PyTuple_New(2); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 146, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __Pyx_INCREF(__pyx_n_u_url); + __Pyx_GIVEREF(__pyx_n_u_url); + PyTuple_SET_ITEM(__pyx_t_1, 0, __pyx_n_u_url); + __Pyx_INCREF(__pyx_v_self->url); + __Pyx_GIVEREF(__pyx_v_self->url); + PyTuple_SET_ITEM(__pyx_t_1, 1, __pyx_v_self->url); + __pyx_t_2 = __Pyx_PyList_Append(__pyx_cur_scope->__pyx_v_info, __pyx_t_1); if (unlikely(__pyx_t_2 == ((int)-1))) __PYX_ERR(0, 146, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + + /* "aiohttp/_http_parser.pyx":147 + * info.append(("chunked", self.chunked)) + * info.append(("url", self.url)) + * sinfo = ', '.join(name + '=' + repr(val) for name, val in info) # <<<<<<<<<<<<<< + * return '' + * + */ + __pyx_t_1 = __pyx_pf_7aiohttp_12_http_parser_17RawRequestMessage_8__repr___genexpr(((PyObject*)__pyx_cur_scope)); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 147, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __pyx_t_3 = __Pyx_Generator_Next(__pyx_t_1); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 147, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_3); + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + __pyx_t_1 = PyUnicode_Join(__pyx_kp_u__2, __pyx_t_3); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 147, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; + __pyx_v_sinfo = ((PyObject*)__pyx_t_1); + __pyx_t_1 = 0; + + /* "aiohttp/_http_parser.pyx":148 + * info.append(("url", self.url)) + * sinfo = ', '.join(name + '=' + repr(val) for name, val in info) + * return '' # <<<<<<<<<<<<<< + * + * def _replace(self, **dct): + */ + __Pyx_XDECREF(__pyx_r); + __pyx_t_1 = __Pyx_PyUnicode_ConcatSafe(__pyx_kp_u_RawRequestMessage, __pyx_v_sinfo); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 148, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __pyx_t_3 = __Pyx_PyUnicode_Concat(__pyx_t_1, __pyx_kp_u__3); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 148, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_3); + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + __pyx_r = __pyx_t_3; + __pyx_t_3 = 0; + goto __pyx_L0; + + /* "aiohttp/_http_parser.pyx":135 + * self.url = url + * + * def __repr__(self): # <<<<<<<<<<<<<< + * info = [] + * info.append(("method", self.method)) + */ + + /* function exit code */ + __pyx_L1_error:; + __Pyx_XDECREF(__pyx_t_1); + __Pyx_XDECREF(__pyx_t_3); + __Pyx_AddTraceback("aiohttp._http_parser.RawRequestMessage.__repr__", __pyx_clineno, __pyx_lineno, __pyx_filename); + __pyx_r = NULL; + __pyx_L0:; + __Pyx_XDECREF(__pyx_v_sinfo); + __Pyx_XDECREF(__pyx_gb_7aiohttp_12_http_parser_17RawRequestMessage_8__repr___2generator); + __Pyx_DECREF(((PyObject *)__pyx_cur_scope)); + __Pyx_XGIVEREF(__pyx_r); + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +/* "aiohttp/_http_parser.pyx":150 + * return '' + * + * def _replace(self, **dct): # <<<<<<<<<<<<<< + * cdef RawRequestMessage ret + * ret = _new_request_message(self.method, + */ + +/* Python wrapper */ +static PyObject *__pyx_pw_7aiohttp_12_http_parser_17RawRequestMessage_5_replace(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/ +static PyObject *__pyx_pw_7aiohttp_12_http_parser_17RawRequestMessage_5_replace(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds) { + PyObject *__pyx_v_dct = 0; + PyObject *__pyx_r = 0; + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("_replace (wrapper)", 0); + if (unlikely(PyTuple_GET_SIZE(__pyx_args) > 0)) { + __Pyx_RaiseArgtupleInvalid("_replace", 1, 0, 0, PyTuple_GET_SIZE(__pyx_args)); return NULL;} + if (__pyx_kwds && unlikely(!__Pyx_CheckKeywordStrings(__pyx_kwds, "_replace", 1))) return NULL; + __pyx_v_dct = (__pyx_kwds) ? PyDict_Copy(__pyx_kwds) : PyDict_New(); if (unlikely(!__pyx_v_dct)) return NULL; + __Pyx_GOTREF(__pyx_v_dct); + __pyx_r = __pyx_pf_7aiohttp_12_http_parser_17RawRequestMessage_4_replace(((struct __pyx_obj_7aiohttp_12_http_parser_RawRequestMessage *)__pyx_v_self), __pyx_v_dct); + + /* function exit code */ + __Pyx_XDECREF(__pyx_v_dct); + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +static PyObject *__pyx_pf_7aiohttp_12_http_parser_17RawRequestMessage_4_replace(struct __pyx_obj_7aiohttp_12_http_parser_RawRequestMessage *__pyx_v_self, PyObject *__pyx_v_dct) { + struct __pyx_obj_7aiohttp_12_http_parser_RawRequestMessage *__pyx_v_ret = 0; + PyObject *__pyx_r = NULL; + __Pyx_RefNannyDeclarations + PyObject *__pyx_t_1 = NULL; + PyObject *__pyx_t_2 = NULL; + PyObject *__pyx_t_3 = NULL; + PyObject *__pyx_t_4 = NULL; + PyObject *__pyx_t_5 = NULL; + int __pyx_t_6; + PyObject *__pyx_t_7 = NULL; + int __pyx_t_8; + int __pyx_t_9; + PyObject *__pyx_t_10 = NULL; + PyObject *__pyx_t_11 = NULL; + int __pyx_lineno = 0; + const char *__pyx_filename = NULL; + int __pyx_clineno = 0; + __Pyx_RefNannySetupContext("_replace", 0); + + /* "aiohttp/_http_parser.pyx":152 + * def _replace(self, **dct): + * cdef RawRequestMessage ret + * ret = _new_request_message(self.method, # <<<<<<<<<<<<<< + * self.path, + * self.version, + */ + __pyx_t_1 = __pyx_v_self->method; + __Pyx_INCREF(__pyx_t_1); + + /* "aiohttp/_http_parser.pyx":153 + * cdef RawRequestMessage ret + * ret = _new_request_message(self.method, + * self.path, # <<<<<<<<<<<<<< + * self.version, + * self.headers, + */ + __pyx_t_2 = __pyx_v_self->path; + __Pyx_INCREF(__pyx_t_2); + + /* "aiohttp/_http_parser.pyx":154 + * ret = _new_request_message(self.method, + * self.path, + * self.version, # <<<<<<<<<<<<<< + * self.headers, + * self.raw_headers, + */ + __pyx_t_3 = __pyx_v_self->version; + __Pyx_INCREF(__pyx_t_3); + + /* "aiohttp/_http_parser.pyx":155 + * self.path, + * self.version, + * self.headers, # <<<<<<<<<<<<<< + * self.raw_headers, + * self.should_close, + */ + __pyx_t_4 = __pyx_v_self->headers; + __Pyx_INCREF(__pyx_t_4); + + /* "aiohttp/_http_parser.pyx":156 + * self.version, + * self.headers, + * self.raw_headers, # <<<<<<<<<<<<<< + * self.should_close, + * self.compression, + */ + __pyx_t_5 = __pyx_v_self->raw_headers; + __Pyx_INCREF(__pyx_t_5); + + /* "aiohttp/_http_parser.pyx":157 + * self.headers, + * self.raw_headers, + * self.should_close, # <<<<<<<<<<<<<< + * self.compression, + * self.upgrade, + */ + __pyx_t_6 = __Pyx_PyObject_IsTrue(__pyx_v_self->should_close); if (unlikely((__pyx_t_6 == (int)-1) && PyErr_Occurred())) __PYX_ERR(0, 157, __pyx_L1_error) + + /* "aiohttp/_http_parser.pyx":158 + * self.raw_headers, + * self.should_close, + * self.compression, # <<<<<<<<<<<<<< + * self.upgrade, + * self.chunked, + */ + __pyx_t_7 = __pyx_v_self->compression; + __Pyx_INCREF(__pyx_t_7); + + /* "aiohttp/_http_parser.pyx":159 + * self.should_close, + * self.compression, + * self.upgrade, # <<<<<<<<<<<<<< + * self.chunked, + * self.url) + */ + __pyx_t_8 = __Pyx_PyObject_IsTrue(__pyx_v_self->upgrade); if (unlikely((__pyx_t_8 == (int)-1) && PyErr_Occurred())) __PYX_ERR(0, 159, __pyx_L1_error) + + /* "aiohttp/_http_parser.pyx":160 + * self.compression, + * self.upgrade, + * self.chunked, # <<<<<<<<<<<<<< + * self.url) + * if "method" in dct: + */ + __pyx_t_9 = __Pyx_PyObject_IsTrue(__pyx_v_self->chunked); if (unlikely((__pyx_t_9 == (int)-1) && PyErr_Occurred())) __PYX_ERR(0, 160, __pyx_L1_error) + + /* "aiohttp/_http_parser.pyx":161 + * self.upgrade, + * self.chunked, + * self.url) # <<<<<<<<<<<<<< + * if "method" in dct: + * ret.method = dct["method"] + */ + __pyx_t_10 = __pyx_v_self->url; + __Pyx_INCREF(__pyx_t_10); + + /* "aiohttp/_http_parser.pyx":152 + * def _replace(self, **dct): + * cdef RawRequestMessage ret + * ret = _new_request_message(self.method, # <<<<<<<<<<<<<< + * self.path, + * self.version, + */ + __pyx_t_11 = __pyx_f_7aiohttp_12_http_parser__new_request_message(((PyObject*)__pyx_t_1), ((PyObject*)__pyx_t_2), __pyx_t_3, __pyx_t_4, __pyx_t_5, __pyx_t_6, __pyx_t_7, __pyx_t_8, __pyx_t_9, __pyx_t_10); if (unlikely(!__pyx_t_11)) __PYX_ERR(0, 152, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_11); + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; + __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; + __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; + __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0; + __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0; + __Pyx_DECREF(__pyx_t_10); __pyx_t_10 = 0; + if (!(likely(((__pyx_t_11) == Py_None) || likely(__Pyx_TypeTest(__pyx_t_11, __pyx_ptype_7aiohttp_12_http_parser_RawRequestMessage))))) __PYX_ERR(0, 152, __pyx_L1_error) + __pyx_v_ret = ((struct __pyx_obj_7aiohttp_12_http_parser_RawRequestMessage *)__pyx_t_11); + __pyx_t_11 = 0; + + /* "aiohttp/_http_parser.pyx":162 + * self.chunked, + * self.url) + * if "method" in dct: # <<<<<<<<<<<<<< + * ret.method = dct["method"] + * if "path" in dct: + */ + __pyx_t_9 = (__Pyx_PyDict_ContainsTF(__pyx_n_u_method, __pyx_v_dct, Py_EQ)); if (unlikely(__pyx_t_9 < 0)) __PYX_ERR(0, 162, __pyx_L1_error) + __pyx_t_8 = (__pyx_t_9 != 0); + if (__pyx_t_8) { + + /* "aiohttp/_http_parser.pyx":163 + * self.url) + * if "method" in dct: + * ret.method = dct["method"] # <<<<<<<<<<<<<< + * if "path" in dct: + * ret.path = dct["path"] + */ + __pyx_t_11 = __Pyx_PyDict_GetItem(__pyx_v_dct, __pyx_n_u_method); if (unlikely(!__pyx_t_11)) __PYX_ERR(0, 163, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_11); + if (!(likely(PyUnicode_CheckExact(__pyx_t_11))||((__pyx_t_11) == Py_None)||(PyErr_Format(PyExc_TypeError, "Expected %.16s, got %.200s", "unicode", Py_TYPE(__pyx_t_11)->tp_name), 0))) __PYX_ERR(0, 163, __pyx_L1_error) + __Pyx_GIVEREF(__pyx_t_11); + __Pyx_GOTREF(__pyx_v_ret->method); + __Pyx_DECREF(__pyx_v_ret->method); + __pyx_v_ret->method = ((PyObject*)__pyx_t_11); + __pyx_t_11 = 0; + + /* "aiohttp/_http_parser.pyx":162 + * self.chunked, + * self.url) + * if "method" in dct: # <<<<<<<<<<<<<< + * ret.method = dct["method"] + * if "path" in dct: + */ + } + + /* "aiohttp/_http_parser.pyx":164 + * if "method" in dct: + * ret.method = dct["method"] + * if "path" in dct: # <<<<<<<<<<<<<< + * ret.path = dct["path"] + * if "version" in dct: + */ + __pyx_t_8 = (__Pyx_PyDict_ContainsTF(__pyx_n_u_path, __pyx_v_dct, Py_EQ)); if (unlikely(__pyx_t_8 < 0)) __PYX_ERR(0, 164, __pyx_L1_error) + __pyx_t_9 = (__pyx_t_8 != 0); + if (__pyx_t_9) { + + /* "aiohttp/_http_parser.pyx":165 + * ret.method = dct["method"] + * if "path" in dct: + * ret.path = dct["path"] # <<<<<<<<<<<<<< + * if "version" in dct: + * ret.version = dct["version"] + */ + __pyx_t_11 = __Pyx_PyDict_GetItem(__pyx_v_dct, __pyx_n_u_path); if (unlikely(!__pyx_t_11)) __PYX_ERR(0, 165, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_11); + if (!(likely(PyUnicode_CheckExact(__pyx_t_11))||((__pyx_t_11) == Py_None)||(PyErr_Format(PyExc_TypeError, "Expected %.16s, got %.200s", "unicode", Py_TYPE(__pyx_t_11)->tp_name), 0))) __PYX_ERR(0, 165, __pyx_L1_error) + __Pyx_GIVEREF(__pyx_t_11); + __Pyx_GOTREF(__pyx_v_ret->path); + __Pyx_DECREF(__pyx_v_ret->path); + __pyx_v_ret->path = ((PyObject*)__pyx_t_11); + __pyx_t_11 = 0; + + /* "aiohttp/_http_parser.pyx":164 + * if "method" in dct: + * ret.method = dct["method"] + * if "path" in dct: # <<<<<<<<<<<<<< + * ret.path = dct["path"] + * if "version" in dct: + */ + } + + /* "aiohttp/_http_parser.pyx":166 + * if "path" in dct: + * ret.path = dct["path"] + * if "version" in dct: # <<<<<<<<<<<<<< + * ret.version = dct["version"] + * if "headers" in dct: + */ + __pyx_t_9 = (__Pyx_PyDict_ContainsTF(__pyx_n_u_version, __pyx_v_dct, Py_EQ)); if (unlikely(__pyx_t_9 < 0)) __PYX_ERR(0, 166, __pyx_L1_error) + __pyx_t_8 = (__pyx_t_9 != 0); + if (__pyx_t_8) { + + /* "aiohttp/_http_parser.pyx":167 + * ret.path = dct["path"] + * if "version" in dct: + * ret.version = dct["version"] # <<<<<<<<<<<<<< + * if "headers" in dct: + * ret.headers = dct["headers"] + */ + __pyx_t_11 = __Pyx_PyDict_GetItem(__pyx_v_dct, __pyx_n_u_version); if (unlikely(!__pyx_t_11)) __PYX_ERR(0, 167, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_11); + __Pyx_GIVEREF(__pyx_t_11); + __Pyx_GOTREF(__pyx_v_ret->version); + __Pyx_DECREF(__pyx_v_ret->version); + __pyx_v_ret->version = __pyx_t_11; + __pyx_t_11 = 0; + + /* "aiohttp/_http_parser.pyx":166 + * if "path" in dct: + * ret.path = dct["path"] + * if "version" in dct: # <<<<<<<<<<<<<< + * ret.version = dct["version"] + * if "headers" in dct: + */ + } + + /* "aiohttp/_http_parser.pyx":168 + * if "version" in dct: + * ret.version = dct["version"] + * if "headers" in dct: # <<<<<<<<<<<<<< + * ret.headers = dct["headers"] + * if "raw_headers" in dct: + */ + __pyx_t_8 = (__Pyx_PyDict_ContainsTF(__pyx_n_u_headers, __pyx_v_dct, Py_EQ)); if (unlikely(__pyx_t_8 < 0)) __PYX_ERR(0, 168, __pyx_L1_error) + __pyx_t_9 = (__pyx_t_8 != 0); + if (__pyx_t_9) { + + /* "aiohttp/_http_parser.pyx":169 + * ret.version = dct["version"] + * if "headers" in dct: + * ret.headers = dct["headers"] # <<<<<<<<<<<<<< + * if "raw_headers" in dct: + * ret.raw_headers = dct["raw_headers"] + */ + __pyx_t_11 = __Pyx_PyDict_GetItem(__pyx_v_dct, __pyx_n_u_headers); if (unlikely(!__pyx_t_11)) __PYX_ERR(0, 169, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_11); + __Pyx_GIVEREF(__pyx_t_11); + __Pyx_GOTREF(__pyx_v_ret->headers); + __Pyx_DECREF(__pyx_v_ret->headers); + __pyx_v_ret->headers = __pyx_t_11; + __pyx_t_11 = 0; + + /* "aiohttp/_http_parser.pyx":168 + * if "version" in dct: + * ret.version = dct["version"] + * if "headers" in dct: # <<<<<<<<<<<<<< + * ret.headers = dct["headers"] + * if "raw_headers" in dct: + */ + } + + /* "aiohttp/_http_parser.pyx":170 + * if "headers" in dct: + * ret.headers = dct["headers"] + * if "raw_headers" in dct: # <<<<<<<<<<<<<< + * ret.raw_headers = dct["raw_headers"] + * if "should_close" in dct: + */ + __pyx_t_9 = (__Pyx_PyDict_ContainsTF(__pyx_n_u_raw_headers, __pyx_v_dct, Py_EQ)); if (unlikely(__pyx_t_9 < 0)) __PYX_ERR(0, 170, __pyx_L1_error) + __pyx_t_8 = (__pyx_t_9 != 0); + if (__pyx_t_8) { + + /* "aiohttp/_http_parser.pyx":171 + * ret.headers = dct["headers"] + * if "raw_headers" in dct: + * ret.raw_headers = dct["raw_headers"] # <<<<<<<<<<<<<< + * if "should_close" in dct: + * ret.should_close = dct["should_close"] + */ + __pyx_t_11 = __Pyx_PyDict_GetItem(__pyx_v_dct, __pyx_n_u_raw_headers); if (unlikely(!__pyx_t_11)) __PYX_ERR(0, 171, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_11); + __Pyx_GIVEREF(__pyx_t_11); + __Pyx_GOTREF(__pyx_v_ret->raw_headers); + __Pyx_DECREF(__pyx_v_ret->raw_headers); + __pyx_v_ret->raw_headers = __pyx_t_11; + __pyx_t_11 = 0; + + /* "aiohttp/_http_parser.pyx":170 + * if "headers" in dct: + * ret.headers = dct["headers"] + * if "raw_headers" in dct: # <<<<<<<<<<<<<< + * ret.raw_headers = dct["raw_headers"] + * if "should_close" in dct: + */ + } + + /* "aiohttp/_http_parser.pyx":172 + * if "raw_headers" in dct: + * ret.raw_headers = dct["raw_headers"] + * if "should_close" in dct: # <<<<<<<<<<<<<< + * ret.should_close = dct["should_close"] + * if "compression" in dct: + */ + __pyx_t_8 = (__Pyx_PyDict_ContainsTF(__pyx_n_u_should_close, __pyx_v_dct, Py_EQ)); if (unlikely(__pyx_t_8 < 0)) __PYX_ERR(0, 172, __pyx_L1_error) + __pyx_t_9 = (__pyx_t_8 != 0); + if (__pyx_t_9) { + + /* "aiohttp/_http_parser.pyx":173 + * ret.raw_headers = dct["raw_headers"] + * if "should_close" in dct: + * ret.should_close = dct["should_close"] # <<<<<<<<<<<<<< + * if "compression" in dct: + * ret.compression = dct["compression"] + */ + __pyx_t_11 = __Pyx_PyDict_GetItem(__pyx_v_dct, __pyx_n_u_should_close); if (unlikely(!__pyx_t_11)) __PYX_ERR(0, 173, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_11); + __Pyx_GIVEREF(__pyx_t_11); + __Pyx_GOTREF(__pyx_v_ret->should_close); + __Pyx_DECREF(__pyx_v_ret->should_close); + __pyx_v_ret->should_close = __pyx_t_11; + __pyx_t_11 = 0; + + /* "aiohttp/_http_parser.pyx":172 + * if "raw_headers" in dct: + * ret.raw_headers = dct["raw_headers"] + * if "should_close" in dct: # <<<<<<<<<<<<<< + * ret.should_close = dct["should_close"] + * if "compression" in dct: + */ + } + + /* "aiohttp/_http_parser.pyx":174 + * if "should_close" in dct: + * ret.should_close = dct["should_close"] + * if "compression" in dct: # <<<<<<<<<<<<<< + * ret.compression = dct["compression"] + * if "upgrade" in dct: + */ + __pyx_t_9 = (__Pyx_PyDict_ContainsTF(__pyx_n_u_compression, __pyx_v_dct, Py_EQ)); if (unlikely(__pyx_t_9 < 0)) __PYX_ERR(0, 174, __pyx_L1_error) + __pyx_t_8 = (__pyx_t_9 != 0); + if (__pyx_t_8) { + + /* "aiohttp/_http_parser.pyx":175 + * ret.should_close = dct["should_close"] + * if "compression" in dct: + * ret.compression = dct["compression"] # <<<<<<<<<<<<<< + * if "upgrade" in dct: + * ret.upgrade = dct["upgrade"] + */ + __pyx_t_11 = __Pyx_PyDict_GetItem(__pyx_v_dct, __pyx_n_u_compression); if (unlikely(!__pyx_t_11)) __PYX_ERR(0, 175, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_11); + __Pyx_GIVEREF(__pyx_t_11); + __Pyx_GOTREF(__pyx_v_ret->compression); + __Pyx_DECREF(__pyx_v_ret->compression); + __pyx_v_ret->compression = __pyx_t_11; + __pyx_t_11 = 0; + + /* "aiohttp/_http_parser.pyx":174 + * if "should_close" in dct: + * ret.should_close = dct["should_close"] + * if "compression" in dct: # <<<<<<<<<<<<<< + * ret.compression = dct["compression"] + * if "upgrade" in dct: + */ + } + + /* "aiohttp/_http_parser.pyx":176 + * if "compression" in dct: + * ret.compression = dct["compression"] + * if "upgrade" in dct: # <<<<<<<<<<<<<< + * ret.upgrade = dct["upgrade"] + * if "chunked" in dct: + */ + __pyx_t_8 = (__Pyx_PyDict_ContainsTF(__pyx_n_u_upgrade, __pyx_v_dct, Py_EQ)); if (unlikely(__pyx_t_8 < 0)) __PYX_ERR(0, 176, __pyx_L1_error) + __pyx_t_9 = (__pyx_t_8 != 0); + if (__pyx_t_9) { + + /* "aiohttp/_http_parser.pyx":177 + * ret.compression = dct["compression"] + * if "upgrade" in dct: + * ret.upgrade = dct["upgrade"] # <<<<<<<<<<<<<< + * if "chunked" in dct: + * ret.chunked = dct["chunked"] + */ + __pyx_t_11 = __Pyx_PyDict_GetItem(__pyx_v_dct, __pyx_n_u_upgrade); if (unlikely(!__pyx_t_11)) __PYX_ERR(0, 177, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_11); + __Pyx_GIVEREF(__pyx_t_11); + __Pyx_GOTREF(__pyx_v_ret->upgrade); + __Pyx_DECREF(__pyx_v_ret->upgrade); + __pyx_v_ret->upgrade = __pyx_t_11; + __pyx_t_11 = 0; + + /* "aiohttp/_http_parser.pyx":176 + * if "compression" in dct: + * ret.compression = dct["compression"] + * if "upgrade" in dct: # <<<<<<<<<<<<<< + * ret.upgrade = dct["upgrade"] + * if "chunked" in dct: + */ + } + + /* "aiohttp/_http_parser.pyx":178 + * if "upgrade" in dct: + * ret.upgrade = dct["upgrade"] + * if "chunked" in dct: # <<<<<<<<<<<<<< + * ret.chunked = dct["chunked"] + * if "url" in dct: + */ + __pyx_t_9 = (__Pyx_PyDict_ContainsTF(__pyx_n_u_chunked, __pyx_v_dct, Py_EQ)); if (unlikely(__pyx_t_9 < 0)) __PYX_ERR(0, 178, __pyx_L1_error) + __pyx_t_8 = (__pyx_t_9 != 0); + if (__pyx_t_8) { + + /* "aiohttp/_http_parser.pyx":179 + * ret.upgrade = dct["upgrade"] + * if "chunked" in dct: + * ret.chunked = dct["chunked"] # <<<<<<<<<<<<<< + * if "url" in dct: + * ret.url = dct["url"] + */ + __pyx_t_11 = __Pyx_PyDict_GetItem(__pyx_v_dct, __pyx_n_u_chunked); if (unlikely(!__pyx_t_11)) __PYX_ERR(0, 179, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_11); + __Pyx_GIVEREF(__pyx_t_11); + __Pyx_GOTREF(__pyx_v_ret->chunked); + __Pyx_DECREF(__pyx_v_ret->chunked); + __pyx_v_ret->chunked = __pyx_t_11; + __pyx_t_11 = 0; + + /* "aiohttp/_http_parser.pyx":178 + * if "upgrade" in dct: + * ret.upgrade = dct["upgrade"] + * if "chunked" in dct: # <<<<<<<<<<<<<< + * ret.chunked = dct["chunked"] + * if "url" in dct: + */ + } + + /* "aiohttp/_http_parser.pyx":180 + * if "chunked" in dct: + * ret.chunked = dct["chunked"] + * if "url" in dct: # <<<<<<<<<<<<<< + * ret.url = dct["url"] + * return ret + */ + __pyx_t_8 = (__Pyx_PyDict_ContainsTF(__pyx_n_u_url, __pyx_v_dct, Py_EQ)); if (unlikely(__pyx_t_8 < 0)) __PYX_ERR(0, 180, __pyx_L1_error) + __pyx_t_9 = (__pyx_t_8 != 0); + if (__pyx_t_9) { + + /* "aiohttp/_http_parser.pyx":181 + * ret.chunked = dct["chunked"] + * if "url" in dct: + * ret.url = dct["url"] # <<<<<<<<<<<<<< + * return ret + * + */ + __pyx_t_11 = __Pyx_PyDict_GetItem(__pyx_v_dct, __pyx_n_u_url); if (unlikely(!__pyx_t_11)) __PYX_ERR(0, 181, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_11); + __Pyx_GIVEREF(__pyx_t_11); + __Pyx_GOTREF(__pyx_v_ret->url); + __Pyx_DECREF(__pyx_v_ret->url); + __pyx_v_ret->url = __pyx_t_11; + __pyx_t_11 = 0; + + /* "aiohttp/_http_parser.pyx":180 + * if "chunked" in dct: + * ret.chunked = dct["chunked"] + * if "url" in dct: # <<<<<<<<<<<<<< + * ret.url = dct["url"] + * return ret + */ + } + + /* "aiohttp/_http_parser.pyx":182 + * if "url" in dct: + * ret.url = dct["url"] + * return ret # <<<<<<<<<<<<<< + * + * cdef _new_request_message(str method, + */ + __Pyx_XDECREF(__pyx_r); + __Pyx_INCREF(((PyObject *)__pyx_v_ret)); + __pyx_r = ((PyObject *)__pyx_v_ret); + goto __pyx_L0; + + /* "aiohttp/_http_parser.pyx":150 + * return '' + * + * def _replace(self, **dct): # <<<<<<<<<<<<<< + * cdef RawRequestMessage ret + * ret = _new_request_message(self.method, + */ + + /* function exit code */ + __pyx_L1_error:; + __Pyx_XDECREF(__pyx_t_1); + __Pyx_XDECREF(__pyx_t_2); + __Pyx_XDECREF(__pyx_t_3); + __Pyx_XDECREF(__pyx_t_4); + __Pyx_XDECREF(__pyx_t_5); + __Pyx_XDECREF(__pyx_t_7); + __Pyx_XDECREF(__pyx_t_10); + __Pyx_XDECREF(__pyx_t_11); + __Pyx_AddTraceback("aiohttp._http_parser.RawRequestMessage._replace", __pyx_clineno, __pyx_lineno, __pyx_filename); + __pyx_r = NULL; + __pyx_L0:; + __Pyx_XDECREF((PyObject *)__pyx_v_ret); + __Pyx_XGIVEREF(__pyx_r); + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +/* "aiohttp/_http_parser.pyx":111 + * @cython.freelist(DEFAULT_FREELIST_SIZE) + * cdef class RawRequestMessage: + * cdef readonly str method # <<<<<<<<<<<<<< + * cdef readonly str path + * cdef readonly object version # HttpVersion + */ + +/* Python wrapper */ +static PyObject *__pyx_pw_7aiohttp_12_http_parser_17RawRequestMessage_6method_1__get__(PyObject *__pyx_v_self); /*proto*/ +static PyObject *__pyx_pw_7aiohttp_12_http_parser_17RawRequestMessage_6method_1__get__(PyObject *__pyx_v_self) { + PyObject *__pyx_r = 0; + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("__get__ (wrapper)", 0); + __pyx_r = __pyx_pf_7aiohttp_12_http_parser_17RawRequestMessage_6method___get__(((struct __pyx_obj_7aiohttp_12_http_parser_RawRequestMessage *)__pyx_v_self)); + + /* function exit code */ + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +static PyObject *__pyx_pf_7aiohttp_12_http_parser_17RawRequestMessage_6method___get__(struct __pyx_obj_7aiohttp_12_http_parser_RawRequestMessage *__pyx_v_self) { + PyObject *__pyx_r = NULL; + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("__get__", 0); + __Pyx_XDECREF(__pyx_r); + __Pyx_INCREF(__pyx_v_self->method); + __pyx_r = __pyx_v_self->method; + goto __pyx_L0; + + /* function exit code */ + __pyx_L0:; + __Pyx_XGIVEREF(__pyx_r); + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +/* "aiohttp/_http_parser.pyx":112 + * cdef class RawRequestMessage: + * cdef readonly str method + * cdef readonly str path # <<<<<<<<<<<<<< + * cdef readonly object version # HttpVersion + * cdef readonly object headers # CIMultiDict + */ + +/* Python wrapper */ +static PyObject *__pyx_pw_7aiohttp_12_http_parser_17RawRequestMessage_4path_1__get__(PyObject *__pyx_v_self); /*proto*/ +static PyObject *__pyx_pw_7aiohttp_12_http_parser_17RawRequestMessage_4path_1__get__(PyObject *__pyx_v_self) { + PyObject *__pyx_r = 0; + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("__get__ (wrapper)", 0); + __pyx_r = __pyx_pf_7aiohttp_12_http_parser_17RawRequestMessage_4path___get__(((struct __pyx_obj_7aiohttp_12_http_parser_RawRequestMessage *)__pyx_v_self)); + + /* function exit code */ + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +static PyObject *__pyx_pf_7aiohttp_12_http_parser_17RawRequestMessage_4path___get__(struct __pyx_obj_7aiohttp_12_http_parser_RawRequestMessage *__pyx_v_self) { + PyObject *__pyx_r = NULL; + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("__get__", 0); + __Pyx_XDECREF(__pyx_r); + __Pyx_INCREF(__pyx_v_self->path); + __pyx_r = __pyx_v_self->path; + goto __pyx_L0; + + /* function exit code */ + __pyx_L0:; + __Pyx_XGIVEREF(__pyx_r); + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +/* "aiohttp/_http_parser.pyx":113 + * cdef readonly str method + * cdef readonly str path + * cdef readonly object version # HttpVersion # <<<<<<<<<<<<<< + * cdef readonly object headers # CIMultiDict + * cdef readonly object raw_headers # tuple + */ + +/* Python wrapper */ +static PyObject *__pyx_pw_7aiohttp_12_http_parser_17RawRequestMessage_7version_1__get__(PyObject *__pyx_v_self); /*proto*/ +static PyObject *__pyx_pw_7aiohttp_12_http_parser_17RawRequestMessage_7version_1__get__(PyObject *__pyx_v_self) { + PyObject *__pyx_r = 0; + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("__get__ (wrapper)", 0); + __pyx_r = __pyx_pf_7aiohttp_12_http_parser_17RawRequestMessage_7version___get__(((struct __pyx_obj_7aiohttp_12_http_parser_RawRequestMessage *)__pyx_v_self)); + + /* function exit code */ + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +static PyObject *__pyx_pf_7aiohttp_12_http_parser_17RawRequestMessage_7version___get__(struct __pyx_obj_7aiohttp_12_http_parser_RawRequestMessage *__pyx_v_self) { + PyObject *__pyx_r = NULL; + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("__get__", 0); + __Pyx_XDECREF(__pyx_r); + __Pyx_INCREF(__pyx_v_self->version); + __pyx_r = __pyx_v_self->version; + goto __pyx_L0; + + /* function exit code */ + __pyx_L0:; + __Pyx_XGIVEREF(__pyx_r); + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +/* "aiohttp/_http_parser.pyx":114 + * cdef readonly str path + * cdef readonly object version # HttpVersion + * cdef readonly object headers # CIMultiDict # <<<<<<<<<<<<<< + * cdef readonly object raw_headers # tuple + * cdef readonly object should_close + */ + +/* Python wrapper */ +static PyObject *__pyx_pw_7aiohttp_12_http_parser_17RawRequestMessage_7headers_1__get__(PyObject *__pyx_v_self); /*proto*/ +static PyObject *__pyx_pw_7aiohttp_12_http_parser_17RawRequestMessage_7headers_1__get__(PyObject *__pyx_v_self) { + PyObject *__pyx_r = 0; + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("__get__ (wrapper)", 0); + __pyx_r = __pyx_pf_7aiohttp_12_http_parser_17RawRequestMessage_7headers___get__(((struct __pyx_obj_7aiohttp_12_http_parser_RawRequestMessage *)__pyx_v_self)); + + /* function exit code */ + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +static PyObject *__pyx_pf_7aiohttp_12_http_parser_17RawRequestMessage_7headers___get__(struct __pyx_obj_7aiohttp_12_http_parser_RawRequestMessage *__pyx_v_self) { + PyObject *__pyx_r = NULL; + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("__get__", 0); + __Pyx_XDECREF(__pyx_r); + __Pyx_INCREF(__pyx_v_self->headers); + __pyx_r = __pyx_v_self->headers; + goto __pyx_L0; + + /* function exit code */ + __pyx_L0:; + __Pyx_XGIVEREF(__pyx_r); + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +/* "aiohttp/_http_parser.pyx":115 + * cdef readonly object version # HttpVersion + * cdef readonly object headers # CIMultiDict + * cdef readonly object raw_headers # tuple # <<<<<<<<<<<<<< + * cdef readonly object should_close + * cdef readonly object compression + */ + +/* Python wrapper */ +static PyObject *__pyx_pw_7aiohttp_12_http_parser_17RawRequestMessage_11raw_headers_1__get__(PyObject *__pyx_v_self); /*proto*/ +static PyObject *__pyx_pw_7aiohttp_12_http_parser_17RawRequestMessage_11raw_headers_1__get__(PyObject *__pyx_v_self) { + PyObject *__pyx_r = 0; + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("__get__ (wrapper)", 0); + __pyx_r = __pyx_pf_7aiohttp_12_http_parser_17RawRequestMessage_11raw_headers___get__(((struct __pyx_obj_7aiohttp_12_http_parser_RawRequestMessage *)__pyx_v_self)); + + /* function exit code */ + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +static PyObject *__pyx_pf_7aiohttp_12_http_parser_17RawRequestMessage_11raw_headers___get__(struct __pyx_obj_7aiohttp_12_http_parser_RawRequestMessage *__pyx_v_self) { + PyObject *__pyx_r = NULL; + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("__get__", 0); + __Pyx_XDECREF(__pyx_r); + __Pyx_INCREF(__pyx_v_self->raw_headers); + __pyx_r = __pyx_v_self->raw_headers; + goto __pyx_L0; + + /* function exit code */ + __pyx_L0:; + __Pyx_XGIVEREF(__pyx_r); + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +/* "aiohttp/_http_parser.pyx":116 + * cdef readonly object headers # CIMultiDict + * cdef readonly object raw_headers # tuple + * cdef readonly object should_close # <<<<<<<<<<<<<< + * cdef readonly object compression + * cdef readonly object upgrade + */ + +/* Python wrapper */ +static PyObject *__pyx_pw_7aiohttp_12_http_parser_17RawRequestMessage_12should_close_1__get__(PyObject *__pyx_v_self); /*proto*/ +static PyObject *__pyx_pw_7aiohttp_12_http_parser_17RawRequestMessage_12should_close_1__get__(PyObject *__pyx_v_self) { + PyObject *__pyx_r = 0; + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("__get__ (wrapper)", 0); + __pyx_r = __pyx_pf_7aiohttp_12_http_parser_17RawRequestMessage_12should_close___get__(((struct __pyx_obj_7aiohttp_12_http_parser_RawRequestMessage *)__pyx_v_self)); + + /* function exit code */ + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +static PyObject *__pyx_pf_7aiohttp_12_http_parser_17RawRequestMessage_12should_close___get__(struct __pyx_obj_7aiohttp_12_http_parser_RawRequestMessage *__pyx_v_self) { + PyObject *__pyx_r = NULL; + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("__get__", 0); + __Pyx_XDECREF(__pyx_r); + __Pyx_INCREF(__pyx_v_self->should_close); + __pyx_r = __pyx_v_self->should_close; + goto __pyx_L0; + + /* function exit code */ + __pyx_L0:; + __Pyx_XGIVEREF(__pyx_r); + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +/* "aiohttp/_http_parser.pyx":117 + * cdef readonly object raw_headers # tuple + * cdef readonly object should_close + * cdef readonly object compression # <<<<<<<<<<<<<< + * cdef readonly object upgrade + * cdef readonly object chunked + */ + +/* Python wrapper */ +static PyObject *__pyx_pw_7aiohttp_12_http_parser_17RawRequestMessage_11compression_1__get__(PyObject *__pyx_v_self); /*proto*/ +static PyObject *__pyx_pw_7aiohttp_12_http_parser_17RawRequestMessage_11compression_1__get__(PyObject *__pyx_v_self) { + PyObject *__pyx_r = 0; + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("__get__ (wrapper)", 0); + __pyx_r = __pyx_pf_7aiohttp_12_http_parser_17RawRequestMessage_11compression___get__(((struct __pyx_obj_7aiohttp_12_http_parser_RawRequestMessage *)__pyx_v_self)); + + /* function exit code */ + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +static PyObject *__pyx_pf_7aiohttp_12_http_parser_17RawRequestMessage_11compression___get__(struct __pyx_obj_7aiohttp_12_http_parser_RawRequestMessage *__pyx_v_self) { + PyObject *__pyx_r = NULL; + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("__get__", 0); + __Pyx_XDECREF(__pyx_r); + __Pyx_INCREF(__pyx_v_self->compression); + __pyx_r = __pyx_v_self->compression; + goto __pyx_L0; + + /* function exit code */ + __pyx_L0:; + __Pyx_XGIVEREF(__pyx_r); + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +/* "aiohttp/_http_parser.pyx":118 + * cdef readonly object should_close + * cdef readonly object compression + * cdef readonly object upgrade # <<<<<<<<<<<<<< + * cdef readonly object chunked + * cdef readonly object url # yarl.URL + */ + +/* Python wrapper */ +static PyObject *__pyx_pw_7aiohttp_12_http_parser_17RawRequestMessage_7upgrade_1__get__(PyObject *__pyx_v_self); /*proto*/ +static PyObject *__pyx_pw_7aiohttp_12_http_parser_17RawRequestMessage_7upgrade_1__get__(PyObject *__pyx_v_self) { + PyObject *__pyx_r = 0; + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("__get__ (wrapper)", 0); + __pyx_r = __pyx_pf_7aiohttp_12_http_parser_17RawRequestMessage_7upgrade___get__(((struct __pyx_obj_7aiohttp_12_http_parser_RawRequestMessage *)__pyx_v_self)); + + /* function exit code */ + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +static PyObject *__pyx_pf_7aiohttp_12_http_parser_17RawRequestMessage_7upgrade___get__(struct __pyx_obj_7aiohttp_12_http_parser_RawRequestMessage *__pyx_v_self) { + PyObject *__pyx_r = NULL; + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("__get__", 0); + __Pyx_XDECREF(__pyx_r); + __Pyx_INCREF(__pyx_v_self->upgrade); + __pyx_r = __pyx_v_self->upgrade; + goto __pyx_L0; + + /* function exit code */ + __pyx_L0:; + __Pyx_XGIVEREF(__pyx_r); + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +/* "aiohttp/_http_parser.pyx":119 + * cdef readonly object compression + * cdef readonly object upgrade + * cdef readonly object chunked # <<<<<<<<<<<<<< + * cdef readonly object url # yarl.URL + * + */ + +/* Python wrapper */ +static PyObject *__pyx_pw_7aiohttp_12_http_parser_17RawRequestMessage_7chunked_1__get__(PyObject *__pyx_v_self); /*proto*/ +static PyObject *__pyx_pw_7aiohttp_12_http_parser_17RawRequestMessage_7chunked_1__get__(PyObject *__pyx_v_self) { + PyObject *__pyx_r = 0; + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("__get__ (wrapper)", 0); + __pyx_r = __pyx_pf_7aiohttp_12_http_parser_17RawRequestMessage_7chunked___get__(((struct __pyx_obj_7aiohttp_12_http_parser_RawRequestMessage *)__pyx_v_self)); + + /* function exit code */ + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +static PyObject *__pyx_pf_7aiohttp_12_http_parser_17RawRequestMessage_7chunked___get__(struct __pyx_obj_7aiohttp_12_http_parser_RawRequestMessage *__pyx_v_self) { + PyObject *__pyx_r = NULL; + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("__get__", 0); + __Pyx_XDECREF(__pyx_r); + __Pyx_INCREF(__pyx_v_self->chunked); + __pyx_r = __pyx_v_self->chunked; + goto __pyx_L0; + + /* function exit code */ + __pyx_L0:; + __Pyx_XGIVEREF(__pyx_r); + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +/* "aiohttp/_http_parser.pyx":120 + * cdef readonly object upgrade + * cdef readonly object chunked + * cdef readonly object url # yarl.URL # <<<<<<<<<<<<<< + * + * def __init__(self, method, path, version, headers, raw_headers, + */ + +/* Python wrapper */ +static PyObject *__pyx_pw_7aiohttp_12_http_parser_17RawRequestMessage_3url_1__get__(PyObject *__pyx_v_self); /*proto*/ +static PyObject *__pyx_pw_7aiohttp_12_http_parser_17RawRequestMessage_3url_1__get__(PyObject *__pyx_v_self) { + PyObject *__pyx_r = 0; + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("__get__ (wrapper)", 0); + __pyx_r = __pyx_pf_7aiohttp_12_http_parser_17RawRequestMessage_3url___get__(((struct __pyx_obj_7aiohttp_12_http_parser_RawRequestMessage *)__pyx_v_self)); + + /* function exit code */ + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +static PyObject *__pyx_pf_7aiohttp_12_http_parser_17RawRequestMessage_3url___get__(struct __pyx_obj_7aiohttp_12_http_parser_RawRequestMessage *__pyx_v_self) { + PyObject *__pyx_r = NULL; + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("__get__", 0); + __Pyx_XDECREF(__pyx_r); + __Pyx_INCREF(__pyx_v_self->url); + __pyx_r = __pyx_v_self->url; + goto __pyx_L0; + + /* function exit code */ + __pyx_L0:; + __Pyx_XGIVEREF(__pyx_r); + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +/* "(tree fragment)":1 + * def __reduce_cython__(self): # <<<<<<<<<<<<<< + * cdef tuple state + * cdef object _dict + */ + +/* Python wrapper */ +static PyObject *__pyx_pw_7aiohttp_12_http_parser_17RawRequestMessage_7__reduce_cython__(PyObject *__pyx_v_self, CYTHON_UNUSED PyObject *unused); /*proto*/ +static PyObject *__pyx_pw_7aiohttp_12_http_parser_17RawRequestMessage_7__reduce_cython__(PyObject *__pyx_v_self, CYTHON_UNUSED PyObject *unused) { + PyObject *__pyx_r = 0; + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("__reduce_cython__ (wrapper)", 0); + __pyx_r = __pyx_pf_7aiohttp_12_http_parser_17RawRequestMessage_6__reduce_cython__(((struct __pyx_obj_7aiohttp_12_http_parser_RawRequestMessage *)__pyx_v_self)); + + /* function exit code */ + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +static PyObject *__pyx_pf_7aiohttp_12_http_parser_17RawRequestMessage_6__reduce_cython__(struct __pyx_obj_7aiohttp_12_http_parser_RawRequestMessage *__pyx_v_self) { + PyObject *__pyx_v_state = 0; + PyObject *__pyx_v__dict = 0; + int __pyx_v_use_setstate; + PyObject *__pyx_r = NULL; + __Pyx_RefNannyDeclarations + PyObject *__pyx_t_1 = NULL; + int __pyx_t_2; + int __pyx_t_3; + PyObject *__pyx_t_4 = NULL; + int __pyx_t_5; + PyObject *__pyx_t_6 = NULL; + int __pyx_lineno = 0; + const char *__pyx_filename = NULL; + int __pyx_clineno = 0; + __Pyx_RefNannySetupContext("__reduce_cython__", 0); + + /* "(tree fragment)":5 + * cdef object _dict + * cdef bint use_setstate + * state = (self.chunked, self.compression, self.headers, self.method, self.path, self.raw_headers, self.should_close, self.upgrade, self.url, self.version) # <<<<<<<<<<<<<< + * _dict = getattr(self, '__dict__', None) + * if _dict is not None: + */ + __pyx_t_1 = PyTuple_New(10); if (unlikely(!__pyx_t_1)) __PYX_ERR(1, 5, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __Pyx_INCREF(__pyx_v_self->chunked); + __Pyx_GIVEREF(__pyx_v_self->chunked); + PyTuple_SET_ITEM(__pyx_t_1, 0, __pyx_v_self->chunked); + __Pyx_INCREF(__pyx_v_self->compression); + __Pyx_GIVEREF(__pyx_v_self->compression); + PyTuple_SET_ITEM(__pyx_t_1, 1, __pyx_v_self->compression); + __Pyx_INCREF(__pyx_v_self->headers); + __Pyx_GIVEREF(__pyx_v_self->headers); + PyTuple_SET_ITEM(__pyx_t_1, 2, __pyx_v_self->headers); + __Pyx_INCREF(__pyx_v_self->method); + __Pyx_GIVEREF(__pyx_v_self->method); + PyTuple_SET_ITEM(__pyx_t_1, 3, __pyx_v_self->method); + __Pyx_INCREF(__pyx_v_self->path); + __Pyx_GIVEREF(__pyx_v_self->path); + PyTuple_SET_ITEM(__pyx_t_1, 4, __pyx_v_self->path); + __Pyx_INCREF(__pyx_v_self->raw_headers); + __Pyx_GIVEREF(__pyx_v_self->raw_headers); + PyTuple_SET_ITEM(__pyx_t_1, 5, __pyx_v_self->raw_headers); + __Pyx_INCREF(__pyx_v_self->should_close); + __Pyx_GIVEREF(__pyx_v_self->should_close); + PyTuple_SET_ITEM(__pyx_t_1, 6, __pyx_v_self->should_close); + __Pyx_INCREF(__pyx_v_self->upgrade); + __Pyx_GIVEREF(__pyx_v_self->upgrade); + PyTuple_SET_ITEM(__pyx_t_1, 7, __pyx_v_self->upgrade); + __Pyx_INCREF(__pyx_v_self->url); + __Pyx_GIVEREF(__pyx_v_self->url); + PyTuple_SET_ITEM(__pyx_t_1, 8, __pyx_v_self->url); + __Pyx_INCREF(__pyx_v_self->version); + __Pyx_GIVEREF(__pyx_v_self->version); + PyTuple_SET_ITEM(__pyx_t_1, 9, __pyx_v_self->version); + __pyx_v_state = ((PyObject*)__pyx_t_1); + __pyx_t_1 = 0; + + /* "(tree fragment)":6 + * cdef bint use_setstate + * state = (self.chunked, self.compression, self.headers, self.method, self.path, self.raw_headers, self.should_close, self.upgrade, self.url, self.version) + * _dict = getattr(self, '__dict__', None) # <<<<<<<<<<<<<< + * if _dict is not None: + * state += (_dict,) + */ + __pyx_t_1 = __Pyx_GetAttr3(((PyObject *)__pyx_v_self), __pyx_n_s_dict, Py_None); if (unlikely(!__pyx_t_1)) __PYX_ERR(1, 6, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __pyx_v__dict = __pyx_t_1; + __pyx_t_1 = 0; + + /* "(tree fragment)":7 + * state = (self.chunked, self.compression, self.headers, self.method, self.path, self.raw_headers, self.should_close, self.upgrade, self.url, self.version) + * _dict = getattr(self, '__dict__', None) + * if _dict is not None: # <<<<<<<<<<<<<< + * state += (_dict,) + * use_setstate = True + */ + __pyx_t_2 = (__pyx_v__dict != Py_None); + __pyx_t_3 = (__pyx_t_2 != 0); + if (__pyx_t_3) { + + /* "(tree fragment)":8 + * _dict = getattr(self, '__dict__', None) + * if _dict is not None: + * state += (_dict,) # <<<<<<<<<<<<<< + * use_setstate = True + * else: + */ + __pyx_t_1 = PyTuple_New(1); if (unlikely(!__pyx_t_1)) __PYX_ERR(1, 8, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __Pyx_INCREF(__pyx_v__dict); + __Pyx_GIVEREF(__pyx_v__dict); + PyTuple_SET_ITEM(__pyx_t_1, 0, __pyx_v__dict); + __pyx_t_4 = PyNumber_InPlaceAdd(__pyx_v_state, __pyx_t_1); if (unlikely(!__pyx_t_4)) __PYX_ERR(1, 8, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_4); + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + __Pyx_DECREF_SET(__pyx_v_state, ((PyObject*)__pyx_t_4)); + __pyx_t_4 = 0; + + /* "(tree fragment)":9 + * if _dict is not None: + * state += (_dict,) + * use_setstate = True # <<<<<<<<<<<<<< + * else: + * use_setstate = self.chunked is not None or self.compression is not None or self.headers is not None or self.method is not None or self.path is not None or self.raw_headers is not None or self.should_close is not None or self.upgrade is not None or self.url is not None or self.version is not None + */ + __pyx_v_use_setstate = 1; + + /* "(tree fragment)":7 + * state = (self.chunked, self.compression, self.headers, self.method, self.path, self.raw_headers, self.should_close, self.upgrade, self.url, self.version) + * _dict = getattr(self, '__dict__', None) + * if _dict is not None: # <<<<<<<<<<<<<< + * state += (_dict,) + * use_setstate = True + */ + goto __pyx_L3; + } + + /* "(tree fragment)":11 + * use_setstate = True + * else: + * use_setstate = self.chunked is not None or self.compression is not None or self.headers is not None or self.method is not None or self.path is not None or self.raw_headers is not None or self.should_close is not None or self.upgrade is not None or self.url is not None or self.version is not None # <<<<<<<<<<<<<< + * if use_setstate: + * return __pyx_unpickle_RawRequestMessage, (type(self), 0x1408252, None), state + */ + /*else*/ { + __pyx_t_2 = (__pyx_v_self->chunked != Py_None); + __pyx_t_5 = (__pyx_t_2 != 0); + if (!__pyx_t_5) { + } else { + __pyx_t_3 = __pyx_t_5; + goto __pyx_L4_bool_binop_done; + } + __pyx_t_5 = (__pyx_v_self->compression != Py_None); + __pyx_t_2 = (__pyx_t_5 != 0); + if (!__pyx_t_2) { + } else { + __pyx_t_3 = __pyx_t_2; + goto __pyx_L4_bool_binop_done; + } + __pyx_t_2 = (__pyx_v_self->headers != Py_None); + __pyx_t_5 = (__pyx_t_2 != 0); + if (!__pyx_t_5) { + } else { + __pyx_t_3 = __pyx_t_5; + goto __pyx_L4_bool_binop_done; + } + __pyx_t_5 = (__pyx_v_self->method != ((PyObject*)Py_None)); + __pyx_t_2 = (__pyx_t_5 != 0); + if (!__pyx_t_2) { + } else { + __pyx_t_3 = __pyx_t_2; + goto __pyx_L4_bool_binop_done; + } + __pyx_t_2 = (__pyx_v_self->path != ((PyObject*)Py_None)); + __pyx_t_5 = (__pyx_t_2 != 0); + if (!__pyx_t_5) { + } else { + __pyx_t_3 = __pyx_t_5; + goto __pyx_L4_bool_binop_done; + } + __pyx_t_5 = (__pyx_v_self->raw_headers != Py_None); + __pyx_t_2 = (__pyx_t_5 != 0); + if (!__pyx_t_2) { + } else { + __pyx_t_3 = __pyx_t_2; + goto __pyx_L4_bool_binop_done; + } + __pyx_t_2 = (__pyx_v_self->should_close != Py_None); + __pyx_t_5 = (__pyx_t_2 != 0); + if (!__pyx_t_5) { + } else { + __pyx_t_3 = __pyx_t_5; + goto __pyx_L4_bool_binop_done; + } + __pyx_t_5 = (__pyx_v_self->upgrade != Py_None); + __pyx_t_2 = (__pyx_t_5 != 0); + if (!__pyx_t_2) { + } else { + __pyx_t_3 = __pyx_t_2; + goto __pyx_L4_bool_binop_done; + } + __pyx_t_2 = (__pyx_v_self->url != Py_None); + __pyx_t_5 = (__pyx_t_2 != 0); + if (!__pyx_t_5) { + } else { + __pyx_t_3 = __pyx_t_5; + goto __pyx_L4_bool_binop_done; + } + __pyx_t_5 = (__pyx_v_self->version != Py_None); + __pyx_t_2 = (__pyx_t_5 != 0); + __pyx_t_3 = __pyx_t_2; + __pyx_L4_bool_binop_done:; + __pyx_v_use_setstate = __pyx_t_3; + } + __pyx_L3:; + + /* "(tree fragment)":12 + * else: + * use_setstate = self.chunked is not None or self.compression is not None or self.headers is not None or self.method is not None or self.path is not None or self.raw_headers is not None or self.should_close is not None or self.upgrade is not None or self.url is not None or self.version is not None + * if use_setstate: # <<<<<<<<<<<<<< + * return __pyx_unpickle_RawRequestMessage, (type(self), 0x1408252, None), state + * else: + */ + __pyx_t_3 = (__pyx_v_use_setstate != 0); + if (__pyx_t_3) { + + /* "(tree fragment)":13 + * use_setstate = self.chunked is not None or self.compression is not None or self.headers is not None or self.method is not None or self.path is not None or self.raw_headers is not None or self.should_close is not None or self.upgrade is not None or self.url is not None or self.version is not None + * if use_setstate: + * return __pyx_unpickle_RawRequestMessage, (type(self), 0x1408252, None), state # <<<<<<<<<<<<<< + * else: + * return __pyx_unpickle_RawRequestMessage, (type(self), 0x1408252, state) + */ + __Pyx_XDECREF(__pyx_r); + __Pyx_GetModuleGlobalName(__pyx_t_4, __pyx_n_s_pyx_unpickle_RawRequestMessage); if (unlikely(!__pyx_t_4)) __PYX_ERR(1, 13, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_4); + __pyx_t_1 = PyTuple_New(3); if (unlikely(!__pyx_t_1)) __PYX_ERR(1, 13, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __Pyx_INCREF(((PyObject *)Py_TYPE(((PyObject *)__pyx_v_self)))); + __Pyx_GIVEREF(((PyObject *)Py_TYPE(((PyObject *)__pyx_v_self)))); + PyTuple_SET_ITEM(__pyx_t_1, 0, ((PyObject *)Py_TYPE(((PyObject *)__pyx_v_self)))); + __Pyx_INCREF(__pyx_int_21004882); + __Pyx_GIVEREF(__pyx_int_21004882); + PyTuple_SET_ITEM(__pyx_t_1, 1, __pyx_int_21004882); + __Pyx_INCREF(Py_None); + __Pyx_GIVEREF(Py_None); + PyTuple_SET_ITEM(__pyx_t_1, 2, Py_None); + __pyx_t_6 = PyTuple_New(3); if (unlikely(!__pyx_t_6)) __PYX_ERR(1, 13, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_6); + __Pyx_GIVEREF(__pyx_t_4); + PyTuple_SET_ITEM(__pyx_t_6, 0, __pyx_t_4); + __Pyx_GIVEREF(__pyx_t_1); + PyTuple_SET_ITEM(__pyx_t_6, 1, __pyx_t_1); + __Pyx_INCREF(__pyx_v_state); + __Pyx_GIVEREF(__pyx_v_state); + PyTuple_SET_ITEM(__pyx_t_6, 2, __pyx_v_state); + __pyx_t_4 = 0; + __pyx_t_1 = 0; + __pyx_r = __pyx_t_6; + __pyx_t_6 = 0; + goto __pyx_L0; + + /* "(tree fragment)":12 + * else: + * use_setstate = self.chunked is not None or self.compression is not None or self.headers is not None or self.method is not None or self.path is not None or self.raw_headers is not None or self.should_close is not None or self.upgrade is not None or self.url is not None or self.version is not None + * if use_setstate: # <<<<<<<<<<<<<< + * return __pyx_unpickle_RawRequestMessage, (type(self), 0x1408252, None), state + * else: + */ + } + + /* "(tree fragment)":15 + * return __pyx_unpickle_RawRequestMessage, (type(self), 0x1408252, None), state + * else: + * return __pyx_unpickle_RawRequestMessage, (type(self), 0x1408252, state) # <<<<<<<<<<<<<< + * def __setstate_cython__(self, __pyx_state): + * __pyx_unpickle_RawRequestMessage__set_state(self, __pyx_state) + */ + /*else*/ { + __Pyx_XDECREF(__pyx_r); + __Pyx_GetModuleGlobalName(__pyx_t_6, __pyx_n_s_pyx_unpickle_RawRequestMessage); if (unlikely(!__pyx_t_6)) __PYX_ERR(1, 15, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_6); + __pyx_t_1 = PyTuple_New(3); if (unlikely(!__pyx_t_1)) __PYX_ERR(1, 15, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __Pyx_INCREF(((PyObject *)Py_TYPE(((PyObject *)__pyx_v_self)))); + __Pyx_GIVEREF(((PyObject *)Py_TYPE(((PyObject *)__pyx_v_self)))); + PyTuple_SET_ITEM(__pyx_t_1, 0, ((PyObject *)Py_TYPE(((PyObject *)__pyx_v_self)))); + __Pyx_INCREF(__pyx_int_21004882); + __Pyx_GIVEREF(__pyx_int_21004882); + PyTuple_SET_ITEM(__pyx_t_1, 1, __pyx_int_21004882); + __Pyx_INCREF(__pyx_v_state); + __Pyx_GIVEREF(__pyx_v_state); + PyTuple_SET_ITEM(__pyx_t_1, 2, __pyx_v_state); + __pyx_t_4 = PyTuple_New(2); if (unlikely(!__pyx_t_4)) __PYX_ERR(1, 15, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_4); + __Pyx_GIVEREF(__pyx_t_6); + PyTuple_SET_ITEM(__pyx_t_4, 0, __pyx_t_6); + __Pyx_GIVEREF(__pyx_t_1); + PyTuple_SET_ITEM(__pyx_t_4, 1, __pyx_t_1); + __pyx_t_6 = 0; + __pyx_t_1 = 0; + __pyx_r = __pyx_t_4; + __pyx_t_4 = 0; + goto __pyx_L0; + } + + /* "(tree fragment)":1 + * def __reduce_cython__(self): # <<<<<<<<<<<<<< + * cdef tuple state + * cdef object _dict + */ + + /* function exit code */ + __pyx_L1_error:; + __Pyx_XDECREF(__pyx_t_1); + __Pyx_XDECREF(__pyx_t_4); + __Pyx_XDECREF(__pyx_t_6); + __Pyx_AddTraceback("aiohttp._http_parser.RawRequestMessage.__reduce_cython__", __pyx_clineno, __pyx_lineno, __pyx_filename); + __pyx_r = NULL; + __pyx_L0:; + __Pyx_XDECREF(__pyx_v_state); + __Pyx_XDECREF(__pyx_v__dict); + __Pyx_XGIVEREF(__pyx_r); + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +/* "(tree fragment)":16 + * else: + * return __pyx_unpickle_RawRequestMessage, (type(self), 0x1408252, state) + * def __setstate_cython__(self, __pyx_state): # <<<<<<<<<<<<<< + * __pyx_unpickle_RawRequestMessage__set_state(self, __pyx_state) + */ + +/* Python wrapper */ +static PyObject *__pyx_pw_7aiohttp_12_http_parser_17RawRequestMessage_9__setstate_cython__(PyObject *__pyx_v_self, PyObject *__pyx_v___pyx_state); /*proto*/ +static PyObject *__pyx_pw_7aiohttp_12_http_parser_17RawRequestMessage_9__setstate_cython__(PyObject *__pyx_v_self, PyObject *__pyx_v___pyx_state) { + PyObject *__pyx_r = 0; + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("__setstate_cython__ (wrapper)", 0); + __pyx_r = __pyx_pf_7aiohttp_12_http_parser_17RawRequestMessage_8__setstate_cython__(((struct __pyx_obj_7aiohttp_12_http_parser_RawRequestMessage *)__pyx_v_self), ((PyObject *)__pyx_v___pyx_state)); + + /* function exit code */ + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +static PyObject *__pyx_pf_7aiohttp_12_http_parser_17RawRequestMessage_8__setstate_cython__(struct __pyx_obj_7aiohttp_12_http_parser_RawRequestMessage *__pyx_v_self, PyObject *__pyx_v___pyx_state) { + PyObject *__pyx_r = NULL; + __Pyx_RefNannyDeclarations + PyObject *__pyx_t_1 = NULL; + int __pyx_lineno = 0; + const char *__pyx_filename = NULL; + int __pyx_clineno = 0; + __Pyx_RefNannySetupContext("__setstate_cython__", 0); + + /* "(tree fragment)":17 + * return __pyx_unpickle_RawRequestMessage, (type(self), 0x1408252, state) + * def __setstate_cython__(self, __pyx_state): + * __pyx_unpickle_RawRequestMessage__set_state(self, __pyx_state) # <<<<<<<<<<<<<< + */ + if (!(likely(PyTuple_CheckExact(__pyx_v___pyx_state))||((__pyx_v___pyx_state) == Py_None)||(PyErr_Format(PyExc_TypeError, "Expected %.16s, got %.200s", "tuple", Py_TYPE(__pyx_v___pyx_state)->tp_name), 0))) __PYX_ERR(1, 17, __pyx_L1_error) + __pyx_t_1 = __pyx_f_7aiohttp_12_http_parser___pyx_unpickle_RawRequestMessage__set_state(__pyx_v_self, ((PyObject*)__pyx_v___pyx_state)); if (unlikely(!__pyx_t_1)) __PYX_ERR(1, 17, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + + /* "(tree fragment)":16 + * else: + * return __pyx_unpickle_RawRequestMessage, (type(self), 0x1408252, state) + * def __setstate_cython__(self, __pyx_state): # <<<<<<<<<<<<<< + * __pyx_unpickle_RawRequestMessage__set_state(self, __pyx_state) + */ + + /* function exit code */ + __pyx_r = Py_None; __Pyx_INCREF(Py_None); + goto __pyx_L0; + __pyx_L1_error:; + __Pyx_XDECREF(__pyx_t_1); + __Pyx_AddTraceback("aiohttp._http_parser.RawRequestMessage.__setstate_cython__", __pyx_clineno, __pyx_lineno, __pyx_filename); + __pyx_r = NULL; + __pyx_L0:; + __Pyx_XGIVEREF(__pyx_r); + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +/* "aiohttp/_http_parser.pyx":184 + * return ret + * + * cdef _new_request_message(str method, # <<<<<<<<<<<<<< + * str path, + * object version, + */ + +static PyObject *__pyx_f_7aiohttp_12_http_parser__new_request_message(PyObject *__pyx_v_method, PyObject *__pyx_v_path, PyObject *__pyx_v_version, PyObject *__pyx_v_headers, PyObject *__pyx_v_raw_headers, int __pyx_v_should_close, PyObject *__pyx_v_compression, int __pyx_v_upgrade, int __pyx_v_chunked, PyObject *__pyx_v_url) { + struct __pyx_obj_7aiohttp_12_http_parser_RawRequestMessage *__pyx_v_ret = 0; + PyObject *__pyx_r = NULL; + __Pyx_RefNannyDeclarations + PyObject *__pyx_t_1 = NULL; + int __pyx_lineno = 0; + const char *__pyx_filename = NULL; + int __pyx_clineno = 0; + __Pyx_RefNannySetupContext("_new_request_message", 0); + + /* "aiohttp/_http_parser.pyx":195 + * object url): + * cdef RawRequestMessage ret + * ret = RawRequestMessage.__new__(RawRequestMessage) # <<<<<<<<<<<<<< + * ret.method = method + * ret.path = path + */ + __pyx_t_1 = ((PyObject *)__pyx_tp_new_7aiohttp_12_http_parser_RawRequestMessage(((PyTypeObject *)__pyx_ptype_7aiohttp_12_http_parser_RawRequestMessage), __pyx_empty_tuple, NULL)); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 195, __pyx_L1_error) + __Pyx_GOTREF(((PyObject *)__pyx_t_1)); + __pyx_v_ret = ((struct __pyx_obj_7aiohttp_12_http_parser_RawRequestMessage *)__pyx_t_1); + __pyx_t_1 = 0; + + /* "aiohttp/_http_parser.pyx":196 + * cdef RawRequestMessage ret + * ret = RawRequestMessage.__new__(RawRequestMessage) + * ret.method = method # <<<<<<<<<<<<<< + * ret.path = path + * ret.version = version + */ + __Pyx_INCREF(__pyx_v_method); + __Pyx_GIVEREF(__pyx_v_method); + __Pyx_GOTREF(__pyx_v_ret->method); + __Pyx_DECREF(__pyx_v_ret->method); + __pyx_v_ret->method = __pyx_v_method; + + /* "aiohttp/_http_parser.pyx":197 + * ret = RawRequestMessage.__new__(RawRequestMessage) + * ret.method = method + * ret.path = path # <<<<<<<<<<<<<< + * ret.version = version + * ret.headers = headers + */ + __Pyx_INCREF(__pyx_v_path); + __Pyx_GIVEREF(__pyx_v_path); + __Pyx_GOTREF(__pyx_v_ret->path); + __Pyx_DECREF(__pyx_v_ret->path); + __pyx_v_ret->path = __pyx_v_path; + + /* "aiohttp/_http_parser.pyx":198 + * ret.method = method + * ret.path = path + * ret.version = version # <<<<<<<<<<<<<< + * ret.headers = headers + * ret.raw_headers = raw_headers + */ + __Pyx_INCREF(__pyx_v_version); + __Pyx_GIVEREF(__pyx_v_version); + __Pyx_GOTREF(__pyx_v_ret->version); + __Pyx_DECREF(__pyx_v_ret->version); + __pyx_v_ret->version = __pyx_v_version; + + /* "aiohttp/_http_parser.pyx":199 + * ret.path = path + * ret.version = version + * ret.headers = headers # <<<<<<<<<<<<<< + * ret.raw_headers = raw_headers + * ret.should_close = should_close + */ + __Pyx_INCREF(__pyx_v_headers); + __Pyx_GIVEREF(__pyx_v_headers); + __Pyx_GOTREF(__pyx_v_ret->headers); + __Pyx_DECREF(__pyx_v_ret->headers); + __pyx_v_ret->headers = __pyx_v_headers; + + /* "aiohttp/_http_parser.pyx":200 + * ret.version = version + * ret.headers = headers + * ret.raw_headers = raw_headers # <<<<<<<<<<<<<< + * ret.should_close = should_close + * ret.compression = compression + */ + __Pyx_INCREF(__pyx_v_raw_headers); + __Pyx_GIVEREF(__pyx_v_raw_headers); + __Pyx_GOTREF(__pyx_v_ret->raw_headers); + __Pyx_DECREF(__pyx_v_ret->raw_headers); + __pyx_v_ret->raw_headers = __pyx_v_raw_headers; + + /* "aiohttp/_http_parser.pyx":201 + * ret.headers = headers + * ret.raw_headers = raw_headers + * ret.should_close = should_close # <<<<<<<<<<<<<< + * ret.compression = compression + * ret.upgrade = upgrade + */ + __pyx_t_1 = __Pyx_PyBool_FromLong(__pyx_v_should_close); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 201, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __Pyx_GIVEREF(__pyx_t_1); + __Pyx_GOTREF(__pyx_v_ret->should_close); + __Pyx_DECREF(__pyx_v_ret->should_close); + __pyx_v_ret->should_close = __pyx_t_1; + __pyx_t_1 = 0; + + /* "aiohttp/_http_parser.pyx":202 + * ret.raw_headers = raw_headers + * ret.should_close = should_close + * ret.compression = compression # <<<<<<<<<<<<<< + * ret.upgrade = upgrade + * ret.chunked = chunked + */ + __Pyx_INCREF(__pyx_v_compression); + __Pyx_GIVEREF(__pyx_v_compression); + __Pyx_GOTREF(__pyx_v_ret->compression); + __Pyx_DECREF(__pyx_v_ret->compression); + __pyx_v_ret->compression = __pyx_v_compression; + + /* "aiohttp/_http_parser.pyx":203 + * ret.should_close = should_close + * ret.compression = compression + * ret.upgrade = upgrade # <<<<<<<<<<<<<< + * ret.chunked = chunked + * ret.url = url + */ + __pyx_t_1 = __Pyx_PyBool_FromLong(__pyx_v_upgrade); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 203, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __Pyx_GIVEREF(__pyx_t_1); + __Pyx_GOTREF(__pyx_v_ret->upgrade); + __Pyx_DECREF(__pyx_v_ret->upgrade); + __pyx_v_ret->upgrade = __pyx_t_1; + __pyx_t_1 = 0; + + /* "aiohttp/_http_parser.pyx":204 + * ret.compression = compression + * ret.upgrade = upgrade + * ret.chunked = chunked # <<<<<<<<<<<<<< + * ret.url = url + * return ret + */ + __pyx_t_1 = __Pyx_PyBool_FromLong(__pyx_v_chunked); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 204, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __Pyx_GIVEREF(__pyx_t_1); + __Pyx_GOTREF(__pyx_v_ret->chunked); + __Pyx_DECREF(__pyx_v_ret->chunked); + __pyx_v_ret->chunked = __pyx_t_1; + __pyx_t_1 = 0; + + /* "aiohttp/_http_parser.pyx":205 + * ret.upgrade = upgrade + * ret.chunked = chunked + * ret.url = url # <<<<<<<<<<<<<< + * return ret + * + */ + __Pyx_INCREF(__pyx_v_url); + __Pyx_GIVEREF(__pyx_v_url); + __Pyx_GOTREF(__pyx_v_ret->url); + __Pyx_DECREF(__pyx_v_ret->url); + __pyx_v_ret->url = __pyx_v_url; + + /* "aiohttp/_http_parser.pyx":206 + * ret.chunked = chunked + * ret.url = url + * return ret # <<<<<<<<<<<<<< + * + * + */ + __Pyx_XDECREF(__pyx_r); + __Pyx_INCREF(((PyObject *)__pyx_v_ret)); + __pyx_r = ((PyObject *)__pyx_v_ret); + goto __pyx_L0; + + /* "aiohttp/_http_parser.pyx":184 + * return ret + * + * cdef _new_request_message(str method, # <<<<<<<<<<<<<< + * str path, + * object version, + */ + + /* function exit code */ + __pyx_L1_error:; + __Pyx_XDECREF(__pyx_t_1); + __Pyx_AddTraceback("aiohttp._http_parser._new_request_message", __pyx_clineno, __pyx_lineno, __pyx_filename); + __pyx_r = 0; + __pyx_L0:; + __Pyx_XDECREF((PyObject *)__pyx_v_ret); + __Pyx_XGIVEREF(__pyx_r); + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +/* "aiohttp/_http_parser.pyx":221 + * cdef readonly object chunked + * + * def __init__(self, version, code, reason, headers, raw_headers, # <<<<<<<<<<<<<< + * should_close, compression, upgrade, chunked): + * self.version = version + */ + +/* Python wrapper */ +static int __pyx_pw_7aiohttp_12_http_parser_18RawResponseMessage_1__init__(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/ +static int __pyx_pw_7aiohttp_12_http_parser_18RawResponseMessage_1__init__(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds) { + PyObject *__pyx_v_version = 0; + PyObject *__pyx_v_code = 0; + PyObject *__pyx_v_reason = 0; + PyObject *__pyx_v_headers = 0; + PyObject *__pyx_v_raw_headers = 0; + PyObject *__pyx_v_should_close = 0; + PyObject *__pyx_v_compression = 0; + PyObject *__pyx_v_upgrade = 0; + PyObject *__pyx_v_chunked = 0; + int __pyx_lineno = 0; + const char *__pyx_filename = NULL; + int __pyx_clineno = 0; + int __pyx_r; + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("__init__ (wrapper)", 0); + { + static PyObject **__pyx_pyargnames[] = {&__pyx_n_s_version,&__pyx_n_s_code,&__pyx_n_s_reason,&__pyx_n_s_headers,&__pyx_n_s_raw_headers,&__pyx_n_s_should_close,&__pyx_n_s_compression,&__pyx_n_s_upgrade,&__pyx_n_s_chunked,0}; + PyObject* values[9] = {0,0,0,0,0,0,0,0,0}; + if (unlikely(__pyx_kwds)) { + Py_ssize_t kw_args; + const Py_ssize_t pos_args = PyTuple_GET_SIZE(__pyx_args); + switch (pos_args) { + case 9: values[8] = PyTuple_GET_ITEM(__pyx_args, 8); + CYTHON_FALLTHROUGH; + case 8: values[7] = PyTuple_GET_ITEM(__pyx_args, 7); + CYTHON_FALLTHROUGH; + case 7: values[6] = PyTuple_GET_ITEM(__pyx_args, 6); + CYTHON_FALLTHROUGH; + case 6: values[5] = PyTuple_GET_ITEM(__pyx_args, 5); + CYTHON_FALLTHROUGH; + case 5: values[4] = PyTuple_GET_ITEM(__pyx_args, 4); + CYTHON_FALLTHROUGH; + case 4: values[3] = PyTuple_GET_ITEM(__pyx_args, 3); + CYTHON_FALLTHROUGH; + case 3: values[2] = PyTuple_GET_ITEM(__pyx_args, 2); + CYTHON_FALLTHROUGH; + case 2: values[1] = PyTuple_GET_ITEM(__pyx_args, 1); + CYTHON_FALLTHROUGH; + case 1: values[0] = PyTuple_GET_ITEM(__pyx_args, 0); + CYTHON_FALLTHROUGH; + case 0: break; + default: goto __pyx_L5_argtuple_error; + } + kw_args = PyDict_Size(__pyx_kwds); + switch (pos_args) { + case 0: + if (likely((values[0] = __Pyx_PyDict_GetItemStr(__pyx_kwds, __pyx_n_s_version)) != 0)) kw_args--; + else goto __pyx_L5_argtuple_error; + CYTHON_FALLTHROUGH; + case 1: + if (likely((values[1] = __Pyx_PyDict_GetItemStr(__pyx_kwds, __pyx_n_s_code)) != 0)) kw_args--; + else { + __Pyx_RaiseArgtupleInvalid("__init__", 1, 9, 9, 1); __PYX_ERR(0, 221, __pyx_L3_error) + } + CYTHON_FALLTHROUGH; + case 2: + if (likely((values[2] = __Pyx_PyDict_GetItemStr(__pyx_kwds, __pyx_n_s_reason)) != 0)) kw_args--; + else { + __Pyx_RaiseArgtupleInvalid("__init__", 1, 9, 9, 2); __PYX_ERR(0, 221, __pyx_L3_error) + } + CYTHON_FALLTHROUGH; + case 3: + if (likely((values[3] = __Pyx_PyDict_GetItemStr(__pyx_kwds, __pyx_n_s_headers)) != 0)) kw_args--; + else { + __Pyx_RaiseArgtupleInvalid("__init__", 1, 9, 9, 3); __PYX_ERR(0, 221, __pyx_L3_error) + } + CYTHON_FALLTHROUGH; + case 4: + if (likely((values[4] = __Pyx_PyDict_GetItemStr(__pyx_kwds, __pyx_n_s_raw_headers)) != 0)) kw_args--; + else { + __Pyx_RaiseArgtupleInvalid("__init__", 1, 9, 9, 4); __PYX_ERR(0, 221, __pyx_L3_error) + } + CYTHON_FALLTHROUGH; + case 5: + if (likely((values[5] = __Pyx_PyDict_GetItemStr(__pyx_kwds, __pyx_n_s_should_close)) != 0)) kw_args--; + else { + __Pyx_RaiseArgtupleInvalid("__init__", 1, 9, 9, 5); __PYX_ERR(0, 221, __pyx_L3_error) + } + CYTHON_FALLTHROUGH; + case 6: + if (likely((values[6] = __Pyx_PyDict_GetItemStr(__pyx_kwds, __pyx_n_s_compression)) != 0)) kw_args--; + else { + __Pyx_RaiseArgtupleInvalid("__init__", 1, 9, 9, 6); __PYX_ERR(0, 221, __pyx_L3_error) + } + CYTHON_FALLTHROUGH; + case 7: + if (likely((values[7] = __Pyx_PyDict_GetItemStr(__pyx_kwds, __pyx_n_s_upgrade)) != 0)) kw_args--; + else { + __Pyx_RaiseArgtupleInvalid("__init__", 1, 9, 9, 7); __PYX_ERR(0, 221, __pyx_L3_error) + } + CYTHON_FALLTHROUGH; + case 8: + if (likely((values[8] = __Pyx_PyDict_GetItemStr(__pyx_kwds, __pyx_n_s_chunked)) != 0)) kw_args--; + else { + __Pyx_RaiseArgtupleInvalid("__init__", 1, 9, 9, 8); __PYX_ERR(0, 221, __pyx_L3_error) + } + } + if (unlikely(kw_args > 0)) { + if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, pos_args, "__init__") < 0)) __PYX_ERR(0, 221, __pyx_L3_error) + } + } else if (PyTuple_GET_SIZE(__pyx_args) != 9) { + goto __pyx_L5_argtuple_error; + } else { + values[0] = PyTuple_GET_ITEM(__pyx_args, 0); + values[1] = PyTuple_GET_ITEM(__pyx_args, 1); + values[2] = PyTuple_GET_ITEM(__pyx_args, 2); + values[3] = PyTuple_GET_ITEM(__pyx_args, 3); + values[4] = PyTuple_GET_ITEM(__pyx_args, 4); + values[5] = PyTuple_GET_ITEM(__pyx_args, 5); + values[6] = PyTuple_GET_ITEM(__pyx_args, 6); + values[7] = PyTuple_GET_ITEM(__pyx_args, 7); + values[8] = PyTuple_GET_ITEM(__pyx_args, 8); + } + __pyx_v_version = values[0]; + __pyx_v_code = values[1]; + __pyx_v_reason = values[2]; + __pyx_v_headers = values[3]; + __pyx_v_raw_headers = values[4]; + __pyx_v_should_close = values[5]; + __pyx_v_compression = values[6]; + __pyx_v_upgrade = values[7]; + __pyx_v_chunked = values[8]; + } + goto __pyx_L4_argument_unpacking_done; + __pyx_L5_argtuple_error:; + __Pyx_RaiseArgtupleInvalid("__init__", 1, 9, 9, PyTuple_GET_SIZE(__pyx_args)); __PYX_ERR(0, 221, __pyx_L3_error) + __pyx_L3_error:; + __Pyx_AddTraceback("aiohttp._http_parser.RawResponseMessage.__init__", __pyx_clineno, __pyx_lineno, __pyx_filename); + __Pyx_RefNannyFinishContext(); + return -1; + __pyx_L4_argument_unpacking_done:; + __pyx_r = __pyx_pf_7aiohttp_12_http_parser_18RawResponseMessage___init__(((struct __pyx_obj_7aiohttp_12_http_parser_RawResponseMessage *)__pyx_v_self), __pyx_v_version, __pyx_v_code, __pyx_v_reason, __pyx_v_headers, __pyx_v_raw_headers, __pyx_v_should_close, __pyx_v_compression, __pyx_v_upgrade, __pyx_v_chunked); + + /* function exit code */ + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +static int __pyx_pf_7aiohttp_12_http_parser_18RawResponseMessage___init__(struct __pyx_obj_7aiohttp_12_http_parser_RawResponseMessage *__pyx_v_self, PyObject *__pyx_v_version, PyObject *__pyx_v_code, PyObject *__pyx_v_reason, PyObject *__pyx_v_headers, PyObject *__pyx_v_raw_headers, PyObject *__pyx_v_should_close, PyObject *__pyx_v_compression, PyObject *__pyx_v_upgrade, PyObject *__pyx_v_chunked) { + int __pyx_r; + __Pyx_RefNannyDeclarations + int __pyx_t_1; + PyObject *__pyx_t_2 = NULL; + int __pyx_lineno = 0; + const char *__pyx_filename = NULL; + int __pyx_clineno = 0; + __Pyx_RefNannySetupContext("__init__", 0); + + /* "aiohttp/_http_parser.pyx":223 + * def __init__(self, version, code, reason, headers, raw_headers, + * should_close, compression, upgrade, chunked): + * self.version = version # <<<<<<<<<<<<<< + * self.code = code + * self.reason = reason + */ + __Pyx_INCREF(__pyx_v_version); + __Pyx_GIVEREF(__pyx_v_version); + __Pyx_GOTREF(__pyx_v_self->version); + __Pyx_DECREF(__pyx_v_self->version); + __pyx_v_self->version = __pyx_v_version; + + /* "aiohttp/_http_parser.pyx":224 + * should_close, compression, upgrade, chunked): + * self.version = version + * self.code = code # <<<<<<<<<<<<<< + * self.reason = reason + * self.headers = headers + */ + __pyx_t_1 = __Pyx_PyInt_As_int(__pyx_v_code); if (unlikely((__pyx_t_1 == (int)-1) && PyErr_Occurred())) __PYX_ERR(0, 224, __pyx_L1_error) + __pyx_v_self->code = __pyx_t_1; + + /* "aiohttp/_http_parser.pyx":225 + * self.version = version + * self.code = code + * self.reason = reason # <<<<<<<<<<<<<< + * self.headers = headers + * self.raw_headers = raw_headers + */ + if (!(likely(PyUnicode_CheckExact(__pyx_v_reason))||((__pyx_v_reason) == Py_None)||(PyErr_Format(PyExc_TypeError, "Expected %.16s, got %.200s", "unicode", Py_TYPE(__pyx_v_reason)->tp_name), 0))) __PYX_ERR(0, 225, __pyx_L1_error) + __pyx_t_2 = __pyx_v_reason; + __Pyx_INCREF(__pyx_t_2); + __Pyx_GIVEREF(__pyx_t_2); + __Pyx_GOTREF(__pyx_v_self->reason); + __Pyx_DECREF(__pyx_v_self->reason); + __pyx_v_self->reason = ((PyObject*)__pyx_t_2); + __pyx_t_2 = 0; + + /* "aiohttp/_http_parser.pyx":226 + * self.code = code + * self.reason = reason + * self.headers = headers # <<<<<<<<<<<<<< + * self.raw_headers = raw_headers + * self.should_close = should_close + */ + __Pyx_INCREF(__pyx_v_headers); + __Pyx_GIVEREF(__pyx_v_headers); + __Pyx_GOTREF(__pyx_v_self->headers); + __Pyx_DECREF(__pyx_v_self->headers); + __pyx_v_self->headers = __pyx_v_headers; + + /* "aiohttp/_http_parser.pyx":227 + * self.reason = reason + * self.headers = headers + * self.raw_headers = raw_headers # <<<<<<<<<<<<<< + * self.should_close = should_close + * self.compression = compression + */ + __Pyx_INCREF(__pyx_v_raw_headers); + __Pyx_GIVEREF(__pyx_v_raw_headers); + __Pyx_GOTREF(__pyx_v_self->raw_headers); + __Pyx_DECREF(__pyx_v_self->raw_headers); + __pyx_v_self->raw_headers = __pyx_v_raw_headers; + + /* "aiohttp/_http_parser.pyx":228 + * self.headers = headers + * self.raw_headers = raw_headers + * self.should_close = should_close # <<<<<<<<<<<<<< + * self.compression = compression + * self.upgrade = upgrade + */ + __Pyx_INCREF(__pyx_v_should_close); + __Pyx_GIVEREF(__pyx_v_should_close); + __Pyx_GOTREF(__pyx_v_self->should_close); + __Pyx_DECREF(__pyx_v_self->should_close); + __pyx_v_self->should_close = __pyx_v_should_close; + + /* "aiohttp/_http_parser.pyx":229 + * self.raw_headers = raw_headers + * self.should_close = should_close + * self.compression = compression # <<<<<<<<<<<<<< + * self.upgrade = upgrade + * self.chunked = chunked + */ + __Pyx_INCREF(__pyx_v_compression); + __Pyx_GIVEREF(__pyx_v_compression); + __Pyx_GOTREF(__pyx_v_self->compression); + __Pyx_DECREF(__pyx_v_self->compression); + __pyx_v_self->compression = __pyx_v_compression; + + /* "aiohttp/_http_parser.pyx":230 + * self.should_close = should_close + * self.compression = compression + * self.upgrade = upgrade # <<<<<<<<<<<<<< + * self.chunked = chunked + * + */ + __Pyx_INCREF(__pyx_v_upgrade); + __Pyx_GIVEREF(__pyx_v_upgrade); + __Pyx_GOTREF(__pyx_v_self->upgrade); + __Pyx_DECREF(__pyx_v_self->upgrade); + __pyx_v_self->upgrade = __pyx_v_upgrade; + + /* "aiohttp/_http_parser.pyx":231 + * self.compression = compression + * self.upgrade = upgrade + * self.chunked = chunked # <<<<<<<<<<<<<< + * + * def __repr__(self): + */ + __Pyx_INCREF(__pyx_v_chunked); + __Pyx_GIVEREF(__pyx_v_chunked); + __Pyx_GOTREF(__pyx_v_self->chunked); + __Pyx_DECREF(__pyx_v_self->chunked); + __pyx_v_self->chunked = __pyx_v_chunked; + + /* "aiohttp/_http_parser.pyx":221 + * cdef readonly object chunked + * + * def __init__(self, version, code, reason, headers, raw_headers, # <<<<<<<<<<<<<< + * should_close, compression, upgrade, chunked): + * self.version = version + */ + + /* function exit code */ + __pyx_r = 0; + goto __pyx_L0; + __pyx_L1_error:; + __Pyx_XDECREF(__pyx_t_2); + __Pyx_AddTraceback("aiohttp._http_parser.RawResponseMessage.__init__", __pyx_clineno, __pyx_lineno, __pyx_filename); + __pyx_r = -1; + __pyx_L0:; + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +/* "aiohttp/_http_parser.pyx":233 + * self.chunked = chunked + * + * def __repr__(self): # <<<<<<<<<<<<<< + * info = [] + * info.append(("version", self.version)) + */ + +/* Python wrapper */ +static PyObject *__pyx_pw_7aiohttp_12_http_parser_18RawResponseMessage_3__repr__(PyObject *__pyx_v_self); /*proto*/ +static PyObject *__pyx_pw_7aiohttp_12_http_parser_18RawResponseMessage_3__repr__(PyObject *__pyx_v_self) { + PyObject *__pyx_r = 0; + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("__repr__ (wrapper)", 0); + __pyx_r = __pyx_pf_7aiohttp_12_http_parser_18RawResponseMessage_2__repr__(((struct __pyx_obj_7aiohttp_12_http_parser_RawResponseMessage *)__pyx_v_self)); + + /* function exit code */ + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} +static PyObject *__pyx_gb_7aiohttp_12_http_parser_18RawResponseMessage_8__repr___2generator1(__pyx_CoroutineObject *__pyx_generator, CYTHON_UNUSED PyThreadState *__pyx_tstate, PyObject *__pyx_sent_value); /* proto */ + +/* "aiohttp/_http_parser.pyx":244 + * info.append(("upgrade", self.upgrade)) + * info.append(("chunked", self.chunked)) + * sinfo = ', '.join(name + '=' + repr(val) for name, val in info) # <<<<<<<<<<<<<< + * return '' + * + */ + +static PyObject *__pyx_pf_7aiohttp_12_http_parser_18RawResponseMessage_8__repr___genexpr(PyObject *__pyx_self) { + struct __pyx_obj_7aiohttp_12_http_parser___pyx_scope_struct_3_genexpr *__pyx_cur_scope; + PyObject *__pyx_r = NULL; + __Pyx_RefNannyDeclarations + int __pyx_lineno = 0; + const char *__pyx_filename = NULL; + int __pyx_clineno = 0; + __Pyx_RefNannySetupContext("genexpr", 0); + __pyx_cur_scope = (struct __pyx_obj_7aiohttp_12_http_parser___pyx_scope_struct_3_genexpr *)__pyx_tp_new_7aiohttp_12_http_parser___pyx_scope_struct_3_genexpr(__pyx_ptype_7aiohttp_12_http_parser___pyx_scope_struct_3_genexpr, __pyx_empty_tuple, NULL); + if (unlikely(!__pyx_cur_scope)) { + __pyx_cur_scope = ((struct __pyx_obj_7aiohttp_12_http_parser___pyx_scope_struct_3_genexpr *)Py_None); + __Pyx_INCREF(Py_None); + __PYX_ERR(0, 244, __pyx_L1_error) + } else { + __Pyx_GOTREF(__pyx_cur_scope); + } + __pyx_cur_scope->__pyx_outer_scope = (struct __pyx_obj_7aiohttp_12_http_parser___pyx_scope_struct_2___repr__ *) __pyx_self; + __Pyx_INCREF(((PyObject *)__pyx_cur_scope->__pyx_outer_scope)); + __Pyx_GIVEREF(__pyx_cur_scope->__pyx_outer_scope); + { + __pyx_CoroutineObject *gen = __Pyx_Generator_New((__pyx_coroutine_body_t) __pyx_gb_7aiohttp_12_http_parser_18RawResponseMessage_8__repr___2generator1, NULL, (PyObject *) __pyx_cur_scope, __pyx_n_s_genexpr, __pyx_n_s_repr___locals_genexpr, __pyx_n_s_aiohttp__http_parser); if (unlikely(!gen)) __PYX_ERR(0, 244, __pyx_L1_error) + __Pyx_DECREF(__pyx_cur_scope); + __Pyx_RefNannyFinishContext(); + return (PyObject *) gen; + } + + /* function exit code */ + __pyx_L1_error:; + __Pyx_AddTraceback("aiohttp._http_parser.RawResponseMessage.__repr__.genexpr", __pyx_clineno, __pyx_lineno, __pyx_filename); + __pyx_r = NULL; + __Pyx_DECREF(((PyObject *)__pyx_cur_scope)); + __Pyx_XGIVEREF(__pyx_r); + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +static PyObject *__pyx_gb_7aiohttp_12_http_parser_18RawResponseMessage_8__repr___2generator1(__pyx_CoroutineObject *__pyx_generator, CYTHON_UNUSED PyThreadState *__pyx_tstate, PyObject *__pyx_sent_value) /* generator body */ +{ + struct __pyx_obj_7aiohttp_12_http_parser___pyx_scope_struct_3_genexpr *__pyx_cur_scope = ((struct __pyx_obj_7aiohttp_12_http_parser___pyx_scope_struct_3_genexpr *)__pyx_generator->closure); + PyObject *__pyx_r = NULL; + PyObject *__pyx_t_1 = NULL; + Py_ssize_t __pyx_t_2; + PyObject *__pyx_t_3 = NULL; + PyObject *__pyx_t_4 = NULL; + PyObject *__pyx_t_5 = NULL; + PyObject *__pyx_t_6 = NULL; + PyObject *(*__pyx_t_7)(PyObject *); + int __pyx_lineno = 0; + const char *__pyx_filename = NULL; + int __pyx_clineno = 0; + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("genexpr", 0); + switch (__pyx_generator->resume_label) { + case 0: goto __pyx_L3_first_run; + default: /* CPython raises the right error here */ + __Pyx_RefNannyFinishContext(); + return NULL; + } + __pyx_L3_first_run:; + if (unlikely(!__pyx_sent_value)) __PYX_ERR(0, 244, __pyx_L1_error) + __pyx_r = PyList_New(0); if (unlikely(!__pyx_r)) __PYX_ERR(0, 244, __pyx_L1_error) + __Pyx_GOTREF(__pyx_r); + if (unlikely(!__pyx_cur_scope->__pyx_outer_scope->__pyx_v_info)) { __Pyx_RaiseClosureNameError("info"); __PYX_ERR(0, 244, __pyx_L1_error) } + if (unlikely(__pyx_cur_scope->__pyx_outer_scope->__pyx_v_info == Py_None)) { + PyErr_SetString(PyExc_TypeError, "'NoneType' object is not iterable"); + __PYX_ERR(0, 244, __pyx_L1_error) + } + __pyx_t_1 = __pyx_cur_scope->__pyx_outer_scope->__pyx_v_info; __Pyx_INCREF(__pyx_t_1); __pyx_t_2 = 0; + for (;;) { + if (__pyx_t_2 >= PyList_GET_SIZE(__pyx_t_1)) break; + #if CYTHON_ASSUME_SAFE_MACROS && !CYTHON_AVOID_BORROWED_REFS + __pyx_t_3 = PyList_GET_ITEM(__pyx_t_1, __pyx_t_2); __Pyx_INCREF(__pyx_t_3); __pyx_t_2++; if (unlikely(0 < 0)) __PYX_ERR(0, 244, __pyx_L1_error) + #else + __pyx_t_3 = PySequence_ITEM(__pyx_t_1, __pyx_t_2); __pyx_t_2++; if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 244, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_3); + #endif + if ((likely(PyTuple_CheckExact(__pyx_t_3))) || (PyList_CheckExact(__pyx_t_3))) { + PyObject* sequence = __pyx_t_3; + Py_ssize_t size = __Pyx_PySequence_SIZE(sequence); + if (unlikely(size != 2)) { + if (size > 2) __Pyx_RaiseTooManyValuesError(2); + else if (size >= 0) __Pyx_RaiseNeedMoreValuesError(size); + __PYX_ERR(0, 244, __pyx_L1_error) + } + #if CYTHON_ASSUME_SAFE_MACROS && !CYTHON_AVOID_BORROWED_REFS + if (likely(PyTuple_CheckExact(sequence))) { + __pyx_t_4 = PyTuple_GET_ITEM(sequence, 0); + __pyx_t_5 = PyTuple_GET_ITEM(sequence, 1); + } else { + __pyx_t_4 = PyList_GET_ITEM(sequence, 0); + __pyx_t_5 = PyList_GET_ITEM(sequence, 1); + } + __Pyx_INCREF(__pyx_t_4); + __Pyx_INCREF(__pyx_t_5); + #else + __pyx_t_4 = PySequence_ITEM(sequence, 0); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 244, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_4); + __pyx_t_5 = PySequence_ITEM(sequence, 1); if (unlikely(!__pyx_t_5)) __PYX_ERR(0, 244, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_5); + #endif + __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; + } else { + Py_ssize_t index = -1; + __pyx_t_6 = PyObject_GetIter(__pyx_t_3); if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 244, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_6); + __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; + __pyx_t_7 = Py_TYPE(__pyx_t_6)->tp_iternext; + index = 0; __pyx_t_4 = __pyx_t_7(__pyx_t_6); if (unlikely(!__pyx_t_4)) goto __pyx_L6_unpacking_failed; + __Pyx_GOTREF(__pyx_t_4); + index = 1; __pyx_t_5 = __pyx_t_7(__pyx_t_6); if (unlikely(!__pyx_t_5)) goto __pyx_L6_unpacking_failed; + __Pyx_GOTREF(__pyx_t_5); + if (__Pyx_IternextUnpackEndCheck(__pyx_t_7(__pyx_t_6), 2) < 0) __PYX_ERR(0, 244, __pyx_L1_error) + __pyx_t_7 = NULL; + __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0; + goto __pyx_L7_unpacking_done; + __pyx_L6_unpacking_failed:; + __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0; + __pyx_t_7 = NULL; + if (__Pyx_IterFinish() == 0) __Pyx_RaiseNeedMoreValuesError(index); + __PYX_ERR(0, 244, __pyx_L1_error) + __pyx_L7_unpacking_done:; + } + __Pyx_XGOTREF(__pyx_cur_scope->__pyx_v_name); + __Pyx_XDECREF_SET(__pyx_cur_scope->__pyx_v_name, __pyx_t_4); + __Pyx_GIVEREF(__pyx_t_4); + __pyx_t_4 = 0; + __Pyx_XGOTREF(__pyx_cur_scope->__pyx_v_val); + __Pyx_XDECREF_SET(__pyx_cur_scope->__pyx_v_val, __pyx_t_5); + __Pyx_GIVEREF(__pyx_t_5); + __pyx_t_5 = 0; + __pyx_t_3 = PyNumber_Add(__pyx_cur_scope->__pyx_v_name, __pyx_kp_u_); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 244, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_3); + __pyx_t_5 = PyObject_Repr(__pyx_cur_scope->__pyx_v_val); if (unlikely(!__pyx_t_5)) __PYX_ERR(0, 244, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_5); + __pyx_t_4 = PyNumber_Add(__pyx_t_3, __pyx_t_5); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 244, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_4); + __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; + __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0; + if (unlikely(__Pyx_ListComp_Append(__pyx_r, (PyObject*)__pyx_t_4))) __PYX_ERR(0, 244, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; + } + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + CYTHON_MAYBE_UNUSED_VAR(__pyx_cur_scope); + + /* function exit code */ + goto __pyx_L0; + __pyx_L1_error:; + __Pyx_XDECREF(__pyx_r); __pyx_r = 0; + __Pyx_XDECREF(__pyx_t_1); + __Pyx_XDECREF(__pyx_t_3); + __Pyx_XDECREF(__pyx_t_4); + __Pyx_XDECREF(__pyx_t_5); + __Pyx_XDECREF(__pyx_t_6); + __Pyx_AddTraceback("genexpr", __pyx_clineno, __pyx_lineno, __pyx_filename); + __pyx_L0:; + __Pyx_XGIVEREF(__pyx_r); + #if !CYTHON_USE_EXC_INFO_STACK + __Pyx_Coroutine_ResetAndClearException(__pyx_generator); + #endif + __pyx_generator->resume_label = -1; + __Pyx_Coroutine_clear((PyObject*)__pyx_generator); + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +/* "aiohttp/_http_parser.pyx":233 + * self.chunked = chunked + * + * def __repr__(self): # <<<<<<<<<<<<<< + * info = [] + * info.append(("version", self.version)) + */ + +static PyObject *__pyx_pf_7aiohttp_12_http_parser_18RawResponseMessage_2__repr__(struct __pyx_obj_7aiohttp_12_http_parser_RawResponseMessage *__pyx_v_self) { + struct __pyx_obj_7aiohttp_12_http_parser___pyx_scope_struct_2___repr__ *__pyx_cur_scope; + PyObject *__pyx_v_sinfo = NULL; + PyObject *__pyx_gb_7aiohttp_12_http_parser_18RawResponseMessage_8__repr___2generator1 = 0; + PyObject *__pyx_r = NULL; + __Pyx_RefNannyDeclarations + PyObject *__pyx_t_1 = NULL; + int __pyx_t_2; + PyObject *__pyx_t_3 = NULL; + int __pyx_lineno = 0; + const char *__pyx_filename = NULL; + int __pyx_clineno = 0; + __Pyx_RefNannySetupContext("__repr__", 0); + __pyx_cur_scope = (struct __pyx_obj_7aiohttp_12_http_parser___pyx_scope_struct_2___repr__ *)__pyx_tp_new_7aiohttp_12_http_parser___pyx_scope_struct_2___repr__(__pyx_ptype_7aiohttp_12_http_parser___pyx_scope_struct_2___repr__, __pyx_empty_tuple, NULL); + if (unlikely(!__pyx_cur_scope)) { + __pyx_cur_scope = ((struct __pyx_obj_7aiohttp_12_http_parser___pyx_scope_struct_2___repr__ *)Py_None); + __Pyx_INCREF(Py_None); + __PYX_ERR(0, 233, __pyx_L1_error) + } else { + __Pyx_GOTREF(__pyx_cur_scope); + } + + /* "aiohttp/_http_parser.pyx":234 + * + * def __repr__(self): + * info = [] # <<<<<<<<<<<<<< + * info.append(("version", self.version)) + * info.append(("code", self.code)) + */ + __pyx_t_1 = PyList_New(0); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 234, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __Pyx_GIVEREF(__pyx_t_1); + __pyx_cur_scope->__pyx_v_info = ((PyObject*)__pyx_t_1); + __pyx_t_1 = 0; + + /* "aiohttp/_http_parser.pyx":235 + * def __repr__(self): + * info = [] + * info.append(("version", self.version)) # <<<<<<<<<<<<<< + * info.append(("code", self.code)) + * info.append(("reason", self.reason)) + */ + __pyx_t_1 = PyTuple_New(2); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 235, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __Pyx_INCREF(__pyx_n_u_version); + __Pyx_GIVEREF(__pyx_n_u_version); + PyTuple_SET_ITEM(__pyx_t_1, 0, __pyx_n_u_version); + __Pyx_INCREF(__pyx_v_self->version); + __Pyx_GIVEREF(__pyx_v_self->version); + PyTuple_SET_ITEM(__pyx_t_1, 1, __pyx_v_self->version); + __pyx_t_2 = __Pyx_PyList_Append(__pyx_cur_scope->__pyx_v_info, __pyx_t_1); if (unlikely(__pyx_t_2 == ((int)-1))) __PYX_ERR(0, 235, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + + /* "aiohttp/_http_parser.pyx":236 + * info = [] + * info.append(("version", self.version)) + * info.append(("code", self.code)) # <<<<<<<<<<<<<< + * info.append(("reason", self.reason)) + * info.append(("headers", self.headers)) + */ + __pyx_t_1 = __Pyx_PyInt_From_int(__pyx_v_self->code); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 236, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __pyx_t_3 = PyTuple_New(2); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 236, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_3); + __Pyx_INCREF(__pyx_n_u_code); + __Pyx_GIVEREF(__pyx_n_u_code); + PyTuple_SET_ITEM(__pyx_t_3, 0, __pyx_n_u_code); + __Pyx_GIVEREF(__pyx_t_1); + PyTuple_SET_ITEM(__pyx_t_3, 1, __pyx_t_1); + __pyx_t_1 = 0; + __pyx_t_2 = __Pyx_PyList_Append(__pyx_cur_scope->__pyx_v_info, __pyx_t_3); if (unlikely(__pyx_t_2 == ((int)-1))) __PYX_ERR(0, 236, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; + + /* "aiohttp/_http_parser.pyx":237 + * info.append(("version", self.version)) + * info.append(("code", self.code)) + * info.append(("reason", self.reason)) # <<<<<<<<<<<<<< + * info.append(("headers", self.headers)) + * info.append(("raw_headers", self.raw_headers)) + */ + __pyx_t_3 = PyTuple_New(2); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 237, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_3); + __Pyx_INCREF(__pyx_n_u_reason); + __Pyx_GIVEREF(__pyx_n_u_reason); + PyTuple_SET_ITEM(__pyx_t_3, 0, __pyx_n_u_reason); + __Pyx_INCREF(__pyx_v_self->reason); + __Pyx_GIVEREF(__pyx_v_self->reason); + PyTuple_SET_ITEM(__pyx_t_3, 1, __pyx_v_self->reason); + __pyx_t_2 = __Pyx_PyList_Append(__pyx_cur_scope->__pyx_v_info, __pyx_t_3); if (unlikely(__pyx_t_2 == ((int)-1))) __PYX_ERR(0, 237, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; + + /* "aiohttp/_http_parser.pyx":238 + * info.append(("code", self.code)) + * info.append(("reason", self.reason)) + * info.append(("headers", self.headers)) # <<<<<<<<<<<<<< + * info.append(("raw_headers", self.raw_headers)) + * info.append(("should_close", self.should_close)) + */ + __pyx_t_3 = PyTuple_New(2); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 238, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_3); + __Pyx_INCREF(__pyx_n_u_headers); + __Pyx_GIVEREF(__pyx_n_u_headers); + PyTuple_SET_ITEM(__pyx_t_3, 0, __pyx_n_u_headers); + __Pyx_INCREF(__pyx_v_self->headers); + __Pyx_GIVEREF(__pyx_v_self->headers); + PyTuple_SET_ITEM(__pyx_t_3, 1, __pyx_v_self->headers); + __pyx_t_2 = __Pyx_PyList_Append(__pyx_cur_scope->__pyx_v_info, __pyx_t_3); if (unlikely(__pyx_t_2 == ((int)-1))) __PYX_ERR(0, 238, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; + + /* "aiohttp/_http_parser.pyx":239 + * info.append(("reason", self.reason)) + * info.append(("headers", self.headers)) + * info.append(("raw_headers", self.raw_headers)) # <<<<<<<<<<<<<< + * info.append(("should_close", self.should_close)) + * info.append(("compression", self.compression)) + */ + __pyx_t_3 = PyTuple_New(2); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 239, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_3); + __Pyx_INCREF(__pyx_n_u_raw_headers); + __Pyx_GIVEREF(__pyx_n_u_raw_headers); + PyTuple_SET_ITEM(__pyx_t_3, 0, __pyx_n_u_raw_headers); + __Pyx_INCREF(__pyx_v_self->raw_headers); + __Pyx_GIVEREF(__pyx_v_self->raw_headers); + PyTuple_SET_ITEM(__pyx_t_3, 1, __pyx_v_self->raw_headers); + __pyx_t_2 = __Pyx_PyList_Append(__pyx_cur_scope->__pyx_v_info, __pyx_t_3); if (unlikely(__pyx_t_2 == ((int)-1))) __PYX_ERR(0, 239, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; + + /* "aiohttp/_http_parser.pyx":240 + * info.append(("headers", self.headers)) + * info.append(("raw_headers", self.raw_headers)) + * info.append(("should_close", self.should_close)) # <<<<<<<<<<<<<< + * info.append(("compression", self.compression)) + * info.append(("upgrade", self.upgrade)) + */ + __pyx_t_3 = PyTuple_New(2); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 240, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_3); + __Pyx_INCREF(__pyx_n_u_should_close); + __Pyx_GIVEREF(__pyx_n_u_should_close); + PyTuple_SET_ITEM(__pyx_t_3, 0, __pyx_n_u_should_close); + __Pyx_INCREF(__pyx_v_self->should_close); + __Pyx_GIVEREF(__pyx_v_self->should_close); + PyTuple_SET_ITEM(__pyx_t_3, 1, __pyx_v_self->should_close); + __pyx_t_2 = __Pyx_PyList_Append(__pyx_cur_scope->__pyx_v_info, __pyx_t_3); if (unlikely(__pyx_t_2 == ((int)-1))) __PYX_ERR(0, 240, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; + + /* "aiohttp/_http_parser.pyx":241 + * info.append(("raw_headers", self.raw_headers)) + * info.append(("should_close", self.should_close)) + * info.append(("compression", self.compression)) # <<<<<<<<<<<<<< + * info.append(("upgrade", self.upgrade)) + * info.append(("chunked", self.chunked)) + */ + __pyx_t_3 = PyTuple_New(2); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 241, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_3); + __Pyx_INCREF(__pyx_n_u_compression); + __Pyx_GIVEREF(__pyx_n_u_compression); + PyTuple_SET_ITEM(__pyx_t_3, 0, __pyx_n_u_compression); + __Pyx_INCREF(__pyx_v_self->compression); + __Pyx_GIVEREF(__pyx_v_self->compression); + PyTuple_SET_ITEM(__pyx_t_3, 1, __pyx_v_self->compression); + __pyx_t_2 = __Pyx_PyList_Append(__pyx_cur_scope->__pyx_v_info, __pyx_t_3); if (unlikely(__pyx_t_2 == ((int)-1))) __PYX_ERR(0, 241, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; + + /* "aiohttp/_http_parser.pyx":242 + * info.append(("should_close", self.should_close)) + * info.append(("compression", self.compression)) + * info.append(("upgrade", self.upgrade)) # <<<<<<<<<<<<<< + * info.append(("chunked", self.chunked)) + * sinfo = ', '.join(name + '=' + repr(val) for name, val in info) + */ + __pyx_t_3 = PyTuple_New(2); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 242, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_3); + __Pyx_INCREF(__pyx_n_u_upgrade); + __Pyx_GIVEREF(__pyx_n_u_upgrade); + PyTuple_SET_ITEM(__pyx_t_3, 0, __pyx_n_u_upgrade); + __Pyx_INCREF(__pyx_v_self->upgrade); + __Pyx_GIVEREF(__pyx_v_self->upgrade); + PyTuple_SET_ITEM(__pyx_t_3, 1, __pyx_v_self->upgrade); + __pyx_t_2 = __Pyx_PyList_Append(__pyx_cur_scope->__pyx_v_info, __pyx_t_3); if (unlikely(__pyx_t_2 == ((int)-1))) __PYX_ERR(0, 242, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; + + /* "aiohttp/_http_parser.pyx":243 + * info.append(("compression", self.compression)) + * info.append(("upgrade", self.upgrade)) + * info.append(("chunked", self.chunked)) # <<<<<<<<<<<<<< + * sinfo = ', '.join(name + '=' + repr(val) for name, val in info) + * return '' + */ + __pyx_t_3 = PyTuple_New(2); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 243, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_3); + __Pyx_INCREF(__pyx_n_u_chunked); + __Pyx_GIVEREF(__pyx_n_u_chunked); + PyTuple_SET_ITEM(__pyx_t_3, 0, __pyx_n_u_chunked); + __Pyx_INCREF(__pyx_v_self->chunked); + __Pyx_GIVEREF(__pyx_v_self->chunked); + PyTuple_SET_ITEM(__pyx_t_3, 1, __pyx_v_self->chunked); + __pyx_t_2 = __Pyx_PyList_Append(__pyx_cur_scope->__pyx_v_info, __pyx_t_3); if (unlikely(__pyx_t_2 == ((int)-1))) __PYX_ERR(0, 243, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; + + /* "aiohttp/_http_parser.pyx":244 + * info.append(("upgrade", self.upgrade)) + * info.append(("chunked", self.chunked)) + * sinfo = ', '.join(name + '=' + repr(val) for name, val in info) # <<<<<<<<<<<<<< + * return '' + * + */ + __pyx_t_3 = __pyx_pf_7aiohttp_12_http_parser_18RawResponseMessage_8__repr___genexpr(((PyObject*)__pyx_cur_scope)); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 244, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_3); + __pyx_t_1 = __Pyx_Generator_Next(__pyx_t_3); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 244, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; + __pyx_t_3 = PyUnicode_Join(__pyx_kp_u__2, __pyx_t_1); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 244, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_3); + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + __pyx_v_sinfo = ((PyObject*)__pyx_t_3); + __pyx_t_3 = 0; + + /* "aiohttp/_http_parser.pyx":245 + * info.append(("chunked", self.chunked)) + * sinfo = ', '.join(name + '=' + repr(val) for name, val in info) + * return '' # <<<<<<<<<<<<<< + * + * + */ + __Pyx_XDECREF(__pyx_r); + __pyx_t_3 = __Pyx_PyUnicode_ConcatSafe(__pyx_kp_u_RawResponseMessage, __pyx_v_sinfo); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 245, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_3); + __pyx_t_1 = __Pyx_PyUnicode_Concat(__pyx_t_3, __pyx_kp_u__3); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 245, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; + __pyx_r = __pyx_t_1; + __pyx_t_1 = 0; + goto __pyx_L0; + + /* "aiohttp/_http_parser.pyx":233 + * self.chunked = chunked + * + * def __repr__(self): # <<<<<<<<<<<<<< + * info = [] + * info.append(("version", self.version)) + */ + + /* function exit code */ + __pyx_L1_error:; + __Pyx_XDECREF(__pyx_t_1); + __Pyx_XDECREF(__pyx_t_3); + __Pyx_AddTraceback("aiohttp._http_parser.RawResponseMessage.__repr__", __pyx_clineno, __pyx_lineno, __pyx_filename); + __pyx_r = NULL; + __pyx_L0:; + __Pyx_XDECREF(__pyx_v_sinfo); + __Pyx_XDECREF(__pyx_gb_7aiohttp_12_http_parser_18RawResponseMessage_8__repr___2generator1); + __Pyx_DECREF(((PyObject *)__pyx_cur_scope)); + __Pyx_XGIVEREF(__pyx_r); + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +/* "aiohttp/_http_parser.pyx":211 + * @cython.freelist(DEFAULT_FREELIST_SIZE) + * cdef class RawResponseMessage: + * cdef readonly object version # HttpVersion # <<<<<<<<<<<<<< + * cdef readonly int code + * cdef readonly str reason + */ + +/* Python wrapper */ +static PyObject *__pyx_pw_7aiohttp_12_http_parser_18RawResponseMessage_7version_1__get__(PyObject *__pyx_v_self); /*proto*/ +static PyObject *__pyx_pw_7aiohttp_12_http_parser_18RawResponseMessage_7version_1__get__(PyObject *__pyx_v_self) { + PyObject *__pyx_r = 0; + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("__get__ (wrapper)", 0); + __pyx_r = __pyx_pf_7aiohttp_12_http_parser_18RawResponseMessage_7version___get__(((struct __pyx_obj_7aiohttp_12_http_parser_RawResponseMessage *)__pyx_v_self)); + + /* function exit code */ + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +static PyObject *__pyx_pf_7aiohttp_12_http_parser_18RawResponseMessage_7version___get__(struct __pyx_obj_7aiohttp_12_http_parser_RawResponseMessage *__pyx_v_self) { + PyObject *__pyx_r = NULL; + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("__get__", 0); + __Pyx_XDECREF(__pyx_r); + __Pyx_INCREF(__pyx_v_self->version); + __pyx_r = __pyx_v_self->version; + goto __pyx_L0; + + /* function exit code */ + __pyx_L0:; + __Pyx_XGIVEREF(__pyx_r); + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +/* "aiohttp/_http_parser.pyx":212 + * cdef class RawResponseMessage: + * cdef readonly object version # HttpVersion + * cdef readonly int code # <<<<<<<<<<<<<< + * cdef readonly str reason + * cdef readonly object headers # CIMultiDict + */ + +/* Python wrapper */ +static PyObject *__pyx_pw_7aiohttp_12_http_parser_18RawResponseMessage_4code_1__get__(PyObject *__pyx_v_self); /*proto*/ +static PyObject *__pyx_pw_7aiohttp_12_http_parser_18RawResponseMessage_4code_1__get__(PyObject *__pyx_v_self) { + PyObject *__pyx_r = 0; + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("__get__ (wrapper)", 0); + __pyx_r = __pyx_pf_7aiohttp_12_http_parser_18RawResponseMessage_4code___get__(((struct __pyx_obj_7aiohttp_12_http_parser_RawResponseMessage *)__pyx_v_self)); + + /* function exit code */ + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +static PyObject *__pyx_pf_7aiohttp_12_http_parser_18RawResponseMessage_4code___get__(struct __pyx_obj_7aiohttp_12_http_parser_RawResponseMessage *__pyx_v_self) { + PyObject *__pyx_r = NULL; + __Pyx_RefNannyDeclarations + PyObject *__pyx_t_1 = NULL; + int __pyx_lineno = 0; + const char *__pyx_filename = NULL; + int __pyx_clineno = 0; + __Pyx_RefNannySetupContext("__get__", 0); + __Pyx_XDECREF(__pyx_r); + __pyx_t_1 = __Pyx_PyInt_From_int(__pyx_v_self->code); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 212, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __pyx_r = __pyx_t_1; + __pyx_t_1 = 0; + goto __pyx_L0; + + /* function exit code */ + __pyx_L1_error:; + __Pyx_XDECREF(__pyx_t_1); + __Pyx_AddTraceback("aiohttp._http_parser.RawResponseMessage.code.__get__", __pyx_clineno, __pyx_lineno, __pyx_filename); + __pyx_r = NULL; + __pyx_L0:; + __Pyx_XGIVEREF(__pyx_r); + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +/* "aiohttp/_http_parser.pyx":213 + * cdef readonly object version # HttpVersion + * cdef readonly int code + * cdef readonly str reason # <<<<<<<<<<<<<< + * cdef readonly object headers # CIMultiDict + * cdef readonly object raw_headers # tuple + */ + +/* Python wrapper */ +static PyObject *__pyx_pw_7aiohttp_12_http_parser_18RawResponseMessage_6reason_1__get__(PyObject *__pyx_v_self); /*proto*/ +static PyObject *__pyx_pw_7aiohttp_12_http_parser_18RawResponseMessage_6reason_1__get__(PyObject *__pyx_v_self) { + PyObject *__pyx_r = 0; + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("__get__ (wrapper)", 0); + __pyx_r = __pyx_pf_7aiohttp_12_http_parser_18RawResponseMessage_6reason___get__(((struct __pyx_obj_7aiohttp_12_http_parser_RawResponseMessage *)__pyx_v_self)); + + /* function exit code */ + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +static PyObject *__pyx_pf_7aiohttp_12_http_parser_18RawResponseMessage_6reason___get__(struct __pyx_obj_7aiohttp_12_http_parser_RawResponseMessage *__pyx_v_self) { + PyObject *__pyx_r = NULL; + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("__get__", 0); + __Pyx_XDECREF(__pyx_r); + __Pyx_INCREF(__pyx_v_self->reason); + __pyx_r = __pyx_v_self->reason; + goto __pyx_L0; + + /* function exit code */ + __pyx_L0:; + __Pyx_XGIVEREF(__pyx_r); + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +/* "aiohttp/_http_parser.pyx":214 + * cdef readonly int code + * cdef readonly str reason + * cdef readonly object headers # CIMultiDict # <<<<<<<<<<<<<< + * cdef readonly object raw_headers # tuple + * cdef readonly object should_close + */ + +/* Python wrapper */ +static PyObject *__pyx_pw_7aiohttp_12_http_parser_18RawResponseMessage_7headers_1__get__(PyObject *__pyx_v_self); /*proto*/ +static PyObject *__pyx_pw_7aiohttp_12_http_parser_18RawResponseMessage_7headers_1__get__(PyObject *__pyx_v_self) { + PyObject *__pyx_r = 0; + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("__get__ (wrapper)", 0); + __pyx_r = __pyx_pf_7aiohttp_12_http_parser_18RawResponseMessage_7headers___get__(((struct __pyx_obj_7aiohttp_12_http_parser_RawResponseMessage *)__pyx_v_self)); + + /* function exit code */ + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +static PyObject *__pyx_pf_7aiohttp_12_http_parser_18RawResponseMessage_7headers___get__(struct __pyx_obj_7aiohttp_12_http_parser_RawResponseMessage *__pyx_v_self) { + PyObject *__pyx_r = NULL; + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("__get__", 0); + __Pyx_XDECREF(__pyx_r); + __Pyx_INCREF(__pyx_v_self->headers); + __pyx_r = __pyx_v_self->headers; + goto __pyx_L0; + + /* function exit code */ + __pyx_L0:; + __Pyx_XGIVEREF(__pyx_r); + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +/* "aiohttp/_http_parser.pyx":215 + * cdef readonly str reason + * cdef readonly object headers # CIMultiDict + * cdef readonly object raw_headers # tuple # <<<<<<<<<<<<<< + * cdef readonly object should_close + * cdef readonly object compression + */ + +/* Python wrapper */ +static PyObject *__pyx_pw_7aiohttp_12_http_parser_18RawResponseMessage_11raw_headers_1__get__(PyObject *__pyx_v_self); /*proto*/ +static PyObject *__pyx_pw_7aiohttp_12_http_parser_18RawResponseMessage_11raw_headers_1__get__(PyObject *__pyx_v_self) { + PyObject *__pyx_r = 0; + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("__get__ (wrapper)", 0); + __pyx_r = __pyx_pf_7aiohttp_12_http_parser_18RawResponseMessage_11raw_headers___get__(((struct __pyx_obj_7aiohttp_12_http_parser_RawResponseMessage *)__pyx_v_self)); + + /* function exit code */ + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +static PyObject *__pyx_pf_7aiohttp_12_http_parser_18RawResponseMessage_11raw_headers___get__(struct __pyx_obj_7aiohttp_12_http_parser_RawResponseMessage *__pyx_v_self) { + PyObject *__pyx_r = NULL; + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("__get__", 0); + __Pyx_XDECREF(__pyx_r); + __Pyx_INCREF(__pyx_v_self->raw_headers); + __pyx_r = __pyx_v_self->raw_headers; + goto __pyx_L0; + + /* function exit code */ + __pyx_L0:; + __Pyx_XGIVEREF(__pyx_r); + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +/* "aiohttp/_http_parser.pyx":216 + * cdef readonly object headers # CIMultiDict + * cdef readonly object raw_headers # tuple + * cdef readonly object should_close # <<<<<<<<<<<<<< + * cdef readonly object compression + * cdef readonly object upgrade + */ + +/* Python wrapper */ +static PyObject *__pyx_pw_7aiohttp_12_http_parser_18RawResponseMessage_12should_close_1__get__(PyObject *__pyx_v_self); /*proto*/ +static PyObject *__pyx_pw_7aiohttp_12_http_parser_18RawResponseMessage_12should_close_1__get__(PyObject *__pyx_v_self) { + PyObject *__pyx_r = 0; + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("__get__ (wrapper)", 0); + __pyx_r = __pyx_pf_7aiohttp_12_http_parser_18RawResponseMessage_12should_close___get__(((struct __pyx_obj_7aiohttp_12_http_parser_RawResponseMessage *)__pyx_v_self)); + + /* function exit code */ + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +static PyObject *__pyx_pf_7aiohttp_12_http_parser_18RawResponseMessage_12should_close___get__(struct __pyx_obj_7aiohttp_12_http_parser_RawResponseMessage *__pyx_v_self) { + PyObject *__pyx_r = NULL; + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("__get__", 0); + __Pyx_XDECREF(__pyx_r); + __Pyx_INCREF(__pyx_v_self->should_close); + __pyx_r = __pyx_v_self->should_close; + goto __pyx_L0; + + /* function exit code */ + __pyx_L0:; + __Pyx_XGIVEREF(__pyx_r); + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +/* "aiohttp/_http_parser.pyx":217 + * cdef readonly object raw_headers # tuple + * cdef readonly object should_close + * cdef readonly object compression # <<<<<<<<<<<<<< + * cdef readonly object upgrade + * cdef readonly object chunked + */ + +/* Python wrapper */ +static PyObject *__pyx_pw_7aiohttp_12_http_parser_18RawResponseMessage_11compression_1__get__(PyObject *__pyx_v_self); /*proto*/ +static PyObject *__pyx_pw_7aiohttp_12_http_parser_18RawResponseMessage_11compression_1__get__(PyObject *__pyx_v_self) { + PyObject *__pyx_r = 0; + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("__get__ (wrapper)", 0); + __pyx_r = __pyx_pf_7aiohttp_12_http_parser_18RawResponseMessage_11compression___get__(((struct __pyx_obj_7aiohttp_12_http_parser_RawResponseMessage *)__pyx_v_self)); + + /* function exit code */ + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +static PyObject *__pyx_pf_7aiohttp_12_http_parser_18RawResponseMessage_11compression___get__(struct __pyx_obj_7aiohttp_12_http_parser_RawResponseMessage *__pyx_v_self) { + PyObject *__pyx_r = NULL; + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("__get__", 0); + __Pyx_XDECREF(__pyx_r); + __Pyx_INCREF(__pyx_v_self->compression); + __pyx_r = __pyx_v_self->compression; + goto __pyx_L0; + + /* function exit code */ + __pyx_L0:; + __Pyx_XGIVEREF(__pyx_r); + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +/* "aiohttp/_http_parser.pyx":218 + * cdef readonly object should_close + * cdef readonly object compression + * cdef readonly object upgrade # <<<<<<<<<<<<<< + * cdef readonly object chunked + * + */ + +/* Python wrapper */ +static PyObject *__pyx_pw_7aiohttp_12_http_parser_18RawResponseMessage_7upgrade_1__get__(PyObject *__pyx_v_self); /*proto*/ +static PyObject *__pyx_pw_7aiohttp_12_http_parser_18RawResponseMessage_7upgrade_1__get__(PyObject *__pyx_v_self) { + PyObject *__pyx_r = 0; + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("__get__ (wrapper)", 0); + __pyx_r = __pyx_pf_7aiohttp_12_http_parser_18RawResponseMessage_7upgrade___get__(((struct __pyx_obj_7aiohttp_12_http_parser_RawResponseMessage *)__pyx_v_self)); + + /* function exit code */ + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +static PyObject *__pyx_pf_7aiohttp_12_http_parser_18RawResponseMessage_7upgrade___get__(struct __pyx_obj_7aiohttp_12_http_parser_RawResponseMessage *__pyx_v_self) { + PyObject *__pyx_r = NULL; + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("__get__", 0); + __Pyx_XDECREF(__pyx_r); + __Pyx_INCREF(__pyx_v_self->upgrade); + __pyx_r = __pyx_v_self->upgrade; + goto __pyx_L0; + + /* function exit code */ + __pyx_L0:; + __Pyx_XGIVEREF(__pyx_r); + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +/* "aiohttp/_http_parser.pyx":219 + * cdef readonly object compression + * cdef readonly object upgrade + * cdef readonly object chunked # <<<<<<<<<<<<<< + * + * def __init__(self, version, code, reason, headers, raw_headers, + */ + +/* Python wrapper */ +static PyObject *__pyx_pw_7aiohttp_12_http_parser_18RawResponseMessage_7chunked_1__get__(PyObject *__pyx_v_self); /*proto*/ +static PyObject *__pyx_pw_7aiohttp_12_http_parser_18RawResponseMessage_7chunked_1__get__(PyObject *__pyx_v_self) { + PyObject *__pyx_r = 0; + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("__get__ (wrapper)", 0); + __pyx_r = __pyx_pf_7aiohttp_12_http_parser_18RawResponseMessage_7chunked___get__(((struct __pyx_obj_7aiohttp_12_http_parser_RawResponseMessage *)__pyx_v_self)); + + /* function exit code */ + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +static PyObject *__pyx_pf_7aiohttp_12_http_parser_18RawResponseMessage_7chunked___get__(struct __pyx_obj_7aiohttp_12_http_parser_RawResponseMessage *__pyx_v_self) { + PyObject *__pyx_r = NULL; + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("__get__", 0); + __Pyx_XDECREF(__pyx_r); + __Pyx_INCREF(__pyx_v_self->chunked); + __pyx_r = __pyx_v_self->chunked; + goto __pyx_L0; + + /* function exit code */ + __pyx_L0:; + __Pyx_XGIVEREF(__pyx_r); + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +/* "(tree fragment)":1 + * def __reduce_cython__(self): # <<<<<<<<<<<<<< + * cdef tuple state + * cdef object _dict + */ + +/* Python wrapper */ +static PyObject *__pyx_pw_7aiohttp_12_http_parser_18RawResponseMessage_5__reduce_cython__(PyObject *__pyx_v_self, CYTHON_UNUSED PyObject *unused); /*proto*/ +static PyObject *__pyx_pw_7aiohttp_12_http_parser_18RawResponseMessage_5__reduce_cython__(PyObject *__pyx_v_self, CYTHON_UNUSED PyObject *unused) { + PyObject *__pyx_r = 0; + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("__reduce_cython__ (wrapper)", 0); + __pyx_r = __pyx_pf_7aiohttp_12_http_parser_18RawResponseMessage_4__reduce_cython__(((struct __pyx_obj_7aiohttp_12_http_parser_RawResponseMessage *)__pyx_v_self)); + + /* function exit code */ + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +static PyObject *__pyx_pf_7aiohttp_12_http_parser_18RawResponseMessage_4__reduce_cython__(struct __pyx_obj_7aiohttp_12_http_parser_RawResponseMessage *__pyx_v_self) { + PyObject *__pyx_v_state = 0; + PyObject *__pyx_v__dict = 0; + int __pyx_v_use_setstate; + PyObject *__pyx_r = NULL; + __Pyx_RefNannyDeclarations + PyObject *__pyx_t_1 = NULL; + PyObject *__pyx_t_2 = NULL; + int __pyx_t_3; + int __pyx_t_4; + int __pyx_t_5; + PyObject *__pyx_t_6 = NULL; + int __pyx_lineno = 0; + const char *__pyx_filename = NULL; + int __pyx_clineno = 0; + __Pyx_RefNannySetupContext("__reduce_cython__", 0); + + /* "(tree fragment)":5 + * cdef object _dict + * cdef bint use_setstate + * state = (self.chunked, self.code, self.compression, self.headers, self.raw_headers, self.reason, self.should_close, self.upgrade, self.version) # <<<<<<<<<<<<<< + * _dict = getattr(self, '__dict__', None) + * if _dict is not None: + */ + __pyx_t_1 = __Pyx_PyInt_From_int(__pyx_v_self->code); if (unlikely(!__pyx_t_1)) __PYX_ERR(1, 5, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __pyx_t_2 = PyTuple_New(9); if (unlikely(!__pyx_t_2)) __PYX_ERR(1, 5, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_2); + __Pyx_INCREF(__pyx_v_self->chunked); + __Pyx_GIVEREF(__pyx_v_self->chunked); + PyTuple_SET_ITEM(__pyx_t_2, 0, __pyx_v_self->chunked); + __Pyx_GIVEREF(__pyx_t_1); + PyTuple_SET_ITEM(__pyx_t_2, 1, __pyx_t_1); + __Pyx_INCREF(__pyx_v_self->compression); + __Pyx_GIVEREF(__pyx_v_self->compression); + PyTuple_SET_ITEM(__pyx_t_2, 2, __pyx_v_self->compression); + __Pyx_INCREF(__pyx_v_self->headers); + __Pyx_GIVEREF(__pyx_v_self->headers); + PyTuple_SET_ITEM(__pyx_t_2, 3, __pyx_v_self->headers); + __Pyx_INCREF(__pyx_v_self->raw_headers); + __Pyx_GIVEREF(__pyx_v_self->raw_headers); + PyTuple_SET_ITEM(__pyx_t_2, 4, __pyx_v_self->raw_headers); + __Pyx_INCREF(__pyx_v_self->reason); + __Pyx_GIVEREF(__pyx_v_self->reason); + PyTuple_SET_ITEM(__pyx_t_2, 5, __pyx_v_self->reason); + __Pyx_INCREF(__pyx_v_self->should_close); + __Pyx_GIVEREF(__pyx_v_self->should_close); + PyTuple_SET_ITEM(__pyx_t_2, 6, __pyx_v_self->should_close); + __Pyx_INCREF(__pyx_v_self->upgrade); + __Pyx_GIVEREF(__pyx_v_self->upgrade); + PyTuple_SET_ITEM(__pyx_t_2, 7, __pyx_v_self->upgrade); + __Pyx_INCREF(__pyx_v_self->version); + __Pyx_GIVEREF(__pyx_v_self->version); + PyTuple_SET_ITEM(__pyx_t_2, 8, __pyx_v_self->version); + __pyx_t_1 = 0; + __pyx_v_state = ((PyObject*)__pyx_t_2); + __pyx_t_2 = 0; + + /* "(tree fragment)":6 + * cdef bint use_setstate + * state = (self.chunked, self.code, self.compression, self.headers, self.raw_headers, self.reason, self.should_close, self.upgrade, self.version) + * _dict = getattr(self, '__dict__', None) # <<<<<<<<<<<<<< + * if _dict is not None: + * state += (_dict,) + */ + __pyx_t_2 = __Pyx_GetAttr3(((PyObject *)__pyx_v_self), __pyx_n_s_dict, Py_None); if (unlikely(!__pyx_t_2)) __PYX_ERR(1, 6, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_2); + __pyx_v__dict = __pyx_t_2; + __pyx_t_2 = 0; + + /* "(tree fragment)":7 + * state = (self.chunked, self.code, self.compression, self.headers, self.raw_headers, self.reason, self.should_close, self.upgrade, self.version) + * _dict = getattr(self, '__dict__', None) + * if _dict is not None: # <<<<<<<<<<<<<< + * state += (_dict,) + * use_setstate = True + */ + __pyx_t_3 = (__pyx_v__dict != Py_None); + __pyx_t_4 = (__pyx_t_3 != 0); + if (__pyx_t_4) { + + /* "(tree fragment)":8 + * _dict = getattr(self, '__dict__', None) + * if _dict is not None: + * state += (_dict,) # <<<<<<<<<<<<<< + * use_setstate = True + * else: + */ + __pyx_t_2 = PyTuple_New(1); if (unlikely(!__pyx_t_2)) __PYX_ERR(1, 8, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_2); + __Pyx_INCREF(__pyx_v__dict); + __Pyx_GIVEREF(__pyx_v__dict); + PyTuple_SET_ITEM(__pyx_t_2, 0, __pyx_v__dict); + __pyx_t_1 = PyNumber_InPlaceAdd(__pyx_v_state, __pyx_t_2); if (unlikely(!__pyx_t_1)) __PYX_ERR(1, 8, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; + __Pyx_DECREF_SET(__pyx_v_state, ((PyObject*)__pyx_t_1)); + __pyx_t_1 = 0; + + /* "(tree fragment)":9 + * if _dict is not None: + * state += (_dict,) + * use_setstate = True # <<<<<<<<<<<<<< + * else: + * use_setstate = self.chunked is not None or self.compression is not None or self.headers is not None or self.raw_headers is not None or self.reason is not None or self.should_close is not None or self.upgrade is not None or self.version is not None + */ + __pyx_v_use_setstate = 1; + + /* "(tree fragment)":7 + * state = (self.chunked, self.code, self.compression, self.headers, self.raw_headers, self.reason, self.should_close, self.upgrade, self.version) + * _dict = getattr(self, '__dict__', None) + * if _dict is not None: # <<<<<<<<<<<<<< + * state += (_dict,) + * use_setstate = True + */ + goto __pyx_L3; + } + + /* "(tree fragment)":11 + * use_setstate = True + * else: + * use_setstate = self.chunked is not None or self.compression is not None or self.headers is not None or self.raw_headers is not None or self.reason is not None or self.should_close is not None or self.upgrade is not None or self.version is not None # <<<<<<<<<<<<<< + * if use_setstate: + * return __pyx_unpickle_RawResponseMessage, (type(self), 0xc7706dc, None), state + */ + /*else*/ { + __pyx_t_3 = (__pyx_v_self->chunked != Py_None); + __pyx_t_5 = (__pyx_t_3 != 0); + if (!__pyx_t_5) { + } else { + __pyx_t_4 = __pyx_t_5; + goto __pyx_L4_bool_binop_done; + } + __pyx_t_5 = (__pyx_v_self->compression != Py_None); + __pyx_t_3 = (__pyx_t_5 != 0); + if (!__pyx_t_3) { + } else { + __pyx_t_4 = __pyx_t_3; + goto __pyx_L4_bool_binop_done; + } + __pyx_t_3 = (__pyx_v_self->headers != Py_None); + __pyx_t_5 = (__pyx_t_3 != 0); + if (!__pyx_t_5) { + } else { + __pyx_t_4 = __pyx_t_5; + goto __pyx_L4_bool_binop_done; + } + __pyx_t_5 = (__pyx_v_self->raw_headers != Py_None); + __pyx_t_3 = (__pyx_t_5 != 0); + if (!__pyx_t_3) { + } else { + __pyx_t_4 = __pyx_t_3; + goto __pyx_L4_bool_binop_done; + } + __pyx_t_3 = (__pyx_v_self->reason != ((PyObject*)Py_None)); + __pyx_t_5 = (__pyx_t_3 != 0); + if (!__pyx_t_5) { + } else { + __pyx_t_4 = __pyx_t_5; + goto __pyx_L4_bool_binop_done; + } + __pyx_t_5 = (__pyx_v_self->should_close != Py_None); + __pyx_t_3 = (__pyx_t_5 != 0); + if (!__pyx_t_3) { + } else { + __pyx_t_4 = __pyx_t_3; + goto __pyx_L4_bool_binop_done; + } + __pyx_t_3 = (__pyx_v_self->upgrade != Py_None); + __pyx_t_5 = (__pyx_t_3 != 0); + if (!__pyx_t_5) { + } else { + __pyx_t_4 = __pyx_t_5; + goto __pyx_L4_bool_binop_done; + } + __pyx_t_5 = (__pyx_v_self->version != Py_None); + __pyx_t_3 = (__pyx_t_5 != 0); + __pyx_t_4 = __pyx_t_3; + __pyx_L4_bool_binop_done:; + __pyx_v_use_setstate = __pyx_t_4; + } + __pyx_L3:; + + /* "(tree fragment)":12 + * else: + * use_setstate = self.chunked is not None or self.compression is not None or self.headers is not None or self.raw_headers is not None or self.reason is not None or self.should_close is not None or self.upgrade is not None or self.version is not None + * if use_setstate: # <<<<<<<<<<<<<< + * return __pyx_unpickle_RawResponseMessage, (type(self), 0xc7706dc, None), state + * else: + */ + __pyx_t_4 = (__pyx_v_use_setstate != 0); + if (__pyx_t_4) { + + /* "(tree fragment)":13 + * use_setstate = self.chunked is not None or self.compression is not None or self.headers is not None or self.raw_headers is not None or self.reason is not None or self.should_close is not None or self.upgrade is not None or self.version is not None + * if use_setstate: + * return __pyx_unpickle_RawResponseMessage, (type(self), 0xc7706dc, None), state # <<<<<<<<<<<<<< + * else: + * return __pyx_unpickle_RawResponseMessage, (type(self), 0xc7706dc, state) + */ + __Pyx_XDECREF(__pyx_r); + __Pyx_GetModuleGlobalName(__pyx_t_1, __pyx_n_s_pyx_unpickle_RawResponseMessag); if (unlikely(!__pyx_t_1)) __PYX_ERR(1, 13, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __pyx_t_2 = PyTuple_New(3); if (unlikely(!__pyx_t_2)) __PYX_ERR(1, 13, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_2); + __Pyx_INCREF(((PyObject *)Py_TYPE(((PyObject *)__pyx_v_self)))); + __Pyx_GIVEREF(((PyObject *)Py_TYPE(((PyObject *)__pyx_v_self)))); + PyTuple_SET_ITEM(__pyx_t_2, 0, ((PyObject *)Py_TYPE(((PyObject *)__pyx_v_self)))); + __Pyx_INCREF(__pyx_int_209127132); + __Pyx_GIVEREF(__pyx_int_209127132); + PyTuple_SET_ITEM(__pyx_t_2, 1, __pyx_int_209127132); + __Pyx_INCREF(Py_None); + __Pyx_GIVEREF(Py_None); + PyTuple_SET_ITEM(__pyx_t_2, 2, Py_None); + __pyx_t_6 = PyTuple_New(3); if (unlikely(!__pyx_t_6)) __PYX_ERR(1, 13, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_6); + __Pyx_GIVEREF(__pyx_t_1); + PyTuple_SET_ITEM(__pyx_t_6, 0, __pyx_t_1); + __Pyx_GIVEREF(__pyx_t_2); + PyTuple_SET_ITEM(__pyx_t_6, 1, __pyx_t_2); + __Pyx_INCREF(__pyx_v_state); + __Pyx_GIVEREF(__pyx_v_state); + PyTuple_SET_ITEM(__pyx_t_6, 2, __pyx_v_state); + __pyx_t_1 = 0; + __pyx_t_2 = 0; + __pyx_r = __pyx_t_6; + __pyx_t_6 = 0; + goto __pyx_L0; + + /* "(tree fragment)":12 + * else: + * use_setstate = self.chunked is not None or self.compression is not None or self.headers is not None or self.raw_headers is not None or self.reason is not None or self.should_close is not None or self.upgrade is not None or self.version is not None + * if use_setstate: # <<<<<<<<<<<<<< + * return __pyx_unpickle_RawResponseMessage, (type(self), 0xc7706dc, None), state + * else: + */ + } + + /* "(tree fragment)":15 + * return __pyx_unpickle_RawResponseMessage, (type(self), 0xc7706dc, None), state + * else: + * return __pyx_unpickle_RawResponseMessage, (type(self), 0xc7706dc, state) # <<<<<<<<<<<<<< + * def __setstate_cython__(self, __pyx_state): + * __pyx_unpickle_RawResponseMessage__set_state(self, __pyx_state) + */ + /*else*/ { + __Pyx_XDECREF(__pyx_r); + __Pyx_GetModuleGlobalName(__pyx_t_6, __pyx_n_s_pyx_unpickle_RawResponseMessag); if (unlikely(!__pyx_t_6)) __PYX_ERR(1, 15, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_6); + __pyx_t_2 = PyTuple_New(3); if (unlikely(!__pyx_t_2)) __PYX_ERR(1, 15, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_2); + __Pyx_INCREF(((PyObject *)Py_TYPE(((PyObject *)__pyx_v_self)))); + __Pyx_GIVEREF(((PyObject *)Py_TYPE(((PyObject *)__pyx_v_self)))); + PyTuple_SET_ITEM(__pyx_t_2, 0, ((PyObject *)Py_TYPE(((PyObject *)__pyx_v_self)))); + __Pyx_INCREF(__pyx_int_209127132); + __Pyx_GIVEREF(__pyx_int_209127132); + PyTuple_SET_ITEM(__pyx_t_2, 1, __pyx_int_209127132); + __Pyx_INCREF(__pyx_v_state); + __Pyx_GIVEREF(__pyx_v_state); + PyTuple_SET_ITEM(__pyx_t_2, 2, __pyx_v_state); + __pyx_t_1 = PyTuple_New(2); if (unlikely(!__pyx_t_1)) __PYX_ERR(1, 15, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __Pyx_GIVEREF(__pyx_t_6); + PyTuple_SET_ITEM(__pyx_t_1, 0, __pyx_t_6); + __Pyx_GIVEREF(__pyx_t_2); + PyTuple_SET_ITEM(__pyx_t_1, 1, __pyx_t_2); + __pyx_t_6 = 0; + __pyx_t_2 = 0; + __pyx_r = __pyx_t_1; + __pyx_t_1 = 0; + goto __pyx_L0; + } + + /* "(tree fragment)":1 + * def __reduce_cython__(self): # <<<<<<<<<<<<<< + * cdef tuple state + * cdef object _dict + */ + + /* function exit code */ + __pyx_L1_error:; + __Pyx_XDECREF(__pyx_t_1); + __Pyx_XDECREF(__pyx_t_2); + __Pyx_XDECREF(__pyx_t_6); + __Pyx_AddTraceback("aiohttp._http_parser.RawResponseMessage.__reduce_cython__", __pyx_clineno, __pyx_lineno, __pyx_filename); + __pyx_r = NULL; + __pyx_L0:; + __Pyx_XDECREF(__pyx_v_state); + __Pyx_XDECREF(__pyx_v__dict); + __Pyx_XGIVEREF(__pyx_r); + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +/* "(tree fragment)":16 + * else: + * return __pyx_unpickle_RawResponseMessage, (type(self), 0xc7706dc, state) + * def __setstate_cython__(self, __pyx_state): # <<<<<<<<<<<<<< + * __pyx_unpickle_RawResponseMessage__set_state(self, __pyx_state) + */ + +/* Python wrapper */ +static PyObject *__pyx_pw_7aiohttp_12_http_parser_18RawResponseMessage_7__setstate_cython__(PyObject *__pyx_v_self, PyObject *__pyx_v___pyx_state); /*proto*/ +static PyObject *__pyx_pw_7aiohttp_12_http_parser_18RawResponseMessage_7__setstate_cython__(PyObject *__pyx_v_self, PyObject *__pyx_v___pyx_state) { + PyObject *__pyx_r = 0; + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("__setstate_cython__ (wrapper)", 0); + __pyx_r = __pyx_pf_7aiohttp_12_http_parser_18RawResponseMessage_6__setstate_cython__(((struct __pyx_obj_7aiohttp_12_http_parser_RawResponseMessage *)__pyx_v_self), ((PyObject *)__pyx_v___pyx_state)); + + /* function exit code */ + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +static PyObject *__pyx_pf_7aiohttp_12_http_parser_18RawResponseMessage_6__setstate_cython__(struct __pyx_obj_7aiohttp_12_http_parser_RawResponseMessage *__pyx_v_self, PyObject *__pyx_v___pyx_state) { + PyObject *__pyx_r = NULL; + __Pyx_RefNannyDeclarations + PyObject *__pyx_t_1 = NULL; + int __pyx_lineno = 0; + const char *__pyx_filename = NULL; + int __pyx_clineno = 0; + __Pyx_RefNannySetupContext("__setstate_cython__", 0); + + /* "(tree fragment)":17 + * return __pyx_unpickle_RawResponseMessage, (type(self), 0xc7706dc, state) + * def __setstate_cython__(self, __pyx_state): + * __pyx_unpickle_RawResponseMessage__set_state(self, __pyx_state) # <<<<<<<<<<<<<< + */ + if (!(likely(PyTuple_CheckExact(__pyx_v___pyx_state))||((__pyx_v___pyx_state) == Py_None)||(PyErr_Format(PyExc_TypeError, "Expected %.16s, got %.200s", "tuple", Py_TYPE(__pyx_v___pyx_state)->tp_name), 0))) __PYX_ERR(1, 17, __pyx_L1_error) + __pyx_t_1 = __pyx_f_7aiohttp_12_http_parser___pyx_unpickle_RawResponseMessage__set_state(__pyx_v_self, ((PyObject*)__pyx_v___pyx_state)); if (unlikely(!__pyx_t_1)) __PYX_ERR(1, 17, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + + /* "(tree fragment)":16 + * else: + * return __pyx_unpickle_RawResponseMessage, (type(self), 0xc7706dc, state) + * def __setstate_cython__(self, __pyx_state): # <<<<<<<<<<<<<< + * __pyx_unpickle_RawResponseMessage__set_state(self, __pyx_state) + */ + + /* function exit code */ + __pyx_r = Py_None; __Pyx_INCREF(Py_None); + goto __pyx_L0; + __pyx_L1_error:; + __Pyx_XDECREF(__pyx_t_1); + __Pyx_AddTraceback("aiohttp._http_parser.RawResponseMessage.__setstate_cython__", __pyx_clineno, __pyx_lineno, __pyx_filename); + __pyx_r = NULL; + __pyx_L0:; + __Pyx_XGIVEREF(__pyx_r); + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +/* "aiohttp/_http_parser.pyx":248 + * + * + * cdef _new_response_message(object version, # <<<<<<<<<<<<<< + * int code, + * str reason, + */ + +static PyObject *__pyx_f_7aiohttp_12_http_parser__new_response_message(PyObject *__pyx_v_version, int __pyx_v_code, PyObject *__pyx_v_reason, PyObject *__pyx_v_headers, PyObject *__pyx_v_raw_headers, int __pyx_v_should_close, PyObject *__pyx_v_compression, int __pyx_v_upgrade, int __pyx_v_chunked) { + struct __pyx_obj_7aiohttp_12_http_parser_RawResponseMessage *__pyx_v_ret = 0; + PyObject *__pyx_r = NULL; + __Pyx_RefNannyDeclarations + PyObject *__pyx_t_1 = NULL; + int __pyx_lineno = 0; + const char *__pyx_filename = NULL; + int __pyx_clineno = 0; + __Pyx_RefNannySetupContext("_new_response_message", 0); + + /* "aiohttp/_http_parser.pyx":258 + * bint chunked): + * cdef RawResponseMessage ret + * ret = RawResponseMessage.__new__(RawResponseMessage) # <<<<<<<<<<<<<< + * ret.version = version + * ret.code = code + */ + __pyx_t_1 = ((PyObject *)__pyx_tp_new_7aiohttp_12_http_parser_RawResponseMessage(((PyTypeObject *)__pyx_ptype_7aiohttp_12_http_parser_RawResponseMessage), __pyx_empty_tuple, NULL)); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 258, __pyx_L1_error) + __Pyx_GOTREF(((PyObject *)__pyx_t_1)); + __pyx_v_ret = ((struct __pyx_obj_7aiohttp_12_http_parser_RawResponseMessage *)__pyx_t_1); + __pyx_t_1 = 0; + + /* "aiohttp/_http_parser.pyx":259 + * cdef RawResponseMessage ret + * ret = RawResponseMessage.__new__(RawResponseMessage) + * ret.version = version # <<<<<<<<<<<<<< + * ret.code = code + * ret.reason = reason + */ + __Pyx_INCREF(__pyx_v_version); + __Pyx_GIVEREF(__pyx_v_version); + __Pyx_GOTREF(__pyx_v_ret->version); + __Pyx_DECREF(__pyx_v_ret->version); + __pyx_v_ret->version = __pyx_v_version; + + /* "aiohttp/_http_parser.pyx":260 + * ret = RawResponseMessage.__new__(RawResponseMessage) + * ret.version = version + * ret.code = code # <<<<<<<<<<<<<< + * ret.reason = reason + * ret.headers = headers + */ + __pyx_v_ret->code = __pyx_v_code; + + /* "aiohttp/_http_parser.pyx":261 + * ret.version = version + * ret.code = code + * ret.reason = reason # <<<<<<<<<<<<<< + * ret.headers = headers + * ret.raw_headers = raw_headers + */ + __Pyx_INCREF(__pyx_v_reason); + __Pyx_GIVEREF(__pyx_v_reason); + __Pyx_GOTREF(__pyx_v_ret->reason); + __Pyx_DECREF(__pyx_v_ret->reason); + __pyx_v_ret->reason = __pyx_v_reason; + + /* "aiohttp/_http_parser.pyx":262 + * ret.code = code + * ret.reason = reason + * ret.headers = headers # <<<<<<<<<<<<<< + * ret.raw_headers = raw_headers + * ret.should_close = should_close + */ + __Pyx_INCREF(__pyx_v_headers); + __Pyx_GIVEREF(__pyx_v_headers); + __Pyx_GOTREF(__pyx_v_ret->headers); + __Pyx_DECREF(__pyx_v_ret->headers); + __pyx_v_ret->headers = __pyx_v_headers; + + /* "aiohttp/_http_parser.pyx":263 + * ret.reason = reason + * ret.headers = headers + * ret.raw_headers = raw_headers # <<<<<<<<<<<<<< + * ret.should_close = should_close + * ret.compression = compression + */ + __Pyx_INCREF(__pyx_v_raw_headers); + __Pyx_GIVEREF(__pyx_v_raw_headers); + __Pyx_GOTREF(__pyx_v_ret->raw_headers); + __Pyx_DECREF(__pyx_v_ret->raw_headers); + __pyx_v_ret->raw_headers = __pyx_v_raw_headers; + + /* "aiohttp/_http_parser.pyx":264 + * ret.headers = headers + * ret.raw_headers = raw_headers + * ret.should_close = should_close # <<<<<<<<<<<<<< + * ret.compression = compression + * ret.upgrade = upgrade + */ + __pyx_t_1 = __Pyx_PyBool_FromLong(__pyx_v_should_close); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 264, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __Pyx_GIVEREF(__pyx_t_1); + __Pyx_GOTREF(__pyx_v_ret->should_close); + __Pyx_DECREF(__pyx_v_ret->should_close); + __pyx_v_ret->should_close = __pyx_t_1; + __pyx_t_1 = 0; + + /* "aiohttp/_http_parser.pyx":265 + * ret.raw_headers = raw_headers + * ret.should_close = should_close + * ret.compression = compression # <<<<<<<<<<<<<< + * ret.upgrade = upgrade + * ret.chunked = chunked + */ + __Pyx_INCREF(__pyx_v_compression); + __Pyx_GIVEREF(__pyx_v_compression); + __Pyx_GOTREF(__pyx_v_ret->compression); + __Pyx_DECREF(__pyx_v_ret->compression); + __pyx_v_ret->compression = __pyx_v_compression; + + /* "aiohttp/_http_parser.pyx":266 + * ret.should_close = should_close + * ret.compression = compression + * ret.upgrade = upgrade # <<<<<<<<<<<<<< + * ret.chunked = chunked + * return ret + */ + __pyx_t_1 = __Pyx_PyBool_FromLong(__pyx_v_upgrade); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 266, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __Pyx_GIVEREF(__pyx_t_1); + __Pyx_GOTREF(__pyx_v_ret->upgrade); + __Pyx_DECREF(__pyx_v_ret->upgrade); + __pyx_v_ret->upgrade = __pyx_t_1; + __pyx_t_1 = 0; + + /* "aiohttp/_http_parser.pyx":267 + * ret.compression = compression + * ret.upgrade = upgrade + * ret.chunked = chunked # <<<<<<<<<<<<<< + * return ret + * + */ + __pyx_t_1 = __Pyx_PyBool_FromLong(__pyx_v_chunked); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 267, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __Pyx_GIVEREF(__pyx_t_1); + __Pyx_GOTREF(__pyx_v_ret->chunked); + __Pyx_DECREF(__pyx_v_ret->chunked); + __pyx_v_ret->chunked = __pyx_t_1; + __pyx_t_1 = 0; + + /* "aiohttp/_http_parser.pyx":268 + * ret.upgrade = upgrade + * ret.chunked = chunked + * return ret # <<<<<<<<<<<<<< + * + * + */ + __Pyx_XDECREF(__pyx_r); + __Pyx_INCREF(((PyObject *)__pyx_v_ret)); + __pyx_r = ((PyObject *)__pyx_v_ret); + goto __pyx_L0; + + /* "aiohttp/_http_parser.pyx":248 + * + * + * cdef _new_response_message(object version, # <<<<<<<<<<<<<< + * int code, + * str reason, + */ + + /* function exit code */ + __pyx_L1_error:; + __Pyx_XDECREF(__pyx_t_1); + __Pyx_AddTraceback("aiohttp._http_parser._new_response_message", __pyx_clineno, __pyx_lineno, __pyx_filename); + __pyx_r = 0; + __pyx_L0:; + __Pyx_XDECREF((PyObject *)__pyx_v_ret); + __Pyx_XGIVEREF(__pyx_r); + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +/* "aiohttp/_http_parser.pyx":312 + * Py_buffer py_buf + * + * def __cinit__(self): # <<<<<<<<<<<<<< + * self._cparser = \ + * PyMem_Malloc(sizeof(cparser.llhttp_t)) + */ + +/* Python wrapper */ +static int __pyx_pw_7aiohttp_12_http_parser_10HttpParser_1__cinit__(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/ +static int __pyx_pw_7aiohttp_12_http_parser_10HttpParser_1__cinit__(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds) { + int __pyx_r; + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("__cinit__ (wrapper)", 0); + if (unlikely(PyTuple_GET_SIZE(__pyx_args) > 0)) { + __Pyx_RaiseArgtupleInvalid("__cinit__", 1, 0, 0, PyTuple_GET_SIZE(__pyx_args)); return -1;} + if (unlikely(__pyx_kwds) && unlikely(PyDict_Size(__pyx_kwds) > 0) && unlikely(!__Pyx_CheckKeywordStrings(__pyx_kwds, "__cinit__", 0))) return -1; + __pyx_r = __pyx_pf_7aiohttp_12_http_parser_10HttpParser___cinit__(((struct __pyx_obj_7aiohttp_12_http_parser_HttpParser *)__pyx_v_self)); + + /* function exit code */ + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +static int __pyx_pf_7aiohttp_12_http_parser_10HttpParser___cinit__(struct __pyx_obj_7aiohttp_12_http_parser_HttpParser *__pyx_v_self) { + int __pyx_r; + __Pyx_RefNannyDeclarations + int __pyx_t_1; + int __pyx_lineno = 0; + const char *__pyx_filename = NULL; + int __pyx_clineno = 0; + __Pyx_RefNannySetupContext("__cinit__", 0); + + /* "aiohttp/_http_parser.pyx":313 + * + * def __cinit__(self): + * self._cparser = \ # <<<<<<<<<<<<<< + * PyMem_Malloc(sizeof(cparser.llhttp_t)) + * if self._cparser is NULL: + */ + __pyx_v_self->_cparser = ((llhttp_t *)PyMem_Malloc((sizeof(llhttp_t)))); + + /* "aiohttp/_http_parser.pyx":315 + * self._cparser = \ + * PyMem_Malloc(sizeof(cparser.llhttp_t)) + * if self._cparser is NULL: # <<<<<<<<<<<<<< + * raise MemoryError() + * + */ + __pyx_t_1 = ((__pyx_v_self->_cparser == NULL) != 0); + if (unlikely(__pyx_t_1)) { + + /* "aiohttp/_http_parser.pyx":316 + * PyMem_Malloc(sizeof(cparser.llhttp_t)) + * if self._cparser is NULL: + * raise MemoryError() # <<<<<<<<<<<<<< + * + * self._csettings = \ + */ + PyErr_NoMemory(); __PYX_ERR(0, 316, __pyx_L1_error) + + /* "aiohttp/_http_parser.pyx":315 + * self._cparser = \ + * PyMem_Malloc(sizeof(cparser.llhttp_t)) + * if self._cparser is NULL: # <<<<<<<<<<<<<< + * raise MemoryError() + * + */ + } + + /* "aiohttp/_http_parser.pyx":318 + * raise MemoryError() + * + * self._csettings = \ # <<<<<<<<<<<<<< + * PyMem_Malloc(sizeof(cparser.llhttp_settings_t)) + * if self._csettings is NULL: + */ + __pyx_v_self->_csettings = ((llhttp_settings_t *)PyMem_Malloc((sizeof(llhttp_settings_t)))); + + /* "aiohttp/_http_parser.pyx":320 + * self._csettings = \ + * PyMem_Malloc(sizeof(cparser.llhttp_settings_t)) + * if self._csettings is NULL: # <<<<<<<<<<<<<< + * raise MemoryError() + * + */ + __pyx_t_1 = ((__pyx_v_self->_csettings == NULL) != 0); + if (unlikely(__pyx_t_1)) { + + /* "aiohttp/_http_parser.pyx":321 + * PyMem_Malloc(sizeof(cparser.llhttp_settings_t)) + * if self._csettings is NULL: + * raise MemoryError() # <<<<<<<<<<<<<< + * + * def __dealloc__(self): + */ + PyErr_NoMemory(); __PYX_ERR(0, 321, __pyx_L1_error) + + /* "aiohttp/_http_parser.pyx":320 + * self._csettings = \ + * PyMem_Malloc(sizeof(cparser.llhttp_settings_t)) + * if self._csettings is NULL: # <<<<<<<<<<<<<< + * raise MemoryError() + * + */ + } + + /* "aiohttp/_http_parser.pyx":312 + * Py_buffer py_buf + * + * def __cinit__(self): # <<<<<<<<<<<<<< + * self._cparser = \ + * PyMem_Malloc(sizeof(cparser.llhttp_t)) + */ + + /* function exit code */ + __pyx_r = 0; + goto __pyx_L0; + __pyx_L1_error:; + __Pyx_AddTraceback("aiohttp._http_parser.HttpParser.__cinit__", __pyx_clineno, __pyx_lineno, __pyx_filename); + __pyx_r = -1; + __pyx_L0:; + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +/* "aiohttp/_http_parser.pyx":323 + * raise MemoryError() + * + * def __dealloc__(self): # <<<<<<<<<<<<<< + * PyMem_Free(self._cparser) + * PyMem_Free(self._csettings) + */ + +/* Python wrapper */ +static void __pyx_pw_7aiohttp_12_http_parser_10HttpParser_3__dealloc__(PyObject *__pyx_v_self); /*proto*/ +static void __pyx_pw_7aiohttp_12_http_parser_10HttpParser_3__dealloc__(PyObject *__pyx_v_self) { + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("__dealloc__ (wrapper)", 0); + __pyx_pf_7aiohttp_12_http_parser_10HttpParser_2__dealloc__(((struct __pyx_obj_7aiohttp_12_http_parser_HttpParser *)__pyx_v_self)); + + /* function exit code */ + __Pyx_RefNannyFinishContext(); +} + +static void __pyx_pf_7aiohttp_12_http_parser_10HttpParser_2__dealloc__(struct __pyx_obj_7aiohttp_12_http_parser_HttpParser *__pyx_v_self) { + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("__dealloc__", 0); + + /* "aiohttp/_http_parser.pyx":324 + * + * def __dealloc__(self): + * PyMem_Free(self._cparser) # <<<<<<<<<<<<<< + * PyMem_Free(self._csettings) + * + */ + PyMem_Free(__pyx_v_self->_cparser); + + /* "aiohttp/_http_parser.pyx":325 + * def __dealloc__(self): + * PyMem_Free(self._cparser) + * PyMem_Free(self._csettings) # <<<<<<<<<<<<<< + * + * cdef _init( + */ + PyMem_Free(__pyx_v_self->_csettings); + + /* "aiohttp/_http_parser.pyx":323 + * raise MemoryError() + * + * def __dealloc__(self): # <<<<<<<<<<<<<< + * PyMem_Free(self._cparser) + * PyMem_Free(self._csettings) + */ + + /* function exit code */ + __Pyx_RefNannyFinishContext(); +} + +/* "aiohttp/_http_parser.pyx":327 + * PyMem_Free(self._csettings) + * + * cdef _init( # <<<<<<<<<<<<<< + * self, cparser.llhttp_type mode, + * object protocol, object loop, int limit, + */ + +static PyObject *__pyx_f_7aiohttp_12_http_parser_10HttpParser__init(struct __pyx_obj_7aiohttp_12_http_parser_HttpParser *__pyx_v_self, enum llhttp_type __pyx_v_mode, PyObject *__pyx_v_protocol, PyObject *__pyx_v_loop, int __pyx_v_limit, struct __pyx_opt_args_7aiohttp_12_http_parser_10HttpParser__init *__pyx_optional_args) { + + /* "aiohttp/_http_parser.pyx":330 + * self, cparser.llhttp_type mode, + * object protocol, object loop, int limit, + * object timer=None, # <<<<<<<<<<<<<< + * size_t max_line_size=8190, size_t max_headers=32768, + * size_t max_field_size=8190, payload_exception=None, + */ + PyObject *__pyx_v_timer = ((PyObject *)Py_None); + size_t __pyx_v_max_line_size = ((size_t)0x1FFE); + size_t __pyx_v_max_headers = ((size_t)0x8000); + size_t __pyx_v_max_field_size = ((size_t)0x1FFE); + + /* "aiohttp/_http_parser.pyx":332 + * object timer=None, + * size_t max_line_size=8190, size_t max_headers=32768, + * size_t max_field_size=8190, payload_exception=None, # <<<<<<<<<<<<<< + * bint response_with_body=True, bint read_until_eof=False, + * bint auto_decompress=True, + */ + PyObject *__pyx_v_payload_exception = ((PyObject *)Py_None); + + /* "aiohttp/_http_parser.pyx":333 + * size_t max_line_size=8190, size_t max_headers=32768, + * size_t max_field_size=8190, payload_exception=None, + * bint response_with_body=True, bint read_until_eof=False, # <<<<<<<<<<<<<< + * bint auto_decompress=True, + * ): + */ + int __pyx_v_response_with_body = ((int)1); + int __pyx_v_read_until_eof = ((int)0); + + /* "aiohttp/_http_parser.pyx":334 + * size_t max_field_size=8190, payload_exception=None, + * bint response_with_body=True, bint read_until_eof=False, + * bint auto_decompress=True, # <<<<<<<<<<<<<< + * ): + * cparser.llhttp_settings_init(self._csettings) + */ + int __pyx_v_auto_decompress = ((int)1); + PyObject *__pyx_r = NULL; + __Pyx_RefNannyDeclarations + PyObject *__pyx_t_1 = NULL; + int __pyx_lineno = 0; + const char *__pyx_filename = NULL; + int __pyx_clineno = 0; + __Pyx_RefNannySetupContext("_init", 0); + if (__pyx_optional_args) { + if (__pyx_optional_args->__pyx_n > 0) { + __pyx_v_timer = __pyx_optional_args->timer; + if (__pyx_optional_args->__pyx_n > 1) { + __pyx_v_max_line_size = __pyx_optional_args->max_line_size; + if (__pyx_optional_args->__pyx_n > 2) { + __pyx_v_max_headers = __pyx_optional_args->max_headers; + if (__pyx_optional_args->__pyx_n > 3) { + __pyx_v_max_field_size = __pyx_optional_args->max_field_size; + if (__pyx_optional_args->__pyx_n > 4) { + __pyx_v_payload_exception = __pyx_optional_args->payload_exception; + if (__pyx_optional_args->__pyx_n > 5) { + __pyx_v_response_with_body = __pyx_optional_args->response_with_body; + if (__pyx_optional_args->__pyx_n > 6) { + __pyx_v_read_until_eof = __pyx_optional_args->read_until_eof; + if (__pyx_optional_args->__pyx_n > 7) { + __pyx_v_auto_decompress = __pyx_optional_args->auto_decompress; + } + } + } + } + } + } + } + } + } + + /* "aiohttp/_http_parser.pyx":336 + * bint auto_decompress=True, + * ): + * cparser.llhttp_settings_init(self._csettings) # <<<<<<<<<<<<<< + * cparser.llhttp_init(self._cparser, mode, self._csettings) + * self._cparser.data = self + */ + llhttp_settings_init(__pyx_v_self->_csettings); + + /* "aiohttp/_http_parser.pyx":337 + * ): + * cparser.llhttp_settings_init(self._csettings) + * cparser.llhttp_init(self._cparser, mode, self._csettings) # <<<<<<<<<<<<<< + * self._cparser.data = self + * self._cparser.content_length = 0 + */ + llhttp_init(__pyx_v_self->_cparser, __pyx_v_mode, __pyx_v_self->_csettings); + + /* "aiohttp/_http_parser.pyx":338 + * cparser.llhttp_settings_init(self._csettings) + * cparser.llhttp_init(self._cparser, mode, self._csettings) + * self._cparser.data = self # <<<<<<<<<<<<<< + * self._cparser.content_length = 0 + * + */ + __pyx_v_self->_cparser->data = ((void *)__pyx_v_self); + + /* "aiohttp/_http_parser.pyx":339 + * cparser.llhttp_init(self._cparser, mode, self._csettings) + * self._cparser.data = self + * self._cparser.content_length = 0 # <<<<<<<<<<<<<< + * + * self._protocol = protocol + */ + __pyx_v_self->_cparser->content_length = 0; + + /* "aiohttp/_http_parser.pyx":341 + * self._cparser.content_length = 0 + * + * self._protocol = protocol # <<<<<<<<<<<<<< + * self._loop = loop + * self._timer = timer + */ + __Pyx_INCREF(__pyx_v_protocol); + __Pyx_GIVEREF(__pyx_v_protocol); + __Pyx_GOTREF(__pyx_v_self->_protocol); + __Pyx_DECREF(__pyx_v_self->_protocol); + __pyx_v_self->_protocol = __pyx_v_protocol; + + /* "aiohttp/_http_parser.pyx":342 + * + * self._protocol = protocol + * self._loop = loop # <<<<<<<<<<<<<< + * self._timer = timer + * + */ + __Pyx_INCREF(__pyx_v_loop); + __Pyx_GIVEREF(__pyx_v_loop); + __Pyx_GOTREF(__pyx_v_self->_loop); + __Pyx_DECREF(__pyx_v_self->_loop); + __pyx_v_self->_loop = __pyx_v_loop; + + /* "aiohttp/_http_parser.pyx":343 + * self._protocol = protocol + * self._loop = loop + * self._timer = timer # <<<<<<<<<<<<<< + * + * self._buf = bytearray() + */ + __Pyx_INCREF(__pyx_v_timer); + __Pyx_GIVEREF(__pyx_v_timer); + __Pyx_GOTREF(__pyx_v_self->_timer); + __Pyx_DECREF(__pyx_v_self->_timer); + __pyx_v_self->_timer = __pyx_v_timer; + + /* "aiohttp/_http_parser.pyx":345 + * self._timer = timer + * + * self._buf = bytearray() # <<<<<<<<<<<<<< + * self._payload = None + * self._payload_error = 0 + */ + __pyx_t_1 = __Pyx_PyObject_CallNoArg(((PyObject *)(&PyByteArray_Type))); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 345, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __Pyx_GIVEREF(__pyx_t_1); + __Pyx_GOTREF(__pyx_v_self->_buf); + __Pyx_DECREF(__pyx_v_self->_buf); + __pyx_v_self->_buf = ((PyObject*)__pyx_t_1); + __pyx_t_1 = 0; + + /* "aiohttp/_http_parser.pyx":346 + * + * self._buf = bytearray() + * self._payload = None # <<<<<<<<<<<<<< + * self._payload_error = 0 + * self._payload_exception = payload_exception + */ + __Pyx_INCREF(Py_None); + __Pyx_GIVEREF(Py_None); + __Pyx_GOTREF(__pyx_v_self->_payload); + __Pyx_DECREF(__pyx_v_self->_payload); + __pyx_v_self->_payload = Py_None; + + /* "aiohttp/_http_parser.pyx":347 + * self._buf = bytearray() + * self._payload = None + * self._payload_error = 0 # <<<<<<<<<<<<<< + * self._payload_exception = payload_exception + * self._messages = [] + */ + __pyx_v_self->_payload_error = 0; + + /* "aiohttp/_http_parser.pyx":348 + * self._payload = None + * self._payload_error = 0 + * self._payload_exception = payload_exception # <<<<<<<<<<<<<< + * self._messages = [] + * + */ + __Pyx_INCREF(__pyx_v_payload_exception); + __Pyx_GIVEREF(__pyx_v_payload_exception); + __Pyx_GOTREF(__pyx_v_self->_payload_exception); + __Pyx_DECREF(__pyx_v_self->_payload_exception); + __pyx_v_self->_payload_exception = __pyx_v_payload_exception; + + /* "aiohttp/_http_parser.pyx":349 + * self._payload_error = 0 + * self._payload_exception = payload_exception + * self._messages = [] # <<<<<<<<<<<<<< + * + * self._raw_name = bytearray() + */ + __pyx_t_1 = PyList_New(0); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 349, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __Pyx_GIVEREF(__pyx_t_1); + __Pyx_GOTREF(__pyx_v_self->_messages); + __Pyx_DECREF(__pyx_v_self->_messages); + __pyx_v_self->_messages = ((PyObject*)__pyx_t_1); + __pyx_t_1 = 0; + + /* "aiohttp/_http_parser.pyx":351 + * self._messages = [] + * + * self._raw_name = bytearray() # <<<<<<<<<<<<<< + * self._raw_value = bytearray() + * self._has_value = False + */ + __pyx_t_1 = __Pyx_PyObject_CallNoArg(((PyObject *)(&PyByteArray_Type))); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 351, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __Pyx_GIVEREF(__pyx_t_1); + __Pyx_GOTREF(__pyx_v_self->_raw_name); + __Pyx_DECREF(__pyx_v_self->_raw_name); + __pyx_v_self->_raw_name = ((PyObject*)__pyx_t_1); + __pyx_t_1 = 0; + + /* "aiohttp/_http_parser.pyx":352 + * + * self._raw_name = bytearray() + * self._raw_value = bytearray() # <<<<<<<<<<<<<< + * self._has_value = False + * + */ + __pyx_t_1 = __Pyx_PyObject_CallNoArg(((PyObject *)(&PyByteArray_Type))); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 352, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __Pyx_GIVEREF(__pyx_t_1); + __Pyx_GOTREF(__pyx_v_self->_raw_value); + __Pyx_DECREF(__pyx_v_self->_raw_value); + __pyx_v_self->_raw_value = ((PyObject*)__pyx_t_1); + __pyx_t_1 = 0; + + /* "aiohttp/_http_parser.pyx":353 + * self._raw_name = bytearray() + * self._raw_value = bytearray() + * self._has_value = False # <<<<<<<<<<<<<< + * + * self._max_line_size = max_line_size + */ + __pyx_v_self->_has_value = 0; + + /* "aiohttp/_http_parser.pyx":355 + * self._has_value = False + * + * self._max_line_size = max_line_size # <<<<<<<<<<<<<< + * self._max_headers = max_headers + * self._max_field_size = max_field_size + */ + __pyx_v_self->_max_line_size = __pyx_v_max_line_size; + + /* "aiohttp/_http_parser.pyx":356 + * + * self._max_line_size = max_line_size + * self._max_headers = max_headers # <<<<<<<<<<<<<< + * self._max_field_size = max_field_size + * self._response_with_body = response_with_body + */ + __pyx_v_self->_max_headers = __pyx_v_max_headers; + + /* "aiohttp/_http_parser.pyx":357 + * self._max_line_size = max_line_size + * self._max_headers = max_headers + * self._max_field_size = max_field_size # <<<<<<<<<<<<<< + * self._response_with_body = response_with_body + * self._read_until_eof = read_until_eof + */ + __pyx_v_self->_max_field_size = __pyx_v_max_field_size; + + /* "aiohttp/_http_parser.pyx":358 + * self._max_headers = max_headers + * self._max_field_size = max_field_size + * self._response_with_body = response_with_body # <<<<<<<<<<<<<< + * self._read_until_eof = read_until_eof + * self._upgraded = False + */ + __pyx_v_self->_response_with_body = __pyx_v_response_with_body; + + /* "aiohttp/_http_parser.pyx":359 + * self._max_field_size = max_field_size + * self._response_with_body = response_with_body + * self._read_until_eof = read_until_eof # <<<<<<<<<<<<<< + * self._upgraded = False + * self._auto_decompress = auto_decompress + */ + __pyx_v_self->_read_until_eof = __pyx_v_read_until_eof; + + /* "aiohttp/_http_parser.pyx":360 + * self._response_with_body = response_with_body + * self._read_until_eof = read_until_eof + * self._upgraded = False # <<<<<<<<<<<<<< + * self._auto_decompress = auto_decompress + * self._content_encoding = None + */ + __pyx_v_self->_upgraded = 0; + + /* "aiohttp/_http_parser.pyx":361 + * self._read_until_eof = read_until_eof + * self._upgraded = False + * self._auto_decompress = auto_decompress # <<<<<<<<<<<<<< + * self._content_encoding = None + * + */ + __pyx_v_self->_auto_decompress = __pyx_v_auto_decompress; + + /* "aiohttp/_http_parser.pyx":362 + * self._upgraded = False + * self._auto_decompress = auto_decompress + * self._content_encoding = None # <<<<<<<<<<<<<< + * + * self._csettings.on_url = cb_on_url + */ + __Pyx_INCREF(Py_None); + __Pyx_GIVEREF(Py_None); + __Pyx_GOTREF(__pyx_v_self->_content_encoding); + __Pyx_DECREF(__pyx_v_self->_content_encoding); + __pyx_v_self->_content_encoding = ((PyObject*)Py_None); + + /* "aiohttp/_http_parser.pyx":364 + * self._content_encoding = None + * + * self._csettings.on_url = cb_on_url # <<<<<<<<<<<<<< + * self._csettings.on_status = cb_on_status + * self._csettings.on_header_field = cb_on_header_field + */ + __pyx_v_self->_csettings->on_url = __pyx_f_7aiohttp_12_http_parser_cb_on_url; + + /* "aiohttp/_http_parser.pyx":365 + * + * self._csettings.on_url = cb_on_url + * self._csettings.on_status = cb_on_status # <<<<<<<<<<<<<< + * self._csettings.on_header_field = cb_on_header_field + * self._csettings.on_header_value = cb_on_header_value + */ + __pyx_v_self->_csettings->on_status = __pyx_f_7aiohttp_12_http_parser_cb_on_status; + + /* "aiohttp/_http_parser.pyx":366 + * self._csettings.on_url = cb_on_url + * self._csettings.on_status = cb_on_status + * self._csettings.on_header_field = cb_on_header_field # <<<<<<<<<<<<<< + * self._csettings.on_header_value = cb_on_header_value + * self._csettings.on_headers_complete = cb_on_headers_complete + */ + __pyx_v_self->_csettings->on_header_field = __pyx_f_7aiohttp_12_http_parser_cb_on_header_field; + + /* "aiohttp/_http_parser.pyx":367 + * self._csettings.on_status = cb_on_status + * self._csettings.on_header_field = cb_on_header_field + * self._csettings.on_header_value = cb_on_header_value # <<<<<<<<<<<<<< + * self._csettings.on_headers_complete = cb_on_headers_complete + * self._csettings.on_body = cb_on_body + */ + __pyx_v_self->_csettings->on_header_value = __pyx_f_7aiohttp_12_http_parser_cb_on_header_value; + + /* "aiohttp/_http_parser.pyx":368 + * self._csettings.on_header_field = cb_on_header_field + * self._csettings.on_header_value = cb_on_header_value + * self._csettings.on_headers_complete = cb_on_headers_complete # <<<<<<<<<<<<<< + * self._csettings.on_body = cb_on_body + * self._csettings.on_message_begin = cb_on_message_begin + */ + __pyx_v_self->_csettings->on_headers_complete = __pyx_f_7aiohttp_12_http_parser_cb_on_headers_complete; + + /* "aiohttp/_http_parser.pyx":369 + * self._csettings.on_header_value = cb_on_header_value + * self._csettings.on_headers_complete = cb_on_headers_complete + * self._csettings.on_body = cb_on_body # <<<<<<<<<<<<<< + * self._csettings.on_message_begin = cb_on_message_begin + * self._csettings.on_message_complete = cb_on_message_complete + */ + __pyx_v_self->_csettings->on_body = __pyx_f_7aiohttp_12_http_parser_cb_on_body; + + /* "aiohttp/_http_parser.pyx":370 + * self._csettings.on_headers_complete = cb_on_headers_complete + * self._csettings.on_body = cb_on_body + * self._csettings.on_message_begin = cb_on_message_begin # <<<<<<<<<<<<<< + * self._csettings.on_message_complete = cb_on_message_complete + * self._csettings.on_chunk_header = cb_on_chunk_header + */ + __pyx_v_self->_csettings->on_message_begin = __pyx_f_7aiohttp_12_http_parser_cb_on_message_begin; + + /* "aiohttp/_http_parser.pyx":371 + * self._csettings.on_body = cb_on_body + * self._csettings.on_message_begin = cb_on_message_begin + * self._csettings.on_message_complete = cb_on_message_complete # <<<<<<<<<<<<<< + * self._csettings.on_chunk_header = cb_on_chunk_header + * self._csettings.on_chunk_complete = cb_on_chunk_complete + */ + __pyx_v_self->_csettings->on_message_complete = __pyx_f_7aiohttp_12_http_parser_cb_on_message_complete; + + /* "aiohttp/_http_parser.pyx":372 + * self._csettings.on_message_begin = cb_on_message_begin + * self._csettings.on_message_complete = cb_on_message_complete + * self._csettings.on_chunk_header = cb_on_chunk_header # <<<<<<<<<<<<<< + * self._csettings.on_chunk_complete = cb_on_chunk_complete + * + */ + __pyx_v_self->_csettings->on_chunk_header = __pyx_f_7aiohttp_12_http_parser_cb_on_chunk_header; + + /* "aiohttp/_http_parser.pyx":373 + * self._csettings.on_message_complete = cb_on_message_complete + * self._csettings.on_chunk_header = cb_on_chunk_header + * self._csettings.on_chunk_complete = cb_on_chunk_complete # <<<<<<<<<<<<<< + * + * self._last_error = None + */ + __pyx_v_self->_csettings->on_chunk_complete = __pyx_f_7aiohttp_12_http_parser_cb_on_chunk_complete; + + /* "aiohttp/_http_parser.pyx":375 + * self._csettings.on_chunk_complete = cb_on_chunk_complete + * + * self._last_error = None # <<<<<<<<<<<<<< + * self._limit = limit + * + */ + __Pyx_INCREF(Py_None); + __Pyx_GIVEREF(Py_None); + __Pyx_GOTREF(__pyx_v_self->_last_error); + __Pyx_DECREF(__pyx_v_self->_last_error); + __pyx_v_self->_last_error = Py_None; + + /* "aiohttp/_http_parser.pyx":376 + * + * self._last_error = None + * self._limit = limit # <<<<<<<<<<<<<< + * + * cdef _process_header(self): + */ + __pyx_v_self->_limit = __pyx_v_limit; + + /* "aiohttp/_http_parser.pyx":327 + * PyMem_Free(self._csettings) + * + * cdef _init( # <<<<<<<<<<<<<< + * self, cparser.llhttp_type mode, + * object protocol, object loop, int limit, + */ + + /* function exit code */ + __pyx_r = Py_None; __Pyx_INCREF(Py_None); + goto __pyx_L0; + __pyx_L1_error:; + __Pyx_XDECREF(__pyx_t_1); + __Pyx_AddTraceback("aiohttp._http_parser.HttpParser._init", __pyx_clineno, __pyx_lineno, __pyx_filename); + __pyx_r = 0; + __pyx_L0:; + __Pyx_XGIVEREF(__pyx_r); + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +/* "aiohttp/_http_parser.pyx":378 + * self._limit = limit + * + * cdef _process_header(self): # <<<<<<<<<<<<<< + * if self._raw_name: + * raw_name = bytes(self._raw_name) + */ + +static PyObject *__pyx_f_7aiohttp_12_http_parser_10HttpParser__process_header(struct __pyx_obj_7aiohttp_12_http_parser_HttpParser *__pyx_v_self) { + PyObject *__pyx_v_raw_name = NULL; + PyObject *__pyx_v_raw_value = NULL; + PyObject *__pyx_v_name = NULL; + PyObject *__pyx_v_value = NULL; + PyObject *__pyx_r = NULL; + __Pyx_RefNannyDeclarations + int __pyx_t_1; + PyObject *__pyx_t_2 = NULL; + PyObject *__pyx_t_3 = NULL; + PyObject *__pyx_t_4 = NULL; + int __pyx_t_5; + PyObject *__pyx_t_6 = NULL; + int __pyx_t_7; + int __pyx_t_8; + int __pyx_lineno = 0; + const char *__pyx_filename = NULL; + int __pyx_clineno = 0; + __Pyx_RefNannySetupContext("_process_header", 0); + + /* "aiohttp/_http_parser.pyx":379 + * + * cdef _process_header(self): + * if self._raw_name: # <<<<<<<<<<<<<< + * raw_name = bytes(self._raw_name) + * raw_value = bytes(self._raw_value) + */ + __pyx_t_1 = (__pyx_v_self->_raw_name != Py_None)&&(PyByteArray_GET_SIZE(__pyx_v_self->_raw_name) != 0); + if (__pyx_t_1) { + + /* "aiohttp/_http_parser.pyx":380 + * cdef _process_header(self): + * if self._raw_name: + * raw_name = bytes(self._raw_name) # <<<<<<<<<<<<<< + * raw_value = bytes(self._raw_value) + * + */ + __pyx_t_2 = __Pyx_PyObject_CallOneArg(((PyObject *)(&PyBytes_Type)), __pyx_v_self->_raw_name); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 380, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_2); + __pyx_v_raw_name = ((PyObject*)__pyx_t_2); + __pyx_t_2 = 0; + + /* "aiohttp/_http_parser.pyx":381 + * if self._raw_name: + * raw_name = bytes(self._raw_name) + * raw_value = bytes(self._raw_value) # <<<<<<<<<<<<<< + * + * name = find_header(raw_name) + */ + __pyx_t_2 = __Pyx_PyObject_CallOneArg(((PyObject *)(&PyBytes_Type)), __pyx_v_self->_raw_value); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 381, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_2); + __pyx_v_raw_value = ((PyObject*)__pyx_t_2); + __pyx_t_2 = 0; + + /* "aiohttp/_http_parser.pyx":383 + * raw_value = bytes(self._raw_value) + * + * name = find_header(raw_name) # <<<<<<<<<<<<<< + * value = raw_value.decode('utf-8', 'surrogateescape') + * + */ + __pyx_t_2 = __pyx_f_7aiohttp_12_http_parser_find_header(__pyx_v_raw_name); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 383, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_2); + __pyx_v_name = __pyx_t_2; + __pyx_t_2 = 0; + + /* "aiohttp/_http_parser.pyx":384 + * + * name = find_header(raw_name) + * value = raw_value.decode('utf-8', 'surrogateescape') # <<<<<<<<<<<<<< + * + * self._headers.add(name, value) + */ + __pyx_t_2 = __Pyx_decode_bytes(__pyx_v_raw_value, 0, PY_SSIZE_T_MAX, NULL, ((char const *)"surrogateescape"), PyUnicode_DecodeUTF8); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 384, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_2); + __pyx_v_value = __pyx_t_2; + __pyx_t_2 = 0; + + /* "aiohttp/_http_parser.pyx":386 + * value = raw_value.decode('utf-8', 'surrogateescape') + * + * self._headers.add(name, value) # <<<<<<<<<<<<<< + * + * if name is CONTENT_ENCODING: + */ + __pyx_t_3 = __Pyx_PyObject_GetAttrStr(__pyx_v_self->_headers, __pyx_n_s_add); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 386, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_3); + __pyx_t_4 = NULL; + __pyx_t_5 = 0; + if (CYTHON_UNPACK_METHODS && likely(PyMethod_Check(__pyx_t_3))) { + __pyx_t_4 = PyMethod_GET_SELF(__pyx_t_3); + if (likely(__pyx_t_4)) { + PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_3); + __Pyx_INCREF(__pyx_t_4); + __Pyx_INCREF(function); + __Pyx_DECREF_SET(__pyx_t_3, function); + __pyx_t_5 = 1; + } + } + #if CYTHON_FAST_PYCALL + if (PyFunction_Check(__pyx_t_3)) { + PyObject *__pyx_temp[3] = {__pyx_t_4, __pyx_v_name, __pyx_v_value}; + __pyx_t_2 = __Pyx_PyFunction_FastCall(__pyx_t_3, __pyx_temp+1-__pyx_t_5, 2+__pyx_t_5); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 386, __pyx_L1_error) + __Pyx_XDECREF(__pyx_t_4); __pyx_t_4 = 0; + __Pyx_GOTREF(__pyx_t_2); + } else + #endif + #if CYTHON_FAST_PYCCALL + if (__Pyx_PyFastCFunction_Check(__pyx_t_3)) { + PyObject *__pyx_temp[3] = {__pyx_t_4, __pyx_v_name, __pyx_v_value}; + __pyx_t_2 = __Pyx_PyCFunction_FastCall(__pyx_t_3, __pyx_temp+1-__pyx_t_5, 2+__pyx_t_5); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 386, __pyx_L1_error) + __Pyx_XDECREF(__pyx_t_4); __pyx_t_4 = 0; + __Pyx_GOTREF(__pyx_t_2); + } else + #endif + { + __pyx_t_6 = PyTuple_New(2+__pyx_t_5); if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 386, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_6); + if (__pyx_t_4) { + __Pyx_GIVEREF(__pyx_t_4); PyTuple_SET_ITEM(__pyx_t_6, 0, __pyx_t_4); __pyx_t_4 = NULL; + } + __Pyx_INCREF(__pyx_v_name); + __Pyx_GIVEREF(__pyx_v_name); + PyTuple_SET_ITEM(__pyx_t_6, 0+__pyx_t_5, __pyx_v_name); + __Pyx_INCREF(__pyx_v_value); + __Pyx_GIVEREF(__pyx_v_value); + PyTuple_SET_ITEM(__pyx_t_6, 1+__pyx_t_5, __pyx_v_value); + __pyx_t_2 = __Pyx_PyObject_Call(__pyx_t_3, __pyx_t_6, NULL); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 386, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_2); + __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0; + } + __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; + __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; + + /* "aiohttp/_http_parser.pyx":388 + * self._headers.add(name, value) + * + * if name is CONTENT_ENCODING: # <<<<<<<<<<<<<< + * self._content_encoding = value + * + */ + __pyx_t_1 = (__pyx_v_name == __pyx_v_7aiohttp_12_http_parser_CONTENT_ENCODING); + __pyx_t_7 = (__pyx_t_1 != 0); + if (__pyx_t_7) { + + /* "aiohttp/_http_parser.pyx":389 + * + * if name is CONTENT_ENCODING: + * self._content_encoding = value # <<<<<<<<<<<<<< + * + * PyByteArray_Resize(self._raw_name, 0) + */ + if (!(likely(PyUnicode_CheckExact(__pyx_v_value))||((__pyx_v_value) == Py_None)||(PyErr_Format(PyExc_TypeError, "Expected %.16s, got %.200s", "unicode", Py_TYPE(__pyx_v_value)->tp_name), 0))) __PYX_ERR(0, 389, __pyx_L1_error) + __pyx_t_2 = __pyx_v_value; + __Pyx_INCREF(__pyx_t_2); + __Pyx_GIVEREF(__pyx_t_2); + __Pyx_GOTREF(__pyx_v_self->_content_encoding); + __Pyx_DECREF(__pyx_v_self->_content_encoding); + __pyx_v_self->_content_encoding = ((PyObject*)__pyx_t_2); + __pyx_t_2 = 0; + + /* "aiohttp/_http_parser.pyx":388 + * self._headers.add(name, value) + * + * if name is CONTENT_ENCODING: # <<<<<<<<<<<<<< + * self._content_encoding = value + * + */ + } + + /* "aiohttp/_http_parser.pyx":391 + * self._content_encoding = value + * + * PyByteArray_Resize(self._raw_name, 0) # <<<<<<<<<<<<<< + * PyByteArray_Resize(self._raw_value, 0) + * self._has_value = False + */ + __pyx_t_2 = __pyx_v_self->_raw_name; + __Pyx_INCREF(__pyx_t_2); + __pyx_t_5 = PyByteArray_Resize(__pyx_t_2, 0); if (unlikely(__pyx_t_5 == ((int)-1))) __PYX_ERR(0, 391, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; + + /* "aiohttp/_http_parser.pyx":392 + * + * PyByteArray_Resize(self._raw_name, 0) + * PyByteArray_Resize(self._raw_value, 0) # <<<<<<<<<<<<<< + * self._has_value = False + * self._raw_headers.append((raw_name, raw_value)) + */ + __pyx_t_2 = __pyx_v_self->_raw_value; + __Pyx_INCREF(__pyx_t_2); + __pyx_t_5 = PyByteArray_Resize(__pyx_t_2, 0); if (unlikely(__pyx_t_5 == ((int)-1))) __PYX_ERR(0, 392, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; + + /* "aiohttp/_http_parser.pyx":393 + * PyByteArray_Resize(self._raw_name, 0) + * PyByteArray_Resize(self._raw_value, 0) + * self._has_value = False # <<<<<<<<<<<<<< + * self._raw_headers.append((raw_name, raw_value)) + * + */ + __pyx_v_self->_has_value = 0; + + /* "aiohttp/_http_parser.pyx":394 + * PyByteArray_Resize(self._raw_value, 0) + * self._has_value = False + * self._raw_headers.append((raw_name, raw_value)) # <<<<<<<<<<<<<< + * + * cdef _on_header_field(self, char* at, size_t length): + */ + if (unlikely(__pyx_v_self->_raw_headers == Py_None)) { + PyErr_Format(PyExc_AttributeError, "'NoneType' object has no attribute '%.30s'", "append"); + __PYX_ERR(0, 394, __pyx_L1_error) + } + __pyx_t_2 = PyTuple_New(2); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 394, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_2); + __Pyx_INCREF(__pyx_v_raw_name); + __Pyx_GIVEREF(__pyx_v_raw_name); + PyTuple_SET_ITEM(__pyx_t_2, 0, __pyx_v_raw_name); + __Pyx_INCREF(__pyx_v_raw_value); + __Pyx_GIVEREF(__pyx_v_raw_value); + PyTuple_SET_ITEM(__pyx_t_2, 1, __pyx_v_raw_value); + __pyx_t_8 = __Pyx_PyList_Append(__pyx_v_self->_raw_headers, __pyx_t_2); if (unlikely(__pyx_t_8 == ((int)-1))) __PYX_ERR(0, 394, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; + + /* "aiohttp/_http_parser.pyx":379 + * + * cdef _process_header(self): + * if self._raw_name: # <<<<<<<<<<<<<< + * raw_name = bytes(self._raw_name) + * raw_value = bytes(self._raw_value) + */ + } + + /* "aiohttp/_http_parser.pyx":378 + * self._limit = limit + * + * cdef _process_header(self): # <<<<<<<<<<<<<< + * if self._raw_name: + * raw_name = bytes(self._raw_name) + */ + + /* function exit code */ + __pyx_r = Py_None; __Pyx_INCREF(Py_None); + goto __pyx_L0; + __pyx_L1_error:; + __Pyx_XDECREF(__pyx_t_2); + __Pyx_XDECREF(__pyx_t_3); + __Pyx_XDECREF(__pyx_t_4); + __Pyx_XDECREF(__pyx_t_6); + __Pyx_AddTraceback("aiohttp._http_parser.HttpParser._process_header", __pyx_clineno, __pyx_lineno, __pyx_filename); + __pyx_r = 0; + __pyx_L0:; + __Pyx_XDECREF(__pyx_v_raw_name); + __Pyx_XDECREF(__pyx_v_raw_value); + __Pyx_XDECREF(__pyx_v_name); + __Pyx_XDECREF(__pyx_v_value); + __Pyx_XGIVEREF(__pyx_r); + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +/* "aiohttp/_http_parser.pyx":396 + * self._raw_headers.append((raw_name, raw_value)) + * + * cdef _on_header_field(self, char* at, size_t length): # <<<<<<<<<<<<<< + * cdef Py_ssize_t size + * cdef char *buf + */ + +static PyObject *__pyx_f_7aiohttp_12_http_parser_10HttpParser__on_header_field(struct __pyx_obj_7aiohttp_12_http_parser_HttpParser *__pyx_v_self, char *__pyx_v_at, size_t __pyx_v_length) { + Py_ssize_t __pyx_v_size; + char *__pyx_v_buf; + PyObject *__pyx_r = NULL; + __Pyx_RefNannyDeclarations + int __pyx_t_1; + PyObject *__pyx_t_2 = NULL; + Py_ssize_t __pyx_t_3; + int __pyx_t_4; + int __pyx_lineno = 0; + const char *__pyx_filename = NULL; + int __pyx_clineno = 0; + __Pyx_RefNannySetupContext("_on_header_field", 0); + + /* "aiohttp/_http_parser.pyx":399 + * cdef Py_ssize_t size + * cdef char *buf + * if self._has_value: # <<<<<<<<<<<<<< + * self._process_header() + * + */ + __pyx_t_1 = (__pyx_v_self->_has_value != 0); + if (__pyx_t_1) { + + /* "aiohttp/_http_parser.pyx":400 + * cdef char *buf + * if self._has_value: + * self._process_header() # <<<<<<<<<<<<<< + * + * size = PyByteArray_Size(self._raw_name) + */ + __pyx_t_2 = ((struct __pyx_vtabstruct_7aiohttp_12_http_parser_HttpParser *)__pyx_v_self->__pyx_vtab)->_process_header(__pyx_v_self); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 400, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_2); + __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; + + /* "aiohttp/_http_parser.pyx":399 + * cdef Py_ssize_t size + * cdef char *buf + * if self._has_value: # <<<<<<<<<<<<<< + * self._process_header() + * + */ + } + + /* "aiohttp/_http_parser.pyx":402 + * self._process_header() + * + * size = PyByteArray_Size(self._raw_name) # <<<<<<<<<<<<<< + * PyByteArray_Resize(self._raw_name, size + length) + * buf = PyByteArray_AsString(self._raw_name) + */ + __pyx_t_2 = __pyx_v_self->_raw_name; + __Pyx_INCREF(__pyx_t_2); + __pyx_t_3 = PyByteArray_Size(__pyx_t_2); if (unlikely(__pyx_t_3 == ((Py_ssize_t)-1L))) __PYX_ERR(0, 402, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; + __pyx_v_size = __pyx_t_3; + + /* "aiohttp/_http_parser.pyx":403 + * + * size = PyByteArray_Size(self._raw_name) + * PyByteArray_Resize(self._raw_name, size + length) # <<<<<<<<<<<<<< + * buf = PyByteArray_AsString(self._raw_name) + * memcpy(buf + size, at, length) + */ + __pyx_t_2 = __pyx_v_self->_raw_name; + __Pyx_INCREF(__pyx_t_2); + __pyx_t_4 = PyByteArray_Resize(__pyx_t_2, (__pyx_v_size + __pyx_v_length)); if (unlikely(__pyx_t_4 == ((int)-1))) __PYX_ERR(0, 403, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; + + /* "aiohttp/_http_parser.pyx":404 + * size = PyByteArray_Size(self._raw_name) + * PyByteArray_Resize(self._raw_name, size + length) + * buf = PyByteArray_AsString(self._raw_name) # <<<<<<<<<<<<<< + * memcpy(buf + size, at, length) + * + */ + __pyx_t_2 = __pyx_v_self->_raw_name; + __Pyx_INCREF(__pyx_t_2); + __pyx_v_buf = PyByteArray_AsString(__pyx_t_2); + __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; + + /* "aiohttp/_http_parser.pyx":405 + * PyByteArray_Resize(self._raw_name, size + length) + * buf = PyByteArray_AsString(self._raw_name) + * memcpy(buf + size, at, length) # <<<<<<<<<<<<<< + * + * cdef _on_header_value(self, char* at, size_t length): + */ + (void)(memcpy((__pyx_v_buf + __pyx_v_size), __pyx_v_at, __pyx_v_length)); + + /* "aiohttp/_http_parser.pyx":396 + * self._raw_headers.append((raw_name, raw_value)) + * + * cdef _on_header_field(self, char* at, size_t length): # <<<<<<<<<<<<<< + * cdef Py_ssize_t size + * cdef char *buf + */ + + /* function exit code */ + __pyx_r = Py_None; __Pyx_INCREF(Py_None); + goto __pyx_L0; + __pyx_L1_error:; + __Pyx_XDECREF(__pyx_t_2); + __Pyx_AddTraceback("aiohttp._http_parser.HttpParser._on_header_field", __pyx_clineno, __pyx_lineno, __pyx_filename); + __pyx_r = 0; + __pyx_L0:; + __Pyx_XGIVEREF(__pyx_r); + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +/* "aiohttp/_http_parser.pyx":407 + * memcpy(buf + size, at, length) + * + * cdef _on_header_value(self, char* at, size_t length): # <<<<<<<<<<<<<< + * cdef Py_ssize_t size + * cdef char *buf + */ + +static PyObject *__pyx_f_7aiohttp_12_http_parser_10HttpParser__on_header_value(struct __pyx_obj_7aiohttp_12_http_parser_HttpParser *__pyx_v_self, char *__pyx_v_at, size_t __pyx_v_length) { + Py_ssize_t __pyx_v_size; + char *__pyx_v_buf; + PyObject *__pyx_r = NULL; + __Pyx_RefNannyDeclarations + PyObject *__pyx_t_1 = NULL; + Py_ssize_t __pyx_t_2; + int __pyx_t_3; + int __pyx_lineno = 0; + const char *__pyx_filename = NULL; + int __pyx_clineno = 0; + __Pyx_RefNannySetupContext("_on_header_value", 0); + + /* "aiohttp/_http_parser.pyx":411 + * cdef char *buf + * + * size = PyByteArray_Size(self._raw_value) # <<<<<<<<<<<<<< + * PyByteArray_Resize(self._raw_value, size + length) + * buf = PyByteArray_AsString(self._raw_value) + */ + __pyx_t_1 = __pyx_v_self->_raw_value; + __Pyx_INCREF(__pyx_t_1); + __pyx_t_2 = PyByteArray_Size(__pyx_t_1); if (unlikely(__pyx_t_2 == ((Py_ssize_t)-1L))) __PYX_ERR(0, 411, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + __pyx_v_size = __pyx_t_2; + + /* "aiohttp/_http_parser.pyx":412 + * + * size = PyByteArray_Size(self._raw_value) + * PyByteArray_Resize(self._raw_value, size + length) # <<<<<<<<<<<<<< + * buf = PyByteArray_AsString(self._raw_value) + * memcpy(buf + size, at, length) + */ + __pyx_t_1 = __pyx_v_self->_raw_value; + __Pyx_INCREF(__pyx_t_1); + __pyx_t_3 = PyByteArray_Resize(__pyx_t_1, (__pyx_v_size + __pyx_v_length)); if (unlikely(__pyx_t_3 == ((int)-1))) __PYX_ERR(0, 412, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + + /* "aiohttp/_http_parser.pyx":413 + * size = PyByteArray_Size(self._raw_value) + * PyByteArray_Resize(self._raw_value, size + length) + * buf = PyByteArray_AsString(self._raw_value) # <<<<<<<<<<<<<< + * memcpy(buf + size, at, length) + * self._has_value = True + */ + __pyx_t_1 = __pyx_v_self->_raw_value; + __Pyx_INCREF(__pyx_t_1); + __pyx_v_buf = PyByteArray_AsString(__pyx_t_1); + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + + /* "aiohttp/_http_parser.pyx":414 + * PyByteArray_Resize(self._raw_value, size + length) + * buf = PyByteArray_AsString(self._raw_value) + * memcpy(buf + size, at, length) # <<<<<<<<<<<<<< + * self._has_value = True + * + */ + (void)(memcpy((__pyx_v_buf + __pyx_v_size), __pyx_v_at, __pyx_v_length)); + + /* "aiohttp/_http_parser.pyx":415 + * buf = PyByteArray_AsString(self._raw_value) + * memcpy(buf + size, at, length) + * self._has_value = True # <<<<<<<<<<<<<< + * + * cdef _on_headers_complete(self): + */ + __pyx_v_self->_has_value = 1; + + /* "aiohttp/_http_parser.pyx":407 + * memcpy(buf + size, at, length) + * + * cdef _on_header_value(self, char* at, size_t length): # <<<<<<<<<<<<<< + * cdef Py_ssize_t size + * cdef char *buf + */ + + /* function exit code */ + __pyx_r = Py_None; __Pyx_INCREF(Py_None); + goto __pyx_L0; + __pyx_L1_error:; + __Pyx_XDECREF(__pyx_t_1); + __Pyx_AddTraceback("aiohttp._http_parser.HttpParser._on_header_value", __pyx_clineno, __pyx_lineno, __pyx_filename); + __pyx_r = 0; + __pyx_L0:; + __Pyx_XGIVEREF(__pyx_r); + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +/* "aiohttp/_http_parser.pyx":417 + * self._has_value = True + * + * cdef _on_headers_complete(self): # <<<<<<<<<<<<<< + * self._process_header() + * + */ + +static PyObject *__pyx_f_7aiohttp_12_http_parser_10HttpParser__on_headers_complete(struct __pyx_obj_7aiohttp_12_http_parser_HttpParser *__pyx_v_self) { + PyObject *__pyx_v_method = NULL; + int __pyx_v_should_close; + uint8_t __pyx_v_upgrade; + int __pyx_v_chunked; + PyObject *__pyx_v_raw_headers = NULL; + PyObject *__pyx_v_headers = NULL; + PyObject *__pyx_v_encoding = NULL; + PyObject *__pyx_v_enc = NULL; + PyObject *__pyx_v_msg = NULL; + PyObject *__pyx_v_payload = NULL; + PyObject *__pyx_r = NULL; + __Pyx_RefNannyDeclarations + PyObject *__pyx_t_1 = NULL; + uint8_t __pyx_t_2; + PyObject *__pyx_t_3 = NULL; + PyObject *__pyx_t_4 = NULL; + int __pyx_t_5; + int __pyx_t_6; + PyObject *__pyx_t_7 = NULL; + int __pyx_t_8; + int __pyx_t_9; + int __pyx_t_10; + int __pyx_lineno = 0; + const char *__pyx_filename = NULL; + int __pyx_clineno = 0; + __Pyx_RefNannySetupContext("_on_headers_complete", 0); + + /* "aiohttp/_http_parser.pyx":418 + * + * cdef _on_headers_complete(self): + * self._process_header() # <<<<<<<<<<<<<< + * + * method = http_method_str(self._cparser.method) + */ + __pyx_t_1 = ((struct __pyx_vtabstruct_7aiohttp_12_http_parser_HttpParser *)__pyx_v_self->__pyx_vtab)->_process_header(__pyx_v_self); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 418, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + + /* "aiohttp/_http_parser.pyx":420 + * self._process_header() + * + * method = http_method_str(self._cparser.method) # <<<<<<<<<<<<<< + * should_close = not cparser.llhttp_should_keep_alive(self._cparser) + * upgrade = self._cparser.upgrade + */ + __pyx_t_1 = __pyx_f_7aiohttp_12_http_parser_http_method_str(__pyx_v_self->_cparser->method); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 420, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __pyx_v_method = ((PyObject*)__pyx_t_1); + __pyx_t_1 = 0; + + /* "aiohttp/_http_parser.pyx":421 + * + * method = http_method_str(self._cparser.method) + * should_close = not cparser.llhttp_should_keep_alive(self._cparser) # <<<<<<<<<<<<<< + * upgrade = self._cparser.upgrade + * chunked = self._cparser.flags & cparser.F_CHUNKED + */ + __pyx_v_should_close = (!(llhttp_should_keep_alive(__pyx_v_self->_cparser) != 0)); + + /* "aiohttp/_http_parser.pyx":422 + * method = http_method_str(self._cparser.method) + * should_close = not cparser.llhttp_should_keep_alive(self._cparser) + * upgrade = self._cparser.upgrade # <<<<<<<<<<<<<< + * chunked = self._cparser.flags & cparser.F_CHUNKED + * + */ + __pyx_t_2 = __pyx_v_self->_cparser->upgrade; + __pyx_v_upgrade = __pyx_t_2; + + /* "aiohttp/_http_parser.pyx":423 + * should_close = not cparser.llhttp_should_keep_alive(self._cparser) + * upgrade = self._cparser.upgrade + * chunked = self._cparser.flags & cparser.F_CHUNKED # <<<<<<<<<<<<<< + * + * raw_headers = tuple(self._raw_headers) + */ + __pyx_v_chunked = (__pyx_v_self->_cparser->flags & F_CHUNKED); + + /* "aiohttp/_http_parser.pyx":425 + * chunked = self._cparser.flags & cparser.F_CHUNKED + * + * raw_headers = tuple(self._raw_headers) # <<<<<<<<<<<<<< + * headers = CIMultiDictProxy(self._headers) + * + */ + if (unlikely(__pyx_v_self->_raw_headers == Py_None)) { + PyErr_SetString(PyExc_TypeError, "'NoneType' object is not iterable"); + __PYX_ERR(0, 425, __pyx_L1_error) + } + __pyx_t_1 = PyList_AsTuple(__pyx_v_self->_raw_headers); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 425, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __pyx_v_raw_headers = ((PyObject*)__pyx_t_1); + __pyx_t_1 = 0; + + /* "aiohttp/_http_parser.pyx":426 + * + * raw_headers = tuple(self._raw_headers) + * headers = CIMultiDictProxy(self._headers) # <<<<<<<<<<<<<< + * + * if upgrade or self._cparser.method == 5: # cparser.CONNECT: + */ + __Pyx_INCREF(__pyx_v_7aiohttp_12_http_parser_CIMultiDictProxy); + __pyx_t_3 = __pyx_v_7aiohttp_12_http_parser_CIMultiDictProxy; __pyx_t_4 = NULL; + if (CYTHON_UNPACK_METHODS && unlikely(PyMethod_Check(__pyx_t_3))) { + __pyx_t_4 = PyMethod_GET_SELF(__pyx_t_3); + if (likely(__pyx_t_4)) { + PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_3); + __Pyx_INCREF(__pyx_t_4); + __Pyx_INCREF(function); + __Pyx_DECREF_SET(__pyx_t_3, function); + } + } + __pyx_t_1 = (__pyx_t_4) ? __Pyx_PyObject_Call2Args(__pyx_t_3, __pyx_t_4, __pyx_v_self->_headers) : __Pyx_PyObject_CallOneArg(__pyx_t_3, __pyx_v_self->_headers); + __Pyx_XDECREF(__pyx_t_4); __pyx_t_4 = 0; + if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 426, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; + __pyx_v_headers = __pyx_t_1; + __pyx_t_1 = 0; + + /* "aiohttp/_http_parser.pyx":428 + * headers = CIMultiDictProxy(self._headers) + * + * if upgrade or self._cparser.method == 5: # cparser.CONNECT: # <<<<<<<<<<<<<< + * self._upgraded = True + * + */ + __pyx_t_6 = (__pyx_v_upgrade != 0); + if (!__pyx_t_6) { + } else { + __pyx_t_5 = __pyx_t_6; + goto __pyx_L4_bool_binop_done; + } + __pyx_t_6 = ((__pyx_v_self->_cparser->method == 5) != 0); + __pyx_t_5 = __pyx_t_6; + __pyx_L4_bool_binop_done:; + if (__pyx_t_5) { + + /* "aiohttp/_http_parser.pyx":429 + * + * if upgrade or self._cparser.method == 5: # cparser.CONNECT: + * self._upgraded = True # <<<<<<<<<<<<<< + * + * # do not support old websocket spec + */ + __pyx_v_self->_upgraded = 1; + + /* "aiohttp/_http_parser.pyx":428 + * headers = CIMultiDictProxy(self._headers) + * + * if upgrade or self._cparser.method == 5: # cparser.CONNECT: # <<<<<<<<<<<<<< + * self._upgraded = True + * + */ + } + + /* "aiohttp/_http_parser.pyx":432 + * + * # do not support old websocket spec + * if SEC_WEBSOCKET_KEY1 in headers: # <<<<<<<<<<<<<< + * raise InvalidHeader(SEC_WEBSOCKET_KEY1) + * + */ + __pyx_t_5 = (__Pyx_PySequence_ContainsTF(__pyx_v_7aiohttp_12_http_parser_SEC_WEBSOCKET_KEY1, __pyx_v_headers, Py_EQ)); if (unlikely(__pyx_t_5 < 0)) __PYX_ERR(0, 432, __pyx_L1_error) + __pyx_t_6 = (__pyx_t_5 != 0); + if (unlikely(__pyx_t_6)) { + + /* "aiohttp/_http_parser.pyx":433 + * # do not support old websocket spec + * if SEC_WEBSOCKET_KEY1 in headers: + * raise InvalidHeader(SEC_WEBSOCKET_KEY1) # <<<<<<<<<<<<<< + * + * encoding = None + */ + __Pyx_GetModuleGlobalName(__pyx_t_3, __pyx_n_s_InvalidHeader); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 433, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_3); + __pyx_t_4 = NULL; + if (CYTHON_UNPACK_METHODS && unlikely(PyMethod_Check(__pyx_t_3))) { + __pyx_t_4 = PyMethod_GET_SELF(__pyx_t_3); + if (likely(__pyx_t_4)) { + PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_3); + __Pyx_INCREF(__pyx_t_4); + __Pyx_INCREF(function); + __Pyx_DECREF_SET(__pyx_t_3, function); + } + } + __pyx_t_1 = (__pyx_t_4) ? __Pyx_PyObject_Call2Args(__pyx_t_3, __pyx_t_4, __pyx_v_7aiohttp_12_http_parser_SEC_WEBSOCKET_KEY1) : __Pyx_PyObject_CallOneArg(__pyx_t_3, __pyx_v_7aiohttp_12_http_parser_SEC_WEBSOCKET_KEY1); + __Pyx_XDECREF(__pyx_t_4); __pyx_t_4 = 0; + if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 433, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; + __Pyx_Raise(__pyx_t_1, 0, 0, 0); + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + __PYX_ERR(0, 433, __pyx_L1_error) + + /* "aiohttp/_http_parser.pyx":432 + * + * # do not support old websocket spec + * if SEC_WEBSOCKET_KEY1 in headers: # <<<<<<<<<<<<<< + * raise InvalidHeader(SEC_WEBSOCKET_KEY1) + * + */ + } + + /* "aiohttp/_http_parser.pyx":435 + * raise InvalidHeader(SEC_WEBSOCKET_KEY1) + * + * encoding = None # <<<<<<<<<<<<<< + * enc = self._content_encoding + * if enc is not None: + */ + __Pyx_INCREF(Py_None); + __pyx_v_encoding = Py_None; + + /* "aiohttp/_http_parser.pyx":436 + * + * encoding = None + * enc = self._content_encoding # <<<<<<<<<<<<<< + * if enc is not None: + * self._content_encoding = None + */ + __pyx_t_1 = __pyx_v_self->_content_encoding; + __Pyx_INCREF(__pyx_t_1); + __pyx_v_enc = __pyx_t_1; + __pyx_t_1 = 0; + + /* "aiohttp/_http_parser.pyx":437 + * encoding = None + * enc = self._content_encoding + * if enc is not None: # <<<<<<<<<<<<<< + * self._content_encoding = None + * enc = enc.lower() + */ + __pyx_t_6 = (__pyx_v_enc != Py_None); + __pyx_t_5 = (__pyx_t_6 != 0); + if (__pyx_t_5) { + + /* "aiohttp/_http_parser.pyx":438 + * enc = self._content_encoding + * if enc is not None: + * self._content_encoding = None # <<<<<<<<<<<<<< + * enc = enc.lower() + * if enc in ('gzip', 'deflate', 'br'): + */ + __Pyx_INCREF(Py_None); + __Pyx_GIVEREF(Py_None); + __Pyx_GOTREF(__pyx_v_self->_content_encoding); + __Pyx_DECREF(__pyx_v_self->_content_encoding); + __pyx_v_self->_content_encoding = ((PyObject*)Py_None); + + /* "aiohttp/_http_parser.pyx":439 + * if enc is not None: + * self._content_encoding = None + * enc = enc.lower() # <<<<<<<<<<<<<< + * if enc in ('gzip', 'deflate', 'br'): + * encoding = enc + */ + __pyx_t_3 = __Pyx_PyObject_GetAttrStr(__pyx_v_enc, __pyx_n_s_lower); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 439, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_3); + __pyx_t_4 = NULL; + if (CYTHON_UNPACK_METHODS && likely(PyMethod_Check(__pyx_t_3))) { + __pyx_t_4 = PyMethod_GET_SELF(__pyx_t_3); + if (likely(__pyx_t_4)) { + PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_3); + __Pyx_INCREF(__pyx_t_4); + __Pyx_INCREF(function); + __Pyx_DECREF_SET(__pyx_t_3, function); + } + } + __pyx_t_1 = (__pyx_t_4) ? __Pyx_PyObject_CallOneArg(__pyx_t_3, __pyx_t_4) : __Pyx_PyObject_CallNoArg(__pyx_t_3); + __Pyx_XDECREF(__pyx_t_4); __pyx_t_4 = 0; + if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 439, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; + __Pyx_DECREF_SET(__pyx_v_enc, __pyx_t_1); + __pyx_t_1 = 0; + + /* "aiohttp/_http_parser.pyx":440 + * self._content_encoding = None + * enc = enc.lower() + * if enc in ('gzip', 'deflate', 'br'): # <<<<<<<<<<<<<< + * encoding = enc + * + */ + __Pyx_INCREF(__pyx_v_enc); + __pyx_t_1 = __pyx_v_enc; + __pyx_t_6 = (__Pyx_PyUnicode_Equals(__pyx_t_1, __pyx_n_u_gzip, Py_EQ)); if (unlikely(__pyx_t_6 < 0)) __PYX_ERR(0, 440, __pyx_L1_error) + if (!__pyx_t_6) { + } else { + __pyx_t_5 = __pyx_t_6; + goto __pyx_L9_bool_binop_done; + } + __pyx_t_6 = (__Pyx_PyUnicode_Equals(__pyx_t_1, __pyx_n_u_deflate, Py_EQ)); if (unlikely(__pyx_t_6 < 0)) __PYX_ERR(0, 440, __pyx_L1_error) + if (!__pyx_t_6) { + } else { + __pyx_t_5 = __pyx_t_6; + goto __pyx_L9_bool_binop_done; + } + __pyx_t_6 = (__Pyx_PyUnicode_Equals(__pyx_t_1, __pyx_n_u_br, Py_EQ)); if (unlikely(__pyx_t_6 < 0)) __PYX_ERR(0, 440, __pyx_L1_error) + __pyx_t_5 = __pyx_t_6; + __pyx_L9_bool_binop_done:; + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + __pyx_t_6 = (__pyx_t_5 != 0); + if (__pyx_t_6) { + + /* "aiohttp/_http_parser.pyx":441 + * enc = enc.lower() + * if enc in ('gzip', 'deflate', 'br'): + * encoding = enc # <<<<<<<<<<<<<< + * + * if self._cparser.type == cparser.HTTP_REQUEST: + */ + __Pyx_INCREF(__pyx_v_enc); + __Pyx_DECREF_SET(__pyx_v_encoding, __pyx_v_enc); + + /* "aiohttp/_http_parser.pyx":440 + * self._content_encoding = None + * enc = enc.lower() + * if enc in ('gzip', 'deflate', 'br'): # <<<<<<<<<<<<<< + * encoding = enc + * + */ + } + + /* "aiohttp/_http_parser.pyx":437 + * encoding = None + * enc = self._content_encoding + * if enc is not None: # <<<<<<<<<<<<<< + * self._content_encoding = None + * enc = enc.lower() + */ + } + + /* "aiohttp/_http_parser.pyx":443 + * encoding = enc + * + * if self._cparser.type == cparser.HTTP_REQUEST: # <<<<<<<<<<<<<< + * msg = _new_request_message( + * method, self._path, + */ + __pyx_t_6 = ((__pyx_v_self->_cparser->type == HTTP_REQUEST) != 0); + if (__pyx_t_6) { + + /* "aiohttp/_http_parser.pyx":445 + * if self._cparser.type == cparser.HTTP_REQUEST: + * msg = _new_request_message( + * method, self._path, # <<<<<<<<<<<<<< + * self.http_version(), headers, raw_headers, + * should_close, encoding, upgrade, chunked, self._url) + */ + __pyx_t_1 = __pyx_v_self->_path; + __Pyx_INCREF(__pyx_t_1); + + /* "aiohttp/_http_parser.pyx":446 + * msg = _new_request_message( + * method, self._path, + * self.http_version(), headers, raw_headers, # <<<<<<<<<<<<<< + * should_close, encoding, upgrade, chunked, self._url) + * else: + */ + __pyx_t_3 = __pyx_f_7aiohttp_12_http_parser_10HttpParser_http_version(__pyx_v_self); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 446, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_3); + + /* "aiohttp/_http_parser.pyx":447 + * method, self._path, + * self.http_version(), headers, raw_headers, + * should_close, encoding, upgrade, chunked, self._url) # <<<<<<<<<<<<<< + * else: + * msg = _new_response_message( + */ + __pyx_t_4 = __pyx_v_self->_url; + __Pyx_INCREF(__pyx_t_4); + + /* "aiohttp/_http_parser.pyx":444 + * + * if self._cparser.type == cparser.HTTP_REQUEST: + * msg = _new_request_message( # <<<<<<<<<<<<<< + * method, self._path, + * self.http_version(), headers, raw_headers, + */ + __pyx_t_7 = __pyx_f_7aiohttp_12_http_parser__new_request_message(__pyx_v_method, ((PyObject*)__pyx_t_1), __pyx_t_3, __pyx_v_headers, __pyx_v_raw_headers, __pyx_v_should_close, __pyx_v_encoding, __pyx_v_upgrade, __pyx_v_chunked, __pyx_t_4); if (unlikely(!__pyx_t_7)) __PYX_ERR(0, 444, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_7); + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; + __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; + __pyx_v_msg = __pyx_t_7; + __pyx_t_7 = 0; + + /* "aiohttp/_http_parser.pyx":443 + * encoding = enc + * + * if self._cparser.type == cparser.HTTP_REQUEST: # <<<<<<<<<<<<<< + * msg = _new_request_message( + * method, self._path, + */ + goto __pyx_L12; + } + + /* "aiohttp/_http_parser.pyx":449 + * should_close, encoding, upgrade, chunked, self._url) + * else: + * msg = _new_response_message( # <<<<<<<<<<<<<< + * self.http_version(), self._cparser.status_code, self._reason, + * headers, raw_headers, should_close, encoding, + */ + /*else*/ { + + /* "aiohttp/_http_parser.pyx":450 + * else: + * msg = _new_response_message( + * self.http_version(), self._cparser.status_code, self._reason, # <<<<<<<<<<<<<< + * headers, raw_headers, should_close, encoding, + * upgrade, chunked) + */ + __pyx_t_7 = __pyx_f_7aiohttp_12_http_parser_10HttpParser_http_version(__pyx_v_self); if (unlikely(!__pyx_t_7)) __PYX_ERR(0, 450, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_7); + __pyx_t_4 = __pyx_v_self->_reason; + __Pyx_INCREF(__pyx_t_4); + + /* "aiohttp/_http_parser.pyx":449 + * should_close, encoding, upgrade, chunked, self._url) + * else: + * msg = _new_response_message( # <<<<<<<<<<<<<< + * self.http_version(), self._cparser.status_code, self._reason, + * headers, raw_headers, should_close, encoding, + */ + __pyx_t_3 = __pyx_f_7aiohttp_12_http_parser__new_response_message(__pyx_t_7, __pyx_v_self->_cparser->status_code, ((PyObject*)__pyx_t_4), __pyx_v_headers, __pyx_v_raw_headers, __pyx_v_should_close, __pyx_v_encoding, __pyx_v_upgrade, __pyx_v_chunked); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 449, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_3); + __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0; + __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; + __pyx_v_msg = __pyx_t_3; + __pyx_t_3 = 0; + } + __pyx_L12:; + + /* "aiohttp/_http_parser.pyx":455 + * + * if ( + * ULLONG_MAX > self._cparser.content_length > 0 or chunked or # <<<<<<<<<<<<<< + * self._cparser.method == 5 or # CONNECT: 5 + * (self._cparser.status_code >= 199 and + */ + __pyx_t_5 = (ULLONG_MAX > __pyx_v_self->_cparser->content_length); + if (__pyx_t_5) { + __pyx_t_5 = (__pyx_v_self->_cparser->content_length > 0); + } + __pyx_t_8 = (__pyx_t_5 != 0); + if (!__pyx_t_8) { + } else { + __pyx_t_6 = __pyx_t_8; + goto __pyx_L14_bool_binop_done; + } + __pyx_t_8 = (__pyx_v_chunked != 0); + if (!__pyx_t_8) { + } else { + __pyx_t_6 = __pyx_t_8; + goto __pyx_L14_bool_binop_done; + } + + /* "aiohttp/_http_parser.pyx":456 + * if ( + * ULLONG_MAX > self._cparser.content_length > 0 or chunked or + * self._cparser.method == 5 or # CONNECT: 5 # <<<<<<<<<<<<<< + * (self._cparser.status_code >= 199 and + * self._cparser.content_length == 0 and + */ + __pyx_t_8 = ((__pyx_v_self->_cparser->method == 5) != 0); + if (!__pyx_t_8) { + } else { + __pyx_t_6 = __pyx_t_8; + goto __pyx_L14_bool_binop_done; + } + + /* "aiohttp/_http_parser.pyx":457 + * ULLONG_MAX > self._cparser.content_length > 0 or chunked or + * self._cparser.method == 5 or # CONNECT: 5 + * (self._cparser.status_code >= 199 and # <<<<<<<<<<<<<< + * self._cparser.content_length == 0 and + * self._read_until_eof) + */ + __pyx_t_8 = ((__pyx_v_self->_cparser->status_code >= 0xC7) != 0); + if (__pyx_t_8) { + } else { + __pyx_t_6 = __pyx_t_8; + goto __pyx_L14_bool_binop_done; + } + + /* "aiohttp/_http_parser.pyx":458 + * self._cparser.method == 5 or # CONNECT: 5 + * (self._cparser.status_code >= 199 and + * self._cparser.content_length == 0 and # <<<<<<<<<<<<<< + * self._read_until_eof) + * ): + */ + __pyx_t_8 = ((__pyx_v_self->_cparser->content_length == 0) != 0); + if (__pyx_t_8) { + } else { + __pyx_t_6 = __pyx_t_8; + goto __pyx_L14_bool_binop_done; + } + + /* "aiohttp/_http_parser.pyx":459 + * (self._cparser.status_code >= 199 and + * self._cparser.content_length == 0 and + * self._read_until_eof) # <<<<<<<<<<<<<< + * ): + * payload = StreamReader( + */ + __pyx_t_8 = (__pyx_v_self->_read_until_eof != 0); + __pyx_t_6 = __pyx_t_8; + __pyx_L14_bool_binop_done:; + + /* "aiohttp/_http_parser.pyx":454 + * upgrade, chunked) + * + * if ( # <<<<<<<<<<<<<< + * ULLONG_MAX > self._cparser.content_length > 0 or chunked or + * self._cparser.method == 5 or # CONNECT: 5 + */ + if (__pyx_t_6) { + + /* "aiohttp/_http_parser.pyx":461 + * self._read_until_eof) + * ): + * payload = StreamReader( # <<<<<<<<<<<<<< + * self._protocol, timer=self._timer, loop=self._loop, + * limit=self._limit) + */ + __pyx_t_3 = PyTuple_New(1); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 461, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_3); + __Pyx_INCREF(__pyx_v_self->_protocol); + __Pyx_GIVEREF(__pyx_v_self->_protocol); + PyTuple_SET_ITEM(__pyx_t_3, 0, __pyx_v_self->_protocol); + + /* "aiohttp/_http_parser.pyx":462 + * ): + * payload = StreamReader( + * self._protocol, timer=self._timer, loop=self._loop, # <<<<<<<<<<<<<< + * limit=self._limit) + * else: + */ + __pyx_t_4 = __Pyx_PyDict_NewPresized(3); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 462, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_4); + if (PyDict_SetItem(__pyx_t_4, __pyx_n_s_timer, __pyx_v_self->_timer) < 0) __PYX_ERR(0, 462, __pyx_L1_error) + if (PyDict_SetItem(__pyx_t_4, __pyx_n_s_loop, __pyx_v_self->_loop) < 0) __PYX_ERR(0, 462, __pyx_L1_error) + + /* "aiohttp/_http_parser.pyx":463 + * payload = StreamReader( + * self._protocol, timer=self._timer, loop=self._loop, + * limit=self._limit) # <<<<<<<<<<<<<< + * else: + * payload = EMPTY_PAYLOAD + */ + __pyx_t_7 = __Pyx_PyInt_From_int(__pyx_v_self->_limit); if (unlikely(!__pyx_t_7)) __PYX_ERR(0, 463, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_7); + if (PyDict_SetItem(__pyx_t_4, __pyx_n_s_limit, __pyx_t_7) < 0) __PYX_ERR(0, 462, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0; + + /* "aiohttp/_http_parser.pyx":461 + * self._read_until_eof) + * ): + * payload = StreamReader( # <<<<<<<<<<<<<< + * self._protocol, timer=self._timer, loop=self._loop, + * limit=self._limit) + */ + __pyx_t_7 = __Pyx_PyObject_Call(__pyx_v_7aiohttp_12_http_parser_StreamReader, __pyx_t_3, __pyx_t_4); if (unlikely(!__pyx_t_7)) __PYX_ERR(0, 461, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_7); + __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; + __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; + __pyx_v_payload = __pyx_t_7; + __pyx_t_7 = 0; + + /* "aiohttp/_http_parser.pyx":454 + * upgrade, chunked) + * + * if ( # <<<<<<<<<<<<<< + * ULLONG_MAX > self._cparser.content_length > 0 or chunked or + * self._cparser.method == 5 or # CONNECT: 5 + */ + goto __pyx_L13; + } + + /* "aiohttp/_http_parser.pyx":465 + * limit=self._limit) + * else: + * payload = EMPTY_PAYLOAD # <<<<<<<<<<<<<< + * + * self._payload = payload + */ + /*else*/ { + __Pyx_INCREF(__pyx_v_7aiohttp_12_http_parser_EMPTY_PAYLOAD); + __pyx_v_payload = __pyx_v_7aiohttp_12_http_parser_EMPTY_PAYLOAD; + } + __pyx_L13:; + + /* "aiohttp/_http_parser.pyx":467 + * payload = EMPTY_PAYLOAD + * + * self._payload = payload # <<<<<<<<<<<<<< + * if encoding is not None and self._auto_decompress: + * self._payload = DeflateBuffer(payload, encoding) + */ + __Pyx_INCREF(__pyx_v_payload); + __Pyx_GIVEREF(__pyx_v_payload); + __Pyx_GOTREF(__pyx_v_self->_payload); + __Pyx_DECREF(__pyx_v_self->_payload); + __pyx_v_self->_payload = __pyx_v_payload; + + /* "aiohttp/_http_parser.pyx":468 + * + * self._payload = payload + * if encoding is not None and self._auto_decompress: # <<<<<<<<<<<<<< + * self._payload = DeflateBuffer(payload, encoding) + * + */ + __pyx_t_8 = (__pyx_v_encoding != Py_None); + __pyx_t_5 = (__pyx_t_8 != 0); + if (__pyx_t_5) { + } else { + __pyx_t_6 = __pyx_t_5; + goto __pyx_L21_bool_binop_done; + } + __pyx_t_5 = (__pyx_v_self->_auto_decompress != 0); + __pyx_t_6 = __pyx_t_5; + __pyx_L21_bool_binop_done:; + if (__pyx_t_6) { + + /* "aiohttp/_http_parser.pyx":469 + * self._payload = payload + * if encoding is not None and self._auto_decompress: + * self._payload = DeflateBuffer(payload, encoding) # <<<<<<<<<<<<<< + * + * if not self._response_with_body: + */ + __Pyx_INCREF(__pyx_v_7aiohttp_12_http_parser_DeflateBuffer); + __pyx_t_4 = __pyx_v_7aiohttp_12_http_parser_DeflateBuffer; __pyx_t_3 = NULL; + __pyx_t_9 = 0; + if (CYTHON_UNPACK_METHODS && unlikely(PyMethod_Check(__pyx_t_4))) { + __pyx_t_3 = PyMethod_GET_SELF(__pyx_t_4); + if (likely(__pyx_t_3)) { + PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_4); + __Pyx_INCREF(__pyx_t_3); + __Pyx_INCREF(function); + __Pyx_DECREF_SET(__pyx_t_4, function); + __pyx_t_9 = 1; + } + } + #if CYTHON_FAST_PYCALL + if (PyFunction_Check(__pyx_t_4)) { + PyObject *__pyx_temp[3] = {__pyx_t_3, __pyx_v_payload, __pyx_v_encoding}; + __pyx_t_7 = __Pyx_PyFunction_FastCall(__pyx_t_4, __pyx_temp+1-__pyx_t_9, 2+__pyx_t_9); if (unlikely(!__pyx_t_7)) __PYX_ERR(0, 469, __pyx_L1_error) + __Pyx_XDECREF(__pyx_t_3); __pyx_t_3 = 0; + __Pyx_GOTREF(__pyx_t_7); + } else + #endif + #if CYTHON_FAST_PYCCALL + if (__Pyx_PyFastCFunction_Check(__pyx_t_4)) { + PyObject *__pyx_temp[3] = {__pyx_t_3, __pyx_v_payload, __pyx_v_encoding}; + __pyx_t_7 = __Pyx_PyCFunction_FastCall(__pyx_t_4, __pyx_temp+1-__pyx_t_9, 2+__pyx_t_9); if (unlikely(!__pyx_t_7)) __PYX_ERR(0, 469, __pyx_L1_error) + __Pyx_XDECREF(__pyx_t_3); __pyx_t_3 = 0; + __Pyx_GOTREF(__pyx_t_7); + } else + #endif + { + __pyx_t_1 = PyTuple_New(2+__pyx_t_9); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 469, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + if (__pyx_t_3) { + __Pyx_GIVEREF(__pyx_t_3); PyTuple_SET_ITEM(__pyx_t_1, 0, __pyx_t_3); __pyx_t_3 = NULL; + } + __Pyx_INCREF(__pyx_v_payload); + __Pyx_GIVEREF(__pyx_v_payload); + PyTuple_SET_ITEM(__pyx_t_1, 0+__pyx_t_9, __pyx_v_payload); + __Pyx_INCREF(__pyx_v_encoding); + __Pyx_GIVEREF(__pyx_v_encoding); + PyTuple_SET_ITEM(__pyx_t_1, 1+__pyx_t_9, __pyx_v_encoding); + __pyx_t_7 = __Pyx_PyObject_Call(__pyx_t_4, __pyx_t_1, NULL); if (unlikely(!__pyx_t_7)) __PYX_ERR(0, 469, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_7); + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + } + __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; + __Pyx_GIVEREF(__pyx_t_7); + __Pyx_GOTREF(__pyx_v_self->_payload); + __Pyx_DECREF(__pyx_v_self->_payload); + __pyx_v_self->_payload = __pyx_t_7; + __pyx_t_7 = 0; + + /* "aiohttp/_http_parser.pyx":468 + * + * self._payload = payload + * if encoding is not None and self._auto_decompress: # <<<<<<<<<<<<<< + * self._payload = DeflateBuffer(payload, encoding) + * + */ + } + + /* "aiohttp/_http_parser.pyx":471 + * self._payload = DeflateBuffer(payload, encoding) + * + * if not self._response_with_body: # <<<<<<<<<<<<<< + * payload = EMPTY_PAYLOAD + * + */ + __pyx_t_6 = ((!(__pyx_v_self->_response_with_body != 0)) != 0); + if (__pyx_t_6) { + + /* "aiohttp/_http_parser.pyx":472 + * + * if not self._response_with_body: + * payload = EMPTY_PAYLOAD # <<<<<<<<<<<<<< + * + * self._messages.append((msg, payload)) + */ + __Pyx_INCREF(__pyx_v_7aiohttp_12_http_parser_EMPTY_PAYLOAD); + __Pyx_DECREF_SET(__pyx_v_payload, __pyx_v_7aiohttp_12_http_parser_EMPTY_PAYLOAD); + + /* "aiohttp/_http_parser.pyx":471 + * self._payload = DeflateBuffer(payload, encoding) + * + * if not self._response_with_body: # <<<<<<<<<<<<<< + * payload = EMPTY_PAYLOAD + * + */ + } + + /* "aiohttp/_http_parser.pyx":474 + * payload = EMPTY_PAYLOAD + * + * self._messages.append((msg, payload)) # <<<<<<<<<<<<<< + * + * cdef _on_message_complete(self): + */ + if (unlikely(__pyx_v_self->_messages == Py_None)) { + PyErr_Format(PyExc_AttributeError, "'NoneType' object has no attribute '%.30s'", "append"); + __PYX_ERR(0, 474, __pyx_L1_error) + } + __pyx_t_7 = PyTuple_New(2); if (unlikely(!__pyx_t_7)) __PYX_ERR(0, 474, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_7); + __Pyx_INCREF(__pyx_v_msg); + __Pyx_GIVEREF(__pyx_v_msg); + PyTuple_SET_ITEM(__pyx_t_7, 0, __pyx_v_msg); + __Pyx_INCREF(__pyx_v_payload); + __Pyx_GIVEREF(__pyx_v_payload); + PyTuple_SET_ITEM(__pyx_t_7, 1, __pyx_v_payload); + __pyx_t_10 = __Pyx_PyList_Append(__pyx_v_self->_messages, __pyx_t_7); if (unlikely(__pyx_t_10 == ((int)-1))) __PYX_ERR(0, 474, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0; + + /* "aiohttp/_http_parser.pyx":417 + * self._has_value = True + * + * cdef _on_headers_complete(self): # <<<<<<<<<<<<<< + * self._process_header() + * + */ + + /* function exit code */ + __pyx_r = Py_None; __Pyx_INCREF(Py_None); + goto __pyx_L0; + __pyx_L1_error:; + __Pyx_XDECREF(__pyx_t_1); + __Pyx_XDECREF(__pyx_t_3); + __Pyx_XDECREF(__pyx_t_4); + __Pyx_XDECREF(__pyx_t_7); + __Pyx_AddTraceback("aiohttp._http_parser.HttpParser._on_headers_complete", __pyx_clineno, __pyx_lineno, __pyx_filename); + __pyx_r = 0; + __pyx_L0:; + __Pyx_XDECREF(__pyx_v_method); + __Pyx_XDECREF(__pyx_v_raw_headers); + __Pyx_XDECREF(__pyx_v_headers); + __Pyx_XDECREF(__pyx_v_encoding); + __Pyx_XDECREF(__pyx_v_enc); + __Pyx_XDECREF(__pyx_v_msg); + __Pyx_XDECREF(__pyx_v_payload); + __Pyx_XGIVEREF(__pyx_r); + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +/* "aiohttp/_http_parser.pyx":476 + * self._messages.append((msg, payload)) + * + * cdef _on_message_complete(self): # <<<<<<<<<<<<<< + * self._payload.feed_eof() + * self._payload = None + */ + +static PyObject *__pyx_f_7aiohttp_12_http_parser_10HttpParser__on_message_complete(struct __pyx_obj_7aiohttp_12_http_parser_HttpParser *__pyx_v_self) { + PyObject *__pyx_r = NULL; + __Pyx_RefNannyDeclarations + PyObject *__pyx_t_1 = NULL; + PyObject *__pyx_t_2 = NULL; + PyObject *__pyx_t_3 = NULL; + int __pyx_lineno = 0; + const char *__pyx_filename = NULL; + int __pyx_clineno = 0; + __Pyx_RefNannySetupContext("_on_message_complete", 0); + + /* "aiohttp/_http_parser.pyx":477 + * + * cdef _on_message_complete(self): + * self._payload.feed_eof() # <<<<<<<<<<<<<< + * self._payload = None + * + */ + __pyx_t_2 = __Pyx_PyObject_GetAttrStr(__pyx_v_self->_payload, __pyx_n_s_feed_eof); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 477, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_2); + __pyx_t_3 = NULL; + if (CYTHON_UNPACK_METHODS && likely(PyMethod_Check(__pyx_t_2))) { + __pyx_t_3 = PyMethod_GET_SELF(__pyx_t_2); + if (likely(__pyx_t_3)) { + PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_2); + __Pyx_INCREF(__pyx_t_3); + __Pyx_INCREF(function); + __Pyx_DECREF_SET(__pyx_t_2, function); + } + } + __pyx_t_1 = (__pyx_t_3) ? __Pyx_PyObject_CallOneArg(__pyx_t_2, __pyx_t_3) : __Pyx_PyObject_CallNoArg(__pyx_t_2); + __Pyx_XDECREF(__pyx_t_3); __pyx_t_3 = 0; + if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 477, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + + /* "aiohttp/_http_parser.pyx":478 + * cdef _on_message_complete(self): + * self._payload.feed_eof() + * self._payload = None # <<<<<<<<<<<<<< + * + * cdef _on_chunk_header(self): + */ + __Pyx_INCREF(Py_None); + __Pyx_GIVEREF(Py_None); + __Pyx_GOTREF(__pyx_v_self->_payload); + __Pyx_DECREF(__pyx_v_self->_payload); + __pyx_v_self->_payload = Py_None; + + /* "aiohttp/_http_parser.pyx":476 + * self._messages.append((msg, payload)) + * + * cdef _on_message_complete(self): # <<<<<<<<<<<<<< + * self._payload.feed_eof() + * self._payload = None + */ + + /* function exit code */ + __pyx_r = Py_None; __Pyx_INCREF(Py_None); + goto __pyx_L0; + __pyx_L1_error:; + __Pyx_XDECREF(__pyx_t_1); + __Pyx_XDECREF(__pyx_t_2); + __Pyx_XDECREF(__pyx_t_3); + __Pyx_AddTraceback("aiohttp._http_parser.HttpParser._on_message_complete", __pyx_clineno, __pyx_lineno, __pyx_filename); + __pyx_r = 0; + __pyx_L0:; + __Pyx_XGIVEREF(__pyx_r); + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +/* "aiohttp/_http_parser.pyx":480 + * self._payload = None + * + * cdef _on_chunk_header(self): # <<<<<<<<<<<<<< + * self._payload.begin_http_chunk_receiving() + * + */ + +static PyObject *__pyx_f_7aiohttp_12_http_parser_10HttpParser__on_chunk_header(struct __pyx_obj_7aiohttp_12_http_parser_HttpParser *__pyx_v_self) { + PyObject *__pyx_r = NULL; + __Pyx_RefNannyDeclarations + PyObject *__pyx_t_1 = NULL; + PyObject *__pyx_t_2 = NULL; + PyObject *__pyx_t_3 = NULL; + int __pyx_lineno = 0; + const char *__pyx_filename = NULL; + int __pyx_clineno = 0; + __Pyx_RefNannySetupContext("_on_chunk_header", 0); + + /* "aiohttp/_http_parser.pyx":481 + * + * cdef _on_chunk_header(self): + * self._payload.begin_http_chunk_receiving() # <<<<<<<<<<<<<< + * + * cdef _on_chunk_complete(self): + */ + __pyx_t_2 = __Pyx_PyObject_GetAttrStr(__pyx_v_self->_payload, __pyx_n_s_begin_http_chunk_receiving); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 481, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_2); + __pyx_t_3 = NULL; + if (CYTHON_UNPACK_METHODS && likely(PyMethod_Check(__pyx_t_2))) { + __pyx_t_3 = PyMethod_GET_SELF(__pyx_t_2); + if (likely(__pyx_t_3)) { + PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_2); + __Pyx_INCREF(__pyx_t_3); + __Pyx_INCREF(function); + __Pyx_DECREF_SET(__pyx_t_2, function); + } + } + __pyx_t_1 = (__pyx_t_3) ? __Pyx_PyObject_CallOneArg(__pyx_t_2, __pyx_t_3) : __Pyx_PyObject_CallNoArg(__pyx_t_2); + __Pyx_XDECREF(__pyx_t_3); __pyx_t_3 = 0; + if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 481, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + + /* "aiohttp/_http_parser.pyx":480 + * self._payload = None + * + * cdef _on_chunk_header(self): # <<<<<<<<<<<<<< + * self._payload.begin_http_chunk_receiving() + * + */ + + /* function exit code */ + __pyx_r = Py_None; __Pyx_INCREF(Py_None); + goto __pyx_L0; + __pyx_L1_error:; + __Pyx_XDECREF(__pyx_t_1); + __Pyx_XDECREF(__pyx_t_2); + __Pyx_XDECREF(__pyx_t_3); + __Pyx_AddTraceback("aiohttp._http_parser.HttpParser._on_chunk_header", __pyx_clineno, __pyx_lineno, __pyx_filename); + __pyx_r = 0; + __pyx_L0:; + __Pyx_XGIVEREF(__pyx_r); + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +/* "aiohttp/_http_parser.pyx":483 + * self._payload.begin_http_chunk_receiving() + * + * cdef _on_chunk_complete(self): # <<<<<<<<<<<<<< + * self._payload.end_http_chunk_receiving() + * + */ + +static PyObject *__pyx_f_7aiohttp_12_http_parser_10HttpParser__on_chunk_complete(struct __pyx_obj_7aiohttp_12_http_parser_HttpParser *__pyx_v_self) { + PyObject *__pyx_r = NULL; + __Pyx_RefNannyDeclarations + PyObject *__pyx_t_1 = NULL; + PyObject *__pyx_t_2 = NULL; + PyObject *__pyx_t_3 = NULL; + int __pyx_lineno = 0; + const char *__pyx_filename = NULL; + int __pyx_clineno = 0; + __Pyx_RefNannySetupContext("_on_chunk_complete", 0); + + /* "aiohttp/_http_parser.pyx":484 + * + * cdef _on_chunk_complete(self): + * self._payload.end_http_chunk_receiving() # <<<<<<<<<<<<<< + * + * cdef object _on_status_complete(self): + */ + __pyx_t_2 = __Pyx_PyObject_GetAttrStr(__pyx_v_self->_payload, __pyx_n_s_end_http_chunk_receiving); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 484, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_2); + __pyx_t_3 = NULL; + if (CYTHON_UNPACK_METHODS && likely(PyMethod_Check(__pyx_t_2))) { + __pyx_t_3 = PyMethod_GET_SELF(__pyx_t_2); + if (likely(__pyx_t_3)) { + PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_2); + __Pyx_INCREF(__pyx_t_3); + __Pyx_INCREF(function); + __Pyx_DECREF_SET(__pyx_t_2, function); + } + } + __pyx_t_1 = (__pyx_t_3) ? __Pyx_PyObject_CallOneArg(__pyx_t_2, __pyx_t_3) : __Pyx_PyObject_CallNoArg(__pyx_t_2); + __Pyx_XDECREF(__pyx_t_3); __pyx_t_3 = 0; + if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 484, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + + /* "aiohttp/_http_parser.pyx":483 + * self._payload.begin_http_chunk_receiving() + * + * cdef _on_chunk_complete(self): # <<<<<<<<<<<<<< + * self._payload.end_http_chunk_receiving() + * + */ + + /* function exit code */ + __pyx_r = Py_None; __Pyx_INCREF(Py_None); + goto __pyx_L0; + __pyx_L1_error:; + __Pyx_XDECREF(__pyx_t_1); + __Pyx_XDECREF(__pyx_t_2); + __Pyx_XDECREF(__pyx_t_3); + __Pyx_AddTraceback("aiohttp._http_parser.HttpParser._on_chunk_complete", __pyx_clineno, __pyx_lineno, __pyx_filename); + __pyx_r = 0; + __pyx_L0:; + __Pyx_XGIVEREF(__pyx_r); + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +/* "aiohttp/_http_parser.pyx":486 + * self._payload.end_http_chunk_receiving() + * + * cdef object _on_status_complete(self): # <<<<<<<<<<<<<< + * pass + * + */ + +static PyObject *__pyx_f_7aiohttp_12_http_parser_10HttpParser__on_status_complete(CYTHON_UNUSED struct __pyx_obj_7aiohttp_12_http_parser_HttpParser *__pyx_v_self) { + PyObject *__pyx_r = NULL; + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("_on_status_complete", 0); + + /* function exit code */ + __pyx_r = Py_None; __Pyx_INCREF(Py_None); + __Pyx_XGIVEREF(__pyx_r); + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +/* "aiohttp/_http_parser.pyx":489 + * pass + * + * cdef inline http_version(self): # <<<<<<<<<<<<<< + * cdef cparser.llhttp_t* parser = self._cparser + * + */ + +static CYTHON_INLINE PyObject *__pyx_f_7aiohttp_12_http_parser_10HttpParser_http_version(struct __pyx_obj_7aiohttp_12_http_parser_HttpParser *__pyx_v_self) { + llhttp_t *__pyx_v_parser; + PyObject *__pyx_r = NULL; + __Pyx_RefNannyDeclarations + llhttp_t *__pyx_t_1; + int __pyx_t_2; + PyObject *__pyx_t_3 = NULL; + PyObject *__pyx_t_4 = NULL; + PyObject *__pyx_t_5 = NULL; + PyObject *__pyx_t_6 = NULL; + PyObject *__pyx_t_7 = NULL; + int __pyx_t_8; + PyObject *__pyx_t_9 = NULL; + int __pyx_lineno = 0; + const char *__pyx_filename = NULL; + int __pyx_clineno = 0; + __Pyx_RefNannySetupContext("http_version", 0); + + /* "aiohttp/_http_parser.pyx":490 + * + * cdef inline http_version(self): + * cdef cparser.llhttp_t* parser = self._cparser # <<<<<<<<<<<<<< + * + * if parser.http_major == 1: + */ + __pyx_t_1 = __pyx_v_self->_cparser; + __pyx_v_parser = __pyx_t_1; + + /* "aiohttp/_http_parser.pyx":492 + * cdef cparser.llhttp_t* parser = self._cparser + * + * if parser.http_major == 1: # <<<<<<<<<<<<<< + * if parser.http_minor == 0: + * return HttpVersion10 + */ + __pyx_t_2 = ((__pyx_v_parser->http_major == 1) != 0); + if (__pyx_t_2) { + + /* "aiohttp/_http_parser.pyx":493 + * + * if parser.http_major == 1: + * if parser.http_minor == 0: # <<<<<<<<<<<<<< + * return HttpVersion10 + * elif parser.http_minor == 1: + */ + switch (__pyx_v_parser->http_minor) { + case 0: + + /* "aiohttp/_http_parser.pyx":494 + * if parser.http_major == 1: + * if parser.http_minor == 0: + * return HttpVersion10 # <<<<<<<<<<<<<< + * elif parser.http_minor == 1: + * return HttpVersion11 + */ + __Pyx_XDECREF(__pyx_r); + __Pyx_INCREF(__pyx_v_7aiohttp_12_http_parser_HttpVersion10); + __pyx_r = __pyx_v_7aiohttp_12_http_parser_HttpVersion10; + goto __pyx_L0; + + /* "aiohttp/_http_parser.pyx":493 + * + * if parser.http_major == 1: + * if parser.http_minor == 0: # <<<<<<<<<<<<<< + * return HttpVersion10 + * elif parser.http_minor == 1: + */ + break; + case 1: + + /* "aiohttp/_http_parser.pyx":496 + * return HttpVersion10 + * elif parser.http_minor == 1: + * return HttpVersion11 # <<<<<<<<<<<<<< + * + * return HttpVersion(parser.http_major, parser.http_minor) + */ + __Pyx_XDECREF(__pyx_r); + __Pyx_INCREF(__pyx_v_7aiohttp_12_http_parser_HttpVersion11); + __pyx_r = __pyx_v_7aiohttp_12_http_parser_HttpVersion11; + goto __pyx_L0; + + /* "aiohttp/_http_parser.pyx":495 + * if parser.http_minor == 0: + * return HttpVersion10 + * elif parser.http_minor == 1: # <<<<<<<<<<<<<< + * return HttpVersion11 + * + */ + break; + default: break; + } + + /* "aiohttp/_http_parser.pyx":492 + * cdef cparser.llhttp_t* parser = self._cparser + * + * if parser.http_major == 1: # <<<<<<<<<<<<<< + * if parser.http_minor == 0: + * return HttpVersion10 + */ + } + + /* "aiohttp/_http_parser.pyx":498 + * return HttpVersion11 + * + * return HttpVersion(parser.http_major, parser.http_minor) # <<<<<<<<<<<<<< + * + * ### Public API ### + */ + __Pyx_XDECREF(__pyx_r); + __pyx_t_4 = __Pyx_PyInt_From_uint8_t(__pyx_v_parser->http_major); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 498, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_4); + __pyx_t_5 = __Pyx_PyInt_From_uint8_t(__pyx_v_parser->http_minor); if (unlikely(!__pyx_t_5)) __PYX_ERR(0, 498, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_5); + __Pyx_INCREF(__pyx_v_7aiohttp_12_http_parser_HttpVersion); + __pyx_t_6 = __pyx_v_7aiohttp_12_http_parser_HttpVersion; __pyx_t_7 = NULL; + __pyx_t_8 = 0; + if (CYTHON_UNPACK_METHODS && unlikely(PyMethod_Check(__pyx_t_6))) { + __pyx_t_7 = PyMethod_GET_SELF(__pyx_t_6); + if (likely(__pyx_t_7)) { + PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_6); + __Pyx_INCREF(__pyx_t_7); + __Pyx_INCREF(function); + __Pyx_DECREF_SET(__pyx_t_6, function); + __pyx_t_8 = 1; + } + } + #if CYTHON_FAST_PYCALL + if (PyFunction_Check(__pyx_t_6)) { + PyObject *__pyx_temp[3] = {__pyx_t_7, __pyx_t_4, __pyx_t_5}; + __pyx_t_3 = __Pyx_PyFunction_FastCall(__pyx_t_6, __pyx_temp+1-__pyx_t_8, 2+__pyx_t_8); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 498, __pyx_L1_error) + __Pyx_XDECREF(__pyx_t_7); __pyx_t_7 = 0; + __Pyx_GOTREF(__pyx_t_3); + __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; + __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0; + } else + #endif + #if CYTHON_FAST_PYCCALL + if (__Pyx_PyFastCFunction_Check(__pyx_t_6)) { + PyObject *__pyx_temp[3] = {__pyx_t_7, __pyx_t_4, __pyx_t_5}; + __pyx_t_3 = __Pyx_PyCFunction_FastCall(__pyx_t_6, __pyx_temp+1-__pyx_t_8, 2+__pyx_t_8); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 498, __pyx_L1_error) + __Pyx_XDECREF(__pyx_t_7); __pyx_t_7 = 0; + __Pyx_GOTREF(__pyx_t_3); + __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; + __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0; + } else + #endif + { + __pyx_t_9 = PyTuple_New(2+__pyx_t_8); if (unlikely(!__pyx_t_9)) __PYX_ERR(0, 498, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_9); + if (__pyx_t_7) { + __Pyx_GIVEREF(__pyx_t_7); PyTuple_SET_ITEM(__pyx_t_9, 0, __pyx_t_7); __pyx_t_7 = NULL; + } + __Pyx_GIVEREF(__pyx_t_4); + PyTuple_SET_ITEM(__pyx_t_9, 0+__pyx_t_8, __pyx_t_4); + __Pyx_GIVEREF(__pyx_t_5); + PyTuple_SET_ITEM(__pyx_t_9, 1+__pyx_t_8, __pyx_t_5); + __pyx_t_4 = 0; + __pyx_t_5 = 0; + __pyx_t_3 = __Pyx_PyObject_Call(__pyx_t_6, __pyx_t_9, NULL); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 498, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_3); + __Pyx_DECREF(__pyx_t_9); __pyx_t_9 = 0; + } + __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0; + __pyx_r = __pyx_t_3; + __pyx_t_3 = 0; + goto __pyx_L0; + + /* "aiohttp/_http_parser.pyx":489 + * pass + * + * cdef inline http_version(self): # <<<<<<<<<<<<<< + * cdef cparser.llhttp_t* parser = self._cparser + * + */ + + /* function exit code */ + __pyx_L1_error:; + __Pyx_XDECREF(__pyx_t_3); + __Pyx_XDECREF(__pyx_t_4); + __Pyx_XDECREF(__pyx_t_5); + __Pyx_XDECREF(__pyx_t_6); + __Pyx_XDECREF(__pyx_t_7); + __Pyx_XDECREF(__pyx_t_9); + __Pyx_AddTraceback("aiohttp._http_parser.HttpParser.http_version", __pyx_clineno, __pyx_lineno, __pyx_filename); + __pyx_r = 0; + __pyx_L0:; + __Pyx_XGIVEREF(__pyx_r); + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +/* "aiohttp/_http_parser.pyx":502 + * ### Public API ### + * + * def feed_eof(self): # <<<<<<<<<<<<<< + * cdef bytes desc + * + */ + +/* Python wrapper */ +static PyObject *__pyx_pw_7aiohttp_12_http_parser_10HttpParser_5feed_eof(PyObject *__pyx_v_self, CYTHON_UNUSED PyObject *unused); /*proto*/ +static PyObject *__pyx_pw_7aiohttp_12_http_parser_10HttpParser_5feed_eof(PyObject *__pyx_v_self, CYTHON_UNUSED PyObject *unused) { + PyObject *__pyx_r = 0; + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("feed_eof (wrapper)", 0); + __pyx_r = __pyx_pf_7aiohttp_12_http_parser_10HttpParser_4feed_eof(((struct __pyx_obj_7aiohttp_12_http_parser_HttpParser *)__pyx_v_self)); + + /* function exit code */ + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +static PyObject *__pyx_pf_7aiohttp_12_http_parser_10HttpParser_4feed_eof(struct __pyx_obj_7aiohttp_12_http_parser_HttpParser *__pyx_v_self) { + PyObject *__pyx_v_desc = 0; + PyObject *__pyx_r = NULL; + __Pyx_RefNannyDeclarations + int __pyx_t_1; + int __pyx_t_2; + PyObject *__pyx_t_3 = NULL; + PyObject *__pyx_t_4 = NULL; + PyObject *__pyx_t_5 = NULL; + PyObject *__pyx_t_6 = NULL; + int __pyx_lineno = 0; + const char *__pyx_filename = NULL; + int __pyx_clineno = 0; + __Pyx_RefNannySetupContext("feed_eof", 0); + + /* "aiohttp/_http_parser.pyx":505 + * cdef bytes desc + * + * if self._payload is not None: # <<<<<<<<<<<<<< + * if self._cparser.flags & cparser.F_CHUNKED: + * raise TransferEncodingError( + */ + __pyx_t_1 = (__pyx_v_self->_payload != Py_None); + __pyx_t_2 = (__pyx_t_1 != 0); + if (__pyx_t_2) { + + /* "aiohttp/_http_parser.pyx":506 + * + * if self._payload is not None: + * if self._cparser.flags & cparser.F_CHUNKED: # <<<<<<<<<<<<<< + * raise TransferEncodingError( + * "Not enough data for satisfy transfer length header.") + */ + __pyx_t_2 = ((__pyx_v_self->_cparser->flags & F_CHUNKED) != 0); + if (unlikely(__pyx_t_2)) { + + /* "aiohttp/_http_parser.pyx":507 + * if self._payload is not None: + * if self._cparser.flags & cparser.F_CHUNKED: + * raise TransferEncodingError( # <<<<<<<<<<<<<< + * "Not enough data for satisfy transfer length header.") + * elif self._cparser.flags & cparser.F_CONTENT_LENGTH: + */ + __Pyx_GetModuleGlobalName(__pyx_t_4, __pyx_n_s_TransferEncodingError); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 507, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_4); + __pyx_t_5 = NULL; + if (CYTHON_UNPACK_METHODS && unlikely(PyMethod_Check(__pyx_t_4))) { + __pyx_t_5 = PyMethod_GET_SELF(__pyx_t_4); + if (likely(__pyx_t_5)) { + PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_4); + __Pyx_INCREF(__pyx_t_5); + __Pyx_INCREF(function); + __Pyx_DECREF_SET(__pyx_t_4, function); + } + } + __pyx_t_3 = (__pyx_t_5) ? __Pyx_PyObject_Call2Args(__pyx_t_4, __pyx_t_5, __pyx_kp_u_Not_enough_data_for_satisfy_tran) : __Pyx_PyObject_CallOneArg(__pyx_t_4, __pyx_kp_u_Not_enough_data_for_satisfy_tran); + __Pyx_XDECREF(__pyx_t_5); __pyx_t_5 = 0; + if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 507, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_3); + __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; + __Pyx_Raise(__pyx_t_3, 0, 0, 0); + __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; + __PYX_ERR(0, 507, __pyx_L1_error) + + /* "aiohttp/_http_parser.pyx":506 + * + * if self._payload is not None: + * if self._cparser.flags & cparser.F_CHUNKED: # <<<<<<<<<<<<<< + * raise TransferEncodingError( + * "Not enough data for satisfy transfer length header.") + */ + } + + /* "aiohttp/_http_parser.pyx":509 + * raise TransferEncodingError( + * "Not enough data for satisfy transfer length header.") + * elif self._cparser.flags & cparser.F_CONTENT_LENGTH: # <<<<<<<<<<<<<< + * raise ContentLengthError( + * "Not enough data for satisfy content length header.") + */ + __pyx_t_2 = ((__pyx_v_self->_cparser->flags & F_CONTENT_LENGTH) != 0); + if (unlikely(__pyx_t_2)) { + + /* "aiohttp/_http_parser.pyx":510 + * "Not enough data for satisfy transfer length header.") + * elif self._cparser.flags & cparser.F_CONTENT_LENGTH: + * raise ContentLengthError( # <<<<<<<<<<<<<< + * "Not enough data for satisfy content length header.") + * elif cparser.llhttp_get_errno(self._cparser) != cparser.HPE_OK: + */ + __Pyx_GetModuleGlobalName(__pyx_t_4, __pyx_n_s_ContentLengthError); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 510, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_4); + __pyx_t_5 = NULL; + if (CYTHON_UNPACK_METHODS && unlikely(PyMethod_Check(__pyx_t_4))) { + __pyx_t_5 = PyMethod_GET_SELF(__pyx_t_4); + if (likely(__pyx_t_5)) { + PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_4); + __Pyx_INCREF(__pyx_t_5); + __Pyx_INCREF(function); + __Pyx_DECREF_SET(__pyx_t_4, function); + } + } + __pyx_t_3 = (__pyx_t_5) ? __Pyx_PyObject_Call2Args(__pyx_t_4, __pyx_t_5, __pyx_kp_u_Not_enough_data_for_satisfy_cont) : __Pyx_PyObject_CallOneArg(__pyx_t_4, __pyx_kp_u_Not_enough_data_for_satisfy_cont); + __Pyx_XDECREF(__pyx_t_5); __pyx_t_5 = 0; + if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 510, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_3); + __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; + __Pyx_Raise(__pyx_t_3, 0, 0, 0); + __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; + __PYX_ERR(0, 510, __pyx_L1_error) + + /* "aiohttp/_http_parser.pyx":509 + * raise TransferEncodingError( + * "Not enough data for satisfy transfer length header.") + * elif self._cparser.flags & cparser.F_CONTENT_LENGTH: # <<<<<<<<<<<<<< + * raise ContentLengthError( + * "Not enough data for satisfy content length header.") + */ + } + + /* "aiohttp/_http_parser.pyx":512 + * raise ContentLengthError( + * "Not enough data for satisfy content length header.") + * elif cparser.llhttp_get_errno(self._cparser) != cparser.HPE_OK: # <<<<<<<<<<<<<< + * desc = cparser.llhttp_get_error_reason(self._cparser) + * raise PayloadEncodingError(desc.decode('latin-1')) + */ + __pyx_t_2 = ((llhttp_get_errno(__pyx_v_self->_cparser) != HPE_OK) != 0); + if (unlikely(__pyx_t_2)) { + + /* "aiohttp/_http_parser.pyx":513 + * "Not enough data for satisfy content length header.") + * elif cparser.llhttp_get_errno(self._cparser) != cparser.HPE_OK: + * desc = cparser.llhttp_get_error_reason(self._cparser) # <<<<<<<<<<<<<< + * raise PayloadEncodingError(desc.decode('latin-1')) + * else: + */ + __pyx_t_3 = __Pyx_PyBytes_FromString(llhttp_get_error_reason(__pyx_v_self->_cparser)); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 513, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_3); + __pyx_v_desc = ((PyObject*)__pyx_t_3); + __pyx_t_3 = 0; + + /* "aiohttp/_http_parser.pyx":514 + * elif cparser.llhttp_get_errno(self._cparser) != cparser.HPE_OK: + * desc = cparser.llhttp_get_error_reason(self._cparser) + * raise PayloadEncodingError(desc.decode('latin-1')) # <<<<<<<<<<<<<< + * else: + * self._payload.feed_eof() + */ + __Pyx_GetModuleGlobalName(__pyx_t_4, __pyx_n_s_PayloadEncodingError); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 514, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_4); + __pyx_t_5 = __Pyx_decode_bytes(__pyx_v_desc, 0, PY_SSIZE_T_MAX, NULL, NULL, PyUnicode_DecodeLatin1); if (unlikely(!__pyx_t_5)) __PYX_ERR(0, 514, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_5); + __pyx_t_6 = NULL; + if (CYTHON_UNPACK_METHODS && unlikely(PyMethod_Check(__pyx_t_4))) { + __pyx_t_6 = PyMethod_GET_SELF(__pyx_t_4); + if (likely(__pyx_t_6)) { + PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_4); + __Pyx_INCREF(__pyx_t_6); + __Pyx_INCREF(function); + __Pyx_DECREF_SET(__pyx_t_4, function); + } + } + __pyx_t_3 = (__pyx_t_6) ? __Pyx_PyObject_Call2Args(__pyx_t_4, __pyx_t_6, __pyx_t_5) : __Pyx_PyObject_CallOneArg(__pyx_t_4, __pyx_t_5); + __Pyx_XDECREF(__pyx_t_6); __pyx_t_6 = 0; + __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0; + if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 514, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_3); + __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; + __Pyx_Raise(__pyx_t_3, 0, 0, 0); + __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; + __PYX_ERR(0, 514, __pyx_L1_error) + + /* "aiohttp/_http_parser.pyx":512 + * raise ContentLengthError( + * "Not enough data for satisfy content length header.") + * elif cparser.llhttp_get_errno(self._cparser) != cparser.HPE_OK: # <<<<<<<<<<<<<< + * desc = cparser.llhttp_get_error_reason(self._cparser) + * raise PayloadEncodingError(desc.decode('latin-1')) + */ + } + + /* "aiohttp/_http_parser.pyx":516 + * raise PayloadEncodingError(desc.decode('latin-1')) + * else: + * self._payload.feed_eof() # <<<<<<<<<<<<<< + * elif self._started: + * self._on_headers_complete() + */ + /*else*/ { + __pyx_t_4 = __Pyx_PyObject_GetAttrStr(__pyx_v_self->_payload, __pyx_n_s_feed_eof); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 516, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_4); + __pyx_t_5 = NULL; + if (CYTHON_UNPACK_METHODS && likely(PyMethod_Check(__pyx_t_4))) { + __pyx_t_5 = PyMethod_GET_SELF(__pyx_t_4); + if (likely(__pyx_t_5)) { + PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_4); + __Pyx_INCREF(__pyx_t_5); + __Pyx_INCREF(function); + __Pyx_DECREF_SET(__pyx_t_4, function); + } + } + __pyx_t_3 = (__pyx_t_5) ? __Pyx_PyObject_CallOneArg(__pyx_t_4, __pyx_t_5) : __Pyx_PyObject_CallNoArg(__pyx_t_4); + __Pyx_XDECREF(__pyx_t_5); __pyx_t_5 = 0; + if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 516, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_3); + __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; + __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; + } + + /* "aiohttp/_http_parser.pyx":505 + * cdef bytes desc + * + * if self._payload is not None: # <<<<<<<<<<<<<< + * if self._cparser.flags & cparser.F_CHUNKED: + * raise TransferEncodingError( + */ + goto __pyx_L3; + } + + /* "aiohttp/_http_parser.pyx":517 + * else: + * self._payload.feed_eof() + * elif self._started: # <<<<<<<<<<<<<< + * self._on_headers_complete() + * if self._messages: + */ + __pyx_t_2 = (__pyx_v_self->_started != 0); + if (__pyx_t_2) { + + /* "aiohttp/_http_parser.pyx":518 + * self._payload.feed_eof() + * elif self._started: + * self._on_headers_complete() # <<<<<<<<<<<<<< + * if self._messages: + * return self._messages[-1][0] + */ + __pyx_t_3 = ((struct __pyx_vtabstruct_7aiohttp_12_http_parser_HttpParser *)__pyx_v_self->__pyx_vtab)->_on_headers_complete(__pyx_v_self); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 518, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_3); + __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; + + /* "aiohttp/_http_parser.pyx":519 + * elif self._started: + * self._on_headers_complete() + * if self._messages: # <<<<<<<<<<<<<< + * return self._messages[-1][0] + * + */ + __pyx_t_2 = (__pyx_v_self->_messages != Py_None)&&(PyList_GET_SIZE(__pyx_v_self->_messages) != 0); + if (__pyx_t_2) { + + /* "aiohttp/_http_parser.pyx":520 + * self._on_headers_complete() + * if self._messages: + * return self._messages[-1][0] # <<<<<<<<<<<<<< + * + * def feed_data(self, data): + */ + __Pyx_XDECREF(__pyx_r); + if (unlikely(__pyx_v_self->_messages == Py_None)) { + PyErr_SetString(PyExc_TypeError, "'NoneType' object is not subscriptable"); + __PYX_ERR(0, 520, __pyx_L1_error) + } + __pyx_t_3 = __Pyx_GetItemInt_List(__pyx_v_self->_messages, -1L, long, 1, __Pyx_PyInt_From_long, 1, 1, 1); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 520, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_3); + __pyx_t_4 = __Pyx_GetItemInt(__pyx_t_3, 0, long, 1, __Pyx_PyInt_From_long, 0, 0, 1); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 520, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_4); + __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; + __pyx_r = __pyx_t_4; + __pyx_t_4 = 0; + goto __pyx_L0; + + /* "aiohttp/_http_parser.pyx":519 + * elif self._started: + * self._on_headers_complete() + * if self._messages: # <<<<<<<<<<<<<< + * return self._messages[-1][0] + * + */ + } + + /* "aiohttp/_http_parser.pyx":517 + * else: + * self._payload.feed_eof() + * elif self._started: # <<<<<<<<<<<<<< + * self._on_headers_complete() + * if self._messages: + */ + } + __pyx_L3:; + + /* "aiohttp/_http_parser.pyx":502 + * ### Public API ### + * + * def feed_eof(self): # <<<<<<<<<<<<<< + * cdef bytes desc + * + */ + + /* function exit code */ + __pyx_r = Py_None; __Pyx_INCREF(Py_None); + goto __pyx_L0; + __pyx_L1_error:; + __Pyx_XDECREF(__pyx_t_3); + __Pyx_XDECREF(__pyx_t_4); + __Pyx_XDECREF(__pyx_t_5); + __Pyx_XDECREF(__pyx_t_6); + __Pyx_AddTraceback("aiohttp._http_parser.HttpParser.feed_eof", __pyx_clineno, __pyx_lineno, __pyx_filename); + __pyx_r = NULL; + __pyx_L0:; + __Pyx_XDECREF(__pyx_v_desc); + __Pyx_XGIVEREF(__pyx_r); + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +/* "aiohttp/_http_parser.pyx":522 + * return self._messages[-1][0] + * + * def feed_data(self, data): # <<<<<<<<<<<<<< + * cdef: + * size_t data_len + */ + +/* Python wrapper */ +static PyObject *__pyx_pw_7aiohttp_12_http_parser_10HttpParser_7feed_data(PyObject *__pyx_v_self, PyObject *__pyx_v_data); /*proto*/ +static PyObject *__pyx_pw_7aiohttp_12_http_parser_10HttpParser_7feed_data(PyObject *__pyx_v_self, PyObject *__pyx_v_data) { + PyObject *__pyx_r = 0; + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("feed_data (wrapper)", 0); + __pyx_r = __pyx_pf_7aiohttp_12_http_parser_10HttpParser_6feed_data(((struct __pyx_obj_7aiohttp_12_http_parser_HttpParser *)__pyx_v_self), ((PyObject *)__pyx_v_data)); + + /* function exit code */ + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +static PyObject *__pyx_pf_7aiohttp_12_http_parser_10HttpParser_6feed_data(struct __pyx_obj_7aiohttp_12_http_parser_HttpParser *__pyx_v_self, PyObject *__pyx_v_data) { + size_t __pyx_v_data_len; + size_t __pyx_v_nb; + llhttp_errno_t __pyx_v_errno; + PyObject *__pyx_v_ex = NULL; + PyObject *__pyx_v_messages = NULL; + PyObject *__pyx_r = NULL; + __Pyx_RefNannyDeclarations + int __pyx_t_1; + int __pyx_t_2; + int __pyx_t_3; + PyObject *__pyx_t_4 = NULL; + PyObject *__pyx_t_5 = NULL; + int __pyx_lineno = 0; + const char *__pyx_filename = NULL; + int __pyx_clineno = 0; + __Pyx_RefNannySetupContext("feed_data", 0); + + /* "aiohttp/_http_parser.pyx":528 + * cdef cparser.llhttp_errno_t errno + * + * PyObject_GetBuffer(data, &self.py_buf, PyBUF_SIMPLE) # <<<<<<<<<<<<<< + * data_len = self.py_buf.len + * + */ + __pyx_t_1 = PyObject_GetBuffer(__pyx_v_data, (&__pyx_v_self->py_buf), PyBUF_SIMPLE); if (unlikely(__pyx_t_1 == ((int)-1))) __PYX_ERR(0, 528, __pyx_L1_error) + + /* "aiohttp/_http_parser.pyx":529 + * + * PyObject_GetBuffer(data, &self.py_buf, PyBUF_SIMPLE) + * data_len = self.py_buf.len # <<<<<<<<<<<<<< + * + * errno = cparser.llhttp_execute( + */ + __pyx_v_data_len = ((size_t)__pyx_v_self->py_buf.len); + + /* "aiohttp/_http_parser.pyx":531 + * data_len = self.py_buf.len + * + * errno = cparser.llhttp_execute( # <<<<<<<<<<<<<< + * self._cparser, + * self.py_buf.buf, + */ + __pyx_v_errno = llhttp_execute(__pyx_v_self->_cparser, ((char *)__pyx_v_self->py_buf.buf), __pyx_v_data_len); + + /* "aiohttp/_http_parser.pyx":536 + * data_len) + * + * if errno is cparser.HPE_PAUSED_UPGRADE: # <<<<<<<<<<<<<< + * cparser.llhttp_resume_after_upgrade(self._cparser) + * + */ + __pyx_t_2 = ((__pyx_v_errno == HPE_PAUSED_UPGRADE) != 0); + if (__pyx_t_2) { + + /* "aiohttp/_http_parser.pyx":537 + * + * if errno is cparser.HPE_PAUSED_UPGRADE: + * cparser.llhttp_resume_after_upgrade(self._cparser) # <<<<<<<<<<<<<< + * + * nb = cparser.llhttp_get_error_pos(self._cparser) - self.py_buf.buf + */ + llhttp_resume_after_upgrade(__pyx_v_self->_cparser); + + /* "aiohttp/_http_parser.pyx":539 + * cparser.llhttp_resume_after_upgrade(self._cparser) + * + * nb = cparser.llhttp_get_error_pos(self._cparser) - self.py_buf.buf # <<<<<<<<<<<<<< + * + * PyBuffer_Release(&self.py_buf) + */ + __pyx_v_nb = (llhttp_get_error_pos(__pyx_v_self->_cparser) - ((char *)__pyx_v_self->py_buf.buf)); + + /* "aiohttp/_http_parser.pyx":536 + * data_len) + * + * if errno is cparser.HPE_PAUSED_UPGRADE: # <<<<<<<<<<<<<< + * cparser.llhttp_resume_after_upgrade(self._cparser) + * + */ + } + + /* "aiohttp/_http_parser.pyx":541 + * nb = cparser.llhttp_get_error_pos(self._cparser) - self.py_buf.buf + * + * PyBuffer_Release(&self.py_buf) # <<<<<<<<<<<<<< + * + * if errno not in (cparser.HPE_OK, cparser.HPE_PAUSED_UPGRADE): + */ + PyBuffer_Release((&__pyx_v_self->py_buf)); + + /* "aiohttp/_http_parser.pyx":543 + * PyBuffer_Release(&self.py_buf) + * + * if errno not in (cparser.HPE_OK, cparser.HPE_PAUSED_UPGRADE): # <<<<<<<<<<<<<< + * if self._payload_error == 0: + * if self._last_error is not None: + */ + switch (__pyx_v_errno) { + case HPE_OK: + case HPE_PAUSED_UPGRADE: + __pyx_t_2 = 0; + break; + default: + __pyx_t_2 = 1; + break; + } + __pyx_t_3 = (__pyx_t_2 != 0); + if (__pyx_t_3) { + + /* "aiohttp/_http_parser.pyx":544 + * + * if errno not in (cparser.HPE_OK, cparser.HPE_PAUSED_UPGRADE): + * if self._payload_error == 0: # <<<<<<<<<<<<<< + * if self._last_error is not None: + * ex = self._last_error + */ + __pyx_t_3 = ((__pyx_v_self->_payload_error == 0) != 0); + if (__pyx_t_3) { + + /* "aiohttp/_http_parser.pyx":545 + * if errno not in (cparser.HPE_OK, cparser.HPE_PAUSED_UPGRADE): + * if self._payload_error == 0: + * if self._last_error is not None: # <<<<<<<<<<<<<< + * ex = self._last_error + * self._last_error = None + */ + __pyx_t_3 = (__pyx_v_self->_last_error != Py_None); + __pyx_t_2 = (__pyx_t_3 != 0); + if (__pyx_t_2) { + + /* "aiohttp/_http_parser.pyx":546 + * if self._payload_error == 0: + * if self._last_error is not None: + * ex = self._last_error # <<<<<<<<<<<<<< + * self._last_error = None + * else: + */ + __pyx_t_4 = __pyx_v_self->_last_error; + __Pyx_INCREF(__pyx_t_4); + __pyx_v_ex = __pyx_t_4; + __pyx_t_4 = 0; + + /* "aiohttp/_http_parser.pyx":547 + * if self._last_error is not None: + * ex = self._last_error + * self._last_error = None # <<<<<<<<<<<<<< + * else: + * ex = parser_error_from_errno(self._cparser) + */ + __Pyx_INCREF(Py_None); + __Pyx_GIVEREF(Py_None); + __Pyx_GOTREF(__pyx_v_self->_last_error); + __Pyx_DECREF(__pyx_v_self->_last_error); + __pyx_v_self->_last_error = Py_None; + + /* "aiohttp/_http_parser.pyx":545 + * if errno not in (cparser.HPE_OK, cparser.HPE_PAUSED_UPGRADE): + * if self._payload_error == 0: + * if self._last_error is not None: # <<<<<<<<<<<<<< + * ex = self._last_error + * self._last_error = None + */ + goto __pyx_L6; + } + + /* "aiohttp/_http_parser.pyx":549 + * self._last_error = None + * else: + * ex = parser_error_from_errno(self._cparser) # <<<<<<<<<<<<<< + * self._payload = None + * raise ex + */ + /*else*/ { + __pyx_t_4 = __pyx_f_7aiohttp_12_http_parser_parser_error_from_errno(__pyx_v_self->_cparser); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 549, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_4); + __pyx_v_ex = __pyx_t_4; + __pyx_t_4 = 0; + } + __pyx_L6:; + + /* "aiohttp/_http_parser.pyx":550 + * else: + * ex = parser_error_from_errno(self._cparser) + * self._payload = None # <<<<<<<<<<<<<< + * raise ex + * + */ + __Pyx_INCREF(Py_None); + __Pyx_GIVEREF(Py_None); + __Pyx_GOTREF(__pyx_v_self->_payload); + __Pyx_DECREF(__pyx_v_self->_payload); + __pyx_v_self->_payload = Py_None; + + /* "aiohttp/_http_parser.pyx":551 + * ex = parser_error_from_errno(self._cparser) + * self._payload = None + * raise ex # <<<<<<<<<<<<<< + * + * if self._messages: + */ + __Pyx_Raise(__pyx_v_ex, 0, 0, 0); + __PYX_ERR(0, 551, __pyx_L1_error) + + /* "aiohttp/_http_parser.pyx":544 + * + * if errno not in (cparser.HPE_OK, cparser.HPE_PAUSED_UPGRADE): + * if self._payload_error == 0: # <<<<<<<<<<<<<< + * if self._last_error is not None: + * ex = self._last_error + */ + } + + /* "aiohttp/_http_parser.pyx":543 + * PyBuffer_Release(&self.py_buf) + * + * if errno not in (cparser.HPE_OK, cparser.HPE_PAUSED_UPGRADE): # <<<<<<<<<<<<<< + * if self._payload_error == 0: + * if self._last_error is not None: + */ + } + + /* "aiohttp/_http_parser.pyx":553 + * raise ex + * + * if self._messages: # <<<<<<<<<<<<<< + * messages = self._messages + * self._messages = [] + */ + __pyx_t_2 = (__pyx_v_self->_messages != Py_None)&&(PyList_GET_SIZE(__pyx_v_self->_messages) != 0); + if (__pyx_t_2) { + + /* "aiohttp/_http_parser.pyx":554 + * + * if self._messages: + * messages = self._messages # <<<<<<<<<<<<<< + * self._messages = [] + * else: + */ + __pyx_t_4 = __pyx_v_self->_messages; + __Pyx_INCREF(__pyx_t_4); + __pyx_v_messages = __pyx_t_4; + __pyx_t_4 = 0; + + /* "aiohttp/_http_parser.pyx":555 + * if self._messages: + * messages = self._messages + * self._messages = [] # <<<<<<<<<<<<<< + * else: + * messages = () + */ + __pyx_t_4 = PyList_New(0); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 555, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_4); + __Pyx_GIVEREF(__pyx_t_4); + __Pyx_GOTREF(__pyx_v_self->_messages); + __Pyx_DECREF(__pyx_v_self->_messages); + __pyx_v_self->_messages = ((PyObject*)__pyx_t_4); + __pyx_t_4 = 0; + + /* "aiohttp/_http_parser.pyx":553 + * raise ex + * + * if self._messages: # <<<<<<<<<<<<<< + * messages = self._messages + * self._messages = [] + */ + goto __pyx_L7; + } + + /* "aiohttp/_http_parser.pyx":557 + * self._messages = [] + * else: + * messages = () # <<<<<<<<<<<<<< + * + * if self._upgraded: + */ + /*else*/ { + __Pyx_INCREF(__pyx_empty_tuple); + __pyx_v_messages = __pyx_empty_tuple; + } + __pyx_L7:; + + /* "aiohttp/_http_parser.pyx":559 + * messages = () + * + * if self._upgraded: # <<<<<<<<<<<<<< + * return messages, True, data[nb:] + * else: + */ + __pyx_t_2 = (__pyx_v_self->_upgraded != 0); + if (__pyx_t_2) { + + /* "aiohttp/_http_parser.pyx":560 + * + * if self._upgraded: + * return messages, True, data[nb:] # <<<<<<<<<<<<<< + * else: + * return messages, False, b'' + */ + __Pyx_XDECREF(__pyx_r); + __pyx_t_4 = __Pyx_PyObject_GetSlice(__pyx_v_data, __pyx_v_nb, 0, NULL, NULL, NULL, 1, 0, 1); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 560, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_4); + __pyx_t_5 = PyTuple_New(3); if (unlikely(!__pyx_t_5)) __PYX_ERR(0, 560, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_5); + __Pyx_INCREF(__pyx_v_messages); + __Pyx_GIVEREF(__pyx_v_messages); + PyTuple_SET_ITEM(__pyx_t_5, 0, __pyx_v_messages); + __Pyx_INCREF(Py_True); + __Pyx_GIVEREF(Py_True); + PyTuple_SET_ITEM(__pyx_t_5, 1, Py_True); + __Pyx_GIVEREF(__pyx_t_4); + PyTuple_SET_ITEM(__pyx_t_5, 2, __pyx_t_4); + __pyx_t_4 = 0; + __pyx_r = __pyx_t_5; + __pyx_t_5 = 0; + goto __pyx_L0; + + /* "aiohttp/_http_parser.pyx":559 + * messages = () + * + * if self._upgraded: # <<<<<<<<<<<<<< + * return messages, True, data[nb:] + * else: + */ + } + + /* "aiohttp/_http_parser.pyx":562 + * return messages, True, data[nb:] + * else: + * return messages, False, b'' # <<<<<<<<<<<<<< + * + * def set_upgraded(self, val): + */ + /*else*/ { + __Pyx_XDECREF(__pyx_r); + __pyx_t_5 = PyTuple_New(3); if (unlikely(!__pyx_t_5)) __PYX_ERR(0, 562, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_5); + __Pyx_INCREF(__pyx_v_messages); + __Pyx_GIVEREF(__pyx_v_messages); + PyTuple_SET_ITEM(__pyx_t_5, 0, __pyx_v_messages); + __Pyx_INCREF(Py_False); + __Pyx_GIVEREF(Py_False); + PyTuple_SET_ITEM(__pyx_t_5, 1, Py_False); + __Pyx_INCREF(__pyx_kp_b__4); + __Pyx_GIVEREF(__pyx_kp_b__4); + PyTuple_SET_ITEM(__pyx_t_5, 2, __pyx_kp_b__4); + __pyx_r = __pyx_t_5; + __pyx_t_5 = 0; + goto __pyx_L0; + } + + /* "aiohttp/_http_parser.pyx":522 + * return self._messages[-1][0] + * + * def feed_data(self, data): # <<<<<<<<<<<<<< + * cdef: + * size_t data_len + */ + + /* function exit code */ + __pyx_L1_error:; + __Pyx_XDECREF(__pyx_t_4); + __Pyx_XDECREF(__pyx_t_5); + __Pyx_AddTraceback("aiohttp._http_parser.HttpParser.feed_data", __pyx_clineno, __pyx_lineno, __pyx_filename); + __pyx_r = NULL; + __pyx_L0:; + __Pyx_XDECREF(__pyx_v_ex); + __Pyx_XDECREF(__pyx_v_messages); + __Pyx_XGIVEREF(__pyx_r); + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +/* "aiohttp/_http_parser.pyx":564 + * return messages, False, b'' + * + * def set_upgraded(self, val): # <<<<<<<<<<<<<< + * self._upgraded = val + * + */ + +/* Python wrapper */ +static PyObject *__pyx_pw_7aiohttp_12_http_parser_10HttpParser_9set_upgraded(PyObject *__pyx_v_self, PyObject *__pyx_v_val); /*proto*/ +static PyObject *__pyx_pw_7aiohttp_12_http_parser_10HttpParser_9set_upgraded(PyObject *__pyx_v_self, PyObject *__pyx_v_val) { + PyObject *__pyx_r = 0; + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("set_upgraded (wrapper)", 0); + __pyx_r = __pyx_pf_7aiohttp_12_http_parser_10HttpParser_8set_upgraded(((struct __pyx_obj_7aiohttp_12_http_parser_HttpParser *)__pyx_v_self), ((PyObject *)__pyx_v_val)); + + /* function exit code */ + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +static PyObject *__pyx_pf_7aiohttp_12_http_parser_10HttpParser_8set_upgraded(struct __pyx_obj_7aiohttp_12_http_parser_HttpParser *__pyx_v_self, PyObject *__pyx_v_val) { + PyObject *__pyx_r = NULL; + __Pyx_RefNannyDeclarations + int __pyx_t_1; + int __pyx_lineno = 0; + const char *__pyx_filename = NULL; + int __pyx_clineno = 0; + __Pyx_RefNannySetupContext("set_upgraded", 0); + + /* "aiohttp/_http_parser.pyx":565 + * + * def set_upgraded(self, val): + * self._upgraded = val # <<<<<<<<<<<<<< + * + * + */ + __pyx_t_1 = __Pyx_PyObject_IsTrue(__pyx_v_val); if (unlikely((__pyx_t_1 == (int)-1) && PyErr_Occurred())) __PYX_ERR(0, 565, __pyx_L1_error) + __pyx_v_self->_upgraded = __pyx_t_1; + + /* "aiohttp/_http_parser.pyx":564 + * return messages, False, b'' + * + * def set_upgraded(self, val): # <<<<<<<<<<<<<< + * self._upgraded = val + * + */ + + /* function exit code */ + __pyx_r = Py_None; __Pyx_INCREF(Py_None); + goto __pyx_L0; + __pyx_L1_error:; + __Pyx_AddTraceback("aiohttp._http_parser.HttpParser.set_upgraded", __pyx_clineno, __pyx_lineno, __pyx_filename); + __pyx_r = NULL; + __pyx_L0:; + __Pyx_XGIVEREF(__pyx_r); + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +/* "(tree fragment)":1 + * def __reduce_cython__(self): # <<<<<<<<<<<<<< + * raise TypeError("no default __reduce__ due to non-trivial __cinit__") + * def __setstate_cython__(self, __pyx_state): + */ + +/* Python wrapper */ +static PyObject *__pyx_pw_7aiohttp_12_http_parser_10HttpParser_11__reduce_cython__(PyObject *__pyx_v_self, CYTHON_UNUSED PyObject *unused); /*proto*/ +static PyObject *__pyx_pw_7aiohttp_12_http_parser_10HttpParser_11__reduce_cython__(PyObject *__pyx_v_self, CYTHON_UNUSED PyObject *unused) { + PyObject *__pyx_r = 0; + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("__reduce_cython__ (wrapper)", 0); + __pyx_r = __pyx_pf_7aiohttp_12_http_parser_10HttpParser_10__reduce_cython__(((struct __pyx_obj_7aiohttp_12_http_parser_HttpParser *)__pyx_v_self)); + + /* function exit code */ + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +static PyObject *__pyx_pf_7aiohttp_12_http_parser_10HttpParser_10__reduce_cython__(CYTHON_UNUSED struct __pyx_obj_7aiohttp_12_http_parser_HttpParser *__pyx_v_self) { + PyObject *__pyx_r = NULL; + __Pyx_RefNannyDeclarations + PyObject *__pyx_t_1 = NULL; + int __pyx_lineno = 0; + const char *__pyx_filename = NULL; + int __pyx_clineno = 0; + __Pyx_RefNannySetupContext("__reduce_cython__", 0); + + /* "(tree fragment)":2 + * def __reduce_cython__(self): + * raise TypeError("no default __reduce__ due to non-trivial __cinit__") # <<<<<<<<<<<<<< + * def __setstate_cython__(self, __pyx_state): + * raise TypeError("no default __reduce__ due to non-trivial __cinit__") + */ + __pyx_t_1 = __Pyx_PyObject_Call(__pyx_builtin_TypeError, __pyx_tuple__5, NULL); if (unlikely(!__pyx_t_1)) __PYX_ERR(1, 2, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __Pyx_Raise(__pyx_t_1, 0, 0, 0); + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + __PYX_ERR(1, 2, __pyx_L1_error) + + /* "(tree fragment)":1 + * def __reduce_cython__(self): # <<<<<<<<<<<<<< + * raise TypeError("no default __reduce__ due to non-trivial __cinit__") + * def __setstate_cython__(self, __pyx_state): + */ + + /* function exit code */ + __pyx_L1_error:; + __Pyx_XDECREF(__pyx_t_1); + __Pyx_AddTraceback("aiohttp._http_parser.HttpParser.__reduce_cython__", __pyx_clineno, __pyx_lineno, __pyx_filename); + __pyx_r = NULL; + __Pyx_XGIVEREF(__pyx_r); + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +/* "(tree fragment)":3 + * def __reduce_cython__(self): + * raise TypeError("no default __reduce__ due to non-trivial __cinit__") + * def __setstate_cython__(self, __pyx_state): # <<<<<<<<<<<<<< + * raise TypeError("no default __reduce__ due to non-trivial __cinit__") + */ + +/* Python wrapper */ +static PyObject *__pyx_pw_7aiohttp_12_http_parser_10HttpParser_13__setstate_cython__(PyObject *__pyx_v_self, PyObject *__pyx_v___pyx_state); /*proto*/ +static PyObject *__pyx_pw_7aiohttp_12_http_parser_10HttpParser_13__setstate_cython__(PyObject *__pyx_v_self, PyObject *__pyx_v___pyx_state) { + PyObject *__pyx_r = 0; + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("__setstate_cython__ (wrapper)", 0); + __pyx_r = __pyx_pf_7aiohttp_12_http_parser_10HttpParser_12__setstate_cython__(((struct __pyx_obj_7aiohttp_12_http_parser_HttpParser *)__pyx_v_self), ((PyObject *)__pyx_v___pyx_state)); + + /* function exit code */ + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +static PyObject *__pyx_pf_7aiohttp_12_http_parser_10HttpParser_12__setstate_cython__(CYTHON_UNUSED struct __pyx_obj_7aiohttp_12_http_parser_HttpParser *__pyx_v_self, CYTHON_UNUSED PyObject *__pyx_v___pyx_state) { + PyObject *__pyx_r = NULL; + __Pyx_RefNannyDeclarations + PyObject *__pyx_t_1 = NULL; + int __pyx_lineno = 0; + const char *__pyx_filename = NULL; + int __pyx_clineno = 0; + __Pyx_RefNannySetupContext("__setstate_cython__", 0); + + /* "(tree fragment)":4 + * raise TypeError("no default __reduce__ due to non-trivial __cinit__") + * def __setstate_cython__(self, __pyx_state): + * raise TypeError("no default __reduce__ due to non-trivial __cinit__") # <<<<<<<<<<<<<< + */ + __pyx_t_1 = __Pyx_PyObject_Call(__pyx_builtin_TypeError, __pyx_tuple__6, NULL); if (unlikely(!__pyx_t_1)) __PYX_ERR(1, 4, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __Pyx_Raise(__pyx_t_1, 0, 0, 0); + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + __PYX_ERR(1, 4, __pyx_L1_error) + + /* "(tree fragment)":3 + * def __reduce_cython__(self): + * raise TypeError("no default __reduce__ due to non-trivial __cinit__") + * def __setstate_cython__(self, __pyx_state): # <<<<<<<<<<<<<< + * raise TypeError("no default __reduce__ due to non-trivial __cinit__") + */ + + /* function exit code */ + __pyx_L1_error:; + __Pyx_XDECREF(__pyx_t_1); + __Pyx_AddTraceback("aiohttp._http_parser.HttpParser.__setstate_cython__", __pyx_clineno, __pyx_lineno, __pyx_filename); + __pyx_r = NULL; + __Pyx_XGIVEREF(__pyx_r); + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +/* "aiohttp/_http_parser.pyx":570 + * cdef class HttpRequestParser(HttpParser): + * + * def __init__( # <<<<<<<<<<<<<< + * self, protocol, loop, int limit, timer=None, + * size_t max_line_size=8190, size_t max_headers=32768, + */ + +/* Python wrapper */ +static int __pyx_pw_7aiohttp_12_http_parser_17HttpRequestParser_1__init__(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/ +static int __pyx_pw_7aiohttp_12_http_parser_17HttpRequestParser_1__init__(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds) { + PyObject *__pyx_v_protocol = 0; + PyObject *__pyx_v_loop = 0; + int __pyx_v_limit; + PyObject *__pyx_v_timer = 0; + size_t __pyx_v_max_line_size; + size_t __pyx_v_max_headers; + size_t __pyx_v_max_field_size; + PyObject *__pyx_v_payload_exception = 0; + int __pyx_v_response_with_body; + int __pyx_v_read_until_eof; + int __pyx_v_auto_decompress; + int __pyx_lineno = 0; + const char *__pyx_filename = NULL; + int __pyx_clineno = 0; + int __pyx_r; + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("__init__ (wrapper)", 0); + { + static PyObject **__pyx_pyargnames[] = {&__pyx_n_s_protocol,&__pyx_n_s_loop,&__pyx_n_s_limit,&__pyx_n_s_timer,&__pyx_n_s_max_line_size,&__pyx_n_s_max_headers,&__pyx_n_s_max_field_size,&__pyx_n_s_payload_exception,&__pyx_n_s_response_with_body,&__pyx_n_s_read_until_eof,&__pyx_n_s_auto_decompress,0}; + PyObject* values[11] = {0,0,0,0,0,0,0,0,0,0,0}; + + /* "aiohttp/_http_parser.pyx":571 + * + * def __init__( + * self, protocol, loop, int limit, timer=None, # <<<<<<<<<<<<<< + * size_t max_line_size=8190, size_t max_headers=32768, + * size_t max_field_size=8190, payload_exception=None, + */ + values[3] = ((PyObject *)Py_None); + + /* "aiohttp/_http_parser.pyx":573 + * self, protocol, loop, int limit, timer=None, + * size_t max_line_size=8190, size_t max_headers=32768, + * size_t max_field_size=8190, payload_exception=None, # <<<<<<<<<<<<<< + * bint response_with_body=True, bint read_until_eof=False, + * bint auto_decompress=True, + */ + values[7] = ((PyObject *)Py_None); + if (unlikely(__pyx_kwds)) { + Py_ssize_t kw_args; + const Py_ssize_t pos_args = PyTuple_GET_SIZE(__pyx_args); + switch (pos_args) { + case 11: values[10] = PyTuple_GET_ITEM(__pyx_args, 10); + CYTHON_FALLTHROUGH; + case 10: values[9] = PyTuple_GET_ITEM(__pyx_args, 9); + CYTHON_FALLTHROUGH; + case 9: values[8] = PyTuple_GET_ITEM(__pyx_args, 8); + CYTHON_FALLTHROUGH; + case 8: values[7] = PyTuple_GET_ITEM(__pyx_args, 7); + CYTHON_FALLTHROUGH; + case 7: values[6] = PyTuple_GET_ITEM(__pyx_args, 6); + CYTHON_FALLTHROUGH; + case 6: values[5] = PyTuple_GET_ITEM(__pyx_args, 5); + CYTHON_FALLTHROUGH; + case 5: values[4] = PyTuple_GET_ITEM(__pyx_args, 4); + CYTHON_FALLTHROUGH; + case 4: values[3] = PyTuple_GET_ITEM(__pyx_args, 3); + CYTHON_FALLTHROUGH; + case 3: values[2] = PyTuple_GET_ITEM(__pyx_args, 2); + CYTHON_FALLTHROUGH; + case 2: values[1] = PyTuple_GET_ITEM(__pyx_args, 1); + CYTHON_FALLTHROUGH; + case 1: values[0] = PyTuple_GET_ITEM(__pyx_args, 0); + CYTHON_FALLTHROUGH; + case 0: break; + default: goto __pyx_L5_argtuple_error; + } + kw_args = PyDict_Size(__pyx_kwds); + switch (pos_args) { + case 0: + if (likely((values[0] = __Pyx_PyDict_GetItemStr(__pyx_kwds, __pyx_n_s_protocol)) != 0)) kw_args--; + else goto __pyx_L5_argtuple_error; + CYTHON_FALLTHROUGH; + case 1: + if (likely((values[1] = __Pyx_PyDict_GetItemStr(__pyx_kwds, __pyx_n_s_loop)) != 0)) kw_args--; + else { + __Pyx_RaiseArgtupleInvalid("__init__", 0, 3, 11, 1); __PYX_ERR(0, 570, __pyx_L3_error) + } + CYTHON_FALLTHROUGH; + case 2: + if (likely((values[2] = __Pyx_PyDict_GetItemStr(__pyx_kwds, __pyx_n_s_limit)) != 0)) kw_args--; + else { + __Pyx_RaiseArgtupleInvalid("__init__", 0, 3, 11, 2); __PYX_ERR(0, 570, __pyx_L3_error) + } + CYTHON_FALLTHROUGH; + case 3: + if (kw_args > 0) { + PyObject* value = __Pyx_PyDict_GetItemStr(__pyx_kwds, __pyx_n_s_timer); + if (value) { values[3] = value; kw_args--; } + } + CYTHON_FALLTHROUGH; + case 4: + if (kw_args > 0) { + PyObject* value = __Pyx_PyDict_GetItemStr(__pyx_kwds, __pyx_n_s_max_line_size); + if (value) { values[4] = value; kw_args--; } + } + CYTHON_FALLTHROUGH; + case 5: + if (kw_args > 0) { + PyObject* value = __Pyx_PyDict_GetItemStr(__pyx_kwds, __pyx_n_s_max_headers); + if (value) { values[5] = value; kw_args--; } + } + CYTHON_FALLTHROUGH; + case 6: + if (kw_args > 0) { + PyObject* value = __Pyx_PyDict_GetItemStr(__pyx_kwds, __pyx_n_s_max_field_size); + if (value) { values[6] = value; kw_args--; } + } + CYTHON_FALLTHROUGH; + case 7: + if (kw_args > 0) { + PyObject* value = __Pyx_PyDict_GetItemStr(__pyx_kwds, __pyx_n_s_payload_exception); + if (value) { values[7] = value; kw_args--; } + } + CYTHON_FALLTHROUGH; + case 8: + if (kw_args > 0) { + PyObject* value = __Pyx_PyDict_GetItemStr(__pyx_kwds, __pyx_n_s_response_with_body); + if (value) { values[8] = value; kw_args--; } + } + CYTHON_FALLTHROUGH; + case 9: + if (kw_args > 0) { + PyObject* value = __Pyx_PyDict_GetItemStr(__pyx_kwds, __pyx_n_s_read_until_eof); + if (value) { values[9] = value; kw_args--; } + } + CYTHON_FALLTHROUGH; + case 10: + if (kw_args > 0) { + PyObject* value = __Pyx_PyDict_GetItemStr(__pyx_kwds, __pyx_n_s_auto_decompress); + if (value) { values[10] = value; kw_args--; } + } + } + if (unlikely(kw_args > 0)) { + if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, pos_args, "__init__") < 0)) __PYX_ERR(0, 570, __pyx_L3_error) + } + } else { + switch (PyTuple_GET_SIZE(__pyx_args)) { + case 11: values[10] = PyTuple_GET_ITEM(__pyx_args, 10); + CYTHON_FALLTHROUGH; + case 10: values[9] = PyTuple_GET_ITEM(__pyx_args, 9); + CYTHON_FALLTHROUGH; + case 9: values[8] = PyTuple_GET_ITEM(__pyx_args, 8); + CYTHON_FALLTHROUGH; + case 8: values[7] = PyTuple_GET_ITEM(__pyx_args, 7); + CYTHON_FALLTHROUGH; + case 7: values[6] = PyTuple_GET_ITEM(__pyx_args, 6); + CYTHON_FALLTHROUGH; + case 6: values[5] = PyTuple_GET_ITEM(__pyx_args, 5); + CYTHON_FALLTHROUGH; + case 5: values[4] = PyTuple_GET_ITEM(__pyx_args, 4); + CYTHON_FALLTHROUGH; + case 4: values[3] = PyTuple_GET_ITEM(__pyx_args, 3); + CYTHON_FALLTHROUGH; + case 3: values[2] = PyTuple_GET_ITEM(__pyx_args, 2); + values[1] = PyTuple_GET_ITEM(__pyx_args, 1); + values[0] = PyTuple_GET_ITEM(__pyx_args, 0); + break; + default: goto __pyx_L5_argtuple_error; + } + } + __pyx_v_protocol = values[0]; + __pyx_v_loop = values[1]; + __pyx_v_limit = __Pyx_PyInt_As_int(values[2]); if (unlikely((__pyx_v_limit == (int)-1) && PyErr_Occurred())) __PYX_ERR(0, 571, __pyx_L3_error) + __pyx_v_timer = values[3]; + if (values[4]) { + __pyx_v_max_line_size = __Pyx_PyInt_As_size_t(values[4]); if (unlikely((__pyx_v_max_line_size == (size_t)-1) && PyErr_Occurred())) __PYX_ERR(0, 572, __pyx_L3_error) + } else { + __pyx_v_max_line_size = ((size_t)0x1FFE); + } + if (values[5]) { + __pyx_v_max_headers = __Pyx_PyInt_As_size_t(values[5]); if (unlikely((__pyx_v_max_headers == (size_t)-1) && PyErr_Occurred())) __PYX_ERR(0, 572, __pyx_L3_error) + } else { + __pyx_v_max_headers = ((size_t)0x8000); + } + if (values[6]) { + __pyx_v_max_field_size = __Pyx_PyInt_As_size_t(values[6]); if (unlikely((__pyx_v_max_field_size == (size_t)-1) && PyErr_Occurred())) __PYX_ERR(0, 573, __pyx_L3_error) + } else { + __pyx_v_max_field_size = ((size_t)0x1FFE); + } + __pyx_v_payload_exception = values[7]; + if (values[8]) { + __pyx_v_response_with_body = __Pyx_PyObject_IsTrue(values[8]); if (unlikely((__pyx_v_response_with_body == (int)-1) && PyErr_Occurred())) __PYX_ERR(0, 574, __pyx_L3_error) + } else { + + /* "aiohttp/_http_parser.pyx":574 + * size_t max_line_size=8190, size_t max_headers=32768, + * size_t max_field_size=8190, payload_exception=None, + * bint response_with_body=True, bint read_until_eof=False, # <<<<<<<<<<<<<< + * bint auto_decompress=True, + * ): + */ + __pyx_v_response_with_body = ((int)1); + } + if (values[9]) { + __pyx_v_read_until_eof = __Pyx_PyObject_IsTrue(values[9]); if (unlikely((__pyx_v_read_until_eof == (int)-1) && PyErr_Occurred())) __PYX_ERR(0, 574, __pyx_L3_error) + } else { + __pyx_v_read_until_eof = ((int)0); + } + if (values[10]) { + __pyx_v_auto_decompress = __Pyx_PyObject_IsTrue(values[10]); if (unlikely((__pyx_v_auto_decompress == (int)-1) && PyErr_Occurred())) __PYX_ERR(0, 575, __pyx_L3_error) + } else { + + /* "aiohttp/_http_parser.pyx":575 + * size_t max_field_size=8190, payload_exception=None, + * bint response_with_body=True, bint read_until_eof=False, + * bint auto_decompress=True, # <<<<<<<<<<<<<< + * ): + * self._init(cparser.HTTP_REQUEST, protocol, loop, limit, timer, + */ + __pyx_v_auto_decompress = ((int)1); + } + } + goto __pyx_L4_argument_unpacking_done; + __pyx_L5_argtuple_error:; + __Pyx_RaiseArgtupleInvalid("__init__", 0, 3, 11, PyTuple_GET_SIZE(__pyx_args)); __PYX_ERR(0, 570, __pyx_L3_error) + __pyx_L3_error:; + __Pyx_AddTraceback("aiohttp._http_parser.HttpRequestParser.__init__", __pyx_clineno, __pyx_lineno, __pyx_filename); + __Pyx_RefNannyFinishContext(); + return -1; + __pyx_L4_argument_unpacking_done:; + __pyx_r = __pyx_pf_7aiohttp_12_http_parser_17HttpRequestParser___init__(((struct __pyx_obj_7aiohttp_12_http_parser_HttpRequestParser *)__pyx_v_self), __pyx_v_protocol, __pyx_v_loop, __pyx_v_limit, __pyx_v_timer, __pyx_v_max_line_size, __pyx_v_max_headers, __pyx_v_max_field_size, __pyx_v_payload_exception, __pyx_v_response_with_body, __pyx_v_read_until_eof, __pyx_v_auto_decompress); + + /* "aiohttp/_http_parser.pyx":570 + * cdef class HttpRequestParser(HttpParser): + * + * def __init__( # <<<<<<<<<<<<<< + * self, protocol, loop, int limit, timer=None, + * size_t max_line_size=8190, size_t max_headers=32768, + */ + + /* function exit code */ + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +static int __pyx_pf_7aiohttp_12_http_parser_17HttpRequestParser___init__(struct __pyx_obj_7aiohttp_12_http_parser_HttpRequestParser *__pyx_v_self, PyObject *__pyx_v_protocol, PyObject *__pyx_v_loop, int __pyx_v_limit, PyObject *__pyx_v_timer, size_t __pyx_v_max_line_size, size_t __pyx_v_max_headers, size_t __pyx_v_max_field_size, PyObject *__pyx_v_payload_exception, int __pyx_v_response_with_body, int __pyx_v_read_until_eof, int __pyx_v_auto_decompress) { + int __pyx_r; + __Pyx_RefNannyDeclarations + PyObject *__pyx_t_1 = NULL; + struct __pyx_opt_args_7aiohttp_12_http_parser_10HttpParser__init __pyx_t_2; + int __pyx_lineno = 0; + const char *__pyx_filename = NULL; + int __pyx_clineno = 0; + __Pyx_RefNannySetupContext("__init__", 0); + + /* "aiohttp/_http_parser.pyx":577 + * bint auto_decompress=True, + * ): + * self._init(cparser.HTTP_REQUEST, protocol, loop, limit, timer, # <<<<<<<<<<<<<< + * max_line_size, max_headers, max_field_size, + * payload_exception, response_with_body, read_until_eof, + */ + __pyx_t_2.__pyx_n = 8; + __pyx_t_2.timer = __pyx_v_timer; + __pyx_t_2.max_line_size = __pyx_v_max_line_size; + __pyx_t_2.max_headers = __pyx_v_max_headers; + __pyx_t_2.max_field_size = __pyx_v_max_field_size; + __pyx_t_2.payload_exception = __pyx_v_payload_exception; + __pyx_t_2.response_with_body = __pyx_v_response_with_body; + __pyx_t_2.read_until_eof = __pyx_v_read_until_eof; + __pyx_t_2.auto_decompress = __pyx_v_auto_decompress; + __pyx_t_1 = ((struct __pyx_vtabstruct_7aiohttp_12_http_parser_HttpRequestParser *)__pyx_v_self->__pyx_base.__pyx_vtab)->__pyx_base._init(((struct __pyx_obj_7aiohttp_12_http_parser_HttpParser *)__pyx_v_self), HTTP_REQUEST, __pyx_v_protocol, __pyx_v_loop, __pyx_v_limit, &__pyx_t_2); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 577, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + + /* "aiohttp/_http_parser.pyx":570 + * cdef class HttpRequestParser(HttpParser): + * + * def __init__( # <<<<<<<<<<<<<< + * self, protocol, loop, int limit, timer=None, + * size_t max_line_size=8190, size_t max_headers=32768, + */ + + /* function exit code */ + __pyx_r = 0; + goto __pyx_L0; + __pyx_L1_error:; + __Pyx_XDECREF(__pyx_t_1); + __Pyx_AddTraceback("aiohttp._http_parser.HttpRequestParser.__init__", __pyx_clineno, __pyx_lineno, __pyx_filename); + __pyx_r = -1; + __pyx_L0:; + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +/* "aiohttp/_http_parser.pyx":582 + * auto_decompress) + * + * cdef object _on_status_complete(self): # <<<<<<<<<<<<<< + * cdef int idx1, idx2 + * if not self._buf: + */ + +static PyObject *__pyx_f_7aiohttp_12_http_parser_17HttpRequestParser__on_status_complete(struct __pyx_obj_7aiohttp_12_http_parser_HttpRequestParser *__pyx_v_self) { + int __pyx_v_idx1; + int __pyx_v_idx2; + CYTHON_UNUSED Py_ssize_t __pyx_v_idx3; + PyObject *__pyx_v_query = NULL; + PyObject *__pyx_v_path = NULL; + PyObject *__pyx_v_fragment = NULL; + PyObject *__pyx_r = NULL; + __Pyx_RefNannyDeclarations + int __pyx_t_1; + int __pyx_t_2; + PyObject *__pyx_t_3 = NULL; + Py_ssize_t __pyx_t_4; + Py_ssize_t __pyx_t_5; + PyObject *__pyx_t_6 = NULL; + PyObject *__pyx_t_7 = NULL; + int __pyx_t_8; + int __pyx_t_9; + char const *__pyx_t_10; + PyObject *__pyx_t_11 = NULL; + PyObject *__pyx_t_12 = NULL; + PyObject *__pyx_t_13 = NULL; + PyObject *__pyx_t_14 = NULL; + PyObject *__pyx_t_15 = NULL; + PyObject *__pyx_t_16 = NULL; + int __pyx_t_17; + int __pyx_lineno = 0; + const char *__pyx_filename = NULL; + int __pyx_clineno = 0; + __Pyx_RefNannySetupContext("_on_status_complete", 0); + + /* "aiohttp/_http_parser.pyx":584 + * cdef object _on_status_complete(self): + * cdef int idx1, idx2 + * if not self._buf: # <<<<<<<<<<<<<< + * return + * self._path = self._buf.decode('utf-8', 'surrogateescape') + */ + __pyx_t_1 = (__pyx_v_self->__pyx_base._buf != Py_None)&&(PyByteArray_GET_SIZE(__pyx_v_self->__pyx_base._buf) != 0); + __pyx_t_2 = ((!__pyx_t_1) != 0); + if (__pyx_t_2) { + + /* "aiohttp/_http_parser.pyx":585 + * cdef int idx1, idx2 + * if not self._buf: + * return # <<<<<<<<<<<<<< + * self._path = self._buf.decode('utf-8', 'surrogateescape') + * try: + */ + __Pyx_XDECREF(__pyx_r); + __pyx_r = Py_None; __Pyx_INCREF(Py_None); + goto __pyx_L0; + + /* "aiohttp/_http_parser.pyx":584 + * cdef object _on_status_complete(self): + * cdef int idx1, idx2 + * if not self._buf: # <<<<<<<<<<<<<< + * return + * self._path = self._buf.decode('utf-8', 'surrogateescape') + */ + } + + /* "aiohttp/_http_parser.pyx":586 + * if not self._buf: + * return + * self._path = self._buf.decode('utf-8', 'surrogateescape') # <<<<<<<<<<<<<< + * try: + * idx3 = len(self._path) + */ + if (unlikely(__pyx_v_self->__pyx_base._buf == Py_None)) { + PyErr_Format(PyExc_AttributeError, "'NoneType' object has no attribute '%.30s'", "decode"); + __PYX_ERR(0, 586, __pyx_L1_error) + } + __pyx_t_3 = __Pyx_decode_bytearray(__pyx_v_self->__pyx_base._buf, 0, PY_SSIZE_T_MAX, NULL, ((char const *)"surrogateescape"), PyUnicode_DecodeUTF8); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 586, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_3); + __Pyx_GIVEREF(__pyx_t_3); + __Pyx_GOTREF(__pyx_v_self->__pyx_base._path); + __Pyx_DECREF(__pyx_v_self->__pyx_base._path); + __pyx_v_self->__pyx_base._path = ((PyObject*)__pyx_t_3); + __pyx_t_3 = 0; + + /* "aiohttp/_http_parser.pyx":587 + * return + * self._path = self._buf.decode('utf-8', 'surrogateescape') + * try: # <<<<<<<<<<<<<< + * idx3 = len(self._path) + * idx1 = self._path.find("?") + */ + /*try:*/ { + + /* "aiohttp/_http_parser.pyx":588 + * self._path = self._buf.decode('utf-8', 'surrogateescape') + * try: + * idx3 = len(self._path) # <<<<<<<<<<<<<< + * idx1 = self._path.find("?") + * if idx1 == -1: + */ + __pyx_t_3 = __pyx_v_self->__pyx_base._path; + __Pyx_INCREF(__pyx_t_3); + if (unlikely(__pyx_t_3 == Py_None)) { + PyErr_SetString(PyExc_TypeError, "object of type 'NoneType' has no len()"); + __PYX_ERR(0, 588, __pyx_L5_error) + } + __pyx_t_4 = __Pyx_PyUnicode_GET_LENGTH(__pyx_t_3); if (unlikely(__pyx_t_4 == ((Py_ssize_t)-1))) __PYX_ERR(0, 588, __pyx_L5_error) + __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; + __pyx_v_idx3 = __pyx_t_4; + + /* "aiohttp/_http_parser.pyx":589 + * try: + * idx3 = len(self._path) + * idx1 = self._path.find("?") # <<<<<<<<<<<<<< + * if idx1 == -1: + * query = "" + */ + if (unlikely(__pyx_v_self->__pyx_base._path == Py_None)) { + PyErr_Format(PyExc_AttributeError, "'NoneType' object has no attribute '%.30s'", "find"); + __PYX_ERR(0, 589, __pyx_L5_error) + } + __pyx_t_4 = PyUnicode_Find(__pyx_v_self->__pyx_base._path, __pyx_kp_u__7, 0, PY_SSIZE_T_MAX, 1); if (unlikely(__pyx_t_4 == ((Py_ssize_t)-2))) __PYX_ERR(0, 589, __pyx_L5_error) + __pyx_v_idx1 = __pyx_t_4; + + /* "aiohttp/_http_parser.pyx":590 + * idx3 = len(self._path) + * idx1 = self._path.find("?") + * if idx1 == -1: # <<<<<<<<<<<<<< + * query = "" + * idx2 = self._path.find("#") + */ + __pyx_t_2 = ((__pyx_v_idx1 == -1L) != 0); + if (__pyx_t_2) { + + /* "aiohttp/_http_parser.pyx":591 + * idx1 = self._path.find("?") + * if idx1 == -1: + * query = "" # <<<<<<<<<<<<<< + * idx2 = self._path.find("#") + * if idx2 == -1: + */ + __Pyx_INCREF(__pyx_kp_u__4); + __pyx_v_query = __pyx_kp_u__4; + + /* "aiohttp/_http_parser.pyx":592 + * if idx1 == -1: + * query = "" + * idx2 = self._path.find("#") # <<<<<<<<<<<<<< + * if idx2 == -1: + * path = self._path + */ + if (unlikely(__pyx_v_self->__pyx_base._path == Py_None)) { + PyErr_Format(PyExc_AttributeError, "'NoneType' object has no attribute '%.30s'", "find"); + __PYX_ERR(0, 592, __pyx_L5_error) + } + __pyx_t_4 = PyUnicode_Find(__pyx_v_self->__pyx_base._path, __pyx_kp_u__8, 0, PY_SSIZE_T_MAX, 1); if (unlikely(__pyx_t_4 == ((Py_ssize_t)-2))) __PYX_ERR(0, 592, __pyx_L5_error) + __pyx_v_idx2 = __pyx_t_4; + + /* "aiohttp/_http_parser.pyx":593 + * query = "" + * idx2 = self._path.find("#") + * if idx2 == -1: # <<<<<<<<<<<<<< + * path = self._path + * fragment = "" + */ + __pyx_t_2 = ((__pyx_v_idx2 == -1L) != 0); + if (__pyx_t_2) { + + /* "aiohttp/_http_parser.pyx":594 + * idx2 = self._path.find("#") + * if idx2 == -1: + * path = self._path # <<<<<<<<<<<<<< + * fragment = "" + * else: + */ + __pyx_t_3 = __pyx_v_self->__pyx_base._path; + __Pyx_INCREF(__pyx_t_3); + __pyx_v_path = ((PyObject*)__pyx_t_3); + __pyx_t_3 = 0; + + /* "aiohttp/_http_parser.pyx":595 + * if idx2 == -1: + * path = self._path + * fragment = "" # <<<<<<<<<<<<<< + * else: + * path = self._path[0: idx2] + */ + __Pyx_INCREF(__pyx_kp_u__4); + __pyx_v_fragment = __pyx_kp_u__4; + + /* "aiohttp/_http_parser.pyx":593 + * query = "" + * idx2 = self._path.find("#") + * if idx2 == -1: # <<<<<<<<<<<<<< + * path = self._path + * fragment = "" + */ + goto __pyx_L8; + } + + /* "aiohttp/_http_parser.pyx":597 + * fragment = "" + * else: + * path = self._path[0: idx2] # <<<<<<<<<<<<<< + * fragment = self._path[idx2+1:] + * + */ + /*else*/ { + if (unlikely(__pyx_v_self->__pyx_base._path == Py_None)) { + PyErr_SetString(PyExc_TypeError, "'NoneType' object is not subscriptable"); + __PYX_ERR(0, 597, __pyx_L5_error) + } + __pyx_t_3 = __Pyx_PyUnicode_Substring(__pyx_v_self->__pyx_base._path, 0, __pyx_v_idx2); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 597, __pyx_L5_error) + __Pyx_GOTREF(__pyx_t_3); + __pyx_v_path = ((PyObject*)__pyx_t_3); + __pyx_t_3 = 0; + + /* "aiohttp/_http_parser.pyx":598 + * else: + * path = self._path[0: idx2] + * fragment = self._path[idx2+1:] # <<<<<<<<<<<<<< + * + * else: + */ + if (unlikely(__pyx_v_self->__pyx_base._path == Py_None)) { + PyErr_SetString(PyExc_TypeError, "'NoneType' object is not subscriptable"); + __PYX_ERR(0, 598, __pyx_L5_error) + } + __pyx_t_3 = __Pyx_PyUnicode_Substring(__pyx_v_self->__pyx_base._path, (__pyx_v_idx2 + 1), PY_SSIZE_T_MAX); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 598, __pyx_L5_error) + __Pyx_GOTREF(__pyx_t_3); + __pyx_v_fragment = ((PyObject*)__pyx_t_3); + __pyx_t_3 = 0; + } + __pyx_L8:; + + /* "aiohttp/_http_parser.pyx":590 + * idx3 = len(self._path) + * idx1 = self._path.find("?") + * if idx1 == -1: # <<<<<<<<<<<<<< + * query = "" + * idx2 = self._path.find("#") + */ + goto __pyx_L7; + } + + /* "aiohttp/_http_parser.pyx":601 + * + * else: + * path = self._path[0:idx1] # <<<<<<<<<<<<<< + * idx1 += 1 + * idx2 = self._path.find("#", idx1+1) + */ + /*else*/ { + if (unlikely(__pyx_v_self->__pyx_base._path == Py_None)) { + PyErr_SetString(PyExc_TypeError, "'NoneType' object is not subscriptable"); + __PYX_ERR(0, 601, __pyx_L5_error) + } + __pyx_t_3 = __Pyx_PyUnicode_Substring(__pyx_v_self->__pyx_base._path, 0, __pyx_v_idx1); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 601, __pyx_L5_error) + __Pyx_GOTREF(__pyx_t_3); + __pyx_v_path = ((PyObject*)__pyx_t_3); + __pyx_t_3 = 0; + + /* "aiohttp/_http_parser.pyx":602 + * else: + * path = self._path[0:idx1] + * idx1 += 1 # <<<<<<<<<<<<<< + * idx2 = self._path.find("#", idx1+1) + * if idx2 == -1: + */ + __pyx_v_idx1 = (__pyx_v_idx1 + 1); + + /* "aiohttp/_http_parser.pyx":603 + * path = self._path[0:idx1] + * idx1 += 1 + * idx2 = self._path.find("#", idx1+1) # <<<<<<<<<<<<<< + * if idx2 == -1: + * query = self._path[idx1:] + */ + if (unlikely(__pyx_v_self->__pyx_base._path == Py_None)) { + PyErr_Format(PyExc_AttributeError, "'NoneType' object has no attribute '%.30s'", "find"); + __PYX_ERR(0, 603, __pyx_L5_error) + } + __pyx_t_3 = __Pyx_PyInt_From_long((__pyx_v_idx1 + 1)); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 603, __pyx_L5_error) + __Pyx_GOTREF(__pyx_t_3); + __pyx_t_4 = __Pyx_PyIndex_AsSsize_t(__pyx_t_3); if (unlikely((__pyx_t_4 == (Py_ssize_t)-1) && PyErr_Occurred())) __PYX_ERR(0, 603, __pyx_L5_error) + __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; + __pyx_t_5 = PyUnicode_Find(__pyx_v_self->__pyx_base._path, __pyx_kp_u__8, __pyx_t_4, PY_SSIZE_T_MAX, 1); if (unlikely(__pyx_t_5 == ((Py_ssize_t)-2))) __PYX_ERR(0, 603, __pyx_L5_error) + __pyx_v_idx2 = __pyx_t_5; + + /* "aiohttp/_http_parser.pyx":604 + * idx1 += 1 + * idx2 = self._path.find("#", idx1+1) + * if idx2 == -1: # <<<<<<<<<<<<<< + * query = self._path[idx1:] + * fragment = "" + */ + __pyx_t_2 = ((__pyx_v_idx2 == -1L) != 0); + if (__pyx_t_2) { + + /* "aiohttp/_http_parser.pyx":605 + * idx2 = self._path.find("#", idx1+1) + * if idx2 == -1: + * query = self._path[idx1:] # <<<<<<<<<<<<<< + * fragment = "" + * else: + */ + if (unlikely(__pyx_v_self->__pyx_base._path == Py_None)) { + PyErr_SetString(PyExc_TypeError, "'NoneType' object is not subscriptable"); + __PYX_ERR(0, 605, __pyx_L5_error) + } + __pyx_t_3 = __Pyx_PyUnicode_Substring(__pyx_v_self->__pyx_base._path, __pyx_v_idx1, PY_SSIZE_T_MAX); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 605, __pyx_L5_error) + __Pyx_GOTREF(__pyx_t_3); + __pyx_v_query = ((PyObject*)__pyx_t_3); + __pyx_t_3 = 0; + + /* "aiohttp/_http_parser.pyx":606 + * if idx2 == -1: + * query = self._path[idx1:] + * fragment = "" # <<<<<<<<<<<<<< + * else: + * query = self._path[idx1: idx2] + */ + __Pyx_INCREF(__pyx_kp_u__4); + __pyx_v_fragment = __pyx_kp_u__4; + + /* "aiohttp/_http_parser.pyx":604 + * idx1 += 1 + * idx2 = self._path.find("#", idx1+1) + * if idx2 == -1: # <<<<<<<<<<<<<< + * query = self._path[idx1:] + * fragment = "" + */ + goto __pyx_L9; + } + + /* "aiohttp/_http_parser.pyx":608 + * fragment = "" + * else: + * query = self._path[idx1: idx2] # <<<<<<<<<<<<<< + * fragment = self._path[idx2+1:] + * + */ + /*else*/ { + if (unlikely(__pyx_v_self->__pyx_base._path == Py_None)) { + PyErr_SetString(PyExc_TypeError, "'NoneType' object is not subscriptable"); + __PYX_ERR(0, 608, __pyx_L5_error) + } + __pyx_t_3 = __Pyx_PyUnicode_Substring(__pyx_v_self->__pyx_base._path, __pyx_v_idx1, __pyx_v_idx2); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 608, __pyx_L5_error) + __Pyx_GOTREF(__pyx_t_3); + __pyx_v_query = ((PyObject*)__pyx_t_3); + __pyx_t_3 = 0; + + /* "aiohttp/_http_parser.pyx":609 + * else: + * query = self._path[idx1: idx2] + * fragment = self._path[idx2+1:] # <<<<<<<<<<<<<< + * + * self._url = URL.build( + */ + if (unlikely(__pyx_v_self->__pyx_base._path == Py_None)) { + PyErr_SetString(PyExc_TypeError, "'NoneType' object is not subscriptable"); + __PYX_ERR(0, 609, __pyx_L5_error) + } + __pyx_t_3 = __Pyx_PyUnicode_Substring(__pyx_v_self->__pyx_base._path, (__pyx_v_idx2 + 1), PY_SSIZE_T_MAX); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 609, __pyx_L5_error) + __Pyx_GOTREF(__pyx_t_3); + __pyx_v_fragment = ((PyObject*)__pyx_t_3); + __pyx_t_3 = 0; + } + __pyx_L9:; + } + __pyx_L7:; + + /* "aiohttp/_http_parser.pyx":611 + * fragment = self._path[idx2+1:] + * + * self._url = URL.build( # <<<<<<<<<<<<<< + * path=path, + * query_string=query, + */ + __pyx_t_3 = __Pyx_PyObject_GetAttrStr(__pyx_v_7aiohttp_12_http_parser_URL, __pyx_n_s_build); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 611, __pyx_L5_error) + __Pyx_GOTREF(__pyx_t_3); + + /* "aiohttp/_http_parser.pyx":612 + * + * self._url = URL.build( + * path=path, # <<<<<<<<<<<<<< + * query_string=query, + * fragment=fragment, + */ + __pyx_t_6 = __Pyx_PyDict_NewPresized(4); if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 612, __pyx_L5_error) + __Pyx_GOTREF(__pyx_t_6); + if (PyDict_SetItem(__pyx_t_6, __pyx_n_s_path, __pyx_v_path) < 0) __PYX_ERR(0, 612, __pyx_L5_error) + + /* "aiohttp/_http_parser.pyx":613 + * self._url = URL.build( + * path=path, + * query_string=query, # <<<<<<<<<<<<<< + * fragment=fragment, + * encoded=True, + */ + if (PyDict_SetItem(__pyx_t_6, __pyx_n_s_query_string, __pyx_v_query) < 0) __PYX_ERR(0, 612, __pyx_L5_error) + + /* "aiohttp/_http_parser.pyx":614 + * path=path, + * query_string=query, + * fragment=fragment, # <<<<<<<<<<<<<< + * encoded=True, + * ) + */ + if (PyDict_SetItem(__pyx_t_6, __pyx_n_s_fragment, __pyx_v_fragment) < 0) __PYX_ERR(0, 612, __pyx_L5_error) + + /* "aiohttp/_http_parser.pyx":615 + * query_string=query, + * fragment=fragment, + * encoded=True, # <<<<<<<<<<<<<< + * ) + * finally: + */ + if (PyDict_SetItem(__pyx_t_6, __pyx_n_s_encoded, Py_True) < 0) __PYX_ERR(0, 612, __pyx_L5_error) + + /* "aiohttp/_http_parser.pyx":611 + * fragment = self._path[idx2+1:] + * + * self._url = URL.build( # <<<<<<<<<<<<<< + * path=path, + * query_string=query, + */ + __pyx_t_7 = __Pyx_PyObject_Call(__pyx_t_3, __pyx_empty_tuple, __pyx_t_6); if (unlikely(!__pyx_t_7)) __PYX_ERR(0, 611, __pyx_L5_error) + __Pyx_GOTREF(__pyx_t_7); + __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; + __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0; + __Pyx_GIVEREF(__pyx_t_7); + __Pyx_GOTREF(__pyx_v_self->__pyx_base._url); + __Pyx_DECREF(__pyx_v_self->__pyx_base._url); + __pyx_v_self->__pyx_base._url = __pyx_t_7; + __pyx_t_7 = 0; + } + + /* "aiohttp/_http_parser.pyx":618 + * ) + * finally: + * PyByteArray_Resize(self._buf, 0) # <<<<<<<<<<<<<< + * + * + */ + /*finally:*/ { + /*normal exit:*/{ + __pyx_t_7 = __pyx_v_self->__pyx_base._buf; + __Pyx_INCREF(__pyx_t_7); + __pyx_t_8 = PyByteArray_Resize(__pyx_t_7, 0); if (unlikely(__pyx_t_8 == ((int)-1))) __PYX_ERR(0, 618, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0; + goto __pyx_L6; + } + __pyx_L5_error:; + /*exception exit:*/{ + __Pyx_PyThreadState_declare + __Pyx_PyThreadState_assign + __pyx_t_11 = 0; __pyx_t_12 = 0; __pyx_t_13 = 0; __pyx_t_14 = 0; __pyx_t_15 = 0; __pyx_t_16 = 0; + __Pyx_XDECREF(__pyx_t_3); __pyx_t_3 = 0; + __Pyx_XDECREF(__pyx_t_6); __pyx_t_6 = 0; + __Pyx_XDECREF(__pyx_t_7); __pyx_t_7 = 0; + if (PY_MAJOR_VERSION >= 3) __Pyx_ExceptionSwap(&__pyx_t_14, &__pyx_t_15, &__pyx_t_16); + if ((PY_MAJOR_VERSION < 3) || unlikely(__Pyx_GetException(&__pyx_t_11, &__pyx_t_12, &__pyx_t_13) < 0)) __Pyx_ErrFetch(&__pyx_t_11, &__pyx_t_12, &__pyx_t_13); + __Pyx_XGOTREF(__pyx_t_11); + __Pyx_XGOTREF(__pyx_t_12); + __Pyx_XGOTREF(__pyx_t_13); + __Pyx_XGOTREF(__pyx_t_14); + __Pyx_XGOTREF(__pyx_t_15); + __Pyx_XGOTREF(__pyx_t_16); + __pyx_t_8 = __pyx_lineno; __pyx_t_9 = __pyx_clineno; __pyx_t_10 = __pyx_filename; + { + __pyx_t_7 = __pyx_v_self->__pyx_base._buf; + __Pyx_INCREF(__pyx_t_7); + __pyx_t_17 = PyByteArray_Resize(__pyx_t_7, 0); if (unlikely(__pyx_t_17 == ((int)-1))) __PYX_ERR(0, 618, __pyx_L11_error) + __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0; + } + if (PY_MAJOR_VERSION >= 3) { + __Pyx_XGIVEREF(__pyx_t_14); + __Pyx_XGIVEREF(__pyx_t_15); + __Pyx_XGIVEREF(__pyx_t_16); + __Pyx_ExceptionReset(__pyx_t_14, __pyx_t_15, __pyx_t_16); + } + __Pyx_XGIVEREF(__pyx_t_11); + __Pyx_XGIVEREF(__pyx_t_12); + __Pyx_XGIVEREF(__pyx_t_13); + __Pyx_ErrRestore(__pyx_t_11, __pyx_t_12, __pyx_t_13); + __pyx_t_11 = 0; __pyx_t_12 = 0; __pyx_t_13 = 0; __pyx_t_14 = 0; __pyx_t_15 = 0; __pyx_t_16 = 0; + __pyx_lineno = __pyx_t_8; __pyx_clineno = __pyx_t_9; __pyx_filename = __pyx_t_10; + goto __pyx_L1_error; + __pyx_L11_error:; + if (PY_MAJOR_VERSION >= 3) { + __Pyx_XGIVEREF(__pyx_t_14); + __Pyx_XGIVEREF(__pyx_t_15); + __Pyx_XGIVEREF(__pyx_t_16); + __Pyx_ExceptionReset(__pyx_t_14, __pyx_t_15, __pyx_t_16); + } + __Pyx_XDECREF(__pyx_t_11); __pyx_t_11 = 0; + __Pyx_XDECREF(__pyx_t_12); __pyx_t_12 = 0; + __Pyx_XDECREF(__pyx_t_13); __pyx_t_13 = 0; + __pyx_t_14 = 0; __pyx_t_15 = 0; __pyx_t_16 = 0; + goto __pyx_L1_error; + } + __pyx_L6:; + } + + /* "aiohttp/_http_parser.pyx":582 + * auto_decompress) + * + * cdef object _on_status_complete(self): # <<<<<<<<<<<<<< + * cdef int idx1, idx2 + * if not self._buf: + */ + + /* function exit code */ + __pyx_r = Py_None; __Pyx_INCREF(Py_None); + goto __pyx_L0; + __pyx_L1_error:; + __Pyx_XDECREF(__pyx_t_3); + __Pyx_XDECREF(__pyx_t_6); + __Pyx_XDECREF(__pyx_t_7); + __Pyx_AddTraceback("aiohttp._http_parser.HttpRequestParser._on_status_complete", __pyx_clineno, __pyx_lineno, __pyx_filename); + __pyx_r = 0; + __pyx_L0:; + __Pyx_XDECREF(__pyx_v_query); + __Pyx_XDECREF(__pyx_v_path); + __Pyx_XDECREF(__pyx_v_fragment); + __Pyx_XGIVEREF(__pyx_r); + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +/* "(tree fragment)":1 + * def __reduce_cython__(self): # <<<<<<<<<<<<<< + * raise TypeError("no default __reduce__ due to non-trivial __cinit__") + * def __setstate_cython__(self, __pyx_state): + */ + +/* Python wrapper */ +static PyObject *__pyx_pw_7aiohttp_12_http_parser_17HttpRequestParser_3__reduce_cython__(PyObject *__pyx_v_self, CYTHON_UNUSED PyObject *unused); /*proto*/ +static PyObject *__pyx_pw_7aiohttp_12_http_parser_17HttpRequestParser_3__reduce_cython__(PyObject *__pyx_v_self, CYTHON_UNUSED PyObject *unused) { + PyObject *__pyx_r = 0; + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("__reduce_cython__ (wrapper)", 0); + __pyx_r = __pyx_pf_7aiohttp_12_http_parser_17HttpRequestParser_2__reduce_cython__(((struct __pyx_obj_7aiohttp_12_http_parser_HttpRequestParser *)__pyx_v_self)); + + /* function exit code */ + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +static PyObject *__pyx_pf_7aiohttp_12_http_parser_17HttpRequestParser_2__reduce_cython__(CYTHON_UNUSED struct __pyx_obj_7aiohttp_12_http_parser_HttpRequestParser *__pyx_v_self) { + PyObject *__pyx_r = NULL; + __Pyx_RefNannyDeclarations + PyObject *__pyx_t_1 = NULL; + int __pyx_lineno = 0; + const char *__pyx_filename = NULL; + int __pyx_clineno = 0; + __Pyx_RefNannySetupContext("__reduce_cython__", 0); + + /* "(tree fragment)":2 + * def __reduce_cython__(self): + * raise TypeError("no default __reduce__ due to non-trivial __cinit__") # <<<<<<<<<<<<<< + * def __setstate_cython__(self, __pyx_state): + * raise TypeError("no default __reduce__ due to non-trivial __cinit__") + */ + __pyx_t_1 = __Pyx_PyObject_Call(__pyx_builtin_TypeError, __pyx_tuple__9, NULL); if (unlikely(!__pyx_t_1)) __PYX_ERR(1, 2, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __Pyx_Raise(__pyx_t_1, 0, 0, 0); + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + __PYX_ERR(1, 2, __pyx_L1_error) + + /* "(tree fragment)":1 + * def __reduce_cython__(self): # <<<<<<<<<<<<<< + * raise TypeError("no default __reduce__ due to non-trivial __cinit__") + * def __setstate_cython__(self, __pyx_state): + */ + + /* function exit code */ + __pyx_L1_error:; + __Pyx_XDECREF(__pyx_t_1); + __Pyx_AddTraceback("aiohttp._http_parser.HttpRequestParser.__reduce_cython__", __pyx_clineno, __pyx_lineno, __pyx_filename); + __pyx_r = NULL; + __Pyx_XGIVEREF(__pyx_r); + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +/* "(tree fragment)":3 + * def __reduce_cython__(self): + * raise TypeError("no default __reduce__ due to non-trivial __cinit__") + * def __setstate_cython__(self, __pyx_state): # <<<<<<<<<<<<<< + * raise TypeError("no default __reduce__ due to non-trivial __cinit__") + */ + +/* Python wrapper */ +static PyObject *__pyx_pw_7aiohttp_12_http_parser_17HttpRequestParser_5__setstate_cython__(PyObject *__pyx_v_self, PyObject *__pyx_v___pyx_state); /*proto*/ +static PyObject *__pyx_pw_7aiohttp_12_http_parser_17HttpRequestParser_5__setstate_cython__(PyObject *__pyx_v_self, PyObject *__pyx_v___pyx_state) { + PyObject *__pyx_r = 0; + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("__setstate_cython__ (wrapper)", 0); + __pyx_r = __pyx_pf_7aiohttp_12_http_parser_17HttpRequestParser_4__setstate_cython__(((struct __pyx_obj_7aiohttp_12_http_parser_HttpRequestParser *)__pyx_v_self), ((PyObject *)__pyx_v___pyx_state)); + + /* function exit code */ + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +static PyObject *__pyx_pf_7aiohttp_12_http_parser_17HttpRequestParser_4__setstate_cython__(CYTHON_UNUSED struct __pyx_obj_7aiohttp_12_http_parser_HttpRequestParser *__pyx_v_self, CYTHON_UNUSED PyObject *__pyx_v___pyx_state) { + PyObject *__pyx_r = NULL; + __Pyx_RefNannyDeclarations + PyObject *__pyx_t_1 = NULL; + int __pyx_lineno = 0; + const char *__pyx_filename = NULL; + int __pyx_clineno = 0; + __Pyx_RefNannySetupContext("__setstate_cython__", 0); + + /* "(tree fragment)":4 + * raise TypeError("no default __reduce__ due to non-trivial __cinit__") + * def __setstate_cython__(self, __pyx_state): + * raise TypeError("no default __reduce__ due to non-trivial __cinit__") # <<<<<<<<<<<<<< + */ + __pyx_t_1 = __Pyx_PyObject_Call(__pyx_builtin_TypeError, __pyx_tuple__10, NULL); if (unlikely(!__pyx_t_1)) __PYX_ERR(1, 4, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __Pyx_Raise(__pyx_t_1, 0, 0, 0); + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + __PYX_ERR(1, 4, __pyx_L1_error) + + /* "(tree fragment)":3 + * def __reduce_cython__(self): + * raise TypeError("no default __reduce__ due to non-trivial __cinit__") + * def __setstate_cython__(self, __pyx_state): # <<<<<<<<<<<<<< + * raise TypeError("no default __reduce__ due to non-trivial __cinit__") + */ + + /* function exit code */ + __pyx_L1_error:; + __Pyx_XDECREF(__pyx_t_1); + __Pyx_AddTraceback("aiohttp._http_parser.HttpRequestParser.__setstate_cython__", __pyx_clineno, __pyx_lineno, __pyx_filename); + __pyx_r = NULL; + __Pyx_XGIVEREF(__pyx_r); + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +/* "aiohttp/_http_parser.pyx":623 + * cdef class HttpResponseParser(HttpParser): + * + * def __init__( # <<<<<<<<<<<<<< + * self, protocol, loop, int limit, timer=None, + * size_t max_line_size=8190, size_t max_headers=32768, + */ + +/* Python wrapper */ +static int __pyx_pw_7aiohttp_12_http_parser_18HttpResponseParser_1__init__(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/ +static int __pyx_pw_7aiohttp_12_http_parser_18HttpResponseParser_1__init__(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds) { + PyObject *__pyx_v_protocol = 0; + PyObject *__pyx_v_loop = 0; + int __pyx_v_limit; + PyObject *__pyx_v_timer = 0; + size_t __pyx_v_max_line_size; + size_t __pyx_v_max_headers; + size_t __pyx_v_max_field_size; + PyObject *__pyx_v_payload_exception = 0; + int __pyx_v_response_with_body; + int __pyx_v_read_until_eof; + int __pyx_v_auto_decompress; + int __pyx_lineno = 0; + const char *__pyx_filename = NULL; + int __pyx_clineno = 0; + int __pyx_r; + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("__init__ (wrapper)", 0); + { + static PyObject **__pyx_pyargnames[] = {&__pyx_n_s_protocol,&__pyx_n_s_loop,&__pyx_n_s_limit,&__pyx_n_s_timer,&__pyx_n_s_max_line_size,&__pyx_n_s_max_headers,&__pyx_n_s_max_field_size,&__pyx_n_s_payload_exception,&__pyx_n_s_response_with_body,&__pyx_n_s_read_until_eof,&__pyx_n_s_auto_decompress,0}; + PyObject* values[11] = {0,0,0,0,0,0,0,0,0,0,0}; + + /* "aiohttp/_http_parser.pyx":624 + * + * def __init__( + * self, protocol, loop, int limit, timer=None, # <<<<<<<<<<<<<< + * size_t max_line_size=8190, size_t max_headers=32768, + * size_t max_field_size=8190, payload_exception=None, + */ + values[3] = ((PyObject *)Py_None); + + /* "aiohttp/_http_parser.pyx":626 + * self, protocol, loop, int limit, timer=None, + * size_t max_line_size=8190, size_t max_headers=32768, + * size_t max_field_size=8190, payload_exception=None, # <<<<<<<<<<<<<< + * bint response_with_body=True, bint read_until_eof=False, + * bint auto_decompress=True + */ + values[7] = ((PyObject *)Py_None); + if (unlikely(__pyx_kwds)) { + Py_ssize_t kw_args; + const Py_ssize_t pos_args = PyTuple_GET_SIZE(__pyx_args); + switch (pos_args) { + case 11: values[10] = PyTuple_GET_ITEM(__pyx_args, 10); + CYTHON_FALLTHROUGH; + case 10: values[9] = PyTuple_GET_ITEM(__pyx_args, 9); + CYTHON_FALLTHROUGH; + case 9: values[8] = PyTuple_GET_ITEM(__pyx_args, 8); + CYTHON_FALLTHROUGH; + case 8: values[7] = PyTuple_GET_ITEM(__pyx_args, 7); + CYTHON_FALLTHROUGH; + case 7: values[6] = PyTuple_GET_ITEM(__pyx_args, 6); + CYTHON_FALLTHROUGH; + case 6: values[5] = PyTuple_GET_ITEM(__pyx_args, 5); + CYTHON_FALLTHROUGH; + case 5: values[4] = PyTuple_GET_ITEM(__pyx_args, 4); + CYTHON_FALLTHROUGH; + case 4: values[3] = PyTuple_GET_ITEM(__pyx_args, 3); + CYTHON_FALLTHROUGH; + case 3: values[2] = PyTuple_GET_ITEM(__pyx_args, 2); + CYTHON_FALLTHROUGH; + case 2: values[1] = PyTuple_GET_ITEM(__pyx_args, 1); + CYTHON_FALLTHROUGH; + case 1: values[0] = PyTuple_GET_ITEM(__pyx_args, 0); + CYTHON_FALLTHROUGH; + case 0: break; + default: goto __pyx_L5_argtuple_error; + } + kw_args = PyDict_Size(__pyx_kwds); + switch (pos_args) { + case 0: + if (likely((values[0] = __Pyx_PyDict_GetItemStr(__pyx_kwds, __pyx_n_s_protocol)) != 0)) kw_args--; + else goto __pyx_L5_argtuple_error; + CYTHON_FALLTHROUGH; + case 1: + if (likely((values[1] = __Pyx_PyDict_GetItemStr(__pyx_kwds, __pyx_n_s_loop)) != 0)) kw_args--; + else { + __Pyx_RaiseArgtupleInvalid("__init__", 0, 3, 11, 1); __PYX_ERR(0, 623, __pyx_L3_error) + } + CYTHON_FALLTHROUGH; + case 2: + if (likely((values[2] = __Pyx_PyDict_GetItemStr(__pyx_kwds, __pyx_n_s_limit)) != 0)) kw_args--; + else { + __Pyx_RaiseArgtupleInvalid("__init__", 0, 3, 11, 2); __PYX_ERR(0, 623, __pyx_L3_error) + } + CYTHON_FALLTHROUGH; + case 3: + if (kw_args > 0) { + PyObject* value = __Pyx_PyDict_GetItemStr(__pyx_kwds, __pyx_n_s_timer); + if (value) { values[3] = value; kw_args--; } + } + CYTHON_FALLTHROUGH; + case 4: + if (kw_args > 0) { + PyObject* value = __Pyx_PyDict_GetItemStr(__pyx_kwds, __pyx_n_s_max_line_size); + if (value) { values[4] = value; kw_args--; } + } + CYTHON_FALLTHROUGH; + case 5: + if (kw_args > 0) { + PyObject* value = __Pyx_PyDict_GetItemStr(__pyx_kwds, __pyx_n_s_max_headers); + if (value) { values[5] = value; kw_args--; } + } + CYTHON_FALLTHROUGH; + case 6: + if (kw_args > 0) { + PyObject* value = __Pyx_PyDict_GetItemStr(__pyx_kwds, __pyx_n_s_max_field_size); + if (value) { values[6] = value; kw_args--; } + } + CYTHON_FALLTHROUGH; + case 7: + if (kw_args > 0) { + PyObject* value = __Pyx_PyDict_GetItemStr(__pyx_kwds, __pyx_n_s_payload_exception); + if (value) { values[7] = value; kw_args--; } + } + CYTHON_FALLTHROUGH; + case 8: + if (kw_args > 0) { + PyObject* value = __Pyx_PyDict_GetItemStr(__pyx_kwds, __pyx_n_s_response_with_body); + if (value) { values[8] = value; kw_args--; } + } + CYTHON_FALLTHROUGH; + case 9: + if (kw_args > 0) { + PyObject* value = __Pyx_PyDict_GetItemStr(__pyx_kwds, __pyx_n_s_read_until_eof); + if (value) { values[9] = value; kw_args--; } + } + CYTHON_FALLTHROUGH; + case 10: + if (kw_args > 0) { + PyObject* value = __Pyx_PyDict_GetItemStr(__pyx_kwds, __pyx_n_s_auto_decompress); + if (value) { values[10] = value; kw_args--; } + } + } + if (unlikely(kw_args > 0)) { + if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, pos_args, "__init__") < 0)) __PYX_ERR(0, 623, __pyx_L3_error) + } + } else { + switch (PyTuple_GET_SIZE(__pyx_args)) { + case 11: values[10] = PyTuple_GET_ITEM(__pyx_args, 10); + CYTHON_FALLTHROUGH; + case 10: values[9] = PyTuple_GET_ITEM(__pyx_args, 9); + CYTHON_FALLTHROUGH; + case 9: values[8] = PyTuple_GET_ITEM(__pyx_args, 8); + CYTHON_FALLTHROUGH; + case 8: values[7] = PyTuple_GET_ITEM(__pyx_args, 7); + CYTHON_FALLTHROUGH; + case 7: values[6] = PyTuple_GET_ITEM(__pyx_args, 6); + CYTHON_FALLTHROUGH; + case 6: values[5] = PyTuple_GET_ITEM(__pyx_args, 5); + CYTHON_FALLTHROUGH; + case 5: values[4] = PyTuple_GET_ITEM(__pyx_args, 4); + CYTHON_FALLTHROUGH; + case 4: values[3] = PyTuple_GET_ITEM(__pyx_args, 3); + CYTHON_FALLTHROUGH; + case 3: values[2] = PyTuple_GET_ITEM(__pyx_args, 2); + values[1] = PyTuple_GET_ITEM(__pyx_args, 1); + values[0] = PyTuple_GET_ITEM(__pyx_args, 0); + break; + default: goto __pyx_L5_argtuple_error; + } + } + __pyx_v_protocol = values[0]; + __pyx_v_loop = values[1]; + __pyx_v_limit = __Pyx_PyInt_As_int(values[2]); if (unlikely((__pyx_v_limit == (int)-1) && PyErr_Occurred())) __PYX_ERR(0, 624, __pyx_L3_error) + __pyx_v_timer = values[3]; + if (values[4]) { + __pyx_v_max_line_size = __Pyx_PyInt_As_size_t(values[4]); if (unlikely((__pyx_v_max_line_size == (size_t)-1) && PyErr_Occurred())) __PYX_ERR(0, 625, __pyx_L3_error) + } else { + __pyx_v_max_line_size = ((size_t)0x1FFE); + } + if (values[5]) { + __pyx_v_max_headers = __Pyx_PyInt_As_size_t(values[5]); if (unlikely((__pyx_v_max_headers == (size_t)-1) && PyErr_Occurred())) __PYX_ERR(0, 625, __pyx_L3_error) + } else { + __pyx_v_max_headers = ((size_t)0x8000); + } + if (values[6]) { + __pyx_v_max_field_size = __Pyx_PyInt_As_size_t(values[6]); if (unlikely((__pyx_v_max_field_size == (size_t)-1) && PyErr_Occurred())) __PYX_ERR(0, 626, __pyx_L3_error) + } else { + __pyx_v_max_field_size = ((size_t)0x1FFE); + } + __pyx_v_payload_exception = values[7]; + if (values[8]) { + __pyx_v_response_with_body = __Pyx_PyObject_IsTrue(values[8]); if (unlikely((__pyx_v_response_with_body == (int)-1) && PyErr_Occurred())) __PYX_ERR(0, 627, __pyx_L3_error) + } else { + + /* "aiohttp/_http_parser.pyx":627 + * size_t max_line_size=8190, size_t max_headers=32768, + * size_t max_field_size=8190, payload_exception=None, + * bint response_with_body=True, bint read_until_eof=False, # <<<<<<<<<<<<<< + * bint auto_decompress=True + * ): + */ + __pyx_v_response_with_body = ((int)1); + } + if (values[9]) { + __pyx_v_read_until_eof = __Pyx_PyObject_IsTrue(values[9]); if (unlikely((__pyx_v_read_until_eof == (int)-1) && PyErr_Occurred())) __PYX_ERR(0, 627, __pyx_L3_error) + } else { + __pyx_v_read_until_eof = ((int)0); + } + if (values[10]) { + __pyx_v_auto_decompress = __Pyx_PyObject_IsTrue(values[10]); if (unlikely((__pyx_v_auto_decompress == (int)-1) && PyErr_Occurred())) __PYX_ERR(0, 628, __pyx_L3_error) + } else { + + /* "aiohttp/_http_parser.pyx":628 + * size_t max_field_size=8190, payload_exception=None, + * bint response_with_body=True, bint read_until_eof=False, + * bint auto_decompress=True # <<<<<<<<<<<<<< + * ): + * self._init(cparser.HTTP_RESPONSE, protocol, loop, limit, timer, + */ + __pyx_v_auto_decompress = ((int)1); + } + } + goto __pyx_L4_argument_unpacking_done; + __pyx_L5_argtuple_error:; + __Pyx_RaiseArgtupleInvalid("__init__", 0, 3, 11, PyTuple_GET_SIZE(__pyx_args)); __PYX_ERR(0, 623, __pyx_L3_error) + __pyx_L3_error:; + __Pyx_AddTraceback("aiohttp._http_parser.HttpResponseParser.__init__", __pyx_clineno, __pyx_lineno, __pyx_filename); + __Pyx_RefNannyFinishContext(); + return -1; + __pyx_L4_argument_unpacking_done:; + __pyx_r = __pyx_pf_7aiohttp_12_http_parser_18HttpResponseParser___init__(((struct __pyx_obj_7aiohttp_12_http_parser_HttpResponseParser *)__pyx_v_self), __pyx_v_protocol, __pyx_v_loop, __pyx_v_limit, __pyx_v_timer, __pyx_v_max_line_size, __pyx_v_max_headers, __pyx_v_max_field_size, __pyx_v_payload_exception, __pyx_v_response_with_body, __pyx_v_read_until_eof, __pyx_v_auto_decompress); + + /* "aiohttp/_http_parser.pyx":623 + * cdef class HttpResponseParser(HttpParser): + * + * def __init__( # <<<<<<<<<<<<<< + * self, protocol, loop, int limit, timer=None, + * size_t max_line_size=8190, size_t max_headers=32768, + */ + + /* function exit code */ + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +static int __pyx_pf_7aiohttp_12_http_parser_18HttpResponseParser___init__(struct __pyx_obj_7aiohttp_12_http_parser_HttpResponseParser *__pyx_v_self, PyObject *__pyx_v_protocol, PyObject *__pyx_v_loop, int __pyx_v_limit, PyObject *__pyx_v_timer, size_t __pyx_v_max_line_size, size_t __pyx_v_max_headers, size_t __pyx_v_max_field_size, PyObject *__pyx_v_payload_exception, int __pyx_v_response_with_body, int __pyx_v_read_until_eof, int __pyx_v_auto_decompress) { + int __pyx_r; + __Pyx_RefNannyDeclarations + PyObject *__pyx_t_1 = NULL; + struct __pyx_opt_args_7aiohttp_12_http_parser_10HttpParser__init __pyx_t_2; + int __pyx_lineno = 0; + const char *__pyx_filename = NULL; + int __pyx_clineno = 0; + __Pyx_RefNannySetupContext("__init__", 0); + + /* "aiohttp/_http_parser.pyx":630 + * bint auto_decompress=True + * ): + * self._init(cparser.HTTP_RESPONSE, protocol, loop, limit, timer, # <<<<<<<<<<<<<< + * max_line_size, max_headers, max_field_size, + * payload_exception, response_with_body, read_until_eof, + */ + __pyx_t_2.__pyx_n = 8; + __pyx_t_2.timer = __pyx_v_timer; + __pyx_t_2.max_line_size = __pyx_v_max_line_size; + __pyx_t_2.max_headers = __pyx_v_max_headers; + __pyx_t_2.max_field_size = __pyx_v_max_field_size; + __pyx_t_2.payload_exception = __pyx_v_payload_exception; + __pyx_t_2.response_with_body = __pyx_v_response_with_body; + __pyx_t_2.read_until_eof = __pyx_v_read_until_eof; + __pyx_t_2.auto_decompress = __pyx_v_auto_decompress; + __pyx_t_1 = ((struct __pyx_vtabstruct_7aiohttp_12_http_parser_HttpResponseParser *)__pyx_v_self->__pyx_base.__pyx_vtab)->__pyx_base._init(((struct __pyx_obj_7aiohttp_12_http_parser_HttpParser *)__pyx_v_self), HTTP_RESPONSE, __pyx_v_protocol, __pyx_v_loop, __pyx_v_limit, &__pyx_t_2); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 630, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + + /* "aiohttp/_http_parser.pyx":623 + * cdef class HttpResponseParser(HttpParser): + * + * def __init__( # <<<<<<<<<<<<<< + * self, protocol, loop, int limit, timer=None, + * size_t max_line_size=8190, size_t max_headers=32768, + */ + + /* function exit code */ + __pyx_r = 0; + goto __pyx_L0; + __pyx_L1_error:; + __Pyx_XDECREF(__pyx_t_1); + __Pyx_AddTraceback("aiohttp._http_parser.HttpResponseParser.__init__", __pyx_clineno, __pyx_lineno, __pyx_filename); + __pyx_r = -1; + __pyx_L0:; + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +/* "aiohttp/_http_parser.pyx":635 + * auto_decompress) + * + * cdef object _on_status_complete(self): # <<<<<<<<<<<<<< + * if self._buf: + * self._reason = self._buf.decode('utf-8', 'surrogateescape') + */ + +static PyObject *__pyx_f_7aiohttp_12_http_parser_18HttpResponseParser__on_status_complete(struct __pyx_obj_7aiohttp_12_http_parser_HttpResponseParser *__pyx_v_self) { + PyObject *__pyx_r = NULL; + __Pyx_RefNannyDeclarations + int __pyx_t_1; + PyObject *__pyx_t_2 = NULL; + int __pyx_t_3; + int __pyx_lineno = 0; + const char *__pyx_filename = NULL; + int __pyx_clineno = 0; + __Pyx_RefNannySetupContext("_on_status_complete", 0); + + /* "aiohttp/_http_parser.pyx":636 + * + * cdef object _on_status_complete(self): + * if self._buf: # <<<<<<<<<<<<<< + * self._reason = self._buf.decode('utf-8', 'surrogateescape') + * PyByteArray_Resize(self._buf, 0) + */ + __pyx_t_1 = (__pyx_v_self->__pyx_base._buf != Py_None)&&(PyByteArray_GET_SIZE(__pyx_v_self->__pyx_base._buf) != 0); + if (__pyx_t_1) { + + /* "aiohttp/_http_parser.pyx":637 + * cdef object _on_status_complete(self): + * if self._buf: + * self._reason = self._buf.decode('utf-8', 'surrogateescape') # <<<<<<<<<<<<<< + * PyByteArray_Resize(self._buf, 0) + * else: + */ + if (unlikely(__pyx_v_self->__pyx_base._buf == Py_None)) { + PyErr_Format(PyExc_AttributeError, "'NoneType' object has no attribute '%.30s'", "decode"); + __PYX_ERR(0, 637, __pyx_L1_error) + } + __pyx_t_2 = __Pyx_decode_bytearray(__pyx_v_self->__pyx_base._buf, 0, PY_SSIZE_T_MAX, NULL, ((char const *)"surrogateescape"), PyUnicode_DecodeUTF8); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 637, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_2); + __Pyx_GIVEREF(__pyx_t_2); + __Pyx_GOTREF(__pyx_v_self->__pyx_base._reason); + __Pyx_DECREF(__pyx_v_self->__pyx_base._reason); + __pyx_v_self->__pyx_base._reason = ((PyObject*)__pyx_t_2); + __pyx_t_2 = 0; + + /* "aiohttp/_http_parser.pyx":638 + * if self._buf: + * self._reason = self._buf.decode('utf-8', 'surrogateescape') + * PyByteArray_Resize(self._buf, 0) # <<<<<<<<<<<<<< + * else: + * self._reason = self._reason or '' + */ + __pyx_t_2 = __pyx_v_self->__pyx_base._buf; + __Pyx_INCREF(__pyx_t_2); + __pyx_t_3 = PyByteArray_Resize(__pyx_t_2, 0); if (unlikely(__pyx_t_3 == ((int)-1))) __PYX_ERR(0, 638, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; + + /* "aiohttp/_http_parser.pyx":636 + * + * cdef object _on_status_complete(self): + * if self._buf: # <<<<<<<<<<<<<< + * self._reason = self._buf.decode('utf-8', 'surrogateescape') + * PyByteArray_Resize(self._buf, 0) + */ + goto __pyx_L3; + } + + /* "aiohttp/_http_parser.pyx":640 + * PyByteArray_Resize(self._buf, 0) + * else: + * self._reason = self._reason or '' # <<<<<<<<<<<<<< + * + * cdef int cb_on_message_begin(cparser.llhttp_t* parser) except -1: + */ + /*else*/ { + __pyx_t_1 = __Pyx_PyObject_IsTrue(__pyx_v_self->__pyx_base._reason); if (unlikely(__pyx_t_1 < 0)) __PYX_ERR(0, 640, __pyx_L1_error) + if (!__pyx_t_1) { + } else { + __Pyx_INCREF(__pyx_v_self->__pyx_base._reason); + __pyx_t_2 = __pyx_v_self->__pyx_base._reason; + goto __pyx_L4_bool_binop_done; + } + __Pyx_INCREF(__pyx_kp_u__4); + __pyx_t_2 = __pyx_kp_u__4; + __pyx_L4_bool_binop_done:; + __Pyx_GIVEREF(__pyx_t_2); + __Pyx_GOTREF(__pyx_v_self->__pyx_base._reason); + __Pyx_DECREF(__pyx_v_self->__pyx_base._reason); + __pyx_v_self->__pyx_base._reason = ((PyObject*)__pyx_t_2); + __pyx_t_2 = 0; + } + __pyx_L3:; + + /* "aiohttp/_http_parser.pyx":635 + * auto_decompress) + * + * cdef object _on_status_complete(self): # <<<<<<<<<<<<<< + * if self._buf: + * self._reason = self._buf.decode('utf-8', 'surrogateescape') + */ + + /* function exit code */ + __pyx_r = Py_None; __Pyx_INCREF(Py_None); + goto __pyx_L0; + __pyx_L1_error:; + __Pyx_XDECREF(__pyx_t_2); + __Pyx_AddTraceback("aiohttp._http_parser.HttpResponseParser._on_status_complete", __pyx_clineno, __pyx_lineno, __pyx_filename); + __pyx_r = 0; + __pyx_L0:; + __Pyx_XGIVEREF(__pyx_r); + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +/* "(tree fragment)":1 + * def __reduce_cython__(self): # <<<<<<<<<<<<<< + * raise TypeError("no default __reduce__ due to non-trivial __cinit__") + * def __setstate_cython__(self, __pyx_state): + */ + +/* Python wrapper */ +static PyObject *__pyx_pw_7aiohttp_12_http_parser_18HttpResponseParser_3__reduce_cython__(PyObject *__pyx_v_self, CYTHON_UNUSED PyObject *unused); /*proto*/ +static PyObject *__pyx_pw_7aiohttp_12_http_parser_18HttpResponseParser_3__reduce_cython__(PyObject *__pyx_v_self, CYTHON_UNUSED PyObject *unused) { + PyObject *__pyx_r = 0; + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("__reduce_cython__ (wrapper)", 0); + __pyx_r = __pyx_pf_7aiohttp_12_http_parser_18HttpResponseParser_2__reduce_cython__(((struct __pyx_obj_7aiohttp_12_http_parser_HttpResponseParser *)__pyx_v_self)); + + /* function exit code */ + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +static PyObject *__pyx_pf_7aiohttp_12_http_parser_18HttpResponseParser_2__reduce_cython__(CYTHON_UNUSED struct __pyx_obj_7aiohttp_12_http_parser_HttpResponseParser *__pyx_v_self) { + PyObject *__pyx_r = NULL; + __Pyx_RefNannyDeclarations + PyObject *__pyx_t_1 = NULL; + int __pyx_lineno = 0; + const char *__pyx_filename = NULL; + int __pyx_clineno = 0; + __Pyx_RefNannySetupContext("__reduce_cython__", 0); + + /* "(tree fragment)":2 + * def __reduce_cython__(self): + * raise TypeError("no default __reduce__ due to non-trivial __cinit__") # <<<<<<<<<<<<<< + * def __setstate_cython__(self, __pyx_state): + * raise TypeError("no default __reduce__ due to non-trivial __cinit__") + */ + __pyx_t_1 = __Pyx_PyObject_Call(__pyx_builtin_TypeError, __pyx_tuple__11, NULL); if (unlikely(!__pyx_t_1)) __PYX_ERR(1, 2, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __Pyx_Raise(__pyx_t_1, 0, 0, 0); + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + __PYX_ERR(1, 2, __pyx_L1_error) + + /* "(tree fragment)":1 + * def __reduce_cython__(self): # <<<<<<<<<<<<<< + * raise TypeError("no default __reduce__ due to non-trivial __cinit__") + * def __setstate_cython__(self, __pyx_state): + */ + + /* function exit code */ + __pyx_L1_error:; + __Pyx_XDECREF(__pyx_t_1); + __Pyx_AddTraceback("aiohttp._http_parser.HttpResponseParser.__reduce_cython__", __pyx_clineno, __pyx_lineno, __pyx_filename); + __pyx_r = NULL; + __Pyx_XGIVEREF(__pyx_r); + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +/* "(tree fragment)":3 + * def __reduce_cython__(self): + * raise TypeError("no default __reduce__ due to non-trivial __cinit__") + * def __setstate_cython__(self, __pyx_state): # <<<<<<<<<<<<<< + * raise TypeError("no default __reduce__ due to non-trivial __cinit__") + */ + +/* Python wrapper */ +static PyObject *__pyx_pw_7aiohttp_12_http_parser_18HttpResponseParser_5__setstate_cython__(PyObject *__pyx_v_self, PyObject *__pyx_v___pyx_state); /*proto*/ +static PyObject *__pyx_pw_7aiohttp_12_http_parser_18HttpResponseParser_5__setstate_cython__(PyObject *__pyx_v_self, PyObject *__pyx_v___pyx_state) { + PyObject *__pyx_r = 0; + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("__setstate_cython__ (wrapper)", 0); + __pyx_r = __pyx_pf_7aiohttp_12_http_parser_18HttpResponseParser_4__setstate_cython__(((struct __pyx_obj_7aiohttp_12_http_parser_HttpResponseParser *)__pyx_v_self), ((PyObject *)__pyx_v___pyx_state)); + + /* function exit code */ + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +static PyObject *__pyx_pf_7aiohttp_12_http_parser_18HttpResponseParser_4__setstate_cython__(CYTHON_UNUSED struct __pyx_obj_7aiohttp_12_http_parser_HttpResponseParser *__pyx_v_self, CYTHON_UNUSED PyObject *__pyx_v___pyx_state) { + PyObject *__pyx_r = NULL; + __Pyx_RefNannyDeclarations + PyObject *__pyx_t_1 = NULL; + int __pyx_lineno = 0; + const char *__pyx_filename = NULL; + int __pyx_clineno = 0; + __Pyx_RefNannySetupContext("__setstate_cython__", 0); + + /* "(tree fragment)":4 + * raise TypeError("no default __reduce__ due to non-trivial __cinit__") + * def __setstate_cython__(self, __pyx_state): + * raise TypeError("no default __reduce__ due to non-trivial __cinit__") # <<<<<<<<<<<<<< + */ + __pyx_t_1 = __Pyx_PyObject_Call(__pyx_builtin_TypeError, __pyx_tuple__12, NULL); if (unlikely(!__pyx_t_1)) __PYX_ERR(1, 4, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __Pyx_Raise(__pyx_t_1, 0, 0, 0); + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + __PYX_ERR(1, 4, __pyx_L1_error) + + /* "(tree fragment)":3 + * def __reduce_cython__(self): + * raise TypeError("no default __reduce__ due to non-trivial __cinit__") + * def __setstate_cython__(self, __pyx_state): # <<<<<<<<<<<<<< + * raise TypeError("no default __reduce__ due to non-trivial __cinit__") + */ + + /* function exit code */ + __pyx_L1_error:; + __Pyx_XDECREF(__pyx_t_1); + __Pyx_AddTraceback("aiohttp._http_parser.HttpResponseParser.__setstate_cython__", __pyx_clineno, __pyx_lineno, __pyx_filename); + __pyx_r = NULL; + __Pyx_XGIVEREF(__pyx_r); + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +/* "aiohttp/_http_parser.pyx":642 + * self._reason = self._reason or '' + * + * cdef int cb_on_message_begin(cparser.llhttp_t* parser) except -1: # <<<<<<<<<<<<<< + * cdef HttpParser pyparser = parser.data + * + */ + +static int __pyx_f_7aiohttp_12_http_parser_cb_on_message_begin(llhttp_t *__pyx_v_parser) { + struct __pyx_obj_7aiohttp_12_http_parser_HttpParser *__pyx_v_pyparser = 0; + int __pyx_r; + __Pyx_RefNannyDeclarations + PyObject *__pyx_t_1 = NULL; + PyObject *__pyx_t_2 = NULL; + PyObject *__pyx_t_3 = NULL; + int __pyx_t_4; + int __pyx_lineno = 0; + const char *__pyx_filename = NULL; + int __pyx_clineno = 0; + __Pyx_RefNannySetupContext("cb_on_message_begin", 0); + + /* "aiohttp/_http_parser.pyx":643 + * + * cdef int cb_on_message_begin(cparser.llhttp_t* parser) except -1: + * cdef HttpParser pyparser = parser.data # <<<<<<<<<<<<<< + * + * pyparser._started = True + */ + __pyx_t_1 = ((PyObject *)__pyx_v_parser->data); + __Pyx_INCREF(__pyx_t_1); + __pyx_v_pyparser = ((struct __pyx_obj_7aiohttp_12_http_parser_HttpParser *)__pyx_t_1); + __pyx_t_1 = 0; + + /* "aiohttp/_http_parser.pyx":645 + * cdef HttpParser pyparser = parser.data + * + * pyparser._started = True # <<<<<<<<<<<<<< + * pyparser._headers = CIMultiDict() + * pyparser._raw_headers = [] + */ + __pyx_v_pyparser->_started = 1; + + /* "aiohttp/_http_parser.pyx":646 + * + * pyparser._started = True + * pyparser._headers = CIMultiDict() # <<<<<<<<<<<<<< + * pyparser._raw_headers = [] + * PyByteArray_Resize(pyparser._buf, 0) + */ + __Pyx_INCREF(__pyx_v_7aiohttp_12_http_parser_CIMultiDict); + __pyx_t_2 = __pyx_v_7aiohttp_12_http_parser_CIMultiDict; __pyx_t_3 = NULL; + if (CYTHON_UNPACK_METHODS && unlikely(PyMethod_Check(__pyx_t_2))) { + __pyx_t_3 = PyMethod_GET_SELF(__pyx_t_2); + if (likely(__pyx_t_3)) { + PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_2); + __Pyx_INCREF(__pyx_t_3); + __Pyx_INCREF(function); + __Pyx_DECREF_SET(__pyx_t_2, function); + } + } + __pyx_t_1 = (__pyx_t_3) ? __Pyx_PyObject_CallOneArg(__pyx_t_2, __pyx_t_3) : __Pyx_PyObject_CallNoArg(__pyx_t_2); + __Pyx_XDECREF(__pyx_t_3); __pyx_t_3 = 0; + if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 646, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; + __Pyx_GIVEREF(__pyx_t_1); + __Pyx_GOTREF(__pyx_v_pyparser->_headers); + __Pyx_DECREF(__pyx_v_pyparser->_headers); + __pyx_v_pyparser->_headers = __pyx_t_1; + __pyx_t_1 = 0; + + /* "aiohttp/_http_parser.pyx":647 + * pyparser._started = True + * pyparser._headers = CIMultiDict() + * pyparser._raw_headers = [] # <<<<<<<<<<<<<< + * PyByteArray_Resize(pyparser._buf, 0) + * pyparser._path = None + */ + __pyx_t_1 = PyList_New(0); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 647, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __Pyx_GIVEREF(__pyx_t_1); + __Pyx_GOTREF(__pyx_v_pyparser->_raw_headers); + __Pyx_DECREF(__pyx_v_pyparser->_raw_headers); + __pyx_v_pyparser->_raw_headers = ((PyObject*)__pyx_t_1); + __pyx_t_1 = 0; + + /* "aiohttp/_http_parser.pyx":648 + * pyparser._headers = CIMultiDict() + * pyparser._raw_headers = [] + * PyByteArray_Resize(pyparser._buf, 0) # <<<<<<<<<<<<<< + * pyparser._path = None + * pyparser._reason = None + */ + __pyx_t_1 = __pyx_v_pyparser->_buf; + __Pyx_INCREF(__pyx_t_1); + __pyx_t_4 = PyByteArray_Resize(__pyx_t_1, 0); if (unlikely(__pyx_t_4 == ((int)-1))) __PYX_ERR(0, 648, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + + /* "aiohttp/_http_parser.pyx":649 + * pyparser._raw_headers = [] + * PyByteArray_Resize(pyparser._buf, 0) + * pyparser._path = None # <<<<<<<<<<<<<< + * pyparser._reason = None + * return 0 + */ + __Pyx_INCREF(Py_None); + __Pyx_GIVEREF(Py_None); + __Pyx_GOTREF(__pyx_v_pyparser->_path); + __Pyx_DECREF(__pyx_v_pyparser->_path); + __pyx_v_pyparser->_path = ((PyObject*)Py_None); + + /* "aiohttp/_http_parser.pyx":650 + * PyByteArray_Resize(pyparser._buf, 0) + * pyparser._path = None + * pyparser._reason = None # <<<<<<<<<<<<<< + * return 0 + * + */ + __Pyx_INCREF(Py_None); + __Pyx_GIVEREF(Py_None); + __Pyx_GOTREF(__pyx_v_pyparser->_reason); + __Pyx_DECREF(__pyx_v_pyparser->_reason); + __pyx_v_pyparser->_reason = ((PyObject*)Py_None); + + /* "aiohttp/_http_parser.pyx":651 + * pyparser._path = None + * pyparser._reason = None + * return 0 # <<<<<<<<<<<<<< + * + * + */ + __pyx_r = 0; + goto __pyx_L0; + + /* "aiohttp/_http_parser.pyx":642 + * self._reason = self._reason or '' + * + * cdef int cb_on_message_begin(cparser.llhttp_t* parser) except -1: # <<<<<<<<<<<<<< + * cdef HttpParser pyparser = parser.data + * + */ + + /* function exit code */ + __pyx_L1_error:; + __Pyx_XDECREF(__pyx_t_1); + __Pyx_XDECREF(__pyx_t_2); + __Pyx_XDECREF(__pyx_t_3); + __Pyx_AddTraceback("aiohttp._http_parser.cb_on_message_begin", __pyx_clineno, __pyx_lineno, __pyx_filename); + __pyx_r = -1; + __pyx_L0:; + __Pyx_XDECREF((PyObject *)__pyx_v_pyparser); + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +/* "aiohttp/_http_parser.pyx":654 + * + * + * cdef int cb_on_url(cparser.llhttp_t* parser, # <<<<<<<<<<<<<< + * const char *at, size_t length) except -1: + * cdef HttpParser pyparser = parser.data + */ + +static int __pyx_f_7aiohttp_12_http_parser_cb_on_url(llhttp_t *__pyx_v_parser, char const *__pyx_v_at, size_t __pyx_v_length) { + struct __pyx_obj_7aiohttp_12_http_parser_HttpParser *__pyx_v_pyparser = 0; + PyObject *__pyx_v_ex = NULL; + int __pyx_r; + __Pyx_RefNannyDeclarations + PyObject *__pyx_t_1 = NULL; + PyObject *__pyx_t_2 = NULL; + PyObject *__pyx_t_3 = NULL; + PyObject *__pyx_t_4 = NULL; + int __pyx_t_5; + PyObject *__pyx_t_6 = NULL; + PyObject *__pyx_t_7 = NULL; + PyObject *__pyx_t_8 = NULL; + PyObject *__pyx_t_9 = NULL; + int __pyx_t_10; + PyObject *__pyx_t_11 = NULL; + int __pyx_lineno = 0; + const char *__pyx_filename = NULL; + int __pyx_clineno = 0; + __Pyx_RefNannySetupContext("cb_on_url", 0); + + /* "aiohttp/_http_parser.pyx":656 + * cdef int cb_on_url(cparser.llhttp_t* parser, + * const char *at, size_t length) except -1: + * cdef HttpParser pyparser = parser.data # <<<<<<<<<<<<<< + * try: + * if length > pyparser._max_line_size: + */ + __pyx_t_1 = ((PyObject *)__pyx_v_parser->data); + __Pyx_INCREF(__pyx_t_1); + __pyx_v_pyparser = ((struct __pyx_obj_7aiohttp_12_http_parser_HttpParser *)__pyx_t_1); + __pyx_t_1 = 0; + + /* "aiohttp/_http_parser.pyx":657 + * const char *at, size_t length) except -1: + * cdef HttpParser pyparser = parser.data + * try: # <<<<<<<<<<<<<< + * if length > pyparser._max_line_size: + * raise LineTooLong( + */ + { + __Pyx_PyThreadState_declare + __Pyx_PyThreadState_assign + __Pyx_ExceptionSave(&__pyx_t_2, &__pyx_t_3, &__pyx_t_4); + __Pyx_XGOTREF(__pyx_t_2); + __Pyx_XGOTREF(__pyx_t_3); + __Pyx_XGOTREF(__pyx_t_4); + /*try:*/ { + + /* "aiohttp/_http_parser.pyx":658 + * cdef HttpParser pyparser = parser.data + * try: + * if length > pyparser._max_line_size: # <<<<<<<<<<<<<< + * raise LineTooLong( + * 'Status line is too long', pyparser._max_line_size, length) + */ + __pyx_t_5 = ((__pyx_v_length > __pyx_v_pyparser->_max_line_size) != 0); + if (unlikely(__pyx_t_5)) { + + /* "aiohttp/_http_parser.pyx":659 + * try: + * if length > pyparser._max_line_size: + * raise LineTooLong( # <<<<<<<<<<<<<< + * 'Status line is too long', pyparser._max_line_size, length) + * extend(pyparser._buf, at, length) + */ + __Pyx_GetModuleGlobalName(__pyx_t_6, __pyx_n_s_LineTooLong); if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 659, __pyx_L3_error) + __Pyx_GOTREF(__pyx_t_6); + + /* "aiohttp/_http_parser.pyx":660 + * if length > pyparser._max_line_size: + * raise LineTooLong( + * 'Status line is too long', pyparser._max_line_size, length) # <<<<<<<<<<<<<< + * extend(pyparser._buf, at, length) + * except BaseException as ex: + */ + __pyx_t_7 = __Pyx_PyInt_FromSize_t(__pyx_v_pyparser->_max_line_size); if (unlikely(!__pyx_t_7)) __PYX_ERR(0, 660, __pyx_L3_error) + __Pyx_GOTREF(__pyx_t_7); + __pyx_t_8 = __Pyx_PyInt_FromSize_t(__pyx_v_length); if (unlikely(!__pyx_t_8)) __PYX_ERR(0, 660, __pyx_L3_error) + __Pyx_GOTREF(__pyx_t_8); + __pyx_t_9 = NULL; + __pyx_t_10 = 0; + if (CYTHON_UNPACK_METHODS && unlikely(PyMethod_Check(__pyx_t_6))) { + __pyx_t_9 = PyMethod_GET_SELF(__pyx_t_6); + if (likely(__pyx_t_9)) { + PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_6); + __Pyx_INCREF(__pyx_t_9); + __Pyx_INCREF(function); + __Pyx_DECREF_SET(__pyx_t_6, function); + __pyx_t_10 = 1; + } + } + #if CYTHON_FAST_PYCALL + if (PyFunction_Check(__pyx_t_6)) { + PyObject *__pyx_temp[4] = {__pyx_t_9, __pyx_kp_u_Status_line_is_too_long, __pyx_t_7, __pyx_t_8}; + __pyx_t_1 = __Pyx_PyFunction_FastCall(__pyx_t_6, __pyx_temp+1-__pyx_t_10, 3+__pyx_t_10); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 659, __pyx_L3_error) + __Pyx_XDECREF(__pyx_t_9); __pyx_t_9 = 0; + __Pyx_GOTREF(__pyx_t_1); + __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0; + __Pyx_DECREF(__pyx_t_8); __pyx_t_8 = 0; + } else + #endif + #if CYTHON_FAST_PYCCALL + if (__Pyx_PyFastCFunction_Check(__pyx_t_6)) { + PyObject *__pyx_temp[4] = {__pyx_t_9, __pyx_kp_u_Status_line_is_too_long, __pyx_t_7, __pyx_t_8}; + __pyx_t_1 = __Pyx_PyCFunction_FastCall(__pyx_t_6, __pyx_temp+1-__pyx_t_10, 3+__pyx_t_10); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 659, __pyx_L3_error) + __Pyx_XDECREF(__pyx_t_9); __pyx_t_9 = 0; + __Pyx_GOTREF(__pyx_t_1); + __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0; + __Pyx_DECREF(__pyx_t_8); __pyx_t_8 = 0; + } else + #endif + { + __pyx_t_11 = PyTuple_New(3+__pyx_t_10); if (unlikely(!__pyx_t_11)) __PYX_ERR(0, 659, __pyx_L3_error) + __Pyx_GOTREF(__pyx_t_11); + if (__pyx_t_9) { + __Pyx_GIVEREF(__pyx_t_9); PyTuple_SET_ITEM(__pyx_t_11, 0, __pyx_t_9); __pyx_t_9 = NULL; + } + __Pyx_INCREF(__pyx_kp_u_Status_line_is_too_long); + __Pyx_GIVEREF(__pyx_kp_u_Status_line_is_too_long); + PyTuple_SET_ITEM(__pyx_t_11, 0+__pyx_t_10, __pyx_kp_u_Status_line_is_too_long); + __Pyx_GIVEREF(__pyx_t_7); + PyTuple_SET_ITEM(__pyx_t_11, 1+__pyx_t_10, __pyx_t_7); + __Pyx_GIVEREF(__pyx_t_8); + PyTuple_SET_ITEM(__pyx_t_11, 2+__pyx_t_10, __pyx_t_8); + __pyx_t_7 = 0; + __pyx_t_8 = 0; + __pyx_t_1 = __Pyx_PyObject_Call(__pyx_t_6, __pyx_t_11, NULL); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 659, __pyx_L3_error) + __Pyx_GOTREF(__pyx_t_1); + __Pyx_DECREF(__pyx_t_11); __pyx_t_11 = 0; + } + __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0; + __Pyx_Raise(__pyx_t_1, 0, 0, 0); + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + __PYX_ERR(0, 659, __pyx_L3_error) + + /* "aiohttp/_http_parser.pyx":658 + * cdef HttpParser pyparser = parser.data + * try: + * if length > pyparser._max_line_size: # <<<<<<<<<<<<<< + * raise LineTooLong( + * 'Status line is too long', pyparser._max_line_size, length) + */ + } + + /* "aiohttp/_http_parser.pyx":661 + * raise LineTooLong( + * 'Status line is too long', pyparser._max_line_size, length) + * extend(pyparser._buf, at, length) # <<<<<<<<<<<<<< + * except BaseException as ex: + * pyparser._last_error = ex + */ + __pyx_t_1 = __pyx_v_pyparser->_buf; + __Pyx_INCREF(__pyx_t_1); + __pyx_t_6 = __pyx_f_7aiohttp_12_http_parser_extend(__pyx_t_1, __pyx_v_at, __pyx_v_length); if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 661, __pyx_L3_error) + __Pyx_GOTREF(__pyx_t_6); + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0; + + /* "aiohttp/_http_parser.pyx":657 + * const char *at, size_t length) except -1: + * cdef HttpParser pyparser = parser.data + * try: # <<<<<<<<<<<<<< + * if length > pyparser._max_line_size: + * raise LineTooLong( + */ + } + + /* "aiohttp/_http_parser.pyx":666 + * return -1 + * else: + * return 0 # <<<<<<<<<<<<<< + * + * + */ + /*else:*/ { + __pyx_r = 0; + goto __pyx_L6_except_return; + } + __pyx_L3_error:; + __Pyx_XDECREF(__pyx_t_1); __pyx_t_1 = 0; + __Pyx_XDECREF(__pyx_t_11); __pyx_t_11 = 0; + __Pyx_XDECREF(__pyx_t_6); __pyx_t_6 = 0; + __Pyx_XDECREF(__pyx_t_7); __pyx_t_7 = 0; + __Pyx_XDECREF(__pyx_t_8); __pyx_t_8 = 0; + __Pyx_XDECREF(__pyx_t_9); __pyx_t_9 = 0; + + /* "aiohttp/_http_parser.pyx":662 + * 'Status line is too long', pyparser._max_line_size, length) + * extend(pyparser._buf, at, length) + * except BaseException as ex: # <<<<<<<<<<<<<< + * pyparser._last_error = ex + * return -1 + */ + __pyx_t_10 = __Pyx_PyErr_ExceptionMatches(__pyx_builtin_BaseException); + if (__pyx_t_10) { + __Pyx_AddTraceback("aiohttp._http_parser.cb_on_url", __pyx_clineno, __pyx_lineno, __pyx_filename); + if (__Pyx_GetException(&__pyx_t_6, &__pyx_t_1, &__pyx_t_11) < 0) __PYX_ERR(0, 662, __pyx_L5_except_error) + __Pyx_GOTREF(__pyx_t_6); + __Pyx_GOTREF(__pyx_t_1); + __Pyx_GOTREF(__pyx_t_11); + __Pyx_INCREF(__pyx_t_1); + __pyx_v_ex = __pyx_t_1; + /*try:*/ { + + /* "aiohttp/_http_parser.pyx":663 + * extend(pyparser._buf, at, length) + * except BaseException as ex: + * pyparser._last_error = ex # <<<<<<<<<<<<<< + * return -1 + * else: + */ + __Pyx_INCREF(__pyx_v_ex); + __Pyx_GIVEREF(__pyx_v_ex); + __Pyx_GOTREF(__pyx_v_pyparser->_last_error); + __Pyx_DECREF(__pyx_v_pyparser->_last_error); + __pyx_v_pyparser->_last_error = __pyx_v_ex; + + /* "aiohttp/_http_parser.pyx":664 + * except BaseException as ex: + * pyparser._last_error = ex + * return -1 # <<<<<<<<<<<<<< + * else: + * return 0 + */ + __pyx_r = -1; + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0; + __Pyx_DECREF(__pyx_t_11); __pyx_t_11 = 0; + goto __pyx_L14_return; + } + + /* "aiohttp/_http_parser.pyx":662 + * 'Status line is too long', pyparser._max_line_size, length) + * extend(pyparser._buf, at, length) + * except BaseException as ex: # <<<<<<<<<<<<<< + * pyparser._last_error = ex + * return -1 + */ + /*finally:*/ { + __pyx_L14_return: { + __pyx_t_10 = __pyx_r; + __Pyx_DECREF(__pyx_v_ex); + __pyx_v_ex = NULL; + __pyx_r = __pyx_t_10; + goto __pyx_L6_except_return; + } + } + } + goto __pyx_L5_except_error; + __pyx_L5_except_error:; + + /* "aiohttp/_http_parser.pyx":657 + * const char *at, size_t length) except -1: + * cdef HttpParser pyparser = parser.data + * try: # <<<<<<<<<<<<<< + * if length > pyparser._max_line_size: + * raise LineTooLong( + */ + __Pyx_XGIVEREF(__pyx_t_2); + __Pyx_XGIVEREF(__pyx_t_3); + __Pyx_XGIVEREF(__pyx_t_4); + __Pyx_ExceptionReset(__pyx_t_2, __pyx_t_3, __pyx_t_4); + goto __pyx_L1_error; + __pyx_L6_except_return:; + __Pyx_XGIVEREF(__pyx_t_2); + __Pyx_XGIVEREF(__pyx_t_3); + __Pyx_XGIVEREF(__pyx_t_4); + __Pyx_ExceptionReset(__pyx_t_2, __pyx_t_3, __pyx_t_4); + goto __pyx_L0; + } + + /* "aiohttp/_http_parser.pyx":654 + * + * + * cdef int cb_on_url(cparser.llhttp_t* parser, # <<<<<<<<<<<<<< + * const char *at, size_t length) except -1: + * cdef HttpParser pyparser = parser.data + */ + + /* function exit code */ + __pyx_L1_error:; + __Pyx_XDECREF(__pyx_t_1); + __Pyx_XDECREF(__pyx_t_6); + __Pyx_XDECREF(__pyx_t_7); + __Pyx_XDECREF(__pyx_t_8); + __Pyx_XDECREF(__pyx_t_9); + __Pyx_XDECREF(__pyx_t_11); + __Pyx_AddTraceback("aiohttp._http_parser.cb_on_url", __pyx_clineno, __pyx_lineno, __pyx_filename); + __pyx_r = -1; + __pyx_L0:; + __Pyx_XDECREF((PyObject *)__pyx_v_pyparser); + __Pyx_XDECREF(__pyx_v_ex); + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +/* "aiohttp/_http_parser.pyx":669 + * + * + * cdef int cb_on_status(cparser.llhttp_t* parser, # <<<<<<<<<<<<<< + * const char *at, size_t length) except -1: + * cdef HttpParser pyparser = parser.data + */ + +static int __pyx_f_7aiohttp_12_http_parser_cb_on_status(llhttp_t *__pyx_v_parser, char const *__pyx_v_at, size_t __pyx_v_length) { + struct __pyx_obj_7aiohttp_12_http_parser_HttpParser *__pyx_v_pyparser = 0; + PyObject *__pyx_v_ex = NULL; + int __pyx_r; + __Pyx_RefNannyDeclarations + PyObject *__pyx_t_1 = NULL; + PyObject *__pyx_t_2 = NULL; + PyObject *__pyx_t_3 = NULL; + PyObject *__pyx_t_4 = NULL; + int __pyx_t_5; + PyObject *__pyx_t_6 = NULL; + PyObject *__pyx_t_7 = NULL; + PyObject *__pyx_t_8 = NULL; + PyObject *__pyx_t_9 = NULL; + int __pyx_t_10; + PyObject *__pyx_t_11 = NULL; + int __pyx_lineno = 0; + const char *__pyx_filename = NULL; + int __pyx_clineno = 0; + __Pyx_RefNannySetupContext("cb_on_status", 0); + + /* "aiohttp/_http_parser.pyx":671 + * cdef int cb_on_status(cparser.llhttp_t* parser, + * const char *at, size_t length) except -1: + * cdef HttpParser pyparser = parser.data # <<<<<<<<<<<<<< + * cdef str reason + * try: + */ + __pyx_t_1 = ((PyObject *)__pyx_v_parser->data); + __Pyx_INCREF(__pyx_t_1); + __pyx_v_pyparser = ((struct __pyx_obj_7aiohttp_12_http_parser_HttpParser *)__pyx_t_1); + __pyx_t_1 = 0; + + /* "aiohttp/_http_parser.pyx":673 + * cdef HttpParser pyparser = parser.data + * cdef str reason + * try: # <<<<<<<<<<<<<< + * if length > pyparser._max_line_size: + * raise LineTooLong( + */ + { + __Pyx_PyThreadState_declare + __Pyx_PyThreadState_assign + __Pyx_ExceptionSave(&__pyx_t_2, &__pyx_t_3, &__pyx_t_4); + __Pyx_XGOTREF(__pyx_t_2); + __Pyx_XGOTREF(__pyx_t_3); + __Pyx_XGOTREF(__pyx_t_4); + /*try:*/ { + + /* "aiohttp/_http_parser.pyx":674 + * cdef str reason + * try: + * if length > pyparser._max_line_size: # <<<<<<<<<<<<<< + * raise LineTooLong( + * 'Status line is too long', pyparser._max_line_size, length) + */ + __pyx_t_5 = ((__pyx_v_length > __pyx_v_pyparser->_max_line_size) != 0); + if (unlikely(__pyx_t_5)) { + + /* "aiohttp/_http_parser.pyx":675 + * try: + * if length > pyparser._max_line_size: + * raise LineTooLong( # <<<<<<<<<<<<<< + * 'Status line is too long', pyparser._max_line_size, length) + * extend(pyparser._buf, at, length) + */ + __Pyx_GetModuleGlobalName(__pyx_t_6, __pyx_n_s_LineTooLong); if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 675, __pyx_L3_error) + __Pyx_GOTREF(__pyx_t_6); + + /* "aiohttp/_http_parser.pyx":676 + * if length > pyparser._max_line_size: + * raise LineTooLong( + * 'Status line is too long', pyparser._max_line_size, length) # <<<<<<<<<<<<<< + * extend(pyparser._buf, at, length) + * except BaseException as ex: + */ + __pyx_t_7 = __Pyx_PyInt_FromSize_t(__pyx_v_pyparser->_max_line_size); if (unlikely(!__pyx_t_7)) __PYX_ERR(0, 676, __pyx_L3_error) + __Pyx_GOTREF(__pyx_t_7); + __pyx_t_8 = __Pyx_PyInt_FromSize_t(__pyx_v_length); if (unlikely(!__pyx_t_8)) __PYX_ERR(0, 676, __pyx_L3_error) + __Pyx_GOTREF(__pyx_t_8); + __pyx_t_9 = NULL; + __pyx_t_10 = 0; + if (CYTHON_UNPACK_METHODS && unlikely(PyMethod_Check(__pyx_t_6))) { + __pyx_t_9 = PyMethod_GET_SELF(__pyx_t_6); + if (likely(__pyx_t_9)) { + PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_6); + __Pyx_INCREF(__pyx_t_9); + __Pyx_INCREF(function); + __Pyx_DECREF_SET(__pyx_t_6, function); + __pyx_t_10 = 1; + } + } + #if CYTHON_FAST_PYCALL + if (PyFunction_Check(__pyx_t_6)) { + PyObject *__pyx_temp[4] = {__pyx_t_9, __pyx_kp_u_Status_line_is_too_long, __pyx_t_7, __pyx_t_8}; + __pyx_t_1 = __Pyx_PyFunction_FastCall(__pyx_t_6, __pyx_temp+1-__pyx_t_10, 3+__pyx_t_10); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 675, __pyx_L3_error) + __Pyx_XDECREF(__pyx_t_9); __pyx_t_9 = 0; + __Pyx_GOTREF(__pyx_t_1); + __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0; + __Pyx_DECREF(__pyx_t_8); __pyx_t_8 = 0; + } else + #endif + #if CYTHON_FAST_PYCCALL + if (__Pyx_PyFastCFunction_Check(__pyx_t_6)) { + PyObject *__pyx_temp[4] = {__pyx_t_9, __pyx_kp_u_Status_line_is_too_long, __pyx_t_7, __pyx_t_8}; + __pyx_t_1 = __Pyx_PyCFunction_FastCall(__pyx_t_6, __pyx_temp+1-__pyx_t_10, 3+__pyx_t_10); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 675, __pyx_L3_error) + __Pyx_XDECREF(__pyx_t_9); __pyx_t_9 = 0; + __Pyx_GOTREF(__pyx_t_1); + __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0; + __Pyx_DECREF(__pyx_t_8); __pyx_t_8 = 0; + } else + #endif + { + __pyx_t_11 = PyTuple_New(3+__pyx_t_10); if (unlikely(!__pyx_t_11)) __PYX_ERR(0, 675, __pyx_L3_error) + __Pyx_GOTREF(__pyx_t_11); + if (__pyx_t_9) { + __Pyx_GIVEREF(__pyx_t_9); PyTuple_SET_ITEM(__pyx_t_11, 0, __pyx_t_9); __pyx_t_9 = NULL; + } + __Pyx_INCREF(__pyx_kp_u_Status_line_is_too_long); + __Pyx_GIVEREF(__pyx_kp_u_Status_line_is_too_long); + PyTuple_SET_ITEM(__pyx_t_11, 0+__pyx_t_10, __pyx_kp_u_Status_line_is_too_long); + __Pyx_GIVEREF(__pyx_t_7); + PyTuple_SET_ITEM(__pyx_t_11, 1+__pyx_t_10, __pyx_t_7); + __Pyx_GIVEREF(__pyx_t_8); + PyTuple_SET_ITEM(__pyx_t_11, 2+__pyx_t_10, __pyx_t_8); + __pyx_t_7 = 0; + __pyx_t_8 = 0; + __pyx_t_1 = __Pyx_PyObject_Call(__pyx_t_6, __pyx_t_11, NULL); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 675, __pyx_L3_error) + __Pyx_GOTREF(__pyx_t_1); + __Pyx_DECREF(__pyx_t_11); __pyx_t_11 = 0; + } + __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0; + __Pyx_Raise(__pyx_t_1, 0, 0, 0); + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + __PYX_ERR(0, 675, __pyx_L3_error) + + /* "aiohttp/_http_parser.pyx":674 + * cdef str reason + * try: + * if length > pyparser._max_line_size: # <<<<<<<<<<<<<< + * raise LineTooLong( + * 'Status line is too long', pyparser._max_line_size, length) + */ + } + + /* "aiohttp/_http_parser.pyx":677 + * raise LineTooLong( + * 'Status line is too long', pyparser._max_line_size, length) + * extend(pyparser._buf, at, length) # <<<<<<<<<<<<<< + * except BaseException as ex: + * pyparser._last_error = ex + */ + __pyx_t_1 = __pyx_v_pyparser->_buf; + __Pyx_INCREF(__pyx_t_1); + __pyx_t_6 = __pyx_f_7aiohttp_12_http_parser_extend(__pyx_t_1, __pyx_v_at, __pyx_v_length); if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 677, __pyx_L3_error) + __Pyx_GOTREF(__pyx_t_6); + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0; + + /* "aiohttp/_http_parser.pyx":673 + * cdef HttpParser pyparser = parser.data + * cdef str reason + * try: # <<<<<<<<<<<<<< + * if length > pyparser._max_line_size: + * raise LineTooLong( + */ + } + + /* "aiohttp/_http_parser.pyx":682 + * return -1 + * else: + * return 0 # <<<<<<<<<<<<<< + * + * + */ + /*else:*/ { + __pyx_r = 0; + goto __pyx_L6_except_return; + } + __pyx_L3_error:; + __Pyx_XDECREF(__pyx_t_1); __pyx_t_1 = 0; + __Pyx_XDECREF(__pyx_t_11); __pyx_t_11 = 0; + __Pyx_XDECREF(__pyx_t_6); __pyx_t_6 = 0; + __Pyx_XDECREF(__pyx_t_7); __pyx_t_7 = 0; + __Pyx_XDECREF(__pyx_t_8); __pyx_t_8 = 0; + __Pyx_XDECREF(__pyx_t_9); __pyx_t_9 = 0; + + /* "aiohttp/_http_parser.pyx":678 + * 'Status line is too long', pyparser._max_line_size, length) + * extend(pyparser._buf, at, length) + * except BaseException as ex: # <<<<<<<<<<<<<< + * pyparser._last_error = ex + * return -1 + */ + __pyx_t_10 = __Pyx_PyErr_ExceptionMatches(__pyx_builtin_BaseException); + if (__pyx_t_10) { + __Pyx_AddTraceback("aiohttp._http_parser.cb_on_status", __pyx_clineno, __pyx_lineno, __pyx_filename); + if (__Pyx_GetException(&__pyx_t_6, &__pyx_t_1, &__pyx_t_11) < 0) __PYX_ERR(0, 678, __pyx_L5_except_error) + __Pyx_GOTREF(__pyx_t_6); + __Pyx_GOTREF(__pyx_t_1); + __Pyx_GOTREF(__pyx_t_11); + __Pyx_INCREF(__pyx_t_1); + __pyx_v_ex = __pyx_t_1; + /*try:*/ { + + /* "aiohttp/_http_parser.pyx":679 + * extend(pyparser._buf, at, length) + * except BaseException as ex: + * pyparser._last_error = ex # <<<<<<<<<<<<<< + * return -1 + * else: + */ + __Pyx_INCREF(__pyx_v_ex); + __Pyx_GIVEREF(__pyx_v_ex); + __Pyx_GOTREF(__pyx_v_pyparser->_last_error); + __Pyx_DECREF(__pyx_v_pyparser->_last_error); + __pyx_v_pyparser->_last_error = __pyx_v_ex; + + /* "aiohttp/_http_parser.pyx":680 + * except BaseException as ex: + * pyparser._last_error = ex + * return -1 # <<<<<<<<<<<<<< + * else: + * return 0 + */ + __pyx_r = -1; + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0; + __Pyx_DECREF(__pyx_t_11); __pyx_t_11 = 0; + goto __pyx_L14_return; + } + + /* "aiohttp/_http_parser.pyx":678 + * 'Status line is too long', pyparser._max_line_size, length) + * extend(pyparser._buf, at, length) + * except BaseException as ex: # <<<<<<<<<<<<<< + * pyparser._last_error = ex + * return -1 + */ + /*finally:*/ { + __pyx_L14_return: { + __pyx_t_10 = __pyx_r; + __Pyx_DECREF(__pyx_v_ex); + __pyx_v_ex = NULL; + __pyx_r = __pyx_t_10; + goto __pyx_L6_except_return; + } + } + } + goto __pyx_L5_except_error; + __pyx_L5_except_error:; + + /* "aiohttp/_http_parser.pyx":673 + * cdef HttpParser pyparser = parser.data + * cdef str reason + * try: # <<<<<<<<<<<<<< + * if length > pyparser._max_line_size: + * raise LineTooLong( + */ + __Pyx_XGIVEREF(__pyx_t_2); + __Pyx_XGIVEREF(__pyx_t_3); + __Pyx_XGIVEREF(__pyx_t_4); + __Pyx_ExceptionReset(__pyx_t_2, __pyx_t_3, __pyx_t_4); + goto __pyx_L1_error; + __pyx_L6_except_return:; + __Pyx_XGIVEREF(__pyx_t_2); + __Pyx_XGIVEREF(__pyx_t_3); + __Pyx_XGIVEREF(__pyx_t_4); + __Pyx_ExceptionReset(__pyx_t_2, __pyx_t_3, __pyx_t_4); + goto __pyx_L0; + } + + /* "aiohttp/_http_parser.pyx":669 + * + * + * cdef int cb_on_status(cparser.llhttp_t* parser, # <<<<<<<<<<<<<< + * const char *at, size_t length) except -1: + * cdef HttpParser pyparser = parser.data + */ + + /* function exit code */ + __pyx_L1_error:; + __Pyx_XDECREF(__pyx_t_1); + __Pyx_XDECREF(__pyx_t_6); + __Pyx_XDECREF(__pyx_t_7); + __Pyx_XDECREF(__pyx_t_8); + __Pyx_XDECREF(__pyx_t_9); + __Pyx_XDECREF(__pyx_t_11); + __Pyx_AddTraceback("aiohttp._http_parser.cb_on_status", __pyx_clineno, __pyx_lineno, __pyx_filename); + __pyx_r = -1; + __pyx_L0:; + __Pyx_XDECREF((PyObject *)__pyx_v_pyparser); + __Pyx_XDECREF(__pyx_v_ex); + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +/* "aiohttp/_http_parser.pyx":685 + * + * + * cdef int cb_on_header_field(cparser.llhttp_t* parser, # <<<<<<<<<<<<<< + * const char *at, size_t length) except -1: + * cdef HttpParser pyparser = parser.data + */ + +static int __pyx_f_7aiohttp_12_http_parser_cb_on_header_field(llhttp_t *__pyx_v_parser, char const *__pyx_v_at, size_t __pyx_v_length) { + struct __pyx_obj_7aiohttp_12_http_parser_HttpParser *__pyx_v_pyparser = 0; + Py_ssize_t __pyx_v_size; + PyObject *__pyx_v_ex = NULL; + int __pyx_r; + __Pyx_RefNannyDeclarations + PyObject *__pyx_t_1 = NULL; + PyObject *__pyx_t_2 = NULL; + PyObject *__pyx_t_3 = NULL; + PyObject *__pyx_t_4 = NULL; + Py_ssize_t __pyx_t_5; + int __pyx_t_6; + PyObject *__pyx_t_7 = NULL; + PyObject *__pyx_t_8 = NULL; + PyObject *__pyx_t_9 = NULL; + PyObject *__pyx_t_10 = NULL; + int __pyx_t_11; + PyObject *__pyx_t_12 = NULL; + int __pyx_lineno = 0; + const char *__pyx_filename = NULL; + int __pyx_clineno = 0; + __Pyx_RefNannySetupContext("cb_on_header_field", 0); + + /* "aiohttp/_http_parser.pyx":687 + * cdef int cb_on_header_field(cparser.llhttp_t* parser, + * const char *at, size_t length) except -1: + * cdef HttpParser pyparser = parser.data # <<<<<<<<<<<<<< + * cdef Py_ssize_t size + * try: + */ + __pyx_t_1 = ((PyObject *)__pyx_v_parser->data); + __Pyx_INCREF(__pyx_t_1); + __pyx_v_pyparser = ((struct __pyx_obj_7aiohttp_12_http_parser_HttpParser *)__pyx_t_1); + __pyx_t_1 = 0; + + /* "aiohttp/_http_parser.pyx":689 + * cdef HttpParser pyparser = parser.data + * cdef Py_ssize_t size + * try: # <<<<<<<<<<<<<< + * pyparser._on_status_complete() + * size = len(pyparser._raw_name) + length + */ + { + __Pyx_PyThreadState_declare + __Pyx_PyThreadState_assign + __Pyx_ExceptionSave(&__pyx_t_2, &__pyx_t_3, &__pyx_t_4); + __Pyx_XGOTREF(__pyx_t_2); + __Pyx_XGOTREF(__pyx_t_3); + __Pyx_XGOTREF(__pyx_t_4); + /*try:*/ { + + /* "aiohttp/_http_parser.pyx":690 + * cdef Py_ssize_t size + * try: + * pyparser._on_status_complete() # <<<<<<<<<<<<<< + * size = len(pyparser._raw_name) + length + * if size > pyparser._max_field_size: + */ + __pyx_t_1 = ((struct __pyx_vtabstruct_7aiohttp_12_http_parser_HttpParser *)__pyx_v_pyparser->__pyx_vtab)->_on_status_complete(__pyx_v_pyparser); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 690, __pyx_L3_error) + __Pyx_GOTREF(__pyx_t_1); + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + + /* "aiohttp/_http_parser.pyx":691 + * try: + * pyparser._on_status_complete() + * size = len(pyparser._raw_name) + length # <<<<<<<<<<<<<< + * if size > pyparser._max_field_size: + * raise LineTooLong( + */ + __pyx_t_1 = __pyx_v_pyparser->_raw_name; + __Pyx_INCREF(__pyx_t_1); + if (unlikely(__pyx_t_1 == Py_None)) { + PyErr_SetString(PyExc_TypeError, "object of type 'NoneType' has no len()"); + __PYX_ERR(0, 691, __pyx_L3_error) + } + __pyx_t_5 = PyByteArray_GET_SIZE(__pyx_t_1); if (unlikely(__pyx_t_5 == ((Py_ssize_t)-1))) __PYX_ERR(0, 691, __pyx_L3_error) + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + __pyx_v_size = (__pyx_t_5 + __pyx_v_length); + + /* "aiohttp/_http_parser.pyx":692 + * pyparser._on_status_complete() + * size = len(pyparser._raw_name) + length + * if size > pyparser._max_field_size: # <<<<<<<<<<<<<< + * raise LineTooLong( + * 'Header name is too long', pyparser._max_field_size, size) + */ + __pyx_t_6 = ((__pyx_v_size > __pyx_v_pyparser->_max_field_size) != 0); + if (unlikely(__pyx_t_6)) { + + /* "aiohttp/_http_parser.pyx":693 + * size = len(pyparser._raw_name) + length + * if size > pyparser._max_field_size: + * raise LineTooLong( # <<<<<<<<<<<<<< + * 'Header name is too long', pyparser._max_field_size, size) + * pyparser._on_header_field(at, length) + */ + __Pyx_GetModuleGlobalName(__pyx_t_7, __pyx_n_s_LineTooLong); if (unlikely(!__pyx_t_7)) __PYX_ERR(0, 693, __pyx_L3_error) + __Pyx_GOTREF(__pyx_t_7); + + /* "aiohttp/_http_parser.pyx":694 + * if size > pyparser._max_field_size: + * raise LineTooLong( + * 'Header name is too long', pyparser._max_field_size, size) # <<<<<<<<<<<<<< + * pyparser._on_header_field(at, length) + * except BaseException as ex: + */ + __pyx_t_8 = __Pyx_PyInt_FromSize_t(__pyx_v_pyparser->_max_field_size); if (unlikely(!__pyx_t_8)) __PYX_ERR(0, 694, __pyx_L3_error) + __Pyx_GOTREF(__pyx_t_8); + __pyx_t_9 = PyInt_FromSsize_t(__pyx_v_size); if (unlikely(!__pyx_t_9)) __PYX_ERR(0, 694, __pyx_L3_error) + __Pyx_GOTREF(__pyx_t_9); + __pyx_t_10 = NULL; + __pyx_t_11 = 0; + if (CYTHON_UNPACK_METHODS && unlikely(PyMethod_Check(__pyx_t_7))) { + __pyx_t_10 = PyMethod_GET_SELF(__pyx_t_7); + if (likely(__pyx_t_10)) { + PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_7); + __Pyx_INCREF(__pyx_t_10); + __Pyx_INCREF(function); + __Pyx_DECREF_SET(__pyx_t_7, function); + __pyx_t_11 = 1; + } + } + #if CYTHON_FAST_PYCALL + if (PyFunction_Check(__pyx_t_7)) { + PyObject *__pyx_temp[4] = {__pyx_t_10, __pyx_kp_u_Header_name_is_too_long, __pyx_t_8, __pyx_t_9}; + __pyx_t_1 = __Pyx_PyFunction_FastCall(__pyx_t_7, __pyx_temp+1-__pyx_t_11, 3+__pyx_t_11); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 693, __pyx_L3_error) + __Pyx_XDECREF(__pyx_t_10); __pyx_t_10 = 0; + __Pyx_GOTREF(__pyx_t_1); + __Pyx_DECREF(__pyx_t_8); __pyx_t_8 = 0; + __Pyx_DECREF(__pyx_t_9); __pyx_t_9 = 0; + } else + #endif + #if CYTHON_FAST_PYCCALL + if (__Pyx_PyFastCFunction_Check(__pyx_t_7)) { + PyObject *__pyx_temp[4] = {__pyx_t_10, __pyx_kp_u_Header_name_is_too_long, __pyx_t_8, __pyx_t_9}; + __pyx_t_1 = __Pyx_PyCFunction_FastCall(__pyx_t_7, __pyx_temp+1-__pyx_t_11, 3+__pyx_t_11); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 693, __pyx_L3_error) + __Pyx_XDECREF(__pyx_t_10); __pyx_t_10 = 0; + __Pyx_GOTREF(__pyx_t_1); + __Pyx_DECREF(__pyx_t_8); __pyx_t_8 = 0; + __Pyx_DECREF(__pyx_t_9); __pyx_t_9 = 0; + } else + #endif + { + __pyx_t_12 = PyTuple_New(3+__pyx_t_11); if (unlikely(!__pyx_t_12)) __PYX_ERR(0, 693, __pyx_L3_error) + __Pyx_GOTREF(__pyx_t_12); + if (__pyx_t_10) { + __Pyx_GIVEREF(__pyx_t_10); PyTuple_SET_ITEM(__pyx_t_12, 0, __pyx_t_10); __pyx_t_10 = NULL; + } + __Pyx_INCREF(__pyx_kp_u_Header_name_is_too_long); + __Pyx_GIVEREF(__pyx_kp_u_Header_name_is_too_long); + PyTuple_SET_ITEM(__pyx_t_12, 0+__pyx_t_11, __pyx_kp_u_Header_name_is_too_long); + __Pyx_GIVEREF(__pyx_t_8); + PyTuple_SET_ITEM(__pyx_t_12, 1+__pyx_t_11, __pyx_t_8); + __Pyx_GIVEREF(__pyx_t_9); + PyTuple_SET_ITEM(__pyx_t_12, 2+__pyx_t_11, __pyx_t_9); + __pyx_t_8 = 0; + __pyx_t_9 = 0; + __pyx_t_1 = __Pyx_PyObject_Call(__pyx_t_7, __pyx_t_12, NULL); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 693, __pyx_L3_error) + __Pyx_GOTREF(__pyx_t_1); + __Pyx_DECREF(__pyx_t_12); __pyx_t_12 = 0; + } + __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0; + __Pyx_Raise(__pyx_t_1, 0, 0, 0); + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + __PYX_ERR(0, 693, __pyx_L3_error) + + /* "aiohttp/_http_parser.pyx":692 + * pyparser._on_status_complete() + * size = len(pyparser._raw_name) + length + * if size > pyparser._max_field_size: # <<<<<<<<<<<<<< + * raise LineTooLong( + * 'Header name is too long', pyparser._max_field_size, size) + */ + } + + /* "aiohttp/_http_parser.pyx":695 + * raise LineTooLong( + * 'Header name is too long', pyparser._max_field_size, size) + * pyparser._on_header_field(at, length) # <<<<<<<<<<<<<< + * except BaseException as ex: + * pyparser._last_error = ex + */ + __pyx_t_1 = ((struct __pyx_vtabstruct_7aiohttp_12_http_parser_HttpParser *)__pyx_v_pyparser->__pyx_vtab)->_on_header_field(__pyx_v_pyparser, __pyx_v_at, __pyx_v_length); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 695, __pyx_L3_error) + __Pyx_GOTREF(__pyx_t_1); + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + + /* "aiohttp/_http_parser.pyx":689 + * cdef HttpParser pyparser = parser.data + * cdef Py_ssize_t size + * try: # <<<<<<<<<<<<<< + * pyparser._on_status_complete() + * size = len(pyparser._raw_name) + length + */ + } + + /* "aiohttp/_http_parser.pyx":700 + * return -1 + * else: + * return 0 # <<<<<<<<<<<<<< + * + * + */ + /*else:*/ { + __pyx_r = 0; + goto __pyx_L6_except_return; + } + __pyx_L3_error:; + __Pyx_XDECREF(__pyx_t_1); __pyx_t_1 = 0; + __Pyx_XDECREF(__pyx_t_10); __pyx_t_10 = 0; + __Pyx_XDECREF(__pyx_t_12); __pyx_t_12 = 0; + __Pyx_XDECREF(__pyx_t_7); __pyx_t_7 = 0; + __Pyx_XDECREF(__pyx_t_8); __pyx_t_8 = 0; + __Pyx_XDECREF(__pyx_t_9); __pyx_t_9 = 0; + + /* "aiohttp/_http_parser.pyx":696 + * 'Header name is too long', pyparser._max_field_size, size) + * pyparser._on_header_field(at, length) + * except BaseException as ex: # <<<<<<<<<<<<<< + * pyparser._last_error = ex + * return -1 + */ + __pyx_t_11 = __Pyx_PyErr_ExceptionMatches(__pyx_builtin_BaseException); + if (__pyx_t_11) { + __Pyx_AddTraceback("aiohttp._http_parser.cb_on_header_field", __pyx_clineno, __pyx_lineno, __pyx_filename); + if (__Pyx_GetException(&__pyx_t_1, &__pyx_t_7, &__pyx_t_12) < 0) __PYX_ERR(0, 696, __pyx_L5_except_error) + __Pyx_GOTREF(__pyx_t_1); + __Pyx_GOTREF(__pyx_t_7); + __Pyx_GOTREF(__pyx_t_12); + __Pyx_INCREF(__pyx_t_7); + __pyx_v_ex = __pyx_t_7; + /*try:*/ { + + /* "aiohttp/_http_parser.pyx":697 + * pyparser._on_header_field(at, length) + * except BaseException as ex: + * pyparser._last_error = ex # <<<<<<<<<<<<<< + * return -1 + * else: + */ + __Pyx_INCREF(__pyx_v_ex); + __Pyx_GIVEREF(__pyx_v_ex); + __Pyx_GOTREF(__pyx_v_pyparser->_last_error); + __Pyx_DECREF(__pyx_v_pyparser->_last_error); + __pyx_v_pyparser->_last_error = __pyx_v_ex; + + /* "aiohttp/_http_parser.pyx":698 + * except BaseException as ex: + * pyparser._last_error = ex + * return -1 # <<<<<<<<<<<<<< + * else: + * return 0 + */ + __pyx_r = -1; + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0; + __Pyx_DECREF(__pyx_t_12); __pyx_t_12 = 0; + goto __pyx_L14_return; + } + + /* "aiohttp/_http_parser.pyx":696 + * 'Header name is too long', pyparser._max_field_size, size) + * pyparser._on_header_field(at, length) + * except BaseException as ex: # <<<<<<<<<<<<<< + * pyparser._last_error = ex + * return -1 + */ + /*finally:*/ { + __pyx_L14_return: { + __pyx_t_11 = __pyx_r; + __Pyx_DECREF(__pyx_v_ex); + __pyx_v_ex = NULL; + __pyx_r = __pyx_t_11; + goto __pyx_L6_except_return; + } + } + } + goto __pyx_L5_except_error; + __pyx_L5_except_error:; + + /* "aiohttp/_http_parser.pyx":689 + * cdef HttpParser pyparser = parser.data + * cdef Py_ssize_t size + * try: # <<<<<<<<<<<<<< + * pyparser._on_status_complete() + * size = len(pyparser._raw_name) + length + */ + __Pyx_XGIVEREF(__pyx_t_2); + __Pyx_XGIVEREF(__pyx_t_3); + __Pyx_XGIVEREF(__pyx_t_4); + __Pyx_ExceptionReset(__pyx_t_2, __pyx_t_3, __pyx_t_4); + goto __pyx_L1_error; + __pyx_L6_except_return:; + __Pyx_XGIVEREF(__pyx_t_2); + __Pyx_XGIVEREF(__pyx_t_3); + __Pyx_XGIVEREF(__pyx_t_4); + __Pyx_ExceptionReset(__pyx_t_2, __pyx_t_3, __pyx_t_4); + goto __pyx_L0; + } + + /* "aiohttp/_http_parser.pyx":685 + * + * + * cdef int cb_on_header_field(cparser.llhttp_t* parser, # <<<<<<<<<<<<<< + * const char *at, size_t length) except -1: + * cdef HttpParser pyparser = parser.data + */ + + /* function exit code */ + __pyx_L1_error:; + __Pyx_XDECREF(__pyx_t_1); + __Pyx_XDECREF(__pyx_t_7); + __Pyx_XDECREF(__pyx_t_8); + __Pyx_XDECREF(__pyx_t_9); + __Pyx_XDECREF(__pyx_t_10); + __Pyx_XDECREF(__pyx_t_12); + __Pyx_AddTraceback("aiohttp._http_parser.cb_on_header_field", __pyx_clineno, __pyx_lineno, __pyx_filename); + __pyx_r = -1; + __pyx_L0:; + __Pyx_XDECREF((PyObject *)__pyx_v_pyparser); + __Pyx_XDECREF(__pyx_v_ex); + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +/* "aiohttp/_http_parser.pyx":703 + * + * + * cdef int cb_on_header_value(cparser.llhttp_t* parser, # <<<<<<<<<<<<<< + * const char *at, size_t length) except -1: + * cdef HttpParser pyparser = parser.data + */ + +static int __pyx_f_7aiohttp_12_http_parser_cb_on_header_value(llhttp_t *__pyx_v_parser, char const *__pyx_v_at, size_t __pyx_v_length) { + struct __pyx_obj_7aiohttp_12_http_parser_HttpParser *__pyx_v_pyparser = 0; + Py_ssize_t __pyx_v_size; + PyObject *__pyx_v_ex = NULL; + int __pyx_r; + __Pyx_RefNannyDeclarations + PyObject *__pyx_t_1 = NULL; + PyObject *__pyx_t_2 = NULL; + PyObject *__pyx_t_3 = NULL; + PyObject *__pyx_t_4 = NULL; + Py_ssize_t __pyx_t_5; + int __pyx_t_6; + PyObject *__pyx_t_7 = NULL; + PyObject *__pyx_t_8 = NULL; + PyObject *__pyx_t_9 = NULL; + PyObject *__pyx_t_10 = NULL; + int __pyx_t_11; + PyObject *__pyx_t_12 = NULL; + int __pyx_lineno = 0; + const char *__pyx_filename = NULL; + int __pyx_clineno = 0; + __Pyx_RefNannySetupContext("cb_on_header_value", 0); + + /* "aiohttp/_http_parser.pyx":705 + * cdef int cb_on_header_value(cparser.llhttp_t* parser, + * const char *at, size_t length) except -1: + * cdef HttpParser pyparser = parser.data # <<<<<<<<<<<<<< + * cdef Py_ssize_t size + * try: + */ + __pyx_t_1 = ((PyObject *)__pyx_v_parser->data); + __Pyx_INCREF(__pyx_t_1); + __pyx_v_pyparser = ((struct __pyx_obj_7aiohttp_12_http_parser_HttpParser *)__pyx_t_1); + __pyx_t_1 = 0; + + /* "aiohttp/_http_parser.pyx":707 + * cdef HttpParser pyparser = parser.data + * cdef Py_ssize_t size + * try: # <<<<<<<<<<<<<< + * size = len(pyparser._raw_value) + length + * if size > pyparser._max_field_size: + */ + { + __Pyx_PyThreadState_declare + __Pyx_PyThreadState_assign + __Pyx_ExceptionSave(&__pyx_t_2, &__pyx_t_3, &__pyx_t_4); + __Pyx_XGOTREF(__pyx_t_2); + __Pyx_XGOTREF(__pyx_t_3); + __Pyx_XGOTREF(__pyx_t_4); + /*try:*/ { + + /* "aiohttp/_http_parser.pyx":708 + * cdef Py_ssize_t size + * try: + * size = len(pyparser._raw_value) + length # <<<<<<<<<<<<<< + * if size > pyparser._max_field_size: + * raise LineTooLong( + */ + __pyx_t_1 = __pyx_v_pyparser->_raw_value; + __Pyx_INCREF(__pyx_t_1); + if (unlikely(__pyx_t_1 == Py_None)) { + PyErr_SetString(PyExc_TypeError, "object of type 'NoneType' has no len()"); + __PYX_ERR(0, 708, __pyx_L3_error) + } + __pyx_t_5 = PyByteArray_GET_SIZE(__pyx_t_1); if (unlikely(__pyx_t_5 == ((Py_ssize_t)-1))) __PYX_ERR(0, 708, __pyx_L3_error) + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + __pyx_v_size = (__pyx_t_5 + __pyx_v_length); + + /* "aiohttp/_http_parser.pyx":709 + * try: + * size = len(pyparser._raw_value) + length + * if size > pyparser._max_field_size: # <<<<<<<<<<<<<< + * raise LineTooLong( + * 'Header value is too long', pyparser._max_field_size, size) + */ + __pyx_t_6 = ((__pyx_v_size > __pyx_v_pyparser->_max_field_size) != 0); + if (unlikely(__pyx_t_6)) { + + /* "aiohttp/_http_parser.pyx":710 + * size = len(pyparser._raw_value) + length + * if size > pyparser._max_field_size: + * raise LineTooLong( # <<<<<<<<<<<<<< + * 'Header value is too long', pyparser._max_field_size, size) + * pyparser._on_header_value(at, length) + */ + __Pyx_GetModuleGlobalName(__pyx_t_7, __pyx_n_s_LineTooLong); if (unlikely(!__pyx_t_7)) __PYX_ERR(0, 710, __pyx_L3_error) + __Pyx_GOTREF(__pyx_t_7); + + /* "aiohttp/_http_parser.pyx":711 + * if size > pyparser._max_field_size: + * raise LineTooLong( + * 'Header value is too long', pyparser._max_field_size, size) # <<<<<<<<<<<<<< + * pyparser._on_header_value(at, length) + * except BaseException as ex: + */ + __pyx_t_8 = __Pyx_PyInt_FromSize_t(__pyx_v_pyparser->_max_field_size); if (unlikely(!__pyx_t_8)) __PYX_ERR(0, 711, __pyx_L3_error) + __Pyx_GOTREF(__pyx_t_8); + __pyx_t_9 = PyInt_FromSsize_t(__pyx_v_size); if (unlikely(!__pyx_t_9)) __PYX_ERR(0, 711, __pyx_L3_error) + __Pyx_GOTREF(__pyx_t_9); + __pyx_t_10 = NULL; + __pyx_t_11 = 0; + if (CYTHON_UNPACK_METHODS && unlikely(PyMethod_Check(__pyx_t_7))) { + __pyx_t_10 = PyMethod_GET_SELF(__pyx_t_7); + if (likely(__pyx_t_10)) { + PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_7); + __Pyx_INCREF(__pyx_t_10); + __Pyx_INCREF(function); + __Pyx_DECREF_SET(__pyx_t_7, function); + __pyx_t_11 = 1; + } + } + #if CYTHON_FAST_PYCALL + if (PyFunction_Check(__pyx_t_7)) { + PyObject *__pyx_temp[4] = {__pyx_t_10, __pyx_kp_u_Header_value_is_too_long, __pyx_t_8, __pyx_t_9}; + __pyx_t_1 = __Pyx_PyFunction_FastCall(__pyx_t_7, __pyx_temp+1-__pyx_t_11, 3+__pyx_t_11); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 710, __pyx_L3_error) + __Pyx_XDECREF(__pyx_t_10); __pyx_t_10 = 0; + __Pyx_GOTREF(__pyx_t_1); + __Pyx_DECREF(__pyx_t_8); __pyx_t_8 = 0; + __Pyx_DECREF(__pyx_t_9); __pyx_t_9 = 0; + } else + #endif + #if CYTHON_FAST_PYCCALL + if (__Pyx_PyFastCFunction_Check(__pyx_t_7)) { + PyObject *__pyx_temp[4] = {__pyx_t_10, __pyx_kp_u_Header_value_is_too_long, __pyx_t_8, __pyx_t_9}; + __pyx_t_1 = __Pyx_PyCFunction_FastCall(__pyx_t_7, __pyx_temp+1-__pyx_t_11, 3+__pyx_t_11); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 710, __pyx_L3_error) + __Pyx_XDECREF(__pyx_t_10); __pyx_t_10 = 0; + __Pyx_GOTREF(__pyx_t_1); + __Pyx_DECREF(__pyx_t_8); __pyx_t_8 = 0; + __Pyx_DECREF(__pyx_t_9); __pyx_t_9 = 0; + } else + #endif + { + __pyx_t_12 = PyTuple_New(3+__pyx_t_11); if (unlikely(!__pyx_t_12)) __PYX_ERR(0, 710, __pyx_L3_error) + __Pyx_GOTREF(__pyx_t_12); + if (__pyx_t_10) { + __Pyx_GIVEREF(__pyx_t_10); PyTuple_SET_ITEM(__pyx_t_12, 0, __pyx_t_10); __pyx_t_10 = NULL; + } + __Pyx_INCREF(__pyx_kp_u_Header_value_is_too_long); + __Pyx_GIVEREF(__pyx_kp_u_Header_value_is_too_long); + PyTuple_SET_ITEM(__pyx_t_12, 0+__pyx_t_11, __pyx_kp_u_Header_value_is_too_long); + __Pyx_GIVEREF(__pyx_t_8); + PyTuple_SET_ITEM(__pyx_t_12, 1+__pyx_t_11, __pyx_t_8); + __Pyx_GIVEREF(__pyx_t_9); + PyTuple_SET_ITEM(__pyx_t_12, 2+__pyx_t_11, __pyx_t_9); + __pyx_t_8 = 0; + __pyx_t_9 = 0; + __pyx_t_1 = __Pyx_PyObject_Call(__pyx_t_7, __pyx_t_12, NULL); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 710, __pyx_L3_error) + __Pyx_GOTREF(__pyx_t_1); + __Pyx_DECREF(__pyx_t_12); __pyx_t_12 = 0; + } + __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0; + __Pyx_Raise(__pyx_t_1, 0, 0, 0); + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + __PYX_ERR(0, 710, __pyx_L3_error) + + /* "aiohttp/_http_parser.pyx":709 + * try: + * size = len(pyparser._raw_value) + length + * if size > pyparser._max_field_size: # <<<<<<<<<<<<<< + * raise LineTooLong( + * 'Header value is too long', pyparser._max_field_size, size) + */ + } + + /* "aiohttp/_http_parser.pyx":712 + * raise LineTooLong( + * 'Header value is too long', pyparser._max_field_size, size) + * pyparser._on_header_value(at, length) # <<<<<<<<<<<<<< + * except BaseException as ex: + * pyparser._last_error = ex + */ + __pyx_t_1 = ((struct __pyx_vtabstruct_7aiohttp_12_http_parser_HttpParser *)__pyx_v_pyparser->__pyx_vtab)->_on_header_value(__pyx_v_pyparser, __pyx_v_at, __pyx_v_length); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 712, __pyx_L3_error) + __Pyx_GOTREF(__pyx_t_1); + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + + /* "aiohttp/_http_parser.pyx":707 + * cdef HttpParser pyparser = parser.data + * cdef Py_ssize_t size + * try: # <<<<<<<<<<<<<< + * size = len(pyparser._raw_value) + length + * if size > pyparser._max_field_size: + */ + } + + /* "aiohttp/_http_parser.pyx":717 + * return -1 + * else: + * return 0 # <<<<<<<<<<<<<< + * + * + */ + /*else:*/ { + __pyx_r = 0; + goto __pyx_L6_except_return; + } + __pyx_L3_error:; + __Pyx_XDECREF(__pyx_t_1); __pyx_t_1 = 0; + __Pyx_XDECREF(__pyx_t_10); __pyx_t_10 = 0; + __Pyx_XDECREF(__pyx_t_12); __pyx_t_12 = 0; + __Pyx_XDECREF(__pyx_t_7); __pyx_t_7 = 0; + __Pyx_XDECREF(__pyx_t_8); __pyx_t_8 = 0; + __Pyx_XDECREF(__pyx_t_9); __pyx_t_9 = 0; + + /* "aiohttp/_http_parser.pyx":713 + * 'Header value is too long', pyparser._max_field_size, size) + * pyparser._on_header_value(at, length) + * except BaseException as ex: # <<<<<<<<<<<<<< + * pyparser._last_error = ex + * return -1 + */ + __pyx_t_11 = __Pyx_PyErr_ExceptionMatches(__pyx_builtin_BaseException); + if (__pyx_t_11) { + __Pyx_AddTraceback("aiohttp._http_parser.cb_on_header_value", __pyx_clineno, __pyx_lineno, __pyx_filename); + if (__Pyx_GetException(&__pyx_t_1, &__pyx_t_7, &__pyx_t_12) < 0) __PYX_ERR(0, 713, __pyx_L5_except_error) + __Pyx_GOTREF(__pyx_t_1); + __Pyx_GOTREF(__pyx_t_7); + __Pyx_GOTREF(__pyx_t_12); + __Pyx_INCREF(__pyx_t_7); + __pyx_v_ex = __pyx_t_7; + /*try:*/ { + + /* "aiohttp/_http_parser.pyx":714 + * pyparser._on_header_value(at, length) + * except BaseException as ex: + * pyparser._last_error = ex # <<<<<<<<<<<<<< + * return -1 + * else: + */ + __Pyx_INCREF(__pyx_v_ex); + __Pyx_GIVEREF(__pyx_v_ex); + __Pyx_GOTREF(__pyx_v_pyparser->_last_error); + __Pyx_DECREF(__pyx_v_pyparser->_last_error); + __pyx_v_pyparser->_last_error = __pyx_v_ex; + + /* "aiohttp/_http_parser.pyx":715 + * except BaseException as ex: + * pyparser._last_error = ex + * return -1 # <<<<<<<<<<<<<< + * else: + * return 0 + */ + __pyx_r = -1; + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0; + __Pyx_DECREF(__pyx_t_12); __pyx_t_12 = 0; + goto __pyx_L14_return; + } + + /* "aiohttp/_http_parser.pyx":713 + * 'Header value is too long', pyparser._max_field_size, size) + * pyparser._on_header_value(at, length) + * except BaseException as ex: # <<<<<<<<<<<<<< + * pyparser._last_error = ex + * return -1 + */ + /*finally:*/ { + __pyx_L14_return: { + __pyx_t_11 = __pyx_r; + __Pyx_DECREF(__pyx_v_ex); + __pyx_v_ex = NULL; + __pyx_r = __pyx_t_11; + goto __pyx_L6_except_return; + } + } + } + goto __pyx_L5_except_error; + __pyx_L5_except_error:; + + /* "aiohttp/_http_parser.pyx":707 + * cdef HttpParser pyparser = parser.data + * cdef Py_ssize_t size + * try: # <<<<<<<<<<<<<< + * size = len(pyparser._raw_value) + length + * if size > pyparser._max_field_size: + */ + __Pyx_XGIVEREF(__pyx_t_2); + __Pyx_XGIVEREF(__pyx_t_3); + __Pyx_XGIVEREF(__pyx_t_4); + __Pyx_ExceptionReset(__pyx_t_2, __pyx_t_3, __pyx_t_4); + goto __pyx_L1_error; + __pyx_L6_except_return:; + __Pyx_XGIVEREF(__pyx_t_2); + __Pyx_XGIVEREF(__pyx_t_3); + __Pyx_XGIVEREF(__pyx_t_4); + __Pyx_ExceptionReset(__pyx_t_2, __pyx_t_3, __pyx_t_4); + goto __pyx_L0; + } + + /* "aiohttp/_http_parser.pyx":703 + * + * + * cdef int cb_on_header_value(cparser.llhttp_t* parser, # <<<<<<<<<<<<<< + * const char *at, size_t length) except -1: + * cdef HttpParser pyparser = parser.data + */ + + /* function exit code */ + __pyx_L1_error:; + __Pyx_XDECREF(__pyx_t_1); + __Pyx_XDECREF(__pyx_t_7); + __Pyx_XDECREF(__pyx_t_8); + __Pyx_XDECREF(__pyx_t_9); + __Pyx_XDECREF(__pyx_t_10); + __Pyx_XDECREF(__pyx_t_12); + __Pyx_AddTraceback("aiohttp._http_parser.cb_on_header_value", __pyx_clineno, __pyx_lineno, __pyx_filename); + __pyx_r = -1; + __pyx_L0:; + __Pyx_XDECREF((PyObject *)__pyx_v_pyparser); + __Pyx_XDECREF(__pyx_v_ex); + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +/* "aiohttp/_http_parser.pyx":720 + * + * + * cdef int cb_on_headers_complete(cparser.llhttp_t* parser) except -1: # <<<<<<<<<<<<<< + * cdef HttpParser pyparser = parser.data + * try: + */ + +static int __pyx_f_7aiohttp_12_http_parser_cb_on_headers_complete(llhttp_t *__pyx_v_parser) { + struct __pyx_obj_7aiohttp_12_http_parser_HttpParser *__pyx_v_pyparser = 0; + PyObject *__pyx_v_exc = NULL; + int __pyx_r; + __Pyx_RefNannyDeclarations + PyObject *__pyx_t_1 = NULL; + PyObject *__pyx_t_2 = NULL; + PyObject *__pyx_t_3 = NULL; + PyObject *__pyx_t_4 = NULL; + int __pyx_t_5; + int __pyx_t_6; + int __pyx_t_7; + PyObject *__pyx_t_8 = NULL; + PyObject *__pyx_t_9 = NULL; + int __pyx_lineno = 0; + const char *__pyx_filename = NULL; + int __pyx_clineno = 0; + __Pyx_RefNannySetupContext("cb_on_headers_complete", 0); + + /* "aiohttp/_http_parser.pyx":721 + * + * cdef int cb_on_headers_complete(cparser.llhttp_t* parser) except -1: + * cdef HttpParser pyparser = parser.data # <<<<<<<<<<<<<< + * try: + * pyparser._on_status_complete() + */ + __pyx_t_1 = ((PyObject *)__pyx_v_parser->data); + __Pyx_INCREF(__pyx_t_1); + __pyx_v_pyparser = ((struct __pyx_obj_7aiohttp_12_http_parser_HttpParser *)__pyx_t_1); + __pyx_t_1 = 0; + + /* "aiohttp/_http_parser.pyx":722 + * cdef int cb_on_headers_complete(cparser.llhttp_t* parser) except -1: + * cdef HttpParser pyparser = parser.data + * try: # <<<<<<<<<<<<<< + * pyparser._on_status_complete() + * pyparser._on_headers_complete() + */ + { + __Pyx_PyThreadState_declare + __Pyx_PyThreadState_assign + __Pyx_ExceptionSave(&__pyx_t_2, &__pyx_t_3, &__pyx_t_4); + __Pyx_XGOTREF(__pyx_t_2); + __Pyx_XGOTREF(__pyx_t_3); + __Pyx_XGOTREF(__pyx_t_4); + /*try:*/ { + + /* "aiohttp/_http_parser.pyx":723 + * cdef HttpParser pyparser = parser.data + * try: + * pyparser._on_status_complete() # <<<<<<<<<<<<<< + * pyparser._on_headers_complete() + * except BaseException as exc: + */ + __pyx_t_1 = ((struct __pyx_vtabstruct_7aiohttp_12_http_parser_HttpParser *)__pyx_v_pyparser->__pyx_vtab)->_on_status_complete(__pyx_v_pyparser); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 723, __pyx_L3_error) + __Pyx_GOTREF(__pyx_t_1); + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + + /* "aiohttp/_http_parser.pyx":724 + * try: + * pyparser._on_status_complete() + * pyparser._on_headers_complete() # <<<<<<<<<<<<<< + * except BaseException as exc: + * pyparser._last_error = exc + */ + __pyx_t_1 = ((struct __pyx_vtabstruct_7aiohttp_12_http_parser_HttpParser *)__pyx_v_pyparser->__pyx_vtab)->_on_headers_complete(__pyx_v_pyparser); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 724, __pyx_L3_error) + __Pyx_GOTREF(__pyx_t_1); + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + + /* "aiohttp/_http_parser.pyx":722 + * cdef int cb_on_headers_complete(cparser.llhttp_t* parser) except -1: + * cdef HttpParser pyparser = parser.data + * try: # <<<<<<<<<<<<<< + * pyparser._on_status_complete() + * pyparser._on_headers_complete() + */ + } + + /* "aiohttp/_http_parser.pyx":729 + * return -1 + * else: + * if pyparser._cparser.upgrade or pyparser._cparser.method == 5: # CONNECT # <<<<<<<<<<<<<< + * return 2 + * else: + */ + /*else:*/ { + __pyx_t_6 = (__pyx_v_pyparser->_cparser->upgrade != 0); + if (!__pyx_t_6) { + } else { + __pyx_t_5 = __pyx_t_6; + goto __pyx_L10_bool_binop_done; + } + __pyx_t_6 = ((__pyx_v_pyparser->_cparser->method == 5) != 0); + __pyx_t_5 = __pyx_t_6; + __pyx_L10_bool_binop_done:; + if (__pyx_t_5) { + + /* "aiohttp/_http_parser.pyx":730 + * else: + * if pyparser._cparser.upgrade or pyparser._cparser.method == 5: # CONNECT + * return 2 # <<<<<<<<<<<<<< + * else: + * return 0 + */ + __pyx_r = 2; + goto __pyx_L6_except_return; + + /* "aiohttp/_http_parser.pyx":729 + * return -1 + * else: + * if pyparser._cparser.upgrade or pyparser._cparser.method == 5: # CONNECT # <<<<<<<<<<<<<< + * return 2 + * else: + */ + } + + /* "aiohttp/_http_parser.pyx":732 + * return 2 + * else: + * return 0 # <<<<<<<<<<<<<< + * + * + */ + /*else*/ { + __pyx_r = 0; + goto __pyx_L6_except_return; + } + } + __pyx_L3_error:; + __Pyx_XDECREF(__pyx_t_1); __pyx_t_1 = 0; + + /* "aiohttp/_http_parser.pyx":725 + * pyparser._on_status_complete() + * pyparser._on_headers_complete() + * except BaseException as exc: # <<<<<<<<<<<<<< + * pyparser._last_error = exc + * return -1 + */ + __pyx_t_7 = __Pyx_PyErr_ExceptionMatches(__pyx_builtin_BaseException); + if (__pyx_t_7) { + __Pyx_AddTraceback("aiohttp._http_parser.cb_on_headers_complete", __pyx_clineno, __pyx_lineno, __pyx_filename); + if (__Pyx_GetException(&__pyx_t_1, &__pyx_t_8, &__pyx_t_9) < 0) __PYX_ERR(0, 725, __pyx_L5_except_error) + __Pyx_GOTREF(__pyx_t_1); + __Pyx_GOTREF(__pyx_t_8); + __Pyx_GOTREF(__pyx_t_9); + __Pyx_INCREF(__pyx_t_8); + __pyx_v_exc = __pyx_t_8; + /*try:*/ { + + /* "aiohttp/_http_parser.pyx":726 + * pyparser._on_headers_complete() + * except BaseException as exc: + * pyparser._last_error = exc # <<<<<<<<<<<<<< + * return -1 + * else: + */ + __Pyx_INCREF(__pyx_v_exc); + __Pyx_GIVEREF(__pyx_v_exc); + __Pyx_GOTREF(__pyx_v_pyparser->_last_error); + __Pyx_DECREF(__pyx_v_pyparser->_last_error); + __pyx_v_pyparser->_last_error = __pyx_v_exc; + + /* "aiohttp/_http_parser.pyx":727 + * except BaseException as exc: + * pyparser._last_error = exc + * return -1 # <<<<<<<<<<<<<< + * else: + * if pyparser._cparser.upgrade or pyparser._cparser.method == 5: # CONNECT + */ + __pyx_r = -1; + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + __Pyx_DECREF(__pyx_t_8); __pyx_t_8 = 0; + __Pyx_DECREF(__pyx_t_9); __pyx_t_9 = 0; + goto __pyx_L16_return; + } + + /* "aiohttp/_http_parser.pyx":725 + * pyparser._on_status_complete() + * pyparser._on_headers_complete() + * except BaseException as exc: # <<<<<<<<<<<<<< + * pyparser._last_error = exc + * return -1 + */ + /*finally:*/ { + __pyx_L16_return: { + __pyx_t_7 = __pyx_r; + __Pyx_DECREF(__pyx_v_exc); + __pyx_v_exc = NULL; + __pyx_r = __pyx_t_7; + goto __pyx_L6_except_return; + } + } + } + goto __pyx_L5_except_error; + __pyx_L5_except_error:; + + /* "aiohttp/_http_parser.pyx":722 + * cdef int cb_on_headers_complete(cparser.llhttp_t* parser) except -1: + * cdef HttpParser pyparser = parser.data + * try: # <<<<<<<<<<<<<< + * pyparser._on_status_complete() + * pyparser._on_headers_complete() + */ + __Pyx_XGIVEREF(__pyx_t_2); + __Pyx_XGIVEREF(__pyx_t_3); + __Pyx_XGIVEREF(__pyx_t_4); + __Pyx_ExceptionReset(__pyx_t_2, __pyx_t_3, __pyx_t_4); + goto __pyx_L1_error; + __pyx_L6_except_return:; + __Pyx_XGIVEREF(__pyx_t_2); + __Pyx_XGIVEREF(__pyx_t_3); + __Pyx_XGIVEREF(__pyx_t_4); + __Pyx_ExceptionReset(__pyx_t_2, __pyx_t_3, __pyx_t_4); + goto __pyx_L0; + } + + /* "aiohttp/_http_parser.pyx":720 + * + * + * cdef int cb_on_headers_complete(cparser.llhttp_t* parser) except -1: # <<<<<<<<<<<<<< + * cdef HttpParser pyparser = parser.data + * try: + */ + + /* function exit code */ + __pyx_L1_error:; + __Pyx_XDECREF(__pyx_t_1); + __Pyx_XDECREF(__pyx_t_8); + __Pyx_XDECREF(__pyx_t_9); + __Pyx_AddTraceback("aiohttp._http_parser.cb_on_headers_complete", __pyx_clineno, __pyx_lineno, __pyx_filename); + __pyx_r = -1; + __pyx_L0:; + __Pyx_XDECREF((PyObject *)__pyx_v_pyparser); + __Pyx_XDECREF(__pyx_v_exc); + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +/* "aiohttp/_http_parser.pyx":735 + * + * + * cdef int cb_on_body(cparser.llhttp_t* parser, # <<<<<<<<<<<<<< + * const char *at, size_t length) except -1: + * cdef HttpParser pyparser = parser.data + */ + +static int __pyx_f_7aiohttp_12_http_parser_cb_on_body(llhttp_t *__pyx_v_parser, char const *__pyx_v_at, size_t __pyx_v_length) { + struct __pyx_obj_7aiohttp_12_http_parser_HttpParser *__pyx_v_pyparser = 0; + PyObject *__pyx_v_body = 0; + PyObject *__pyx_v_exc = NULL; + int __pyx_r; + __Pyx_RefNannyDeclarations + PyObject *__pyx_t_1 = NULL; + PyObject *__pyx_t_2 = NULL; + PyObject *__pyx_t_3 = NULL; + PyObject *__pyx_t_4 = NULL; + PyObject *__pyx_t_5 = NULL; + PyObject *__pyx_t_6 = NULL; + PyObject *__pyx_t_7 = NULL; + int __pyx_t_8; + PyObject *__pyx_t_9 = NULL; + int __pyx_t_10; + int __pyx_t_11; + PyObject *__pyx_t_12 = NULL; + PyObject *__pyx_t_13 = NULL; + PyObject *__pyx_t_14 = NULL; + PyObject *__pyx_t_15 = NULL; + int __pyx_t_16; + char const *__pyx_t_17; + PyObject *__pyx_t_18 = NULL; + PyObject *__pyx_t_19 = NULL; + PyObject *__pyx_t_20 = NULL; + PyObject *__pyx_t_21 = NULL; + PyObject *__pyx_t_22 = NULL; + PyObject *__pyx_t_23 = NULL; + int __pyx_lineno = 0; + const char *__pyx_filename = NULL; + int __pyx_clineno = 0; + __Pyx_RefNannySetupContext("cb_on_body", 0); + + /* "aiohttp/_http_parser.pyx":737 + * cdef int cb_on_body(cparser.llhttp_t* parser, + * const char *at, size_t length) except -1: + * cdef HttpParser pyparser = parser.data # <<<<<<<<<<<<<< + * cdef bytes body = at[:length] + * try: + */ + __pyx_t_1 = ((PyObject *)__pyx_v_parser->data); + __Pyx_INCREF(__pyx_t_1); + __pyx_v_pyparser = ((struct __pyx_obj_7aiohttp_12_http_parser_HttpParser *)__pyx_t_1); + __pyx_t_1 = 0; + + /* "aiohttp/_http_parser.pyx":738 + * const char *at, size_t length) except -1: + * cdef HttpParser pyparser = parser.data + * cdef bytes body = at[:length] # <<<<<<<<<<<<<< + * try: + * pyparser._payload.feed_data(body, length) + */ + __pyx_t_1 = __Pyx_PyBytes_FromStringAndSize(__pyx_v_at + 0, __pyx_v_length - 0); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 738, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __pyx_v_body = ((PyObject*)__pyx_t_1); + __pyx_t_1 = 0; + + /* "aiohttp/_http_parser.pyx":739 + * cdef HttpParser pyparser = parser.data + * cdef bytes body = at[:length] + * try: # <<<<<<<<<<<<<< + * pyparser._payload.feed_data(body, length) + * except BaseException as exc: + */ + { + __Pyx_PyThreadState_declare + __Pyx_PyThreadState_assign + __Pyx_ExceptionSave(&__pyx_t_2, &__pyx_t_3, &__pyx_t_4); + __Pyx_XGOTREF(__pyx_t_2); + __Pyx_XGOTREF(__pyx_t_3); + __Pyx_XGOTREF(__pyx_t_4); + /*try:*/ { + + /* "aiohttp/_http_parser.pyx":740 + * cdef bytes body = at[:length] + * try: + * pyparser._payload.feed_data(body, length) # <<<<<<<<<<<<<< + * except BaseException as exc: + * if pyparser._payload_exception is not None: + */ + __pyx_t_5 = __Pyx_PyObject_GetAttrStr(__pyx_v_pyparser->_payload, __pyx_n_s_feed_data); if (unlikely(!__pyx_t_5)) __PYX_ERR(0, 740, __pyx_L3_error) + __Pyx_GOTREF(__pyx_t_5); + __pyx_t_6 = __Pyx_PyInt_FromSize_t(__pyx_v_length); if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 740, __pyx_L3_error) + __Pyx_GOTREF(__pyx_t_6); + __pyx_t_7 = NULL; + __pyx_t_8 = 0; + if (CYTHON_UNPACK_METHODS && likely(PyMethod_Check(__pyx_t_5))) { + __pyx_t_7 = PyMethod_GET_SELF(__pyx_t_5); + if (likely(__pyx_t_7)) { + PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_5); + __Pyx_INCREF(__pyx_t_7); + __Pyx_INCREF(function); + __Pyx_DECREF_SET(__pyx_t_5, function); + __pyx_t_8 = 1; + } + } + #if CYTHON_FAST_PYCALL + if (PyFunction_Check(__pyx_t_5)) { + PyObject *__pyx_temp[3] = {__pyx_t_7, __pyx_v_body, __pyx_t_6}; + __pyx_t_1 = __Pyx_PyFunction_FastCall(__pyx_t_5, __pyx_temp+1-__pyx_t_8, 2+__pyx_t_8); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 740, __pyx_L3_error) + __Pyx_XDECREF(__pyx_t_7); __pyx_t_7 = 0; + __Pyx_GOTREF(__pyx_t_1); + __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0; + } else + #endif + #if CYTHON_FAST_PYCCALL + if (__Pyx_PyFastCFunction_Check(__pyx_t_5)) { + PyObject *__pyx_temp[3] = {__pyx_t_7, __pyx_v_body, __pyx_t_6}; + __pyx_t_1 = __Pyx_PyCFunction_FastCall(__pyx_t_5, __pyx_temp+1-__pyx_t_8, 2+__pyx_t_8); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 740, __pyx_L3_error) + __Pyx_XDECREF(__pyx_t_7); __pyx_t_7 = 0; + __Pyx_GOTREF(__pyx_t_1); + __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0; + } else + #endif + { + __pyx_t_9 = PyTuple_New(2+__pyx_t_8); if (unlikely(!__pyx_t_9)) __PYX_ERR(0, 740, __pyx_L3_error) + __Pyx_GOTREF(__pyx_t_9); + if (__pyx_t_7) { + __Pyx_GIVEREF(__pyx_t_7); PyTuple_SET_ITEM(__pyx_t_9, 0, __pyx_t_7); __pyx_t_7 = NULL; + } + __Pyx_INCREF(__pyx_v_body); + __Pyx_GIVEREF(__pyx_v_body); + PyTuple_SET_ITEM(__pyx_t_9, 0+__pyx_t_8, __pyx_v_body); + __Pyx_GIVEREF(__pyx_t_6); + PyTuple_SET_ITEM(__pyx_t_9, 1+__pyx_t_8, __pyx_t_6); + __pyx_t_6 = 0; + __pyx_t_1 = __Pyx_PyObject_Call(__pyx_t_5, __pyx_t_9, NULL); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 740, __pyx_L3_error) + __Pyx_GOTREF(__pyx_t_1); + __Pyx_DECREF(__pyx_t_9); __pyx_t_9 = 0; + } + __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0; + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + + /* "aiohttp/_http_parser.pyx":739 + * cdef HttpParser pyparser = parser.data + * cdef bytes body = at[:length] + * try: # <<<<<<<<<<<<<< + * pyparser._payload.feed_data(body, length) + * except BaseException as exc: + */ + } + + /* "aiohttp/_http_parser.pyx":749 + * return -1 + * else: + * return 0 # <<<<<<<<<<<<<< + * + * + */ + /*else:*/ { + __pyx_r = 0; + goto __pyx_L6_except_return; + } + __pyx_L3_error:; + __Pyx_XDECREF(__pyx_t_1); __pyx_t_1 = 0; + __Pyx_XDECREF(__pyx_t_5); __pyx_t_5 = 0; + __Pyx_XDECREF(__pyx_t_6); __pyx_t_6 = 0; + __Pyx_XDECREF(__pyx_t_7); __pyx_t_7 = 0; + __Pyx_XDECREF(__pyx_t_9); __pyx_t_9 = 0; + + /* "aiohttp/_http_parser.pyx":741 + * try: + * pyparser._payload.feed_data(body, length) + * except BaseException as exc: # <<<<<<<<<<<<<< + * if pyparser._payload_exception is not None: + * pyparser._payload.set_exception(pyparser._payload_exception(str(exc))) + */ + __pyx_t_8 = __Pyx_PyErr_ExceptionMatches(__pyx_builtin_BaseException); + if (__pyx_t_8) { + __Pyx_AddTraceback("aiohttp._http_parser.cb_on_body", __pyx_clineno, __pyx_lineno, __pyx_filename); + if (__Pyx_GetException(&__pyx_t_1, &__pyx_t_5, &__pyx_t_9) < 0) __PYX_ERR(0, 741, __pyx_L5_except_error) + __Pyx_GOTREF(__pyx_t_1); + __Pyx_GOTREF(__pyx_t_5); + __Pyx_GOTREF(__pyx_t_9); + __Pyx_INCREF(__pyx_t_5); + __pyx_v_exc = __pyx_t_5; + /*try:*/ { + + /* "aiohttp/_http_parser.pyx":742 + * pyparser._payload.feed_data(body, length) + * except BaseException as exc: + * if pyparser._payload_exception is not None: # <<<<<<<<<<<<<< + * pyparser._payload.set_exception(pyparser._payload_exception(str(exc))) + * else: + */ + __pyx_t_10 = (__pyx_v_pyparser->_payload_exception != Py_None); + __pyx_t_11 = (__pyx_t_10 != 0); + if (__pyx_t_11) { + + /* "aiohttp/_http_parser.pyx":743 + * except BaseException as exc: + * if pyparser._payload_exception is not None: + * pyparser._payload.set_exception(pyparser._payload_exception(str(exc))) # <<<<<<<<<<<<<< + * else: + * pyparser._payload.set_exception(exc) + */ + __pyx_t_7 = __Pyx_PyObject_GetAttrStr(__pyx_v_pyparser->_payload, __pyx_n_s_set_exception); if (unlikely(!__pyx_t_7)) __PYX_ERR(0, 743, __pyx_L14_error) + __Pyx_GOTREF(__pyx_t_7); + __pyx_t_13 = __Pyx_PyObject_CallOneArg(((PyObject *)(&PyUnicode_Type)), __pyx_v_exc); if (unlikely(!__pyx_t_13)) __PYX_ERR(0, 743, __pyx_L14_error) + __Pyx_GOTREF(__pyx_t_13); + __Pyx_INCREF(__pyx_v_pyparser->_payload_exception); + __pyx_t_14 = __pyx_v_pyparser->_payload_exception; __pyx_t_15 = NULL; + if (CYTHON_UNPACK_METHODS && likely(PyMethod_Check(__pyx_t_14))) { + __pyx_t_15 = PyMethod_GET_SELF(__pyx_t_14); + if (likely(__pyx_t_15)) { + PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_14); + __Pyx_INCREF(__pyx_t_15); + __Pyx_INCREF(function); + __Pyx_DECREF_SET(__pyx_t_14, function); + } + } + __pyx_t_12 = (__pyx_t_15) ? __Pyx_PyObject_Call2Args(__pyx_t_14, __pyx_t_15, __pyx_t_13) : __Pyx_PyObject_CallOneArg(__pyx_t_14, __pyx_t_13); + __Pyx_XDECREF(__pyx_t_15); __pyx_t_15 = 0; + __Pyx_DECREF(__pyx_t_13); __pyx_t_13 = 0; + if (unlikely(!__pyx_t_12)) __PYX_ERR(0, 743, __pyx_L14_error) + __Pyx_GOTREF(__pyx_t_12); + __Pyx_DECREF(__pyx_t_14); __pyx_t_14 = 0; + __pyx_t_14 = NULL; + if (CYTHON_UNPACK_METHODS && likely(PyMethod_Check(__pyx_t_7))) { + __pyx_t_14 = PyMethod_GET_SELF(__pyx_t_7); + if (likely(__pyx_t_14)) { + PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_7); + __Pyx_INCREF(__pyx_t_14); + __Pyx_INCREF(function); + __Pyx_DECREF_SET(__pyx_t_7, function); + } + } + __pyx_t_6 = (__pyx_t_14) ? __Pyx_PyObject_Call2Args(__pyx_t_7, __pyx_t_14, __pyx_t_12) : __Pyx_PyObject_CallOneArg(__pyx_t_7, __pyx_t_12); + __Pyx_XDECREF(__pyx_t_14); __pyx_t_14 = 0; + __Pyx_DECREF(__pyx_t_12); __pyx_t_12 = 0; + if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 743, __pyx_L14_error) + __Pyx_GOTREF(__pyx_t_6); + __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0; + __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0; + + /* "aiohttp/_http_parser.pyx":742 + * pyparser._payload.feed_data(body, length) + * except BaseException as exc: + * if pyparser._payload_exception is not None: # <<<<<<<<<<<<<< + * pyparser._payload.set_exception(pyparser._payload_exception(str(exc))) + * else: + */ + goto __pyx_L16; + } + + /* "aiohttp/_http_parser.pyx":745 + * pyparser._payload.set_exception(pyparser._payload_exception(str(exc))) + * else: + * pyparser._payload.set_exception(exc) # <<<<<<<<<<<<<< + * pyparser._payload_error = 1 + * return -1 + */ + /*else*/ { + __pyx_t_7 = __Pyx_PyObject_GetAttrStr(__pyx_v_pyparser->_payload, __pyx_n_s_set_exception); if (unlikely(!__pyx_t_7)) __PYX_ERR(0, 745, __pyx_L14_error) + __Pyx_GOTREF(__pyx_t_7); + __pyx_t_12 = NULL; + if (CYTHON_UNPACK_METHODS && likely(PyMethod_Check(__pyx_t_7))) { + __pyx_t_12 = PyMethod_GET_SELF(__pyx_t_7); + if (likely(__pyx_t_12)) { + PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_7); + __Pyx_INCREF(__pyx_t_12); + __Pyx_INCREF(function); + __Pyx_DECREF_SET(__pyx_t_7, function); + } + } + __pyx_t_6 = (__pyx_t_12) ? __Pyx_PyObject_Call2Args(__pyx_t_7, __pyx_t_12, __pyx_v_exc) : __Pyx_PyObject_CallOneArg(__pyx_t_7, __pyx_v_exc); + __Pyx_XDECREF(__pyx_t_12); __pyx_t_12 = 0; + if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 745, __pyx_L14_error) + __Pyx_GOTREF(__pyx_t_6); + __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0; + __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0; + } + __pyx_L16:; + + /* "aiohttp/_http_parser.pyx":746 + * else: + * pyparser._payload.set_exception(exc) + * pyparser._payload_error = 1 # <<<<<<<<<<<<<< + * return -1 + * else: + */ + __pyx_v_pyparser->_payload_error = 1; + + /* "aiohttp/_http_parser.pyx":747 + * pyparser._payload.set_exception(exc) + * pyparser._payload_error = 1 + * return -1 # <<<<<<<<<<<<<< + * else: + * return 0 + */ + __pyx_r = -1; + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0; + __Pyx_DECREF(__pyx_t_9); __pyx_t_9 = 0; + goto __pyx_L13_return; + } + + /* "aiohttp/_http_parser.pyx":741 + * try: + * pyparser._payload.feed_data(body, length) + * except BaseException as exc: # <<<<<<<<<<<<<< + * if pyparser._payload_exception is not None: + * pyparser._payload.set_exception(pyparser._payload_exception(str(exc))) + */ + /*finally:*/ { + __pyx_L14_error:; + /*exception exit:*/{ + __Pyx_PyThreadState_declare + __Pyx_PyThreadState_assign + __pyx_t_18 = 0; __pyx_t_19 = 0; __pyx_t_20 = 0; __pyx_t_21 = 0; __pyx_t_22 = 0; __pyx_t_23 = 0; + __Pyx_XDECREF(__pyx_t_12); __pyx_t_12 = 0; + __Pyx_XDECREF(__pyx_t_13); __pyx_t_13 = 0; + __Pyx_XDECREF(__pyx_t_14); __pyx_t_14 = 0; + __Pyx_XDECREF(__pyx_t_15); __pyx_t_15 = 0; + __Pyx_XDECREF(__pyx_t_6); __pyx_t_6 = 0; + __Pyx_XDECREF(__pyx_t_7); __pyx_t_7 = 0; + if (PY_MAJOR_VERSION >= 3) __Pyx_ExceptionSwap(&__pyx_t_21, &__pyx_t_22, &__pyx_t_23); + if ((PY_MAJOR_VERSION < 3) || unlikely(__Pyx_GetException(&__pyx_t_18, &__pyx_t_19, &__pyx_t_20) < 0)) __Pyx_ErrFetch(&__pyx_t_18, &__pyx_t_19, &__pyx_t_20); + __Pyx_XGOTREF(__pyx_t_18); + __Pyx_XGOTREF(__pyx_t_19); + __Pyx_XGOTREF(__pyx_t_20); + __Pyx_XGOTREF(__pyx_t_21); + __Pyx_XGOTREF(__pyx_t_22); + __Pyx_XGOTREF(__pyx_t_23); + __pyx_t_8 = __pyx_lineno; __pyx_t_16 = __pyx_clineno; __pyx_t_17 = __pyx_filename; + { + __Pyx_DECREF(__pyx_v_exc); + __pyx_v_exc = NULL; + } + if (PY_MAJOR_VERSION >= 3) { + __Pyx_XGIVEREF(__pyx_t_21); + __Pyx_XGIVEREF(__pyx_t_22); + __Pyx_XGIVEREF(__pyx_t_23); + __Pyx_ExceptionReset(__pyx_t_21, __pyx_t_22, __pyx_t_23); + } + __Pyx_XGIVEREF(__pyx_t_18); + __Pyx_XGIVEREF(__pyx_t_19); + __Pyx_XGIVEREF(__pyx_t_20); + __Pyx_ErrRestore(__pyx_t_18, __pyx_t_19, __pyx_t_20); + __pyx_t_18 = 0; __pyx_t_19 = 0; __pyx_t_20 = 0; __pyx_t_21 = 0; __pyx_t_22 = 0; __pyx_t_23 = 0; + __pyx_lineno = __pyx_t_8; __pyx_clineno = __pyx_t_16; __pyx_filename = __pyx_t_17; + goto __pyx_L5_except_error; + } + __pyx_L13_return: { + __pyx_t_16 = __pyx_r; + __Pyx_DECREF(__pyx_v_exc); + __pyx_v_exc = NULL; + __pyx_r = __pyx_t_16; + goto __pyx_L6_except_return; + } + } + } + goto __pyx_L5_except_error; + __pyx_L5_except_error:; + + /* "aiohttp/_http_parser.pyx":739 + * cdef HttpParser pyparser = parser.data + * cdef bytes body = at[:length] + * try: # <<<<<<<<<<<<<< + * pyparser._payload.feed_data(body, length) + * except BaseException as exc: + */ + __Pyx_XGIVEREF(__pyx_t_2); + __Pyx_XGIVEREF(__pyx_t_3); + __Pyx_XGIVEREF(__pyx_t_4); + __Pyx_ExceptionReset(__pyx_t_2, __pyx_t_3, __pyx_t_4); + goto __pyx_L1_error; + __pyx_L6_except_return:; + __Pyx_XGIVEREF(__pyx_t_2); + __Pyx_XGIVEREF(__pyx_t_3); + __Pyx_XGIVEREF(__pyx_t_4); + __Pyx_ExceptionReset(__pyx_t_2, __pyx_t_3, __pyx_t_4); + goto __pyx_L0; + } + + /* "aiohttp/_http_parser.pyx":735 + * + * + * cdef int cb_on_body(cparser.llhttp_t* parser, # <<<<<<<<<<<<<< + * const char *at, size_t length) except -1: + * cdef HttpParser pyparser = parser.data + */ + + /* function exit code */ + __pyx_L1_error:; + __Pyx_XDECREF(__pyx_t_1); + __Pyx_XDECREF(__pyx_t_5); + __Pyx_XDECREF(__pyx_t_6); + __Pyx_XDECREF(__pyx_t_7); + __Pyx_XDECREF(__pyx_t_9); + __Pyx_XDECREF(__pyx_t_12); + __Pyx_XDECREF(__pyx_t_13); + __Pyx_XDECREF(__pyx_t_14); + __Pyx_XDECREF(__pyx_t_15); + __Pyx_AddTraceback("aiohttp._http_parser.cb_on_body", __pyx_clineno, __pyx_lineno, __pyx_filename); + __pyx_r = -1; + __pyx_L0:; + __Pyx_XDECREF((PyObject *)__pyx_v_pyparser); + __Pyx_XDECREF(__pyx_v_body); + __Pyx_XDECREF(__pyx_v_exc); + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +/* "aiohttp/_http_parser.pyx":752 + * + * + * cdef int cb_on_message_complete(cparser.llhttp_t* parser) except -1: # <<<<<<<<<<<<<< + * cdef HttpParser pyparser = parser.data + * try: + */ + +static int __pyx_f_7aiohttp_12_http_parser_cb_on_message_complete(llhttp_t *__pyx_v_parser) { + struct __pyx_obj_7aiohttp_12_http_parser_HttpParser *__pyx_v_pyparser = 0; + PyObject *__pyx_v_exc = NULL; + int __pyx_r; + __Pyx_RefNannyDeclarations + PyObject *__pyx_t_1 = NULL; + PyObject *__pyx_t_2 = NULL; + PyObject *__pyx_t_3 = NULL; + PyObject *__pyx_t_4 = NULL; + int __pyx_t_5; + PyObject *__pyx_t_6 = NULL; + PyObject *__pyx_t_7 = NULL; + int __pyx_lineno = 0; + const char *__pyx_filename = NULL; + int __pyx_clineno = 0; + __Pyx_RefNannySetupContext("cb_on_message_complete", 0); + + /* "aiohttp/_http_parser.pyx":753 + * + * cdef int cb_on_message_complete(cparser.llhttp_t* parser) except -1: + * cdef HttpParser pyparser = parser.data # <<<<<<<<<<<<<< + * try: + * pyparser._started = False + */ + __pyx_t_1 = ((PyObject *)__pyx_v_parser->data); + __Pyx_INCREF(__pyx_t_1); + __pyx_v_pyparser = ((struct __pyx_obj_7aiohttp_12_http_parser_HttpParser *)__pyx_t_1); + __pyx_t_1 = 0; + + /* "aiohttp/_http_parser.pyx":754 + * cdef int cb_on_message_complete(cparser.llhttp_t* parser) except -1: + * cdef HttpParser pyparser = parser.data + * try: # <<<<<<<<<<<<<< + * pyparser._started = False + * pyparser._on_message_complete() + */ + { + __Pyx_PyThreadState_declare + __Pyx_PyThreadState_assign + __Pyx_ExceptionSave(&__pyx_t_2, &__pyx_t_3, &__pyx_t_4); + __Pyx_XGOTREF(__pyx_t_2); + __Pyx_XGOTREF(__pyx_t_3); + __Pyx_XGOTREF(__pyx_t_4); + /*try:*/ { + + /* "aiohttp/_http_parser.pyx":755 + * cdef HttpParser pyparser = parser.data + * try: + * pyparser._started = False # <<<<<<<<<<<<<< + * pyparser._on_message_complete() + * except BaseException as exc: + */ + __pyx_v_pyparser->_started = 0; + + /* "aiohttp/_http_parser.pyx":756 + * try: + * pyparser._started = False + * pyparser._on_message_complete() # <<<<<<<<<<<<<< + * except BaseException as exc: + * pyparser._last_error = exc + */ + __pyx_t_1 = ((struct __pyx_vtabstruct_7aiohttp_12_http_parser_HttpParser *)__pyx_v_pyparser->__pyx_vtab)->_on_message_complete(__pyx_v_pyparser); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 756, __pyx_L3_error) + __Pyx_GOTREF(__pyx_t_1); + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + + /* "aiohttp/_http_parser.pyx":754 + * cdef int cb_on_message_complete(cparser.llhttp_t* parser) except -1: + * cdef HttpParser pyparser = parser.data + * try: # <<<<<<<<<<<<<< + * pyparser._started = False + * pyparser._on_message_complete() + */ + } + + /* "aiohttp/_http_parser.pyx":761 + * return -1 + * else: + * return 0 # <<<<<<<<<<<<<< + * + * + */ + /*else:*/ { + __pyx_r = 0; + goto __pyx_L6_except_return; + } + __pyx_L3_error:; + __Pyx_XDECREF(__pyx_t_1); __pyx_t_1 = 0; + + /* "aiohttp/_http_parser.pyx":757 + * pyparser._started = False + * pyparser._on_message_complete() + * except BaseException as exc: # <<<<<<<<<<<<<< + * pyparser._last_error = exc + * return -1 + */ + __pyx_t_5 = __Pyx_PyErr_ExceptionMatches(__pyx_builtin_BaseException); + if (__pyx_t_5) { + __Pyx_AddTraceback("aiohttp._http_parser.cb_on_message_complete", __pyx_clineno, __pyx_lineno, __pyx_filename); + if (__Pyx_GetException(&__pyx_t_1, &__pyx_t_6, &__pyx_t_7) < 0) __PYX_ERR(0, 757, __pyx_L5_except_error) + __Pyx_GOTREF(__pyx_t_1); + __Pyx_GOTREF(__pyx_t_6); + __Pyx_GOTREF(__pyx_t_7); + __Pyx_INCREF(__pyx_t_6); + __pyx_v_exc = __pyx_t_6; + /*try:*/ { + + /* "aiohttp/_http_parser.pyx":758 + * pyparser._on_message_complete() + * except BaseException as exc: + * pyparser._last_error = exc # <<<<<<<<<<<<<< + * return -1 + * else: + */ + __Pyx_INCREF(__pyx_v_exc); + __Pyx_GIVEREF(__pyx_v_exc); + __Pyx_GOTREF(__pyx_v_pyparser->_last_error); + __Pyx_DECREF(__pyx_v_pyparser->_last_error); + __pyx_v_pyparser->_last_error = __pyx_v_exc; + + /* "aiohttp/_http_parser.pyx":759 + * except BaseException as exc: + * pyparser._last_error = exc + * return -1 # <<<<<<<<<<<<<< + * else: + * return 0 + */ + __pyx_r = -1; + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0; + __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0; + goto __pyx_L13_return; + } + + /* "aiohttp/_http_parser.pyx":757 + * pyparser._started = False + * pyparser._on_message_complete() + * except BaseException as exc: # <<<<<<<<<<<<<< + * pyparser._last_error = exc + * return -1 + */ + /*finally:*/ { + __pyx_L13_return: { + __pyx_t_5 = __pyx_r; + __Pyx_DECREF(__pyx_v_exc); + __pyx_v_exc = NULL; + __pyx_r = __pyx_t_5; + goto __pyx_L6_except_return; + } + } + } + goto __pyx_L5_except_error; + __pyx_L5_except_error:; + + /* "aiohttp/_http_parser.pyx":754 + * cdef int cb_on_message_complete(cparser.llhttp_t* parser) except -1: + * cdef HttpParser pyparser = parser.data + * try: # <<<<<<<<<<<<<< + * pyparser._started = False + * pyparser._on_message_complete() + */ + __Pyx_XGIVEREF(__pyx_t_2); + __Pyx_XGIVEREF(__pyx_t_3); + __Pyx_XGIVEREF(__pyx_t_4); + __Pyx_ExceptionReset(__pyx_t_2, __pyx_t_3, __pyx_t_4); + goto __pyx_L1_error; + __pyx_L6_except_return:; + __Pyx_XGIVEREF(__pyx_t_2); + __Pyx_XGIVEREF(__pyx_t_3); + __Pyx_XGIVEREF(__pyx_t_4); + __Pyx_ExceptionReset(__pyx_t_2, __pyx_t_3, __pyx_t_4); + goto __pyx_L0; + } + + /* "aiohttp/_http_parser.pyx":752 + * + * + * cdef int cb_on_message_complete(cparser.llhttp_t* parser) except -1: # <<<<<<<<<<<<<< + * cdef HttpParser pyparser = parser.data + * try: + */ + + /* function exit code */ + __pyx_L1_error:; + __Pyx_XDECREF(__pyx_t_1); + __Pyx_XDECREF(__pyx_t_6); + __Pyx_XDECREF(__pyx_t_7); + __Pyx_AddTraceback("aiohttp._http_parser.cb_on_message_complete", __pyx_clineno, __pyx_lineno, __pyx_filename); + __pyx_r = -1; + __pyx_L0:; + __Pyx_XDECREF((PyObject *)__pyx_v_pyparser); + __Pyx_XDECREF(__pyx_v_exc); + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +/* "aiohttp/_http_parser.pyx":764 + * + * + * cdef int cb_on_chunk_header(cparser.llhttp_t* parser) except -1: # <<<<<<<<<<<<<< + * cdef HttpParser pyparser = parser.data + * try: + */ + +static int __pyx_f_7aiohttp_12_http_parser_cb_on_chunk_header(llhttp_t *__pyx_v_parser) { + struct __pyx_obj_7aiohttp_12_http_parser_HttpParser *__pyx_v_pyparser = 0; + PyObject *__pyx_v_exc = NULL; + int __pyx_r; + __Pyx_RefNannyDeclarations + PyObject *__pyx_t_1 = NULL; + PyObject *__pyx_t_2 = NULL; + PyObject *__pyx_t_3 = NULL; + PyObject *__pyx_t_4 = NULL; + int __pyx_t_5; + PyObject *__pyx_t_6 = NULL; + PyObject *__pyx_t_7 = NULL; + int __pyx_lineno = 0; + const char *__pyx_filename = NULL; + int __pyx_clineno = 0; + __Pyx_RefNannySetupContext("cb_on_chunk_header", 0); + + /* "aiohttp/_http_parser.pyx":765 + * + * cdef int cb_on_chunk_header(cparser.llhttp_t* parser) except -1: + * cdef HttpParser pyparser = parser.data # <<<<<<<<<<<<<< + * try: + * pyparser._on_chunk_header() + */ + __pyx_t_1 = ((PyObject *)__pyx_v_parser->data); + __Pyx_INCREF(__pyx_t_1); + __pyx_v_pyparser = ((struct __pyx_obj_7aiohttp_12_http_parser_HttpParser *)__pyx_t_1); + __pyx_t_1 = 0; + + /* "aiohttp/_http_parser.pyx":766 + * cdef int cb_on_chunk_header(cparser.llhttp_t* parser) except -1: + * cdef HttpParser pyparser = parser.data + * try: # <<<<<<<<<<<<<< + * pyparser._on_chunk_header() + * except BaseException as exc: + */ + { + __Pyx_PyThreadState_declare + __Pyx_PyThreadState_assign + __Pyx_ExceptionSave(&__pyx_t_2, &__pyx_t_3, &__pyx_t_4); + __Pyx_XGOTREF(__pyx_t_2); + __Pyx_XGOTREF(__pyx_t_3); + __Pyx_XGOTREF(__pyx_t_4); + /*try:*/ { + + /* "aiohttp/_http_parser.pyx":767 + * cdef HttpParser pyparser = parser.data + * try: + * pyparser._on_chunk_header() # <<<<<<<<<<<<<< + * except BaseException as exc: + * pyparser._last_error = exc + */ + __pyx_t_1 = ((struct __pyx_vtabstruct_7aiohttp_12_http_parser_HttpParser *)__pyx_v_pyparser->__pyx_vtab)->_on_chunk_header(__pyx_v_pyparser); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 767, __pyx_L3_error) + __Pyx_GOTREF(__pyx_t_1); + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + + /* "aiohttp/_http_parser.pyx":766 + * cdef int cb_on_chunk_header(cparser.llhttp_t* parser) except -1: + * cdef HttpParser pyparser = parser.data + * try: # <<<<<<<<<<<<<< + * pyparser._on_chunk_header() + * except BaseException as exc: + */ + } + + /* "aiohttp/_http_parser.pyx":772 + * return -1 + * else: + * return 0 # <<<<<<<<<<<<<< + * + * + */ + /*else:*/ { + __pyx_r = 0; + goto __pyx_L6_except_return; + } + __pyx_L3_error:; + __Pyx_XDECREF(__pyx_t_1); __pyx_t_1 = 0; + + /* "aiohttp/_http_parser.pyx":768 + * try: + * pyparser._on_chunk_header() + * except BaseException as exc: # <<<<<<<<<<<<<< + * pyparser._last_error = exc + * return -1 + */ + __pyx_t_5 = __Pyx_PyErr_ExceptionMatches(__pyx_builtin_BaseException); + if (__pyx_t_5) { + __Pyx_AddTraceback("aiohttp._http_parser.cb_on_chunk_header", __pyx_clineno, __pyx_lineno, __pyx_filename); + if (__Pyx_GetException(&__pyx_t_1, &__pyx_t_6, &__pyx_t_7) < 0) __PYX_ERR(0, 768, __pyx_L5_except_error) + __Pyx_GOTREF(__pyx_t_1); + __Pyx_GOTREF(__pyx_t_6); + __Pyx_GOTREF(__pyx_t_7); + __Pyx_INCREF(__pyx_t_6); + __pyx_v_exc = __pyx_t_6; + /*try:*/ { + + /* "aiohttp/_http_parser.pyx":769 + * pyparser._on_chunk_header() + * except BaseException as exc: + * pyparser._last_error = exc # <<<<<<<<<<<<<< + * return -1 + * else: + */ + __Pyx_INCREF(__pyx_v_exc); + __Pyx_GIVEREF(__pyx_v_exc); + __Pyx_GOTREF(__pyx_v_pyparser->_last_error); + __Pyx_DECREF(__pyx_v_pyparser->_last_error); + __pyx_v_pyparser->_last_error = __pyx_v_exc; + + /* "aiohttp/_http_parser.pyx":770 + * except BaseException as exc: + * pyparser._last_error = exc + * return -1 # <<<<<<<<<<<<<< + * else: + * return 0 + */ + __pyx_r = -1; + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0; + __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0; + goto __pyx_L13_return; + } + + /* "aiohttp/_http_parser.pyx":768 + * try: + * pyparser._on_chunk_header() + * except BaseException as exc: # <<<<<<<<<<<<<< + * pyparser._last_error = exc + * return -1 + */ + /*finally:*/ { + __pyx_L13_return: { + __pyx_t_5 = __pyx_r; + __Pyx_DECREF(__pyx_v_exc); + __pyx_v_exc = NULL; + __pyx_r = __pyx_t_5; + goto __pyx_L6_except_return; + } + } + } + goto __pyx_L5_except_error; + __pyx_L5_except_error:; + + /* "aiohttp/_http_parser.pyx":766 + * cdef int cb_on_chunk_header(cparser.llhttp_t* parser) except -1: + * cdef HttpParser pyparser = parser.data + * try: # <<<<<<<<<<<<<< + * pyparser._on_chunk_header() + * except BaseException as exc: + */ + __Pyx_XGIVEREF(__pyx_t_2); + __Pyx_XGIVEREF(__pyx_t_3); + __Pyx_XGIVEREF(__pyx_t_4); + __Pyx_ExceptionReset(__pyx_t_2, __pyx_t_3, __pyx_t_4); + goto __pyx_L1_error; + __pyx_L6_except_return:; + __Pyx_XGIVEREF(__pyx_t_2); + __Pyx_XGIVEREF(__pyx_t_3); + __Pyx_XGIVEREF(__pyx_t_4); + __Pyx_ExceptionReset(__pyx_t_2, __pyx_t_3, __pyx_t_4); + goto __pyx_L0; + } + + /* "aiohttp/_http_parser.pyx":764 + * + * + * cdef int cb_on_chunk_header(cparser.llhttp_t* parser) except -1: # <<<<<<<<<<<<<< + * cdef HttpParser pyparser = parser.data + * try: + */ + + /* function exit code */ + __pyx_L1_error:; + __Pyx_XDECREF(__pyx_t_1); + __Pyx_XDECREF(__pyx_t_6); + __Pyx_XDECREF(__pyx_t_7); + __Pyx_AddTraceback("aiohttp._http_parser.cb_on_chunk_header", __pyx_clineno, __pyx_lineno, __pyx_filename); + __pyx_r = -1; + __pyx_L0:; + __Pyx_XDECREF((PyObject *)__pyx_v_pyparser); + __Pyx_XDECREF(__pyx_v_exc); + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +/* "aiohttp/_http_parser.pyx":775 + * + * + * cdef int cb_on_chunk_complete(cparser.llhttp_t* parser) except -1: # <<<<<<<<<<<<<< + * cdef HttpParser pyparser = parser.data + * try: + */ + +static int __pyx_f_7aiohttp_12_http_parser_cb_on_chunk_complete(llhttp_t *__pyx_v_parser) { + struct __pyx_obj_7aiohttp_12_http_parser_HttpParser *__pyx_v_pyparser = 0; + PyObject *__pyx_v_exc = NULL; + int __pyx_r; + __Pyx_RefNannyDeclarations + PyObject *__pyx_t_1 = NULL; + PyObject *__pyx_t_2 = NULL; + PyObject *__pyx_t_3 = NULL; + PyObject *__pyx_t_4 = NULL; + int __pyx_t_5; + PyObject *__pyx_t_6 = NULL; + PyObject *__pyx_t_7 = NULL; + int __pyx_lineno = 0; + const char *__pyx_filename = NULL; + int __pyx_clineno = 0; + __Pyx_RefNannySetupContext("cb_on_chunk_complete", 0); + + /* "aiohttp/_http_parser.pyx":776 + * + * cdef int cb_on_chunk_complete(cparser.llhttp_t* parser) except -1: + * cdef HttpParser pyparser = parser.data # <<<<<<<<<<<<<< + * try: + * pyparser._on_chunk_complete() + */ + __pyx_t_1 = ((PyObject *)__pyx_v_parser->data); + __Pyx_INCREF(__pyx_t_1); + __pyx_v_pyparser = ((struct __pyx_obj_7aiohttp_12_http_parser_HttpParser *)__pyx_t_1); + __pyx_t_1 = 0; + + /* "aiohttp/_http_parser.pyx":777 + * cdef int cb_on_chunk_complete(cparser.llhttp_t* parser) except -1: + * cdef HttpParser pyparser = parser.data + * try: # <<<<<<<<<<<<<< + * pyparser._on_chunk_complete() + * except BaseException as exc: + */ + { + __Pyx_PyThreadState_declare + __Pyx_PyThreadState_assign + __Pyx_ExceptionSave(&__pyx_t_2, &__pyx_t_3, &__pyx_t_4); + __Pyx_XGOTREF(__pyx_t_2); + __Pyx_XGOTREF(__pyx_t_3); + __Pyx_XGOTREF(__pyx_t_4); + /*try:*/ { + + /* "aiohttp/_http_parser.pyx":778 + * cdef HttpParser pyparser = parser.data + * try: + * pyparser._on_chunk_complete() # <<<<<<<<<<<<<< + * except BaseException as exc: + * pyparser._last_error = exc + */ + __pyx_t_1 = ((struct __pyx_vtabstruct_7aiohttp_12_http_parser_HttpParser *)__pyx_v_pyparser->__pyx_vtab)->_on_chunk_complete(__pyx_v_pyparser); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 778, __pyx_L3_error) + __Pyx_GOTREF(__pyx_t_1); + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + + /* "aiohttp/_http_parser.pyx":777 + * cdef int cb_on_chunk_complete(cparser.llhttp_t* parser) except -1: + * cdef HttpParser pyparser = parser.data + * try: # <<<<<<<<<<<<<< + * pyparser._on_chunk_complete() + * except BaseException as exc: + */ + } + + /* "aiohttp/_http_parser.pyx":783 + * return -1 + * else: + * return 0 # <<<<<<<<<<<<<< + * + * + */ + /*else:*/ { + __pyx_r = 0; + goto __pyx_L6_except_return; + } + __pyx_L3_error:; + __Pyx_XDECREF(__pyx_t_1); __pyx_t_1 = 0; + + /* "aiohttp/_http_parser.pyx":779 + * try: + * pyparser._on_chunk_complete() + * except BaseException as exc: # <<<<<<<<<<<<<< + * pyparser._last_error = exc + * return -1 + */ + __pyx_t_5 = __Pyx_PyErr_ExceptionMatches(__pyx_builtin_BaseException); + if (__pyx_t_5) { + __Pyx_AddTraceback("aiohttp._http_parser.cb_on_chunk_complete", __pyx_clineno, __pyx_lineno, __pyx_filename); + if (__Pyx_GetException(&__pyx_t_1, &__pyx_t_6, &__pyx_t_7) < 0) __PYX_ERR(0, 779, __pyx_L5_except_error) + __Pyx_GOTREF(__pyx_t_1); + __Pyx_GOTREF(__pyx_t_6); + __Pyx_GOTREF(__pyx_t_7); + __Pyx_INCREF(__pyx_t_6); + __pyx_v_exc = __pyx_t_6; + /*try:*/ { + + /* "aiohttp/_http_parser.pyx":780 + * pyparser._on_chunk_complete() + * except BaseException as exc: + * pyparser._last_error = exc # <<<<<<<<<<<<<< + * return -1 + * else: + */ + __Pyx_INCREF(__pyx_v_exc); + __Pyx_GIVEREF(__pyx_v_exc); + __Pyx_GOTREF(__pyx_v_pyparser->_last_error); + __Pyx_DECREF(__pyx_v_pyparser->_last_error); + __pyx_v_pyparser->_last_error = __pyx_v_exc; + + /* "aiohttp/_http_parser.pyx":781 + * except BaseException as exc: + * pyparser._last_error = exc + * return -1 # <<<<<<<<<<<<<< + * else: + * return 0 + */ + __pyx_r = -1; + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0; + __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0; + goto __pyx_L13_return; + } + + /* "aiohttp/_http_parser.pyx":779 + * try: + * pyparser._on_chunk_complete() + * except BaseException as exc: # <<<<<<<<<<<<<< + * pyparser._last_error = exc + * return -1 + */ + /*finally:*/ { + __pyx_L13_return: { + __pyx_t_5 = __pyx_r; + __Pyx_DECREF(__pyx_v_exc); + __pyx_v_exc = NULL; + __pyx_r = __pyx_t_5; + goto __pyx_L6_except_return; + } + } + } + goto __pyx_L5_except_error; + __pyx_L5_except_error:; + + /* "aiohttp/_http_parser.pyx":777 + * cdef int cb_on_chunk_complete(cparser.llhttp_t* parser) except -1: + * cdef HttpParser pyparser = parser.data + * try: # <<<<<<<<<<<<<< + * pyparser._on_chunk_complete() + * except BaseException as exc: + */ + __Pyx_XGIVEREF(__pyx_t_2); + __Pyx_XGIVEREF(__pyx_t_3); + __Pyx_XGIVEREF(__pyx_t_4); + __Pyx_ExceptionReset(__pyx_t_2, __pyx_t_3, __pyx_t_4); + goto __pyx_L1_error; + __pyx_L6_except_return:; + __Pyx_XGIVEREF(__pyx_t_2); + __Pyx_XGIVEREF(__pyx_t_3); + __Pyx_XGIVEREF(__pyx_t_4); + __Pyx_ExceptionReset(__pyx_t_2, __pyx_t_3, __pyx_t_4); + goto __pyx_L0; + } + + /* "aiohttp/_http_parser.pyx":775 + * + * + * cdef int cb_on_chunk_complete(cparser.llhttp_t* parser) except -1: # <<<<<<<<<<<<<< + * cdef HttpParser pyparser = parser.data + * try: + */ + + /* function exit code */ + __pyx_L1_error:; + __Pyx_XDECREF(__pyx_t_1); + __Pyx_XDECREF(__pyx_t_6); + __Pyx_XDECREF(__pyx_t_7); + __Pyx_AddTraceback("aiohttp._http_parser.cb_on_chunk_complete", __pyx_clineno, __pyx_lineno, __pyx_filename); + __pyx_r = -1; + __pyx_L0:; + __Pyx_XDECREF((PyObject *)__pyx_v_pyparser); + __Pyx_XDECREF(__pyx_v_exc); + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +/* "aiohttp/_http_parser.pyx":786 + * + * + * cdef parser_error_from_errno(cparser.llhttp_t* parser): # <<<<<<<<<<<<<< + * cdef cparser.llhttp_errno_t errno = cparser.llhttp_get_errno(parser) + * cdef bytes desc = cparser.llhttp_get_error_reason(parser) + */ + +static PyObject *__pyx_f_7aiohttp_12_http_parser_parser_error_from_errno(llhttp_t *__pyx_v_parser) { + llhttp_errno_t __pyx_v_errno; + PyObject *__pyx_v_desc = 0; + PyObject *__pyx_v_cls = NULL; + PyObject *__pyx_r = NULL; + __Pyx_RefNannyDeclarations + PyObject *__pyx_t_1 = NULL; + PyObject *__pyx_t_2 = NULL; + PyObject *__pyx_t_3 = NULL; + PyObject *__pyx_t_4 = NULL; + int __pyx_lineno = 0; + const char *__pyx_filename = NULL; + int __pyx_clineno = 0; + __Pyx_RefNannySetupContext("parser_error_from_errno", 0); + + /* "aiohttp/_http_parser.pyx":787 + * + * cdef parser_error_from_errno(cparser.llhttp_t* parser): + * cdef cparser.llhttp_errno_t errno = cparser.llhttp_get_errno(parser) # <<<<<<<<<<<<<< + * cdef bytes desc = cparser.llhttp_get_error_reason(parser) + * + */ + __pyx_v_errno = llhttp_get_errno(__pyx_v_parser); + + /* "aiohttp/_http_parser.pyx":788 + * cdef parser_error_from_errno(cparser.llhttp_t* parser): + * cdef cparser.llhttp_errno_t errno = cparser.llhttp_get_errno(parser) + * cdef bytes desc = cparser.llhttp_get_error_reason(parser) # <<<<<<<<<<<<<< + * + * if errno in (cparser.HPE_CB_MESSAGE_BEGIN, + */ + __pyx_t_1 = __Pyx_PyBytes_FromString(llhttp_get_error_reason(__pyx_v_parser)); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 788, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __pyx_v_desc = ((PyObject*)__pyx_t_1); + __pyx_t_1 = 0; + + /* "aiohttp/_http_parser.pyx":790 + * cdef bytes desc = cparser.llhttp_get_error_reason(parser) + * + * if errno in (cparser.HPE_CB_MESSAGE_BEGIN, # <<<<<<<<<<<<<< + * cparser.HPE_CB_HEADERS_COMPLETE, + * cparser.HPE_CB_MESSAGE_COMPLETE, + */ + switch (__pyx_v_errno) { + case HPE_CB_MESSAGE_BEGIN: + case HPE_CB_HEADERS_COMPLETE: + + /* "aiohttp/_http_parser.pyx":791 + * + * if errno in (cparser.HPE_CB_MESSAGE_BEGIN, + * cparser.HPE_CB_HEADERS_COMPLETE, # <<<<<<<<<<<<<< + * cparser.HPE_CB_MESSAGE_COMPLETE, + * cparser.HPE_CB_CHUNK_HEADER, + */ + case HPE_CB_MESSAGE_COMPLETE: + + /* "aiohttp/_http_parser.pyx":792 + * if errno in (cparser.HPE_CB_MESSAGE_BEGIN, + * cparser.HPE_CB_HEADERS_COMPLETE, + * cparser.HPE_CB_MESSAGE_COMPLETE, # <<<<<<<<<<<<<< + * cparser.HPE_CB_CHUNK_HEADER, + * cparser.HPE_CB_CHUNK_COMPLETE, + */ + case HPE_CB_CHUNK_HEADER: + + /* "aiohttp/_http_parser.pyx":793 + * cparser.HPE_CB_HEADERS_COMPLETE, + * cparser.HPE_CB_MESSAGE_COMPLETE, + * cparser.HPE_CB_CHUNK_HEADER, # <<<<<<<<<<<<<< + * cparser.HPE_CB_CHUNK_COMPLETE, + * cparser.HPE_INVALID_CONSTANT, + */ + case HPE_CB_CHUNK_COMPLETE: + + /* "aiohttp/_http_parser.pyx":794 + * cparser.HPE_CB_MESSAGE_COMPLETE, + * cparser.HPE_CB_CHUNK_HEADER, + * cparser.HPE_CB_CHUNK_COMPLETE, # <<<<<<<<<<<<<< + * cparser.HPE_INVALID_CONSTANT, + * cparser.HPE_INVALID_HEADER_TOKEN, + */ + case HPE_INVALID_CONSTANT: + + /* "aiohttp/_http_parser.pyx":795 + * cparser.HPE_CB_CHUNK_HEADER, + * cparser.HPE_CB_CHUNK_COMPLETE, + * cparser.HPE_INVALID_CONSTANT, # <<<<<<<<<<<<<< + * cparser.HPE_INVALID_HEADER_TOKEN, + * cparser.HPE_INVALID_CONTENT_LENGTH, + */ + case HPE_INVALID_HEADER_TOKEN: + + /* "aiohttp/_http_parser.pyx":796 + * cparser.HPE_CB_CHUNK_COMPLETE, + * cparser.HPE_INVALID_CONSTANT, + * cparser.HPE_INVALID_HEADER_TOKEN, # <<<<<<<<<<<<<< + * cparser.HPE_INVALID_CONTENT_LENGTH, + * cparser.HPE_INVALID_CHUNK_SIZE, + */ + case HPE_INVALID_CONTENT_LENGTH: + + /* "aiohttp/_http_parser.pyx":797 + * cparser.HPE_INVALID_CONSTANT, + * cparser.HPE_INVALID_HEADER_TOKEN, + * cparser.HPE_INVALID_CONTENT_LENGTH, # <<<<<<<<<<<<<< + * cparser.HPE_INVALID_CHUNK_SIZE, + * cparser.HPE_INVALID_EOF_STATE, + */ + case HPE_INVALID_CHUNK_SIZE: + + /* "aiohttp/_http_parser.pyx":798 + * cparser.HPE_INVALID_HEADER_TOKEN, + * cparser.HPE_INVALID_CONTENT_LENGTH, + * cparser.HPE_INVALID_CHUNK_SIZE, # <<<<<<<<<<<<<< + * cparser.HPE_INVALID_EOF_STATE, + * cparser.HPE_INVALID_TRANSFER_ENCODING): + */ + case HPE_INVALID_EOF_STATE: + + /* "aiohttp/_http_parser.pyx":799 + * cparser.HPE_INVALID_CONTENT_LENGTH, + * cparser.HPE_INVALID_CHUNK_SIZE, + * cparser.HPE_INVALID_EOF_STATE, # <<<<<<<<<<<<<< + * cparser.HPE_INVALID_TRANSFER_ENCODING): + * cls = BadHttpMessage + */ + case HPE_INVALID_TRANSFER_ENCODING: + + /* "aiohttp/_http_parser.pyx":801 + * cparser.HPE_INVALID_EOF_STATE, + * cparser.HPE_INVALID_TRANSFER_ENCODING): + * cls = BadHttpMessage # <<<<<<<<<<<<<< + * + * elif errno == cparser.HPE_INVALID_STATUS: + */ + __Pyx_GetModuleGlobalName(__pyx_t_1, __pyx_n_s_BadHttpMessage); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 801, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __pyx_v_cls = __pyx_t_1; + __pyx_t_1 = 0; + + /* "aiohttp/_http_parser.pyx":790 + * cdef bytes desc = cparser.llhttp_get_error_reason(parser) + * + * if errno in (cparser.HPE_CB_MESSAGE_BEGIN, # <<<<<<<<<<<<<< + * cparser.HPE_CB_HEADERS_COMPLETE, + * cparser.HPE_CB_MESSAGE_COMPLETE, + */ + break; + case HPE_INVALID_STATUS: + + /* "aiohttp/_http_parser.pyx":804 + * + * elif errno == cparser.HPE_INVALID_STATUS: + * cls = BadStatusLine # <<<<<<<<<<<<<< + * + * elif errno == cparser.HPE_INVALID_METHOD: + */ + __Pyx_GetModuleGlobalName(__pyx_t_1, __pyx_n_s_BadStatusLine); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 804, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __pyx_v_cls = __pyx_t_1; + __pyx_t_1 = 0; + + /* "aiohttp/_http_parser.pyx":803 + * cls = BadHttpMessage + * + * elif errno == cparser.HPE_INVALID_STATUS: # <<<<<<<<<<<<<< + * cls = BadStatusLine + * + */ + break; + case HPE_INVALID_METHOD: + + /* "aiohttp/_http_parser.pyx":807 + * + * elif errno == cparser.HPE_INVALID_METHOD: + * cls = BadStatusLine # <<<<<<<<<<<<<< + * + * elif errno == cparser.HPE_INVALID_VERSION: + */ + __Pyx_GetModuleGlobalName(__pyx_t_1, __pyx_n_s_BadStatusLine); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 807, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __pyx_v_cls = __pyx_t_1; + __pyx_t_1 = 0; + + /* "aiohttp/_http_parser.pyx":806 + * cls = BadStatusLine + * + * elif errno == cparser.HPE_INVALID_METHOD: # <<<<<<<<<<<<<< + * cls = BadStatusLine + * + */ + break; + case HPE_INVALID_VERSION: + + /* "aiohttp/_http_parser.pyx":810 + * + * elif errno == cparser.HPE_INVALID_VERSION: + * cls = BadStatusLine # <<<<<<<<<<<<<< + * + * elif errno == cparser.HPE_INVALID_URL: + */ + __Pyx_GetModuleGlobalName(__pyx_t_1, __pyx_n_s_BadStatusLine); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 810, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __pyx_v_cls = __pyx_t_1; + __pyx_t_1 = 0; + + /* "aiohttp/_http_parser.pyx":809 + * cls = BadStatusLine + * + * elif errno == cparser.HPE_INVALID_VERSION: # <<<<<<<<<<<<<< + * cls = BadStatusLine + * + */ + break; + case HPE_INVALID_URL: + + /* "aiohttp/_http_parser.pyx":813 + * + * elif errno == cparser.HPE_INVALID_URL: + * cls = InvalidURLError # <<<<<<<<<<<<<< + * + * else: + */ + __Pyx_GetModuleGlobalName(__pyx_t_1, __pyx_n_s_InvalidURLError); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 813, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __pyx_v_cls = __pyx_t_1; + __pyx_t_1 = 0; + + /* "aiohttp/_http_parser.pyx":812 + * cls = BadStatusLine + * + * elif errno == cparser.HPE_INVALID_URL: # <<<<<<<<<<<<<< + * cls = InvalidURLError + * + */ + break; + default: + + /* "aiohttp/_http_parser.pyx":816 + * + * else: + * cls = BadHttpMessage # <<<<<<<<<<<<<< + * + * return cls(desc.decode('latin-1')) + */ + __Pyx_GetModuleGlobalName(__pyx_t_1, __pyx_n_s_BadHttpMessage); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 816, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __pyx_v_cls = __pyx_t_1; + __pyx_t_1 = 0; + break; + } + + /* "aiohttp/_http_parser.pyx":818 + * cls = BadHttpMessage + * + * return cls(desc.decode('latin-1')) # <<<<<<<<<<<<<< + */ + __Pyx_XDECREF(__pyx_r); + __pyx_t_2 = __Pyx_decode_bytes(__pyx_v_desc, 0, PY_SSIZE_T_MAX, NULL, NULL, PyUnicode_DecodeLatin1); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 818, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_2); + __Pyx_INCREF(__pyx_v_cls); + __pyx_t_3 = __pyx_v_cls; __pyx_t_4 = NULL; + if (CYTHON_UNPACK_METHODS && unlikely(PyMethod_Check(__pyx_t_3))) { + __pyx_t_4 = PyMethod_GET_SELF(__pyx_t_3); + if (likely(__pyx_t_4)) { + PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_3); + __Pyx_INCREF(__pyx_t_4); + __Pyx_INCREF(function); + __Pyx_DECREF_SET(__pyx_t_3, function); + } + } + __pyx_t_1 = (__pyx_t_4) ? __Pyx_PyObject_Call2Args(__pyx_t_3, __pyx_t_4, __pyx_t_2) : __Pyx_PyObject_CallOneArg(__pyx_t_3, __pyx_t_2); + __Pyx_XDECREF(__pyx_t_4); __pyx_t_4 = 0; + __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; + if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 818, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; + __pyx_r = __pyx_t_1; + __pyx_t_1 = 0; + goto __pyx_L0; + + /* "aiohttp/_http_parser.pyx":786 + * + * + * cdef parser_error_from_errno(cparser.llhttp_t* parser): # <<<<<<<<<<<<<< + * cdef cparser.llhttp_errno_t errno = cparser.llhttp_get_errno(parser) + * cdef bytes desc = cparser.llhttp_get_error_reason(parser) + */ + + /* function exit code */ + __pyx_L1_error:; + __Pyx_XDECREF(__pyx_t_1); + __Pyx_XDECREF(__pyx_t_2); + __Pyx_XDECREF(__pyx_t_3); + __Pyx_XDECREF(__pyx_t_4); + __Pyx_AddTraceback("aiohttp._http_parser.parser_error_from_errno", __pyx_clineno, __pyx_lineno, __pyx_filename); + __pyx_r = 0; + __pyx_L0:; + __Pyx_XDECREF(__pyx_v_desc); + __Pyx_XDECREF(__pyx_v_cls); + __Pyx_XGIVEREF(__pyx_r); + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +/* "(tree fragment)":1 + * def __pyx_unpickle_RawRequestMessage(__pyx_type, long __pyx_checksum, __pyx_state): # <<<<<<<<<<<<<< + * cdef object __pyx_PickleError + * cdef object __pyx_result + */ + +/* Python wrapper */ +static PyObject *__pyx_pw_7aiohttp_12_http_parser_1__pyx_unpickle_RawRequestMessage(PyObject *__pyx_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/ +static PyMethodDef __pyx_mdef_7aiohttp_12_http_parser_1__pyx_unpickle_RawRequestMessage = {"__pyx_unpickle_RawRequestMessage", (PyCFunction)(void*)(PyCFunctionWithKeywords)__pyx_pw_7aiohttp_12_http_parser_1__pyx_unpickle_RawRequestMessage, METH_VARARGS|METH_KEYWORDS, 0}; +static PyObject *__pyx_pw_7aiohttp_12_http_parser_1__pyx_unpickle_RawRequestMessage(PyObject *__pyx_self, PyObject *__pyx_args, PyObject *__pyx_kwds) { + PyObject *__pyx_v___pyx_type = 0; + long __pyx_v___pyx_checksum; + PyObject *__pyx_v___pyx_state = 0; + int __pyx_lineno = 0; + const char *__pyx_filename = NULL; + int __pyx_clineno = 0; + PyObject *__pyx_r = 0; + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("__pyx_unpickle_RawRequestMessage (wrapper)", 0); + { + static PyObject **__pyx_pyargnames[] = {&__pyx_n_s_pyx_type,&__pyx_n_s_pyx_checksum,&__pyx_n_s_pyx_state,0}; + PyObject* values[3] = {0,0,0}; + if (unlikely(__pyx_kwds)) { + Py_ssize_t kw_args; + const Py_ssize_t pos_args = PyTuple_GET_SIZE(__pyx_args); + switch (pos_args) { + case 3: values[2] = PyTuple_GET_ITEM(__pyx_args, 2); + CYTHON_FALLTHROUGH; + case 2: values[1] = PyTuple_GET_ITEM(__pyx_args, 1); + CYTHON_FALLTHROUGH; + case 1: values[0] = PyTuple_GET_ITEM(__pyx_args, 0); + CYTHON_FALLTHROUGH; + case 0: break; + default: goto __pyx_L5_argtuple_error; + } + kw_args = PyDict_Size(__pyx_kwds); + switch (pos_args) { + case 0: + if (likely((values[0] = __Pyx_PyDict_GetItemStr(__pyx_kwds, __pyx_n_s_pyx_type)) != 0)) kw_args--; + else goto __pyx_L5_argtuple_error; + CYTHON_FALLTHROUGH; + case 1: + if (likely((values[1] = __Pyx_PyDict_GetItemStr(__pyx_kwds, __pyx_n_s_pyx_checksum)) != 0)) kw_args--; + else { + __Pyx_RaiseArgtupleInvalid("__pyx_unpickle_RawRequestMessage", 1, 3, 3, 1); __PYX_ERR(1, 1, __pyx_L3_error) + } + CYTHON_FALLTHROUGH; + case 2: + if (likely((values[2] = __Pyx_PyDict_GetItemStr(__pyx_kwds, __pyx_n_s_pyx_state)) != 0)) kw_args--; + else { + __Pyx_RaiseArgtupleInvalid("__pyx_unpickle_RawRequestMessage", 1, 3, 3, 2); __PYX_ERR(1, 1, __pyx_L3_error) + } + } + if (unlikely(kw_args > 0)) { + if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, pos_args, "__pyx_unpickle_RawRequestMessage") < 0)) __PYX_ERR(1, 1, __pyx_L3_error) + } + } else if (PyTuple_GET_SIZE(__pyx_args) != 3) { + goto __pyx_L5_argtuple_error; + } else { + values[0] = PyTuple_GET_ITEM(__pyx_args, 0); + values[1] = PyTuple_GET_ITEM(__pyx_args, 1); + values[2] = PyTuple_GET_ITEM(__pyx_args, 2); + } + __pyx_v___pyx_type = values[0]; + __pyx_v___pyx_checksum = __Pyx_PyInt_As_long(values[1]); if (unlikely((__pyx_v___pyx_checksum == (long)-1) && PyErr_Occurred())) __PYX_ERR(1, 1, __pyx_L3_error) + __pyx_v___pyx_state = values[2]; + } + goto __pyx_L4_argument_unpacking_done; + __pyx_L5_argtuple_error:; + __Pyx_RaiseArgtupleInvalid("__pyx_unpickle_RawRequestMessage", 1, 3, 3, PyTuple_GET_SIZE(__pyx_args)); __PYX_ERR(1, 1, __pyx_L3_error) + __pyx_L3_error:; + __Pyx_AddTraceback("aiohttp._http_parser.__pyx_unpickle_RawRequestMessage", __pyx_clineno, __pyx_lineno, __pyx_filename); + __Pyx_RefNannyFinishContext(); + return NULL; + __pyx_L4_argument_unpacking_done:; + __pyx_r = __pyx_pf_7aiohttp_12_http_parser___pyx_unpickle_RawRequestMessage(__pyx_self, __pyx_v___pyx_type, __pyx_v___pyx_checksum, __pyx_v___pyx_state); + + /* function exit code */ + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +static PyObject *__pyx_pf_7aiohttp_12_http_parser___pyx_unpickle_RawRequestMessage(CYTHON_UNUSED PyObject *__pyx_self, PyObject *__pyx_v___pyx_type, long __pyx_v___pyx_checksum, PyObject *__pyx_v___pyx_state) { + PyObject *__pyx_v___pyx_PickleError = 0; + PyObject *__pyx_v___pyx_result = 0; + PyObject *__pyx_r = NULL; + __Pyx_RefNannyDeclarations + int __pyx_t_1; + PyObject *__pyx_t_2 = NULL; + PyObject *__pyx_t_3 = NULL; + PyObject *__pyx_t_4 = NULL; + PyObject *__pyx_t_5 = NULL; + int __pyx_t_6; + int __pyx_lineno = 0; + const char *__pyx_filename = NULL; + int __pyx_clineno = 0; + __Pyx_RefNannySetupContext("__pyx_unpickle_RawRequestMessage", 0); + + /* "(tree fragment)":4 + * cdef object __pyx_PickleError + * cdef object __pyx_result + * if __pyx_checksum != 0x1408252: # <<<<<<<<<<<<<< + * from pickle import PickleError as __pyx_PickleError + * raise __pyx_PickleError("Incompatible checksums (%s vs 0x1408252 = (chunked, compression, headers, method, path, raw_headers, should_close, upgrade, url, version))" % __pyx_checksum) + */ + __pyx_t_1 = ((__pyx_v___pyx_checksum != 0x1408252) != 0); + if (__pyx_t_1) { + + /* "(tree fragment)":5 + * cdef object __pyx_result + * if __pyx_checksum != 0x1408252: + * from pickle import PickleError as __pyx_PickleError # <<<<<<<<<<<<<< + * raise __pyx_PickleError("Incompatible checksums (%s vs 0x1408252 = (chunked, compression, headers, method, path, raw_headers, should_close, upgrade, url, version))" % __pyx_checksum) + * __pyx_result = RawRequestMessage.__new__(__pyx_type) + */ + __pyx_t_2 = PyList_New(1); if (unlikely(!__pyx_t_2)) __PYX_ERR(1, 5, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_2); + __Pyx_INCREF(__pyx_n_s_PickleError); + __Pyx_GIVEREF(__pyx_n_s_PickleError); + PyList_SET_ITEM(__pyx_t_2, 0, __pyx_n_s_PickleError); + __pyx_t_3 = __Pyx_Import(__pyx_n_s_pickle, __pyx_t_2, 0); if (unlikely(!__pyx_t_3)) __PYX_ERR(1, 5, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_3); + __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; + __pyx_t_2 = __Pyx_ImportFrom(__pyx_t_3, __pyx_n_s_PickleError); if (unlikely(!__pyx_t_2)) __PYX_ERR(1, 5, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_2); + __Pyx_INCREF(__pyx_t_2); + __pyx_v___pyx_PickleError = __pyx_t_2; + __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; + __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; + + /* "(tree fragment)":6 + * if __pyx_checksum != 0x1408252: + * from pickle import PickleError as __pyx_PickleError + * raise __pyx_PickleError("Incompatible checksums (%s vs 0x1408252 = (chunked, compression, headers, method, path, raw_headers, should_close, upgrade, url, version))" % __pyx_checksum) # <<<<<<<<<<<<<< + * __pyx_result = RawRequestMessage.__new__(__pyx_type) + * if __pyx_state is not None: + */ + __pyx_t_2 = __Pyx_PyInt_From_long(__pyx_v___pyx_checksum); if (unlikely(!__pyx_t_2)) __PYX_ERR(1, 6, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_2); + __pyx_t_4 = __Pyx_PyString_Format(__pyx_kp_s_Incompatible_checksums_s_vs_0x14, __pyx_t_2); if (unlikely(!__pyx_t_4)) __PYX_ERR(1, 6, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_4); + __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; + __Pyx_INCREF(__pyx_v___pyx_PickleError); + __pyx_t_2 = __pyx_v___pyx_PickleError; __pyx_t_5 = NULL; + if (CYTHON_UNPACK_METHODS && unlikely(PyMethod_Check(__pyx_t_2))) { + __pyx_t_5 = PyMethod_GET_SELF(__pyx_t_2); + if (likely(__pyx_t_5)) { + PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_2); + __Pyx_INCREF(__pyx_t_5); + __Pyx_INCREF(function); + __Pyx_DECREF_SET(__pyx_t_2, function); + } + } + __pyx_t_3 = (__pyx_t_5) ? __Pyx_PyObject_Call2Args(__pyx_t_2, __pyx_t_5, __pyx_t_4) : __Pyx_PyObject_CallOneArg(__pyx_t_2, __pyx_t_4); + __Pyx_XDECREF(__pyx_t_5); __pyx_t_5 = 0; + __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; + if (unlikely(!__pyx_t_3)) __PYX_ERR(1, 6, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_3); + __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; + __Pyx_Raise(__pyx_t_3, 0, 0, 0); + __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; + __PYX_ERR(1, 6, __pyx_L1_error) + + /* "(tree fragment)":4 + * cdef object __pyx_PickleError + * cdef object __pyx_result + * if __pyx_checksum != 0x1408252: # <<<<<<<<<<<<<< + * from pickle import PickleError as __pyx_PickleError + * raise __pyx_PickleError("Incompatible checksums (%s vs 0x1408252 = (chunked, compression, headers, method, path, raw_headers, should_close, upgrade, url, version))" % __pyx_checksum) + */ + } + + /* "(tree fragment)":7 + * from pickle import PickleError as __pyx_PickleError + * raise __pyx_PickleError("Incompatible checksums (%s vs 0x1408252 = (chunked, compression, headers, method, path, raw_headers, should_close, upgrade, url, version))" % __pyx_checksum) + * __pyx_result = RawRequestMessage.__new__(__pyx_type) # <<<<<<<<<<<<<< + * if __pyx_state is not None: + * __pyx_unpickle_RawRequestMessage__set_state( __pyx_result, __pyx_state) + */ + __pyx_t_2 = __Pyx_PyObject_GetAttrStr(((PyObject *)__pyx_ptype_7aiohttp_12_http_parser_RawRequestMessage), __pyx_n_s_new); if (unlikely(!__pyx_t_2)) __PYX_ERR(1, 7, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_2); + __pyx_t_4 = NULL; + if (CYTHON_UNPACK_METHODS && likely(PyMethod_Check(__pyx_t_2))) { + __pyx_t_4 = PyMethod_GET_SELF(__pyx_t_2); + if (likely(__pyx_t_4)) { + PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_2); + __Pyx_INCREF(__pyx_t_4); + __Pyx_INCREF(function); + __Pyx_DECREF_SET(__pyx_t_2, function); + } + } + __pyx_t_3 = (__pyx_t_4) ? __Pyx_PyObject_Call2Args(__pyx_t_2, __pyx_t_4, __pyx_v___pyx_type) : __Pyx_PyObject_CallOneArg(__pyx_t_2, __pyx_v___pyx_type); + __Pyx_XDECREF(__pyx_t_4); __pyx_t_4 = 0; + if (unlikely(!__pyx_t_3)) __PYX_ERR(1, 7, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_3); + __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; + __pyx_v___pyx_result = __pyx_t_3; + __pyx_t_3 = 0; + + /* "(tree fragment)":8 + * raise __pyx_PickleError("Incompatible checksums (%s vs 0x1408252 = (chunked, compression, headers, method, path, raw_headers, should_close, upgrade, url, version))" % __pyx_checksum) + * __pyx_result = RawRequestMessage.__new__(__pyx_type) + * if __pyx_state is not None: # <<<<<<<<<<<<<< + * __pyx_unpickle_RawRequestMessage__set_state( __pyx_result, __pyx_state) + * return __pyx_result + */ + __pyx_t_1 = (__pyx_v___pyx_state != Py_None); + __pyx_t_6 = (__pyx_t_1 != 0); + if (__pyx_t_6) { + + /* "(tree fragment)":9 + * __pyx_result = RawRequestMessage.__new__(__pyx_type) + * if __pyx_state is not None: + * __pyx_unpickle_RawRequestMessage__set_state( __pyx_result, __pyx_state) # <<<<<<<<<<<<<< + * return __pyx_result + * cdef __pyx_unpickle_RawRequestMessage__set_state(RawRequestMessage __pyx_result, tuple __pyx_state): + */ + if (!(likely(PyTuple_CheckExact(__pyx_v___pyx_state))||((__pyx_v___pyx_state) == Py_None)||(PyErr_Format(PyExc_TypeError, "Expected %.16s, got %.200s", "tuple", Py_TYPE(__pyx_v___pyx_state)->tp_name), 0))) __PYX_ERR(1, 9, __pyx_L1_error) + __pyx_t_3 = __pyx_f_7aiohttp_12_http_parser___pyx_unpickle_RawRequestMessage__set_state(((struct __pyx_obj_7aiohttp_12_http_parser_RawRequestMessage *)__pyx_v___pyx_result), ((PyObject*)__pyx_v___pyx_state)); if (unlikely(!__pyx_t_3)) __PYX_ERR(1, 9, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_3); + __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; + + /* "(tree fragment)":8 + * raise __pyx_PickleError("Incompatible checksums (%s vs 0x1408252 = (chunked, compression, headers, method, path, raw_headers, should_close, upgrade, url, version))" % __pyx_checksum) + * __pyx_result = RawRequestMessage.__new__(__pyx_type) + * if __pyx_state is not None: # <<<<<<<<<<<<<< + * __pyx_unpickle_RawRequestMessage__set_state( __pyx_result, __pyx_state) + * return __pyx_result + */ + } + + /* "(tree fragment)":10 + * if __pyx_state is not None: + * __pyx_unpickle_RawRequestMessage__set_state( __pyx_result, __pyx_state) + * return __pyx_result # <<<<<<<<<<<<<< + * cdef __pyx_unpickle_RawRequestMessage__set_state(RawRequestMessage __pyx_result, tuple __pyx_state): + * __pyx_result.chunked = __pyx_state[0]; __pyx_result.compression = __pyx_state[1]; __pyx_result.headers = __pyx_state[2]; __pyx_result.method = __pyx_state[3]; __pyx_result.path = __pyx_state[4]; __pyx_result.raw_headers = __pyx_state[5]; __pyx_result.should_close = __pyx_state[6]; __pyx_result.upgrade = __pyx_state[7]; __pyx_result.url = __pyx_state[8]; __pyx_result.version = __pyx_state[9] + */ + __Pyx_XDECREF(__pyx_r); + __Pyx_INCREF(__pyx_v___pyx_result); + __pyx_r = __pyx_v___pyx_result; + goto __pyx_L0; + + /* "(tree fragment)":1 + * def __pyx_unpickle_RawRequestMessage(__pyx_type, long __pyx_checksum, __pyx_state): # <<<<<<<<<<<<<< + * cdef object __pyx_PickleError + * cdef object __pyx_result + */ + + /* function exit code */ + __pyx_L1_error:; + __Pyx_XDECREF(__pyx_t_2); + __Pyx_XDECREF(__pyx_t_3); + __Pyx_XDECREF(__pyx_t_4); + __Pyx_XDECREF(__pyx_t_5); + __Pyx_AddTraceback("aiohttp._http_parser.__pyx_unpickle_RawRequestMessage", __pyx_clineno, __pyx_lineno, __pyx_filename); + __pyx_r = NULL; + __pyx_L0:; + __Pyx_XDECREF(__pyx_v___pyx_PickleError); + __Pyx_XDECREF(__pyx_v___pyx_result); + __Pyx_XGIVEREF(__pyx_r); + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +/* "(tree fragment)":11 + * __pyx_unpickle_RawRequestMessage__set_state( __pyx_result, __pyx_state) + * return __pyx_result + * cdef __pyx_unpickle_RawRequestMessage__set_state(RawRequestMessage __pyx_result, tuple __pyx_state): # <<<<<<<<<<<<<< + * __pyx_result.chunked = __pyx_state[0]; __pyx_result.compression = __pyx_state[1]; __pyx_result.headers = __pyx_state[2]; __pyx_result.method = __pyx_state[3]; __pyx_result.path = __pyx_state[4]; __pyx_result.raw_headers = __pyx_state[5]; __pyx_result.should_close = __pyx_state[6]; __pyx_result.upgrade = __pyx_state[7]; __pyx_result.url = __pyx_state[8]; __pyx_result.version = __pyx_state[9] + * if len(__pyx_state) > 10 and hasattr(__pyx_result, '__dict__'): + */ + +static PyObject *__pyx_f_7aiohttp_12_http_parser___pyx_unpickle_RawRequestMessage__set_state(struct __pyx_obj_7aiohttp_12_http_parser_RawRequestMessage *__pyx_v___pyx_result, PyObject *__pyx_v___pyx_state) { + PyObject *__pyx_r = NULL; + __Pyx_RefNannyDeclarations + PyObject *__pyx_t_1 = NULL; + int __pyx_t_2; + Py_ssize_t __pyx_t_3; + int __pyx_t_4; + int __pyx_t_5; + PyObject *__pyx_t_6 = NULL; + PyObject *__pyx_t_7 = NULL; + PyObject *__pyx_t_8 = NULL; + int __pyx_lineno = 0; + const char *__pyx_filename = NULL; + int __pyx_clineno = 0; + __Pyx_RefNannySetupContext("__pyx_unpickle_RawRequestMessage__set_state", 0); + + /* "(tree fragment)":12 + * return __pyx_result + * cdef __pyx_unpickle_RawRequestMessage__set_state(RawRequestMessage __pyx_result, tuple __pyx_state): + * __pyx_result.chunked = __pyx_state[0]; __pyx_result.compression = __pyx_state[1]; __pyx_result.headers = __pyx_state[2]; __pyx_result.method = __pyx_state[3]; __pyx_result.path = __pyx_state[4]; __pyx_result.raw_headers = __pyx_state[5]; __pyx_result.should_close = __pyx_state[6]; __pyx_result.upgrade = __pyx_state[7]; __pyx_result.url = __pyx_state[8]; __pyx_result.version = __pyx_state[9] # <<<<<<<<<<<<<< + * if len(__pyx_state) > 10 and hasattr(__pyx_result, '__dict__'): + * __pyx_result.__dict__.update(__pyx_state[10]) + */ + if (unlikely(__pyx_v___pyx_state == Py_None)) { + PyErr_SetString(PyExc_TypeError, "'NoneType' object is not subscriptable"); + __PYX_ERR(1, 12, __pyx_L1_error) + } + __pyx_t_1 = __Pyx_GetItemInt_Tuple(__pyx_v___pyx_state, 0, long, 1, __Pyx_PyInt_From_long, 0, 0, 1); if (unlikely(!__pyx_t_1)) __PYX_ERR(1, 12, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __Pyx_GIVEREF(__pyx_t_1); + __Pyx_GOTREF(__pyx_v___pyx_result->chunked); + __Pyx_DECREF(__pyx_v___pyx_result->chunked); + __pyx_v___pyx_result->chunked = __pyx_t_1; + __pyx_t_1 = 0; + if (unlikely(__pyx_v___pyx_state == Py_None)) { + PyErr_SetString(PyExc_TypeError, "'NoneType' object is not subscriptable"); + __PYX_ERR(1, 12, __pyx_L1_error) + } + __pyx_t_1 = __Pyx_GetItemInt_Tuple(__pyx_v___pyx_state, 1, long, 1, __Pyx_PyInt_From_long, 0, 0, 1); if (unlikely(!__pyx_t_1)) __PYX_ERR(1, 12, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __Pyx_GIVEREF(__pyx_t_1); + __Pyx_GOTREF(__pyx_v___pyx_result->compression); + __Pyx_DECREF(__pyx_v___pyx_result->compression); + __pyx_v___pyx_result->compression = __pyx_t_1; + __pyx_t_1 = 0; + if (unlikely(__pyx_v___pyx_state == Py_None)) { + PyErr_SetString(PyExc_TypeError, "'NoneType' object is not subscriptable"); + __PYX_ERR(1, 12, __pyx_L1_error) + } + __pyx_t_1 = __Pyx_GetItemInt_Tuple(__pyx_v___pyx_state, 2, long, 1, __Pyx_PyInt_From_long, 0, 0, 1); if (unlikely(!__pyx_t_1)) __PYX_ERR(1, 12, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __Pyx_GIVEREF(__pyx_t_1); + __Pyx_GOTREF(__pyx_v___pyx_result->headers); + __Pyx_DECREF(__pyx_v___pyx_result->headers); + __pyx_v___pyx_result->headers = __pyx_t_1; + __pyx_t_1 = 0; + if (unlikely(__pyx_v___pyx_state == Py_None)) { + PyErr_SetString(PyExc_TypeError, "'NoneType' object is not subscriptable"); + __PYX_ERR(1, 12, __pyx_L1_error) + } + __pyx_t_1 = __Pyx_GetItemInt_Tuple(__pyx_v___pyx_state, 3, long, 1, __Pyx_PyInt_From_long, 0, 0, 1); if (unlikely(!__pyx_t_1)) __PYX_ERR(1, 12, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + if (!(likely(PyUnicode_CheckExact(__pyx_t_1))||((__pyx_t_1) == Py_None)||(PyErr_Format(PyExc_TypeError, "Expected %.16s, got %.200s", "unicode", Py_TYPE(__pyx_t_1)->tp_name), 0))) __PYX_ERR(1, 12, __pyx_L1_error) + __Pyx_GIVEREF(__pyx_t_1); + __Pyx_GOTREF(__pyx_v___pyx_result->method); + __Pyx_DECREF(__pyx_v___pyx_result->method); + __pyx_v___pyx_result->method = ((PyObject*)__pyx_t_1); + __pyx_t_1 = 0; + if (unlikely(__pyx_v___pyx_state == Py_None)) { + PyErr_SetString(PyExc_TypeError, "'NoneType' object is not subscriptable"); + __PYX_ERR(1, 12, __pyx_L1_error) + } + __pyx_t_1 = __Pyx_GetItemInt_Tuple(__pyx_v___pyx_state, 4, long, 1, __Pyx_PyInt_From_long, 0, 0, 1); if (unlikely(!__pyx_t_1)) __PYX_ERR(1, 12, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + if (!(likely(PyUnicode_CheckExact(__pyx_t_1))||((__pyx_t_1) == Py_None)||(PyErr_Format(PyExc_TypeError, "Expected %.16s, got %.200s", "unicode", Py_TYPE(__pyx_t_1)->tp_name), 0))) __PYX_ERR(1, 12, __pyx_L1_error) + __Pyx_GIVEREF(__pyx_t_1); + __Pyx_GOTREF(__pyx_v___pyx_result->path); + __Pyx_DECREF(__pyx_v___pyx_result->path); + __pyx_v___pyx_result->path = ((PyObject*)__pyx_t_1); + __pyx_t_1 = 0; + if (unlikely(__pyx_v___pyx_state == Py_None)) { + PyErr_SetString(PyExc_TypeError, "'NoneType' object is not subscriptable"); + __PYX_ERR(1, 12, __pyx_L1_error) + } + __pyx_t_1 = __Pyx_GetItemInt_Tuple(__pyx_v___pyx_state, 5, long, 1, __Pyx_PyInt_From_long, 0, 0, 1); if (unlikely(!__pyx_t_1)) __PYX_ERR(1, 12, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __Pyx_GIVEREF(__pyx_t_1); + __Pyx_GOTREF(__pyx_v___pyx_result->raw_headers); + __Pyx_DECREF(__pyx_v___pyx_result->raw_headers); + __pyx_v___pyx_result->raw_headers = __pyx_t_1; + __pyx_t_1 = 0; + if (unlikely(__pyx_v___pyx_state == Py_None)) { + PyErr_SetString(PyExc_TypeError, "'NoneType' object is not subscriptable"); + __PYX_ERR(1, 12, __pyx_L1_error) + } + __pyx_t_1 = __Pyx_GetItemInt_Tuple(__pyx_v___pyx_state, 6, long, 1, __Pyx_PyInt_From_long, 0, 0, 1); if (unlikely(!__pyx_t_1)) __PYX_ERR(1, 12, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __Pyx_GIVEREF(__pyx_t_1); + __Pyx_GOTREF(__pyx_v___pyx_result->should_close); + __Pyx_DECREF(__pyx_v___pyx_result->should_close); + __pyx_v___pyx_result->should_close = __pyx_t_1; + __pyx_t_1 = 0; + if (unlikely(__pyx_v___pyx_state == Py_None)) { + PyErr_SetString(PyExc_TypeError, "'NoneType' object is not subscriptable"); + __PYX_ERR(1, 12, __pyx_L1_error) + } + __pyx_t_1 = __Pyx_GetItemInt_Tuple(__pyx_v___pyx_state, 7, long, 1, __Pyx_PyInt_From_long, 0, 0, 1); if (unlikely(!__pyx_t_1)) __PYX_ERR(1, 12, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __Pyx_GIVEREF(__pyx_t_1); + __Pyx_GOTREF(__pyx_v___pyx_result->upgrade); + __Pyx_DECREF(__pyx_v___pyx_result->upgrade); + __pyx_v___pyx_result->upgrade = __pyx_t_1; + __pyx_t_1 = 0; + if (unlikely(__pyx_v___pyx_state == Py_None)) { + PyErr_SetString(PyExc_TypeError, "'NoneType' object is not subscriptable"); + __PYX_ERR(1, 12, __pyx_L1_error) + } + __pyx_t_1 = __Pyx_GetItemInt_Tuple(__pyx_v___pyx_state, 8, long, 1, __Pyx_PyInt_From_long, 0, 0, 1); if (unlikely(!__pyx_t_1)) __PYX_ERR(1, 12, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __Pyx_GIVEREF(__pyx_t_1); + __Pyx_GOTREF(__pyx_v___pyx_result->url); + __Pyx_DECREF(__pyx_v___pyx_result->url); + __pyx_v___pyx_result->url = __pyx_t_1; + __pyx_t_1 = 0; + if (unlikely(__pyx_v___pyx_state == Py_None)) { + PyErr_SetString(PyExc_TypeError, "'NoneType' object is not subscriptable"); + __PYX_ERR(1, 12, __pyx_L1_error) + } + __pyx_t_1 = __Pyx_GetItemInt_Tuple(__pyx_v___pyx_state, 9, long, 1, __Pyx_PyInt_From_long, 0, 0, 1); if (unlikely(!__pyx_t_1)) __PYX_ERR(1, 12, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __Pyx_GIVEREF(__pyx_t_1); + __Pyx_GOTREF(__pyx_v___pyx_result->version); + __Pyx_DECREF(__pyx_v___pyx_result->version); + __pyx_v___pyx_result->version = __pyx_t_1; + __pyx_t_1 = 0; + + /* "(tree fragment)":13 + * cdef __pyx_unpickle_RawRequestMessage__set_state(RawRequestMessage __pyx_result, tuple __pyx_state): + * __pyx_result.chunked = __pyx_state[0]; __pyx_result.compression = __pyx_state[1]; __pyx_result.headers = __pyx_state[2]; __pyx_result.method = __pyx_state[3]; __pyx_result.path = __pyx_state[4]; __pyx_result.raw_headers = __pyx_state[5]; __pyx_result.should_close = __pyx_state[6]; __pyx_result.upgrade = __pyx_state[7]; __pyx_result.url = __pyx_state[8]; __pyx_result.version = __pyx_state[9] + * if len(__pyx_state) > 10 and hasattr(__pyx_result, '__dict__'): # <<<<<<<<<<<<<< + * __pyx_result.__dict__.update(__pyx_state[10]) + */ + if (unlikely(__pyx_v___pyx_state == Py_None)) { + PyErr_SetString(PyExc_TypeError, "object of type 'NoneType' has no len()"); + __PYX_ERR(1, 13, __pyx_L1_error) + } + __pyx_t_3 = PyTuple_GET_SIZE(__pyx_v___pyx_state); if (unlikely(__pyx_t_3 == ((Py_ssize_t)-1))) __PYX_ERR(1, 13, __pyx_L1_error) + __pyx_t_4 = ((__pyx_t_3 > 10) != 0); + if (__pyx_t_4) { + } else { + __pyx_t_2 = __pyx_t_4; + goto __pyx_L4_bool_binop_done; + } + __pyx_t_4 = __Pyx_HasAttr(((PyObject *)__pyx_v___pyx_result), __pyx_n_s_dict); if (unlikely(__pyx_t_4 == ((int)-1))) __PYX_ERR(1, 13, __pyx_L1_error) + __pyx_t_5 = (__pyx_t_4 != 0); + __pyx_t_2 = __pyx_t_5; + __pyx_L4_bool_binop_done:; + if (__pyx_t_2) { + + /* "(tree fragment)":14 + * __pyx_result.chunked = __pyx_state[0]; __pyx_result.compression = __pyx_state[1]; __pyx_result.headers = __pyx_state[2]; __pyx_result.method = __pyx_state[3]; __pyx_result.path = __pyx_state[4]; __pyx_result.raw_headers = __pyx_state[5]; __pyx_result.should_close = __pyx_state[6]; __pyx_result.upgrade = __pyx_state[7]; __pyx_result.url = __pyx_state[8]; __pyx_result.version = __pyx_state[9] + * if len(__pyx_state) > 10 and hasattr(__pyx_result, '__dict__'): + * __pyx_result.__dict__.update(__pyx_state[10]) # <<<<<<<<<<<<<< + */ + __pyx_t_6 = __Pyx_PyObject_GetAttrStr(((PyObject *)__pyx_v___pyx_result), __pyx_n_s_dict); if (unlikely(!__pyx_t_6)) __PYX_ERR(1, 14, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_6); + __pyx_t_7 = __Pyx_PyObject_GetAttrStr(__pyx_t_6, __pyx_n_s_update); if (unlikely(!__pyx_t_7)) __PYX_ERR(1, 14, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_7); + __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0; + if (unlikely(__pyx_v___pyx_state == Py_None)) { + PyErr_SetString(PyExc_TypeError, "'NoneType' object is not subscriptable"); + __PYX_ERR(1, 14, __pyx_L1_error) + } + __pyx_t_6 = __Pyx_GetItemInt_Tuple(__pyx_v___pyx_state, 10, long, 1, __Pyx_PyInt_From_long, 0, 0, 1); if (unlikely(!__pyx_t_6)) __PYX_ERR(1, 14, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_6); + __pyx_t_8 = NULL; + if (CYTHON_UNPACK_METHODS && likely(PyMethod_Check(__pyx_t_7))) { + __pyx_t_8 = PyMethod_GET_SELF(__pyx_t_7); + if (likely(__pyx_t_8)) { + PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_7); + __Pyx_INCREF(__pyx_t_8); + __Pyx_INCREF(function); + __Pyx_DECREF_SET(__pyx_t_7, function); + } + } + __pyx_t_1 = (__pyx_t_8) ? __Pyx_PyObject_Call2Args(__pyx_t_7, __pyx_t_8, __pyx_t_6) : __Pyx_PyObject_CallOneArg(__pyx_t_7, __pyx_t_6); + __Pyx_XDECREF(__pyx_t_8); __pyx_t_8 = 0; + __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0; + if (unlikely(!__pyx_t_1)) __PYX_ERR(1, 14, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0; + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + + /* "(tree fragment)":13 + * cdef __pyx_unpickle_RawRequestMessage__set_state(RawRequestMessage __pyx_result, tuple __pyx_state): + * __pyx_result.chunked = __pyx_state[0]; __pyx_result.compression = __pyx_state[1]; __pyx_result.headers = __pyx_state[2]; __pyx_result.method = __pyx_state[3]; __pyx_result.path = __pyx_state[4]; __pyx_result.raw_headers = __pyx_state[5]; __pyx_result.should_close = __pyx_state[6]; __pyx_result.upgrade = __pyx_state[7]; __pyx_result.url = __pyx_state[8]; __pyx_result.version = __pyx_state[9] + * if len(__pyx_state) > 10 and hasattr(__pyx_result, '__dict__'): # <<<<<<<<<<<<<< + * __pyx_result.__dict__.update(__pyx_state[10]) + */ + } + + /* "(tree fragment)":11 + * __pyx_unpickle_RawRequestMessage__set_state( __pyx_result, __pyx_state) + * return __pyx_result + * cdef __pyx_unpickle_RawRequestMessage__set_state(RawRequestMessage __pyx_result, tuple __pyx_state): # <<<<<<<<<<<<<< + * __pyx_result.chunked = __pyx_state[0]; __pyx_result.compression = __pyx_state[1]; __pyx_result.headers = __pyx_state[2]; __pyx_result.method = __pyx_state[3]; __pyx_result.path = __pyx_state[4]; __pyx_result.raw_headers = __pyx_state[5]; __pyx_result.should_close = __pyx_state[6]; __pyx_result.upgrade = __pyx_state[7]; __pyx_result.url = __pyx_state[8]; __pyx_result.version = __pyx_state[9] + * if len(__pyx_state) > 10 and hasattr(__pyx_result, '__dict__'): + */ + + /* function exit code */ + __pyx_r = Py_None; __Pyx_INCREF(Py_None); + goto __pyx_L0; + __pyx_L1_error:; + __Pyx_XDECREF(__pyx_t_1); + __Pyx_XDECREF(__pyx_t_6); + __Pyx_XDECREF(__pyx_t_7); + __Pyx_XDECREF(__pyx_t_8); + __Pyx_AddTraceback("aiohttp._http_parser.__pyx_unpickle_RawRequestMessage__set_state", __pyx_clineno, __pyx_lineno, __pyx_filename); + __pyx_r = 0; + __pyx_L0:; + __Pyx_XGIVEREF(__pyx_r); + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +/* "(tree fragment)":1 + * def __pyx_unpickle_RawResponseMessage(__pyx_type, long __pyx_checksum, __pyx_state): # <<<<<<<<<<<<<< + * cdef object __pyx_PickleError + * cdef object __pyx_result + */ + +/* Python wrapper */ +static PyObject *__pyx_pw_7aiohttp_12_http_parser_3__pyx_unpickle_RawResponseMessage(PyObject *__pyx_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/ +static PyMethodDef __pyx_mdef_7aiohttp_12_http_parser_3__pyx_unpickle_RawResponseMessage = {"__pyx_unpickle_RawResponseMessage", (PyCFunction)(void*)(PyCFunctionWithKeywords)__pyx_pw_7aiohttp_12_http_parser_3__pyx_unpickle_RawResponseMessage, METH_VARARGS|METH_KEYWORDS, 0}; +static PyObject *__pyx_pw_7aiohttp_12_http_parser_3__pyx_unpickle_RawResponseMessage(PyObject *__pyx_self, PyObject *__pyx_args, PyObject *__pyx_kwds) { + PyObject *__pyx_v___pyx_type = 0; + long __pyx_v___pyx_checksum; + PyObject *__pyx_v___pyx_state = 0; + int __pyx_lineno = 0; + const char *__pyx_filename = NULL; + int __pyx_clineno = 0; + PyObject *__pyx_r = 0; + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("__pyx_unpickle_RawResponseMessage (wrapper)", 0); + { + static PyObject **__pyx_pyargnames[] = {&__pyx_n_s_pyx_type,&__pyx_n_s_pyx_checksum,&__pyx_n_s_pyx_state,0}; + PyObject* values[3] = {0,0,0}; + if (unlikely(__pyx_kwds)) { + Py_ssize_t kw_args; + const Py_ssize_t pos_args = PyTuple_GET_SIZE(__pyx_args); + switch (pos_args) { + case 3: values[2] = PyTuple_GET_ITEM(__pyx_args, 2); + CYTHON_FALLTHROUGH; + case 2: values[1] = PyTuple_GET_ITEM(__pyx_args, 1); + CYTHON_FALLTHROUGH; + case 1: values[0] = PyTuple_GET_ITEM(__pyx_args, 0); + CYTHON_FALLTHROUGH; + case 0: break; + default: goto __pyx_L5_argtuple_error; + } + kw_args = PyDict_Size(__pyx_kwds); + switch (pos_args) { + case 0: + if (likely((values[0] = __Pyx_PyDict_GetItemStr(__pyx_kwds, __pyx_n_s_pyx_type)) != 0)) kw_args--; + else goto __pyx_L5_argtuple_error; + CYTHON_FALLTHROUGH; + case 1: + if (likely((values[1] = __Pyx_PyDict_GetItemStr(__pyx_kwds, __pyx_n_s_pyx_checksum)) != 0)) kw_args--; + else { + __Pyx_RaiseArgtupleInvalid("__pyx_unpickle_RawResponseMessage", 1, 3, 3, 1); __PYX_ERR(1, 1, __pyx_L3_error) + } + CYTHON_FALLTHROUGH; + case 2: + if (likely((values[2] = __Pyx_PyDict_GetItemStr(__pyx_kwds, __pyx_n_s_pyx_state)) != 0)) kw_args--; + else { + __Pyx_RaiseArgtupleInvalid("__pyx_unpickle_RawResponseMessage", 1, 3, 3, 2); __PYX_ERR(1, 1, __pyx_L3_error) + } + } + if (unlikely(kw_args > 0)) { + if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, pos_args, "__pyx_unpickle_RawResponseMessage") < 0)) __PYX_ERR(1, 1, __pyx_L3_error) + } + } else if (PyTuple_GET_SIZE(__pyx_args) != 3) { + goto __pyx_L5_argtuple_error; + } else { + values[0] = PyTuple_GET_ITEM(__pyx_args, 0); + values[1] = PyTuple_GET_ITEM(__pyx_args, 1); + values[2] = PyTuple_GET_ITEM(__pyx_args, 2); + } + __pyx_v___pyx_type = values[0]; + __pyx_v___pyx_checksum = __Pyx_PyInt_As_long(values[1]); if (unlikely((__pyx_v___pyx_checksum == (long)-1) && PyErr_Occurred())) __PYX_ERR(1, 1, __pyx_L3_error) + __pyx_v___pyx_state = values[2]; + } + goto __pyx_L4_argument_unpacking_done; + __pyx_L5_argtuple_error:; + __Pyx_RaiseArgtupleInvalid("__pyx_unpickle_RawResponseMessage", 1, 3, 3, PyTuple_GET_SIZE(__pyx_args)); __PYX_ERR(1, 1, __pyx_L3_error) + __pyx_L3_error:; + __Pyx_AddTraceback("aiohttp._http_parser.__pyx_unpickle_RawResponseMessage", __pyx_clineno, __pyx_lineno, __pyx_filename); + __Pyx_RefNannyFinishContext(); + return NULL; + __pyx_L4_argument_unpacking_done:; + __pyx_r = __pyx_pf_7aiohttp_12_http_parser_2__pyx_unpickle_RawResponseMessage(__pyx_self, __pyx_v___pyx_type, __pyx_v___pyx_checksum, __pyx_v___pyx_state); + + /* function exit code */ + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +static PyObject *__pyx_pf_7aiohttp_12_http_parser_2__pyx_unpickle_RawResponseMessage(CYTHON_UNUSED PyObject *__pyx_self, PyObject *__pyx_v___pyx_type, long __pyx_v___pyx_checksum, PyObject *__pyx_v___pyx_state) { + PyObject *__pyx_v___pyx_PickleError = 0; + PyObject *__pyx_v___pyx_result = 0; + PyObject *__pyx_r = NULL; + __Pyx_RefNannyDeclarations + int __pyx_t_1; + PyObject *__pyx_t_2 = NULL; + PyObject *__pyx_t_3 = NULL; + PyObject *__pyx_t_4 = NULL; + PyObject *__pyx_t_5 = NULL; + int __pyx_t_6; + int __pyx_lineno = 0; + const char *__pyx_filename = NULL; + int __pyx_clineno = 0; + __Pyx_RefNannySetupContext("__pyx_unpickle_RawResponseMessage", 0); + + /* "(tree fragment)":4 + * cdef object __pyx_PickleError + * cdef object __pyx_result + * if __pyx_checksum != 0xc7706dc: # <<<<<<<<<<<<<< + * from pickle import PickleError as __pyx_PickleError + * raise __pyx_PickleError("Incompatible checksums (%s vs 0xc7706dc = (chunked, code, compression, headers, raw_headers, reason, should_close, upgrade, version))" % __pyx_checksum) + */ + __pyx_t_1 = ((__pyx_v___pyx_checksum != 0xc7706dc) != 0); + if (__pyx_t_1) { + + /* "(tree fragment)":5 + * cdef object __pyx_result + * if __pyx_checksum != 0xc7706dc: + * from pickle import PickleError as __pyx_PickleError # <<<<<<<<<<<<<< + * raise __pyx_PickleError("Incompatible checksums (%s vs 0xc7706dc = (chunked, code, compression, headers, raw_headers, reason, should_close, upgrade, version))" % __pyx_checksum) + * __pyx_result = RawResponseMessage.__new__(__pyx_type) + */ + __pyx_t_2 = PyList_New(1); if (unlikely(!__pyx_t_2)) __PYX_ERR(1, 5, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_2); + __Pyx_INCREF(__pyx_n_s_PickleError); + __Pyx_GIVEREF(__pyx_n_s_PickleError); + PyList_SET_ITEM(__pyx_t_2, 0, __pyx_n_s_PickleError); + __pyx_t_3 = __Pyx_Import(__pyx_n_s_pickle, __pyx_t_2, 0); if (unlikely(!__pyx_t_3)) __PYX_ERR(1, 5, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_3); + __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; + __pyx_t_2 = __Pyx_ImportFrom(__pyx_t_3, __pyx_n_s_PickleError); if (unlikely(!__pyx_t_2)) __PYX_ERR(1, 5, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_2); + __Pyx_INCREF(__pyx_t_2); + __pyx_v___pyx_PickleError = __pyx_t_2; + __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; + __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; + + /* "(tree fragment)":6 + * if __pyx_checksum != 0xc7706dc: + * from pickle import PickleError as __pyx_PickleError + * raise __pyx_PickleError("Incompatible checksums (%s vs 0xc7706dc = (chunked, code, compression, headers, raw_headers, reason, should_close, upgrade, version))" % __pyx_checksum) # <<<<<<<<<<<<<< + * __pyx_result = RawResponseMessage.__new__(__pyx_type) + * if __pyx_state is not None: + */ + __pyx_t_2 = __Pyx_PyInt_From_long(__pyx_v___pyx_checksum); if (unlikely(!__pyx_t_2)) __PYX_ERR(1, 6, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_2); + __pyx_t_4 = __Pyx_PyString_Format(__pyx_kp_s_Incompatible_checksums_s_vs_0xc7, __pyx_t_2); if (unlikely(!__pyx_t_4)) __PYX_ERR(1, 6, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_4); + __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; + __Pyx_INCREF(__pyx_v___pyx_PickleError); + __pyx_t_2 = __pyx_v___pyx_PickleError; __pyx_t_5 = NULL; + if (CYTHON_UNPACK_METHODS && unlikely(PyMethod_Check(__pyx_t_2))) { + __pyx_t_5 = PyMethod_GET_SELF(__pyx_t_2); + if (likely(__pyx_t_5)) { + PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_2); + __Pyx_INCREF(__pyx_t_5); + __Pyx_INCREF(function); + __Pyx_DECREF_SET(__pyx_t_2, function); + } + } + __pyx_t_3 = (__pyx_t_5) ? __Pyx_PyObject_Call2Args(__pyx_t_2, __pyx_t_5, __pyx_t_4) : __Pyx_PyObject_CallOneArg(__pyx_t_2, __pyx_t_4); + __Pyx_XDECREF(__pyx_t_5); __pyx_t_5 = 0; + __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; + if (unlikely(!__pyx_t_3)) __PYX_ERR(1, 6, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_3); + __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; + __Pyx_Raise(__pyx_t_3, 0, 0, 0); + __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; + __PYX_ERR(1, 6, __pyx_L1_error) + + /* "(tree fragment)":4 + * cdef object __pyx_PickleError + * cdef object __pyx_result + * if __pyx_checksum != 0xc7706dc: # <<<<<<<<<<<<<< + * from pickle import PickleError as __pyx_PickleError + * raise __pyx_PickleError("Incompatible checksums (%s vs 0xc7706dc = (chunked, code, compression, headers, raw_headers, reason, should_close, upgrade, version))" % __pyx_checksum) + */ + } + + /* "(tree fragment)":7 + * from pickle import PickleError as __pyx_PickleError + * raise __pyx_PickleError("Incompatible checksums (%s vs 0xc7706dc = (chunked, code, compression, headers, raw_headers, reason, should_close, upgrade, version))" % __pyx_checksum) + * __pyx_result = RawResponseMessage.__new__(__pyx_type) # <<<<<<<<<<<<<< + * if __pyx_state is not None: + * __pyx_unpickle_RawResponseMessage__set_state( __pyx_result, __pyx_state) + */ + __pyx_t_2 = __Pyx_PyObject_GetAttrStr(((PyObject *)__pyx_ptype_7aiohttp_12_http_parser_RawResponseMessage), __pyx_n_s_new); if (unlikely(!__pyx_t_2)) __PYX_ERR(1, 7, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_2); + __pyx_t_4 = NULL; + if (CYTHON_UNPACK_METHODS && likely(PyMethod_Check(__pyx_t_2))) { + __pyx_t_4 = PyMethod_GET_SELF(__pyx_t_2); + if (likely(__pyx_t_4)) { + PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_2); + __Pyx_INCREF(__pyx_t_4); + __Pyx_INCREF(function); + __Pyx_DECREF_SET(__pyx_t_2, function); + } + } + __pyx_t_3 = (__pyx_t_4) ? __Pyx_PyObject_Call2Args(__pyx_t_2, __pyx_t_4, __pyx_v___pyx_type) : __Pyx_PyObject_CallOneArg(__pyx_t_2, __pyx_v___pyx_type); + __Pyx_XDECREF(__pyx_t_4); __pyx_t_4 = 0; + if (unlikely(!__pyx_t_3)) __PYX_ERR(1, 7, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_3); + __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; + __pyx_v___pyx_result = __pyx_t_3; + __pyx_t_3 = 0; + + /* "(tree fragment)":8 + * raise __pyx_PickleError("Incompatible checksums (%s vs 0xc7706dc = (chunked, code, compression, headers, raw_headers, reason, should_close, upgrade, version))" % __pyx_checksum) + * __pyx_result = RawResponseMessage.__new__(__pyx_type) + * if __pyx_state is not None: # <<<<<<<<<<<<<< + * __pyx_unpickle_RawResponseMessage__set_state( __pyx_result, __pyx_state) + * return __pyx_result + */ + __pyx_t_1 = (__pyx_v___pyx_state != Py_None); + __pyx_t_6 = (__pyx_t_1 != 0); + if (__pyx_t_6) { + + /* "(tree fragment)":9 + * __pyx_result = RawResponseMessage.__new__(__pyx_type) + * if __pyx_state is not None: + * __pyx_unpickle_RawResponseMessage__set_state( __pyx_result, __pyx_state) # <<<<<<<<<<<<<< + * return __pyx_result + * cdef __pyx_unpickle_RawResponseMessage__set_state(RawResponseMessage __pyx_result, tuple __pyx_state): + */ + if (!(likely(PyTuple_CheckExact(__pyx_v___pyx_state))||((__pyx_v___pyx_state) == Py_None)||(PyErr_Format(PyExc_TypeError, "Expected %.16s, got %.200s", "tuple", Py_TYPE(__pyx_v___pyx_state)->tp_name), 0))) __PYX_ERR(1, 9, __pyx_L1_error) + __pyx_t_3 = __pyx_f_7aiohttp_12_http_parser___pyx_unpickle_RawResponseMessage__set_state(((struct __pyx_obj_7aiohttp_12_http_parser_RawResponseMessage *)__pyx_v___pyx_result), ((PyObject*)__pyx_v___pyx_state)); if (unlikely(!__pyx_t_3)) __PYX_ERR(1, 9, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_3); + __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; + + /* "(tree fragment)":8 + * raise __pyx_PickleError("Incompatible checksums (%s vs 0xc7706dc = (chunked, code, compression, headers, raw_headers, reason, should_close, upgrade, version))" % __pyx_checksum) + * __pyx_result = RawResponseMessage.__new__(__pyx_type) + * if __pyx_state is not None: # <<<<<<<<<<<<<< + * __pyx_unpickle_RawResponseMessage__set_state( __pyx_result, __pyx_state) + * return __pyx_result + */ + } + + /* "(tree fragment)":10 + * if __pyx_state is not None: + * __pyx_unpickle_RawResponseMessage__set_state( __pyx_result, __pyx_state) + * return __pyx_result # <<<<<<<<<<<<<< + * cdef __pyx_unpickle_RawResponseMessage__set_state(RawResponseMessage __pyx_result, tuple __pyx_state): + * __pyx_result.chunked = __pyx_state[0]; __pyx_result.code = __pyx_state[1]; __pyx_result.compression = __pyx_state[2]; __pyx_result.headers = __pyx_state[3]; __pyx_result.raw_headers = __pyx_state[4]; __pyx_result.reason = __pyx_state[5]; __pyx_result.should_close = __pyx_state[6]; __pyx_result.upgrade = __pyx_state[7]; __pyx_result.version = __pyx_state[8] + */ + __Pyx_XDECREF(__pyx_r); + __Pyx_INCREF(__pyx_v___pyx_result); + __pyx_r = __pyx_v___pyx_result; + goto __pyx_L0; + + /* "(tree fragment)":1 + * def __pyx_unpickle_RawResponseMessage(__pyx_type, long __pyx_checksum, __pyx_state): # <<<<<<<<<<<<<< + * cdef object __pyx_PickleError + * cdef object __pyx_result + */ + + /* function exit code */ + __pyx_L1_error:; + __Pyx_XDECREF(__pyx_t_2); + __Pyx_XDECREF(__pyx_t_3); + __Pyx_XDECREF(__pyx_t_4); + __Pyx_XDECREF(__pyx_t_5); + __Pyx_AddTraceback("aiohttp._http_parser.__pyx_unpickle_RawResponseMessage", __pyx_clineno, __pyx_lineno, __pyx_filename); + __pyx_r = NULL; + __pyx_L0:; + __Pyx_XDECREF(__pyx_v___pyx_PickleError); + __Pyx_XDECREF(__pyx_v___pyx_result); + __Pyx_XGIVEREF(__pyx_r); + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +/* "(tree fragment)":11 + * __pyx_unpickle_RawResponseMessage__set_state( __pyx_result, __pyx_state) + * return __pyx_result + * cdef __pyx_unpickle_RawResponseMessage__set_state(RawResponseMessage __pyx_result, tuple __pyx_state): # <<<<<<<<<<<<<< + * __pyx_result.chunked = __pyx_state[0]; __pyx_result.code = __pyx_state[1]; __pyx_result.compression = __pyx_state[2]; __pyx_result.headers = __pyx_state[3]; __pyx_result.raw_headers = __pyx_state[4]; __pyx_result.reason = __pyx_state[5]; __pyx_result.should_close = __pyx_state[6]; __pyx_result.upgrade = __pyx_state[7]; __pyx_result.version = __pyx_state[8] + * if len(__pyx_state) > 9 and hasattr(__pyx_result, '__dict__'): + */ + +static PyObject *__pyx_f_7aiohttp_12_http_parser___pyx_unpickle_RawResponseMessage__set_state(struct __pyx_obj_7aiohttp_12_http_parser_RawResponseMessage *__pyx_v___pyx_result, PyObject *__pyx_v___pyx_state) { + PyObject *__pyx_r = NULL; + __Pyx_RefNannyDeclarations + PyObject *__pyx_t_1 = NULL; + int __pyx_t_2; + int __pyx_t_3; + Py_ssize_t __pyx_t_4; + int __pyx_t_5; + int __pyx_t_6; + PyObject *__pyx_t_7 = NULL; + PyObject *__pyx_t_8 = NULL; + PyObject *__pyx_t_9 = NULL; + int __pyx_lineno = 0; + const char *__pyx_filename = NULL; + int __pyx_clineno = 0; + __Pyx_RefNannySetupContext("__pyx_unpickle_RawResponseMessage__set_state", 0); + + /* "(tree fragment)":12 + * return __pyx_result + * cdef __pyx_unpickle_RawResponseMessage__set_state(RawResponseMessage __pyx_result, tuple __pyx_state): + * __pyx_result.chunked = __pyx_state[0]; __pyx_result.code = __pyx_state[1]; __pyx_result.compression = __pyx_state[2]; __pyx_result.headers = __pyx_state[3]; __pyx_result.raw_headers = __pyx_state[4]; __pyx_result.reason = __pyx_state[5]; __pyx_result.should_close = __pyx_state[6]; __pyx_result.upgrade = __pyx_state[7]; __pyx_result.version = __pyx_state[8] # <<<<<<<<<<<<<< + * if len(__pyx_state) > 9 and hasattr(__pyx_result, '__dict__'): + * __pyx_result.__dict__.update(__pyx_state[9]) + */ + if (unlikely(__pyx_v___pyx_state == Py_None)) { + PyErr_SetString(PyExc_TypeError, "'NoneType' object is not subscriptable"); + __PYX_ERR(1, 12, __pyx_L1_error) + } + __pyx_t_1 = __Pyx_GetItemInt_Tuple(__pyx_v___pyx_state, 0, long, 1, __Pyx_PyInt_From_long, 0, 0, 1); if (unlikely(!__pyx_t_1)) __PYX_ERR(1, 12, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __Pyx_GIVEREF(__pyx_t_1); + __Pyx_GOTREF(__pyx_v___pyx_result->chunked); + __Pyx_DECREF(__pyx_v___pyx_result->chunked); + __pyx_v___pyx_result->chunked = __pyx_t_1; + __pyx_t_1 = 0; + if (unlikely(__pyx_v___pyx_state == Py_None)) { + PyErr_SetString(PyExc_TypeError, "'NoneType' object is not subscriptable"); + __PYX_ERR(1, 12, __pyx_L1_error) + } + __pyx_t_1 = __Pyx_GetItemInt_Tuple(__pyx_v___pyx_state, 1, long, 1, __Pyx_PyInt_From_long, 0, 0, 1); if (unlikely(!__pyx_t_1)) __PYX_ERR(1, 12, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __pyx_t_2 = __Pyx_PyInt_As_int(__pyx_t_1); if (unlikely((__pyx_t_2 == (int)-1) && PyErr_Occurred())) __PYX_ERR(1, 12, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + __pyx_v___pyx_result->code = __pyx_t_2; + if (unlikely(__pyx_v___pyx_state == Py_None)) { + PyErr_SetString(PyExc_TypeError, "'NoneType' object is not subscriptable"); + __PYX_ERR(1, 12, __pyx_L1_error) + } + __pyx_t_1 = __Pyx_GetItemInt_Tuple(__pyx_v___pyx_state, 2, long, 1, __Pyx_PyInt_From_long, 0, 0, 1); if (unlikely(!__pyx_t_1)) __PYX_ERR(1, 12, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __Pyx_GIVEREF(__pyx_t_1); + __Pyx_GOTREF(__pyx_v___pyx_result->compression); + __Pyx_DECREF(__pyx_v___pyx_result->compression); + __pyx_v___pyx_result->compression = __pyx_t_1; + __pyx_t_1 = 0; + if (unlikely(__pyx_v___pyx_state == Py_None)) { + PyErr_SetString(PyExc_TypeError, "'NoneType' object is not subscriptable"); + __PYX_ERR(1, 12, __pyx_L1_error) + } + __pyx_t_1 = __Pyx_GetItemInt_Tuple(__pyx_v___pyx_state, 3, long, 1, __Pyx_PyInt_From_long, 0, 0, 1); if (unlikely(!__pyx_t_1)) __PYX_ERR(1, 12, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __Pyx_GIVEREF(__pyx_t_1); + __Pyx_GOTREF(__pyx_v___pyx_result->headers); + __Pyx_DECREF(__pyx_v___pyx_result->headers); + __pyx_v___pyx_result->headers = __pyx_t_1; + __pyx_t_1 = 0; + if (unlikely(__pyx_v___pyx_state == Py_None)) { + PyErr_SetString(PyExc_TypeError, "'NoneType' object is not subscriptable"); + __PYX_ERR(1, 12, __pyx_L1_error) + } + __pyx_t_1 = __Pyx_GetItemInt_Tuple(__pyx_v___pyx_state, 4, long, 1, __Pyx_PyInt_From_long, 0, 0, 1); if (unlikely(!__pyx_t_1)) __PYX_ERR(1, 12, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __Pyx_GIVEREF(__pyx_t_1); + __Pyx_GOTREF(__pyx_v___pyx_result->raw_headers); + __Pyx_DECREF(__pyx_v___pyx_result->raw_headers); + __pyx_v___pyx_result->raw_headers = __pyx_t_1; + __pyx_t_1 = 0; + if (unlikely(__pyx_v___pyx_state == Py_None)) { + PyErr_SetString(PyExc_TypeError, "'NoneType' object is not subscriptable"); + __PYX_ERR(1, 12, __pyx_L1_error) + } + __pyx_t_1 = __Pyx_GetItemInt_Tuple(__pyx_v___pyx_state, 5, long, 1, __Pyx_PyInt_From_long, 0, 0, 1); if (unlikely(!__pyx_t_1)) __PYX_ERR(1, 12, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + if (!(likely(PyUnicode_CheckExact(__pyx_t_1))||((__pyx_t_1) == Py_None)||(PyErr_Format(PyExc_TypeError, "Expected %.16s, got %.200s", "unicode", Py_TYPE(__pyx_t_1)->tp_name), 0))) __PYX_ERR(1, 12, __pyx_L1_error) + __Pyx_GIVEREF(__pyx_t_1); + __Pyx_GOTREF(__pyx_v___pyx_result->reason); + __Pyx_DECREF(__pyx_v___pyx_result->reason); + __pyx_v___pyx_result->reason = ((PyObject*)__pyx_t_1); + __pyx_t_1 = 0; + if (unlikely(__pyx_v___pyx_state == Py_None)) { + PyErr_SetString(PyExc_TypeError, "'NoneType' object is not subscriptable"); + __PYX_ERR(1, 12, __pyx_L1_error) + } + __pyx_t_1 = __Pyx_GetItemInt_Tuple(__pyx_v___pyx_state, 6, long, 1, __Pyx_PyInt_From_long, 0, 0, 1); if (unlikely(!__pyx_t_1)) __PYX_ERR(1, 12, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __Pyx_GIVEREF(__pyx_t_1); + __Pyx_GOTREF(__pyx_v___pyx_result->should_close); + __Pyx_DECREF(__pyx_v___pyx_result->should_close); + __pyx_v___pyx_result->should_close = __pyx_t_1; + __pyx_t_1 = 0; + if (unlikely(__pyx_v___pyx_state == Py_None)) { + PyErr_SetString(PyExc_TypeError, "'NoneType' object is not subscriptable"); + __PYX_ERR(1, 12, __pyx_L1_error) + } + __pyx_t_1 = __Pyx_GetItemInt_Tuple(__pyx_v___pyx_state, 7, long, 1, __Pyx_PyInt_From_long, 0, 0, 1); if (unlikely(!__pyx_t_1)) __PYX_ERR(1, 12, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __Pyx_GIVEREF(__pyx_t_1); + __Pyx_GOTREF(__pyx_v___pyx_result->upgrade); + __Pyx_DECREF(__pyx_v___pyx_result->upgrade); + __pyx_v___pyx_result->upgrade = __pyx_t_1; + __pyx_t_1 = 0; + if (unlikely(__pyx_v___pyx_state == Py_None)) { + PyErr_SetString(PyExc_TypeError, "'NoneType' object is not subscriptable"); + __PYX_ERR(1, 12, __pyx_L1_error) + } + __pyx_t_1 = __Pyx_GetItemInt_Tuple(__pyx_v___pyx_state, 8, long, 1, __Pyx_PyInt_From_long, 0, 0, 1); if (unlikely(!__pyx_t_1)) __PYX_ERR(1, 12, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __Pyx_GIVEREF(__pyx_t_1); + __Pyx_GOTREF(__pyx_v___pyx_result->version); + __Pyx_DECREF(__pyx_v___pyx_result->version); + __pyx_v___pyx_result->version = __pyx_t_1; + __pyx_t_1 = 0; + + /* "(tree fragment)":13 + * cdef __pyx_unpickle_RawResponseMessage__set_state(RawResponseMessage __pyx_result, tuple __pyx_state): + * __pyx_result.chunked = __pyx_state[0]; __pyx_result.code = __pyx_state[1]; __pyx_result.compression = __pyx_state[2]; __pyx_result.headers = __pyx_state[3]; __pyx_result.raw_headers = __pyx_state[4]; __pyx_result.reason = __pyx_state[5]; __pyx_result.should_close = __pyx_state[6]; __pyx_result.upgrade = __pyx_state[7]; __pyx_result.version = __pyx_state[8] + * if len(__pyx_state) > 9 and hasattr(__pyx_result, '__dict__'): # <<<<<<<<<<<<<< + * __pyx_result.__dict__.update(__pyx_state[9]) + */ + if (unlikely(__pyx_v___pyx_state == Py_None)) { + PyErr_SetString(PyExc_TypeError, "object of type 'NoneType' has no len()"); + __PYX_ERR(1, 13, __pyx_L1_error) + } + __pyx_t_4 = PyTuple_GET_SIZE(__pyx_v___pyx_state); if (unlikely(__pyx_t_4 == ((Py_ssize_t)-1))) __PYX_ERR(1, 13, __pyx_L1_error) + __pyx_t_5 = ((__pyx_t_4 > 9) != 0); + if (__pyx_t_5) { + } else { + __pyx_t_3 = __pyx_t_5; + goto __pyx_L4_bool_binop_done; + } + __pyx_t_5 = __Pyx_HasAttr(((PyObject *)__pyx_v___pyx_result), __pyx_n_s_dict); if (unlikely(__pyx_t_5 == ((int)-1))) __PYX_ERR(1, 13, __pyx_L1_error) + __pyx_t_6 = (__pyx_t_5 != 0); + __pyx_t_3 = __pyx_t_6; + __pyx_L4_bool_binop_done:; + if (__pyx_t_3) { + + /* "(tree fragment)":14 + * __pyx_result.chunked = __pyx_state[0]; __pyx_result.code = __pyx_state[1]; __pyx_result.compression = __pyx_state[2]; __pyx_result.headers = __pyx_state[3]; __pyx_result.raw_headers = __pyx_state[4]; __pyx_result.reason = __pyx_state[5]; __pyx_result.should_close = __pyx_state[6]; __pyx_result.upgrade = __pyx_state[7]; __pyx_result.version = __pyx_state[8] + * if len(__pyx_state) > 9 and hasattr(__pyx_result, '__dict__'): + * __pyx_result.__dict__.update(__pyx_state[9]) # <<<<<<<<<<<<<< + */ + __pyx_t_7 = __Pyx_PyObject_GetAttrStr(((PyObject *)__pyx_v___pyx_result), __pyx_n_s_dict); if (unlikely(!__pyx_t_7)) __PYX_ERR(1, 14, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_7); + __pyx_t_8 = __Pyx_PyObject_GetAttrStr(__pyx_t_7, __pyx_n_s_update); if (unlikely(!__pyx_t_8)) __PYX_ERR(1, 14, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_8); + __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0; + if (unlikely(__pyx_v___pyx_state == Py_None)) { + PyErr_SetString(PyExc_TypeError, "'NoneType' object is not subscriptable"); + __PYX_ERR(1, 14, __pyx_L1_error) + } + __pyx_t_7 = __Pyx_GetItemInt_Tuple(__pyx_v___pyx_state, 9, long, 1, __Pyx_PyInt_From_long, 0, 0, 1); if (unlikely(!__pyx_t_7)) __PYX_ERR(1, 14, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_7); + __pyx_t_9 = NULL; + if (CYTHON_UNPACK_METHODS && likely(PyMethod_Check(__pyx_t_8))) { + __pyx_t_9 = PyMethod_GET_SELF(__pyx_t_8); + if (likely(__pyx_t_9)) { + PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_8); + __Pyx_INCREF(__pyx_t_9); + __Pyx_INCREF(function); + __Pyx_DECREF_SET(__pyx_t_8, function); + } + } + __pyx_t_1 = (__pyx_t_9) ? __Pyx_PyObject_Call2Args(__pyx_t_8, __pyx_t_9, __pyx_t_7) : __Pyx_PyObject_CallOneArg(__pyx_t_8, __pyx_t_7); + __Pyx_XDECREF(__pyx_t_9); __pyx_t_9 = 0; + __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0; + if (unlikely(!__pyx_t_1)) __PYX_ERR(1, 14, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __Pyx_DECREF(__pyx_t_8); __pyx_t_8 = 0; + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + + /* "(tree fragment)":13 + * cdef __pyx_unpickle_RawResponseMessage__set_state(RawResponseMessage __pyx_result, tuple __pyx_state): + * __pyx_result.chunked = __pyx_state[0]; __pyx_result.code = __pyx_state[1]; __pyx_result.compression = __pyx_state[2]; __pyx_result.headers = __pyx_state[3]; __pyx_result.raw_headers = __pyx_state[4]; __pyx_result.reason = __pyx_state[5]; __pyx_result.should_close = __pyx_state[6]; __pyx_result.upgrade = __pyx_state[7]; __pyx_result.version = __pyx_state[8] + * if len(__pyx_state) > 9 and hasattr(__pyx_result, '__dict__'): # <<<<<<<<<<<<<< + * __pyx_result.__dict__.update(__pyx_state[9]) + */ + } + + /* "(tree fragment)":11 + * __pyx_unpickle_RawResponseMessage__set_state( __pyx_result, __pyx_state) + * return __pyx_result + * cdef __pyx_unpickle_RawResponseMessage__set_state(RawResponseMessage __pyx_result, tuple __pyx_state): # <<<<<<<<<<<<<< + * __pyx_result.chunked = __pyx_state[0]; __pyx_result.code = __pyx_state[1]; __pyx_result.compression = __pyx_state[2]; __pyx_result.headers = __pyx_state[3]; __pyx_result.raw_headers = __pyx_state[4]; __pyx_result.reason = __pyx_state[5]; __pyx_result.should_close = __pyx_state[6]; __pyx_result.upgrade = __pyx_state[7]; __pyx_result.version = __pyx_state[8] + * if len(__pyx_state) > 9 and hasattr(__pyx_result, '__dict__'): + */ + + /* function exit code */ + __pyx_r = Py_None; __Pyx_INCREF(Py_None); + goto __pyx_L0; + __pyx_L1_error:; + __Pyx_XDECREF(__pyx_t_1); + __Pyx_XDECREF(__pyx_t_7); + __Pyx_XDECREF(__pyx_t_8); + __Pyx_XDECREF(__pyx_t_9); + __Pyx_AddTraceback("aiohttp._http_parser.__pyx_unpickle_RawResponseMessage__set_state", __pyx_clineno, __pyx_lineno, __pyx_filename); + __pyx_r = 0; + __pyx_L0:; + __Pyx_XGIVEREF(__pyx_r); + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +static struct __pyx_obj_7aiohttp_12_http_parser_RawRequestMessage *__pyx_freelist_7aiohttp_12_http_parser_RawRequestMessage[250]; +static int __pyx_freecount_7aiohttp_12_http_parser_RawRequestMessage = 0; + +static PyObject *__pyx_tp_new_7aiohttp_12_http_parser_RawRequestMessage(PyTypeObject *t, CYTHON_UNUSED PyObject *a, CYTHON_UNUSED PyObject *k) { + struct __pyx_obj_7aiohttp_12_http_parser_RawRequestMessage *p; + PyObject *o; + if (CYTHON_COMPILING_IN_CPYTHON && likely((__pyx_freecount_7aiohttp_12_http_parser_RawRequestMessage > 0) & (t->tp_basicsize == sizeof(struct __pyx_obj_7aiohttp_12_http_parser_RawRequestMessage)) & ((t->tp_flags & (Py_TPFLAGS_IS_ABSTRACT | Py_TPFLAGS_HEAPTYPE)) == 0))) { + o = (PyObject*)__pyx_freelist_7aiohttp_12_http_parser_RawRequestMessage[--__pyx_freecount_7aiohttp_12_http_parser_RawRequestMessage]; + memset(o, 0, sizeof(struct __pyx_obj_7aiohttp_12_http_parser_RawRequestMessage)); + (void) PyObject_INIT(o, t); + PyObject_GC_Track(o); + } else { + if (likely((t->tp_flags & Py_TPFLAGS_IS_ABSTRACT) == 0)) { + o = (*t->tp_alloc)(t, 0); + } else { + o = (PyObject *) PyBaseObject_Type.tp_new(t, __pyx_empty_tuple, 0); + } + if (unlikely(!o)) return 0; + } + p = ((struct __pyx_obj_7aiohttp_12_http_parser_RawRequestMessage *)o); + p->method = ((PyObject*)Py_None); Py_INCREF(Py_None); + p->path = ((PyObject*)Py_None); Py_INCREF(Py_None); + p->version = Py_None; Py_INCREF(Py_None); + p->headers = Py_None; Py_INCREF(Py_None); + p->raw_headers = Py_None; Py_INCREF(Py_None); + p->should_close = Py_None; Py_INCREF(Py_None); + p->compression = Py_None; Py_INCREF(Py_None); + p->upgrade = Py_None; Py_INCREF(Py_None); + p->chunked = Py_None; Py_INCREF(Py_None); + p->url = Py_None; Py_INCREF(Py_None); + return o; +} + +static void __pyx_tp_dealloc_7aiohttp_12_http_parser_RawRequestMessage(PyObject *o) { + struct __pyx_obj_7aiohttp_12_http_parser_RawRequestMessage *p = (struct __pyx_obj_7aiohttp_12_http_parser_RawRequestMessage *)o; + #if CYTHON_USE_TP_FINALIZE + if (unlikely(PyType_HasFeature(Py_TYPE(o), Py_TPFLAGS_HAVE_FINALIZE) && Py_TYPE(o)->tp_finalize) && !_PyGC_FINALIZED(o)) { + if (PyObject_CallFinalizerFromDealloc(o)) return; + } + #endif + PyObject_GC_UnTrack(o); + Py_CLEAR(p->method); + Py_CLEAR(p->path); + Py_CLEAR(p->version); + Py_CLEAR(p->headers); + Py_CLEAR(p->raw_headers); + Py_CLEAR(p->should_close); + Py_CLEAR(p->compression); + Py_CLEAR(p->upgrade); + Py_CLEAR(p->chunked); + Py_CLEAR(p->url); + if (CYTHON_COMPILING_IN_CPYTHON && ((__pyx_freecount_7aiohttp_12_http_parser_RawRequestMessage < 250) & (Py_TYPE(o)->tp_basicsize == sizeof(struct __pyx_obj_7aiohttp_12_http_parser_RawRequestMessage)) & ((Py_TYPE(o)->tp_flags & (Py_TPFLAGS_IS_ABSTRACT | Py_TPFLAGS_HEAPTYPE)) == 0))) { + __pyx_freelist_7aiohttp_12_http_parser_RawRequestMessage[__pyx_freecount_7aiohttp_12_http_parser_RawRequestMessage++] = ((struct __pyx_obj_7aiohttp_12_http_parser_RawRequestMessage *)o); + } else { + (*Py_TYPE(o)->tp_free)(o); + } +} + +static int __pyx_tp_traverse_7aiohttp_12_http_parser_RawRequestMessage(PyObject *o, visitproc v, void *a) { + int e; + struct __pyx_obj_7aiohttp_12_http_parser_RawRequestMessage *p = (struct __pyx_obj_7aiohttp_12_http_parser_RawRequestMessage *)o; + if (p->version) { + e = (*v)(p->version, a); if (e) return e; + } + if (p->headers) { + e = (*v)(p->headers, a); if (e) return e; + } + if (p->raw_headers) { + e = (*v)(p->raw_headers, a); if (e) return e; + } + if (p->should_close) { + e = (*v)(p->should_close, a); if (e) return e; + } + if (p->compression) { + e = (*v)(p->compression, a); if (e) return e; + } + if (p->upgrade) { + e = (*v)(p->upgrade, a); if (e) return e; + } + if (p->chunked) { + e = (*v)(p->chunked, a); if (e) return e; + } + if (p->url) { + e = (*v)(p->url, a); if (e) return e; + } + return 0; +} + +static int __pyx_tp_clear_7aiohttp_12_http_parser_RawRequestMessage(PyObject *o) { + PyObject* tmp; + struct __pyx_obj_7aiohttp_12_http_parser_RawRequestMessage *p = (struct __pyx_obj_7aiohttp_12_http_parser_RawRequestMessage *)o; + tmp = ((PyObject*)p->version); + p->version = Py_None; Py_INCREF(Py_None); + Py_XDECREF(tmp); + tmp = ((PyObject*)p->headers); + p->headers = Py_None; Py_INCREF(Py_None); + Py_XDECREF(tmp); + tmp = ((PyObject*)p->raw_headers); + p->raw_headers = Py_None; Py_INCREF(Py_None); + Py_XDECREF(tmp); + tmp = ((PyObject*)p->should_close); + p->should_close = Py_None; Py_INCREF(Py_None); + Py_XDECREF(tmp); + tmp = ((PyObject*)p->compression); + p->compression = Py_None; Py_INCREF(Py_None); + Py_XDECREF(tmp); + tmp = ((PyObject*)p->upgrade); + p->upgrade = Py_None; Py_INCREF(Py_None); + Py_XDECREF(tmp); + tmp = ((PyObject*)p->chunked); + p->chunked = Py_None; Py_INCREF(Py_None); + Py_XDECREF(tmp); + tmp = ((PyObject*)p->url); + p->url = Py_None; Py_INCREF(Py_None); + Py_XDECREF(tmp); + return 0; +} + +static PyObject *__pyx_getprop_7aiohttp_12_http_parser_17RawRequestMessage_method(PyObject *o, CYTHON_UNUSED void *x) { + return __pyx_pw_7aiohttp_12_http_parser_17RawRequestMessage_6method_1__get__(o); +} + +static PyObject *__pyx_getprop_7aiohttp_12_http_parser_17RawRequestMessage_path(PyObject *o, CYTHON_UNUSED void *x) { + return __pyx_pw_7aiohttp_12_http_parser_17RawRequestMessage_4path_1__get__(o); +} + +static PyObject *__pyx_getprop_7aiohttp_12_http_parser_17RawRequestMessage_version(PyObject *o, CYTHON_UNUSED void *x) { + return __pyx_pw_7aiohttp_12_http_parser_17RawRequestMessage_7version_1__get__(o); +} + +static PyObject *__pyx_getprop_7aiohttp_12_http_parser_17RawRequestMessage_headers(PyObject *o, CYTHON_UNUSED void *x) { + return __pyx_pw_7aiohttp_12_http_parser_17RawRequestMessage_7headers_1__get__(o); +} + +static PyObject *__pyx_getprop_7aiohttp_12_http_parser_17RawRequestMessage_raw_headers(PyObject *o, CYTHON_UNUSED void *x) { + return __pyx_pw_7aiohttp_12_http_parser_17RawRequestMessage_11raw_headers_1__get__(o); +} + +static PyObject *__pyx_getprop_7aiohttp_12_http_parser_17RawRequestMessage_should_close(PyObject *o, CYTHON_UNUSED void *x) { + return __pyx_pw_7aiohttp_12_http_parser_17RawRequestMessage_12should_close_1__get__(o); +} + +static PyObject *__pyx_getprop_7aiohttp_12_http_parser_17RawRequestMessage_compression(PyObject *o, CYTHON_UNUSED void *x) { + return __pyx_pw_7aiohttp_12_http_parser_17RawRequestMessage_11compression_1__get__(o); +} + +static PyObject *__pyx_getprop_7aiohttp_12_http_parser_17RawRequestMessage_upgrade(PyObject *o, CYTHON_UNUSED void *x) { + return __pyx_pw_7aiohttp_12_http_parser_17RawRequestMessage_7upgrade_1__get__(o); +} + +static PyObject *__pyx_getprop_7aiohttp_12_http_parser_17RawRequestMessage_chunked(PyObject *o, CYTHON_UNUSED void *x) { + return __pyx_pw_7aiohttp_12_http_parser_17RawRequestMessage_7chunked_1__get__(o); +} + +static PyObject *__pyx_getprop_7aiohttp_12_http_parser_17RawRequestMessage_url(PyObject *o, CYTHON_UNUSED void *x) { + return __pyx_pw_7aiohttp_12_http_parser_17RawRequestMessage_3url_1__get__(o); +} + +static PyMethodDef __pyx_methods_7aiohttp_12_http_parser_RawRequestMessage[] = { + {"_replace", (PyCFunction)(void*)(PyCFunctionWithKeywords)__pyx_pw_7aiohttp_12_http_parser_17RawRequestMessage_5_replace, METH_VARARGS|METH_KEYWORDS, 0}, + {"__reduce_cython__", (PyCFunction)__pyx_pw_7aiohttp_12_http_parser_17RawRequestMessage_7__reduce_cython__, METH_NOARGS, 0}, + {"__setstate_cython__", (PyCFunction)__pyx_pw_7aiohttp_12_http_parser_17RawRequestMessage_9__setstate_cython__, METH_O, 0}, + {0, 0, 0, 0} +}; + +static struct PyGetSetDef __pyx_getsets_7aiohttp_12_http_parser_RawRequestMessage[] = { + {(char *)"method", __pyx_getprop_7aiohttp_12_http_parser_17RawRequestMessage_method, 0, (char *)0, 0}, + {(char *)"path", __pyx_getprop_7aiohttp_12_http_parser_17RawRequestMessage_path, 0, (char *)0, 0}, + {(char *)"version", __pyx_getprop_7aiohttp_12_http_parser_17RawRequestMessage_version, 0, (char *)0, 0}, + {(char *)"headers", __pyx_getprop_7aiohttp_12_http_parser_17RawRequestMessage_headers, 0, (char *)0, 0}, + {(char *)"raw_headers", __pyx_getprop_7aiohttp_12_http_parser_17RawRequestMessage_raw_headers, 0, (char *)0, 0}, + {(char *)"should_close", __pyx_getprop_7aiohttp_12_http_parser_17RawRequestMessage_should_close, 0, (char *)0, 0}, + {(char *)"compression", __pyx_getprop_7aiohttp_12_http_parser_17RawRequestMessage_compression, 0, (char *)0, 0}, + {(char *)"upgrade", __pyx_getprop_7aiohttp_12_http_parser_17RawRequestMessage_upgrade, 0, (char *)0, 0}, + {(char *)"chunked", __pyx_getprop_7aiohttp_12_http_parser_17RawRequestMessage_chunked, 0, (char *)0, 0}, + {(char *)"url", __pyx_getprop_7aiohttp_12_http_parser_17RawRequestMessage_url, 0, (char *)0, 0}, + {0, 0, 0, 0, 0} +}; + +static PyTypeObject __pyx_type_7aiohttp_12_http_parser_RawRequestMessage = { + PyVarObject_HEAD_INIT(0, 0) + "aiohttp._http_parser.RawRequestMessage", /*tp_name*/ + sizeof(struct __pyx_obj_7aiohttp_12_http_parser_RawRequestMessage), /*tp_basicsize*/ + 0, /*tp_itemsize*/ + __pyx_tp_dealloc_7aiohttp_12_http_parser_RawRequestMessage, /*tp_dealloc*/ + #if PY_VERSION_HEX < 0x030800b4 + 0, /*tp_print*/ + #endif + #if PY_VERSION_HEX >= 0x030800b4 + 0, /*tp_vectorcall_offset*/ + #endif + 0, /*tp_getattr*/ + 0, /*tp_setattr*/ + #if PY_MAJOR_VERSION < 3 + 0, /*tp_compare*/ + #endif + #if PY_MAJOR_VERSION >= 3 + 0, /*tp_as_async*/ + #endif + __pyx_pw_7aiohttp_12_http_parser_17RawRequestMessage_3__repr__, /*tp_repr*/ + 0, /*tp_as_number*/ + 0, /*tp_as_sequence*/ + 0, /*tp_as_mapping*/ + 0, /*tp_hash*/ + 0, /*tp_call*/ + 0, /*tp_str*/ + 0, /*tp_getattro*/ + 0, /*tp_setattro*/ + 0, /*tp_as_buffer*/ + Py_TPFLAGS_DEFAULT|Py_TPFLAGS_HAVE_VERSION_TAG|Py_TPFLAGS_CHECKTYPES|Py_TPFLAGS_HAVE_NEWBUFFER|Py_TPFLAGS_BASETYPE|Py_TPFLAGS_HAVE_GC, /*tp_flags*/ + 0, /*tp_doc*/ + __pyx_tp_traverse_7aiohttp_12_http_parser_RawRequestMessage, /*tp_traverse*/ + __pyx_tp_clear_7aiohttp_12_http_parser_RawRequestMessage, /*tp_clear*/ + 0, /*tp_richcompare*/ + 0, /*tp_weaklistoffset*/ + 0, /*tp_iter*/ + 0, /*tp_iternext*/ + __pyx_methods_7aiohttp_12_http_parser_RawRequestMessage, /*tp_methods*/ + 0, /*tp_members*/ + __pyx_getsets_7aiohttp_12_http_parser_RawRequestMessage, /*tp_getset*/ + 0, /*tp_base*/ + 0, /*tp_dict*/ + 0, /*tp_descr_get*/ + 0, /*tp_descr_set*/ + 0, /*tp_dictoffset*/ + __pyx_pw_7aiohttp_12_http_parser_17RawRequestMessage_1__init__, /*tp_init*/ + 0, /*tp_alloc*/ + __pyx_tp_new_7aiohttp_12_http_parser_RawRequestMessage, /*tp_new*/ + 0, /*tp_free*/ + 0, /*tp_is_gc*/ + 0, /*tp_bases*/ + 0, /*tp_mro*/ + 0, /*tp_cache*/ + 0, /*tp_subclasses*/ + 0, /*tp_weaklist*/ + 0, /*tp_del*/ + 0, /*tp_version_tag*/ + #if PY_VERSION_HEX >= 0x030400a1 + 0, /*tp_finalize*/ + #endif + #if PY_VERSION_HEX >= 0x030800b1 + 0, /*tp_vectorcall*/ + #endif + #if PY_VERSION_HEX >= 0x030800b4 && PY_VERSION_HEX < 0x03090000 + 0, /*tp_print*/ + #endif +}; + +static struct __pyx_obj_7aiohttp_12_http_parser_RawResponseMessage *__pyx_freelist_7aiohttp_12_http_parser_RawResponseMessage[250]; +static int __pyx_freecount_7aiohttp_12_http_parser_RawResponseMessage = 0; + +static PyObject *__pyx_tp_new_7aiohttp_12_http_parser_RawResponseMessage(PyTypeObject *t, CYTHON_UNUSED PyObject *a, CYTHON_UNUSED PyObject *k) { + struct __pyx_obj_7aiohttp_12_http_parser_RawResponseMessage *p; + PyObject *o; + if (CYTHON_COMPILING_IN_CPYTHON && likely((__pyx_freecount_7aiohttp_12_http_parser_RawResponseMessage > 0) & (t->tp_basicsize == sizeof(struct __pyx_obj_7aiohttp_12_http_parser_RawResponseMessage)) & ((t->tp_flags & (Py_TPFLAGS_IS_ABSTRACT | Py_TPFLAGS_HEAPTYPE)) == 0))) { + o = (PyObject*)__pyx_freelist_7aiohttp_12_http_parser_RawResponseMessage[--__pyx_freecount_7aiohttp_12_http_parser_RawResponseMessage]; + memset(o, 0, sizeof(struct __pyx_obj_7aiohttp_12_http_parser_RawResponseMessage)); + (void) PyObject_INIT(o, t); + PyObject_GC_Track(o); + } else { + if (likely((t->tp_flags & Py_TPFLAGS_IS_ABSTRACT) == 0)) { + o = (*t->tp_alloc)(t, 0); + } else { + o = (PyObject *) PyBaseObject_Type.tp_new(t, __pyx_empty_tuple, 0); + } + if (unlikely(!o)) return 0; + } + p = ((struct __pyx_obj_7aiohttp_12_http_parser_RawResponseMessage *)o); + p->version = Py_None; Py_INCREF(Py_None); + p->reason = ((PyObject*)Py_None); Py_INCREF(Py_None); + p->headers = Py_None; Py_INCREF(Py_None); + p->raw_headers = Py_None; Py_INCREF(Py_None); + p->should_close = Py_None; Py_INCREF(Py_None); + p->compression = Py_None; Py_INCREF(Py_None); + p->upgrade = Py_None; Py_INCREF(Py_None); + p->chunked = Py_None; Py_INCREF(Py_None); + return o; +} + +static void __pyx_tp_dealloc_7aiohttp_12_http_parser_RawResponseMessage(PyObject *o) { + struct __pyx_obj_7aiohttp_12_http_parser_RawResponseMessage *p = (struct __pyx_obj_7aiohttp_12_http_parser_RawResponseMessage *)o; + #if CYTHON_USE_TP_FINALIZE + if (unlikely(PyType_HasFeature(Py_TYPE(o), Py_TPFLAGS_HAVE_FINALIZE) && Py_TYPE(o)->tp_finalize) && !_PyGC_FINALIZED(o)) { + if (PyObject_CallFinalizerFromDealloc(o)) return; + } + #endif + PyObject_GC_UnTrack(o); + Py_CLEAR(p->version); + Py_CLEAR(p->reason); + Py_CLEAR(p->headers); + Py_CLEAR(p->raw_headers); + Py_CLEAR(p->should_close); + Py_CLEAR(p->compression); + Py_CLEAR(p->upgrade); + Py_CLEAR(p->chunked); + if (CYTHON_COMPILING_IN_CPYTHON && ((__pyx_freecount_7aiohttp_12_http_parser_RawResponseMessage < 250) & (Py_TYPE(o)->tp_basicsize == sizeof(struct __pyx_obj_7aiohttp_12_http_parser_RawResponseMessage)) & ((Py_TYPE(o)->tp_flags & (Py_TPFLAGS_IS_ABSTRACT | Py_TPFLAGS_HEAPTYPE)) == 0))) { + __pyx_freelist_7aiohttp_12_http_parser_RawResponseMessage[__pyx_freecount_7aiohttp_12_http_parser_RawResponseMessage++] = ((struct __pyx_obj_7aiohttp_12_http_parser_RawResponseMessage *)o); + } else { + (*Py_TYPE(o)->tp_free)(o); + } +} + +static int __pyx_tp_traverse_7aiohttp_12_http_parser_RawResponseMessage(PyObject *o, visitproc v, void *a) { + int e; + struct __pyx_obj_7aiohttp_12_http_parser_RawResponseMessage *p = (struct __pyx_obj_7aiohttp_12_http_parser_RawResponseMessage *)o; + if (p->version) { + e = (*v)(p->version, a); if (e) return e; + } + if (p->headers) { + e = (*v)(p->headers, a); if (e) return e; + } + if (p->raw_headers) { + e = (*v)(p->raw_headers, a); if (e) return e; + } + if (p->should_close) { + e = (*v)(p->should_close, a); if (e) return e; + } + if (p->compression) { + e = (*v)(p->compression, a); if (e) return e; + } + if (p->upgrade) { + e = (*v)(p->upgrade, a); if (e) return e; + } + if (p->chunked) { + e = (*v)(p->chunked, a); if (e) return e; + } + return 0; +} + +static int __pyx_tp_clear_7aiohttp_12_http_parser_RawResponseMessage(PyObject *o) { + PyObject* tmp; + struct __pyx_obj_7aiohttp_12_http_parser_RawResponseMessage *p = (struct __pyx_obj_7aiohttp_12_http_parser_RawResponseMessage *)o; + tmp = ((PyObject*)p->version); + p->version = Py_None; Py_INCREF(Py_None); + Py_XDECREF(tmp); + tmp = ((PyObject*)p->headers); + p->headers = Py_None; Py_INCREF(Py_None); + Py_XDECREF(tmp); + tmp = ((PyObject*)p->raw_headers); + p->raw_headers = Py_None; Py_INCREF(Py_None); + Py_XDECREF(tmp); + tmp = ((PyObject*)p->should_close); + p->should_close = Py_None; Py_INCREF(Py_None); + Py_XDECREF(tmp); + tmp = ((PyObject*)p->compression); + p->compression = Py_None; Py_INCREF(Py_None); + Py_XDECREF(tmp); + tmp = ((PyObject*)p->upgrade); + p->upgrade = Py_None; Py_INCREF(Py_None); + Py_XDECREF(tmp); + tmp = ((PyObject*)p->chunked); + p->chunked = Py_None; Py_INCREF(Py_None); + Py_XDECREF(tmp); + return 0; +} + +static PyObject *__pyx_getprop_7aiohttp_12_http_parser_18RawResponseMessage_version(PyObject *o, CYTHON_UNUSED void *x) { + return __pyx_pw_7aiohttp_12_http_parser_18RawResponseMessage_7version_1__get__(o); +} + +static PyObject *__pyx_getprop_7aiohttp_12_http_parser_18RawResponseMessage_code(PyObject *o, CYTHON_UNUSED void *x) { + return __pyx_pw_7aiohttp_12_http_parser_18RawResponseMessage_4code_1__get__(o); +} + +static PyObject *__pyx_getprop_7aiohttp_12_http_parser_18RawResponseMessage_reason(PyObject *o, CYTHON_UNUSED void *x) { + return __pyx_pw_7aiohttp_12_http_parser_18RawResponseMessage_6reason_1__get__(o); +} + +static PyObject *__pyx_getprop_7aiohttp_12_http_parser_18RawResponseMessage_headers(PyObject *o, CYTHON_UNUSED void *x) { + return __pyx_pw_7aiohttp_12_http_parser_18RawResponseMessage_7headers_1__get__(o); +} + +static PyObject *__pyx_getprop_7aiohttp_12_http_parser_18RawResponseMessage_raw_headers(PyObject *o, CYTHON_UNUSED void *x) { + return __pyx_pw_7aiohttp_12_http_parser_18RawResponseMessage_11raw_headers_1__get__(o); +} + +static PyObject *__pyx_getprop_7aiohttp_12_http_parser_18RawResponseMessage_should_close(PyObject *o, CYTHON_UNUSED void *x) { + return __pyx_pw_7aiohttp_12_http_parser_18RawResponseMessage_12should_close_1__get__(o); +} + +static PyObject *__pyx_getprop_7aiohttp_12_http_parser_18RawResponseMessage_compression(PyObject *o, CYTHON_UNUSED void *x) { + return __pyx_pw_7aiohttp_12_http_parser_18RawResponseMessage_11compression_1__get__(o); +} + +static PyObject *__pyx_getprop_7aiohttp_12_http_parser_18RawResponseMessage_upgrade(PyObject *o, CYTHON_UNUSED void *x) { + return __pyx_pw_7aiohttp_12_http_parser_18RawResponseMessage_7upgrade_1__get__(o); +} + +static PyObject *__pyx_getprop_7aiohttp_12_http_parser_18RawResponseMessage_chunked(PyObject *o, CYTHON_UNUSED void *x) { + return __pyx_pw_7aiohttp_12_http_parser_18RawResponseMessage_7chunked_1__get__(o); +} + +static PyMethodDef __pyx_methods_7aiohttp_12_http_parser_RawResponseMessage[] = { + {"__reduce_cython__", (PyCFunction)__pyx_pw_7aiohttp_12_http_parser_18RawResponseMessage_5__reduce_cython__, METH_NOARGS, 0}, + {"__setstate_cython__", (PyCFunction)__pyx_pw_7aiohttp_12_http_parser_18RawResponseMessage_7__setstate_cython__, METH_O, 0}, + {0, 0, 0, 0} +}; + +static struct PyGetSetDef __pyx_getsets_7aiohttp_12_http_parser_RawResponseMessage[] = { + {(char *)"version", __pyx_getprop_7aiohttp_12_http_parser_18RawResponseMessage_version, 0, (char *)0, 0}, + {(char *)"code", __pyx_getprop_7aiohttp_12_http_parser_18RawResponseMessage_code, 0, (char *)0, 0}, + {(char *)"reason", __pyx_getprop_7aiohttp_12_http_parser_18RawResponseMessage_reason, 0, (char *)0, 0}, + {(char *)"headers", __pyx_getprop_7aiohttp_12_http_parser_18RawResponseMessage_headers, 0, (char *)0, 0}, + {(char *)"raw_headers", __pyx_getprop_7aiohttp_12_http_parser_18RawResponseMessage_raw_headers, 0, (char *)0, 0}, + {(char *)"should_close", __pyx_getprop_7aiohttp_12_http_parser_18RawResponseMessage_should_close, 0, (char *)0, 0}, + {(char *)"compression", __pyx_getprop_7aiohttp_12_http_parser_18RawResponseMessage_compression, 0, (char *)0, 0}, + {(char *)"upgrade", __pyx_getprop_7aiohttp_12_http_parser_18RawResponseMessage_upgrade, 0, (char *)0, 0}, + {(char *)"chunked", __pyx_getprop_7aiohttp_12_http_parser_18RawResponseMessage_chunked, 0, (char *)0, 0}, + {0, 0, 0, 0, 0} +}; + +static PyTypeObject __pyx_type_7aiohttp_12_http_parser_RawResponseMessage = { + PyVarObject_HEAD_INIT(0, 0) + "aiohttp._http_parser.RawResponseMessage", /*tp_name*/ + sizeof(struct __pyx_obj_7aiohttp_12_http_parser_RawResponseMessage), /*tp_basicsize*/ + 0, /*tp_itemsize*/ + __pyx_tp_dealloc_7aiohttp_12_http_parser_RawResponseMessage, /*tp_dealloc*/ + #if PY_VERSION_HEX < 0x030800b4 + 0, /*tp_print*/ + #endif + #if PY_VERSION_HEX >= 0x030800b4 + 0, /*tp_vectorcall_offset*/ + #endif + 0, /*tp_getattr*/ + 0, /*tp_setattr*/ + #if PY_MAJOR_VERSION < 3 + 0, /*tp_compare*/ + #endif + #if PY_MAJOR_VERSION >= 3 + 0, /*tp_as_async*/ + #endif + __pyx_pw_7aiohttp_12_http_parser_18RawResponseMessage_3__repr__, /*tp_repr*/ + 0, /*tp_as_number*/ + 0, /*tp_as_sequence*/ + 0, /*tp_as_mapping*/ + 0, /*tp_hash*/ + 0, /*tp_call*/ + 0, /*tp_str*/ + 0, /*tp_getattro*/ + 0, /*tp_setattro*/ + 0, /*tp_as_buffer*/ + Py_TPFLAGS_DEFAULT|Py_TPFLAGS_HAVE_VERSION_TAG|Py_TPFLAGS_CHECKTYPES|Py_TPFLAGS_HAVE_NEWBUFFER|Py_TPFLAGS_BASETYPE|Py_TPFLAGS_HAVE_GC, /*tp_flags*/ + 0, /*tp_doc*/ + __pyx_tp_traverse_7aiohttp_12_http_parser_RawResponseMessage, /*tp_traverse*/ + __pyx_tp_clear_7aiohttp_12_http_parser_RawResponseMessage, /*tp_clear*/ + 0, /*tp_richcompare*/ + 0, /*tp_weaklistoffset*/ + 0, /*tp_iter*/ + 0, /*tp_iternext*/ + __pyx_methods_7aiohttp_12_http_parser_RawResponseMessage, /*tp_methods*/ + 0, /*tp_members*/ + __pyx_getsets_7aiohttp_12_http_parser_RawResponseMessage, /*tp_getset*/ + 0, /*tp_base*/ + 0, /*tp_dict*/ + 0, /*tp_descr_get*/ + 0, /*tp_descr_set*/ + 0, /*tp_dictoffset*/ + __pyx_pw_7aiohttp_12_http_parser_18RawResponseMessage_1__init__, /*tp_init*/ + 0, /*tp_alloc*/ + __pyx_tp_new_7aiohttp_12_http_parser_RawResponseMessage, /*tp_new*/ + 0, /*tp_free*/ + 0, /*tp_is_gc*/ + 0, /*tp_bases*/ + 0, /*tp_mro*/ + 0, /*tp_cache*/ + 0, /*tp_subclasses*/ + 0, /*tp_weaklist*/ + 0, /*tp_del*/ + 0, /*tp_version_tag*/ + #if PY_VERSION_HEX >= 0x030400a1 + 0, /*tp_finalize*/ + #endif + #if PY_VERSION_HEX >= 0x030800b1 + 0, /*tp_vectorcall*/ + #endif + #if PY_VERSION_HEX >= 0x030800b4 && PY_VERSION_HEX < 0x03090000 + 0, /*tp_print*/ + #endif +}; +static struct __pyx_vtabstruct_7aiohttp_12_http_parser_HttpParser __pyx_vtable_7aiohttp_12_http_parser_HttpParser; + +static PyObject *__pyx_tp_new_7aiohttp_12_http_parser_HttpParser(PyTypeObject *t, CYTHON_UNUSED PyObject *a, CYTHON_UNUSED PyObject *k) { + struct __pyx_obj_7aiohttp_12_http_parser_HttpParser *p; + PyObject *o; + if (likely((t->tp_flags & Py_TPFLAGS_IS_ABSTRACT) == 0)) { + o = (*t->tp_alloc)(t, 0); + } else { + o = (PyObject *) PyBaseObject_Type.tp_new(t, __pyx_empty_tuple, 0); + } + if (unlikely(!o)) return 0; + p = ((struct __pyx_obj_7aiohttp_12_http_parser_HttpParser *)o); + p->__pyx_vtab = __pyx_vtabptr_7aiohttp_12_http_parser_HttpParser; + p->_raw_name = ((PyObject*)Py_None); Py_INCREF(Py_None); + p->_raw_value = ((PyObject*)Py_None); Py_INCREF(Py_None); + p->_protocol = Py_None; Py_INCREF(Py_None); + p->_loop = Py_None; Py_INCREF(Py_None); + p->_timer = Py_None; Py_INCREF(Py_None); + p->_url = Py_None; Py_INCREF(Py_None); + p->_buf = ((PyObject*)Py_None); Py_INCREF(Py_None); + p->_path = ((PyObject*)Py_None); Py_INCREF(Py_None); + p->_reason = ((PyObject*)Py_None); Py_INCREF(Py_None); + p->_headers = Py_None; Py_INCREF(Py_None); + p->_raw_headers = ((PyObject*)Py_None); Py_INCREF(Py_None); + p->_messages = ((PyObject*)Py_None); Py_INCREF(Py_None); + p->_payload = Py_None; Py_INCREF(Py_None); + p->_payload_exception = Py_None; Py_INCREF(Py_None); + p->_last_error = Py_None; Py_INCREF(Py_None); + p->_content_encoding = ((PyObject*)Py_None); Py_INCREF(Py_None); + p->py_buf.obj = NULL; + if (unlikely(__pyx_pw_7aiohttp_12_http_parser_10HttpParser_1__cinit__(o, __pyx_empty_tuple, NULL) < 0)) goto bad; + return o; + bad: + Py_DECREF(o); o = 0; + return NULL; +} + +static void __pyx_tp_dealloc_7aiohttp_12_http_parser_HttpParser(PyObject *o) { + struct __pyx_obj_7aiohttp_12_http_parser_HttpParser *p = (struct __pyx_obj_7aiohttp_12_http_parser_HttpParser *)o; + #if CYTHON_USE_TP_FINALIZE + if (unlikely(PyType_HasFeature(Py_TYPE(o), Py_TPFLAGS_HAVE_FINALIZE) && Py_TYPE(o)->tp_finalize) && !_PyGC_FINALIZED(o)) { + if (PyObject_CallFinalizerFromDealloc(o)) return; + } + #endif + PyObject_GC_UnTrack(o); + { + PyObject *etype, *eval, *etb; + PyErr_Fetch(&etype, &eval, &etb); + __Pyx_SET_REFCNT(o, Py_REFCNT(o) + 1); + __pyx_pw_7aiohttp_12_http_parser_10HttpParser_3__dealloc__(o); + __Pyx_SET_REFCNT(o, Py_REFCNT(o) - 1); + PyErr_Restore(etype, eval, etb); + } + Py_CLEAR(p->_raw_name); + Py_CLEAR(p->_raw_value); + Py_CLEAR(p->_protocol); + Py_CLEAR(p->_loop); + Py_CLEAR(p->_timer); + Py_CLEAR(p->_url); + Py_CLEAR(p->_buf); + Py_CLEAR(p->_path); + Py_CLEAR(p->_reason); + Py_CLEAR(p->_headers); + Py_CLEAR(p->_raw_headers); + Py_CLEAR(p->_messages); + Py_CLEAR(p->_payload); + Py_CLEAR(p->_payload_exception); + Py_CLEAR(p->_last_error); + Py_CLEAR(p->_content_encoding); + (*Py_TYPE(o)->tp_free)(o); +} + +static int __pyx_tp_traverse_7aiohttp_12_http_parser_HttpParser(PyObject *o, visitproc v, void *a) { + int e; + struct __pyx_obj_7aiohttp_12_http_parser_HttpParser *p = (struct __pyx_obj_7aiohttp_12_http_parser_HttpParser *)o; + if (p->_protocol) { + e = (*v)(p->_protocol, a); if (e) return e; + } + if (p->_loop) { + e = (*v)(p->_loop, a); if (e) return e; + } + if (p->_timer) { + e = (*v)(p->_timer, a); if (e) return e; + } + if (p->_url) { + e = (*v)(p->_url, a); if (e) return e; + } + if (p->_headers) { + e = (*v)(p->_headers, a); if (e) return e; + } + if (p->_raw_headers) { + e = (*v)(p->_raw_headers, a); if (e) return e; + } + if (p->_messages) { + e = (*v)(p->_messages, a); if (e) return e; + } + if (p->_payload) { + e = (*v)(p->_payload, a); if (e) return e; + } + if (p->_payload_exception) { + e = (*v)(p->_payload_exception, a); if (e) return e; + } + if (p->_last_error) { + e = (*v)(p->_last_error, a); if (e) return e; + } + if (p->py_buf.obj) { + e = (*v)(p->py_buf.obj, a); if (e) return e; + } + return 0; +} + +static int __pyx_tp_clear_7aiohttp_12_http_parser_HttpParser(PyObject *o) { + PyObject* tmp; + struct __pyx_obj_7aiohttp_12_http_parser_HttpParser *p = (struct __pyx_obj_7aiohttp_12_http_parser_HttpParser *)o; + tmp = ((PyObject*)p->_protocol); + p->_protocol = Py_None; Py_INCREF(Py_None); + Py_XDECREF(tmp); + tmp = ((PyObject*)p->_loop); + p->_loop = Py_None; Py_INCREF(Py_None); + Py_XDECREF(tmp); + tmp = ((PyObject*)p->_timer); + p->_timer = Py_None; Py_INCREF(Py_None); + Py_XDECREF(tmp); + tmp = ((PyObject*)p->_url); + p->_url = Py_None; Py_INCREF(Py_None); + Py_XDECREF(tmp); + tmp = ((PyObject*)p->_headers); + p->_headers = Py_None; Py_INCREF(Py_None); + Py_XDECREF(tmp); + tmp = ((PyObject*)p->_raw_headers); + p->_raw_headers = ((PyObject*)Py_None); Py_INCREF(Py_None); + Py_XDECREF(tmp); + tmp = ((PyObject*)p->_messages); + p->_messages = ((PyObject*)Py_None); Py_INCREF(Py_None); + Py_XDECREF(tmp); + tmp = ((PyObject*)p->_payload); + p->_payload = Py_None; Py_INCREF(Py_None); + Py_XDECREF(tmp); + tmp = ((PyObject*)p->_payload_exception); + p->_payload_exception = Py_None; Py_INCREF(Py_None); + Py_XDECREF(tmp); + tmp = ((PyObject*)p->_last_error); + p->_last_error = Py_None; Py_INCREF(Py_None); + Py_XDECREF(tmp); + Py_CLEAR(p->py_buf.obj); + return 0; +} + +static PyMethodDef __pyx_methods_7aiohttp_12_http_parser_HttpParser[] = { + {"feed_eof", (PyCFunction)__pyx_pw_7aiohttp_12_http_parser_10HttpParser_5feed_eof, METH_NOARGS, 0}, + {"feed_data", (PyCFunction)__pyx_pw_7aiohttp_12_http_parser_10HttpParser_7feed_data, METH_O, 0}, + {"set_upgraded", (PyCFunction)__pyx_pw_7aiohttp_12_http_parser_10HttpParser_9set_upgraded, METH_O, 0}, + {"__reduce_cython__", (PyCFunction)__pyx_pw_7aiohttp_12_http_parser_10HttpParser_11__reduce_cython__, METH_NOARGS, 0}, + {"__setstate_cython__", (PyCFunction)__pyx_pw_7aiohttp_12_http_parser_10HttpParser_13__setstate_cython__, METH_O, 0}, + {0, 0, 0, 0} +}; + +static PyTypeObject __pyx_type_7aiohttp_12_http_parser_HttpParser = { + PyVarObject_HEAD_INIT(0, 0) + "aiohttp._http_parser.HttpParser", /*tp_name*/ + sizeof(struct __pyx_obj_7aiohttp_12_http_parser_HttpParser), /*tp_basicsize*/ + 0, /*tp_itemsize*/ + __pyx_tp_dealloc_7aiohttp_12_http_parser_HttpParser, /*tp_dealloc*/ + #if PY_VERSION_HEX < 0x030800b4 + 0, /*tp_print*/ + #endif + #if PY_VERSION_HEX >= 0x030800b4 + 0, /*tp_vectorcall_offset*/ + #endif + 0, /*tp_getattr*/ + 0, /*tp_setattr*/ + #if PY_MAJOR_VERSION < 3 + 0, /*tp_compare*/ + #endif + #if PY_MAJOR_VERSION >= 3 + 0, /*tp_as_async*/ + #endif + 0, /*tp_repr*/ + 0, /*tp_as_number*/ + 0, /*tp_as_sequence*/ + 0, /*tp_as_mapping*/ + 0, /*tp_hash*/ + 0, /*tp_call*/ + 0, /*tp_str*/ + 0, /*tp_getattro*/ + 0, /*tp_setattro*/ + 0, /*tp_as_buffer*/ + Py_TPFLAGS_DEFAULT|Py_TPFLAGS_HAVE_VERSION_TAG|Py_TPFLAGS_CHECKTYPES|Py_TPFLAGS_HAVE_NEWBUFFER|Py_TPFLAGS_BASETYPE|Py_TPFLAGS_HAVE_GC, /*tp_flags*/ + 0, /*tp_doc*/ + __pyx_tp_traverse_7aiohttp_12_http_parser_HttpParser, /*tp_traverse*/ + __pyx_tp_clear_7aiohttp_12_http_parser_HttpParser, /*tp_clear*/ + 0, /*tp_richcompare*/ + 0, /*tp_weaklistoffset*/ + 0, /*tp_iter*/ + 0, /*tp_iternext*/ + __pyx_methods_7aiohttp_12_http_parser_HttpParser, /*tp_methods*/ + 0, /*tp_members*/ + 0, /*tp_getset*/ + 0, /*tp_base*/ + 0, /*tp_dict*/ + 0, /*tp_descr_get*/ + 0, /*tp_descr_set*/ + 0, /*tp_dictoffset*/ + 0, /*tp_init*/ + 0, /*tp_alloc*/ + __pyx_tp_new_7aiohttp_12_http_parser_HttpParser, /*tp_new*/ + 0, /*tp_free*/ + 0, /*tp_is_gc*/ + 0, /*tp_bases*/ + 0, /*tp_mro*/ + 0, /*tp_cache*/ + 0, /*tp_subclasses*/ + 0, /*tp_weaklist*/ + 0, /*tp_del*/ + 0, /*tp_version_tag*/ + #if PY_VERSION_HEX >= 0x030400a1 + 0, /*tp_finalize*/ + #endif + #if PY_VERSION_HEX >= 0x030800b1 + 0, /*tp_vectorcall*/ + #endif + #if PY_VERSION_HEX >= 0x030800b4 && PY_VERSION_HEX < 0x03090000 + 0, /*tp_print*/ + #endif +}; +static struct __pyx_vtabstruct_7aiohttp_12_http_parser_HttpRequestParser __pyx_vtable_7aiohttp_12_http_parser_HttpRequestParser; + +static PyObject *__pyx_tp_new_7aiohttp_12_http_parser_HttpRequestParser(PyTypeObject *t, PyObject *a, PyObject *k) { + struct __pyx_obj_7aiohttp_12_http_parser_HttpRequestParser *p; + PyObject *o = __pyx_tp_new_7aiohttp_12_http_parser_HttpParser(t, a, k); + if (unlikely(!o)) return 0; + p = ((struct __pyx_obj_7aiohttp_12_http_parser_HttpRequestParser *)o); + p->__pyx_base.__pyx_vtab = (struct __pyx_vtabstruct_7aiohttp_12_http_parser_HttpParser*)__pyx_vtabptr_7aiohttp_12_http_parser_HttpRequestParser; + return o; +} + +static PyMethodDef __pyx_methods_7aiohttp_12_http_parser_HttpRequestParser[] = { + {"__reduce_cython__", (PyCFunction)__pyx_pw_7aiohttp_12_http_parser_17HttpRequestParser_3__reduce_cython__, METH_NOARGS, 0}, + {"__setstate_cython__", (PyCFunction)__pyx_pw_7aiohttp_12_http_parser_17HttpRequestParser_5__setstate_cython__, METH_O, 0}, + {0, 0, 0, 0} +}; + +static PyTypeObject __pyx_type_7aiohttp_12_http_parser_HttpRequestParser = { + PyVarObject_HEAD_INIT(0, 0) + "aiohttp._http_parser.HttpRequestParser", /*tp_name*/ + sizeof(struct __pyx_obj_7aiohttp_12_http_parser_HttpRequestParser), /*tp_basicsize*/ + 0, /*tp_itemsize*/ + __pyx_tp_dealloc_7aiohttp_12_http_parser_HttpParser, /*tp_dealloc*/ + #if PY_VERSION_HEX < 0x030800b4 + 0, /*tp_print*/ + #endif + #if PY_VERSION_HEX >= 0x030800b4 + 0, /*tp_vectorcall_offset*/ + #endif + 0, /*tp_getattr*/ + 0, /*tp_setattr*/ + #if PY_MAJOR_VERSION < 3 + 0, /*tp_compare*/ + #endif + #if PY_MAJOR_VERSION >= 3 + 0, /*tp_as_async*/ + #endif + 0, /*tp_repr*/ + 0, /*tp_as_number*/ + 0, /*tp_as_sequence*/ + 0, /*tp_as_mapping*/ + 0, /*tp_hash*/ + 0, /*tp_call*/ + 0, /*tp_str*/ + 0, /*tp_getattro*/ + 0, /*tp_setattro*/ + 0, /*tp_as_buffer*/ + Py_TPFLAGS_DEFAULT|Py_TPFLAGS_HAVE_VERSION_TAG|Py_TPFLAGS_CHECKTYPES|Py_TPFLAGS_HAVE_NEWBUFFER|Py_TPFLAGS_BASETYPE|Py_TPFLAGS_HAVE_GC, /*tp_flags*/ + 0, /*tp_doc*/ + __pyx_tp_traverse_7aiohttp_12_http_parser_HttpParser, /*tp_traverse*/ + __pyx_tp_clear_7aiohttp_12_http_parser_HttpParser, /*tp_clear*/ + 0, /*tp_richcompare*/ + 0, /*tp_weaklistoffset*/ + 0, /*tp_iter*/ + 0, /*tp_iternext*/ + __pyx_methods_7aiohttp_12_http_parser_HttpRequestParser, /*tp_methods*/ + 0, /*tp_members*/ + 0, /*tp_getset*/ + 0, /*tp_base*/ + 0, /*tp_dict*/ + 0, /*tp_descr_get*/ + 0, /*tp_descr_set*/ + 0, /*tp_dictoffset*/ + __pyx_pw_7aiohttp_12_http_parser_17HttpRequestParser_1__init__, /*tp_init*/ + 0, /*tp_alloc*/ + __pyx_tp_new_7aiohttp_12_http_parser_HttpRequestParser, /*tp_new*/ + 0, /*tp_free*/ + 0, /*tp_is_gc*/ + 0, /*tp_bases*/ + 0, /*tp_mro*/ + 0, /*tp_cache*/ + 0, /*tp_subclasses*/ + 0, /*tp_weaklist*/ + 0, /*tp_del*/ + 0, /*tp_version_tag*/ + #if PY_VERSION_HEX >= 0x030400a1 + 0, /*tp_finalize*/ + #endif + #if PY_VERSION_HEX >= 0x030800b1 + 0, /*tp_vectorcall*/ + #endif + #if PY_VERSION_HEX >= 0x030800b4 && PY_VERSION_HEX < 0x03090000 + 0, /*tp_print*/ + #endif +}; +static struct __pyx_vtabstruct_7aiohttp_12_http_parser_HttpResponseParser __pyx_vtable_7aiohttp_12_http_parser_HttpResponseParser; + +static PyObject *__pyx_tp_new_7aiohttp_12_http_parser_HttpResponseParser(PyTypeObject *t, PyObject *a, PyObject *k) { + struct __pyx_obj_7aiohttp_12_http_parser_HttpResponseParser *p; + PyObject *o = __pyx_tp_new_7aiohttp_12_http_parser_HttpParser(t, a, k); + if (unlikely(!o)) return 0; + p = ((struct __pyx_obj_7aiohttp_12_http_parser_HttpResponseParser *)o); + p->__pyx_base.__pyx_vtab = (struct __pyx_vtabstruct_7aiohttp_12_http_parser_HttpParser*)__pyx_vtabptr_7aiohttp_12_http_parser_HttpResponseParser; + return o; +} + +static PyMethodDef __pyx_methods_7aiohttp_12_http_parser_HttpResponseParser[] = { + {"__reduce_cython__", (PyCFunction)__pyx_pw_7aiohttp_12_http_parser_18HttpResponseParser_3__reduce_cython__, METH_NOARGS, 0}, + {"__setstate_cython__", (PyCFunction)__pyx_pw_7aiohttp_12_http_parser_18HttpResponseParser_5__setstate_cython__, METH_O, 0}, + {0, 0, 0, 0} +}; + +static PyTypeObject __pyx_type_7aiohttp_12_http_parser_HttpResponseParser = { + PyVarObject_HEAD_INIT(0, 0) + "aiohttp._http_parser.HttpResponseParser", /*tp_name*/ + sizeof(struct __pyx_obj_7aiohttp_12_http_parser_HttpResponseParser), /*tp_basicsize*/ + 0, /*tp_itemsize*/ + __pyx_tp_dealloc_7aiohttp_12_http_parser_HttpParser, /*tp_dealloc*/ + #if PY_VERSION_HEX < 0x030800b4 + 0, /*tp_print*/ + #endif + #if PY_VERSION_HEX >= 0x030800b4 + 0, /*tp_vectorcall_offset*/ + #endif + 0, /*tp_getattr*/ + 0, /*tp_setattr*/ + #if PY_MAJOR_VERSION < 3 + 0, /*tp_compare*/ + #endif + #if PY_MAJOR_VERSION >= 3 + 0, /*tp_as_async*/ + #endif + 0, /*tp_repr*/ + 0, /*tp_as_number*/ + 0, /*tp_as_sequence*/ + 0, /*tp_as_mapping*/ + 0, /*tp_hash*/ + 0, /*tp_call*/ + 0, /*tp_str*/ + 0, /*tp_getattro*/ + 0, /*tp_setattro*/ + 0, /*tp_as_buffer*/ + Py_TPFLAGS_DEFAULT|Py_TPFLAGS_HAVE_VERSION_TAG|Py_TPFLAGS_CHECKTYPES|Py_TPFLAGS_HAVE_NEWBUFFER|Py_TPFLAGS_BASETYPE|Py_TPFLAGS_HAVE_GC, /*tp_flags*/ + 0, /*tp_doc*/ + __pyx_tp_traverse_7aiohttp_12_http_parser_HttpParser, /*tp_traverse*/ + __pyx_tp_clear_7aiohttp_12_http_parser_HttpParser, /*tp_clear*/ + 0, /*tp_richcompare*/ + 0, /*tp_weaklistoffset*/ + 0, /*tp_iter*/ + 0, /*tp_iternext*/ + __pyx_methods_7aiohttp_12_http_parser_HttpResponseParser, /*tp_methods*/ + 0, /*tp_members*/ + 0, /*tp_getset*/ + 0, /*tp_base*/ + 0, /*tp_dict*/ + 0, /*tp_descr_get*/ + 0, /*tp_descr_set*/ + 0, /*tp_dictoffset*/ + __pyx_pw_7aiohttp_12_http_parser_18HttpResponseParser_1__init__, /*tp_init*/ + 0, /*tp_alloc*/ + __pyx_tp_new_7aiohttp_12_http_parser_HttpResponseParser, /*tp_new*/ + 0, /*tp_free*/ + 0, /*tp_is_gc*/ + 0, /*tp_bases*/ + 0, /*tp_mro*/ + 0, /*tp_cache*/ + 0, /*tp_subclasses*/ + 0, /*tp_weaklist*/ + 0, /*tp_del*/ + 0, /*tp_version_tag*/ + #if PY_VERSION_HEX >= 0x030400a1 + 0, /*tp_finalize*/ + #endif + #if PY_VERSION_HEX >= 0x030800b1 + 0, /*tp_vectorcall*/ + #endif + #if PY_VERSION_HEX >= 0x030800b4 && PY_VERSION_HEX < 0x03090000 + 0, /*tp_print*/ + #endif +}; + +static struct __pyx_obj_7aiohttp_12_http_parser___pyx_scope_struct____repr__ *__pyx_freelist_7aiohttp_12_http_parser___pyx_scope_struct____repr__[8]; +static int __pyx_freecount_7aiohttp_12_http_parser___pyx_scope_struct____repr__ = 0; + +static PyObject *__pyx_tp_new_7aiohttp_12_http_parser___pyx_scope_struct____repr__(PyTypeObject *t, CYTHON_UNUSED PyObject *a, CYTHON_UNUSED PyObject *k) { + PyObject *o; + if (CYTHON_COMPILING_IN_CPYTHON && likely((__pyx_freecount_7aiohttp_12_http_parser___pyx_scope_struct____repr__ > 0) & (t->tp_basicsize == sizeof(struct __pyx_obj_7aiohttp_12_http_parser___pyx_scope_struct____repr__)))) { + o = (PyObject*)__pyx_freelist_7aiohttp_12_http_parser___pyx_scope_struct____repr__[--__pyx_freecount_7aiohttp_12_http_parser___pyx_scope_struct____repr__]; + memset(o, 0, sizeof(struct __pyx_obj_7aiohttp_12_http_parser___pyx_scope_struct____repr__)); + (void) PyObject_INIT(o, t); + PyObject_GC_Track(o); + } else { + o = (*t->tp_alloc)(t, 0); + if (unlikely(!o)) return 0; + } + return o; +} + +static void __pyx_tp_dealloc_7aiohttp_12_http_parser___pyx_scope_struct____repr__(PyObject *o) { + struct __pyx_obj_7aiohttp_12_http_parser___pyx_scope_struct____repr__ *p = (struct __pyx_obj_7aiohttp_12_http_parser___pyx_scope_struct____repr__ *)o; + PyObject_GC_UnTrack(o); + Py_CLEAR(p->__pyx_v_info); + if (CYTHON_COMPILING_IN_CPYTHON && ((__pyx_freecount_7aiohttp_12_http_parser___pyx_scope_struct____repr__ < 8) & (Py_TYPE(o)->tp_basicsize == sizeof(struct __pyx_obj_7aiohttp_12_http_parser___pyx_scope_struct____repr__)))) { + __pyx_freelist_7aiohttp_12_http_parser___pyx_scope_struct____repr__[__pyx_freecount_7aiohttp_12_http_parser___pyx_scope_struct____repr__++] = ((struct __pyx_obj_7aiohttp_12_http_parser___pyx_scope_struct____repr__ *)o); + } else { + (*Py_TYPE(o)->tp_free)(o); + } +} + +static int __pyx_tp_traverse_7aiohttp_12_http_parser___pyx_scope_struct____repr__(PyObject *o, visitproc v, void *a) { + int e; + struct __pyx_obj_7aiohttp_12_http_parser___pyx_scope_struct____repr__ *p = (struct __pyx_obj_7aiohttp_12_http_parser___pyx_scope_struct____repr__ *)o; + if (p->__pyx_v_info) { + e = (*v)(p->__pyx_v_info, a); if (e) return e; + } + return 0; +} + +static int __pyx_tp_clear_7aiohttp_12_http_parser___pyx_scope_struct____repr__(PyObject *o) { + PyObject* tmp; + struct __pyx_obj_7aiohttp_12_http_parser___pyx_scope_struct____repr__ *p = (struct __pyx_obj_7aiohttp_12_http_parser___pyx_scope_struct____repr__ *)o; + tmp = ((PyObject*)p->__pyx_v_info); + p->__pyx_v_info = ((PyObject*)Py_None); Py_INCREF(Py_None); + Py_XDECREF(tmp); + return 0; +} + +static PyTypeObject __pyx_type_7aiohttp_12_http_parser___pyx_scope_struct____repr__ = { + PyVarObject_HEAD_INIT(0, 0) + "aiohttp._http_parser.__pyx_scope_struct____repr__", /*tp_name*/ + sizeof(struct __pyx_obj_7aiohttp_12_http_parser___pyx_scope_struct____repr__), /*tp_basicsize*/ + 0, /*tp_itemsize*/ + __pyx_tp_dealloc_7aiohttp_12_http_parser___pyx_scope_struct____repr__, /*tp_dealloc*/ + #if PY_VERSION_HEX < 0x030800b4 + 0, /*tp_print*/ + #endif + #if PY_VERSION_HEX >= 0x030800b4 + 0, /*tp_vectorcall_offset*/ + #endif + 0, /*tp_getattr*/ + 0, /*tp_setattr*/ + #if PY_MAJOR_VERSION < 3 + 0, /*tp_compare*/ + #endif + #if PY_MAJOR_VERSION >= 3 + 0, /*tp_as_async*/ + #endif + 0, /*tp_repr*/ + 0, /*tp_as_number*/ + 0, /*tp_as_sequence*/ + 0, /*tp_as_mapping*/ + 0, /*tp_hash*/ + 0, /*tp_call*/ + 0, /*tp_str*/ + 0, /*tp_getattro*/ + 0, /*tp_setattro*/ + 0, /*tp_as_buffer*/ + Py_TPFLAGS_DEFAULT|Py_TPFLAGS_HAVE_VERSION_TAG|Py_TPFLAGS_CHECKTYPES|Py_TPFLAGS_HAVE_NEWBUFFER|Py_TPFLAGS_HAVE_GC, /*tp_flags*/ + 0, /*tp_doc*/ + __pyx_tp_traverse_7aiohttp_12_http_parser___pyx_scope_struct____repr__, /*tp_traverse*/ + __pyx_tp_clear_7aiohttp_12_http_parser___pyx_scope_struct____repr__, /*tp_clear*/ + 0, /*tp_richcompare*/ + 0, /*tp_weaklistoffset*/ + 0, /*tp_iter*/ + 0, /*tp_iternext*/ + 0, /*tp_methods*/ + 0, /*tp_members*/ + 0, /*tp_getset*/ + 0, /*tp_base*/ + 0, /*tp_dict*/ + 0, /*tp_descr_get*/ + 0, /*tp_descr_set*/ + 0, /*tp_dictoffset*/ + 0, /*tp_init*/ + 0, /*tp_alloc*/ + __pyx_tp_new_7aiohttp_12_http_parser___pyx_scope_struct____repr__, /*tp_new*/ + 0, /*tp_free*/ + 0, /*tp_is_gc*/ + 0, /*tp_bases*/ + 0, /*tp_mro*/ + 0, /*tp_cache*/ + 0, /*tp_subclasses*/ + 0, /*tp_weaklist*/ + 0, /*tp_del*/ + 0, /*tp_version_tag*/ + #if PY_VERSION_HEX >= 0x030400a1 + 0, /*tp_finalize*/ + #endif + #if PY_VERSION_HEX >= 0x030800b1 + 0, /*tp_vectorcall*/ + #endif + #if PY_VERSION_HEX >= 0x030800b4 && PY_VERSION_HEX < 0x03090000 + 0, /*tp_print*/ + #endif +}; + +static struct __pyx_obj_7aiohttp_12_http_parser___pyx_scope_struct_1_genexpr *__pyx_freelist_7aiohttp_12_http_parser___pyx_scope_struct_1_genexpr[8]; +static int __pyx_freecount_7aiohttp_12_http_parser___pyx_scope_struct_1_genexpr = 0; + +static PyObject *__pyx_tp_new_7aiohttp_12_http_parser___pyx_scope_struct_1_genexpr(PyTypeObject *t, CYTHON_UNUSED PyObject *a, CYTHON_UNUSED PyObject *k) { + PyObject *o; + if (CYTHON_COMPILING_IN_CPYTHON && likely((__pyx_freecount_7aiohttp_12_http_parser___pyx_scope_struct_1_genexpr > 0) & (t->tp_basicsize == sizeof(struct __pyx_obj_7aiohttp_12_http_parser___pyx_scope_struct_1_genexpr)))) { + o = (PyObject*)__pyx_freelist_7aiohttp_12_http_parser___pyx_scope_struct_1_genexpr[--__pyx_freecount_7aiohttp_12_http_parser___pyx_scope_struct_1_genexpr]; + memset(o, 0, sizeof(struct __pyx_obj_7aiohttp_12_http_parser___pyx_scope_struct_1_genexpr)); + (void) PyObject_INIT(o, t); + PyObject_GC_Track(o); + } else { + o = (*t->tp_alloc)(t, 0); + if (unlikely(!o)) return 0; + } + return o; +} + +static void __pyx_tp_dealloc_7aiohttp_12_http_parser___pyx_scope_struct_1_genexpr(PyObject *o) { + struct __pyx_obj_7aiohttp_12_http_parser___pyx_scope_struct_1_genexpr *p = (struct __pyx_obj_7aiohttp_12_http_parser___pyx_scope_struct_1_genexpr *)o; + PyObject_GC_UnTrack(o); + Py_CLEAR(p->__pyx_outer_scope); + Py_CLEAR(p->__pyx_v_name); + Py_CLEAR(p->__pyx_v_val); + if (CYTHON_COMPILING_IN_CPYTHON && ((__pyx_freecount_7aiohttp_12_http_parser___pyx_scope_struct_1_genexpr < 8) & (Py_TYPE(o)->tp_basicsize == sizeof(struct __pyx_obj_7aiohttp_12_http_parser___pyx_scope_struct_1_genexpr)))) { + __pyx_freelist_7aiohttp_12_http_parser___pyx_scope_struct_1_genexpr[__pyx_freecount_7aiohttp_12_http_parser___pyx_scope_struct_1_genexpr++] = ((struct __pyx_obj_7aiohttp_12_http_parser___pyx_scope_struct_1_genexpr *)o); + } else { + (*Py_TYPE(o)->tp_free)(o); + } +} + +static int __pyx_tp_traverse_7aiohttp_12_http_parser___pyx_scope_struct_1_genexpr(PyObject *o, visitproc v, void *a) { + int e; + struct __pyx_obj_7aiohttp_12_http_parser___pyx_scope_struct_1_genexpr *p = (struct __pyx_obj_7aiohttp_12_http_parser___pyx_scope_struct_1_genexpr *)o; + if (p->__pyx_outer_scope) { + e = (*v)(((PyObject *)p->__pyx_outer_scope), a); if (e) return e; + } + if (p->__pyx_v_name) { + e = (*v)(p->__pyx_v_name, a); if (e) return e; + } + if (p->__pyx_v_val) { + e = (*v)(p->__pyx_v_val, a); if (e) return e; + } + return 0; +} + +static PyTypeObject __pyx_type_7aiohttp_12_http_parser___pyx_scope_struct_1_genexpr = { + PyVarObject_HEAD_INIT(0, 0) + "aiohttp._http_parser.__pyx_scope_struct_1_genexpr", /*tp_name*/ + sizeof(struct __pyx_obj_7aiohttp_12_http_parser___pyx_scope_struct_1_genexpr), /*tp_basicsize*/ + 0, /*tp_itemsize*/ + __pyx_tp_dealloc_7aiohttp_12_http_parser___pyx_scope_struct_1_genexpr, /*tp_dealloc*/ + #if PY_VERSION_HEX < 0x030800b4 + 0, /*tp_print*/ + #endif + #if PY_VERSION_HEX >= 0x030800b4 + 0, /*tp_vectorcall_offset*/ + #endif + 0, /*tp_getattr*/ + 0, /*tp_setattr*/ + #if PY_MAJOR_VERSION < 3 + 0, /*tp_compare*/ + #endif + #if PY_MAJOR_VERSION >= 3 + 0, /*tp_as_async*/ + #endif + 0, /*tp_repr*/ + 0, /*tp_as_number*/ + 0, /*tp_as_sequence*/ + 0, /*tp_as_mapping*/ + 0, /*tp_hash*/ + 0, /*tp_call*/ + 0, /*tp_str*/ + 0, /*tp_getattro*/ + 0, /*tp_setattro*/ + 0, /*tp_as_buffer*/ + Py_TPFLAGS_DEFAULT|Py_TPFLAGS_HAVE_VERSION_TAG|Py_TPFLAGS_CHECKTYPES|Py_TPFLAGS_HAVE_NEWBUFFER|Py_TPFLAGS_HAVE_GC, /*tp_flags*/ + 0, /*tp_doc*/ + __pyx_tp_traverse_7aiohttp_12_http_parser___pyx_scope_struct_1_genexpr, /*tp_traverse*/ + 0, /*tp_clear*/ + 0, /*tp_richcompare*/ + 0, /*tp_weaklistoffset*/ + 0, /*tp_iter*/ + 0, /*tp_iternext*/ + 0, /*tp_methods*/ + 0, /*tp_members*/ + 0, /*tp_getset*/ + 0, /*tp_base*/ + 0, /*tp_dict*/ + 0, /*tp_descr_get*/ + 0, /*tp_descr_set*/ + 0, /*tp_dictoffset*/ + 0, /*tp_init*/ + 0, /*tp_alloc*/ + __pyx_tp_new_7aiohttp_12_http_parser___pyx_scope_struct_1_genexpr, /*tp_new*/ + 0, /*tp_free*/ + 0, /*tp_is_gc*/ + 0, /*tp_bases*/ + 0, /*tp_mro*/ + 0, /*tp_cache*/ + 0, /*tp_subclasses*/ + 0, /*tp_weaklist*/ + 0, /*tp_del*/ + 0, /*tp_version_tag*/ + #if PY_VERSION_HEX >= 0x030400a1 + 0, /*tp_finalize*/ + #endif + #if PY_VERSION_HEX >= 0x030800b1 + 0, /*tp_vectorcall*/ + #endif + #if PY_VERSION_HEX >= 0x030800b4 && PY_VERSION_HEX < 0x03090000 + 0, /*tp_print*/ + #endif +}; + +static struct __pyx_obj_7aiohttp_12_http_parser___pyx_scope_struct_2___repr__ *__pyx_freelist_7aiohttp_12_http_parser___pyx_scope_struct_2___repr__[8]; +static int __pyx_freecount_7aiohttp_12_http_parser___pyx_scope_struct_2___repr__ = 0; + +static PyObject *__pyx_tp_new_7aiohttp_12_http_parser___pyx_scope_struct_2___repr__(PyTypeObject *t, CYTHON_UNUSED PyObject *a, CYTHON_UNUSED PyObject *k) { + PyObject *o; + if (CYTHON_COMPILING_IN_CPYTHON && likely((__pyx_freecount_7aiohttp_12_http_parser___pyx_scope_struct_2___repr__ > 0) & (t->tp_basicsize == sizeof(struct __pyx_obj_7aiohttp_12_http_parser___pyx_scope_struct_2___repr__)))) { + o = (PyObject*)__pyx_freelist_7aiohttp_12_http_parser___pyx_scope_struct_2___repr__[--__pyx_freecount_7aiohttp_12_http_parser___pyx_scope_struct_2___repr__]; + memset(o, 0, sizeof(struct __pyx_obj_7aiohttp_12_http_parser___pyx_scope_struct_2___repr__)); + (void) PyObject_INIT(o, t); + PyObject_GC_Track(o); + } else { + o = (*t->tp_alloc)(t, 0); + if (unlikely(!o)) return 0; + } + return o; +} + +static void __pyx_tp_dealloc_7aiohttp_12_http_parser___pyx_scope_struct_2___repr__(PyObject *o) { + struct __pyx_obj_7aiohttp_12_http_parser___pyx_scope_struct_2___repr__ *p = (struct __pyx_obj_7aiohttp_12_http_parser___pyx_scope_struct_2___repr__ *)o; + PyObject_GC_UnTrack(o); + Py_CLEAR(p->__pyx_v_info); + if (CYTHON_COMPILING_IN_CPYTHON && ((__pyx_freecount_7aiohttp_12_http_parser___pyx_scope_struct_2___repr__ < 8) & (Py_TYPE(o)->tp_basicsize == sizeof(struct __pyx_obj_7aiohttp_12_http_parser___pyx_scope_struct_2___repr__)))) { + __pyx_freelist_7aiohttp_12_http_parser___pyx_scope_struct_2___repr__[__pyx_freecount_7aiohttp_12_http_parser___pyx_scope_struct_2___repr__++] = ((struct __pyx_obj_7aiohttp_12_http_parser___pyx_scope_struct_2___repr__ *)o); + } else { + (*Py_TYPE(o)->tp_free)(o); + } +} + +static int __pyx_tp_traverse_7aiohttp_12_http_parser___pyx_scope_struct_2___repr__(PyObject *o, visitproc v, void *a) { + int e; + struct __pyx_obj_7aiohttp_12_http_parser___pyx_scope_struct_2___repr__ *p = (struct __pyx_obj_7aiohttp_12_http_parser___pyx_scope_struct_2___repr__ *)o; + if (p->__pyx_v_info) { + e = (*v)(p->__pyx_v_info, a); if (e) return e; + } + return 0; +} + +static int __pyx_tp_clear_7aiohttp_12_http_parser___pyx_scope_struct_2___repr__(PyObject *o) { + PyObject* tmp; + struct __pyx_obj_7aiohttp_12_http_parser___pyx_scope_struct_2___repr__ *p = (struct __pyx_obj_7aiohttp_12_http_parser___pyx_scope_struct_2___repr__ *)o; + tmp = ((PyObject*)p->__pyx_v_info); + p->__pyx_v_info = ((PyObject*)Py_None); Py_INCREF(Py_None); + Py_XDECREF(tmp); + return 0; +} + +static PyTypeObject __pyx_type_7aiohttp_12_http_parser___pyx_scope_struct_2___repr__ = { + PyVarObject_HEAD_INIT(0, 0) + "aiohttp._http_parser.__pyx_scope_struct_2___repr__", /*tp_name*/ + sizeof(struct __pyx_obj_7aiohttp_12_http_parser___pyx_scope_struct_2___repr__), /*tp_basicsize*/ + 0, /*tp_itemsize*/ + __pyx_tp_dealloc_7aiohttp_12_http_parser___pyx_scope_struct_2___repr__, /*tp_dealloc*/ + #if PY_VERSION_HEX < 0x030800b4 + 0, /*tp_print*/ + #endif + #if PY_VERSION_HEX >= 0x030800b4 + 0, /*tp_vectorcall_offset*/ + #endif + 0, /*tp_getattr*/ + 0, /*tp_setattr*/ + #if PY_MAJOR_VERSION < 3 + 0, /*tp_compare*/ + #endif + #if PY_MAJOR_VERSION >= 3 + 0, /*tp_as_async*/ + #endif + 0, /*tp_repr*/ + 0, /*tp_as_number*/ + 0, /*tp_as_sequence*/ + 0, /*tp_as_mapping*/ + 0, /*tp_hash*/ + 0, /*tp_call*/ + 0, /*tp_str*/ + 0, /*tp_getattro*/ + 0, /*tp_setattro*/ + 0, /*tp_as_buffer*/ + Py_TPFLAGS_DEFAULT|Py_TPFLAGS_HAVE_VERSION_TAG|Py_TPFLAGS_CHECKTYPES|Py_TPFLAGS_HAVE_NEWBUFFER|Py_TPFLAGS_HAVE_GC, /*tp_flags*/ + 0, /*tp_doc*/ + __pyx_tp_traverse_7aiohttp_12_http_parser___pyx_scope_struct_2___repr__, /*tp_traverse*/ + __pyx_tp_clear_7aiohttp_12_http_parser___pyx_scope_struct_2___repr__, /*tp_clear*/ + 0, /*tp_richcompare*/ + 0, /*tp_weaklistoffset*/ + 0, /*tp_iter*/ + 0, /*tp_iternext*/ + 0, /*tp_methods*/ + 0, /*tp_members*/ + 0, /*tp_getset*/ + 0, /*tp_base*/ + 0, /*tp_dict*/ + 0, /*tp_descr_get*/ + 0, /*tp_descr_set*/ + 0, /*tp_dictoffset*/ + 0, /*tp_init*/ + 0, /*tp_alloc*/ + __pyx_tp_new_7aiohttp_12_http_parser___pyx_scope_struct_2___repr__, /*tp_new*/ + 0, /*tp_free*/ + 0, /*tp_is_gc*/ + 0, /*tp_bases*/ + 0, /*tp_mro*/ + 0, /*tp_cache*/ + 0, /*tp_subclasses*/ + 0, /*tp_weaklist*/ + 0, /*tp_del*/ + 0, /*tp_version_tag*/ + #if PY_VERSION_HEX >= 0x030400a1 + 0, /*tp_finalize*/ + #endif + #if PY_VERSION_HEX >= 0x030800b1 + 0, /*tp_vectorcall*/ + #endif + #if PY_VERSION_HEX >= 0x030800b4 && PY_VERSION_HEX < 0x03090000 + 0, /*tp_print*/ + #endif +}; + +static struct __pyx_obj_7aiohttp_12_http_parser___pyx_scope_struct_3_genexpr *__pyx_freelist_7aiohttp_12_http_parser___pyx_scope_struct_3_genexpr[8]; +static int __pyx_freecount_7aiohttp_12_http_parser___pyx_scope_struct_3_genexpr = 0; + +static PyObject *__pyx_tp_new_7aiohttp_12_http_parser___pyx_scope_struct_3_genexpr(PyTypeObject *t, CYTHON_UNUSED PyObject *a, CYTHON_UNUSED PyObject *k) { + PyObject *o; + if (CYTHON_COMPILING_IN_CPYTHON && likely((__pyx_freecount_7aiohttp_12_http_parser___pyx_scope_struct_3_genexpr > 0) & (t->tp_basicsize == sizeof(struct __pyx_obj_7aiohttp_12_http_parser___pyx_scope_struct_3_genexpr)))) { + o = (PyObject*)__pyx_freelist_7aiohttp_12_http_parser___pyx_scope_struct_3_genexpr[--__pyx_freecount_7aiohttp_12_http_parser___pyx_scope_struct_3_genexpr]; + memset(o, 0, sizeof(struct __pyx_obj_7aiohttp_12_http_parser___pyx_scope_struct_3_genexpr)); + (void) PyObject_INIT(o, t); + PyObject_GC_Track(o); + } else { + o = (*t->tp_alloc)(t, 0); + if (unlikely(!o)) return 0; + } + return o; +} + +static void __pyx_tp_dealloc_7aiohttp_12_http_parser___pyx_scope_struct_3_genexpr(PyObject *o) { + struct __pyx_obj_7aiohttp_12_http_parser___pyx_scope_struct_3_genexpr *p = (struct __pyx_obj_7aiohttp_12_http_parser___pyx_scope_struct_3_genexpr *)o; + PyObject_GC_UnTrack(o); + Py_CLEAR(p->__pyx_outer_scope); + Py_CLEAR(p->__pyx_v_name); + Py_CLEAR(p->__pyx_v_val); + if (CYTHON_COMPILING_IN_CPYTHON && ((__pyx_freecount_7aiohttp_12_http_parser___pyx_scope_struct_3_genexpr < 8) & (Py_TYPE(o)->tp_basicsize == sizeof(struct __pyx_obj_7aiohttp_12_http_parser___pyx_scope_struct_3_genexpr)))) { + __pyx_freelist_7aiohttp_12_http_parser___pyx_scope_struct_3_genexpr[__pyx_freecount_7aiohttp_12_http_parser___pyx_scope_struct_3_genexpr++] = ((struct __pyx_obj_7aiohttp_12_http_parser___pyx_scope_struct_3_genexpr *)o); + } else { + (*Py_TYPE(o)->tp_free)(o); + } +} + +static int __pyx_tp_traverse_7aiohttp_12_http_parser___pyx_scope_struct_3_genexpr(PyObject *o, visitproc v, void *a) { + int e; + struct __pyx_obj_7aiohttp_12_http_parser___pyx_scope_struct_3_genexpr *p = (struct __pyx_obj_7aiohttp_12_http_parser___pyx_scope_struct_3_genexpr *)o; + if (p->__pyx_outer_scope) { + e = (*v)(((PyObject *)p->__pyx_outer_scope), a); if (e) return e; + } + if (p->__pyx_v_name) { + e = (*v)(p->__pyx_v_name, a); if (e) return e; + } + if (p->__pyx_v_val) { + e = (*v)(p->__pyx_v_val, a); if (e) return e; + } + return 0; +} + +static PyTypeObject __pyx_type_7aiohttp_12_http_parser___pyx_scope_struct_3_genexpr = { + PyVarObject_HEAD_INIT(0, 0) + "aiohttp._http_parser.__pyx_scope_struct_3_genexpr", /*tp_name*/ + sizeof(struct __pyx_obj_7aiohttp_12_http_parser___pyx_scope_struct_3_genexpr), /*tp_basicsize*/ + 0, /*tp_itemsize*/ + __pyx_tp_dealloc_7aiohttp_12_http_parser___pyx_scope_struct_3_genexpr, /*tp_dealloc*/ + #if PY_VERSION_HEX < 0x030800b4 + 0, /*tp_print*/ + #endif + #if PY_VERSION_HEX >= 0x030800b4 + 0, /*tp_vectorcall_offset*/ + #endif + 0, /*tp_getattr*/ + 0, /*tp_setattr*/ + #if PY_MAJOR_VERSION < 3 + 0, /*tp_compare*/ + #endif + #if PY_MAJOR_VERSION >= 3 + 0, /*tp_as_async*/ + #endif + 0, /*tp_repr*/ + 0, /*tp_as_number*/ + 0, /*tp_as_sequence*/ + 0, /*tp_as_mapping*/ + 0, /*tp_hash*/ + 0, /*tp_call*/ + 0, /*tp_str*/ + 0, /*tp_getattro*/ + 0, /*tp_setattro*/ + 0, /*tp_as_buffer*/ + Py_TPFLAGS_DEFAULT|Py_TPFLAGS_HAVE_VERSION_TAG|Py_TPFLAGS_CHECKTYPES|Py_TPFLAGS_HAVE_NEWBUFFER|Py_TPFLAGS_HAVE_GC, /*tp_flags*/ + 0, /*tp_doc*/ + __pyx_tp_traverse_7aiohttp_12_http_parser___pyx_scope_struct_3_genexpr, /*tp_traverse*/ + 0, /*tp_clear*/ + 0, /*tp_richcompare*/ + 0, /*tp_weaklistoffset*/ + 0, /*tp_iter*/ + 0, /*tp_iternext*/ + 0, /*tp_methods*/ + 0, /*tp_members*/ + 0, /*tp_getset*/ + 0, /*tp_base*/ + 0, /*tp_dict*/ + 0, /*tp_descr_get*/ + 0, /*tp_descr_set*/ + 0, /*tp_dictoffset*/ + 0, /*tp_init*/ + 0, /*tp_alloc*/ + __pyx_tp_new_7aiohttp_12_http_parser___pyx_scope_struct_3_genexpr, /*tp_new*/ + 0, /*tp_free*/ + 0, /*tp_is_gc*/ + 0, /*tp_bases*/ + 0, /*tp_mro*/ + 0, /*tp_cache*/ + 0, /*tp_subclasses*/ + 0, /*tp_weaklist*/ + 0, /*tp_del*/ + 0, /*tp_version_tag*/ + #if PY_VERSION_HEX >= 0x030400a1 + 0, /*tp_finalize*/ + #endif + #if PY_VERSION_HEX >= 0x030800b1 + 0, /*tp_vectorcall*/ + #endif + #if PY_VERSION_HEX >= 0x030800b4 && PY_VERSION_HEX < 0x03090000 + 0, /*tp_print*/ + #endif +}; + +static PyMethodDef __pyx_methods[] = { + {0, 0, 0, 0} +}; + +#if PY_MAJOR_VERSION >= 3 +#if CYTHON_PEP489_MULTI_PHASE_INIT +static PyObject* __pyx_pymod_create(PyObject *spec, PyModuleDef *def); /*proto*/ +static int __pyx_pymod_exec__http_parser(PyObject* module); /*proto*/ +static PyModuleDef_Slot __pyx_moduledef_slots[] = { + {Py_mod_create, (void*)__pyx_pymod_create}, + {Py_mod_exec, (void*)__pyx_pymod_exec__http_parser}, + {0, NULL} +}; +#endif + +static struct PyModuleDef __pyx_moduledef = { + PyModuleDef_HEAD_INIT, + "_http_parser", + 0, /* m_doc */ + #if CYTHON_PEP489_MULTI_PHASE_INIT + 0, /* m_size */ + #else + -1, /* m_size */ + #endif + __pyx_methods /* m_methods */, + #if CYTHON_PEP489_MULTI_PHASE_INIT + __pyx_moduledef_slots, /* m_slots */ + #else + NULL, /* m_reload */ + #endif + NULL, /* m_traverse */ + NULL, /* m_clear */ + NULL /* m_free */ +}; +#endif +#ifndef CYTHON_SMALL_CODE +#if defined(__clang__) + #define CYTHON_SMALL_CODE +#elif defined(__GNUC__) && (__GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ >= 3)) + #define CYTHON_SMALL_CODE __attribute__((cold)) +#else + #define CYTHON_SMALL_CODE +#endif +#endif + +static __Pyx_StringTabEntry __pyx_string_tab[] = { + {&__pyx_kp_u_, __pyx_k_, sizeof(__pyx_k_), 0, 1, 0, 0}, + {&__pyx_n_s_ACCEPT, __pyx_k_ACCEPT, sizeof(__pyx_k_ACCEPT), 0, 0, 1, 1}, + {&__pyx_n_s_ACCEPT_CHARSET, __pyx_k_ACCEPT_CHARSET, sizeof(__pyx_k_ACCEPT_CHARSET), 0, 0, 1, 1}, + {&__pyx_n_s_ACCEPT_ENCODING, __pyx_k_ACCEPT_ENCODING, sizeof(__pyx_k_ACCEPT_ENCODING), 0, 0, 1, 1}, + {&__pyx_n_s_ACCEPT_LANGUAGE, __pyx_k_ACCEPT_LANGUAGE, sizeof(__pyx_k_ACCEPT_LANGUAGE), 0, 0, 1, 1}, + {&__pyx_n_s_ACCEPT_RANGES, __pyx_k_ACCEPT_RANGES, sizeof(__pyx_k_ACCEPT_RANGES), 0, 0, 1, 1}, + {&__pyx_n_s_ACCESS_CONTROL_ALLOW_CREDENTIALS, __pyx_k_ACCESS_CONTROL_ALLOW_CREDENTIALS, sizeof(__pyx_k_ACCESS_CONTROL_ALLOW_CREDENTIALS), 0, 0, 1, 1}, + {&__pyx_n_s_ACCESS_CONTROL_ALLOW_HEADERS, __pyx_k_ACCESS_CONTROL_ALLOW_HEADERS, sizeof(__pyx_k_ACCESS_CONTROL_ALLOW_HEADERS), 0, 0, 1, 1}, + {&__pyx_n_s_ACCESS_CONTROL_ALLOW_METHODS, __pyx_k_ACCESS_CONTROL_ALLOW_METHODS, sizeof(__pyx_k_ACCESS_CONTROL_ALLOW_METHODS), 0, 0, 1, 1}, + {&__pyx_n_s_ACCESS_CONTROL_ALLOW_ORIGIN, __pyx_k_ACCESS_CONTROL_ALLOW_ORIGIN, sizeof(__pyx_k_ACCESS_CONTROL_ALLOW_ORIGIN), 0, 0, 1, 1}, + {&__pyx_n_s_ACCESS_CONTROL_EXPOSE_HEADERS, __pyx_k_ACCESS_CONTROL_EXPOSE_HEADERS, sizeof(__pyx_k_ACCESS_CONTROL_EXPOSE_HEADERS), 0, 0, 1, 1}, + {&__pyx_n_s_ACCESS_CONTROL_MAX_AGE, __pyx_k_ACCESS_CONTROL_MAX_AGE, sizeof(__pyx_k_ACCESS_CONTROL_MAX_AGE), 0, 0, 1, 1}, + {&__pyx_n_s_ACCESS_CONTROL_REQUEST_HEADERS, __pyx_k_ACCESS_CONTROL_REQUEST_HEADERS, sizeof(__pyx_k_ACCESS_CONTROL_REQUEST_HEADERS), 0, 0, 1, 1}, + {&__pyx_n_s_ACCESS_CONTROL_REQUEST_METHOD, __pyx_k_ACCESS_CONTROL_REQUEST_METHOD, sizeof(__pyx_k_ACCESS_CONTROL_REQUEST_METHOD), 0, 0, 1, 1}, + {&__pyx_n_s_AGE, __pyx_k_AGE, sizeof(__pyx_k_AGE), 0, 0, 1, 1}, + {&__pyx_n_s_ALLOW, __pyx_k_ALLOW, sizeof(__pyx_k_ALLOW), 0, 0, 1, 1}, + {&__pyx_n_s_AUTHORIZATION, __pyx_k_AUTHORIZATION, sizeof(__pyx_k_AUTHORIZATION), 0, 0, 1, 1}, + {&__pyx_n_s_BadHttpMessage, __pyx_k_BadHttpMessage, sizeof(__pyx_k_BadHttpMessage), 0, 0, 1, 1}, + {&__pyx_n_s_BadStatusLine, __pyx_k_BadStatusLine, sizeof(__pyx_k_BadStatusLine), 0, 0, 1, 1}, + {&__pyx_n_s_BaseException, __pyx_k_BaseException, sizeof(__pyx_k_BaseException), 0, 0, 1, 1}, + {&__pyx_n_s_CACHE_CONTROL, __pyx_k_CACHE_CONTROL, sizeof(__pyx_k_CACHE_CONTROL), 0, 0, 1, 1}, + {&__pyx_n_s_CIMultiDict, __pyx_k_CIMultiDict, sizeof(__pyx_k_CIMultiDict), 0, 0, 1, 1}, + {&__pyx_n_s_CIMultiDictProxy, __pyx_k_CIMultiDictProxy, sizeof(__pyx_k_CIMultiDictProxy), 0, 0, 1, 1}, + {&__pyx_n_s_CIMultiDictProxy_2, __pyx_k_CIMultiDictProxy_2, sizeof(__pyx_k_CIMultiDictProxy_2), 0, 0, 1, 1}, + {&__pyx_n_s_CIMultiDict_2, __pyx_k_CIMultiDict_2, sizeof(__pyx_k_CIMultiDict_2), 0, 0, 1, 1}, + {&__pyx_n_s_CONNECTION, __pyx_k_CONNECTION, sizeof(__pyx_k_CONNECTION), 0, 0, 1, 1}, + {&__pyx_n_s_CONTENT_DISPOSITION, __pyx_k_CONTENT_DISPOSITION, sizeof(__pyx_k_CONTENT_DISPOSITION), 0, 0, 1, 1}, + {&__pyx_n_s_CONTENT_ENCODING, __pyx_k_CONTENT_ENCODING, sizeof(__pyx_k_CONTENT_ENCODING), 0, 0, 1, 1}, + {&__pyx_n_s_CONTENT_LANGUAGE, __pyx_k_CONTENT_LANGUAGE, sizeof(__pyx_k_CONTENT_LANGUAGE), 0, 0, 1, 1}, + {&__pyx_n_s_CONTENT_LENGTH, __pyx_k_CONTENT_LENGTH, sizeof(__pyx_k_CONTENT_LENGTH), 0, 0, 1, 1}, + {&__pyx_n_s_CONTENT_LOCATION, __pyx_k_CONTENT_LOCATION, sizeof(__pyx_k_CONTENT_LOCATION), 0, 0, 1, 1}, + {&__pyx_n_s_CONTENT_MD5, __pyx_k_CONTENT_MD5, sizeof(__pyx_k_CONTENT_MD5), 0, 0, 1, 1}, + {&__pyx_n_s_CONTENT_RANGE, __pyx_k_CONTENT_RANGE, sizeof(__pyx_k_CONTENT_RANGE), 0, 0, 1, 1}, + {&__pyx_n_s_CONTENT_TRANSFER_ENCODING, __pyx_k_CONTENT_TRANSFER_ENCODING, sizeof(__pyx_k_CONTENT_TRANSFER_ENCODING), 0, 0, 1, 1}, + {&__pyx_n_s_CONTENT_TYPE, __pyx_k_CONTENT_TYPE, sizeof(__pyx_k_CONTENT_TYPE), 0, 0, 1, 1}, + {&__pyx_n_s_COOKIE, __pyx_k_COOKIE, sizeof(__pyx_k_COOKIE), 0, 0, 1, 1}, + {&__pyx_n_s_ContentLengthError, __pyx_k_ContentLengthError, sizeof(__pyx_k_ContentLengthError), 0, 0, 1, 1}, + {&__pyx_n_s_DATE, __pyx_k_DATE, sizeof(__pyx_k_DATE), 0, 0, 1, 1}, + {&__pyx_n_s_DESTINATION, __pyx_k_DESTINATION, sizeof(__pyx_k_DESTINATION), 0, 0, 1, 1}, + {&__pyx_n_s_DIGEST, __pyx_k_DIGEST, sizeof(__pyx_k_DIGEST), 0, 0, 1, 1}, + {&__pyx_n_s_DeflateBuffer, __pyx_k_DeflateBuffer, sizeof(__pyx_k_DeflateBuffer), 0, 0, 1, 1}, + {&__pyx_n_s_DeflateBuffer_2, __pyx_k_DeflateBuffer_2, sizeof(__pyx_k_DeflateBuffer_2), 0, 0, 1, 1}, + {&__pyx_n_s_EMPTY_PAYLOAD, __pyx_k_EMPTY_PAYLOAD, sizeof(__pyx_k_EMPTY_PAYLOAD), 0, 0, 1, 1}, + {&__pyx_n_s_EMPTY_PAYLOAD_2, __pyx_k_EMPTY_PAYLOAD_2, sizeof(__pyx_k_EMPTY_PAYLOAD_2), 0, 0, 1, 1}, + {&__pyx_n_s_ETAG, __pyx_k_ETAG, sizeof(__pyx_k_ETAG), 0, 0, 1, 1}, + {&__pyx_n_s_EXPECT, __pyx_k_EXPECT, sizeof(__pyx_k_EXPECT), 0, 0, 1, 1}, + {&__pyx_n_s_EXPIRES, __pyx_k_EXPIRES, sizeof(__pyx_k_EXPIRES), 0, 0, 1, 1}, + {&__pyx_n_s_FORWARDED, __pyx_k_FORWARDED, sizeof(__pyx_k_FORWARDED), 0, 0, 1, 1}, + {&__pyx_n_s_FROM, __pyx_k_FROM, sizeof(__pyx_k_FROM), 0, 0, 1, 1}, + {&__pyx_n_s_HOST, __pyx_k_HOST, sizeof(__pyx_k_HOST), 0, 0, 1, 1}, + {&__pyx_kp_u_Header_name_is_too_long, __pyx_k_Header_name_is_too_long, sizeof(__pyx_k_Header_name_is_too_long), 0, 1, 0, 0}, + {&__pyx_kp_u_Header_value_is_too_long, __pyx_k_Header_value_is_too_long, sizeof(__pyx_k_Header_value_is_too_long), 0, 1, 0, 0}, + {&__pyx_n_s_HttpRequestParser, __pyx_k_HttpRequestParser, sizeof(__pyx_k_HttpRequestParser), 0, 0, 1, 1}, + {&__pyx_n_u_HttpRequestParser, __pyx_k_HttpRequestParser, sizeof(__pyx_k_HttpRequestParser), 0, 1, 0, 1}, + {&__pyx_n_s_HttpResponseParser, __pyx_k_HttpResponseParser, sizeof(__pyx_k_HttpResponseParser), 0, 0, 1, 1}, + {&__pyx_n_u_HttpResponseParser, __pyx_k_HttpResponseParser, sizeof(__pyx_k_HttpResponseParser), 0, 1, 0, 1}, + {&__pyx_n_s_HttpVersion, __pyx_k_HttpVersion, sizeof(__pyx_k_HttpVersion), 0, 0, 1, 1}, + {&__pyx_n_s_HttpVersion10, __pyx_k_HttpVersion10, sizeof(__pyx_k_HttpVersion10), 0, 0, 1, 1}, + {&__pyx_n_s_HttpVersion10_2, __pyx_k_HttpVersion10_2, sizeof(__pyx_k_HttpVersion10_2), 0, 0, 1, 1}, + {&__pyx_n_s_HttpVersion11, __pyx_k_HttpVersion11, sizeof(__pyx_k_HttpVersion11), 0, 0, 1, 1}, + {&__pyx_n_s_HttpVersion11_2, __pyx_k_HttpVersion11_2, sizeof(__pyx_k_HttpVersion11_2), 0, 0, 1, 1}, + {&__pyx_n_s_HttpVersion_2, __pyx_k_HttpVersion_2, sizeof(__pyx_k_HttpVersion_2), 0, 0, 1, 1}, + {&__pyx_n_s_IF_MATCH, __pyx_k_IF_MATCH, sizeof(__pyx_k_IF_MATCH), 0, 0, 1, 1}, + {&__pyx_n_s_IF_MODIFIED_SINCE, __pyx_k_IF_MODIFIED_SINCE, sizeof(__pyx_k_IF_MODIFIED_SINCE), 0, 0, 1, 1}, + {&__pyx_n_s_IF_NONE_MATCH, __pyx_k_IF_NONE_MATCH, sizeof(__pyx_k_IF_NONE_MATCH), 0, 0, 1, 1}, + {&__pyx_n_s_IF_RANGE, __pyx_k_IF_RANGE, sizeof(__pyx_k_IF_RANGE), 0, 0, 1, 1}, + {&__pyx_n_s_IF_UNMODIFIED_SINCE, __pyx_k_IF_UNMODIFIED_SINCE, sizeof(__pyx_k_IF_UNMODIFIED_SINCE), 0, 0, 1, 1}, + {&__pyx_kp_s_Incompatible_checksums_s_vs_0x14, __pyx_k_Incompatible_checksums_s_vs_0x14, sizeof(__pyx_k_Incompatible_checksums_s_vs_0x14), 0, 0, 1, 0}, + {&__pyx_kp_s_Incompatible_checksums_s_vs_0xc7, __pyx_k_Incompatible_checksums_s_vs_0xc7, sizeof(__pyx_k_Incompatible_checksums_s_vs_0xc7), 0, 0, 1, 0}, + {&__pyx_n_s_InvalidHeader, __pyx_k_InvalidHeader, sizeof(__pyx_k_InvalidHeader), 0, 0, 1, 1}, + {&__pyx_n_s_InvalidURLError, __pyx_k_InvalidURLError, sizeof(__pyx_k_InvalidURLError), 0, 0, 1, 1}, + {&__pyx_n_s_KEEP_ALIVE, __pyx_k_KEEP_ALIVE, sizeof(__pyx_k_KEEP_ALIVE), 0, 0, 1, 1}, + {&__pyx_n_s_LAST_EVENT_ID, __pyx_k_LAST_EVENT_ID, sizeof(__pyx_k_LAST_EVENT_ID), 0, 0, 1, 1}, + {&__pyx_n_s_LAST_MODIFIED, __pyx_k_LAST_MODIFIED, sizeof(__pyx_k_LAST_MODIFIED), 0, 0, 1, 1}, + {&__pyx_n_s_LINK, __pyx_k_LINK, sizeof(__pyx_k_LINK), 0, 0, 1, 1}, + {&__pyx_n_s_LOCATION, __pyx_k_LOCATION, sizeof(__pyx_k_LOCATION), 0, 0, 1, 1}, + {&__pyx_n_s_LineTooLong, __pyx_k_LineTooLong, sizeof(__pyx_k_LineTooLong), 0, 0, 1, 1}, + {&__pyx_n_s_MAX_FORWARDS, __pyx_k_MAX_FORWARDS, sizeof(__pyx_k_MAX_FORWARDS), 0, 0, 1, 1}, + {&__pyx_n_s_MemoryError, __pyx_k_MemoryError, sizeof(__pyx_k_MemoryError), 0, 0, 1, 1}, + {&__pyx_kp_u_Not_enough_data_for_satisfy_cont, __pyx_k_Not_enough_data_for_satisfy_cont, sizeof(__pyx_k_Not_enough_data_for_satisfy_cont), 0, 1, 0, 0}, + {&__pyx_kp_u_Not_enough_data_for_satisfy_tran, __pyx_k_Not_enough_data_for_satisfy_tran, sizeof(__pyx_k_Not_enough_data_for_satisfy_tran), 0, 1, 0, 0}, + {&__pyx_n_s_ORIGIN, __pyx_k_ORIGIN, sizeof(__pyx_k_ORIGIN), 0, 0, 1, 1}, + {&__pyx_n_s_PRAGMA, __pyx_k_PRAGMA, sizeof(__pyx_k_PRAGMA), 0, 0, 1, 1}, + {&__pyx_n_s_PROXY_AUTHENTICATE, __pyx_k_PROXY_AUTHENTICATE, sizeof(__pyx_k_PROXY_AUTHENTICATE), 0, 0, 1, 1}, + {&__pyx_n_s_PROXY_AUTHORIZATION, __pyx_k_PROXY_AUTHORIZATION, sizeof(__pyx_k_PROXY_AUTHORIZATION), 0, 0, 1, 1}, + {&__pyx_n_s_PayloadEncodingError, __pyx_k_PayloadEncodingError, sizeof(__pyx_k_PayloadEncodingError), 0, 0, 1, 1}, + {&__pyx_n_s_PickleError, __pyx_k_PickleError, sizeof(__pyx_k_PickleError), 0, 0, 1, 1}, + {&__pyx_n_s_RANGE, __pyx_k_RANGE, sizeof(__pyx_k_RANGE), 0, 0, 1, 1}, + {&__pyx_n_s_REFERER, __pyx_k_REFERER, sizeof(__pyx_k_REFERER), 0, 0, 1, 1}, + {&__pyx_n_s_RETRY_AFTER, __pyx_k_RETRY_AFTER, sizeof(__pyx_k_RETRY_AFTER), 0, 0, 1, 1}, + {&__pyx_kp_u_RawRequestMessage, __pyx_k_RawRequestMessage, sizeof(__pyx_k_RawRequestMessage), 0, 1, 0, 0}, + {&__pyx_n_s_RawRequestMessage_2, __pyx_k_RawRequestMessage_2, sizeof(__pyx_k_RawRequestMessage_2), 0, 0, 1, 1}, + {&__pyx_n_u_RawRequestMessage_2, __pyx_k_RawRequestMessage_2, sizeof(__pyx_k_RawRequestMessage_2), 0, 1, 0, 1}, + {&__pyx_kp_u_RawResponseMessage, __pyx_k_RawResponseMessage, sizeof(__pyx_k_RawResponseMessage), 0, 1, 0, 0}, + {&__pyx_n_s_RawResponseMessage_2, __pyx_k_RawResponseMessage_2, sizeof(__pyx_k_RawResponseMessage_2), 0, 0, 1, 1}, + {&__pyx_n_u_RawResponseMessage_2, __pyx_k_RawResponseMessage_2, sizeof(__pyx_k_RawResponseMessage_2), 0, 1, 0, 1}, + {&__pyx_n_s_SEC_WEBSOCKET_ACCEPT, __pyx_k_SEC_WEBSOCKET_ACCEPT, sizeof(__pyx_k_SEC_WEBSOCKET_ACCEPT), 0, 0, 1, 1}, + {&__pyx_n_s_SEC_WEBSOCKET_EXTENSIONS, __pyx_k_SEC_WEBSOCKET_EXTENSIONS, sizeof(__pyx_k_SEC_WEBSOCKET_EXTENSIONS), 0, 0, 1, 1}, + {&__pyx_n_s_SEC_WEBSOCKET_KEY, __pyx_k_SEC_WEBSOCKET_KEY, sizeof(__pyx_k_SEC_WEBSOCKET_KEY), 0, 0, 1, 1}, + {&__pyx_n_s_SEC_WEBSOCKET_KEY1, __pyx_k_SEC_WEBSOCKET_KEY1, sizeof(__pyx_k_SEC_WEBSOCKET_KEY1), 0, 0, 1, 1}, + {&__pyx_n_s_SEC_WEBSOCKET_PROTOCOL, __pyx_k_SEC_WEBSOCKET_PROTOCOL, sizeof(__pyx_k_SEC_WEBSOCKET_PROTOCOL), 0, 0, 1, 1}, + {&__pyx_n_s_SEC_WEBSOCKET_VERSION, __pyx_k_SEC_WEBSOCKET_VERSION, sizeof(__pyx_k_SEC_WEBSOCKET_VERSION), 0, 0, 1, 1}, + {&__pyx_n_s_SERVER, __pyx_k_SERVER, sizeof(__pyx_k_SERVER), 0, 0, 1, 1}, + {&__pyx_n_s_SET_COOKIE, __pyx_k_SET_COOKIE, sizeof(__pyx_k_SET_COOKIE), 0, 0, 1, 1}, + {&__pyx_kp_u_Status_line_is_too_long, __pyx_k_Status_line_is_too_long, sizeof(__pyx_k_Status_line_is_too_long), 0, 1, 0, 0}, + {&__pyx_n_s_StreamReader, __pyx_k_StreamReader, sizeof(__pyx_k_StreamReader), 0, 0, 1, 1}, + {&__pyx_n_s_StreamReader_2, __pyx_k_StreamReader_2, sizeof(__pyx_k_StreamReader_2), 0, 0, 1, 1}, + {&__pyx_n_s_TE, __pyx_k_TE, sizeof(__pyx_k_TE), 0, 0, 1, 1}, + {&__pyx_n_s_TRAILER, __pyx_k_TRAILER, sizeof(__pyx_k_TRAILER), 0, 0, 1, 1}, + {&__pyx_n_s_TRANSFER_ENCODING, __pyx_k_TRANSFER_ENCODING, sizeof(__pyx_k_TRANSFER_ENCODING), 0, 0, 1, 1}, + {&__pyx_n_s_TransferEncodingError, __pyx_k_TransferEncodingError, sizeof(__pyx_k_TransferEncodingError), 0, 0, 1, 1}, + {&__pyx_n_s_TypeError, __pyx_k_TypeError, sizeof(__pyx_k_TypeError), 0, 0, 1, 1}, + {&__pyx_n_s_UPGRADE, __pyx_k_UPGRADE, sizeof(__pyx_k_UPGRADE), 0, 0, 1, 1}, + {&__pyx_n_s_URI, __pyx_k_URI, sizeof(__pyx_k_URI), 0, 0, 1, 1}, + {&__pyx_n_s_URL, __pyx_k_URL, sizeof(__pyx_k_URL), 0, 0, 1, 1}, + {&__pyx_n_s_URL_2, __pyx_k_URL_2, sizeof(__pyx_k_URL_2), 0, 0, 1, 1}, + {&__pyx_n_s_USER_AGENT, __pyx_k_USER_AGENT, sizeof(__pyx_k_USER_AGENT), 0, 0, 1, 1}, + {&__pyx_n_s_VARY, __pyx_k_VARY, sizeof(__pyx_k_VARY), 0, 0, 1, 1}, + {&__pyx_n_s_VIA, __pyx_k_VIA, sizeof(__pyx_k_VIA), 0, 0, 1, 1}, + {&__pyx_n_s_WANT_DIGEST, __pyx_k_WANT_DIGEST, sizeof(__pyx_k_WANT_DIGEST), 0, 0, 1, 1}, + {&__pyx_n_s_WARNING, __pyx_k_WARNING, sizeof(__pyx_k_WARNING), 0, 0, 1, 1}, + {&__pyx_n_s_WWW_AUTHENTICATE, __pyx_k_WWW_AUTHENTICATE, sizeof(__pyx_k_WWW_AUTHENTICATE), 0, 0, 1, 1}, + {&__pyx_n_s_X_FORWARDED_FOR, __pyx_k_X_FORWARDED_FOR, sizeof(__pyx_k_X_FORWARDED_FOR), 0, 0, 1, 1}, + {&__pyx_n_s_X_FORWARDED_HOST, __pyx_k_X_FORWARDED_HOST, sizeof(__pyx_k_X_FORWARDED_HOST), 0, 0, 1, 1}, + {&__pyx_n_s_X_FORWARDED_PROTO, __pyx_k_X_FORWARDED_PROTO, sizeof(__pyx_k_X_FORWARDED_PROTO), 0, 0, 1, 1}, + {&__pyx_kp_u__2, __pyx_k__2, sizeof(__pyx_k__2), 0, 1, 0, 0}, + {&__pyx_kp_u__3, __pyx_k__3, sizeof(__pyx_k__3), 0, 1, 0, 0}, + {&__pyx_n_s__4, __pyx_k__4, sizeof(__pyx_k__4), 0, 0, 1, 1}, + {&__pyx_kp_b__4, __pyx_k__4, sizeof(__pyx_k__4), 0, 0, 0, 0}, + {&__pyx_kp_u__4, __pyx_k__4, sizeof(__pyx_k__4), 0, 1, 0, 0}, + {&__pyx_kp_u__7, __pyx_k__7, sizeof(__pyx_k__7), 0, 1, 0, 0}, + {&__pyx_kp_u__8, __pyx_k__8, sizeof(__pyx_k__8), 0, 1, 0, 0}, + {&__pyx_n_s_add, __pyx_k_add, sizeof(__pyx_k_add), 0, 0, 1, 1}, + {&__pyx_n_s_aiohttp, __pyx_k_aiohttp, sizeof(__pyx_k_aiohttp), 0, 0, 1, 1}, + {&__pyx_n_s_aiohttp__http_parser, __pyx_k_aiohttp__http_parser, sizeof(__pyx_k_aiohttp__http_parser), 0, 0, 1, 1}, + {&__pyx_n_s_all, __pyx_k_all, sizeof(__pyx_k_all), 0, 0, 1, 1}, + {&__pyx_n_s_args, __pyx_k_args, sizeof(__pyx_k_args), 0, 0, 1, 1}, + {&__pyx_n_s_auto_decompress, __pyx_k_auto_decompress, sizeof(__pyx_k_auto_decompress), 0, 0, 1, 1}, + {&__pyx_n_s_begin_http_chunk_receiving, __pyx_k_begin_http_chunk_receiving, sizeof(__pyx_k_begin_http_chunk_receiving), 0, 0, 1, 1}, + {&__pyx_n_u_br, __pyx_k_br, sizeof(__pyx_k_br), 0, 1, 0, 1}, + {&__pyx_n_s_build, __pyx_k_build, sizeof(__pyx_k_build), 0, 0, 1, 1}, + {&__pyx_n_s_chunked, __pyx_k_chunked, sizeof(__pyx_k_chunked), 0, 0, 1, 1}, + {&__pyx_n_u_chunked, __pyx_k_chunked, sizeof(__pyx_k_chunked), 0, 1, 0, 1}, + {&__pyx_n_s_cline_in_traceback, __pyx_k_cline_in_traceback, sizeof(__pyx_k_cline_in_traceback), 0, 0, 1, 1}, + {&__pyx_n_s_close, __pyx_k_close, sizeof(__pyx_k_close), 0, 0, 1, 1}, + {&__pyx_n_s_code, __pyx_k_code, sizeof(__pyx_k_code), 0, 0, 1, 1}, + {&__pyx_n_u_code, __pyx_k_code, sizeof(__pyx_k_code), 0, 1, 0, 1}, + {&__pyx_n_s_compression, __pyx_k_compression, sizeof(__pyx_k_compression), 0, 0, 1, 1}, + {&__pyx_n_u_compression, __pyx_k_compression, sizeof(__pyx_k_compression), 0, 1, 0, 1}, + {&__pyx_n_u_deflate, __pyx_k_deflate, sizeof(__pyx_k_deflate), 0, 1, 0, 1}, + {&__pyx_n_s_dict, __pyx_k_dict, sizeof(__pyx_k_dict), 0, 0, 1, 1}, + {&__pyx_n_s_encoded, __pyx_k_encoded, sizeof(__pyx_k_encoded), 0, 0, 1, 1}, + {&__pyx_n_s_end_http_chunk_receiving, __pyx_k_end_http_chunk_receiving, sizeof(__pyx_k_end_http_chunk_receiving), 0, 0, 1, 1}, + {&__pyx_n_s_feed_data, __pyx_k_feed_data, sizeof(__pyx_k_feed_data), 0, 0, 1, 1}, + {&__pyx_n_s_feed_eof, __pyx_k_feed_eof, sizeof(__pyx_k_feed_eof), 0, 0, 1, 1}, + {&__pyx_n_s_fragment, __pyx_k_fragment, sizeof(__pyx_k_fragment), 0, 0, 1, 1}, + {&__pyx_n_s_genexpr, __pyx_k_genexpr, sizeof(__pyx_k_genexpr), 0, 0, 1, 1}, + {&__pyx_n_s_getstate, __pyx_k_getstate, sizeof(__pyx_k_getstate), 0, 0, 1, 1}, + {&__pyx_n_u_gzip, __pyx_k_gzip, sizeof(__pyx_k_gzip), 0, 1, 0, 1}, + {&__pyx_n_s_hdrs, __pyx_k_hdrs, sizeof(__pyx_k_hdrs), 0, 0, 1, 1}, + {&__pyx_n_s_headers, __pyx_k_headers, sizeof(__pyx_k_headers), 0, 0, 1, 1}, + {&__pyx_n_u_headers, __pyx_k_headers, sizeof(__pyx_k_headers), 0, 1, 0, 1}, + {&__pyx_n_s_http_exceptions, __pyx_k_http_exceptions, sizeof(__pyx_k_http_exceptions), 0, 0, 1, 1}, + {&__pyx_n_s_http_parser, __pyx_k_http_parser, sizeof(__pyx_k_http_parser), 0, 0, 1, 1}, + {&__pyx_n_s_http_writer, __pyx_k_http_writer, sizeof(__pyx_k_http_writer), 0, 0, 1, 1}, + {&__pyx_n_s_i, __pyx_k_i, sizeof(__pyx_k_i), 0, 0, 1, 1}, + {&__pyx_n_s_import, __pyx_k_import, sizeof(__pyx_k_import), 0, 0, 1, 1}, + {&__pyx_n_s_limit, __pyx_k_limit, sizeof(__pyx_k_limit), 0, 0, 1, 1}, + {&__pyx_n_s_loop, __pyx_k_loop, sizeof(__pyx_k_loop), 0, 0, 1, 1}, + {&__pyx_n_s_lower, __pyx_k_lower, sizeof(__pyx_k_lower), 0, 0, 1, 1}, + {&__pyx_n_s_main, __pyx_k_main, sizeof(__pyx_k_main), 0, 0, 1, 1}, + {&__pyx_n_s_max_field_size, __pyx_k_max_field_size, sizeof(__pyx_k_max_field_size), 0, 0, 1, 1}, + {&__pyx_n_s_max_headers, __pyx_k_max_headers, sizeof(__pyx_k_max_headers), 0, 0, 1, 1}, + {&__pyx_n_s_max_line_size, __pyx_k_max_line_size, sizeof(__pyx_k_max_line_size), 0, 0, 1, 1}, + {&__pyx_n_s_method, __pyx_k_method, sizeof(__pyx_k_method), 0, 0, 1, 1}, + {&__pyx_n_u_method, __pyx_k_method, sizeof(__pyx_k_method), 0, 1, 0, 1}, + {&__pyx_n_s_multidict, __pyx_k_multidict, sizeof(__pyx_k_multidict), 0, 0, 1, 1}, + {&__pyx_n_s_name, __pyx_k_name, sizeof(__pyx_k_name), 0, 0, 1, 1}, + {&__pyx_n_s_new, __pyx_k_new, sizeof(__pyx_k_new), 0, 0, 1, 1}, + {&__pyx_kp_s_no_default___reduce___due_to_non, __pyx_k_no_default___reduce___due_to_non, sizeof(__pyx_k_no_default___reduce___due_to_non), 0, 0, 1, 0}, + {&__pyx_n_s_path, __pyx_k_path, sizeof(__pyx_k_path), 0, 0, 1, 1}, + {&__pyx_n_u_path, __pyx_k_path, sizeof(__pyx_k_path), 0, 1, 0, 1}, + {&__pyx_n_s_payload_exception, __pyx_k_payload_exception, sizeof(__pyx_k_payload_exception), 0, 0, 1, 1}, + {&__pyx_n_s_pickle, __pyx_k_pickle, sizeof(__pyx_k_pickle), 0, 0, 1, 1}, + {&__pyx_n_s_protocol, __pyx_k_protocol, sizeof(__pyx_k_protocol), 0, 0, 1, 1}, + {&__pyx_n_s_pyx_PickleError, __pyx_k_pyx_PickleError, sizeof(__pyx_k_pyx_PickleError), 0, 0, 1, 1}, + {&__pyx_n_s_pyx_checksum, __pyx_k_pyx_checksum, sizeof(__pyx_k_pyx_checksum), 0, 0, 1, 1}, + {&__pyx_n_s_pyx_result, __pyx_k_pyx_result, sizeof(__pyx_k_pyx_result), 0, 0, 1, 1}, + {&__pyx_n_s_pyx_state, __pyx_k_pyx_state, sizeof(__pyx_k_pyx_state), 0, 0, 1, 1}, + {&__pyx_n_s_pyx_type, __pyx_k_pyx_type, sizeof(__pyx_k_pyx_type), 0, 0, 1, 1}, + {&__pyx_n_s_pyx_unpickle_RawRequestMessage, __pyx_k_pyx_unpickle_RawRequestMessage, sizeof(__pyx_k_pyx_unpickle_RawRequestMessage), 0, 0, 1, 1}, + {&__pyx_n_s_pyx_unpickle_RawResponseMessag, __pyx_k_pyx_unpickle_RawResponseMessag, sizeof(__pyx_k_pyx_unpickle_RawResponseMessag), 0, 0, 1, 1}, + {&__pyx_n_s_pyx_vtable, __pyx_k_pyx_vtable, sizeof(__pyx_k_pyx_vtable), 0, 0, 1, 1}, + {&__pyx_n_s_query_string, __pyx_k_query_string, sizeof(__pyx_k_query_string), 0, 0, 1, 1}, + {&__pyx_n_s_range, __pyx_k_range, sizeof(__pyx_k_range), 0, 0, 1, 1}, + {&__pyx_n_s_raw_headers, __pyx_k_raw_headers, sizeof(__pyx_k_raw_headers), 0, 0, 1, 1}, + {&__pyx_n_u_raw_headers, __pyx_k_raw_headers, sizeof(__pyx_k_raw_headers), 0, 1, 0, 1}, + {&__pyx_n_s_read_until_eof, __pyx_k_read_until_eof, sizeof(__pyx_k_read_until_eof), 0, 0, 1, 1}, + {&__pyx_n_s_reason, __pyx_k_reason, sizeof(__pyx_k_reason), 0, 0, 1, 1}, + {&__pyx_n_u_reason, __pyx_k_reason, sizeof(__pyx_k_reason), 0, 1, 0, 1}, + {&__pyx_n_s_reduce, __pyx_k_reduce, sizeof(__pyx_k_reduce), 0, 0, 1, 1}, + {&__pyx_n_s_reduce_cython, __pyx_k_reduce_cython, sizeof(__pyx_k_reduce_cython), 0, 0, 1, 1}, + {&__pyx_n_s_reduce_ex, __pyx_k_reduce_ex, sizeof(__pyx_k_reduce_ex), 0, 0, 1, 1}, + {&__pyx_n_s_repr___locals_genexpr, __pyx_k_repr___locals_genexpr, sizeof(__pyx_k_repr___locals_genexpr), 0, 0, 1, 1}, + {&__pyx_n_s_response_with_body, __pyx_k_response_with_body, sizeof(__pyx_k_response_with_body), 0, 0, 1, 1}, + {&__pyx_n_s_send, __pyx_k_send, sizeof(__pyx_k_send), 0, 0, 1, 1}, + {&__pyx_n_s_set_exception, __pyx_k_set_exception, sizeof(__pyx_k_set_exception), 0, 0, 1, 1}, + {&__pyx_n_s_setstate, __pyx_k_setstate, sizeof(__pyx_k_setstate), 0, 0, 1, 1}, + {&__pyx_n_s_setstate_cython, __pyx_k_setstate_cython, sizeof(__pyx_k_setstate_cython), 0, 0, 1, 1}, + {&__pyx_n_s_should_close, __pyx_k_should_close, sizeof(__pyx_k_should_close), 0, 0, 1, 1}, + {&__pyx_n_u_should_close, __pyx_k_should_close, sizeof(__pyx_k_should_close), 0, 1, 0, 1}, + {&__pyx_n_s_streams, __pyx_k_streams, sizeof(__pyx_k_streams), 0, 0, 1, 1}, + {&__pyx_kp_s_stringsource, __pyx_k_stringsource, sizeof(__pyx_k_stringsource), 0, 0, 1, 0}, + {&__pyx_n_s_test, __pyx_k_test, sizeof(__pyx_k_test), 0, 0, 1, 1}, + {&__pyx_n_s_throw, __pyx_k_throw, sizeof(__pyx_k_throw), 0, 0, 1, 1}, + {&__pyx_n_s_timer, __pyx_k_timer, sizeof(__pyx_k_timer), 0, 0, 1, 1}, + {&__pyx_kp_u_unknown, __pyx_k_unknown, sizeof(__pyx_k_unknown), 0, 1, 0, 0}, + {&__pyx_n_s_update, __pyx_k_update, sizeof(__pyx_k_update), 0, 0, 1, 1}, + {&__pyx_n_s_upgrade, __pyx_k_upgrade, sizeof(__pyx_k_upgrade), 0, 0, 1, 1}, + {&__pyx_n_u_upgrade, __pyx_k_upgrade, sizeof(__pyx_k_upgrade), 0, 1, 0, 1}, + {&__pyx_n_s_url, __pyx_k_url, sizeof(__pyx_k_url), 0, 0, 1, 1}, + {&__pyx_n_u_url, __pyx_k_url, sizeof(__pyx_k_url), 0, 1, 0, 1}, + {&__pyx_n_s_version, __pyx_k_version, sizeof(__pyx_k_version), 0, 0, 1, 1}, + {&__pyx_n_u_version, __pyx_k_version, sizeof(__pyx_k_version), 0, 1, 0, 1}, + {&__pyx_n_s_yarl, __pyx_k_yarl, sizeof(__pyx_k_yarl), 0, 0, 1, 1}, + {0, 0, 0, 0, 0, 0, 0} +}; +static CYTHON_SMALL_CODE int __Pyx_InitCachedBuiltins(void) { + __pyx_builtin_range = __Pyx_GetBuiltinName(__pyx_n_s_range); if (!__pyx_builtin_range) __PYX_ERR(0, 87, __pyx_L1_error) + __pyx_builtin_MemoryError = __Pyx_GetBuiltinName(__pyx_n_s_MemoryError); if (!__pyx_builtin_MemoryError) __PYX_ERR(0, 316, __pyx_L1_error) + __pyx_builtin_TypeError = __Pyx_GetBuiltinName(__pyx_n_s_TypeError); if (!__pyx_builtin_TypeError) __PYX_ERR(1, 2, __pyx_L1_error) + __pyx_builtin_BaseException = __Pyx_GetBuiltinName(__pyx_n_s_BaseException); if (!__pyx_builtin_BaseException) __PYX_ERR(0, 662, __pyx_L1_error) + return 0; + __pyx_L1_error:; + return -1; +} + +static CYTHON_SMALL_CODE int __Pyx_InitCachedConstants(void) { + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("__Pyx_InitCachedConstants", 0); + + /* "(tree fragment)":2 + * def __reduce_cython__(self): + * raise TypeError("no default __reduce__ due to non-trivial __cinit__") # <<<<<<<<<<<<<< + * def __setstate_cython__(self, __pyx_state): + * raise TypeError("no default __reduce__ due to non-trivial __cinit__") + */ + __pyx_tuple__5 = PyTuple_Pack(1, __pyx_kp_s_no_default___reduce___due_to_non); if (unlikely(!__pyx_tuple__5)) __PYX_ERR(1, 2, __pyx_L1_error) + __Pyx_GOTREF(__pyx_tuple__5); + __Pyx_GIVEREF(__pyx_tuple__5); + + /* "(tree fragment)":4 + * raise TypeError("no default __reduce__ due to non-trivial __cinit__") + * def __setstate_cython__(self, __pyx_state): + * raise TypeError("no default __reduce__ due to non-trivial __cinit__") # <<<<<<<<<<<<<< + */ + __pyx_tuple__6 = PyTuple_Pack(1, __pyx_kp_s_no_default___reduce___due_to_non); if (unlikely(!__pyx_tuple__6)) __PYX_ERR(1, 4, __pyx_L1_error) + __Pyx_GOTREF(__pyx_tuple__6); + __Pyx_GIVEREF(__pyx_tuple__6); + + /* "(tree fragment)":2 + * def __reduce_cython__(self): + * raise TypeError("no default __reduce__ due to non-trivial __cinit__") # <<<<<<<<<<<<<< + * def __setstate_cython__(self, __pyx_state): + * raise TypeError("no default __reduce__ due to non-trivial __cinit__") + */ + __pyx_tuple__9 = PyTuple_Pack(1, __pyx_kp_s_no_default___reduce___due_to_non); if (unlikely(!__pyx_tuple__9)) __PYX_ERR(1, 2, __pyx_L1_error) + __Pyx_GOTREF(__pyx_tuple__9); + __Pyx_GIVEREF(__pyx_tuple__9); + + /* "(tree fragment)":4 + * raise TypeError("no default __reduce__ due to non-trivial __cinit__") + * def __setstate_cython__(self, __pyx_state): + * raise TypeError("no default __reduce__ due to non-trivial __cinit__") # <<<<<<<<<<<<<< + */ + __pyx_tuple__10 = PyTuple_Pack(1, __pyx_kp_s_no_default___reduce___due_to_non); if (unlikely(!__pyx_tuple__10)) __PYX_ERR(1, 4, __pyx_L1_error) + __Pyx_GOTREF(__pyx_tuple__10); + __Pyx_GIVEREF(__pyx_tuple__10); + + /* "(tree fragment)":2 + * def __reduce_cython__(self): + * raise TypeError("no default __reduce__ due to non-trivial __cinit__") # <<<<<<<<<<<<<< + * def __setstate_cython__(self, __pyx_state): + * raise TypeError("no default __reduce__ due to non-trivial __cinit__") + */ + __pyx_tuple__11 = PyTuple_Pack(1, __pyx_kp_s_no_default___reduce___due_to_non); if (unlikely(!__pyx_tuple__11)) __PYX_ERR(1, 2, __pyx_L1_error) + __Pyx_GOTREF(__pyx_tuple__11); + __Pyx_GIVEREF(__pyx_tuple__11); + + /* "(tree fragment)":4 + * raise TypeError("no default __reduce__ due to non-trivial __cinit__") + * def __setstate_cython__(self, __pyx_state): + * raise TypeError("no default __reduce__ due to non-trivial __cinit__") # <<<<<<<<<<<<<< + */ + __pyx_tuple__12 = PyTuple_Pack(1, __pyx_kp_s_no_default___reduce___due_to_non); if (unlikely(!__pyx_tuple__12)) __PYX_ERR(1, 4, __pyx_L1_error) + __Pyx_GOTREF(__pyx_tuple__12); + __Pyx_GIVEREF(__pyx_tuple__12); + + /* "aiohttp/_http_parser.pyx":57 + * char* PyByteArray_AsString(object) + * + * __all__ = ('HttpRequestParser', 'HttpResponseParser', # <<<<<<<<<<<<<< + * 'RawRequestMessage', 'RawResponseMessage') + * + */ + __pyx_tuple__13 = PyTuple_Pack(4, __pyx_n_u_HttpRequestParser, __pyx_n_u_HttpResponseParser, __pyx_n_u_RawRequestMessage_2, __pyx_n_u_RawResponseMessage_2); if (unlikely(!__pyx_tuple__13)) __PYX_ERR(0, 57, __pyx_L1_error) + __Pyx_GOTREF(__pyx_tuple__13); + __Pyx_GIVEREF(__pyx_tuple__13); + + /* "(tree fragment)":1 + * def __pyx_unpickle_RawRequestMessage(__pyx_type, long __pyx_checksum, __pyx_state): # <<<<<<<<<<<<<< + * cdef object __pyx_PickleError + * cdef object __pyx_result + */ + __pyx_tuple__14 = PyTuple_Pack(5, __pyx_n_s_pyx_type, __pyx_n_s_pyx_checksum, __pyx_n_s_pyx_state, __pyx_n_s_pyx_PickleError, __pyx_n_s_pyx_result); if (unlikely(!__pyx_tuple__14)) __PYX_ERR(1, 1, __pyx_L1_error) + __Pyx_GOTREF(__pyx_tuple__14); + __Pyx_GIVEREF(__pyx_tuple__14); + __pyx_codeobj__15 = (PyObject*)__Pyx_PyCode_New(3, 0, 5, 0, CO_OPTIMIZED|CO_NEWLOCALS, __pyx_empty_bytes, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_tuple__14, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_kp_s_stringsource, __pyx_n_s_pyx_unpickle_RawRequestMessage, 1, __pyx_empty_bytes); if (unlikely(!__pyx_codeobj__15)) __PYX_ERR(1, 1, __pyx_L1_error) + __pyx_tuple__16 = PyTuple_Pack(5, __pyx_n_s_pyx_type, __pyx_n_s_pyx_checksum, __pyx_n_s_pyx_state, __pyx_n_s_pyx_PickleError, __pyx_n_s_pyx_result); if (unlikely(!__pyx_tuple__16)) __PYX_ERR(1, 1, __pyx_L1_error) + __Pyx_GOTREF(__pyx_tuple__16); + __Pyx_GIVEREF(__pyx_tuple__16); + __pyx_codeobj__17 = (PyObject*)__Pyx_PyCode_New(3, 0, 5, 0, CO_OPTIMIZED|CO_NEWLOCALS, __pyx_empty_bytes, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_tuple__16, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_kp_s_stringsource, __pyx_n_s_pyx_unpickle_RawResponseMessag, 1, __pyx_empty_bytes); if (unlikely(!__pyx_codeobj__17)) __PYX_ERR(1, 1, __pyx_L1_error) + __Pyx_RefNannyFinishContext(); + return 0; + __pyx_L1_error:; + __Pyx_RefNannyFinishContext(); + return -1; +} + +static CYTHON_SMALL_CODE int __Pyx_InitGlobals(void) { + if (__Pyx_InitStrings(__pyx_string_tab) < 0) __PYX_ERR(0, 1, __pyx_L1_error); + __pyx_int_21004882 = PyInt_FromLong(21004882L); if (unlikely(!__pyx_int_21004882)) __PYX_ERR(0, 1, __pyx_L1_error) + __pyx_int_209127132 = PyInt_FromLong(209127132L); if (unlikely(!__pyx_int_209127132)) __PYX_ERR(0, 1, __pyx_L1_error) + return 0; + __pyx_L1_error:; + return -1; +} + +static CYTHON_SMALL_CODE int __Pyx_modinit_global_init_code(void); /*proto*/ +static CYTHON_SMALL_CODE int __Pyx_modinit_variable_export_code(void); /*proto*/ +static CYTHON_SMALL_CODE int __Pyx_modinit_function_export_code(void); /*proto*/ +static CYTHON_SMALL_CODE int __Pyx_modinit_type_init_code(void); /*proto*/ +static CYTHON_SMALL_CODE int __Pyx_modinit_type_import_code(void); /*proto*/ +static CYTHON_SMALL_CODE int __Pyx_modinit_variable_import_code(void); /*proto*/ +static CYTHON_SMALL_CODE int __Pyx_modinit_function_import_code(void); /*proto*/ + +static int __Pyx_modinit_global_init_code(void) { + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("__Pyx_modinit_global_init_code", 0); + /*--- Global init code ---*/ + __pyx_v_7aiohttp_12_http_parser_headers = ((PyObject*)Py_None); Py_INCREF(Py_None); + __pyx_v_7aiohttp_12_http_parser_URL = Py_None; Py_INCREF(Py_None); + __pyx_v_7aiohttp_12_http_parser_URL_build = Py_None; Py_INCREF(Py_None); + __pyx_v_7aiohttp_12_http_parser_CIMultiDict = Py_None; Py_INCREF(Py_None); + __pyx_v_7aiohttp_12_http_parser_CIMultiDictProxy = Py_None; Py_INCREF(Py_None); + __pyx_v_7aiohttp_12_http_parser_HttpVersion = Py_None; Py_INCREF(Py_None); + __pyx_v_7aiohttp_12_http_parser_HttpVersion10 = Py_None; Py_INCREF(Py_None); + __pyx_v_7aiohttp_12_http_parser_HttpVersion11 = Py_None; Py_INCREF(Py_None); + __pyx_v_7aiohttp_12_http_parser_SEC_WEBSOCKET_KEY1 = Py_None; Py_INCREF(Py_None); + __pyx_v_7aiohttp_12_http_parser_CONTENT_ENCODING = Py_None; Py_INCREF(Py_None); + __pyx_v_7aiohttp_12_http_parser_EMPTY_PAYLOAD = Py_None; Py_INCREF(Py_None); + __pyx_v_7aiohttp_12_http_parser_StreamReader = Py_None; Py_INCREF(Py_None); + __pyx_v_7aiohttp_12_http_parser_DeflateBuffer = Py_None; Py_INCREF(Py_None); + __pyx_v_7aiohttp_12_http_parser__http_method = ((PyObject*)Py_None); Py_INCREF(Py_None); + __Pyx_RefNannyFinishContext(); + return 0; +} + +static int __Pyx_modinit_variable_export_code(void) { + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("__Pyx_modinit_variable_export_code", 0); + /*--- Variable export code ---*/ + __Pyx_RefNannyFinishContext(); + return 0; +} + +static int __Pyx_modinit_function_export_code(void) { + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("__Pyx_modinit_function_export_code", 0); + /*--- Function export code ---*/ + __Pyx_RefNannyFinishContext(); + return 0; +} + +static int __Pyx_modinit_type_init_code(void) { + __Pyx_RefNannyDeclarations + int __pyx_lineno = 0; + const char *__pyx_filename = NULL; + int __pyx_clineno = 0; + __Pyx_RefNannySetupContext("__Pyx_modinit_type_init_code", 0); + /*--- Type init code ---*/ + if (PyType_Ready(&__pyx_type_7aiohttp_12_http_parser_RawRequestMessage) < 0) __PYX_ERR(0, 110, __pyx_L1_error) + #if PY_VERSION_HEX < 0x030800B1 + __pyx_type_7aiohttp_12_http_parser_RawRequestMessage.tp_print = 0; + #endif + if ((CYTHON_USE_TYPE_SLOTS && CYTHON_USE_PYTYPE_LOOKUP) && likely(!__pyx_type_7aiohttp_12_http_parser_RawRequestMessage.tp_dictoffset && __pyx_type_7aiohttp_12_http_parser_RawRequestMessage.tp_getattro == PyObject_GenericGetAttr)) { + __pyx_type_7aiohttp_12_http_parser_RawRequestMessage.tp_getattro = __Pyx_PyObject_GenericGetAttr; + } + if (PyObject_SetAttr(__pyx_m, __pyx_n_s_RawRequestMessage_2, (PyObject *)&__pyx_type_7aiohttp_12_http_parser_RawRequestMessage) < 0) __PYX_ERR(0, 110, __pyx_L1_error) + if (__Pyx_setup_reduce((PyObject*)&__pyx_type_7aiohttp_12_http_parser_RawRequestMessage) < 0) __PYX_ERR(0, 110, __pyx_L1_error) + __pyx_ptype_7aiohttp_12_http_parser_RawRequestMessage = &__pyx_type_7aiohttp_12_http_parser_RawRequestMessage; + if (PyType_Ready(&__pyx_type_7aiohttp_12_http_parser_RawResponseMessage) < 0) __PYX_ERR(0, 210, __pyx_L1_error) + #if PY_VERSION_HEX < 0x030800B1 + __pyx_type_7aiohttp_12_http_parser_RawResponseMessage.tp_print = 0; + #endif + if ((CYTHON_USE_TYPE_SLOTS && CYTHON_USE_PYTYPE_LOOKUP) && likely(!__pyx_type_7aiohttp_12_http_parser_RawResponseMessage.tp_dictoffset && __pyx_type_7aiohttp_12_http_parser_RawResponseMessage.tp_getattro == PyObject_GenericGetAttr)) { + __pyx_type_7aiohttp_12_http_parser_RawResponseMessage.tp_getattro = __Pyx_PyObject_GenericGetAttr; + } + if (PyObject_SetAttr(__pyx_m, __pyx_n_s_RawResponseMessage_2, (PyObject *)&__pyx_type_7aiohttp_12_http_parser_RawResponseMessage) < 0) __PYX_ERR(0, 210, __pyx_L1_error) + if (__Pyx_setup_reduce((PyObject*)&__pyx_type_7aiohttp_12_http_parser_RawResponseMessage) < 0) __PYX_ERR(0, 210, __pyx_L1_error) + __pyx_ptype_7aiohttp_12_http_parser_RawResponseMessage = &__pyx_type_7aiohttp_12_http_parser_RawResponseMessage; + __pyx_vtabptr_7aiohttp_12_http_parser_HttpParser = &__pyx_vtable_7aiohttp_12_http_parser_HttpParser; + __pyx_vtable_7aiohttp_12_http_parser_HttpParser._init = (PyObject *(*)(struct __pyx_obj_7aiohttp_12_http_parser_HttpParser *, enum llhttp_type, PyObject *, PyObject *, int, struct __pyx_opt_args_7aiohttp_12_http_parser_10HttpParser__init *__pyx_optional_args))__pyx_f_7aiohttp_12_http_parser_10HttpParser__init; + __pyx_vtable_7aiohttp_12_http_parser_HttpParser._process_header = (PyObject *(*)(struct __pyx_obj_7aiohttp_12_http_parser_HttpParser *))__pyx_f_7aiohttp_12_http_parser_10HttpParser__process_header; + __pyx_vtable_7aiohttp_12_http_parser_HttpParser._on_header_field = (PyObject *(*)(struct __pyx_obj_7aiohttp_12_http_parser_HttpParser *, char *, size_t))__pyx_f_7aiohttp_12_http_parser_10HttpParser__on_header_field; + __pyx_vtable_7aiohttp_12_http_parser_HttpParser._on_header_value = (PyObject *(*)(struct __pyx_obj_7aiohttp_12_http_parser_HttpParser *, char *, size_t))__pyx_f_7aiohttp_12_http_parser_10HttpParser__on_header_value; + __pyx_vtable_7aiohttp_12_http_parser_HttpParser._on_headers_complete = (PyObject *(*)(struct __pyx_obj_7aiohttp_12_http_parser_HttpParser *))__pyx_f_7aiohttp_12_http_parser_10HttpParser__on_headers_complete; + __pyx_vtable_7aiohttp_12_http_parser_HttpParser._on_message_complete = (PyObject *(*)(struct __pyx_obj_7aiohttp_12_http_parser_HttpParser *))__pyx_f_7aiohttp_12_http_parser_10HttpParser__on_message_complete; + __pyx_vtable_7aiohttp_12_http_parser_HttpParser._on_chunk_header = (PyObject *(*)(struct __pyx_obj_7aiohttp_12_http_parser_HttpParser *))__pyx_f_7aiohttp_12_http_parser_10HttpParser__on_chunk_header; + __pyx_vtable_7aiohttp_12_http_parser_HttpParser._on_chunk_complete = (PyObject *(*)(struct __pyx_obj_7aiohttp_12_http_parser_HttpParser *))__pyx_f_7aiohttp_12_http_parser_10HttpParser__on_chunk_complete; + __pyx_vtable_7aiohttp_12_http_parser_HttpParser._on_status_complete = (PyObject *(*)(struct __pyx_obj_7aiohttp_12_http_parser_HttpParser *))__pyx_f_7aiohttp_12_http_parser_10HttpParser__on_status_complete; + __pyx_vtable_7aiohttp_12_http_parser_HttpParser.http_version = (PyObject *(*)(struct __pyx_obj_7aiohttp_12_http_parser_HttpParser *))__pyx_f_7aiohttp_12_http_parser_10HttpParser_http_version; + if (PyType_Ready(&__pyx_type_7aiohttp_12_http_parser_HttpParser) < 0) __PYX_ERR(0, 272, __pyx_L1_error) + #if PY_VERSION_HEX < 0x030800B1 + __pyx_type_7aiohttp_12_http_parser_HttpParser.tp_print = 0; + #endif + if ((CYTHON_USE_TYPE_SLOTS && CYTHON_USE_PYTYPE_LOOKUP) && likely(!__pyx_type_7aiohttp_12_http_parser_HttpParser.tp_dictoffset && __pyx_type_7aiohttp_12_http_parser_HttpParser.tp_getattro == PyObject_GenericGetAttr)) { + __pyx_type_7aiohttp_12_http_parser_HttpParser.tp_getattro = __Pyx_PyObject_GenericGetAttr; + } + if (__Pyx_SetVtable(__pyx_type_7aiohttp_12_http_parser_HttpParser.tp_dict, __pyx_vtabptr_7aiohttp_12_http_parser_HttpParser) < 0) __PYX_ERR(0, 272, __pyx_L1_error) + if (__Pyx_setup_reduce((PyObject*)&__pyx_type_7aiohttp_12_http_parser_HttpParser) < 0) __PYX_ERR(0, 272, __pyx_L1_error) + __pyx_ptype_7aiohttp_12_http_parser_HttpParser = &__pyx_type_7aiohttp_12_http_parser_HttpParser; + __pyx_vtabptr_7aiohttp_12_http_parser_HttpRequestParser = &__pyx_vtable_7aiohttp_12_http_parser_HttpRequestParser; + __pyx_vtable_7aiohttp_12_http_parser_HttpRequestParser.__pyx_base = *__pyx_vtabptr_7aiohttp_12_http_parser_HttpParser; + __pyx_vtable_7aiohttp_12_http_parser_HttpRequestParser.__pyx_base._on_status_complete = (PyObject *(*)(struct __pyx_obj_7aiohttp_12_http_parser_HttpParser *))__pyx_f_7aiohttp_12_http_parser_17HttpRequestParser__on_status_complete; + __pyx_type_7aiohttp_12_http_parser_HttpRequestParser.tp_base = __pyx_ptype_7aiohttp_12_http_parser_HttpParser; + if (PyType_Ready(&__pyx_type_7aiohttp_12_http_parser_HttpRequestParser) < 0) __PYX_ERR(0, 568, __pyx_L1_error) + #if PY_VERSION_HEX < 0x030800B1 + __pyx_type_7aiohttp_12_http_parser_HttpRequestParser.tp_print = 0; + #endif + if ((CYTHON_USE_TYPE_SLOTS && CYTHON_USE_PYTYPE_LOOKUP) && likely(!__pyx_type_7aiohttp_12_http_parser_HttpRequestParser.tp_dictoffset && __pyx_type_7aiohttp_12_http_parser_HttpRequestParser.tp_getattro == PyObject_GenericGetAttr)) { + __pyx_type_7aiohttp_12_http_parser_HttpRequestParser.tp_getattro = __Pyx_PyObject_GenericGetAttr; + } + if (__Pyx_SetVtable(__pyx_type_7aiohttp_12_http_parser_HttpRequestParser.tp_dict, __pyx_vtabptr_7aiohttp_12_http_parser_HttpRequestParser) < 0) __PYX_ERR(0, 568, __pyx_L1_error) + if (PyObject_SetAttr(__pyx_m, __pyx_n_s_HttpRequestParser, (PyObject *)&__pyx_type_7aiohttp_12_http_parser_HttpRequestParser) < 0) __PYX_ERR(0, 568, __pyx_L1_error) + if (__Pyx_setup_reduce((PyObject*)&__pyx_type_7aiohttp_12_http_parser_HttpRequestParser) < 0) __PYX_ERR(0, 568, __pyx_L1_error) + __pyx_ptype_7aiohttp_12_http_parser_HttpRequestParser = &__pyx_type_7aiohttp_12_http_parser_HttpRequestParser; + __pyx_vtabptr_7aiohttp_12_http_parser_HttpResponseParser = &__pyx_vtable_7aiohttp_12_http_parser_HttpResponseParser; + __pyx_vtable_7aiohttp_12_http_parser_HttpResponseParser.__pyx_base = *__pyx_vtabptr_7aiohttp_12_http_parser_HttpParser; + __pyx_vtable_7aiohttp_12_http_parser_HttpResponseParser.__pyx_base._on_status_complete = (PyObject *(*)(struct __pyx_obj_7aiohttp_12_http_parser_HttpParser *))__pyx_f_7aiohttp_12_http_parser_18HttpResponseParser__on_status_complete; + __pyx_type_7aiohttp_12_http_parser_HttpResponseParser.tp_base = __pyx_ptype_7aiohttp_12_http_parser_HttpParser; + if (PyType_Ready(&__pyx_type_7aiohttp_12_http_parser_HttpResponseParser) < 0) __PYX_ERR(0, 621, __pyx_L1_error) + #if PY_VERSION_HEX < 0x030800B1 + __pyx_type_7aiohttp_12_http_parser_HttpResponseParser.tp_print = 0; + #endif + if ((CYTHON_USE_TYPE_SLOTS && CYTHON_USE_PYTYPE_LOOKUP) && likely(!__pyx_type_7aiohttp_12_http_parser_HttpResponseParser.tp_dictoffset && __pyx_type_7aiohttp_12_http_parser_HttpResponseParser.tp_getattro == PyObject_GenericGetAttr)) { + __pyx_type_7aiohttp_12_http_parser_HttpResponseParser.tp_getattro = __Pyx_PyObject_GenericGetAttr; + } + if (__Pyx_SetVtable(__pyx_type_7aiohttp_12_http_parser_HttpResponseParser.tp_dict, __pyx_vtabptr_7aiohttp_12_http_parser_HttpResponseParser) < 0) __PYX_ERR(0, 621, __pyx_L1_error) + if (PyObject_SetAttr(__pyx_m, __pyx_n_s_HttpResponseParser, (PyObject *)&__pyx_type_7aiohttp_12_http_parser_HttpResponseParser) < 0) __PYX_ERR(0, 621, __pyx_L1_error) + if (__Pyx_setup_reduce((PyObject*)&__pyx_type_7aiohttp_12_http_parser_HttpResponseParser) < 0) __PYX_ERR(0, 621, __pyx_L1_error) + __pyx_ptype_7aiohttp_12_http_parser_HttpResponseParser = &__pyx_type_7aiohttp_12_http_parser_HttpResponseParser; + if (PyType_Ready(&__pyx_type_7aiohttp_12_http_parser___pyx_scope_struct____repr__) < 0) __PYX_ERR(0, 135, __pyx_L1_error) + #if PY_VERSION_HEX < 0x030800B1 + __pyx_type_7aiohttp_12_http_parser___pyx_scope_struct____repr__.tp_print = 0; + #endif + if ((CYTHON_USE_TYPE_SLOTS && CYTHON_USE_PYTYPE_LOOKUP) && likely(!__pyx_type_7aiohttp_12_http_parser___pyx_scope_struct____repr__.tp_dictoffset && __pyx_type_7aiohttp_12_http_parser___pyx_scope_struct____repr__.tp_getattro == PyObject_GenericGetAttr)) { + __pyx_type_7aiohttp_12_http_parser___pyx_scope_struct____repr__.tp_getattro = __Pyx_PyObject_GenericGetAttrNoDict; + } + __pyx_ptype_7aiohttp_12_http_parser___pyx_scope_struct____repr__ = &__pyx_type_7aiohttp_12_http_parser___pyx_scope_struct____repr__; + if (PyType_Ready(&__pyx_type_7aiohttp_12_http_parser___pyx_scope_struct_1_genexpr) < 0) __PYX_ERR(0, 147, __pyx_L1_error) + #if PY_VERSION_HEX < 0x030800B1 + __pyx_type_7aiohttp_12_http_parser___pyx_scope_struct_1_genexpr.tp_print = 0; + #endif + if ((CYTHON_USE_TYPE_SLOTS && CYTHON_USE_PYTYPE_LOOKUP) && likely(!__pyx_type_7aiohttp_12_http_parser___pyx_scope_struct_1_genexpr.tp_dictoffset && __pyx_type_7aiohttp_12_http_parser___pyx_scope_struct_1_genexpr.tp_getattro == PyObject_GenericGetAttr)) { + __pyx_type_7aiohttp_12_http_parser___pyx_scope_struct_1_genexpr.tp_getattro = __Pyx_PyObject_GenericGetAttrNoDict; + } + __pyx_ptype_7aiohttp_12_http_parser___pyx_scope_struct_1_genexpr = &__pyx_type_7aiohttp_12_http_parser___pyx_scope_struct_1_genexpr; + if (PyType_Ready(&__pyx_type_7aiohttp_12_http_parser___pyx_scope_struct_2___repr__) < 0) __PYX_ERR(0, 233, __pyx_L1_error) + #if PY_VERSION_HEX < 0x030800B1 + __pyx_type_7aiohttp_12_http_parser___pyx_scope_struct_2___repr__.tp_print = 0; + #endif + if ((CYTHON_USE_TYPE_SLOTS && CYTHON_USE_PYTYPE_LOOKUP) && likely(!__pyx_type_7aiohttp_12_http_parser___pyx_scope_struct_2___repr__.tp_dictoffset && __pyx_type_7aiohttp_12_http_parser___pyx_scope_struct_2___repr__.tp_getattro == PyObject_GenericGetAttr)) { + __pyx_type_7aiohttp_12_http_parser___pyx_scope_struct_2___repr__.tp_getattro = __Pyx_PyObject_GenericGetAttrNoDict; + } + __pyx_ptype_7aiohttp_12_http_parser___pyx_scope_struct_2___repr__ = &__pyx_type_7aiohttp_12_http_parser___pyx_scope_struct_2___repr__; + if (PyType_Ready(&__pyx_type_7aiohttp_12_http_parser___pyx_scope_struct_3_genexpr) < 0) __PYX_ERR(0, 244, __pyx_L1_error) + #if PY_VERSION_HEX < 0x030800B1 + __pyx_type_7aiohttp_12_http_parser___pyx_scope_struct_3_genexpr.tp_print = 0; + #endif + if ((CYTHON_USE_TYPE_SLOTS && CYTHON_USE_PYTYPE_LOOKUP) && likely(!__pyx_type_7aiohttp_12_http_parser___pyx_scope_struct_3_genexpr.tp_dictoffset && __pyx_type_7aiohttp_12_http_parser___pyx_scope_struct_3_genexpr.tp_getattro == PyObject_GenericGetAttr)) { + __pyx_type_7aiohttp_12_http_parser___pyx_scope_struct_3_genexpr.tp_getattro = __Pyx_PyObject_GenericGetAttrNoDict; + } + __pyx_ptype_7aiohttp_12_http_parser___pyx_scope_struct_3_genexpr = &__pyx_type_7aiohttp_12_http_parser___pyx_scope_struct_3_genexpr; + __Pyx_RefNannyFinishContext(); + return 0; + __pyx_L1_error:; + __Pyx_RefNannyFinishContext(); + return -1; +} + +static int __Pyx_modinit_type_import_code(void) { + __Pyx_RefNannyDeclarations + PyObject *__pyx_t_1 = NULL; + int __pyx_lineno = 0; + const char *__pyx_filename = NULL; + int __pyx_clineno = 0; + __Pyx_RefNannySetupContext("__Pyx_modinit_type_import_code", 0); + /*--- Type import code ---*/ + __pyx_t_1 = PyImport_ImportModule(__Pyx_BUILTIN_MODULE_NAME); if (unlikely(!__pyx_t_1)) __PYX_ERR(2, 9, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __pyx_ptype_7cpython_4type_type = __Pyx_ImportType(__pyx_t_1, __Pyx_BUILTIN_MODULE_NAME, "type", + #if defined(PYPY_VERSION_NUM) && PYPY_VERSION_NUM < 0x050B0000 + sizeof(PyTypeObject), + #else + sizeof(PyHeapTypeObject), + #endif + __Pyx_ImportType_CheckSize_Warn); + if (!__pyx_ptype_7cpython_4type_type) __PYX_ERR(2, 9, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + __pyx_t_1 = PyImport_ImportModule(__Pyx_BUILTIN_MODULE_NAME); if (unlikely(!__pyx_t_1)) __PYX_ERR(3, 8, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __pyx_ptype_7cpython_4bool_bool = __Pyx_ImportType(__pyx_t_1, __Pyx_BUILTIN_MODULE_NAME, "bool", sizeof(PyBoolObject), __Pyx_ImportType_CheckSize_Warn); + if (!__pyx_ptype_7cpython_4bool_bool) __PYX_ERR(3, 8, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + __pyx_t_1 = PyImport_ImportModule(__Pyx_BUILTIN_MODULE_NAME); if (unlikely(!__pyx_t_1)) __PYX_ERR(4, 15, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __pyx_ptype_7cpython_7complex_complex = __Pyx_ImportType(__pyx_t_1, __Pyx_BUILTIN_MODULE_NAME, "complex", sizeof(PyComplexObject), __Pyx_ImportType_CheckSize_Warn); + if (!__pyx_ptype_7cpython_7complex_complex) __PYX_ERR(4, 15, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + __Pyx_RefNannyFinishContext(); + return 0; + __pyx_L1_error:; + __Pyx_XDECREF(__pyx_t_1); + __Pyx_RefNannyFinishContext(); + return -1; +} + +static int __Pyx_modinit_variable_import_code(void) { + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("__Pyx_modinit_variable_import_code", 0); + /*--- Variable import code ---*/ + __Pyx_RefNannyFinishContext(); + return 0; +} + +static int __Pyx_modinit_function_import_code(void) { + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("__Pyx_modinit_function_import_code", 0); + /*--- Function import code ---*/ + __Pyx_RefNannyFinishContext(); + return 0; +} + + +#ifndef CYTHON_NO_PYINIT_EXPORT +#define __Pyx_PyMODINIT_FUNC PyMODINIT_FUNC +#elif PY_MAJOR_VERSION < 3 +#ifdef __cplusplus +#define __Pyx_PyMODINIT_FUNC extern "C" void +#else +#define __Pyx_PyMODINIT_FUNC void +#endif +#else +#ifdef __cplusplus +#define __Pyx_PyMODINIT_FUNC extern "C" PyObject * +#else +#define __Pyx_PyMODINIT_FUNC PyObject * +#endif +#endif + + +#if PY_MAJOR_VERSION < 3 +__Pyx_PyMODINIT_FUNC init_http_parser(void) CYTHON_SMALL_CODE; /*proto*/ +__Pyx_PyMODINIT_FUNC init_http_parser(void) +#else +__Pyx_PyMODINIT_FUNC PyInit__http_parser(void) CYTHON_SMALL_CODE; /*proto*/ +__Pyx_PyMODINIT_FUNC PyInit__http_parser(void) +#if CYTHON_PEP489_MULTI_PHASE_INIT +{ + return PyModuleDef_Init(&__pyx_moduledef); +} +static CYTHON_SMALL_CODE int __Pyx_check_single_interpreter(void) { + #if PY_VERSION_HEX >= 0x030700A1 + static PY_INT64_T main_interpreter_id = -1; + PY_INT64_T current_id = PyInterpreterState_GetID(PyThreadState_Get()->interp); + if (main_interpreter_id == -1) { + main_interpreter_id = current_id; + return (unlikely(current_id == -1)) ? -1 : 0; + } else if (unlikely(main_interpreter_id != current_id)) + #else + static PyInterpreterState *main_interpreter = NULL; + PyInterpreterState *current_interpreter = PyThreadState_Get()->interp; + if (!main_interpreter) { + main_interpreter = current_interpreter; + } else if (unlikely(main_interpreter != current_interpreter)) + #endif + { + PyErr_SetString( + PyExc_ImportError, + "Interpreter change detected - this module can only be loaded into one interpreter per process."); + return -1; + } + return 0; +} +static CYTHON_SMALL_CODE int __Pyx_copy_spec_to_module(PyObject *spec, PyObject *moddict, const char* from_name, const char* to_name, int allow_none) { + PyObject *value = PyObject_GetAttrString(spec, from_name); + int result = 0; + if (likely(value)) { + if (allow_none || value != Py_None) { + result = PyDict_SetItemString(moddict, to_name, value); + } + Py_DECREF(value); + } else if (PyErr_ExceptionMatches(PyExc_AttributeError)) { + PyErr_Clear(); + } else { + result = -1; + } + return result; +} +static CYTHON_SMALL_CODE PyObject* __pyx_pymod_create(PyObject *spec, CYTHON_UNUSED PyModuleDef *def) { + PyObject *module = NULL, *moddict, *modname; + if (__Pyx_check_single_interpreter()) + return NULL; + if (__pyx_m) + return __Pyx_NewRef(__pyx_m); + modname = PyObject_GetAttrString(spec, "name"); + if (unlikely(!modname)) goto bad; + module = PyModule_NewObject(modname); + Py_DECREF(modname); + if (unlikely(!module)) goto bad; + moddict = PyModule_GetDict(module); + if (unlikely(!moddict)) goto bad; + if (unlikely(__Pyx_copy_spec_to_module(spec, moddict, "loader", "__loader__", 1) < 0)) goto bad; + if (unlikely(__Pyx_copy_spec_to_module(spec, moddict, "origin", "__file__", 1) < 0)) goto bad; + if (unlikely(__Pyx_copy_spec_to_module(spec, moddict, "parent", "__package__", 1) < 0)) goto bad; + if (unlikely(__Pyx_copy_spec_to_module(spec, moddict, "submodule_search_locations", "__path__", 0) < 0)) goto bad; + return module; +bad: + Py_XDECREF(module); + return NULL; +} + + +static CYTHON_SMALL_CODE int __pyx_pymod_exec__http_parser(PyObject *__pyx_pyinit_module) +#endif +#endif +{ + PyObject *__pyx_t_1 = NULL; + PyObject *__pyx_t_2 = NULL; + PyObject *__pyx_t_3 = NULL; + PyObject *__pyx_t_4 = NULL; + PyObject *__pyx_t_5 = NULL; + PyObject *__pyx_t_6 = NULL; + PyObject *__pyx_t_7 = NULL; + PyObject *__pyx_t_8 = NULL; + PyObject *__pyx_t_9 = NULL; + PyObject *__pyx_t_10 = NULL; + PyObject *__pyx_t_11 = NULL; + PyObject *__pyx_t_12 = NULL; + PyObject *__pyx_t_13 = NULL; + PyObject *__pyx_t_14 = NULL; + PyObject *__pyx_t_15 = NULL; + PyObject *__pyx_t_16 = NULL; + PyObject *__pyx_t_17 = NULL; + PyObject *__pyx_t_18 = NULL; + PyObject *__pyx_t_19 = NULL; + PyObject *__pyx_t_20 = NULL; + PyObject *__pyx_t_21 = NULL; + PyObject *__pyx_t_22 = NULL; + PyObject *__pyx_t_23 = NULL; + PyObject *__pyx_t_24 = NULL; + PyObject *__pyx_t_25 = NULL; + PyObject *__pyx_t_26 = NULL; + PyObject *__pyx_t_27 = NULL; + PyObject *__pyx_t_28 = NULL; + PyObject *__pyx_t_29 = NULL; + PyObject *__pyx_t_30 = NULL; + PyObject *__pyx_t_31 = NULL; + PyObject *__pyx_t_32 = NULL; + PyObject *__pyx_t_33 = NULL; + PyObject *__pyx_t_34 = NULL; + PyObject *__pyx_t_35 = NULL; + PyObject *__pyx_t_36 = NULL; + PyObject *__pyx_t_37 = NULL; + PyObject *__pyx_t_38 = NULL; + PyObject *__pyx_t_39 = NULL; + PyObject *__pyx_t_40 = NULL; + PyObject *__pyx_t_41 = NULL; + PyObject *__pyx_t_42 = NULL; + PyObject *__pyx_t_43 = NULL; + PyObject *__pyx_t_44 = NULL; + PyObject *__pyx_t_45 = NULL; + PyObject *__pyx_t_46 = NULL; + PyObject *__pyx_t_47 = NULL; + PyObject *__pyx_t_48 = NULL; + PyObject *__pyx_t_49 = NULL; + PyObject *__pyx_t_50 = NULL; + PyObject *__pyx_t_51 = NULL; + PyObject *__pyx_t_52 = NULL; + PyObject *__pyx_t_53 = NULL; + PyObject *__pyx_t_54 = NULL; + PyObject *__pyx_t_55 = NULL; + PyObject *__pyx_t_56 = NULL; + PyObject *__pyx_t_57 = NULL; + PyObject *__pyx_t_58 = NULL; + PyObject *__pyx_t_59 = NULL; + PyObject *__pyx_t_60 = NULL; + PyObject *__pyx_t_61 = NULL; + PyObject *__pyx_t_62 = NULL; + PyObject *__pyx_t_63 = NULL; + PyObject *__pyx_t_64 = NULL; + PyObject *__pyx_t_65 = NULL; + PyObject *__pyx_t_66 = NULL; + PyObject *__pyx_t_67 = NULL; + PyObject *__pyx_t_68 = NULL; + PyObject *__pyx_t_69 = NULL; + PyObject *__pyx_t_70 = NULL; + PyObject *__pyx_t_71 = NULL; + PyObject *__pyx_t_72 = NULL; + PyObject *__pyx_t_73 = NULL; + PyObject *__pyx_t_74 = NULL; + PyObject *__pyx_t_75 = NULL; + PyObject *__pyx_t_76 = NULL; + PyObject *__pyx_t_77 = NULL; + PyObject *__pyx_t_78 = NULL; + long __pyx_t_79; + llhttp_method_t __pyx_t_80; + char const *__pyx_t_81; + int __pyx_t_82; + int __pyx_lineno = 0; + const char *__pyx_filename = NULL; + int __pyx_clineno = 0; + __Pyx_RefNannyDeclarations + #if CYTHON_PEP489_MULTI_PHASE_INIT + if (__pyx_m) { + if (__pyx_m == __pyx_pyinit_module) return 0; + PyErr_SetString(PyExc_RuntimeError, "Module '_http_parser' has already been imported. Re-initialisation is not supported."); + return -1; + } + #elif PY_MAJOR_VERSION >= 3 + if (__pyx_m) return __Pyx_NewRef(__pyx_m); + #endif + #if CYTHON_REFNANNY +__Pyx_RefNanny = __Pyx_RefNannyImportAPI("refnanny"); +if (!__Pyx_RefNanny) { + PyErr_Clear(); + __Pyx_RefNanny = __Pyx_RefNannyImportAPI("Cython.Runtime.refnanny"); + if (!__Pyx_RefNanny) + Py_FatalError("failed to import 'refnanny' module"); +} +#endif + __Pyx_RefNannySetupContext("__Pyx_PyMODINIT_FUNC PyInit__http_parser(void)", 0); + if (__Pyx_check_binary_version() < 0) __PYX_ERR(0, 1, __pyx_L1_error) + #ifdef __Pxy_PyFrame_Initialize_Offsets + __Pxy_PyFrame_Initialize_Offsets(); + #endif + __pyx_empty_tuple = PyTuple_New(0); if (unlikely(!__pyx_empty_tuple)) __PYX_ERR(0, 1, __pyx_L1_error) + __pyx_empty_bytes = PyBytes_FromStringAndSize("", 0); if (unlikely(!__pyx_empty_bytes)) __PYX_ERR(0, 1, __pyx_L1_error) + __pyx_empty_unicode = PyUnicode_FromStringAndSize("", 0); if (unlikely(!__pyx_empty_unicode)) __PYX_ERR(0, 1, __pyx_L1_error) + #ifdef __Pyx_CyFunction_USED + if (__pyx_CyFunction_init() < 0) __PYX_ERR(0, 1, __pyx_L1_error) + #endif + #ifdef __Pyx_FusedFunction_USED + if (__pyx_FusedFunction_init() < 0) __PYX_ERR(0, 1, __pyx_L1_error) + #endif + #ifdef __Pyx_Coroutine_USED + if (__pyx_Coroutine_init() < 0) __PYX_ERR(0, 1, __pyx_L1_error) + #endif + #ifdef __Pyx_Generator_USED + if (__pyx_Generator_init() < 0) __PYX_ERR(0, 1, __pyx_L1_error) + #endif + #ifdef __Pyx_AsyncGen_USED + if (__pyx_AsyncGen_init() < 0) __PYX_ERR(0, 1, __pyx_L1_error) + #endif + #ifdef __Pyx_StopAsyncIteration_USED + if (__pyx_StopAsyncIteration_init() < 0) __PYX_ERR(0, 1, __pyx_L1_error) + #endif + /*--- Library function declarations ---*/ + /*--- Threads initialization code ---*/ + #if defined(WITH_THREAD) && PY_VERSION_HEX < 0x030700F0 && defined(__PYX_FORCE_INIT_THREADS) && __PYX_FORCE_INIT_THREADS + PyEval_InitThreads(); + #endif + /*--- Module creation code ---*/ + #if CYTHON_PEP489_MULTI_PHASE_INIT + __pyx_m = __pyx_pyinit_module; + Py_INCREF(__pyx_m); + #else + #if PY_MAJOR_VERSION < 3 + __pyx_m = Py_InitModule4("_http_parser", __pyx_methods, 0, 0, PYTHON_API_VERSION); Py_XINCREF(__pyx_m); + #else + __pyx_m = PyModule_Create(&__pyx_moduledef); + #endif + if (unlikely(!__pyx_m)) __PYX_ERR(0, 1, __pyx_L1_error) + #endif + __pyx_d = PyModule_GetDict(__pyx_m); if (unlikely(!__pyx_d)) __PYX_ERR(0, 1, __pyx_L1_error) + Py_INCREF(__pyx_d); + __pyx_b = PyImport_AddModule(__Pyx_BUILTIN_MODULE_NAME); if (unlikely(!__pyx_b)) __PYX_ERR(0, 1, __pyx_L1_error) + Py_INCREF(__pyx_b); + __pyx_cython_runtime = PyImport_AddModule((char *) "cython_runtime"); if (unlikely(!__pyx_cython_runtime)) __PYX_ERR(0, 1, __pyx_L1_error) + Py_INCREF(__pyx_cython_runtime); + if (PyObject_SetAttrString(__pyx_m, "__builtins__", __pyx_b) < 0) __PYX_ERR(0, 1, __pyx_L1_error); + /*--- Initialize various global constants etc. ---*/ + if (__Pyx_InitGlobals() < 0) __PYX_ERR(0, 1, __pyx_L1_error) + #if PY_MAJOR_VERSION < 3 && (__PYX_DEFAULT_STRING_ENCODING_IS_ASCII || __PYX_DEFAULT_STRING_ENCODING_IS_DEFAULT) + if (__Pyx_init_sys_getdefaultencoding_params() < 0) __PYX_ERR(0, 1, __pyx_L1_error) + #endif + if (__pyx_module_is_main_aiohttp___http_parser) { + if (PyObject_SetAttr(__pyx_m, __pyx_n_s_name, __pyx_n_s_main) < 0) __PYX_ERR(0, 1, __pyx_L1_error) + } + #if PY_MAJOR_VERSION >= 3 + { + PyObject *modules = PyImport_GetModuleDict(); if (unlikely(!modules)) __PYX_ERR(0, 1, __pyx_L1_error) + if (!PyDict_GetItemString(modules, "aiohttp._http_parser")) { + if (unlikely(PyDict_SetItemString(modules, "aiohttp._http_parser", __pyx_m) < 0)) __PYX_ERR(0, 1, __pyx_L1_error) + } + } + #endif + /*--- Builtin init code ---*/ + if (__Pyx_InitCachedBuiltins() < 0) __PYX_ERR(0, 1, __pyx_L1_error) + /*--- Constants init code ---*/ + if (__Pyx_InitCachedConstants() < 0) __PYX_ERR(0, 1, __pyx_L1_error) + /*--- Global type/function init code ---*/ + (void)__Pyx_modinit_global_init_code(); + (void)__Pyx_modinit_variable_export_code(); + (void)__Pyx_modinit_function_export_code(); + if (unlikely(__Pyx_modinit_type_init_code() < 0)) __PYX_ERR(0, 1, __pyx_L1_error) + if (unlikely(__Pyx_modinit_type_import_code() < 0)) __PYX_ERR(0, 1, __pyx_L1_error) + (void)__Pyx_modinit_variable_import_code(); + (void)__Pyx_modinit_function_import_code(); + /*--- Execution code ---*/ + #if defined(__Pyx_Generator_USED) || defined(__Pyx_Coroutine_USED) + if (__Pyx_patch_abc() < 0) __PYX_ERR(0, 1, __pyx_L1_error) + #endif + + /* "aiohttp/_http_parser.pyx":19 + * from libc.string cimport memcpy + * + * from multidict import CIMultiDict as _CIMultiDict, CIMultiDictProxy as _CIMultiDictProxy # <<<<<<<<<<<<<< + * from yarl import URL as _URL + * + */ + __pyx_t_1 = PyList_New(2); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 19, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __Pyx_INCREF(__pyx_n_s_CIMultiDict); + __Pyx_GIVEREF(__pyx_n_s_CIMultiDict); + PyList_SET_ITEM(__pyx_t_1, 0, __pyx_n_s_CIMultiDict); + __Pyx_INCREF(__pyx_n_s_CIMultiDictProxy); + __Pyx_GIVEREF(__pyx_n_s_CIMultiDictProxy); + PyList_SET_ITEM(__pyx_t_1, 1, __pyx_n_s_CIMultiDictProxy); + __pyx_t_2 = __Pyx_Import(__pyx_n_s_multidict, __pyx_t_1, 0); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 19, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_2); + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + __pyx_t_1 = __Pyx_ImportFrom(__pyx_t_2, __pyx_n_s_CIMultiDict); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 19, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + if (PyDict_SetItem(__pyx_d, __pyx_n_s_CIMultiDict_2, __pyx_t_1) < 0) __PYX_ERR(0, 19, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + __pyx_t_1 = __Pyx_ImportFrom(__pyx_t_2, __pyx_n_s_CIMultiDictProxy); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 19, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + if (PyDict_SetItem(__pyx_d, __pyx_n_s_CIMultiDictProxy_2, __pyx_t_1) < 0) __PYX_ERR(0, 19, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; + + /* "aiohttp/_http_parser.pyx":20 + * + * from multidict import CIMultiDict as _CIMultiDict, CIMultiDictProxy as _CIMultiDictProxy + * from yarl import URL as _URL # <<<<<<<<<<<<<< + * + * from aiohttp import hdrs + */ + __pyx_t_2 = PyList_New(1); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 20, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_2); + __Pyx_INCREF(__pyx_n_s_URL); + __Pyx_GIVEREF(__pyx_n_s_URL); + PyList_SET_ITEM(__pyx_t_2, 0, __pyx_n_s_URL); + __pyx_t_1 = __Pyx_Import(__pyx_n_s_yarl, __pyx_t_2, 0); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 20, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; + __pyx_t_2 = __Pyx_ImportFrom(__pyx_t_1, __pyx_n_s_URL); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 20, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_2); + if (PyDict_SetItem(__pyx_d, __pyx_n_s_URL_2, __pyx_t_2) < 0) __PYX_ERR(0, 20, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + + /* "aiohttp/_http_parser.pyx":22 + * from yarl import URL as _URL + * + * from aiohttp import hdrs # <<<<<<<<<<<<<< + * + * from .http_exceptions import ( + */ + __pyx_t_1 = PyList_New(1); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 22, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __Pyx_INCREF(__pyx_n_s_hdrs); + __Pyx_GIVEREF(__pyx_n_s_hdrs); + PyList_SET_ITEM(__pyx_t_1, 0, __pyx_n_s_hdrs); + __pyx_t_2 = __Pyx_Import(__pyx_n_s_aiohttp, __pyx_t_1, 0); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 22, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_2); + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + __pyx_t_1 = __Pyx_ImportFrom(__pyx_t_2, __pyx_n_s_hdrs); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 22, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + if (PyDict_SetItem(__pyx_d, __pyx_n_s_hdrs, __pyx_t_1) < 0) __PYX_ERR(0, 22, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; + + /* "aiohttp/_http_parser.pyx":25 + * + * from .http_exceptions import ( + * BadHttpMessage, # <<<<<<<<<<<<<< + * BadStatusLine, + * ContentLengthError, + */ + __pyx_t_2 = PyList_New(8); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 25, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_2); + __Pyx_INCREF(__pyx_n_s_BadHttpMessage); + __Pyx_GIVEREF(__pyx_n_s_BadHttpMessage); + PyList_SET_ITEM(__pyx_t_2, 0, __pyx_n_s_BadHttpMessage); + __Pyx_INCREF(__pyx_n_s_BadStatusLine); + __Pyx_GIVEREF(__pyx_n_s_BadStatusLine); + PyList_SET_ITEM(__pyx_t_2, 1, __pyx_n_s_BadStatusLine); + __Pyx_INCREF(__pyx_n_s_ContentLengthError); + __Pyx_GIVEREF(__pyx_n_s_ContentLengthError); + PyList_SET_ITEM(__pyx_t_2, 2, __pyx_n_s_ContentLengthError); + __Pyx_INCREF(__pyx_n_s_InvalidHeader); + __Pyx_GIVEREF(__pyx_n_s_InvalidHeader); + PyList_SET_ITEM(__pyx_t_2, 3, __pyx_n_s_InvalidHeader); + __Pyx_INCREF(__pyx_n_s_InvalidURLError); + __Pyx_GIVEREF(__pyx_n_s_InvalidURLError); + PyList_SET_ITEM(__pyx_t_2, 4, __pyx_n_s_InvalidURLError); + __Pyx_INCREF(__pyx_n_s_LineTooLong); + __Pyx_GIVEREF(__pyx_n_s_LineTooLong); + PyList_SET_ITEM(__pyx_t_2, 5, __pyx_n_s_LineTooLong); + __Pyx_INCREF(__pyx_n_s_PayloadEncodingError); + __Pyx_GIVEREF(__pyx_n_s_PayloadEncodingError); + PyList_SET_ITEM(__pyx_t_2, 6, __pyx_n_s_PayloadEncodingError); + __Pyx_INCREF(__pyx_n_s_TransferEncodingError); + __Pyx_GIVEREF(__pyx_n_s_TransferEncodingError); + PyList_SET_ITEM(__pyx_t_2, 7, __pyx_n_s_TransferEncodingError); + + /* "aiohttp/_http_parser.pyx":24 + * from aiohttp import hdrs + * + * from .http_exceptions import ( # <<<<<<<<<<<<<< + * BadHttpMessage, + * BadStatusLine, + */ + __pyx_t_1 = __Pyx_Import(__pyx_n_s_http_exceptions, __pyx_t_2, 1); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 24, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; + __pyx_t_2 = __Pyx_ImportFrom(__pyx_t_1, __pyx_n_s_BadHttpMessage); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 24, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_2); + if (PyDict_SetItem(__pyx_d, __pyx_n_s_BadHttpMessage, __pyx_t_2) < 0) __PYX_ERR(0, 25, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; + __pyx_t_2 = __Pyx_ImportFrom(__pyx_t_1, __pyx_n_s_BadStatusLine); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 24, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_2); + if (PyDict_SetItem(__pyx_d, __pyx_n_s_BadStatusLine, __pyx_t_2) < 0) __PYX_ERR(0, 26, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; + __pyx_t_2 = __Pyx_ImportFrom(__pyx_t_1, __pyx_n_s_ContentLengthError); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 24, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_2); + if (PyDict_SetItem(__pyx_d, __pyx_n_s_ContentLengthError, __pyx_t_2) < 0) __PYX_ERR(0, 27, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; + __pyx_t_2 = __Pyx_ImportFrom(__pyx_t_1, __pyx_n_s_InvalidHeader); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 24, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_2); + if (PyDict_SetItem(__pyx_d, __pyx_n_s_InvalidHeader, __pyx_t_2) < 0) __PYX_ERR(0, 28, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; + __pyx_t_2 = __Pyx_ImportFrom(__pyx_t_1, __pyx_n_s_InvalidURLError); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 24, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_2); + if (PyDict_SetItem(__pyx_d, __pyx_n_s_InvalidURLError, __pyx_t_2) < 0) __PYX_ERR(0, 29, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; + __pyx_t_2 = __Pyx_ImportFrom(__pyx_t_1, __pyx_n_s_LineTooLong); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 24, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_2); + if (PyDict_SetItem(__pyx_d, __pyx_n_s_LineTooLong, __pyx_t_2) < 0) __PYX_ERR(0, 30, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; + __pyx_t_2 = __Pyx_ImportFrom(__pyx_t_1, __pyx_n_s_PayloadEncodingError); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 24, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_2); + if (PyDict_SetItem(__pyx_d, __pyx_n_s_PayloadEncodingError, __pyx_t_2) < 0) __PYX_ERR(0, 31, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; + __pyx_t_2 = __Pyx_ImportFrom(__pyx_t_1, __pyx_n_s_TransferEncodingError); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 24, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_2); + if (PyDict_SetItem(__pyx_d, __pyx_n_s_TransferEncodingError, __pyx_t_2) < 0) __PYX_ERR(0, 32, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + + /* "aiohttp/_http_parser.pyx":34 + * TransferEncodingError, + * ) + * from .http_parser import DeflateBuffer as _DeflateBuffer # <<<<<<<<<<<<<< + * from .http_writer import ( + * HttpVersion as _HttpVersion, + */ + __pyx_t_1 = PyList_New(1); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 34, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __Pyx_INCREF(__pyx_n_s_DeflateBuffer); + __Pyx_GIVEREF(__pyx_n_s_DeflateBuffer); + PyList_SET_ITEM(__pyx_t_1, 0, __pyx_n_s_DeflateBuffer); + __pyx_t_2 = __Pyx_Import(__pyx_n_s_http_parser, __pyx_t_1, 1); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 34, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_2); + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + __pyx_t_1 = __Pyx_ImportFrom(__pyx_t_2, __pyx_n_s_DeflateBuffer); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 34, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + if (PyDict_SetItem(__pyx_d, __pyx_n_s_DeflateBuffer_2, __pyx_t_1) < 0) __PYX_ERR(0, 34, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; + + /* "aiohttp/_http_parser.pyx":36 + * from .http_parser import DeflateBuffer as _DeflateBuffer + * from .http_writer import ( + * HttpVersion as _HttpVersion, # <<<<<<<<<<<<<< + * HttpVersion10 as _HttpVersion10, + * HttpVersion11 as _HttpVersion11, + */ + __pyx_t_2 = PyList_New(3); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 36, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_2); + __Pyx_INCREF(__pyx_n_s_HttpVersion); + __Pyx_GIVEREF(__pyx_n_s_HttpVersion); + PyList_SET_ITEM(__pyx_t_2, 0, __pyx_n_s_HttpVersion); + __Pyx_INCREF(__pyx_n_s_HttpVersion10); + __Pyx_GIVEREF(__pyx_n_s_HttpVersion10); + PyList_SET_ITEM(__pyx_t_2, 1, __pyx_n_s_HttpVersion10); + __Pyx_INCREF(__pyx_n_s_HttpVersion11); + __Pyx_GIVEREF(__pyx_n_s_HttpVersion11); + PyList_SET_ITEM(__pyx_t_2, 2, __pyx_n_s_HttpVersion11); + + /* "aiohttp/_http_parser.pyx":35 + * ) + * from .http_parser import DeflateBuffer as _DeflateBuffer + * from .http_writer import ( # <<<<<<<<<<<<<< + * HttpVersion as _HttpVersion, + * HttpVersion10 as _HttpVersion10, + */ + __pyx_t_1 = __Pyx_Import(__pyx_n_s_http_writer, __pyx_t_2, 1); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 35, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; + __pyx_t_2 = __Pyx_ImportFrom(__pyx_t_1, __pyx_n_s_HttpVersion); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 35, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_2); + if (PyDict_SetItem(__pyx_d, __pyx_n_s_HttpVersion_2, __pyx_t_2) < 0) __PYX_ERR(0, 36, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; + __pyx_t_2 = __Pyx_ImportFrom(__pyx_t_1, __pyx_n_s_HttpVersion10); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 35, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_2); + if (PyDict_SetItem(__pyx_d, __pyx_n_s_HttpVersion10_2, __pyx_t_2) < 0) __PYX_ERR(0, 37, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; + __pyx_t_2 = __Pyx_ImportFrom(__pyx_t_1, __pyx_n_s_HttpVersion11); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 35, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_2); + if (PyDict_SetItem(__pyx_d, __pyx_n_s_HttpVersion11_2, __pyx_t_2) < 0) __PYX_ERR(0, 38, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + + /* "aiohttp/_http_parser.pyx":40 + * HttpVersion11 as _HttpVersion11, + * ) + * from .streams import EMPTY_PAYLOAD as _EMPTY_PAYLOAD, StreamReader as _StreamReader # <<<<<<<<<<<<<< + * + * cimport cython + */ + __pyx_t_1 = PyList_New(2); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 40, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __Pyx_INCREF(__pyx_n_s_EMPTY_PAYLOAD); + __Pyx_GIVEREF(__pyx_n_s_EMPTY_PAYLOAD); + PyList_SET_ITEM(__pyx_t_1, 0, __pyx_n_s_EMPTY_PAYLOAD); + __Pyx_INCREF(__pyx_n_s_StreamReader); + __Pyx_GIVEREF(__pyx_n_s_StreamReader); + PyList_SET_ITEM(__pyx_t_1, 1, __pyx_n_s_StreamReader); + __pyx_t_2 = __Pyx_Import(__pyx_n_s_streams, __pyx_t_1, 1); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 40, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_2); + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + __pyx_t_1 = __Pyx_ImportFrom(__pyx_t_2, __pyx_n_s_EMPTY_PAYLOAD); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 40, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + if (PyDict_SetItem(__pyx_d, __pyx_n_s_EMPTY_PAYLOAD_2, __pyx_t_1) < 0) __PYX_ERR(0, 40, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + __pyx_t_1 = __Pyx_ImportFrom(__pyx_t_2, __pyx_n_s_StreamReader); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 40, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + if (PyDict_SetItem(__pyx_d, __pyx_n_s_StreamReader_2, __pyx_t_1) < 0) __PYX_ERR(0, 40, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; + + /* "aiohttp/_headers.pxi":4 + * # Run ./tools/gen.py to update it after the origin changing. + * + * from . import hdrs # <<<<<<<<<<<<<< + * cdef tuple headers = ( + * hdrs.ACCEPT, + */ + __pyx_t_2 = PyList_New(1); if (unlikely(!__pyx_t_2)) __PYX_ERR(5, 4, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_2); + __Pyx_INCREF(__pyx_n_s_hdrs); + __Pyx_GIVEREF(__pyx_n_s_hdrs); + PyList_SET_ITEM(__pyx_t_2, 0, __pyx_n_s_hdrs); + __pyx_t_1 = __Pyx_Import(__pyx_n_s__4, __pyx_t_2, 1); if (unlikely(!__pyx_t_1)) __PYX_ERR(5, 4, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; + __pyx_t_2 = __Pyx_ImportFrom(__pyx_t_1, __pyx_n_s_hdrs); if (unlikely(!__pyx_t_2)) __PYX_ERR(5, 4, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_2); + if (PyDict_SetItem(__pyx_d, __pyx_n_s_hdrs, __pyx_t_2) < 0) __PYX_ERR(5, 4, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + + /* "aiohttp/_headers.pxi":6 + * from . import hdrs + * cdef tuple headers = ( + * hdrs.ACCEPT, # <<<<<<<<<<<<<< + * hdrs.ACCEPT_CHARSET, + * hdrs.ACCEPT_ENCODING, + */ + __Pyx_GetModuleGlobalName(__pyx_t_1, __pyx_n_s_hdrs); if (unlikely(!__pyx_t_1)) __PYX_ERR(5, 6, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __pyx_t_2 = __Pyx_PyObject_GetAttrStr(__pyx_t_1, __pyx_n_s_ACCEPT); if (unlikely(!__pyx_t_2)) __PYX_ERR(5, 6, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_2); + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + + /* "aiohttp/_headers.pxi":7 + * cdef tuple headers = ( + * hdrs.ACCEPT, + * hdrs.ACCEPT_CHARSET, # <<<<<<<<<<<<<< + * hdrs.ACCEPT_ENCODING, + * hdrs.ACCEPT_LANGUAGE, + */ + __Pyx_GetModuleGlobalName(__pyx_t_1, __pyx_n_s_hdrs); if (unlikely(!__pyx_t_1)) __PYX_ERR(5, 7, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __pyx_t_3 = __Pyx_PyObject_GetAttrStr(__pyx_t_1, __pyx_n_s_ACCEPT_CHARSET); if (unlikely(!__pyx_t_3)) __PYX_ERR(5, 7, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_3); + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + + /* "aiohttp/_headers.pxi":8 + * hdrs.ACCEPT, + * hdrs.ACCEPT_CHARSET, + * hdrs.ACCEPT_ENCODING, # <<<<<<<<<<<<<< + * hdrs.ACCEPT_LANGUAGE, + * hdrs.ACCEPT_RANGES, + */ + __Pyx_GetModuleGlobalName(__pyx_t_1, __pyx_n_s_hdrs); if (unlikely(!__pyx_t_1)) __PYX_ERR(5, 8, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __pyx_t_4 = __Pyx_PyObject_GetAttrStr(__pyx_t_1, __pyx_n_s_ACCEPT_ENCODING); if (unlikely(!__pyx_t_4)) __PYX_ERR(5, 8, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_4); + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + + /* "aiohttp/_headers.pxi":9 + * hdrs.ACCEPT_CHARSET, + * hdrs.ACCEPT_ENCODING, + * hdrs.ACCEPT_LANGUAGE, # <<<<<<<<<<<<<< + * hdrs.ACCEPT_RANGES, + * hdrs.ACCESS_CONTROL_ALLOW_CREDENTIALS, + */ + __Pyx_GetModuleGlobalName(__pyx_t_1, __pyx_n_s_hdrs); if (unlikely(!__pyx_t_1)) __PYX_ERR(5, 9, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __pyx_t_5 = __Pyx_PyObject_GetAttrStr(__pyx_t_1, __pyx_n_s_ACCEPT_LANGUAGE); if (unlikely(!__pyx_t_5)) __PYX_ERR(5, 9, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_5); + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + + /* "aiohttp/_headers.pxi":10 + * hdrs.ACCEPT_ENCODING, + * hdrs.ACCEPT_LANGUAGE, + * hdrs.ACCEPT_RANGES, # <<<<<<<<<<<<<< + * hdrs.ACCESS_CONTROL_ALLOW_CREDENTIALS, + * hdrs.ACCESS_CONTROL_ALLOW_HEADERS, + */ + __Pyx_GetModuleGlobalName(__pyx_t_1, __pyx_n_s_hdrs); if (unlikely(!__pyx_t_1)) __PYX_ERR(5, 10, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __pyx_t_6 = __Pyx_PyObject_GetAttrStr(__pyx_t_1, __pyx_n_s_ACCEPT_RANGES); if (unlikely(!__pyx_t_6)) __PYX_ERR(5, 10, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_6); + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + + /* "aiohttp/_headers.pxi":11 + * hdrs.ACCEPT_LANGUAGE, + * hdrs.ACCEPT_RANGES, + * hdrs.ACCESS_CONTROL_ALLOW_CREDENTIALS, # <<<<<<<<<<<<<< + * hdrs.ACCESS_CONTROL_ALLOW_HEADERS, + * hdrs.ACCESS_CONTROL_ALLOW_METHODS, + */ + __Pyx_GetModuleGlobalName(__pyx_t_1, __pyx_n_s_hdrs); if (unlikely(!__pyx_t_1)) __PYX_ERR(5, 11, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __pyx_t_7 = __Pyx_PyObject_GetAttrStr(__pyx_t_1, __pyx_n_s_ACCESS_CONTROL_ALLOW_CREDENTIALS); if (unlikely(!__pyx_t_7)) __PYX_ERR(5, 11, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_7); + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + + /* "aiohttp/_headers.pxi":12 + * hdrs.ACCEPT_RANGES, + * hdrs.ACCESS_CONTROL_ALLOW_CREDENTIALS, + * hdrs.ACCESS_CONTROL_ALLOW_HEADERS, # <<<<<<<<<<<<<< + * hdrs.ACCESS_CONTROL_ALLOW_METHODS, + * hdrs.ACCESS_CONTROL_ALLOW_ORIGIN, + */ + __Pyx_GetModuleGlobalName(__pyx_t_1, __pyx_n_s_hdrs); if (unlikely(!__pyx_t_1)) __PYX_ERR(5, 12, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __pyx_t_8 = __Pyx_PyObject_GetAttrStr(__pyx_t_1, __pyx_n_s_ACCESS_CONTROL_ALLOW_HEADERS); if (unlikely(!__pyx_t_8)) __PYX_ERR(5, 12, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_8); + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + + /* "aiohttp/_headers.pxi":13 + * hdrs.ACCESS_CONTROL_ALLOW_CREDENTIALS, + * hdrs.ACCESS_CONTROL_ALLOW_HEADERS, + * hdrs.ACCESS_CONTROL_ALLOW_METHODS, # <<<<<<<<<<<<<< + * hdrs.ACCESS_CONTROL_ALLOW_ORIGIN, + * hdrs.ACCESS_CONTROL_EXPOSE_HEADERS, + */ + __Pyx_GetModuleGlobalName(__pyx_t_1, __pyx_n_s_hdrs); if (unlikely(!__pyx_t_1)) __PYX_ERR(5, 13, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __pyx_t_9 = __Pyx_PyObject_GetAttrStr(__pyx_t_1, __pyx_n_s_ACCESS_CONTROL_ALLOW_METHODS); if (unlikely(!__pyx_t_9)) __PYX_ERR(5, 13, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_9); + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + + /* "aiohttp/_headers.pxi":14 + * hdrs.ACCESS_CONTROL_ALLOW_HEADERS, + * hdrs.ACCESS_CONTROL_ALLOW_METHODS, + * hdrs.ACCESS_CONTROL_ALLOW_ORIGIN, # <<<<<<<<<<<<<< + * hdrs.ACCESS_CONTROL_EXPOSE_HEADERS, + * hdrs.ACCESS_CONTROL_MAX_AGE, + */ + __Pyx_GetModuleGlobalName(__pyx_t_1, __pyx_n_s_hdrs); if (unlikely(!__pyx_t_1)) __PYX_ERR(5, 14, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __pyx_t_10 = __Pyx_PyObject_GetAttrStr(__pyx_t_1, __pyx_n_s_ACCESS_CONTROL_ALLOW_ORIGIN); if (unlikely(!__pyx_t_10)) __PYX_ERR(5, 14, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_10); + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + + /* "aiohttp/_headers.pxi":15 + * hdrs.ACCESS_CONTROL_ALLOW_METHODS, + * hdrs.ACCESS_CONTROL_ALLOW_ORIGIN, + * hdrs.ACCESS_CONTROL_EXPOSE_HEADERS, # <<<<<<<<<<<<<< + * hdrs.ACCESS_CONTROL_MAX_AGE, + * hdrs.ACCESS_CONTROL_REQUEST_HEADERS, + */ + __Pyx_GetModuleGlobalName(__pyx_t_1, __pyx_n_s_hdrs); if (unlikely(!__pyx_t_1)) __PYX_ERR(5, 15, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __pyx_t_11 = __Pyx_PyObject_GetAttrStr(__pyx_t_1, __pyx_n_s_ACCESS_CONTROL_EXPOSE_HEADERS); if (unlikely(!__pyx_t_11)) __PYX_ERR(5, 15, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_11); + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + + /* "aiohttp/_headers.pxi":16 + * hdrs.ACCESS_CONTROL_ALLOW_ORIGIN, + * hdrs.ACCESS_CONTROL_EXPOSE_HEADERS, + * hdrs.ACCESS_CONTROL_MAX_AGE, # <<<<<<<<<<<<<< + * hdrs.ACCESS_CONTROL_REQUEST_HEADERS, + * hdrs.ACCESS_CONTROL_REQUEST_METHOD, + */ + __Pyx_GetModuleGlobalName(__pyx_t_1, __pyx_n_s_hdrs); if (unlikely(!__pyx_t_1)) __PYX_ERR(5, 16, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __pyx_t_12 = __Pyx_PyObject_GetAttrStr(__pyx_t_1, __pyx_n_s_ACCESS_CONTROL_MAX_AGE); if (unlikely(!__pyx_t_12)) __PYX_ERR(5, 16, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_12); + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + + /* "aiohttp/_headers.pxi":17 + * hdrs.ACCESS_CONTROL_EXPOSE_HEADERS, + * hdrs.ACCESS_CONTROL_MAX_AGE, + * hdrs.ACCESS_CONTROL_REQUEST_HEADERS, # <<<<<<<<<<<<<< + * hdrs.ACCESS_CONTROL_REQUEST_METHOD, + * hdrs.AGE, + */ + __Pyx_GetModuleGlobalName(__pyx_t_1, __pyx_n_s_hdrs); if (unlikely(!__pyx_t_1)) __PYX_ERR(5, 17, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __pyx_t_13 = __Pyx_PyObject_GetAttrStr(__pyx_t_1, __pyx_n_s_ACCESS_CONTROL_REQUEST_HEADERS); if (unlikely(!__pyx_t_13)) __PYX_ERR(5, 17, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_13); + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + + /* "aiohttp/_headers.pxi":18 + * hdrs.ACCESS_CONTROL_MAX_AGE, + * hdrs.ACCESS_CONTROL_REQUEST_HEADERS, + * hdrs.ACCESS_CONTROL_REQUEST_METHOD, # <<<<<<<<<<<<<< + * hdrs.AGE, + * hdrs.ALLOW, + */ + __Pyx_GetModuleGlobalName(__pyx_t_1, __pyx_n_s_hdrs); if (unlikely(!__pyx_t_1)) __PYX_ERR(5, 18, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __pyx_t_14 = __Pyx_PyObject_GetAttrStr(__pyx_t_1, __pyx_n_s_ACCESS_CONTROL_REQUEST_METHOD); if (unlikely(!__pyx_t_14)) __PYX_ERR(5, 18, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_14); + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + + /* "aiohttp/_headers.pxi":19 + * hdrs.ACCESS_CONTROL_REQUEST_HEADERS, + * hdrs.ACCESS_CONTROL_REQUEST_METHOD, + * hdrs.AGE, # <<<<<<<<<<<<<< + * hdrs.ALLOW, + * hdrs.AUTHORIZATION, + */ + __Pyx_GetModuleGlobalName(__pyx_t_1, __pyx_n_s_hdrs); if (unlikely(!__pyx_t_1)) __PYX_ERR(5, 19, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __pyx_t_15 = __Pyx_PyObject_GetAttrStr(__pyx_t_1, __pyx_n_s_AGE); if (unlikely(!__pyx_t_15)) __PYX_ERR(5, 19, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_15); + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + + /* "aiohttp/_headers.pxi":20 + * hdrs.ACCESS_CONTROL_REQUEST_METHOD, + * hdrs.AGE, + * hdrs.ALLOW, # <<<<<<<<<<<<<< + * hdrs.AUTHORIZATION, + * hdrs.CACHE_CONTROL, + */ + __Pyx_GetModuleGlobalName(__pyx_t_1, __pyx_n_s_hdrs); if (unlikely(!__pyx_t_1)) __PYX_ERR(5, 20, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __pyx_t_16 = __Pyx_PyObject_GetAttrStr(__pyx_t_1, __pyx_n_s_ALLOW); if (unlikely(!__pyx_t_16)) __PYX_ERR(5, 20, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_16); + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + + /* "aiohttp/_headers.pxi":21 + * hdrs.AGE, + * hdrs.ALLOW, + * hdrs.AUTHORIZATION, # <<<<<<<<<<<<<< + * hdrs.CACHE_CONTROL, + * hdrs.CONNECTION, + */ + __Pyx_GetModuleGlobalName(__pyx_t_1, __pyx_n_s_hdrs); if (unlikely(!__pyx_t_1)) __PYX_ERR(5, 21, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __pyx_t_17 = __Pyx_PyObject_GetAttrStr(__pyx_t_1, __pyx_n_s_AUTHORIZATION); if (unlikely(!__pyx_t_17)) __PYX_ERR(5, 21, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_17); + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + + /* "aiohttp/_headers.pxi":22 + * hdrs.ALLOW, + * hdrs.AUTHORIZATION, + * hdrs.CACHE_CONTROL, # <<<<<<<<<<<<<< + * hdrs.CONNECTION, + * hdrs.CONTENT_DISPOSITION, + */ + __Pyx_GetModuleGlobalName(__pyx_t_1, __pyx_n_s_hdrs); if (unlikely(!__pyx_t_1)) __PYX_ERR(5, 22, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __pyx_t_18 = __Pyx_PyObject_GetAttrStr(__pyx_t_1, __pyx_n_s_CACHE_CONTROL); if (unlikely(!__pyx_t_18)) __PYX_ERR(5, 22, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_18); + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + + /* "aiohttp/_headers.pxi":23 + * hdrs.AUTHORIZATION, + * hdrs.CACHE_CONTROL, + * hdrs.CONNECTION, # <<<<<<<<<<<<<< + * hdrs.CONTENT_DISPOSITION, + * hdrs.CONTENT_ENCODING, + */ + __Pyx_GetModuleGlobalName(__pyx_t_1, __pyx_n_s_hdrs); if (unlikely(!__pyx_t_1)) __PYX_ERR(5, 23, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __pyx_t_19 = __Pyx_PyObject_GetAttrStr(__pyx_t_1, __pyx_n_s_CONNECTION); if (unlikely(!__pyx_t_19)) __PYX_ERR(5, 23, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_19); + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + + /* "aiohttp/_headers.pxi":24 + * hdrs.CACHE_CONTROL, + * hdrs.CONNECTION, + * hdrs.CONTENT_DISPOSITION, # <<<<<<<<<<<<<< + * hdrs.CONTENT_ENCODING, + * hdrs.CONTENT_LANGUAGE, + */ + __Pyx_GetModuleGlobalName(__pyx_t_1, __pyx_n_s_hdrs); if (unlikely(!__pyx_t_1)) __PYX_ERR(5, 24, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __pyx_t_20 = __Pyx_PyObject_GetAttrStr(__pyx_t_1, __pyx_n_s_CONTENT_DISPOSITION); if (unlikely(!__pyx_t_20)) __PYX_ERR(5, 24, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_20); + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + + /* "aiohttp/_headers.pxi":25 + * hdrs.CONNECTION, + * hdrs.CONTENT_DISPOSITION, + * hdrs.CONTENT_ENCODING, # <<<<<<<<<<<<<< + * hdrs.CONTENT_LANGUAGE, + * hdrs.CONTENT_LENGTH, + */ + __Pyx_GetModuleGlobalName(__pyx_t_1, __pyx_n_s_hdrs); if (unlikely(!__pyx_t_1)) __PYX_ERR(5, 25, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __pyx_t_21 = __Pyx_PyObject_GetAttrStr(__pyx_t_1, __pyx_n_s_CONTENT_ENCODING); if (unlikely(!__pyx_t_21)) __PYX_ERR(5, 25, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_21); + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + + /* "aiohttp/_headers.pxi":26 + * hdrs.CONTENT_DISPOSITION, + * hdrs.CONTENT_ENCODING, + * hdrs.CONTENT_LANGUAGE, # <<<<<<<<<<<<<< + * hdrs.CONTENT_LENGTH, + * hdrs.CONTENT_LOCATION, + */ + __Pyx_GetModuleGlobalName(__pyx_t_1, __pyx_n_s_hdrs); if (unlikely(!__pyx_t_1)) __PYX_ERR(5, 26, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __pyx_t_22 = __Pyx_PyObject_GetAttrStr(__pyx_t_1, __pyx_n_s_CONTENT_LANGUAGE); if (unlikely(!__pyx_t_22)) __PYX_ERR(5, 26, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_22); + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + + /* "aiohttp/_headers.pxi":27 + * hdrs.CONTENT_ENCODING, + * hdrs.CONTENT_LANGUAGE, + * hdrs.CONTENT_LENGTH, # <<<<<<<<<<<<<< + * hdrs.CONTENT_LOCATION, + * hdrs.CONTENT_MD5, + */ + __Pyx_GetModuleGlobalName(__pyx_t_1, __pyx_n_s_hdrs); if (unlikely(!__pyx_t_1)) __PYX_ERR(5, 27, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __pyx_t_23 = __Pyx_PyObject_GetAttrStr(__pyx_t_1, __pyx_n_s_CONTENT_LENGTH); if (unlikely(!__pyx_t_23)) __PYX_ERR(5, 27, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_23); + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + + /* "aiohttp/_headers.pxi":28 + * hdrs.CONTENT_LANGUAGE, + * hdrs.CONTENT_LENGTH, + * hdrs.CONTENT_LOCATION, # <<<<<<<<<<<<<< + * hdrs.CONTENT_MD5, + * hdrs.CONTENT_RANGE, + */ + __Pyx_GetModuleGlobalName(__pyx_t_1, __pyx_n_s_hdrs); if (unlikely(!__pyx_t_1)) __PYX_ERR(5, 28, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __pyx_t_24 = __Pyx_PyObject_GetAttrStr(__pyx_t_1, __pyx_n_s_CONTENT_LOCATION); if (unlikely(!__pyx_t_24)) __PYX_ERR(5, 28, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_24); + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + + /* "aiohttp/_headers.pxi":29 + * hdrs.CONTENT_LENGTH, + * hdrs.CONTENT_LOCATION, + * hdrs.CONTENT_MD5, # <<<<<<<<<<<<<< + * hdrs.CONTENT_RANGE, + * hdrs.CONTENT_TRANSFER_ENCODING, + */ + __Pyx_GetModuleGlobalName(__pyx_t_1, __pyx_n_s_hdrs); if (unlikely(!__pyx_t_1)) __PYX_ERR(5, 29, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __pyx_t_25 = __Pyx_PyObject_GetAttrStr(__pyx_t_1, __pyx_n_s_CONTENT_MD5); if (unlikely(!__pyx_t_25)) __PYX_ERR(5, 29, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_25); + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + + /* "aiohttp/_headers.pxi":30 + * hdrs.CONTENT_LOCATION, + * hdrs.CONTENT_MD5, + * hdrs.CONTENT_RANGE, # <<<<<<<<<<<<<< + * hdrs.CONTENT_TRANSFER_ENCODING, + * hdrs.CONTENT_TYPE, + */ + __Pyx_GetModuleGlobalName(__pyx_t_1, __pyx_n_s_hdrs); if (unlikely(!__pyx_t_1)) __PYX_ERR(5, 30, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __pyx_t_26 = __Pyx_PyObject_GetAttrStr(__pyx_t_1, __pyx_n_s_CONTENT_RANGE); if (unlikely(!__pyx_t_26)) __PYX_ERR(5, 30, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_26); + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + + /* "aiohttp/_headers.pxi":31 + * hdrs.CONTENT_MD5, + * hdrs.CONTENT_RANGE, + * hdrs.CONTENT_TRANSFER_ENCODING, # <<<<<<<<<<<<<< + * hdrs.CONTENT_TYPE, + * hdrs.COOKIE, + */ + __Pyx_GetModuleGlobalName(__pyx_t_1, __pyx_n_s_hdrs); if (unlikely(!__pyx_t_1)) __PYX_ERR(5, 31, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __pyx_t_27 = __Pyx_PyObject_GetAttrStr(__pyx_t_1, __pyx_n_s_CONTENT_TRANSFER_ENCODING); if (unlikely(!__pyx_t_27)) __PYX_ERR(5, 31, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_27); + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + + /* "aiohttp/_headers.pxi":32 + * hdrs.CONTENT_RANGE, + * hdrs.CONTENT_TRANSFER_ENCODING, + * hdrs.CONTENT_TYPE, # <<<<<<<<<<<<<< + * hdrs.COOKIE, + * hdrs.DATE, + */ + __Pyx_GetModuleGlobalName(__pyx_t_1, __pyx_n_s_hdrs); if (unlikely(!__pyx_t_1)) __PYX_ERR(5, 32, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __pyx_t_28 = __Pyx_PyObject_GetAttrStr(__pyx_t_1, __pyx_n_s_CONTENT_TYPE); if (unlikely(!__pyx_t_28)) __PYX_ERR(5, 32, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_28); + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + + /* "aiohttp/_headers.pxi":33 + * hdrs.CONTENT_TRANSFER_ENCODING, + * hdrs.CONTENT_TYPE, + * hdrs.COOKIE, # <<<<<<<<<<<<<< + * hdrs.DATE, + * hdrs.DESTINATION, + */ + __Pyx_GetModuleGlobalName(__pyx_t_1, __pyx_n_s_hdrs); if (unlikely(!__pyx_t_1)) __PYX_ERR(5, 33, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __pyx_t_29 = __Pyx_PyObject_GetAttrStr(__pyx_t_1, __pyx_n_s_COOKIE); if (unlikely(!__pyx_t_29)) __PYX_ERR(5, 33, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_29); + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + + /* "aiohttp/_headers.pxi":34 + * hdrs.CONTENT_TYPE, + * hdrs.COOKIE, + * hdrs.DATE, # <<<<<<<<<<<<<< + * hdrs.DESTINATION, + * hdrs.DIGEST, + */ + __Pyx_GetModuleGlobalName(__pyx_t_1, __pyx_n_s_hdrs); if (unlikely(!__pyx_t_1)) __PYX_ERR(5, 34, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __pyx_t_30 = __Pyx_PyObject_GetAttrStr(__pyx_t_1, __pyx_n_s_DATE); if (unlikely(!__pyx_t_30)) __PYX_ERR(5, 34, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_30); + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + + /* "aiohttp/_headers.pxi":35 + * hdrs.COOKIE, + * hdrs.DATE, + * hdrs.DESTINATION, # <<<<<<<<<<<<<< + * hdrs.DIGEST, + * hdrs.ETAG, + */ + __Pyx_GetModuleGlobalName(__pyx_t_1, __pyx_n_s_hdrs); if (unlikely(!__pyx_t_1)) __PYX_ERR(5, 35, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __pyx_t_31 = __Pyx_PyObject_GetAttrStr(__pyx_t_1, __pyx_n_s_DESTINATION); if (unlikely(!__pyx_t_31)) __PYX_ERR(5, 35, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_31); + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + + /* "aiohttp/_headers.pxi":36 + * hdrs.DATE, + * hdrs.DESTINATION, + * hdrs.DIGEST, # <<<<<<<<<<<<<< + * hdrs.ETAG, + * hdrs.EXPECT, + */ + __Pyx_GetModuleGlobalName(__pyx_t_1, __pyx_n_s_hdrs); if (unlikely(!__pyx_t_1)) __PYX_ERR(5, 36, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __pyx_t_32 = __Pyx_PyObject_GetAttrStr(__pyx_t_1, __pyx_n_s_DIGEST); if (unlikely(!__pyx_t_32)) __PYX_ERR(5, 36, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_32); + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + + /* "aiohttp/_headers.pxi":37 + * hdrs.DESTINATION, + * hdrs.DIGEST, + * hdrs.ETAG, # <<<<<<<<<<<<<< + * hdrs.EXPECT, + * hdrs.EXPIRES, + */ + __Pyx_GetModuleGlobalName(__pyx_t_1, __pyx_n_s_hdrs); if (unlikely(!__pyx_t_1)) __PYX_ERR(5, 37, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __pyx_t_33 = __Pyx_PyObject_GetAttrStr(__pyx_t_1, __pyx_n_s_ETAG); if (unlikely(!__pyx_t_33)) __PYX_ERR(5, 37, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_33); + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + + /* "aiohttp/_headers.pxi":38 + * hdrs.DIGEST, + * hdrs.ETAG, + * hdrs.EXPECT, # <<<<<<<<<<<<<< + * hdrs.EXPIRES, + * hdrs.FORWARDED, + */ + __Pyx_GetModuleGlobalName(__pyx_t_1, __pyx_n_s_hdrs); if (unlikely(!__pyx_t_1)) __PYX_ERR(5, 38, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __pyx_t_34 = __Pyx_PyObject_GetAttrStr(__pyx_t_1, __pyx_n_s_EXPECT); if (unlikely(!__pyx_t_34)) __PYX_ERR(5, 38, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_34); + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + + /* "aiohttp/_headers.pxi":39 + * hdrs.ETAG, + * hdrs.EXPECT, + * hdrs.EXPIRES, # <<<<<<<<<<<<<< + * hdrs.FORWARDED, + * hdrs.FROM, + */ + __Pyx_GetModuleGlobalName(__pyx_t_1, __pyx_n_s_hdrs); if (unlikely(!__pyx_t_1)) __PYX_ERR(5, 39, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __pyx_t_35 = __Pyx_PyObject_GetAttrStr(__pyx_t_1, __pyx_n_s_EXPIRES); if (unlikely(!__pyx_t_35)) __PYX_ERR(5, 39, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_35); + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + + /* "aiohttp/_headers.pxi":40 + * hdrs.EXPECT, + * hdrs.EXPIRES, + * hdrs.FORWARDED, # <<<<<<<<<<<<<< + * hdrs.FROM, + * hdrs.HOST, + */ + __Pyx_GetModuleGlobalName(__pyx_t_1, __pyx_n_s_hdrs); if (unlikely(!__pyx_t_1)) __PYX_ERR(5, 40, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __pyx_t_36 = __Pyx_PyObject_GetAttrStr(__pyx_t_1, __pyx_n_s_FORWARDED); if (unlikely(!__pyx_t_36)) __PYX_ERR(5, 40, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_36); + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + + /* "aiohttp/_headers.pxi":41 + * hdrs.EXPIRES, + * hdrs.FORWARDED, + * hdrs.FROM, # <<<<<<<<<<<<<< + * hdrs.HOST, + * hdrs.IF_MATCH, + */ + __Pyx_GetModuleGlobalName(__pyx_t_1, __pyx_n_s_hdrs); if (unlikely(!__pyx_t_1)) __PYX_ERR(5, 41, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __pyx_t_37 = __Pyx_PyObject_GetAttrStr(__pyx_t_1, __pyx_n_s_FROM); if (unlikely(!__pyx_t_37)) __PYX_ERR(5, 41, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_37); + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + + /* "aiohttp/_headers.pxi":42 + * hdrs.FORWARDED, + * hdrs.FROM, + * hdrs.HOST, # <<<<<<<<<<<<<< + * hdrs.IF_MATCH, + * hdrs.IF_MODIFIED_SINCE, + */ + __Pyx_GetModuleGlobalName(__pyx_t_1, __pyx_n_s_hdrs); if (unlikely(!__pyx_t_1)) __PYX_ERR(5, 42, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __pyx_t_38 = __Pyx_PyObject_GetAttrStr(__pyx_t_1, __pyx_n_s_HOST); if (unlikely(!__pyx_t_38)) __PYX_ERR(5, 42, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_38); + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + + /* "aiohttp/_headers.pxi":43 + * hdrs.FROM, + * hdrs.HOST, + * hdrs.IF_MATCH, # <<<<<<<<<<<<<< + * hdrs.IF_MODIFIED_SINCE, + * hdrs.IF_NONE_MATCH, + */ + __Pyx_GetModuleGlobalName(__pyx_t_1, __pyx_n_s_hdrs); if (unlikely(!__pyx_t_1)) __PYX_ERR(5, 43, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __pyx_t_39 = __Pyx_PyObject_GetAttrStr(__pyx_t_1, __pyx_n_s_IF_MATCH); if (unlikely(!__pyx_t_39)) __PYX_ERR(5, 43, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_39); + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + + /* "aiohttp/_headers.pxi":44 + * hdrs.HOST, + * hdrs.IF_MATCH, + * hdrs.IF_MODIFIED_SINCE, # <<<<<<<<<<<<<< + * hdrs.IF_NONE_MATCH, + * hdrs.IF_RANGE, + */ + __Pyx_GetModuleGlobalName(__pyx_t_1, __pyx_n_s_hdrs); if (unlikely(!__pyx_t_1)) __PYX_ERR(5, 44, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __pyx_t_40 = __Pyx_PyObject_GetAttrStr(__pyx_t_1, __pyx_n_s_IF_MODIFIED_SINCE); if (unlikely(!__pyx_t_40)) __PYX_ERR(5, 44, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_40); + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + + /* "aiohttp/_headers.pxi":45 + * hdrs.IF_MATCH, + * hdrs.IF_MODIFIED_SINCE, + * hdrs.IF_NONE_MATCH, # <<<<<<<<<<<<<< + * hdrs.IF_RANGE, + * hdrs.IF_UNMODIFIED_SINCE, + */ + __Pyx_GetModuleGlobalName(__pyx_t_1, __pyx_n_s_hdrs); if (unlikely(!__pyx_t_1)) __PYX_ERR(5, 45, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __pyx_t_41 = __Pyx_PyObject_GetAttrStr(__pyx_t_1, __pyx_n_s_IF_NONE_MATCH); if (unlikely(!__pyx_t_41)) __PYX_ERR(5, 45, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_41); + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + + /* "aiohttp/_headers.pxi":46 + * hdrs.IF_MODIFIED_SINCE, + * hdrs.IF_NONE_MATCH, + * hdrs.IF_RANGE, # <<<<<<<<<<<<<< + * hdrs.IF_UNMODIFIED_SINCE, + * hdrs.KEEP_ALIVE, + */ + __Pyx_GetModuleGlobalName(__pyx_t_1, __pyx_n_s_hdrs); if (unlikely(!__pyx_t_1)) __PYX_ERR(5, 46, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __pyx_t_42 = __Pyx_PyObject_GetAttrStr(__pyx_t_1, __pyx_n_s_IF_RANGE); if (unlikely(!__pyx_t_42)) __PYX_ERR(5, 46, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_42); + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + + /* "aiohttp/_headers.pxi":47 + * hdrs.IF_NONE_MATCH, + * hdrs.IF_RANGE, + * hdrs.IF_UNMODIFIED_SINCE, # <<<<<<<<<<<<<< + * hdrs.KEEP_ALIVE, + * hdrs.LAST_EVENT_ID, + */ + __Pyx_GetModuleGlobalName(__pyx_t_1, __pyx_n_s_hdrs); if (unlikely(!__pyx_t_1)) __PYX_ERR(5, 47, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __pyx_t_43 = __Pyx_PyObject_GetAttrStr(__pyx_t_1, __pyx_n_s_IF_UNMODIFIED_SINCE); if (unlikely(!__pyx_t_43)) __PYX_ERR(5, 47, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_43); + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + + /* "aiohttp/_headers.pxi":48 + * hdrs.IF_RANGE, + * hdrs.IF_UNMODIFIED_SINCE, + * hdrs.KEEP_ALIVE, # <<<<<<<<<<<<<< + * hdrs.LAST_EVENT_ID, + * hdrs.LAST_MODIFIED, + */ + __Pyx_GetModuleGlobalName(__pyx_t_1, __pyx_n_s_hdrs); if (unlikely(!__pyx_t_1)) __PYX_ERR(5, 48, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __pyx_t_44 = __Pyx_PyObject_GetAttrStr(__pyx_t_1, __pyx_n_s_KEEP_ALIVE); if (unlikely(!__pyx_t_44)) __PYX_ERR(5, 48, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_44); + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + + /* "aiohttp/_headers.pxi":49 + * hdrs.IF_UNMODIFIED_SINCE, + * hdrs.KEEP_ALIVE, + * hdrs.LAST_EVENT_ID, # <<<<<<<<<<<<<< + * hdrs.LAST_MODIFIED, + * hdrs.LINK, + */ + __Pyx_GetModuleGlobalName(__pyx_t_1, __pyx_n_s_hdrs); if (unlikely(!__pyx_t_1)) __PYX_ERR(5, 49, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __pyx_t_45 = __Pyx_PyObject_GetAttrStr(__pyx_t_1, __pyx_n_s_LAST_EVENT_ID); if (unlikely(!__pyx_t_45)) __PYX_ERR(5, 49, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_45); + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + + /* "aiohttp/_headers.pxi":50 + * hdrs.KEEP_ALIVE, + * hdrs.LAST_EVENT_ID, + * hdrs.LAST_MODIFIED, # <<<<<<<<<<<<<< + * hdrs.LINK, + * hdrs.LOCATION, + */ + __Pyx_GetModuleGlobalName(__pyx_t_1, __pyx_n_s_hdrs); if (unlikely(!__pyx_t_1)) __PYX_ERR(5, 50, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __pyx_t_46 = __Pyx_PyObject_GetAttrStr(__pyx_t_1, __pyx_n_s_LAST_MODIFIED); if (unlikely(!__pyx_t_46)) __PYX_ERR(5, 50, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_46); + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + + /* "aiohttp/_headers.pxi":51 + * hdrs.LAST_EVENT_ID, + * hdrs.LAST_MODIFIED, + * hdrs.LINK, # <<<<<<<<<<<<<< + * hdrs.LOCATION, + * hdrs.MAX_FORWARDS, + */ + __Pyx_GetModuleGlobalName(__pyx_t_1, __pyx_n_s_hdrs); if (unlikely(!__pyx_t_1)) __PYX_ERR(5, 51, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __pyx_t_47 = __Pyx_PyObject_GetAttrStr(__pyx_t_1, __pyx_n_s_LINK); if (unlikely(!__pyx_t_47)) __PYX_ERR(5, 51, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_47); + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + + /* "aiohttp/_headers.pxi":52 + * hdrs.LAST_MODIFIED, + * hdrs.LINK, + * hdrs.LOCATION, # <<<<<<<<<<<<<< + * hdrs.MAX_FORWARDS, + * hdrs.ORIGIN, + */ + __Pyx_GetModuleGlobalName(__pyx_t_1, __pyx_n_s_hdrs); if (unlikely(!__pyx_t_1)) __PYX_ERR(5, 52, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __pyx_t_48 = __Pyx_PyObject_GetAttrStr(__pyx_t_1, __pyx_n_s_LOCATION); if (unlikely(!__pyx_t_48)) __PYX_ERR(5, 52, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_48); + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + + /* "aiohttp/_headers.pxi":53 + * hdrs.LINK, + * hdrs.LOCATION, + * hdrs.MAX_FORWARDS, # <<<<<<<<<<<<<< + * hdrs.ORIGIN, + * hdrs.PRAGMA, + */ + __Pyx_GetModuleGlobalName(__pyx_t_1, __pyx_n_s_hdrs); if (unlikely(!__pyx_t_1)) __PYX_ERR(5, 53, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __pyx_t_49 = __Pyx_PyObject_GetAttrStr(__pyx_t_1, __pyx_n_s_MAX_FORWARDS); if (unlikely(!__pyx_t_49)) __PYX_ERR(5, 53, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_49); + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + + /* "aiohttp/_headers.pxi":54 + * hdrs.LOCATION, + * hdrs.MAX_FORWARDS, + * hdrs.ORIGIN, # <<<<<<<<<<<<<< + * hdrs.PRAGMA, + * hdrs.PROXY_AUTHENTICATE, + */ + __Pyx_GetModuleGlobalName(__pyx_t_1, __pyx_n_s_hdrs); if (unlikely(!__pyx_t_1)) __PYX_ERR(5, 54, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __pyx_t_50 = __Pyx_PyObject_GetAttrStr(__pyx_t_1, __pyx_n_s_ORIGIN); if (unlikely(!__pyx_t_50)) __PYX_ERR(5, 54, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_50); + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + + /* "aiohttp/_headers.pxi":55 + * hdrs.MAX_FORWARDS, + * hdrs.ORIGIN, + * hdrs.PRAGMA, # <<<<<<<<<<<<<< + * hdrs.PROXY_AUTHENTICATE, + * hdrs.PROXY_AUTHORIZATION, + */ + __Pyx_GetModuleGlobalName(__pyx_t_1, __pyx_n_s_hdrs); if (unlikely(!__pyx_t_1)) __PYX_ERR(5, 55, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __pyx_t_51 = __Pyx_PyObject_GetAttrStr(__pyx_t_1, __pyx_n_s_PRAGMA); if (unlikely(!__pyx_t_51)) __PYX_ERR(5, 55, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_51); + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + + /* "aiohttp/_headers.pxi":56 + * hdrs.ORIGIN, + * hdrs.PRAGMA, + * hdrs.PROXY_AUTHENTICATE, # <<<<<<<<<<<<<< + * hdrs.PROXY_AUTHORIZATION, + * hdrs.RANGE, + */ + __Pyx_GetModuleGlobalName(__pyx_t_1, __pyx_n_s_hdrs); if (unlikely(!__pyx_t_1)) __PYX_ERR(5, 56, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __pyx_t_52 = __Pyx_PyObject_GetAttrStr(__pyx_t_1, __pyx_n_s_PROXY_AUTHENTICATE); if (unlikely(!__pyx_t_52)) __PYX_ERR(5, 56, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_52); + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + + /* "aiohttp/_headers.pxi":57 + * hdrs.PRAGMA, + * hdrs.PROXY_AUTHENTICATE, + * hdrs.PROXY_AUTHORIZATION, # <<<<<<<<<<<<<< + * hdrs.RANGE, + * hdrs.REFERER, + */ + __Pyx_GetModuleGlobalName(__pyx_t_1, __pyx_n_s_hdrs); if (unlikely(!__pyx_t_1)) __PYX_ERR(5, 57, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __pyx_t_53 = __Pyx_PyObject_GetAttrStr(__pyx_t_1, __pyx_n_s_PROXY_AUTHORIZATION); if (unlikely(!__pyx_t_53)) __PYX_ERR(5, 57, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_53); + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + + /* "aiohttp/_headers.pxi":58 + * hdrs.PROXY_AUTHENTICATE, + * hdrs.PROXY_AUTHORIZATION, + * hdrs.RANGE, # <<<<<<<<<<<<<< + * hdrs.REFERER, + * hdrs.RETRY_AFTER, + */ + __Pyx_GetModuleGlobalName(__pyx_t_1, __pyx_n_s_hdrs); if (unlikely(!__pyx_t_1)) __PYX_ERR(5, 58, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __pyx_t_54 = __Pyx_PyObject_GetAttrStr(__pyx_t_1, __pyx_n_s_RANGE); if (unlikely(!__pyx_t_54)) __PYX_ERR(5, 58, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_54); + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + + /* "aiohttp/_headers.pxi":59 + * hdrs.PROXY_AUTHORIZATION, + * hdrs.RANGE, + * hdrs.REFERER, # <<<<<<<<<<<<<< + * hdrs.RETRY_AFTER, + * hdrs.SEC_WEBSOCKET_ACCEPT, + */ + __Pyx_GetModuleGlobalName(__pyx_t_1, __pyx_n_s_hdrs); if (unlikely(!__pyx_t_1)) __PYX_ERR(5, 59, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __pyx_t_55 = __Pyx_PyObject_GetAttrStr(__pyx_t_1, __pyx_n_s_REFERER); if (unlikely(!__pyx_t_55)) __PYX_ERR(5, 59, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_55); + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + + /* "aiohttp/_headers.pxi":60 + * hdrs.RANGE, + * hdrs.REFERER, + * hdrs.RETRY_AFTER, # <<<<<<<<<<<<<< + * hdrs.SEC_WEBSOCKET_ACCEPT, + * hdrs.SEC_WEBSOCKET_EXTENSIONS, + */ + __Pyx_GetModuleGlobalName(__pyx_t_1, __pyx_n_s_hdrs); if (unlikely(!__pyx_t_1)) __PYX_ERR(5, 60, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __pyx_t_56 = __Pyx_PyObject_GetAttrStr(__pyx_t_1, __pyx_n_s_RETRY_AFTER); if (unlikely(!__pyx_t_56)) __PYX_ERR(5, 60, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_56); + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + + /* "aiohttp/_headers.pxi":61 + * hdrs.REFERER, + * hdrs.RETRY_AFTER, + * hdrs.SEC_WEBSOCKET_ACCEPT, # <<<<<<<<<<<<<< + * hdrs.SEC_WEBSOCKET_EXTENSIONS, + * hdrs.SEC_WEBSOCKET_KEY, + */ + __Pyx_GetModuleGlobalName(__pyx_t_1, __pyx_n_s_hdrs); if (unlikely(!__pyx_t_1)) __PYX_ERR(5, 61, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __pyx_t_57 = __Pyx_PyObject_GetAttrStr(__pyx_t_1, __pyx_n_s_SEC_WEBSOCKET_ACCEPT); if (unlikely(!__pyx_t_57)) __PYX_ERR(5, 61, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_57); + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + + /* "aiohttp/_headers.pxi":62 + * hdrs.RETRY_AFTER, + * hdrs.SEC_WEBSOCKET_ACCEPT, + * hdrs.SEC_WEBSOCKET_EXTENSIONS, # <<<<<<<<<<<<<< + * hdrs.SEC_WEBSOCKET_KEY, + * hdrs.SEC_WEBSOCKET_KEY1, + */ + __Pyx_GetModuleGlobalName(__pyx_t_1, __pyx_n_s_hdrs); if (unlikely(!__pyx_t_1)) __PYX_ERR(5, 62, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __pyx_t_58 = __Pyx_PyObject_GetAttrStr(__pyx_t_1, __pyx_n_s_SEC_WEBSOCKET_EXTENSIONS); if (unlikely(!__pyx_t_58)) __PYX_ERR(5, 62, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_58); + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + + /* "aiohttp/_headers.pxi":63 + * hdrs.SEC_WEBSOCKET_ACCEPT, + * hdrs.SEC_WEBSOCKET_EXTENSIONS, + * hdrs.SEC_WEBSOCKET_KEY, # <<<<<<<<<<<<<< + * hdrs.SEC_WEBSOCKET_KEY1, + * hdrs.SEC_WEBSOCKET_PROTOCOL, + */ + __Pyx_GetModuleGlobalName(__pyx_t_1, __pyx_n_s_hdrs); if (unlikely(!__pyx_t_1)) __PYX_ERR(5, 63, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __pyx_t_59 = __Pyx_PyObject_GetAttrStr(__pyx_t_1, __pyx_n_s_SEC_WEBSOCKET_KEY); if (unlikely(!__pyx_t_59)) __PYX_ERR(5, 63, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_59); + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + + /* "aiohttp/_headers.pxi":64 + * hdrs.SEC_WEBSOCKET_EXTENSIONS, + * hdrs.SEC_WEBSOCKET_KEY, + * hdrs.SEC_WEBSOCKET_KEY1, # <<<<<<<<<<<<<< + * hdrs.SEC_WEBSOCKET_PROTOCOL, + * hdrs.SEC_WEBSOCKET_VERSION, + */ + __Pyx_GetModuleGlobalName(__pyx_t_1, __pyx_n_s_hdrs); if (unlikely(!__pyx_t_1)) __PYX_ERR(5, 64, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __pyx_t_60 = __Pyx_PyObject_GetAttrStr(__pyx_t_1, __pyx_n_s_SEC_WEBSOCKET_KEY1); if (unlikely(!__pyx_t_60)) __PYX_ERR(5, 64, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_60); + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + + /* "aiohttp/_headers.pxi":65 + * hdrs.SEC_WEBSOCKET_KEY, + * hdrs.SEC_WEBSOCKET_KEY1, + * hdrs.SEC_WEBSOCKET_PROTOCOL, # <<<<<<<<<<<<<< + * hdrs.SEC_WEBSOCKET_VERSION, + * hdrs.SERVER, + */ + __Pyx_GetModuleGlobalName(__pyx_t_1, __pyx_n_s_hdrs); if (unlikely(!__pyx_t_1)) __PYX_ERR(5, 65, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __pyx_t_61 = __Pyx_PyObject_GetAttrStr(__pyx_t_1, __pyx_n_s_SEC_WEBSOCKET_PROTOCOL); if (unlikely(!__pyx_t_61)) __PYX_ERR(5, 65, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_61); + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + + /* "aiohttp/_headers.pxi":66 + * hdrs.SEC_WEBSOCKET_KEY1, + * hdrs.SEC_WEBSOCKET_PROTOCOL, + * hdrs.SEC_WEBSOCKET_VERSION, # <<<<<<<<<<<<<< + * hdrs.SERVER, + * hdrs.SET_COOKIE, + */ + __Pyx_GetModuleGlobalName(__pyx_t_1, __pyx_n_s_hdrs); if (unlikely(!__pyx_t_1)) __PYX_ERR(5, 66, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __pyx_t_62 = __Pyx_PyObject_GetAttrStr(__pyx_t_1, __pyx_n_s_SEC_WEBSOCKET_VERSION); if (unlikely(!__pyx_t_62)) __PYX_ERR(5, 66, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_62); + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + + /* "aiohttp/_headers.pxi":67 + * hdrs.SEC_WEBSOCKET_PROTOCOL, + * hdrs.SEC_WEBSOCKET_VERSION, + * hdrs.SERVER, # <<<<<<<<<<<<<< + * hdrs.SET_COOKIE, + * hdrs.TE, + */ + __Pyx_GetModuleGlobalName(__pyx_t_1, __pyx_n_s_hdrs); if (unlikely(!__pyx_t_1)) __PYX_ERR(5, 67, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __pyx_t_63 = __Pyx_PyObject_GetAttrStr(__pyx_t_1, __pyx_n_s_SERVER); if (unlikely(!__pyx_t_63)) __PYX_ERR(5, 67, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_63); + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + + /* "aiohttp/_headers.pxi":68 + * hdrs.SEC_WEBSOCKET_VERSION, + * hdrs.SERVER, + * hdrs.SET_COOKIE, # <<<<<<<<<<<<<< + * hdrs.TE, + * hdrs.TRAILER, + */ + __Pyx_GetModuleGlobalName(__pyx_t_1, __pyx_n_s_hdrs); if (unlikely(!__pyx_t_1)) __PYX_ERR(5, 68, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __pyx_t_64 = __Pyx_PyObject_GetAttrStr(__pyx_t_1, __pyx_n_s_SET_COOKIE); if (unlikely(!__pyx_t_64)) __PYX_ERR(5, 68, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_64); + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + + /* "aiohttp/_headers.pxi":69 + * hdrs.SERVER, + * hdrs.SET_COOKIE, + * hdrs.TE, # <<<<<<<<<<<<<< + * hdrs.TRAILER, + * hdrs.TRANSFER_ENCODING, + */ + __Pyx_GetModuleGlobalName(__pyx_t_1, __pyx_n_s_hdrs); if (unlikely(!__pyx_t_1)) __PYX_ERR(5, 69, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __pyx_t_65 = __Pyx_PyObject_GetAttrStr(__pyx_t_1, __pyx_n_s_TE); if (unlikely(!__pyx_t_65)) __PYX_ERR(5, 69, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_65); + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + + /* "aiohttp/_headers.pxi":70 + * hdrs.SET_COOKIE, + * hdrs.TE, + * hdrs.TRAILER, # <<<<<<<<<<<<<< + * hdrs.TRANSFER_ENCODING, + * hdrs.URI, + */ + __Pyx_GetModuleGlobalName(__pyx_t_1, __pyx_n_s_hdrs); if (unlikely(!__pyx_t_1)) __PYX_ERR(5, 70, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __pyx_t_66 = __Pyx_PyObject_GetAttrStr(__pyx_t_1, __pyx_n_s_TRAILER); if (unlikely(!__pyx_t_66)) __PYX_ERR(5, 70, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_66); + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + + /* "aiohttp/_headers.pxi":71 + * hdrs.TE, + * hdrs.TRAILER, + * hdrs.TRANSFER_ENCODING, # <<<<<<<<<<<<<< + * hdrs.URI, + * hdrs.UPGRADE, + */ + __Pyx_GetModuleGlobalName(__pyx_t_1, __pyx_n_s_hdrs); if (unlikely(!__pyx_t_1)) __PYX_ERR(5, 71, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __pyx_t_67 = __Pyx_PyObject_GetAttrStr(__pyx_t_1, __pyx_n_s_TRANSFER_ENCODING); if (unlikely(!__pyx_t_67)) __PYX_ERR(5, 71, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_67); + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + + /* "aiohttp/_headers.pxi":72 + * hdrs.TRAILER, + * hdrs.TRANSFER_ENCODING, + * hdrs.URI, # <<<<<<<<<<<<<< + * hdrs.UPGRADE, + * hdrs.USER_AGENT, + */ + __Pyx_GetModuleGlobalName(__pyx_t_1, __pyx_n_s_hdrs); if (unlikely(!__pyx_t_1)) __PYX_ERR(5, 72, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __pyx_t_68 = __Pyx_PyObject_GetAttrStr(__pyx_t_1, __pyx_n_s_URI); if (unlikely(!__pyx_t_68)) __PYX_ERR(5, 72, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_68); + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + + /* "aiohttp/_headers.pxi":73 + * hdrs.TRANSFER_ENCODING, + * hdrs.URI, + * hdrs.UPGRADE, # <<<<<<<<<<<<<< + * hdrs.USER_AGENT, + * hdrs.VARY, + */ + __Pyx_GetModuleGlobalName(__pyx_t_1, __pyx_n_s_hdrs); if (unlikely(!__pyx_t_1)) __PYX_ERR(5, 73, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __pyx_t_69 = __Pyx_PyObject_GetAttrStr(__pyx_t_1, __pyx_n_s_UPGRADE); if (unlikely(!__pyx_t_69)) __PYX_ERR(5, 73, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_69); + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + + /* "aiohttp/_headers.pxi":74 + * hdrs.URI, + * hdrs.UPGRADE, + * hdrs.USER_AGENT, # <<<<<<<<<<<<<< + * hdrs.VARY, + * hdrs.VIA, + */ + __Pyx_GetModuleGlobalName(__pyx_t_1, __pyx_n_s_hdrs); if (unlikely(!__pyx_t_1)) __PYX_ERR(5, 74, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __pyx_t_70 = __Pyx_PyObject_GetAttrStr(__pyx_t_1, __pyx_n_s_USER_AGENT); if (unlikely(!__pyx_t_70)) __PYX_ERR(5, 74, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_70); + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + + /* "aiohttp/_headers.pxi":75 + * hdrs.UPGRADE, + * hdrs.USER_AGENT, + * hdrs.VARY, # <<<<<<<<<<<<<< + * hdrs.VIA, + * hdrs.WWW_AUTHENTICATE, + */ + __Pyx_GetModuleGlobalName(__pyx_t_1, __pyx_n_s_hdrs); if (unlikely(!__pyx_t_1)) __PYX_ERR(5, 75, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __pyx_t_71 = __Pyx_PyObject_GetAttrStr(__pyx_t_1, __pyx_n_s_VARY); if (unlikely(!__pyx_t_71)) __PYX_ERR(5, 75, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_71); + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + + /* "aiohttp/_headers.pxi":76 + * hdrs.USER_AGENT, + * hdrs.VARY, + * hdrs.VIA, # <<<<<<<<<<<<<< + * hdrs.WWW_AUTHENTICATE, + * hdrs.WANT_DIGEST, + */ + __Pyx_GetModuleGlobalName(__pyx_t_1, __pyx_n_s_hdrs); if (unlikely(!__pyx_t_1)) __PYX_ERR(5, 76, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __pyx_t_72 = __Pyx_PyObject_GetAttrStr(__pyx_t_1, __pyx_n_s_VIA); if (unlikely(!__pyx_t_72)) __PYX_ERR(5, 76, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_72); + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + + /* "aiohttp/_headers.pxi":77 + * hdrs.VARY, + * hdrs.VIA, + * hdrs.WWW_AUTHENTICATE, # <<<<<<<<<<<<<< + * hdrs.WANT_DIGEST, + * hdrs.WARNING, + */ + __Pyx_GetModuleGlobalName(__pyx_t_1, __pyx_n_s_hdrs); if (unlikely(!__pyx_t_1)) __PYX_ERR(5, 77, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __pyx_t_73 = __Pyx_PyObject_GetAttrStr(__pyx_t_1, __pyx_n_s_WWW_AUTHENTICATE); if (unlikely(!__pyx_t_73)) __PYX_ERR(5, 77, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_73); + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + + /* "aiohttp/_headers.pxi":78 + * hdrs.VIA, + * hdrs.WWW_AUTHENTICATE, + * hdrs.WANT_DIGEST, # <<<<<<<<<<<<<< + * hdrs.WARNING, + * hdrs.X_FORWARDED_FOR, + */ + __Pyx_GetModuleGlobalName(__pyx_t_1, __pyx_n_s_hdrs); if (unlikely(!__pyx_t_1)) __PYX_ERR(5, 78, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __pyx_t_74 = __Pyx_PyObject_GetAttrStr(__pyx_t_1, __pyx_n_s_WANT_DIGEST); if (unlikely(!__pyx_t_74)) __PYX_ERR(5, 78, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_74); + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + + /* "aiohttp/_headers.pxi":79 + * hdrs.WWW_AUTHENTICATE, + * hdrs.WANT_DIGEST, + * hdrs.WARNING, # <<<<<<<<<<<<<< + * hdrs.X_FORWARDED_FOR, + * hdrs.X_FORWARDED_HOST, + */ + __Pyx_GetModuleGlobalName(__pyx_t_1, __pyx_n_s_hdrs); if (unlikely(!__pyx_t_1)) __PYX_ERR(5, 79, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __pyx_t_75 = __Pyx_PyObject_GetAttrStr(__pyx_t_1, __pyx_n_s_WARNING); if (unlikely(!__pyx_t_75)) __PYX_ERR(5, 79, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_75); + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + + /* "aiohttp/_headers.pxi":80 + * hdrs.WANT_DIGEST, + * hdrs.WARNING, + * hdrs.X_FORWARDED_FOR, # <<<<<<<<<<<<<< + * hdrs.X_FORWARDED_HOST, + * hdrs.X_FORWARDED_PROTO, + */ + __Pyx_GetModuleGlobalName(__pyx_t_1, __pyx_n_s_hdrs); if (unlikely(!__pyx_t_1)) __PYX_ERR(5, 80, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __pyx_t_76 = __Pyx_PyObject_GetAttrStr(__pyx_t_1, __pyx_n_s_X_FORWARDED_FOR); if (unlikely(!__pyx_t_76)) __PYX_ERR(5, 80, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_76); + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + + /* "aiohttp/_headers.pxi":81 + * hdrs.WARNING, + * hdrs.X_FORWARDED_FOR, + * hdrs.X_FORWARDED_HOST, # <<<<<<<<<<<<<< + * hdrs.X_FORWARDED_PROTO, + * ) + */ + __Pyx_GetModuleGlobalName(__pyx_t_1, __pyx_n_s_hdrs); if (unlikely(!__pyx_t_1)) __PYX_ERR(5, 81, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __pyx_t_77 = __Pyx_PyObject_GetAttrStr(__pyx_t_1, __pyx_n_s_X_FORWARDED_HOST); if (unlikely(!__pyx_t_77)) __PYX_ERR(5, 81, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_77); + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + + /* "aiohttp/_headers.pxi":82 + * hdrs.X_FORWARDED_FOR, + * hdrs.X_FORWARDED_HOST, + * hdrs.X_FORWARDED_PROTO, # <<<<<<<<<<<<<< + * ) + */ + __Pyx_GetModuleGlobalName(__pyx_t_1, __pyx_n_s_hdrs); if (unlikely(!__pyx_t_1)) __PYX_ERR(5, 82, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __pyx_t_78 = __Pyx_PyObject_GetAttrStr(__pyx_t_1, __pyx_n_s_X_FORWARDED_PROTO); if (unlikely(!__pyx_t_78)) __PYX_ERR(5, 82, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_78); + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + + /* "aiohttp/_headers.pxi":6 + * from . import hdrs + * cdef tuple headers = ( + * hdrs.ACCEPT, # <<<<<<<<<<<<<< + * hdrs.ACCEPT_CHARSET, + * hdrs.ACCEPT_ENCODING, + */ + __pyx_t_1 = PyTuple_New(77); if (unlikely(!__pyx_t_1)) __PYX_ERR(5, 6, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __Pyx_GIVEREF(__pyx_t_2); + PyTuple_SET_ITEM(__pyx_t_1, 0, __pyx_t_2); + __Pyx_GIVEREF(__pyx_t_3); + PyTuple_SET_ITEM(__pyx_t_1, 1, __pyx_t_3); + __Pyx_GIVEREF(__pyx_t_4); + PyTuple_SET_ITEM(__pyx_t_1, 2, __pyx_t_4); + __Pyx_GIVEREF(__pyx_t_5); + PyTuple_SET_ITEM(__pyx_t_1, 3, __pyx_t_5); + __Pyx_GIVEREF(__pyx_t_6); + PyTuple_SET_ITEM(__pyx_t_1, 4, __pyx_t_6); + __Pyx_GIVEREF(__pyx_t_7); + PyTuple_SET_ITEM(__pyx_t_1, 5, __pyx_t_7); + __Pyx_GIVEREF(__pyx_t_8); + PyTuple_SET_ITEM(__pyx_t_1, 6, __pyx_t_8); + __Pyx_GIVEREF(__pyx_t_9); + PyTuple_SET_ITEM(__pyx_t_1, 7, __pyx_t_9); + __Pyx_GIVEREF(__pyx_t_10); + PyTuple_SET_ITEM(__pyx_t_1, 8, __pyx_t_10); + __Pyx_GIVEREF(__pyx_t_11); + PyTuple_SET_ITEM(__pyx_t_1, 9, __pyx_t_11); + __Pyx_GIVEREF(__pyx_t_12); + PyTuple_SET_ITEM(__pyx_t_1, 10, __pyx_t_12); + __Pyx_GIVEREF(__pyx_t_13); + PyTuple_SET_ITEM(__pyx_t_1, 11, __pyx_t_13); + __Pyx_GIVEREF(__pyx_t_14); + PyTuple_SET_ITEM(__pyx_t_1, 12, __pyx_t_14); + __Pyx_GIVEREF(__pyx_t_15); + PyTuple_SET_ITEM(__pyx_t_1, 13, __pyx_t_15); + __Pyx_GIVEREF(__pyx_t_16); + PyTuple_SET_ITEM(__pyx_t_1, 14, __pyx_t_16); + __Pyx_GIVEREF(__pyx_t_17); + PyTuple_SET_ITEM(__pyx_t_1, 15, __pyx_t_17); + __Pyx_GIVEREF(__pyx_t_18); + PyTuple_SET_ITEM(__pyx_t_1, 16, __pyx_t_18); + __Pyx_GIVEREF(__pyx_t_19); + PyTuple_SET_ITEM(__pyx_t_1, 17, __pyx_t_19); + __Pyx_GIVEREF(__pyx_t_20); + PyTuple_SET_ITEM(__pyx_t_1, 18, __pyx_t_20); + __Pyx_GIVEREF(__pyx_t_21); + PyTuple_SET_ITEM(__pyx_t_1, 19, __pyx_t_21); + __Pyx_GIVEREF(__pyx_t_22); + PyTuple_SET_ITEM(__pyx_t_1, 20, __pyx_t_22); + __Pyx_GIVEREF(__pyx_t_23); + PyTuple_SET_ITEM(__pyx_t_1, 21, __pyx_t_23); + __Pyx_GIVEREF(__pyx_t_24); + PyTuple_SET_ITEM(__pyx_t_1, 22, __pyx_t_24); + __Pyx_GIVEREF(__pyx_t_25); + PyTuple_SET_ITEM(__pyx_t_1, 23, __pyx_t_25); + __Pyx_GIVEREF(__pyx_t_26); + PyTuple_SET_ITEM(__pyx_t_1, 24, __pyx_t_26); + __Pyx_GIVEREF(__pyx_t_27); + PyTuple_SET_ITEM(__pyx_t_1, 25, __pyx_t_27); + __Pyx_GIVEREF(__pyx_t_28); + PyTuple_SET_ITEM(__pyx_t_1, 26, __pyx_t_28); + __Pyx_GIVEREF(__pyx_t_29); + PyTuple_SET_ITEM(__pyx_t_1, 27, __pyx_t_29); + __Pyx_GIVEREF(__pyx_t_30); + PyTuple_SET_ITEM(__pyx_t_1, 28, __pyx_t_30); + __Pyx_GIVEREF(__pyx_t_31); + PyTuple_SET_ITEM(__pyx_t_1, 29, __pyx_t_31); + __Pyx_GIVEREF(__pyx_t_32); + PyTuple_SET_ITEM(__pyx_t_1, 30, __pyx_t_32); + __Pyx_GIVEREF(__pyx_t_33); + PyTuple_SET_ITEM(__pyx_t_1, 31, __pyx_t_33); + __Pyx_GIVEREF(__pyx_t_34); + PyTuple_SET_ITEM(__pyx_t_1, 32, __pyx_t_34); + __Pyx_GIVEREF(__pyx_t_35); + PyTuple_SET_ITEM(__pyx_t_1, 33, __pyx_t_35); + __Pyx_GIVEREF(__pyx_t_36); + PyTuple_SET_ITEM(__pyx_t_1, 34, __pyx_t_36); + __Pyx_GIVEREF(__pyx_t_37); + PyTuple_SET_ITEM(__pyx_t_1, 35, __pyx_t_37); + __Pyx_GIVEREF(__pyx_t_38); + PyTuple_SET_ITEM(__pyx_t_1, 36, __pyx_t_38); + __Pyx_GIVEREF(__pyx_t_39); + PyTuple_SET_ITEM(__pyx_t_1, 37, __pyx_t_39); + __Pyx_GIVEREF(__pyx_t_40); + PyTuple_SET_ITEM(__pyx_t_1, 38, __pyx_t_40); + __Pyx_GIVEREF(__pyx_t_41); + PyTuple_SET_ITEM(__pyx_t_1, 39, __pyx_t_41); + __Pyx_GIVEREF(__pyx_t_42); + PyTuple_SET_ITEM(__pyx_t_1, 40, __pyx_t_42); + __Pyx_GIVEREF(__pyx_t_43); + PyTuple_SET_ITEM(__pyx_t_1, 41, __pyx_t_43); + __Pyx_GIVEREF(__pyx_t_44); + PyTuple_SET_ITEM(__pyx_t_1, 42, __pyx_t_44); + __Pyx_GIVEREF(__pyx_t_45); + PyTuple_SET_ITEM(__pyx_t_1, 43, __pyx_t_45); + __Pyx_GIVEREF(__pyx_t_46); + PyTuple_SET_ITEM(__pyx_t_1, 44, __pyx_t_46); + __Pyx_GIVEREF(__pyx_t_47); + PyTuple_SET_ITEM(__pyx_t_1, 45, __pyx_t_47); + __Pyx_GIVEREF(__pyx_t_48); + PyTuple_SET_ITEM(__pyx_t_1, 46, __pyx_t_48); + __Pyx_GIVEREF(__pyx_t_49); + PyTuple_SET_ITEM(__pyx_t_1, 47, __pyx_t_49); + __Pyx_GIVEREF(__pyx_t_50); + PyTuple_SET_ITEM(__pyx_t_1, 48, __pyx_t_50); + __Pyx_GIVEREF(__pyx_t_51); + PyTuple_SET_ITEM(__pyx_t_1, 49, __pyx_t_51); + __Pyx_GIVEREF(__pyx_t_52); + PyTuple_SET_ITEM(__pyx_t_1, 50, __pyx_t_52); + __Pyx_GIVEREF(__pyx_t_53); + PyTuple_SET_ITEM(__pyx_t_1, 51, __pyx_t_53); + __Pyx_GIVEREF(__pyx_t_54); + PyTuple_SET_ITEM(__pyx_t_1, 52, __pyx_t_54); + __Pyx_GIVEREF(__pyx_t_55); + PyTuple_SET_ITEM(__pyx_t_1, 53, __pyx_t_55); + __Pyx_GIVEREF(__pyx_t_56); + PyTuple_SET_ITEM(__pyx_t_1, 54, __pyx_t_56); + __Pyx_GIVEREF(__pyx_t_57); + PyTuple_SET_ITEM(__pyx_t_1, 55, __pyx_t_57); + __Pyx_GIVEREF(__pyx_t_58); + PyTuple_SET_ITEM(__pyx_t_1, 56, __pyx_t_58); + __Pyx_GIVEREF(__pyx_t_59); + PyTuple_SET_ITEM(__pyx_t_1, 57, __pyx_t_59); + __Pyx_GIVEREF(__pyx_t_60); + PyTuple_SET_ITEM(__pyx_t_1, 58, __pyx_t_60); + __Pyx_GIVEREF(__pyx_t_61); + PyTuple_SET_ITEM(__pyx_t_1, 59, __pyx_t_61); + __Pyx_GIVEREF(__pyx_t_62); + PyTuple_SET_ITEM(__pyx_t_1, 60, __pyx_t_62); + __Pyx_GIVEREF(__pyx_t_63); + PyTuple_SET_ITEM(__pyx_t_1, 61, __pyx_t_63); + __Pyx_GIVEREF(__pyx_t_64); + PyTuple_SET_ITEM(__pyx_t_1, 62, __pyx_t_64); + __Pyx_GIVEREF(__pyx_t_65); + PyTuple_SET_ITEM(__pyx_t_1, 63, __pyx_t_65); + __Pyx_GIVEREF(__pyx_t_66); + PyTuple_SET_ITEM(__pyx_t_1, 64, __pyx_t_66); + __Pyx_GIVEREF(__pyx_t_67); + PyTuple_SET_ITEM(__pyx_t_1, 65, __pyx_t_67); + __Pyx_GIVEREF(__pyx_t_68); + PyTuple_SET_ITEM(__pyx_t_1, 66, __pyx_t_68); + __Pyx_GIVEREF(__pyx_t_69); + PyTuple_SET_ITEM(__pyx_t_1, 67, __pyx_t_69); + __Pyx_GIVEREF(__pyx_t_70); + PyTuple_SET_ITEM(__pyx_t_1, 68, __pyx_t_70); + __Pyx_GIVEREF(__pyx_t_71); + PyTuple_SET_ITEM(__pyx_t_1, 69, __pyx_t_71); + __Pyx_GIVEREF(__pyx_t_72); + PyTuple_SET_ITEM(__pyx_t_1, 70, __pyx_t_72); + __Pyx_GIVEREF(__pyx_t_73); + PyTuple_SET_ITEM(__pyx_t_1, 71, __pyx_t_73); + __Pyx_GIVEREF(__pyx_t_74); + PyTuple_SET_ITEM(__pyx_t_1, 72, __pyx_t_74); + __Pyx_GIVEREF(__pyx_t_75); + PyTuple_SET_ITEM(__pyx_t_1, 73, __pyx_t_75); + __Pyx_GIVEREF(__pyx_t_76); + PyTuple_SET_ITEM(__pyx_t_1, 74, __pyx_t_76); + __Pyx_GIVEREF(__pyx_t_77); + PyTuple_SET_ITEM(__pyx_t_1, 75, __pyx_t_77); + __Pyx_GIVEREF(__pyx_t_78); + PyTuple_SET_ITEM(__pyx_t_1, 76, __pyx_t_78); + __pyx_t_2 = 0; + __pyx_t_3 = 0; + __pyx_t_4 = 0; + __pyx_t_5 = 0; + __pyx_t_6 = 0; + __pyx_t_7 = 0; + __pyx_t_8 = 0; + __pyx_t_9 = 0; + __pyx_t_10 = 0; + __pyx_t_11 = 0; + __pyx_t_12 = 0; + __pyx_t_13 = 0; + __pyx_t_14 = 0; + __pyx_t_15 = 0; + __pyx_t_16 = 0; + __pyx_t_17 = 0; + __pyx_t_18 = 0; + __pyx_t_19 = 0; + __pyx_t_20 = 0; + __pyx_t_21 = 0; + __pyx_t_22 = 0; + __pyx_t_23 = 0; + __pyx_t_24 = 0; + __pyx_t_25 = 0; + __pyx_t_26 = 0; + __pyx_t_27 = 0; + __pyx_t_28 = 0; + __pyx_t_29 = 0; + __pyx_t_30 = 0; + __pyx_t_31 = 0; + __pyx_t_32 = 0; + __pyx_t_33 = 0; + __pyx_t_34 = 0; + __pyx_t_35 = 0; + __pyx_t_36 = 0; + __pyx_t_37 = 0; + __pyx_t_38 = 0; + __pyx_t_39 = 0; + __pyx_t_40 = 0; + __pyx_t_41 = 0; + __pyx_t_42 = 0; + __pyx_t_43 = 0; + __pyx_t_44 = 0; + __pyx_t_45 = 0; + __pyx_t_46 = 0; + __pyx_t_47 = 0; + __pyx_t_48 = 0; + __pyx_t_49 = 0; + __pyx_t_50 = 0; + __pyx_t_51 = 0; + __pyx_t_52 = 0; + __pyx_t_53 = 0; + __pyx_t_54 = 0; + __pyx_t_55 = 0; + __pyx_t_56 = 0; + __pyx_t_57 = 0; + __pyx_t_58 = 0; + __pyx_t_59 = 0; + __pyx_t_60 = 0; + __pyx_t_61 = 0; + __pyx_t_62 = 0; + __pyx_t_63 = 0; + __pyx_t_64 = 0; + __pyx_t_65 = 0; + __pyx_t_66 = 0; + __pyx_t_67 = 0; + __pyx_t_68 = 0; + __pyx_t_69 = 0; + __pyx_t_70 = 0; + __pyx_t_71 = 0; + __pyx_t_72 = 0; + __pyx_t_73 = 0; + __pyx_t_74 = 0; + __pyx_t_75 = 0; + __pyx_t_76 = 0; + __pyx_t_77 = 0; + __pyx_t_78 = 0; + __Pyx_XGOTREF(__pyx_v_7aiohttp_12_http_parser_headers); + __Pyx_DECREF_SET(__pyx_v_7aiohttp_12_http_parser_headers, ((PyObject*)__pyx_t_1)); + __Pyx_GIVEREF(__pyx_t_1); + __pyx_t_1 = 0; + + /* "aiohttp/_http_parser.pyx":57 + * char* PyByteArray_AsString(object) + * + * __all__ = ('HttpRequestParser', 'HttpResponseParser', # <<<<<<<<<<<<<< + * 'RawRequestMessage', 'RawResponseMessage') + * + */ + if (PyDict_SetItem(__pyx_d, __pyx_n_s_all, __pyx_tuple__13) < 0) __PYX_ERR(0, 57, __pyx_L1_error) + + /* "aiohttp/_http_parser.pyx":60 + * 'RawRequestMessage', 'RawResponseMessage') + * + * cdef object URL = _URL # <<<<<<<<<<<<<< + * cdef object URL_build = URL.build + * cdef object CIMultiDict = _CIMultiDict + */ + __Pyx_GetModuleGlobalName(__pyx_t_1, __pyx_n_s_URL_2); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 60, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __Pyx_XGOTREF(__pyx_v_7aiohttp_12_http_parser_URL); + __Pyx_DECREF_SET(__pyx_v_7aiohttp_12_http_parser_URL, __pyx_t_1); + __Pyx_GIVEREF(__pyx_t_1); + __pyx_t_1 = 0; + + /* "aiohttp/_http_parser.pyx":61 + * + * cdef object URL = _URL + * cdef object URL_build = URL.build # <<<<<<<<<<<<<< + * cdef object CIMultiDict = _CIMultiDict + * cdef object CIMultiDictProxy = _CIMultiDictProxy + */ + __pyx_t_1 = __Pyx_PyObject_GetAttrStr(__pyx_v_7aiohttp_12_http_parser_URL, __pyx_n_s_build); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 61, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __Pyx_XGOTREF(__pyx_v_7aiohttp_12_http_parser_URL_build); + __Pyx_DECREF_SET(__pyx_v_7aiohttp_12_http_parser_URL_build, __pyx_t_1); + __Pyx_GIVEREF(__pyx_t_1); + __pyx_t_1 = 0; + + /* "aiohttp/_http_parser.pyx":62 + * cdef object URL = _URL + * cdef object URL_build = URL.build + * cdef object CIMultiDict = _CIMultiDict # <<<<<<<<<<<<<< + * cdef object CIMultiDictProxy = _CIMultiDictProxy + * cdef object HttpVersion = _HttpVersion + */ + __Pyx_GetModuleGlobalName(__pyx_t_1, __pyx_n_s_CIMultiDict_2); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 62, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __Pyx_XGOTREF(__pyx_v_7aiohttp_12_http_parser_CIMultiDict); + __Pyx_DECREF_SET(__pyx_v_7aiohttp_12_http_parser_CIMultiDict, __pyx_t_1); + __Pyx_GIVEREF(__pyx_t_1); + __pyx_t_1 = 0; + + /* "aiohttp/_http_parser.pyx":63 + * cdef object URL_build = URL.build + * cdef object CIMultiDict = _CIMultiDict + * cdef object CIMultiDictProxy = _CIMultiDictProxy # <<<<<<<<<<<<<< + * cdef object HttpVersion = _HttpVersion + * cdef object HttpVersion10 = _HttpVersion10 + */ + __Pyx_GetModuleGlobalName(__pyx_t_1, __pyx_n_s_CIMultiDictProxy_2); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 63, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __Pyx_XGOTREF(__pyx_v_7aiohttp_12_http_parser_CIMultiDictProxy); + __Pyx_DECREF_SET(__pyx_v_7aiohttp_12_http_parser_CIMultiDictProxy, __pyx_t_1); + __Pyx_GIVEREF(__pyx_t_1); + __pyx_t_1 = 0; + + /* "aiohttp/_http_parser.pyx":64 + * cdef object CIMultiDict = _CIMultiDict + * cdef object CIMultiDictProxy = _CIMultiDictProxy + * cdef object HttpVersion = _HttpVersion # <<<<<<<<<<<<<< + * cdef object HttpVersion10 = _HttpVersion10 + * cdef object HttpVersion11 = _HttpVersion11 + */ + __Pyx_GetModuleGlobalName(__pyx_t_1, __pyx_n_s_HttpVersion_2); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 64, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __Pyx_XGOTREF(__pyx_v_7aiohttp_12_http_parser_HttpVersion); + __Pyx_DECREF_SET(__pyx_v_7aiohttp_12_http_parser_HttpVersion, __pyx_t_1); + __Pyx_GIVEREF(__pyx_t_1); + __pyx_t_1 = 0; + + /* "aiohttp/_http_parser.pyx":65 + * cdef object CIMultiDictProxy = _CIMultiDictProxy + * cdef object HttpVersion = _HttpVersion + * cdef object HttpVersion10 = _HttpVersion10 # <<<<<<<<<<<<<< + * cdef object HttpVersion11 = _HttpVersion11 + * cdef object SEC_WEBSOCKET_KEY1 = hdrs.SEC_WEBSOCKET_KEY1 + */ + __Pyx_GetModuleGlobalName(__pyx_t_1, __pyx_n_s_HttpVersion10_2); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 65, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __Pyx_XGOTREF(__pyx_v_7aiohttp_12_http_parser_HttpVersion10); + __Pyx_DECREF_SET(__pyx_v_7aiohttp_12_http_parser_HttpVersion10, __pyx_t_1); + __Pyx_GIVEREF(__pyx_t_1); + __pyx_t_1 = 0; + + /* "aiohttp/_http_parser.pyx":66 + * cdef object HttpVersion = _HttpVersion + * cdef object HttpVersion10 = _HttpVersion10 + * cdef object HttpVersion11 = _HttpVersion11 # <<<<<<<<<<<<<< + * cdef object SEC_WEBSOCKET_KEY1 = hdrs.SEC_WEBSOCKET_KEY1 + * cdef object CONTENT_ENCODING = hdrs.CONTENT_ENCODING + */ + __Pyx_GetModuleGlobalName(__pyx_t_1, __pyx_n_s_HttpVersion11_2); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 66, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __Pyx_XGOTREF(__pyx_v_7aiohttp_12_http_parser_HttpVersion11); + __Pyx_DECREF_SET(__pyx_v_7aiohttp_12_http_parser_HttpVersion11, __pyx_t_1); + __Pyx_GIVEREF(__pyx_t_1); + __pyx_t_1 = 0; + + /* "aiohttp/_http_parser.pyx":67 + * cdef object HttpVersion10 = _HttpVersion10 + * cdef object HttpVersion11 = _HttpVersion11 + * cdef object SEC_WEBSOCKET_KEY1 = hdrs.SEC_WEBSOCKET_KEY1 # <<<<<<<<<<<<<< + * cdef object CONTENT_ENCODING = hdrs.CONTENT_ENCODING + * cdef object EMPTY_PAYLOAD = _EMPTY_PAYLOAD + */ + __Pyx_GetModuleGlobalName(__pyx_t_1, __pyx_n_s_hdrs); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 67, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __pyx_t_78 = __Pyx_PyObject_GetAttrStr(__pyx_t_1, __pyx_n_s_SEC_WEBSOCKET_KEY1); if (unlikely(!__pyx_t_78)) __PYX_ERR(0, 67, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_78); + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + __Pyx_XGOTREF(__pyx_v_7aiohttp_12_http_parser_SEC_WEBSOCKET_KEY1); + __Pyx_DECREF_SET(__pyx_v_7aiohttp_12_http_parser_SEC_WEBSOCKET_KEY1, __pyx_t_78); + __Pyx_GIVEREF(__pyx_t_78); + __pyx_t_78 = 0; + + /* "aiohttp/_http_parser.pyx":68 + * cdef object HttpVersion11 = _HttpVersion11 + * cdef object SEC_WEBSOCKET_KEY1 = hdrs.SEC_WEBSOCKET_KEY1 + * cdef object CONTENT_ENCODING = hdrs.CONTENT_ENCODING # <<<<<<<<<<<<<< + * cdef object EMPTY_PAYLOAD = _EMPTY_PAYLOAD + * cdef object StreamReader = _StreamReader + */ + __Pyx_GetModuleGlobalName(__pyx_t_78, __pyx_n_s_hdrs); if (unlikely(!__pyx_t_78)) __PYX_ERR(0, 68, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_78); + __pyx_t_1 = __Pyx_PyObject_GetAttrStr(__pyx_t_78, __pyx_n_s_CONTENT_ENCODING); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 68, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __Pyx_DECREF(__pyx_t_78); __pyx_t_78 = 0; + __Pyx_XGOTREF(__pyx_v_7aiohttp_12_http_parser_CONTENT_ENCODING); + __Pyx_DECREF_SET(__pyx_v_7aiohttp_12_http_parser_CONTENT_ENCODING, __pyx_t_1); + __Pyx_GIVEREF(__pyx_t_1); + __pyx_t_1 = 0; + + /* "aiohttp/_http_parser.pyx":69 + * cdef object SEC_WEBSOCKET_KEY1 = hdrs.SEC_WEBSOCKET_KEY1 + * cdef object CONTENT_ENCODING = hdrs.CONTENT_ENCODING + * cdef object EMPTY_PAYLOAD = _EMPTY_PAYLOAD # <<<<<<<<<<<<<< + * cdef object StreamReader = _StreamReader + * cdef object DeflateBuffer = _DeflateBuffer + */ + __Pyx_GetModuleGlobalName(__pyx_t_1, __pyx_n_s_EMPTY_PAYLOAD_2); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 69, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __Pyx_XGOTREF(__pyx_v_7aiohttp_12_http_parser_EMPTY_PAYLOAD); + __Pyx_DECREF_SET(__pyx_v_7aiohttp_12_http_parser_EMPTY_PAYLOAD, __pyx_t_1); + __Pyx_GIVEREF(__pyx_t_1); + __pyx_t_1 = 0; + + /* "aiohttp/_http_parser.pyx":70 + * cdef object CONTENT_ENCODING = hdrs.CONTENT_ENCODING + * cdef object EMPTY_PAYLOAD = _EMPTY_PAYLOAD + * cdef object StreamReader = _StreamReader # <<<<<<<<<<<<<< + * cdef object DeflateBuffer = _DeflateBuffer + * + */ + __Pyx_GetModuleGlobalName(__pyx_t_1, __pyx_n_s_StreamReader_2); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 70, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __Pyx_XGOTREF(__pyx_v_7aiohttp_12_http_parser_StreamReader); + __Pyx_DECREF_SET(__pyx_v_7aiohttp_12_http_parser_StreamReader, __pyx_t_1); + __Pyx_GIVEREF(__pyx_t_1); + __pyx_t_1 = 0; + + /* "aiohttp/_http_parser.pyx":71 + * cdef object EMPTY_PAYLOAD = _EMPTY_PAYLOAD + * cdef object StreamReader = _StreamReader + * cdef object DeflateBuffer = _DeflateBuffer # <<<<<<<<<<<<<< + * + * + */ + __Pyx_GetModuleGlobalName(__pyx_t_1, __pyx_n_s_DeflateBuffer_2); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 71, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __Pyx_XGOTREF(__pyx_v_7aiohttp_12_http_parser_DeflateBuffer); + __Pyx_DECREF_SET(__pyx_v_7aiohttp_12_http_parser_DeflateBuffer, __pyx_t_1); + __Pyx_GIVEREF(__pyx_t_1); + __pyx_t_1 = 0; + + /* "aiohttp/_http_parser.pyx":85 + * DEF METHODS_COUNT = 46; + * + * cdef list _http_method = [] # <<<<<<<<<<<<<< + * + * for i in range(METHODS_COUNT): + */ + __pyx_t_1 = PyList_New(0); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 85, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __Pyx_XGOTREF(__pyx_v_7aiohttp_12_http_parser__http_method); + __Pyx_DECREF_SET(__pyx_v_7aiohttp_12_http_parser__http_method, ((PyObject*)__pyx_t_1)); + __Pyx_GIVEREF(__pyx_t_1); + __pyx_t_1 = 0; + + /* "aiohttp/_http_parser.pyx":87 + * cdef list _http_method = [] + * + * for i in range(METHODS_COUNT): # <<<<<<<<<<<<<< + * _http_method.append( + * cparser.llhttp_method_name( i).decode('ascii')) + */ + for (__pyx_t_79 = 0; __pyx_t_79 < 46; __pyx_t_79+=1) { + __pyx_t_1 = __Pyx_PyInt_From_long(__pyx_t_79); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 87, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + if (PyDict_SetItem(__pyx_d, __pyx_n_s_i, __pyx_t_1) < 0) __PYX_ERR(0, 87, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + + /* "aiohttp/_http_parser.pyx":88 + * + * for i in range(METHODS_COUNT): + * _http_method.append( # <<<<<<<<<<<<<< + * cparser.llhttp_method_name( i).decode('ascii')) + * + */ + if (unlikely(__pyx_v_7aiohttp_12_http_parser__http_method == Py_None)) { + PyErr_Format(PyExc_AttributeError, "'NoneType' object has no attribute '%.30s'", "append"); + __PYX_ERR(0, 88, __pyx_L1_error) + } + + /* "aiohttp/_http_parser.pyx":89 + * for i in range(METHODS_COUNT): + * _http_method.append( + * cparser.llhttp_method_name( i).decode('ascii')) # <<<<<<<<<<<<<< + * + * + */ + __Pyx_GetModuleGlobalName(__pyx_t_1, __pyx_n_s_i); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 89, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __pyx_t_80 = ((enum llhttp_method)__Pyx_PyInt_As_enum__llhttp_method(__pyx_t_1)); if (unlikely(PyErr_Occurred())) __PYX_ERR(0, 89, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + __pyx_t_81 = llhttp_method_name(((llhttp_method_t)__pyx_t_80)); + __pyx_t_1 = __Pyx_decode_c_string(__pyx_t_81, 0, strlen(__pyx_t_81), NULL, NULL, PyUnicode_DecodeASCII); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 89, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + + /* "aiohttp/_http_parser.pyx":88 + * + * for i in range(METHODS_COUNT): + * _http_method.append( # <<<<<<<<<<<<<< + * cparser.llhttp_method_name( i).decode('ascii')) + * + */ + __pyx_t_82 = __Pyx_PyList_Append(__pyx_v_7aiohttp_12_http_parser__http_method, __pyx_t_1); if (unlikely(__pyx_t_82 == ((int)-1))) __PYX_ERR(0, 88, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + } + + /* "(tree fragment)":1 + * def __pyx_unpickle_RawRequestMessage(__pyx_type, long __pyx_checksum, __pyx_state): # <<<<<<<<<<<<<< + * cdef object __pyx_PickleError + * cdef object __pyx_result + */ + __pyx_t_1 = PyCFunction_NewEx(&__pyx_mdef_7aiohttp_12_http_parser_1__pyx_unpickle_RawRequestMessage, NULL, __pyx_n_s_aiohttp__http_parser); if (unlikely(!__pyx_t_1)) __PYX_ERR(1, 1, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + if (PyDict_SetItem(__pyx_d, __pyx_n_s_pyx_unpickle_RawRequestMessage, __pyx_t_1) < 0) __PYX_ERR(1, 1, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + + /* "(tree fragment)":11 + * __pyx_unpickle_RawRequestMessage__set_state( __pyx_result, __pyx_state) + * return __pyx_result + * cdef __pyx_unpickle_RawRequestMessage__set_state(RawRequestMessage __pyx_result, tuple __pyx_state): # <<<<<<<<<<<<<< + * __pyx_result.chunked = __pyx_state[0]; __pyx_result.compression = __pyx_state[1]; __pyx_result.headers = __pyx_state[2]; __pyx_result.method = __pyx_state[3]; __pyx_result.path = __pyx_state[4]; __pyx_result.raw_headers = __pyx_state[5]; __pyx_result.should_close = __pyx_state[6]; __pyx_result.upgrade = __pyx_state[7]; __pyx_result.url = __pyx_state[8]; __pyx_result.version = __pyx_state[9] + * if len(__pyx_state) > 10 and hasattr(__pyx_result, '__dict__'): + */ + __pyx_t_1 = PyCFunction_NewEx(&__pyx_mdef_7aiohttp_12_http_parser_3__pyx_unpickle_RawResponseMessage, NULL, __pyx_n_s_aiohttp__http_parser); if (unlikely(!__pyx_t_1)) __PYX_ERR(1, 1, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + if (PyDict_SetItem(__pyx_d, __pyx_n_s_pyx_unpickle_RawResponseMessag, __pyx_t_1) < 0) __PYX_ERR(1, 1, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + + /* "aiohttp/_http_parser.pyx":1 + * #cython: language_level=3 # <<<<<<<<<<<<<< + * # + * # Based on https://github.com/MagicStack/httptools + */ + __pyx_t_1 = __Pyx_PyDict_NewPresized(0); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 1, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + if (PyDict_SetItem(__pyx_d, __pyx_n_s_test, __pyx_t_1) < 0) __PYX_ERR(0, 1, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + + /*--- Wrapped vars code ---*/ + + goto __pyx_L0; + __pyx_L1_error:; + __Pyx_XDECREF(__pyx_t_1); + __Pyx_XDECREF(__pyx_t_2); + __Pyx_XDECREF(__pyx_t_3); + __Pyx_XDECREF(__pyx_t_4); + __Pyx_XDECREF(__pyx_t_5); + __Pyx_XDECREF(__pyx_t_6); + __Pyx_XDECREF(__pyx_t_7); + __Pyx_XDECREF(__pyx_t_8); + __Pyx_XDECREF(__pyx_t_9); + __Pyx_XDECREF(__pyx_t_10); + __Pyx_XDECREF(__pyx_t_11); + __Pyx_XDECREF(__pyx_t_12); + __Pyx_XDECREF(__pyx_t_13); + __Pyx_XDECREF(__pyx_t_14); + __Pyx_XDECREF(__pyx_t_15); + __Pyx_XDECREF(__pyx_t_16); + __Pyx_XDECREF(__pyx_t_17); + __Pyx_XDECREF(__pyx_t_18); + __Pyx_XDECREF(__pyx_t_19); + __Pyx_XDECREF(__pyx_t_20); + __Pyx_XDECREF(__pyx_t_21); + __Pyx_XDECREF(__pyx_t_22); + __Pyx_XDECREF(__pyx_t_23); + __Pyx_XDECREF(__pyx_t_24); + __Pyx_XDECREF(__pyx_t_25); + __Pyx_XDECREF(__pyx_t_26); + __Pyx_XDECREF(__pyx_t_27); + __Pyx_XDECREF(__pyx_t_28); + __Pyx_XDECREF(__pyx_t_29); + __Pyx_XDECREF(__pyx_t_30); + __Pyx_XDECREF(__pyx_t_31); + __Pyx_XDECREF(__pyx_t_32); + __Pyx_XDECREF(__pyx_t_33); + __Pyx_XDECREF(__pyx_t_34); + __Pyx_XDECREF(__pyx_t_35); + __Pyx_XDECREF(__pyx_t_36); + __Pyx_XDECREF(__pyx_t_37); + __Pyx_XDECREF(__pyx_t_38); + __Pyx_XDECREF(__pyx_t_39); + __Pyx_XDECREF(__pyx_t_40); + __Pyx_XDECREF(__pyx_t_41); + __Pyx_XDECREF(__pyx_t_42); + __Pyx_XDECREF(__pyx_t_43); + __Pyx_XDECREF(__pyx_t_44); + __Pyx_XDECREF(__pyx_t_45); + __Pyx_XDECREF(__pyx_t_46); + __Pyx_XDECREF(__pyx_t_47); + __Pyx_XDECREF(__pyx_t_48); + __Pyx_XDECREF(__pyx_t_49); + __Pyx_XDECREF(__pyx_t_50); + __Pyx_XDECREF(__pyx_t_51); + __Pyx_XDECREF(__pyx_t_52); + __Pyx_XDECREF(__pyx_t_53); + __Pyx_XDECREF(__pyx_t_54); + __Pyx_XDECREF(__pyx_t_55); + __Pyx_XDECREF(__pyx_t_56); + __Pyx_XDECREF(__pyx_t_57); + __Pyx_XDECREF(__pyx_t_58); + __Pyx_XDECREF(__pyx_t_59); + __Pyx_XDECREF(__pyx_t_60); + __Pyx_XDECREF(__pyx_t_61); + __Pyx_XDECREF(__pyx_t_62); + __Pyx_XDECREF(__pyx_t_63); + __Pyx_XDECREF(__pyx_t_64); + __Pyx_XDECREF(__pyx_t_65); + __Pyx_XDECREF(__pyx_t_66); + __Pyx_XDECREF(__pyx_t_67); + __Pyx_XDECREF(__pyx_t_68); + __Pyx_XDECREF(__pyx_t_69); + __Pyx_XDECREF(__pyx_t_70); + __Pyx_XDECREF(__pyx_t_71); + __Pyx_XDECREF(__pyx_t_72); + __Pyx_XDECREF(__pyx_t_73); + __Pyx_XDECREF(__pyx_t_74); + __Pyx_XDECREF(__pyx_t_75); + __Pyx_XDECREF(__pyx_t_76); + __Pyx_XDECREF(__pyx_t_77); + __Pyx_XDECREF(__pyx_t_78); + if (__pyx_m) { + if (__pyx_d) { + __Pyx_AddTraceback("init aiohttp._http_parser", __pyx_clineno, __pyx_lineno, __pyx_filename); + } + Py_CLEAR(__pyx_m); + } else if (!PyErr_Occurred()) { + PyErr_SetString(PyExc_ImportError, "init aiohttp._http_parser"); + } + __pyx_L0:; + __Pyx_RefNannyFinishContext(); + #if CYTHON_PEP489_MULTI_PHASE_INIT + return (__pyx_m != NULL) ? 0 : -1; + #elif PY_MAJOR_VERSION >= 3 + return __pyx_m; + #else + return; + #endif +} + +/* --- Runtime support code --- */ +/* Refnanny */ +#if CYTHON_REFNANNY +static __Pyx_RefNannyAPIStruct *__Pyx_RefNannyImportAPI(const char *modname) { + PyObject *m = NULL, *p = NULL; + void *r = NULL; + m = PyImport_ImportModule(modname); + if (!m) goto end; + p = PyObject_GetAttrString(m, "RefNannyAPI"); + if (!p) goto end; + r = PyLong_AsVoidPtr(p); +end: + Py_XDECREF(p); + Py_XDECREF(m); + return (__Pyx_RefNannyAPIStruct *)r; +} +#endif + +/* PyObjectGetAttrStr */ +#if CYTHON_USE_TYPE_SLOTS +static CYTHON_INLINE PyObject* __Pyx_PyObject_GetAttrStr(PyObject* obj, PyObject* attr_name) { + PyTypeObject* tp = Py_TYPE(obj); + if (likely(tp->tp_getattro)) + return tp->tp_getattro(obj, attr_name); +#if PY_MAJOR_VERSION < 3 + if (likely(tp->tp_getattr)) + return tp->tp_getattr(obj, PyString_AS_STRING(attr_name)); +#endif + return PyObject_GetAttr(obj, attr_name); +} +#endif + +/* GetBuiltinName */ +static PyObject *__Pyx_GetBuiltinName(PyObject *name) { + PyObject* result = __Pyx_PyObject_GetAttrStr(__pyx_b, name); + if (unlikely(!result)) { + PyErr_Format(PyExc_NameError, +#if PY_MAJOR_VERSION >= 3 + "name '%U' is not defined", name); +#else + "name '%.200s' is not defined", PyString_AS_STRING(name)); +#endif + } + return result; +} + +/* GetItemInt */ +static PyObject *__Pyx_GetItemInt_Generic(PyObject *o, PyObject* j) { + PyObject *r; + if (!j) return NULL; + r = PyObject_GetItem(o, j); + Py_DECREF(j); + return r; +} +static CYTHON_INLINE PyObject *__Pyx_GetItemInt_List_Fast(PyObject *o, Py_ssize_t i, + CYTHON_NCP_UNUSED int wraparound, + CYTHON_NCP_UNUSED int boundscheck) { +#if CYTHON_ASSUME_SAFE_MACROS && !CYTHON_AVOID_BORROWED_REFS + Py_ssize_t wrapped_i = i; + if (wraparound & unlikely(i < 0)) { + wrapped_i += PyList_GET_SIZE(o); + } + if ((!boundscheck) || likely(__Pyx_is_valid_index(wrapped_i, PyList_GET_SIZE(o)))) { + PyObject *r = PyList_GET_ITEM(o, wrapped_i); + Py_INCREF(r); + return r; + } + return __Pyx_GetItemInt_Generic(o, PyInt_FromSsize_t(i)); +#else + return PySequence_GetItem(o, i); +#endif +} +static CYTHON_INLINE PyObject *__Pyx_GetItemInt_Tuple_Fast(PyObject *o, Py_ssize_t i, + CYTHON_NCP_UNUSED int wraparound, + CYTHON_NCP_UNUSED int boundscheck) { +#if CYTHON_ASSUME_SAFE_MACROS && !CYTHON_AVOID_BORROWED_REFS + Py_ssize_t wrapped_i = i; + if (wraparound & unlikely(i < 0)) { + wrapped_i += PyTuple_GET_SIZE(o); + } + if ((!boundscheck) || likely(__Pyx_is_valid_index(wrapped_i, PyTuple_GET_SIZE(o)))) { + PyObject *r = PyTuple_GET_ITEM(o, wrapped_i); + Py_INCREF(r); + return r; + } + return __Pyx_GetItemInt_Generic(o, PyInt_FromSsize_t(i)); +#else + return PySequence_GetItem(o, i); +#endif +} +static CYTHON_INLINE PyObject *__Pyx_GetItemInt_Fast(PyObject *o, Py_ssize_t i, int is_list, + CYTHON_NCP_UNUSED int wraparound, + CYTHON_NCP_UNUSED int boundscheck) { +#if CYTHON_ASSUME_SAFE_MACROS && !CYTHON_AVOID_BORROWED_REFS && CYTHON_USE_TYPE_SLOTS + if (is_list || PyList_CheckExact(o)) { + Py_ssize_t n = ((!wraparound) | likely(i >= 0)) ? i : i + PyList_GET_SIZE(o); + if ((!boundscheck) || (likely(__Pyx_is_valid_index(n, PyList_GET_SIZE(o))))) { + PyObject *r = PyList_GET_ITEM(o, n); + Py_INCREF(r); + return r; + } + } + else if (PyTuple_CheckExact(o)) { + Py_ssize_t n = ((!wraparound) | likely(i >= 0)) ? i : i + PyTuple_GET_SIZE(o); + if ((!boundscheck) || likely(__Pyx_is_valid_index(n, PyTuple_GET_SIZE(o)))) { + PyObject *r = PyTuple_GET_ITEM(o, n); + Py_INCREF(r); + return r; + } + } else { + PySequenceMethods *m = Py_TYPE(o)->tp_as_sequence; + if (likely(m && m->sq_item)) { + if (wraparound && unlikely(i < 0) && likely(m->sq_length)) { + Py_ssize_t l = m->sq_length(o); + if (likely(l >= 0)) { + i += l; + } else { + if (!PyErr_ExceptionMatches(PyExc_OverflowError)) + return NULL; + PyErr_Clear(); + } + } + return m->sq_item(o, i); + } + } +#else + if (is_list || PySequence_Check(o)) { + return PySequence_GetItem(o, i); + } +#endif + return __Pyx_GetItemInt_Generic(o, PyInt_FromSsize_t(i)); +} + +/* decode_c_bytes */ +static CYTHON_INLINE PyObject* __Pyx_decode_c_bytes( + const char* cstring, Py_ssize_t length, Py_ssize_t start, Py_ssize_t stop, + const char* encoding, const char* errors, + PyObject* (*decode_func)(const char *s, Py_ssize_t size, const char *errors)) { + if (unlikely((start < 0) | (stop < 0))) { + if (start < 0) { + start += length; + if (start < 0) + start = 0; + } + if (stop < 0) + stop += length; + } + if (stop > length) + stop = length; + if (unlikely(stop <= start)) + return __Pyx_NewRef(__pyx_empty_unicode); + length = stop - start; + cstring += start; + if (decode_func) { + return decode_func(cstring, length, errors); + } else { + return PyUnicode_Decode(cstring, length, encoding, errors); + } +} + +/* RaiseArgTupleInvalid */ +static void __Pyx_RaiseArgtupleInvalid( + const char* func_name, + int exact, + Py_ssize_t num_min, + Py_ssize_t num_max, + Py_ssize_t num_found) +{ + Py_ssize_t num_expected; + const char *more_or_less; + if (num_found < num_min) { + num_expected = num_min; + more_or_less = "at least"; + } else { + num_expected = num_max; + more_or_less = "at most"; + } + if (exact) { + more_or_less = "exactly"; + } + PyErr_Format(PyExc_TypeError, + "%.200s() takes %.8s %" CYTHON_FORMAT_SSIZE_T "d positional argument%.1s (%" CYTHON_FORMAT_SSIZE_T "d given)", + func_name, more_or_less, num_expected, + (num_expected == 1) ? "" : "s", num_found); +} + +/* RaiseDoubleKeywords */ +static void __Pyx_RaiseDoubleKeywordsError( + const char* func_name, + PyObject* kw_name) +{ + PyErr_Format(PyExc_TypeError, + #if PY_MAJOR_VERSION >= 3 + "%s() got multiple values for keyword argument '%U'", func_name, kw_name); + #else + "%s() got multiple values for keyword argument '%s'", func_name, + PyString_AsString(kw_name)); + #endif +} + +/* ParseKeywords */ +static int __Pyx_ParseOptionalKeywords( + PyObject *kwds, + PyObject **argnames[], + PyObject *kwds2, + PyObject *values[], + Py_ssize_t num_pos_args, + const char* function_name) +{ + PyObject *key = 0, *value = 0; + Py_ssize_t pos = 0; + PyObject*** name; + PyObject*** first_kw_arg = argnames + num_pos_args; + while (PyDict_Next(kwds, &pos, &key, &value)) { + name = first_kw_arg; + while (*name && (**name != key)) name++; + if (*name) { + values[name-argnames] = value; + continue; + } + name = first_kw_arg; + #if PY_MAJOR_VERSION < 3 + if (likely(PyString_Check(key))) { + while (*name) { + if ((CYTHON_COMPILING_IN_PYPY || PyString_GET_SIZE(**name) == PyString_GET_SIZE(key)) + && _PyString_Eq(**name, key)) { + values[name-argnames] = value; + break; + } + name++; + } + if (*name) continue; + else { + PyObject*** argname = argnames; + while (argname != first_kw_arg) { + if ((**argname == key) || ( + (CYTHON_COMPILING_IN_PYPY || PyString_GET_SIZE(**argname) == PyString_GET_SIZE(key)) + && _PyString_Eq(**argname, key))) { + goto arg_passed_twice; + } + argname++; + } + } + } else + #endif + if (likely(PyUnicode_Check(key))) { + while (*name) { + int cmp = (**name == key) ? 0 : + #if !CYTHON_COMPILING_IN_PYPY && PY_MAJOR_VERSION >= 3 + (__Pyx_PyUnicode_GET_LENGTH(**name) != __Pyx_PyUnicode_GET_LENGTH(key)) ? 1 : + #endif + PyUnicode_Compare(**name, key); + if (cmp < 0 && unlikely(PyErr_Occurred())) goto bad; + if (cmp == 0) { + values[name-argnames] = value; + break; + } + name++; + } + if (*name) continue; + else { + PyObject*** argname = argnames; + while (argname != first_kw_arg) { + int cmp = (**argname == key) ? 0 : + #if !CYTHON_COMPILING_IN_PYPY && PY_MAJOR_VERSION >= 3 + (__Pyx_PyUnicode_GET_LENGTH(**argname) != __Pyx_PyUnicode_GET_LENGTH(key)) ? 1 : + #endif + PyUnicode_Compare(**argname, key); + if (cmp < 0 && unlikely(PyErr_Occurred())) goto bad; + if (cmp == 0) goto arg_passed_twice; + argname++; + } + } + } else + goto invalid_keyword_type; + if (kwds2) { + if (unlikely(PyDict_SetItem(kwds2, key, value))) goto bad; + } else { + goto invalid_keyword; + } + } + return 0; +arg_passed_twice: + __Pyx_RaiseDoubleKeywordsError(function_name, key); + goto bad; +invalid_keyword_type: + PyErr_Format(PyExc_TypeError, + "%.200s() keywords must be strings", function_name); + goto bad; +invalid_keyword: + PyErr_Format(PyExc_TypeError, + #if PY_MAJOR_VERSION < 3 + "%.200s() got an unexpected keyword argument '%.200s'", + function_name, PyString_AsString(key)); + #else + "%s() got an unexpected keyword argument '%U'", + function_name, key); + #endif +bad: + return -1; +} + +/* None */ +static CYTHON_INLINE void __Pyx_RaiseClosureNameError(const char *varname) { + PyErr_Format(PyExc_NameError, "free variable '%s' referenced before assignment in enclosing scope", varname); +} + +/* RaiseTooManyValuesToUnpack */ +static CYTHON_INLINE void __Pyx_RaiseTooManyValuesError(Py_ssize_t expected) { + PyErr_Format(PyExc_ValueError, + "too many values to unpack (expected %" CYTHON_FORMAT_SSIZE_T "d)", expected); +} + +/* RaiseNeedMoreValuesToUnpack */ +static CYTHON_INLINE void __Pyx_RaiseNeedMoreValuesError(Py_ssize_t index) { + PyErr_Format(PyExc_ValueError, + "need more than %" CYTHON_FORMAT_SSIZE_T "d value%.1s to unpack", + index, (index == 1) ? "" : "s"); +} + +/* IterFinish */ +static CYTHON_INLINE int __Pyx_IterFinish(void) { +#if CYTHON_FAST_THREAD_STATE + PyThreadState *tstate = __Pyx_PyThreadState_Current; + PyObject* exc_type = tstate->curexc_type; + if (unlikely(exc_type)) { + if (likely(__Pyx_PyErr_GivenExceptionMatches(exc_type, PyExc_StopIteration))) { + PyObject *exc_value, *exc_tb; + exc_value = tstate->curexc_value; + exc_tb = tstate->curexc_traceback; + tstate->curexc_type = 0; + tstate->curexc_value = 0; + tstate->curexc_traceback = 0; + Py_DECREF(exc_type); + Py_XDECREF(exc_value); + Py_XDECREF(exc_tb); + return 0; + } else { + return -1; + } + } + return 0; +#else + if (unlikely(PyErr_Occurred())) { + if (likely(PyErr_ExceptionMatches(PyExc_StopIteration))) { + PyErr_Clear(); + return 0; + } else { + return -1; + } + } + return 0; +#endif +} + +/* UnpackItemEndCheck */ +static int __Pyx_IternextUnpackEndCheck(PyObject *retval, Py_ssize_t expected) { + if (unlikely(retval)) { + Py_DECREF(retval); + __Pyx_RaiseTooManyValuesError(expected); + return -1; + } else { + return __Pyx_IterFinish(); + } + return 0; +} + +/* KeywordStringCheck */ +static int __Pyx_CheckKeywordStrings( + PyObject *kwdict, + const char* function_name, + int kw_allowed) +{ + PyObject* key = 0; + Py_ssize_t pos = 0; +#if CYTHON_COMPILING_IN_PYPY + if (!kw_allowed && PyDict_Next(kwdict, &pos, &key, 0)) + goto invalid_keyword; + return 1; +#else + while (PyDict_Next(kwdict, &pos, &key, 0)) { + #if PY_MAJOR_VERSION < 3 + if (unlikely(!PyString_Check(key))) + #endif + if (unlikely(!PyUnicode_Check(key))) + goto invalid_keyword_type; + } + if ((!kw_allowed) && unlikely(key)) + goto invalid_keyword; + return 1; +invalid_keyword_type: + PyErr_Format(PyExc_TypeError, + "%.200s() keywords must be strings", function_name); + return 0; +#endif +invalid_keyword: + PyErr_Format(PyExc_TypeError, + #if PY_MAJOR_VERSION < 3 + "%.200s() got an unexpected keyword argument '%.200s'", + function_name, PyString_AsString(key)); + #else + "%s() got an unexpected keyword argument '%U'", + function_name, key); + #endif + return 0; +} + +/* ExtTypeTest */ +static CYTHON_INLINE int __Pyx_TypeTest(PyObject *obj, PyTypeObject *type) { + if (unlikely(!type)) { + PyErr_SetString(PyExc_SystemError, "Missing type object"); + return 0; + } + if (likely(__Pyx_TypeCheck(obj, type))) + return 1; + PyErr_Format(PyExc_TypeError, "Cannot convert %.200s to %.200s", + Py_TYPE(obj)->tp_name, type->tp_name); + return 0; +} + +/* DictGetItem */ +#if PY_MAJOR_VERSION >= 3 && !CYTHON_COMPILING_IN_PYPY +static PyObject *__Pyx_PyDict_GetItem(PyObject *d, PyObject* key) { + PyObject *value; + value = PyDict_GetItemWithError(d, key); + if (unlikely(!value)) { + if (!PyErr_Occurred()) { + if (unlikely(PyTuple_Check(key))) { + PyObject* args = PyTuple_Pack(1, key); + if (likely(args)) { + PyErr_SetObject(PyExc_KeyError, args); + Py_DECREF(args); + } + } else { + PyErr_SetObject(PyExc_KeyError, key); + } + } + return NULL; + } + Py_INCREF(value); + return value; +} +#endif + +/* PyErrExceptionMatches */ +#if CYTHON_FAST_THREAD_STATE +static int __Pyx_PyErr_ExceptionMatchesTuple(PyObject *exc_type, PyObject *tuple) { + Py_ssize_t i, n; + n = PyTuple_GET_SIZE(tuple); +#if PY_MAJOR_VERSION >= 3 + for (i=0; icurexc_type; + if (exc_type == err) return 1; + if (unlikely(!exc_type)) return 0; + if (unlikely(PyTuple_Check(err))) + return __Pyx_PyErr_ExceptionMatchesTuple(exc_type, err); + return __Pyx_PyErr_GivenExceptionMatches(exc_type, err); +} +#endif + +/* PyErrFetchRestore */ +#if CYTHON_FAST_THREAD_STATE +static CYTHON_INLINE void __Pyx_ErrRestoreInState(PyThreadState *tstate, PyObject *type, PyObject *value, PyObject *tb) { + PyObject *tmp_type, *tmp_value, *tmp_tb; + tmp_type = tstate->curexc_type; + tmp_value = tstate->curexc_value; + tmp_tb = tstate->curexc_traceback; + tstate->curexc_type = type; + tstate->curexc_value = value; + tstate->curexc_traceback = tb; + Py_XDECREF(tmp_type); + Py_XDECREF(tmp_value); + Py_XDECREF(tmp_tb); +} +static CYTHON_INLINE void __Pyx_ErrFetchInState(PyThreadState *tstate, PyObject **type, PyObject **value, PyObject **tb) { + *type = tstate->curexc_type; + *value = tstate->curexc_value; + *tb = tstate->curexc_traceback; + tstate->curexc_type = 0; + tstate->curexc_value = 0; + tstate->curexc_traceback = 0; +} +#endif + +/* GetAttr */ +static CYTHON_INLINE PyObject *__Pyx_GetAttr(PyObject *o, PyObject *n) { +#if CYTHON_USE_TYPE_SLOTS +#if PY_MAJOR_VERSION >= 3 + if (likely(PyUnicode_Check(n))) +#else + if (likely(PyString_Check(n))) +#endif + return __Pyx_PyObject_GetAttrStr(o, n); +#endif + return PyObject_GetAttr(o, n); +} + +/* GetAttr3 */ +static PyObject *__Pyx_GetAttr3Default(PyObject *d) { + __Pyx_PyThreadState_declare + __Pyx_PyThreadState_assign + if (unlikely(!__Pyx_PyErr_ExceptionMatches(PyExc_AttributeError))) + return NULL; + __Pyx_PyErr_Clear(); + Py_INCREF(d); + return d; +} +static CYTHON_INLINE PyObject *__Pyx_GetAttr3(PyObject *o, PyObject *n, PyObject *d) { + PyObject *r = __Pyx_GetAttr(o, n); + return (likely(r)) ? r : __Pyx_GetAttr3Default(d); +} + +/* PyDictVersioning */ +#if CYTHON_USE_DICT_VERSIONS && CYTHON_USE_TYPE_SLOTS +static CYTHON_INLINE PY_UINT64_T __Pyx_get_tp_dict_version(PyObject *obj) { + PyObject *dict = Py_TYPE(obj)->tp_dict; + return likely(dict) ? __PYX_GET_DICT_VERSION(dict) : 0; +} +static CYTHON_INLINE PY_UINT64_T __Pyx_get_object_dict_version(PyObject *obj) { + PyObject **dictptr = NULL; + Py_ssize_t offset = Py_TYPE(obj)->tp_dictoffset; + if (offset) { +#if CYTHON_COMPILING_IN_CPYTHON + dictptr = (likely(offset > 0)) ? (PyObject **) ((char *)obj + offset) : _PyObject_GetDictPtr(obj); +#else + dictptr = _PyObject_GetDictPtr(obj); +#endif + } + return (dictptr && *dictptr) ? __PYX_GET_DICT_VERSION(*dictptr) : 0; +} +static CYTHON_INLINE int __Pyx_object_dict_version_matches(PyObject* obj, PY_UINT64_T tp_dict_version, PY_UINT64_T obj_dict_version) { + PyObject *dict = Py_TYPE(obj)->tp_dict; + if (unlikely(!dict) || unlikely(tp_dict_version != __PYX_GET_DICT_VERSION(dict))) + return 0; + return obj_dict_version == __Pyx_get_object_dict_version(obj); +} +#endif + +/* GetModuleGlobalName */ +#if CYTHON_USE_DICT_VERSIONS +static PyObject *__Pyx__GetModuleGlobalName(PyObject *name, PY_UINT64_T *dict_version, PyObject **dict_cached_value) +#else +static CYTHON_INLINE PyObject *__Pyx__GetModuleGlobalName(PyObject *name) +#endif +{ + PyObject *result; +#if !CYTHON_AVOID_BORROWED_REFS +#if CYTHON_COMPILING_IN_CPYTHON && PY_VERSION_HEX >= 0x030500A1 + result = _PyDict_GetItem_KnownHash(__pyx_d, name, ((PyASCIIObject *) name)->hash); + __PYX_UPDATE_DICT_CACHE(__pyx_d, result, *dict_cached_value, *dict_version) + if (likely(result)) { + return __Pyx_NewRef(result); + } else if (unlikely(PyErr_Occurred())) { + return NULL; + } +#else + result = PyDict_GetItem(__pyx_d, name); + __PYX_UPDATE_DICT_CACHE(__pyx_d, result, *dict_cached_value, *dict_version) + if (likely(result)) { + return __Pyx_NewRef(result); + } +#endif +#else + result = PyObject_GetItem(__pyx_d, name); + __PYX_UPDATE_DICT_CACHE(__pyx_d, result, *dict_cached_value, *dict_version) + if (likely(result)) { + return __Pyx_NewRef(result); + } + PyErr_Clear(); +#endif + return __Pyx_GetBuiltinName(name); +} + +/* PyFunctionFastCall */ +#if CYTHON_FAST_PYCALL +static PyObject* __Pyx_PyFunction_FastCallNoKw(PyCodeObject *co, PyObject **args, Py_ssize_t na, + PyObject *globals) { + PyFrameObject *f; + PyThreadState *tstate = __Pyx_PyThreadState_Current; + PyObject **fastlocals; + Py_ssize_t i; + PyObject *result; + assert(globals != NULL); + /* XXX Perhaps we should create a specialized + PyFrame_New() that doesn't take locals, but does + take builtins without sanity checking them. + */ + assert(tstate != NULL); + f = PyFrame_New(tstate, co, globals, NULL); + if (f == NULL) { + return NULL; + } + fastlocals = __Pyx_PyFrame_GetLocalsplus(f); + for (i = 0; i < na; i++) { + Py_INCREF(*args); + fastlocals[i] = *args++; + } + result = PyEval_EvalFrameEx(f,0); + ++tstate->recursion_depth; + Py_DECREF(f); + --tstate->recursion_depth; + return result; +} +#if 1 || PY_VERSION_HEX < 0x030600B1 +static PyObject *__Pyx_PyFunction_FastCallDict(PyObject *func, PyObject **args, Py_ssize_t nargs, PyObject *kwargs) { + PyCodeObject *co = (PyCodeObject *)PyFunction_GET_CODE(func); + PyObject *globals = PyFunction_GET_GLOBALS(func); + PyObject *argdefs = PyFunction_GET_DEFAULTS(func); + PyObject *closure; +#if PY_MAJOR_VERSION >= 3 + PyObject *kwdefs; +#endif + PyObject *kwtuple, **k; + PyObject **d; + Py_ssize_t nd; + Py_ssize_t nk; + PyObject *result; + assert(kwargs == NULL || PyDict_Check(kwargs)); + nk = kwargs ? PyDict_Size(kwargs) : 0; + if (Py_EnterRecursiveCall((char*)" while calling a Python object")) { + return NULL; + } + if ( +#if PY_MAJOR_VERSION >= 3 + co->co_kwonlyargcount == 0 && +#endif + likely(kwargs == NULL || nk == 0) && + co->co_flags == (CO_OPTIMIZED | CO_NEWLOCALS | CO_NOFREE)) { + if (argdefs == NULL && co->co_argcount == nargs) { + result = __Pyx_PyFunction_FastCallNoKw(co, args, nargs, globals); + goto done; + } + else if (nargs == 0 && argdefs != NULL + && co->co_argcount == Py_SIZE(argdefs)) { + /* function called with no arguments, but all parameters have + a default value: use default values as arguments .*/ + args = &PyTuple_GET_ITEM(argdefs, 0); + result =__Pyx_PyFunction_FastCallNoKw(co, args, Py_SIZE(argdefs), globals); + goto done; + } + } + if (kwargs != NULL) { + Py_ssize_t pos, i; + kwtuple = PyTuple_New(2 * nk); + if (kwtuple == NULL) { + result = NULL; + goto done; + } + k = &PyTuple_GET_ITEM(kwtuple, 0); + pos = i = 0; + while (PyDict_Next(kwargs, &pos, &k[i], &k[i+1])) { + Py_INCREF(k[i]); + Py_INCREF(k[i+1]); + i += 2; + } + nk = i / 2; + } + else { + kwtuple = NULL; + k = NULL; + } + closure = PyFunction_GET_CLOSURE(func); +#if PY_MAJOR_VERSION >= 3 + kwdefs = PyFunction_GET_KW_DEFAULTS(func); +#endif + if (argdefs != NULL) { + d = &PyTuple_GET_ITEM(argdefs, 0); + nd = Py_SIZE(argdefs); + } + else { + d = NULL; + nd = 0; + } +#if PY_MAJOR_VERSION >= 3 + result = PyEval_EvalCodeEx((PyObject*)co, globals, (PyObject *)NULL, + args, (int)nargs, + k, (int)nk, + d, (int)nd, kwdefs, closure); +#else + result = PyEval_EvalCodeEx(co, globals, (PyObject *)NULL, + args, (int)nargs, + k, (int)nk, + d, (int)nd, closure); +#endif + Py_XDECREF(kwtuple); +done: + Py_LeaveRecursiveCall(); + return result; +} +#endif +#endif + +/* PyObjectCall */ +#if CYTHON_COMPILING_IN_CPYTHON +static CYTHON_INLINE PyObject* __Pyx_PyObject_Call(PyObject *func, PyObject *arg, PyObject *kw) { + PyObject *result; + ternaryfunc call = Py_TYPE(func)->tp_call; + if (unlikely(!call)) + return PyObject_Call(func, arg, kw); + if (unlikely(Py_EnterRecursiveCall((char*)" while calling a Python object"))) + return NULL; + result = (*call)(func, arg, kw); + Py_LeaveRecursiveCall(); + if (unlikely(!result) && unlikely(!PyErr_Occurred())) { + PyErr_SetString( + PyExc_SystemError, + "NULL result without error in PyObject_Call"); + } + return result; +} +#endif + +/* PyObjectCallMethO */ +#if CYTHON_COMPILING_IN_CPYTHON +static CYTHON_INLINE PyObject* __Pyx_PyObject_CallMethO(PyObject *func, PyObject *arg) { + PyObject *self, *result; + PyCFunction cfunc; + cfunc = PyCFunction_GET_FUNCTION(func); + self = PyCFunction_GET_SELF(func); + if (unlikely(Py_EnterRecursiveCall((char*)" while calling a Python object"))) + return NULL; + result = cfunc(self, arg); + Py_LeaveRecursiveCall(); + if (unlikely(!result) && unlikely(!PyErr_Occurred())) { + PyErr_SetString( + PyExc_SystemError, + "NULL result without error in PyObject_Call"); + } + return result; +} +#endif + +/* PyObjectCallNoArg */ +#if CYTHON_COMPILING_IN_CPYTHON +static CYTHON_INLINE PyObject* __Pyx_PyObject_CallNoArg(PyObject *func) { +#if CYTHON_FAST_PYCALL + if (PyFunction_Check(func)) { + return __Pyx_PyFunction_FastCall(func, NULL, 0); + } +#endif +#ifdef __Pyx_CyFunction_USED + if (likely(PyCFunction_Check(func) || __Pyx_CyFunction_Check(func))) +#else + if (likely(PyCFunction_Check(func))) +#endif + { + if (likely(PyCFunction_GET_FLAGS(func) & METH_NOARGS)) { + return __Pyx_PyObject_CallMethO(func, NULL); + } + } + return __Pyx_PyObject_Call(func, __pyx_empty_tuple, NULL); +} +#endif + +/* PyCFunctionFastCall */ +#if CYTHON_FAST_PYCCALL +static CYTHON_INLINE PyObject * __Pyx_PyCFunction_FastCall(PyObject *func_obj, PyObject **args, Py_ssize_t nargs) { + PyCFunctionObject *func = (PyCFunctionObject*)func_obj; + PyCFunction meth = PyCFunction_GET_FUNCTION(func); + PyObject *self = PyCFunction_GET_SELF(func); + int flags = PyCFunction_GET_FLAGS(func); + assert(PyCFunction_Check(func)); + assert(METH_FASTCALL == (flags & ~(METH_CLASS | METH_STATIC | METH_COEXIST | METH_KEYWORDS | METH_STACKLESS))); + assert(nargs >= 0); + assert(nargs == 0 || args != NULL); + /* _PyCFunction_FastCallDict() must not be called with an exception set, + because it may clear it (directly or indirectly) and so the + caller loses its exception */ + assert(!PyErr_Occurred()); + if ((PY_VERSION_HEX < 0x030700A0) || unlikely(flags & METH_KEYWORDS)) { + return (*((__Pyx_PyCFunctionFastWithKeywords)(void*)meth)) (self, args, nargs, NULL); + } else { + return (*((__Pyx_PyCFunctionFast)(void*)meth)) (self, args, nargs); + } +} +#endif + +/* PyObjectCallOneArg */ +#if CYTHON_COMPILING_IN_CPYTHON +static PyObject* __Pyx__PyObject_CallOneArg(PyObject *func, PyObject *arg) { + PyObject *result; + PyObject *args = PyTuple_New(1); + if (unlikely(!args)) return NULL; + Py_INCREF(arg); + PyTuple_SET_ITEM(args, 0, arg); + result = __Pyx_PyObject_Call(func, args, NULL); + Py_DECREF(args); + return result; +} +static CYTHON_INLINE PyObject* __Pyx_PyObject_CallOneArg(PyObject *func, PyObject *arg) { +#if CYTHON_FAST_PYCALL + if (PyFunction_Check(func)) { + return __Pyx_PyFunction_FastCall(func, &arg, 1); + } +#endif + if (likely(PyCFunction_Check(func))) { + if (likely(PyCFunction_GET_FLAGS(func) & METH_O)) { + return __Pyx_PyObject_CallMethO(func, arg); +#if CYTHON_FAST_PYCCALL + } else if (__Pyx_PyFastCFunction_Check(func)) { + return __Pyx_PyCFunction_FastCall(func, &arg, 1); +#endif + } + } + return __Pyx__PyObject_CallOneArg(func, arg); +} +#else +static CYTHON_INLINE PyObject* __Pyx_PyObject_CallOneArg(PyObject *func, PyObject *arg) { + PyObject *result; + PyObject *args = PyTuple_Pack(1, arg); + if (unlikely(!args)) return NULL; + result = __Pyx_PyObject_Call(func, args, NULL); + Py_DECREF(args); + return result; +} +#endif + +/* PyObjectCall2Args */ +static CYTHON_UNUSED PyObject* __Pyx_PyObject_Call2Args(PyObject* function, PyObject* arg1, PyObject* arg2) { + PyObject *args, *result = NULL; + #if CYTHON_FAST_PYCALL + if (PyFunction_Check(function)) { + PyObject *args[2] = {arg1, arg2}; + return __Pyx_PyFunction_FastCall(function, args, 2); + } + #endif + #if CYTHON_FAST_PYCCALL + if (__Pyx_PyFastCFunction_Check(function)) { + PyObject *args[2] = {arg1, arg2}; + return __Pyx_PyCFunction_FastCall(function, args, 2); + } + #endif + args = PyTuple_New(2); + if (unlikely(!args)) goto done; + Py_INCREF(arg1); + PyTuple_SET_ITEM(args, 0, arg1); + Py_INCREF(arg2); + PyTuple_SET_ITEM(args, 1, arg2); + Py_INCREF(function); + result = __Pyx_PyObject_Call(function, args, NULL); + Py_DECREF(args); + Py_DECREF(function); +done: + return result; +} + +/* RaiseException */ +#if PY_MAJOR_VERSION < 3 +static void __Pyx_Raise(PyObject *type, PyObject *value, PyObject *tb, + CYTHON_UNUSED PyObject *cause) { + __Pyx_PyThreadState_declare + Py_XINCREF(type); + if (!value || value == Py_None) + value = NULL; + else + Py_INCREF(value); + if (!tb || tb == Py_None) + tb = NULL; + else { + Py_INCREF(tb); + if (!PyTraceBack_Check(tb)) { + PyErr_SetString(PyExc_TypeError, + "raise: arg 3 must be a traceback or None"); + goto raise_error; + } + } + if (PyType_Check(type)) { +#if CYTHON_COMPILING_IN_PYPY + if (!value) { + Py_INCREF(Py_None); + value = Py_None; + } +#endif + PyErr_NormalizeException(&type, &value, &tb); + } else { + if (value) { + PyErr_SetString(PyExc_TypeError, + "instance exception may not have a separate value"); + goto raise_error; + } + value = type; + type = (PyObject*) Py_TYPE(type); + Py_INCREF(type); + if (!PyType_IsSubtype((PyTypeObject *)type, (PyTypeObject *)PyExc_BaseException)) { + PyErr_SetString(PyExc_TypeError, + "raise: exception class must be a subclass of BaseException"); + goto raise_error; + } + } + __Pyx_PyThreadState_assign + __Pyx_ErrRestore(type, value, tb); + return; +raise_error: + Py_XDECREF(value); + Py_XDECREF(type); + Py_XDECREF(tb); + return; +} +#else +static void __Pyx_Raise(PyObject *type, PyObject *value, PyObject *tb, PyObject *cause) { + PyObject* owned_instance = NULL; + if (tb == Py_None) { + tb = 0; + } else if (tb && !PyTraceBack_Check(tb)) { + PyErr_SetString(PyExc_TypeError, + "raise: arg 3 must be a traceback or None"); + goto bad; + } + if (value == Py_None) + value = 0; + if (PyExceptionInstance_Check(type)) { + if (value) { + PyErr_SetString(PyExc_TypeError, + "instance exception may not have a separate value"); + goto bad; + } + value = type; + type = (PyObject*) Py_TYPE(value); + } else if (PyExceptionClass_Check(type)) { + PyObject *instance_class = NULL; + if (value && PyExceptionInstance_Check(value)) { + instance_class = (PyObject*) Py_TYPE(value); + if (instance_class != type) { + int is_subclass = PyObject_IsSubclass(instance_class, type); + if (!is_subclass) { + instance_class = NULL; + } else if (unlikely(is_subclass == -1)) { + goto bad; + } else { + type = instance_class; + } + } + } + if (!instance_class) { + PyObject *args; + if (!value) + args = PyTuple_New(0); + else if (PyTuple_Check(value)) { + Py_INCREF(value); + args = value; + } else + args = PyTuple_Pack(1, value); + if (!args) + goto bad; + owned_instance = PyObject_Call(type, args, NULL); + Py_DECREF(args); + if (!owned_instance) + goto bad; + value = owned_instance; + if (!PyExceptionInstance_Check(value)) { + PyErr_Format(PyExc_TypeError, + "calling %R should have returned an instance of " + "BaseException, not %R", + type, Py_TYPE(value)); + goto bad; + } + } + } else { + PyErr_SetString(PyExc_TypeError, + "raise: exception class must be a subclass of BaseException"); + goto bad; + } + if (cause) { + PyObject *fixed_cause; + if (cause == Py_None) { + fixed_cause = NULL; + } else if (PyExceptionClass_Check(cause)) { + fixed_cause = PyObject_CallObject(cause, NULL); + if (fixed_cause == NULL) + goto bad; + } else if (PyExceptionInstance_Check(cause)) { + fixed_cause = cause; + Py_INCREF(fixed_cause); + } else { + PyErr_SetString(PyExc_TypeError, + "exception causes must derive from " + "BaseException"); + goto bad; + } + PyException_SetCause(value, fixed_cause); + } + PyErr_SetObject(type, value); + if (tb) { +#if CYTHON_COMPILING_IN_PYPY + PyObject *tmp_type, *tmp_value, *tmp_tb; + PyErr_Fetch(&tmp_type, &tmp_value, &tmp_tb); + Py_INCREF(tb); + PyErr_Restore(tmp_type, tmp_value, tb); + Py_XDECREF(tmp_tb); +#else + PyThreadState *tstate = __Pyx_PyThreadState_Current; + PyObject* tmp_tb = tstate->curexc_traceback; + if (tb != tmp_tb) { + Py_INCREF(tb); + tstate->curexc_traceback = tb; + Py_XDECREF(tmp_tb); + } +#endif + } +bad: + Py_XDECREF(owned_instance); + return; +} +#endif + +/* BytesEquals */ +static CYTHON_INLINE int __Pyx_PyBytes_Equals(PyObject* s1, PyObject* s2, int equals) { +#if CYTHON_COMPILING_IN_PYPY + return PyObject_RichCompareBool(s1, s2, equals); +#else + if (s1 == s2) { + return (equals == Py_EQ); + } else if (PyBytes_CheckExact(s1) & PyBytes_CheckExact(s2)) { + const char *ps1, *ps2; + Py_ssize_t length = PyBytes_GET_SIZE(s1); + if (length != PyBytes_GET_SIZE(s2)) + return (equals == Py_NE); + ps1 = PyBytes_AS_STRING(s1); + ps2 = PyBytes_AS_STRING(s2); + if (ps1[0] != ps2[0]) { + return (equals == Py_NE); + } else if (length == 1) { + return (equals == Py_EQ); + } else { + int result; +#if CYTHON_USE_UNICODE_INTERNALS + Py_hash_t hash1, hash2; + hash1 = ((PyBytesObject*)s1)->ob_shash; + hash2 = ((PyBytesObject*)s2)->ob_shash; + if (hash1 != hash2 && hash1 != -1 && hash2 != -1) { + return (equals == Py_NE); + } +#endif + result = memcmp(ps1, ps2, (size_t)length); + return (equals == Py_EQ) ? (result == 0) : (result != 0); + } + } else if ((s1 == Py_None) & PyBytes_CheckExact(s2)) { + return (equals == Py_NE); + } else if ((s2 == Py_None) & PyBytes_CheckExact(s1)) { + return (equals == Py_NE); + } else { + int result; + PyObject* py_result = PyObject_RichCompare(s1, s2, equals); + if (!py_result) + return -1; + result = __Pyx_PyObject_IsTrue(py_result); + Py_DECREF(py_result); + return result; + } +#endif +} + +/* UnicodeEquals */ +static CYTHON_INLINE int __Pyx_PyUnicode_Equals(PyObject* s1, PyObject* s2, int equals) { +#if CYTHON_COMPILING_IN_PYPY + return PyObject_RichCompareBool(s1, s2, equals); +#else +#if PY_MAJOR_VERSION < 3 + PyObject* owned_ref = NULL; +#endif + int s1_is_unicode, s2_is_unicode; + if (s1 == s2) { + goto return_eq; + } + s1_is_unicode = PyUnicode_CheckExact(s1); + s2_is_unicode = PyUnicode_CheckExact(s2); +#if PY_MAJOR_VERSION < 3 + if ((s1_is_unicode & (!s2_is_unicode)) && PyString_CheckExact(s2)) { + owned_ref = PyUnicode_FromObject(s2); + if (unlikely(!owned_ref)) + return -1; + s2 = owned_ref; + s2_is_unicode = 1; + } else if ((s2_is_unicode & (!s1_is_unicode)) && PyString_CheckExact(s1)) { + owned_ref = PyUnicode_FromObject(s1); + if (unlikely(!owned_ref)) + return -1; + s1 = owned_ref; + s1_is_unicode = 1; + } else if (((!s2_is_unicode) & (!s1_is_unicode))) { + return __Pyx_PyBytes_Equals(s1, s2, equals); + } +#endif + if (s1_is_unicode & s2_is_unicode) { + Py_ssize_t length; + int kind; + void *data1, *data2; + if (unlikely(__Pyx_PyUnicode_READY(s1) < 0) || unlikely(__Pyx_PyUnicode_READY(s2) < 0)) + return -1; + length = __Pyx_PyUnicode_GET_LENGTH(s1); + if (length != __Pyx_PyUnicode_GET_LENGTH(s2)) { + goto return_ne; + } +#if CYTHON_USE_UNICODE_INTERNALS + { + Py_hash_t hash1, hash2; + #if CYTHON_PEP393_ENABLED + hash1 = ((PyASCIIObject*)s1)->hash; + hash2 = ((PyASCIIObject*)s2)->hash; + #else + hash1 = ((PyUnicodeObject*)s1)->hash; + hash2 = ((PyUnicodeObject*)s2)->hash; + #endif + if (hash1 != hash2 && hash1 != -1 && hash2 != -1) { + goto return_ne; + } + } +#endif + kind = __Pyx_PyUnicode_KIND(s1); + if (kind != __Pyx_PyUnicode_KIND(s2)) { + goto return_ne; + } + data1 = __Pyx_PyUnicode_DATA(s1); + data2 = __Pyx_PyUnicode_DATA(s2); + if (__Pyx_PyUnicode_READ(kind, data1, 0) != __Pyx_PyUnicode_READ(kind, data2, 0)) { + goto return_ne; + } else if (length == 1) { + goto return_eq; + } else { + int result = memcmp(data1, data2, (size_t)(length * kind)); + #if PY_MAJOR_VERSION < 3 + Py_XDECREF(owned_ref); + #endif + return (equals == Py_EQ) ? (result == 0) : (result != 0); + } + } else if ((s1 == Py_None) & s2_is_unicode) { + goto return_ne; + } else if ((s2 == Py_None) & s1_is_unicode) { + goto return_ne; + } else { + int result; + PyObject* py_result = PyObject_RichCompare(s1, s2, equals); + #if PY_MAJOR_VERSION < 3 + Py_XDECREF(owned_ref); + #endif + if (!py_result) + return -1; + result = __Pyx_PyObject_IsTrue(py_result); + Py_DECREF(py_result); + return result; + } +return_eq: + #if PY_MAJOR_VERSION < 3 + Py_XDECREF(owned_ref); + #endif + return (equals == Py_EQ); +return_ne: + #if PY_MAJOR_VERSION < 3 + Py_XDECREF(owned_ref); + #endif + return (equals == Py_NE); +#endif +} + +/* SliceObject */ +static CYTHON_INLINE PyObject* __Pyx_PyObject_GetSlice(PyObject* obj, + Py_ssize_t cstart, Py_ssize_t cstop, + PyObject** _py_start, PyObject** _py_stop, PyObject** _py_slice, + int has_cstart, int has_cstop, CYTHON_UNUSED int wraparound) { +#if CYTHON_USE_TYPE_SLOTS + PyMappingMethods* mp; +#if PY_MAJOR_VERSION < 3 + PySequenceMethods* ms = Py_TYPE(obj)->tp_as_sequence; + if (likely(ms && ms->sq_slice)) { + if (!has_cstart) { + if (_py_start && (*_py_start != Py_None)) { + cstart = __Pyx_PyIndex_AsSsize_t(*_py_start); + if ((cstart == (Py_ssize_t)-1) && PyErr_Occurred()) goto bad; + } else + cstart = 0; + } + if (!has_cstop) { + if (_py_stop && (*_py_stop != Py_None)) { + cstop = __Pyx_PyIndex_AsSsize_t(*_py_stop); + if ((cstop == (Py_ssize_t)-1) && PyErr_Occurred()) goto bad; + } else + cstop = PY_SSIZE_T_MAX; + } + if (wraparound && unlikely((cstart < 0) | (cstop < 0)) && likely(ms->sq_length)) { + Py_ssize_t l = ms->sq_length(obj); + if (likely(l >= 0)) { + if (cstop < 0) { + cstop += l; + if (cstop < 0) cstop = 0; + } + if (cstart < 0) { + cstart += l; + if (cstart < 0) cstart = 0; + } + } else { + if (!PyErr_ExceptionMatches(PyExc_OverflowError)) + goto bad; + PyErr_Clear(); + } + } + return ms->sq_slice(obj, cstart, cstop); + } +#endif + mp = Py_TYPE(obj)->tp_as_mapping; + if (likely(mp && mp->mp_subscript)) +#endif + { + PyObject* result; + PyObject *py_slice, *py_start, *py_stop; + if (_py_slice) { + py_slice = *_py_slice; + } else { + PyObject* owned_start = NULL; + PyObject* owned_stop = NULL; + if (_py_start) { + py_start = *_py_start; + } else { + if (has_cstart) { + owned_start = py_start = PyInt_FromSsize_t(cstart); + if (unlikely(!py_start)) goto bad; + } else + py_start = Py_None; + } + if (_py_stop) { + py_stop = *_py_stop; + } else { + if (has_cstop) { + owned_stop = py_stop = PyInt_FromSsize_t(cstop); + if (unlikely(!py_stop)) { + Py_XDECREF(owned_start); + goto bad; + } + } else + py_stop = Py_None; + } + py_slice = PySlice_New(py_start, py_stop, Py_None); + Py_XDECREF(owned_start); + Py_XDECREF(owned_stop); + if (unlikely(!py_slice)) goto bad; + } +#if CYTHON_USE_TYPE_SLOTS + result = mp->mp_subscript(obj, py_slice); +#else + result = PyObject_GetItem(obj, py_slice); +#endif + if (!_py_slice) { + Py_DECREF(py_slice); + } + return result; + } + PyErr_Format(PyExc_TypeError, + "'%.200s' object is unsliceable", Py_TYPE(obj)->tp_name); +bad: + return NULL; +} + +/* PyUnicode_Substring */ +static CYTHON_INLINE PyObject* __Pyx_PyUnicode_Substring( + PyObject* text, Py_ssize_t start, Py_ssize_t stop) { + Py_ssize_t length; + if (unlikely(__Pyx_PyUnicode_READY(text) == -1)) return NULL; + length = __Pyx_PyUnicode_GET_LENGTH(text); + if (start < 0) { + start += length; + if (start < 0) + start = 0; + } + if (stop < 0) + stop += length; + else if (stop > length) + stop = length; + if (stop <= start) + return __Pyx_NewRef(__pyx_empty_unicode); +#if CYTHON_PEP393_ENABLED + return PyUnicode_FromKindAndData(PyUnicode_KIND(text), + PyUnicode_1BYTE_DATA(text) + start*PyUnicode_KIND(text), stop-start); +#else + return PyUnicode_FromUnicode(PyUnicode_AS_UNICODE(text)+start, stop-start); +#endif +} + +/* GetException */ +#if CYTHON_FAST_THREAD_STATE +static int __Pyx__GetException(PyThreadState *tstate, PyObject **type, PyObject **value, PyObject **tb) +#else +static int __Pyx_GetException(PyObject **type, PyObject **value, PyObject **tb) +#endif +{ + PyObject *local_type, *local_value, *local_tb; +#if CYTHON_FAST_THREAD_STATE + PyObject *tmp_type, *tmp_value, *tmp_tb; + local_type = tstate->curexc_type; + local_value = tstate->curexc_value; + local_tb = tstate->curexc_traceback; + tstate->curexc_type = 0; + tstate->curexc_value = 0; + tstate->curexc_traceback = 0; +#else + PyErr_Fetch(&local_type, &local_value, &local_tb); +#endif + PyErr_NormalizeException(&local_type, &local_value, &local_tb); +#if CYTHON_FAST_THREAD_STATE + if (unlikely(tstate->curexc_type)) +#else + if (unlikely(PyErr_Occurred())) +#endif + goto bad; + #if PY_MAJOR_VERSION >= 3 + if (local_tb) { + if (unlikely(PyException_SetTraceback(local_value, local_tb) < 0)) + goto bad; + } + #endif + Py_XINCREF(local_tb); + Py_XINCREF(local_type); + Py_XINCREF(local_value); + *type = local_type; + *value = local_value; + *tb = local_tb; +#if CYTHON_FAST_THREAD_STATE + #if CYTHON_USE_EXC_INFO_STACK + { + _PyErr_StackItem *exc_info = tstate->exc_info; + tmp_type = exc_info->exc_type; + tmp_value = exc_info->exc_value; + tmp_tb = exc_info->exc_traceback; + exc_info->exc_type = local_type; + exc_info->exc_value = local_value; + exc_info->exc_traceback = local_tb; + } + #else + tmp_type = tstate->exc_type; + tmp_value = tstate->exc_value; + tmp_tb = tstate->exc_traceback; + tstate->exc_type = local_type; + tstate->exc_value = local_value; + tstate->exc_traceback = local_tb; + #endif + Py_XDECREF(tmp_type); + Py_XDECREF(tmp_value); + Py_XDECREF(tmp_tb); +#else + PyErr_SetExcInfo(local_type, local_value, local_tb); +#endif + return 0; +bad: + *type = 0; + *value = 0; + *tb = 0; + Py_XDECREF(local_type); + Py_XDECREF(local_value); + Py_XDECREF(local_tb); + return -1; +} + +/* SwapException */ +#if CYTHON_FAST_THREAD_STATE +static CYTHON_INLINE void __Pyx__ExceptionSwap(PyThreadState *tstate, PyObject **type, PyObject **value, PyObject **tb) { + PyObject *tmp_type, *tmp_value, *tmp_tb; + #if CYTHON_USE_EXC_INFO_STACK + _PyErr_StackItem *exc_info = tstate->exc_info; + tmp_type = exc_info->exc_type; + tmp_value = exc_info->exc_value; + tmp_tb = exc_info->exc_traceback; + exc_info->exc_type = *type; + exc_info->exc_value = *value; + exc_info->exc_traceback = *tb; + #else + tmp_type = tstate->exc_type; + tmp_value = tstate->exc_value; + tmp_tb = tstate->exc_traceback; + tstate->exc_type = *type; + tstate->exc_value = *value; + tstate->exc_traceback = *tb; + #endif + *type = tmp_type; + *value = tmp_value; + *tb = tmp_tb; +} +#else +static CYTHON_INLINE void __Pyx_ExceptionSwap(PyObject **type, PyObject **value, PyObject **tb) { + PyObject *tmp_type, *tmp_value, *tmp_tb; + PyErr_GetExcInfo(&tmp_type, &tmp_value, &tmp_tb); + PyErr_SetExcInfo(*type, *value, *tb); + *type = tmp_type; + *value = tmp_value; + *tb = tmp_tb; +} +#endif + +/* GetTopmostException */ +#if CYTHON_USE_EXC_INFO_STACK +static _PyErr_StackItem * +__Pyx_PyErr_GetTopmostException(PyThreadState *tstate) +{ + _PyErr_StackItem *exc_info = tstate->exc_info; + while ((exc_info->exc_type == NULL || exc_info->exc_type == Py_None) && + exc_info->previous_item != NULL) + { + exc_info = exc_info->previous_item; + } + return exc_info; +} +#endif + +/* SaveResetException */ +#if CYTHON_FAST_THREAD_STATE +static CYTHON_INLINE void __Pyx__ExceptionSave(PyThreadState *tstate, PyObject **type, PyObject **value, PyObject **tb) { + #if CYTHON_USE_EXC_INFO_STACK + _PyErr_StackItem *exc_info = __Pyx_PyErr_GetTopmostException(tstate); + *type = exc_info->exc_type; + *value = exc_info->exc_value; + *tb = exc_info->exc_traceback; + #else + *type = tstate->exc_type; + *value = tstate->exc_value; + *tb = tstate->exc_traceback; + #endif + Py_XINCREF(*type); + Py_XINCREF(*value); + Py_XINCREF(*tb); +} +static CYTHON_INLINE void __Pyx__ExceptionReset(PyThreadState *tstate, PyObject *type, PyObject *value, PyObject *tb) { + PyObject *tmp_type, *tmp_value, *tmp_tb; + #if CYTHON_USE_EXC_INFO_STACK + _PyErr_StackItem *exc_info = tstate->exc_info; + tmp_type = exc_info->exc_type; + tmp_value = exc_info->exc_value; + tmp_tb = exc_info->exc_traceback; + exc_info->exc_type = type; + exc_info->exc_value = value; + exc_info->exc_traceback = tb; + #else + tmp_type = tstate->exc_type; + tmp_value = tstate->exc_value; + tmp_tb = tstate->exc_traceback; + tstate->exc_type = type; + tstate->exc_value = value; + tstate->exc_traceback = tb; + #endif + Py_XDECREF(tmp_type); + Py_XDECREF(tmp_value); + Py_XDECREF(tmp_tb); +} +#endif + +/* Import */ +static PyObject *__Pyx_Import(PyObject *name, PyObject *from_list, int level) { + PyObject *empty_list = 0; + PyObject *module = 0; + PyObject *global_dict = 0; + PyObject *empty_dict = 0; + PyObject *list; + #if PY_MAJOR_VERSION < 3 + PyObject *py_import; + py_import = __Pyx_PyObject_GetAttrStr(__pyx_b, __pyx_n_s_import); + if (!py_import) + goto bad; + #endif + if (from_list) + list = from_list; + else { + empty_list = PyList_New(0); + if (!empty_list) + goto bad; + list = empty_list; + } + global_dict = PyModule_GetDict(__pyx_m); + if (!global_dict) + goto bad; + empty_dict = PyDict_New(); + if (!empty_dict) + goto bad; + { + #if PY_MAJOR_VERSION >= 3 + if (level == -1) { + if ((1) && (strchr(__Pyx_MODULE_NAME, '.'))) { + module = PyImport_ImportModuleLevelObject( + name, global_dict, empty_dict, list, 1); + if (!module) { + if (!PyErr_ExceptionMatches(PyExc_ImportError)) + goto bad; + PyErr_Clear(); + } + } + level = 0; + } + #endif + if (!module) { + #if PY_MAJOR_VERSION < 3 + PyObject *py_level = PyInt_FromLong(level); + if (!py_level) + goto bad; + module = PyObject_CallFunctionObjArgs(py_import, + name, global_dict, empty_dict, list, py_level, (PyObject *)NULL); + Py_DECREF(py_level); + #else + module = PyImport_ImportModuleLevelObject( + name, global_dict, empty_dict, list, level); + #endif + } + } +bad: + #if PY_MAJOR_VERSION < 3 + Py_XDECREF(py_import); + #endif + Py_XDECREF(empty_list); + Py_XDECREF(empty_dict); + return module; +} + +/* ImportFrom */ +static PyObject* __Pyx_ImportFrom(PyObject* module, PyObject* name) { + PyObject* value = __Pyx_PyObject_GetAttrStr(module, name); + if (unlikely(!value) && PyErr_ExceptionMatches(PyExc_AttributeError)) { + PyErr_Format(PyExc_ImportError, + #if PY_MAJOR_VERSION < 3 + "cannot import name %.230s", PyString_AS_STRING(name)); + #else + "cannot import name %S", name); + #endif + } + return value; +} + +/* HasAttr */ +static CYTHON_INLINE int __Pyx_HasAttr(PyObject *o, PyObject *n) { + PyObject *r; + if (unlikely(!__Pyx_PyBaseString_Check(n))) { + PyErr_SetString(PyExc_TypeError, + "hasattr(): attribute name must be string"); + return -1; + } + r = __Pyx_GetAttr(o, n); + if (unlikely(!r)) { + PyErr_Clear(); + return 0; + } else { + Py_DECREF(r); + return 1; + } +} + +/* PyObject_GenericGetAttrNoDict */ +#if CYTHON_USE_TYPE_SLOTS && CYTHON_USE_PYTYPE_LOOKUP && PY_VERSION_HEX < 0x03070000 +static PyObject *__Pyx_RaiseGenericGetAttributeError(PyTypeObject *tp, PyObject *attr_name) { + PyErr_Format(PyExc_AttributeError, +#if PY_MAJOR_VERSION >= 3 + "'%.50s' object has no attribute '%U'", + tp->tp_name, attr_name); +#else + "'%.50s' object has no attribute '%.400s'", + tp->tp_name, PyString_AS_STRING(attr_name)); +#endif + return NULL; +} +static CYTHON_INLINE PyObject* __Pyx_PyObject_GenericGetAttrNoDict(PyObject* obj, PyObject* attr_name) { + PyObject *descr; + PyTypeObject *tp = Py_TYPE(obj); + if (unlikely(!PyString_Check(attr_name))) { + return PyObject_GenericGetAttr(obj, attr_name); + } + assert(!tp->tp_dictoffset); + descr = _PyType_Lookup(tp, attr_name); + if (unlikely(!descr)) { + return __Pyx_RaiseGenericGetAttributeError(tp, attr_name); + } + Py_INCREF(descr); + #if PY_MAJOR_VERSION < 3 + if (likely(PyType_HasFeature(Py_TYPE(descr), Py_TPFLAGS_HAVE_CLASS))) + #endif + { + descrgetfunc f = Py_TYPE(descr)->tp_descr_get; + if (unlikely(f)) { + PyObject *res = f(descr, obj, (PyObject *)tp); + Py_DECREF(descr); + return res; + } + } + return descr; +} +#endif + +/* PyObject_GenericGetAttr */ +#if CYTHON_USE_TYPE_SLOTS && CYTHON_USE_PYTYPE_LOOKUP && PY_VERSION_HEX < 0x03070000 +static PyObject* __Pyx_PyObject_GenericGetAttr(PyObject* obj, PyObject* attr_name) { + if (unlikely(Py_TYPE(obj)->tp_dictoffset)) { + return PyObject_GenericGetAttr(obj, attr_name); + } + return __Pyx_PyObject_GenericGetAttrNoDict(obj, attr_name); +} +#endif + +/* PyObjectGetAttrStrNoError */ +static void __Pyx_PyObject_GetAttrStr_ClearAttributeError(void) { + __Pyx_PyThreadState_declare + __Pyx_PyThreadState_assign + if (likely(__Pyx_PyErr_ExceptionMatches(PyExc_AttributeError))) + __Pyx_PyErr_Clear(); +} +static CYTHON_INLINE PyObject* __Pyx_PyObject_GetAttrStrNoError(PyObject* obj, PyObject* attr_name) { + PyObject *result; +#if CYTHON_COMPILING_IN_CPYTHON && CYTHON_USE_TYPE_SLOTS && PY_VERSION_HEX >= 0x030700B1 + PyTypeObject* tp = Py_TYPE(obj); + if (likely(tp->tp_getattro == PyObject_GenericGetAttr)) { + return _PyObject_GenericGetAttrWithDict(obj, attr_name, NULL, 1); + } +#endif + result = __Pyx_PyObject_GetAttrStr(obj, attr_name); + if (unlikely(!result)) { + __Pyx_PyObject_GetAttrStr_ClearAttributeError(); + } + return result; +} + +/* SetupReduce */ +static int __Pyx_setup_reduce_is_named(PyObject* meth, PyObject* name) { + int ret; + PyObject *name_attr; + name_attr = __Pyx_PyObject_GetAttrStr(meth, __pyx_n_s_name); + if (likely(name_attr)) { + ret = PyObject_RichCompareBool(name_attr, name, Py_EQ); + } else { + ret = -1; + } + if (unlikely(ret < 0)) { + PyErr_Clear(); + ret = 0; + } + Py_XDECREF(name_attr); + return ret; +} +static int __Pyx_setup_reduce(PyObject* type_obj) { + int ret = 0; + PyObject *object_reduce = NULL; + PyObject *object_reduce_ex = NULL; + PyObject *reduce = NULL; + PyObject *reduce_ex = NULL; + PyObject *reduce_cython = NULL; + PyObject *setstate = NULL; + PyObject *setstate_cython = NULL; +#if CYTHON_USE_PYTYPE_LOOKUP + if (_PyType_Lookup((PyTypeObject*)type_obj, __pyx_n_s_getstate)) goto __PYX_GOOD; +#else + if (PyObject_HasAttr(type_obj, __pyx_n_s_getstate)) goto __PYX_GOOD; +#endif +#if CYTHON_USE_PYTYPE_LOOKUP + object_reduce_ex = _PyType_Lookup(&PyBaseObject_Type, __pyx_n_s_reduce_ex); if (!object_reduce_ex) goto __PYX_BAD; +#else + object_reduce_ex = __Pyx_PyObject_GetAttrStr((PyObject*)&PyBaseObject_Type, __pyx_n_s_reduce_ex); if (!object_reduce_ex) goto __PYX_BAD; +#endif + reduce_ex = __Pyx_PyObject_GetAttrStr(type_obj, __pyx_n_s_reduce_ex); if (unlikely(!reduce_ex)) goto __PYX_BAD; + if (reduce_ex == object_reduce_ex) { +#if CYTHON_USE_PYTYPE_LOOKUP + object_reduce = _PyType_Lookup(&PyBaseObject_Type, __pyx_n_s_reduce); if (!object_reduce) goto __PYX_BAD; +#else + object_reduce = __Pyx_PyObject_GetAttrStr((PyObject*)&PyBaseObject_Type, __pyx_n_s_reduce); if (!object_reduce) goto __PYX_BAD; +#endif + reduce = __Pyx_PyObject_GetAttrStr(type_obj, __pyx_n_s_reduce); if (unlikely(!reduce)) goto __PYX_BAD; + if (reduce == object_reduce || __Pyx_setup_reduce_is_named(reduce, __pyx_n_s_reduce_cython)) { + reduce_cython = __Pyx_PyObject_GetAttrStrNoError(type_obj, __pyx_n_s_reduce_cython); + if (likely(reduce_cython)) { + ret = PyDict_SetItem(((PyTypeObject*)type_obj)->tp_dict, __pyx_n_s_reduce, reduce_cython); if (unlikely(ret < 0)) goto __PYX_BAD; + ret = PyDict_DelItem(((PyTypeObject*)type_obj)->tp_dict, __pyx_n_s_reduce_cython); if (unlikely(ret < 0)) goto __PYX_BAD; + } else if (reduce == object_reduce || PyErr_Occurred()) { + goto __PYX_BAD; + } + setstate = __Pyx_PyObject_GetAttrStr(type_obj, __pyx_n_s_setstate); + if (!setstate) PyErr_Clear(); + if (!setstate || __Pyx_setup_reduce_is_named(setstate, __pyx_n_s_setstate_cython)) { + setstate_cython = __Pyx_PyObject_GetAttrStrNoError(type_obj, __pyx_n_s_setstate_cython); + if (likely(setstate_cython)) { + ret = PyDict_SetItem(((PyTypeObject*)type_obj)->tp_dict, __pyx_n_s_setstate, setstate_cython); if (unlikely(ret < 0)) goto __PYX_BAD; + ret = PyDict_DelItem(((PyTypeObject*)type_obj)->tp_dict, __pyx_n_s_setstate_cython); if (unlikely(ret < 0)) goto __PYX_BAD; + } else if (!setstate || PyErr_Occurred()) { + goto __PYX_BAD; + } + } + PyType_Modified((PyTypeObject*)type_obj); + } + } + goto __PYX_GOOD; +__PYX_BAD: + if (!PyErr_Occurred()) + PyErr_Format(PyExc_RuntimeError, "Unable to initialize pickling for %s", ((PyTypeObject*)type_obj)->tp_name); + ret = -1; +__PYX_GOOD: +#if !CYTHON_USE_PYTYPE_LOOKUP + Py_XDECREF(object_reduce); + Py_XDECREF(object_reduce_ex); +#endif + Py_XDECREF(reduce); + Py_XDECREF(reduce_ex); + Py_XDECREF(reduce_cython); + Py_XDECREF(setstate); + Py_XDECREF(setstate_cython); + return ret; +} + +/* SetVTable */ +static int __Pyx_SetVtable(PyObject *dict, void *vtable) { +#if PY_VERSION_HEX >= 0x02070000 + PyObject *ob = PyCapsule_New(vtable, 0, 0); +#else + PyObject *ob = PyCObject_FromVoidPtr(vtable, 0); +#endif + if (!ob) + goto bad; + if (PyDict_SetItem(dict, __pyx_n_s_pyx_vtable, ob) < 0) + goto bad; + Py_DECREF(ob); + return 0; +bad: + Py_XDECREF(ob); + return -1; +} + +/* TypeImport */ +#ifndef __PYX_HAVE_RT_ImportType +#define __PYX_HAVE_RT_ImportType +static PyTypeObject *__Pyx_ImportType(PyObject *module, const char *module_name, const char *class_name, + size_t size, enum __Pyx_ImportType_CheckSize check_size) +{ + PyObject *result = 0; + char warning[200]; + Py_ssize_t basicsize; +#ifdef Py_LIMITED_API + PyObject *py_basicsize; +#endif + result = PyObject_GetAttrString(module, class_name); + if (!result) + goto bad; + if (!PyType_Check(result)) { + PyErr_Format(PyExc_TypeError, + "%.200s.%.200s is not a type object", + module_name, class_name); + goto bad; + } +#ifndef Py_LIMITED_API + basicsize = ((PyTypeObject *)result)->tp_basicsize; +#else + py_basicsize = PyObject_GetAttrString(result, "__basicsize__"); + if (!py_basicsize) + goto bad; + basicsize = PyLong_AsSsize_t(py_basicsize); + Py_DECREF(py_basicsize); + py_basicsize = 0; + if (basicsize == (Py_ssize_t)-1 && PyErr_Occurred()) + goto bad; +#endif + if ((size_t)basicsize < size) { + PyErr_Format(PyExc_ValueError, + "%.200s.%.200s size changed, may indicate binary incompatibility. " + "Expected %zd from C header, got %zd from PyObject", + module_name, class_name, size, basicsize); + goto bad; + } + if (check_size == __Pyx_ImportType_CheckSize_Error && (size_t)basicsize != size) { + PyErr_Format(PyExc_ValueError, + "%.200s.%.200s size changed, may indicate binary incompatibility. " + "Expected %zd from C header, got %zd from PyObject", + module_name, class_name, size, basicsize); + goto bad; + } + else if (check_size == __Pyx_ImportType_CheckSize_Warn && (size_t)basicsize > size) { + PyOS_snprintf(warning, sizeof(warning), + "%s.%s size changed, may indicate binary incompatibility. " + "Expected %zd from C header, got %zd from PyObject", + module_name, class_name, size, basicsize); + if (PyErr_WarnEx(NULL, warning, 0) < 0) goto bad; + } + return (PyTypeObject *)result; +bad: + Py_XDECREF(result); + return NULL; +} +#endif + +/* decode_c_string */ +static CYTHON_INLINE PyObject* __Pyx_decode_c_string( + const char* cstring, Py_ssize_t start, Py_ssize_t stop, + const char* encoding, const char* errors, + PyObject* (*decode_func)(const char *s, Py_ssize_t size, const char *errors)) { + Py_ssize_t length; + if (unlikely((start < 0) | (stop < 0))) { + size_t slen = strlen(cstring); + if (unlikely(slen > (size_t) PY_SSIZE_T_MAX)) { + PyErr_SetString(PyExc_OverflowError, + "c-string too long to convert to Python"); + return NULL; + } + length = (Py_ssize_t) slen; + if (start < 0) { + start += length; + if (start < 0) + start = 0; + } + if (stop < 0) + stop += length; + } + if (unlikely(stop <= start)) + return __Pyx_NewRef(__pyx_empty_unicode); + length = stop - start; + cstring += start; + if (decode_func) { + return decode_func(cstring, length, errors); + } else { + return PyUnicode_Decode(cstring, length, encoding, errors); + } +} + +/* CLineInTraceback */ +#ifndef CYTHON_CLINE_IN_TRACEBACK +static int __Pyx_CLineForTraceback(CYTHON_NCP_UNUSED PyThreadState *tstate, int c_line) { + PyObject *use_cline; + PyObject *ptype, *pvalue, *ptraceback; +#if CYTHON_COMPILING_IN_CPYTHON + PyObject **cython_runtime_dict; +#endif + if (unlikely(!__pyx_cython_runtime)) { + return c_line; + } + __Pyx_ErrFetchInState(tstate, &ptype, &pvalue, &ptraceback); +#if CYTHON_COMPILING_IN_CPYTHON + cython_runtime_dict = _PyObject_GetDictPtr(__pyx_cython_runtime); + if (likely(cython_runtime_dict)) { + __PYX_PY_DICT_LOOKUP_IF_MODIFIED( + use_cline, *cython_runtime_dict, + __Pyx_PyDict_GetItemStr(*cython_runtime_dict, __pyx_n_s_cline_in_traceback)) + } else +#endif + { + PyObject *use_cline_obj = __Pyx_PyObject_GetAttrStr(__pyx_cython_runtime, __pyx_n_s_cline_in_traceback); + if (use_cline_obj) { + use_cline = PyObject_Not(use_cline_obj) ? Py_False : Py_True; + Py_DECREF(use_cline_obj); + } else { + PyErr_Clear(); + use_cline = NULL; + } + } + if (!use_cline) { + c_line = 0; + PyObject_SetAttr(__pyx_cython_runtime, __pyx_n_s_cline_in_traceback, Py_False); + } + else if (use_cline == Py_False || (use_cline != Py_True && PyObject_Not(use_cline) != 0)) { + c_line = 0; + } + __Pyx_ErrRestoreInState(tstate, ptype, pvalue, ptraceback); + return c_line; +} +#endif + +/* CodeObjectCache */ +static int __pyx_bisect_code_objects(__Pyx_CodeObjectCacheEntry* entries, int count, int code_line) { + int start = 0, mid = 0, end = count - 1; + if (end >= 0 && code_line > entries[end].code_line) { + return count; + } + while (start < end) { + mid = start + (end - start) / 2; + if (code_line < entries[mid].code_line) { + end = mid; + } else if (code_line > entries[mid].code_line) { + start = mid + 1; + } else { + return mid; + } + } + if (code_line <= entries[mid].code_line) { + return mid; + } else { + return mid + 1; + } +} +static PyCodeObject *__pyx_find_code_object(int code_line) { + PyCodeObject* code_object; + int pos; + if (unlikely(!code_line) || unlikely(!__pyx_code_cache.entries)) { + return NULL; + } + pos = __pyx_bisect_code_objects(__pyx_code_cache.entries, __pyx_code_cache.count, code_line); + if (unlikely(pos >= __pyx_code_cache.count) || unlikely(__pyx_code_cache.entries[pos].code_line != code_line)) { + return NULL; + } + code_object = __pyx_code_cache.entries[pos].code_object; + Py_INCREF(code_object); + return code_object; +} +static void __pyx_insert_code_object(int code_line, PyCodeObject* code_object) { + int pos, i; + __Pyx_CodeObjectCacheEntry* entries = __pyx_code_cache.entries; + if (unlikely(!code_line)) { + return; + } + if (unlikely(!entries)) { + entries = (__Pyx_CodeObjectCacheEntry*)PyMem_Malloc(64*sizeof(__Pyx_CodeObjectCacheEntry)); + if (likely(entries)) { + __pyx_code_cache.entries = entries; + __pyx_code_cache.max_count = 64; + __pyx_code_cache.count = 1; + entries[0].code_line = code_line; + entries[0].code_object = code_object; + Py_INCREF(code_object); + } + return; + } + pos = __pyx_bisect_code_objects(__pyx_code_cache.entries, __pyx_code_cache.count, code_line); + if ((pos < __pyx_code_cache.count) && unlikely(__pyx_code_cache.entries[pos].code_line == code_line)) { + PyCodeObject* tmp = entries[pos].code_object; + entries[pos].code_object = code_object; + Py_DECREF(tmp); + return; + } + if (__pyx_code_cache.count == __pyx_code_cache.max_count) { + int new_max = __pyx_code_cache.max_count + 64; + entries = (__Pyx_CodeObjectCacheEntry*)PyMem_Realloc( + __pyx_code_cache.entries, ((size_t)new_max) * sizeof(__Pyx_CodeObjectCacheEntry)); + if (unlikely(!entries)) { + return; + } + __pyx_code_cache.entries = entries; + __pyx_code_cache.max_count = new_max; + } + for (i=__pyx_code_cache.count; i>pos; i--) { + entries[i] = entries[i-1]; + } + entries[pos].code_line = code_line; + entries[pos].code_object = code_object; + __pyx_code_cache.count++; + Py_INCREF(code_object); +} + +/* AddTraceback */ +#include "compile.h" +#include "frameobject.h" +#include "traceback.h" +static PyCodeObject* __Pyx_CreateCodeObjectForTraceback( + const char *funcname, int c_line, + int py_line, const char *filename) { + PyCodeObject *py_code = 0; + PyObject *py_srcfile = 0; + PyObject *py_funcname = 0; + #if PY_MAJOR_VERSION < 3 + py_srcfile = PyString_FromString(filename); + #else + py_srcfile = PyUnicode_FromString(filename); + #endif + if (!py_srcfile) goto bad; + if (c_line) { + #if PY_MAJOR_VERSION < 3 + py_funcname = PyString_FromFormat( "%s (%s:%d)", funcname, __pyx_cfilenm, c_line); + #else + py_funcname = PyUnicode_FromFormat( "%s (%s:%d)", funcname, __pyx_cfilenm, c_line); + #endif + } + else { + #if PY_MAJOR_VERSION < 3 + py_funcname = PyString_FromString(funcname); + #else + py_funcname = PyUnicode_FromString(funcname); + #endif + } + if (!py_funcname) goto bad; + py_code = __Pyx_PyCode_New( + 0, + 0, + 0, + 0, + 0, + __pyx_empty_bytes, /*PyObject *code,*/ + __pyx_empty_tuple, /*PyObject *consts,*/ + __pyx_empty_tuple, /*PyObject *names,*/ + __pyx_empty_tuple, /*PyObject *varnames,*/ + __pyx_empty_tuple, /*PyObject *freevars,*/ + __pyx_empty_tuple, /*PyObject *cellvars,*/ + py_srcfile, /*PyObject *filename,*/ + py_funcname, /*PyObject *name,*/ + py_line, + __pyx_empty_bytes /*PyObject *lnotab*/ + ); + Py_DECREF(py_srcfile); + Py_DECREF(py_funcname); + return py_code; +bad: + Py_XDECREF(py_srcfile); + Py_XDECREF(py_funcname); + return NULL; +} +static void __Pyx_AddTraceback(const char *funcname, int c_line, + int py_line, const char *filename) { + PyCodeObject *py_code = 0; + PyFrameObject *py_frame = 0; + PyThreadState *tstate = __Pyx_PyThreadState_Current; + if (c_line) { + c_line = __Pyx_CLineForTraceback(tstate, c_line); + } + py_code = __pyx_find_code_object(c_line ? -c_line : py_line); + if (!py_code) { + py_code = __Pyx_CreateCodeObjectForTraceback( + funcname, c_line, py_line, filename); + if (!py_code) goto bad; + __pyx_insert_code_object(c_line ? -c_line : py_line, py_code); + } + py_frame = PyFrame_New( + tstate, /*PyThreadState *tstate,*/ + py_code, /*PyCodeObject *code,*/ + __pyx_d, /*PyObject *globals,*/ + 0 /*PyObject *locals*/ + ); + if (!py_frame) goto bad; + __Pyx_PyFrame_SetLineNumber(py_frame, py_line); + PyTraceBack_Here(py_frame); +bad: + Py_XDECREF(py_code); + Py_XDECREF(py_frame); +} + +/* CIntFromPyVerify */ +#define __PYX_VERIFY_RETURN_INT(target_type, func_type, func_value)\ + __PYX__VERIFY_RETURN_INT(target_type, func_type, func_value, 0) +#define __PYX_VERIFY_RETURN_INT_EXC(target_type, func_type, func_value)\ + __PYX__VERIFY_RETURN_INT(target_type, func_type, func_value, 1) +#define __PYX__VERIFY_RETURN_INT(target_type, func_type, func_value, exc)\ + {\ + func_type value = func_value;\ + if (sizeof(target_type) < sizeof(func_type)) {\ + if (unlikely(value != (func_type) (target_type) value)) {\ + func_type zero = 0;\ + if (exc && unlikely(value == (func_type)-1 && PyErr_Occurred()))\ + return (target_type) -1;\ + if (is_unsigned && unlikely(value < zero))\ + goto raise_neg_overflow;\ + else\ + goto raise_overflow;\ + }\ + }\ + return (target_type) value;\ + } + +/* CIntToPy */ +static CYTHON_INLINE PyObject* __Pyx_PyInt_From_int(int value) { +#ifdef __Pyx_HAS_GCC_DIAGNOSTIC +#pragma GCC diagnostic push +#pragma GCC diagnostic ignored "-Wconversion" +#endif + const int neg_one = (int) -1, const_zero = (int) 0; +#ifdef __Pyx_HAS_GCC_DIAGNOSTIC +#pragma GCC diagnostic pop +#endif + const int is_unsigned = neg_one > const_zero; + if (is_unsigned) { + if (sizeof(int) < sizeof(long)) { + return PyInt_FromLong((long) value); + } else if (sizeof(int) <= sizeof(unsigned long)) { + return PyLong_FromUnsignedLong((unsigned long) value); +#ifdef HAVE_LONG_LONG + } else if (sizeof(int) <= sizeof(unsigned PY_LONG_LONG)) { + return PyLong_FromUnsignedLongLong((unsigned PY_LONG_LONG) value); +#endif + } + } else { + if (sizeof(int) <= sizeof(long)) { + return PyInt_FromLong((long) value); +#ifdef HAVE_LONG_LONG + } else if (sizeof(int) <= sizeof(PY_LONG_LONG)) { + return PyLong_FromLongLong((PY_LONG_LONG) value); +#endif + } + } + { + int one = 1; int little = (int)*(unsigned char *)&one; + unsigned char *bytes = (unsigned char *)&value; + return _PyLong_FromByteArray(bytes, sizeof(int), + little, !is_unsigned); + } +} + +/* CIntFromPy */ +static CYTHON_INLINE int __Pyx_PyInt_As_int(PyObject *x) { +#ifdef __Pyx_HAS_GCC_DIAGNOSTIC +#pragma GCC diagnostic push +#pragma GCC diagnostic ignored "-Wconversion" +#endif + const int neg_one = (int) -1, const_zero = (int) 0; +#ifdef __Pyx_HAS_GCC_DIAGNOSTIC +#pragma GCC diagnostic pop +#endif + const int is_unsigned = neg_one > const_zero; +#if PY_MAJOR_VERSION < 3 + if (likely(PyInt_Check(x))) { + if (sizeof(int) < sizeof(long)) { + __PYX_VERIFY_RETURN_INT(int, long, PyInt_AS_LONG(x)) + } else { + long val = PyInt_AS_LONG(x); + if (is_unsigned && unlikely(val < 0)) { + goto raise_neg_overflow; + } + return (int) val; + } + } else +#endif + if (likely(PyLong_Check(x))) { + if (is_unsigned) { +#if CYTHON_USE_PYLONG_INTERNALS + const digit* digits = ((PyLongObject*)x)->ob_digit; + switch (Py_SIZE(x)) { + case 0: return (int) 0; + case 1: __PYX_VERIFY_RETURN_INT(int, digit, digits[0]) + case 2: + if (8 * sizeof(int) > 1 * PyLong_SHIFT) { + if (8 * sizeof(unsigned long) > 2 * PyLong_SHIFT) { + __PYX_VERIFY_RETURN_INT(int, unsigned long, (((((unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) + } else if (8 * sizeof(int) >= 2 * PyLong_SHIFT) { + return (int) (((((int)digits[1]) << PyLong_SHIFT) | (int)digits[0])); + } + } + break; + case 3: + if (8 * sizeof(int) > 2 * PyLong_SHIFT) { + if (8 * sizeof(unsigned long) > 3 * PyLong_SHIFT) { + __PYX_VERIFY_RETURN_INT(int, unsigned long, (((((((unsigned long)digits[2]) << PyLong_SHIFT) | (unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) + } else if (8 * sizeof(int) >= 3 * PyLong_SHIFT) { + return (int) (((((((int)digits[2]) << PyLong_SHIFT) | (int)digits[1]) << PyLong_SHIFT) | (int)digits[0])); + } + } + break; + case 4: + if (8 * sizeof(int) > 3 * PyLong_SHIFT) { + if (8 * sizeof(unsigned long) > 4 * PyLong_SHIFT) { + __PYX_VERIFY_RETURN_INT(int, unsigned long, (((((((((unsigned long)digits[3]) << PyLong_SHIFT) | (unsigned long)digits[2]) << PyLong_SHIFT) | (unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) + } else if (8 * sizeof(int) >= 4 * PyLong_SHIFT) { + return (int) (((((((((int)digits[3]) << PyLong_SHIFT) | (int)digits[2]) << PyLong_SHIFT) | (int)digits[1]) << PyLong_SHIFT) | (int)digits[0])); + } + } + break; + } +#endif +#if CYTHON_COMPILING_IN_CPYTHON + if (unlikely(Py_SIZE(x) < 0)) { + goto raise_neg_overflow; + } +#else + { + int result = PyObject_RichCompareBool(x, Py_False, Py_LT); + if (unlikely(result < 0)) + return (int) -1; + if (unlikely(result == 1)) + goto raise_neg_overflow; + } +#endif + if (sizeof(int) <= sizeof(unsigned long)) { + __PYX_VERIFY_RETURN_INT_EXC(int, unsigned long, PyLong_AsUnsignedLong(x)) +#ifdef HAVE_LONG_LONG + } else if (sizeof(int) <= sizeof(unsigned PY_LONG_LONG)) { + __PYX_VERIFY_RETURN_INT_EXC(int, unsigned PY_LONG_LONG, PyLong_AsUnsignedLongLong(x)) +#endif + } + } else { +#if CYTHON_USE_PYLONG_INTERNALS + const digit* digits = ((PyLongObject*)x)->ob_digit; + switch (Py_SIZE(x)) { + case 0: return (int) 0; + case -1: __PYX_VERIFY_RETURN_INT(int, sdigit, (sdigit) (-(sdigit)digits[0])) + case 1: __PYX_VERIFY_RETURN_INT(int, digit, +digits[0]) + case -2: + if (8 * sizeof(int) - 1 > 1 * PyLong_SHIFT) { + if (8 * sizeof(unsigned long) > 2 * PyLong_SHIFT) { + __PYX_VERIFY_RETURN_INT(int, long, -(long) (((((unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) + } else if (8 * sizeof(int) - 1 > 2 * PyLong_SHIFT) { + return (int) (((int)-1)*(((((int)digits[1]) << PyLong_SHIFT) | (int)digits[0]))); + } + } + break; + case 2: + if (8 * sizeof(int) > 1 * PyLong_SHIFT) { + if (8 * sizeof(unsigned long) > 2 * PyLong_SHIFT) { + __PYX_VERIFY_RETURN_INT(int, unsigned long, (((((unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) + } else if (8 * sizeof(int) - 1 > 2 * PyLong_SHIFT) { + return (int) ((((((int)digits[1]) << PyLong_SHIFT) | (int)digits[0]))); + } + } + break; + case -3: + if (8 * sizeof(int) - 1 > 2 * PyLong_SHIFT) { + if (8 * sizeof(unsigned long) > 3 * PyLong_SHIFT) { + __PYX_VERIFY_RETURN_INT(int, long, -(long) (((((((unsigned long)digits[2]) << PyLong_SHIFT) | (unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) + } else if (8 * sizeof(int) - 1 > 3 * PyLong_SHIFT) { + return (int) (((int)-1)*(((((((int)digits[2]) << PyLong_SHIFT) | (int)digits[1]) << PyLong_SHIFT) | (int)digits[0]))); + } + } + break; + case 3: + if (8 * sizeof(int) > 2 * PyLong_SHIFT) { + if (8 * sizeof(unsigned long) > 3 * PyLong_SHIFT) { + __PYX_VERIFY_RETURN_INT(int, unsigned long, (((((((unsigned long)digits[2]) << PyLong_SHIFT) | (unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) + } else if (8 * sizeof(int) - 1 > 3 * PyLong_SHIFT) { + return (int) ((((((((int)digits[2]) << PyLong_SHIFT) | (int)digits[1]) << PyLong_SHIFT) | (int)digits[0]))); + } + } + break; + case -4: + if (8 * sizeof(int) - 1 > 3 * PyLong_SHIFT) { + if (8 * sizeof(unsigned long) > 4 * PyLong_SHIFT) { + __PYX_VERIFY_RETURN_INT(int, long, -(long) (((((((((unsigned long)digits[3]) << PyLong_SHIFT) | (unsigned long)digits[2]) << PyLong_SHIFT) | (unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) + } else if (8 * sizeof(int) - 1 > 4 * PyLong_SHIFT) { + return (int) (((int)-1)*(((((((((int)digits[3]) << PyLong_SHIFT) | (int)digits[2]) << PyLong_SHIFT) | (int)digits[1]) << PyLong_SHIFT) | (int)digits[0]))); + } + } + break; + case 4: + if (8 * sizeof(int) > 3 * PyLong_SHIFT) { + if (8 * sizeof(unsigned long) > 4 * PyLong_SHIFT) { + __PYX_VERIFY_RETURN_INT(int, unsigned long, (((((((((unsigned long)digits[3]) << PyLong_SHIFT) | (unsigned long)digits[2]) << PyLong_SHIFT) | (unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) + } else if (8 * sizeof(int) - 1 > 4 * PyLong_SHIFT) { + return (int) ((((((((((int)digits[3]) << PyLong_SHIFT) | (int)digits[2]) << PyLong_SHIFT) | (int)digits[1]) << PyLong_SHIFT) | (int)digits[0]))); + } + } + break; + } +#endif + if (sizeof(int) <= sizeof(long)) { + __PYX_VERIFY_RETURN_INT_EXC(int, long, PyLong_AsLong(x)) +#ifdef HAVE_LONG_LONG + } else if (sizeof(int) <= sizeof(PY_LONG_LONG)) { + __PYX_VERIFY_RETURN_INT_EXC(int, PY_LONG_LONG, PyLong_AsLongLong(x)) +#endif + } + } + { +#if CYTHON_COMPILING_IN_PYPY && !defined(_PyLong_AsByteArray) + PyErr_SetString(PyExc_RuntimeError, + "_PyLong_AsByteArray() not available in PyPy, cannot convert large numbers"); +#else + int val; + PyObject *v = __Pyx_PyNumber_IntOrLong(x); + #if PY_MAJOR_VERSION < 3 + if (likely(v) && !PyLong_Check(v)) { + PyObject *tmp = v; + v = PyNumber_Long(tmp); + Py_DECREF(tmp); + } + #endif + if (likely(v)) { + int one = 1; int is_little = (int)*(unsigned char *)&one; + unsigned char *bytes = (unsigned char *)&val; + int ret = _PyLong_AsByteArray((PyLongObject *)v, + bytes, sizeof(val), + is_little, !is_unsigned); + Py_DECREF(v); + if (likely(!ret)) + return val; + } +#endif + return (int) -1; + } + } else { + int val; + PyObject *tmp = __Pyx_PyNumber_IntOrLong(x); + if (!tmp) return (int) -1; + val = __Pyx_PyInt_As_int(tmp); + Py_DECREF(tmp); + return val; + } +raise_overflow: + PyErr_SetString(PyExc_OverflowError, + "value too large to convert to int"); + return (int) -1; +raise_neg_overflow: + PyErr_SetString(PyExc_OverflowError, + "can't convert negative value to int"); + return (int) -1; +} + +/* CIntFromPy */ +static CYTHON_INLINE enum llhttp_method __Pyx_PyInt_As_enum__llhttp_method(PyObject *x) { +#ifdef __Pyx_HAS_GCC_DIAGNOSTIC +#pragma GCC diagnostic push +#pragma GCC diagnostic ignored "-Wconversion" +#endif + const enum llhttp_method neg_one = (enum llhttp_method) -1, const_zero = (enum llhttp_method) 0; +#ifdef __Pyx_HAS_GCC_DIAGNOSTIC +#pragma GCC diagnostic pop +#endif + const int is_unsigned = neg_one > const_zero; +#if PY_MAJOR_VERSION < 3 + if (likely(PyInt_Check(x))) { + if (sizeof(enum llhttp_method) < sizeof(long)) { + __PYX_VERIFY_RETURN_INT(enum llhttp_method, long, PyInt_AS_LONG(x)) + } else { + long val = PyInt_AS_LONG(x); + if (is_unsigned && unlikely(val < 0)) { + goto raise_neg_overflow; + } + return (enum llhttp_method) val; + } + } else +#endif + if (likely(PyLong_Check(x))) { + if (is_unsigned) { +#if CYTHON_USE_PYLONG_INTERNALS + const digit* digits = ((PyLongObject*)x)->ob_digit; + switch (Py_SIZE(x)) { + case 0: return (enum llhttp_method) 0; + case 1: __PYX_VERIFY_RETURN_INT(enum llhttp_method, digit, digits[0]) + case 2: + if (8 * sizeof(enum llhttp_method) > 1 * PyLong_SHIFT) { + if (8 * sizeof(unsigned long) > 2 * PyLong_SHIFT) { + __PYX_VERIFY_RETURN_INT(enum llhttp_method, unsigned long, (((((unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) + } else if (8 * sizeof(enum llhttp_method) >= 2 * PyLong_SHIFT) { + return (enum llhttp_method) (((((enum llhttp_method)digits[1]) << PyLong_SHIFT) | (enum llhttp_method)digits[0])); + } + } + break; + case 3: + if (8 * sizeof(enum llhttp_method) > 2 * PyLong_SHIFT) { + if (8 * sizeof(unsigned long) > 3 * PyLong_SHIFT) { + __PYX_VERIFY_RETURN_INT(enum llhttp_method, unsigned long, (((((((unsigned long)digits[2]) << PyLong_SHIFT) | (unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) + } else if (8 * sizeof(enum llhttp_method) >= 3 * PyLong_SHIFT) { + return (enum llhttp_method) (((((((enum llhttp_method)digits[2]) << PyLong_SHIFT) | (enum llhttp_method)digits[1]) << PyLong_SHIFT) | (enum llhttp_method)digits[0])); + } + } + break; + case 4: + if (8 * sizeof(enum llhttp_method) > 3 * PyLong_SHIFT) { + if (8 * sizeof(unsigned long) > 4 * PyLong_SHIFT) { + __PYX_VERIFY_RETURN_INT(enum llhttp_method, unsigned long, (((((((((unsigned long)digits[3]) << PyLong_SHIFT) | (unsigned long)digits[2]) << PyLong_SHIFT) | (unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) + } else if (8 * sizeof(enum llhttp_method) >= 4 * PyLong_SHIFT) { + return (enum llhttp_method) (((((((((enum llhttp_method)digits[3]) << PyLong_SHIFT) | (enum llhttp_method)digits[2]) << PyLong_SHIFT) | (enum llhttp_method)digits[1]) << PyLong_SHIFT) | (enum llhttp_method)digits[0])); + } + } + break; + } +#endif +#if CYTHON_COMPILING_IN_CPYTHON + if (unlikely(Py_SIZE(x) < 0)) { + goto raise_neg_overflow; + } +#else + { + int result = PyObject_RichCompareBool(x, Py_False, Py_LT); + if (unlikely(result < 0)) + return (enum llhttp_method) -1; + if (unlikely(result == 1)) + goto raise_neg_overflow; + } +#endif + if (sizeof(enum llhttp_method) <= sizeof(unsigned long)) { + __PYX_VERIFY_RETURN_INT_EXC(enum llhttp_method, unsigned long, PyLong_AsUnsignedLong(x)) +#ifdef HAVE_LONG_LONG + } else if (sizeof(enum llhttp_method) <= sizeof(unsigned PY_LONG_LONG)) { + __PYX_VERIFY_RETURN_INT_EXC(enum llhttp_method, unsigned PY_LONG_LONG, PyLong_AsUnsignedLongLong(x)) +#endif + } + } else { +#if CYTHON_USE_PYLONG_INTERNALS + const digit* digits = ((PyLongObject*)x)->ob_digit; + switch (Py_SIZE(x)) { + case 0: return (enum llhttp_method) 0; + case -1: __PYX_VERIFY_RETURN_INT(enum llhttp_method, sdigit, (sdigit) (-(sdigit)digits[0])) + case 1: __PYX_VERIFY_RETURN_INT(enum llhttp_method, digit, +digits[0]) + case -2: + if (8 * sizeof(enum llhttp_method) - 1 > 1 * PyLong_SHIFT) { + if (8 * sizeof(unsigned long) > 2 * PyLong_SHIFT) { + __PYX_VERIFY_RETURN_INT(enum llhttp_method, long, -(long) (((((unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) + } else if (8 * sizeof(enum llhttp_method) - 1 > 2 * PyLong_SHIFT) { + return (enum llhttp_method) (((enum llhttp_method)-1)*(((((enum llhttp_method)digits[1]) << PyLong_SHIFT) | (enum llhttp_method)digits[0]))); + } + } + break; + case 2: + if (8 * sizeof(enum llhttp_method) > 1 * PyLong_SHIFT) { + if (8 * sizeof(unsigned long) > 2 * PyLong_SHIFT) { + __PYX_VERIFY_RETURN_INT(enum llhttp_method, unsigned long, (((((unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) + } else if (8 * sizeof(enum llhttp_method) - 1 > 2 * PyLong_SHIFT) { + return (enum llhttp_method) ((((((enum llhttp_method)digits[1]) << PyLong_SHIFT) | (enum llhttp_method)digits[0]))); + } + } + break; + case -3: + if (8 * sizeof(enum llhttp_method) - 1 > 2 * PyLong_SHIFT) { + if (8 * sizeof(unsigned long) > 3 * PyLong_SHIFT) { + __PYX_VERIFY_RETURN_INT(enum llhttp_method, long, -(long) (((((((unsigned long)digits[2]) << PyLong_SHIFT) | (unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) + } else if (8 * sizeof(enum llhttp_method) - 1 > 3 * PyLong_SHIFT) { + return (enum llhttp_method) (((enum llhttp_method)-1)*(((((((enum llhttp_method)digits[2]) << PyLong_SHIFT) | (enum llhttp_method)digits[1]) << PyLong_SHIFT) | (enum llhttp_method)digits[0]))); + } + } + break; + case 3: + if (8 * sizeof(enum llhttp_method) > 2 * PyLong_SHIFT) { + if (8 * sizeof(unsigned long) > 3 * PyLong_SHIFT) { + __PYX_VERIFY_RETURN_INT(enum llhttp_method, unsigned long, (((((((unsigned long)digits[2]) << PyLong_SHIFT) | (unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) + } else if (8 * sizeof(enum llhttp_method) - 1 > 3 * PyLong_SHIFT) { + return (enum llhttp_method) ((((((((enum llhttp_method)digits[2]) << PyLong_SHIFT) | (enum llhttp_method)digits[1]) << PyLong_SHIFT) | (enum llhttp_method)digits[0]))); + } + } + break; + case -4: + if (8 * sizeof(enum llhttp_method) - 1 > 3 * PyLong_SHIFT) { + if (8 * sizeof(unsigned long) > 4 * PyLong_SHIFT) { + __PYX_VERIFY_RETURN_INT(enum llhttp_method, long, -(long) (((((((((unsigned long)digits[3]) << PyLong_SHIFT) | (unsigned long)digits[2]) << PyLong_SHIFT) | (unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) + } else if (8 * sizeof(enum llhttp_method) - 1 > 4 * PyLong_SHIFT) { + return (enum llhttp_method) (((enum llhttp_method)-1)*(((((((((enum llhttp_method)digits[3]) << PyLong_SHIFT) | (enum llhttp_method)digits[2]) << PyLong_SHIFT) | (enum llhttp_method)digits[1]) << PyLong_SHIFT) | (enum llhttp_method)digits[0]))); + } + } + break; + case 4: + if (8 * sizeof(enum llhttp_method) > 3 * PyLong_SHIFT) { + if (8 * sizeof(unsigned long) > 4 * PyLong_SHIFT) { + __PYX_VERIFY_RETURN_INT(enum llhttp_method, unsigned long, (((((((((unsigned long)digits[3]) << PyLong_SHIFT) | (unsigned long)digits[2]) << PyLong_SHIFT) | (unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) + } else if (8 * sizeof(enum llhttp_method) - 1 > 4 * PyLong_SHIFT) { + return (enum llhttp_method) ((((((((((enum llhttp_method)digits[3]) << PyLong_SHIFT) | (enum llhttp_method)digits[2]) << PyLong_SHIFT) | (enum llhttp_method)digits[1]) << PyLong_SHIFT) | (enum llhttp_method)digits[0]))); + } + } + break; + } +#endif + if (sizeof(enum llhttp_method) <= sizeof(long)) { + __PYX_VERIFY_RETURN_INT_EXC(enum llhttp_method, long, PyLong_AsLong(x)) +#ifdef HAVE_LONG_LONG + } else if (sizeof(enum llhttp_method) <= sizeof(PY_LONG_LONG)) { + __PYX_VERIFY_RETURN_INT_EXC(enum llhttp_method, PY_LONG_LONG, PyLong_AsLongLong(x)) +#endif + } + } + { +#if CYTHON_COMPILING_IN_PYPY && !defined(_PyLong_AsByteArray) + PyErr_SetString(PyExc_RuntimeError, + "_PyLong_AsByteArray() not available in PyPy, cannot convert large numbers"); +#else + enum llhttp_method val; + PyObject *v = __Pyx_PyNumber_IntOrLong(x); + #if PY_MAJOR_VERSION < 3 + if (likely(v) && !PyLong_Check(v)) { + PyObject *tmp = v; + v = PyNumber_Long(tmp); + Py_DECREF(tmp); + } + #endif + if (likely(v)) { + int one = 1; int is_little = (int)*(unsigned char *)&one; + unsigned char *bytes = (unsigned char *)&val; + int ret = _PyLong_AsByteArray((PyLongObject *)v, + bytes, sizeof(val), + is_little, !is_unsigned); + Py_DECREF(v); + if (likely(!ret)) + return val; + } +#endif + return (enum llhttp_method) -1; + } + } else { + enum llhttp_method val; + PyObject *tmp = __Pyx_PyNumber_IntOrLong(x); + if (!tmp) return (enum llhttp_method) -1; + val = __Pyx_PyInt_As_enum__llhttp_method(tmp); + Py_DECREF(tmp); + return val; + } +raise_overflow: + PyErr_SetString(PyExc_OverflowError, + "value too large to convert to enum llhttp_method"); + return (enum llhttp_method) -1; +raise_neg_overflow: + PyErr_SetString(PyExc_OverflowError, + "can't convert negative value to enum llhttp_method"); + return (enum llhttp_method) -1; +} + +/* CIntFromPy */ +static CYTHON_INLINE size_t __Pyx_PyInt_As_size_t(PyObject *x) { +#ifdef __Pyx_HAS_GCC_DIAGNOSTIC +#pragma GCC diagnostic push +#pragma GCC diagnostic ignored "-Wconversion" +#endif + const size_t neg_one = (size_t) -1, const_zero = (size_t) 0; +#ifdef __Pyx_HAS_GCC_DIAGNOSTIC +#pragma GCC diagnostic pop +#endif + const int is_unsigned = neg_one > const_zero; +#if PY_MAJOR_VERSION < 3 + if (likely(PyInt_Check(x))) { + if (sizeof(size_t) < sizeof(long)) { + __PYX_VERIFY_RETURN_INT(size_t, long, PyInt_AS_LONG(x)) + } else { + long val = PyInt_AS_LONG(x); + if (is_unsigned && unlikely(val < 0)) { + goto raise_neg_overflow; + } + return (size_t) val; + } + } else +#endif + if (likely(PyLong_Check(x))) { + if (is_unsigned) { +#if CYTHON_USE_PYLONG_INTERNALS + const digit* digits = ((PyLongObject*)x)->ob_digit; + switch (Py_SIZE(x)) { + case 0: return (size_t) 0; + case 1: __PYX_VERIFY_RETURN_INT(size_t, digit, digits[0]) + case 2: + if (8 * sizeof(size_t) > 1 * PyLong_SHIFT) { + if (8 * sizeof(unsigned long) > 2 * PyLong_SHIFT) { + __PYX_VERIFY_RETURN_INT(size_t, unsigned long, (((((unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) + } else if (8 * sizeof(size_t) >= 2 * PyLong_SHIFT) { + return (size_t) (((((size_t)digits[1]) << PyLong_SHIFT) | (size_t)digits[0])); + } + } + break; + case 3: + if (8 * sizeof(size_t) > 2 * PyLong_SHIFT) { + if (8 * sizeof(unsigned long) > 3 * PyLong_SHIFT) { + __PYX_VERIFY_RETURN_INT(size_t, unsigned long, (((((((unsigned long)digits[2]) << PyLong_SHIFT) | (unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) + } else if (8 * sizeof(size_t) >= 3 * PyLong_SHIFT) { + return (size_t) (((((((size_t)digits[2]) << PyLong_SHIFT) | (size_t)digits[1]) << PyLong_SHIFT) | (size_t)digits[0])); + } + } + break; + case 4: + if (8 * sizeof(size_t) > 3 * PyLong_SHIFT) { + if (8 * sizeof(unsigned long) > 4 * PyLong_SHIFT) { + __PYX_VERIFY_RETURN_INT(size_t, unsigned long, (((((((((unsigned long)digits[3]) << PyLong_SHIFT) | (unsigned long)digits[2]) << PyLong_SHIFT) | (unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) + } else if (8 * sizeof(size_t) >= 4 * PyLong_SHIFT) { + return (size_t) (((((((((size_t)digits[3]) << PyLong_SHIFT) | (size_t)digits[2]) << PyLong_SHIFT) | (size_t)digits[1]) << PyLong_SHIFT) | (size_t)digits[0])); + } + } + break; + } +#endif +#if CYTHON_COMPILING_IN_CPYTHON + if (unlikely(Py_SIZE(x) < 0)) { + goto raise_neg_overflow; + } +#else + { + int result = PyObject_RichCompareBool(x, Py_False, Py_LT); + if (unlikely(result < 0)) + return (size_t) -1; + if (unlikely(result == 1)) + goto raise_neg_overflow; + } +#endif + if (sizeof(size_t) <= sizeof(unsigned long)) { + __PYX_VERIFY_RETURN_INT_EXC(size_t, unsigned long, PyLong_AsUnsignedLong(x)) +#ifdef HAVE_LONG_LONG + } else if (sizeof(size_t) <= sizeof(unsigned PY_LONG_LONG)) { + __PYX_VERIFY_RETURN_INT_EXC(size_t, unsigned PY_LONG_LONG, PyLong_AsUnsignedLongLong(x)) +#endif + } + } else { +#if CYTHON_USE_PYLONG_INTERNALS + const digit* digits = ((PyLongObject*)x)->ob_digit; + switch (Py_SIZE(x)) { + case 0: return (size_t) 0; + case -1: __PYX_VERIFY_RETURN_INT(size_t, sdigit, (sdigit) (-(sdigit)digits[0])) + case 1: __PYX_VERIFY_RETURN_INT(size_t, digit, +digits[0]) + case -2: + if (8 * sizeof(size_t) - 1 > 1 * PyLong_SHIFT) { + if (8 * sizeof(unsigned long) > 2 * PyLong_SHIFT) { + __PYX_VERIFY_RETURN_INT(size_t, long, -(long) (((((unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) + } else if (8 * sizeof(size_t) - 1 > 2 * PyLong_SHIFT) { + return (size_t) (((size_t)-1)*(((((size_t)digits[1]) << PyLong_SHIFT) | (size_t)digits[0]))); + } + } + break; + case 2: + if (8 * sizeof(size_t) > 1 * PyLong_SHIFT) { + if (8 * sizeof(unsigned long) > 2 * PyLong_SHIFT) { + __PYX_VERIFY_RETURN_INT(size_t, unsigned long, (((((unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) + } else if (8 * sizeof(size_t) - 1 > 2 * PyLong_SHIFT) { + return (size_t) ((((((size_t)digits[1]) << PyLong_SHIFT) | (size_t)digits[0]))); + } + } + break; + case -3: + if (8 * sizeof(size_t) - 1 > 2 * PyLong_SHIFT) { + if (8 * sizeof(unsigned long) > 3 * PyLong_SHIFT) { + __PYX_VERIFY_RETURN_INT(size_t, long, -(long) (((((((unsigned long)digits[2]) << PyLong_SHIFT) | (unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) + } else if (8 * sizeof(size_t) - 1 > 3 * PyLong_SHIFT) { + return (size_t) (((size_t)-1)*(((((((size_t)digits[2]) << PyLong_SHIFT) | (size_t)digits[1]) << PyLong_SHIFT) | (size_t)digits[0]))); + } + } + break; + case 3: + if (8 * sizeof(size_t) > 2 * PyLong_SHIFT) { + if (8 * sizeof(unsigned long) > 3 * PyLong_SHIFT) { + __PYX_VERIFY_RETURN_INT(size_t, unsigned long, (((((((unsigned long)digits[2]) << PyLong_SHIFT) | (unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) + } else if (8 * sizeof(size_t) - 1 > 3 * PyLong_SHIFT) { + return (size_t) ((((((((size_t)digits[2]) << PyLong_SHIFT) | (size_t)digits[1]) << PyLong_SHIFT) | (size_t)digits[0]))); + } + } + break; + case -4: + if (8 * sizeof(size_t) - 1 > 3 * PyLong_SHIFT) { + if (8 * sizeof(unsigned long) > 4 * PyLong_SHIFT) { + __PYX_VERIFY_RETURN_INT(size_t, long, -(long) (((((((((unsigned long)digits[3]) << PyLong_SHIFT) | (unsigned long)digits[2]) << PyLong_SHIFT) | (unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) + } else if (8 * sizeof(size_t) - 1 > 4 * PyLong_SHIFT) { + return (size_t) (((size_t)-1)*(((((((((size_t)digits[3]) << PyLong_SHIFT) | (size_t)digits[2]) << PyLong_SHIFT) | (size_t)digits[1]) << PyLong_SHIFT) | (size_t)digits[0]))); + } + } + break; + case 4: + if (8 * sizeof(size_t) > 3 * PyLong_SHIFT) { + if (8 * sizeof(unsigned long) > 4 * PyLong_SHIFT) { + __PYX_VERIFY_RETURN_INT(size_t, unsigned long, (((((((((unsigned long)digits[3]) << PyLong_SHIFT) | (unsigned long)digits[2]) << PyLong_SHIFT) | (unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) + } else if (8 * sizeof(size_t) - 1 > 4 * PyLong_SHIFT) { + return (size_t) ((((((((((size_t)digits[3]) << PyLong_SHIFT) | (size_t)digits[2]) << PyLong_SHIFT) | (size_t)digits[1]) << PyLong_SHIFT) | (size_t)digits[0]))); + } + } + break; + } +#endif + if (sizeof(size_t) <= sizeof(long)) { + __PYX_VERIFY_RETURN_INT_EXC(size_t, long, PyLong_AsLong(x)) +#ifdef HAVE_LONG_LONG + } else if (sizeof(size_t) <= sizeof(PY_LONG_LONG)) { + __PYX_VERIFY_RETURN_INT_EXC(size_t, PY_LONG_LONG, PyLong_AsLongLong(x)) +#endif + } + } + { +#if CYTHON_COMPILING_IN_PYPY && !defined(_PyLong_AsByteArray) + PyErr_SetString(PyExc_RuntimeError, + "_PyLong_AsByteArray() not available in PyPy, cannot convert large numbers"); +#else + size_t val; + PyObject *v = __Pyx_PyNumber_IntOrLong(x); + #if PY_MAJOR_VERSION < 3 + if (likely(v) && !PyLong_Check(v)) { + PyObject *tmp = v; + v = PyNumber_Long(tmp); + Py_DECREF(tmp); + } + #endif + if (likely(v)) { + int one = 1; int is_little = (int)*(unsigned char *)&one; + unsigned char *bytes = (unsigned char *)&val; + int ret = _PyLong_AsByteArray((PyLongObject *)v, + bytes, sizeof(val), + is_little, !is_unsigned); + Py_DECREF(v); + if (likely(!ret)) + return val; + } +#endif + return (size_t) -1; + } + } else { + size_t val; + PyObject *tmp = __Pyx_PyNumber_IntOrLong(x); + if (!tmp) return (size_t) -1; + val = __Pyx_PyInt_As_size_t(tmp); + Py_DECREF(tmp); + return val; + } +raise_overflow: + PyErr_SetString(PyExc_OverflowError, + "value too large to convert to size_t"); + return (size_t) -1; +raise_neg_overflow: + PyErr_SetString(PyExc_OverflowError, + "can't convert negative value to size_t"); + return (size_t) -1; +} + +/* CIntFromPy */ +static CYTHON_INLINE long __Pyx_PyInt_As_long(PyObject *x) { +#ifdef __Pyx_HAS_GCC_DIAGNOSTIC +#pragma GCC diagnostic push +#pragma GCC diagnostic ignored "-Wconversion" +#endif + const long neg_one = (long) -1, const_zero = (long) 0; +#ifdef __Pyx_HAS_GCC_DIAGNOSTIC +#pragma GCC diagnostic pop +#endif + const int is_unsigned = neg_one > const_zero; +#if PY_MAJOR_VERSION < 3 + if (likely(PyInt_Check(x))) { + if (sizeof(long) < sizeof(long)) { + __PYX_VERIFY_RETURN_INT(long, long, PyInt_AS_LONG(x)) + } else { + long val = PyInt_AS_LONG(x); + if (is_unsigned && unlikely(val < 0)) { + goto raise_neg_overflow; + } + return (long) val; + } + } else +#endif + if (likely(PyLong_Check(x))) { + if (is_unsigned) { +#if CYTHON_USE_PYLONG_INTERNALS + const digit* digits = ((PyLongObject*)x)->ob_digit; + switch (Py_SIZE(x)) { + case 0: return (long) 0; + case 1: __PYX_VERIFY_RETURN_INT(long, digit, digits[0]) + case 2: + if (8 * sizeof(long) > 1 * PyLong_SHIFT) { + if (8 * sizeof(unsigned long) > 2 * PyLong_SHIFT) { + __PYX_VERIFY_RETURN_INT(long, unsigned long, (((((unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) + } else if (8 * sizeof(long) >= 2 * PyLong_SHIFT) { + return (long) (((((long)digits[1]) << PyLong_SHIFT) | (long)digits[0])); + } + } + break; + case 3: + if (8 * sizeof(long) > 2 * PyLong_SHIFT) { + if (8 * sizeof(unsigned long) > 3 * PyLong_SHIFT) { + __PYX_VERIFY_RETURN_INT(long, unsigned long, (((((((unsigned long)digits[2]) << PyLong_SHIFT) | (unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) + } else if (8 * sizeof(long) >= 3 * PyLong_SHIFT) { + return (long) (((((((long)digits[2]) << PyLong_SHIFT) | (long)digits[1]) << PyLong_SHIFT) | (long)digits[0])); + } + } + break; + case 4: + if (8 * sizeof(long) > 3 * PyLong_SHIFT) { + if (8 * sizeof(unsigned long) > 4 * PyLong_SHIFT) { + __PYX_VERIFY_RETURN_INT(long, unsigned long, (((((((((unsigned long)digits[3]) << PyLong_SHIFT) | (unsigned long)digits[2]) << PyLong_SHIFT) | (unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) + } else if (8 * sizeof(long) >= 4 * PyLong_SHIFT) { + return (long) (((((((((long)digits[3]) << PyLong_SHIFT) | (long)digits[2]) << PyLong_SHIFT) | (long)digits[1]) << PyLong_SHIFT) | (long)digits[0])); + } + } + break; + } +#endif +#if CYTHON_COMPILING_IN_CPYTHON + if (unlikely(Py_SIZE(x) < 0)) { + goto raise_neg_overflow; + } +#else + { + int result = PyObject_RichCompareBool(x, Py_False, Py_LT); + if (unlikely(result < 0)) + return (long) -1; + if (unlikely(result == 1)) + goto raise_neg_overflow; + } +#endif + if (sizeof(long) <= sizeof(unsigned long)) { + __PYX_VERIFY_RETURN_INT_EXC(long, unsigned long, PyLong_AsUnsignedLong(x)) +#ifdef HAVE_LONG_LONG + } else if (sizeof(long) <= sizeof(unsigned PY_LONG_LONG)) { + __PYX_VERIFY_RETURN_INT_EXC(long, unsigned PY_LONG_LONG, PyLong_AsUnsignedLongLong(x)) +#endif + } + } else { +#if CYTHON_USE_PYLONG_INTERNALS + const digit* digits = ((PyLongObject*)x)->ob_digit; + switch (Py_SIZE(x)) { + case 0: return (long) 0; + case -1: __PYX_VERIFY_RETURN_INT(long, sdigit, (sdigit) (-(sdigit)digits[0])) + case 1: __PYX_VERIFY_RETURN_INT(long, digit, +digits[0]) + case -2: + if (8 * sizeof(long) - 1 > 1 * PyLong_SHIFT) { + if (8 * sizeof(unsigned long) > 2 * PyLong_SHIFT) { + __PYX_VERIFY_RETURN_INT(long, long, -(long) (((((unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) + } else if (8 * sizeof(long) - 1 > 2 * PyLong_SHIFT) { + return (long) (((long)-1)*(((((long)digits[1]) << PyLong_SHIFT) | (long)digits[0]))); + } + } + break; + case 2: + if (8 * sizeof(long) > 1 * PyLong_SHIFT) { + if (8 * sizeof(unsigned long) > 2 * PyLong_SHIFT) { + __PYX_VERIFY_RETURN_INT(long, unsigned long, (((((unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) + } else if (8 * sizeof(long) - 1 > 2 * PyLong_SHIFT) { + return (long) ((((((long)digits[1]) << PyLong_SHIFT) | (long)digits[0]))); + } + } + break; + case -3: + if (8 * sizeof(long) - 1 > 2 * PyLong_SHIFT) { + if (8 * sizeof(unsigned long) > 3 * PyLong_SHIFT) { + __PYX_VERIFY_RETURN_INT(long, long, -(long) (((((((unsigned long)digits[2]) << PyLong_SHIFT) | (unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) + } else if (8 * sizeof(long) - 1 > 3 * PyLong_SHIFT) { + return (long) (((long)-1)*(((((((long)digits[2]) << PyLong_SHIFT) | (long)digits[1]) << PyLong_SHIFT) | (long)digits[0]))); + } + } + break; + case 3: + if (8 * sizeof(long) > 2 * PyLong_SHIFT) { + if (8 * sizeof(unsigned long) > 3 * PyLong_SHIFT) { + __PYX_VERIFY_RETURN_INT(long, unsigned long, (((((((unsigned long)digits[2]) << PyLong_SHIFT) | (unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) + } else if (8 * sizeof(long) - 1 > 3 * PyLong_SHIFT) { + return (long) ((((((((long)digits[2]) << PyLong_SHIFT) | (long)digits[1]) << PyLong_SHIFT) | (long)digits[0]))); + } + } + break; + case -4: + if (8 * sizeof(long) - 1 > 3 * PyLong_SHIFT) { + if (8 * sizeof(unsigned long) > 4 * PyLong_SHIFT) { + __PYX_VERIFY_RETURN_INT(long, long, -(long) (((((((((unsigned long)digits[3]) << PyLong_SHIFT) | (unsigned long)digits[2]) << PyLong_SHIFT) | (unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) + } else if (8 * sizeof(long) - 1 > 4 * PyLong_SHIFT) { + return (long) (((long)-1)*(((((((((long)digits[3]) << PyLong_SHIFT) | (long)digits[2]) << PyLong_SHIFT) | (long)digits[1]) << PyLong_SHIFT) | (long)digits[0]))); + } + } + break; + case 4: + if (8 * sizeof(long) > 3 * PyLong_SHIFT) { + if (8 * sizeof(unsigned long) > 4 * PyLong_SHIFT) { + __PYX_VERIFY_RETURN_INT(long, unsigned long, (((((((((unsigned long)digits[3]) << PyLong_SHIFT) | (unsigned long)digits[2]) << PyLong_SHIFT) | (unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) + } else if (8 * sizeof(long) - 1 > 4 * PyLong_SHIFT) { + return (long) ((((((((((long)digits[3]) << PyLong_SHIFT) | (long)digits[2]) << PyLong_SHIFT) | (long)digits[1]) << PyLong_SHIFT) | (long)digits[0]))); + } + } + break; + } +#endif + if (sizeof(long) <= sizeof(long)) { + __PYX_VERIFY_RETURN_INT_EXC(long, long, PyLong_AsLong(x)) +#ifdef HAVE_LONG_LONG + } else if (sizeof(long) <= sizeof(PY_LONG_LONG)) { + __PYX_VERIFY_RETURN_INT_EXC(long, PY_LONG_LONG, PyLong_AsLongLong(x)) +#endif + } + } + { +#if CYTHON_COMPILING_IN_PYPY && !defined(_PyLong_AsByteArray) + PyErr_SetString(PyExc_RuntimeError, + "_PyLong_AsByteArray() not available in PyPy, cannot convert large numbers"); +#else + long val; + PyObject *v = __Pyx_PyNumber_IntOrLong(x); + #if PY_MAJOR_VERSION < 3 + if (likely(v) && !PyLong_Check(v)) { + PyObject *tmp = v; + v = PyNumber_Long(tmp); + Py_DECREF(tmp); + } + #endif + if (likely(v)) { + int one = 1; int is_little = (int)*(unsigned char *)&one; + unsigned char *bytes = (unsigned char *)&val; + int ret = _PyLong_AsByteArray((PyLongObject *)v, + bytes, sizeof(val), + is_little, !is_unsigned); + Py_DECREF(v); + if (likely(!ret)) + return val; + } +#endif + return (long) -1; + } + } else { + long val; + PyObject *tmp = __Pyx_PyNumber_IntOrLong(x); + if (!tmp) return (long) -1; + val = __Pyx_PyInt_As_long(tmp); + Py_DECREF(tmp); + return val; + } +raise_overflow: + PyErr_SetString(PyExc_OverflowError, + "value too large to convert to long"); + return (long) -1; +raise_neg_overflow: + PyErr_SetString(PyExc_OverflowError, + "can't convert negative value to long"); + return (long) -1; +} + +/* CIntToPy */ +static CYTHON_INLINE PyObject* __Pyx_PyInt_From_uint8_t(uint8_t value) { +#ifdef __Pyx_HAS_GCC_DIAGNOSTIC +#pragma GCC diagnostic push +#pragma GCC diagnostic ignored "-Wconversion" +#endif + const uint8_t neg_one = (uint8_t) -1, const_zero = (uint8_t) 0; +#ifdef __Pyx_HAS_GCC_DIAGNOSTIC +#pragma GCC diagnostic pop +#endif + const int is_unsigned = neg_one > const_zero; + if (is_unsigned) { + if (sizeof(uint8_t) < sizeof(long)) { + return PyInt_FromLong((long) value); + } else if (sizeof(uint8_t) <= sizeof(unsigned long)) { + return PyLong_FromUnsignedLong((unsigned long) value); +#ifdef HAVE_LONG_LONG + } else if (sizeof(uint8_t) <= sizeof(unsigned PY_LONG_LONG)) { + return PyLong_FromUnsignedLongLong((unsigned PY_LONG_LONG) value); +#endif + } + } else { + if (sizeof(uint8_t) <= sizeof(long)) { + return PyInt_FromLong((long) value); +#ifdef HAVE_LONG_LONG + } else if (sizeof(uint8_t) <= sizeof(PY_LONG_LONG)) { + return PyLong_FromLongLong((PY_LONG_LONG) value); +#endif + } + } + { + int one = 1; int little = (int)*(unsigned char *)&one; + unsigned char *bytes = (unsigned char *)&value; + return _PyLong_FromByteArray(bytes, sizeof(uint8_t), + little, !is_unsigned); + } +} + +/* CIntToPy */ +static CYTHON_INLINE PyObject* __Pyx_PyInt_From_long(long value) { +#ifdef __Pyx_HAS_GCC_DIAGNOSTIC +#pragma GCC diagnostic push +#pragma GCC diagnostic ignored "-Wconversion" +#endif + const long neg_one = (long) -1, const_zero = (long) 0; +#ifdef __Pyx_HAS_GCC_DIAGNOSTIC +#pragma GCC diagnostic pop +#endif + const int is_unsigned = neg_one > const_zero; + if (is_unsigned) { + if (sizeof(long) < sizeof(long)) { + return PyInt_FromLong((long) value); + } else if (sizeof(long) <= sizeof(unsigned long)) { + return PyLong_FromUnsignedLong((unsigned long) value); +#ifdef HAVE_LONG_LONG + } else if (sizeof(long) <= sizeof(unsigned PY_LONG_LONG)) { + return PyLong_FromUnsignedLongLong((unsigned PY_LONG_LONG) value); +#endif + } + } else { + if (sizeof(long) <= sizeof(long)) { + return PyInt_FromLong((long) value); +#ifdef HAVE_LONG_LONG + } else if (sizeof(long) <= sizeof(PY_LONG_LONG)) { + return PyLong_FromLongLong((PY_LONG_LONG) value); +#endif + } + } + { + int one = 1; int little = (int)*(unsigned char *)&one; + unsigned char *bytes = (unsigned char *)&value; + return _PyLong_FromByteArray(bytes, sizeof(long), + little, !is_unsigned); + } +} + +/* FastTypeChecks */ +#if CYTHON_COMPILING_IN_CPYTHON +static int __Pyx_InBases(PyTypeObject *a, PyTypeObject *b) { + while (a) { + a = a->tp_base; + if (a == b) + return 1; + } + return b == &PyBaseObject_Type; +} +static CYTHON_INLINE int __Pyx_IsSubtype(PyTypeObject *a, PyTypeObject *b) { + PyObject *mro; + if (a == b) return 1; + mro = a->tp_mro; + if (likely(mro)) { + Py_ssize_t i, n; + n = PyTuple_GET_SIZE(mro); + for (i = 0; i < n; i++) { + if (PyTuple_GET_ITEM(mro, i) == (PyObject *)b) + return 1; + } + return 0; + } + return __Pyx_InBases(a, b); +} +#if PY_MAJOR_VERSION == 2 +static int __Pyx_inner_PyErr_GivenExceptionMatches2(PyObject *err, PyObject* exc_type1, PyObject* exc_type2) { + PyObject *exception, *value, *tb; + int res; + __Pyx_PyThreadState_declare + __Pyx_PyThreadState_assign + __Pyx_ErrFetch(&exception, &value, &tb); + res = exc_type1 ? PyObject_IsSubclass(err, exc_type1) : 0; + if (unlikely(res == -1)) { + PyErr_WriteUnraisable(err); + res = 0; + } + if (!res) { + res = PyObject_IsSubclass(err, exc_type2); + if (unlikely(res == -1)) { + PyErr_WriteUnraisable(err); + res = 0; + } + } + __Pyx_ErrRestore(exception, value, tb); + return res; +} +#else +static CYTHON_INLINE int __Pyx_inner_PyErr_GivenExceptionMatches2(PyObject *err, PyObject* exc_type1, PyObject *exc_type2) { + int res = exc_type1 ? __Pyx_IsSubtype((PyTypeObject*)err, (PyTypeObject*)exc_type1) : 0; + if (!res) { + res = __Pyx_IsSubtype((PyTypeObject*)err, (PyTypeObject*)exc_type2); + } + return res; +} +#endif +static int __Pyx_PyErr_GivenExceptionMatchesTuple(PyObject *exc_type, PyObject *tuple) { + Py_ssize_t i, n; + assert(PyExceptionClass_Check(exc_type)); + n = PyTuple_GET_SIZE(tuple); +#if PY_MAJOR_VERSION >= 3 + for (i=0; itp_name); + if (cached_type) { + if (!PyType_Check((PyObject*)cached_type)) { + PyErr_Format(PyExc_TypeError, + "Shared Cython type %.200s is not a type object", + type->tp_name); + goto bad; + } + if (cached_type->tp_basicsize != type->tp_basicsize) { + PyErr_Format(PyExc_TypeError, + "Shared Cython type %.200s has the wrong size, try recompiling", + type->tp_name); + goto bad; + } + } else { + if (!PyErr_ExceptionMatches(PyExc_AttributeError)) goto bad; + PyErr_Clear(); + if (PyType_Ready(type) < 0) goto bad; + if (PyObject_SetAttrString(fake_module, type->tp_name, (PyObject*) type) < 0) + goto bad; + Py_INCREF(type); + cached_type = type; + } +done: + Py_DECREF(fake_module); + return cached_type; +bad: + Py_XDECREF(cached_type); + cached_type = NULL; + goto done; +} + +/* PyObjectGetMethod */ +static int __Pyx_PyObject_GetMethod(PyObject *obj, PyObject *name, PyObject **method) { + PyObject *attr; +#if CYTHON_UNPACK_METHODS && CYTHON_COMPILING_IN_CPYTHON && CYTHON_USE_PYTYPE_LOOKUP + PyTypeObject *tp = Py_TYPE(obj); + PyObject *descr; + descrgetfunc f = NULL; + PyObject **dictptr, *dict; + int meth_found = 0; + assert (*method == NULL); + if (unlikely(tp->tp_getattro != PyObject_GenericGetAttr)) { + attr = __Pyx_PyObject_GetAttrStr(obj, name); + goto try_unpack; + } + if (unlikely(tp->tp_dict == NULL) && unlikely(PyType_Ready(tp) < 0)) { + return 0; + } + descr = _PyType_Lookup(tp, name); + if (likely(descr != NULL)) { + Py_INCREF(descr); +#if PY_MAJOR_VERSION >= 3 + #ifdef __Pyx_CyFunction_USED + if (likely(PyFunction_Check(descr) || (Py_TYPE(descr) == &PyMethodDescr_Type) || __Pyx_CyFunction_Check(descr))) + #else + if (likely(PyFunction_Check(descr) || (Py_TYPE(descr) == &PyMethodDescr_Type))) + #endif +#else + #ifdef __Pyx_CyFunction_USED + if (likely(PyFunction_Check(descr) || __Pyx_CyFunction_Check(descr))) + #else + if (likely(PyFunction_Check(descr))) + #endif +#endif + { + meth_found = 1; + } else { + f = Py_TYPE(descr)->tp_descr_get; + if (f != NULL && PyDescr_IsData(descr)) { + attr = f(descr, obj, (PyObject *)Py_TYPE(obj)); + Py_DECREF(descr); + goto try_unpack; + } + } + } + dictptr = _PyObject_GetDictPtr(obj); + if (dictptr != NULL && (dict = *dictptr) != NULL) { + Py_INCREF(dict); + attr = __Pyx_PyDict_GetItemStr(dict, name); + if (attr != NULL) { + Py_INCREF(attr); + Py_DECREF(dict); + Py_XDECREF(descr); + goto try_unpack; + } + Py_DECREF(dict); + } + if (meth_found) { + *method = descr; + return 1; + } + if (f != NULL) { + attr = f(descr, obj, (PyObject *)Py_TYPE(obj)); + Py_DECREF(descr); + goto try_unpack; + } + if (descr != NULL) { + *method = descr; + return 0; + } + PyErr_Format(PyExc_AttributeError, +#if PY_MAJOR_VERSION >= 3 + "'%.50s' object has no attribute '%U'", + tp->tp_name, name); +#else + "'%.50s' object has no attribute '%.400s'", + tp->tp_name, PyString_AS_STRING(name)); +#endif + return 0; +#else + attr = __Pyx_PyObject_GetAttrStr(obj, name); + goto try_unpack; +#endif +try_unpack: +#if CYTHON_UNPACK_METHODS + if (likely(attr) && PyMethod_Check(attr) && likely(PyMethod_GET_SELF(attr) == obj)) { + PyObject *function = PyMethod_GET_FUNCTION(attr); + Py_INCREF(function); + Py_DECREF(attr); + *method = function; + return 1; + } +#endif + *method = attr; + return 0; +} + +/* PyObjectCallMethod1 */ +static PyObject* __Pyx__PyObject_CallMethod1(PyObject* method, PyObject* arg) { + PyObject *result = __Pyx_PyObject_CallOneArg(method, arg); + Py_DECREF(method); + return result; +} +static PyObject* __Pyx_PyObject_CallMethod1(PyObject* obj, PyObject* method_name, PyObject* arg) { + PyObject *method = NULL, *result; + int is_method = __Pyx_PyObject_GetMethod(obj, method_name, &method); + if (likely(is_method)) { + result = __Pyx_PyObject_Call2Args(method, obj, arg); + Py_DECREF(method); + return result; + } + if (unlikely(!method)) return NULL; + return __Pyx__PyObject_CallMethod1(method, arg); +} + +/* CoroutineBase */ +#include +#include +#define __Pyx_Coroutine_Undelegate(gen) Py_CLEAR((gen)->yieldfrom) +static int __Pyx_PyGen__FetchStopIterationValue(CYTHON_UNUSED PyThreadState *__pyx_tstate, PyObject **pvalue) { + PyObject *et, *ev, *tb; + PyObject *value = NULL; + __Pyx_ErrFetch(&et, &ev, &tb); + if (!et) { + Py_XDECREF(tb); + Py_XDECREF(ev); + Py_INCREF(Py_None); + *pvalue = Py_None; + return 0; + } + if (likely(et == PyExc_StopIteration)) { + if (!ev) { + Py_INCREF(Py_None); + value = Py_None; + } +#if PY_VERSION_HEX >= 0x030300A0 + else if (Py_TYPE(ev) == (PyTypeObject*)PyExc_StopIteration) { + value = ((PyStopIterationObject *)ev)->value; + Py_INCREF(value); + Py_DECREF(ev); + } +#endif + else if (unlikely(PyTuple_Check(ev))) { + if (PyTuple_GET_SIZE(ev) >= 1) { +#if CYTHON_ASSUME_SAFE_MACROS && !CYTHON_AVOID_BORROWED_REFS + value = PyTuple_GET_ITEM(ev, 0); + Py_INCREF(value); +#else + value = PySequence_ITEM(ev, 0); +#endif + } else { + Py_INCREF(Py_None); + value = Py_None; + } + Py_DECREF(ev); + } + else if (!__Pyx_TypeCheck(ev, (PyTypeObject*)PyExc_StopIteration)) { + value = ev; + } + if (likely(value)) { + Py_XDECREF(tb); + Py_DECREF(et); + *pvalue = value; + return 0; + } + } else if (!__Pyx_PyErr_GivenExceptionMatches(et, PyExc_StopIteration)) { + __Pyx_ErrRestore(et, ev, tb); + return -1; + } + PyErr_NormalizeException(&et, &ev, &tb); + if (unlikely(!PyObject_TypeCheck(ev, (PyTypeObject*)PyExc_StopIteration))) { + __Pyx_ErrRestore(et, ev, tb); + return -1; + } + Py_XDECREF(tb); + Py_DECREF(et); +#if PY_VERSION_HEX >= 0x030300A0 + value = ((PyStopIterationObject *)ev)->value; + Py_INCREF(value); + Py_DECREF(ev); +#else + { + PyObject* args = __Pyx_PyObject_GetAttrStr(ev, __pyx_n_s_args); + Py_DECREF(ev); + if (likely(args)) { + value = PySequence_GetItem(args, 0); + Py_DECREF(args); + } + if (unlikely(!value)) { + __Pyx_ErrRestore(NULL, NULL, NULL); + Py_INCREF(Py_None); + value = Py_None; + } + } +#endif + *pvalue = value; + return 0; +} +static CYTHON_INLINE +void __Pyx_Coroutine_ExceptionClear(__Pyx_ExcInfoStruct *exc_state) { + PyObject *t, *v, *tb; + t = exc_state->exc_type; + v = exc_state->exc_value; + tb = exc_state->exc_traceback; + exc_state->exc_type = NULL; + exc_state->exc_value = NULL; + exc_state->exc_traceback = NULL; + Py_XDECREF(t); + Py_XDECREF(v); + Py_XDECREF(tb); +} +#define __Pyx_Coroutine_AlreadyRunningError(gen) (__Pyx__Coroutine_AlreadyRunningError(gen), (PyObject*)NULL) +static void __Pyx__Coroutine_AlreadyRunningError(CYTHON_UNUSED __pyx_CoroutineObject *gen) { + const char *msg; + if ((0)) { + #ifdef __Pyx_Coroutine_USED + } else if (__Pyx_Coroutine_Check((PyObject*)gen)) { + msg = "coroutine already executing"; + #endif + #ifdef __Pyx_AsyncGen_USED + } else if (__Pyx_AsyncGen_CheckExact((PyObject*)gen)) { + msg = "async generator already executing"; + #endif + } else { + msg = "generator already executing"; + } + PyErr_SetString(PyExc_ValueError, msg); +} +#define __Pyx_Coroutine_NotStartedError(gen) (__Pyx__Coroutine_NotStartedError(gen), (PyObject*)NULL) +static void __Pyx__Coroutine_NotStartedError(CYTHON_UNUSED PyObject *gen) { + const char *msg; + if ((0)) { + #ifdef __Pyx_Coroutine_USED + } else if (__Pyx_Coroutine_Check(gen)) { + msg = "can't send non-None value to a just-started coroutine"; + #endif + #ifdef __Pyx_AsyncGen_USED + } else if (__Pyx_AsyncGen_CheckExact(gen)) { + msg = "can't send non-None value to a just-started async generator"; + #endif + } else { + msg = "can't send non-None value to a just-started generator"; + } + PyErr_SetString(PyExc_TypeError, msg); +} +#define __Pyx_Coroutine_AlreadyTerminatedError(gen, value, closing) (__Pyx__Coroutine_AlreadyTerminatedError(gen, value, closing), (PyObject*)NULL) +static void __Pyx__Coroutine_AlreadyTerminatedError(CYTHON_UNUSED PyObject *gen, PyObject *value, CYTHON_UNUSED int closing) { + #ifdef __Pyx_Coroutine_USED + if (!closing && __Pyx_Coroutine_Check(gen)) { + PyErr_SetString(PyExc_RuntimeError, "cannot reuse already awaited coroutine"); + } else + #endif + if (value) { + #ifdef __Pyx_AsyncGen_USED + if (__Pyx_AsyncGen_CheckExact(gen)) + PyErr_SetNone(__Pyx_PyExc_StopAsyncIteration); + else + #endif + PyErr_SetNone(PyExc_StopIteration); + } +} +static +PyObject *__Pyx_Coroutine_SendEx(__pyx_CoroutineObject *self, PyObject *value, int closing) { + __Pyx_PyThreadState_declare + PyThreadState *tstate; + __Pyx_ExcInfoStruct *exc_state; + PyObject *retval; + assert(!self->is_running); + if (unlikely(self->resume_label == 0)) { + if (unlikely(value && value != Py_None)) { + return __Pyx_Coroutine_NotStartedError((PyObject*)self); + } + } + if (unlikely(self->resume_label == -1)) { + return __Pyx_Coroutine_AlreadyTerminatedError((PyObject*)self, value, closing); + } +#if CYTHON_FAST_THREAD_STATE + __Pyx_PyThreadState_assign + tstate = __pyx_tstate; +#else + tstate = __Pyx_PyThreadState_Current; +#endif + exc_state = &self->gi_exc_state; + if (exc_state->exc_type) { + #if CYTHON_COMPILING_IN_PYPY || CYTHON_COMPILING_IN_PYSTON + #else + if (exc_state->exc_traceback) { + PyTracebackObject *tb = (PyTracebackObject *) exc_state->exc_traceback; + PyFrameObject *f = tb->tb_frame; + Py_XINCREF(tstate->frame); + assert(f->f_back == NULL); + f->f_back = tstate->frame; + } + #endif + } +#if CYTHON_USE_EXC_INFO_STACK + exc_state->previous_item = tstate->exc_info; + tstate->exc_info = exc_state; +#else + if (exc_state->exc_type) { + __Pyx_ExceptionSwap(&exc_state->exc_type, &exc_state->exc_value, &exc_state->exc_traceback); + } else { + __Pyx_Coroutine_ExceptionClear(exc_state); + __Pyx_ExceptionSave(&exc_state->exc_type, &exc_state->exc_value, &exc_state->exc_traceback); + } +#endif + self->is_running = 1; + retval = self->body((PyObject *) self, tstate, value); + self->is_running = 0; +#if CYTHON_USE_EXC_INFO_STACK + exc_state = &self->gi_exc_state; + tstate->exc_info = exc_state->previous_item; + exc_state->previous_item = NULL; + __Pyx_Coroutine_ResetFrameBackpointer(exc_state); +#endif + return retval; +} +static CYTHON_INLINE void __Pyx_Coroutine_ResetFrameBackpointer(__Pyx_ExcInfoStruct *exc_state) { + PyObject *exc_tb = exc_state->exc_traceback; + if (likely(exc_tb)) { +#if CYTHON_COMPILING_IN_PYPY || CYTHON_COMPILING_IN_PYSTON +#else + PyTracebackObject *tb = (PyTracebackObject *) exc_tb; + PyFrameObject *f = tb->tb_frame; + Py_CLEAR(f->f_back); +#endif + } +} +static CYTHON_INLINE +PyObject *__Pyx_Coroutine_MethodReturn(CYTHON_UNUSED PyObject* gen, PyObject *retval) { + if (unlikely(!retval)) { + __Pyx_PyThreadState_declare + __Pyx_PyThreadState_assign + if (!__Pyx_PyErr_Occurred()) { + PyObject *exc = PyExc_StopIteration; + #ifdef __Pyx_AsyncGen_USED + if (__Pyx_AsyncGen_CheckExact(gen)) + exc = __Pyx_PyExc_StopAsyncIteration; + #endif + __Pyx_PyErr_SetNone(exc); + } + } + return retval; +} +#if CYTHON_COMPILING_IN_CPYTHON && PY_VERSION_HEX >= 0x03030000 && (defined(__linux__) || PY_VERSION_HEX >= 0x030600B3) +static CYTHON_INLINE +PyObject *__Pyx_PyGen_Send(PyGenObject *gen, PyObject *arg) { +#if PY_VERSION_HEX <= 0x030A00A1 + return _PyGen_Send(gen, arg); +#else + PyObject *result; + if (PyIter_Send((PyObject*)gen, arg ? arg : Py_None, &result) == PYGEN_RETURN) { + if (PyAsyncGen_CheckExact(gen)) { + assert(result == Py_None); + PyErr_SetNone(PyExc_StopAsyncIteration); + } + else if (result == Py_None) { + PyErr_SetNone(PyExc_StopIteration); + } + else { + _PyGen_SetStopIterationValue(result); + } + Py_CLEAR(result); + } + return result; +#endif +} +#endif +static CYTHON_INLINE +PyObject *__Pyx_Coroutine_FinishDelegation(__pyx_CoroutineObject *gen) { + PyObject *ret; + PyObject *val = NULL; + __Pyx_Coroutine_Undelegate(gen); + __Pyx_PyGen__FetchStopIterationValue(__Pyx_PyThreadState_Current, &val); + ret = __Pyx_Coroutine_SendEx(gen, val, 0); + Py_XDECREF(val); + return ret; +} +static PyObject *__Pyx_Coroutine_Send(PyObject *self, PyObject *value) { + PyObject *retval; + __pyx_CoroutineObject *gen = (__pyx_CoroutineObject*) self; + PyObject *yf = gen->yieldfrom; + if (unlikely(gen->is_running)) + return __Pyx_Coroutine_AlreadyRunningError(gen); + if (yf) { + PyObject *ret; + gen->is_running = 1; + #ifdef __Pyx_Generator_USED + if (__Pyx_Generator_CheckExact(yf)) { + ret = __Pyx_Coroutine_Send(yf, value); + } else + #endif + #ifdef __Pyx_Coroutine_USED + if (__Pyx_Coroutine_Check(yf)) { + ret = __Pyx_Coroutine_Send(yf, value); + } else + #endif + #ifdef __Pyx_AsyncGen_USED + if (__pyx_PyAsyncGenASend_CheckExact(yf)) { + ret = __Pyx_async_gen_asend_send(yf, value); + } else + #endif + #if CYTHON_COMPILING_IN_CPYTHON && PY_VERSION_HEX >= 0x03030000 && (defined(__linux__) || PY_VERSION_HEX >= 0x030600B3) + if (PyGen_CheckExact(yf)) { + ret = __Pyx_PyGen_Send((PyGenObject*)yf, value == Py_None ? NULL : value); + } else + #endif + #if CYTHON_COMPILING_IN_CPYTHON && PY_VERSION_HEX >= 0x03050000 && defined(PyCoro_CheckExact) && (defined(__linux__) || PY_VERSION_HEX >= 0x030600B3) + if (PyCoro_CheckExact(yf)) { + ret = __Pyx_PyGen_Send((PyGenObject*)yf, value == Py_None ? NULL : value); + } else + #endif + { + if (value == Py_None) + ret = Py_TYPE(yf)->tp_iternext(yf); + else + ret = __Pyx_PyObject_CallMethod1(yf, __pyx_n_s_send, value); + } + gen->is_running = 0; + if (likely(ret)) { + return ret; + } + retval = __Pyx_Coroutine_FinishDelegation(gen); + } else { + retval = __Pyx_Coroutine_SendEx(gen, value, 0); + } + return __Pyx_Coroutine_MethodReturn(self, retval); +} +static int __Pyx_Coroutine_CloseIter(__pyx_CoroutineObject *gen, PyObject *yf) { + PyObject *retval = NULL; + int err = 0; + #ifdef __Pyx_Generator_USED + if (__Pyx_Generator_CheckExact(yf)) { + retval = __Pyx_Coroutine_Close(yf); + if (!retval) + return -1; + } else + #endif + #ifdef __Pyx_Coroutine_USED + if (__Pyx_Coroutine_Check(yf)) { + retval = __Pyx_Coroutine_Close(yf); + if (!retval) + return -1; + } else + if (__Pyx_CoroutineAwait_CheckExact(yf)) { + retval = __Pyx_CoroutineAwait_Close((__pyx_CoroutineAwaitObject*)yf, NULL); + if (!retval) + return -1; + } else + #endif + #ifdef __Pyx_AsyncGen_USED + if (__pyx_PyAsyncGenASend_CheckExact(yf)) { + retval = __Pyx_async_gen_asend_close(yf, NULL); + } else + if (__pyx_PyAsyncGenAThrow_CheckExact(yf)) { + retval = __Pyx_async_gen_athrow_close(yf, NULL); + } else + #endif + { + PyObject *meth; + gen->is_running = 1; + meth = __Pyx_PyObject_GetAttrStr(yf, __pyx_n_s_close); + if (unlikely(!meth)) { + if (!PyErr_ExceptionMatches(PyExc_AttributeError)) { + PyErr_WriteUnraisable(yf); + } + PyErr_Clear(); + } else { + retval = PyObject_CallFunction(meth, NULL); + Py_DECREF(meth); + if (!retval) + err = -1; + } + gen->is_running = 0; + } + Py_XDECREF(retval); + return err; +} +static PyObject *__Pyx_Generator_Next(PyObject *self) { + __pyx_CoroutineObject *gen = (__pyx_CoroutineObject*) self; + PyObject *yf = gen->yieldfrom; + if (unlikely(gen->is_running)) + return __Pyx_Coroutine_AlreadyRunningError(gen); + if (yf) { + PyObject *ret; + gen->is_running = 1; + #ifdef __Pyx_Generator_USED + if (__Pyx_Generator_CheckExact(yf)) { + ret = __Pyx_Generator_Next(yf); + } else + #endif + #if CYTHON_COMPILING_IN_CPYTHON && PY_VERSION_HEX >= 0x03030000 && (defined(__linux__) || PY_VERSION_HEX >= 0x030600B3) + if (PyGen_CheckExact(yf)) { + ret = __Pyx_PyGen_Send((PyGenObject*)yf, NULL); + } else + #endif + #ifdef __Pyx_Coroutine_USED + if (__Pyx_Coroutine_Check(yf)) { + ret = __Pyx_Coroutine_Send(yf, Py_None); + } else + #endif + ret = Py_TYPE(yf)->tp_iternext(yf); + gen->is_running = 0; + if (likely(ret)) { + return ret; + } + return __Pyx_Coroutine_FinishDelegation(gen); + } + return __Pyx_Coroutine_SendEx(gen, Py_None, 0); +} +static PyObject *__Pyx_Coroutine_Close_Method(PyObject *self, CYTHON_UNUSED PyObject *arg) { + return __Pyx_Coroutine_Close(self); +} +static PyObject *__Pyx_Coroutine_Close(PyObject *self) { + __pyx_CoroutineObject *gen = (__pyx_CoroutineObject *) self; + PyObject *retval, *raised_exception; + PyObject *yf = gen->yieldfrom; + int err = 0; + if (unlikely(gen->is_running)) + return __Pyx_Coroutine_AlreadyRunningError(gen); + if (yf) { + Py_INCREF(yf); + err = __Pyx_Coroutine_CloseIter(gen, yf); + __Pyx_Coroutine_Undelegate(gen); + Py_DECREF(yf); + } + if (err == 0) + PyErr_SetNone(PyExc_GeneratorExit); + retval = __Pyx_Coroutine_SendEx(gen, NULL, 1); + if (unlikely(retval)) { + const char *msg; + Py_DECREF(retval); + if ((0)) { + #ifdef __Pyx_Coroutine_USED + } else if (__Pyx_Coroutine_Check(self)) { + msg = "coroutine ignored GeneratorExit"; + #endif + #ifdef __Pyx_AsyncGen_USED + } else if (__Pyx_AsyncGen_CheckExact(self)) { +#if PY_VERSION_HEX < 0x03060000 + msg = "async generator ignored GeneratorExit - might require Python 3.6+ finalisation (PEP 525)"; +#else + msg = "async generator ignored GeneratorExit"; +#endif + #endif + } else { + msg = "generator ignored GeneratorExit"; + } + PyErr_SetString(PyExc_RuntimeError, msg); + return NULL; + } + raised_exception = PyErr_Occurred(); + if (likely(!raised_exception || __Pyx_PyErr_GivenExceptionMatches2(raised_exception, PyExc_GeneratorExit, PyExc_StopIteration))) { + if (raised_exception) PyErr_Clear(); + Py_INCREF(Py_None); + return Py_None; + } + return NULL; +} +static PyObject *__Pyx__Coroutine_Throw(PyObject *self, PyObject *typ, PyObject *val, PyObject *tb, + PyObject *args, int close_on_genexit) { + __pyx_CoroutineObject *gen = (__pyx_CoroutineObject *) self; + PyObject *yf = gen->yieldfrom; + if (unlikely(gen->is_running)) + return __Pyx_Coroutine_AlreadyRunningError(gen); + if (yf) { + PyObject *ret; + Py_INCREF(yf); + if (__Pyx_PyErr_GivenExceptionMatches(typ, PyExc_GeneratorExit) && close_on_genexit) { + int err = __Pyx_Coroutine_CloseIter(gen, yf); + Py_DECREF(yf); + __Pyx_Coroutine_Undelegate(gen); + if (err < 0) + return __Pyx_Coroutine_MethodReturn(self, __Pyx_Coroutine_SendEx(gen, NULL, 0)); + goto throw_here; + } + gen->is_running = 1; + if (0 + #ifdef __Pyx_Generator_USED + || __Pyx_Generator_CheckExact(yf) + #endif + #ifdef __Pyx_Coroutine_USED + || __Pyx_Coroutine_Check(yf) + #endif + ) { + ret = __Pyx__Coroutine_Throw(yf, typ, val, tb, args, close_on_genexit); + #ifdef __Pyx_Coroutine_USED + } else if (__Pyx_CoroutineAwait_CheckExact(yf)) { + ret = __Pyx__Coroutine_Throw(((__pyx_CoroutineAwaitObject*)yf)->coroutine, typ, val, tb, args, close_on_genexit); + #endif + } else { + PyObject *meth = __Pyx_PyObject_GetAttrStr(yf, __pyx_n_s_throw); + if (unlikely(!meth)) { + Py_DECREF(yf); + if (!PyErr_ExceptionMatches(PyExc_AttributeError)) { + gen->is_running = 0; + return NULL; + } + PyErr_Clear(); + __Pyx_Coroutine_Undelegate(gen); + gen->is_running = 0; + goto throw_here; + } + if (likely(args)) { + ret = PyObject_CallObject(meth, args); + } else { + ret = PyObject_CallFunctionObjArgs(meth, typ, val, tb, NULL); + } + Py_DECREF(meth); + } + gen->is_running = 0; + Py_DECREF(yf); + if (!ret) { + ret = __Pyx_Coroutine_FinishDelegation(gen); + } + return __Pyx_Coroutine_MethodReturn(self, ret); + } +throw_here: + __Pyx_Raise(typ, val, tb, NULL); + return __Pyx_Coroutine_MethodReturn(self, __Pyx_Coroutine_SendEx(gen, NULL, 0)); +} +static PyObject *__Pyx_Coroutine_Throw(PyObject *self, PyObject *args) { + PyObject *typ; + PyObject *val = NULL; + PyObject *tb = NULL; + if (!PyArg_UnpackTuple(args, (char *)"throw", 1, 3, &typ, &val, &tb)) + return NULL; + return __Pyx__Coroutine_Throw(self, typ, val, tb, args, 1); +} +static CYTHON_INLINE int __Pyx_Coroutine_traverse_excstate(__Pyx_ExcInfoStruct *exc_state, visitproc visit, void *arg) { + Py_VISIT(exc_state->exc_type); + Py_VISIT(exc_state->exc_value); + Py_VISIT(exc_state->exc_traceback); + return 0; +} +static int __Pyx_Coroutine_traverse(__pyx_CoroutineObject *gen, visitproc visit, void *arg) { + Py_VISIT(gen->closure); + Py_VISIT(gen->classobj); + Py_VISIT(gen->yieldfrom); + return __Pyx_Coroutine_traverse_excstate(&gen->gi_exc_state, visit, arg); +} +static int __Pyx_Coroutine_clear(PyObject *self) { + __pyx_CoroutineObject *gen = (__pyx_CoroutineObject *) self; + Py_CLEAR(gen->closure); + Py_CLEAR(gen->classobj); + Py_CLEAR(gen->yieldfrom); + __Pyx_Coroutine_ExceptionClear(&gen->gi_exc_state); +#ifdef __Pyx_AsyncGen_USED + if (__Pyx_AsyncGen_CheckExact(self)) { + Py_CLEAR(((__pyx_PyAsyncGenObject*)gen)->ag_finalizer); + } +#endif + Py_CLEAR(gen->gi_code); + Py_CLEAR(gen->gi_frame); + Py_CLEAR(gen->gi_name); + Py_CLEAR(gen->gi_qualname); + Py_CLEAR(gen->gi_modulename); + return 0; +} +static void __Pyx_Coroutine_dealloc(PyObject *self) { + __pyx_CoroutineObject *gen = (__pyx_CoroutineObject *) self; + PyObject_GC_UnTrack(gen); + if (gen->gi_weakreflist != NULL) + PyObject_ClearWeakRefs(self); + if (gen->resume_label >= 0) { + PyObject_GC_Track(self); +#if PY_VERSION_HEX >= 0x030400a1 && CYTHON_USE_TP_FINALIZE + if (PyObject_CallFinalizerFromDealloc(self)) +#else + Py_TYPE(gen)->tp_del(self); + if (Py_REFCNT(self) > 0) +#endif + { + return; + } + PyObject_GC_UnTrack(self); + } +#ifdef __Pyx_AsyncGen_USED + if (__Pyx_AsyncGen_CheckExact(self)) { + /* We have to handle this case for asynchronous generators + right here, because this code has to be between UNTRACK + and GC_Del. */ + Py_CLEAR(((__pyx_PyAsyncGenObject*)self)->ag_finalizer); + } +#endif + __Pyx_Coroutine_clear(self); + PyObject_GC_Del(gen); +} +static void __Pyx_Coroutine_del(PyObject *self) { + PyObject *error_type, *error_value, *error_traceback; + __pyx_CoroutineObject *gen = (__pyx_CoroutineObject *) self; + __Pyx_PyThreadState_declare + if (gen->resume_label < 0) { + return; + } +#if !CYTHON_USE_TP_FINALIZE + assert(self->ob_refcnt == 0); + __Pyx_SET_REFCNT(self, 1); +#endif + __Pyx_PyThreadState_assign + __Pyx_ErrFetch(&error_type, &error_value, &error_traceback); +#ifdef __Pyx_AsyncGen_USED + if (__Pyx_AsyncGen_CheckExact(self)) { + __pyx_PyAsyncGenObject *agen = (__pyx_PyAsyncGenObject*)self; + PyObject *finalizer = agen->ag_finalizer; + if (finalizer && !agen->ag_closed) { + PyObject *res = __Pyx_PyObject_CallOneArg(finalizer, self); + if (unlikely(!res)) { + PyErr_WriteUnraisable(self); + } else { + Py_DECREF(res); + } + __Pyx_ErrRestore(error_type, error_value, error_traceback); + return; + } + } +#endif + if (unlikely(gen->resume_label == 0 && !error_value)) { +#ifdef __Pyx_Coroutine_USED +#ifdef __Pyx_Generator_USED + if (!__Pyx_Generator_CheckExact(self)) +#endif + { + PyObject_GC_UnTrack(self); +#if PY_MAJOR_VERSION >= 3 || defined(PyErr_WarnFormat) + if (unlikely(PyErr_WarnFormat(PyExc_RuntimeWarning, 1, "coroutine '%.50S' was never awaited", gen->gi_qualname) < 0)) + PyErr_WriteUnraisable(self); +#else + {PyObject *msg; + char *cmsg; + #if CYTHON_COMPILING_IN_PYPY + msg = NULL; + cmsg = (char*) "coroutine was never awaited"; + #else + char *cname; + PyObject *qualname; + qualname = gen->gi_qualname; + cname = PyString_AS_STRING(qualname); + msg = PyString_FromFormat("coroutine '%.50s' was never awaited", cname); + if (unlikely(!msg)) { + PyErr_Clear(); + cmsg = (char*) "coroutine was never awaited"; + } else { + cmsg = PyString_AS_STRING(msg); + } + #endif + if (unlikely(PyErr_WarnEx(PyExc_RuntimeWarning, cmsg, 1) < 0)) + PyErr_WriteUnraisable(self); + Py_XDECREF(msg);} +#endif + PyObject_GC_Track(self); + } +#endif + } else { + PyObject *res = __Pyx_Coroutine_Close(self); + if (unlikely(!res)) { + if (PyErr_Occurred()) + PyErr_WriteUnraisable(self); + } else { + Py_DECREF(res); + } + } + __Pyx_ErrRestore(error_type, error_value, error_traceback); +#if !CYTHON_USE_TP_FINALIZE + assert(Py_REFCNT(self) > 0); + if (--self->ob_refcnt == 0) { + return; + } + { + Py_ssize_t refcnt = Py_REFCNT(self); + _Py_NewReference(self); + __Pyx_SET_REFCNT(self, refcnt); + } +#if CYTHON_COMPILING_IN_CPYTHON + assert(PyType_IS_GC(Py_TYPE(self)) && + _Py_AS_GC(self)->gc.gc_refs != _PyGC_REFS_UNTRACKED); + _Py_DEC_REFTOTAL; +#endif +#ifdef COUNT_ALLOCS + --Py_TYPE(self)->tp_frees; + --Py_TYPE(self)->tp_allocs; +#endif +#endif +} +static PyObject * +__Pyx_Coroutine_get_name(__pyx_CoroutineObject *self, CYTHON_UNUSED void *context) +{ + PyObject *name = self->gi_name; + if (unlikely(!name)) name = Py_None; + Py_INCREF(name); + return name; +} +static int +__Pyx_Coroutine_set_name(__pyx_CoroutineObject *self, PyObject *value, CYTHON_UNUSED void *context) +{ + PyObject *tmp; +#if PY_MAJOR_VERSION >= 3 + if (unlikely(value == NULL || !PyUnicode_Check(value))) +#else + if (unlikely(value == NULL || !PyString_Check(value))) +#endif + { + PyErr_SetString(PyExc_TypeError, + "__name__ must be set to a string object"); + return -1; + } + tmp = self->gi_name; + Py_INCREF(value); + self->gi_name = value; + Py_XDECREF(tmp); + return 0; +} +static PyObject * +__Pyx_Coroutine_get_qualname(__pyx_CoroutineObject *self, CYTHON_UNUSED void *context) +{ + PyObject *name = self->gi_qualname; + if (unlikely(!name)) name = Py_None; + Py_INCREF(name); + return name; +} +static int +__Pyx_Coroutine_set_qualname(__pyx_CoroutineObject *self, PyObject *value, CYTHON_UNUSED void *context) +{ + PyObject *tmp; +#if PY_MAJOR_VERSION >= 3 + if (unlikely(value == NULL || !PyUnicode_Check(value))) +#else + if (unlikely(value == NULL || !PyString_Check(value))) +#endif + { + PyErr_SetString(PyExc_TypeError, + "__qualname__ must be set to a string object"); + return -1; + } + tmp = self->gi_qualname; + Py_INCREF(value); + self->gi_qualname = value; + Py_XDECREF(tmp); + return 0; +} +static PyObject * +__Pyx_Coroutine_get_frame(__pyx_CoroutineObject *self, CYTHON_UNUSED void *context) +{ + PyObject *frame = self->gi_frame; + if (!frame) { + if (unlikely(!self->gi_code)) { + Py_RETURN_NONE; + } + frame = (PyObject *) PyFrame_New( + PyThreadState_Get(), /*PyThreadState *tstate,*/ + (PyCodeObject*) self->gi_code, /*PyCodeObject *code,*/ + __pyx_d, /*PyObject *globals,*/ + 0 /*PyObject *locals*/ + ); + if (unlikely(!frame)) + return NULL; + self->gi_frame = frame; + } + Py_INCREF(frame); + return frame; +} +static __pyx_CoroutineObject *__Pyx__Coroutine_New( + PyTypeObject* type, __pyx_coroutine_body_t body, PyObject *code, PyObject *closure, + PyObject *name, PyObject *qualname, PyObject *module_name) { + __pyx_CoroutineObject *gen = PyObject_GC_New(__pyx_CoroutineObject, type); + if (unlikely(!gen)) + return NULL; + return __Pyx__Coroutine_NewInit(gen, body, code, closure, name, qualname, module_name); +} +static __pyx_CoroutineObject *__Pyx__Coroutine_NewInit( + __pyx_CoroutineObject *gen, __pyx_coroutine_body_t body, PyObject *code, PyObject *closure, + PyObject *name, PyObject *qualname, PyObject *module_name) { + gen->body = body; + gen->closure = closure; + Py_XINCREF(closure); + gen->is_running = 0; + gen->resume_label = 0; + gen->classobj = NULL; + gen->yieldfrom = NULL; + gen->gi_exc_state.exc_type = NULL; + gen->gi_exc_state.exc_value = NULL; + gen->gi_exc_state.exc_traceback = NULL; +#if CYTHON_USE_EXC_INFO_STACK + gen->gi_exc_state.previous_item = NULL; +#endif + gen->gi_weakreflist = NULL; + Py_XINCREF(qualname); + gen->gi_qualname = qualname; + Py_XINCREF(name); + gen->gi_name = name; + Py_XINCREF(module_name); + gen->gi_modulename = module_name; + Py_XINCREF(code); + gen->gi_code = code; + gen->gi_frame = NULL; + PyObject_GC_Track(gen); + return gen; +} + +/* PatchModuleWithCoroutine */ +static PyObject* __Pyx_Coroutine_patch_module(PyObject* module, const char* py_code) { +#if defined(__Pyx_Generator_USED) || defined(__Pyx_Coroutine_USED) + int result; + PyObject *globals, *result_obj; + globals = PyDict_New(); if (unlikely(!globals)) goto ignore; + result = PyDict_SetItemString(globals, "_cython_coroutine_type", + #ifdef __Pyx_Coroutine_USED + (PyObject*)__pyx_CoroutineType); + #else + Py_None); + #endif + if (unlikely(result < 0)) goto ignore; + result = PyDict_SetItemString(globals, "_cython_generator_type", + #ifdef __Pyx_Generator_USED + (PyObject*)__pyx_GeneratorType); + #else + Py_None); + #endif + if (unlikely(result < 0)) goto ignore; + if (unlikely(PyDict_SetItemString(globals, "_module", module) < 0)) goto ignore; + if (unlikely(PyDict_SetItemString(globals, "__builtins__", __pyx_b) < 0)) goto ignore; + result_obj = PyRun_String(py_code, Py_file_input, globals, globals); + if (unlikely(!result_obj)) goto ignore; + Py_DECREF(result_obj); + Py_DECREF(globals); + return module; +ignore: + Py_XDECREF(globals); + PyErr_WriteUnraisable(module); + if (unlikely(PyErr_WarnEx(PyExc_RuntimeWarning, "Cython module failed to patch module with custom type", 1) < 0)) { + Py_DECREF(module); + module = NULL; + } +#else + py_code++; +#endif + return module; +} + +/* PatchGeneratorABC */ +#ifndef CYTHON_REGISTER_ABCS +#define CYTHON_REGISTER_ABCS 1 +#endif +#if defined(__Pyx_Generator_USED) || defined(__Pyx_Coroutine_USED) +static PyObject* __Pyx_patch_abc_module(PyObject *module); +static PyObject* __Pyx_patch_abc_module(PyObject *module) { + module = __Pyx_Coroutine_patch_module( + module, "" +"if _cython_generator_type is not None:\n" +" try: Generator = _module.Generator\n" +" except AttributeError: pass\n" +" else: Generator.register(_cython_generator_type)\n" +"if _cython_coroutine_type is not None:\n" +" try: Coroutine = _module.Coroutine\n" +" except AttributeError: pass\n" +" else: Coroutine.register(_cython_coroutine_type)\n" + ); + return module; +} +#endif +static int __Pyx_patch_abc(void) { +#if defined(__Pyx_Generator_USED) || defined(__Pyx_Coroutine_USED) + static int abc_patched = 0; + if (CYTHON_REGISTER_ABCS && !abc_patched) { + PyObject *module; + module = PyImport_ImportModule((PY_MAJOR_VERSION >= 3) ? "collections.abc" : "collections"); + if (!module) { + PyErr_WriteUnraisable(NULL); + if (unlikely(PyErr_WarnEx(PyExc_RuntimeWarning, + ((PY_MAJOR_VERSION >= 3) ? + "Cython module failed to register with collections.abc module" : + "Cython module failed to register with collections module"), 1) < 0)) { + return -1; + } + } else { + module = __Pyx_patch_abc_module(module); + abc_patched = 1; + if (unlikely(!module)) + return -1; + Py_DECREF(module); + } + module = PyImport_ImportModule("backports_abc"); + if (module) { + module = __Pyx_patch_abc_module(module); + Py_XDECREF(module); + } + if (!module) { + PyErr_Clear(); + } + } +#else + if ((0)) __Pyx_Coroutine_patch_module(NULL, NULL); +#endif + return 0; +} + +/* Generator */ +static PyMethodDef __pyx_Generator_methods[] = { + {"send", (PyCFunction) __Pyx_Coroutine_Send, METH_O, + (char*) PyDoc_STR("send(arg) -> send 'arg' into generator,\nreturn next yielded value or raise StopIteration.")}, + {"throw", (PyCFunction) __Pyx_Coroutine_Throw, METH_VARARGS, + (char*) PyDoc_STR("throw(typ[,val[,tb]]) -> raise exception in generator,\nreturn next yielded value or raise StopIteration.")}, + {"close", (PyCFunction) __Pyx_Coroutine_Close_Method, METH_NOARGS, + (char*) PyDoc_STR("close() -> raise GeneratorExit inside generator.")}, + {0, 0, 0, 0} +}; +static PyMemberDef __pyx_Generator_memberlist[] = { + {(char *) "gi_running", T_BOOL, offsetof(__pyx_CoroutineObject, is_running), READONLY, NULL}, + {(char*) "gi_yieldfrom", T_OBJECT, offsetof(__pyx_CoroutineObject, yieldfrom), READONLY, + (char*) PyDoc_STR("object being iterated by 'yield from', or None")}, + {(char*) "gi_code", T_OBJECT, offsetof(__pyx_CoroutineObject, gi_code), READONLY, NULL}, + {0, 0, 0, 0, 0} +}; +static PyGetSetDef __pyx_Generator_getsets[] = { + {(char *) "__name__", (getter)__Pyx_Coroutine_get_name, (setter)__Pyx_Coroutine_set_name, + (char*) PyDoc_STR("name of the generator"), 0}, + {(char *) "__qualname__", (getter)__Pyx_Coroutine_get_qualname, (setter)__Pyx_Coroutine_set_qualname, + (char*) PyDoc_STR("qualified name of the generator"), 0}, + {(char *) "gi_frame", (getter)__Pyx_Coroutine_get_frame, NULL, + (char*) PyDoc_STR("Frame of the generator"), 0}, + {0, 0, 0, 0, 0} +}; +static PyTypeObject __pyx_GeneratorType_type = { + PyVarObject_HEAD_INIT(0, 0) + "generator", + sizeof(__pyx_CoroutineObject), + 0, + (destructor) __Pyx_Coroutine_dealloc, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + Py_TPFLAGS_DEFAULT | Py_TPFLAGS_HAVE_GC | Py_TPFLAGS_HAVE_FINALIZE, + 0, + (traverseproc) __Pyx_Coroutine_traverse, + 0, + 0, + offsetof(__pyx_CoroutineObject, gi_weakreflist), + 0, + (iternextfunc) __Pyx_Generator_Next, + __pyx_Generator_methods, + __pyx_Generator_memberlist, + __pyx_Generator_getsets, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, + 0, +#if CYTHON_USE_TP_FINALIZE + 0, +#else + __Pyx_Coroutine_del, +#endif + 0, +#if CYTHON_USE_TP_FINALIZE + __Pyx_Coroutine_del, +#elif PY_VERSION_HEX >= 0x030400a1 + 0, +#endif +#if PY_VERSION_HEX >= 0x030800b1 + 0, +#endif +#if PY_VERSION_HEX >= 0x030800b4 && PY_VERSION_HEX < 0x03090000 + 0, +#endif +}; +static int __pyx_Generator_init(void) { + __pyx_GeneratorType_type.tp_getattro = __Pyx_PyObject_GenericGetAttrNoDict; + __pyx_GeneratorType_type.tp_iter = PyObject_SelfIter; + __pyx_GeneratorType = __Pyx_FetchCommonType(&__pyx_GeneratorType_type); + if (unlikely(!__pyx_GeneratorType)) { + return -1; + } + return 0; +} + +/* CheckBinaryVersion */ +static int __Pyx_check_binary_version(void) { + char ctversion[4], rtversion[4]; + PyOS_snprintf(ctversion, 4, "%d.%d", PY_MAJOR_VERSION, PY_MINOR_VERSION); + PyOS_snprintf(rtversion, 4, "%s", Py_GetVersion()); + if (ctversion[0] != rtversion[0] || ctversion[2] != rtversion[2]) { + char message[200]; + PyOS_snprintf(message, sizeof(message), + "compiletime version %s of module '%.100s' " + "does not match runtime version %s", + ctversion, __Pyx_MODULE_NAME, rtversion); + return PyErr_WarnEx(NULL, message, 1); + } + return 0; +} + +/* InitStrings */ +static int __Pyx_InitStrings(__Pyx_StringTabEntry *t) { + while (t->p) { + #if PY_MAJOR_VERSION < 3 + if (t->is_unicode) { + *t->p = PyUnicode_DecodeUTF8(t->s, t->n - 1, NULL); + } else if (t->intern) { + *t->p = PyString_InternFromString(t->s); + } else { + *t->p = PyString_FromStringAndSize(t->s, t->n - 1); + } + #else + if (t->is_unicode | t->is_str) { + if (t->intern) { + *t->p = PyUnicode_InternFromString(t->s); + } else if (t->encoding) { + *t->p = PyUnicode_Decode(t->s, t->n - 1, t->encoding, NULL); + } else { + *t->p = PyUnicode_FromStringAndSize(t->s, t->n - 1); + } + } else { + *t->p = PyBytes_FromStringAndSize(t->s, t->n - 1); + } + #endif + if (!*t->p) + return -1; + if (PyObject_Hash(*t->p) == -1) + return -1; + ++t; + } + return 0; +} + +static CYTHON_INLINE PyObject* __Pyx_PyUnicode_FromString(const char* c_str) { + return __Pyx_PyUnicode_FromStringAndSize(c_str, (Py_ssize_t)strlen(c_str)); +} +static CYTHON_INLINE const char* __Pyx_PyObject_AsString(PyObject* o) { + Py_ssize_t ignore; + return __Pyx_PyObject_AsStringAndSize(o, &ignore); +} +#if __PYX_DEFAULT_STRING_ENCODING_IS_ASCII || __PYX_DEFAULT_STRING_ENCODING_IS_DEFAULT +#if !CYTHON_PEP393_ENABLED +static const char* __Pyx_PyUnicode_AsStringAndSize(PyObject* o, Py_ssize_t *length) { + char* defenc_c; + PyObject* defenc = _PyUnicode_AsDefaultEncodedString(o, NULL); + if (!defenc) return NULL; + defenc_c = PyBytes_AS_STRING(defenc); +#if __PYX_DEFAULT_STRING_ENCODING_IS_ASCII + { + char* end = defenc_c + PyBytes_GET_SIZE(defenc); + char* c; + for (c = defenc_c; c < end; c++) { + if ((unsigned char) (*c) >= 128) { + PyUnicode_AsASCIIString(o); + return NULL; + } + } + } +#endif + *length = PyBytes_GET_SIZE(defenc); + return defenc_c; +} +#else +static CYTHON_INLINE const char* __Pyx_PyUnicode_AsStringAndSize(PyObject* o, Py_ssize_t *length) { + if (unlikely(__Pyx_PyUnicode_READY(o) == -1)) return NULL; +#if __PYX_DEFAULT_STRING_ENCODING_IS_ASCII + if (likely(PyUnicode_IS_ASCII(o))) { + *length = PyUnicode_GET_LENGTH(o); + return PyUnicode_AsUTF8(o); + } else { + PyUnicode_AsASCIIString(o); + return NULL; + } +#else + return PyUnicode_AsUTF8AndSize(o, length); +#endif +} +#endif +#endif +static CYTHON_INLINE const char* __Pyx_PyObject_AsStringAndSize(PyObject* o, Py_ssize_t *length) { +#if __PYX_DEFAULT_STRING_ENCODING_IS_ASCII || __PYX_DEFAULT_STRING_ENCODING_IS_DEFAULT + if ( +#if PY_MAJOR_VERSION < 3 && __PYX_DEFAULT_STRING_ENCODING_IS_ASCII + __Pyx_sys_getdefaultencoding_not_ascii && +#endif + PyUnicode_Check(o)) { + return __Pyx_PyUnicode_AsStringAndSize(o, length); + } else +#endif +#if (!CYTHON_COMPILING_IN_PYPY) || (defined(PyByteArray_AS_STRING) && defined(PyByteArray_GET_SIZE)) + if (PyByteArray_Check(o)) { + *length = PyByteArray_GET_SIZE(o); + return PyByteArray_AS_STRING(o); + } else +#endif + { + char* result; + int r = PyBytes_AsStringAndSize(o, &result, length); + if (unlikely(r < 0)) { + return NULL; + } else { + return result; + } + } +} +static CYTHON_INLINE int __Pyx_PyObject_IsTrue(PyObject* x) { + int is_true = x == Py_True; + if (is_true | (x == Py_False) | (x == Py_None)) return is_true; + else return PyObject_IsTrue(x); +} +static CYTHON_INLINE int __Pyx_PyObject_IsTrueAndDecref(PyObject* x) { + int retval; + if (unlikely(!x)) return -1; + retval = __Pyx_PyObject_IsTrue(x); + Py_DECREF(x); + return retval; +} +static PyObject* __Pyx_PyNumber_IntOrLongWrongResultType(PyObject* result, const char* type_name) { +#if PY_MAJOR_VERSION >= 3 + if (PyLong_Check(result)) { + if (PyErr_WarnFormat(PyExc_DeprecationWarning, 1, + "__int__ returned non-int (type %.200s). " + "The ability to return an instance of a strict subclass of int " + "is deprecated, and may be removed in a future version of Python.", + Py_TYPE(result)->tp_name)) { + Py_DECREF(result); + return NULL; + } + return result; + } +#endif + PyErr_Format(PyExc_TypeError, + "__%.4s__ returned non-%.4s (type %.200s)", + type_name, type_name, Py_TYPE(result)->tp_name); + Py_DECREF(result); + return NULL; +} +static CYTHON_INLINE PyObject* __Pyx_PyNumber_IntOrLong(PyObject* x) { +#if CYTHON_USE_TYPE_SLOTS + PyNumberMethods *m; +#endif + const char *name = NULL; + PyObject *res = NULL; +#if PY_MAJOR_VERSION < 3 + if (likely(PyInt_Check(x) || PyLong_Check(x))) +#else + if (likely(PyLong_Check(x))) +#endif + return __Pyx_NewRef(x); +#if CYTHON_USE_TYPE_SLOTS + m = Py_TYPE(x)->tp_as_number; + #if PY_MAJOR_VERSION < 3 + if (m && m->nb_int) { + name = "int"; + res = m->nb_int(x); + } + else if (m && m->nb_long) { + name = "long"; + res = m->nb_long(x); + } + #else + if (likely(m && m->nb_int)) { + name = "int"; + res = m->nb_int(x); + } + #endif +#else + if (!PyBytes_CheckExact(x) && !PyUnicode_CheckExact(x)) { + res = PyNumber_Int(x); + } +#endif + if (likely(res)) { +#if PY_MAJOR_VERSION < 3 + if (unlikely(!PyInt_Check(res) && !PyLong_Check(res))) { +#else + if (unlikely(!PyLong_CheckExact(res))) { +#endif + return __Pyx_PyNumber_IntOrLongWrongResultType(res, name); + } + } + else if (!PyErr_Occurred()) { + PyErr_SetString(PyExc_TypeError, + "an integer is required"); + } + return res; +} +static CYTHON_INLINE Py_ssize_t __Pyx_PyIndex_AsSsize_t(PyObject* b) { + Py_ssize_t ival; + PyObject *x; +#if PY_MAJOR_VERSION < 3 + if (likely(PyInt_CheckExact(b))) { + if (sizeof(Py_ssize_t) >= sizeof(long)) + return PyInt_AS_LONG(b); + else + return PyInt_AsSsize_t(b); + } +#endif + if (likely(PyLong_CheckExact(b))) { + #if CYTHON_USE_PYLONG_INTERNALS + const digit* digits = ((PyLongObject*)b)->ob_digit; + const Py_ssize_t size = Py_SIZE(b); + if (likely(__Pyx_sst_abs(size) <= 1)) { + ival = likely(size) ? digits[0] : 0; + if (size == -1) ival = -ival; + return ival; + } else { + switch (size) { + case 2: + if (8 * sizeof(Py_ssize_t) > 2 * PyLong_SHIFT) { + return (Py_ssize_t) (((((size_t)digits[1]) << PyLong_SHIFT) | (size_t)digits[0])); + } + break; + case -2: + if (8 * sizeof(Py_ssize_t) > 2 * PyLong_SHIFT) { + return -(Py_ssize_t) (((((size_t)digits[1]) << PyLong_SHIFT) | (size_t)digits[0])); + } + break; + case 3: + if (8 * sizeof(Py_ssize_t) > 3 * PyLong_SHIFT) { + return (Py_ssize_t) (((((((size_t)digits[2]) << PyLong_SHIFT) | (size_t)digits[1]) << PyLong_SHIFT) | (size_t)digits[0])); + } + break; + case -3: + if (8 * sizeof(Py_ssize_t) > 3 * PyLong_SHIFT) { + return -(Py_ssize_t) (((((((size_t)digits[2]) << PyLong_SHIFT) | (size_t)digits[1]) << PyLong_SHIFT) | (size_t)digits[0])); + } + break; + case 4: + if (8 * sizeof(Py_ssize_t) > 4 * PyLong_SHIFT) { + return (Py_ssize_t) (((((((((size_t)digits[3]) << PyLong_SHIFT) | (size_t)digits[2]) << PyLong_SHIFT) | (size_t)digits[1]) << PyLong_SHIFT) | (size_t)digits[0])); + } + break; + case -4: + if (8 * sizeof(Py_ssize_t) > 4 * PyLong_SHIFT) { + return -(Py_ssize_t) (((((((((size_t)digits[3]) << PyLong_SHIFT) | (size_t)digits[2]) << PyLong_SHIFT) | (size_t)digits[1]) << PyLong_SHIFT) | (size_t)digits[0])); + } + break; + } + } + #endif + return PyLong_AsSsize_t(b); + } + x = PyNumber_Index(b); + if (!x) return -1; + ival = PyInt_AsSsize_t(x); + Py_DECREF(x); + return ival; +} +static CYTHON_INLINE PyObject * __Pyx_PyBool_FromLong(long b) { + return b ? __Pyx_NewRef(Py_True) : __Pyx_NewRef(Py_False); +} +static CYTHON_INLINE PyObject * __Pyx_PyInt_FromSize_t(size_t ival) { + return PyInt_FromSize_t(ival); +} + + +#endif /* Py_PYTHON_H */ diff --git a/sbsheriff/Lib/site-packages/aiohttp/_http_parser.cp310-win_amd64.pyd b/sbsheriff/Lib/site-packages/aiohttp/_http_parser.cp310-win_amd64.pyd new file mode 100644 index 0000000000000000000000000000000000000000..ce8a639c62fba9dde81e77c3ba929297a4ff0c7b GIT binary patch literal 242688 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 i).decode('ascii')) + + +cdef inline str http_method_str(int i): + if i < METHODS_COUNT: + return _http_method[i] + else: + return "" + +cdef inline object find_header(bytes raw_header): + cdef Py_ssize_t size + cdef char *buf + cdef int idx + PyBytes_AsStringAndSize(raw_header, &buf, &size) + idx = _find_header.find_header(buf, size) + if idx == -1: + return raw_header.decode('utf-8', 'surrogateescape') + return headers[idx] + + +@cython.freelist(DEFAULT_FREELIST_SIZE) +cdef class RawRequestMessage: + cdef readonly str method + cdef readonly str path + cdef readonly object version # HttpVersion + cdef readonly object headers # CIMultiDict + cdef readonly object raw_headers # tuple + cdef readonly object should_close + cdef readonly object compression + cdef readonly object upgrade + cdef readonly object chunked + cdef readonly object url # yarl.URL + + def __init__(self, method, path, version, headers, raw_headers, + should_close, compression, upgrade, chunked, url): + self.method = method + self.path = path + self.version = version + self.headers = headers + self.raw_headers = raw_headers + self.should_close = should_close + self.compression = compression + self.upgrade = upgrade + self.chunked = chunked + self.url = url + + def __repr__(self): + info = [] + info.append(("method", self.method)) + info.append(("path", self.path)) + info.append(("version", self.version)) + info.append(("headers", self.headers)) + info.append(("raw_headers", self.raw_headers)) + info.append(("should_close", self.should_close)) + info.append(("compression", self.compression)) + info.append(("upgrade", self.upgrade)) + info.append(("chunked", self.chunked)) + info.append(("url", self.url)) + sinfo = ', '.join(name + '=' + repr(val) for name, val in info) + return '' + + def _replace(self, **dct): + cdef RawRequestMessage ret + ret = _new_request_message(self.method, + self.path, + self.version, + self.headers, + self.raw_headers, + self.should_close, + self.compression, + self.upgrade, + self.chunked, + self.url) + if "method" in dct: + ret.method = dct["method"] + if "path" in dct: + ret.path = dct["path"] + if "version" in dct: + ret.version = dct["version"] + if "headers" in dct: + ret.headers = dct["headers"] + if "raw_headers" in dct: + ret.raw_headers = dct["raw_headers"] + if "should_close" in dct: + ret.should_close = dct["should_close"] + if "compression" in dct: + ret.compression = dct["compression"] + if "upgrade" in dct: + ret.upgrade = dct["upgrade"] + if "chunked" in dct: + ret.chunked = dct["chunked"] + if "url" in dct: + ret.url = dct["url"] + return ret + +cdef _new_request_message(str method, + str path, + object version, + object headers, + object raw_headers, + bint should_close, + object compression, + bint upgrade, + bint chunked, + object url): + cdef RawRequestMessage ret + ret = RawRequestMessage.__new__(RawRequestMessage) + ret.method = method + ret.path = path + ret.version = version + ret.headers = headers + ret.raw_headers = raw_headers + ret.should_close = should_close + ret.compression = compression + ret.upgrade = upgrade + ret.chunked = chunked + ret.url = url + return ret + + +@cython.freelist(DEFAULT_FREELIST_SIZE) +cdef class RawResponseMessage: + cdef readonly object version # HttpVersion + cdef readonly int code + cdef readonly str reason + cdef readonly object headers # CIMultiDict + cdef readonly object raw_headers # tuple + cdef readonly object should_close + cdef readonly object compression + cdef readonly object upgrade + cdef readonly object chunked + + def __init__(self, version, code, reason, headers, raw_headers, + should_close, compression, upgrade, chunked): + self.version = version + self.code = code + self.reason = reason + self.headers = headers + self.raw_headers = raw_headers + self.should_close = should_close + self.compression = compression + self.upgrade = upgrade + self.chunked = chunked + + def __repr__(self): + info = [] + info.append(("version", self.version)) + info.append(("code", self.code)) + info.append(("reason", self.reason)) + info.append(("headers", self.headers)) + info.append(("raw_headers", self.raw_headers)) + info.append(("should_close", self.should_close)) + info.append(("compression", self.compression)) + info.append(("upgrade", self.upgrade)) + info.append(("chunked", self.chunked)) + sinfo = ', '.join(name + '=' + repr(val) for name, val in info) + return '' + + +cdef _new_response_message(object version, + int code, + str reason, + object headers, + object raw_headers, + bint should_close, + object compression, + bint upgrade, + bint chunked): + cdef RawResponseMessage ret + ret = RawResponseMessage.__new__(RawResponseMessage) + ret.version = version + ret.code = code + ret.reason = reason + ret.headers = headers + ret.raw_headers = raw_headers + ret.should_close = should_close + ret.compression = compression + ret.upgrade = upgrade + ret.chunked = chunked + return ret + + +@cython.internal +cdef class HttpParser: + + cdef: + cparser.llhttp_t* _cparser + cparser.llhttp_settings_t* _csettings + + bytearray _raw_name + bytearray _raw_value + bint _has_value + + object _protocol + object _loop + object _timer + + size_t _max_line_size + size_t _max_field_size + size_t _max_headers + bint _response_with_body + bint _read_until_eof + + bint _started + object _url + bytearray _buf + str _path + str _reason + object _headers + list _raw_headers + bint _upgraded + list _messages + object _payload + bint _payload_error + object _payload_exception + object _last_error + bint _auto_decompress + int _limit + + str _content_encoding + + Py_buffer py_buf + + def __cinit__(self): + self._cparser = \ + PyMem_Malloc(sizeof(cparser.llhttp_t)) + if self._cparser is NULL: + raise MemoryError() + + self._csettings = \ + PyMem_Malloc(sizeof(cparser.llhttp_settings_t)) + if self._csettings is NULL: + raise MemoryError() + + def __dealloc__(self): + PyMem_Free(self._cparser) + PyMem_Free(self._csettings) + + cdef _init( + self, cparser.llhttp_type mode, + object protocol, object loop, int limit, + object timer=None, + size_t max_line_size=8190, size_t max_headers=32768, + size_t max_field_size=8190, payload_exception=None, + bint response_with_body=True, bint read_until_eof=False, + bint auto_decompress=True, + ): + cparser.llhttp_settings_init(self._csettings) + cparser.llhttp_init(self._cparser, mode, self._csettings) + self._cparser.data = self + self._cparser.content_length = 0 + + self._protocol = protocol + self._loop = loop + self._timer = timer + + self._buf = bytearray() + self._payload = None + self._payload_error = 0 + self._payload_exception = payload_exception + self._messages = [] + + self._raw_name = bytearray() + self._raw_value = bytearray() + self._has_value = False + + self._max_line_size = max_line_size + self._max_headers = max_headers + self._max_field_size = max_field_size + self._response_with_body = response_with_body + self._read_until_eof = read_until_eof + self._upgraded = False + self._auto_decompress = auto_decompress + self._content_encoding = None + + self._csettings.on_url = cb_on_url + self._csettings.on_status = cb_on_status + self._csettings.on_header_field = cb_on_header_field + self._csettings.on_header_value = cb_on_header_value + self._csettings.on_headers_complete = cb_on_headers_complete + self._csettings.on_body = cb_on_body + self._csettings.on_message_begin = cb_on_message_begin + self._csettings.on_message_complete = cb_on_message_complete + self._csettings.on_chunk_header = cb_on_chunk_header + self._csettings.on_chunk_complete = cb_on_chunk_complete + + self._last_error = None + self._limit = limit + + cdef _process_header(self): + if self._raw_name: + raw_name = bytes(self._raw_name) + raw_value = bytes(self._raw_value) + + name = find_header(raw_name) + value = raw_value.decode('utf-8', 'surrogateescape') + + self._headers.add(name, value) + + if name is CONTENT_ENCODING: + self._content_encoding = value + + PyByteArray_Resize(self._raw_name, 0) + PyByteArray_Resize(self._raw_value, 0) + self._has_value = False + self._raw_headers.append((raw_name, raw_value)) + + cdef _on_header_field(self, char* at, size_t length): + cdef Py_ssize_t size + cdef char *buf + if self._has_value: + self._process_header() + + size = PyByteArray_Size(self._raw_name) + PyByteArray_Resize(self._raw_name, size + length) + buf = PyByteArray_AsString(self._raw_name) + memcpy(buf + size, at, length) + + cdef _on_header_value(self, char* at, size_t length): + cdef Py_ssize_t size + cdef char *buf + + size = PyByteArray_Size(self._raw_value) + PyByteArray_Resize(self._raw_value, size + length) + buf = PyByteArray_AsString(self._raw_value) + memcpy(buf + size, at, length) + self._has_value = True + + cdef _on_headers_complete(self): + self._process_header() + + method = http_method_str(self._cparser.method) + should_close = not cparser.llhttp_should_keep_alive(self._cparser) + upgrade = self._cparser.upgrade + chunked = self._cparser.flags & cparser.F_CHUNKED + + raw_headers = tuple(self._raw_headers) + headers = CIMultiDictProxy(self._headers) + + if upgrade or self._cparser.method == 5: # cparser.CONNECT: + self._upgraded = True + + # do not support old websocket spec + if SEC_WEBSOCKET_KEY1 in headers: + raise InvalidHeader(SEC_WEBSOCKET_KEY1) + + encoding = None + enc = self._content_encoding + if enc is not None: + self._content_encoding = None + enc = enc.lower() + if enc in ('gzip', 'deflate', 'br'): + encoding = enc + + if self._cparser.type == cparser.HTTP_REQUEST: + msg = _new_request_message( + method, self._path, + self.http_version(), headers, raw_headers, + should_close, encoding, upgrade, chunked, self._url) + else: + msg = _new_response_message( + self.http_version(), self._cparser.status_code, self._reason, + headers, raw_headers, should_close, encoding, + upgrade, chunked) + + if ( + ULLONG_MAX > self._cparser.content_length > 0 or chunked or + self._cparser.method == 5 or # CONNECT: 5 + (self._cparser.status_code >= 199 and + self._cparser.content_length == 0 and + self._read_until_eof) + ): + payload = StreamReader( + self._protocol, timer=self._timer, loop=self._loop, + limit=self._limit) + else: + payload = EMPTY_PAYLOAD + + self._payload = payload + if encoding is not None and self._auto_decompress: + self._payload = DeflateBuffer(payload, encoding) + + if not self._response_with_body: + payload = EMPTY_PAYLOAD + + self._messages.append((msg, payload)) + + cdef _on_message_complete(self): + self._payload.feed_eof() + self._payload = None + + cdef _on_chunk_header(self): + self._payload.begin_http_chunk_receiving() + + cdef _on_chunk_complete(self): + self._payload.end_http_chunk_receiving() + + cdef object _on_status_complete(self): + pass + + cdef inline http_version(self): + cdef cparser.llhttp_t* parser = self._cparser + + if parser.http_major == 1: + if parser.http_minor == 0: + return HttpVersion10 + elif parser.http_minor == 1: + return HttpVersion11 + + return HttpVersion(parser.http_major, parser.http_minor) + + ### Public API ### + + def feed_eof(self): + cdef bytes desc + + if self._payload is not None: + if self._cparser.flags & cparser.F_CHUNKED: + raise TransferEncodingError( + "Not enough data for satisfy transfer length header.") + elif self._cparser.flags & cparser.F_CONTENT_LENGTH: + raise ContentLengthError( + "Not enough data for satisfy content length header.") + elif cparser.llhttp_get_errno(self._cparser) != cparser.HPE_OK: + desc = cparser.llhttp_get_error_reason(self._cparser) + raise PayloadEncodingError(desc.decode('latin-1')) + else: + self._payload.feed_eof() + elif self._started: + self._on_headers_complete() + if self._messages: + return self._messages[-1][0] + + def feed_data(self, data): + cdef: + size_t data_len + size_t nb + cdef cparser.llhttp_errno_t errno + + PyObject_GetBuffer(data, &self.py_buf, PyBUF_SIMPLE) + data_len = self.py_buf.len + + errno = cparser.llhttp_execute( + self._cparser, + self.py_buf.buf, + data_len) + + if errno is cparser.HPE_PAUSED_UPGRADE: + cparser.llhttp_resume_after_upgrade(self._cparser) + + nb = cparser.llhttp_get_error_pos(self._cparser) - self.py_buf.buf + + PyBuffer_Release(&self.py_buf) + + if errno not in (cparser.HPE_OK, cparser.HPE_PAUSED_UPGRADE): + if self._payload_error == 0: + if self._last_error is not None: + ex = self._last_error + self._last_error = None + else: + ex = parser_error_from_errno(self._cparser) + self._payload = None + raise ex + + if self._messages: + messages = self._messages + self._messages = [] + else: + messages = () + + if self._upgraded: + return messages, True, data[nb:] + else: + return messages, False, b'' + + def set_upgraded(self, val): + self._upgraded = val + + +cdef class HttpRequestParser(HttpParser): + + def __init__( + self, protocol, loop, int limit, timer=None, + size_t max_line_size=8190, size_t max_headers=32768, + size_t max_field_size=8190, payload_exception=None, + bint response_with_body=True, bint read_until_eof=False, + bint auto_decompress=True, + ): + self._init(cparser.HTTP_REQUEST, protocol, loop, limit, timer, + max_line_size, max_headers, max_field_size, + payload_exception, response_with_body, read_until_eof, + auto_decompress) + + cdef object _on_status_complete(self): + cdef int idx1, idx2 + if not self._buf: + return + self._path = self._buf.decode('utf-8', 'surrogateescape') + try: + idx3 = len(self._path) + idx1 = self._path.find("?") + if idx1 == -1: + query = "" + idx2 = self._path.find("#") + if idx2 == -1: + path = self._path + fragment = "" + else: + path = self._path[0: idx2] + fragment = self._path[idx2+1:] + + else: + path = self._path[0:idx1] + idx1 += 1 + idx2 = self._path.find("#", idx1+1) + if idx2 == -1: + query = self._path[idx1:] + fragment = "" + else: + query = self._path[idx1: idx2] + fragment = self._path[idx2+1:] + + self._url = URL.build( + path=path, + query_string=query, + fragment=fragment, + encoded=True, + ) + finally: + PyByteArray_Resize(self._buf, 0) + + +cdef class HttpResponseParser(HttpParser): + + def __init__( + self, protocol, loop, int limit, timer=None, + size_t max_line_size=8190, size_t max_headers=32768, + size_t max_field_size=8190, payload_exception=None, + bint response_with_body=True, bint read_until_eof=False, + bint auto_decompress=True + ): + self._init(cparser.HTTP_RESPONSE, protocol, loop, limit, timer, + max_line_size, max_headers, max_field_size, + payload_exception, response_with_body, read_until_eof, + auto_decompress) + + cdef object _on_status_complete(self): + if self._buf: + self._reason = self._buf.decode('utf-8', 'surrogateescape') + PyByteArray_Resize(self._buf, 0) + else: + self._reason = self._reason or '' + +cdef int cb_on_message_begin(cparser.llhttp_t* parser) except -1: + cdef HttpParser pyparser = parser.data + + pyparser._started = True + pyparser._headers = CIMultiDict() + pyparser._raw_headers = [] + PyByteArray_Resize(pyparser._buf, 0) + pyparser._path = None + pyparser._reason = None + return 0 + + +cdef int cb_on_url(cparser.llhttp_t* parser, + const char *at, size_t length) except -1: + cdef HttpParser pyparser = parser.data + try: + if length > pyparser._max_line_size: + raise LineTooLong( + 'Status line is too long', pyparser._max_line_size, length) + extend(pyparser._buf, at, length) + except BaseException as ex: + pyparser._last_error = ex + return -1 + else: + return 0 + + +cdef int cb_on_status(cparser.llhttp_t* parser, + const char *at, size_t length) except -1: + cdef HttpParser pyparser = parser.data + cdef str reason + try: + if length > pyparser._max_line_size: + raise LineTooLong( + 'Status line is too long', pyparser._max_line_size, length) + extend(pyparser._buf, at, length) + except BaseException as ex: + pyparser._last_error = ex + return -1 + else: + return 0 + + +cdef int cb_on_header_field(cparser.llhttp_t* parser, + const char *at, size_t length) except -1: + cdef HttpParser pyparser = parser.data + cdef Py_ssize_t size + try: + pyparser._on_status_complete() + size = len(pyparser._raw_name) + length + if size > pyparser._max_field_size: + raise LineTooLong( + 'Header name is too long', pyparser._max_field_size, size) + pyparser._on_header_field(at, length) + except BaseException as ex: + pyparser._last_error = ex + return -1 + else: + return 0 + + +cdef int cb_on_header_value(cparser.llhttp_t* parser, + const char *at, size_t length) except -1: + cdef HttpParser pyparser = parser.data + cdef Py_ssize_t size + try: + size = len(pyparser._raw_value) + length + if size > pyparser._max_field_size: + raise LineTooLong( + 'Header value is too long', pyparser._max_field_size, size) + pyparser._on_header_value(at, length) + except BaseException as ex: + pyparser._last_error = ex + return -1 + else: + return 0 + + +cdef int cb_on_headers_complete(cparser.llhttp_t* parser) except -1: + cdef HttpParser pyparser = parser.data + try: + pyparser._on_status_complete() + pyparser._on_headers_complete() + except BaseException as exc: + pyparser._last_error = exc + return -1 + else: + if pyparser._cparser.upgrade or pyparser._cparser.method == 5: # CONNECT + return 2 + else: + return 0 + + +cdef int cb_on_body(cparser.llhttp_t* parser, + const char *at, size_t length) except -1: + cdef HttpParser pyparser = parser.data + cdef bytes body = at[:length] + try: + pyparser._payload.feed_data(body, length) + except BaseException as exc: + if pyparser._payload_exception is not None: + pyparser._payload.set_exception(pyparser._payload_exception(str(exc))) + else: + pyparser._payload.set_exception(exc) + pyparser._payload_error = 1 + return -1 + else: + return 0 + + +cdef int cb_on_message_complete(cparser.llhttp_t* parser) except -1: + cdef HttpParser pyparser = parser.data + try: + pyparser._started = False + pyparser._on_message_complete() + except BaseException as exc: + pyparser._last_error = exc + return -1 + else: + return 0 + + +cdef int cb_on_chunk_header(cparser.llhttp_t* parser) except -1: + cdef HttpParser pyparser = parser.data + try: + pyparser._on_chunk_header() + except BaseException as exc: + pyparser._last_error = exc + return -1 + else: + return 0 + + +cdef int cb_on_chunk_complete(cparser.llhttp_t* parser) except -1: + cdef HttpParser pyparser = parser.data + try: + pyparser._on_chunk_complete() + except BaseException as exc: + pyparser._last_error = exc + return -1 + else: + return 0 + + +cdef parser_error_from_errno(cparser.llhttp_t* parser): + cdef cparser.llhttp_errno_t errno = cparser.llhttp_get_errno(parser) + cdef bytes desc = cparser.llhttp_get_error_reason(parser) + + if errno in (cparser.HPE_CB_MESSAGE_BEGIN, + cparser.HPE_CB_HEADERS_COMPLETE, + cparser.HPE_CB_MESSAGE_COMPLETE, + cparser.HPE_CB_CHUNK_HEADER, + cparser.HPE_CB_CHUNK_COMPLETE, + cparser.HPE_INVALID_CONSTANT, + cparser.HPE_INVALID_HEADER_TOKEN, + cparser.HPE_INVALID_CONTENT_LENGTH, + cparser.HPE_INVALID_CHUNK_SIZE, + cparser.HPE_INVALID_EOF_STATE, + cparser.HPE_INVALID_TRANSFER_ENCODING): + cls = BadHttpMessage + + elif errno == cparser.HPE_INVALID_STATUS: + cls = BadStatusLine + + elif errno == cparser.HPE_INVALID_METHOD: + cls = BadStatusLine + + elif errno == cparser.HPE_INVALID_VERSION: + cls = BadStatusLine + + elif errno == cparser.HPE_INVALID_URL: + cls = InvalidURLError + + else: + cls = BadHttpMessage + + return cls(desc.decode('latin-1')) diff --git a/sbsheriff/Lib/site-packages/aiohttp/_http_writer.c b/sbsheriff/Lib/site-packages/aiohttp/_http_writer.c new file mode 100644 index 0000000..07fd03e --- /dev/null +++ b/sbsheriff/Lib/site-packages/aiohttp/_http_writer.c @@ -0,0 +1,6047 @@ +/* Generated by Cython 0.29.24 */ + +#ifndef PY_SSIZE_T_CLEAN +#define PY_SSIZE_T_CLEAN +#endif /* PY_SSIZE_T_CLEAN */ +#include "Python.h" +#ifndef Py_PYTHON_H + #error Python headers needed to compile C extensions, please install development version of Python. +#elif PY_VERSION_HEX < 0x02060000 || (0x03000000 <= PY_VERSION_HEX && PY_VERSION_HEX < 0x03030000) + #error Cython requires Python 2.6+ or Python 3.3+. +#else +#define CYTHON_ABI "0_29_24" +#define CYTHON_HEX_VERSION 0x001D18F0 +#define CYTHON_FUTURE_DIVISION 1 +#include +#ifndef offsetof + #define offsetof(type, member) ( (size_t) & ((type*)0) -> member ) +#endif +#if !defined(WIN32) && !defined(MS_WINDOWS) + #ifndef __stdcall + #define __stdcall + #endif + #ifndef __cdecl + #define __cdecl + #endif + #ifndef __fastcall + #define __fastcall + #endif +#endif +#ifndef DL_IMPORT + #define DL_IMPORT(t) t +#endif +#ifndef DL_EXPORT + #define DL_EXPORT(t) t +#endif +#define __PYX_COMMA , +#ifndef HAVE_LONG_LONG + #if PY_VERSION_HEX >= 0x02070000 + #define HAVE_LONG_LONG + #endif +#endif +#ifndef PY_LONG_LONG + #define PY_LONG_LONG LONG_LONG +#endif +#ifndef Py_HUGE_VAL + #define Py_HUGE_VAL HUGE_VAL +#endif +#ifdef PYPY_VERSION + #define CYTHON_COMPILING_IN_PYPY 1 + #define CYTHON_COMPILING_IN_PYSTON 0 + #define CYTHON_COMPILING_IN_CPYTHON 0 + #undef CYTHON_USE_TYPE_SLOTS + #define CYTHON_USE_TYPE_SLOTS 0 + #undef CYTHON_USE_PYTYPE_LOOKUP + #define CYTHON_USE_PYTYPE_LOOKUP 0 + #if PY_VERSION_HEX < 0x03050000 + #undef CYTHON_USE_ASYNC_SLOTS + #define CYTHON_USE_ASYNC_SLOTS 0 + #elif !defined(CYTHON_USE_ASYNC_SLOTS) + #define CYTHON_USE_ASYNC_SLOTS 1 + #endif + #undef CYTHON_USE_PYLIST_INTERNALS + #define CYTHON_USE_PYLIST_INTERNALS 0 + #undef CYTHON_USE_UNICODE_INTERNALS + #define CYTHON_USE_UNICODE_INTERNALS 0 + #undef CYTHON_USE_UNICODE_WRITER + #define CYTHON_USE_UNICODE_WRITER 0 + #undef CYTHON_USE_PYLONG_INTERNALS + #define CYTHON_USE_PYLONG_INTERNALS 0 + #undef CYTHON_AVOID_BORROWED_REFS + #define CYTHON_AVOID_BORROWED_REFS 1 + #undef CYTHON_ASSUME_SAFE_MACROS + #define CYTHON_ASSUME_SAFE_MACROS 0 + #undef CYTHON_UNPACK_METHODS + #define CYTHON_UNPACK_METHODS 0 + #undef CYTHON_FAST_THREAD_STATE + #define CYTHON_FAST_THREAD_STATE 0 + #undef CYTHON_FAST_PYCALL + #define CYTHON_FAST_PYCALL 0 + #undef CYTHON_PEP489_MULTI_PHASE_INIT + #define CYTHON_PEP489_MULTI_PHASE_INIT 0 + #undef CYTHON_USE_TP_FINALIZE + #define CYTHON_USE_TP_FINALIZE 0 + #undef CYTHON_USE_DICT_VERSIONS + #define CYTHON_USE_DICT_VERSIONS 0 + #undef CYTHON_USE_EXC_INFO_STACK + #define CYTHON_USE_EXC_INFO_STACK 0 +#elif defined(PYSTON_VERSION) + #define CYTHON_COMPILING_IN_PYPY 0 + #define CYTHON_COMPILING_IN_PYSTON 1 + #define CYTHON_COMPILING_IN_CPYTHON 0 + #ifndef CYTHON_USE_TYPE_SLOTS + #define CYTHON_USE_TYPE_SLOTS 1 + #endif + #undef CYTHON_USE_PYTYPE_LOOKUP + #define CYTHON_USE_PYTYPE_LOOKUP 0 + #undef CYTHON_USE_ASYNC_SLOTS + #define CYTHON_USE_ASYNC_SLOTS 0 + #undef CYTHON_USE_PYLIST_INTERNALS + #define CYTHON_USE_PYLIST_INTERNALS 0 + #ifndef CYTHON_USE_UNICODE_INTERNALS + #define CYTHON_USE_UNICODE_INTERNALS 1 + #endif + #undef CYTHON_USE_UNICODE_WRITER + #define CYTHON_USE_UNICODE_WRITER 0 + #undef CYTHON_USE_PYLONG_INTERNALS + #define CYTHON_USE_PYLONG_INTERNALS 0 + #ifndef CYTHON_AVOID_BORROWED_REFS + #define CYTHON_AVOID_BORROWED_REFS 0 + #endif + #ifndef CYTHON_ASSUME_SAFE_MACROS + #define CYTHON_ASSUME_SAFE_MACROS 1 + #endif + #ifndef CYTHON_UNPACK_METHODS + #define CYTHON_UNPACK_METHODS 1 + #endif + #undef CYTHON_FAST_THREAD_STATE + #define CYTHON_FAST_THREAD_STATE 0 + #undef CYTHON_FAST_PYCALL + #define CYTHON_FAST_PYCALL 0 + #undef CYTHON_PEP489_MULTI_PHASE_INIT + #define CYTHON_PEP489_MULTI_PHASE_INIT 0 + #undef CYTHON_USE_TP_FINALIZE + #define CYTHON_USE_TP_FINALIZE 0 + #undef CYTHON_USE_DICT_VERSIONS + #define CYTHON_USE_DICT_VERSIONS 0 + #undef CYTHON_USE_EXC_INFO_STACK + #define CYTHON_USE_EXC_INFO_STACK 0 +#else + #define CYTHON_COMPILING_IN_PYPY 0 + #define CYTHON_COMPILING_IN_PYSTON 0 + #define CYTHON_COMPILING_IN_CPYTHON 1 + #ifndef CYTHON_USE_TYPE_SLOTS + #define CYTHON_USE_TYPE_SLOTS 1 + #endif + #if PY_VERSION_HEX < 0x02070000 + #undef CYTHON_USE_PYTYPE_LOOKUP + #define CYTHON_USE_PYTYPE_LOOKUP 0 + #elif !defined(CYTHON_USE_PYTYPE_LOOKUP) + #define CYTHON_USE_PYTYPE_LOOKUP 1 + #endif + #if PY_MAJOR_VERSION < 3 + #undef CYTHON_USE_ASYNC_SLOTS + #define CYTHON_USE_ASYNC_SLOTS 0 + #elif !defined(CYTHON_USE_ASYNC_SLOTS) + #define CYTHON_USE_ASYNC_SLOTS 1 + #endif + #if PY_VERSION_HEX < 0x02070000 + #undef CYTHON_USE_PYLONG_INTERNALS + #define CYTHON_USE_PYLONG_INTERNALS 0 + #elif !defined(CYTHON_USE_PYLONG_INTERNALS) + #define CYTHON_USE_PYLONG_INTERNALS 1 + #endif + #ifndef CYTHON_USE_PYLIST_INTERNALS + #define CYTHON_USE_PYLIST_INTERNALS 1 + #endif + #ifndef CYTHON_USE_UNICODE_INTERNALS + #define CYTHON_USE_UNICODE_INTERNALS 1 + #endif + #if PY_VERSION_HEX < 0x030300F0 + #undef CYTHON_USE_UNICODE_WRITER + #define CYTHON_USE_UNICODE_WRITER 0 + #elif !defined(CYTHON_USE_UNICODE_WRITER) + #define CYTHON_USE_UNICODE_WRITER 1 + #endif + #ifndef CYTHON_AVOID_BORROWED_REFS + #define CYTHON_AVOID_BORROWED_REFS 0 + #endif + #ifndef CYTHON_ASSUME_SAFE_MACROS + #define CYTHON_ASSUME_SAFE_MACROS 1 + #endif + #ifndef CYTHON_UNPACK_METHODS + #define CYTHON_UNPACK_METHODS 1 + #endif + #ifndef CYTHON_FAST_THREAD_STATE + #define CYTHON_FAST_THREAD_STATE 1 + #endif + #ifndef CYTHON_FAST_PYCALL + #define CYTHON_FAST_PYCALL 1 + #endif + #ifndef CYTHON_PEP489_MULTI_PHASE_INIT + #define CYTHON_PEP489_MULTI_PHASE_INIT (PY_VERSION_HEX >= 0x03050000) + #endif + #ifndef CYTHON_USE_TP_FINALIZE + #define CYTHON_USE_TP_FINALIZE (PY_VERSION_HEX >= 0x030400a1) + #endif + #ifndef CYTHON_USE_DICT_VERSIONS + #define CYTHON_USE_DICT_VERSIONS (PY_VERSION_HEX >= 0x030600B1) + #endif + #ifndef CYTHON_USE_EXC_INFO_STACK + #define CYTHON_USE_EXC_INFO_STACK (PY_VERSION_HEX >= 0x030700A3) + #endif +#endif +#if !defined(CYTHON_FAST_PYCCALL) +#define CYTHON_FAST_PYCCALL (CYTHON_FAST_PYCALL && PY_VERSION_HEX >= 0x030600B1) +#endif +#if CYTHON_USE_PYLONG_INTERNALS + #include "longintrepr.h" + #undef SHIFT + #undef BASE + #undef MASK + #ifdef SIZEOF_VOID_P + enum { __pyx_check_sizeof_voidp = 1 / (int)(SIZEOF_VOID_P == sizeof(void*)) }; + #endif +#endif +#ifndef __has_attribute + #define __has_attribute(x) 0 +#endif +#ifndef __has_cpp_attribute + #define __has_cpp_attribute(x) 0 +#endif +#ifndef CYTHON_RESTRICT + #if defined(__GNUC__) + #define CYTHON_RESTRICT __restrict__ + #elif defined(_MSC_VER) && _MSC_VER >= 1400 + #define CYTHON_RESTRICT __restrict + #elif defined (__STDC_VERSION__) && __STDC_VERSION__ >= 199901L + #define CYTHON_RESTRICT restrict + #else + #define CYTHON_RESTRICT + #endif +#endif +#ifndef CYTHON_UNUSED +# if defined(__GNUC__) +# if !(defined(__cplusplus)) || (__GNUC__ > 3 || (__GNUC__ == 3 && __GNUC_MINOR__ >= 4)) +# define CYTHON_UNUSED __attribute__ ((__unused__)) +# else +# define CYTHON_UNUSED +# endif +# elif defined(__ICC) || (defined(__INTEL_COMPILER) && !defined(_MSC_VER)) +# define CYTHON_UNUSED __attribute__ ((__unused__)) +# else +# define CYTHON_UNUSED +# endif +#endif +#ifndef CYTHON_MAYBE_UNUSED_VAR +# if defined(__cplusplus) + template void CYTHON_MAYBE_UNUSED_VAR( const T& ) { } +# else +# define CYTHON_MAYBE_UNUSED_VAR(x) (void)(x) +# endif +#endif +#ifndef CYTHON_NCP_UNUSED +# if CYTHON_COMPILING_IN_CPYTHON +# define CYTHON_NCP_UNUSED +# else +# define CYTHON_NCP_UNUSED CYTHON_UNUSED +# endif +#endif +#define __Pyx_void_to_None(void_result) ((void)(void_result), Py_INCREF(Py_None), Py_None) +#ifdef _MSC_VER + #ifndef _MSC_STDINT_H_ + #if _MSC_VER < 1300 + typedef unsigned char uint8_t; + typedef unsigned int uint32_t; + #else + typedef unsigned __int8 uint8_t; + typedef unsigned __int32 uint32_t; + #endif + #endif +#else + #include +#endif +#ifndef CYTHON_FALLTHROUGH + #if defined(__cplusplus) && __cplusplus >= 201103L + #if __has_cpp_attribute(fallthrough) + #define CYTHON_FALLTHROUGH [[fallthrough]] + #elif __has_cpp_attribute(clang::fallthrough) + #define CYTHON_FALLTHROUGH [[clang::fallthrough]] + #elif __has_cpp_attribute(gnu::fallthrough) + #define CYTHON_FALLTHROUGH [[gnu::fallthrough]] + #endif + #endif + #ifndef CYTHON_FALLTHROUGH + #if __has_attribute(fallthrough) + #define CYTHON_FALLTHROUGH __attribute__((fallthrough)) + #else + #define CYTHON_FALLTHROUGH + #endif + #endif + #if defined(__clang__ ) && defined(__apple_build_version__) + #if __apple_build_version__ < 7000000 + #undef CYTHON_FALLTHROUGH + #define CYTHON_FALLTHROUGH + #endif + #endif +#endif + +#ifndef CYTHON_INLINE + #if defined(__clang__) + #define CYTHON_INLINE __inline__ __attribute__ ((__unused__)) + #elif defined(__GNUC__) + #define CYTHON_INLINE __inline__ + #elif defined(_MSC_VER) + #define CYTHON_INLINE __inline + #elif defined (__STDC_VERSION__) && __STDC_VERSION__ >= 199901L + #define CYTHON_INLINE inline + #else + #define CYTHON_INLINE + #endif +#endif + +#if CYTHON_COMPILING_IN_PYPY && PY_VERSION_HEX < 0x02070600 && !defined(Py_OptimizeFlag) + #define Py_OptimizeFlag 0 +#endif +#define __PYX_BUILD_PY_SSIZE_T "n" +#define CYTHON_FORMAT_SSIZE_T "z" +#if PY_MAJOR_VERSION < 3 + #define __Pyx_BUILTIN_MODULE_NAME "__builtin__" + #define __Pyx_PyCode_New(a, k, l, s, f, code, c, n, v, fv, cell, fn, name, fline, lnos)\ + PyCode_New(a+k, l, s, f, code, c, n, v, fv, cell, fn, name, fline, lnos) + #define __Pyx_DefaultClassType PyClass_Type +#else + #define __Pyx_BUILTIN_MODULE_NAME "builtins" +#if PY_VERSION_HEX >= 0x030800A4 && PY_VERSION_HEX < 0x030800B2 + #define __Pyx_PyCode_New(a, k, l, s, f, code, c, n, v, fv, cell, fn, name, fline, lnos)\ + PyCode_New(a, 0, k, l, s, f, code, c, n, v, fv, cell, fn, name, fline, lnos) +#else + #define __Pyx_PyCode_New(a, k, l, s, f, code, c, n, v, fv, cell, fn, name, fline, lnos)\ + PyCode_New(a, k, l, s, f, code, c, n, v, fv, cell, fn, name, fline, lnos) +#endif + #define __Pyx_DefaultClassType PyType_Type +#endif +#ifndef Py_TPFLAGS_CHECKTYPES + #define Py_TPFLAGS_CHECKTYPES 0 +#endif +#ifndef Py_TPFLAGS_HAVE_INDEX + #define Py_TPFLAGS_HAVE_INDEX 0 +#endif +#ifndef Py_TPFLAGS_HAVE_NEWBUFFER + #define Py_TPFLAGS_HAVE_NEWBUFFER 0 +#endif +#ifndef Py_TPFLAGS_HAVE_FINALIZE + #define Py_TPFLAGS_HAVE_FINALIZE 0 +#endif +#ifndef METH_STACKLESS + #define METH_STACKLESS 0 +#endif +#if PY_VERSION_HEX <= 0x030700A3 || !defined(METH_FASTCALL) + #ifndef METH_FASTCALL + #define METH_FASTCALL 0x80 + #endif + typedef PyObject *(*__Pyx_PyCFunctionFast) (PyObject *self, PyObject *const *args, Py_ssize_t nargs); + typedef PyObject *(*__Pyx_PyCFunctionFastWithKeywords) (PyObject *self, PyObject *const *args, + Py_ssize_t nargs, PyObject *kwnames); +#else + #define __Pyx_PyCFunctionFast _PyCFunctionFast + #define __Pyx_PyCFunctionFastWithKeywords _PyCFunctionFastWithKeywords +#endif +#if CYTHON_FAST_PYCCALL +#define __Pyx_PyFastCFunction_Check(func)\ + ((PyCFunction_Check(func) && (METH_FASTCALL == (PyCFunction_GET_FLAGS(func) & ~(METH_CLASS | METH_STATIC | METH_COEXIST | METH_KEYWORDS | METH_STACKLESS))))) +#else +#define __Pyx_PyFastCFunction_Check(func) 0 +#endif +#if CYTHON_COMPILING_IN_PYPY && !defined(PyObject_Malloc) + #define PyObject_Malloc(s) PyMem_Malloc(s) + #define PyObject_Free(p) PyMem_Free(p) + #define PyObject_Realloc(p) PyMem_Realloc(p) +#endif +#if CYTHON_COMPILING_IN_CPYTHON && PY_VERSION_HEX < 0x030400A1 + #define PyMem_RawMalloc(n) PyMem_Malloc(n) + #define PyMem_RawRealloc(p, n) PyMem_Realloc(p, n) + #define PyMem_RawFree(p) PyMem_Free(p) +#endif +#if CYTHON_COMPILING_IN_PYSTON + #define __Pyx_PyCode_HasFreeVars(co) PyCode_HasFreeVars(co) + #define __Pyx_PyFrame_SetLineNumber(frame, lineno) PyFrame_SetLineNumber(frame, lineno) +#else + #define __Pyx_PyCode_HasFreeVars(co) (PyCode_GetNumFree(co) > 0) + #define __Pyx_PyFrame_SetLineNumber(frame, lineno) (frame)->f_lineno = (lineno) +#endif +#if !CYTHON_FAST_THREAD_STATE || PY_VERSION_HEX < 0x02070000 + #define __Pyx_PyThreadState_Current PyThreadState_GET() +#elif PY_VERSION_HEX >= 0x03060000 + #define __Pyx_PyThreadState_Current _PyThreadState_UncheckedGet() +#elif PY_VERSION_HEX >= 0x03000000 + #define __Pyx_PyThreadState_Current PyThreadState_GET() +#else + #define __Pyx_PyThreadState_Current _PyThreadState_Current +#endif +#if PY_VERSION_HEX < 0x030700A2 && !defined(PyThread_tss_create) && !defined(Py_tss_NEEDS_INIT) +#include "pythread.h" +#define Py_tss_NEEDS_INIT 0 +typedef int Py_tss_t; +static CYTHON_INLINE int PyThread_tss_create(Py_tss_t *key) { + *key = PyThread_create_key(); + return 0; +} +static CYTHON_INLINE Py_tss_t * PyThread_tss_alloc(void) { + Py_tss_t *key = (Py_tss_t *)PyObject_Malloc(sizeof(Py_tss_t)); + *key = Py_tss_NEEDS_INIT; + return key; +} +static CYTHON_INLINE void PyThread_tss_free(Py_tss_t *key) { + PyObject_Free(key); +} +static CYTHON_INLINE int PyThread_tss_is_created(Py_tss_t *key) { + return *key != Py_tss_NEEDS_INIT; +} +static CYTHON_INLINE void PyThread_tss_delete(Py_tss_t *key) { + PyThread_delete_key(*key); + *key = Py_tss_NEEDS_INIT; +} +static CYTHON_INLINE int PyThread_tss_set(Py_tss_t *key, void *value) { + return PyThread_set_key_value(*key, value); +} +static CYTHON_INLINE void * PyThread_tss_get(Py_tss_t *key) { + return PyThread_get_key_value(*key); +} +#endif +#if CYTHON_COMPILING_IN_CPYTHON || defined(_PyDict_NewPresized) +#define __Pyx_PyDict_NewPresized(n) ((n <= 8) ? PyDict_New() : _PyDict_NewPresized(n)) +#else +#define __Pyx_PyDict_NewPresized(n) PyDict_New() +#endif +#if PY_MAJOR_VERSION >= 3 || CYTHON_FUTURE_DIVISION + #define __Pyx_PyNumber_Divide(x,y) PyNumber_TrueDivide(x,y) + #define __Pyx_PyNumber_InPlaceDivide(x,y) PyNumber_InPlaceTrueDivide(x,y) +#else + #define __Pyx_PyNumber_Divide(x,y) PyNumber_Divide(x,y) + #define __Pyx_PyNumber_InPlaceDivide(x,y) PyNumber_InPlaceDivide(x,y) +#endif +#if CYTHON_COMPILING_IN_CPYTHON && PY_VERSION_HEX >= 0x030500A1 && CYTHON_USE_UNICODE_INTERNALS +#define __Pyx_PyDict_GetItemStr(dict, name) _PyDict_GetItem_KnownHash(dict, name, ((PyASCIIObject *) name)->hash) +#else +#define __Pyx_PyDict_GetItemStr(dict, name) PyDict_GetItem(dict, name) +#endif +#if PY_VERSION_HEX > 0x03030000 && defined(PyUnicode_KIND) + #define CYTHON_PEP393_ENABLED 1 + #if defined(PyUnicode_IS_READY) + #define __Pyx_PyUnicode_READY(op) (likely(PyUnicode_IS_READY(op)) ?\ + 0 : _PyUnicode_Ready((PyObject *)(op))) + #else + #define __Pyx_PyUnicode_READY(op) (0) + #endif + #define __Pyx_PyUnicode_GET_LENGTH(u) PyUnicode_GET_LENGTH(u) + #define __Pyx_PyUnicode_READ_CHAR(u, i) PyUnicode_READ_CHAR(u, i) + #define __Pyx_PyUnicode_MAX_CHAR_VALUE(u) PyUnicode_MAX_CHAR_VALUE(u) + #define __Pyx_PyUnicode_KIND(u) PyUnicode_KIND(u) + #define __Pyx_PyUnicode_DATA(u) PyUnicode_DATA(u) + #define __Pyx_PyUnicode_READ(k, d, i) PyUnicode_READ(k, d, i) + #define __Pyx_PyUnicode_WRITE(k, d, i, ch) PyUnicode_WRITE(k, d, i, ch) + #if defined(PyUnicode_IS_READY) && defined(PyUnicode_GET_SIZE) + #if CYTHON_COMPILING_IN_CPYTHON && PY_VERSION_HEX >= 0x03090000 + #define __Pyx_PyUnicode_IS_TRUE(u) (0 != (likely(PyUnicode_IS_READY(u)) ? PyUnicode_GET_LENGTH(u) : ((PyCompactUnicodeObject *)(u))->wstr_length)) + #else + #define __Pyx_PyUnicode_IS_TRUE(u) (0 != (likely(PyUnicode_IS_READY(u)) ? PyUnicode_GET_LENGTH(u) : PyUnicode_GET_SIZE(u))) + #endif + #else + #define __Pyx_PyUnicode_IS_TRUE(u) (0 != PyUnicode_GET_LENGTH(u)) + #endif +#else + #define CYTHON_PEP393_ENABLED 0 + #define PyUnicode_1BYTE_KIND 1 + #define PyUnicode_2BYTE_KIND 2 + #define PyUnicode_4BYTE_KIND 4 + #define __Pyx_PyUnicode_READY(op) (0) + #define __Pyx_PyUnicode_GET_LENGTH(u) PyUnicode_GET_SIZE(u) + #define __Pyx_PyUnicode_READ_CHAR(u, i) ((Py_UCS4)(PyUnicode_AS_UNICODE(u)[i])) + #define __Pyx_PyUnicode_MAX_CHAR_VALUE(u) ((sizeof(Py_UNICODE) == 2) ? 65535 : 1114111) + #define __Pyx_PyUnicode_KIND(u) (sizeof(Py_UNICODE)) + #define __Pyx_PyUnicode_DATA(u) ((void*)PyUnicode_AS_UNICODE(u)) + #define __Pyx_PyUnicode_READ(k, d, i) ((void)(k), (Py_UCS4)(((Py_UNICODE*)d)[i])) + #define __Pyx_PyUnicode_WRITE(k, d, i, ch) (((void)(k)), ((Py_UNICODE*)d)[i] = ch) + #define __Pyx_PyUnicode_IS_TRUE(u) (0 != PyUnicode_GET_SIZE(u)) +#endif +#if CYTHON_COMPILING_IN_PYPY + #define __Pyx_PyUnicode_Concat(a, b) PyNumber_Add(a, b) + #define __Pyx_PyUnicode_ConcatSafe(a, b) PyNumber_Add(a, b) +#else + #define __Pyx_PyUnicode_Concat(a, b) PyUnicode_Concat(a, b) + #define __Pyx_PyUnicode_ConcatSafe(a, b) ((unlikely((a) == Py_None) || unlikely((b) == Py_None)) ?\ + PyNumber_Add(a, b) : __Pyx_PyUnicode_Concat(a, b)) +#endif +#if CYTHON_COMPILING_IN_PYPY && !defined(PyUnicode_Contains) + #define PyUnicode_Contains(u, s) PySequence_Contains(u, s) +#endif +#if CYTHON_COMPILING_IN_PYPY && !defined(PyByteArray_Check) + #define PyByteArray_Check(obj) PyObject_TypeCheck(obj, &PyByteArray_Type) +#endif +#if CYTHON_COMPILING_IN_PYPY && !defined(PyObject_Format) + #define PyObject_Format(obj, fmt) PyObject_CallMethod(obj, "__format__", "O", fmt) +#endif +#define __Pyx_PyString_FormatSafe(a, b) ((unlikely((a) == Py_None || (PyString_Check(b) && !PyString_CheckExact(b)))) ? PyNumber_Remainder(a, b) : __Pyx_PyString_Format(a, b)) +#define __Pyx_PyUnicode_FormatSafe(a, b) ((unlikely((a) == Py_None || (PyUnicode_Check(b) && !PyUnicode_CheckExact(b)))) ? PyNumber_Remainder(a, b) : PyUnicode_Format(a, b)) +#if PY_MAJOR_VERSION >= 3 + #define __Pyx_PyString_Format(a, b) PyUnicode_Format(a, b) +#else + #define __Pyx_PyString_Format(a, b) PyString_Format(a, b) +#endif +#if PY_MAJOR_VERSION < 3 && !defined(PyObject_ASCII) + #define PyObject_ASCII(o) PyObject_Repr(o) +#endif +#if PY_MAJOR_VERSION >= 3 + #define PyBaseString_Type PyUnicode_Type + #define PyStringObject PyUnicodeObject + #define PyString_Type PyUnicode_Type + #define PyString_Check PyUnicode_Check + #define PyString_CheckExact PyUnicode_CheckExact +#ifndef PyObject_Unicode + #define PyObject_Unicode PyObject_Str +#endif +#endif +#if PY_MAJOR_VERSION >= 3 + #define __Pyx_PyBaseString_Check(obj) PyUnicode_Check(obj) + #define __Pyx_PyBaseString_CheckExact(obj) PyUnicode_CheckExact(obj) +#else + #define __Pyx_PyBaseString_Check(obj) (PyString_Check(obj) || PyUnicode_Check(obj)) + #define __Pyx_PyBaseString_CheckExact(obj) (PyString_CheckExact(obj) || PyUnicode_CheckExact(obj)) +#endif +#ifndef PySet_CheckExact + #define PySet_CheckExact(obj) (Py_TYPE(obj) == &PySet_Type) +#endif +#if PY_VERSION_HEX >= 0x030900A4 + #define __Pyx_SET_REFCNT(obj, refcnt) Py_SET_REFCNT(obj, refcnt) + #define __Pyx_SET_SIZE(obj, size) Py_SET_SIZE(obj, size) +#else + #define __Pyx_SET_REFCNT(obj, refcnt) Py_REFCNT(obj) = (refcnt) + #define __Pyx_SET_SIZE(obj, size) Py_SIZE(obj) = (size) +#endif +#if CYTHON_ASSUME_SAFE_MACROS + #define __Pyx_PySequence_SIZE(seq) Py_SIZE(seq) +#else + #define __Pyx_PySequence_SIZE(seq) PySequence_Size(seq) +#endif +#if PY_MAJOR_VERSION >= 3 + #define PyIntObject PyLongObject + #define PyInt_Type PyLong_Type + #define PyInt_Check(op) PyLong_Check(op) + #define PyInt_CheckExact(op) PyLong_CheckExact(op) + #define PyInt_FromString PyLong_FromString + #define PyInt_FromUnicode PyLong_FromUnicode + #define PyInt_FromLong PyLong_FromLong + #define PyInt_FromSize_t PyLong_FromSize_t + #define PyInt_FromSsize_t PyLong_FromSsize_t + #define PyInt_AsLong PyLong_AsLong + #define PyInt_AS_LONG PyLong_AS_LONG + #define PyInt_AsSsize_t PyLong_AsSsize_t + #define PyInt_AsUnsignedLongMask PyLong_AsUnsignedLongMask + #define PyInt_AsUnsignedLongLongMask PyLong_AsUnsignedLongLongMask + #define PyNumber_Int PyNumber_Long +#endif +#if PY_MAJOR_VERSION >= 3 + #define PyBoolObject PyLongObject +#endif +#if PY_MAJOR_VERSION >= 3 && CYTHON_COMPILING_IN_PYPY + #ifndef PyUnicode_InternFromString + #define PyUnicode_InternFromString(s) PyUnicode_FromString(s) + #endif +#endif +#if PY_VERSION_HEX < 0x030200A4 + typedef long Py_hash_t; + #define __Pyx_PyInt_FromHash_t PyInt_FromLong + #define __Pyx_PyInt_AsHash_t PyInt_AsLong +#else + #define __Pyx_PyInt_FromHash_t PyInt_FromSsize_t + #define __Pyx_PyInt_AsHash_t PyInt_AsSsize_t +#endif +#if PY_MAJOR_VERSION >= 3 + #define __Pyx_PyMethod_New(func, self, klass) ((self) ? ((void)(klass), PyMethod_New(func, self)) : __Pyx_NewRef(func)) +#else + #define __Pyx_PyMethod_New(func, self, klass) PyMethod_New(func, self, klass) +#endif +#if CYTHON_USE_ASYNC_SLOTS + #if PY_VERSION_HEX >= 0x030500B1 + #define __Pyx_PyAsyncMethodsStruct PyAsyncMethods + #define __Pyx_PyType_AsAsync(obj) (Py_TYPE(obj)->tp_as_async) + #else + #define __Pyx_PyType_AsAsync(obj) ((__Pyx_PyAsyncMethodsStruct*) (Py_TYPE(obj)->tp_reserved)) + #endif +#else + #define __Pyx_PyType_AsAsync(obj) NULL +#endif +#ifndef __Pyx_PyAsyncMethodsStruct + typedef struct { + unaryfunc am_await; + unaryfunc am_aiter; + unaryfunc am_anext; + } __Pyx_PyAsyncMethodsStruct; +#endif + +#if defined(WIN32) || defined(MS_WINDOWS) + #define _USE_MATH_DEFINES +#endif +#include +#ifdef NAN +#define __PYX_NAN() ((float) NAN) +#else +static CYTHON_INLINE float __PYX_NAN() { + float value; + memset(&value, 0xFF, sizeof(value)); + return value; +} +#endif +#if defined(__CYGWIN__) && defined(_LDBL_EQ_DBL) +#define __Pyx_truncl trunc +#else +#define __Pyx_truncl truncl +#endif + +#define __PYX_MARK_ERR_POS(f_index, lineno) \ + { __pyx_filename = __pyx_f[f_index]; (void)__pyx_filename; __pyx_lineno = lineno; (void)__pyx_lineno; __pyx_clineno = __LINE__; (void)__pyx_clineno; } +#define __PYX_ERR(f_index, lineno, Ln_error) \ + { __PYX_MARK_ERR_POS(f_index, lineno) goto Ln_error; } + +#ifndef __PYX_EXTERN_C + #ifdef __cplusplus + #define __PYX_EXTERN_C extern "C" + #else + #define __PYX_EXTERN_C extern + #endif +#endif + +#define __PYX_HAVE__aiohttp___http_writer +#define __PYX_HAVE_API__aiohttp___http_writer +/* Early includes */ +#include +#include +#include +#ifdef _OPENMP +#include +#endif /* _OPENMP */ + +#if defined(PYREX_WITHOUT_ASSERTIONS) && !defined(CYTHON_WITHOUT_ASSERTIONS) +#define CYTHON_WITHOUT_ASSERTIONS +#endif + +typedef struct {PyObject **p; const char *s; const Py_ssize_t n; const char* encoding; + const char is_unicode; const char is_str; const char intern; } __Pyx_StringTabEntry; + +#define __PYX_DEFAULT_STRING_ENCODING_IS_ASCII 0 +#define __PYX_DEFAULT_STRING_ENCODING_IS_UTF8 0 +#define __PYX_DEFAULT_STRING_ENCODING_IS_DEFAULT (PY_MAJOR_VERSION >= 3 && __PYX_DEFAULT_STRING_ENCODING_IS_UTF8) +#define __PYX_DEFAULT_STRING_ENCODING "" +#define __Pyx_PyObject_FromString __Pyx_PyBytes_FromString +#define __Pyx_PyObject_FromStringAndSize __Pyx_PyBytes_FromStringAndSize +#define __Pyx_uchar_cast(c) ((unsigned char)c) +#define __Pyx_long_cast(x) ((long)x) +#define __Pyx_fits_Py_ssize_t(v, type, is_signed) (\ + (sizeof(type) < sizeof(Py_ssize_t)) ||\ + (sizeof(type) > sizeof(Py_ssize_t) &&\ + likely(v < (type)PY_SSIZE_T_MAX ||\ + v == (type)PY_SSIZE_T_MAX) &&\ + (!is_signed || likely(v > (type)PY_SSIZE_T_MIN ||\ + v == (type)PY_SSIZE_T_MIN))) ||\ + (sizeof(type) == sizeof(Py_ssize_t) &&\ + (is_signed || likely(v < (type)PY_SSIZE_T_MAX ||\ + v == (type)PY_SSIZE_T_MAX))) ) +static CYTHON_INLINE int __Pyx_is_valid_index(Py_ssize_t i, Py_ssize_t limit) { + return (size_t) i < (size_t) limit; +} +#if defined (__cplusplus) && __cplusplus >= 201103L + #include + #define __Pyx_sst_abs(value) std::abs(value) +#elif SIZEOF_INT >= SIZEOF_SIZE_T + #define __Pyx_sst_abs(value) abs(value) +#elif SIZEOF_LONG >= SIZEOF_SIZE_T + #define __Pyx_sst_abs(value) labs(value) +#elif defined (_MSC_VER) + #define __Pyx_sst_abs(value) ((Py_ssize_t)_abs64(value)) +#elif defined (__STDC_VERSION__) && __STDC_VERSION__ >= 199901L + #define __Pyx_sst_abs(value) llabs(value) +#elif defined (__GNUC__) + #define __Pyx_sst_abs(value) __builtin_llabs(value) +#else + #define __Pyx_sst_abs(value) ((value<0) ? -value : value) +#endif +static CYTHON_INLINE const char* __Pyx_PyObject_AsString(PyObject*); +static CYTHON_INLINE const char* __Pyx_PyObject_AsStringAndSize(PyObject*, Py_ssize_t* length); +#define __Pyx_PyByteArray_FromString(s) PyByteArray_FromStringAndSize((const char*)s, strlen((const char*)s)) +#define __Pyx_PyByteArray_FromStringAndSize(s, l) PyByteArray_FromStringAndSize((const char*)s, l) +#define __Pyx_PyBytes_FromString PyBytes_FromString +#define __Pyx_PyBytes_FromStringAndSize PyBytes_FromStringAndSize +static CYTHON_INLINE PyObject* __Pyx_PyUnicode_FromString(const char*); +#if PY_MAJOR_VERSION < 3 + #define __Pyx_PyStr_FromString __Pyx_PyBytes_FromString + #define __Pyx_PyStr_FromStringAndSize __Pyx_PyBytes_FromStringAndSize +#else + #define __Pyx_PyStr_FromString __Pyx_PyUnicode_FromString + #define __Pyx_PyStr_FromStringAndSize __Pyx_PyUnicode_FromStringAndSize +#endif +#define __Pyx_PyBytes_AsWritableString(s) ((char*) PyBytes_AS_STRING(s)) +#define __Pyx_PyBytes_AsWritableSString(s) ((signed char*) PyBytes_AS_STRING(s)) +#define __Pyx_PyBytes_AsWritableUString(s) ((unsigned char*) PyBytes_AS_STRING(s)) +#define __Pyx_PyBytes_AsString(s) ((const char*) PyBytes_AS_STRING(s)) +#define __Pyx_PyBytes_AsSString(s) ((const signed char*) PyBytes_AS_STRING(s)) +#define __Pyx_PyBytes_AsUString(s) ((const unsigned char*) PyBytes_AS_STRING(s)) +#define __Pyx_PyObject_AsWritableString(s) ((char*) __Pyx_PyObject_AsString(s)) +#define __Pyx_PyObject_AsWritableSString(s) ((signed char*) __Pyx_PyObject_AsString(s)) +#define __Pyx_PyObject_AsWritableUString(s) ((unsigned char*) __Pyx_PyObject_AsString(s)) +#define __Pyx_PyObject_AsSString(s) ((const signed char*) __Pyx_PyObject_AsString(s)) +#define __Pyx_PyObject_AsUString(s) ((const unsigned char*) __Pyx_PyObject_AsString(s)) +#define __Pyx_PyObject_FromCString(s) __Pyx_PyObject_FromString((const char*)s) +#define __Pyx_PyBytes_FromCString(s) __Pyx_PyBytes_FromString((const char*)s) +#define __Pyx_PyByteArray_FromCString(s) __Pyx_PyByteArray_FromString((const char*)s) +#define __Pyx_PyStr_FromCString(s) __Pyx_PyStr_FromString((const char*)s) +#define __Pyx_PyUnicode_FromCString(s) __Pyx_PyUnicode_FromString((const char*)s) +static CYTHON_INLINE size_t __Pyx_Py_UNICODE_strlen(const Py_UNICODE *u) { + const Py_UNICODE *u_end = u; + while (*u_end++) ; + return (size_t)(u_end - u - 1); +} +#define __Pyx_PyUnicode_FromUnicode(u) PyUnicode_FromUnicode(u, __Pyx_Py_UNICODE_strlen(u)) +#define __Pyx_PyUnicode_FromUnicodeAndLength PyUnicode_FromUnicode +#define __Pyx_PyUnicode_AsUnicode PyUnicode_AsUnicode +#define __Pyx_NewRef(obj) (Py_INCREF(obj), obj) +#define __Pyx_Owned_Py_None(b) __Pyx_NewRef(Py_None) +static CYTHON_INLINE PyObject * __Pyx_PyBool_FromLong(long b); +static CYTHON_INLINE int __Pyx_PyObject_IsTrue(PyObject*); +static CYTHON_INLINE int __Pyx_PyObject_IsTrueAndDecref(PyObject*); +static CYTHON_INLINE PyObject* __Pyx_PyNumber_IntOrLong(PyObject* x); +#define __Pyx_PySequence_Tuple(obj)\ + (likely(PyTuple_CheckExact(obj)) ? __Pyx_NewRef(obj) : PySequence_Tuple(obj)) +static CYTHON_INLINE Py_ssize_t __Pyx_PyIndex_AsSsize_t(PyObject*); +static CYTHON_INLINE PyObject * __Pyx_PyInt_FromSize_t(size_t); +#if CYTHON_ASSUME_SAFE_MACROS +#define __pyx_PyFloat_AsDouble(x) (PyFloat_CheckExact(x) ? PyFloat_AS_DOUBLE(x) : PyFloat_AsDouble(x)) +#else +#define __pyx_PyFloat_AsDouble(x) PyFloat_AsDouble(x) +#endif +#define __pyx_PyFloat_AsFloat(x) ((float) __pyx_PyFloat_AsDouble(x)) +#if PY_MAJOR_VERSION >= 3 +#define __Pyx_PyNumber_Int(x) (PyLong_CheckExact(x) ? __Pyx_NewRef(x) : PyNumber_Long(x)) +#else +#define __Pyx_PyNumber_Int(x) (PyInt_CheckExact(x) ? __Pyx_NewRef(x) : PyNumber_Int(x)) +#endif +#define __Pyx_PyNumber_Float(x) (PyFloat_CheckExact(x) ? __Pyx_NewRef(x) : PyNumber_Float(x)) +#if PY_MAJOR_VERSION < 3 && __PYX_DEFAULT_STRING_ENCODING_IS_ASCII +static int __Pyx_sys_getdefaultencoding_not_ascii; +static int __Pyx_init_sys_getdefaultencoding_params(void) { + PyObject* sys; + PyObject* default_encoding = NULL; + PyObject* ascii_chars_u = NULL; + PyObject* ascii_chars_b = NULL; + const char* default_encoding_c; + sys = PyImport_ImportModule("sys"); + if (!sys) goto bad; + default_encoding = PyObject_CallMethod(sys, (char*) "getdefaultencoding", NULL); + Py_DECREF(sys); + if (!default_encoding) goto bad; + default_encoding_c = PyBytes_AsString(default_encoding); + if (!default_encoding_c) goto bad; + if (strcmp(default_encoding_c, "ascii") == 0) { + __Pyx_sys_getdefaultencoding_not_ascii = 0; + } else { + char ascii_chars[128]; + int c; + for (c = 0; c < 128; c++) { + ascii_chars[c] = c; + } + __Pyx_sys_getdefaultencoding_not_ascii = 1; + ascii_chars_u = PyUnicode_DecodeASCII(ascii_chars, 128, NULL); + if (!ascii_chars_u) goto bad; + ascii_chars_b = PyUnicode_AsEncodedString(ascii_chars_u, default_encoding_c, NULL); + if (!ascii_chars_b || !PyBytes_Check(ascii_chars_b) || memcmp(ascii_chars, PyBytes_AS_STRING(ascii_chars_b), 128) != 0) { + PyErr_Format( + PyExc_ValueError, + "This module compiled with c_string_encoding=ascii, but default encoding '%.200s' is not a superset of ascii.", + default_encoding_c); + goto bad; + } + Py_DECREF(ascii_chars_u); + Py_DECREF(ascii_chars_b); + } + Py_DECREF(default_encoding); + return 0; +bad: + Py_XDECREF(default_encoding); + Py_XDECREF(ascii_chars_u); + Py_XDECREF(ascii_chars_b); + return -1; +} +#endif +#if __PYX_DEFAULT_STRING_ENCODING_IS_DEFAULT && PY_MAJOR_VERSION >= 3 +#define __Pyx_PyUnicode_FromStringAndSize(c_str, size) PyUnicode_DecodeUTF8(c_str, size, NULL) +#else +#define __Pyx_PyUnicode_FromStringAndSize(c_str, size) PyUnicode_Decode(c_str, size, __PYX_DEFAULT_STRING_ENCODING, NULL) +#if __PYX_DEFAULT_STRING_ENCODING_IS_DEFAULT +static char* __PYX_DEFAULT_STRING_ENCODING; +static int __Pyx_init_sys_getdefaultencoding_params(void) { + PyObject* sys; + PyObject* default_encoding = NULL; + char* default_encoding_c; + sys = PyImport_ImportModule("sys"); + if (!sys) goto bad; + default_encoding = PyObject_CallMethod(sys, (char*) (const char*) "getdefaultencoding", NULL); + Py_DECREF(sys); + if (!default_encoding) goto bad; + default_encoding_c = PyBytes_AsString(default_encoding); + if (!default_encoding_c) goto bad; + __PYX_DEFAULT_STRING_ENCODING = (char*) malloc(strlen(default_encoding_c) + 1); + if (!__PYX_DEFAULT_STRING_ENCODING) goto bad; + strcpy(__PYX_DEFAULT_STRING_ENCODING, default_encoding_c); + Py_DECREF(default_encoding); + return 0; +bad: + Py_XDECREF(default_encoding); + return -1; +} +#endif +#endif + + +/* Test for GCC > 2.95 */ +#if defined(__GNUC__) && (__GNUC__ > 2 || (__GNUC__ == 2 && (__GNUC_MINOR__ > 95))) + #define likely(x) __builtin_expect(!!(x), 1) + #define unlikely(x) __builtin_expect(!!(x), 0) +#else /* !__GNUC__ or GCC < 2.95 */ + #define likely(x) (x) + #define unlikely(x) (x) +#endif /* __GNUC__ */ +static CYTHON_INLINE void __Pyx_pretend_to_initialize(void* ptr) { (void)ptr; } + +static PyObject *__pyx_m = NULL; +static PyObject *__pyx_d; +static PyObject *__pyx_b; +static PyObject *__pyx_cython_runtime = NULL; +static PyObject *__pyx_empty_tuple; +static PyObject *__pyx_empty_bytes; +static PyObject *__pyx_empty_unicode; +static int __pyx_lineno; +static int __pyx_clineno = 0; +static const char * __pyx_cfilenm= __FILE__; +static const char *__pyx_filename; + + +static const char *__pyx_f[] = { + "aiohttp\\_http_writer.pyx", + "type.pxd", +}; + +/*--- Type declarations ---*/ +struct __pyx_t_7aiohttp_12_http_writer_Writer; + +/* "aiohttp/_http_writer.pyx":18 + * # ----------------- writer --------------------------- + * + * cdef struct Writer: # <<<<<<<<<<<<<< + * char *buf + * Py_ssize_t size + */ +struct __pyx_t_7aiohttp_12_http_writer_Writer { + char *buf; + Py_ssize_t size; + Py_ssize_t pos; +}; + +/* --- Runtime support code (head) --- */ +/* Refnanny.proto */ +#ifndef CYTHON_REFNANNY + #define CYTHON_REFNANNY 0 +#endif +#if CYTHON_REFNANNY + typedef struct { + void (*INCREF)(void*, PyObject*, int); + void (*DECREF)(void*, PyObject*, int); + void (*GOTREF)(void*, PyObject*, int); + void (*GIVEREF)(void*, PyObject*, int); + void* (*SetupContext)(const char*, int, const char*); + void (*FinishContext)(void**); + } __Pyx_RefNannyAPIStruct; + static __Pyx_RefNannyAPIStruct *__Pyx_RefNanny = NULL; + static __Pyx_RefNannyAPIStruct *__Pyx_RefNannyImportAPI(const char *modname); + #define __Pyx_RefNannyDeclarations void *__pyx_refnanny = NULL; +#ifdef WITH_THREAD + #define __Pyx_RefNannySetupContext(name, acquire_gil)\ + if (acquire_gil) {\ + PyGILState_STATE __pyx_gilstate_save = PyGILState_Ensure();\ + __pyx_refnanny = __Pyx_RefNanny->SetupContext((name), __LINE__, __FILE__);\ + PyGILState_Release(__pyx_gilstate_save);\ + } else {\ + __pyx_refnanny = __Pyx_RefNanny->SetupContext((name), __LINE__, __FILE__);\ + } +#else + #define __Pyx_RefNannySetupContext(name, acquire_gil)\ + __pyx_refnanny = __Pyx_RefNanny->SetupContext((name), __LINE__, __FILE__) +#endif + #define __Pyx_RefNannyFinishContext()\ + __Pyx_RefNanny->FinishContext(&__pyx_refnanny) + #define __Pyx_INCREF(r) __Pyx_RefNanny->INCREF(__pyx_refnanny, (PyObject *)(r), __LINE__) + #define __Pyx_DECREF(r) __Pyx_RefNanny->DECREF(__pyx_refnanny, (PyObject *)(r), __LINE__) + #define __Pyx_GOTREF(r) __Pyx_RefNanny->GOTREF(__pyx_refnanny, (PyObject *)(r), __LINE__) + #define __Pyx_GIVEREF(r) __Pyx_RefNanny->GIVEREF(__pyx_refnanny, (PyObject *)(r), __LINE__) + #define __Pyx_XINCREF(r) do { if((r) != NULL) {__Pyx_INCREF(r); }} while(0) + #define __Pyx_XDECREF(r) do { if((r) != NULL) {__Pyx_DECREF(r); }} while(0) + #define __Pyx_XGOTREF(r) do { if((r) != NULL) {__Pyx_GOTREF(r); }} while(0) + #define __Pyx_XGIVEREF(r) do { if((r) != NULL) {__Pyx_GIVEREF(r);}} while(0) +#else + #define __Pyx_RefNannyDeclarations + #define __Pyx_RefNannySetupContext(name, acquire_gil) + #define __Pyx_RefNannyFinishContext() + #define __Pyx_INCREF(r) Py_INCREF(r) + #define __Pyx_DECREF(r) Py_DECREF(r) + #define __Pyx_GOTREF(r) + #define __Pyx_GIVEREF(r) + #define __Pyx_XINCREF(r) Py_XINCREF(r) + #define __Pyx_XDECREF(r) Py_XDECREF(r) + #define __Pyx_XGOTREF(r) + #define __Pyx_XGIVEREF(r) +#endif +#define __Pyx_XDECREF_SET(r, v) do {\ + PyObject *tmp = (PyObject *) r;\ + r = v; __Pyx_XDECREF(tmp);\ + } while (0) +#define __Pyx_DECREF_SET(r, v) do {\ + PyObject *tmp = (PyObject *) r;\ + r = v; __Pyx_DECREF(tmp);\ + } while (0) +#define __Pyx_CLEAR(r) do { PyObject* tmp = ((PyObject*)(r)); r = NULL; __Pyx_DECREF(tmp);} while(0) +#define __Pyx_XCLEAR(r) do { if((r) != NULL) {PyObject* tmp = ((PyObject*)(r)); r = NULL; __Pyx_DECREF(tmp);}} while(0) + +/* PyObjectGetAttrStr.proto */ +#if CYTHON_USE_TYPE_SLOTS +static CYTHON_INLINE PyObject* __Pyx_PyObject_GetAttrStr(PyObject* obj, PyObject* attr_name); +#else +#define __Pyx_PyObject_GetAttrStr(o,n) PyObject_GetAttr(o,n) +#endif + +/* GetBuiltinName.proto */ +static PyObject *__Pyx_GetBuiltinName(PyObject *name); + +/* PyThreadStateGet.proto */ +#if CYTHON_FAST_THREAD_STATE +#define __Pyx_PyThreadState_declare PyThreadState *__pyx_tstate; +#define __Pyx_PyThreadState_assign __pyx_tstate = __Pyx_PyThreadState_Current; +#define __Pyx_PyErr_Occurred() __pyx_tstate->curexc_type +#else +#define __Pyx_PyThreadState_declare +#define __Pyx_PyThreadState_assign +#define __Pyx_PyErr_Occurred() PyErr_Occurred() +#endif + +/* PyErrFetchRestore.proto */ +#if CYTHON_FAST_THREAD_STATE +#define __Pyx_PyErr_Clear() __Pyx_ErrRestore(NULL, NULL, NULL) +#define __Pyx_ErrRestoreWithState(type, value, tb) __Pyx_ErrRestoreInState(PyThreadState_GET(), type, value, tb) +#define __Pyx_ErrFetchWithState(type, value, tb) __Pyx_ErrFetchInState(PyThreadState_GET(), type, value, tb) +#define __Pyx_ErrRestore(type, value, tb) __Pyx_ErrRestoreInState(__pyx_tstate, type, value, tb) +#define __Pyx_ErrFetch(type, value, tb) __Pyx_ErrFetchInState(__pyx_tstate, type, value, tb) +static CYTHON_INLINE void __Pyx_ErrRestoreInState(PyThreadState *tstate, PyObject *type, PyObject *value, PyObject *tb); +static CYTHON_INLINE void __Pyx_ErrFetchInState(PyThreadState *tstate, PyObject **type, PyObject **value, PyObject **tb); +#if CYTHON_COMPILING_IN_CPYTHON +#define __Pyx_PyErr_SetNone(exc) (Py_INCREF(exc), __Pyx_ErrRestore((exc), NULL, NULL)) +#else +#define __Pyx_PyErr_SetNone(exc) PyErr_SetNone(exc) +#endif +#else +#define __Pyx_PyErr_Clear() PyErr_Clear() +#define __Pyx_PyErr_SetNone(exc) PyErr_SetNone(exc) +#define __Pyx_ErrRestoreWithState(type, value, tb) PyErr_Restore(type, value, tb) +#define __Pyx_ErrFetchWithState(type, value, tb) PyErr_Fetch(type, value, tb) +#define __Pyx_ErrRestoreInState(tstate, type, value, tb) PyErr_Restore(type, value, tb) +#define __Pyx_ErrFetchInState(tstate, type, value, tb) PyErr_Fetch(type, value, tb) +#define __Pyx_ErrRestore(type, value, tb) PyErr_Restore(type, value, tb) +#define __Pyx_ErrFetch(type, value, tb) PyErr_Fetch(type, value, tb) +#endif + +/* WriteUnraisableException.proto */ +static void __Pyx_WriteUnraisable(const char *name, int clineno, + int lineno, const char *filename, + int full_traceback, int nogil); + +/* unicode_iter.proto */ +static CYTHON_INLINE int __Pyx_init_unicode_iteration( + PyObject* ustring, Py_ssize_t *length, void** data, int *kind); + +/* PyCFunctionFastCall.proto */ +#if CYTHON_FAST_PYCCALL +static CYTHON_INLINE PyObject *__Pyx_PyCFunction_FastCall(PyObject *func, PyObject **args, Py_ssize_t nargs); +#else +#define __Pyx_PyCFunction_FastCall(func, args, nargs) (assert(0), NULL) +#endif + +/* PyFunctionFastCall.proto */ +#if CYTHON_FAST_PYCALL +#define __Pyx_PyFunction_FastCall(func, args, nargs)\ + __Pyx_PyFunction_FastCallDict((func), (args), (nargs), NULL) +#if 1 || PY_VERSION_HEX < 0x030600B1 +static PyObject *__Pyx_PyFunction_FastCallDict(PyObject *func, PyObject **args, Py_ssize_t nargs, PyObject *kwargs); +#else +#define __Pyx_PyFunction_FastCallDict(func, args, nargs, kwargs) _PyFunction_FastCallDict(func, args, nargs, kwargs) +#endif +#define __Pyx_BUILD_ASSERT_EXPR(cond)\ + (sizeof(char [1 - 2*!(cond)]) - 1) +#ifndef Py_MEMBER_SIZE +#define Py_MEMBER_SIZE(type, member) sizeof(((type *)0)->member) +#endif + static size_t __pyx_pyframe_localsplus_offset = 0; + #include "frameobject.h" + #define __Pxy_PyFrame_Initialize_Offsets()\ + ((void)__Pyx_BUILD_ASSERT_EXPR(sizeof(PyFrameObject) == offsetof(PyFrameObject, f_localsplus) + Py_MEMBER_SIZE(PyFrameObject, f_localsplus)),\ + (void)(__pyx_pyframe_localsplus_offset = ((size_t)PyFrame_Type.tp_basicsize) - Py_MEMBER_SIZE(PyFrameObject, f_localsplus))) + #define __Pyx_PyFrame_GetLocalsplus(frame)\ + (assert(__pyx_pyframe_localsplus_offset), (PyObject **)(((char *)(frame)) + __pyx_pyframe_localsplus_offset)) +#endif + +/* PyObjectCall.proto */ +#if CYTHON_COMPILING_IN_CPYTHON +static CYTHON_INLINE PyObject* __Pyx_PyObject_Call(PyObject *func, PyObject *arg, PyObject *kw); +#else +#define __Pyx_PyObject_Call(func, arg, kw) PyObject_Call(func, arg, kw) +#endif + +/* PyObjectCall2Args.proto */ +static CYTHON_UNUSED PyObject* __Pyx_PyObject_Call2Args(PyObject* function, PyObject* arg1, PyObject* arg2); + +/* PyObjectCallMethO.proto */ +#if CYTHON_COMPILING_IN_CPYTHON +static CYTHON_INLINE PyObject* __Pyx_PyObject_CallMethO(PyObject *func, PyObject *arg); +#endif + +/* PyObjectCallOneArg.proto */ +static CYTHON_INLINE PyObject* __Pyx_PyObject_CallOneArg(PyObject *func, PyObject *arg); + +/* RaiseException.proto */ +static void __Pyx_Raise(PyObject *type, PyObject *value, PyObject *tb, PyObject *cause); + +/* PyUnicodeContains.proto */ +static CYTHON_INLINE int __Pyx_PyUnicode_ContainsTF(PyObject* substring, PyObject* text, int eq) { + int result = PyUnicode_Contains(text, substring); + return unlikely(result < 0) ? result : (result == (eq == Py_EQ)); +} + +/* RaiseArgTupleInvalid.proto */ +static void __Pyx_RaiseArgtupleInvalid(const char* func_name, int exact, + Py_ssize_t num_min, Py_ssize_t num_max, Py_ssize_t num_found); + +/* RaiseDoubleKeywords.proto */ +static void __Pyx_RaiseDoubleKeywordsError(const char* func_name, PyObject* kw_name); + +/* ParseKeywords.proto */ +static int __Pyx_ParseOptionalKeywords(PyObject *kwds, PyObject **argnames[],\ + PyObject *kwds2, PyObject *values[], Py_ssize_t num_pos_args,\ + const char* function_name); + +/* ArgTypeTest.proto */ +#define __Pyx_ArgTypeTest(obj, type, none_allowed, name, exact)\ + ((likely((Py_TYPE(obj) == type) | (none_allowed && (obj == Py_None)))) ? 1 :\ + __Pyx__ArgTypeTest(obj, type, name, exact)) +static int __Pyx__ArgTypeTest(PyObject *obj, PyTypeObject *type, const char *name, int exact); + +/* IterFinish.proto */ +static CYTHON_INLINE int __Pyx_IterFinish(void); + +/* PyObjectCallNoArg.proto */ +#if CYTHON_COMPILING_IN_CPYTHON +static CYTHON_INLINE PyObject* __Pyx_PyObject_CallNoArg(PyObject *func); +#else +#define __Pyx_PyObject_CallNoArg(func) __Pyx_PyObject_Call(func, __pyx_empty_tuple, NULL) +#endif + +/* PyObjectGetMethod.proto */ +static int __Pyx_PyObject_GetMethod(PyObject *obj, PyObject *name, PyObject **method); + +/* PyObjectCallMethod0.proto */ +static PyObject* __Pyx_PyObject_CallMethod0(PyObject* obj, PyObject* method_name); + +/* RaiseNeedMoreValuesToUnpack.proto */ +static CYTHON_INLINE void __Pyx_RaiseNeedMoreValuesError(Py_ssize_t index); + +/* RaiseTooManyValuesToUnpack.proto */ +static CYTHON_INLINE void __Pyx_RaiseTooManyValuesError(Py_ssize_t expected); + +/* UnpackItemEndCheck.proto */ +static int __Pyx_IternextUnpackEndCheck(PyObject *retval, Py_ssize_t expected); + +/* RaiseNoneIterError.proto */ +static CYTHON_INLINE void __Pyx_RaiseNoneNotIterableError(void); + +/* UnpackTupleError.proto */ +static void __Pyx_UnpackTupleError(PyObject *, Py_ssize_t index); + +/* UnpackTuple2.proto */ +#define __Pyx_unpack_tuple2(tuple, value1, value2, is_tuple, has_known_size, decref_tuple)\ + (likely(is_tuple || PyTuple_Check(tuple)) ?\ + (likely(has_known_size || PyTuple_GET_SIZE(tuple) == 2) ?\ + __Pyx_unpack_tuple2_exact(tuple, value1, value2, decref_tuple) :\ + (__Pyx_UnpackTupleError(tuple, 2), -1)) :\ + __Pyx_unpack_tuple2_generic(tuple, value1, value2, has_known_size, decref_tuple)) +static CYTHON_INLINE int __Pyx_unpack_tuple2_exact( + PyObject* tuple, PyObject** value1, PyObject** value2, int decref_tuple); +static int __Pyx_unpack_tuple2_generic( + PyObject* tuple, PyObject** value1, PyObject** value2, int has_known_size, int decref_tuple); + +/* dict_iter.proto */ +static CYTHON_INLINE PyObject* __Pyx_dict_iterator(PyObject* dict, int is_dict, PyObject* method_name, + Py_ssize_t* p_orig_length, int* p_is_dict); +static CYTHON_INLINE int __Pyx_dict_iter_next(PyObject* dict_or_iter, Py_ssize_t orig_length, Py_ssize_t* ppos, + PyObject** pkey, PyObject** pvalue, PyObject** pitem, int is_dict); + +/* GetTopmostException.proto */ +#if CYTHON_USE_EXC_INFO_STACK +static _PyErr_StackItem * __Pyx_PyErr_GetTopmostException(PyThreadState *tstate); +#endif + +/* ReRaiseException.proto */ +static CYTHON_INLINE void __Pyx_ReraiseException(void); + +/* GetException.proto */ +#if CYTHON_FAST_THREAD_STATE +#define __Pyx_GetException(type, value, tb) __Pyx__GetException(__pyx_tstate, type, value, tb) +static int __Pyx__GetException(PyThreadState *tstate, PyObject **type, PyObject **value, PyObject **tb); +#else +static int __Pyx_GetException(PyObject **type, PyObject **value, PyObject **tb); +#endif + +/* SwapException.proto */ +#if CYTHON_FAST_THREAD_STATE +#define __Pyx_ExceptionSwap(type, value, tb) __Pyx__ExceptionSwap(__pyx_tstate, type, value, tb) +static CYTHON_INLINE void __Pyx__ExceptionSwap(PyThreadState *tstate, PyObject **type, PyObject **value, PyObject **tb); +#else +static CYTHON_INLINE void __Pyx_ExceptionSwap(PyObject **type, PyObject **value, PyObject **tb); +#endif + +/* SaveResetException.proto */ +#if CYTHON_FAST_THREAD_STATE +#define __Pyx_ExceptionSave(type, value, tb) __Pyx__ExceptionSave(__pyx_tstate, type, value, tb) +static CYTHON_INLINE void __Pyx__ExceptionSave(PyThreadState *tstate, PyObject **type, PyObject **value, PyObject **tb); +#define __Pyx_ExceptionReset(type, value, tb) __Pyx__ExceptionReset(__pyx_tstate, type, value, tb) +static CYTHON_INLINE void __Pyx__ExceptionReset(PyThreadState *tstate, PyObject *type, PyObject *value, PyObject *tb); +#else +#define __Pyx_ExceptionSave(type, value, tb) PyErr_GetExcInfo(type, value, tb) +#define __Pyx_ExceptionReset(type, value, tb) PyErr_SetExcInfo(type, value, tb) +#endif + +/* TypeImport.proto */ +#ifndef __PYX_HAVE_RT_ImportType_proto +#define __PYX_HAVE_RT_ImportType_proto +enum __Pyx_ImportType_CheckSize { + __Pyx_ImportType_CheckSize_Error = 0, + __Pyx_ImportType_CheckSize_Warn = 1, + __Pyx_ImportType_CheckSize_Ignore = 2 +}; +static PyTypeObject *__Pyx_ImportType(PyObject* module, const char *module_name, const char *class_name, size_t size, enum __Pyx_ImportType_CheckSize check_size); +#endif + +/* Import.proto */ +static PyObject *__Pyx_Import(PyObject *name, PyObject *from_list, int level); + +/* ImportFrom.proto */ +static PyObject* __Pyx_ImportFrom(PyObject* module, PyObject* name); + +/* PyDictVersioning.proto */ +#if CYTHON_USE_DICT_VERSIONS && CYTHON_USE_TYPE_SLOTS +#define __PYX_DICT_VERSION_INIT ((PY_UINT64_T) -1) +#define __PYX_GET_DICT_VERSION(dict) (((PyDictObject*)(dict))->ma_version_tag) +#define __PYX_UPDATE_DICT_CACHE(dict, value, cache_var, version_var)\ + (version_var) = __PYX_GET_DICT_VERSION(dict);\ + (cache_var) = (value); +#define __PYX_PY_DICT_LOOKUP_IF_MODIFIED(VAR, DICT, LOOKUP) {\ + static PY_UINT64_T __pyx_dict_version = 0;\ + static PyObject *__pyx_dict_cached_value = NULL;\ + if (likely(__PYX_GET_DICT_VERSION(DICT) == __pyx_dict_version)) {\ + (VAR) = __pyx_dict_cached_value;\ + } else {\ + (VAR) = __pyx_dict_cached_value = (LOOKUP);\ + __pyx_dict_version = __PYX_GET_DICT_VERSION(DICT);\ + }\ +} +static CYTHON_INLINE PY_UINT64_T __Pyx_get_tp_dict_version(PyObject *obj); +static CYTHON_INLINE PY_UINT64_T __Pyx_get_object_dict_version(PyObject *obj); +static CYTHON_INLINE int __Pyx_object_dict_version_matches(PyObject* obj, PY_UINT64_T tp_dict_version, PY_UINT64_T obj_dict_version); +#else +#define __PYX_GET_DICT_VERSION(dict) (0) +#define __PYX_UPDATE_DICT_CACHE(dict, value, cache_var, version_var) +#define __PYX_PY_DICT_LOOKUP_IF_MODIFIED(VAR, DICT, LOOKUP) (VAR) = (LOOKUP); +#endif + +/* GetModuleGlobalName.proto */ +#if CYTHON_USE_DICT_VERSIONS +#define __Pyx_GetModuleGlobalName(var, name) {\ + static PY_UINT64_T __pyx_dict_version = 0;\ + static PyObject *__pyx_dict_cached_value = NULL;\ + (var) = (likely(__pyx_dict_version == __PYX_GET_DICT_VERSION(__pyx_d))) ?\ + (likely(__pyx_dict_cached_value) ? __Pyx_NewRef(__pyx_dict_cached_value) : __Pyx_GetBuiltinName(name)) :\ + __Pyx__GetModuleGlobalName(name, &__pyx_dict_version, &__pyx_dict_cached_value);\ +} +#define __Pyx_GetModuleGlobalNameUncached(var, name) {\ + PY_UINT64_T __pyx_dict_version;\ + PyObject *__pyx_dict_cached_value;\ + (var) = __Pyx__GetModuleGlobalName(name, &__pyx_dict_version, &__pyx_dict_cached_value);\ +} +static PyObject *__Pyx__GetModuleGlobalName(PyObject *name, PY_UINT64_T *dict_version, PyObject **dict_cached_value); +#else +#define __Pyx_GetModuleGlobalName(var, name) (var) = __Pyx__GetModuleGlobalName(name) +#define __Pyx_GetModuleGlobalNameUncached(var, name) (var) = __Pyx__GetModuleGlobalName(name) +static CYTHON_INLINE PyObject *__Pyx__GetModuleGlobalName(PyObject *name); +#endif + +/* CLineInTraceback.proto */ +#ifdef CYTHON_CLINE_IN_TRACEBACK +#define __Pyx_CLineForTraceback(tstate, c_line) (((CYTHON_CLINE_IN_TRACEBACK)) ? c_line : 0) +#else +static int __Pyx_CLineForTraceback(PyThreadState *tstate, int c_line); +#endif + +/* CodeObjectCache.proto */ +typedef struct { + PyCodeObject* code_object; + int code_line; +} __Pyx_CodeObjectCacheEntry; +struct __Pyx_CodeObjectCache { + int count; + int max_count; + __Pyx_CodeObjectCacheEntry* entries; +}; +static struct __Pyx_CodeObjectCache __pyx_code_cache = {0,0,NULL}; +static int __pyx_bisect_code_objects(__Pyx_CodeObjectCacheEntry* entries, int count, int code_line); +static PyCodeObject *__pyx_find_code_object(int code_line); +static void __pyx_insert_code_object(int code_line, PyCodeObject* code_object); + +/* AddTraceback.proto */ +static void __Pyx_AddTraceback(const char *funcname, int c_line, + int py_line, const char *filename); + +/* GCCDiagnostics.proto */ +#if defined(__GNUC__) && (__GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ >= 6)) +#define __Pyx_HAS_GCC_DIAGNOSTIC +#endif + +/* CIntToPy.proto */ +static CYTHON_INLINE PyObject* __Pyx_PyInt_From_long(long value); + +/* CIntFromPy.proto */ +static CYTHON_INLINE long __Pyx_PyInt_As_long(PyObject *); + +/* CIntFromPy.proto */ +static CYTHON_INLINE int __Pyx_PyInt_As_int(PyObject *); + +/* FastTypeChecks.proto */ +#if CYTHON_COMPILING_IN_CPYTHON +#define __Pyx_TypeCheck(obj, type) __Pyx_IsSubtype(Py_TYPE(obj), (PyTypeObject *)type) +static CYTHON_INLINE int __Pyx_IsSubtype(PyTypeObject *a, PyTypeObject *b); +static CYTHON_INLINE int __Pyx_PyErr_GivenExceptionMatches(PyObject *err, PyObject *type); +static CYTHON_INLINE int __Pyx_PyErr_GivenExceptionMatches2(PyObject *err, PyObject *type1, PyObject *type2); +#else +#define __Pyx_TypeCheck(obj, type) PyObject_TypeCheck(obj, (PyTypeObject *)type) +#define __Pyx_PyErr_GivenExceptionMatches(err, type) PyErr_GivenExceptionMatches(err, type) +#define __Pyx_PyErr_GivenExceptionMatches2(err, type1, type2) (PyErr_GivenExceptionMatches(err, type1) || PyErr_GivenExceptionMatches(err, type2)) +#endif +#define __Pyx_PyException_Check(obj) __Pyx_TypeCheck(obj, PyExc_Exception) + +/* CheckBinaryVersion.proto */ +static int __Pyx_check_binary_version(void); + +/* InitStrings.proto */ +static int __Pyx_InitStrings(__Pyx_StringTabEntry *t); + + +/* Module declarations from 'libc.string' */ + +/* Module declarations from 'libc.stdio' */ + +/* Module declarations from '__builtin__' */ + +/* Module declarations from 'cpython.type' */ +static PyTypeObject *__pyx_ptype_7cpython_4type_type = 0; + +/* Module declarations from 'cpython' */ + +/* Module declarations from 'cpython.object' */ + +/* Module declarations from 'cpython.bytes' */ + +/* Module declarations from 'cpython.exc' */ + +/* Module declarations from 'cpython.mem' */ + +/* Module declarations from 'libc.stdint' */ + +/* Module declarations from 'aiohttp._http_writer' */ +static char __pyx_v_7aiohttp_12_http_writer_BUFFER[0x4000]; +static PyObject *__pyx_v_7aiohttp_12_http_writer__istr = 0; +static CYTHON_INLINE void __pyx_f_7aiohttp_12_http_writer__init_writer(struct __pyx_t_7aiohttp_12_http_writer_Writer *); /*proto*/ +static CYTHON_INLINE void __pyx_f_7aiohttp_12_http_writer__release_writer(struct __pyx_t_7aiohttp_12_http_writer_Writer *); /*proto*/ +static CYTHON_INLINE int __pyx_f_7aiohttp_12_http_writer__write_byte(struct __pyx_t_7aiohttp_12_http_writer_Writer *, uint8_t); /*proto*/ +static CYTHON_INLINE int __pyx_f_7aiohttp_12_http_writer__write_utf8(struct __pyx_t_7aiohttp_12_http_writer_Writer *, Py_UCS4); /*proto*/ +static CYTHON_INLINE int __pyx_f_7aiohttp_12_http_writer__write_str(struct __pyx_t_7aiohttp_12_http_writer_Writer *, PyObject *); /*proto*/ +static PyObject *__pyx_f_7aiohttp_12_http_writer_to_str(PyObject *); /*proto*/ +static void __pyx_f_7aiohttp_12_http_writer__safe_header(PyObject *); /*proto*/ +#define __Pyx_MODULE_NAME "aiohttp._http_writer" +extern int __pyx_module_is_main_aiohttp___http_writer; +int __pyx_module_is_main_aiohttp___http_writer = 0; + +/* Implementation of 'aiohttp._http_writer' */ +static PyObject *__pyx_builtin_TypeError; +static PyObject *__pyx_builtin_ValueError; +static const char __pyx_k_[] = "\r"; +static const char __pyx_k__2[] = "\n"; +static const char __pyx_k_key[] = "key"; +static const char __pyx_k_ret[] = "ret"; +static const char __pyx_k_val[] = "val"; +static const char __pyx_k_istr[] = "istr"; +static const char __pyx_k_main[] = "__main__"; +static const char __pyx_k_name[] = "__name__"; +static const char __pyx_k_test[] = "__test__"; +static const char __pyx_k_items[] = "items"; +static const char __pyx_k_format[] = "format"; +static const char __pyx_k_import[] = "__import__"; +static const char __pyx_k_writer[] = "writer"; +static const char __pyx_k_headers[] = "headers"; +static const char __pyx_k_TypeError[] = "TypeError"; +static const char __pyx_k_multidict[] = "multidict"; +static const char __pyx_k_ValueError[] = "ValueError"; +static const char __pyx_k_status_line[] = "status_line"; +static const char __pyx_k_serialize_headers[] = "_serialize_headers"; +static const char __pyx_k_cline_in_traceback[] = "cline_in_traceback"; +static const char __pyx_k_aiohttp__http_writer[] = "aiohttp._http_writer"; +static const char __pyx_k_aiohttp__http_writer_pyx[] = "aiohttp\\_http_writer.pyx"; +static const char __pyx_k_Cannot_serialize_non_str_key_r[] = "Cannot serialize non-str key {!r}"; +static const char __pyx_k_Newline_or_carriage_return_chara[] = "Newline or carriage return character detected in HTTP status message or header. This is a potential security issue."; +static PyObject *__pyx_kp_u_; +static PyObject *__pyx_kp_u_Cannot_serialize_non_str_key_r; +static PyObject *__pyx_kp_u_Newline_or_carriage_return_chara; +static PyObject *__pyx_n_s_TypeError; +static PyObject *__pyx_n_s_ValueError; +static PyObject *__pyx_kp_u__2; +static PyObject *__pyx_n_s_aiohttp__http_writer; +static PyObject *__pyx_kp_s_aiohttp__http_writer_pyx; +static PyObject *__pyx_n_s_cline_in_traceback; +static PyObject *__pyx_n_s_format; +static PyObject *__pyx_n_s_headers; +static PyObject *__pyx_n_s_import; +static PyObject *__pyx_n_s_istr; +static PyObject *__pyx_n_s_items; +static PyObject *__pyx_n_s_key; +static PyObject *__pyx_n_s_main; +static PyObject *__pyx_n_s_multidict; +static PyObject *__pyx_n_s_name; +static PyObject *__pyx_n_s_ret; +static PyObject *__pyx_n_s_serialize_headers; +static PyObject *__pyx_n_s_status_line; +static PyObject *__pyx_n_s_test; +static PyObject *__pyx_n_s_val; +static PyObject *__pyx_n_s_writer; +static PyObject *__pyx_pf_7aiohttp_12_http_writer__serialize_headers(CYTHON_UNUSED PyObject *__pyx_self, PyObject *__pyx_v_status_line, PyObject *__pyx_v_headers); /* proto */ +static PyObject *__pyx_tuple__3; +static PyObject *__pyx_tuple__4; +static PyObject *__pyx_codeobj__5; +/* Late includes */ + +/* "aiohttp/_http_writer.pyx":24 + * + * + * cdef inline void _init_writer(Writer* writer): # <<<<<<<<<<<<<< + * writer.buf = &BUFFER[0] + * writer.size = BUF_SIZE + */ + +static CYTHON_INLINE void __pyx_f_7aiohttp_12_http_writer__init_writer(struct __pyx_t_7aiohttp_12_http_writer_Writer *__pyx_v_writer) { + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("_init_writer", 0); + + /* "aiohttp/_http_writer.pyx":25 + * + * cdef inline void _init_writer(Writer* writer): + * writer.buf = &BUFFER[0] # <<<<<<<<<<<<<< + * writer.size = BUF_SIZE + * writer.pos = 0 + */ + __pyx_v_writer->buf = (&(__pyx_v_7aiohttp_12_http_writer_BUFFER[0])); + + /* "aiohttp/_http_writer.pyx":26 + * cdef inline void _init_writer(Writer* writer): + * writer.buf = &BUFFER[0] + * writer.size = BUF_SIZE # <<<<<<<<<<<<<< + * writer.pos = 0 + * + */ + __pyx_v_writer->size = 0x4000; + + /* "aiohttp/_http_writer.pyx":27 + * writer.buf = &BUFFER[0] + * writer.size = BUF_SIZE + * writer.pos = 0 # <<<<<<<<<<<<<< + * + * + */ + __pyx_v_writer->pos = 0; + + /* "aiohttp/_http_writer.pyx":24 + * + * + * cdef inline void _init_writer(Writer* writer): # <<<<<<<<<<<<<< + * writer.buf = &BUFFER[0] + * writer.size = BUF_SIZE + */ + + /* function exit code */ + __Pyx_RefNannyFinishContext(); +} + +/* "aiohttp/_http_writer.pyx":30 + * + * + * cdef inline void _release_writer(Writer* writer): # <<<<<<<<<<<<<< + * if writer.buf != BUFFER: + * PyMem_Free(writer.buf) + */ + +static CYTHON_INLINE void __pyx_f_7aiohttp_12_http_writer__release_writer(struct __pyx_t_7aiohttp_12_http_writer_Writer *__pyx_v_writer) { + __Pyx_RefNannyDeclarations + int __pyx_t_1; + __Pyx_RefNannySetupContext("_release_writer", 0); + + /* "aiohttp/_http_writer.pyx":31 + * + * cdef inline void _release_writer(Writer* writer): + * if writer.buf != BUFFER: # <<<<<<<<<<<<<< + * PyMem_Free(writer.buf) + * + */ + __pyx_t_1 = ((__pyx_v_writer->buf != __pyx_v_7aiohttp_12_http_writer_BUFFER) != 0); + if (__pyx_t_1) { + + /* "aiohttp/_http_writer.pyx":32 + * cdef inline void _release_writer(Writer* writer): + * if writer.buf != BUFFER: + * PyMem_Free(writer.buf) # <<<<<<<<<<<<<< + * + * + */ + PyMem_Free(__pyx_v_writer->buf); + + /* "aiohttp/_http_writer.pyx":31 + * + * cdef inline void _release_writer(Writer* writer): + * if writer.buf != BUFFER: # <<<<<<<<<<<<<< + * PyMem_Free(writer.buf) + * + */ + } + + /* "aiohttp/_http_writer.pyx":30 + * + * + * cdef inline void _release_writer(Writer* writer): # <<<<<<<<<<<<<< + * if writer.buf != BUFFER: + * PyMem_Free(writer.buf) + */ + + /* function exit code */ + __Pyx_RefNannyFinishContext(); +} + +/* "aiohttp/_http_writer.pyx":35 + * + * + * cdef inline int _write_byte(Writer* writer, uint8_t ch): # <<<<<<<<<<<<<< + * cdef char * buf + * cdef Py_ssize_t size + */ + +static CYTHON_INLINE int __pyx_f_7aiohttp_12_http_writer__write_byte(struct __pyx_t_7aiohttp_12_http_writer_Writer *__pyx_v_writer, uint8_t __pyx_v_ch) { + char *__pyx_v_buf; + Py_ssize_t __pyx_v_size; + int __pyx_r; + __Pyx_RefNannyDeclarations + int __pyx_t_1; + PyObject *__pyx_t_2; + int __pyx_lineno = 0; + const char *__pyx_filename = NULL; + int __pyx_clineno = 0; + __Pyx_RefNannySetupContext("_write_byte", 0); + + /* "aiohttp/_http_writer.pyx":39 + * cdef Py_ssize_t size + * + * if writer.pos == writer.size: # <<<<<<<<<<<<<< + * # reallocate + * size = writer.size + BUF_SIZE + */ + __pyx_t_1 = ((__pyx_v_writer->pos == __pyx_v_writer->size) != 0); + if (__pyx_t_1) { + + /* "aiohttp/_http_writer.pyx":41 + * if writer.pos == writer.size: + * # reallocate + * size = writer.size + BUF_SIZE # <<<<<<<<<<<<<< + * if writer.buf == BUFFER: + * buf = PyMem_Malloc(size) + */ + __pyx_v_size = (__pyx_v_writer->size + 0x4000); + + /* "aiohttp/_http_writer.pyx":42 + * # reallocate + * size = writer.size + BUF_SIZE + * if writer.buf == BUFFER: # <<<<<<<<<<<<<< + * buf = PyMem_Malloc(size) + * if buf == NULL: + */ + __pyx_t_1 = ((__pyx_v_writer->buf == __pyx_v_7aiohttp_12_http_writer_BUFFER) != 0); + if (__pyx_t_1) { + + /* "aiohttp/_http_writer.pyx":43 + * size = writer.size + BUF_SIZE + * if writer.buf == BUFFER: + * buf = PyMem_Malloc(size) # <<<<<<<<<<<<<< + * if buf == NULL: + * PyErr_NoMemory() + */ + __pyx_v_buf = ((char *)PyMem_Malloc(__pyx_v_size)); + + /* "aiohttp/_http_writer.pyx":44 + * if writer.buf == BUFFER: + * buf = PyMem_Malloc(size) + * if buf == NULL: # <<<<<<<<<<<<<< + * PyErr_NoMemory() + * return -1 + */ + __pyx_t_1 = ((__pyx_v_buf == NULL) != 0); + if (__pyx_t_1) { + + /* "aiohttp/_http_writer.pyx":45 + * buf = PyMem_Malloc(size) + * if buf == NULL: + * PyErr_NoMemory() # <<<<<<<<<<<<<< + * return -1 + * memcpy(buf, writer.buf, writer.size) + */ + __pyx_t_2 = PyErr_NoMemory(); if (unlikely(__pyx_t_2 == ((PyObject *)NULL))) __PYX_ERR(0, 45, __pyx_L1_error) + + /* "aiohttp/_http_writer.pyx":46 + * if buf == NULL: + * PyErr_NoMemory() + * return -1 # <<<<<<<<<<<<<< + * memcpy(buf, writer.buf, writer.size) + * else: + */ + __pyx_r = -1; + goto __pyx_L0; + + /* "aiohttp/_http_writer.pyx":44 + * if writer.buf == BUFFER: + * buf = PyMem_Malloc(size) + * if buf == NULL: # <<<<<<<<<<<<<< + * PyErr_NoMemory() + * return -1 + */ + } + + /* "aiohttp/_http_writer.pyx":47 + * PyErr_NoMemory() + * return -1 + * memcpy(buf, writer.buf, writer.size) # <<<<<<<<<<<<<< + * else: + * buf = PyMem_Realloc(writer.buf, size) + */ + (void)(memcpy(__pyx_v_buf, __pyx_v_writer->buf, __pyx_v_writer->size)); + + /* "aiohttp/_http_writer.pyx":42 + * # reallocate + * size = writer.size + BUF_SIZE + * if writer.buf == BUFFER: # <<<<<<<<<<<<<< + * buf = PyMem_Malloc(size) + * if buf == NULL: + */ + goto __pyx_L4; + } + + /* "aiohttp/_http_writer.pyx":49 + * memcpy(buf, writer.buf, writer.size) + * else: + * buf = PyMem_Realloc(writer.buf, size) # <<<<<<<<<<<<<< + * if buf == NULL: + * PyErr_NoMemory() + */ + /*else*/ { + __pyx_v_buf = ((char *)PyMem_Realloc(__pyx_v_writer->buf, __pyx_v_size)); + + /* "aiohttp/_http_writer.pyx":50 + * else: + * buf = PyMem_Realloc(writer.buf, size) + * if buf == NULL: # <<<<<<<<<<<<<< + * PyErr_NoMemory() + * return -1 + */ + __pyx_t_1 = ((__pyx_v_buf == NULL) != 0); + if (__pyx_t_1) { + + /* "aiohttp/_http_writer.pyx":51 + * buf = PyMem_Realloc(writer.buf, size) + * if buf == NULL: + * PyErr_NoMemory() # <<<<<<<<<<<<<< + * return -1 + * writer.buf = buf + */ + __pyx_t_2 = PyErr_NoMemory(); if (unlikely(__pyx_t_2 == ((PyObject *)NULL))) __PYX_ERR(0, 51, __pyx_L1_error) + + /* "aiohttp/_http_writer.pyx":52 + * if buf == NULL: + * PyErr_NoMemory() + * return -1 # <<<<<<<<<<<<<< + * writer.buf = buf + * writer.size = size + */ + __pyx_r = -1; + goto __pyx_L0; + + /* "aiohttp/_http_writer.pyx":50 + * else: + * buf = PyMem_Realloc(writer.buf, size) + * if buf == NULL: # <<<<<<<<<<<<<< + * PyErr_NoMemory() + * return -1 + */ + } + } + __pyx_L4:; + + /* "aiohttp/_http_writer.pyx":53 + * PyErr_NoMemory() + * return -1 + * writer.buf = buf # <<<<<<<<<<<<<< + * writer.size = size + * writer.buf[writer.pos] = ch + */ + __pyx_v_writer->buf = __pyx_v_buf; + + /* "aiohttp/_http_writer.pyx":54 + * return -1 + * writer.buf = buf + * writer.size = size # <<<<<<<<<<<<<< + * writer.buf[writer.pos] = ch + * writer.pos += 1 + */ + __pyx_v_writer->size = __pyx_v_size; + + /* "aiohttp/_http_writer.pyx":39 + * cdef Py_ssize_t size + * + * if writer.pos == writer.size: # <<<<<<<<<<<<<< + * # reallocate + * size = writer.size + BUF_SIZE + */ + } + + /* "aiohttp/_http_writer.pyx":55 + * writer.buf = buf + * writer.size = size + * writer.buf[writer.pos] = ch # <<<<<<<<<<<<<< + * writer.pos += 1 + * return 0 + */ + (__pyx_v_writer->buf[__pyx_v_writer->pos]) = ((char)__pyx_v_ch); + + /* "aiohttp/_http_writer.pyx":56 + * writer.size = size + * writer.buf[writer.pos] = ch + * writer.pos += 1 # <<<<<<<<<<<<<< + * return 0 + * + */ + __pyx_v_writer->pos = (__pyx_v_writer->pos + 1); + + /* "aiohttp/_http_writer.pyx":57 + * writer.buf[writer.pos] = ch + * writer.pos += 1 + * return 0 # <<<<<<<<<<<<<< + * + * + */ + __pyx_r = 0; + goto __pyx_L0; + + /* "aiohttp/_http_writer.pyx":35 + * + * + * cdef inline int _write_byte(Writer* writer, uint8_t ch): # <<<<<<<<<<<<<< + * cdef char * buf + * cdef Py_ssize_t size + */ + + /* function exit code */ + __pyx_L1_error:; + __Pyx_WriteUnraisable("aiohttp._http_writer._write_byte", __pyx_clineno, __pyx_lineno, __pyx_filename, 1, 0); + __pyx_r = 0; + __pyx_L0:; + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +/* "aiohttp/_http_writer.pyx":60 + * + * + * cdef inline int _write_utf8(Writer* writer, Py_UCS4 symbol): # <<<<<<<<<<<<<< + * cdef uint64_t utf = symbol + * + */ + +static CYTHON_INLINE int __pyx_f_7aiohttp_12_http_writer__write_utf8(struct __pyx_t_7aiohttp_12_http_writer_Writer *__pyx_v_writer, Py_UCS4 __pyx_v_symbol) { + uint64_t __pyx_v_utf; + int __pyx_r; + __Pyx_RefNannyDeclarations + int __pyx_t_1; + int __pyx_t_2; + __Pyx_RefNannySetupContext("_write_utf8", 0); + + /* "aiohttp/_http_writer.pyx":61 + * + * cdef inline int _write_utf8(Writer* writer, Py_UCS4 symbol): + * cdef uint64_t utf = symbol # <<<<<<<<<<<<<< + * + * if utf < 0x80: + */ + __pyx_v_utf = ((uint64_t)__pyx_v_symbol); + + /* "aiohttp/_http_writer.pyx":63 + * cdef uint64_t utf = symbol + * + * if utf < 0x80: # <<<<<<<<<<<<<< + * return _write_byte(writer, utf) + * elif utf < 0x800: + */ + __pyx_t_1 = ((__pyx_v_utf < 0x80) != 0); + if (__pyx_t_1) { + + /* "aiohttp/_http_writer.pyx":64 + * + * if utf < 0x80: + * return _write_byte(writer, utf) # <<<<<<<<<<<<<< + * elif utf < 0x800: + * if _write_byte(writer, (0xc0 | (utf >> 6))) < 0: + */ + __pyx_r = __pyx_f_7aiohttp_12_http_writer__write_byte(__pyx_v_writer, ((uint8_t)__pyx_v_utf)); + goto __pyx_L0; + + /* "aiohttp/_http_writer.pyx":63 + * cdef uint64_t utf = symbol + * + * if utf < 0x80: # <<<<<<<<<<<<<< + * return _write_byte(writer, utf) + * elif utf < 0x800: + */ + } + + /* "aiohttp/_http_writer.pyx":65 + * if utf < 0x80: + * return _write_byte(writer, utf) + * elif utf < 0x800: # <<<<<<<<<<<<<< + * if _write_byte(writer, (0xc0 | (utf >> 6))) < 0: + * return -1 + */ + __pyx_t_1 = ((__pyx_v_utf < 0x800) != 0); + if (__pyx_t_1) { + + /* "aiohttp/_http_writer.pyx":66 + * return _write_byte(writer, utf) + * elif utf < 0x800: + * if _write_byte(writer, (0xc0 | (utf >> 6))) < 0: # <<<<<<<<<<<<<< + * return -1 + * return _write_byte(writer, (0x80 | (utf & 0x3f))) + */ + __pyx_t_1 = ((__pyx_f_7aiohttp_12_http_writer__write_byte(__pyx_v_writer, ((uint8_t)(0xc0 | (__pyx_v_utf >> 6)))) < 0) != 0); + if (__pyx_t_1) { + + /* "aiohttp/_http_writer.pyx":67 + * elif utf < 0x800: + * if _write_byte(writer, (0xc0 | (utf >> 6))) < 0: + * return -1 # <<<<<<<<<<<<<< + * return _write_byte(writer, (0x80 | (utf & 0x3f))) + * elif 0xD800 <= utf <= 0xDFFF: + */ + __pyx_r = -1; + goto __pyx_L0; + + /* "aiohttp/_http_writer.pyx":66 + * return _write_byte(writer, utf) + * elif utf < 0x800: + * if _write_byte(writer, (0xc0 | (utf >> 6))) < 0: # <<<<<<<<<<<<<< + * return -1 + * return _write_byte(writer, (0x80 | (utf & 0x3f))) + */ + } + + /* "aiohttp/_http_writer.pyx":68 + * if _write_byte(writer, (0xc0 | (utf >> 6))) < 0: + * return -1 + * return _write_byte(writer, (0x80 | (utf & 0x3f))) # <<<<<<<<<<<<<< + * elif 0xD800 <= utf <= 0xDFFF: + * # surogate pair, ignored + */ + __pyx_r = __pyx_f_7aiohttp_12_http_writer__write_byte(__pyx_v_writer, ((uint8_t)(0x80 | (__pyx_v_utf & 0x3f)))); + goto __pyx_L0; + + /* "aiohttp/_http_writer.pyx":65 + * if utf < 0x80: + * return _write_byte(writer, utf) + * elif utf < 0x800: # <<<<<<<<<<<<<< + * if _write_byte(writer, (0xc0 | (utf >> 6))) < 0: + * return -1 + */ + } + + /* "aiohttp/_http_writer.pyx":69 + * return -1 + * return _write_byte(writer, (0x80 | (utf & 0x3f))) + * elif 0xD800 <= utf <= 0xDFFF: # <<<<<<<<<<<<<< + * # surogate pair, ignored + * return 0 + */ + __pyx_t_1 = (0xD800 <= __pyx_v_utf); + if (__pyx_t_1) { + __pyx_t_1 = (__pyx_v_utf <= 0xDFFF); + } + __pyx_t_2 = (__pyx_t_1 != 0); + if (__pyx_t_2) { + + /* "aiohttp/_http_writer.pyx":71 + * elif 0xD800 <= utf <= 0xDFFF: + * # surogate pair, ignored + * return 0 # <<<<<<<<<<<<<< + * elif utf < 0x10000: + * if _write_byte(writer, (0xe0 | (utf >> 12))) < 0: + */ + __pyx_r = 0; + goto __pyx_L0; + + /* "aiohttp/_http_writer.pyx":69 + * return -1 + * return _write_byte(writer, (0x80 | (utf & 0x3f))) + * elif 0xD800 <= utf <= 0xDFFF: # <<<<<<<<<<<<<< + * # surogate pair, ignored + * return 0 + */ + } + + /* "aiohttp/_http_writer.pyx":72 + * # surogate pair, ignored + * return 0 + * elif utf < 0x10000: # <<<<<<<<<<<<<< + * if _write_byte(writer, (0xe0 | (utf >> 12))) < 0: + * return -1 + */ + __pyx_t_2 = ((__pyx_v_utf < 0x10000) != 0); + if (__pyx_t_2) { + + /* "aiohttp/_http_writer.pyx":73 + * return 0 + * elif utf < 0x10000: + * if _write_byte(writer, (0xe0 | (utf >> 12))) < 0: # <<<<<<<<<<<<<< + * return -1 + * if _write_byte(writer, (0x80 | ((utf >> 6) & 0x3f))) < 0: + */ + __pyx_t_2 = ((__pyx_f_7aiohttp_12_http_writer__write_byte(__pyx_v_writer, ((uint8_t)(0xe0 | (__pyx_v_utf >> 12)))) < 0) != 0); + if (__pyx_t_2) { + + /* "aiohttp/_http_writer.pyx":74 + * elif utf < 0x10000: + * if _write_byte(writer, (0xe0 | (utf >> 12))) < 0: + * return -1 # <<<<<<<<<<<<<< + * if _write_byte(writer, (0x80 | ((utf >> 6) & 0x3f))) < 0: + * return -1 + */ + __pyx_r = -1; + goto __pyx_L0; + + /* "aiohttp/_http_writer.pyx":73 + * return 0 + * elif utf < 0x10000: + * if _write_byte(writer, (0xe0 | (utf >> 12))) < 0: # <<<<<<<<<<<<<< + * return -1 + * if _write_byte(writer, (0x80 | ((utf >> 6) & 0x3f))) < 0: + */ + } + + /* "aiohttp/_http_writer.pyx":75 + * if _write_byte(writer, (0xe0 | (utf >> 12))) < 0: + * return -1 + * if _write_byte(writer, (0x80 | ((utf >> 6) & 0x3f))) < 0: # <<<<<<<<<<<<<< + * return -1 + * return _write_byte(writer, (0x80 | (utf & 0x3f))) + */ + __pyx_t_2 = ((__pyx_f_7aiohttp_12_http_writer__write_byte(__pyx_v_writer, ((uint8_t)(0x80 | ((__pyx_v_utf >> 6) & 0x3f)))) < 0) != 0); + if (__pyx_t_2) { + + /* "aiohttp/_http_writer.pyx":76 + * return -1 + * if _write_byte(writer, (0x80 | ((utf >> 6) & 0x3f))) < 0: + * return -1 # <<<<<<<<<<<<<< + * return _write_byte(writer, (0x80 | (utf & 0x3f))) + * elif utf > 0x10FFFF: + */ + __pyx_r = -1; + goto __pyx_L0; + + /* "aiohttp/_http_writer.pyx":75 + * if _write_byte(writer, (0xe0 | (utf >> 12))) < 0: + * return -1 + * if _write_byte(writer, (0x80 | ((utf >> 6) & 0x3f))) < 0: # <<<<<<<<<<<<<< + * return -1 + * return _write_byte(writer, (0x80 | (utf & 0x3f))) + */ + } + + /* "aiohttp/_http_writer.pyx":77 + * if _write_byte(writer, (0x80 | ((utf >> 6) & 0x3f))) < 0: + * return -1 + * return _write_byte(writer, (0x80 | (utf & 0x3f))) # <<<<<<<<<<<<<< + * elif utf > 0x10FFFF: + * # symbol is too large + */ + __pyx_r = __pyx_f_7aiohttp_12_http_writer__write_byte(__pyx_v_writer, ((uint8_t)(0x80 | (__pyx_v_utf & 0x3f)))); + goto __pyx_L0; + + /* "aiohttp/_http_writer.pyx":72 + * # surogate pair, ignored + * return 0 + * elif utf < 0x10000: # <<<<<<<<<<<<<< + * if _write_byte(writer, (0xe0 | (utf >> 12))) < 0: + * return -1 + */ + } + + /* "aiohttp/_http_writer.pyx":78 + * return -1 + * return _write_byte(writer, (0x80 | (utf & 0x3f))) + * elif utf > 0x10FFFF: # <<<<<<<<<<<<<< + * # symbol is too large + * return 0 + */ + __pyx_t_2 = ((__pyx_v_utf > 0x10FFFF) != 0); + if (__pyx_t_2) { + + /* "aiohttp/_http_writer.pyx":80 + * elif utf > 0x10FFFF: + * # symbol is too large + * return 0 # <<<<<<<<<<<<<< + * else: + * if _write_byte(writer, (0xf0 | (utf >> 18))) < 0: + */ + __pyx_r = 0; + goto __pyx_L0; + + /* "aiohttp/_http_writer.pyx":78 + * return -1 + * return _write_byte(writer, (0x80 | (utf & 0x3f))) + * elif utf > 0x10FFFF: # <<<<<<<<<<<<<< + * # symbol is too large + * return 0 + */ + } + + /* "aiohttp/_http_writer.pyx":82 + * return 0 + * else: + * if _write_byte(writer, (0xf0 | (utf >> 18))) < 0: # <<<<<<<<<<<<<< + * return -1 + * if _write_byte(writer, + */ + /*else*/ { + __pyx_t_2 = ((__pyx_f_7aiohttp_12_http_writer__write_byte(__pyx_v_writer, ((uint8_t)(0xf0 | (__pyx_v_utf >> 18)))) < 0) != 0); + if (__pyx_t_2) { + + /* "aiohttp/_http_writer.pyx":83 + * else: + * if _write_byte(writer, (0xf0 | (utf >> 18))) < 0: + * return -1 # <<<<<<<<<<<<<< + * if _write_byte(writer, + * (0x80 | ((utf >> 12) & 0x3f))) < 0: + */ + __pyx_r = -1; + goto __pyx_L0; + + /* "aiohttp/_http_writer.pyx":82 + * return 0 + * else: + * if _write_byte(writer, (0xf0 | (utf >> 18))) < 0: # <<<<<<<<<<<<<< + * return -1 + * if _write_byte(writer, + */ + } + + /* "aiohttp/_http_writer.pyx":85 + * return -1 + * if _write_byte(writer, + * (0x80 | ((utf >> 12) & 0x3f))) < 0: # <<<<<<<<<<<<<< + * return -1 + * if _write_byte(writer, + */ + __pyx_t_2 = ((__pyx_f_7aiohttp_12_http_writer__write_byte(__pyx_v_writer, ((uint8_t)(0x80 | ((__pyx_v_utf >> 12) & 0x3f)))) < 0) != 0); + + /* "aiohttp/_http_writer.pyx":84 + * if _write_byte(writer, (0xf0 | (utf >> 18))) < 0: + * return -1 + * if _write_byte(writer, # <<<<<<<<<<<<<< + * (0x80 | ((utf >> 12) & 0x3f))) < 0: + * return -1 + */ + if (__pyx_t_2) { + + /* "aiohttp/_http_writer.pyx":86 + * if _write_byte(writer, + * (0x80 | ((utf >> 12) & 0x3f))) < 0: + * return -1 # <<<<<<<<<<<<<< + * if _write_byte(writer, + * (0x80 | ((utf >> 6) & 0x3f))) < 0: + */ + __pyx_r = -1; + goto __pyx_L0; + + /* "aiohttp/_http_writer.pyx":84 + * if _write_byte(writer, (0xf0 | (utf >> 18))) < 0: + * return -1 + * if _write_byte(writer, # <<<<<<<<<<<<<< + * (0x80 | ((utf >> 12) & 0x3f))) < 0: + * return -1 + */ + } + + /* "aiohttp/_http_writer.pyx":88 + * return -1 + * if _write_byte(writer, + * (0x80 | ((utf >> 6) & 0x3f))) < 0: # <<<<<<<<<<<<<< + * return -1 + * return _write_byte(writer, (0x80 | (utf & 0x3f))) + */ + __pyx_t_2 = ((__pyx_f_7aiohttp_12_http_writer__write_byte(__pyx_v_writer, ((uint8_t)(0x80 | ((__pyx_v_utf >> 6) & 0x3f)))) < 0) != 0); + + /* "aiohttp/_http_writer.pyx":87 + * (0x80 | ((utf >> 12) & 0x3f))) < 0: + * return -1 + * if _write_byte(writer, # <<<<<<<<<<<<<< + * (0x80 | ((utf >> 6) & 0x3f))) < 0: + * return -1 + */ + if (__pyx_t_2) { + + /* "aiohttp/_http_writer.pyx":89 + * if _write_byte(writer, + * (0x80 | ((utf >> 6) & 0x3f))) < 0: + * return -1 # <<<<<<<<<<<<<< + * return _write_byte(writer, (0x80 | (utf & 0x3f))) + * + */ + __pyx_r = -1; + goto __pyx_L0; + + /* "aiohttp/_http_writer.pyx":87 + * (0x80 | ((utf >> 12) & 0x3f))) < 0: + * return -1 + * if _write_byte(writer, # <<<<<<<<<<<<<< + * (0x80 | ((utf >> 6) & 0x3f))) < 0: + * return -1 + */ + } + + /* "aiohttp/_http_writer.pyx":90 + * (0x80 | ((utf >> 6) & 0x3f))) < 0: + * return -1 + * return _write_byte(writer, (0x80 | (utf & 0x3f))) # <<<<<<<<<<<<<< + * + * + */ + __pyx_r = __pyx_f_7aiohttp_12_http_writer__write_byte(__pyx_v_writer, ((uint8_t)(0x80 | (__pyx_v_utf & 0x3f)))); + goto __pyx_L0; + } + + /* "aiohttp/_http_writer.pyx":60 + * + * + * cdef inline int _write_utf8(Writer* writer, Py_UCS4 symbol): # <<<<<<<<<<<<<< + * cdef uint64_t utf = symbol + * + */ + + /* function exit code */ + __pyx_L0:; + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +/* "aiohttp/_http_writer.pyx":93 + * + * + * cdef inline int _write_str(Writer* writer, str s): # <<<<<<<<<<<<<< + * cdef Py_UCS4 ch + * for ch in s: + */ + +static CYTHON_INLINE int __pyx_f_7aiohttp_12_http_writer__write_str(struct __pyx_t_7aiohttp_12_http_writer_Writer *__pyx_v_writer, PyObject *__pyx_v_s) { + Py_UCS4 __pyx_v_ch; + int __pyx_r; + __Pyx_RefNannyDeclarations + PyObject *__pyx_t_1 = NULL; + Py_ssize_t __pyx_t_2; + Py_ssize_t __pyx_t_3; + void *__pyx_t_4; + int __pyx_t_5; + int __pyx_t_6; + Py_ssize_t __pyx_t_7; + int __pyx_t_8; + int __pyx_lineno = 0; + const char *__pyx_filename = NULL; + int __pyx_clineno = 0; + __Pyx_RefNannySetupContext("_write_str", 0); + + /* "aiohttp/_http_writer.pyx":95 + * cdef inline int _write_str(Writer* writer, str s): + * cdef Py_UCS4 ch + * for ch in s: # <<<<<<<<<<<<<< + * if _write_utf8(writer, ch) < 0: + * return -1 + */ + if (unlikely(__pyx_v_s == Py_None)) { + PyErr_SetString(PyExc_TypeError, "'NoneType' is not iterable"); + __PYX_ERR(0, 95, __pyx_L1_error) + } + __Pyx_INCREF(__pyx_v_s); + __pyx_t_1 = __pyx_v_s; + __pyx_t_6 = __Pyx_init_unicode_iteration(__pyx_t_1, (&__pyx_t_3), (&__pyx_t_4), (&__pyx_t_5)); if (unlikely(__pyx_t_6 == ((int)-1))) __PYX_ERR(0, 95, __pyx_L1_error) + for (__pyx_t_7 = 0; __pyx_t_7 < __pyx_t_3; __pyx_t_7++) { + __pyx_t_2 = __pyx_t_7; + __pyx_v_ch = __Pyx_PyUnicode_READ(__pyx_t_5, __pyx_t_4, __pyx_t_2); + + /* "aiohttp/_http_writer.pyx":96 + * cdef Py_UCS4 ch + * for ch in s: + * if _write_utf8(writer, ch) < 0: # <<<<<<<<<<<<<< + * return -1 + * + */ + __pyx_t_8 = ((__pyx_f_7aiohttp_12_http_writer__write_utf8(__pyx_v_writer, __pyx_v_ch) < 0) != 0); + if (__pyx_t_8) { + + /* "aiohttp/_http_writer.pyx":97 + * for ch in s: + * if _write_utf8(writer, ch) < 0: + * return -1 # <<<<<<<<<<<<<< + * + * + */ + __pyx_r = -1; + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + goto __pyx_L0; + + /* "aiohttp/_http_writer.pyx":96 + * cdef Py_UCS4 ch + * for ch in s: + * if _write_utf8(writer, ch) < 0: # <<<<<<<<<<<<<< + * return -1 + * + */ + } + } + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + + /* "aiohttp/_http_writer.pyx":93 + * + * + * cdef inline int _write_str(Writer* writer, str s): # <<<<<<<<<<<<<< + * cdef Py_UCS4 ch + * for ch in s: + */ + + /* function exit code */ + __pyx_r = 0; + goto __pyx_L0; + __pyx_L1_error:; + __Pyx_XDECREF(__pyx_t_1); + __Pyx_WriteUnraisable("aiohttp._http_writer._write_str", __pyx_clineno, __pyx_lineno, __pyx_filename, 1, 0); + __pyx_r = 0; + __pyx_L0:; + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +/* "aiohttp/_http_writer.pyx":102 + * # --------------- _serialize_headers ---------------------- + * + * cdef str to_str(object s): # <<<<<<<<<<<<<< + * typ = type(s) + * if typ is str: + */ + +static PyObject *__pyx_f_7aiohttp_12_http_writer_to_str(PyObject *__pyx_v_s) { + PyTypeObject *__pyx_v_typ = NULL; + PyObject *__pyx_r = NULL; + __Pyx_RefNannyDeclarations + int __pyx_t_1; + int __pyx_t_2; + PyObject *__pyx_t_3 = NULL; + PyObject *__pyx_t_4 = NULL; + PyObject *__pyx_t_5 = NULL; + int __pyx_lineno = 0; + const char *__pyx_filename = NULL; + int __pyx_clineno = 0; + __Pyx_RefNannySetupContext("to_str", 0); + + /* "aiohttp/_http_writer.pyx":103 + * + * cdef str to_str(object s): + * typ = type(s) # <<<<<<<<<<<<<< + * if typ is str: + * return s + */ + __Pyx_INCREF(((PyObject *)Py_TYPE(__pyx_v_s))); + __pyx_v_typ = ((PyTypeObject*)((PyObject *)Py_TYPE(__pyx_v_s))); + + /* "aiohttp/_http_writer.pyx":104 + * cdef str to_str(object s): + * typ = type(s) + * if typ is str: # <<<<<<<<<<<<<< + * return s + * elif typ is _istr: + */ + __pyx_t_1 = (__pyx_v_typ == (&PyUnicode_Type)); + __pyx_t_2 = (__pyx_t_1 != 0); + if (__pyx_t_2) { + + /* "aiohttp/_http_writer.pyx":105 + * typ = type(s) + * if typ is str: + * return s # <<<<<<<<<<<<<< + * elif typ is _istr: + * return PyObject_Str(s) + */ + __Pyx_XDECREF(__pyx_r); + __Pyx_INCREF(((PyObject*)__pyx_v_s)); + __pyx_r = ((PyObject*)__pyx_v_s); + goto __pyx_L0; + + /* "aiohttp/_http_writer.pyx":104 + * cdef str to_str(object s): + * typ = type(s) + * if typ is str: # <<<<<<<<<<<<<< + * return s + * elif typ is _istr: + */ + } + + /* "aiohttp/_http_writer.pyx":106 + * if typ is str: + * return s + * elif typ is _istr: # <<<<<<<<<<<<<< + * return PyObject_Str(s) + * elif not isinstance(s, str): + */ + __pyx_t_2 = (__pyx_v_typ == ((PyTypeObject*)__pyx_v_7aiohttp_12_http_writer__istr)); + __pyx_t_1 = (__pyx_t_2 != 0); + if (__pyx_t_1) { + + /* "aiohttp/_http_writer.pyx":107 + * return s + * elif typ is _istr: + * return PyObject_Str(s) # <<<<<<<<<<<<<< + * elif not isinstance(s, str): + * raise TypeError("Cannot serialize non-str key {!r}".format(s)) + */ + __Pyx_XDECREF(__pyx_r); + __pyx_t_3 = PyObject_Str(__pyx_v_s); if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 107, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_3); + if (!(likely(PyUnicode_CheckExact(__pyx_t_3))||((__pyx_t_3) == Py_None)||(PyErr_Format(PyExc_TypeError, "Expected %.16s, got %.200s", "unicode", Py_TYPE(__pyx_t_3)->tp_name), 0))) __PYX_ERR(0, 107, __pyx_L1_error) + __pyx_r = ((PyObject*)__pyx_t_3); + __pyx_t_3 = 0; + goto __pyx_L0; + + /* "aiohttp/_http_writer.pyx":106 + * if typ is str: + * return s + * elif typ is _istr: # <<<<<<<<<<<<<< + * return PyObject_Str(s) + * elif not isinstance(s, str): + */ + } + + /* "aiohttp/_http_writer.pyx":108 + * elif typ is _istr: + * return PyObject_Str(s) + * elif not isinstance(s, str): # <<<<<<<<<<<<<< + * raise TypeError("Cannot serialize non-str key {!r}".format(s)) + * else: + */ + __pyx_t_1 = PyUnicode_Check(__pyx_v_s); + __pyx_t_2 = ((!(__pyx_t_1 != 0)) != 0); + if (unlikely(__pyx_t_2)) { + + /* "aiohttp/_http_writer.pyx":109 + * return PyObject_Str(s) + * elif not isinstance(s, str): + * raise TypeError("Cannot serialize non-str key {!r}".format(s)) # <<<<<<<<<<<<<< + * else: + * return str(s) + */ + __pyx_t_4 = __Pyx_PyObject_GetAttrStr(__pyx_kp_u_Cannot_serialize_non_str_key_r, __pyx_n_s_format); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 109, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_4); + __pyx_t_5 = NULL; + if (CYTHON_UNPACK_METHODS && likely(PyMethod_Check(__pyx_t_4))) { + __pyx_t_5 = PyMethod_GET_SELF(__pyx_t_4); + if (likely(__pyx_t_5)) { + PyObject* function = PyMethod_GET_FUNCTION(__pyx_t_4); + __Pyx_INCREF(__pyx_t_5); + __Pyx_INCREF(function); + __Pyx_DECREF_SET(__pyx_t_4, function); + } + } + __pyx_t_3 = (__pyx_t_5) ? __Pyx_PyObject_Call2Args(__pyx_t_4, __pyx_t_5, __pyx_v_s) : __Pyx_PyObject_CallOneArg(__pyx_t_4, __pyx_v_s); + __Pyx_XDECREF(__pyx_t_5); __pyx_t_5 = 0; + if (unlikely(!__pyx_t_3)) __PYX_ERR(0, 109, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_3); + __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; + __pyx_t_4 = __Pyx_PyObject_CallOneArg(__pyx_builtin_TypeError, __pyx_t_3); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 109, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_4); + __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; + __Pyx_Raise(__pyx_t_4, 0, 0, 0); + __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; + __PYX_ERR(0, 109, __pyx_L1_error) + + /* "aiohttp/_http_writer.pyx":108 + * elif typ is _istr: + * return PyObject_Str(s) + * elif not isinstance(s, str): # <<<<<<<<<<<<<< + * raise TypeError("Cannot serialize non-str key {!r}".format(s)) + * else: + */ + } + + /* "aiohttp/_http_writer.pyx":111 + * raise TypeError("Cannot serialize non-str key {!r}".format(s)) + * else: + * return str(s) # <<<<<<<<<<<<<< + * + * + */ + /*else*/ { + __Pyx_XDECREF(__pyx_r); + __pyx_t_4 = __Pyx_PyObject_CallOneArg(((PyObject *)(&PyUnicode_Type)), __pyx_v_s); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 111, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_4); + __pyx_r = ((PyObject*)__pyx_t_4); + __pyx_t_4 = 0; + goto __pyx_L0; + } + + /* "aiohttp/_http_writer.pyx":102 + * # --------------- _serialize_headers ---------------------- + * + * cdef str to_str(object s): # <<<<<<<<<<<<<< + * typ = type(s) + * if typ is str: + */ + + /* function exit code */ + __pyx_L1_error:; + __Pyx_XDECREF(__pyx_t_3); + __Pyx_XDECREF(__pyx_t_4); + __Pyx_XDECREF(__pyx_t_5); + __Pyx_AddTraceback("aiohttp._http_writer.to_str", __pyx_clineno, __pyx_lineno, __pyx_filename); + __pyx_r = 0; + __pyx_L0:; + __Pyx_XDECREF(__pyx_v_typ); + __Pyx_XGIVEREF(__pyx_r); + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +/* "aiohttp/_http_writer.pyx":114 + * + * + * cdef void _safe_header(str string) except *: # <<<<<<<<<<<<<< + * if "\r" in string or "\n" in string: + * raise ValueError( + */ + +static void __pyx_f_7aiohttp_12_http_writer__safe_header(PyObject *__pyx_v_string) { + __Pyx_RefNannyDeclarations + int __pyx_t_1; + int __pyx_t_2; + int __pyx_t_3; + PyObject *__pyx_t_4 = NULL; + int __pyx_lineno = 0; + const char *__pyx_filename = NULL; + int __pyx_clineno = 0; + __Pyx_RefNannySetupContext("_safe_header", 0); + + /* "aiohttp/_http_writer.pyx":115 + * + * cdef void _safe_header(str string) except *: + * if "\r" in string or "\n" in string: # <<<<<<<<<<<<<< + * raise ValueError( + * "Newline or carriage return character detected in HTTP status message or " + */ + if (unlikely(__pyx_v_string == Py_None)) { + PyErr_SetString(PyExc_TypeError, "'NoneType' object is not iterable"); + __PYX_ERR(0, 115, __pyx_L1_error) + } + __pyx_t_2 = (__Pyx_PyUnicode_ContainsTF(__pyx_kp_u_, __pyx_v_string, Py_EQ)); if (unlikely(__pyx_t_2 < 0)) __PYX_ERR(0, 115, __pyx_L1_error) + __pyx_t_3 = (__pyx_t_2 != 0); + if (!__pyx_t_3) { + } else { + __pyx_t_1 = __pyx_t_3; + goto __pyx_L4_bool_binop_done; + } + if (unlikely(__pyx_v_string == Py_None)) { + PyErr_SetString(PyExc_TypeError, "'NoneType' object is not iterable"); + __PYX_ERR(0, 115, __pyx_L1_error) + } + __pyx_t_3 = (__Pyx_PyUnicode_ContainsTF(__pyx_kp_u__2, __pyx_v_string, Py_EQ)); if (unlikely(__pyx_t_3 < 0)) __PYX_ERR(0, 115, __pyx_L1_error) + __pyx_t_2 = (__pyx_t_3 != 0); + __pyx_t_1 = __pyx_t_2; + __pyx_L4_bool_binop_done:; + if (unlikely(__pyx_t_1)) { + + /* "aiohttp/_http_writer.pyx":116 + * cdef void _safe_header(str string) except *: + * if "\r" in string or "\n" in string: + * raise ValueError( # <<<<<<<<<<<<<< + * "Newline or carriage return character detected in HTTP status message or " + * "header. This is a potential security issue." + */ + __pyx_t_4 = __Pyx_PyObject_Call(__pyx_builtin_ValueError, __pyx_tuple__3, NULL); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 116, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_4); + __Pyx_Raise(__pyx_t_4, 0, 0, 0); + __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; + __PYX_ERR(0, 116, __pyx_L1_error) + + /* "aiohttp/_http_writer.pyx":115 + * + * cdef void _safe_header(str string) except *: + * if "\r" in string or "\n" in string: # <<<<<<<<<<<<<< + * raise ValueError( + * "Newline or carriage return character detected in HTTP status message or " + */ + } + + /* "aiohttp/_http_writer.pyx":114 + * + * + * cdef void _safe_header(str string) except *: # <<<<<<<<<<<<<< + * if "\r" in string or "\n" in string: + * raise ValueError( + */ + + /* function exit code */ + goto __pyx_L0; + __pyx_L1_error:; + __Pyx_XDECREF(__pyx_t_4); + __Pyx_AddTraceback("aiohttp._http_writer._safe_header", __pyx_clineno, __pyx_lineno, __pyx_filename); + __pyx_L0:; + __Pyx_RefNannyFinishContext(); +} + +/* "aiohttp/_http_writer.pyx":122 + * + * + * def _serialize_headers(str status_line, headers): # <<<<<<<<<<<<<< + * cdef Writer writer + * cdef object key + */ + +/* Python wrapper */ +static PyObject *__pyx_pw_7aiohttp_12_http_writer_1_serialize_headers(PyObject *__pyx_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/ +static PyMethodDef __pyx_mdef_7aiohttp_12_http_writer_1_serialize_headers = {"_serialize_headers", (PyCFunction)(void*)(PyCFunctionWithKeywords)__pyx_pw_7aiohttp_12_http_writer_1_serialize_headers, METH_VARARGS|METH_KEYWORDS, 0}; +static PyObject *__pyx_pw_7aiohttp_12_http_writer_1_serialize_headers(PyObject *__pyx_self, PyObject *__pyx_args, PyObject *__pyx_kwds) { + PyObject *__pyx_v_status_line = 0; + PyObject *__pyx_v_headers = 0; + int __pyx_lineno = 0; + const char *__pyx_filename = NULL; + int __pyx_clineno = 0; + PyObject *__pyx_r = 0; + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("_serialize_headers (wrapper)", 0); + { + static PyObject **__pyx_pyargnames[] = {&__pyx_n_s_status_line,&__pyx_n_s_headers,0}; + PyObject* values[2] = {0,0}; + if (unlikely(__pyx_kwds)) { + Py_ssize_t kw_args; + const Py_ssize_t pos_args = PyTuple_GET_SIZE(__pyx_args); + switch (pos_args) { + case 2: values[1] = PyTuple_GET_ITEM(__pyx_args, 1); + CYTHON_FALLTHROUGH; + case 1: values[0] = PyTuple_GET_ITEM(__pyx_args, 0); + CYTHON_FALLTHROUGH; + case 0: break; + default: goto __pyx_L5_argtuple_error; + } + kw_args = PyDict_Size(__pyx_kwds); + switch (pos_args) { + case 0: + if (likely((values[0] = __Pyx_PyDict_GetItemStr(__pyx_kwds, __pyx_n_s_status_line)) != 0)) kw_args--; + else goto __pyx_L5_argtuple_error; + CYTHON_FALLTHROUGH; + case 1: + if (likely((values[1] = __Pyx_PyDict_GetItemStr(__pyx_kwds, __pyx_n_s_headers)) != 0)) kw_args--; + else { + __Pyx_RaiseArgtupleInvalid("_serialize_headers", 1, 2, 2, 1); __PYX_ERR(0, 122, __pyx_L3_error) + } + } + if (unlikely(kw_args > 0)) { + if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, pos_args, "_serialize_headers") < 0)) __PYX_ERR(0, 122, __pyx_L3_error) + } + } else if (PyTuple_GET_SIZE(__pyx_args) != 2) { + goto __pyx_L5_argtuple_error; + } else { + values[0] = PyTuple_GET_ITEM(__pyx_args, 0); + values[1] = PyTuple_GET_ITEM(__pyx_args, 1); + } + __pyx_v_status_line = ((PyObject*)values[0]); + __pyx_v_headers = values[1]; + } + goto __pyx_L4_argument_unpacking_done; + __pyx_L5_argtuple_error:; + __Pyx_RaiseArgtupleInvalid("_serialize_headers", 1, 2, 2, PyTuple_GET_SIZE(__pyx_args)); __PYX_ERR(0, 122, __pyx_L3_error) + __pyx_L3_error:; + __Pyx_AddTraceback("aiohttp._http_writer._serialize_headers", __pyx_clineno, __pyx_lineno, __pyx_filename); + __Pyx_RefNannyFinishContext(); + return NULL; + __pyx_L4_argument_unpacking_done:; + if (unlikely(!__Pyx_ArgTypeTest(((PyObject *)__pyx_v_status_line), (&PyUnicode_Type), 1, "status_line", 1))) __PYX_ERR(0, 122, __pyx_L1_error) + __pyx_r = __pyx_pf_7aiohttp_12_http_writer__serialize_headers(__pyx_self, __pyx_v_status_line, __pyx_v_headers); + + /* function exit code */ + goto __pyx_L0; + __pyx_L1_error:; + __pyx_r = NULL; + __pyx_L0:; + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +static PyObject *__pyx_pf_7aiohttp_12_http_writer__serialize_headers(CYTHON_UNUSED PyObject *__pyx_self, PyObject *__pyx_v_status_line, PyObject *__pyx_v_headers) { + struct __pyx_t_7aiohttp_12_http_writer_Writer __pyx_v_writer; + PyObject *__pyx_v_key = 0; + PyObject *__pyx_v_val = 0; + PyObject *__pyx_r = NULL; + __Pyx_RefNannyDeclarations + PyObject *__pyx_t_1 = NULL; + Py_ssize_t __pyx_t_2; + Py_ssize_t __pyx_t_3; + int __pyx_t_4; + PyObject *__pyx_t_5 = NULL; + PyObject *__pyx_t_6 = NULL; + int __pyx_t_7; + int __pyx_t_8; + char const *__pyx_t_9; + PyObject *__pyx_t_10 = NULL; + PyObject *__pyx_t_11 = NULL; + PyObject *__pyx_t_12 = NULL; + PyObject *__pyx_t_13 = NULL; + PyObject *__pyx_t_14 = NULL; + PyObject *__pyx_t_15 = NULL; + int __pyx_lineno = 0; + const char *__pyx_filename = NULL; + int __pyx_clineno = 0; + __Pyx_RefNannySetupContext("_serialize_headers", 0); + + /* "aiohttp/_http_writer.pyx":128 + * cdef bytes ret + * + * _init_writer(&writer) # <<<<<<<<<<<<<< + * + * for key, val in headers.items(): + */ + __pyx_f_7aiohttp_12_http_writer__init_writer((&__pyx_v_writer)); + + /* "aiohttp/_http_writer.pyx":130 + * _init_writer(&writer) + * + * for key, val in headers.items(): # <<<<<<<<<<<<<< + * _safe_header(to_str(key)) + * _safe_header(to_str(val)) + */ + __pyx_t_2 = 0; + if (unlikely(__pyx_v_headers == Py_None)) { + PyErr_Format(PyExc_AttributeError, "'NoneType' object has no attribute '%.30s'", "items"); + __PYX_ERR(0, 130, __pyx_L1_error) + } + __pyx_t_5 = __Pyx_dict_iterator(__pyx_v_headers, 0, __pyx_n_s_items, (&__pyx_t_3), (&__pyx_t_4)); if (unlikely(!__pyx_t_5)) __PYX_ERR(0, 130, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_5); + __Pyx_XDECREF(__pyx_t_1); + __pyx_t_1 = __pyx_t_5; + __pyx_t_5 = 0; + while (1) { + __pyx_t_7 = __Pyx_dict_iter_next(__pyx_t_1, __pyx_t_3, &__pyx_t_2, &__pyx_t_5, &__pyx_t_6, NULL, __pyx_t_4); + if (unlikely(__pyx_t_7 == 0)) break; + if (unlikely(__pyx_t_7 == -1)) __PYX_ERR(0, 130, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_5); + __Pyx_GOTREF(__pyx_t_6); + __Pyx_XDECREF_SET(__pyx_v_key, __pyx_t_5); + __pyx_t_5 = 0; + __Pyx_XDECREF_SET(__pyx_v_val, __pyx_t_6); + __pyx_t_6 = 0; + + /* "aiohttp/_http_writer.pyx":131 + * + * for key, val in headers.items(): + * _safe_header(to_str(key)) # <<<<<<<<<<<<<< + * _safe_header(to_str(val)) + * + */ + __pyx_t_6 = __pyx_f_7aiohttp_12_http_writer_to_str(__pyx_v_key); if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 131, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_6); + __pyx_f_7aiohttp_12_http_writer__safe_header(((PyObject*)__pyx_t_6)); if (unlikely(PyErr_Occurred())) __PYX_ERR(0, 131, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0; + + /* "aiohttp/_http_writer.pyx":132 + * for key, val in headers.items(): + * _safe_header(to_str(key)) + * _safe_header(to_str(val)) # <<<<<<<<<<<<<< + * + * try: + */ + __pyx_t_6 = __pyx_f_7aiohttp_12_http_writer_to_str(__pyx_v_val); if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 132, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_6); + __pyx_f_7aiohttp_12_http_writer__safe_header(((PyObject*)__pyx_t_6)); if (unlikely(PyErr_Occurred())) __PYX_ERR(0, 132, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0; + } + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + + /* "aiohttp/_http_writer.pyx":134 + * _safe_header(to_str(val)) + * + * try: # <<<<<<<<<<<<<< + * if _write_str(&writer, status_line) < 0: + * raise + */ + /*try:*/ { + + /* "aiohttp/_http_writer.pyx":135 + * + * try: + * if _write_str(&writer, status_line) < 0: # <<<<<<<<<<<<<< + * raise + * if _write_byte(&writer, b'\r') < 0: + */ + __pyx_t_8 = ((__pyx_f_7aiohttp_12_http_writer__write_str((&__pyx_v_writer), __pyx_v_status_line) < 0) != 0); + if (unlikely(__pyx_t_8)) { + + /* "aiohttp/_http_writer.pyx":136 + * try: + * if _write_str(&writer, status_line) < 0: + * raise # <<<<<<<<<<<<<< + * if _write_byte(&writer, b'\r') < 0: + * raise + */ + __Pyx_ReraiseException(); __PYX_ERR(0, 136, __pyx_L6_error) + + /* "aiohttp/_http_writer.pyx":135 + * + * try: + * if _write_str(&writer, status_line) < 0: # <<<<<<<<<<<<<< + * raise + * if _write_byte(&writer, b'\r') < 0: + */ + } + + /* "aiohttp/_http_writer.pyx":137 + * if _write_str(&writer, status_line) < 0: + * raise + * if _write_byte(&writer, b'\r') < 0: # <<<<<<<<<<<<<< + * raise + * if _write_byte(&writer, b'\n') < 0: + */ + __pyx_t_8 = ((__pyx_f_7aiohttp_12_http_writer__write_byte((&__pyx_v_writer), '\r') < 0) != 0); + if (unlikely(__pyx_t_8)) { + + /* "aiohttp/_http_writer.pyx":138 + * raise + * if _write_byte(&writer, b'\r') < 0: + * raise # <<<<<<<<<<<<<< + * if _write_byte(&writer, b'\n') < 0: + * raise + */ + __Pyx_ReraiseException(); __PYX_ERR(0, 138, __pyx_L6_error) + + /* "aiohttp/_http_writer.pyx":137 + * if _write_str(&writer, status_line) < 0: + * raise + * if _write_byte(&writer, b'\r') < 0: # <<<<<<<<<<<<<< + * raise + * if _write_byte(&writer, b'\n') < 0: + */ + } + + /* "aiohttp/_http_writer.pyx":139 + * if _write_byte(&writer, b'\r') < 0: + * raise + * if _write_byte(&writer, b'\n') < 0: # <<<<<<<<<<<<<< + * raise + * + */ + __pyx_t_8 = ((__pyx_f_7aiohttp_12_http_writer__write_byte((&__pyx_v_writer), '\n') < 0) != 0); + if (unlikely(__pyx_t_8)) { + + /* "aiohttp/_http_writer.pyx":140 + * raise + * if _write_byte(&writer, b'\n') < 0: + * raise # <<<<<<<<<<<<<< + * + * for key, val in headers.items(): + */ + __Pyx_ReraiseException(); __PYX_ERR(0, 140, __pyx_L6_error) + + /* "aiohttp/_http_writer.pyx":139 + * if _write_byte(&writer, b'\r') < 0: + * raise + * if _write_byte(&writer, b'\n') < 0: # <<<<<<<<<<<<<< + * raise + * + */ + } + + /* "aiohttp/_http_writer.pyx":142 + * raise + * + * for key, val in headers.items(): # <<<<<<<<<<<<<< + * if _write_str(&writer, to_str(key)) < 0: + * raise + */ + __pyx_t_3 = 0; + if (unlikely(__pyx_v_headers == Py_None)) { + PyErr_Format(PyExc_AttributeError, "'NoneType' object has no attribute '%.30s'", "items"); + __PYX_ERR(0, 142, __pyx_L6_error) + } + __pyx_t_6 = __Pyx_dict_iterator(__pyx_v_headers, 0, __pyx_n_s_items, (&__pyx_t_2), (&__pyx_t_4)); if (unlikely(!__pyx_t_6)) __PYX_ERR(0, 142, __pyx_L6_error) + __Pyx_GOTREF(__pyx_t_6); + __Pyx_XDECREF(__pyx_t_1); + __pyx_t_1 = __pyx_t_6; + __pyx_t_6 = 0; + while (1) { + __pyx_t_7 = __Pyx_dict_iter_next(__pyx_t_1, __pyx_t_2, &__pyx_t_3, &__pyx_t_6, &__pyx_t_5, NULL, __pyx_t_4); + if (unlikely(__pyx_t_7 == 0)) break; + if (unlikely(__pyx_t_7 == -1)) __PYX_ERR(0, 142, __pyx_L6_error) + __Pyx_GOTREF(__pyx_t_6); + __Pyx_GOTREF(__pyx_t_5); + __Pyx_XDECREF_SET(__pyx_v_key, __pyx_t_6); + __pyx_t_6 = 0; + __Pyx_XDECREF_SET(__pyx_v_val, __pyx_t_5); + __pyx_t_5 = 0; + + /* "aiohttp/_http_writer.pyx":143 + * + * for key, val in headers.items(): + * if _write_str(&writer, to_str(key)) < 0: # <<<<<<<<<<<<<< + * raise + * if _write_byte(&writer, b':') < 0: + */ + __pyx_t_5 = __pyx_f_7aiohttp_12_http_writer_to_str(__pyx_v_key); if (unlikely(!__pyx_t_5)) __PYX_ERR(0, 143, __pyx_L6_error) + __Pyx_GOTREF(__pyx_t_5); + __pyx_t_8 = ((__pyx_f_7aiohttp_12_http_writer__write_str((&__pyx_v_writer), ((PyObject*)__pyx_t_5)) < 0) != 0); + __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0; + if (unlikely(__pyx_t_8)) { + + /* "aiohttp/_http_writer.pyx":144 + * for key, val in headers.items(): + * if _write_str(&writer, to_str(key)) < 0: + * raise # <<<<<<<<<<<<<< + * if _write_byte(&writer, b':') < 0: + * raise + */ + __Pyx_ReraiseException(); __PYX_ERR(0, 144, __pyx_L6_error) + + /* "aiohttp/_http_writer.pyx":143 + * + * for key, val in headers.items(): + * if _write_str(&writer, to_str(key)) < 0: # <<<<<<<<<<<<<< + * raise + * if _write_byte(&writer, b':') < 0: + */ + } + + /* "aiohttp/_http_writer.pyx":145 + * if _write_str(&writer, to_str(key)) < 0: + * raise + * if _write_byte(&writer, b':') < 0: # <<<<<<<<<<<<<< + * raise + * if _write_byte(&writer, b' ') < 0: + */ + __pyx_t_8 = ((__pyx_f_7aiohttp_12_http_writer__write_byte((&__pyx_v_writer), ':') < 0) != 0); + if (unlikely(__pyx_t_8)) { + + /* "aiohttp/_http_writer.pyx":146 + * raise + * if _write_byte(&writer, b':') < 0: + * raise # <<<<<<<<<<<<<< + * if _write_byte(&writer, b' ') < 0: + * raise + */ + __Pyx_ReraiseException(); __PYX_ERR(0, 146, __pyx_L6_error) + + /* "aiohttp/_http_writer.pyx":145 + * if _write_str(&writer, to_str(key)) < 0: + * raise + * if _write_byte(&writer, b':') < 0: # <<<<<<<<<<<<<< + * raise + * if _write_byte(&writer, b' ') < 0: + */ + } + + /* "aiohttp/_http_writer.pyx":147 + * if _write_byte(&writer, b':') < 0: + * raise + * if _write_byte(&writer, b' ') < 0: # <<<<<<<<<<<<<< + * raise + * if _write_str(&writer, to_str(val)) < 0: + */ + __pyx_t_8 = ((__pyx_f_7aiohttp_12_http_writer__write_byte((&__pyx_v_writer), ' ') < 0) != 0); + if (unlikely(__pyx_t_8)) { + + /* "aiohttp/_http_writer.pyx":148 + * raise + * if _write_byte(&writer, b' ') < 0: + * raise # <<<<<<<<<<<<<< + * if _write_str(&writer, to_str(val)) < 0: + * raise + */ + __Pyx_ReraiseException(); __PYX_ERR(0, 148, __pyx_L6_error) + + /* "aiohttp/_http_writer.pyx":147 + * if _write_byte(&writer, b':') < 0: + * raise + * if _write_byte(&writer, b' ') < 0: # <<<<<<<<<<<<<< + * raise + * if _write_str(&writer, to_str(val)) < 0: + */ + } + + /* "aiohttp/_http_writer.pyx":149 + * if _write_byte(&writer, b' ') < 0: + * raise + * if _write_str(&writer, to_str(val)) < 0: # <<<<<<<<<<<<<< + * raise + * if _write_byte(&writer, b'\r') < 0: + */ + __pyx_t_5 = __pyx_f_7aiohttp_12_http_writer_to_str(__pyx_v_val); if (unlikely(!__pyx_t_5)) __PYX_ERR(0, 149, __pyx_L6_error) + __Pyx_GOTREF(__pyx_t_5); + __pyx_t_8 = ((__pyx_f_7aiohttp_12_http_writer__write_str((&__pyx_v_writer), ((PyObject*)__pyx_t_5)) < 0) != 0); + __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0; + if (unlikely(__pyx_t_8)) { + + /* "aiohttp/_http_writer.pyx":150 + * raise + * if _write_str(&writer, to_str(val)) < 0: + * raise # <<<<<<<<<<<<<< + * if _write_byte(&writer, b'\r') < 0: + * raise + */ + __Pyx_ReraiseException(); __PYX_ERR(0, 150, __pyx_L6_error) + + /* "aiohttp/_http_writer.pyx":149 + * if _write_byte(&writer, b' ') < 0: + * raise + * if _write_str(&writer, to_str(val)) < 0: # <<<<<<<<<<<<<< + * raise + * if _write_byte(&writer, b'\r') < 0: + */ + } + + /* "aiohttp/_http_writer.pyx":151 + * if _write_str(&writer, to_str(val)) < 0: + * raise + * if _write_byte(&writer, b'\r') < 0: # <<<<<<<<<<<<<< + * raise + * if _write_byte(&writer, b'\n') < 0: + */ + __pyx_t_8 = ((__pyx_f_7aiohttp_12_http_writer__write_byte((&__pyx_v_writer), '\r') < 0) != 0); + if (unlikely(__pyx_t_8)) { + + /* "aiohttp/_http_writer.pyx":152 + * raise + * if _write_byte(&writer, b'\r') < 0: + * raise # <<<<<<<<<<<<<< + * if _write_byte(&writer, b'\n') < 0: + * raise + */ + __Pyx_ReraiseException(); __PYX_ERR(0, 152, __pyx_L6_error) + + /* "aiohttp/_http_writer.pyx":151 + * if _write_str(&writer, to_str(val)) < 0: + * raise + * if _write_byte(&writer, b'\r') < 0: # <<<<<<<<<<<<<< + * raise + * if _write_byte(&writer, b'\n') < 0: + */ + } + + /* "aiohttp/_http_writer.pyx":153 + * if _write_byte(&writer, b'\r') < 0: + * raise + * if _write_byte(&writer, b'\n') < 0: # <<<<<<<<<<<<<< + * raise + * + */ + __pyx_t_8 = ((__pyx_f_7aiohttp_12_http_writer__write_byte((&__pyx_v_writer), '\n') < 0) != 0); + if (unlikely(__pyx_t_8)) { + + /* "aiohttp/_http_writer.pyx":154 + * raise + * if _write_byte(&writer, b'\n') < 0: + * raise # <<<<<<<<<<<<<< + * + * if _write_byte(&writer, b'\r') < 0: + */ + __Pyx_ReraiseException(); __PYX_ERR(0, 154, __pyx_L6_error) + + /* "aiohttp/_http_writer.pyx":153 + * if _write_byte(&writer, b'\r') < 0: + * raise + * if _write_byte(&writer, b'\n') < 0: # <<<<<<<<<<<<<< + * raise + * + */ + } + } + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + + /* "aiohttp/_http_writer.pyx":156 + * raise + * + * if _write_byte(&writer, b'\r') < 0: # <<<<<<<<<<<<<< + * raise + * if _write_byte(&writer, b'\n') < 0: + */ + __pyx_t_8 = ((__pyx_f_7aiohttp_12_http_writer__write_byte((&__pyx_v_writer), '\r') < 0) != 0); + if (unlikely(__pyx_t_8)) { + + /* "aiohttp/_http_writer.pyx":157 + * + * if _write_byte(&writer, b'\r') < 0: + * raise # <<<<<<<<<<<<<< + * if _write_byte(&writer, b'\n') < 0: + * raise + */ + __Pyx_ReraiseException(); __PYX_ERR(0, 157, __pyx_L6_error) + + /* "aiohttp/_http_writer.pyx":156 + * raise + * + * if _write_byte(&writer, b'\r') < 0: # <<<<<<<<<<<<<< + * raise + * if _write_byte(&writer, b'\n') < 0: + */ + } + + /* "aiohttp/_http_writer.pyx":158 + * if _write_byte(&writer, b'\r') < 0: + * raise + * if _write_byte(&writer, b'\n') < 0: # <<<<<<<<<<<<<< + * raise + * + */ + __pyx_t_8 = ((__pyx_f_7aiohttp_12_http_writer__write_byte((&__pyx_v_writer), '\n') < 0) != 0); + if (unlikely(__pyx_t_8)) { + + /* "aiohttp/_http_writer.pyx":159 + * raise + * if _write_byte(&writer, b'\n') < 0: + * raise # <<<<<<<<<<<<<< + * + * return PyBytes_FromStringAndSize(writer.buf, writer.pos) + */ + __Pyx_ReraiseException(); __PYX_ERR(0, 159, __pyx_L6_error) + + /* "aiohttp/_http_writer.pyx":158 + * if _write_byte(&writer, b'\r') < 0: + * raise + * if _write_byte(&writer, b'\n') < 0: # <<<<<<<<<<<<<< + * raise + * + */ + } + + /* "aiohttp/_http_writer.pyx":161 + * raise + * + * return PyBytes_FromStringAndSize(writer.buf, writer.pos) # <<<<<<<<<<<<<< + * finally: + * _release_writer(&writer) + */ + __Pyx_XDECREF(__pyx_r); + __pyx_t_1 = PyBytes_FromStringAndSize(__pyx_v_writer.buf, __pyx_v_writer.pos); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 161, __pyx_L6_error) + __Pyx_GOTREF(__pyx_t_1); + __pyx_r = __pyx_t_1; + __pyx_t_1 = 0; + goto __pyx_L5_return; + } + + /* "aiohttp/_http_writer.pyx":163 + * return PyBytes_FromStringAndSize(writer.buf, writer.pos) + * finally: + * _release_writer(&writer) # <<<<<<<<<<<<<< + */ + /*finally:*/ { + __pyx_L6_error:; + /*exception exit:*/{ + __Pyx_PyThreadState_declare + __Pyx_PyThreadState_assign + __pyx_t_10 = 0; __pyx_t_11 = 0; __pyx_t_12 = 0; __pyx_t_13 = 0; __pyx_t_14 = 0; __pyx_t_15 = 0; + __Pyx_XDECREF(__pyx_t_1); __pyx_t_1 = 0; + __Pyx_XDECREF(__pyx_t_5); __pyx_t_5 = 0; + __Pyx_XDECREF(__pyx_t_6); __pyx_t_6 = 0; + if (PY_MAJOR_VERSION >= 3) __Pyx_ExceptionSwap(&__pyx_t_13, &__pyx_t_14, &__pyx_t_15); + if ((PY_MAJOR_VERSION < 3) || unlikely(__Pyx_GetException(&__pyx_t_10, &__pyx_t_11, &__pyx_t_12) < 0)) __Pyx_ErrFetch(&__pyx_t_10, &__pyx_t_11, &__pyx_t_12); + __Pyx_XGOTREF(__pyx_t_10); + __Pyx_XGOTREF(__pyx_t_11); + __Pyx_XGOTREF(__pyx_t_12); + __Pyx_XGOTREF(__pyx_t_13); + __Pyx_XGOTREF(__pyx_t_14); + __Pyx_XGOTREF(__pyx_t_15); + __pyx_t_4 = __pyx_lineno; __pyx_t_7 = __pyx_clineno; __pyx_t_9 = __pyx_filename; + { + __pyx_f_7aiohttp_12_http_writer__release_writer((&__pyx_v_writer)); + } + if (PY_MAJOR_VERSION >= 3) { + __Pyx_XGIVEREF(__pyx_t_13); + __Pyx_XGIVEREF(__pyx_t_14); + __Pyx_XGIVEREF(__pyx_t_15); + __Pyx_ExceptionReset(__pyx_t_13, __pyx_t_14, __pyx_t_15); + } + __Pyx_XGIVEREF(__pyx_t_10); + __Pyx_XGIVEREF(__pyx_t_11); + __Pyx_XGIVEREF(__pyx_t_12); + __Pyx_ErrRestore(__pyx_t_10, __pyx_t_11, __pyx_t_12); + __pyx_t_10 = 0; __pyx_t_11 = 0; __pyx_t_12 = 0; __pyx_t_13 = 0; __pyx_t_14 = 0; __pyx_t_15 = 0; + __pyx_lineno = __pyx_t_4; __pyx_clineno = __pyx_t_7; __pyx_filename = __pyx_t_9; + goto __pyx_L1_error; + } + __pyx_L5_return: { + __pyx_t_15 = __pyx_r; + __pyx_r = 0; + __pyx_f_7aiohttp_12_http_writer__release_writer((&__pyx_v_writer)); + __pyx_r = __pyx_t_15; + __pyx_t_15 = 0; + goto __pyx_L0; + } + } + + /* "aiohttp/_http_writer.pyx":122 + * + * + * def _serialize_headers(str status_line, headers): # <<<<<<<<<<<<<< + * cdef Writer writer + * cdef object key + */ + + /* function exit code */ + __pyx_L1_error:; + __Pyx_XDECREF(__pyx_t_1); + __Pyx_XDECREF(__pyx_t_5); + __Pyx_XDECREF(__pyx_t_6); + __Pyx_AddTraceback("aiohttp._http_writer._serialize_headers", __pyx_clineno, __pyx_lineno, __pyx_filename); + __pyx_r = NULL; + __pyx_L0:; + __Pyx_XDECREF(__pyx_v_key); + __Pyx_XDECREF(__pyx_v_val); + __Pyx_XGIVEREF(__pyx_r); + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +static PyMethodDef __pyx_methods[] = { + {0, 0, 0, 0} +}; + +#if PY_MAJOR_VERSION >= 3 +#if CYTHON_PEP489_MULTI_PHASE_INIT +static PyObject* __pyx_pymod_create(PyObject *spec, PyModuleDef *def); /*proto*/ +static int __pyx_pymod_exec__http_writer(PyObject* module); /*proto*/ +static PyModuleDef_Slot __pyx_moduledef_slots[] = { + {Py_mod_create, (void*)__pyx_pymod_create}, + {Py_mod_exec, (void*)__pyx_pymod_exec__http_writer}, + {0, NULL} +}; +#endif + +static struct PyModuleDef __pyx_moduledef = { + PyModuleDef_HEAD_INIT, + "_http_writer", + 0, /* m_doc */ + #if CYTHON_PEP489_MULTI_PHASE_INIT + 0, /* m_size */ + #else + -1, /* m_size */ + #endif + __pyx_methods /* m_methods */, + #if CYTHON_PEP489_MULTI_PHASE_INIT + __pyx_moduledef_slots, /* m_slots */ + #else + NULL, /* m_reload */ + #endif + NULL, /* m_traverse */ + NULL, /* m_clear */ + NULL /* m_free */ +}; +#endif +#ifndef CYTHON_SMALL_CODE +#if defined(__clang__) + #define CYTHON_SMALL_CODE +#elif defined(__GNUC__) && (__GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ >= 3)) + #define CYTHON_SMALL_CODE __attribute__((cold)) +#else + #define CYTHON_SMALL_CODE +#endif +#endif + +static __Pyx_StringTabEntry __pyx_string_tab[] = { + {&__pyx_kp_u_, __pyx_k_, sizeof(__pyx_k_), 0, 1, 0, 0}, + {&__pyx_kp_u_Cannot_serialize_non_str_key_r, __pyx_k_Cannot_serialize_non_str_key_r, sizeof(__pyx_k_Cannot_serialize_non_str_key_r), 0, 1, 0, 0}, + {&__pyx_kp_u_Newline_or_carriage_return_chara, __pyx_k_Newline_or_carriage_return_chara, sizeof(__pyx_k_Newline_or_carriage_return_chara), 0, 1, 0, 0}, + {&__pyx_n_s_TypeError, __pyx_k_TypeError, sizeof(__pyx_k_TypeError), 0, 0, 1, 1}, + {&__pyx_n_s_ValueError, __pyx_k_ValueError, sizeof(__pyx_k_ValueError), 0, 0, 1, 1}, + {&__pyx_kp_u__2, __pyx_k__2, sizeof(__pyx_k__2), 0, 1, 0, 0}, + {&__pyx_n_s_aiohttp__http_writer, __pyx_k_aiohttp__http_writer, sizeof(__pyx_k_aiohttp__http_writer), 0, 0, 1, 1}, + {&__pyx_kp_s_aiohttp__http_writer_pyx, __pyx_k_aiohttp__http_writer_pyx, sizeof(__pyx_k_aiohttp__http_writer_pyx), 0, 0, 1, 0}, + {&__pyx_n_s_cline_in_traceback, __pyx_k_cline_in_traceback, sizeof(__pyx_k_cline_in_traceback), 0, 0, 1, 1}, + {&__pyx_n_s_format, __pyx_k_format, sizeof(__pyx_k_format), 0, 0, 1, 1}, + {&__pyx_n_s_headers, __pyx_k_headers, sizeof(__pyx_k_headers), 0, 0, 1, 1}, + {&__pyx_n_s_import, __pyx_k_import, sizeof(__pyx_k_import), 0, 0, 1, 1}, + {&__pyx_n_s_istr, __pyx_k_istr, sizeof(__pyx_k_istr), 0, 0, 1, 1}, + {&__pyx_n_s_items, __pyx_k_items, sizeof(__pyx_k_items), 0, 0, 1, 1}, + {&__pyx_n_s_key, __pyx_k_key, sizeof(__pyx_k_key), 0, 0, 1, 1}, + {&__pyx_n_s_main, __pyx_k_main, sizeof(__pyx_k_main), 0, 0, 1, 1}, + {&__pyx_n_s_multidict, __pyx_k_multidict, sizeof(__pyx_k_multidict), 0, 0, 1, 1}, + {&__pyx_n_s_name, __pyx_k_name, sizeof(__pyx_k_name), 0, 0, 1, 1}, + {&__pyx_n_s_ret, __pyx_k_ret, sizeof(__pyx_k_ret), 0, 0, 1, 1}, + {&__pyx_n_s_serialize_headers, __pyx_k_serialize_headers, sizeof(__pyx_k_serialize_headers), 0, 0, 1, 1}, + {&__pyx_n_s_status_line, __pyx_k_status_line, sizeof(__pyx_k_status_line), 0, 0, 1, 1}, + {&__pyx_n_s_test, __pyx_k_test, sizeof(__pyx_k_test), 0, 0, 1, 1}, + {&__pyx_n_s_val, __pyx_k_val, sizeof(__pyx_k_val), 0, 0, 1, 1}, + {&__pyx_n_s_writer, __pyx_k_writer, sizeof(__pyx_k_writer), 0, 0, 1, 1}, + {0, 0, 0, 0, 0, 0, 0} +}; +static CYTHON_SMALL_CODE int __Pyx_InitCachedBuiltins(void) { + __pyx_builtin_TypeError = __Pyx_GetBuiltinName(__pyx_n_s_TypeError); if (!__pyx_builtin_TypeError) __PYX_ERR(0, 109, __pyx_L1_error) + __pyx_builtin_ValueError = __Pyx_GetBuiltinName(__pyx_n_s_ValueError); if (!__pyx_builtin_ValueError) __PYX_ERR(0, 116, __pyx_L1_error) + return 0; + __pyx_L1_error:; + return -1; +} + +static CYTHON_SMALL_CODE int __Pyx_InitCachedConstants(void) { + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("__Pyx_InitCachedConstants", 0); + + /* "aiohttp/_http_writer.pyx":116 + * cdef void _safe_header(str string) except *: + * if "\r" in string or "\n" in string: + * raise ValueError( # <<<<<<<<<<<<<< + * "Newline or carriage return character detected in HTTP status message or " + * "header. This is a potential security issue." + */ + __pyx_tuple__3 = PyTuple_Pack(1, __pyx_kp_u_Newline_or_carriage_return_chara); if (unlikely(!__pyx_tuple__3)) __PYX_ERR(0, 116, __pyx_L1_error) + __Pyx_GOTREF(__pyx_tuple__3); + __Pyx_GIVEREF(__pyx_tuple__3); + + /* "aiohttp/_http_writer.pyx":122 + * + * + * def _serialize_headers(str status_line, headers): # <<<<<<<<<<<<<< + * cdef Writer writer + * cdef object key + */ + __pyx_tuple__4 = PyTuple_Pack(6, __pyx_n_s_status_line, __pyx_n_s_headers, __pyx_n_s_writer, __pyx_n_s_key, __pyx_n_s_val, __pyx_n_s_ret); if (unlikely(!__pyx_tuple__4)) __PYX_ERR(0, 122, __pyx_L1_error) + __Pyx_GOTREF(__pyx_tuple__4); + __Pyx_GIVEREF(__pyx_tuple__4); + __pyx_codeobj__5 = (PyObject*)__Pyx_PyCode_New(2, 0, 6, 0, CO_OPTIMIZED|CO_NEWLOCALS, __pyx_empty_bytes, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_tuple__4, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_kp_s_aiohttp__http_writer_pyx, __pyx_n_s_serialize_headers, 122, __pyx_empty_bytes); if (unlikely(!__pyx_codeobj__5)) __PYX_ERR(0, 122, __pyx_L1_error) + __Pyx_RefNannyFinishContext(); + return 0; + __pyx_L1_error:; + __Pyx_RefNannyFinishContext(); + return -1; +} + +static CYTHON_SMALL_CODE int __Pyx_InitGlobals(void) { + if (__Pyx_InitStrings(__pyx_string_tab) < 0) __PYX_ERR(0, 1, __pyx_L1_error); + return 0; + __pyx_L1_error:; + return -1; +} + +static CYTHON_SMALL_CODE int __Pyx_modinit_global_init_code(void); /*proto*/ +static CYTHON_SMALL_CODE int __Pyx_modinit_variable_export_code(void); /*proto*/ +static CYTHON_SMALL_CODE int __Pyx_modinit_function_export_code(void); /*proto*/ +static CYTHON_SMALL_CODE int __Pyx_modinit_type_init_code(void); /*proto*/ +static CYTHON_SMALL_CODE int __Pyx_modinit_type_import_code(void); /*proto*/ +static CYTHON_SMALL_CODE int __Pyx_modinit_variable_import_code(void); /*proto*/ +static CYTHON_SMALL_CODE int __Pyx_modinit_function_import_code(void); /*proto*/ + +static int __Pyx_modinit_global_init_code(void) { + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("__Pyx_modinit_global_init_code", 0); + /*--- Global init code ---*/ + __pyx_v_7aiohttp_12_http_writer__istr = Py_None; Py_INCREF(Py_None); + __Pyx_RefNannyFinishContext(); + return 0; +} + +static int __Pyx_modinit_variable_export_code(void) { + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("__Pyx_modinit_variable_export_code", 0); + /*--- Variable export code ---*/ + __Pyx_RefNannyFinishContext(); + return 0; +} + +static int __Pyx_modinit_function_export_code(void) { + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("__Pyx_modinit_function_export_code", 0); + /*--- Function export code ---*/ + __Pyx_RefNannyFinishContext(); + return 0; +} + +static int __Pyx_modinit_type_init_code(void) { + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("__Pyx_modinit_type_init_code", 0); + /*--- Type init code ---*/ + __Pyx_RefNannyFinishContext(); + return 0; +} + +static int __Pyx_modinit_type_import_code(void) { + __Pyx_RefNannyDeclarations + PyObject *__pyx_t_1 = NULL; + int __pyx_lineno = 0; + const char *__pyx_filename = NULL; + int __pyx_clineno = 0; + __Pyx_RefNannySetupContext("__Pyx_modinit_type_import_code", 0); + /*--- Type import code ---*/ + __pyx_t_1 = PyImport_ImportModule(__Pyx_BUILTIN_MODULE_NAME); if (unlikely(!__pyx_t_1)) __PYX_ERR(1, 9, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __pyx_ptype_7cpython_4type_type = __Pyx_ImportType(__pyx_t_1, __Pyx_BUILTIN_MODULE_NAME, "type", + #if defined(PYPY_VERSION_NUM) && PYPY_VERSION_NUM < 0x050B0000 + sizeof(PyTypeObject), + #else + sizeof(PyHeapTypeObject), + #endif + __Pyx_ImportType_CheckSize_Warn); + if (!__pyx_ptype_7cpython_4type_type) __PYX_ERR(1, 9, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + __Pyx_RefNannyFinishContext(); + return 0; + __pyx_L1_error:; + __Pyx_XDECREF(__pyx_t_1); + __Pyx_RefNannyFinishContext(); + return -1; +} + +static int __Pyx_modinit_variable_import_code(void) { + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("__Pyx_modinit_variable_import_code", 0); + /*--- Variable import code ---*/ + __Pyx_RefNannyFinishContext(); + return 0; +} + +static int __Pyx_modinit_function_import_code(void) { + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("__Pyx_modinit_function_import_code", 0); + /*--- Function import code ---*/ + __Pyx_RefNannyFinishContext(); + return 0; +} + + +#ifndef CYTHON_NO_PYINIT_EXPORT +#define __Pyx_PyMODINIT_FUNC PyMODINIT_FUNC +#elif PY_MAJOR_VERSION < 3 +#ifdef __cplusplus +#define __Pyx_PyMODINIT_FUNC extern "C" void +#else +#define __Pyx_PyMODINIT_FUNC void +#endif +#else +#ifdef __cplusplus +#define __Pyx_PyMODINIT_FUNC extern "C" PyObject * +#else +#define __Pyx_PyMODINIT_FUNC PyObject * +#endif +#endif + + +#if PY_MAJOR_VERSION < 3 +__Pyx_PyMODINIT_FUNC init_http_writer(void) CYTHON_SMALL_CODE; /*proto*/ +__Pyx_PyMODINIT_FUNC init_http_writer(void) +#else +__Pyx_PyMODINIT_FUNC PyInit__http_writer(void) CYTHON_SMALL_CODE; /*proto*/ +__Pyx_PyMODINIT_FUNC PyInit__http_writer(void) +#if CYTHON_PEP489_MULTI_PHASE_INIT +{ + return PyModuleDef_Init(&__pyx_moduledef); +} +static CYTHON_SMALL_CODE int __Pyx_check_single_interpreter(void) { + #if PY_VERSION_HEX >= 0x030700A1 + static PY_INT64_T main_interpreter_id = -1; + PY_INT64_T current_id = PyInterpreterState_GetID(PyThreadState_Get()->interp); + if (main_interpreter_id == -1) { + main_interpreter_id = current_id; + return (unlikely(current_id == -1)) ? -1 : 0; + } else if (unlikely(main_interpreter_id != current_id)) + #else + static PyInterpreterState *main_interpreter = NULL; + PyInterpreterState *current_interpreter = PyThreadState_Get()->interp; + if (!main_interpreter) { + main_interpreter = current_interpreter; + } else if (unlikely(main_interpreter != current_interpreter)) + #endif + { + PyErr_SetString( + PyExc_ImportError, + "Interpreter change detected - this module can only be loaded into one interpreter per process."); + return -1; + } + return 0; +} +static CYTHON_SMALL_CODE int __Pyx_copy_spec_to_module(PyObject *spec, PyObject *moddict, const char* from_name, const char* to_name, int allow_none) { + PyObject *value = PyObject_GetAttrString(spec, from_name); + int result = 0; + if (likely(value)) { + if (allow_none || value != Py_None) { + result = PyDict_SetItemString(moddict, to_name, value); + } + Py_DECREF(value); + } else if (PyErr_ExceptionMatches(PyExc_AttributeError)) { + PyErr_Clear(); + } else { + result = -1; + } + return result; +} +static CYTHON_SMALL_CODE PyObject* __pyx_pymod_create(PyObject *spec, CYTHON_UNUSED PyModuleDef *def) { + PyObject *module = NULL, *moddict, *modname; + if (__Pyx_check_single_interpreter()) + return NULL; + if (__pyx_m) + return __Pyx_NewRef(__pyx_m); + modname = PyObject_GetAttrString(spec, "name"); + if (unlikely(!modname)) goto bad; + module = PyModule_NewObject(modname); + Py_DECREF(modname); + if (unlikely(!module)) goto bad; + moddict = PyModule_GetDict(module); + if (unlikely(!moddict)) goto bad; + if (unlikely(__Pyx_copy_spec_to_module(spec, moddict, "loader", "__loader__", 1) < 0)) goto bad; + if (unlikely(__Pyx_copy_spec_to_module(spec, moddict, "origin", "__file__", 1) < 0)) goto bad; + if (unlikely(__Pyx_copy_spec_to_module(spec, moddict, "parent", "__package__", 1) < 0)) goto bad; + if (unlikely(__Pyx_copy_spec_to_module(spec, moddict, "submodule_search_locations", "__path__", 0) < 0)) goto bad; + return module; +bad: + Py_XDECREF(module); + return NULL; +} + + +static CYTHON_SMALL_CODE int __pyx_pymod_exec__http_writer(PyObject *__pyx_pyinit_module) +#endif +#endif +{ + PyObject *__pyx_t_1 = NULL; + PyObject *__pyx_t_2 = NULL; + int __pyx_lineno = 0; + const char *__pyx_filename = NULL; + int __pyx_clineno = 0; + __Pyx_RefNannyDeclarations + #if CYTHON_PEP489_MULTI_PHASE_INIT + if (__pyx_m) { + if (__pyx_m == __pyx_pyinit_module) return 0; + PyErr_SetString(PyExc_RuntimeError, "Module '_http_writer' has already been imported. Re-initialisation is not supported."); + return -1; + } + #elif PY_MAJOR_VERSION >= 3 + if (__pyx_m) return __Pyx_NewRef(__pyx_m); + #endif + #if CYTHON_REFNANNY +__Pyx_RefNanny = __Pyx_RefNannyImportAPI("refnanny"); +if (!__Pyx_RefNanny) { + PyErr_Clear(); + __Pyx_RefNanny = __Pyx_RefNannyImportAPI("Cython.Runtime.refnanny"); + if (!__Pyx_RefNanny) + Py_FatalError("failed to import 'refnanny' module"); +} +#endif + __Pyx_RefNannySetupContext("__Pyx_PyMODINIT_FUNC PyInit__http_writer(void)", 0); + if (__Pyx_check_binary_version() < 0) __PYX_ERR(0, 1, __pyx_L1_error) + #ifdef __Pxy_PyFrame_Initialize_Offsets + __Pxy_PyFrame_Initialize_Offsets(); + #endif + __pyx_empty_tuple = PyTuple_New(0); if (unlikely(!__pyx_empty_tuple)) __PYX_ERR(0, 1, __pyx_L1_error) + __pyx_empty_bytes = PyBytes_FromStringAndSize("", 0); if (unlikely(!__pyx_empty_bytes)) __PYX_ERR(0, 1, __pyx_L1_error) + __pyx_empty_unicode = PyUnicode_FromStringAndSize("", 0); if (unlikely(!__pyx_empty_unicode)) __PYX_ERR(0, 1, __pyx_L1_error) + #ifdef __Pyx_CyFunction_USED + if (__pyx_CyFunction_init() < 0) __PYX_ERR(0, 1, __pyx_L1_error) + #endif + #ifdef __Pyx_FusedFunction_USED + if (__pyx_FusedFunction_init() < 0) __PYX_ERR(0, 1, __pyx_L1_error) + #endif + #ifdef __Pyx_Coroutine_USED + if (__pyx_Coroutine_init() < 0) __PYX_ERR(0, 1, __pyx_L1_error) + #endif + #ifdef __Pyx_Generator_USED + if (__pyx_Generator_init() < 0) __PYX_ERR(0, 1, __pyx_L1_error) + #endif + #ifdef __Pyx_AsyncGen_USED + if (__pyx_AsyncGen_init() < 0) __PYX_ERR(0, 1, __pyx_L1_error) + #endif + #ifdef __Pyx_StopAsyncIteration_USED + if (__pyx_StopAsyncIteration_init() < 0) __PYX_ERR(0, 1, __pyx_L1_error) + #endif + /*--- Library function declarations ---*/ + /*--- Threads initialization code ---*/ + #if defined(WITH_THREAD) && PY_VERSION_HEX < 0x030700F0 && defined(__PYX_FORCE_INIT_THREADS) && __PYX_FORCE_INIT_THREADS + PyEval_InitThreads(); + #endif + /*--- Module creation code ---*/ + #if CYTHON_PEP489_MULTI_PHASE_INIT + __pyx_m = __pyx_pyinit_module; + Py_INCREF(__pyx_m); + #else + #if PY_MAJOR_VERSION < 3 + __pyx_m = Py_InitModule4("_http_writer", __pyx_methods, 0, 0, PYTHON_API_VERSION); Py_XINCREF(__pyx_m); + #else + __pyx_m = PyModule_Create(&__pyx_moduledef); + #endif + if (unlikely(!__pyx_m)) __PYX_ERR(0, 1, __pyx_L1_error) + #endif + __pyx_d = PyModule_GetDict(__pyx_m); if (unlikely(!__pyx_d)) __PYX_ERR(0, 1, __pyx_L1_error) + Py_INCREF(__pyx_d); + __pyx_b = PyImport_AddModule(__Pyx_BUILTIN_MODULE_NAME); if (unlikely(!__pyx_b)) __PYX_ERR(0, 1, __pyx_L1_error) + Py_INCREF(__pyx_b); + __pyx_cython_runtime = PyImport_AddModule((char *) "cython_runtime"); if (unlikely(!__pyx_cython_runtime)) __PYX_ERR(0, 1, __pyx_L1_error) + Py_INCREF(__pyx_cython_runtime); + if (PyObject_SetAttrString(__pyx_m, "__builtins__", __pyx_b) < 0) __PYX_ERR(0, 1, __pyx_L1_error); + /*--- Initialize various global constants etc. ---*/ + if (__Pyx_InitGlobals() < 0) __PYX_ERR(0, 1, __pyx_L1_error) + #if PY_MAJOR_VERSION < 3 && (__PYX_DEFAULT_STRING_ENCODING_IS_ASCII || __PYX_DEFAULT_STRING_ENCODING_IS_DEFAULT) + if (__Pyx_init_sys_getdefaultencoding_params() < 0) __PYX_ERR(0, 1, __pyx_L1_error) + #endif + if (__pyx_module_is_main_aiohttp___http_writer) { + if (PyObject_SetAttr(__pyx_m, __pyx_n_s_name, __pyx_n_s_main) < 0) __PYX_ERR(0, 1, __pyx_L1_error) + } + #if PY_MAJOR_VERSION >= 3 + { + PyObject *modules = PyImport_GetModuleDict(); if (unlikely(!modules)) __PYX_ERR(0, 1, __pyx_L1_error) + if (!PyDict_GetItemString(modules, "aiohttp._http_writer")) { + if (unlikely(PyDict_SetItemString(modules, "aiohttp._http_writer", __pyx_m) < 0)) __PYX_ERR(0, 1, __pyx_L1_error) + } + } + #endif + /*--- Builtin init code ---*/ + if (__Pyx_InitCachedBuiltins() < 0) __PYX_ERR(0, 1, __pyx_L1_error) + /*--- Constants init code ---*/ + if (__Pyx_InitCachedConstants() < 0) __PYX_ERR(0, 1, __pyx_L1_error) + /*--- Global type/function init code ---*/ + (void)__Pyx_modinit_global_init_code(); + (void)__Pyx_modinit_variable_export_code(); + (void)__Pyx_modinit_function_export_code(); + (void)__Pyx_modinit_type_init_code(); + if (unlikely(__Pyx_modinit_type_import_code() < 0)) __PYX_ERR(0, 1, __pyx_L1_error) + (void)__Pyx_modinit_variable_import_code(); + (void)__Pyx_modinit_function_import_code(); + /*--- Execution code ---*/ + #if defined(__Pyx_Generator_USED) || defined(__Pyx_Coroutine_USED) + if (__Pyx_patch_abc() < 0) __PYX_ERR(0, 1, __pyx_L1_error) + #endif + + /* "aiohttp/_http_writer.pyx":8 + * from libc.string cimport memcpy + * + * from multidict import istr # <<<<<<<<<<<<<< + * + * DEF BUF_SIZE = 16 * 1024 # 16KiB + */ + __pyx_t_1 = PyList_New(1); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 8, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __Pyx_INCREF(__pyx_n_s_istr); + __Pyx_GIVEREF(__pyx_n_s_istr); + PyList_SET_ITEM(__pyx_t_1, 0, __pyx_n_s_istr); + __pyx_t_2 = __Pyx_Import(__pyx_n_s_multidict, __pyx_t_1, 0); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 8, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_2); + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + __pyx_t_1 = __Pyx_ImportFrom(__pyx_t_2, __pyx_n_s_istr); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 8, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + if (PyDict_SetItem(__pyx_d, __pyx_n_s_istr, __pyx_t_1) < 0) __PYX_ERR(0, 8, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; + + /* "aiohttp/_http_writer.pyx":13 + * cdef char BUFFER[BUF_SIZE] + * + * cdef object _istr = istr # <<<<<<<<<<<<<< + * + * + */ + __Pyx_GetModuleGlobalName(__pyx_t_2, __pyx_n_s_istr); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 13, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_2); + __Pyx_XGOTREF(__pyx_v_7aiohttp_12_http_writer__istr); + __Pyx_DECREF_SET(__pyx_v_7aiohttp_12_http_writer__istr, __pyx_t_2); + __Pyx_GIVEREF(__pyx_t_2); + __pyx_t_2 = 0; + + /* "aiohttp/_http_writer.pyx":122 + * + * + * def _serialize_headers(str status_line, headers): # <<<<<<<<<<<<<< + * cdef Writer writer + * cdef object key + */ + __pyx_t_2 = PyCFunction_NewEx(&__pyx_mdef_7aiohttp_12_http_writer_1_serialize_headers, NULL, __pyx_n_s_aiohttp__http_writer); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 122, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_2); + if (PyDict_SetItem(__pyx_d, __pyx_n_s_serialize_headers, __pyx_t_2) < 0) __PYX_ERR(0, 122, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; + + /* "aiohttp/_http_writer.pyx":1 + * from cpython.bytes cimport PyBytes_FromStringAndSize # <<<<<<<<<<<<<< + * from cpython.exc cimport PyErr_NoMemory + * from cpython.mem cimport PyMem_Free, PyMem_Malloc, PyMem_Realloc + */ + __pyx_t_2 = __Pyx_PyDict_NewPresized(0); if (unlikely(!__pyx_t_2)) __PYX_ERR(0, 1, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_2); + if (PyDict_SetItem(__pyx_d, __pyx_n_s_test, __pyx_t_2) < 0) __PYX_ERR(0, 1, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; + + /*--- Wrapped vars code ---*/ + + goto __pyx_L0; + __pyx_L1_error:; + __Pyx_XDECREF(__pyx_t_1); + __Pyx_XDECREF(__pyx_t_2); + if (__pyx_m) { + if (__pyx_d) { + __Pyx_AddTraceback("init aiohttp._http_writer", __pyx_clineno, __pyx_lineno, __pyx_filename); + } + Py_CLEAR(__pyx_m); + } else if (!PyErr_Occurred()) { + PyErr_SetString(PyExc_ImportError, "init aiohttp._http_writer"); + } + __pyx_L0:; + __Pyx_RefNannyFinishContext(); + #if CYTHON_PEP489_MULTI_PHASE_INIT + return (__pyx_m != NULL) ? 0 : -1; + #elif PY_MAJOR_VERSION >= 3 + return __pyx_m; + #else + return; + #endif +} + +/* --- Runtime support code --- */ +/* Refnanny */ +#if CYTHON_REFNANNY +static __Pyx_RefNannyAPIStruct *__Pyx_RefNannyImportAPI(const char *modname) { + PyObject *m = NULL, *p = NULL; + void *r = NULL; + m = PyImport_ImportModule(modname); + if (!m) goto end; + p = PyObject_GetAttrString(m, "RefNannyAPI"); + if (!p) goto end; + r = PyLong_AsVoidPtr(p); +end: + Py_XDECREF(p); + Py_XDECREF(m); + return (__Pyx_RefNannyAPIStruct *)r; +} +#endif + +/* PyObjectGetAttrStr */ +#if CYTHON_USE_TYPE_SLOTS +static CYTHON_INLINE PyObject* __Pyx_PyObject_GetAttrStr(PyObject* obj, PyObject* attr_name) { + PyTypeObject* tp = Py_TYPE(obj); + if (likely(tp->tp_getattro)) + return tp->tp_getattro(obj, attr_name); +#if PY_MAJOR_VERSION < 3 + if (likely(tp->tp_getattr)) + return tp->tp_getattr(obj, PyString_AS_STRING(attr_name)); +#endif + return PyObject_GetAttr(obj, attr_name); +} +#endif + +/* GetBuiltinName */ +static PyObject *__Pyx_GetBuiltinName(PyObject *name) { + PyObject* result = __Pyx_PyObject_GetAttrStr(__pyx_b, name); + if (unlikely(!result)) { + PyErr_Format(PyExc_NameError, +#if PY_MAJOR_VERSION >= 3 + "name '%U' is not defined", name); +#else + "name '%.200s' is not defined", PyString_AS_STRING(name)); +#endif + } + return result; +} + +/* PyErrFetchRestore */ +#if CYTHON_FAST_THREAD_STATE +static CYTHON_INLINE void __Pyx_ErrRestoreInState(PyThreadState *tstate, PyObject *type, PyObject *value, PyObject *tb) { + PyObject *tmp_type, *tmp_value, *tmp_tb; + tmp_type = tstate->curexc_type; + tmp_value = tstate->curexc_value; + tmp_tb = tstate->curexc_traceback; + tstate->curexc_type = type; + tstate->curexc_value = value; + tstate->curexc_traceback = tb; + Py_XDECREF(tmp_type); + Py_XDECREF(tmp_value); + Py_XDECREF(tmp_tb); +} +static CYTHON_INLINE void __Pyx_ErrFetchInState(PyThreadState *tstate, PyObject **type, PyObject **value, PyObject **tb) { + *type = tstate->curexc_type; + *value = tstate->curexc_value; + *tb = tstate->curexc_traceback; + tstate->curexc_type = 0; + tstate->curexc_value = 0; + tstate->curexc_traceback = 0; +} +#endif + +/* WriteUnraisableException */ +static void __Pyx_WriteUnraisable(const char *name, CYTHON_UNUSED int clineno, + CYTHON_UNUSED int lineno, CYTHON_UNUSED const char *filename, + int full_traceback, CYTHON_UNUSED int nogil) { + PyObject *old_exc, *old_val, *old_tb; + PyObject *ctx; + __Pyx_PyThreadState_declare +#ifdef WITH_THREAD + PyGILState_STATE state; + if (nogil) + state = PyGILState_Ensure(); +#ifdef _MSC_VER + else state = (PyGILState_STATE)-1; +#endif +#endif + __Pyx_PyThreadState_assign + __Pyx_ErrFetch(&old_exc, &old_val, &old_tb); + if (full_traceback) { + Py_XINCREF(old_exc); + Py_XINCREF(old_val); + Py_XINCREF(old_tb); + __Pyx_ErrRestore(old_exc, old_val, old_tb); + PyErr_PrintEx(1); + } + #if PY_MAJOR_VERSION < 3 + ctx = PyString_FromString(name); + #else + ctx = PyUnicode_FromString(name); + #endif + __Pyx_ErrRestore(old_exc, old_val, old_tb); + if (!ctx) { + PyErr_WriteUnraisable(Py_None); + } else { + PyErr_WriteUnraisable(ctx); + Py_DECREF(ctx); + } +#ifdef WITH_THREAD + if (nogil) + PyGILState_Release(state); +#endif +} + +/* unicode_iter */ +static CYTHON_INLINE int __Pyx_init_unicode_iteration( + PyObject* ustring, Py_ssize_t *length, void** data, int *kind) { +#if CYTHON_PEP393_ENABLED + if (unlikely(__Pyx_PyUnicode_READY(ustring) < 0)) return -1; + *kind = PyUnicode_KIND(ustring); + *length = PyUnicode_GET_LENGTH(ustring); + *data = PyUnicode_DATA(ustring); +#else + *kind = 0; + *length = PyUnicode_GET_SIZE(ustring); + *data = (void*)PyUnicode_AS_UNICODE(ustring); +#endif + return 0; +} + +/* PyCFunctionFastCall */ +#if CYTHON_FAST_PYCCALL +static CYTHON_INLINE PyObject * __Pyx_PyCFunction_FastCall(PyObject *func_obj, PyObject **args, Py_ssize_t nargs) { + PyCFunctionObject *func = (PyCFunctionObject*)func_obj; + PyCFunction meth = PyCFunction_GET_FUNCTION(func); + PyObject *self = PyCFunction_GET_SELF(func); + int flags = PyCFunction_GET_FLAGS(func); + assert(PyCFunction_Check(func)); + assert(METH_FASTCALL == (flags & ~(METH_CLASS | METH_STATIC | METH_COEXIST | METH_KEYWORDS | METH_STACKLESS))); + assert(nargs >= 0); + assert(nargs == 0 || args != NULL); + /* _PyCFunction_FastCallDict() must not be called with an exception set, + because it may clear it (directly or indirectly) and so the + caller loses its exception */ + assert(!PyErr_Occurred()); + if ((PY_VERSION_HEX < 0x030700A0) || unlikely(flags & METH_KEYWORDS)) { + return (*((__Pyx_PyCFunctionFastWithKeywords)(void*)meth)) (self, args, nargs, NULL); + } else { + return (*((__Pyx_PyCFunctionFast)(void*)meth)) (self, args, nargs); + } +} +#endif + +/* PyFunctionFastCall */ +#if CYTHON_FAST_PYCALL +static PyObject* __Pyx_PyFunction_FastCallNoKw(PyCodeObject *co, PyObject **args, Py_ssize_t na, + PyObject *globals) { + PyFrameObject *f; + PyThreadState *tstate = __Pyx_PyThreadState_Current; + PyObject **fastlocals; + Py_ssize_t i; + PyObject *result; + assert(globals != NULL); + /* XXX Perhaps we should create a specialized + PyFrame_New() that doesn't take locals, but does + take builtins without sanity checking them. + */ + assert(tstate != NULL); + f = PyFrame_New(tstate, co, globals, NULL); + if (f == NULL) { + return NULL; + } + fastlocals = __Pyx_PyFrame_GetLocalsplus(f); + for (i = 0; i < na; i++) { + Py_INCREF(*args); + fastlocals[i] = *args++; + } + result = PyEval_EvalFrameEx(f,0); + ++tstate->recursion_depth; + Py_DECREF(f); + --tstate->recursion_depth; + return result; +} +#if 1 || PY_VERSION_HEX < 0x030600B1 +static PyObject *__Pyx_PyFunction_FastCallDict(PyObject *func, PyObject **args, Py_ssize_t nargs, PyObject *kwargs) { + PyCodeObject *co = (PyCodeObject *)PyFunction_GET_CODE(func); + PyObject *globals = PyFunction_GET_GLOBALS(func); + PyObject *argdefs = PyFunction_GET_DEFAULTS(func); + PyObject *closure; +#if PY_MAJOR_VERSION >= 3 + PyObject *kwdefs; +#endif + PyObject *kwtuple, **k; + PyObject **d; + Py_ssize_t nd; + Py_ssize_t nk; + PyObject *result; + assert(kwargs == NULL || PyDict_Check(kwargs)); + nk = kwargs ? PyDict_Size(kwargs) : 0; + if (Py_EnterRecursiveCall((char*)" while calling a Python object")) { + return NULL; + } + if ( +#if PY_MAJOR_VERSION >= 3 + co->co_kwonlyargcount == 0 && +#endif + likely(kwargs == NULL || nk == 0) && + co->co_flags == (CO_OPTIMIZED | CO_NEWLOCALS | CO_NOFREE)) { + if (argdefs == NULL && co->co_argcount == nargs) { + result = __Pyx_PyFunction_FastCallNoKw(co, args, nargs, globals); + goto done; + } + else if (nargs == 0 && argdefs != NULL + && co->co_argcount == Py_SIZE(argdefs)) { + /* function called with no arguments, but all parameters have + a default value: use default values as arguments .*/ + args = &PyTuple_GET_ITEM(argdefs, 0); + result =__Pyx_PyFunction_FastCallNoKw(co, args, Py_SIZE(argdefs), globals); + goto done; + } + } + if (kwargs != NULL) { + Py_ssize_t pos, i; + kwtuple = PyTuple_New(2 * nk); + if (kwtuple == NULL) { + result = NULL; + goto done; + } + k = &PyTuple_GET_ITEM(kwtuple, 0); + pos = i = 0; + while (PyDict_Next(kwargs, &pos, &k[i], &k[i+1])) { + Py_INCREF(k[i]); + Py_INCREF(k[i+1]); + i += 2; + } + nk = i / 2; + } + else { + kwtuple = NULL; + k = NULL; + } + closure = PyFunction_GET_CLOSURE(func); +#if PY_MAJOR_VERSION >= 3 + kwdefs = PyFunction_GET_KW_DEFAULTS(func); +#endif + if (argdefs != NULL) { + d = &PyTuple_GET_ITEM(argdefs, 0); + nd = Py_SIZE(argdefs); + } + else { + d = NULL; + nd = 0; + } +#if PY_MAJOR_VERSION >= 3 + result = PyEval_EvalCodeEx((PyObject*)co, globals, (PyObject *)NULL, + args, (int)nargs, + k, (int)nk, + d, (int)nd, kwdefs, closure); +#else + result = PyEval_EvalCodeEx(co, globals, (PyObject *)NULL, + args, (int)nargs, + k, (int)nk, + d, (int)nd, closure); +#endif + Py_XDECREF(kwtuple); +done: + Py_LeaveRecursiveCall(); + return result; +} +#endif +#endif + +/* PyObjectCall */ +#if CYTHON_COMPILING_IN_CPYTHON +static CYTHON_INLINE PyObject* __Pyx_PyObject_Call(PyObject *func, PyObject *arg, PyObject *kw) { + PyObject *result; + ternaryfunc call = Py_TYPE(func)->tp_call; + if (unlikely(!call)) + return PyObject_Call(func, arg, kw); + if (unlikely(Py_EnterRecursiveCall((char*)" while calling a Python object"))) + return NULL; + result = (*call)(func, arg, kw); + Py_LeaveRecursiveCall(); + if (unlikely(!result) && unlikely(!PyErr_Occurred())) { + PyErr_SetString( + PyExc_SystemError, + "NULL result without error in PyObject_Call"); + } + return result; +} +#endif + +/* PyObjectCall2Args */ +static CYTHON_UNUSED PyObject* __Pyx_PyObject_Call2Args(PyObject* function, PyObject* arg1, PyObject* arg2) { + PyObject *args, *result = NULL; + #if CYTHON_FAST_PYCALL + if (PyFunction_Check(function)) { + PyObject *args[2] = {arg1, arg2}; + return __Pyx_PyFunction_FastCall(function, args, 2); + } + #endif + #if CYTHON_FAST_PYCCALL + if (__Pyx_PyFastCFunction_Check(function)) { + PyObject *args[2] = {arg1, arg2}; + return __Pyx_PyCFunction_FastCall(function, args, 2); + } + #endif + args = PyTuple_New(2); + if (unlikely(!args)) goto done; + Py_INCREF(arg1); + PyTuple_SET_ITEM(args, 0, arg1); + Py_INCREF(arg2); + PyTuple_SET_ITEM(args, 1, arg2); + Py_INCREF(function); + result = __Pyx_PyObject_Call(function, args, NULL); + Py_DECREF(args); + Py_DECREF(function); +done: + return result; +} + +/* PyObjectCallMethO */ +#if CYTHON_COMPILING_IN_CPYTHON +static CYTHON_INLINE PyObject* __Pyx_PyObject_CallMethO(PyObject *func, PyObject *arg) { + PyObject *self, *result; + PyCFunction cfunc; + cfunc = PyCFunction_GET_FUNCTION(func); + self = PyCFunction_GET_SELF(func); + if (unlikely(Py_EnterRecursiveCall((char*)" while calling a Python object"))) + return NULL; + result = cfunc(self, arg); + Py_LeaveRecursiveCall(); + if (unlikely(!result) && unlikely(!PyErr_Occurred())) { + PyErr_SetString( + PyExc_SystemError, + "NULL result without error in PyObject_Call"); + } + return result; +} +#endif + +/* PyObjectCallOneArg */ +#if CYTHON_COMPILING_IN_CPYTHON +static PyObject* __Pyx__PyObject_CallOneArg(PyObject *func, PyObject *arg) { + PyObject *result; + PyObject *args = PyTuple_New(1); + if (unlikely(!args)) return NULL; + Py_INCREF(arg); + PyTuple_SET_ITEM(args, 0, arg); + result = __Pyx_PyObject_Call(func, args, NULL); + Py_DECREF(args); + return result; +} +static CYTHON_INLINE PyObject* __Pyx_PyObject_CallOneArg(PyObject *func, PyObject *arg) { +#if CYTHON_FAST_PYCALL + if (PyFunction_Check(func)) { + return __Pyx_PyFunction_FastCall(func, &arg, 1); + } +#endif + if (likely(PyCFunction_Check(func))) { + if (likely(PyCFunction_GET_FLAGS(func) & METH_O)) { + return __Pyx_PyObject_CallMethO(func, arg); +#if CYTHON_FAST_PYCCALL + } else if (__Pyx_PyFastCFunction_Check(func)) { + return __Pyx_PyCFunction_FastCall(func, &arg, 1); +#endif + } + } + return __Pyx__PyObject_CallOneArg(func, arg); +} +#else +static CYTHON_INLINE PyObject* __Pyx_PyObject_CallOneArg(PyObject *func, PyObject *arg) { + PyObject *result; + PyObject *args = PyTuple_Pack(1, arg); + if (unlikely(!args)) return NULL; + result = __Pyx_PyObject_Call(func, args, NULL); + Py_DECREF(args); + return result; +} +#endif + +/* RaiseException */ +#if PY_MAJOR_VERSION < 3 +static void __Pyx_Raise(PyObject *type, PyObject *value, PyObject *tb, + CYTHON_UNUSED PyObject *cause) { + __Pyx_PyThreadState_declare + Py_XINCREF(type); + if (!value || value == Py_None) + value = NULL; + else + Py_INCREF(value); + if (!tb || tb == Py_None) + tb = NULL; + else { + Py_INCREF(tb); + if (!PyTraceBack_Check(tb)) { + PyErr_SetString(PyExc_TypeError, + "raise: arg 3 must be a traceback or None"); + goto raise_error; + } + } + if (PyType_Check(type)) { +#if CYTHON_COMPILING_IN_PYPY + if (!value) { + Py_INCREF(Py_None); + value = Py_None; + } +#endif + PyErr_NormalizeException(&type, &value, &tb); + } else { + if (value) { + PyErr_SetString(PyExc_TypeError, + "instance exception may not have a separate value"); + goto raise_error; + } + value = type; + type = (PyObject*) Py_TYPE(type); + Py_INCREF(type); + if (!PyType_IsSubtype((PyTypeObject *)type, (PyTypeObject *)PyExc_BaseException)) { + PyErr_SetString(PyExc_TypeError, + "raise: exception class must be a subclass of BaseException"); + goto raise_error; + } + } + __Pyx_PyThreadState_assign + __Pyx_ErrRestore(type, value, tb); + return; +raise_error: + Py_XDECREF(value); + Py_XDECREF(type); + Py_XDECREF(tb); + return; +} +#else +static void __Pyx_Raise(PyObject *type, PyObject *value, PyObject *tb, PyObject *cause) { + PyObject* owned_instance = NULL; + if (tb == Py_None) { + tb = 0; + } else if (tb && !PyTraceBack_Check(tb)) { + PyErr_SetString(PyExc_TypeError, + "raise: arg 3 must be a traceback or None"); + goto bad; + } + if (value == Py_None) + value = 0; + if (PyExceptionInstance_Check(type)) { + if (value) { + PyErr_SetString(PyExc_TypeError, + "instance exception may not have a separate value"); + goto bad; + } + value = type; + type = (PyObject*) Py_TYPE(value); + } else if (PyExceptionClass_Check(type)) { + PyObject *instance_class = NULL; + if (value && PyExceptionInstance_Check(value)) { + instance_class = (PyObject*) Py_TYPE(value); + if (instance_class != type) { + int is_subclass = PyObject_IsSubclass(instance_class, type); + if (!is_subclass) { + instance_class = NULL; + } else if (unlikely(is_subclass == -1)) { + goto bad; + } else { + type = instance_class; + } + } + } + if (!instance_class) { + PyObject *args; + if (!value) + args = PyTuple_New(0); + else if (PyTuple_Check(value)) { + Py_INCREF(value); + args = value; + } else + args = PyTuple_Pack(1, value); + if (!args) + goto bad; + owned_instance = PyObject_Call(type, args, NULL); + Py_DECREF(args); + if (!owned_instance) + goto bad; + value = owned_instance; + if (!PyExceptionInstance_Check(value)) { + PyErr_Format(PyExc_TypeError, + "calling %R should have returned an instance of " + "BaseException, not %R", + type, Py_TYPE(value)); + goto bad; + } + } + } else { + PyErr_SetString(PyExc_TypeError, + "raise: exception class must be a subclass of BaseException"); + goto bad; + } + if (cause) { + PyObject *fixed_cause; + if (cause == Py_None) { + fixed_cause = NULL; + } else if (PyExceptionClass_Check(cause)) { + fixed_cause = PyObject_CallObject(cause, NULL); + if (fixed_cause == NULL) + goto bad; + } else if (PyExceptionInstance_Check(cause)) { + fixed_cause = cause; + Py_INCREF(fixed_cause); + } else { + PyErr_SetString(PyExc_TypeError, + "exception causes must derive from " + "BaseException"); + goto bad; + } + PyException_SetCause(value, fixed_cause); + } + PyErr_SetObject(type, value); + if (tb) { +#if CYTHON_COMPILING_IN_PYPY + PyObject *tmp_type, *tmp_value, *tmp_tb; + PyErr_Fetch(&tmp_type, &tmp_value, &tmp_tb); + Py_INCREF(tb); + PyErr_Restore(tmp_type, tmp_value, tb); + Py_XDECREF(tmp_tb); +#else + PyThreadState *tstate = __Pyx_PyThreadState_Current; + PyObject* tmp_tb = tstate->curexc_traceback; + if (tb != tmp_tb) { + Py_INCREF(tb); + tstate->curexc_traceback = tb; + Py_XDECREF(tmp_tb); + } +#endif + } +bad: + Py_XDECREF(owned_instance); + return; +} +#endif + +/* RaiseArgTupleInvalid */ +static void __Pyx_RaiseArgtupleInvalid( + const char* func_name, + int exact, + Py_ssize_t num_min, + Py_ssize_t num_max, + Py_ssize_t num_found) +{ + Py_ssize_t num_expected; + const char *more_or_less; + if (num_found < num_min) { + num_expected = num_min; + more_or_less = "at least"; + } else { + num_expected = num_max; + more_or_less = "at most"; + } + if (exact) { + more_or_less = "exactly"; + } + PyErr_Format(PyExc_TypeError, + "%.200s() takes %.8s %" CYTHON_FORMAT_SSIZE_T "d positional argument%.1s (%" CYTHON_FORMAT_SSIZE_T "d given)", + func_name, more_or_less, num_expected, + (num_expected == 1) ? "" : "s", num_found); +} + +/* RaiseDoubleKeywords */ +static void __Pyx_RaiseDoubleKeywordsError( + const char* func_name, + PyObject* kw_name) +{ + PyErr_Format(PyExc_TypeError, + #if PY_MAJOR_VERSION >= 3 + "%s() got multiple values for keyword argument '%U'", func_name, kw_name); + #else + "%s() got multiple values for keyword argument '%s'", func_name, + PyString_AsString(kw_name)); + #endif +} + +/* ParseKeywords */ +static int __Pyx_ParseOptionalKeywords( + PyObject *kwds, + PyObject **argnames[], + PyObject *kwds2, + PyObject *values[], + Py_ssize_t num_pos_args, + const char* function_name) +{ + PyObject *key = 0, *value = 0; + Py_ssize_t pos = 0; + PyObject*** name; + PyObject*** first_kw_arg = argnames + num_pos_args; + while (PyDict_Next(kwds, &pos, &key, &value)) { + name = first_kw_arg; + while (*name && (**name != key)) name++; + if (*name) { + values[name-argnames] = value; + continue; + } + name = first_kw_arg; + #if PY_MAJOR_VERSION < 3 + if (likely(PyString_Check(key))) { + while (*name) { + if ((CYTHON_COMPILING_IN_PYPY || PyString_GET_SIZE(**name) == PyString_GET_SIZE(key)) + && _PyString_Eq(**name, key)) { + values[name-argnames] = value; + break; + } + name++; + } + if (*name) continue; + else { + PyObject*** argname = argnames; + while (argname != first_kw_arg) { + if ((**argname == key) || ( + (CYTHON_COMPILING_IN_PYPY || PyString_GET_SIZE(**argname) == PyString_GET_SIZE(key)) + && _PyString_Eq(**argname, key))) { + goto arg_passed_twice; + } + argname++; + } + } + } else + #endif + if (likely(PyUnicode_Check(key))) { + while (*name) { + int cmp = (**name == key) ? 0 : + #if !CYTHON_COMPILING_IN_PYPY && PY_MAJOR_VERSION >= 3 + (__Pyx_PyUnicode_GET_LENGTH(**name) != __Pyx_PyUnicode_GET_LENGTH(key)) ? 1 : + #endif + PyUnicode_Compare(**name, key); + if (cmp < 0 && unlikely(PyErr_Occurred())) goto bad; + if (cmp == 0) { + values[name-argnames] = value; + break; + } + name++; + } + if (*name) continue; + else { + PyObject*** argname = argnames; + while (argname != first_kw_arg) { + int cmp = (**argname == key) ? 0 : + #if !CYTHON_COMPILING_IN_PYPY && PY_MAJOR_VERSION >= 3 + (__Pyx_PyUnicode_GET_LENGTH(**argname) != __Pyx_PyUnicode_GET_LENGTH(key)) ? 1 : + #endif + PyUnicode_Compare(**argname, key); + if (cmp < 0 && unlikely(PyErr_Occurred())) goto bad; + if (cmp == 0) goto arg_passed_twice; + argname++; + } + } + } else + goto invalid_keyword_type; + if (kwds2) { + if (unlikely(PyDict_SetItem(kwds2, key, value))) goto bad; + } else { + goto invalid_keyword; + } + } + return 0; +arg_passed_twice: + __Pyx_RaiseDoubleKeywordsError(function_name, key); + goto bad; +invalid_keyword_type: + PyErr_Format(PyExc_TypeError, + "%.200s() keywords must be strings", function_name); + goto bad; +invalid_keyword: + PyErr_Format(PyExc_TypeError, + #if PY_MAJOR_VERSION < 3 + "%.200s() got an unexpected keyword argument '%.200s'", + function_name, PyString_AsString(key)); + #else + "%s() got an unexpected keyword argument '%U'", + function_name, key); + #endif +bad: + return -1; +} + +/* ArgTypeTest */ +static int __Pyx__ArgTypeTest(PyObject *obj, PyTypeObject *type, const char *name, int exact) +{ + if (unlikely(!type)) { + PyErr_SetString(PyExc_SystemError, "Missing type object"); + return 0; + } + else if (exact) { + #if PY_MAJOR_VERSION == 2 + if ((type == &PyBaseString_Type) && likely(__Pyx_PyBaseString_CheckExact(obj))) return 1; + #endif + } + else { + if (likely(__Pyx_TypeCheck(obj, type))) return 1; + } + PyErr_Format(PyExc_TypeError, + "Argument '%.200s' has incorrect type (expected %.200s, got %.200s)", + name, type->tp_name, Py_TYPE(obj)->tp_name); + return 0; +} + +/* IterFinish */ +static CYTHON_INLINE int __Pyx_IterFinish(void) { +#if CYTHON_FAST_THREAD_STATE + PyThreadState *tstate = __Pyx_PyThreadState_Current; + PyObject* exc_type = tstate->curexc_type; + if (unlikely(exc_type)) { + if (likely(__Pyx_PyErr_GivenExceptionMatches(exc_type, PyExc_StopIteration))) { + PyObject *exc_value, *exc_tb; + exc_value = tstate->curexc_value; + exc_tb = tstate->curexc_traceback; + tstate->curexc_type = 0; + tstate->curexc_value = 0; + tstate->curexc_traceback = 0; + Py_DECREF(exc_type); + Py_XDECREF(exc_value); + Py_XDECREF(exc_tb); + return 0; + } else { + return -1; + } + } + return 0; +#else + if (unlikely(PyErr_Occurred())) { + if (likely(PyErr_ExceptionMatches(PyExc_StopIteration))) { + PyErr_Clear(); + return 0; + } else { + return -1; + } + } + return 0; +#endif +} + +/* PyObjectCallNoArg */ +#if CYTHON_COMPILING_IN_CPYTHON +static CYTHON_INLINE PyObject* __Pyx_PyObject_CallNoArg(PyObject *func) { +#if CYTHON_FAST_PYCALL + if (PyFunction_Check(func)) { + return __Pyx_PyFunction_FastCall(func, NULL, 0); + } +#endif +#ifdef __Pyx_CyFunction_USED + if (likely(PyCFunction_Check(func) || __Pyx_CyFunction_Check(func))) +#else + if (likely(PyCFunction_Check(func))) +#endif + { + if (likely(PyCFunction_GET_FLAGS(func) & METH_NOARGS)) { + return __Pyx_PyObject_CallMethO(func, NULL); + } + } + return __Pyx_PyObject_Call(func, __pyx_empty_tuple, NULL); +} +#endif + +/* PyObjectGetMethod */ +static int __Pyx_PyObject_GetMethod(PyObject *obj, PyObject *name, PyObject **method) { + PyObject *attr; +#if CYTHON_UNPACK_METHODS && CYTHON_COMPILING_IN_CPYTHON && CYTHON_USE_PYTYPE_LOOKUP + PyTypeObject *tp = Py_TYPE(obj); + PyObject *descr; + descrgetfunc f = NULL; + PyObject **dictptr, *dict; + int meth_found = 0; + assert (*method == NULL); + if (unlikely(tp->tp_getattro != PyObject_GenericGetAttr)) { + attr = __Pyx_PyObject_GetAttrStr(obj, name); + goto try_unpack; + } + if (unlikely(tp->tp_dict == NULL) && unlikely(PyType_Ready(tp) < 0)) { + return 0; + } + descr = _PyType_Lookup(tp, name); + if (likely(descr != NULL)) { + Py_INCREF(descr); +#if PY_MAJOR_VERSION >= 3 + #ifdef __Pyx_CyFunction_USED + if (likely(PyFunction_Check(descr) || (Py_TYPE(descr) == &PyMethodDescr_Type) || __Pyx_CyFunction_Check(descr))) + #else + if (likely(PyFunction_Check(descr) || (Py_TYPE(descr) == &PyMethodDescr_Type))) + #endif +#else + #ifdef __Pyx_CyFunction_USED + if (likely(PyFunction_Check(descr) || __Pyx_CyFunction_Check(descr))) + #else + if (likely(PyFunction_Check(descr))) + #endif +#endif + { + meth_found = 1; + } else { + f = Py_TYPE(descr)->tp_descr_get; + if (f != NULL && PyDescr_IsData(descr)) { + attr = f(descr, obj, (PyObject *)Py_TYPE(obj)); + Py_DECREF(descr); + goto try_unpack; + } + } + } + dictptr = _PyObject_GetDictPtr(obj); + if (dictptr != NULL && (dict = *dictptr) != NULL) { + Py_INCREF(dict); + attr = __Pyx_PyDict_GetItemStr(dict, name); + if (attr != NULL) { + Py_INCREF(attr); + Py_DECREF(dict); + Py_XDECREF(descr); + goto try_unpack; + } + Py_DECREF(dict); + } + if (meth_found) { + *method = descr; + return 1; + } + if (f != NULL) { + attr = f(descr, obj, (PyObject *)Py_TYPE(obj)); + Py_DECREF(descr); + goto try_unpack; + } + if (descr != NULL) { + *method = descr; + return 0; + } + PyErr_Format(PyExc_AttributeError, +#if PY_MAJOR_VERSION >= 3 + "'%.50s' object has no attribute '%U'", + tp->tp_name, name); +#else + "'%.50s' object has no attribute '%.400s'", + tp->tp_name, PyString_AS_STRING(name)); +#endif + return 0; +#else + attr = __Pyx_PyObject_GetAttrStr(obj, name); + goto try_unpack; +#endif +try_unpack: +#if CYTHON_UNPACK_METHODS + if (likely(attr) && PyMethod_Check(attr) && likely(PyMethod_GET_SELF(attr) == obj)) { + PyObject *function = PyMethod_GET_FUNCTION(attr); + Py_INCREF(function); + Py_DECREF(attr); + *method = function; + return 1; + } +#endif + *method = attr; + return 0; +} + +/* PyObjectCallMethod0 */ +static PyObject* __Pyx_PyObject_CallMethod0(PyObject* obj, PyObject* method_name) { + PyObject *method = NULL, *result = NULL; + int is_method = __Pyx_PyObject_GetMethod(obj, method_name, &method); + if (likely(is_method)) { + result = __Pyx_PyObject_CallOneArg(method, obj); + Py_DECREF(method); + return result; + } + if (unlikely(!method)) goto bad; + result = __Pyx_PyObject_CallNoArg(method); + Py_DECREF(method); +bad: + return result; +} + +/* RaiseNeedMoreValuesToUnpack */ +static CYTHON_INLINE void __Pyx_RaiseNeedMoreValuesError(Py_ssize_t index) { + PyErr_Format(PyExc_ValueError, + "need more than %" CYTHON_FORMAT_SSIZE_T "d value%.1s to unpack", + index, (index == 1) ? "" : "s"); +} + +/* RaiseTooManyValuesToUnpack */ +static CYTHON_INLINE void __Pyx_RaiseTooManyValuesError(Py_ssize_t expected) { + PyErr_Format(PyExc_ValueError, + "too many values to unpack (expected %" CYTHON_FORMAT_SSIZE_T "d)", expected); +} + +/* UnpackItemEndCheck */ +static int __Pyx_IternextUnpackEndCheck(PyObject *retval, Py_ssize_t expected) { + if (unlikely(retval)) { + Py_DECREF(retval); + __Pyx_RaiseTooManyValuesError(expected); + return -1; + } else { + return __Pyx_IterFinish(); + } + return 0; +} + +/* RaiseNoneIterError */ +static CYTHON_INLINE void __Pyx_RaiseNoneNotIterableError(void) { + PyErr_SetString(PyExc_TypeError, "'NoneType' object is not iterable"); +} + +/* UnpackTupleError */ +static void __Pyx_UnpackTupleError(PyObject *t, Py_ssize_t index) { + if (t == Py_None) { + __Pyx_RaiseNoneNotIterableError(); + } else if (PyTuple_GET_SIZE(t) < index) { + __Pyx_RaiseNeedMoreValuesError(PyTuple_GET_SIZE(t)); + } else { + __Pyx_RaiseTooManyValuesError(index); + } +} + +/* UnpackTuple2 */ +static CYTHON_INLINE int __Pyx_unpack_tuple2_exact( + PyObject* tuple, PyObject** pvalue1, PyObject** pvalue2, int decref_tuple) { + PyObject *value1 = NULL, *value2 = NULL; +#if CYTHON_COMPILING_IN_PYPY + value1 = PySequence_ITEM(tuple, 0); if (unlikely(!value1)) goto bad; + value2 = PySequence_ITEM(tuple, 1); if (unlikely(!value2)) goto bad; +#else + value1 = PyTuple_GET_ITEM(tuple, 0); Py_INCREF(value1); + value2 = PyTuple_GET_ITEM(tuple, 1); Py_INCREF(value2); +#endif + if (decref_tuple) { + Py_DECREF(tuple); + } + *pvalue1 = value1; + *pvalue2 = value2; + return 0; +#if CYTHON_COMPILING_IN_PYPY +bad: + Py_XDECREF(value1); + Py_XDECREF(value2); + if (decref_tuple) { Py_XDECREF(tuple); } + return -1; +#endif +} +static int __Pyx_unpack_tuple2_generic(PyObject* tuple, PyObject** pvalue1, PyObject** pvalue2, + int has_known_size, int decref_tuple) { + Py_ssize_t index; + PyObject *value1 = NULL, *value2 = NULL, *iter = NULL; + iternextfunc iternext; + iter = PyObject_GetIter(tuple); + if (unlikely(!iter)) goto bad; + if (decref_tuple) { Py_DECREF(tuple); tuple = NULL; } + iternext = Py_TYPE(iter)->tp_iternext; + value1 = iternext(iter); if (unlikely(!value1)) { index = 0; goto unpacking_failed; } + value2 = iternext(iter); if (unlikely(!value2)) { index = 1; goto unpacking_failed; } + if (!has_known_size && unlikely(__Pyx_IternextUnpackEndCheck(iternext(iter), 2))) goto bad; + Py_DECREF(iter); + *pvalue1 = value1; + *pvalue2 = value2; + return 0; +unpacking_failed: + if (!has_known_size && __Pyx_IterFinish() == 0) + __Pyx_RaiseNeedMoreValuesError(index); +bad: + Py_XDECREF(iter); + Py_XDECREF(value1); + Py_XDECREF(value2); + if (decref_tuple) { Py_XDECREF(tuple); } + return -1; +} + +/* dict_iter */ +static CYTHON_INLINE PyObject* __Pyx_dict_iterator(PyObject* iterable, int is_dict, PyObject* method_name, + Py_ssize_t* p_orig_length, int* p_source_is_dict) { + is_dict = is_dict || likely(PyDict_CheckExact(iterable)); + *p_source_is_dict = is_dict; + if (is_dict) { +#if !CYTHON_COMPILING_IN_PYPY + *p_orig_length = PyDict_Size(iterable); + Py_INCREF(iterable); + return iterable; +#elif PY_MAJOR_VERSION >= 3 + static PyObject *py_items = NULL, *py_keys = NULL, *py_values = NULL; + PyObject **pp = NULL; + if (method_name) { + const char *name = PyUnicode_AsUTF8(method_name); + if (strcmp(name, "iteritems") == 0) pp = &py_items; + else if (strcmp(name, "iterkeys") == 0) pp = &py_keys; + else if (strcmp(name, "itervalues") == 0) pp = &py_values; + if (pp) { + if (!*pp) { + *pp = PyUnicode_FromString(name + 4); + if (!*pp) + return NULL; + } + method_name = *pp; + } + } +#endif + } + *p_orig_length = 0; + if (method_name) { + PyObject* iter; + iterable = __Pyx_PyObject_CallMethod0(iterable, method_name); + if (!iterable) + return NULL; +#if !CYTHON_COMPILING_IN_PYPY + if (PyTuple_CheckExact(iterable) || PyList_CheckExact(iterable)) + return iterable; +#endif + iter = PyObject_GetIter(iterable); + Py_DECREF(iterable); + return iter; + } + return PyObject_GetIter(iterable); +} +static CYTHON_INLINE int __Pyx_dict_iter_next( + PyObject* iter_obj, CYTHON_NCP_UNUSED Py_ssize_t orig_length, CYTHON_NCP_UNUSED Py_ssize_t* ppos, + PyObject** pkey, PyObject** pvalue, PyObject** pitem, int source_is_dict) { + PyObject* next_item; +#if !CYTHON_COMPILING_IN_PYPY + if (source_is_dict) { + PyObject *key, *value; + if (unlikely(orig_length != PyDict_Size(iter_obj))) { + PyErr_SetString(PyExc_RuntimeError, "dictionary changed size during iteration"); + return -1; + } + if (unlikely(!PyDict_Next(iter_obj, ppos, &key, &value))) { + return 0; + } + if (pitem) { + PyObject* tuple = PyTuple_New(2); + if (unlikely(!tuple)) { + return -1; + } + Py_INCREF(key); + Py_INCREF(value); + PyTuple_SET_ITEM(tuple, 0, key); + PyTuple_SET_ITEM(tuple, 1, value); + *pitem = tuple; + } else { + if (pkey) { + Py_INCREF(key); + *pkey = key; + } + if (pvalue) { + Py_INCREF(value); + *pvalue = value; + } + } + return 1; + } else if (PyTuple_CheckExact(iter_obj)) { + Py_ssize_t pos = *ppos; + if (unlikely(pos >= PyTuple_GET_SIZE(iter_obj))) return 0; + *ppos = pos + 1; + next_item = PyTuple_GET_ITEM(iter_obj, pos); + Py_INCREF(next_item); + } else if (PyList_CheckExact(iter_obj)) { + Py_ssize_t pos = *ppos; + if (unlikely(pos >= PyList_GET_SIZE(iter_obj))) return 0; + *ppos = pos + 1; + next_item = PyList_GET_ITEM(iter_obj, pos); + Py_INCREF(next_item); + } else +#endif + { + next_item = PyIter_Next(iter_obj); + if (unlikely(!next_item)) { + return __Pyx_IterFinish(); + } + } + if (pitem) { + *pitem = next_item; + } else if (pkey && pvalue) { + if (__Pyx_unpack_tuple2(next_item, pkey, pvalue, source_is_dict, source_is_dict, 1)) + return -1; + } else if (pkey) { + *pkey = next_item; + } else { + *pvalue = next_item; + } + return 1; +} + +/* GetTopmostException */ +#if CYTHON_USE_EXC_INFO_STACK +static _PyErr_StackItem * +__Pyx_PyErr_GetTopmostException(PyThreadState *tstate) +{ + _PyErr_StackItem *exc_info = tstate->exc_info; + while ((exc_info->exc_type == NULL || exc_info->exc_type == Py_None) && + exc_info->previous_item != NULL) + { + exc_info = exc_info->previous_item; + } + return exc_info; +} +#endif + +/* ReRaiseException */ +static CYTHON_INLINE void __Pyx_ReraiseException(void) { + PyObject *type = NULL, *value = NULL, *tb = NULL; +#if CYTHON_FAST_THREAD_STATE + PyThreadState *tstate = PyThreadState_GET(); + #if CYTHON_USE_EXC_INFO_STACK + _PyErr_StackItem *exc_info = __Pyx_PyErr_GetTopmostException(tstate); + type = exc_info->exc_type; + value = exc_info->exc_value; + tb = exc_info->exc_traceback; + #else + type = tstate->exc_type; + value = tstate->exc_value; + tb = tstate->exc_traceback; + #endif +#else + PyErr_GetExcInfo(&type, &value, &tb); +#endif + if (!type || type == Py_None) { +#if !CYTHON_FAST_THREAD_STATE + Py_XDECREF(type); + Py_XDECREF(value); + Py_XDECREF(tb); +#endif + PyErr_SetString(PyExc_RuntimeError, + "No active exception to reraise"); + } else { +#if CYTHON_FAST_THREAD_STATE + Py_INCREF(type); + Py_XINCREF(value); + Py_XINCREF(tb); +#endif + PyErr_Restore(type, value, tb); + } +} + +/* GetException */ +#if CYTHON_FAST_THREAD_STATE +static int __Pyx__GetException(PyThreadState *tstate, PyObject **type, PyObject **value, PyObject **tb) +#else +static int __Pyx_GetException(PyObject **type, PyObject **value, PyObject **tb) +#endif +{ + PyObject *local_type, *local_value, *local_tb; +#if CYTHON_FAST_THREAD_STATE + PyObject *tmp_type, *tmp_value, *tmp_tb; + local_type = tstate->curexc_type; + local_value = tstate->curexc_value; + local_tb = tstate->curexc_traceback; + tstate->curexc_type = 0; + tstate->curexc_value = 0; + tstate->curexc_traceback = 0; +#else + PyErr_Fetch(&local_type, &local_value, &local_tb); +#endif + PyErr_NormalizeException(&local_type, &local_value, &local_tb); +#if CYTHON_FAST_THREAD_STATE + if (unlikely(tstate->curexc_type)) +#else + if (unlikely(PyErr_Occurred())) +#endif + goto bad; + #if PY_MAJOR_VERSION >= 3 + if (local_tb) { + if (unlikely(PyException_SetTraceback(local_value, local_tb) < 0)) + goto bad; + } + #endif + Py_XINCREF(local_tb); + Py_XINCREF(local_type); + Py_XINCREF(local_value); + *type = local_type; + *value = local_value; + *tb = local_tb; +#if CYTHON_FAST_THREAD_STATE + #if CYTHON_USE_EXC_INFO_STACK + { + _PyErr_StackItem *exc_info = tstate->exc_info; + tmp_type = exc_info->exc_type; + tmp_value = exc_info->exc_value; + tmp_tb = exc_info->exc_traceback; + exc_info->exc_type = local_type; + exc_info->exc_value = local_value; + exc_info->exc_traceback = local_tb; + } + #else + tmp_type = tstate->exc_type; + tmp_value = tstate->exc_value; + tmp_tb = tstate->exc_traceback; + tstate->exc_type = local_type; + tstate->exc_value = local_value; + tstate->exc_traceback = local_tb; + #endif + Py_XDECREF(tmp_type); + Py_XDECREF(tmp_value); + Py_XDECREF(tmp_tb); +#else + PyErr_SetExcInfo(local_type, local_value, local_tb); +#endif + return 0; +bad: + *type = 0; + *value = 0; + *tb = 0; + Py_XDECREF(local_type); + Py_XDECREF(local_value); + Py_XDECREF(local_tb); + return -1; +} + +/* SwapException */ +#if CYTHON_FAST_THREAD_STATE +static CYTHON_INLINE void __Pyx__ExceptionSwap(PyThreadState *tstate, PyObject **type, PyObject **value, PyObject **tb) { + PyObject *tmp_type, *tmp_value, *tmp_tb; + #if CYTHON_USE_EXC_INFO_STACK + _PyErr_StackItem *exc_info = tstate->exc_info; + tmp_type = exc_info->exc_type; + tmp_value = exc_info->exc_value; + tmp_tb = exc_info->exc_traceback; + exc_info->exc_type = *type; + exc_info->exc_value = *value; + exc_info->exc_traceback = *tb; + #else + tmp_type = tstate->exc_type; + tmp_value = tstate->exc_value; + tmp_tb = tstate->exc_traceback; + tstate->exc_type = *type; + tstate->exc_value = *value; + tstate->exc_traceback = *tb; + #endif + *type = tmp_type; + *value = tmp_value; + *tb = tmp_tb; +} +#else +static CYTHON_INLINE void __Pyx_ExceptionSwap(PyObject **type, PyObject **value, PyObject **tb) { + PyObject *tmp_type, *tmp_value, *tmp_tb; + PyErr_GetExcInfo(&tmp_type, &tmp_value, &tmp_tb); + PyErr_SetExcInfo(*type, *value, *tb); + *type = tmp_type; + *value = tmp_value; + *tb = tmp_tb; +} +#endif + +/* SaveResetException */ +#if CYTHON_FAST_THREAD_STATE +static CYTHON_INLINE void __Pyx__ExceptionSave(PyThreadState *tstate, PyObject **type, PyObject **value, PyObject **tb) { + #if CYTHON_USE_EXC_INFO_STACK + _PyErr_StackItem *exc_info = __Pyx_PyErr_GetTopmostException(tstate); + *type = exc_info->exc_type; + *value = exc_info->exc_value; + *tb = exc_info->exc_traceback; + #else + *type = tstate->exc_type; + *value = tstate->exc_value; + *tb = tstate->exc_traceback; + #endif + Py_XINCREF(*type); + Py_XINCREF(*value); + Py_XINCREF(*tb); +} +static CYTHON_INLINE void __Pyx__ExceptionReset(PyThreadState *tstate, PyObject *type, PyObject *value, PyObject *tb) { + PyObject *tmp_type, *tmp_value, *tmp_tb; + #if CYTHON_USE_EXC_INFO_STACK + _PyErr_StackItem *exc_info = tstate->exc_info; + tmp_type = exc_info->exc_type; + tmp_value = exc_info->exc_value; + tmp_tb = exc_info->exc_traceback; + exc_info->exc_type = type; + exc_info->exc_value = value; + exc_info->exc_traceback = tb; + #else + tmp_type = tstate->exc_type; + tmp_value = tstate->exc_value; + tmp_tb = tstate->exc_traceback; + tstate->exc_type = type; + tstate->exc_value = value; + tstate->exc_traceback = tb; + #endif + Py_XDECREF(tmp_type); + Py_XDECREF(tmp_value); + Py_XDECREF(tmp_tb); +} +#endif + +/* TypeImport */ +#ifndef __PYX_HAVE_RT_ImportType +#define __PYX_HAVE_RT_ImportType +static PyTypeObject *__Pyx_ImportType(PyObject *module, const char *module_name, const char *class_name, + size_t size, enum __Pyx_ImportType_CheckSize check_size) +{ + PyObject *result = 0; + char warning[200]; + Py_ssize_t basicsize; +#ifdef Py_LIMITED_API + PyObject *py_basicsize; +#endif + result = PyObject_GetAttrString(module, class_name); + if (!result) + goto bad; + if (!PyType_Check(result)) { + PyErr_Format(PyExc_TypeError, + "%.200s.%.200s is not a type object", + module_name, class_name); + goto bad; + } +#ifndef Py_LIMITED_API + basicsize = ((PyTypeObject *)result)->tp_basicsize; +#else + py_basicsize = PyObject_GetAttrString(result, "__basicsize__"); + if (!py_basicsize) + goto bad; + basicsize = PyLong_AsSsize_t(py_basicsize); + Py_DECREF(py_basicsize); + py_basicsize = 0; + if (basicsize == (Py_ssize_t)-1 && PyErr_Occurred()) + goto bad; +#endif + if ((size_t)basicsize < size) { + PyErr_Format(PyExc_ValueError, + "%.200s.%.200s size changed, may indicate binary incompatibility. " + "Expected %zd from C header, got %zd from PyObject", + module_name, class_name, size, basicsize); + goto bad; + } + if (check_size == __Pyx_ImportType_CheckSize_Error && (size_t)basicsize != size) { + PyErr_Format(PyExc_ValueError, + "%.200s.%.200s size changed, may indicate binary incompatibility. " + "Expected %zd from C header, got %zd from PyObject", + module_name, class_name, size, basicsize); + goto bad; + } + else if (check_size == __Pyx_ImportType_CheckSize_Warn && (size_t)basicsize > size) { + PyOS_snprintf(warning, sizeof(warning), + "%s.%s size changed, may indicate binary incompatibility. " + "Expected %zd from C header, got %zd from PyObject", + module_name, class_name, size, basicsize); + if (PyErr_WarnEx(NULL, warning, 0) < 0) goto bad; + } + return (PyTypeObject *)result; +bad: + Py_XDECREF(result); + return NULL; +} +#endif + +/* Import */ +static PyObject *__Pyx_Import(PyObject *name, PyObject *from_list, int level) { + PyObject *empty_list = 0; + PyObject *module = 0; + PyObject *global_dict = 0; + PyObject *empty_dict = 0; + PyObject *list; + #if PY_MAJOR_VERSION < 3 + PyObject *py_import; + py_import = __Pyx_PyObject_GetAttrStr(__pyx_b, __pyx_n_s_import); + if (!py_import) + goto bad; + #endif + if (from_list) + list = from_list; + else { + empty_list = PyList_New(0); + if (!empty_list) + goto bad; + list = empty_list; + } + global_dict = PyModule_GetDict(__pyx_m); + if (!global_dict) + goto bad; + empty_dict = PyDict_New(); + if (!empty_dict) + goto bad; + { + #if PY_MAJOR_VERSION >= 3 + if (level == -1) { + if ((1) && (strchr(__Pyx_MODULE_NAME, '.'))) { + module = PyImport_ImportModuleLevelObject( + name, global_dict, empty_dict, list, 1); + if (!module) { + if (!PyErr_ExceptionMatches(PyExc_ImportError)) + goto bad; + PyErr_Clear(); + } + } + level = 0; + } + #endif + if (!module) { + #if PY_MAJOR_VERSION < 3 + PyObject *py_level = PyInt_FromLong(level); + if (!py_level) + goto bad; + module = PyObject_CallFunctionObjArgs(py_import, + name, global_dict, empty_dict, list, py_level, (PyObject *)NULL); + Py_DECREF(py_level); + #else + module = PyImport_ImportModuleLevelObject( + name, global_dict, empty_dict, list, level); + #endif + } + } +bad: + #if PY_MAJOR_VERSION < 3 + Py_XDECREF(py_import); + #endif + Py_XDECREF(empty_list); + Py_XDECREF(empty_dict); + return module; +} + +/* ImportFrom */ +static PyObject* __Pyx_ImportFrom(PyObject* module, PyObject* name) { + PyObject* value = __Pyx_PyObject_GetAttrStr(module, name); + if (unlikely(!value) && PyErr_ExceptionMatches(PyExc_AttributeError)) { + PyErr_Format(PyExc_ImportError, + #if PY_MAJOR_VERSION < 3 + "cannot import name %.230s", PyString_AS_STRING(name)); + #else + "cannot import name %S", name); + #endif + } + return value; +} + +/* PyDictVersioning */ +#if CYTHON_USE_DICT_VERSIONS && CYTHON_USE_TYPE_SLOTS +static CYTHON_INLINE PY_UINT64_T __Pyx_get_tp_dict_version(PyObject *obj) { + PyObject *dict = Py_TYPE(obj)->tp_dict; + return likely(dict) ? __PYX_GET_DICT_VERSION(dict) : 0; +} +static CYTHON_INLINE PY_UINT64_T __Pyx_get_object_dict_version(PyObject *obj) { + PyObject **dictptr = NULL; + Py_ssize_t offset = Py_TYPE(obj)->tp_dictoffset; + if (offset) { +#if CYTHON_COMPILING_IN_CPYTHON + dictptr = (likely(offset > 0)) ? (PyObject **) ((char *)obj + offset) : _PyObject_GetDictPtr(obj); +#else + dictptr = _PyObject_GetDictPtr(obj); +#endif + } + return (dictptr && *dictptr) ? __PYX_GET_DICT_VERSION(*dictptr) : 0; +} +static CYTHON_INLINE int __Pyx_object_dict_version_matches(PyObject* obj, PY_UINT64_T tp_dict_version, PY_UINT64_T obj_dict_version) { + PyObject *dict = Py_TYPE(obj)->tp_dict; + if (unlikely(!dict) || unlikely(tp_dict_version != __PYX_GET_DICT_VERSION(dict))) + return 0; + return obj_dict_version == __Pyx_get_object_dict_version(obj); +} +#endif + +/* GetModuleGlobalName */ +#if CYTHON_USE_DICT_VERSIONS +static PyObject *__Pyx__GetModuleGlobalName(PyObject *name, PY_UINT64_T *dict_version, PyObject **dict_cached_value) +#else +static CYTHON_INLINE PyObject *__Pyx__GetModuleGlobalName(PyObject *name) +#endif +{ + PyObject *result; +#if !CYTHON_AVOID_BORROWED_REFS +#if CYTHON_COMPILING_IN_CPYTHON && PY_VERSION_HEX >= 0x030500A1 + result = _PyDict_GetItem_KnownHash(__pyx_d, name, ((PyASCIIObject *) name)->hash); + __PYX_UPDATE_DICT_CACHE(__pyx_d, result, *dict_cached_value, *dict_version) + if (likely(result)) { + return __Pyx_NewRef(result); + } else if (unlikely(PyErr_Occurred())) { + return NULL; + } +#else + result = PyDict_GetItem(__pyx_d, name); + __PYX_UPDATE_DICT_CACHE(__pyx_d, result, *dict_cached_value, *dict_version) + if (likely(result)) { + return __Pyx_NewRef(result); + } +#endif +#else + result = PyObject_GetItem(__pyx_d, name); + __PYX_UPDATE_DICT_CACHE(__pyx_d, result, *dict_cached_value, *dict_version) + if (likely(result)) { + return __Pyx_NewRef(result); + } + PyErr_Clear(); +#endif + return __Pyx_GetBuiltinName(name); +} + +/* CLineInTraceback */ +#ifndef CYTHON_CLINE_IN_TRACEBACK +static int __Pyx_CLineForTraceback(CYTHON_NCP_UNUSED PyThreadState *tstate, int c_line) { + PyObject *use_cline; + PyObject *ptype, *pvalue, *ptraceback; +#if CYTHON_COMPILING_IN_CPYTHON + PyObject **cython_runtime_dict; +#endif + if (unlikely(!__pyx_cython_runtime)) { + return c_line; + } + __Pyx_ErrFetchInState(tstate, &ptype, &pvalue, &ptraceback); +#if CYTHON_COMPILING_IN_CPYTHON + cython_runtime_dict = _PyObject_GetDictPtr(__pyx_cython_runtime); + if (likely(cython_runtime_dict)) { + __PYX_PY_DICT_LOOKUP_IF_MODIFIED( + use_cline, *cython_runtime_dict, + __Pyx_PyDict_GetItemStr(*cython_runtime_dict, __pyx_n_s_cline_in_traceback)) + } else +#endif + { + PyObject *use_cline_obj = __Pyx_PyObject_GetAttrStr(__pyx_cython_runtime, __pyx_n_s_cline_in_traceback); + if (use_cline_obj) { + use_cline = PyObject_Not(use_cline_obj) ? Py_False : Py_True; + Py_DECREF(use_cline_obj); + } else { + PyErr_Clear(); + use_cline = NULL; + } + } + if (!use_cline) { + c_line = 0; + PyObject_SetAttr(__pyx_cython_runtime, __pyx_n_s_cline_in_traceback, Py_False); + } + else if (use_cline == Py_False || (use_cline != Py_True && PyObject_Not(use_cline) != 0)) { + c_line = 0; + } + __Pyx_ErrRestoreInState(tstate, ptype, pvalue, ptraceback); + return c_line; +} +#endif + +/* CodeObjectCache */ +static int __pyx_bisect_code_objects(__Pyx_CodeObjectCacheEntry* entries, int count, int code_line) { + int start = 0, mid = 0, end = count - 1; + if (end >= 0 && code_line > entries[end].code_line) { + return count; + } + while (start < end) { + mid = start + (end - start) / 2; + if (code_line < entries[mid].code_line) { + end = mid; + } else if (code_line > entries[mid].code_line) { + start = mid + 1; + } else { + return mid; + } + } + if (code_line <= entries[mid].code_line) { + return mid; + } else { + return mid + 1; + } +} +static PyCodeObject *__pyx_find_code_object(int code_line) { + PyCodeObject* code_object; + int pos; + if (unlikely(!code_line) || unlikely(!__pyx_code_cache.entries)) { + return NULL; + } + pos = __pyx_bisect_code_objects(__pyx_code_cache.entries, __pyx_code_cache.count, code_line); + if (unlikely(pos >= __pyx_code_cache.count) || unlikely(__pyx_code_cache.entries[pos].code_line != code_line)) { + return NULL; + } + code_object = __pyx_code_cache.entries[pos].code_object; + Py_INCREF(code_object); + return code_object; +} +static void __pyx_insert_code_object(int code_line, PyCodeObject* code_object) { + int pos, i; + __Pyx_CodeObjectCacheEntry* entries = __pyx_code_cache.entries; + if (unlikely(!code_line)) { + return; + } + if (unlikely(!entries)) { + entries = (__Pyx_CodeObjectCacheEntry*)PyMem_Malloc(64*sizeof(__Pyx_CodeObjectCacheEntry)); + if (likely(entries)) { + __pyx_code_cache.entries = entries; + __pyx_code_cache.max_count = 64; + __pyx_code_cache.count = 1; + entries[0].code_line = code_line; + entries[0].code_object = code_object; + Py_INCREF(code_object); + } + return; + } + pos = __pyx_bisect_code_objects(__pyx_code_cache.entries, __pyx_code_cache.count, code_line); + if ((pos < __pyx_code_cache.count) && unlikely(__pyx_code_cache.entries[pos].code_line == code_line)) { + PyCodeObject* tmp = entries[pos].code_object; + entries[pos].code_object = code_object; + Py_DECREF(tmp); + return; + } + if (__pyx_code_cache.count == __pyx_code_cache.max_count) { + int new_max = __pyx_code_cache.max_count + 64; + entries = (__Pyx_CodeObjectCacheEntry*)PyMem_Realloc( + __pyx_code_cache.entries, ((size_t)new_max) * sizeof(__Pyx_CodeObjectCacheEntry)); + if (unlikely(!entries)) { + return; + } + __pyx_code_cache.entries = entries; + __pyx_code_cache.max_count = new_max; + } + for (i=__pyx_code_cache.count; i>pos; i--) { + entries[i] = entries[i-1]; + } + entries[pos].code_line = code_line; + entries[pos].code_object = code_object; + __pyx_code_cache.count++; + Py_INCREF(code_object); +} + +/* AddTraceback */ +#include "compile.h" +#include "frameobject.h" +#include "traceback.h" +static PyCodeObject* __Pyx_CreateCodeObjectForTraceback( + const char *funcname, int c_line, + int py_line, const char *filename) { + PyCodeObject *py_code = 0; + PyObject *py_srcfile = 0; + PyObject *py_funcname = 0; + #if PY_MAJOR_VERSION < 3 + py_srcfile = PyString_FromString(filename); + #else + py_srcfile = PyUnicode_FromString(filename); + #endif + if (!py_srcfile) goto bad; + if (c_line) { + #if PY_MAJOR_VERSION < 3 + py_funcname = PyString_FromFormat( "%s (%s:%d)", funcname, __pyx_cfilenm, c_line); + #else + py_funcname = PyUnicode_FromFormat( "%s (%s:%d)", funcname, __pyx_cfilenm, c_line); + #endif + } + else { + #if PY_MAJOR_VERSION < 3 + py_funcname = PyString_FromString(funcname); + #else + py_funcname = PyUnicode_FromString(funcname); + #endif + } + if (!py_funcname) goto bad; + py_code = __Pyx_PyCode_New( + 0, + 0, + 0, + 0, + 0, + __pyx_empty_bytes, /*PyObject *code,*/ + __pyx_empty_tuple, /*PyObject *consts,*/ + __pyx_empty_tuple, /*PyObject *names,*/ + __pyx_empty_tuple, /*PyObject *varnames,*/ + __pyx_empty_tuple, /*PyObject *freevars,*/ + __pyx_empty_tuple, /*PyObject *cellvars,*/ + py_srcfile, /*PyObject *filename,*/ + py_funcname, /*PyObject *name,*/ + py_line, + __pyx_empty_bytes /*PyObject *lnotab*/ + ); + Py_DECREF(py_srcfile); + Py_DECREF(py_funcname); + return py_code; +bad: + Py_XDECREF(py_srcfile); + Py_XDECREF(py_funcname); + return NULL; +} +static void __Pyx_AddTraceback(const char *funcname, int c_line, + int py_line, const char *filename) { + PyCodeObject *py_code = 0; + PyFrameObject *py_frame = 0; + PyThreadState *tstate = __Pyx_PyThreadState_Current; + if (c_line) { + c_line = __Pyx_CLineForTraceback(tstate, c_line); + } + py_code = __pyx_find_code_object(c_line ? -c_line : py_line); + if (!py_code) { + py_code = __Pyx_CreateCodeObjectForTraceback( + funcname, c_line, py_line, filename); + if (!py_code) goto bad; + __pyx_insert_code_object(c_line ? -c_line : py_line, py_code); + } + py_frame = PyFrame_New( + tstate, /*PyThreadState *tstate,*/ + py_code, /*PyCodeObject *code,*/ + __pyx_d, /*PyObject *globals,*/ + 0 /*PyObject *locals*/ + ); + if (!py_frame) goto bad; + __Pyx_PyFrame_SetLineNumber(py_frame, py_line); + PyTraceBack_Here(py_frame); +bad: + Py_XDECREF(py_code); + Py_XDECREF(py_frame); +} + +/* CIntToPy */ +static CYTHON_INLINE PyObject* __Pyx_PyInt_From_long(long value) { +#ifdef __Pyx_HAS_GCC_DIAGNOSTIC +#pragma GCC diagnostic push +#pragma GCC diagnostic ignored "-Wconversion" +#endif + const long neg_one = (long) -1, const_zero = (long) 0; +#ifdef __Pyx_HAS_GCC_DIAGNOSTIC +#pragma GCC diagnostic pop +#endif + const int is_unsigned = neg_one > const_zero; + if (is_unsigned) { + if (sizeof(long) < sizeof(long)) { + return PyInt_FromLong((long) value); + } else if (sizeof(long) <= sizeof(unsigned long)) { + return PyLong_FromUnsignedLong((unsigned long) value); +#ifdef HAVE_LONG_LONG + } else if (sizeof(long) <= sizeof(unsigned PY_LONG_LONG)) { + return PyLong_FromUnsignedLongLong((unsigned PY_LONG_LONG) value); +#endif + } + } else { + if (sizeof(long) <= sizeof(long)) { + return PyInt_FromLong((long) value); +#ifdef HAVE_LONG_LONG + } else if (sizeof(long) <= sizeof(PY_LONG_LONG)) { + return PyLong_FromLongLong((PY_LONG_LONG) value); +#endif + } + } + { + int one = 1; int little = (int)*(unsigned char *)&one; + unsigned char *bytes = (unsigned char *)&value; + return _PyLong_FromByteArray(bytes, sizeof(long), + little, !is_unsigned); + } +} + +/* CIntFromPyVerify */ +#define __PYX_VERIFY_RETURN_INT(target_type, func_type, func_value)\ + __PYX__VERIFY_RETURN_INT(target_type, func_type, func_value, 0) +#define __PYX_VERIFY_RETURN_INT_EXC(target_type, func_type, func_value)\ + __PYX__VERIFY_RETURN_INT(target_type, func_type, func_value, 1) +#define __PYX__VERIFY_RETURN_INT(target_type, func_type, func_value, exc)\ + {\ + func_type value = func_value;\ + if (sizeof(target_type) < sizeof(func_type)) {\ + if (unlikely(value != (func_type) (target_type) value)) {\ + func_type zero = 0;\ + if (exc && unlikely(value == (func_type)-1 && PyErr_Occurred()))\ + return (target_type) -1;\ + if (is_unsigned && unlikely(value < zero))\ + goto raise_neg_overflow;\ + else\ + goto raise_overflow;\ + }\ + }\ + return (target_type) value;\ + } + +/* CIntFromPy */ +static CYTHON_INLINE long __Pyx_PyInt_As_long(PyObject *x) { +#ifdef __Pyx_HAS_GCC_DIAGNOSTIC +#pragma GCC diagnostic push +#pragma GCC diagnostic ignored "-Wconversion" +#endif + const long neg_one = (long) -1, const_zero = (long) 0; +#ifdef __Pyx_HAS_GCC_DIAGNOSTIC +#pragma GCC diagnostic pop +#endif + const int is_unsigned = neg_one > const_zero; +#if PY_MAJOR_VERSION < 3 + if (likely(PyInt_Check(x))) { + if (sizeof(long) < sizeof(long)) { + __PYX_VERIFY_RETURN_INT(long, long, PyInt_AS_LONG(x)) + } else { + long val = PyInt_AS_LONG(x); + if (is_unsigned && unlikely(val < 0)) { + goto raise_neg_overflow; + } + return (long) val; + } + } else +#endif + if (likely(PyLong_Check(x))) { + if (is_unsigned) { +#if CYTHON_USE_PYLONG_INTERNALS + const digit* digits = ((PyLongObject*)x)->ob_digit; + switch (Py_SIZE(x)) { + case 0: return (long) 0; + case 1: __PYX_VERIFY_RETURN_INT(long, digit, digits[0]) + case 2: + if (8 * sizeof(long) > 1 * PyLong_SHIFT) { + if (8 * sizeof(unsigned long) > 2 * PyLong_SHIFT) { + __PYX_VERIFY_RETURN_INT(long, unsigned long, (((((unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) + } else if (8 * sizeof(long) >= 2 * PyLong_SHIFT) { + return (long) (((((long)digits[1]) << PyLong_SHIFT) | (long)digits[0])); + } + } + break; + case 3: + if (8 * sizeof(long) > 2 * PyLong_SHIFT) { + if (8 * sizeof(unsigned long) > 3 * PyLong_SHIFT) { + __PYX_VERIFY_RETURN_INT(long, unsigned long, (((((((unsigned long)digits[2]) << PyLong_SHIFT) | (unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) + } else if (8 * sizeof(long) >= 3 * PyLong_SHIFT) { + return (long) (((((((long)digits[2]) << PyLong_SHIFT) | (long)digits[1]) << PyLong_SHIFT) | (long)digits[0])); + } + } + break; + case 4: + if (8 * sizeof(long) > 3 * PyLong_SHIFT) { + if (8 * sizeof(unsigned long) > 4 * PyLong_SHIFT) { + __PYX_VERIFY_RETURN_INT(long, unsigned long, (((((((((unsigned long)digits[3]) << PyLong_SHIFT) | (unsigned long)digits[2]) << PyLong_SHIFT) | (unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) + } else if (8 * sizeof(long) >= 4 * PyLong_SHIFT) { + return (long) (((((((((long)digits[3]) << PyLong_SHIFT) | (long)digits[2]) << PyLong_SHIFT) | (long)digits[1]) << PyLong_SHIFT) | (long)digits[0])); + } + } + break; + } +#endif +#if CYTHON_COMPILING_IN_CPYTHON + if (unlikely(Py_SIZE(x) < 0)) { + goto raise_neg_overflow; + } +#else + { + int result = PyObject_RichCompareBool(x, Py_False, Py_LT); + if (unlikely(result < 0)) + return (long) -1; + if (unlikely(result == 1)) + goto raise_neg_overflow; + } +#endif + if (sizeof(long) <= sizeof(unsigned long)) { + __PYX_VERIFY_RETURN_INT_EXC(long, unsigned long, PyLong_AsUnsignedLong(x)) +#ifdef HAVE_LONG_LONG + } else if (sizeof(long) <= sizeof(unsigned PY_LONG_LONG)) { + __PYX_VERIFY_RETURN_INT_EXC(long, unsigned PY_LONG_LONG, PyLong_AsUnsignedLongLong(x)) +#endif + } + } else { +#if CYTHON_USE_PYLONG_INTERNALS + const digit* digits = ((PyLongObject*)x)->ob_digit; + switch (Py_SIZE(x)) { + case 0: return (long) 0; + case -1: __PYX_VERIFY_RETURN_INT(long, sdigit, (sdigit) (-(sdigit)digits[0])) + case 1: __PYX_VERIFY_RETURN_INT(long, digit, +digits[0]) + case -2: + if (8 * sizeof(long) - 1 > 1 * PyLong_SHIFT) { + if (8 * sizeof(unsigned long) > 2 * PyLong_SHIFT) { + __PYX_VERIFY_RETURN_INT(long, long, -(long) (((((unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) + } else if (8 * sizeof(long) - 1 > 2 * PyLong_SHIFT) { + return (long) (((long)-1)*(((((long)digits[1]) << PyLong_SHIFT) | (long)digits[0]))); + } + } + break; + case 2: + if (8 * sizeof(long) > 1 * PyLong_SHIFT) { + if (8 * sizeof(unsigned long) > 2 * PyLong_SHIFT) { + __PYX_VERIFY_RETURN_INT(long, unsigned long, (((((unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) + } else if (8 * sizeof(long) - 1 > 2 * PyLong_SHIFT) { + return (long) ((((((long)digits[1]) << PyLong_SHIFT) | (long)digits[0]))); + } + } + break; + case -3: + if (8 * sizeof(long) - 1 > 2 * PyLong_SHIFT) { + if (8 * sizeof(unsigned long) > 3 * PyLong_SHIFT) { + __PYX_VERIFY_RETURN_INT(long, long, -(long) (((((((unsigned long)digits[2]) << PyLong_SHIFT) | (unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) + } else if (8 * sizeof(long) - 1 > 3 * PyLong_SHIFT) { + return (long) (((long)-1)*(((((((long)digits[2]) << PyLong_SHIFT) | (long)digits[1]) << PyLong_SHIFT) | (long)digits[0]))); + } + } + break; + case 3: + if (8 * sizeof(long) > 2 * PyLong_SHIFT) { + if (8 * sizeof(unsigned long) > 3 * PyLong_SHIFT) { + __PYX_VERIFY_RETURN_INT(long, unsigned long, (((((((unsigned long)digits[2]) << PyLong_SHIFT) | (unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) + } else if (8 * sizeof(long) - 1 > 3 * PyLong_SHIFT) { + return (long) ((((((((long)digits[2]) << PyLong_SHIFT) | (long)digits[1]) << PyLong_SHIFT) | (long)digits[0]))); + } + } + break; + case -4: + if (8 * sizeof(long) - 1 > 3 * PyLong_SHIFT) { + if (8 * sizeof(unsigned long) > 4 * PyLong_SHIFT) { + __PYX_VERIFY_RETURN_INT(long, long, -(long) (((((((((unsigned long)digits[3]) << PyLong_SHIFT) | (unsigned long)digits[2]) << PyLong_SHIFT) | (unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) + } else if (8 * sizeof(long) - 1 > 4 * PyLong_SHIFT) { + return (long) (((long)-1)*(((((((((long)digits[3]) << PyLong_SHIFT) | (long)digits[2]) << PyLong_SHIFT) | (long)digits[1]) << PyLong_SHIFT) | (long)digits[0]))); + } + } + break; + case 4: + if (8 * sizeof(long) > 3 * PyLong_SHIFT) { + if (8 * sizeof(unsigned long) > 4 * PyLong_SHIFT) { + __PYX_VERIFY_RETURN_INT(long, unsigned long, (((((((((unsigned long)digits[3]) << PyLong_SHIFT) | (unsigned long)digits[2]) << PyLong_SHIFT) | (unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) + } else if (8 * sizeof(long) - 1 > 4 * PyLong_SHIFT) { + return (long) ((((((((((long)digits[3]) << PyLong_SHIFT) | (long)digits[2]) << PyLong_SHIFT) | (long)digits[1]) << PyLong_SHIFT) | (long)digits[0]))); + } + } + break; + } +#endif + if (sizeof(long) <= sizeof(long)) { + __PYX_VERIFY_RETURN_INT_EXC(long, long, PyLong_AsLong(x)) +#ifdef HAVE_LONG_LONG + } else if (sizeof(long) <= sizeof(PY_LONG_LONG)) { + __PYX_VERIFY_RETURN_INT_EXC(long, PY_LONG_LONG, PyLong_AsLongLong(x)) +#endif + } + } + { +#if CYTHON_COMPILING_IN_PYPY && !defined(_PyLong_AsByteArray) + PyErr_SetString(PyExc_RuntimeError, + "_PyLong_AsByteArray() not available in PyPy, cannot convert large numbers"); +#else + long val; + PyObject *v = __Pyx_PyNumber_IntOrLong(x); + #if PY_MAJOR_VERSION < 3 + if (likely(v) && !PyLong_Check(v)) { + PyObject *tmp = v; + v = PyNumber_Long(tmp); + Py_DECREF(tmp); + } + #endif + if (likely(v)) { + int one = 1; int is_little = (int)*(unsigned char *)&one; + unsigned char *bytes = (unsigned char *)&val; + int ret = _PyLong_AsByteArray((PyLongObject *)v, + bytes, sizeof(val), + is_little, !is_unsigned); + Py_DECREF(v); + if (likely(!ret)) + return val; + } +#endif + return (long) -1; + } + } else { + long val; + PyObject *tmp = __Pyx_PyNumber_IntOrLong(x); + if (!tmp) return (long) -1; + val = __Pyx_PyInt_As_long(tmp); + Py_DECREF(tmp); + return val; + } +raise_overflow: + PyErr_SetString(PyExc_OverflowError, + "value too large to convert to long"); + return (long) -1; +raise_neg_overflow: + PyErr_SetString(PyExc_OverflowError, + "can't convert negative value to long"); + return (long) -1; +} + +/* CIntFromPy */ +static CYTHON_INLINE int __Pyx_PyInt_As_int(PyObject *x) { +#ifdef __Pyx_HAS_GCC_DIAGNOSTIC +#pragma GCC diagnostic push +#pragma GCC diagnostic ignored "-Wconversion" +#endif + const int neg_one = (int) -1, const_zero = (int) 0; +#ifdef __Pyx_HAS_GCC_DIAGNOSTIC +#pragma GCC diagnostic pop +#endif + const int is_unsigned = neg_one > const_zero; +#if PY_MAJOR_VERSION < 3 + if (likely(PyInt_Check(x))) { + if (sizeof(int) < sizeof(long)) { + __PYX_VERIFY_RETURN_INT(int, long, PyInt_AS_LONG(x)) + } else { + long val = PyInt_AS_LONG(x); + if (is_unsigned && unlikely(val < 0)) { + goto raise_neg_overflow; + } + return (int) val; + } + } else +#endif + if (likely(PyLong_Check(x))) { + if (is_unsigned) { +#if CYTHON_USE_PYLONG_INTERNALS + const digit* digits = ((PyLongObject*)x)->ob_digit; + switch (Py_SIZE(x)) { + case 0: return (int) 0; + case 1: __PYX_VERIFY_RETURN_INT(int, digit, digits[0]) + case 2: + if (8 * sizeof(int) > 1 * PyLong_SHIFT) { + if (8 * sizeof(unsigned long) > 2 * PyLong_SHIFT) { + __PYX_VERIFY_RETURN_INT(int, unsigned long, (((((unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) + } else if (8 * sizeof(int) >= 2 * PyLong_SHIFT) { + return (int) (((((int)digits[1]) << PyLong_SHIFT) | (int)digits[0])); + } + } + break; + case 3: + if (8 * sizeof(int) > 2 * PyLong_SHIFT) { + if (8 * sizeof(unsigned long) > 3 * PyLong_SHIFT) { + __PYX_VERIFY_RETURN_INT(int, unsigned long, (((((((unsigned long)digits[2]) << PyLong_SHIFT) | (unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) + } else if (8 * sizeof(int) >= 3 * PyLong_SHIFT) { + return (int) (((((((int)digits[2]) << PyLong_SHIFT) | (int)digits[1]) << PyLong_SHIFT) | (int)digits[0])); + } + } + break; + case 4: + if (8 * sizeof(int) > 3 * PyLong_SHIFT) { + if (8 * sizeof(unsigned long) > 4 * PyLong_SHIFT) { + __PYX_VERIFY_RETURN_INT(int, unsigned long, (((((((((unsigned long)digits[3]) << PyLong_SHIFT) | (unsigned long)digits[2]) << PyLong_SHIFT) | (unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) + } else if (8 * sizeof(int) >= 4 * PyLong_SHIFT) { + return (int) (((((((((int)digits[3]) << PyLong_SHIFT) | (int)digits[2]) << PyLong_SHIFT) | (int)digits[1]) << PyLong_SHIFT) | (int)digits[0])); + } + } + break; + } +#endif +#if CYTHON_COMPILING_IN_CPYTHON + if (unlikely(Py_SIZE(x) < 0)) { + goto raise_neg_overflow; + } +#else + { + int result = PyObject_RichCompareBool(x, Py_False, Py_LT); + if (unlikely(result < 0)) + return (int) -1; + if (unlikely(result == 1)) + goto raise_neg_overflow; + } +#endif + if (sizeof(int) <= sizeof(unsigned long)) { + __PYX_VERIFY_RETURN_INT_EXC(int, unsigned long, PyLong_AsUnsignedLong(x)) +#ifdef HAVE_LONG_LONG + } else if (sizeof(int) <= sizeof(unsigned PY_LONG_LONG)) { + __PYX_VERIFY_RETURN_INT_EXC(int, unsigned PY_LONG_LONG, PyLong_AsUnsignedLongLong(x)) +#endif + } + } else { +#if CYTHON_USE_PYLONG_INTERNALS + const digit* digits = ((PyLongObject*)x)->ob_digit; + switch (Py_SIZE(x)) { + case 0: return (int) 0; + case -1: __PYX_VERIFY_RETURN_INT(int, sdigit, (sdigit) (-(sdigit)digits[0])) + case 1: __PYX_VERIFY_RETURN_INT(int, digit, +digits[0]) + case -2: + if (8 * sizeof(int) - 1 > 1 * PyLong_SHIFT) { + if (8 * sizeof(unsigned long) > 2 * PyLong_SHIFT) { + __PYX_VERIFY_RETURN_INT(int, long, -(long) (((((unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) + } else if (8 * sizeof(int) - 1 > 2 * PyLong_SHIFT) { + return (int) (((int)-1)*(((((int)digits[1]) << PyLong_SHIFT) | (int)digits[0]))); + } + } + break; + case 2: + if (8 * sizeof(int) > 1 * PyLong_SHIFT) { + if (8 * sizeof(unsigned long) > 2 * PyLong_SHIFT) { + __PYX_VERIFY_RETURN_INT(int, unsigned long, (((((unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) + } else if (8 * sizeof(int) - 1 > 2 * PyLong_SHIFT) { + return (int) ((((((int)digits[1]) << PyLong_SHIFT) | (int)digits[0]))); + } + } + break; + case -3: + if (8 * sizeof(int) - 1 > 2 * PyLong_SHIFT) { + if (8 * sizeof(unsigned long) > 3 * PyLong_SHIFT) { + __PYX_VERIFY_RETURN_INT(int, long, -(long) (((((((unsigned long)digits[2]) << PyLong_SHIFT) | (unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) + } else if (8 * sizeof(int) - 1 > 3 * PyLong_SHIFT) { + return (int) (((int)-1)*(((((((int)digits[2]) << PyLong_SHIFT) | (int)digits[1]) << PyLong_SHIFT) | (int)digits[0]))); + } + } + break; + case 3: + if (8 * sizeof(int) > 2 * PyLong_SHIFT) { + if (8 * sizeof(unsigned long) > 3 * PyLong_SHIFT) { + __PYX_VERIFY_RETURN_INT(int, unsigned long, (((((((unsigned long)digits[2]) << PyLong_SHIFT) | (unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) + } else if (8 * sizeof(int) - 1 > 3 * PyLong_SHIFT) { + return (int) ((((((((int)digits[2]) << PyLong_SHIFT) | (int)digits[1]) << PyLong_SHIFT) | (int)digits[0]))); + } + } + break; + case -4: + if (8 * sizeof(int) - 1 > 3 * PyLong_SHIFT) { + if (8 * sizeof(unsigned long) > 4 * PyLong_SHIFT) { + __PYX_VERIFY_RETURN_INT(int, long, -(long) (((((((((unsigned long)digits[3]) << PyLong_SHIFT) | (unsigned long)digits[2]) << PyLong_SHIFT) | (unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) + } else if (8 * sizeof(int) - 1 > 4 * PyLong_SHIFT) { + return (int) (((int)-1)*(((((((((int)digits[3]) << PyLong_SHIFT) | (int)digits[2]) << PyLong_SHIFT) | (int)digits[1]) << PyLong_SHIFT) | (int)digits[0]))); + } + } + break; + case 4: + if (8 * sizeof(int) > 3 * PyLong_SHIFT) { + if (8 * sizeof(unsigned long) > 4 * PyLong_SHIFT) { + __PYX_VERIFY_RETURN_INT(int, unsigned long, (((((((((unsigned long)digits[3]) << PyLong_SHIFT) | (unsigned long)digits[2]) << PyLong_SHIFT) | (unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) + } else if (8 * sizeof(int) - 1 > 4 * PyLong_SHIFT) { + return (int) ((((((((((int)digits[3]) << PyLong_SHIFT) | (int)digits[2]) << PyLong_SHIFT) | (int)digits[1]) << PyLong_SHIFT) | (int)digits[0]))); + } + } + break; + } +#endif + if (sizeof(int) <= sizeof(long)) { + __PYX_VERIFY_RETURN_INT_EXC(int, long, PyLong_AsLong(x)) +#ifdef HAVE_LONG_LONG + } else if (sizeof(int) <= sizeof(PY_LONG_LONG)) { + __PYX_VERIFY_RETURN_INT_EXC(int, PY_LONG_LONG, PyLong_AsLongLong(x)) +#endif + } + } + { +#if CYTHON_COMPILING_IN_PYPY && !defined(_PyLong_AsByteArray) + PyErr_SetString(PyExc_RuntimeError, + "_PyLong_AsByteArray() not available in PyPy, cannot convert large numbers"); +#else + int val; + PyObject *v = __Pyx_PyNumber_IntOrLong(x); + #if PY_MAJOR_VERSION < 3 + if (likely(v) && !PyLong_Check(v)) { + PyObject *tmp = v; + v = PyNumber_Long(tmp); + Py_DECREF(tmp); + } + #endif + if (likely(v)) { + int one = 1; int is_little = (int)*(unsigned char *)&one; + unsigned char *bytes = (unsigned char *)&val; + int ret = _PyLong_AsByteArray((PyLongObject *)v, + bytes, sizeof(val), + is_little, !is_unsigned); + Py_DECREF(v); + if (likely(!ret)) + return val; + } +#endif + return (int) -1; + } + } else { + int val; + PyObject *tmp = __Pyx_PyNumber_IntOrLong(x); + if (!tmp) return (int) -1; + val = __Pyx_PyInt_As_int(tmp); + Py_DECREF(tmp); + return val; + } +raise_overflow: + PyErr_SetString(PyExc_OverflowError, + "value too large to convert to int"); + return (int) -1; +raise_neg_overflow: + PyErr_SetString(PyExc_OverflowError, + "can't convert negative value to int"); + return (int) -1; +} + +/* FastTypeChecks */ +#if CYTHON_COMPILING_IN_CPYTHON +static int __Pyx_InBases(PyTypeObject *a, PyTypeObject *b) { + while (a) { + a = a->tp_base; + if (a == b) + return 1; + } + return b == &PyBaseObject_Type; +} +static CYTHON_INLINE int __Pyx_IsSubtype(PyTypeObject *a, PyTypeObject *b) { + PyObject *mro; + if (a == b) return 1; + mro = a->tp_mro; + if (likely(mro)) { + Py_ssize_t i, n; + n = PyTuple_GET_SIZE(mro); + for (i = 0; i < n; i++) { + if (PyTuple_GET_ITEM(mro, i) == (PyObject *)b) + return 1; + } + return 0; + } + return __Pyx_InBases(a, b); +} +#if PY_MAJOR_VERSION == 2 +static int __Pyx_inner_PyErr_GivenExceptionMatches2(PyObject *err, PyObject* exc_type1, PyObject* exc_type2) { + PyObject *exception, *value, *tb; + int res; + __Pyx_PyThreadState_declare + __Pyx_PyThreadState_assign + __Pyx_ErrFetch(&exception, &value, &tb); + res = exc_type1 ? PyObject_IsSubclass(err, exc_type1) : 0; + if (unlikely(res == -1)) { + PyErr_WriteUnraisable(err); + res = 0; + } + if (!res) { + res = PyObject_IsSubclass(err, exc_type2); + if (unlikely(res == -1)) { + PyErr_WriteUnraisable(err); + res = 0; + } + } + __Pyx_ErrRestore(exception, value, tb); + return res; +} +#else +static CYTHON_INLINE int __Pyx_inner_PyErr_GivenExceptionMatches2(PyObject *err, PyObject* exc_type1, PyObject *exc_type2) { + int res = exc_type1 ? __Pyx_IsSubtype((PyTypeObject*)err, (PyTypeObject*)exc_type1) : 0; + if (!res) { + res = __Pyx_IsSubtype((PyTypeObject*)err, (PyTypeObject*)exc_type2); + } + return res; +} +#endif +static int __Pyx_PyErr_GivenExceptionMatchesTuple(PyObject *exc_type, PyObject *tuple) { + Py_ssize_t i, n; + assert(PyExceptionClass_Check(exc_type)); + n = PyTuple_GET_SIZE(tuple); +#if PY_MAJOR_VERSION >= 3 + for (i=0; ip) { + #if PY_MAJOR_VERSION < 3 + if (t->is_unicode) { + *t->p = PyUnicode_DecodeUTF8(t->s, t->n - 1, NULL); + } else if (t->intern) { + *t->p = PyString_InternFromString(t->s); + } else { + *t->p = PyString_FromStringAndSize(t->s, t->n - 1); + } + #else + if (t->is_unicode | t->is_str) { + if (t->intern) { + *t->p = PyUnicode_InternFromString(t->s); + } else if (t->encoding) { + *t->p = PyUnicode_Decode(t->s, t->n - 1, t->encoding, NULL); + } else { + *t->p = PyUnicode_FromStringAndSize(t->s, t->n - 1); + } + } else { + *t->p = PyBytes_FromStringAndSize(t->s, t->n - 1); + } + #endif + if (!*t->p) + return -1; + if (PyObject_Hash(*t->p) == -1) + return -1; + ++t; + } + return 0; +} + +static CYTHON_INLINE PyObject* __Pyx_PyUnicode_FromString(const char* c_str) { + return __Pyx_PyUnicode_FromStringAndSize(c_str, (Py_ssize_t)strlen(c_str)); +} +static CYTHON_INLINE const char* __Pyx_PyObject_AsString(PyObject* o) { + Py_ssize_t ignore; + return __Pyx_PyObject_AsStringAndSize(o, &ignore); +} +#if __PYX_DEFAULT_STRING_ENCODING_IS_ASCII || __PYX_DEFAULT_STRING_ENCODING_IS_DEFAULT +#if !CYTHON_PEP393_ENABLED +static const char* __Pyx_PyUnicode_AsStringAndSize(PyObject* o, Py_ssize_t *length) { + char* defenc_c; + PyObject* defenc = _PyUnicode_AsDefaultEncodedString(o, NULL); + if (!defenc) return NULL; + defenc_c = PyBytes_AS_STRING(defenc); +#if __PYX_DEFAULT_STRING_ENCODING_IS_ASCII + { + char* end = defenc_c + PyBytes_GET_SIZE(defenc); + char* c; + for (c = defenc_c; c < end; c++) { + if ((unsigned char) (*c) >= 128) { + PyUnicode_AsASCIIString(o); + return NULL; + } + } + } +#endif + *length = PyBytes_GET_SIZE(defenc); + return defenc_c; +} +#else +static CYTHON_INLINE const char* __Pyx_PyUnicode_AsStringAndSize(PyObject* o, Py_ssize_t *length) { + if (unlikely(__Pyx_PyUnicode_READY(o) == -1)) return NULL; +#if __PYX_DEFAULT_STRING_ENCODING_IS_ASCII + if (likely(PyUnicode_IS_ASCII(o))) { + *length = PyUnicode_GET_LENGTH(o); + return PyUnicode_AsUTF8(o); + } else { + PyUnicode_AsASCIIString(o); + return NULL; + } +#else + return PyUnicode_AsUTF8AndSize(o, length); +#endif +} +#endif +#endif +static CYTHON_INLINE const char* __Pyx_PyObject_AsStringAndSize(PyObject* o, Py_ssize_t *length) { +#if __PYX_DEFAULT_STRING_ENCODING_IS_ASCII || __PYX_DEFAULT_STRING_ENCODING_IS_DEFAULT + if ( +#if PY_MAJOR_VERSION < 3 && __PYX_DEFAULT_STRING_ENCODING_IS_ASCII + __Pyx_sys_getdefaultencoding_not_ascii && +#endif + PyUnicode_Check(o)) { + return __Pyx_PyUnicode_AsStringAndSize(o, length); + } else +#endif +#if (!CYTHON_COMPILING_IN_PYPY) || (defined(PyByteArray_AS_STRING) && defined(PyByteArray_GET_SIZE)) + if (PyByteArray_Check(o)) { + *length = PyByteArray_GET_SIZE(o); + return PyByteArray_AS_STRING(o); + } else +#endif + { + char* result; + int r = PyBytes_AsStringAndSize(o, &result, length); + if (unlikely(r < 0)) { + return NULL; + } else { + return result; + } + } +} +static CYTHON_INLINE int __Pyx_PyObject_IsTrue(PyObject* x) { + int is_true = x == Py_True; + if (is_true | (x == Py_False) | (x == Py_None)) return is_true; + else return PyObject_IsTrue(x); +} +static CYTHON_INLINE int __Pyx_PyObject_IsTrueAndDecref(PyObject* x) { + int retval; + if (unlikely(!x)) return -1; + retval = __Pyx_PyObject_IsTrue(x); + Py_DECREF(x); + return retval; +} +static PyObject* __Pyx_PyNumber_IntOrLongWrongResultType(PyObject* result, const char* type_name) { +#if PY_MAJOR_VERSION >= 3 + if (PyLong_Check(result)) { + if (PyErr_WarnFormat(PyExc_DeprecationWarning, 1, + "__int__ returned non-int (type %.200s). " + "The ability to return an instance of a strict subclass of int " + "is deprecated, and may be removed in a future version of Python.", + Py_TYPE(result)->tp_name)) { + Py_DECREF(result); + return NULL; + } + return result; + } +#endif + PyErr_Format(PyExc_TypeError, + "__%.4s__ returned non-%.4s (type %.200s)", + type_name, type_name, Py_TYPE(result)->tp_name); + Py_DECREF(result); + return NULL; +} +static CYTHON_INLINE PyObject* __Pyx_PyNumber_IntOrLong(PyObject* x) { +#if CYTHON_USE_TYPE_SLOTS + PyNumberMethods *m; +#endif + const char *name = NULL; + PyObject *res = NULL; +#if PY_MAJOR_VERSION < 3 + if (likely(PyInt_Check(x) || PyLong_Check(x))) +#else + if (likely(PyLong_Check(x))) +#endif + return __Pyx_NewRef(x); +#if CYTHON_USE_TYPE_SLOTS + m = Py_TYPE(x)->tp_as_number; + #if PY_MAJOR_VERSION < 3 + if (m && m->nb_int) { + name = "int"; + res = m->nb_int(x); + } + else if (m && m->nb_long) { + name = "long"; + res = m->nb_long(x); + } + #else + if (likely(m && m->nb_int)) { + name = "int"; + res = m->nb_int(x); + } + #endif +#else + if (!PyBytes_CheckExact(x) && !PyUnicode_CheckExact(x)) { + res = PyNumber_Int(x); + } +#endif + if (likely(res)) { +#if PY_MAJOR_VERSION < 3 + if (unlikely(!PyInt_Check(res) && !PyLong_Check(res))) { +#else + if (unlikely(!PyLong_CheckExact(res))) { +#endif + return __Pyx_PyNumber_IntOrLongWrongResultType(res, name); + } + } + else if (!PyErr_Occurred()) { + PyErr_SetString(PyExc_TypeError, + "an integer is required"); + } + return res; +} +static CYTHON_INLINE Py_ssize_t __Pyx_PyIndex_AsSsize_t(PyObject* b) { + Py_ssize_t ival; + PyObject *x; +#if PY_MAJOR_VERSION < 3 + if (likely(PyInt_CheckExact(b))) { + if (sizeof(Py_ssize_t) >= sizeof(long)) + return PyInt_AS_LONG(b); + else + return PyInt_AsSsize_t(b); + } +#endif + if (likely(PyLong_CheckExact(b))) { + #if CYTHON_USE_PYLONG_INTERNALS + const digit* digits = ((PyLongObject*)b)->ob_digit; + const Py_ssize_t size = Py_SIZE(b); + if (likely(__Pyx_sst_abs(size) <= 1)) { + ival = likely(size) ? digits[0] : 0; + if (size == -1) ival = -ival; + return ival; + } else { + switch (size) { + case 2: + if (8 * sizeof(Py_ssize_t) > 2 * PyLong_SHIFT) { + return (Py_ssize_t) (((((size_t)digits[1]) << PyLong_SHIFT) | (size_t)digits[0])); + } + break; + case -2: + if (8 * sizeof(Py_ssize_t) > 2 * PyLong_SHIFT) { + return -(Py_ssize_t) (((((size_t)digits[1]) << PyLong_SHIFT) | (size_t)digits[0])); + } + break; + case 3: + if (8 * sizeof(Py_ssize_t) > 3 * PyLong_SHIFT) { + return (Py_ssize_t) (((((((size_t)digits[2]) << PyLong_SHIFT) | (size_t)digits[1]) << PyLong_SHIFT) | (size_t)digits[0])); + } + break; + case -3: + if (8 * sizeof(Py_ssize_t) > 3 * PyLong_SHIFT) { + return -(Py_ssize_t) (((((((size_t)digits[2]) << PyLong_SHIFT) | (size_t)digits[1]) << PyLong_SHIFT) | (size_t)digits[0])); + } + break; + case 4: + if (8 * sizeof(Py_ssize_t) > 4 * PyLong_SHIFT) { + return (Py_ssize_t) (((((((((size_t)digits[3]) << PyLong_SHIFT) | (size_t)digits[2]) << PyLong_SHIFT) | (size_t)digits[1]) << PyLong_SHIFT) | (size_t)digits[0])); + } + break; + case -4: + if (8 * sizeof(Py_ssize_t) > 4 * PyLong_SHIFT) { + return -(Py_ssize_t) (((((((((size_t)digits[3]) << PyLong_SHIFT) | (size_t)digits[2]) << PyLong_SHIFT) | (size_t)digits[1]) << PyLong_SHIFT) | (size_t)digits[0])); + } + break; + } + } + #endif + return PyLong_AsSsize_t(b); + } + x = PyNumber_Index(b); + if (!x) return -1; + ival = PyInt_AsSsize_t(x); + Py_DECREF(x); + return ival; +} +static CYTHON_INLINE PyObject * __Pyx_PyBool_FromLong(long b) { + return b ? __Pyx_NewRef(Py_True) : __Pyx_NewRef(Py_False); +} +static CYTHON_INLINE PyObject * __Pyx_PyInt_FromSize_t(size_t ival) { + return PyInt_FromSize_t(ival); +} + + +#endif /* Py_PYTHON_H */ diff --git a/sbsheriff/Lib/site-packages/aiohttp/_http_writer.cp310-win_amd64.pyd b/sbsheriff/Lib/site-packages/aiohttp/_http_writer.cp310-win_amd64.pyd new file mode 100644 index 0000000000000000000000000000000000000000..a35daa1d4608e22792e46d563a019229054ae54c GIT binary patch literal 44544 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 + if buf == NULL: + PyErr_NoMemory() + return -1 + memcpy(buf, writer.buf, writer.size) + else: + buf = PyMem_Realloc(writer.buf, size) + if buf == NULL: + PyErr_NoMemory() + return -1 + writer.buf = buf + writer.size = size + writer.buf[writer.pos] = ch + writer.pos += 1 + return 0 + + +cdef inline int _write_utf8(Writer* writer, Py_UCS4 symbol): + cdef uint64_t utf = symbol + + if utf < 0x80: + return _write_byte(writer, utf) + elif utf < 0x800: + if _write_byte(writer, (0xc0 | (utf >> 6))) < 0: + return -1 + return _write_byte(writer, (0x80 | (utf & 0x3f))) + elif 0xD800 <= utf <= 0xDFFF: + # surogate pair, ignored + return 0 + elif utf < 0x10000: + if _write_byte(writer, (0xe0 | (utf >> 12))) < 0: + return -1 + if _write_byte(writer, (0x80 | ((utf >> 6) & 0x3f))) < 0: + return -1 + return _write_byte(writer, (0x80 | (utf & 0x3f))) + elif utf > 0x10FFFF: + # symbol is too large + return 0 + else: + if _write_byte(writer, (0xf0 | (utf >> 18))) < 0: + return -1 + if _write_byte(writer, + (0x80 | ((utf >> 12) & 0x3f))) < 0: + return -1 + if _write_byte(writer, + (0x80 | ((utf >> 6) & 0x3f))) < 0: + return -1 + return _write_byte(writer, (0x80 | (utf & 0x3f))) + + +cdef inline int _write_str(Writer* writer, str s): + cdef Py_UCS4 ch + for ch in s: + if _write_utf8(writer, ch) < 0: + return -1 + + +# --------------- _serialize_headers ---------------------- + +cdef str to_str(object s): + typ = type(s) + if typ is str: + return s + elif typ is _istr: + return PyObject_Str(s) + elif not isinstance(s, str): + raise TypeError("Cannot serialize non-str key {!r}".format(s)) + else: + return str(s) + + +cdef void _safe_header(str string) except *: + if "\r" in string or "\n" in string: + raise ValueError( + "Newline or carriage return character detected in HTTP status message or " + "header. This is a potential security issue." + ) + + +def _serialize_headers(str status_line, headers): + cdef Writer writer + cdef object key + cdef object val + cdef bytes ret + + _init_writer(&writer) + + for key, val in headers.items(): + _safe_header(to_str(key)) + _safe_header(to_str(val)) + + try: + if _write_str(&writer, status_line) < 0: + raise + if _write_byte(&writer, b'\r') < 0: + raise + if _write_byte(&writer, b'\n') < 0: + raise + + for key, val in headers.items(): + if _write_str(&writer, to_str(key)) < 0: + raise + if _write_byte(&writer, b':') < 0: + raise + if _write_byte(&writer, b' ') < 0: + raise + if _write_str(&writer, to_str(val)) < 0: + raise + if _write_byte(&writer, b'\r') < 0: + raise + if _write_byte(&writer, b'\n') < 0: + raise + + if _write_byte(&writer, b'\r') < 0: + raise + if _write_byte(&writer, b'\n') < 0: + raise + + return PyBytes_FromStringAndSize(writer.buf, writer.pos) + finally: + _release_writer(&writer) diff --git a/sbsheriff/Lib/site-packages/aiohttp/_websocket.c b/sbsheriff/Lib/site-packages/aiohttp/_websocket.c new file mode 100644 index 0000000..d47da21 --- /dev/null +++ b/sbsheriff/Lib/site-packages/aiohttp/_websocket.c @@ -0,0 +1,3622 @@ +/* Generated by Cython 0.29.24 */ + +#ifndef PY_SSIZE_T_CLEAN +#define PY_SSIZE_T_CLEAN +#endif /* PY_SSIZE_T_CLEAN */ +#include "Python.h" +#ifndef Py_PYTHON_H + #error Python headers needed to compile C extensions, please install development version of Python. +#elif PY_VERSION_HEX < 0x02060000 || (0x03000000 <= PY_VERSION_HEX && PY_VERSION_HEX < 0x03030000) + #error Cython requires Python 2.6+ or Python 3.3+. +#else +#define CYTHON_ABI "0_29_24" +#define CYTHON_HEX_VERSION 0x001D18F0 +#define CYTHON_FUTURE_DIVISION 1 +#include +#ifndef offsetof + #define offsetof(type, member) ( (size_t) & ((type*)0) -> member ) +#endif +#if !defined(WIN32) && !defined(MS_WINDOWS) + #ifndef __stdcall + #define __stdcall + #endif + #ifndef __cdecl + #define __cdecl + #endif + #ifndef __fastcall + #define __fastcall + #endif +#endif +#ifndef DL_IMPORT + #define DL_IMPORT(t) t +#endif +#ifndef DL_EXPORT + #define DL_EXPORT(t) t +#endif +#define __PYX_COMMA , +#ifndef HAVE_LONG_LONG + #if PY_VERSION_HEX >= 0x02070000 + #define HAVE_LONG_LONG + #endif +#endif +#ifndef PY_LONG_LONG + #define PY_LONG_LONG LONG_LONG +#endif +#ifndef Py_HUGE_VAL + #define Py_HUGE_VAL HUGE_VAL +#endif +#ifdef PYPY_VERSION + #define CYTHON_COMPILING_IN_PYPY 1 + #define CYTHON_COMPILING_IN_PYSTON 0 + #define CYTHON_COMPILING_IN_CPYTHON 0 + #undef CYTHON_USE_TYPE_SLOTS + #define CYTHON_USE_TYPE_SLOTS 0 + #undef CYTHON_USE_PYTYPE_LOOKUP + #define CYTHON_USE_PYTYPE_LOOKUP 0 + #if PY_VERSION_HEX < 0x03050000 + #undef CYTHON_USE_ASYNC_SLOTS + #define CYTHON_USE_ASYNC_SLOTS 0 + #elif !defined(CYTHON_USE_ASYNC_SLOTS) + #define CYTHON_USE_ASYNC_SLOTS 1 + #endif + #undef CYTHON_USE_PYLIST_INTERNALS + #define CYTHON_USE_PYLIST_INTERNALS 0 + #undef CYTHON_USE_UNICODE_INTERNALS + #define CYTHON_USE_UNICODE_INTERNALS 0 + #undef CYTHON_USE_UNICODE_WRITER + #define CYTHON_USE_UNICODE_WRITER 0 + #undef CYTHON_USE_PYLONG_INTERNALS + #define CYTHON_USE_PYLONG_INTERNALS 0 + #undef CYTHON_AVOID_BORROWED_REFS + #define CYTHON_AVOID_BORROWED_REFS 1 + #undef CYTHON_ASSUME_SAFE_MACROS + #define CYTHON_ASSUME_SAFE_MACROS 0 + #undef CYTHON_UNPACK_METHODS + #define CYTHON_UNPACK_METHODS 0 + #undef CYTHON_FAST_THREAD_STATE + #define CYTHON_FAST_THREAD_STATE 0 + #undef CYTHON_FAST_PYCALL + #define CYTHON_FAST_PYCALL 0 + #undef CYTHON_PEP489_MULTI_PHASE_INIT + #define CYTHON_PEP489_MULTI_PHASE_INIT 0 + #undef CYTHON_USE_TP_FINALIZE + #define CYTHON_USE_TP_FINALIZE 0 + #undef CYTHON_USE_DICT_VERSIONS + #define CYTHON_USE_DICT_VERSIONS 0 + #undef CYTHON_USE_EXC_INFO_STACK + #define CYTHON_USE_EXC_INFO_STACK 0 +#elif defined(PYSTON_VERSION) + #define CYTHON_COMPILING_IN_PYPY 0 + #define CYTHON_COMPILING_IN_PYSTON 1 + #define CYTHON_COMPILING_IN_CPYTHON 0 + #ifndef CYTHON_USE_TYPE_SLOTS + #define CYTHON_USE_TYPE_SLOTS 1 + #endif + #undef CYTHON_USE_PYTYPE_LOOKUP + #define CYTHON_USE_PYTYPE_LOOKUP 0 + #undef CYTHON_USE_ASYNC_SLOTS + #define CYTHON_USE_ASYNC_SLOTS 0 + #undef CYTHON_USE_PYLIST_INTERNALS + #define CYTHON_USE_PYLIST_INTERNALS 0 + #ifndef CYTHON_USE_UNICODE_INTERNALS + #define CYTHON_USE_UNICODE_INTERNALS 1 + #endif + #undef CYTHON_USE_UNICODE_WRITER + #define CYTHON_USE_UNICODE_WRITER 0 + #undef CYTHON_USE_PYLONG_INTERNALS + #define CYTHON_USE_PYLONG_INTERNALS 0 + #ifndef CYTHON_AVOID_BORROWED_REFS + #define CYTHON_AVOID_BORROWED_REFS 0 + #endif + #ifndef CYTHON_ASSUME_SAFE_MACROS + #define CYTHON_ASSUME_SAFE_MACROS 1 + #endif + #ifndef CYTHON_UNPACK_METHODS + #define CYTHON_UNPACK_METHODS 1 + #endif + #undef CYTHON_FAST_THREAD_STATE + #define CYTHON_FAST_THREAD_STATE 0 + #undef CYTHON_FAST_PYCALL + #define CYTHON_FAST_PYCALL 0 + #undef CYTHON_PEP489_MULTI_PHASE_INIT + #define CYTHON_PEP489_MULTI_PHASE_INIT 0 + #undef CYTHON_USE_TP_FINALIZE + #define CYTHON_USE_TP_FINALIZE 0 + #undef CYTHON_USE_DICT_VERSIONS + #define CYTHON_USE_DICT_VERSIONS 0 + #undef CYTHON_USE_EXC_INFO_STACK + #define CYTHON_USE_EXC_INFO_STACK 0 +#else + #define CYTHON_COMPILING_IN_PYPY 0 + #define CYTHON_COMPILING_IN_PYSTON 0 + #define CYTHON_COMPILING_IN_CPYTHON 1 + #ifndef CYTHON_USE_TYPE_SLOTS + #define CYTHON_USE_TYPE_SLOTS 1 + #endif + #if PY_VERSION_HEX < 0x02070000 + #undef CYTHON_USE_PYTYPE_LOOKUP + #define CYTHON_USE_PYTYPE_LOOKUP 0 + #elif !defined(CYTHON_USE_PYTYPE_LOOKUP) + #define CYTHON_USE_PYTYPE_LOOKUP 1 + #endif + #if PY_MAJOR_VERSION < 3 + #undef CYTHON_USE_ASYNC_SLOTS + #define CYTHON_USE_ASYNC_SLOTS 0 + #elif !defined(CYTHON_USE_ASYNC_SLOTS) + #define CYTHON_USE_ASYNC_SLOTS 1 + #endif + #if PY_VERSION_HEX < 0x02070000 + #undef CYTHON_USE_PYLONG_INTERNALS + #define CYTHON_USE_PYLONG_INTERNALS 0 + #elif !defined(CYTHON_USE_PYLONG_INTERNALS) + #define CYTHON_USE_PYLONG_INTERNALS 1 + #endif + #ifndef CYTHON_USE_PYLIST_INTERNALS + #define CYTHON_USE_PYLIST_INTERNALS 1 + #endif + #ifndef CYTHON_USE_UNICODE_INTERNALS + #define CYTHON_USE_UNICODE_INTERNALS 1 + #endif + #if PY_VERSION_HEX < 0x030300F0 + #undef CYTHON_USE_UNICODE_WRITER + #define CYTHON_USE_UNICODE_WRITER 0 + #elif !defined(CYTHON_USE_UNICODE_WRITER) + #define CYTHON_USE_UNICODE_WRITER 1 + #endif + #ifndef CYTHON_AVOID_BORROWED_REFS + #define CYTHON_AVOID_BORROWED_REFS 0 + #endif + #ifndef CYTHON_ASSUME_SAFE_MACROS + #define CYTHON_ASSUME_SAFE_MACROS 1 + #endif + #ifndef CYTHON_UNPACK_METHODS + #define CYTHON_UNPACK_METHODS 1 + #endif + #ifndef CYTHON_FAST_THREAD_STATE + #define CYTHON_FAST_THREAD_STATE 1 + #endif + #ifndef CYTHON_FAST_PYCALL + #define CYTHON_FAST_PYCALL 1 + #endif + #ifndef CYTHON_PEP489_MULTI_PHASE_INIT + #define CYTHON_PEP489_MULTI_PHASE_INIT (PY_VERSION_HEX >= 0x03050000) + #endif + #ifndef CYTHON_USE_TP_FINALIZE + #define CYTHON_USE_TP_FINALIZE (PY_VERSION_HEX >= 0x030400a1) + #endif + #ifndef CYTHON_USE_DICT_VERSIONS + #define CYTHON_USE_DICT_VERSIONS (PY_VERSION_HEX >= 0x030600B1) + #endif + #ifndef CYTHON_USE_EXC_INFO_STACK + #define CYTHON_USE_EXC_INFO_STACK (PY_VERSION_HEX >= 0x030700A3) + #endif +#endif +#if !defined(CYTHON_FAST_PYCCALL) +#define CYTHON_FAST_PYCCALL (CYTHON_FAST_PYCALL && PY_VERSION_HEX >= 0x030600B1) +#endif +#if CYTHON_USE_PYLONG_INTERNALS + #include "longintrepr.h" + #undef SHIFT + #undef BASE + #undef MASK + #ifdef SIZEOF_VOID_P + enum { __pyx_check_sizeof_voidp = 1 / (int)(SIZEOF_VOID_P == sizeof(void*)) }; + #endif +#endif +#ifndef __has_attribute + #define __has_attribute(x) 0 +#endif +#ifndef __has_cpp_attribute + #define __has_cpp_attribute(x) 0 +#endif +#ifndef CYTHON_RESTRICT + #if defined(__GNUC__) + #define CYTHON_RESTRICT __restrict__ + #elif defined(_MSC_VER) && _MSC_VER >= 1400 + #define CYTHON_RESTRICT __restrict + #elif defined (__STDC_VERSION__) && __STDC_VERSION__ >= 199901L + #define CYTHON_RESTRICT restrict + #else + #define CYTHON_RESTRICT + #endif +#endif +#ifndef CYTHON_UNUSED +# if defined(__GNUC__) +# if !(defined(__cplusplus)) || (__GNUC__ > 3 || (__GNUC__ == 3 && __GNUC_MINOR__ >= 4)) +# define CYTHON_UNUSED __attribute__ ((__unused__)) +# else +# define CYTHON_UNUSED +# endif +# elif defined(__ICC) || (defined(__INTEL_COMPILER) && !defined(_MSC_VER)) +# define CYTHON_UNUSED __attribute__ ((__unused__)) +# else +# define CYTHON_UNUSED +# endif +#endif +#ifndef CYTHON_MAYBE_UNUSED_VAR +# if defined(__cplusplus) + template void CYTHON_MAYBE_UNUSED_VAR( const T& ) { } +# else +# define CYTHON_MAYBE_UNUSED_VAR(x) (void)(x) +# endif +#endif +#ifndef CYTHON_NCP_UNUSED +# if CYTHON_COMPILING_IN_CPYTHON +# define CYTHON_NCP_UNUSED +# else +# define CYTHON_NCP_UNUSED CYTHON_UNUSED +# endif +#endif +#define __Pyx_void_to_None(void_result) ((void)(void_result), Py_INCREF(Py_None), Py_None) +#ifdef _MSC_VER + #ifndef _MSC_STDINT_H_ + #if _MSC_VER < 1300 + typedef unsigned char uint8_t; + typedef unsigned int uint32_t; + #else + typedef unsigned __int8 uint8_t; + typedef unsigned __int32 uint32_t; + #endif + #endif +#else + #include +#endif +#ifndef CYTHON_FALLTHROUGH + #if defined(__cplusplus) && __cplusplus >= 201103L + #if __has_cpp_attribute(fallthrough) + #define CYTHON_FALLTHROUGH [[fallthrough]] + #elif __has_cpp_attribute(clang::fallthrough) + #define CYTHON_FALLTHROUGH [[clang::fallthrough]] + #elif __has_cpp_attribute(gnu::fallthrough) + #define CYTHON_FALLTHROUGH [[gnu::fallthrough]] + #endif + #endif + #ifndef CYTHON_FALLTHROUGH + #if __has_attribute(fallthrough) + #define CYTHON_FALLTHROUGH __attribute__((fallthrough)) + #else + #define CYTHON_FALLTHROUGH + #endif + #endif + #if defined(__clang__ ) && defined(__apple_build_version__) + #if __apple_build_version__ < 7000000 + #undef CYTHON_FALLTHROUGH + #define CYTHON_FALLTHROUGH + #endif + #endif +#endif + +#ifndef CYTHON_INLINE + #if defined(__clang__) + #define CYTHON_INLINE __inline__ __attribute__ ((__unused__)) + #elif defined(__GNUC__) + #define CYTHON_INLINE __inline__ + #elif defined(_MSC_VER) + #define CYTHON_INLINE __inline + #elif defined (__STDC_VERSION__) && __STDC_VERSION__ >= 199901L + #define CYTHON_INLINE inline + #else + #define CYTHON_INLINE + #endif +#endif + +#if CYTHON_COMPILING_IN_PYPY && PY_VERSION_HEX < 0x02070600 && !defined(Py_OptimizeFlag) + #define Py_OptimizeFlag 0 +#endif +#define __PYX_BUILD_PY_SSIZE_T "n" +#define CYTHON_FORMAT_SSIZE_T "z" +#if PY_MAJOR_VERSION < 3 + #define __Pyx_BUILTIN_MODULE_NAME "__builtin__" + #define __Pyx_PyCode_New(a, k, l, s, f, code, c, n, v, fv, cell, fn, name, fline, lnos)\ + PyCode_New(a+k, l, s, f, code, c, n, v, fv, cell, fn, name, fline, lnos) + #define __Pyx_DefaultClassType PyClass_Type +#else + #define __Pyx_BUILTIN_MODULE_NAME "builtins" +#if PY_VERSION_HEX >= 0x030800A4 && PY_VERSION_HEX < 0x030800B2 + #define __Pyx_PyCode_New(a, k, l, s, f, code, c, n, v, fv, cell, fn, name, fline, lnos)\ + PyCode_New(a, 0, k, l, s, f, code, c, n, v, fv, cell, fn, name, fline, lnos) +#else + #define __Pyx_PyCode_New(a, k, l, s, f, code, c, n, v, fv, cell, fn, name, fline, lnos)\ + PyCode_New(a, k, l, s, f, code, c, n, v, fv, cell, fn, name, fline, lnos) +#endif + #define __Pyx_DefaultClassType PyType_Type +#endif +#ifndef Py_TPFLAGS_CHECKTYPES + #define Py_TPFLAGS_CHECKTYPES 0 +#endif +#ifndef Py_TPFLAGS_HAVE_INDEX + #define Py_TPFLAGS_HAVE_INDEX 0 +#endif +#ifndef Py_TPFLAGS_HAVE_NEWBUFFER + #define Py_TPFLAGS_HAVE_NEWBUFFER 0 +#endif +#ifndef Py_TPFLAGS_HAVE_FINALIZE + #define Py_TPFLAGS_HAVE_FINALIZE 0 +#endif +#ifndef METH_STACKLESS + #define METH_STACKLESS 0 +#endif +#if PY_VERSION_HEX <= 0x030700A3 || !defined(METH_FASTCALL) + #ifndef METH_FASTCALL + #define METH_FASTCALL 0x80 + #endif + typedef PyObject *(*__Pyx_PyCFunctionFast) (PyObject *self, PyObject *const *args, Py_ssize_t nargs); + typedef PyObject *(*__Pyx_PyCFunctionFastWithKeywords) (PyObject *self, PyObject *const *args, + Py_ssize_t nargs, PyObject *kwnames); +#else + #define __Pyx_PyCFunctionFast _PyCFunctionFast + #define __Pyx_PyCFunctionFastWithKeywords _PyCFunctionFastWithKeywords +#endif +#if CYTHON_FAST_PYCCALL +#define __Pyx_PyFastCFunction_Check(func)\ + ((PyCFunction_Check(func) && (METH_FASTCALL == (PyCFunction_GET_FLAGS(func) & ~(METH_CLASS | METH_STATIC | METH_COEXIST | METH_KEYWORDS | METH_STACKLESS))))) +#else +#define __Pyx_PyFastCFunction_Check(func) 0 +#endif +#if CYTHON_COMPILING_IN_PYPY && !defined(PyObject_Malloc) + #define PyObject_Malloc(s) PyMem_Malloc(s) + #define PyObject_Free(p) PyMem_Free(p) + #define PyObject_Realloc(p) PyMem_Realloc(p) +#endif +#if CYTHON_COMPILING_IN_CPYTHON && PY_VERSION_HEX < 0x030400A1 + #define PyMem_RawMalloc(n) PyMem_Malloc(n) + #define PyMem_RawRealloc(p, n) PyMem_Realloc(p, n) + #define PyMem_RawFree(p) PyMem_Free(p) +#endif +#if CYTHON_COMPILING_IN_PYSTON + #define __Pyx_PyCode_HasFreeVars(co) PyCode_HasFreeVars(co) + #define __Pyx_PyFrame_SetLineNumber(frame, lineno) PyFrame_SetLineNumber(frame, lineno) +#else + #define __Pyx_PyCode_HasFreeVars(co) (PyCode_GetNumFree(co) > 0) + #define __Pyx_PyFrame_SetLineNumber(frame, lineno) (frame)->f_lineno = (lineno) +#endif +#if !CYTHON_FAST_THREAD_STATE || PY_VERSION_HEX < 0x02070000 + #define __Pyx_PyThreadState_Current PyThreadState_GET() +#elif PY_VERSION_HEX >= 0x03060000 + #define __Pyx_PyThreadState_Current _PyThreadState_UncheckedGet() +#elif PY_VERSION_HEX >= 0x03000000 + #define __Pyx_PyThreadState_Current PyThreadState_GET() +#else + #define __Pyx_PyThreadState_Current _PyThreadState_Current +#endif +#if PY_VERSION_HEX < 0x030700A2 && !defined(PyThread_tss_create) && !defined(Py_tss_NEEDS_INIT) +#include "pythread.h" +#define Py_tss_NEEDS_INIT 0 +typedef int Py_tss_t; +static CYTHON_INLINE int PyThread_tss_create(Py_tss_t *key) { + *key = PyThread_create_key(); + return 0; +} +static CYTHON_INLINE Py_tss_t * PyThread_tss_alloc(void) { + Py_tss_t *key = (Py_tss_t *)PyObject_Malloc(sizeof(Py_tss_t)); + *key = Py_tss_NEEDS_INIT; + return key; +} +static CYTHON_INLINE void PyThread_tss_free(Py_tss_t *key) { + PyObject_Free(key); +} +static CYTHON_INLINE int PyThread_tss_is_created(Py_tss_t *key) { + return *key != Py_tss_NEEDS_INIT; +} +static CYTHON_INLINE void PyThread_tss_delete(Py_tss_t *key) { + PyThread_delete_key(*key); + *key = Py_tss_NEEDS_INIT; +} +static CYTHON_INLINE int PyThread_tss_set(Py_tss_t *key, void *value) { + return PyThread_set_key_value(*key, value); +} +static CYTHON_INLINE void * PyThread_tss_get(Py_tss_t *key) { + return PyThread_get_key_value(*key); +} +#endif +#if CYTHON_COMPILING_IN_CPYTHON || defined(_PyDict_NewPresized) +#define __Pyx_PyDict_NewPresized(n) ((n <= 8) ? PyDict_New() : _PyDict_NewPresized(n)) +#else +#define __Pyx_PyDict_NewPresized(n) PyDict_New() +#endif +#if PY_MAJOR_VERSION >= 3 || CYTHON_FUTURE_DIVISION + #define __Pyx_PyNumber_Divide(x,y) PyNumber_TrueDivide(x,y) + #define __Pyx_PyNumber_InPlaceDivide(x,y) PyNumber_InPlaceTrueDivide(x,y) +#else + #define __Pyx_PyNumber_Divide(x,y) PyNumber_Divide(x,y) + #define __Pyx_PyNumber_InPlaceDivide(x,y) PyNumber_InPlaceDivide(x,y) +#endif +#if CYTHON_COMPILING_IN_CPYTHON && PY_VERSION_HEX >= 0x030500A1 && CYTHON_USE_UNICODE_INTERNALS +#define __Pyx_PyDict_GetItemStr(dict, name) _PyDict_GetItem_KnownHash(dict, name, ((PyASCIIObject *) name)->hash) +#else +#define __Pyx_PyDict_GetItemStr(dict, name) PyDict_GetItem(dict, name) +#endif +#if PY_VERSION_HEX > 0x03030000 && defined(PyUnicode_KIND) + #define CYTHON_PEP393_ENABLED 1 + #if defined(PyUnicode_IS_READY) + #define __Pyx_PyUnicode_READY(op) (likely(PyUnicode_IS_READY(op)) ?\ + 0 : _PyUnicode_Ready((PyObject *)(op))) + #else + #define __Pyx_PyUnicode_READY(op) (0) + #endif + #define __Pyx_PyUnicode_GET_LENGTH(u) PyUnicode_GET_LENGTH(u) + #define __Pyx_PyUnicode_READ_CHAR(u, i) PyUnicode_READ_CHAR(u, i) + #define __Pyx_PyUnicode_MAX_CHAR_VALUE(u) PyUnicode_MAX_CHAR_VALUE(u) + #define __Pyx_PyUnicode_KIND(u) PyUnicode_KIND(u) + #define __Pyx_PyUnicode_DATA(u) PyUnicode_DATA(u) + #define __Pyx_PyUnicode_READ(k, d, i) PyUnicode_READ(k, d, i) + #define __Pyx_PyUnicode_WRITE(k, d, i, ch) PyUnicode_WRITE(k, d, i, ch) + #if defined(PyUnicode_IS_READY) && defined(PyUnicode_GET_SIZE) + #if CYTHON_COMPILING_IN_CPYTHON && PY_VERSION_HEX >= 0x03090000 + #define __Pyx_PyUnicode_IS_TRUE(u) (0 != (likely(PyUnicode_IS_READY(u)) ? PyUnicode_GET_LENGTH(u) : ((PyCompactUnicodeObject *)(u))->wstr_length)) + #else + #define __Pyx_PyUnicode_IS_TRUE(u) (0 != (likely(PyUnicode_IS_READY(u)) ? PyUnicode_GET_LENGTH(u) : PyUnicode_GET_SIZE(u))) + #endif + #else + #define __Pyx_PyUnicode_IS_TRUE(u) (0 != PyUnicode_GET_LENGTH(u)) + #endif +#else + #define CYTHON_PEP393_ENABLED 0 + #define PyUnicode_1BYTE_KIND 1 + #define PyUnicode_2BYTE_KIND 2 + #define PyUnicode_4BYTE_KIND 4 + #define __Pyx_PyUnicode_READY(op) (0) + #define __Pyx_PyUnicode_GET_LENGTH(u) PyUnicode_GET_SIZE(u) + #define __Pyx_PyUnicode_READ_CHAR(u, i) ((Py_UCS4)(PyUnicode_AS_UNICODE(u)[i])) + #define __Pyx_PyUnicode_MAX_CHAR_VALUE(u) ((sizeof(Py_UNICODE) == 2) ? 65535 : 1114111) + #define __Pyx_PyUnicode_KIND(u) (sizeof(Py_UNICODE)) + #define __Pyx_PyUnicode_DATA(u) ((void*)PyUnicode_AS_UNICODE(u)) + #define __Pyx_PyUnicode_READ(k, d, i) ((void)(k), (Py_UCS4)(((Py_UNICODE*)d)[i])) + #define __Pyx_PyUnicode_WRITE(k, d, i, ch) (((void)(k)), ((Py_UNICODE*)d)[i] = ch) + #define __Pyx_PyUnicode_IS_TRUE(u) (0 != PyUnicode_GET_SIZE(u)) +#endif +#if CYTHON_COMPILING_IN_PYPY + #define __Pyx_PyUnicode_Concat(a, b) PyNumber_Add(a, b) + #define __Pyx_PyUnicode_ConcatSafe(a, b) PyNumber_Add(a, b) +#else + #define __Pyx_PyUnicode_Concat(a, b) PyUnicode_Concat(a, b) + #define __Pyx_PyUnicode_ConcatSafe(a, b) ((unlikely((a) == Py_None) || unlikely((b) == Py_None)) ?\ + PyNumber_Add(a, b) : __Pyx_PyUnicode_Concat(a, b)) +#endif +#if CYTHON_COMPILING_IN_PYPY && !defined(PyUnicode_Contains) + #define PyUnicode_Contains(u, s) PySequence_Contains(u, s) +#endif +#if CYTHON_COMPILING_IN_PYPY && !defined(PyByteArray_Check) + #define PyByteArray_Check(obj) PyObject_TypeCheck(obj, &PyByteArray_Type) +#endif +#if CYTHON_COMPILING_IN_PYPY && !defined(PyObject_Format) + #define PyObject_Format(obj, fmt) PyObject_CallMethod(obj, "__format__", "O", fmt) +#endif +#define __Pyx_PyString_FormatSafe(a, b) ((unlikely((a) == Py_None || (PyString_Check(b) && !PyString_CheckExact(b)))) ? PyNumber_Remainder(a, b) : __Pyx_PyString_Format(a, b)) +#define __Pyx_PyUnicode_FormatSafe(a, b) ((unlikely((a) == Py_None || (PyUnicode_Check(b) && !PyUnicode_CheckExact(b)))) ? PyNumber_Remainder(a, b) : PyUnicode_Format(a, b)) +#if PY_MAJOR_VERSION >= 3 + #define __Pyx_PyString_Format(a, b) PyUnicode_Format(a, b) +#else + #define __Pyx_PyString_Format(a, b) PyString_Format(a, b) +#endif +#if PY_MAJOR_VERSION < 3 && !defined(PyObject_ASCII) + #define PyObject_ASCII(o) PyObject_Repr(o) +#endif +#if PY_MAJOR_VERSION >= 3 + #define PyBaseString_Type PyUnicode_Type + #define PyStringObject PyUnicodeObject + #define PyString_Type PyUnicode_Type + #define PyString_Check PyUnicode_Check + #define PyString_CheckExact PyUnicode_CheckExact +#ifndef PyObject_Unicode + #define PyObject_Unicode PyObject_Str +#endif +#endif +#if PY_MAJOR_VERSION >= 3 + #define __Pyx_PyBaseString_Check(obj) PyUnicode_Check(obj) + #define __Pyx_PyBaseString_CheckExact(obj) PyUnicode_CheckExact(obj) +#else + #define __Pyx_PyBaseString_Check(obj) (PyString_Check(obj) || PyUnicode_Check(obj)) + #define __Pyx_PyBaseString_CheckExact(obj) (PyString_CheckExact(obj) || PyUnicode_CheckExact(obj)) +#endif +#ifndef PySet_CheckExact + #define PySet_CheckExact(obj) (Py_TYPE(obj) == &PySet_Type) +#endif +#if PY_VERSION_HEX >= 0x030900A4 + #define __Pyx_SET_REFCNT(obj, refcnt) Py_SET_REFCNT(obj, refcnt) + #define __Pyx_SET_SIZE(obj, size) Py_SET_SIZE(obj, size) +#else + #define __Pyx_SET_REFCNT(obj, refcnt) Py_REFCNT(obj) = (refcnt) + #define __Pyx_SET_SIZE(obj, size) Py_SIZE(obj) = (size) +#endif +#if CYTHON_ASSUME_SAFE_MACROS + #define __Pyx_PySequence_SIZE(seq) Py_SIZE(seq) +#else + #define __Pyx_PySequence_SIZE(seq) PySequence_Size(seq) +#endif +#if PY_MAJOR_VERSION >= 3 + #define PyIntObject PyLongObject + #define PyInt_Type PyLong_Type + #define PyInt_Check(op) PyLong_Check(op) + #define PyInt_CheckExact(op) PyLong_CheckExact(op) + #define PyInt_FromString PyLong_FromString + #define PyInt_FromUnicode PyLong_FromUnicode + #define PyInt_FromLong PyLong_FromLong + #define PyInt_FromSize_t PyLong_FromSize_t + #define PyInt_FromSsize_t PyLong_FromSsize_t + #define PyInt_AsLong PyLong_AsLong + #define PyInt_AS_LONG PyLong_AS_LONG + #define PyInt_AsSsize_t PyLong_AsSsize_t + #define PyInt_AsUnsignedLongMask PyLong_AsUnsignedLongMask + #define PyInt_AsUnsignedLongLongMask PyLong_AsUnsignedLongLongMask + #define PyNumber_Int PyNumber_Long +#endif +#if PY_MAJOR_VERSION >= 3 + #define PyBoolObject PyLongObject +#endif +#if PY_MAJOR_VERSION >= 3 && CYTHON_COMPILING_IN_PYPY + #ifndef PyUnicode_InternFromString + #define PyUnicode_InternFromString(s) PyUnicode_FromString(s) + #endif +#endif +#if PY_VERSION_HEX < 0x030200A4 + typedef long Py_hash_t; + #define __Pyx_PyInt_FromHash_t PyInt_FromLong + #define __Pyx_PyInt_AsHash_t PyInt_AsLong +#else + #define __Pyx_PyInt_FromHash_t PyInt_FromSsize_t + #define __Pyx_PyInt_AsHash_t PyInt_AsSsize_t +#endif +#if PY_MAJOR_VERSION >= 3 + #define __Pyx_PyMethod_New(func, self, klass) ((self) ? ((void)(klass), PyMethod_New(func, self)) : __Pyx_NewRef(func)) +#else + #define __Pyx_PyMethod_New(func, self, klass) PyMethod_New(func, self, klass) +#endif +#if CYTHON_USE_ASYNC_SLOTS + #if PY_VERSION_HEX >= 0x030500B1 + #define __Pyx_PyAsyncMethodsStruct PyAsyncMethods + #define __Pyx_PyType_AsAsync(obj) (Py_TYPE(obj)->tp_as_async) + #else + #define __Pyx_PyType_AsAsync(obj) ((__Pyx_PyAsyncMethodsStruct*) (Py_TYPE(obj)->tp_reserved)) + #endif +#else + #define __Pyx_PyType_AsAsync(obj) NULL +#endif +#ifndef __Pyx_PyAsyncMethodsStruct + typedef struct { + unaryfunc am_await; + unaryfunc am_aiter; + unaryfunc am_anext; + } __Pyx_PyAsyncMethodsStruct; +#endif + +#if defined(WIN32) || defined(MS_WINDOWS) + #define _USE_MATH_DEFINES +#endif +#include +#ifdef NAN +#define __PYX_NAN() ((float) NAN) +#else +static CYTHON_INLINE float __PYX_NAN() { + float value; + memset(&value, 0xFF, sizeof(value)); + return value; +} +#endif +#if defined(__CYGWIN__) && defined(_LDBL_EQ_DBL) +#define __Pyx_truncl trunc +#else +#define __Pyx_truncl truncl +#endif + +#define __PYX_MARK_ERR_POS(f_index, lineno) \ + { __pyx_filename = __pyx_f[f_index]; (void)__pyx_filename; __pyx_lineno = lineno; (void)__pyx_lineno; __pyx_clineno = __LINE__; (void)__pyx_clineno; } +#define __PYX_ERR(f_index, lineno, Ln_error) \ + { __PYX_MARK_ERR_POS(f_index, lineno) goto Ln_error; } + +#ifndef __PYX_EXTERN_C + #ifdef __cplusplus + #define __PYX_EXTERN_C extern "C" + #else + #define __PYX_EXTERN_C extern + #endif +#endif + +#define __PYX_HAVE__aiohttp___websocket +#define __PYX_HAVE_API__aiohttp___websocket +/* Early includes */ +#include +#include +#include "pythread.h" +#include +#ifdef _OPENMP +#include +#endif /* _OPENMP */ + +#if defined(PYREX_WITHOUT_ASSERTIONS) && !defined(CYTHON_WITHOUT_ASSERTIONS) +#define CYTHON_WITHOUT_ASSERTIONS +#endif + +typedef struct {PyObject **p; const char *s; const Py_ssize_t n; const char* encoding; + const char is_unicode; const char is_str; const char intern; } __Pyx_StringTabEntry; + +#define __PYX_DEFAULT_STRING_ENCODING_IS_ASCII 0 +#define __PYX_DEFAULT_STRING_ENCODING_IS_UTF8 0 +#define __PYX_DEFAULT_STRING_ENCODING_IS_DEFAULT (PY_MAJOR_VERSION >= 3 && __PYX_DEFAULT_STRING_ENCODING_IS_UTF8) +#define __PYX_DEFAULT_STRING_ENCODING "" +#define __Pyx_PyObject_FromString __Pyx_PyBytes_FromString +#define __Pyx_PyObject_FromStringAndSize __Pyx_PyBytes_FromStringAndSize +#define __Pyx_uchar_cast(c) ((unsigned char)c) +#define __Pyx_long_cast(x) ((long)x) +#define __Pyx_fits_Py_ssize_t(v, type, is_signed) (\ + (sizeof(type) < sizeof(Py_ssize_t)) ||\ + (sizeof(type) > sizeof(Py_ssize_t) &&\ + likely(v < (type)PY_SSIZE_T_MAX ||\ + v == (type)PY_SSIZE_T_MAX) &&\ + (!is_signed || likely(v > (type)PY_SSIZE_T_MIN ||\ + v == (type)PY_SSIZE_T_MIN))) ||\ + (sizeof(type) == sizeof(Py_ssize_t) &&\ + (is_signed || likely(v < (type)PY_SSIZE_T_MAX ||\ + v == (type)PY_SSIZE_T_MAX))) ) +static CYTHON_INLINE int __Pyx_is_valid_index(Py_ssize_t i, Py_ssize_t limit) { + return (size_t) i < (size_t) limit; +} +#if defined (__cplusplus) && __cplusplus >= 201103L + #include + #define __Pyx_sst_abs(value) std::abs(value) +#elif SIZEOF_INT >= SIZEOF_SIZE_T + #define __Pyx_sst_abs(value) abs(value) +#elif SIZEOF_LONG >= SIZEOF_SIZE_T + #define __Pyx_sst_abs(value) labs(value) +#elif defined (_MSC_VER) + #define __Pyx_sst_abs(value) ((Py_ssize_t)_abs64(value)) +#elif defined (__STDC_VERSION__) && __STDC_VERSION__ >= 199901L + #define __Pyx_sst_abs(value) llabs(value) +#elif defined (__GNUC__) + #define __Pyx_sst_abs(value) __builtin_llabs(value) +#else + #define __Pyx_sst_abs(value) ((value<0) ? -value : value) +#endif +static CYTHON_INLINE const char* __Pyx_PyObject_AsString(PyObject*); +static CYTHON_INLINE const char* __Pyx_PyObject_AsStringAndSize(PyObject*, Py_ssize_t* length); +#define __Pyx_PyByteArray_FromString(s) PyByteArray_FromStringAndSize((const char*)s, strlen((const char*)s)) +#define __Pyx_PyByteArray_FromStringAndSize(s, l) PyByteArray_FromStringAndSize((const char*)s, l) +#define __Pyx_PyBytes_FromString PyBytes_FromString +#define __Pyx_PyBytes_FromStringAndSize PyBytes_FromStringAndSize +static CYTHON_INLINE PyObject* __Pyx_PyUnicode_FromString(const char*); +#if PY_MAJOR_VERSION < 3 + #define __Pyx_PyStr_FromString __Pyx_PyBytes_FromString + #define __Pyx_PyStr_FromStringAndSize __Pyx_PyBytes_FromStringAndSize +#else + #define __Pyx_PyStr_FromString __Pyx_PyUnicode_FromString + #define __Pyx_PyStr_FromStringAndSize __Pyx_PyUnicode_FromStringAndSize +#endif +#define __Pyx_PyBytes_AsWritableString(s) ((char*) PyBytes_AS_STRING(s)) +#define __Pyx_PyBytes_AsWritableSString(s) ((signed char*) PyBytes_AS_STRING(s)) +#define __Pyx_PyBytes_AsWritableUString(s) ((unsigned char*) PyBytes_AS_STRING(s)) +#define __Pyx_PyBytes_AsString(s) ((const char*) PyBytes_AS_STRING(s)) +#define __Pyx_PyBytes_AsSString(s) ((const signed char*) PyBytes_AS_STRING(s)) +#define __Pyx_PyBytes_AsUString(s) ((const unsigned char*) PyBytes_AS_STRING(s)) +#define __Pyx_PyObject_AsWritableString(s) ((char*) __Pyx_PyObject_AsString(s)) +#define __Pyx_PyObject_AsWritableSString(s) ((signed char*) __Pyx_PyObject_AsString(s)) +#define __Pyx_PyObject_AsWritableUString(s) ((unsigned char*) __Pyx_PyObject_AsString(s)) +#define __Pyx_PyObject_AsSString(s) ((const signed char*) __Pyx_PyObject_AsString(s)) +#define __Pyx_PyObject_AsUString(s) ((const unsigned char*) __Pyx_PyObject_AsString(s)) +#define __Pyx_PyObject_FromCString(s) __Pyx_PyObject_FromString((const char*)s) +#define __Pyx_PyBytes_FromCString(s) __Pyx_PyBytes_FromString((const char*)s) +#define __Pyx_PyByteArray_FromCString(s) __Pyx_PyByteArray_FromString((const char*)s) +#define __Pyx_PyStr_FromCString(s) __Pyx_PyStr_FromString((const char*)s) +#define __Pyx_PyUnicode_FromCString(s) __Pyx_PyUnicode_FromString((const char*)s) +static CYTHON_INLINE size_t __Pyx_Py_UNICODE_strlen(const Py_UNICODE *u) { + const Py_UNICODE *u_end = u; + while (*u_end++) ; + return (size_t)(u_end - u - 1); +} +#define __Pyx_PyUnicode_FromUnicode(u) PyUnicode_FromUnicode(u, __Pyx_Py_UNICODE_strlen(u)) +#define __Pyx_PyUnicode_FromUnicodeAndLength PyUnicode_FromUnicode +#define __Pyx_PyUnicode_AsUnicode PyUnicode_AsUnicode +#define __Pyx_NewRef(obj) (Py_INCREF(obj), obj) +#define __Pyx_Owned_Py_None(b) __Pyx_NewRef(Py_None) +static CYTHON_INLINE PyObject * __Pyx_PyBool_FromLong(long b); +static CYTHON_INLINE int __Pyx_PyObject_IsTrue(PyObject*); +static CYTHON_INLINE int __Pyx_PyObject_IsTrueAndDecref(PyObject*); +static CYTHON_INLINE PyObject* __Pyx_PyNumber_IntOrLong(PyObject* x); +#define __Pyx_PySequence_Tuple(obj)\ + (likely(PyTuple_CheckExact(obj)) ? __Pyx_NewRef(obj) : PySequence_Tuple(obj)) +static CYTHON_INLINE Py_ssize_t __Pyx_PyIndex_AsSsize_t(PyObject*); +static CYTHON_INLINE PyObject * __Pyx_PyInt_FromSize_t(size_t); +#if CYTHON_ASSUME_SAFE_MACROS +#define __pyx_PyFloat_AsDouble(x) (PyFloat_CheckExact(x) ? PyFloat_AS_DOUBLE(x) : PyFloat_AsDouble(x)) +#else +#define __pyx_PyFloat_AsDouble(x) PyFloat_AsDouble(x) +#endif +#define __pyx_PyFloat_AsFloat(x) ((float) __pyx_PyFloat_AsDouble(x)) +#if PY_MAJOR_VERSION >= 3 +#define __Pyx_PyNumber_Int(x) (PyLong_CheckExact(x) ? __Pyx_NewRef(x) : PyNumber_Long(x)) +#else +#define __Pyx_PyNumber_Int(x) (PyInt_CheckExact(x) ? __Pyx_NewRef(x) : PyNumber_Int(x)) +#endif +#define __Pyx_PyNumber_Float(x) (PyFloat_CheckExact(x) ? __Pyx_NewRef(x) : PyNumber_Float(x)) +#if PY_MAJOR_VERSION < 3 && __PYX_DEFAULT_STRING_ENCODING_IS_ASCII +static int __Pyx_sys_getdefaultencoding_not_ascii; +static int __Pyx_init_sys_getdefaultencoding_params(void) { + PyObject* sys; + PyObject* default_encoding = NULL; + PyObject* ascii_chars_u = NULL; + PyObject* ascii_chars_b = NULL; + const char* default_encoding_c; + sys = PyImport_ImportModule("sys"); + if (!sys) goto bad; + default_encoding = PyObject_CallMethod(sys, (char*) "getdefaultencoding", NULL); + Py_DECREF(sys); + if (!default_encoding) goto bad; + default_encoding_c = PyBytes_AsString(default_encoding); + if (!default_encoding_c) goto bad; + if (strcmp(default_encoding_c, "ascii") == 0) { + __Pyx_sys_getdefaultencoding_not_ascii = 0; + } else { + char ascii_chars[128]; + int c; + for (c = 0; c < 128; c++) { + ascii_chars[c] = c; + } + __Pyx_sys_getdefaultencoding_not_ascii = 1; + ascii_chars_u = PyUnicode_DecodeASCII(ascii_chars, 128, NULL); + if (!ascii_chars_u) goto bad; + ascii_chars_b = PyUnicode_AsEncodedString(ascii_chars_u, default_encoding_c, NULL); + if (!ascii_chars_b || !PyBytes_Check(ascii_chars_b) || memcmp(ascii_chars, PyBytes_AS_STRING(ascii_chars_b), 128) != 0) { + PyErr_Format( + PyExc_ValueError, + "This module compiled with c_string_encoding=ascii, but default encoding '%.200s' is not a superset of ascii.", + default_encoding_c); + goto bad; + } + Py_DECREF(ascii_chars_u); + Py_DECREF(ascii_chars_b); + } + Py_DECREF(default_encoding); + return 0; +bad: + Py_XDECREF(default_encoding); + Py_XDECREF(ascii_chars_u); + Py_XDECREF(ascii_chars_b); + return -1; +} +#endif +#if __PYX_DEFAULT_STRING_ENCODING_IS_DEFAULT && PY_MAJOR_VERSION >= 3 +#define __Pyx_PyUnicode_FromStringAndSize(c_str, size) PyUnicode_DecodeUTF8(c_str, size, NULL) +#else +#define __Pyx_PyUnicode_FromStringAndSize(c_str, size) PyUnicode_Decode(c_str, size, __PYX_DEFAULT_STRING_ENCODING, NULL) +#if __PYX_DEFAULT_STRING_ENCODING_IS_DEFAULT +static char* __PYX_DEFAULT_STRING_ENCODING; +static int __Pyx_init_sys_getdefaultencoding_params(void) { + PyObject* sys; + PyObject* default_encoding = NULL; + char* default_encoding_c; + sys = PyImport_ImportModule("sys"); + if (!sys) goto bad; + default_encoding = PyObject_CallMethod(sys, (char*) (const char*) "getdefaultencoding", NULL); + Py_DECREF(sys); + if (!default_encoding) goto bad; + default_encoding_c = PyBytes_AsString(default_encoding); + if (!default_encoding_c) goto bad; + __PYX_DEFAULT_STRING_ENCODING = (char*) malloc(strlen(default_encoding_c) + 1); + if (!__PYX_DEFAULT_STRING_ENCODING) goto bad; + strcpy(__PYX_DEFAULT_STRING_ENCODING, default_encoding_c); + Py_DECREF(default_encoding); + return 0; +bad: + Py_XDECREF(default_encoding); + return -1; +} +#endif +#endif + + +/* Test for GCC > 2.95 */ +#if defined(__GNUC__) && (__GNUC__ > 2 || (__GNUC__ == 2 && (__GNUC_MINOR__ > 95))) + #define likely(x) __builtin_expect(!!(x), 1) + #define unlikely(x) __builtin_expect(!!(x), 0) +#else /* !__GNUC__ or GCC < 2.95 */ + #define likely(x) (x) + #define unlikely(x) (x) +#endif /* __GNUC__ */ +static CYTHON_INLINE void __Pyx_pretend_to_initialize(void* ptr) { (void)ptr; } + +static PyObject *__pyx_m = NULL; +static PyObject *__pyx_d; +static PyObject *__pyx_b; +static PyObject *__pyx_cython_runtime = NULL; +static PyObject *__pyx_empty_tuple; +static PyObject *__pyx_empty_bytes; +static PyObject *__pyx_empty_unicode; +static int __pyx_lineno; +static int __pyx_clineno = 0; +static const char * __pyx_cfilenm= __FILE__; +static const char *__pyx_filename; + + +static const char *__pyx_f[] = { + "aiohttp\\_websocket.pyx", + "type.pxd", + "bool.pxd", + "complex.pxd", +}; + +/*--- Type declarations ---*/ + +/* --- Runtime support code (head) --- */ +/* Refnanny.proto */ +#ifndef CYTHON_REFNANNY + #define CYTHON_REFNANNY 0 +#endif +#if CYTHON_REFNANNY + typedef struct { + void (*INCREF)(void*, PyObject*, int); + void (*DECREF)(void*, PyObject*, int); + void (*GOTREF)(void*, PyObject*, int); + void (*GIVEREF)(void*, PyObject*, int); + void* (*SetupContext)(const char*, int, const char*); + void (*FinishContext)(void**); + } __Pyx_RefNannyAPIStruct; + static __Pyx_RefNannyAPIStruct *__Pyx_RefNanny = NULL; + static __Pyx_RefNannyAPIStruct *__Pyx_RefNannyImportAPI(const char *modname); + #define __Pyx_RefNannyDeclarations void *__pyx_refnanny = NULL; +#ifdef WITH_THREAD + #define __Pyx_RefNannySetupContext(name, acquire_gil)\ + if (acquire_gil) {\ + PyGILState_STATE __pyx_gilstate_save = PyGILState_Ensure();\ + __pyx_refnanny = __Pyx_RefNanny->SetupContext((name), __LINE__, __FILE__);\ + PyGILState_Release(__pyx_gilstate_save);\ + } else {\ + __pyx_refnanny = __Pyx_RefNanny->SetupContext((name), __LINE__, __FILE__);\ + } +#else + #define __Pyx_RefNannySetupContext(name, acquire_gil)\ + __pyx_refnanny = __Pyx_RefNanny->SetupContext((name), __LINE__, __FILE__) +#endif + #define __Pyx_RefNannyFinishContext()\ + __Pyx_RefNanny->FinishContext(&__pyx_refnanny) + #define __Pyx_INCREF(r) __Pyx_RefNanny->INCREF(__pyx_refnanny, (PyObject *)(r), __LINE__) + #define __Pyx_DECREF(r) __Pyx_RefNanny->DECREF(__pyx_refnanny, (PyObject *)(r), __LINE__) + #define __Pyx_GOTREF(r) __Pyx_RefNanny->GOTREF(__pyx_refnanny, (PyObject *)(r), __LINE__) + #define __Pyx_GIVEREF(r) __Pyx_RefNanny->GIVEREF(__pyx_refnanny, (PyObject *)(r), __LINE__) + #define __Pyx_XINCREF(r) do { if((r) != NULL) {__Pyx_INCREF(r); }} while(0) + #define __Pyx_XDECREF(r) do { if((r) != NULL) {__Pyx_DECREF(r); }} while(0) + #define __Pyx_XGOTREF(r) do { if((r) != NULL) {__Pyx_GOTREF(r); }} while(0) + #define __Pyx_XGIVEREF(r) do { if((r) != NULL) {__Pyx_GIVEREF(r);}} while(0) +#else + #define __Pyx_RefNannyDeclarations + #define __Pyx_RefNannySetupContext(name, acquire_gil) + #define __Pyx_RefNannyFinishContext() + #define __Pyx_INCREF(r) Py_INCREF(r) + #define __Pyx_DECREF(r) Py_DECREF(r) + #define __Pyx_GOTREF(r) + #define __Pyx_GIVEREF(r) + #define __Pyx_XINCREF(r) Py_XINCREF(r) + #define __Pyx_XDECREF(r) Py_XDECREF(r) + #define __Pyx_XGOTREF(r) + #define __Pyx_XGIVEREF(r) +#endif +#define __Pyx_XDECREF_SET(r, v) do {\ + PyObject *tmp = (PyObject *) r;\ + r = v; __Pyx_XDECREF(tmp);\ + } while (0) +#define __Pyx_DECREF_SET(r, v) do {\ + PyObject *tmp = (PyObject *) r;\ + r = v; __Pyx_DECREF(tmp);\ + } while (0) +#define __Pyx_CLEAR(r) do { PyObject* tmp = ((PyObject*)(r)); r = NULL; __Pyx_DECREF(tmp);} while(0) +#define __Pyx_XCLEAR(r) do { if((r) != NULL) {PyObject* tmp = ((PyObject*)(r)); r = NULL; __Pyx_DECREF(tmp);}} while(0) + +/* PyObjectGetAttrStr.proto */ +#if CYTHON_USE_TYPE_SLOTS +static CYTHON_INLINE PyObject* __Pyx_PyObject_GetAttrStr(PyObject* obj, PyObject* attr_name); +#else +#define __Pyx_PyObject_GetAttrStr(o,n) PyObject_GetAttr(o,n) +#endif + +/* GetBuiltinName.proto */ +static PyObject *__Pyx_GetBuiltinName(PyObject *name); + +/* RaiseArgTupleInvalid.proto */ +static void __Pyx_RaiseArgtupleInvalid(const char* func_name, int exact, + Py_ssize_t num_min, Py_ssize_t num_max, Py_ssize_t num_found); + +/* RaiseDoubleKeywords.proto */ +static void __Pyx_RaiseDoubleKeywordsError(const char* func_name, PyObject* kw_name); + +/* ParseKeywords.proto */ +static int __Pyx_ParseOptionalKeywords(PyObject *kwds, PyObject **argnames[],\ + PyObject *kwds2, PyObject *values[], Py_ssize_t num_pos_args,\ + const char* function_name); + +/* PyCFunctionFastCall.proto */ +#if CYTHON_FAST_PYCCALL +static CYTHON_INLINE PyObject *__Pyx_PyCFunction_FastCall(PyObject *func, PyObject **args, Py_ssize_t nargs); +#else +#define __Pyx_PyCFunction_FastCall(func, args, nargs) (assert(0), NULL) +#endif + +/* PyFunctionFastCall.proto */ +#if CYTHON_FAST_PYCALL +#define __Pyx_PyFunction_FastCall(func, args, nargs)\ + __Pyx_PyFunction_FastCallDict((func), (args), (nargs), NULL) +#if 1 || PY_VERSION_HEX < 0x030600B1 +static PyObject *__Pyx_PyFunction_FastCallDict(PyObject *func, PyObject **args, Py_ssize_t nargs, PyObject *kwargs); +#else +#define __Pyx_PyFunction_FastCallDict(func, args, nargs, kwargs) _PyFunction_FastCallDict(func, args, nargs, kwargs) +#endif +#define __Pyx_BUILD_ASSERT_EXPR(cond)\ + (sizeof(char [1 - 2*!(cond)]) - 1) +#ifndef Py_MEMBER_SIZE +#define Py_MEMBER_SIZE(type, member) sizeof(((type *)0)->member) +#endif + static size_t __pyx_pyframe_localsplus_offset = 0; + #include "frameobject.h" + #define __Pxy_PyFrame_Initialize_Offsets()\ + ((void)__Pyx_BUILD_ASSERT_EXPR(sizeof(PyFrameObject) == offsetof(PyFrameObject, f_localsplus) + Py_MEMBER_SIZE(PyFrameObject, f_localsplus)),\ + (void)(__pyx_pyframe_localsplus_offset = ((size_t)PyFrame_Type.tp_basicsize) - Py_MEMBER_SIZE(PyFrameObject, f_localsplus))) + #define __Pyx_PyFrame_GetLocalsplus(frame)\ + (assert(__pyx_pyframe_localsplus_offset), (PyObject **)(((char *)(frame)) + __pyx_pyframe_localsplus_offset)) +#endif + +/* PyObjectCall.proto */ +#if CYTHON_COMPILING_IN_CPYTHON +static CYTHON_INLINE PyObject* __Pyx_PyObject_Call(PyObject *func, PyObject *arg, PyObject *kw); +#else +#define __Pyx_PyObject_Call(func, arg, kw) PyObject_Call(func, arg, kw) +#endif + +/* PyObjectCallMethO.proto */ +#if CYTHON_COMPILING_IN_CPYTHON +static CYTHON_INLINE PyObject* __Pyx_PyObject_CallMethO(PyObject *func, PyObject *arg); +#endif + +/* PyObjectCallOneArg.proto */ +static CYTHON_INLINE PyObject* __Pyx_PyObject_CallOneArg(PyObject *func, PyObject *arg); + +/* TypeImport.proto */ +#ifndef __PYX_HAVE_RT_ImportType_proto +#define __PYX_HAVE_RT_ImportType_proto +enum __Pyx_ImportType_CheckSize { + __Pyx_ImportType_CheckSize_Error = 0, + __Pyx_ImportType_CheckSize_Warn = 1, + __Pyx_ImportType_CheckSize_Ignore = 2 +}; +static PyTypeObject *__Pyx_ImportType(PyObject* module, const char *module_name, const char *class_name, size_t size, enum __Pyx_ImportType_CheckSize check_size); +#endif + +/* PyDictVersioning.proto */ +#if CYTHON_USE_DICT_VERSIONS && CYTHON_USE_TYPE_SLOTS +#define __PYX_DICT_VERSION_INIT ((PY_UINT64_T) -1) +#define __PYX_GET_DICT_VERSION(dict) (((PyDictObject*)(dict))->ma_version_tag) +#define __PYX_UPDATE_DICT_CACHE(dict, value, cache_var, version_var)\ + (version_var) = __PYX_GET_DICT_VERSION(dict);\ + (cache_var) = (value); +#define __PYX_PY_DICT_LOOKUP_IF_MODIFIED(VAR, DICT, LOOKUP) {\ + static PY_UINT64_T __pyx_dict_version = 0;\ + static PyObject *__pyx_dict_cached_value = NULL;\ + if (likely(__PYX_GET_DICT_VERSION(DICT) == __pyx_dict_version)) {\ + (VAR) = __pyx_dict_cached_value;\ + } else {\ + (VAR) = __pyx_dict_cached_value = (LOOKUP);\ + __pyx_dict_version = __PYX_GET_DICT_VERSION(DICT);\ + }\ +} +static CYTHON_INLINE PY_UINT64_T __Pyx_get_tp_dict_version(PyObject *obj); +static CYTHON_INLINE PY_UINT64_T __Pyx_get_object_dict_version(PyObject *obj); +static CYTHON_INLINE int __Pyx_object_dict_version_matches(PyObject* obj, PY_UINT64_T tp_dict_version, PY_UINT64_T obj_dict_version); +#else +#define __PYX_GET_DICT_VERSION(dict) (0) +#define __PYX_UPDATE_DICT_CACHE(dict, value, cache_var, version_var) +#define __PYX_PY_DICT_LOOKUP_IF_MODIFIED(VAR, DICT, LOOKUP) (VAR) = (LOOKUP); +#endif + +/* PyThreadStateGet.proto */ +#if CYTHON_FAST_THREAD_STATE +#define __Pyx_PyThreadState_declare PyThreadState *__pyx_tstate; +#define __Pyx_PyThreadState_assign __pyx_tstate = __Pyx_PyThreadState_Current; +#define __Pyx_PyErr_Occurred() __pyx_tstate->curexc_type +#else +#define __Pyx_PyThreadState_declare +#define __Pyx_PyThreadState_assign +#define __Pyx_PyErr_Occurred() PyErr_Occurred() +#endif + +/* PyErrFetchRestore.proto */ +#if CYTHON_FAST_THREAD_STATE +#define __Pyx_PyErr_Clear() __Pyx_ErrRestore(NULL, NULL, NULL) +#define __Pyx_ErrRestoreWithState(type, value, tb) __Pyx_ErrRestoreInState(PyThreadState_GET(), type, value, tb) +#define __Pyx_ErrFetchWithState(type, value, tb) __Pyx_ErrFetchInState(PyThreadState_GET(), type, value, tb) +#define __Pyx_ErrRestore(type, value, tb) __Pyx_ErrRestoreInState(__pyx_tstate, type, value, tb) +#define __Pyx_ErrFetch(type, value, tb) __Pyx_ErrFetchInState(__pyx_tstate, type, value, tb) +static CYTHON_INLINE void __Pyx_ErrRestoreInState(PyThreadState *tstate, PyObject *type, PyObject *value, PyObject *tb); +static CYTHON_INLINE void __Pyx_ErrFetchInState(PyThreadState *tstate, PyObject **type, PyObject **value, PyObject **tb); +#if CYTHON_COMPILING_IN_CPYTHON +#define __Pyx_PyErr_SetNone(exc) (Py_INCREF(exc), __Pyx_ErrRestore((exc), NULL, NULL)) +#else +#define __Pyx_PyErr_SetNone(exc) PyErr_SetNone(exc) +#endif +#else +#define __Pyx_PyErr_Clear() PyErr_Clear() +#define __Pyx_PyErr_SetNone(exc) PyErr_SetNone(exc) +#define __Pyx_ErrRestoreWithState(type, value, tb) PyErr_Restore(type, value, tb) +#define __Pyx_ErrFetchWithState(type, value, tb) PyErr_Fetch(type, value, tb) +#define __Pyx_ErrRestoreInState(tstate, type, value, tb) PyErr_Restore(type, value, tb) +#define __Pyx_ErrFetchInState(tstate, type, value, tb) PyErr_Fetch(type, value, tb) +#define __Pyx_ErrRestore(type, value, tb) PyErr_Restore(type, value, tb) +#define __Pyx_ErrFetch(type, value, tb) PyErr_Fetch(type, value, tb) +#endif + +/* CLineInTraceback.proto */ +#ifdef CYTHON_CLINE_IN_TRACEBACK +#define __Pyx_CLineForTraceback(tstate, c_line) (((CYTHON_CLINE_IN_TRACEBACK)) ? c_line : 0) +#else +static int __Pyx_CLineForTraceback(PyThreadState *tstate, int c_line); +#endif + +/* CodeObjectCache.proto */ +typedef struct { + PyCodeObject* code_object; + int code_line; +} __Pyx_CodeObjectCacheEntry; +struct __Pyx_CodeObjectCache { + int count; + int max_count; + __Pyx_CodeObjectCacheEntry* entries; +}; +static struct __Pyx_CodeObjectCache __pyx_code_cache = {0,0,NULL}; +static int __pyx_bisect_code_objects(__Pyx_CodeObjectCacheEntry* entries, int count, int code_line); +static PyCodeObject *__pyx_find_code_object(int code_line); +static void __pyx_insert_code_object(int code_line, PyCodeObject* code_object); + +/* AddTraceback.proto */ +static void __Pyx_AddTraceback(const char *funcname, int c_line, + int py_line, const char *filename); + +/* GCCDiagnostics.proto */ +#if defined(__GNUC__) && (__GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ >= 6)) +#define __Pyx_HAS_GCC_DIAGNOSTIC +#endif + +/* CIntToPy.proto */ +static CYTHON_INLINE PyObject* __Pyx_PyInt_From_long(long value); + +/* CIntFromPy.proto */ +static CYTHON_INLINE long __Pyx_PyInt_As_long(PyObject *); + +/* CIntFromPy.proto */ +static CYTHON_INLINE int __Pyx_PyInt_As_int(PyObject *); + +/* FastTypeChecks.proto */ +#if CYTHON_COMPILING_IN_CPYTHON +#define __Pyx_TypeCheck(obj, type) __Pyx_IsSubtype(Py_TYPE(obj), (PyTypeObject *)type) +static CYTHON_INLINE int __Pyx_IsSubtype(PyTypeObject *a, PyTypeObject *b); +static CYTHON_INLINE int __Pyx_PyErr_GivenExceptionMatches(PyObject *err, PyObject *type); +static CYTHON_INLINE int __Pyx_PyErr_GivenExceptionMatches2(PyObject *err, PyObject *type1, PyObject *type2); +#else +#define __Pyx_TypeCheck(obj, type) PyObject_TypeCheck(obj, (PyTypeObject *)type) +#define __Pyx_PyErr_GivenExceptionMatches(err, type) PyErr_GivenExceptionMatches(err, type) +#define __Pyx_PyErr_GivenExceptionMatches2(err, type1, type2) (PyErr_GivenExceptionMatches(err, type1) || PyErr_GivenExceptionMatches(err, type2)) +#endif +#define __Pyx_PyException_Check(obj) __Pyx_TypeCheck(obj, PyExc_Exception) + +/* CheckBinaryVersion.proto */ +static int __Pyx_check_binary_version(void); + +/* InitStrings.proto */ +static int __Pyx_InitStrings(__Pyx_StringTabEntry *t); + + +/* Module declarations from 'cpython.version' */ + +/* Module declarations from '__builtin__' */ + +/* Module declarations from 'cpython.type' */ +static PyTypeObject *__pyx_ptype_7cpython_4type_type = 0; + +/* Module declarations from 'libc.string' */ + +/* Module declarations from 'libc.stdio' */ + +/* Module declarations from 'cpython.object' */ + +/* Module declarations from 'cpython.ref' */ + +/* Module declarations from 'cpython.exc' */ + +/* Module declarations from 'cpython.module' */ + +/* Module declarations from 'cpython.mem' */ + +/* Module declarations from 'cpython.tuple' */ + +/* Module declarations from 'cpython.list' */ + +/* Module declarations from 'cpython.sequence' */ + +/* Module declarations from 'cpython.mapping' */ + +/* Module declarations from 'cpython.iterator' */ + +/* Module declarations from 'cpython.number' */ + +/* Module declarations from 'cpython.int' */ + +/* Module declarations from '__builtin__' */ + +/* Module declarations from 'cpython.bool' */ +static PyTypeObject *__pyx_ptype_7cpython_4bool_bool = 0; + +/* Module declarations from 'cpython.long' */ + +/* Module declarations from 'cpython.float' */ + +/* Module declarations from '__builtin__' */ + +/* Module declarations from 'cpython.complex' */ +static PyTypeObject *__pyx_ptype_7cpython_7complex_complex = 0; + +/* Module declarations from 'cpython.string' */ + +/* Module declarations from 'cpython.unicode' */ + +/* Module declarations from 'cpython.dict' */ + +/* Module declarations from 'cpython.instance' */ + +/* Module declarations from 'cpython.function' */ + +/* Module declarations from 'cpython.method' */ + +/* Module declarations from 'cpython.weakref' */ + +/* Module declarations from 'cpython.getargs' */ + +/* Module declarations from 'cpython.pythread' */ + +/* Module declarations from 'cpython.pystate' */ + +/* Module declarations from 'cpython.cobject' */ + +/* Module declarations from 'cpython.oldbuffer' */ + +/* Module declarations from 'cpython.set' */ + +/* Module declarations from 'cpython.buffer' */ + +/* Module declarations from 'cpython.bytes' */ + +/* Module declarations from 'cpython.pycapsule' */ + +/* Module declarations from 'cpython' */ + +/* Module declarations from 'libc.stdint' */ + +/* Module declarations from 'aiohttp._websocket' */ +#define __Pyx_MODULE_NAME "aiohttp._websocket" +extern int __pyx_module_is_main_aiohttp___websocket; +int __pyx_module_is_main_aiohttp___websocket = 0; + +/* Implementation of 'aiohttp._websocket' */ +static PyObject *__pyx_builtin_range; +static const char __pyx_k_i[] = "i"; +static const char __pyx_k_data[] = "data"; +static const char __pyx_k_main[] = "__main__"; +static const char __pyx_k_mask[] = "mask"; +static const char __pyx_k_name[] = "__name__"; +static const char __pyx_k_test[] = "__test__"; +static const char __pyx_k_range[] = "range"; +static const char __pyx_k_in_buf[] = "in_buf"; +static const char __pyx_k_data_len[] = "data_len"; +static const char __pyx_k_mask_buf[] = "mask_buf"; +static const char __pyx_k_uint32_msk[] = "uint32_msk"; +static const char __pyx_k_uint64_msk[] = "uint64_msk"; +static const char __pyx_k_aiohttp__websocket[] = "aiohttp._websocket"; +static const char __pyx_k_cline_in_traceback[] = "cline_in_traceback"; +static const char __pyx_k_websocket_mask_cython[] = "_websocket_mask_cython"; +static const char __pyx_k_aiohttp__websocket_pyx[] = "aiohttp\\_websocket.pyx"; +static PyObject *__pyx_n_s_aiohttp__websocket; +static PyObject *__pyx_kp_s_aiohttp__websocket_pyx; +static PyObject *__pyx_n_s_cline_in_traceback; +static PyObject *__pyx_n_s_data; +static PyObject *__pyx_n_s_data_len; +static PyObject *__pyx_n_s_i; +static PyObject *__pyx_n_s_in_buf; +static PyObject *__pyx_n_s_main; +static PyObject *__pyx_n_s_mask; +static PyObject *__pyx_n_s_mask_buf; +static PyObject *__pyx_n_s_name; +static PyObject *__pyx_n_s_range; +static PyObject *__pyx_n_s_test; +static PyObject *__pyx_n_s_uint32_msk; +static PyObject *__pyx_n_s_uint64_msk; +static PyObject *__pyx_n_s_websocket_mask_cython; +static PyObject *__pyx_pf_7aiohttp_10_websocket__websocket_mask_cython(CYTHON_UNUSED PyObject *__pyx_self, PyObject *__pyx_v_mask, PyObject *__pyx_v_data); /* proto */ +static PyObject *__pyx_tuple_; +static PyObject *__pyx_codeobj__2; +/* Late includes */ + +/* "aiohttp/_websocket.pyx":11 + * + * + * def _websocket_mask_cython(object mask, object data): # <<<<<<<<<<<<<< + * """Note, this function mutates its `data` argument + * """ + */ + +/* Python wrapper */ +static PyObject *__pyx_pw_7aiohttp_10_websocket_1_websocket_mask_cython(PyObject *__pyx_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/ +static char __pyx_doc_7aiohttp_10_websocket__websocket_mask_cython[] = "Note, this function mutates its `data` argument\n "; +static PyMethodDef __pyx_mdef_7aiohttp_10_websocket_1_websocket_mask_cython = {"_websocket_mask_cython", (PyCFunction)(void*)(PyCFunctionWithKeywords)__pyx_pw_7aiohttp_10_websocket_1_websocket_mask_cython, METH_VARARGS|METH_KEYWORDS, __pyx_doc_7aiohttp_10_websocket__websocket_mask_cython}; +static PyObject *__pyx_pw_7aiohttp_10_websocket_1_websocket_mask_cython(PyObject *__pyx_self, PyObject *__pyx_args, PyObject *__pyx_kwds) { + PyObject *__pyx_v_mask = 0; + PyObject *__pyx_v_data = 0; + int __pyx_lineno = 0; + const char *__pyx_filename = NULL; + int __pyx_clineno = 0; + PyObject *__pyx_r = 0; + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("_websocket_mask_cython (wrapper)", 0); + { + static PyObject **__pyx_pyargnames[] = {&__pyx_n_s_mask,&__pyx_n_s_data,0}; + PyObject* values[2] = {0,0}; + if (unlikely(__pyx_kwds)) { + Py_ssize_t kw_args; + const Py_ssize_t pos_args = PyTuple_GET_SIZE(__pyx_args); + switch (pos_args) { + case 2: values[1] = PyTuple_GET_ITEM(__pyx_args, 1); + CYTHON_FALLTHROUGH; + case 1: values[0] = PyTuple_GET_ITEM(__pyx_args, 0); + CYTHON_FALLTHROUGH; + case 0: break; + default: goto __pyx_L5_argtuple_error; + } + kw_args = PyDict_Size(__pyx_kwds); + switch (pos_args) { + case 0: + if (likely((values[0] = __Pyx_PyDict_GetItemStr(__pyx_kwds, __pyx_n_s_mask)) != 0)) kw_args--; + else goto __pyx_L5_argtuple_error; + CYTHON_FALLTHROUGH; + case 1: + if (likely((values[1] = __Pyx_PyDict_GetItemStr(__pyx_kwds, __pyx_n_s_data)) != 0)) kw_args--; + else { + __Pyx_RaiseArgtupleInvalid("_websocket_mask_cython", 1, 2, 2, 1); __PYX_ERR(0, 11, __pyx_L3_error) + } + } + if (unlikely(kw_args > 0)) { + if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, pos_args, "_websocket_mask_cython") < 0)) __PYX_ERR(0, 11, __pyx_L3_error) + } + } else if (PyTuple_GET_SIZE(__pyx_args) != 2) { + goto __pyx_L5_argtuple_error; + } else { + values[0] = PyTuple_GET_ITEM(__pyx_args, 0); + values[1] = PyTuple_GET_ITEM(__pyx_args, 1); + } + __pyx_v_mask = values[0]; + __pyx_v_data = values[1]; + } + goto __pyx_L4_argument_unpacking_done; + __pyx_L5_argtuple_error:; + __Pyx_RaiseArgtupleInvalid("_websocket_mask_cython", 1, 2, 2, PyTuple_GET_SIZE(__pyx_args)); __PYX_ERR(0, 11, __pyx_L3_error) + __pyx_L3_error:; + __Pyx_AddTraceback("aiohttp._websocket._websocket_mask_cython", __pyx_clineno, __pyx_lineno, __pyx_filename); + __Pyx_RefNannyFinishContext(); + return NULL; + __pyx_L4_argument_unpacking_done:; + __pyx_r = __pyx_pf_7aiohttp_10_websocket__websocket_mask_cython(__pyx_self, __pyx_v_mask, __pyx_v_data); + + /* function exit code */ + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +static PyObject *__pyx_pf_7aiohttp_10_websocket__websocket_mask_cython(CYTHON_UNUSED PyObject *__pyx_self, PyObject *__pyx_v_mask, PyObject *__pyx_v_data) { + Py_ssize_t __pyx_v_data_len; + Py_ssize_t __pyx_v_i; + unsigned char *__pyx_v_in_buf; + unsigned char const *__pyx_v_mask_buf; + uint32_t __pyx_v_uint32_msk; + uint64_t __pyx_v_uint64_msk; + PyObject *__pyx_r = NULL; + __Pyx_RefNannyDeclarations + Py_ssize_t __pyx_t_1; + int __pyx_t_2; + int __pyx_t_3; + PyObject *__pyx_t_4 = NULL; + char *__pyx_t_5; + uint64_t *__pyx_t_6; + long __pyx_t_7; + uint32_t *__pyx_t_8; + Py_ssize_t __pyx_t_9; + Py_ssize_t __pyx_t_10; + Py_ssize_t __pyx_t_11; + int __pyx_lineno = 0; + const char *__pyx_filename = NULL; + int __pyx_clineno = 0; + __Pyx_RefNannySetupContext("_websocket_mask_cython", 0); + __Pyx_INCREF(__pyx_v_mask); + __Pyx_INCREF(__pyx_v_data); + + /* "aiohttp/_websocket.pyx":22 + * uint64_t uint64_msk + * + * assert len(mask) == 4 # <<<<<<<<<<<<<< + * + * if not isinstance(mask, bytes): + */ + #ifndef CYTHON_WITHOUT_ASSERTIONS + if (unlikely(!Py_OptimizeFlag)) { + __pyx_t_1 = PyObject_Length(__pyx_v_mask); if (unlikely(__pyx_t_1 == ((Py_ssize_t)-1))) __PYX_ERR(0, 22, __pyx_L1_error) + if (unlikely(!((__pyx_t_1 == 4) != 0))) { + PyErr_SetNone(PyExc_AssertionError); + __PYX_ERR(0, 22, __pyx_L1_error) + } + } + #endif + + /* "aiohttp/_websocket.pyx":24 + * assert len(mask) == 4 + * + * if not isinstance(mask, bytes): # <<<<<<<<<<<<<< + * mask = bytes(mask) + * + */ + __pyx_t_2 = PyBytes_Check(__pyx_v_mask); + __pyx_t_3 = ((!(__pyx_t_2 != 0)) != 0); + if (__pyx_t_3) { + + /* "aiohttp/_websocket.pyx":25 + * + * if not isinstance(mask, bytes): + * mask = bytes(mask) # <<<<<<<<<<<<<< + * + * if isinstance(data, bytearray): + */ + __pyx_t_4 = __Pyx_PyObject_CallOneArg(((PyObject *)(&PyBytes_Type)), __pyx_v_mask); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 25, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_4); + __Pyx_DECREF_SET(__pyx_v_mask, __pyx_t_4); + __pyx_t_4 = 0; + + /* "aiohttp/_websocket.pyx":24 + * assert len(mask) == 4 + * + * if not isinstance(mask, bytes): # <<<<<<<<<<<<<< + * mask = bytes(mask) + * + */ + } + + /* "aiohttp/_websocket.pyx":27 + * mask = bytes(mask) + * + * if isinstance(data, bytearray): # <<<<<<<<<<<<<< + * data = data + * else: + */ + __pyx_t_3 = PyByteArray_Check(__pyx_v_data); + __pyx_t_2 = (__pyx_t_3 != 0); + if (__pyx_t_2) { + + /* "aiohttp/_websocket.pyx":28 + * + * if isinstance(data, bytearray): + * data = data # <<<<<<<<<<<<<< + * else: + * data = bytearray(data) + */ + __pyx_t_4 = __pyx_v_data; + __Pyx_INCREF(__pyx_t_4); + __Pyx_DECREF_SET(__pyx_v_data, __pyx_t_4); + __pyx_t_4 = 0; + + /* "aiohttp/_websocket.pyx":27 + * mask = bytes(mask) + * + * if isinstance(data, bytearray): # <<<<<<<<<<<<<< + * data = data + * else: + */ + goto __pyx_L4; + } + + /* "aiohttp/_websocket.pyx":30 + * data = data + * else: + * data = bytearray(data) # <<<<<<<<<<<<<< + * + * data_len = len(data) + */ + /*else*/ { + __pyx_t_4 = __Pyx_PyObject_CallOneArg(((PyObject *)(&PyByteArray_Type)), __pyx_v_data); if (unlikely(!__pyx_t_4)) __PYX_ERR(0, 30, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_4); + __Pyx_DECREF_SET(__pyx_v_data, __pyx_t_4); + __pyx_t_4 = 0; + } + __pyx_L4:; + + /* "aiohttp/_websocket.pyx":32 + * data = bytearray(data) + * + * data_len = len(data) # <<<<<<<<<<<<<< + * in_buf = PyByteArray_AsString(data) + * mask_buf = PyBytes_AsString(mask) + */ + __pyx_t_1 = PyObject_Length(__pyx_v_data); if (unlikely(__pyx_t_1 == ((Py_ssize_t)-1))) __PYX_ERR(0, 32, __pyx_L1_error) + __pyx_v_data_len = __pyx_t_1; + + /* "aiohttp/_websocket.pyx":33 + * + * data_len = len(data) + * in_buf = PyByteArray_AsString(data) # <<<<<<<<<<<<<< + * mask_buf = PyBytes_AsString(mask) + * uint32_msk = (mask_buf)[0] + */ + if (!(likely(PyByteArray_CheckExact(__pyx_v_data))||((__pyx_v_data) == Py_None)||(PyErr_Format(PyExc_TypeError, "Expected %.16s, got %.200s", "bytearray", Py_TYPE(__pyx_v_data)->tp_name), 0))) __PYX_ERR(0, 33, __pyx_L1_error) + __pyx_t_5 = PyByteArray_AsString(((PyObject*)__pyx_v_data)); if (unlikely(__pyx_t_5 == ((char *)NULL))) __PYX_ERR(0, 33, __pyx_L1_error) + __pyx_v_in_buf = ((unsigned char *)__pyx_t_5); + + /* "aiohttp/_websocket.pyx":34 + * data_len = len(data) + * in_buf = PyByteArray_AsString(data) + * mask_buf = PyBytes_AsString(mask) # <<<<<<<<<<<<<< + * uint32_msk = (mask_buf)[0] + * + */ + __pyx_t_5 = PyBytes_AsString(__pyx_v_mask); if (unlikely(__pyx_t_5 == ((char *)NULL))) __PYX_ERR(0, 34, __pyx_L1_error) + __pyx_v_mask_buf = ((unsigned char const *)__pyx_t_5); + + /* "aiohttp/_websocket.pyx":35 + * in_buf = PyByteArray_AsString(data) + * mask_buf = PyBytes_AsString(mask) + * uint32_msk = (mask_buf)[0] # <<<<<<<<<<<<<< + * + * # TODO: align in_data ptr to achieve even faster speeds + */ + __pyx_v_uint32_msk = (((uint32_t *)__pyx_v_mask_buf)[0]); + + /* "aiohttp/_websocket.pyx":40 + * # does it need in python ?! malloc() always aligns to sizeof(long) bytes + * + * if sizeof(size_t) >= 8: # <<<<<<<<<<<<<< + * uint64_msk = uint32_msk + * uint64_msk = (uint64_msk << 32) | uint32_msk + */ + __pyx_t_2 = (((sizeof(size_t)) >= 8) != 0); + if (__pyx_t_2) { + + /* "aiohttp/_websocket.pyx":41 + * + * if sizeof(size_t) >= 8: + * uint64_msk = uint32_msk # <<<<<<<<<<<<<< + * uint64_msk = (uint64_msk << 32) | uint32_msk + * + */ + __pyx_v_uint64_msk = __pyx_v_uint32_msk; + + /* "aiohttp/_websocket.pyx":42 + * if sizeof(size_t) >= 8: + * uint64_msk = uint32_msk + * uint64_msk = (uint64_msk << 32) | uint32_msk # <<<<<<<<<<<<<< + * + * while data_len >= 8: + */ + __pyx_v_uint64_msk = ((__pyx_v_uint64_msk << 32) | __pyx_v_uint32_msk); + + /* "aiohttp/_websocket.pyx":44 + * uint64_msk = (uint64_msk << 32) | uint32_msk + * + * while data_len >= 8: # <<<<<<<<<<<<<< + * (in_buf)[0] ^= uint64_msk + * in_buf += 8 + */ + while (1) { + __pyx_t_2 = ((__pyx_v_data_len >= 8) != 0); + if (!__pyx_t_2) break; + + /* "aiohttp/_websocket.pyx":45 + * + * while data_len >= 8: + * (in_buf)[0] ^= uint64_msk # <<<<<<<<<<<<<< + * in_buf += 8 + * data_len -= 8 + */ + __pyx_t_6 = ((uint64_t *)__pyx_v_in_buf); + __pyx_t_7 = 0; + (__pyx_t_6[__pyx_t_7]) = ((__pyx_t_6[__pyx_t_7]) ^ __pyx_v_uint64_msk); + + /* "aiohttp/_websocket.pyx":46 + * while data_len >= 8: + * (in_buf)[0] ^= uint64_msk + * in_buf += 8 # <<<<<<<<<<<<<< + * data_len -= 8 + * + */ + __pyx_v_in_buf = (__pyx_v_in_buf + 8); + + /* "aiohttp/_websocket.pyx":47 + * (in_buf)[0] ^= uint64_msk + * in_buf += 8 + * data_len -= 8 # <<<<<<<<<<<<<< + * + * + */ + __pyx_v_data_len = (__pyx_v_data_len - 8); + } + + /* "aiohttp/_websocket.pyx":40 + * # does it need in python ?! malloc() always aligns to sizeof(long) bytes + * + * if sizeof(size_t) >= 8: # <<<<<<<<<<<<<< + * uint64_msk = uint32_msk + * uint64_msk = (uint64_msk << 32) | uint32_msk + */ + } + + /* "aiohttp/_websocket.pyx":50 + * + * + * while data_len >= 4: # <<<<<<<<<<<<<< + * (in_buf)[0] ^= uint32_msk + * in_buf += 4 + */ + while (1) { + __pyx_t_2 = ((__pyx_v_data_len >= 4) != 0); + if (!__pyx_t_2) break; + + /* "aiohttp/_websocket.pyx":51 + * + * while data_len >= 4: + * (in_buf)[0] ^= uint32_msk # <<<<<<<<<<<<<< + * in_buf += 4 + * data_len -= 4 + */ + __pyx_t_8 = ((uint32_t *)__pyx_v_in_buf); + __pyx_t_7 = 0; + (__pyx_t_8[__pyx_t_7]) = ((__pyx_t_8[__pyx_t_7]) ^ __pyx_v_uint32_msk); + + /* "aiohttp/_websocket.pyx":52 + * while data_len >= 4: + * (in_buf)[0] ^= uint32_msk + * in_buf += 4 # <<<<<<<<<<<<<< + * data_len -= 4 + * + */ + __pyx_v_in_buf = (__pyx_v_in_buf + 4); + + /* "aiohttp/_websocket.pyx":53 + * (in_buf)[0] ^= uint32_msk + * in_buf += 4 + * data_len -= 4 # <<<<<<<<<<<<<< + * + * for i in range(0, data_len): + */ + __pyx_v_data_len = (__pyx_v_data_len - 4); + } + + /* "aiohttp/_websocket.pyx":55 + * data_len -= 4 + * + * for i in range(0, data_len): # <<<<<<<<<<<<<< + * in_buf[i] ^= mask_buf[i] + */ + __pyx_t_1 = __pyx_v_data_len; + __pyx_t_9 = __pyx_t_1; + for (__pyx_t_10 = 0; __pyx_t_10 < __pyx_t_9; __pyx_t_10+=1) { + __pyx_v_i = __pyx_t_10; + + /* "aiohttp/_websocket.pyx":56 + * + * for i in range(0, data_len): + * in_buf[i] ^= mask_buf[i] # <<<<<<<<<<<<<< + */ + __pyx_t_11 = __pyx_v_i; + (__pyx_v_in_buf[__pyx_t_11]) = ((__pyx_v_in_buf[__pyx_t_11]) ^ (__pyx_v_mask_buf[__pyx_v_i])); + } + + /* "aiohttp/_websocket.pyx":11 + * + * + * def _websocket_mask_cython(object mask, object data): # <<<<<<<<<<<<<< + * """Note, this function mutates its `data` argument + * """ + */ + + /* function exit code */ + __pyx_r = Py_None; __Pyx_INCREF(Py_None); + goto __pyx_L0; + __pyx_L1_error:; + __Pyx_XDECREF(__pyx_t_4); + __Pyx_AddTraceback("aiohttp._websocket._websocket_mask_cython", __pyx_clineno, __pyx_lineno, __pyx_filename); + __pyx_r = NULL; + __pyx_L0:; + __Pyx_XDECREF(__pyx_v_mask); + __Pyx_XDECREF(__pyx_v_data); + __Pyx_XGIVEREF(__pyx_r); + __Pyx_RefNannyFinishContext(); + return __pyx_r; +} + +static PyMethodDef __pyx_methods[] = { + {0, 0, 0, 0} +}; + +#if PY_MAJOR_VERSION >= 3 +#if CYTHON_PEP489_MULTI_PHASE_INIT +static PyObject* __pyx_pymod_create(PyObject *spec, PyModuleDef *def); /*proto*/ +static int __pyx_pymod_exec__websocket(PyObject* module); /*proto*/ +static PyModuleDef_Slot __pyx_moduledef_slots[] = { + {Py_mod_create, (void*)__pyx_pymod_create}, + {Py_mod_exec, (void*)__pyx_pymod_exec__websocket}, + {0, NULL} +}; +#endif + +static struct PyModuleDef __pyx_moduledef = { + PyModuleDef_HEAD_INIT, + "_websocket", + 0, /* m_doc */ + #if CYTHON_PEP489_MULTI_PHASE_INIT + 0, /* m_size */ + #else + -1, /* m_size */ + #endif + __pyx_methods /* m_methods */, + #if CYTHON_PEP489_MULTI_PHASE_INIT + __pyx_moduledef_slots, /* m_slots */ + #else + NULL, /* m_reload */ + #endif + NULL, /* m_traverse */ + NULL, /* m_clear */ + NULL /* m_free */ +}; +#endif +#ifndef CYTHON_SMALL_CODE +#if defined(__clang__) + #define CYTHON_SMALL_CODE +#elif defined(__GNUC__) && (__GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ >= 3)) + #define CYTHON_SMALL_CODE __attribute__((cold)) +#else + #define CYTHON_SMALL_CODE +#endif +#endif + +static __Pyx_StringTabEntry __pyx_string_tab[] = { + {&__pyx_n_s_aiohttp__websocket, __pyx_k_aiohttp__websocket, sizeof(__pyx_k_aiohttp__websocket), 0, 0, 1, 1}, + {&__pyx_kp_s_aiohttp__websocket_pyx, __pyx_k_aiohttp__websocket_pyx, sizeof(__pyx_k_aiohttp__websocket_pyx), 0, 0, 1, 0}, + {&__pyx_n_s_cline_in_traceback, __pyx_k_cline_in_traceback, sizeof(__pyx_k_cline_in_traceback), 0, 0, 1, 1}, + {&__pyx_n_s_data, __pyx_k_data, sizeof(__pyx_k_data), 0, 0, 1, 1}, + {&__pyx_n_s_data_len, __pyx_k_data_len, sizeof(__pyx_k_data_len), 0, 0, 1, 1}, + {&__pyx_n_s_i, __pyx_k_i, sizeof(__pyx_k_i), 0, 0, 1, 1}, + {&__pyx_n_s_in_buf, __pyx_k_in_buf, sizeof(__pyx_k_in_buf), 0, 0, 1, 1}, + {&__pyx_n_s_main, __pyx_k_main, sizeof(__pyx_k_main), 0, 0, 1, 1}, + {&__pyx_n_s_mask, __pyx_k_mask, sizeof(__pyx_k_mask), 0, 0, 1, 1}, + {&__pyx_n_s_mask_buf, __pyx_k_mask_buf, sizeof(__pyx_k_mask_buf), 0, 0, 1, 1}, + {&__pyx_n_s_name, __pyx_k_name, sizeof(__pyx_k_name), 0, 0, 1, 1}, + {&__pyx_n_s_range, __pyx_k_range, sizeof(__pyx_k_range), 0, 0, 1, 1}, + {&__pyx_n_s_test, __pyx_k_test, sizeof(__pyx_k_test), 0, 0, 1, 1}, + {&__pyx_n_s_uint32_msk, __pyx_k_uint32_msk, sizeof(__pyx_k_uint32_msk), 0, 0, 1, 1}, + {&__pyx_n_s_uint64_msk, __pyx_k_uint64_msk, sizeof(__pyx_k_uint64_msk), 0, 0, 1, 1}, + {&__pyx_n_s_websocket_mask_cython, __pyx_k_websocket_mask_cython, sizeof(__pyx_k_websocket_mask_cython), 0, 0, 1, 1}, + {0, 0, 0, 0, 0, 0, 0} +}; +static CYTHON_SMALL_CODE int __Pyx_InitCachedBuiltins(void) { + __pyx_builtin_range = __Pyx_GetBuiltinName(__pyx_n_s_range); if (!__pyx_builtin_range) __PYX_ERR(0, 55, __pyx_L1_error) + return 0; + __pyx_L1_error:; + return -1; +} + +static CYTHON_SMALL_CODE int __Pyx_InitCachedConstants(void) { + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("__Pyx_InitCachedConstants", 0); + + /* "aiohttp/_websocket.pyx":11 + * + * + * def _websocket_mask_cython(object mask, object data): # <<<<<<<<<<<<<< + * """Note, this function mutates its `data` argument + * """ + */ + __pyx_tuple_ = PyTuple_Pack(8, __pyx_n_s_mask, __pyx_n_s_data, __pyx_n_s_data_len, __pyx_n_s_i, __pyx_n_s_in_buf, __pyx_n_s_mask_buf, __pyx_n_s_uint32_msk, __pyx_n_s_uint64_msk); if (unlikely(!__pyx_tuple_)) __PYX_ERR(0, 11, __pyx_L1_error) + __Pyx_GOTREF(__pyx_tuple_); + __Pyx_GIVEREF(__pyx_tuple_); + __pyx_codeobj__2 = (PyObject*)__Pyx_PyCode_New(2, 0, 8, 0, CO_OPTIMIZED|CO_NEWLOCALS, __pyx_empty_bytes, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_tuple_, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_kp_s_aiohttp__websocket_pyx, __pyx_n_s_websocket_mask_cython, 11, __pyx_empty_bytes); if (unlikely(!__pyx_codeobj__2)) __PYX_ERR(0, 11, __pyx_L1_error) + __Pyx_RefNannyFinishContext(); + return 0; + __pyx_L1_error:; + __Pyx_RefNannyFinishContext(); + return -1; +} + +static CYTHON_SMALL_CODE int __Pyx_InitGlobals(void) { + if (__Pyx_InitStrings(__pyx_string_tab) < 0) __PYX_ERR(0, 1, __pyx_L1_error); + return 0; + __pyx_L1_error:; + return -1; +} + +static CYTHON_SMALL_CODE int __Pyx_modinit_global_init_code(void); /*proto*/ +static CYTHON_SMALL_CODE int __Pyx_modinit_variable_export_code(void); /*proto*/ +static CYTHON_SMALL_CODE int __Pyx_modinit_function_export_code(void); /*proto*/ +static CYTHON_SMALL_CODE int __Pyx_modinit_type_init_code(void); /*proto*/ +static CYTHON_SMALL_CODE int __Pyx_modinit_type_import_code(void); /*proto*/ +static CYTHON_SMALL_CODE int __Pyx_modinit_variable_import_code(void); /*proto*/ +static CYTHON_SMALL_CODE int __Pyx_modinit_function_import_code(void); /*proto*/ + +static int __Pyx_modinit_global_init_code(void) { + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("__Pyx_modinit_global_init_code", 0); + /*--- Global init code ---*/ + __Pyx_RefNannyFinishContext(); + return 0; +} + +static int __Pyx_modinit_variable_export_code(void) { + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("__Pyx_modinit_variable_export_code", 0); + /*--- Variable export code ---*/ + __Pyx_RefNannyFinishContext(); + return 0; +} + +static int __Pyx_modinit_function_export_code(void) { + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("__Pyx_modinit_function_export_code", 0); + /*--- Function export code ---*/ + __Pyx_RefNannyFinishContext(); + return 0; +} + +static int __Pyx_modinit_type_init_code(void) { + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("__Pyx_modinit_type_init_code", 0); + /*--- Type init code ---*/ + __Pyx_RefNannyFinishContext(); + return 0; +} + +static int __Pyx_modinit_type_import_code(void) { + __Pyx_RefNannyDeclarations + PyObject *__pyx_t_1 = NULL; + int __pyx_lineno = 0; + const char *__pyx_filename = NULL; + int __pyx_clineno = 0; + __Pyx_RefNannySetupContext("__Pyx_modinit_type_import_code", 0); + /*--- Type import code ---*/ + __pyx_t_1 = PyImport_ImportModule(__Pyx_BUILTIN_MODULE_NAME); if (unlikely(!__pyx_t_1)) __PYX_ERR(1, 9, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __pyx_ptype_7cpython_4type_type = __Pyx_ImportType(__pyx_t_1, __Pyx_BUILTIN_MODULE_NAME, "type", + #if defined(PYPY_VERSION_NUM) && PYPY_VERSION_NUM < 0x050B0000 + sizeof(PyTypeObject), + #else + sizeof(PyHeapTypeObject), + #endif + __Pyx_ImportType_CheckSize_Warn); + if (!__pyx_ptype_7cpython_4type_type) __PYX_ERR(1, 9, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + __pyx_t_1 = PyImport_ImportModule(__Pyx_BUILTIN_MODULE_NAME); if (unlikely(!__pyx_t_1)) __PYX_ERR(2, 8, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __pyx_ptype_7cpython_4bool_bool = __Pyx_ImportType(__pyx_t_1, __Pyx_BUILTIN_MODULE_NAME, "bool", sizeof(PyBoolObject), __Pyx_ImportType_CheckSize_Warn); + if (!__pyx_ptype_7cpython_4bool_bool) __PYX_ERR(2, 8, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + __pyx_t_1 = PyImport_ImportModule(__Pyx_BUILTIN_MODULE_NAME); if (unlikely(!__pyx_t_1)) __PYX_ERR(3, 15, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + __pyx_ptype_7cpython_7complex_complex = __Pyx_ImportType(__pyx_t_1, __Pyx_BUILTIN_MODULE_NAME, "complex", sizeof(PyComplexObject), __Pyx_ImportType_CheckSize_Warn); + if (!__pyx_ptype_7cpython_7complex_complex) __PYX_ERR(3, 15, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + __Pyx_RefNannyFinishContext(); + return 0; + __pyx_L1_error:; + __Pyx_XDECREF(__pyx_t_1); + __Pyx_RefNannyFinishContext(); + return -1; +} + +static int __Pyx_modinit_variable_import_code(void) { + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("__Pyx_modinit_variable_import_code", 0); + /*--- Variable import code ---*/ + __Pyx_RefNannyFinishContext(); + return 0; +} + +static int __Pyx_modinit_function_import_code(void) { + __Pyx_RefNannyDeclarations + __Pyx_RefNannySetupContext("__Pyx_modinit_function_import_code", 0); + /*--- Function import code ---*/ + __Pyx_RefNannyFinishContext(); + return 0; +} + + +#ifndef CYTHON_NO_PYINIT_EXPORT +#define __Pyx_PyMODINIT_FUNC PyMODINIT_FUNC +#elif PY_MAJOR_VERSION < 3 +#ifdef __cplusplus +#define __Pyx_PyMODINIT_FUNC extern "C" void +#else +#define __Pyx_PyMODINIT_FUNC void +#endif +#else +#ifdef __cplusplus +#define __Pyx_PyMODINIT_FUNC extern "C" PyObject * +#else +#define __Pyx_PyMODINIT_FUNC PyObject * +#endif +#endif + + +#if PY_MAJOR_VERSION < 3 +__Pyx_PyMODINIT_FUNC init_websocket(void) CYTHON_SMALL_CODE; /*proto*/ +__Pyx_PyMODINIT_FUNC init_websocket(void) +#else +__Pyx_PyMODINIT_FUNC PyInit__websocket(void) CYTHON_SMALL_CODE; /*proto*/ +__Pyx_PyMODINIT_FUNC PyInit__websocket(void) +#if CYTHON_PEP489_MULTI_PHASE_INIT +{ + return PyModuleDef_Init(&__pyx_moduledef); +} +static CYTHON_SMALL_CODE int __Pyx_check_single_interpreter(void) { + #if PY_VERSION_HEX >= 0x030700A1 + static PY_INT64_T main_interpreter_id = -1; + PY_INT64_T current_id = PyInterpreterState_GetID(PyThreadState_Get()->interp); + if (main_interpreter_id == -1) { + main_interpreter_id = current_id; + return (unlikely(current_id == -1)) ? -1 : 0; + } else if (unlikely(main_interpreter_id != current_id)) + #else + static PyInterpreterState *main_interpreter = NULL; + PyInterpreterState *current_interpreter = PyThreadState_Get()->interp; + if (!main_interpreter) { + main_interpreter = current_interpreter; + } else if (unlikely(main_interpreter != current_interpreter)) + #endif + { + PyErr_SetString( + PyExc_ImportError, + "Interpreter change detected - this module can only be loaded into one interpreter per process."); + return -1; + } + return 0; +} +static CYTHON_SMALL_CODE int __Pyx_copy_spec_to_module(PyObject *spec, PyObject *moddict, const char* from_name, const char* to_name, int allow_none) { + PyObject *value = PyObject_GetAttrString(spec, from_name); + int result = 0; + if (likely(value)) { + if (allow_none || value != Py_None) { + result = PyDict_SetItemString(moddict, to_name, value); + } + Py_DECREF(value); + } else if (PyErr_ExceptionMatches(PyExc_AttributeError)) { + PyErr_Clear(); + } else { + result = -1; + } + return result; +} +static CYTHON_SMALL_CODE PyObject* __pyx_pymod_create(PyObject *spec, CYTHON_UNUSED PyModuleDef *def) { + PyObject *module = NULL, *moddict, *modname; + if (__Pyx_check_single_interpreter()) + return NULL; + if (__pyx_m) + return __Pyx_NewRef(__pyx_m); + modname = PyObject_GetAttrString(spec, "name"); + if (unlikely(!modname)) goto bad; + module = PyModule_NewObject(modname); + Py_DECREF(modname); + if (unlikely(!module)) goto bad; + moddict = PyModule_GetDict(module); + if (unlikely(!moddict)) goto bad; + if (unlikely(__Pyx_copy_spec_to_module(spec, moddict, "loader", "__loader__", 1) < 0)) goto bad; + if (unlikely(__Pyx_copy_spec_to_module(spec, moddict, "origin", "__file__", 1) < 0)) goto bad; + if (unlikely(__Pyx_copy_spec_to_module(spec, moddict, "parent", "__package__", 1) < 0)) goto bad; + if (unlikely(__Pyx_copy_spec_to_module(spec, moddict, "submodule_search_locations", "__path__", 0) < 0)) goto bad; + return module; +bad: + Py_XDECREF(module); + return NULL; +} + + +static CYTHON_SMALL_CODE int __pyx_pymod_exec__websocket(PyObject *__pyx_pyinit_module) +#endif +#endif +{ + PyObject *__pyx_t_1 = NULL; + int __pyx_lineno = 0; + const char *__pyx_filename = NULL; + int __pyx_clineno = 0; + __Pyx_RefNannyDeclarations + #if CYTHON_PEP489_MULTI_PHASE_INIT + if (__pyx_m) { + if (__pyx_m == __pyx_pyinit_module) return 0; + PyErr_SetString(PyExc_RuntimeError, "Module '_websocket' has already been imported. Re-initialisation is not supported."); + return -1; + } + #elif PY_MAJOR_VERSION >= 3 + if (__pyx_m) return __Pyx_NewRef(__pyx_m); + #endif + #if CYTHON_REFNANNY +__Pyx_RefNanny = __Pyx_RefNannyImportAPI("refnanny"); +if (!__Pyx_RefNanny) { + PyErr_Clear(); + __Pyx_RefNanny = __Pyx_RefNannyImportAPI("Cython.Runtime.refnanny"); + if (!__Pyx_RefNanny) + Py_FatalError("failed to import 'refnanny' module"); +} +#endif + __Pyx_RefNannySetupContext("__Pyx_PyMODINIT_FUNC PyInit__websocket(void)", 0); + if (__Pyx_check_binary_version() < 0) __PYX_ERR(0, 1, __pyx_L1_error) + #ifdef __Pxy_PyFrame_Initialize_Offsets + __Pxy_PyFrame_Initialize_Offsets(); + #endif + __pyx_empty_tuple = PyTuple_New(0); if (unlikely(!__pyx_empty_tuple)) __PYX_ERR(0, 1, __pyx_L1_error) + __pyx_empty_bytes = PyBytes_FromStringAndSize("", 0); if (unlikely(!__pyx_empty_bytes)) __PYX_ERR(0, 1, __pyx_L1_error) + __pyx_empty_unicode = PyUnicode_FromStringAndSize("", 0); if (unlikely(!__pyx_empty_unicode)) __PYX_ERR(0, 1, __pyx_L1_error) + #ifdef __Pyx_CyFunction_USED + if (__pyx_CyFunction_init() < 0) __PYX_ERR(0, 1, __pyx_L1_error) + #endif + #ifdef __Pyx_FusedFunction_USED + if (__pyx_FusedFunction_init() < 0) __PYX_ERR(0, 1, __pyx_L1_error) + #endif + #ifdef __Pyx_Coroutine_USED + if (__pyx_Coroutine_init() < 0) __PYX_ERR(0, 1, __pyx_L1_error) + #endif + #ifdef __Pyx_Generator_USED + if (__pyx_Generator_init() < 0) __PYX_ERR(0, 1, __pyx_L1_error) + #endif + #ifdef __Pyx_AsyncGen_USED + if (__pyx_AsyncGen_init() < 0) __PYX_ERR(0, 1, __pyx_L1_error) + #endif + #ifdef __Pyx_StopAsyncIteration_USED + if (__pyx_StopAsyncIteration_init() < 0) __PYX_ERR(0, 1, __pyx_L1_error) + #endif + /*--- Library function declarations ---*/ + /*--- Threads initialization code ---*/ + #if defined(WITH_THREAD) && PY_VERSION_HEX < 0x030700F0 && defined(__PYX_FORCE_INIT_THREADS) && __PYX_FORCE_INIT_THREADS + PyEval_InitThreads(); + #endif + /*--- Module creation code ---*/ + #if CYTHON_PEP489_MULTI_PHASE_INIT + __pyx_m = __pyx_pyinit_module; + Py_INCREF(__pyx_m); + #else + #if PY_MAJOR_VERSION < 3 + __pyx_m = Py_InitModule4("_websocket", __pyx_methods, 0, 0, PYTHON_API_VERSION); Py_XINCREF(__pyx_m); + #else + __pyx_m = PyModule_Create(&__pyx_moduledef); + #endif + if (unlikely(!__pyx_m)) __PYX_ERR(0, 1, __pyx_L1_error) + #endif + __pyx_d = PyModule_GetDict(__pyx_m); if (unlikely(!__pyx_d)) __PYX_ERR(0, 1, __pyx_L1_error) + Py_INCREF(__pyx_d); + __pyx_b = PyImport_AddModule(__Pyx_BUILTIN_MODULE_NAME); if (unlikely(!__pyx_b)) __PYX_ERR(0, 1, __pyx_L1_error) + Py_INCREF(__pyx_b); + __pyx_cython_runtime = PyImport_AddModule((char *) "cython_runtime"); if (unlikely(!__pyx_cython_runtime)) __PYX_ERR(0, 1, __pyx_L1_error) + Py_INCREF(__pyx_cython_runtime); + if (PyObject_SetAttrString(__pyx_m, "__builtins__", __pyx_b) < 0) __PYX_ERR(0, 1, __pyx_L1_error); + /*--- Initialize various global constants etc. ---*/ + if (__Pyx_InitGlobals() < 0) __PYX_ERR(0, 1, __pyx_L1_error) + #if PY_MAJOR_VERSION < 3 && (__PYX_DEFAULT_STRING_ENCODING_IS_ASCII || __PYX_DEFAULT_STRING_ENCODING_IS_DEFAULT) + if (__Pyx_init_sys_getdefaultencoding_params() < 0) __PYX_ERR(0, 1, __pyx_L1_error) + #endif + if (__pyx_module_is_main_aiohttp___websocket) { + if (PyObject_SetAttr(__pyx_m, __pyx_n_s_name, __pyx_n_s_main) < 0) __PYX_ERR(0, 1, __pyx_L1_error) + } + #if PY_MAJOR_VERSION >= 3 + { + PyObject *modules = PyImport_GetModuleDict(); if (unlikely(!modules)) __PYX_ERR(0, 1, __pyx_L1_error) + if (!PyDict_GetItemString(modules, "aiohttp._websocket")) { + if (unlikely(PyDict_SetItemString(modules, "aiohttp._websocket", __pyx_m) < 0)) __PYX_ERR(0, 1, __pyx_L1_error) + } + } + #endif + /*--- Builtin init code ---*/ + if (__Pyx_InitCachedBuiltins() < 0) __PYX_ERR(0, 1, __pyx_L1_error) + /*--- Constants init code ---*/ + if (__Pyx_InitCachedConstants() < 0) __PYX_ERR(0, 1, __pyx_L1_error) + /*--- Global type/function init code ---*/ + (void)__Pyx_modinit_global_init_code(); + (void)__Pyx_modinit_variable_export_code(); + (void)__Pyx_modinit_function_export_code(); + (void)__Pyx_modinit_type_init_code(); + if (unlikely(__Pyx_modinit_type_import_code() < 0)) __PYX_ERR(0, 1, __pyx_L1_error) + (void)__Pyx_modinit_variable_import_code(); + (void)__Pyx_modinit_function_import_code(); + /*--- Execution code ---*/ + #if defined(__Pyx_Generator_USED) || defined(__Pyx_Coroutine_USED) + if (__Pyx_patch_abc() < 0) __PYX_ERR(0, 1, __pyx_L1_error) + #endif + + /* "aiohttp/_websocket.pyx":11 + * + * + * def _websocket_mask_cython(object mask, object data): # <<<<<<<<<<<<<< + * """Note, this function mutates its `data` argument + * """ + */ + __pyx_t_1 = PyCFunction_NewEx(&__pyx_mdef_7aiohttp_10_websocket_1_websocket_mask_cython, NULL, __pyx_n_s_aiohttp__websocket); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 11, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + if (PyDict_SetItem(__pyx_d, __pyx_n_s_websocket_mask_cython, __pyx_t_1) < 0) __PYX_ERR(0, 11, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + + /* "aiohttp/_websocket.pyx":1 + * from cpython cimport PyBytes_AsString # <<<<<<<<<<<<<< + * + * + */ + __pyx_t_1 = __Pyx_PyDict_NewPresized(0); if (unlikely(!__pyx_t_1)) __PYX_ERR(0, 1, __pyx_L1_error) + __Pyx_GOTREF(__pyx_t_1); + if (PyDict_SetItem(__pyx_d, __pyx_n_s_test, __pyx_t_1) < 0) __PYX_ERR(0, 1, __pyx_L1_error) + __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; + + /*--- Wrapped vars code ---*/ + + goto __pyx_L0; + __pyx_L1_error:; + __Pyx_XDECREF(__pyx_t_1); + if (__pyx_m) { + if (__pyx_d) { + __Pyx_AddTraceback("init aiohttp._websocket", __pyx_clineno, __pyx_lineno, __pyx_filename); + } + Py_CLEAR(__pyx_m); + } else if (!PyErr_Occurred()) { + PyErr_SetString(PyExc_ImportError, "init aiohttp._websocket"); + } + __pyx_L0:; + __Pyx_RefNannyFinishContext(); + #if CYTHON_PEP489_MULTI_PHASE_INIT + return (__pyx_m != NULL) ? 0 : -1; + #elif PY_MAJOR_VERSION >= 3 + return __pyx_m; + #else + return; + #endif +} + +/* --- Runtime support code --- */ +/* Refnanny */ +#if CYTHON_REFNANNY +static __Pyx_RefNannyAPIStruct *__Pyx_RefNannyImportAPI(const char *modname) { + PyObject *m = NULL, *p = NULL; + void *r = NULL; + m = PyImport_ImportModule(modname); + if (!m) goto end; + p = PyObject_GetAttrString(m, "RefNannyAPI"); + if (!p) goto end; + r = PyLong_AsVoidPtr(p); +end: + Py_XDECREF(p); + Py_XDECREF(m); + return (__Pyx_RefNannyAPIStruct *)r; +} +#endif + +/* PyObjectGetAttrStr */ +#if CYTHON_USE_TYPE_SLOTS +static CYTHON_INLINE PyObject* __Pyx_PyObject_GetAttrStr(PyObject* obj, PyObject* attr_name) { + PyTypeObject* tp = Py_TYPE(obj); + if (likely(tp->tp_getattro)) + return tp->tp_getattro(obj, attr_name); +#if PY_MAJOR_VERSION < 3 + if (likely(tp->tp_getattr)) + return tp->tp_getattr(obj, PyString_AS_STRING(attr_name)); +#endif + return PyObject_GetAttr(obj, attr_name); +} +#endif + +/* GetBuiltinName */ +static PyObject *__Pyx_GetBuiltinName(PyObject *name) { + PyObject* result = __Pyx_PyObject_GetAttrStr(__pyx_b, name); + if (unlikely(!result)) { + PyErr_Format(PyExc_NameError, +#if PY_MAJOR_VERSION >= 3 + "name '%U' is not defined", name); +#else + "name '%.200s' is not defined", PyString_AS_STRING(name)); +#endif + } + return result; +} + +/* RaiseArgTupleInvalid */ +static void __Pyx_RaiseArgtupleInvalid( + const char* func_name, + int exact, + Py_ssize_t num_min, + Py_ssize_t num_max, + Py_ssize_t num_found) +{ + Py_ssize_t num_expected; + const char *more_or_less; + if (num_found < num_min) { + num_expected = num_min; + more_or_less = "at least"; + } else { + num_expected = num_max; + more_or_less = "at most"; + } + if (exact) { + more_or_less = "exactly"; + } + PyErr_Format(PyExc_TypeError, + "%.200s() takes %.8s %" CYTHON_FORMAT_SSIZE_T "d positional argument%.1s (%" CYTHON_FORMAT_SSIZE_T "d given)", + func_name, more_or_less, num_expected, + (num_expected == 1) ? "" : "s", num_found); +} + +/* RaiseDoubleKeywords */ +static void __Pyx_RaiseDoubleKeywordsError( + const char* func_name, + PyObject* kw_name) +{ + PyErr_Format(PyExc_TypeError, + #if PY_MAJOR_VERSION >= 3 + "%s() got multiple values for keyword argument '%U'", func_name, kw_name); + #else + "%s() got multiple values for keyword argument '%s'", func_name, + PyString_AsString(kw_name)); + #endif +} + +/* ParseKeywords */ +static int __Pyx_ParseOptionalKeywords( + PyObject *kwds, + PyObject **argnames[], + PyObject *kwds2, + PyObject *values[], + Py_ssize_t num_pos_args, + const char* function_name) +{ + PyObject *key = 0, *value = 0; + Py_ssize_t pos = 0; + PyObject*** name; + PyObject*** first_kw_arg = argnames + num_pos_args; + while (PyDict_Next(kwds, &pos, &key, &value)) { + name = first_kw_arg; + while (*name && (**name != key)) name++; + if (*name) { + values[name-argnames] = value; + continue; + } + name = first_kw_arg; + #if PY_MAJOR_VERSION < 3 + if (likely(PyString_Check(key))) { + while (*name) { + if ((CYTHON_COMPILING_IN_PYPY || PyString_GET_SIZE(**name) == PyString_GET_SIZE(key)) + && _PyString_Eq(**name, key)) { + values[name-argnames] = value; + break; + } + name++; + } + if (*name) continue; + else { + PyObject*** argname = argnames; + while (argname != first_kw_arg) { + if ((**argname == key) || ( + (CYTHON_COMPILING_IN_PYPY || PyString_GET_SIZE(**argname) == PyString_GET_SIZE(key)) + && _PyString_Eq(**argname, key))) { + goto arg_passed_twice; + } + argname++; + } + } + } else + #endif + if (likely(PyUnicode_Check(key))) { + while (*name) { + int cmp = (**name == key) ? 0 : + #if !CYTHON_COMPILING_IN_PYPY && PY_MAJOR_VERSION >= 3 + (__Pyx_PyUnicode_GET_LENGTH(**name) != __Pyx_PyUnicode_GET_LENGTH(key)) ? 1 : + #endif + PyUnicode_Compare(**name, key); + if (cmp < 0 && unlikely(PyErr_Occurred())) goto bad; + if (cmp == 0) { + values[name-argnames] = value; + break; + } + name++; + } + if (*name) continue; + else { + PyObject*** argname = argnames; + while (argname != first_kw_arg) { + int cmp = (**argname == key) ? 0 : + #if !CYTHON_COMPILING_IN_PYPY && PY_MAJOR_VERSION >= 3 + (__Pyx_PyUnicode_GET_LENGTH(**argname) != __Pyx_PyUnicode_GET_LENGTH(key)) ? 1 : + #endif + PyUnicode_Compare(**argname, key); + if (cmp < 0 && unlikely(PyErr_Occurred())) goto bad; + if (cmp == 0) goto arg_passed_twice; + argname++; + } + } + } else + goto invalid_keyword_type; + if (kwds2) { + if (unlikely(PyDict_SetItem(kwds2, key, value))) goto bad; + } else { + goto invalid_keyword; + } + } + return 0; +arg_passed_twice: + __Pyx_RaiseDoubleKeywordsError(function_name, key); + goto bad; +invalid_keyword_type: + PyErr_Format(PyExc_TypeError, + "%.200s() keywords must be strings", function_name); + goto bad; +invalid_keyword: + PyErr_Format(PyExc_TypeError, + #if PY_MAJOR_VERSION < 3 + "%.200s() got an unexpected keyword argument '%.200s'", + function_name, PyString_AsString(key)); + #else + "%s() got an unexpected keyword argument '%U'", + function_name, key); + #endif +bad: + return -1; +} + +/* PyCFunctionFastCall */ +#if CYTHON_FAST_PYCCALL +static CYTHON_INLINE PyObject * __Pyx_PyCFunction_FastCall(PyObject *func_obj, PyObject **args, Py_ssize_t nargs) { + PyCFunctionObject *func = (PyCFunctionObject*)func_obj; + PyCFunction meth = PyCFunction_GET_FUNCTION(func); + PyObject *self = PyCFunction_GET_SELF(func); + int flags = PyCFunction_GET_FLAGS(func); + assert(PyCFunction_Check(func)); + assert(METH_FASTCALL == (flags & ~(METH_CLASS | METH_STATIC | METH_COEXIST | METH_KEYWORDS | METH_STACKLESS))); + assert(nargs >= 0); + assert(nargs == 0 || args != NULL); + /* _PyCFunction_FastCallDict() must not be called with an exception set, + because it may clear it (directly or indirectly) and so the + caller loses its exception */ + assert(!PyErr_Occurred()); + if ((PY_VERSION_HEX < 0x030700A0) || unlikely(flags & METH_KEYWORDS)) { + return (*((__Pyx_PyCFunctionFastWithKeywords)(void*)meth)) (self, args, nargs, NULL); + } else { + return (*((__Pyx_PyCFunctionFast)(void*)meth)) (self, args, nargs); + } +} +#endif + +/* PyFunctionFastCall */ +#if CYTHON_FAST_PYCALL +static PyObject* __Pyx_PyFunction_FastCallNoKw(PyCodeObject *co, PyObject **args, Py_ssize_t na, + PyObject *globals) { + PyFrameObject *f; + PyThreadState *tstate = __Pyx_PyThreadState_Current; + PyObject **fastlocals; + Py_ssize_t i; + PyObject *result; + assert(globals != NULL); + /* XXX Perhaps we should create a specialized + PyFrame_New() that doesn't take locals, but does + take builtins without sanity checking them. + */ + assert(tstate != NULL); + f = PyFrame_New(tstate, co, globals, NULL); + if (f == NULL) { + return NULL; + } + fastlocals = __Pyx_PyFrame_GetLocalsplus(f); + for (i = 0; i < na; i++) { + Py_INCREF(*args); + fastlocals[i] = *args++; + } + result = PyEval_EvalFrameEx(f,0); + ++tstate->recursion_depth; + Py_DECREF(f); + --tstate->recursion_depth; + return result; +} +#if 1 || PY_VERSION_HEX < 0x030600B1 +static PyObject *__Pyx_PyFunction_FastCallDict(PyObject *func, PyObject **args, Py_ssize_t nargs, PyObject *kwargs) { + PyCodeObject *co = (PyCodeObject *)PyFunction_GET_CODE(func); + PyObject *globals = PyFunction_GET_GLOBALS(func); + PyObject *argdefs = PyFunction_GET_DEFAULTS(func); + PyObject *closure; +#if PY_MAJOR_VERSION >= 3 + PyObject *kwdefs; +#endif + PyObject *kwtuple, **k; + PyObject **d; + Py_ssize_t nd; + Py_ssize_t nk; + PyObject *result; + assert(kwargs == NULL || PyDict_Check(kwargs)); + nk = kwargs ? PyDict_Size(kwargs) : 0; + if (Py_EnterRecursiveCall((char*)" while calling a Python object")) { + return NULL; + } + if ( +#if PY_MAJOR_VERSION >= 3 + co->co_kwonlyargcount == 0 && +#endif + likely(kwargs == NULL || nk == 0) && + co->co_flags == (CO_OPTIMIZED | CO_NEWLOCALS | CO_NOFREE)) { + if (argdefs == NULL && co->co_argcount == nargs) { + result = __Pyx_PyFunction_FastCallNoKw(co, args, nargs, globals); + goto done; + } + else if (nargs == 0 && argdefs != NULL + && co->co_argcount == Py_SIZE(argdefs)) { + /* function called with no arguments, but all parameters have + a default value: use default values as arguments .*/ + args = &PyTuple_GET_ITEM(argdefs, 0); + result =__Pyx_PyFunction_FastCallNoKw(co, args, Py_SIZE(argdefs), globals); + goto done; + } + } + if (kwargs != NULL) { + Py_ssize_t pos, i; + kwtuple = PyTuple_New(2 * nk); + if (kwtuple == NULL) { + result = NULL; + goto done; + } + k = &PyTuple_GET_ITEM(kwtuple, 0); + pos = i = 0; + while (PyDict_Next(kwargs, &pos, &k[i], &k[i+1])) { + Py_INCREF(k[i]); + Py_INCREF(k[i+1]); + i += 2; + } + nk = i / 2; + } + else { + kwtuple = NULL; + k = NULL; + } + closure = PyFunction_GET_CLOSURE(func); +#if PY_MAJOR_VERSION >= 3 + kwdefs = PyFunction_GET_KW_DEFAULTS(func); +#endif + if (argdefs != NULL) { + d = &PyTuple_GET_ITEM(argdefs, 0); + nd = Py_SIZE(argdefs); + } + else { + d = NULL; + nd = 0; + } +#if PY_MAJOR_VERSION >= 3 + result = PyEval_EvalCodeEx((PyObject*)co, globals, (PyObject *)NULL, + args, (int)nargs, + k, (int)nk, + d, (int)nd, kwdefs, closure); +#else + result = PyEval_EvalCodeEx(co, globals, (PyObject *)NULL, + args, (int)nargs, + k, (int)nk, + d, (int)nd, closure); +#endif + Py_XDECREF(kwtuple); +done: + Py_LeaveRecursiveCall(); + return result; +} +#endif +#endif + +/* PyObjectCall */ +#if CYTHON_COMPILING_IN_CPYTHON +static CYTHON_INLINE PyObject* __Pyx_PyObject_Call(PyObject *func, PyObject *arg, PyObject *kw) { + PyObject *result; + ternaryfunc call = Py_TYPE(func)->tp_call; + if (unlikely(!call)) + return PyObject_Call(func, arg, kw); + if (unlikely(Py_EnterRecursiveCall((char*)" while calling a Python object"))) + return NULL; + result = (*call)(func, arg, kw); + Py_LeaveRecursiveCall(); + if (unlikely(!result) && unlikely(!PyErr_Occurred())) { + PyErr_SetString( + PyExc_SystemError, + "NULL result without error in PyObject_Call"); + } + return result; +} +#endif + +/* PyObjectCallMethO */ +#if CYTHON_COMPILING_IN_CPYTHON +static CYTHON_INLINE PyObject* __Pyx_PyObject_CallMethO(PyObject *func, PyObject *arg) { + PyObject *self, *result; + PyCFunction cfunc; + cfunc = PyCFunction_GET_FUNCTION(func); + self = PyCFunction_GET_SELF(func); + if (unlikely(Py_EnterRecursiveCall((char*)" while calling a Python object"))) + return NULL; + result = cfunc(self, arg); + Py_LeaveRecursiveCall(); + if (unlikely(!result) && unlikely(!PyErr_Occurred())) { + PyErr_SetString( + PyExc_SystemError, + "NULL result without error in PyObject_Call"); + } + return result; +} +#endif + +/* PyObjectCallOneArg */ +#if CYTHON_COMPILING_IN_CPYTHON +static PyObject* __Pyx__PyObject_CallOneArg(PyObject *func, PyObject *arg) { + PyObject *result; + PyObject *args = PyTuple_New(1); + if (unlikely(!args)) return NULL; + Py_INCREF(arg); + PyTuple_SET_ITEM(args, 0, arg); + result = __Pyx_PyObject_Call(func, args, NULL); + Py_DECREF(args); + return result; +} +static CYTHON_INLINE PyObject* __Pyx_PyObject_CallOneArg(PyObject *func, PyObject *arg) { +#if CYTHON_FAST_PYCALL + if (PyFunction_Check(func)) { + return __Pyx_PyFunction_FastCall(func, &arg, 1); + } +#endif + if (likely(PyCFunction_Check(func))) { + if (likely(PyCFunction_GET_FLAGS(func) & METH_O)) { + return __Pyx_PyObject_CallMethO(func, arg); +#if CYTHON_FAST_PYCCALL + } else if (__Pyx_PyFastCFunction_Check(func)) { + return __Pyx_PyCFunction_FastCall(func, &arg, 1); +#endif + } + } + return __Pyx__PyObject_CallOneArg(func, arg); +} +#else +static CYTHON_INLINE PyObject* __Pyx_PyObject_CallOneArg(PyObject *func, PyObject *arg) { + PyObject *result; + PyObject *args = PyTuple_Pack(1, arg); + if (unlikely(!args)) return NULL; + result = __Pyx_PyObject_Call(func, args, NULL); + Py_DECREF(args); + return result; +} +#endif + +/* TypeImport */ +#ifndef __PYX_HAVE_RT_ImportType +#define __PYX_HAVE_RT_ImportType +static PyTypeObject *__Pyx_ImportType(PyObject *module, const char *module_name, const char *class_name, + size_t size, enum __Pyx_ImportType_CheckSize check_size) +{ + PyObject *result = 0; + char warning[200]; + Py_ssize_t basicsize; +#ifdef Py_LIMITED_API + PyObject *py_basicsize; +#endif + result = PyObject_GetAttrString(module, class_name); + if (!result) + goto bad; + if (!PyType_Check(result)) { + PyErr_Format(PyExc_TypeError, + "%.200s.%.200s is not a type object", + module_name, class_name); + goto bad; + } +#ifndef Py_LIMITED_API + basicsize = ((PyTypeObject *)result)->tp_basicsize; +#else + py_basicsize = PyObject_GetAttrString(result, "__basicsize__"); + if (!py_basicsize) + goto bad; + basicsize = PyLong_AsSsize_t(py_basicsize); + Py_DECREF(py_basicsize); + py_basicsize = 0; + if (basicsize == (Py_ssize_t)-1 && PyErr_Occurred()) + goto bad; +#endif + if ((size_t)basicsize < size) { + PyErr_Format(PyExc_ValueError, + "%.200s.%.200s size changed, may indicate binary incompatibility. " + "Expected %zd from C header, got %zd from PyObject", + module_name, class_name, size, basicsize); + goto bad; + } + if (check_size == __Pyx_ImportType_CheckSize_Error && (size_t)basicsize != size) { + PyErr_Format(PyExc_ValueError, + "%.200s.%.200s size changed, may indicate binary incompatibility. " + "Expected %zd from C header, got %zd from PyObject", + module_name, class_name, size, basicsize); + goto bad; + } + else if (check_size == __Pyx_ImportType_CheckSize_Warn && (size_t)basicsize > size) { + PyOS_snprintf(warning, sizeof(warning), + "%s.%s size changed, may indicate binary incompatibility. " + "Expected %zd from C header, got %zd from PyObject", + module_name, class_name, size, basicsize); + if (PyErr_WarnEx(NULL, warning, 0) < 0) goto bad; + } + return (PyTypeObject *)result; +bad: + Py_XDECREF(result); + return NULL; +} +#endif + +/* PyDictVersioning */ +#if CYTHON_USE_DICT_VERSIONS && CYTHON_USE_TYPE_SLOTS +static CYTHON_INLINE PY_UINT64_T __Pyx_get_tp_dict_version(PyObject *obj) { + PyObject *dict = Py_TYPE(obj)->tp_dict; + return likely(dict) ? __PYX_GET_DICT_VERSION(dict) : 0; +} +static CYTHON_INLINE PY_UINT64_T __Pyx_get_object_dict_version(PyObject *obj) { + PyObject **dictptr = NULL; + Py_ssize_t offset = Py_TYPE(obj)->tp_dictoffset; + if (offset) { +#if CYTHON_COMPILING_IN_CPYTHON + dictptr = (likely(offset > 0)) ? (PyObject **) ((char *)obj + offset) : _PyObject_GetDictPtr(obj); +#else + dictptr = _PyObject_GetDictPtr(obj); +#endif + } + return (dictptr && *dictptr) ? __PYX_GET_DICT_VERSION(*dictptr) : 0; +} +static CYTHON_INLINE int __Pyx_object_dict_version_matches(PyObject* obj, PY_UINT64_T tp_dict_version, PY_UINT64_T obj_dict_version) { + PyObject *dict = Py_TYPE(obj)->tp_dict; + if (unlikely(!dict) || unlikely(tp_dict_version != __PYX_GET_DICT_VERSION(dict))) + return 0; + return obj_dict_version == __Pyx_get_object_dict_version(obj); +} +#endif + +/* PyErrFetchRestore */ +#if CYTHON_FAST_THREAD_STATE +static CYTHON_INLINE void __Pyx_ErrRestoreInState(PyThreadState *tstate, PyObject *type, PyObject *value, PyObject *tb) { + PyObject *tmp_type, *tmp_value, *tmp_tb; + tmp_type = tstate->curexc_type; + tmp_value = tstate->curexc_value; + tmp_tb = tstate->curexc_traceback; + tstate->curexc_type = type; + tstate->curexc_value = value; + tstate->curexc_traceback = tb; + Py_XDECREF(tmp_type); + Py_XDECREF(tmp_value); + Py_XDECREF(tmp_tb); +} +static CYTHON_INLINE void __Pyx_ErrFetchInState(PyThreadState *tstate, PyObject **type, PyObject **value, PyObject **tb) { + *type = tstate->curexc_type; + *value = tstate->curexc_value; + *tb = tstate->curexc_traceback; + tstate->curexc_type = 0; + tstate->curexc_value = 0; + tstate->curexc_traceback = 0; +} +#endif + +/* CLineInTraceback */ +#ifndef CYTHON_CLINE_IN_TRACEBACK +static int __Pyx_CLineForTraceback(CYTHON_NCP_UNUSED PyThreadState *tstate, int c_line) { + PyObject *use_cline; + PyObject *ptype, *pvalue, *ptraceback; +#if CYTHON_COMPILING_IN_CPYTHON + PyObject **cython_runtime_dict; +#endif + if (unlikely(!__pyx_cython_runtime)) { + return c_line; + } + __Pyx_ErrFetchInState(tstate, &ptype, &pvalue, &ptraceback); +#if CYTHON_COMPILING_IN_CPYTHON + cython_runtime_dict = _PyObject_GetDictPtr(__pyx_cython_runtime); + if (likely(cython_runtime_dict)) { + __PYX_PY_DICT_LOOKUP_IF_MODIFIED( + use_cline, *cython_runtime_dict, + __Pyx_PyDict_GetItemStr(*cython_runtime_dict, __pyx_n_s_cline_in_traceback)) + } else +#endif + { + PyObject *use_cline_obj = __Pyx_PyObject_GetAttrStr(__pyx_cython_runtime, __pyx_n_s_cline_in_traceback); + if (use_cline_obj) { + use_cline = PyObject_Not(use_cline_obj) ? Py_False : Py_True; + Py_DECREF(use_cline_obj); + } else { + PyErr_Clear(); + use_cline = NULL; + } + } + if (!use_cline) { + c_line = 0; + PyObject_SetAttr(__pyx_cython_runtime, __pyx_n_s_cline_in_traceback, Py_False); + } + else if (use_cline == Py_False || (use_cline != Py_True && PyObject_Not(use_cline) != 0)) { + c_line = 0; + } + __Pyx_ErrRestoreInState(tstate, ptype, pvalue, ptraceback); + return c_line; +} +#endif + +/* CodeObjectCache */ +static int __pyx_bisect_code_objects(__Pyx_CodeObjectCacheEntry* entries, int count, int code_line) { + int start = 0, mid = 0, end = count - 1; + if (end >= 0 && code_line > entries[end].code_line) { + return count; + } + while (start < end) { + mid = start + (end - start) / 2; + if (code_line < entries[mid].code_line) { + end = mid; + } else if (code_line > entries[mid].code_line) { + start = mid + 1; + } else { + return mid; + } + } + if (code_line <= entries[mid].code_line) { + return mid; + } else { + return mid + 1; + } +} +static PyCodeObject *__pyx_find_code_object(int code_line) { + PyCodeObject* code_object; + int pos; + if (unlikely(!code_line) || unlikely(!__pyx_code_cache.entries)) { + return NULL; + } + pos = __pyx_bisect_code_objects(__pyx_code_cache.entries, __pyx_code_cache.count, code_line); + if (unlikely(pos >= __pyx_code_cache.count) || unlikely(__pyx_code_cache.entries[pos].code_line != code_line)) { + return NULL; + } + code_object = __pyx_code_cache.entries[pos].code_object; + Py_INCREF(code_object); + return code_object; +} +static void __pyx_insert_code_object(int code_line, PyCodeObject* code_object) { + int pos, i; + __Pyx_CodeObjectCacheEntry* entries = __pyx_code_cache.entries; + if (unlikely(!code_line)) { + return; + } + if (unlikely(!entries)) { + entries = (__Pyx_CodeObjectCacheEntry*)PyMem_Malloc(64*sizeof(__Pyx_CodeObjectCacheEntry)); + if (likely(entries)) { + __pyx_code_cache.entries = entries; + __pyx_code_cache.max_count = 64; + __pyx_code_cache.count = 1; + entries[0].code_line = code_line; + entries[0].code_object = code_object; + Py_INCREF(code_object); + } + return; + } + pos = __pyx_bisect_code_objects(__pyx_code_cache.entries, __pyx_code_cache.count, code_line); + if ((pos < __pyx_code_cache.count) && unlikely(__pyx_code_cache.entries[pos].code_line == code_line)) { + PyCodeObject* tmp = entries[pos].code_object; + entries[pos].code_object = code_object; + Py_DECREF(tmp); + return; + } + if (__pyx_code_cache.count == __pyx_code_cache.max_count) { + int new_max = __pyx_code_cache.max_count + 64; + entries = (__Pyx_CodeObjectCacheEntry*)PyMem_Realloc( + __pyx_code_cache.entries, ((size_t)new_max) * sizeof(__Pyx_CodeObjectCacheEntry)); + if (unlikely(!entries)) { + return; + } + __pyx_code_cache.entries = entries; + __pyx_code_cache.max_count = new_max; + } + for (i=__pyx_code_cache.count; i>pos; i--) { + entries[i] = entries[i-1]; + } + entries[pos].code_line = code_line; + entries[pos].code_object = code_object; + __pyx_code_cache.count++; + Py_INCREF(code_object); +} + +/* AddTraceback */ +#include "compile.h" +#include "frameobject.h" +#include "traceback.h" +static PyCodeObject* __Pyx_CreateCodeObjectForTraceback( + const char *funcname, int c_line, + int py_line, const char *filename) { + PyCodeObject *py_code = 0; + PyObject *py_srcfile = 0; + PyObject *py_funcname = 0; + #if PY_MAJOR_VERSION < 3 + py_srcfile = PyString_FromString(filename); + #else + py_srcfile = PyUnicode_FromString(filename); + #endif + if (!py_srcfile) goto bad; + if (c_line) { + #if PY_MAJOR_VERSION < 3 + py_funcname = PyString_FromFormat( "%s (%s:%d)", funcname, __pyx_cfilenm, c_line); + #else + py_funcname = PyUnicode_FromFormat( "%s (%s:%d)", funcname, __pyx_cfilenm, c_line); + #endif + } + else { + #if PY_MAJOR_VERSION < 3 + py_funcname = PyString_FromString(funcname); + #else + py_funcname = PyUnicode_FromString(funcname); + #endif + } + if (!py_funcname) goto bad; + py_code = __Pyx_PyCode_New( + 0, + 0, + 0, + 0, + 0, + __pyx_empty_bytes, /*PyObject *code,*/ + __pyx_empty_tuple, /*PyObject *consts,*/ + __pyx_empty_tuple, /*PyObject *names,*/ + __pyx_empty_tuple, /*PyObject *varnames,*/ + __pyx_empty_tuple, /*PyObject *freevars,*/ + __pyx_empty_tuple, /*PyObject *cellvars,*/ + py_srcfile, /*PyObject *filename,*/ + py_funcname, /*PyObject *name,*/ + py_line, + __pyx_empty_bytes /*PyObject *lnotab*/ + ); + Py_DECREF(py_srcfile); + Py_DECREF(py_funcname); + return py_code; +bad: + Py_XDECREF(py_srcfile); + Py_XDECREF(py_funcname); + return NULL; +} +static void __Pyx_AddTraceback(const char *funcname, int c_line, + int py_line, const char *filename) { + PyCodeObject *py_code = 0; + PyFrameObject *py_frame = 0; + PyThreadState *tstate = __Pyx_PyThreadState_Current; + if (c_line) { + c_line = __Pyx_CLineForTraceback(tstate, c_line); + } + py_code = __pyx_find_code_object(c_line ? -c_line : py_line); + if (!py_code) { + py_code = __Pyx_CreateCodeObjectForTraceback( + funcname, c_line, py_line, filename); + if (!py_code) goto bad; + __pyx_insert_code_object(c_line ? -c_line : py_line, py_code); + } + py_frame = PyFrame_New( + tstate, /*PyThreadState *tstate,*/ + py_code, /*PyCodeObject *code,*/ + __pyx_d, /*PyObject *globals,*/ + 0 /*PyObject *locals*/ + ); + if (!py_frame) goto bad; + __Pyx_PyFrame_SetLineNumber(py_frame, py_line); + PyTraceBack_Here(py_frame); +bad: + Py_XDECREF(py_code); + Py_XDECREF(py_frame); +} + +/* CIntToPy */ +static CYTHON_INLINE PyObject* __Pyx_PyInt_From_long(long value) { +#ifdef __Pyx_HAS_GCC_DIAGNOSTIC +#pragma GCC diagnostic push +#pragma GCC diagnostic ignored "-Wconversion" +#endif + const long neg_one = (long) -1, const_zero = (long) 0; +#ifdef __Pyx_HAS_GCC_DIAGNOSTIC +#pragma GCC diagnostic pop +#endif + const int is_unsigned = neg_one > const_zero; + if (is_unsigned) { + if (sizeof(long) < sizeof(long)) { + return PyInt_FromLong((long) value); + } else if (sizeof(long) <= sizeof(unsigned long)) { + return PyLong_FromUnsignedLong((unsigned long) value); +#ifdef HAVE_LONG_LONG + } else if (sizeof(long) <= sizeof(unsigned PY_LONG_LONG)) { + return PyLong_FromUnsignedLongLong((unsigned PY_LONG_LONG) value); +#endif + } + } else { + if (sizeof(long) <= sizeof(long)) { + return PyInt_FromLong((long) value); +#ifdef HAVE_LONG_LONG + } else if (sizeof(long) <= sizeof(PY_LONG_LONG)) { + return PyLong_FromLongLong((PY_LONG_LONG) value); +#endif + } + } + { + int one = 1; int little = (int)*(unsigned char *)&one; + unsigned char *bytes = (unsigned char *)&value; + return _PyLong_FromByteArray(bytes, sizeof(long), + little, !is_unsigned); + } +} + +/* CIntFromPyVerify */ +#define __PYX_VERIFY_RETURN_INT(target_type, func_type, func_value)\ + __PYX__VERIFY_RETURN_INT(target_type, func_type, func_value, 0) +#define __PYX_VERIFY_RETURN_INT_EXC(target_type, func_type, func_value)\ + __PYX__VERIFY_RETURN_INT(target_type, func_type, func_value, 1) +#define __PYX__VERIFY_RETURN_INT(target_type, func_type, func_value, exc)\ + {\ + func_type value = func_value;\ + if (sizeof(target_type) < sizeof(func_type)) {\ + if (unlikely(value != (func_type) (target_type) value)) {\ + func_type zero = 0;\ + if (exc && unlikely(value == (func_type)-1 && PyErr_Occurred()))\ + return (target_type) -1;\ + if (is_unsigned && unlikely(value < zero))\ + goto raise_neg_overflow;\ + else\ + goto raise_overflow;\ + }\ + }\ + return (target_type) value;\ + } + +/* CIntFromPy */ +static CYTHON_INLINE long __Pyx_PyInt_As_long(PyObject *x) { +#ifdef __Pyx_HAS_GCC_DIAGNOSTIC +#pragma GCC diagnostic push +#pragma GCC diagnostic ignored "-Wconversion" +#endif + const long neg_one = (long) -1, const_zero = (long) 0; +#ifdef __Pyx_HAS_GCC_DIAGNOSTIC +#pragma GCC diagnostic pop +#endif + const int is_unsigned = neg_one > const_zero; +#if PY_MAJOR_VERSION < 3 + if (likely(PyInt_Check(x))) { + if (sizeof(long) < sizeof(long)) { + __PYX_VERIFY_RETURN_INT(long, long, PyInt_AS_LONG(x)) + } else { + long val = PyInt_AS_LONG(x); + if (is_unsigned && unlikely(val < 0)) { + goto raise_neg_overflow; + } + return (long) val; + } + } else +#endif + if (likely(PyLong_Check(x))) { + if (is_unsigned) { +#if CYTHON_USE_PYLONG_INTERNALS + const digit* digits = ((PyLongObject*)x)->ob_digit; + switch (Py_SIZE(x)) { + case 0: return (long) 0; + case 1: __PYX_VERIFY_RETURN_INT(long, digit, digits[0]) + case 2: + if (8 * sizeof(long) > 1 * PyLong_SHIFT) { + if (8 * sizeof(unsigned long) > 2 * PyLong_SHIFT) { + __PYX_VERIFY_RETURN_INT(long, unsigned long, (((((unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) + } else if (8 * sizeof(long) >= 2 * PyLong_SHIFT) { + return (long) (((((long)digits[1]) << PyLong_SHIFT) | (long)digits[0])); + } + } + break; + case 3: + if (8 * sizeof(long) > 2 * PyLong_SHIFT) { + if (8 * sizeof(unsigned long) > 3 * PyLong_SHIFT) { + __PYX_VERIFY_RETURN_INT(long, unsigned long, (((((((unsigned long)digits[2]) << PyLong_SHIFT) | (unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) + } else if (8 * sizeof(long) >= 3 * PyLong_SHIFT) { + return (long) (((((((long)digits[2]) << PyLong_SHIFT) | (long)digits[1]) << PyLong_SHIFT) | (long)digits[0])); + } + } + break; + case 4: + if (8 * sizeof(long) > 3 * PyLong_SHIFT) { + if (8 * sizeof(unsigned long) > 4 * PyLong_SHIFT) { + __PYX_VERIFY_RETURN_INT(long, unsigned long, (((((((((unsigned long)digits[3]) << PyLong_SHIFT) | (unsigned long)digits[2]) << PyLong_SHIFT) | (unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) + } else if (8 * sizeof(long) >= 4 * PyLong_SHIFT) { + return (long) (((((((((long)digits[3]) << PyLong_SHIFT) | (long)digits[2]) << PyLong_SHIFT) | (long)digits[1]) << PyLong_SHIFT) | (long)digits[0])); + } + } + break; + } +#endif +#if CYTHON_COMPILING_IN_CPYTHON + if (unlikely(Py_SIZE(x) < 0)) { + goto raise_neg_overflow; + } +#else + { + int result = PyObject_RichCompareBool(x, Py_False, Py_LT); + if (unlikely(result < 0)) + return (long) -1; + if (unlikely(result == 1)) + goto raise_neg_overflow; + } +#endif + if (sizeof(long) <= sizeof(unsigned long)) { + __PYX_VERIFY_RETURN_INT_EXC(long, unsigned long, PyLong_AsUnsignedLong(x)) +#ifdef HAVE_LONG_LONG + } else if (sizeof(long) <= sizeof(unsigned PY_LONG_LONG)) { + __PYX_VERIFY_RETURN_INT_EXC(long, unsigned PY_LONG_LONG, PyLong_AsUnsignedLongLong(x)) +#endif + } + } else { +#if CYTHON_USE_PYLONG_INTERNALS + const digit* digits = ((PyLongObject*)x)->ob_digit; + switch (Py_SIZE(x)) { + case 0: return (long) 0; + case -1: __PYX_VERIFY_RETURN_INT(long, sdigit, (sdigit) (-(sdigit)digits[0])) + case 1: __PYX_VERIFY_RETURN_INT(long, digit, +digits[0]) + case -2: + if (8 * sizeof(long) - 1 > 1 * PyLong_SHIFT) { + if (8 * sizeof(unsigned long) > 2 * PyLong_SHIFT) { + __PYX_VERIFY_RETURN_INT(long, long, -(long) (((((unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) + } else if (8 * sizeof(long) - 1 > 2 * PyLong_SHIFT) { + return (long) (((long)-1)*(((((long)digits[1]) << PyLong_SHIFT) | (long)digits[0]))); + } + } + break; + case 2: + if (8 * sizeof(long) > 1 * PyLong_SHIFT) { + if (8 * sizeof(unsigned long) > 2 * PyLong_SHIFT) { + __PYX_VERIFY_RETURN_INT(long, unsigned long, (((((unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) + } else if (8 * sizeof(long) - 1 > 2 * PyLong_SHIFT) { + return (long) ((((((long)digits[1]) << PyLong_SHIFT) | (long)digits[0]))); + } + } + break; + case -3: + if (8 * sizeof(long) - 1 > 2 * PyLong_SHIFT) { + if (8 * sizeof(unsigned long) > 3 * PyLong_SHIFT) { + __PYX_VERIFY_RETURN_INT(long, long, -(long) (((((((unsigned long)digits[2]) << PyLong_SHIFT) | (unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) + } else if (8 * sizeof(long) - 1 > 3 * PyLong_SHIFT) { + return (long) (((long)-1)*(((((((long)digits[2]) << PyLong_SHIFT) | (long)digits[1]) << PyLong_SHIFT) | (long)digits[0]))); + } + } + break; + case 3: + if (8 * sizeof(long) > 2 * PyLong_SHIFT) { + if (8 * sizeof(unsigned long) > 3 * PyLong_SHIFT) { + __PYX_VERIFY_RETURN_INT(long, unsigned long, (((((((unsigned long)digits[2]) << PyLong_SHIFT) | (unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) + } else if (8 * sizeof(long) - 1 > 3 * PyLong_SHIFT) { + return (long) ((((((((long)digits[2]) << PyLong_SHIFT) | (long)digits[1]) << PyLong_SHIFT) | (long)digits[0]))); + } + } + break; + case -4: + if (8 * sizeof(long) - 1 > 3 * PyLong_SHIFT) { + if (8 * sizeof(unsigned long) > 4 * PyLong_SHIFT) { + __PYX_VERIFY_RETURN_INT(long, long, -(long) (((((((((unsigned long)digits[3]) << PyLong_SHIFT) | (unsigned long)digits[2]) << PyLong_SHIFT) | (unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) + } else if (8 * sizeof(long) - 1 > 4 * PyLong_SHIFT) { + return (long) (((long)-1)*(((((((((long)digits[3]) << PyLong_SHIFT) | (long)digits[2]) << PyLong_SHIFT) | (long)digits[1]) << PyLong_SHIFT) | (long)digits[0]))); + } + } + break; + case 4: + if (8 * sizeof(long) > 3 * PyLong_SHIFT) { + if (8 * sizeof(unsigned long) > 4 * PyLong_SHIFT) { + __PYX_VERIFY_RETURN_INT(long, unsigned long, (((((((((unsigned long)digits[3]) << PyLong_SHIFT) | (unsigned long)digits[2]) << PyLong_SHIFT) | (unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) + } else if (8 * sizeof(long) - 1 > 4 * PyLong_SHIFT) { + return (long) ((((((((((long)digits[3]) << PyLong_SHIFT) | (long)digits[2]) << PyLong_SHIFT) | (long)digits[1]) << PyLong_SHIFT) | (long)digits[0]))); + } + } + break; + } +#endif + if (sizeof(long) <= sizeof(long)) { + __PYX_VERIFY_RETURN_INT_EXC(long, long, PyLong_AsLong(x)) +#ifdef HAVE_LONG_LONG + } else if (sizeof(long) <= sizeof(PY_LONG_LONG)) { + __PYX_VERIFY_RETURN_INT_EXC(long, PY_LONG_LONG, PyLong_AsLongLong(x)) +#endif + } + } + { +#if CYTHON_COMPILING_IN_PYPY && !defined(_PyLong_AsByteArray) + PyErr_SetString(PyExc_RuntimeError, + "_PyLong_AsByteArray() not available in PyPy, cannot convert large numbers"); +#else + long val; + PyObject *v = __Pyx_PyNumber_IntOrLong(x); + #if PY_MAJOR_VERSION < 3 + if (likely(v) && !PyLong_Check(v)) { + PyObject *tmp = v; + v = PyNumber_Long(tmp); + Py_DECREF(tmp); + } + #endif + if (likely(v)) { + int one = 1; int is_little = (int)*(unsigned char *)&one; + unsigned char *bytes = (unsigned char *)&val; + int ret = _PyLong_AsByteArray((PyLongObject *)v, + bytes, sizeof(val), + is_little, !is_unsigned); + Py_DECREF(v); + if (likely(!ret)) + return val; + } +#endif + return (long) -1; + } + } else { + long val; + PyObject *tmp = __Pyx_PyNumber_IntOrLong(x); + if (!tmp) return (long) -1; + val = __Pyx_PyInt_As_long(tmp); + Py_DECREF(tmp); + return val; + } +raise_overflow: + PyErr_SetString(PyExc_OverflowError, + "value too large to convert to long"); + return (long) -1; +raise_neg_overflow: + PyErr_SetString(PyExc_OverflowError, + "can't convert negative value to long"); + return (long) -1; +} + +/* CIntFromPy */ +static CYTHON_INLINE int __Pyx_PyInt_As_int(PyObject *x) { +#ifdef __Pyx_HAS_GCC_DIAGNOSTIC +#pragma GCC diagnostic push +#pragma GCC diagnostic ignored "-Wconversion" +#endif + const int neg_one = (int) -1, const_zero = (int) 0; +#ifdef __Pyx_HAS_GCC_DIAGNOSTIC +#pragma GCC diagnostic pop +#endif + const int is_unsigned = neg_one > const_zero; +#if PY_MAJOR_VERSION < 3 + if (likely(PyInt_Check(x))) { + if (sizeof(int) < sizeof(long)) { + __PYX_VERIFY_RETURN_INT(int, long, PyInt_AS_LONG(x)) + } else { + long val = PyInt_AS_LONG(x); + if (is_unsigned && unlikely(val < 0)) { + goto raise_neg_overflow; + } + return (int) val; + } + } else +#endif + if (likely(PyLong_Check(x))) { + if (is_unsigned) { +#if CYTHON_USE_PYLONG_INTERNALS + const digit* digits = ((PyLongObject*)x)->ob_digit; + switch (Py_SIZE(x)) { + case 0: return (int) 0; + case 1: __PYX_VERIFY_RETURN_INT(int, digit, digits[0]) + case 2: + if (8 * sizeof(int) > 1 * PyLong_SHIFT) { + if (8 * sizeof(unsigned long) > 2 * PyLong_SHIFT) { + __PYX_VERIFY_RETURN_INT(int, unsigned long, (((((unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) + } else if (8 * sizeof(int) >= 2 * PyLong_SHIFT) { + return (int) (((((int)digits[1]) << PyLong_SHIFT) | (int)digits[0])); + } + } + break; + case 3: + if (8 * sizeof(int) > 2 * PyLong_SHIFT) { + if (8 * sizeof(unsigned long) > 3 * PyLong_SHIFT) { + __PYX_VERIFY_RETURN_INT(int, unsigned long, (((((((unsigned long)digits[2]) << PyLong_SHIFT) | (unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) + } else if (8 * sizeof(int) >= 3 * PyLong_SHIFT) { + return (int) (((((((int)digits[2]) << PyLong_SHIFT) | (int)digits[1]) << PyLong_SHIFT) | (int)digits[0])); + } + } + break; + case 4: + if (8 * sizeof(int) > 3 * PyLong_SHIFT) { + if (8 * sizeof(unsigned long) > 4 * PyLong_SHIFT) { + __PYX_VERIFY_RETURN_INT(int, unsigned long, (((((((((unsigned long)digits[3]) << PyLong_SHIFT) | (unsigned long)digits[2]) << PyLong_SHIFT) | (unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) + } else if (8 * sizeof(int) >= 4 * PyLong_SHIFT) { + return (int) (((((((((int)digits[3]) << PyLong_SHIFT) | (int)digits[2]) << PyLong_SHIFT) | (int)digits[1]) << PyLong_SHIFT) | (int)digits[0])); + } + } + break; + } +#endif +#if CYTHON_COMPILING_IN_CPYTHON + if (unlikely(Py_SIZE(x) < 0)) { + goto raise_neg_overflow; + } +#else + { + int result = PyObject_RichCompareBool(x, Py_False, Py_LT); + if (unlikely(result < 0)) + return (int) -1; + if (unlikely(result == 1)) + goto raise_neg_overflow; + } +#endif + if (sizeof(int) <= sizeof(unsigned long)) { + __PYX_VERIFY_RETURN_INT_EXC(int, unsigned long, PyLong_AsUnsignedLong(x)) +#ifdef HAVE_LONG_LONG + } else if (sizeof(int) <= sizeof(unsigned PY_LONG_LONG)) { + __PYX_VERIFY_RETURN_INT_EXC(int, unsigned PY_LONG_LONG, PyLong_AsUnsignedLongLong(x)) +#endif + } + } else { +#if CYTHON_USE_PYLONG_INTERNALS + const digit* digits = ((PyLongObject*)x)->ob_digit; + switch (Py_SIZE(x)) { + case 0: return (int) 0; + case -1: __PYX_VERIFY_RETURN_INT(int, sdigit, (sdigit) (-(sdigit)digits[0])) + case 1: __PYX_VERIFY_RETURN_INT(int, digit, +digits[0]) + case -2: + if (8 * sizeof(int) - 1 > 1 * PyLong_SHIFT) { + if (8 * sizeof(unsigned long) > 2 * PyLong_SHIFT) { + __PYX_VERIFY_RETURN_INT(int, long, -(long) (((((unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) + } else if (8 * sizeof(int) - 1 > 2 * PyLong_SHIFT) { + return (int) (((int)-1)*(((((int)digits[1]) << PyLong_SHIFT) | (int)digits[0]))); + } + } + break; + case 2: + if (8 * sizeof(int) > 1 * PyLong_SHIFT) { + if (8 * sizeof(unsigned long) > 2 * PyLong_SHIFT) { + __PYX_VERIFY_RETURN_INT(int, unsigned long, (((((unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) + } else if (8 * sizeof(int) - 1 > 2 * PyLong_SHIFT) { + return (int) ((((((int)digits[1]) << PyLong_SHIFT) | (int)digits[0]))); + } + } + break; + case -3: + if (8 * sizeof(int) - 1 > 2 * PyLong_SHIFT) { + if (8 * sizeof(unsigned long) > 3 * PyLong_SHIFT) { + __PYX_VERIFY_RETURN_INT(int, long, -(long) (((((((unsigned long)digits[2]) << PyLong_SHIFT) | (unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) + } else if (8 * sizeof(int) - 1 > 3 * PyLong_SHIFT) { + return (int) (((int)-1)*(((((((int)digits[2]) << PyLong_SHIFT) | (int)digits[1]) << PyLong_SHIFT) | (int)digits[0]))); + } + } + break; + case 3: + if (8 * sizeof(int) > 2 * PyLong_SHIFT) { + if (8 * sizeof(unsigned long) > 3 * PyLong_SHIFT) { + __PYX_VERIFY_RETURN_INT(int, unsigned long, (((((((unsigned long)digits[2]) << PyLong_SHIFT) | (unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) + } else if (8 * sizeof(int) - 1 > 3 * PyLong_SHIFT) { + return (int) ((((((((int)digits[2]) << PyLong_SHIFT) | (int)digits[1]) << PyLong_SHIFT) | (int)digits[0]))); + } + } + break; + case -4: + if (8 * sizeof(int) - 1 > 3 * PyLong_SHIFT) { + if (8 * sizeof(unsigned long) > 4 * PyLong_SHIFT) { + __PYX_VERIFY_RETURN_INT(int, long, -(long) (((((((((unsigned long)digits[3]) << PyLong_SHIFT) | (unsigned long)digits[2]) << PyLong_SHIFT) | (unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) + } else if (8 * sizeof(int) - 1 > 4 * PyLong_SHIFT) { + return (int) (((int)-1)*(((((((((int)digits[3]) << PyLong_SHIFT) | (int)digits[2]) << PyLong_SHIFT) | (int)digits[1]) << PyLong_SHIFT) | (int)digits[0]))); + } + } + break; + case 4: + if (8 * sizeof(int) > 3 * PyLong_SHIFT) { + if (8 * sizeof(unsigned long) > 4 * PyLong_SHIFT) { + __PYX_VERIFY_RETURN_INT(int, unsigned long, (((((((((unsigned long)digits[3]) << PyLong_SHIFT) | (unsigned long)digits[2]) << PyLong_SHIFT) | (unsigned long)digits[1]) << PyLong_SHIFT) | (unsigned long)digits[0]))) + } else if (8 * sizeof(int) - 1 > 4 * PyLong_SHIFT) { + return (int) ((((((((((int)digits[3]) << PyLong_SHIFT) | (int)digits[2]) << PyLong_SHIFT) | (int)digits[1]) << PyLong_SHIFT) | (int)digits[0]))); + } + } + break; + } +#endif + if (sizeof(int) <= sizeof(long)) { + __PYX_VERIFY_RETURN_INT_EXC(int, long, PyLong_AsLong(x)) +#ifdef HAVE_LONG_LONG + } else if (sizeof(int) <= sizeof(PY_LONG_LONG)) { + __PYX_VERIFY_RETURN_INT_EXC(int, PY_LONG_LONG, PyLong_AsLongLong(x)) +#endif + } + } + { +#if CYTHON_COMPILING_IN_PYPY && !defined(_PyLong_AsByteArray) + PyErr_SetString(PyExc_RuntimeError, + "_PyLong_AsByteArray() not available in PyPy, cannot convert large numbers"); +#else + int val; + PyObject *v = __Pyx_PyNumber_IntOrLong(x); + #if PY_MAJOR_VERSION < 3 + if (likely(v) && !PyLong_Check(v)) { + PyObject *tmp = v; + v = PyNumber_Long(tmp); + Py_DECREF(tmp); + } + #endif + if (likely(v)) { + int one = 1; int is_little = (int)*(unsigned char *)&one; + unsigned char *bytes = (unsigned char *)&val; + int ret = _PyLong_AsByteArray((PyLongObject *)v, + bytes, sizeof(val), + is_little, !is_unsigned); + Py_DECREF(v); + if (likely(!ret)) + return val; + } +#endif + return (int) -1; + } + } else { + int val; + PyObject *tmp = __Pyx_PyNumber_IntOrLong(x); + if (!tmp) return (int) -1; + val = __Pyx_PyInt_As_int(tmp); + Py_DECREF(tmp); + return val; + } +raise_overflow: + PyErr_SetString(PyExc_OverflowError, + "value too large to convert to int"); + return (int) -1; +raise_neg_overflow: + PyErr_SetString(PyExc_OverflowError, + "can't convert negative value to int"); + return (int) -1; +} + +/* FastTypeChecks */ +#if CYTHON_COMPILING_IN_CPYTHON +static int __Pyx_InBases(PyTypeObject *a, PyTypeObject *b) { + while (a) { + a = a->tp_base; + if (a == b) + return 1; + } + return b == &PyBaseObject_Type; +} +static CYTHON_INLINE int __Pyx_IsSubtype(PyTypeObject *a, PyTypeObject *b) { + PyObject *mro; + if (a == b) return 1; + mro = a->tp_mro; + if (likely(mro)) { + Py_ssize_t i, n; + n = PyTuple_GET_SIZE(mro); + for (i = 0; i < n; i++) { + if (PyTuple_GET_ITEM(mro, i) == (PyObject *)b) + return 1; + } + return 0; + } + return __Pyx_InBases(a, b); +} +#if PY_MAJOR_VERSION == 2 +static int __Pyx_inner_PyErr_GivenExceptionMatches2(PyObject *err, PyObject* exc_type1, PyObject* exc_type2) { + PyObject *exception, *value, *tb; + int res; + __Pyx_PyThreadState_declare + __Pyx_PyThreadState_assign + __Pyx_ErrFetch(&exception, &value, &tb); + res = exc_type1 ? PyObject_IsSubclass(err, exc_type1) : 0; + if (unlikely(res == -1)) { + PyErr_WriteUnraisable(err); + res = 0; + } + if (!res) { + res = PyObject_IsSubclass(err, exc_type2); + if (unlikely(res == -1)) { + PyErr_WriteUnraisable(err); + res = 0; + } + } + __Pyx_ErrRestore(exception, value, tb); + return res; +} +#else +static CYTHON_INLINE int __Pyx_inner_PyErr_GivenExceptionMatches2(PyObject *err, PyObject* exc_type1, PyObject *exc_type2) { + int res = exc_type1 ? __Pyx_IsSubtype((PyTypeObject*)err, (PyTypeObject*)exc_type1) : 0; + if (!res) { + res = __Pyx_IsSubtype((PyTypeObject*)err, (PyTypeObject*)exc_type2); + } + return res; +} +#endif +static int __Pyx_PyErr_GivenExceptionMatchesTuple(PyObject *exc_type, PyObject *tuple) { + Py_ssize_t i, n; + assert(PyExceptionClass_Check(exc_type)); + n = PyTuple_GET_SIZE(tuple); +#if PY_MAJOR_VERSION >= 3 + for (i=0; ip) { + #if PY_MAJOR_VERSION < 3 + if (t->is_unicode) { + *t->p = PyUnicode_DecodeUTF8(t->s, t->n - 1, NULL); + } else if (t->intern) { + *t->p = PyString_InternFromString(t->s); + } else { + *t->p = PyString_FromStringAndSize(t->s, t->n - 1); + } + #else + if (t->is_unicode | t->is_str) { + if (t->intern) { + *t->p = PyUnicode_InternFromString(t->s); + } else if (t->encoding) { + *t->p = PyUnicode_Decode(t->s, t->n - 1, t->encoding, NULL); + } else { + *t->p = PyUnicode_FromStringAndSize(t->s, t->n - 1); + } + } else { + *t->p = PyBytes_FromStringAndSize(t->s, t->n - 1); + } + #endif + if (!*t->p) + return -1; + if (PyObject_Hash(*t->p) == -1) + return -1; + ++t; + } + return 0; +} + +static CYTHON_INLINE PyObject* __Pyx_PyUnicode_FromString(const char* c_str) { + return __Pyx_PyUnicode_FromStringAndSize(c_str, (Py_ssize_t)strlen(c_str)); +} +static CYTHON_INLINE const char* __Pyx_PyObject_AsString(PyObject* o) { + Py_ssize_t ignore; + return __Pyx_PyObject_AsStringAndSize(o, &ignore); +} +#if __PYX_DEFAULT_STRING_ENCODING_IS_ASCII || __PYX_DEFAULT_STRING_ENCODING_IS_DEFAULT +#if !CYTHON_PEP393_ENABLED +static const char* __Pyx_PyUnicode_AsStringAndSize(PyObject* o, Py_ssize_t *length) { + char* defenc_c; + PyObject* defenc = _PyUnicode_AsDefaultEncodedString(o, NULL); + if (!defenc) return NULL; + defenc_c = PyBytes_AS_STRING(defenc); +#if __PYX_DEFAULT_STRING_ENCODING_IS_ASCII + { + char* end = defenc_c + PyBytes_GET_SIZE(defenc); + char* c; + for (c = defenc_c; c < end; c++) { + if ((unsigned char) (*c) >= 128) { + PyUnicode_AsASCIIString(o); + return NULL; + } + } + } +#endif + *length = PyBytes_GET_SIZE(defenc); + return defenc_c; +} +#else +static CYTHON_INLINE const char* __Pyx_PyUnicode_AsStringAndSize(PyObject* o, Py_ssize_t *length) { + if (unlikely(__Pyx_PyUnicode_READY(o) == -1)) return NULL; +#if __PYX_DEFAULT_STRING_ENCODING_IS_ASCII + if (likely(PyUnicode_IS_ASCII(o))) { + *length = PyUnicode_GET_LENGTH(o); + return PyUnicode_AsUTF8(o); + } else { + PyUnicode_AsASCIIString(o); + return NULL; + } +#else + return PyUnicode_AsUTF8AndSize(o, length); +#endif +} +#endif +#endif +static CYTHON_INLINE const char* __Pyx_PyObject_AsStringAndSize(PyObject* o, Py_ssize_t *length) { +#if __PYX_DEFAULT_STRING_ENCODING_IS_ASCII || __PYX_DEFAULT_STRING_ENCODING_IS_DEFAULT + if ( +#if PY_MAJOR_VERSION < 3 && __PYX_DEFAULT_STRING_ENCODING_IS_ASCII + __Pyx_sys_getdefaultencoding_not_ascii && +#endif + PyUnicode_Check(o)) { + return __Pyx_PyUnicode_AsStringAndSize(o, length); + } else +#endif +#if (!CYTHON_COMPILING_IN_PYPY) || (defined(PyByteArray_AS_STRING) && defined(PyByteArray_GET_SIZE)) + if (PyByteArray_Check(o)) { + *length = PyByteArray_GET_SIZE(o); + return PyByteArray_AS_STRING(o); + } else +#endif + { + char* result; + int r = PyBytes_AsStringAndSize(o, &result, length); + if (unlikely(r < 0)) { + return NULL; + } else { + return result; + } + } +} +static CYTHON_INLINE int __Pyx_PyObject_IsTrue(PyObject* x) { + int is_true = x == Py_True; + if (is_true | (x == Py_False) | (x == Py_None)) return is_true; + else return PyObject_IsTrue(x); +} +static CYTHON_INLINE int __Pyx_PyObject_IsTrueAndDecref(PyObject* x) { + int retval; + if (unlikely(!x)) return -1; + retval = __Pyx_PyObject_IsTrue(x); + Py_DECREF(x); + return retval; +} +static PyObject* __Pyx_PyNumber_IntOrLongWrongResultType(PyObject* result, const char* type_name) { +#if PY_MAJOR_VERSION >= 3 + if (PyLong_Check(result)) { + if (PyErr_WarnFormat(PyExc_DeprecationWarning, 1, + "__int__ returned non-int (type %.200s). " + "The ability to return an instance of a strict subclass of int " + "is deprecated, and may be removed in a future version of Python.", + Py_TYPE(result)->tp_name)) { + Py_DECREF(result); + return NULL; + } + return result; + } +#endif + PyErr_Format(PyExc_TypeError, + "__%.4s__ returned non-%.4s (type %.200s)", + type_name, type_name, Py_TYPE(result)->tp_name); + Py_DECREF(result); + return NULL; +} +static CYTHON_INLINE PyObject* __Pyx_PyNumber_IntOrLong(PyObject* x) { +#if CYTHON_USE_TYPE_SLOTS + PyNumberMethods *m; +#endif + const char *name = NULL; + PyObject *res = NULL; +#if PY_MAJOR_VERSION < 3 + if (likely(PyInt_Check(x) || PyLong_Check(x))) +#else + if (likely(PyLong_Check(x))) +#endif + return __Pyx_NewRef(x); +#if CYTHON_USE_TYPE_SLOTS + m = Py_TYPE(x)->tp_as_number; + #if PY_MAJOR_VERSION < 3 + if (m && m->nb_int) { + name = "int"; + res = m->nb_int(x); + } + else if (m && m->nb_long) { + name = "long"; + res = m->nb_long(x); + } + #else + if (likely(m && m->nb_int)) { + name = "int"; + res = m->nb_int(x); + } + #endif +#else + if (!PyBytes_CheckExact(x) && !PyUnicode_CheckExact(x)) { + res = PyNumber_Int(x); + } +#endif + if (likely(res)) { +#if PY_MAJOR_VERSION < 3 + if (unlikely(!PyInt_Check(res) && !PyLong_Check(res))) { +#else + if (unlikely(!PyLong_CheckExact(res))) { +#endif + return __Pyx_PyNumber_IntOrLongWrongResultType(res, name); + } + } + else if (!PyErr_Occurred()) { + PyErr_SetString(PyExc_TypeError, + "an integer is required"); + } + return res; +} +static CYTHON_INLINE Py_ssize_t __Pyx_PyIndex_AsSsize_t(PyObject* b) { + Py_ssize_t ival; + PyObject *x; +#if PY_MAJOR_VERSION < 3 + if (likely(PyInt_CheckExact(b))) { + if (sizeof(Py_ssize_t) >= sizeof(long)) + return PyInt_AS_LONG(b); + else + return PyInt_AsSsize_t(b); + } +#endif + if (likely(PyLong_CheckExact(b))) { + #if CYTHON_USE_PYLONG_INTERNALS + const digit* digits = ((PyLongObject*)b)->ob_digit; + const Py_ssize_t size = Py_SIZE(b); + if (likely(__Pyx_sst_abs(size) <= 1)) { + ival = likely(size) ? digits[0] : 0; + if (size == -1) ival = -ival; + return ival; + } else { + switch (size) { + case 2: + if (8 * sizeof(Py_ssize_t) > 2 * PyLong_SHIFT) { + return (Py_ssize_t) (((((size_t)digits[1]) << PyLong_SHIFT) | (size_t)digits[0])); + } + break; + case -2: + if (8 * sizeof(Py_ssize_t) > 2 * PyLong_SHIFT) { + return -(Py_ssize_t) (((((size_t)digits[1]) << PyLong_SHIFT) | (size_t)digits[0])); + } + break; + case 3: + if (8 * sizeof(Py_ssize_t) > 3 * PyLong_SHIFT) { + return (Py_ssize_t) (((((((size_t)digits[2]) << PyLong_SHIFT) | (size_t)digits[1]) << PyLong_SHIFT) | (size_t)digits[0])); + } + break; + case -3: + if (8 * sizeof(Py_ssize_t) > 3 * PyLong_SHIFT) { + return -(Py_ssize_t) (((((((size_t)digits[2]) << PyLong_SHIFT) | (size_t)digits[1]) << PyLong_SHIFT) | (size_t)digits[0])); + } + break; + case 4: + if (8 * sizeof(Py_ssize_t) > 4 * PyLong_SHIFT) { + return (Py_ssize_t) (((((((((size_t)digits[3]) << PyLong_SHIFT) | (size_t)digits[2]) << PyLong_SHIFT) | (size_t)digits[1]) << PyLong_SHIFT) | (size_t)digits[0])); + } + break; + case -4: + if (8 * sizeof(Py_ssize_t) > 4 * PyLong_SHIFT) { + return -(Py_ssize_t) (((((((((size_t)digits[3]) << PyLong_SHIFT) | (size_t)digits[2]) << PyLong_SHIFT) | (size_t)digits[1]) << PyLong_SHIFT) | (size_t)digits[0])); + } + break; + } + } + #endif + return PyLong_AsSsize_t(b); + } + x = PyNumber_Index(b); + if (!x) return -1; + ival = PyInt_AsSsize_t(x); + Py_DECREF(x); + return ival; +} +static CYTHON_INLINE PyObject * __Pyx_PyBool_FromLong(long b) { + return b ? __Pyx_NewRef(Py_True) : __Pyx_NewRef(Py_False); +} +static CYTHON_INLINE PyObject * __Pyx_PyInt_FromSize_t(size_t ival) { + return PyInt_FromSize_t(ival); +} + + +#endif /* Py_PYTHON_H */ diff --git a/sbsheriff/Lib/site-packages/aiohttp/_websocket.cp310-win_amd64.pyd b/sbsheriff/Lib/site-packages/aiohttp/_websocket.cp310-win_amd64.pyd new file mode 100644 index 0000000000000000000000000000000000000000..872c1036b7b3c9f70c1b2c8044a976bcccc60692 GIT binary patch literal 28160 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 literal 0 HcmV?d00001 diff --git a/sbsheriff/Lib/site-packages/aiohttp/_websocket.pyx b/sbsheriff/Lib/site-packages/aiohttp/_websocket.pyx new file mode 100644 index 0000000..94318d2 --- /dev/null +++ b/sbsheriff/Lib/site-packages/aiohttp/_websocket.pyx @@ -0,0 +1,56 @@ +from cpython cimport PyBytes_AsString + + +#from cpython cimport PyByteArray_AsString # cython still not exports that +cdef extern from "Python.h": + char* PyByteArray_AsString(bytearray ba) except NULL + +from libc.stdint cimport uint32_t, uint64_t, uintmax_t + + +def _websocket_mask_cython(object mask, object data): + """Note, this function mutates its `data` argument + """ + cdef: + Py_ssize_t data_len, i + # bit operations on signed integers are implementation-specific + unsigned char * in_buf + const unsigned char * mask_buf + uint32_t uint32_msk + uint64_t uint64_msk + + assert len(mask) == 4 + + if not isinstance(mask, bytes): + mask = bytes(mask) + + if isinstance(data, bytearray): + data = data + else: + data = bytearray(data) + + data_len = len(data) + in_buf = PyByteArray_AsString(data) + mask_buf = PyBytes_AsString(mask) + uint32_msk = (mask_buf)[0] + + # TODO: align in_data ptr to achieve even faster speeds + # does it need in python ?! malloc() always aligns to sizeof(long) bytes + + if sizeof(size_t) >= 8: + uint64_msk = uint32_msk + uint64_msk = (uint64_msk << 32) | uint32_msk + + while data_len >= 8: + (in_buf)[0] ^= uint64_msk + in_buf += 8 + data_len -= 8 + + + while data_len >= 4: + (in_buf)[0] ^= uint32_msk + in_buf += 4 + data_len -= 4 + + for i in range(0, data_len): + in_buf[i] ^= mask_buf[i] diff --git a/sbsheriff/Lib/site-packages/aiohttp/abc.py b/sbsheriff/Lib/site-packages/aiohttp/abc.py new file mode 100644 index 0000000..06fc831 --- /dev/null +++ b/sbsheriff/Lib/site-packages/aiohttp/abc.py @@ -0,0 +1,207 @@ +import asyncio +import logging +from abc import ABC, abstractmethod +from collections.abc import Sized +from http.cookies import BaseCookie, Morsel +from typing import ( + TYPE_CHECKING, + Any, + Awaitable, + Callable, + Dict, + Generator, + Iterable, + List, + Optional, + Tuple, +) + +from multidict import CIMultiDict +from yarl import URL + +from .helpers import get_running_loop +from .typedefs import LooseCookies + +if TYPE_CHECKING: # pragma: no cover + from .web_app import Application + from .web_exceptions import HTTPException + from .web_request import BaseRequest, Request + from .web_response import StreamResponse +else: + BaseRequest = Request = Application = StreamResponse = None + HTTPException = None + + +class AbstractRouter(ABC): + def __init__(self) -> None: + self._frozen = False + + def post_init(self, app: Application) -> None: + """Post init stage. + + Not an abstract method for sake of backward compatibility, + but if the router wants to be aware of the application + it can override this. + """ + + @property + def frozen(self) -> bool: + return self._frozen + + def freeze(self) -> None: + """Freeze router.""" + self._frozen = True + + @abstractmethod + async def resolve(self, request: Request) -> "AbstractMatchInfo": + """Return MATCH_INFO for given request""" + + +class AbstractMatchInfo(ABC): + @property # pragma: no branch + @abstractmethod + def handler(self) -> Callable[[Request], Awaitable[StreamResponse]]: + """Execute matched request handler""" + + @property + @abstractmethod + def expect_handler(self) -> Callable[[Request], Awaitable[None]]: + """Expect handler for 100-continue processing""" + + @property # pragma: no branch + @abstractmethod + def http_exception(self) -> Optional[HTTPException]: + """HTTPException instance raised on router's resolving, or None""" + + @abstractmethod # pragma: no branch + def get_info(self) -> Dict[str, Any]: + """Return a dict with additional info useful for introspection""" + + @property # pragma: no branch + @abstractmethod + def apps(self) -> Tuple[Application, ...]: + """Stack of nested applications. + + Top level application is left-most element. + + """ + + @abstractmethod + def add_app(self, app: Application) -> None: + """Add application to the nested apps stack.""" + + @abstractmethod + def freeze(self) -> None: + """Freeze the match info. + + The method is called after route resolution. + + After the call .add_app() is forbidden. + + """ + + +class AbstractView(ABC): + """Abstract class based view.""" + + def __init__(self, request: Request) -> None: + self._request = request + + @property + def request(self) -> Request: + """Request instance.""" + return self._request + + @abstractmethod + def __await__(self) -> Generator[Any, None, StreamResponse]: + """Execute the view handler.""" + + +class AbstractResolver(ABC): + """Abstract DNS resolver.""" + + @abstractmethod + async def resolve(self, host: str, port: int, family: int) -> List[Dict[str, Any]]: + """Return IP address for given hostname""" + + @abstractmethod + async def close(self) -> None: + """Release resolver""" + + +if TYPE_CHECKING: # pragma: no cover + IterableBase = Iterable[Morsel[str]] +else: + IterableBase = Iterable + + +ClearCookiePredicate = Callable[["Morsel[str]"], bool] + + +class AbstractCookieJar(Sized, IterableBase): + """Abstract Cookie Jar.""" + + def __init__(self, *, loop: Optional[asyncio.AbstractEventLoop] = None) -> None: + self._loop = get_running_loop(loop) + + @abstractmethod + def clear(self, predicate: Optional[ClearCookiePredicate] = None) -> None: + """Clear all cookies if no predicate is passed.""" + + @abstractmethod + def clear_domain(self, domain: str) -> None: + """Clear all cookies for domain and all subdomains.""" + + @abstractmethod + def update_cookies(self, cookies: LooseCookies, response_url: URL = URL()) -> None: + """Update cookies.""" + + @abstractmethod + def filter_cookies(self, request_url: URL) -> "BaseCookie[str]": + """Return the jar's cookies filtered by their attributes.""" + + +class AbstractStreamWriter(ABC): + """Abstract stream writer.""" + + buffer_size = 0 + output_size = 0 + length = 0 # type: Optional[int] + + @abstractmethod + async def write(self, chunk: bytes) -> None: + """Write chunk into stream.""" + + @abstractmethod + async def write_eof(self, chunk: bytes = b"") -> None: + """Write last chunk.""" + + @abstractmethod + async def drain(self) -> None: + """Flush the write buffer.""" + + @abstractmethod + def enable_compression(self, encoding: str = "deflate") -> None: + """Enable HTTP body compression""" + + @abstractmethod + def enable_chunking(self) -> None: + """Enable HTTP chunked mode""" + + @abstractmethod + async def write_headers( + self, status_line: str, headers: "CIMultiDict[str]" + ) -> None: + """Write HTTP headers""" + + +class AbstractAccessLogger(ABC): + """Abstract writer to access log.""" + + def __init__(self, logger: logging.Logger, log_format: str) -> None: + self.logger = logger + self.log_format = log_format + + @abstractmethod + def log(self, request: BaseRequest, response: StreamResponse, time: float) -> None: + """Emit log to logger.""" diff --git a/sbsheriff/Lib/site-packages/aiohttp/base_protocol.py b/sbsheriff/Lib/site-packages/aiohttp/base_protocol.py new file mode 100644 index 0000000..fff4610 --- /dev/null +++ b/sbsheriff/Lib/site-packages/aiohttp/base_protocol.py @@ -0,0 +1,87 @@ +import asyncio +from typing import Optional, cast + +from .tcp_helpers import tcp_nodelay + + +class BaseProtocol(asyncio.Protocol): + __slots__ = ( + "_loop", + "_paused", + "_drain_waiter", + "_connection_lost", + "_reading_paused", + "transport", + ) + + def __init__(self, loop: asyncio.AbstractEventLoop) -> None: + self._loop = loop # type: asyncio.AbstractEventLoop + self._paused = False + self._drain_waiter = None # type: Optional[asyncio.Future[None]] + self._connection_lost = False + self._reading_paused = False + + self.transport = None # type: Optional[asyncio.Transport] + + def pause_writing(self) -> None: + assert not self._paused + self._paused = True + + def resume_writing(self) -> None: + assert self._paused + self._paused = False + + waiter = self._drain_waiter + if waiter is not None: + self._drain_waiter = None + if not waiter.done(): + waiter.set_result(None) + + def pause_reading(self) -> None: + if not self._reading_paused and self.transport is not None: + try: + self.transport.pause_reading() + except (AttributeError, NotImplementedError, RuntimeError): + pass + self._reading_paused = True + + def resume_reading(self) -> None: + if self._reading_paused and self.transport is not None: + try: + self.transport.resume_reading() + except (AttributeError, NotImplementedError, RuntimeError): + pass + self._reading_paused = False + + def connection_made(self, transport: asyncio.BaseTransport) -> None: + tr = cast(asyncio.Transport, transport) + tcp_nodelay(tr, True) + self.transport = tr + + def connection_lost(self, exc: Optional[BaseException]) -> None: + self._connection_lost = True + # Wake up the writer if currently paused. + self.transport = None + if not self._paused: + return + waiter = self._drain_waiter + if waiter is None: + return + self._drain_waiter = None + if waiter.done(): + return + if exc is None: + waiter.set_result(None) + else: + waiter.set_exception(exc) + + async def _drain_helper(self) -> None: + if self._connection_lost: + raise ConnectionResetError("Connection lost") + if not self._paused: + return + waiter = self._drain_waiter + if waiter is None: + waiter = self._loop.create_future() + self._drain_waiter = waiter + await asyncio.shield(waiter) diff --git a/sbsheriff/Lib/site-packages/aiohttp/client.py b/sbsheriff/Lib/site-packages/aiohttp/client.py new file mode 100644 index 0000000..c6e4a76 --- /dev/null +++ b/sbsheriff/Lib/site-packages/aiohttp/client.py @@ -0,0 +1,1302 @@ +"""HTTP Client for asyncio.""" + +import asyncio +import base64 +import hashlib +import json +import os +import sys +import traceback +import warnings +from contextlib import suppress +from types import SimpleNamespace, TracebackType +from typing import ( + Any, + Awaitable, + Callable, + Coroutine, + FrozenSet, + Generator, + Generic, + Iterable, + List, + Mapping, + Optional, + Set, + Tuple, + Type, + TypeVar, + Union, +) + +import attr +from multidict import CIMultiDict, MultiDict, MultiDictProxy, istr +from yarl import URL + +from . import hdrs, http, payload +from .abc import AbstractCookieJar +from .client_exceptions import ( + ClientConnectionError as ClientConnectionError, + ClientConnectorCertificateError as ClientConnectorCertificateError, + ClientConnectorError as ClientConnectorError, + ClientConnectorSSLError as ClientConnectorSSLError, + ClientError as ClientError, + ClientHttpProxyError as ClientHttpProxyError, + ClientOSError as ClientOSError, + ClientPayloadError as ClientPayloadError, + ClientProxyConnectionError as ClientProxyConnectionError, + ClientResponseError as ClientResponseError, + ClientSSLError as ClientSSLError, + ContentTypeError as ContentTypeError, + InvalidURL as InvalidURL, + ServerConnectionError as ServerConnectionError, + ServerDisconnectedError as ServerDisconnectedError, + ServerFingerprintMismatch as ServerFingerprintMismatch, + ServerTimeoutError as ServerTimeoutError, + TooManyRedirects as TooManyRedirects, + WSServerHandshakeError as WSServerHandshakeError, +) +from .client_reqrep import ( + ClientRequest as ClientRequest, + ClientResponse as ClientResponse, + Fingerprint as Fingerprint, + RequestInfo as RequestInfo, + _merge_ssl_params, +) +from .client_ws import ClientWebSocketResponse as ClientWebSocketResponse +from .connector import ( + BaseConnector as BaseConnector, + NamedPipeConnector as NamedPipeConnector, + TCPConnector as TCPConnector, + UnixConnector as UnixConnector, +) +from .cookiejar import CookieJar +from .helpers import ( + DEBUG, + PY_36, + BasicAuth, + TimeoutHandle, + ceil_timeout, + get_env_proxy_for_url, + get_running_loop, + sentinel, + strip_auth_from_url, +) +from .http import WS_KEY, HttpVersion, WebSocketReader, WebSocketWriter +from .http_websocket import WSHandshakeError, WSMessage, ws_ext_gen, ws_ext_parse +from .streams import FlowControlDataQueue +from .tracing import Trace, TraceConfig +from .typedefs import Final, JSONEncoder, LooseCookies, LooseHeaders, StrOrURL + +__all__ = ( + # client_exceptions + "ClientConnectionError", + "ClientConnectorCertificateError", + "ClientConnectorError", + "ClientConnectorSSLError", + "ClientError", + "ClientHttpProxyError", + "ClientOSError", + "ClientPayloadError", + "ClientProxyConnectionError", + "ClientResponseError", + "ClientSSLError", + "ContentTypeError", + "InvalidURL", + "ServerConnectionError", + "ServerDisconnectedError", + "ServerFingerprintMismatch", + "ServerTimeoutError", + "TooManyRedirects", + "WSServerHandshakeError", + # client_reqrep + "ClientRequest", + "ClientResponse", + "Fingerprint", + "RequestInfo", + # connector + "BaseConnector", + "TCPConnector", + "UnixConnector", + "NamedPipeConnector", + # client_ws + "ClientWebSocketResponse", + # client + "ClientSession", + "ClientTimeout", + "request", +) + + +try: + from ssl import SSLContext +except ImportError: # pragma: no cover + SSLContext = object # type: ignore[misc,assignment] + + +@attr.s(auto_attribs=True, frozen=True, slots=True) +class ClientTimeout: + total: Optional[float] = None + connect: Optional[float] = None + sock_read: Optional[float] = None + sock_connect: Optional[float] = None + + # pool_queue_timeout: Optional[float] = None + # dns_resolution_timeout: Optional[float] = None + # socket_connect_timeout: Optional[float] = None + # connection_acquiring_timeout: Optional[float] = None + # new_connection_timeout: Optional[float] = None + # http_header_timeout: Optional[float] = None + # response_body_timeout: Optional[float] = None + + # to create a timeout specific for a single request, either + # - create a completely new one to overwrite the default + # - or use http://www.attrs.org/en/stable/api.html#attr.evolve + # to overwrite the defaults + + +# 5 Minute default read timeout +DEFAULT_TIMEOUT: Final[ClientTimeout] = ClientTimeout(total=5 * 60) + +_RetType = TypeVar("_RetType") + + +class ClientSession: + """First-class interface for making HTTP requests.""" + + ATTRS = frozenset( + [ + "_base_url", + "_source_traceback", + "_connector", + "requote_redirect_url", + "_loop", + "_cookie_jar", + "_connector_owner", + "_default_auth", + "_version", + "_json_serialize", + "_requote_redirect_url", + "_timeout", + "_raise_for_status", + "_auto_decompress", + "_trust_env", + "_default_headers", + "_skip_auto_headers", + "_request_class", + "_response_class", + "_ws_response_class", + "_trace_configs", + "_read_bufsize", + ] + ) + + _source_traceback = None + + def __init__( + self, + base_url: Optional[StrOrURL] = None, + *, + connector: Optional[BaseConnector] = None, + loop: Optional[asyncio.AbstractEventLoop] = None, + cookies: Optional[LooseCookies] = None, + headers: Optional[LooseHeaders] = None, + skip_auto_headers: Optional[Iterable[str]] = None, + auth: Optional[BasicAuth] = None, + json_serialize: JSONEncoder = json.dumps, + request_class: Type[ClientRequest] = ClientRequest, + response_class: Type[ClientResponse] = ClientResponse, + ws_response_class: Type[ClientWebSocketResponse] = ClientWebSocketResponse, + version: HttpVersion = http.HttpVersion11, + cookie_jar: Optional[AbstractCookieJar] = None, + connector_owner: bool = True, + raise_for_status: bool = False, + read_timeout: Union[float, object] = sentinel, + conn_timeout: Optional[float] = None, + timeout: Union[object, ClientTimeout] = sentinel, + auto_decompress: bool = True, + trust_env: bool = False, + requote_redirect_url: bool = True, + trace_configs: Optional[List[TraceConfig]] = None, + read_bufsize: int = 2 ** 16, + ) -> None: + if loop is None: + if connector is not None: + loop = connector._loop + + loop = get_running_loop(loop) + + if base_url is None or isinstance(base_url, URL): + self._base_url: Optional[URL] = base_url + else: + self._base_url = URL(base_url) + assert ( + self._base_url.origin() == self._base_url + ), "Only absolute URLs without path part are supported" + + if connector is None: + connector = TCPConnector(loop=loop) + + if connector._loop is not loop: + raise RuntimeError("Session and connector has to use same event loop") + + self._loop = loop + + if loop.get_debug(): + self._source_traceback = traceback.extract_stack(sys._getframe(1)) + + if cookie_jar is None: + cookie_jar = CookieJar(loop=loop) + self._cookie_jar = cookie_jar + + if cookies is not None: + self._cookie_jar.update_cookies(cookies) + + self._connector = connector # type: Optional[BaseConnector] + self._connector_owner = connector_owner + self._default_auth = auth + self._version = version + self._json_serialize = json_serialize + if timeout is sentinel: + self._timeout = DEFAULT_TIMEOUT + if read_timeout is not sentinel: + warnings.warn( + "read_timeout is deprecated, " "use timeout argument instead", + DeprecationWarning, + stacklevel=2, + ) + self._timeout = attr.evolve(self._timeout, total=read_timeout) + if conn_timeout is not None: + self._timeout = attr.evolve(self._timeout, connect=conn_timeout) + warnings.warn( + "conn_timeout is deprecated, " "use timeout argument instead", + DeprecationWarning, + stacklevel=2, + ) + else: + self._timeout = timeout # type: ignore[assignment] + if read_timeout is not sentinel: + raise ValueError( + "read_timeout and timeout parameters " + "conflict, please setup " + "timeout.read" + ) + if conn_timeout is not None: + raise ValueError( + "conn_timeout and timeout parameters " + "conflict, please setup " + "timeout.connect" + ) + self._raise_for_status = raise_for_status + self._auto_decompress = auto_decompress + self._trust_env = trust_env + self._requote_redirect_url = requote_redirect_url + self._read_bufsize = read_bufsize + + # Convert to list of tuples + if headers: + real_headers = CIMultiDict(headers) # type: CIMultiDict[str] + else: + real_headers = CIMultiDict() + self._default_headers = real_headers # type: CIMultiDict[str] + if skip_auto_headers is not None: + self._skip_auto_headers = frozenset(istr(i) for i in skip_auto_headers) + else: + self._skip_auto_headers = frozenset() + + self._request_class = request_class + self._response_class = response_class + self._ws_response_class = ws_response_class + + self._trace_configs = trace_configs or [] + for trace_config in self._trace_configs: + trace_config.freeze() + + def __init_subclass__(cls: Type["ClientSession"]) -> None: + warnings.warn( + "Inheritance class {} from ClientSession " + "is discouraged".format(cls.__name__), + DeprecationWarning, + stacklevel=2, + ) + + if DEBUG: + + def __setattr__(self, name: str, val: Any) -> None: + if name not in self.ATTRS: + warnings.warn( + "Setting custom ClientSession.{} attribute " + "is discouraged".format(name), + DeprecationWarning, + stacklevel=2, + ) + super().__setattr__(name, val) + + def __del__(self, _warnings: Any = warnings) -> None: + if not self.closed: + if PY_36: + kwargs = {"source": self} + else: + kwargs = {} + _warnings.warn( + f"Unclosed client session {self!r}", ResourceWarning, **kwargs + ) + context = {"client_session": self, "message": "Unclosed client session"} + if self._source_traceback is not None: + context["source_traceback"] = self._source_traceback + self._loop.call_exception_handler(context) + + def request( + self, method: str, url: StrOrURL, **kwargs: Any + ) -> "_RequestContextManager": + """Perform HTTP request.""" + return _RequestContextManager(self._request(method, url, **kwargs)) + + def _build_url(self, str_or_url: StrOrURL) -> URL: + url = URL(str_or_url) + if self._base_url is None: + return url + else: + assert not url.is_absolute() and url.path.startswith("/") + return self._base_url.join(url) + + async def _request( + self, + method: str, + str_or_url: StrOrURL, + *, + params: Optional[Mapping[str, str]] = None, + data: Any = None, + json: Any = None, + cookies: Optional[LooseCookies] = None, + headers: Optional[LooseHeaders] = None, + skip_auto_headers: Optional[Iterable[str]] = None, + auth: Optional[BasicAuth] = None, + allow_redirects: bool = True, + max_redirects: int = 10, + compress: Optional[str] = None, + chunked: Optional[bool] = None, + expect100: bool = False, + raise_for_status: Optional[bool] = None, + read_until_eof: bool = True, + proxy: Optional[StrOrURL] = None, + proxy_auth: Optional[BasicAuth] = None, + timeout: Union[ClientTimeout, object] = sentinel, + verify_ssl: Optional[bool] = None, + fingerprint: Optional[bytes] = None, + ssl_context: Optional[SSLContext] = None, + ssl: Optional[Union[SSLContext, bool, Fingerprint]] = None, + proxy_headers: Optional[LooseHeaders] = None, + trace_request_ctx: Optional[SimpleNamespace] = None, + read_bufsize: Optional[int] = None, + ) -> ClientResponse: + + # NOTE: timeout clamps existing connect and read timeouts. We cannot + # set the default to None because we need to detect if the user wants + # to use the existing timeouts by setting timeout to None. + + if self.closed: + raise RuntimeError("Session is closed") + + ssl = _merge_ssl_params(ssl, verify_ssl, ssl_context, fingerprint) + + if data is not None and json is not None: + raise ValueError( + "data and json parameters can not be used at the same time" + ) + elif json is not None: + data = payload.JsonPayload(json, dumps=self._json_serialize) + + if not isinstance(chunked, bool) and chunked is not None: + warnings.warn("Chunk size is deprecated #1615", DeprecationWarning) + + redirects = 0 + history = [] + version = self._version + + # Merge with default headers and transform to CIMultiDict + headers = self._prepare_headers(headers) + proxy_headers = self._prepare_headers(proxy_headers) + + try: + url = self._build_url(str_or_url) + except ValueError as e: + raise InvalidURL(str_or_url) from e + + skip_headers = set(self._skip_auto_headers) + if skip_auto_headers is not None: + for i in skip_auto_headers: + skip_headers.add(istr(i)) + + if proxy is not None: + try: + proxy = URL(proxy) + except ValueError as e: + raise InvalidURL(proxy) from e + + if timeout is sentinel: + real_timeout = self._timeout # type: ClientTimeout + else: + if not isinstance(timeout, ClientTimeout): + real_timeout = ClientTimeout(total=timeout) # type: ignore[arg-type] + else: + real_timeout = timeout + # timeout is cumulative for all request operations + # (request, redirects, responses, data consuming) + tm = TimeoutHandle(self._loop, real_timeout.total) + handle = tm.start() + + if read_bufsize is None: + read_bufsize = self._read_bufsize + + traces = [ + Trace( + self, + trace_config, + trace_config.trace_config_ctx(trace_request_ctx=trace_request_ctx), + ) + for trace_config in self._trace_configs + ] + + for trace in traces: + await trace.send_request_start(method, url.update_query(params), headers) + + timer = tm.timer() + try: + with timer: + while True: + url, auth_from_url = strip_auth_from_url(url) + if auth and auth_from_url: + raise ValueError( + "Cannot combine AUTH argument with " + "credentials encoded in URL" + ) + + if auth is None: + auth = auth_from_url + if auth is None: + auth = self._default_auth + # It would be confusing if we support explicit + # Authorization header with auth argument + if ( + headers is not None + and auth is not None + and hdrs.AUTHORIZATION in headers + ): + raise ValueError( + "Cannot combine AUTHORIZATION header " + "with AUTH argument or credentials " + "encoded in URL" + ) + + all_cookies = self._cookie_jar.filter_cookies(url) + + if cookies is not None: + tmp_cookie_jar = CookieJar() + tmp_cookie_jar.update_cookies(cookies) + req_cookies = tmp_cookie_jar.filter_cookies(url) + if req_cookies: + all_cookies.load(req_cookies) + + if proxy is not None: + proxy = URL(proxy) + elif self._trust_env: + with suppress(LookupError): + proxy, proxy_auth = get_env_proxy_for_url(url) + + req = self._request_class( + method, + url, + params=params, + headers=headers, + skip_auto_headers=skip_headers, + data=data, + cookies=all_cookies, + auth=auth, + version=version, + compress=compress, + chunked=chunked, + expect100=expect100, + loop=self._loop, + response_class=self._response_class, + proxy=proxy, + proxy_auth=proxy_auth, + timer=timer, + session=self, + ssl=ssl, + proxy_headers=proxy_headers, + traces=traces, + ) + + # connection timeout + try: + async with ceil_timeout(real_timeout.connect): + assert self._connector is not None + conn = await self._connector.connect( + req, traces=traces, timeout=real_timeout + ) + except asyncio.TimeoutError as exc: + raise ServerTimeoutError( + "Connection timeout " "to host {}".format(url) + ) from exc + + assert conn.transport is not None + + assert conn.protocol is not None + conn.protocol.set_response_params( + timer=timer, + skip_payload=method.upper() == "HEAD", + read_until_eof=read_until_eof, + auto_decompress=self._auto_decompress, + read_timeout=real_timeout.sock_read, + read_bufsize=read_bufsize, + ) + + try: + try: + resp = await req.send(conn) + try: + await resp.start(conn) + except BaseException: + resp.close() + raise + except BaseException: + conn.close() + raise + except ClientError: + raise + except OSError as exc: + raise ClientOSError(*exc.args) from exc + + self._cookie_jar.update_cookies(resp.cookies, resp.url) + + # redirects + if resp.status in (301, 302, 303, 307, 308) and allow_redirects: + + for trace in traces: + await trace.send_request_redirect( + method, url.update_query(params), headers, resp + ) + + redirects += 1 + history.append(resp) + if max_redirects and redirects >= max_redirects: + resp.close() + raise TooManyRedirects( + history[0].request_info, tuple(history) + ) + + # For 301 and 302, mimic IE, now changed in RFC + # https://github.com/kennethreitz/requests/pull/269 + if (resp.status == 303 and resp.method != hdrs.METH_HEAD) or ( + resp.status in (301, 302) and resp.method == hdrs.METH_POST + ): + method = hdrs.METH_GET + data = None + if headers.get(hdrs.CONTENT_LENGTH): + headers.pop(hdrs.CONTENT_LENGTH) + + r_url = resp.headers.get(hdrs.LOCATION) or resp.headers.get( + hdrs.URI + ) + if r_url is None: + # see github.com/aio-libs/aiohttp/issues/2022 + break + else: + # reading from correct redirection + # response is forbidden + resp.release() + + try: + parsed_url = URL( + r_url, encoded=not self._requote_redirect_url + ) + + except ValueError as e: + raise InvalidURL(r_url) from e + + scheme = parsed_url.scheme + if scheme not in ("http", "https", ""): + resp.close() + raise ValueError("Can redirect only to http or https") + elif not scheme: + parsed_url = url.join(parsed_url) + + if url.origin() != parsed_url.origin(): + auth = None + headers.pop(hdrs.AUTHORIZATION, None) + + url = parsed_url + params = None + resp.release() + continue + + break + + # check response status + if raise_for_status is None: + raise_for_status = self._raise_for_status + if raise_for_status: + resp.raise_for_status() + + # register connection + if handle is not None: + if resp.connection is not None: + resp.connection.add_callback(handle.cancel) + else: + handle.cancel() + + resp._history = tuple(history) + + for trace in traces: + await trace.send_request_end( + method, url.update_query(params), headers, resp + ) + return resp + + except BaseException as e: + # cleanup timer + tm.close() + if handle: + handle.cancel() + handle = None + + for trace in traces: + await trace.send_request_exception( + method, url.update_query(params), headers, e + ) + raise + + def ws_connect( + self, + url: StrOrURL, + *, + method: str = hdrs.METH_GET, + protocols: Iterable[str] = (), + timeout: float = 10.0, + receive_timeout: Optional[float] = None, + autoclose: bool = True, + autoping: bool = True, + heartbeat: Optional[float] = None, + auth: Optional[BasicAuth] = None, + origin: Optional[str] = None, + params: Optional[Mapping[str, str]] = None, + headers: Optional[LooseHeaders] = None, + proxy: Optional[StrOrURL] = None, + proxy_auth: Optional[BasicAuth] = None, + ssl: Union[SSLContext, bool, None, Fingerprint] = None, + verify_ssl: Optional[bool] = None, + fingerprint: Optional[bytes] = None, + ssl_context: Optional[SSLContext] = None, + proxy_headers: Optional[LooseHeaders] = None, + compress: int = 0, + max_msg_size: int = 4 * 1024 * 1024, + ) -> "_WSRequestContextManager": + """Initiate websocket connection.""" + return _WSRequestContextManager( + self._ws_connect( + url, + method=method, + protocols=protocols, + timeout=timeout, + receive_timeout=receive_timeout, + autoclose=autoclose, + autoping=autoping, + heartbeat=heartbeat, + auth=auth, + origin=origin, + params=params, + headers=headers, + proxy=proxy, + proxy_auth=proxy_auth, + ssl=ssl, + verify_ssl=verify_ssl, + fingerprint=fingerprint, + ssl_context=ssl_context, + proxy_headers=proxy_headers, + compress=compress, + max_msg_size=max_msg_size, + ) + ) + + async def _ws_connect( + self, + url: StrOrURL, + *, + method: str = hdrs.METH_GET, + protocols: Iterable[str] = (), + timeout: float = 10.0, + receive_timeout: Optional[float] = None, + autoclose: bool = True, + autoping: bool = True, + heartbeat: Optional[float] = None, + auth: Optional[BasicAuth] = None, + origin: Optional[str] = None, + params: Optional[Mapping[str, str]] = None, + headers: Optional[LooseHeaders] = None, + proxy: Optional[StrOrURL] = None, + proxy_auth: Optional[BasicAuth] = None, + ssl: Union[SSLContext, bool, None, Fingerprint] = None, + verify_ssl: Optional[bool] = None, + fingerprint: Optional[bytes] = None, + ssl_context: Optional[SSLContext] = None, + proxy_headers: Optional[LooseHeaders] = None, + compress: int = 0, + max_msg_size: int = 4 * 1024 * 1024, + ) -> ClientWebSocketResponse: + + if headers is None: + real_headers = CIMultiDict() # type: CIMultiDict[str] + else: + real_headers = CIMultiDict(headers) + + default_headers = { + hdrs.UPGRADE: "websocket", + hdrs.CONNECTION: "upgrade", + hdrs.SEC_WEBSOCKET_VERSION: "13", + } + + for key, value in default_headers.items(): + real_headers.setdefault(key, value) + + sec_key = base64.b64encode(os.urandom(16)) + real_headers[hdrs.SEC_WEBSOCKET_KEY] = sec_key.decode() + + if protocols: + real_headers[hdrs.SEC_WEBSOCKET_PROTOCOL] = ",".join(protocols) + if origin is not None: + real_headers[hdrs.ORIGIN] = origin + if compress: + extstr = ws_ext_gen(compress=compress) + real_headers[hdrs.SEC_WEBSOCKET_EXTENSIONS] = extstr + + ssl = _merge_ssl_params(ssl, verify_ssl, ssl_context, fingerprint) + + # send request + resp = await self.request( + method, + url, + params=params, + headers=real_headers, + read_until_eof=False, + auth=auth, + proxy=proxy, + proxy_auth=proxy_auth, + ssl=ssl, + proxy_headers=proxy_headers, + ) + + try: + # check handshake + if resp.status != 101: + raise WSServerHandshakeError( + resp.request_info, + resp.history, + message="Invalid response status", + status=resp.status, + headers=resp.headers, + ) + + if resp.headers.get(hdrs.UPGRADE, "").lower() != "websocket": + raise WSServerHandshakeError( + resp.request_info, + resp.history, + message="Invalid upgrade header", + status=resp.status, + headers=resp.headers, + ) + + if resp.headers.get(hdrs.CONNECTION, "").lower() != "upgrade": + raise WSServerHandshakeError( + resp.request_info, + resp.history, + message="Invalid connection header", + status=resp.status, + headers=resp.headers, + ) + + # key calculation + r_key = resp.headers.get(hdrs.SEC_WEBSOCKET_ACCEPT, "") + match = base64.b64encode(hashlib.sha1(sec_key + WS_KEY).digest()).decode() + if r_key != match: + raise WSServerHandshakeError( + resp.request_info, + resp.history, + message="Invalid challenge response", + status=resp.status, + headers=resp.headers, + ) + + # websocket protocol + protocol = None + if protocols and hdrs.SEC_WEBSOCKET_PROTOCOL in resp.headers: + resp_protocols = [ + proto.strip() + for proto in resp.headers[hdrs.SEC_WEBSOCKET_PROTOCOL].split(",") + ] + + for proto in resp_protocols: + if proto in protocols: + protocol = proto + break + + # websocket compress + notakeover = False + if compress: + compress_hdrs = resp.headers.get(hdrs.SEC_WEBSOCKET_EXTENSIONS) + if compress_hdrs: + try: + compress, notakeover = ws_ext_parse(compress_hdrs) + except WSHandshakeError as exc: + raise WSServerHandshakeError( + resp.request_info, + resp.history, + message=exc.args[0], + status=resp.status, + headers=resp.headers, + ) from exc + else: + compress = 0 + notakeover = False + + conn = resp.connection + assert conn is not None + conn_proto = conn.protocol + assert conn_proto is not None + transport = conn.transport + assert transport is not None + reader = FlowControlDataQueue( + conn_proto, 2 ** 16, loop=self._loop + ) # type: FlowControlDataQueue[WSMessage] + conn_proto.set_parser(WebSocketReader(reader, max_msg_size), reader) + writer = WebSocketWriter( + conn_proto, + transport, + use_mask=True, + compress=compress, + notakeover=notakeover, + ) + except BaseException: + resp.close() + raise + else: + return self._ws_response_class( + reader, + writer, + protocol, + resp, + timeout, + autoclose, + autoping, + self._loop, + receive_timeout=receive_timeout, + heartbeat=heartbeat, + compress=compress, + client_notakeover=notakeover, + ) + + def _prepare_headers(self, headers: Optional[LooseHeaders]) -> "CIMultiDict[str]": + """Add default headers and transform it to CIMultiDict""" + # Convert headers to MultiDict + result = CIMultiDict(self._default_headers) + if headers: + if not isinstance(headers, (MultiDictProxy, MultiDict)): + headers = CIMultiDict(headers) + added_names = set() # type: Set[str] + for key, value in headers.items(): + if key in added_names: + result.add(key, value) + else: + result[key] = value + added_names.add(key) + return result + + def get( + self, url: StrOrURL, *, allow_redirects: bool = True, **kwargs: Any + ) -> "_RequestContextManager": + """Perform HTTP GET request.""" + return _RequestContextManager( + self._request(hdrs.METH_GET, url, allow_redirects=allow_redirects, **kwargs) + ) + + def options( + self, url: StrOrURL, *, allow_redirects: bool = True, **kwargs: Any + ) -> "_RequestContextManager": + """Perform HTTP OPTIONS request.""" + return _RequestContextManager( + self._request( + hdrs.METH_OPTIONS, url, allow_redirects=allow_redirects, **kwargs + ) + ) + + def head( + self, url: StrOrURL, *, allow_redirects: bool = False, **kwargs: Any + ) -> "_RequestContextManager": + """Perform HTTP HEAD request.""" + return _RequestContextManager( + self._request( + hdrs.METH_HEAD, url, allow_redirects=allow_redirects, **kwargs + ) + ) + + def post( + self, url: StrOrURL, *, data: Any = None, **kwargs: Any + ) -> "_RequestContextManager": + """Perform HTTP POST request.""" + return _RequestContextManager( + self._request(hdrs.METH_POST, url, data=data, **kwargs) + ) + + def put( + self, url: StrOrURL, *, data: Any = None, **kwargs: Any + ) -> "_RequestContextManager": + """Perform HTTP PUT request.""" + return _RequestContextManager( + self._request(hdrs.METH_PUT, url, data=data, **kwargs) + ) + + def patch( + self, url: StrOrURL, *, data: Any = None, **kwargs: Any + ) -> "_RequestContextManager": + """Perform HTTP PATCH request.""" + return _RequestContextManager( + self._request(hdrs.METH_PATCH, url, data=data, **kwargs) + ) + + def delete(self, url: StrOrURL, **kwargs: Any) -> "_RequestContextManager": + """Perform HTTP DELETE request.""" + return _RequestContextManager(self._request(hdrs.METH_DELETE, url, **kwargs)) + + async def close(self) -> None: + """Close underlying connector. + + Release all acquired resources. + """ + if not self.closed: + if self._connector is not None and self._connector_owner: + await self._connector.close() + self._connector = None + + @property + def closed(self) -> bool: + """Is client session closed. + + A readonly property. + """ + return self._connector is None or self._connector.closed + + @property + def connector(self) -> Optional[BaseConnector]: + """Connector instance used for the session.""" + return self._connector + + @property + def cookie_jar(self) -> AbstractCookieJar: + """The session cookies.""" + return self._cookie_jar + + @property + def version(self) -> Tuple[int, int]: + """The session HTTP protocol version.""" + return self._version + + @property + def requote_redirect_url(self) -> bool: + """Do URL requoting on redirection handling.""" + return self._requote_redirect_url + + @requote_redirect_url.setter + def requote_redirect_url(self, val: bool) -> None: + """Do URL requoting on redirection handling.""" + warnings.warn( + "session.requote_redirect_url modification " "is deprecated #2778", + DeprecationWarning, + stacklevel=2, + ) + self._requote_redirect_url = val + + @property + def loop(self) -> asyncio.AbstractEventLoop: + """Session's loop.""" + warnings.warn( + "client.loop property is deprecated", DeprecationWarning, stacklevel=2 + ) + return self._loop + + @property + def timeout(self) -> Union[object, ClientTimeout]: + """Timeout for the session.""" + return self._timeout + + @property + def headers(self) -> "CIMultiDict[str]": + """The default headers of the client session.""" + return self._default_headers + + @property + def skip_auto_headers(self) -> FrozenSet[istr]: + """Headers for which autogeneration should be skipped""" + return self._skip_auto_headers + + @property + def auth(self) -> Optional[BasicAuth]: + """An object that represents HTTP Basic Authorization""" + return self._default_auth + + @property + def json_serialize(self) -> JSONEncoder: + """Json serializer callable""" + return self._json_serialize + + @property + def connector_owner(self) -> bool: + """Should connector be closed on session closing""" + return self._connector_owner + + @property + def raise_for_status( + self, + ) -> Union[bool, Callable[[ClientResponse], Awaitable[None]]]: + """Should `ClientResponse.raise_for_status()` be called for each response.""" + return self._raise_for_status + + @property + def auto_decompress(self) -> bool: + """Should the body response be automatically decompressed.""" + return self._auto_decompress + + @property + def trust_env(self) -> bool: + """ + Should proxies information from environment or netrc be trusted. + + Information is from HTTP_PROXY / HTTPS_PROXY environment variables + or ~/.netrc file if present. + """ + return self._trust_env + + @property + def trace_configs(self) -> List[TraceConfig]: + """A list of TraceConfig instances used for client tracing""" + return self._trace_configs + + def detach(self) -> None: + """Detach connector from session without closing the former. + + Session is switched to closed state anyway. + """ + self._connector = None + + def __enter__(self) -> None: + raise TypeError("Use async with instead") + + def __exit__( + self, + exc_type: Optional[Type[BaseException]], + exc_val: Optional[BaseException], + exc_tb: Optional[TracebackType], + ) -> None: + # __exit__ should exist in pair with __enter__ but never executed + pass # pragma: no cover + + async def __aenter__(self) -> "ClientSession": + return self + + async def __aexit__( + self, + exc_type: Optional[Type[BaseException]], + exc_val: Optional[BaseException], + exc_tb: Optional[TracebackType], + ) -> None: + await self.close() + + +class _BaseRequestContextManager(Coroutine[Any, Any, _RetType], Generic[_RetType]): + + __slots__ = ("_coro", "_resp") + + def __init__(self, coro: Coroutine["asyncio.Future[Any]", None, _RetType]) -> None: + self._coro = coro + + def send(self, arg: None) -> "asyncio.Future[Any]": + return self._coro.send(arg) + + def throw(self, arg: BaseException) -> None: # type: ignore[arg-type,override] + self._coro.throw(arg) + + def close(self) -> None: + return self._coro.close() + + def __await__(self) -> Generator[Any, None, _RetType]: + ret = self._coro.__await__() + return ret + + def __iter__(self) -> Generator[Any, None, _RetType]: + return self.__await__() + + async def __aenter__(self) -> _RetType: + self._resp = await self._coro + return self._resp + + +class _RequestContextManager(_BaseRequestContextManager[ClientResponse]): + __slots__ = () + + async def __aexit__( + self, + exc_type: Optional[Type[BaseException]], + exc: Optional[BaseException], + tb: Optional[TracebackType], + ) -> None: + # We're basing behavior on the exception as it can be caused by + # user code unrelated to the status of the connection. If you + # would like to close a connection you must do that + # explicitly. Otherwise connection error handling should kick in + # and close/recycle the connection as required. + self._resp.release() + + +class _WSRequestContextManager(_BaseRequestContextManager[ClientWebSocketResponse]): + __slots__ = () + + async def __aexit__( + self, + exc_type: Optional[Type[BaseException]], + exc: Optional[BaseException], + tb: Optional[TracebackType], + ) -> None: + await self._resp.close() + + +class _SessionRequestContextManager: + + __slots__ = ("_coro", "_resp", "_session") + + def __init__( + self, + coro: Coroutine["asyncio.Future[Any]", None, ClientResponse], + session: ClientSession, + ) -> None: + self._coro = coro + self._resp = None # type: Optional[ClientResponse] + self._session = session + + async def __aenter__(self) -> ClientResponse: + try: + self._resp = await self._coro + except BaseException: + await self._session.close() + raise + else: + return self._resp + + async def __aexit__( + self, + exc_type: Optional[Type[BaseException]], + exc: Optional[BaseException], + tb: Optional[TracebackType], + ) -> None: + assert self._resp is not None + self._resp.close() + await self._session.close() + + +def request( + method: str, + url: StrOrURL, + *, + params: Optional[Mapping[str, str]] = None, + data: Any = None, + json: Any = None, + headers: Optional[LooseHeaders] = None, + skip_auto_headers: Optional[Iterable[str]] = None, + auth: Optional[BasicAuth] = None, + allow_redirects: bool = True, + max_redirects: int = 10, + compress: Optional[str] = None, + chunked: Optional[bool] = None, + expect100: bool = False, + raise_for_status: Optional[bool] = None, + read_until_eof: bool = True, + proxy: Optional[StrOrURL] = None, + proxy_auth: Optional[BasicAuth] = None, + timeout: Union[ClientTimeout, object] = sentinel, + cookies: Optional[LooseCookies] = None, + version: HttpVersion = http.HttpVersion11, + connector: Optional[BaseConnector] = None, + read_bufsize: Optional[int] = None, + loop: Optional[asyncio.AbstractEventLoop] = None, +) -> _SessionRequestContextManager: + """Constructs and sends a request. + + Returns response object. + method - HTTP method + url - request url + params - (optional) Dictionary or bytes to be sent in the query + string of the new request + data - (optional) Dictionary, bytes, or file-like object to + send in the body of the request + json - (optional) Any json compatible python object + headers - (optional) Dictionary of HTTP Headers to send with + the request + cookies - (optional) Dict object to send with the request + auth - (optional) BasicAuth named tuple represent HTTP Basic Auth + auth - aiohttp.helpers.BasicAuth + allow_redirects - (optional) If set to False, do not follow + redirects + version - Request HTTP version. + compress - Set to True if request has to be compressed + with deflate encoding. + chunked - Set to chunk size for chunked transfer encoding. + expect100 - Expect 100-continue response from server. + connector - BaseConnector sub-class instance to support + connection pooling. + read_until_eof - Read response until eof if response + does not have Content-Length header. + loop - Optional event loop. + timeout - Optional ClientTimeout settings structure, 5min + total timeout by default. + Usage:: + >>> import aiohttp + >>> resp = await aiohttp.request('GET', 'http://python.org/') + >>> resp + + >>> data = await resp.read() + """ + connector_owner = False + if connector is None: + connector_owner = True + connector = TCPConnector(loop=loop, force_close=True) + + session = ClientSession( + loop=loop, + cookies=cookies, + version=version, + timeout=timeout, + connector=connector, + connector_owner=connector_owner, + ) + + return _SessionRequestContextManager( + session._request( + method, + url, + params=params, + data=data, + json=json, + headers=headers, + skip_auto_headers=skip_auto_headers, + auth=auth, + allow_redirects=allow_redirects, + max_redirects=max_redirects, + compress=compress, + chunked=chunked, + expect100=expect100, + raise_for_status=raise_for_status, + read_until_eof=read_until_eof, + proxy=proxy, + proxy_auth=proxy_auth, + read_bufsize=read_bufsize, + ), + session, + ) diff --git a/sbsheriff/Lib/site-packages/aiohttp/client_exceptions.py b/sbsheriff/Lib/site-packages/aiohttp/client_exceptions.py new file mode 100644 index 0000000..dd55321 --- /dev/null +++ b/sbsheriff/Lib/site-packages/aiohttp/client_exceptions.py @@ -0,0 +1,342 @@ +"""HTTP related errors.""" + +import asyncio +import warnings +from typing import TYPE_CHECKING, Any, Optional, Tuple, Union + +from .http_parser import RawResponseMessage +from .typedefs import LooseHeaders + +try: + import ssl + + SSLContext = ssl.SSLContext +except ImportError: # pragma: no cover + ssl = SSLContext = None # type: ignore[assignment] + + +if TYPE_CHECKING: # pragma: no cover + from .client_reqrep import ClientResponse, ConnectionKey, Fingerprint, RequestInfo +else: + RequestInfo = ClientResponse = ConnectionKey = None + +__all__ = ( + "ClientError", + "ClientConnectionError", + "ClientOSError", + "ClientConnectorError", + "ClientProxyConnectionError", + "ClientSSLError", + "ClientConnectorSSLError", + "ClientConnectorCertificateError", + "ServerConnectionError", + "ServerTimeoutError", + "ServerDisconnectedError", + "ServerFingerprintMismatch", + "ClientResponseError", + "ClientHttpProxyError", + "WSServerHandshakeError", + "ContentTypeError", + "ClientPayloadError", + "InvalidURL", +) + + +class ClientError(Exception): + """Base class for client connection errors.""" + + +class ClientResponseError(ClientError): + """Connection error during reading response. + + request_info: instance of RequestInfo + """ + + def __init__( + self, + request_info: RequestInfo, + history: Tuple[ClientResponse, ...], + *, + code: Optional[int] = None, + status: Optional[int] = None, + message: str = "", + headers: Optional[LooseHeaders] = None, + ) -> None: + self.request_info = request_info + if code is not None: + if status is not None: + raise ValueError( + "Both code and status arguments are provided; " + "code is deprecated, use status instead" + ) + warnings.warn( + "code argument is deprecated, use status instead", + DeprecationWarning, + stacklevel=2, + ) + if status is not None: + self.status = status + elif code is not None: + self.status = code + else: + self.status = 0 + self.message = message + self.headers = headers + self.history = history + self.args = (request_info, history) + + def __str__(self) -> str: + return "{}, message={!r}, url={!r}".format( + self.status, + self.message, + self.request_info.real_url, + ) + + def __repr__(self) -> str: + args = f"{self.request_info!r}, {self.history!r}" + if self.status != 0: + args += f", status={self.status!r}" + if self.message != "": + args += f", message={self.message!r}" + if self.headers is not None: + args += f", headers={self.headers!r}" + return f"{type(self).__name__}({args})" + + @property + def code(self) -> int: + warnings.warn( + "code property is deprecated, use status instead", + DeprecationWarning, + stacklevel=2, + ) + return self.status + + @code.setter + def code(self, value: int) -> None: + warnings.warn( + "code property is deprecated, use status instead", + DeprecationWarning, + stacklevel=2, + ) + self.status = value + + +class ContentTypeError(ClientResponseError): + """ContentType found is not valid.""" + + +class WSServerHandshakeError(ClientResponseError): + """websocket server handshake error.""" + + +class ClientHttpProxyError(ClientResponseError): + """HTTP proxy error. + + Raised in :class:`aiohttp.connector.TCPConnector` if + proxy responds with status other than ``200 OK`` + on ``CONNECT`` request. + """ + + +class TooManyRedirects(ClientResponseError): + """Client was redirected too many times.""" + + +class ClientConnectionError(ClientError): + """Base class for client socket errors.""" + + +class ClientOSError(ClientConnectionError, OSError): + """OSError error.""" + + +class ClientConnectorError(ClientOSError): + """Client connector error. + + Raised in :class:`aiohttp.connector.TCPConnector` if + connection to proxy can not be established. + """ + + def __init__(self, connection_key: ConnectionKey, os_error: OSError) -> None: + self._conn_key = connection_key + self._os_error = os_error + super().__init__(os_error.errno, os_error.strerror) + self.args = (connection_key, os_error) + + @property + def os_error(self) -> OSError: + return self._os_error + + @property + def host(self) -> str: + return self._conn_key.host + + @property + def port(self) -> Optional[int]: + return self._conn_key.port + + @property + def ssl(self) -> Union[SSLContext, None, bool, "Fingerprint"]: + return self._conn_key.ssl + + def __str__(self) -> str: + return "Cannot connect to host {0.host}:{0.port} ssl:{1} [{2}]".format( + self, self.ssl if self.ssl is not None else "default", self.strerror + ) + + # OSError.__reduce__ does too much black magick + __reduce__ = BaseException.__reduce__ + + +class ClientProxyConnectionError(ClientConnectorError): + """Proxy connection error. + + Raised in :class:`aiohttp.connector.TCPConnector` if + connection to proxy can not be established. + """ + + +class UnixClientConnectorError(ClientConnectorError): + """Unix connector error. + + Raised in :py:class:`aiohttp.connector.UnixConnector` + if connection to unix socket can not be established. + """ + + def __init__( + self, path: str, connection_key: ConnectionKey, os_error: OSError + ) -> None: + self._path = path + super().__init__(connection_key, os_error) + + @property + def path(self) -> str: + return self._path + + def __str__(self) -> str: + return "Cannot connect to unix socket {0.path} ssl:{1} [{2}]".format( + self, self.ssl if self.ssl is not None else "default", self.strerror + ) + + +class ServerConnectionError(ClientConnectionError): + """Server connection errors.""" + + +class ServerDisconnectedError(ServerConnectionError): + """Server disconnected.""" + + def __init__(self, message: Union[RawResponseMessage, str, None] = None) -> None: + if message is None: + message = "Server disconnected" + + self.args = (message,) + self.message = message + + +class ServerTimeoutError(ServerConnectionError, asyncio.TimeoutError): + """Server timeout error.""" + + +class ServerFingerprintMismatch(ServerConnectionError): + """SSL certificate does not match expected fingerprint.""" + + def __init__(self, expected: bytes, got: bytes, host: str, port: int) -> None: + self.expected = expected + self.got = got + self.host = host + self.port = port + self.args = (expected, got, host, port) + + def __repr__(self) -> str: + return "<{} expected={!r} got={!r} host={!r} port={!r}>".format( + self.__class__.__name__, self.expected, self.got, self.host, self.port + ) + + +class ClientPayloadError(ClientError): + """Response payload error.""" + + +class InvalidURL(ClientError, ValueError): + """Invalid URL. + + URL used for fetching is malformed, e.g. it doesn't contains host + part. + """ + + # Derive from ValueError for backward compatibility + + def __init__(self, url: Any) -> None: + # The type of url is not yarl.URL because the exception can be raised + # on URL(url) call + super().__init__(url) + + @property + def url(self) -> Any: + return self.args[0] + + def __repr__(self) -> str: + return f"<{self.__class__.__name__} {self.url}>" + + +class ClientSSLError(ClientConnectorError): + """Base error for ssl.*Errors.""" + + +if ssl is not None: + cert_errors = (ssl.CertificateError,) + cert_errors_bases = ( + ClientSSLError, + ssl.CertificateError, + ) + + ssl_errors = (ssl.SSLError,) + ssl_error_bases = (ClientSSLError, ssl.SSLError) +else: # pragma: no cover + cert_errors = tuple() + cert_errors_bases = ( + ClientSSLError, + ValueError, + ) + + ssl_errors = tuple() + ssl_error_bases = (ClientSSLError,) + + +class ClientConnectorSSLError(*ssl_error_bases): # type: ignore[misc] + """Response ssl error.""" + + +class ClientConnectorCertificateError(*cert_errors_bases): # type: ignore[misc] + """Response certificate error.""" + + def __init__( + self, connection_key: ConnectionKey, certificate_error: Exception + ) -> None: + self._conn_key = connection_key + self._certificate_error = certificate_error + self.args = (connection_key, certificate_error) + + @property + def certificate_error(self) -> Exception: + return self._certificate_error + + @property + def host(self) -> str: + return self._conn_key.host + + @property + def port(self) -> Optional[int]: + return self._conn_key.port + + @property + def ssl(self) -> bool: + return self._conn_key.is_ssl + + def __str__(self) -> str: + return ( + "Cannot connect to host {0.host}:{0.port} ssl:{0.ssl} " + "[{0.certificate_error.__class__.__name__}: " + "{0.certificate_error.args}]".format(self) + ) diff --git a/sbsheriff/Lib/site-packages/aiohttp/client_proto.py b/sbsheriff/Lib/site-packages/aiohttp/client_proto.py new file mode 100644 index 0000000..f36863b --- /dev/null +++ b/sbsheriff/Lib/site-packages/aiohttp/client_proto.py @@ -0,0 +1,251 @@ +import asyncio +from contextlib import suppress +from typing import Any, Optional, Tuple + +from .base_protocol import BaseProtocol +from .client_exceptions import ( + ClientOSError, + ClientPayloadError, + ServerDisconnectedError, + ServerTimeoutError, +) +from .helpers import BaseTimerContext +from .http import HttpResponseParser, RawResponseMessage +from .streams import EMPTY_PAYLOAD, DataQueue, StreamReader + + +class ResponseHandler(BaseProtocol, DataQueue[Tuple[RawResponseMessage, StreamReader]]): + """Helper class to adapt between Protocol and StreamReader.""" + + def __init__(self, loop: asyncio.AbstractEventLoop) -> None: + BaseProtocol.__init__(self, loop=loop) + DataQueue.__init__(self, loop) + + self._should_close = False + + self._payload: Optional[StreamReader] = None + self._skip_payload = False + self._payload_parser = None + + self._timer = None + + self._tail = b"" + self._upgraded = False + self._parser = None # type: Optional[HttpResponseParser] + + self._read_timeout = None # type: Optional[float] + self._read_timeout_handle = None # type: Optional[asyncio.TimerHandle] + + @property + def upgraded(self) -> bool: + return self._upgraded + + @property + def should_close(self) -> bool: + if self._payload is not None and not self._payload.is_eof() or self._upgraded: + return True + + return ( + self._should_close + or self._upgraded + or self.exception() is not None + or self._payload_parser is not None + or len(self) > 0 + or bool(self._tail) + ) + + def force_close(self) -> None: + self._should_close = True + + def close(self) -> None: + transport = self.transport + if transport is not None: + transport.close() + self.transport = None + self._payload = None + self._drop_timeout() + + def is_connected(self) -> bool: + return self.transport is not None and not self.transport.is_closing() + + def connection_lost(self, exc: Optional[BaseException]) -> None: + self._drop_timeout() + + if self._payload_parser is not None: + with suppress(Exception): + self._payload_parser.feed_eof() + + uncompleted = None + if self._parser is not None: + try: + uncompleted = self._parser.feed_eof() + except Exception: + if self._payload is not None: + self._payload.set_exception( + ClientPayloadError("Response payload is not completed") + ) + + if not self.is_eof(): + if isinstance(exc, OSError): + exc = ClientOSError(*exc.args) + if exc is None: + exc = ServerDisconnectedError(uncompleted) + # assigns self._should_close to True as side effect, + # we do it anyway below + self.set_exception(exc) + + self._should_close = True + self._parser = None + self._payload = None + self._payload_parser = None + self._reading_paused = False + + super().connection_lost(exc) + + def eof_received(self) -> None: + # should call parser.feed_eof() most likely + self._drop_timeout() + + def pause_reading(self) -> None: + super().pause_reading() + self._drop_timeout() + + def resume_reading(self) -> None: + super().resume_reading() + self._reschedule_timeout() + + def set_exception(self, exc: BaseException) -> None: + self._should_close = True + self._drop_timeout() + super().set_exception(exc) + + def set_parser(self, parser: Any, payload: Any) -> None: + # TODO: actual types are: + # parser: WebSocketReader + # payload: FlowControlDataQueue + # but they are not generi enough + # Need an ABC for both types + self._payload = payload + self._payload_parser = parser + + self._drop_timeout() + + if self._tail: + data, self._tail = self._tail, b"" + self.data_received(data) + + def set_response_params( + self, + *, + timer: Optional[BaseTimerContext] = None, + skip_payload: bool = False, + read_until_eof: bool = False, + auto_decompress: bool = True, + read_timeout: Optional[float] = None, + read_bufsize: int = 2 ** 16, + ) -> None: + self._skip_payload = skip_payload + + self._read_timeout = read_timeout + self._reschedule_timeout() + + self._parser = HttpResponseParser( + self, + self._loop, + read_bufsize, + timer=timer, + payload_exception=ClientPayloadError, + response_with_body=not skip_payload, + read_until_eof=read_until_eof, + auto_decompress=auto_decompress, + ) + + if self._tail: + data, self._tail = self._tail, b"" + self.data_received(data) + + def _drop_timeout(self) -> None: + if self._read_timeout_handle is not None: + self._read_timeout_handle.cancel() + self._read_timeout_handle = None + + def _reschedule_timeout(self) -> None: + timeout = self._read_timeout + if self._read_timeout_handle is not None: + self._read_timeout_handle.cancel() + + if timeout: + self._read_timeout_handle = self._loop.call_later( + timeout, self._on_read_timeout + ) + else: + self._read_timeout_handle = None + + def _on_read_timeout(self) -> None: + exc = ServerTimeoutError("Timeout on reading data from socket") + self.set_exception(exc) + if self._payload is not None: + self._payload.set_exception(exc) + + def data_received(self, data: bytes) -> None: + self._reschedule_timeout() + + if not data: + return + + # custom payload parser + if self._payload_parser is not None: + eof, tail = self._payload_parser.feed_data(data) + if eof: + self._payload = None + self._payload_parser = None + + if tail: + self.data_received(tail) + return + else: + if self._upgraded or self._parser is None: + # i.e. websocket connection, websocket parser is not set yet + self._tail += data + else: + # parse http messages + try: + messages, upgraded, tail = self._parser.feed_data(data) + except BaseException as exc: + if self.transport is not None: + # connection.release() could be called BEFORE + # data_received(), the transport is already + # closed in this case + self.transport.close() + # should_close is True after the call + self.set_exception(exc) + return + + self._upgraded = upgraded + + payload: Optional[StreamReader] = None + for message, payload in messages: + if message.should_close: + self._should_close = True + + self._payload = payload + + if self._skip_payload or message.code in (204, 304): + self.feed_data((message, EMPTY_PAYLOAD), 0) + else: + self.feed_data((message, payload), 0) + if payload is not None: + # new message(s) was processed + # register timeout handler unsubscribing + # either on end-of-stream or immediately for + # EMPTY_PAYLOAD + if payload is not EMPTY_PAYLOAD: + payload.on_eof(self._drop_timeout) + else: + self._drop_timeout() + + if tail: + if upgraded: + self.data_received(tail) + else: + self._tail = tail diff --git a/sbsheriff/Lib/site-packages/aiohttp/client_reqrep.py b/sbsheriff/Lib/site-packages/aiohttp/client_reqrep.py new file mode 100644 index 0000000..3430025 --- /dev/null +++ b/sbsheriff/Lib/site-packages/aiohttp/client_reqrep.py @@ -0,0 +1,1133 @@ +import asyncio +import codecs +import functools +import io +import re +import sys +import traceback +import warnings +from hashlib import md5, sha1, sha256 +from http.cookies import CookieError, Morsel, SimpleCookie +from types import MappingProxyType, TracebackType +from typing import ( + TYPE_CHECKING, + Any, + Dict, + Iterable, + List, + Mapping, + Optional, + Tuple, + Type, + Union, + cast, +) + +import attr +from multidict import CIMultiDict, CIMultiDictProxy, MultiDict, MultiDictProxy +from yarl import URL + +from . import hdrs, helpers, http, multipart, payload +from .abc import AbstractStreamWriter +from .client_exceptions import ( + ClientConnectionError, + ClientOSError, + ClientResponseError, + ContentTypeError, + InvalidURL, + ServerFingerprintMismatch, +) +from .formdata import FormData +from .helpers import ( + PY_36, + BaseTimerContext, + BasicAuth, + HeadersMixin, + TimerNoop, + noop, + reify, + set_result, +) +from .http import SERVER_SOFTWARE, HttpVersion10, HttpVersion11, StreamWriter +from .log import client_logger +from .streams import StreamReader +from .typedefs import ( + DEFAULT_JSON_DECODER, + JSONDecoder, + LooseCookies, + LooseHeaders, + RawHeaders, +) + +try: + import ssl + from ssl import SSLContext +except ImportError: # pragma: no cover + ssl = None # type: ignore[assignment] + SSLContext = object # type: ignore[misc,assignment] + +try: + import cchardet as chardet +except ImportError: # pragma: no cover + import charset_normalizer as chardet # type: ignore[no-redef] + + +__all__ = ("ClientRequest", "ClientResponse", "RequestInfo", "Fingerprint") + + +if TYPE_CHECKING: # pragma: no cover + from .client import ClientSession + from .connector import Connection + from .tracing import Trace + + +json_re = re.compile(r"^application/(?:[\w.+-]+?\+)?json") + + +@attr.s(auto_attribs=True, frozen=True, slots=True) +class ContentDisposition: + type: Optional[str] + parameters: "MappingProxyType[str, str]" + filename: Optional[str] + + +@attr.s(auto_attribs=True, frozen=True, slots=True) +class RequestInfo: + url: URL + method: str + headers: "CIMultiDictProxy[str]" + real_url: URL = attr.ib() + + @real_url.default + def real_url_default(self) -> URL: + return self.url + + +class Fingerprint: + HASHFUNC_BY_DIGESTLEN = { + 16: md5, + 20: sha1, + 32: sha256, + } + + def __init__(self, fingerprint: bytes) -> None: + digestlen = len(fingerprint) + hashfunc = self.HASHFUNC_BY_DIGESTLEN.get(digestlen) + if not hashfunc: + raise ValueError("fingerprint has invalid length") + elif hashfunc is md5 or hashfunc is sha1: + raise ValueError( + "md5 and sha1 are insecure and " "not supported. Use sha256." + ) + self._hashfunc = hashfunc + self._fingerprint = fingerprint + + @property + def fingerprint(self) -> bytes: + return self._fingerprint + + def check(self, transport: asyncio.Transport) -> None: + if not transport.get_extra_info("sslcontext"): + return + sslobj = transport.get_extra_info("ssl_object") + cert = sslobj.getpeercert(binary_form=True) + got = self._hashfunc(cert).digest() + if got != self._fingerprint: + host, port, *_ = transport.get_extra_info("peername") + raise ServerFingerprintMismatch(self._fingerprint, got, host, port) + + +if ssl is not None: + SSL_ALLOWED_TYPES = (ssl.SSLContext, bool, Fingerprint, type(None)) +else: # pragma: no cover + SSL_ALLOWED_TYPES = type(None) + + +def _merge_ssl_params( + ssl: Union["SSLContext", bool, Fingerprint, None], + verify_ssl: Optional[bool], + ssl_context: Optional["SSLContext"], + fingerprint: Optional[bytes], +) -> Union["SSLContext", bool, Fingerprint, None]: + if verify_ssl is not None and not verify_ssl: + warnings.warn( + "verify_ssl is deprecated, use ssl=False instead", + DeprecationWarning, + stacklevel=3, + ) + if ssl is not None: + raise ValueError( + "verify_ssl, ssl_context, fingerprint and ssl " + "parameters are mutually exclusive" + ) + else: + ssl = False + if ssl_context is not None: + warnings.warn( + "ssl_context is deprecated, use ssl=context instead", + DeprecationWarning, + stacklevel=3, + ) + if ssl is not None: + raise ValueError( + "verify_ssl, ssl_context, fingerprint and ssl " + "parameters are mutually exclusive" + ) + else: + ssl = ssl_context + if fingerprint is not None: + warnings.warn( + "fingerprint is deprecated, " "use ssl=Fingerprint(fingerprint) instead", + DeprecationWarning, + stacklevel=3, + ) + if ssl is not None: + raise ValueError( + "verify_ssl, ssl_context, fingerprint and ssl " + "parameters are mutually exclusive" + ) + else: + ssl = Fingerprint(fingerprint) + if not isinstance(ssl, SSL_ALLOWED_TYPES): + raise TypeError( + "ssl should be SSLContext, bool, Fingerprint or None, " + "got {!r} instead.".format(ssl) + ) + return ssl + + +@attr.s(auto_attribs=True, slots=True, frozen=True) +class ConnectionKey: + # the key should contain an information about used proxy / TLS + # to prevent reusing wrong connections from a pool + host: str + port: Optional[int] + is_ssl: bool + ssl: Union[SSLContext, None, bool, Fingerprint] + proxy: Optional[URL] + proxy_auth: Optional[BasicAuth] + proxy_headers_hash: Optional[int] # hash(CIMultiDict) + + +def _is_expected_content_type( + response_content_type: str, expected_content_type: str +) -> bool: + if expected_content_type == "application/json": + return json_re.match(response_content_type) is not None + return expected_content_type in response_content_type + + +class ClientRequest: + GET_METHODS = { + hdrs.METH_GET, + hdrs.METH_HEAD, + hdrs.METH_OPTIONS, + hdrs.METH_TRACE, + } + POST_METHODS = {hdrs.METH_PATCH, hdrs.METH_POST, hdrs.METH_PUT} + ALL_METHODS = GET_METHODS.union(POST_METHODS).union({hdrs.METH_DELETE}) + + DEFAULT_HEADERS = { + hdrs.ACCEPT: "*/*", + hdrs.ACCEPT_ENCODING: "gzip, deflate", + } + + body = b"" + auth = None + response = None + + _writer = None # async task for streaming data + _continue = None # waiter future for '100 Continue' response + + # N.B. + # Adding __del__ method with self._writer closing doesn't make sense + # because _writer is instance method, thus it keeps a reference to self. + # Until writer has finished finalizer will not be called. + + def __init__( + self, + method: str, + url: URL, + *, + params: Optional[Mapping[str, str]] = None, + headers: Optional[LooseHeaders] = None, + skip_auto_headers: Iterable[str] = frozenset(), + data: Any = None, + cookies: Optional[LooseCookies] = None, + auth: Optional[BasicAuth] = None, + version: http.HttpVersion = http.HttpVersion11, + compress: Optional[str] = None, + chunked: Optional[bool] = None, + expect100: bool = False, + loop: Optional[asyncio.AbstractEventLoop] = None, + response_class: Optional[Type["ClientResponse"]] = None, + proxy: Optional[URL] = None, + proxy_auth: Optional[BasicAuth] = None, + timer: Optional[BaseTimerContext] = None, + session: Optional["ClientSession"] = None, + ssl: Union[SSLContext, bool, Fingerprint, None] = None, + proxy_headers: Optional[LooseHeaders] = None, + traces: Optional[List["Trace"]] = None, + ): + + if loop is None: + loop = asyncio.get_event_loop() + + assert isinstance(url, URL), url + assert isinstance(proxy, (URL, type(None))), proxy + # FIXME: session is None in tests only, need to fix tests + # assert session is not None + self._session = cast("ClientSession", session) + if params: + q = MultiDict(url.query) + url2 = url.with_query(params) + q.extend(url2.query) + url = url.with_query(q) + self.original_url = url + self.url = url.with_fragment(None) + self.method = method.upper() + self.chunked = chunked + self.compress = compress + self.loop = loop + self.length = None + if response_class is None: + real_response_class = ClientResponse + else: + real_response_class = response_class + self.response_class = real_response_class # type: Type[ClientResponse] + self._timer = timer if timer is not None else TimerNoop() + self._ssl = ssl + + if loop.get_debug(): + self._source_traceback = traceback.extract_stack(sys._getframe(1)) + + self.update_version(version) + self.update_host(url) + self.update_headers(headers) + self.update_auto_headers(skip_auto_headers) + self.update_cookies(cookies) + self.update_content_encoding(data) + self.update_auth(auth) + self.update_proxy(proxy, proxy_auth, proxy_headers) + + self.update_body_from_data(data) + if data is not None or self.method not in self.GET_METHODS: + self.update_transfer_encoding() + self.update_expect_continue(expect100) + if traces is None: + traces = [] + self._traces = traces + + def is_ssl(self) -> bool: + return self.url.scheme in ("https", "wss") + + @property + def ssl(self) -> Union["SSLContext", None, bool, Fingerprint]: + return self._ssl + + @property + def connection_key(self) -> ConnectionKey: + proxy_headers = self.proxy_headers + if proxy_headers: + h = hash( + tuple((k, v) for k, v in proxy_headers.items()) + ) # type: Optional[int] + else: + h = None + return ConnectionKey( + self.host, + self.port, + self.is_ssl(), + self.ssl, + self.proxy, + self.proxy_auth, + h, + ) + + @property + def host(self) -> str: + ret = self.url.raw_host + assert ret is not None + return ret + + @property + def port(self) -> Optional[int]: + return self.url.port + + @property + def request_info(self) -> RequestInfo: + headers = CIMultiDictProxy(self.headers) # type: CIMultiDictProxy[str] + return RequestInfo(self.url, self.method, headers, self.original_url) + + def update_host(self, url: URL) -> None: + """Update destination host, port and connection type (ssl).""" + # get host/port + if not url.raw_host: + raise InvalidURL(url) + + # basic auth info + username, password = url.user, url.password + if username: + self.auth = helpers.BasicAuth(username, password or "") + + def update_version(self, version: Union[http.HttpVersion, str]) -> None: + """Convert request version to two elements tuple. + + parser HTTP version '1.1' => (1, 1) + """ + if isinstance(version, str): + v = [part.strip() for part in version.split(".", 1)] + try: + version = http.HttpVersion(int(v[0]), int(v[1])) + except ValueError: + raise ValueError( + f"Can not parse http version number: {version}" + ) from None + self.version = version + + def update_headers(self, headers: Optional[LooseHeaders]) -> None: + """Update request headers.""" + self.headers = CIMultiDict() # type: CIMultiDict[str] + + # add host + netloc = cast(str, self.url.raw_host) + if helpers.is_ipv6_address(netloc): + netloc = f"[{netloc}]" + if self.url.port is not None and not self.url.is_default_port(): + netloc += ":" + str(self.url.port) + self.headers[hdrs.HOST] = netloc + + if headers: + if isinstance(headers, (dict, MultiDictProxy, MultiDict)): + headers = headers.items() # type: ignore[assignment] + + for key, value in headers: # type: ignore[misc] + # A special case for Host header + if key.lower() == "host": + self.headers[key] = value + else: + self.headers.add(key, value) + + def update_auto_headers(self, skip_auto_headers: Iterable[str]) -> None: + self.skip_auto_headers = CIMultiDict( + (hdr, None) for hdr in sorted(skip_auto_headers) + ) + used_headers = self.headers.copy() + used_headers.extend(self.skip_auto_headers) # type: ignore[arg-type] + + for hdr, val in self.DEFAULT_HEADERS.items(): + if hdr not in used_headers: + self.headers.add(hdr, val) + + if hdrs.USER_AGENT not in used_headers: + self.headers[hdrs.USER_AGENT] = SERVER_SOFTWARE + + def update_cookies(self, cookies: Optional[LooseCookies]) -> None: + """Update request cookies header.""" + if not cookies: + return + + c = SimpleCookie() # type: SimpleCookie[str] + if hdrs.COOKIE in self.headers: + c.load(self.headers.get(hdrs.COOKIE, "")) + del self.headers[hdrs.COOKIE] + + if isinstance(cookies, Mapping): + iter_cookies = cookies.items() + else: + iter_cookies = cookies # type: ignore[assignment] + for name, value in iter_cookies: + if isinstance(value, Morsel): + # Preserve coded_value + mrsl_val = value.get(value.key, Morsel()) + mrsl_val.set(value.key, value.value, value.coded_value) + c[name] = mrsl_val + else: + c[name] = value # type: ignore[assignment] + + self.headers[hdrs.COOKIE] = c.output(header="", sep=";").strip() + + def update_content_encoding(self, data: Any) -> None: + """Set request content encoding.""" + if data is None: + return + + enc = self.headers.get(hdrs.CONTENT_ENCODING, "").lower() + if enc: + if self.compress: + raise ValueError( + "compress can not be set " "if Content-Encoding header is set" + ) + elif self.compress: + if not isinstance(self.compress, str): + self.compress = "deflate" + self.headers[hdrs.CONTENT_ENCODING] = self.compress + self.chunked = True # enable chunked, no need to deal with length + + def update_transfer_encoding(self) -> None: + """Analyze transfer-encoding header.""" + te = self.headers.get(hdrs.TRANSFER_ENCODING, "").lower() + + if "chunked" in te: + if self.chunked: + raise ValueError( + "chunked can not be set " + 'if "Transfer-Encoding: chunked" header is set' + ) + + elif self.chunked: + if hdrs.CONTENT_LENGTH in self.headers: + raise ValueError( + "chunked can not be set " "if Content-Length header is set" + ) + + self.headers[hdrs.TRANSFER_ENCODING] = "chunked" + else: + if hdrs.CONTENT_LENGTH not in self.headers: + self.headers[hdrs.CONTENT_LENGTH] = str(len(self.body)) + + def update_auth(self, auth: Optional[BasicAuth]) -> None: + """Set basic auth.""" + if auth is None: + auth = self.auth + if auth is None: + return + + if not isinstance(auth, helpers.BasicAuth): + raise TypeError("BasicAuth() tuple is required instead") + + self.headers[hdrs.AUTHORIZATION] = auth.encode() + + def update_body_from_data(self, body: Any) -> None: + if body is None: + return + + # FormData + if isinstance(body, FormData): + body = body() + + try: + body = payload.PAYLOAD_REGISTRY.get(body, disposition=None) + except payload.LookupError: + body = FormData(body)() + + self.body = body + + # enable chunked encoding if needed + if not self.chunked: + if hdrs.CONTENT_LENGTH not in self.headers: + size = body.size + if size is None: + self.chunked = True + else: + if hdrs.CONTENT_LENGTH not in self.headers: + self.headers[hdrs.CONTENT_LENGTH] = str(size) + + # copy payload headers + assert body.headers + for (key, value) in body.headers.items(): + if key in self.headers: + continue + if key in self.skip_auto_headers: + continue + self.headers[key] = value + + def update_expect_continue(self, expect: bool = False) -> None: + if expect: + self.headers[hdrs.EXPECT] = "100-continue" + elif self.headers.get(hdrs.EXPECT, "").lower() == "100-continue": + expect = True + + if expect: + self._continue = self.loop.create_future() + + def update_proxy( + self, + proxy: Optional[URL], + proxy_auth: Optional[BasicAuth], + proxy_headers: Optional[LooseHeaders], + ) -> None: + if proxy_auth and not isinstance(proxy_auth, helpers.BasicAuth): + raise ValueError("proxy_auth must be None or BasicAuth() tuple") + self.proxy = proxy + self.proxy_auth = proxy_auth + self.proxy_headers = proxy_headers + + def keep_alive(self) -> bool: + if self.version < HttpVersion10: + # keep alive not supported at all + return False + if self.version == HttpVersion10: + if self.headers.get(hdrs.CONNECTION) == "keep-alive": + return True + else: # no headers means we close for Http 1.0 + return False + elif self.headers.get(hdrs.CONNECTION) == "close": + return False + + return True + + async def write_bytes( + self, writer: AbstractStreamWriter, conn: "Connection" + ) -> None: + """Support coroutines that yields bytes objects.""" + # 100 response + if self._continue is not None: + await writer.drain() + await self._continue + + protocol = conn.protocol + assert protocol is not None + try: + if isinstance(self.body, payload.Payload): + await self.body.write(writer) + else: + if isinstance(self.body, (bytes, bytearray)): + self.body = (self.body,) # type: ignore[assignment] + + for chunk in self.body: + await writer.write(chunk) # type: ignore[arg-type] + + await writer.write_eof() + except OSError as exc: + new_exc = ClientOSError( + exc.errno, "Can not write request body for %s" % self.url + ) + new_exc.__context__ = exc + new_exc.__cause__ = exc + protocol.set_exception(new_exc) + except asyncio.CancelledError as exc: + if not conn.closed: + protocol.set_exception(exc) + except Exception as exc: + protocol.set_exception(exc) + finally: + self._writer = None + + async def send(self, conn: "Connection") -> "ClientResponse": + # Specify request target: + # - CONNECT request must send authority form URI + # - not CONNECT proxy must send absolute form URI + # - most common is origin form URI + if self.method == hdrs.METH_CONNECT: + connect_host = self.url.raw_host + assert connect_host is not None + if helpers.is_ipv6_address(connect_host): + connect_host = f"[{connect_host}]" + path = f"{connect_host}:{self.url.port}" + elif self.proxy and not self.is_ssl(): + path = str(self.url) + else: + path = self.url.raw_path + if self.url.raw_query_string: + path += "?" + self.url.raw_query_string + + protocol = conn.protocol + assert protocol is not None + writer = StreamWriter( + protocol, + self.loop, + on_chunk_sent=functools.partial( + self._on_chunk_request_sent, self.method, self.url + ), + on_headers_sent=functools.partial( + self._on_headers_request_sent, self.method, self.url + ), + ) + + if self.compress: + writer.enable_compression(self.compress) + + if self.chunked is not None: + writer.enable_chunking() + + # set default content-type + if ( + self.method in self.POST_METHODS + and hdrs.CONTENT_TYPE not in self.skip_auto_headers + and hdrs.CONTENT_TYPE not in self.headers + ): + self.headers[hdrs.CONTENT_TYPE] = "application/octet-stream" + + # set the connection header + connection = self.headers.get(hdrs.CONNECTION) + if not connection: + if self.keep_alive(): + if self.version == HttpVersion10: + connection = "keep-alive" + else: + if self.version == HttpVersion11: + connection = "close" + + if connection is not None: + self.headers[hdrs.CONNECTION] = connection + + # status + headers + status_line = "{0} {1} HTTP/{2[0]}.{2[1]}".format( + self.method, path, self.version + ) + await writer.write_headers(status_line, self.headers) + + self._writer = self.loop.create_task(self.write_bytes(writer, conn)) + + response_class = self.response_class + assert response_class is not None + self.response = response_class( + self.method, + self.original_url, + writer=self._writer, + continue100=self._continue, + timer=self._timer, + request_info=self.request_info, + traces=self._traces, + loop=self.loop, + session=self._session, + ) + return self.response + + async def close(self) -> None: + if self._writer is not None: + try: + await self._writer + finally: + self._writer = None + + def terminate(self) -> None: + if self._writer is not None: + if not self.loop.is_closed(): + self._writer.cancel() + self._writer = None + + async def _on_chunk_request_sent(self, method: str, url: URL, chunk: bytes) -> None: + for trace in self._traces: + await trace.send_request_chunk_sent(method, url, chunk) + + async def _on_headers_request_sent( + self, method: str, url: URL, headers: "CIMultiDict[str]" + ) -> None: + for trace in self._traces: + await trace.send_request_headers(method, url, headers) + + +class ClientResponse(HeadersMixin): + + # from the Status-Line of the response + version = None # HTTP-Version + status = None # type: int # Status-Code + reason = None # Reason-Phrase + + content = None # type: StreamReader # Payload stream + _headers = None # type: CIMultiDictProxy[str] # Response headers + _raw_headers = None # type: RawHeaders # Response raw headers + + _connection = None # current connection + _source_traceback = None + # setted up by ClientRequest after ClientResponse object creation + # post-init stage allows to not change ctor signature + _closed = True # to allow __del__ for non-initialized properly response + _released = False + + def __init__( + self, + method: str, + url: URL, + *, + writer: "asyncio.Task[None]", + continue100: Optional["asyncio.Future[bool]"], + timer: BaseTimerContext, + request_info: RequestInfo, + traces: List["Trace"], + loop: asyncio.AbstractEventLoop, + session: "ClientSession", + ) -> None: + assert isinstance(url, URL) + + self.method = method + self.cookies = SimpleCookie() # type: SimpleCookie[str] + + self._real_url = url + self._url = url.with_fragment(None) + self._body = None # type: Any + self._writer = writer # type: Optional[asyncio.Task[None]] + self._continue = continue100 # None by default + self._closed = True + self._history = () # type: Tuple[ClientResponse, ...] + self._request_info = request_info + self._timer = timer if timer is not None else TimerNoop() + self._cache = {} # type: Dict[str, Any] + self._traces = traces + self._loop = loop + # store a reference to session #1985 + self._session = session # type: Optional[ClientSession] + if loop.get_debug(): + self._source_traceback = traceback.extract_stack(sys._getframe(1)) + + @reify + def url(self) -> URL: + return self._url + + @reify + def url_obj(self) -> URL: + warnings.warn("Deprecated, use .url #1654", DeprecationWarning, stacklevel=2) + return self._url + + @reify + def real_url(self) -> URL: + return self._real_url + + @reify + def host(self) -> str: + assert self._url.host is not None + return self._url.host + + @reify + def headers(self) -> "CIMultiDictProxy[str]": + return self._headers + + @reify + def raw_headers(self) -> RawHeaders: + return self._raw_headers + + @reify + def request_info(self) -> RequestInfo: + return self._request_info + + @reify + def content_disposition(self) -> Optional[ContentDisposition]: + raw = self._headers.get(hdrs.CONTENT_DISPOSITION) + if raw is None: + return None + disposition_type, params_dct = multipart.parse_content_disposition(raw) + params = MappingProxyType(params_dct) + filename = multipart.content_disposition_filename(params) + return ContentDisposition(disposition_type, params, filename) + + def __del__(self, _warnings: Any = warnings) -> None: + if self._closed: + return + + if self._connection is not None: + self._connection.release() + self._cleanup_writer() + + if self._loop.get_debug(): + if PY_36: + kwargs = {"source": self} + else: + kwargs = {} + _warnings.warn(f"Unclosed response {self!r}", ResourceWarning, **kwargs) + context = {"client_response": self, "message": "Unclosed response"} + if self._source_traceback: + context["source_traceback"] = self._source_traceback + self._loop.call_exception_handler(context) + + def __repr__(self) -> str: + out = io.StringIO() + ascii_encodable_url = str(self.url) + if self.reason: + ascii_encodable_reason = self.reason.encode( + "ascii", "backslashreplace" + ).decode("ascii") + else: + ascii_encodable_reason = self.reason + print( + "".format( + ascii_encodable_url, self.status, ascii_encodable_reason + ), + file=out, + ) + print(self.headers, file=out) + return out.getvalue() + + @property + def connection(self) -> Optional["Connection"]: + return self._connection + + @reify + def history(self) -> Tuple["ClientResponse", ...]: + """A sequence of of responses, if redirects occurred.""" + return self._history + + @reify + def links(self) -> "MultiDictProxy[MultiDictProxy[Union[str, URL]]]": + links_str = ", ".join(self.headers.getall("link", [])) + + if not links_str: + return MultiDictProxy(MultiDict()) + + links = MultiDict() # type: MultiDict[MultiDictProxy[Union[str, URL]]] + + for val in re.split(r",(?=\s*<)", links_str): + match = re.match(r"\s*<(.*)>(.*)", val) + if match is None: # pragma: no cover + # the check exists to suppress mypy error + continue + url, params_str = match.groups() + params = params_str.split(";")[1:] + + link = MultiDict() # type: MultiDict[Union[str, URL]] + + for param in params: + match = re.match(r"^\s*(\S*)\s*=\s*(['\"]?)(.*?)(\2)\s*$", param, re.M) + if match is None: # pragma: no cover + # the check exists to suppress mypy error + continue + key, _, value, _ = match.groups() + + link.add(key, value) + + key = link.get("rel", url) # type: ignore[assignment] + + link.add("url", self.url.join(URL(url))) + + links.add(key, MultiDictProxy(link)) + + return MultiDictProxy(links) + + async def start(self, connection: "Connection") -> "ClientResponse": + """Start response processing.""" + self._closed = False + self._protocol = connection.protocol + self._connection = connection + + with self._timer: + while True: + # read response + try: + protocol = self._protocol + message, payload = await protocol.read() # type: ignore[union-attr] + except http.HttpProcessingError as exc: + raise ClientResponseError( + self.request_info, + self.history, + status=exc.code, + message=exc.message, + headers=exc.headers, + ) from exc + + if message.code < 100 or message.code > 199 or message.code == 101: + break + + if self._continue is not None: + set_result(self._continue, True) + self._continue = None + + # payload eof handler + payload.on_eof(self._response_eof) + + # response status + self.version = message.version + self.status = message.code + self.reason = message.reason + + # headers + self._headers = message.headers # type is CIMultiDictProxy + self._raw_headers = message.raw_headers # type is Tuple[bytes, bytes] + + # payload + self.content = payload + + # cookies + for hdr in self.headers.getall(hdrs.SET_COOKIE, ()): + try: + self.cookies.load(hdr) + except CookieError as exc: + client_logger.warning("Can not load response cookies: %s", exc) + return self + + def _response_eof(self) -> None: + if self._closed: + return + + if self._connection is not None: + # websocket, protocol could be None because + # connection could be detached + if ( + self._connection.protocol is not None + and self._connection.protocol.upgraded + ): + return + + self._connection.release() + self._connection = None + + self._closed = True + self._cleanup_writer() + + @property + def closed(self) -> bool: + return self._closed + + def close(self) -> None: + if not self._released: + self._notify_content() + if self._closed: + return + + self._closed = True + if self._loop is None or self._loop.is_closed(): + return + + if self._connection is not None: + self._connection.close() + self._connection = None + self._cleanup_writer() + + def release(self) -> Any: + if not self._released: + self._notify_content() + if self._closed: + return noop() + + self._closed = True + if self._connection is not None: + self._connection.release() + self._connection = None + + self._cleanup_writer() + return noop() + + @property + def ok(self) -> bool: + """Returns ``True`` if ``status`` is less than ``400``, ``False`` if not. + + This is **not** a check for ``200 OK`` but a check that the response + status is under 400. + """ + return 400 > self.status + + def raise_for_status(self) -> None: + if not self.ok: + # reason should always be not None for a started response + assert self.reason is not None + self.release() + raise ClientResponseError( + self.request_info, + self.history, + status=self.status, + message=self.reason, + headers=self.headers, + ) + + def _cleanup_writer(self) -> None: + if self._writer is not None: + self._writer.cancel() + self._writer = None + self._session = None + + def _notify_content(self) -> None: + content = self.content + if content and content.exception() is None: + content.set_exception(ClientConnectionError("Connection closed")) + self._released = True + + async def wait_for_close(self) -> None: + if self._writer is not None: + try: + await self._writer + finally: + self._writer = None + self.release() + + async def read(self) -> bytes: + """Read response payload.""" + if self._body is None: + try: + self._body = await self.content.read() + for trace in self._traces: + await trace.send_response_chunk_received( + self.method, self.url, self._body + ) + except BaseException: + self.close() + raise + elif self._released: + raise ClientConnectionError("Connection closed") + + return self._body # type: ignore[no-any-return] + + def get_encoding(self) -> str: + ctype = self.headers.get(hdrs.CONTENT_TYPE, "").lower() + mimetype = helpers.parse_mimetype(ctype) + + encoding = mimetype.parameters.get("charset") + if encoding: + try: + codecs.lookup(encoding) + except LookupError: + encoding = None + if not encoding: + if mimetype.type == "application" and ( + mimetype.subtype == "json" or mimetype.subtype == "rdap" + ): + # RFC 7159 states that the default encoding is UTF-8. + # RFC 7483 defines application/rdap+json + encoding = "utf-8" + elif self._body is None: + raise RuntimeError( + "Cannot guess the encoding of " "a not yet read body" + ) + else: + encoding = chardet.detect(self._body)["encoding"] + if not encoding: + encoding = "utf-8" + + return encoding + + async def text(self, encoding: Optional[str] = None, errors: str = "strict") -> str: + """Read response payload and decode.""" + if self._body is None: + await self.read() + + if encoding is None: + encoding = self.get_encoding() + + return self._body.decode( # type: ignore[no-any-return,union-attr] + encoding, errors=errors + ) + + async def json( + self, + *, + encoding: Optional[str] = None, + loads: JSONDecoder = DEFAULT_JSON_DECODER, + content_type: Optional[str] = "application/json", + ) -> Any: + """Read and decodes JSON response.""" + if self._body is None: + await self.read() + + if content_type: + ctype = self.headers.get(hdrs.CONTENT_TYPE, "").lower() + if not _is_expected_content_type(ctype, content_type): + raise ContentTypeError( + self.request_info, + self.history, + message=( + "Attempt to decode JSON with " "unexpected mimetype: %s" % ctype + ), + headers=self.headers, + ) + + stripped = self._body.strip() # type: ignore[union-attr] + if not stripped: + return None + + if encoding is None: + encoding = self.get_encoding() + + return loads(stripped.decode(encoding)) + + async def __aenter__(self) -> "ClientResponse": + return self + + async def __aexit__( + self, + exc_type: Optional[Type[BaseException]], + exc_val: Optional[BaseException], + exc_tb: Optional[TracebackType], + ) -> None: + # similar to _RequestContextManager, we do not need to check + # for exceptions, response object can close connection + # if state is broken + self.release() diff --git a/sbsheriff/Lib/site-packages/aiohttp/client_ws.py b/sbsheriff/Lib/site-packages/aiohttp/client_ws.py new file mode 100644 index 0000000..7c8121f --- /dev/null +++ b/sbsheriff/Lib/site-packages/aiohttp/client_ws.py @@ -0,0 +1,300 @@ +"""WebSocket client for asyncio.""" + +import asyncio +from typing import Any, Optional, cast + +import async_timeout + +from .client_exceptions import ClientError +from .client_reqrep import ClientResponse +from .helpers import call_later, set_result +from .http import ( + WS_CLOSED_MESSAGE, + WS_CLOSING_MESSAGE, + WebSocketError, + WSCloseCode, + WSMessage, + WSMsgType, +) +from .http_websocket import WebSocketWriter # WSMessage +from .streams import EofStream, FlowControlDataQueue +from .typedefs import ( + DEFAULT_JSON_DECODER, + DEFAULT_JSON_ENCODER, + JSONDecoder, + JSONEncoder, +) + + +class ClientWebSocketResponse: + def __init__( + self, + reader: "FlowControlDataQueue[WSMessage]", + writer: WebSocketWriter, + protocol: Optional[str], + response: ClientResponse, + timeout: float, + autoclose: bool, + autoping: bool, + loop: asyncio.AbstractEventLoop, + *, + receive_timeout: Optional[float] = None, + heartbeat: Optional[float] = None, + compress: int = 0, + client_notakeover: bool = False, + ) -> None: + self._response = response + self._conn = response.connection + + self._writer = writer + self._reader = reader + self._protocol = protocol + self._closed = False + self._closing = False + self._close_code = None # type: Optional[int] + self._timeout = timeout + self._receive_timeout = receive_timeout + self._autoclose = autoclose + self._autoping = autoping + self._heartbeat = heartbeat + self._heartbeat_cb: Optional[asyncio.TimerHandle] = None + if heartbeat is not None: + self._pong_heartbeat = heartbeat / 2.0 + self._pong_response_cb: Optional[asyncio.TimerHandle] = None + self._loop = loop + self._waiting = None # type: Optional[asyncio.Future[bool]] + self._exception = None # type: Optional[BaseException] + self._compress = compress + self._client_notakeover = client_notakeover + + self._reset_heartbeat() + + def _cancel_heartbeat(self) -> None: + if self._pong_response_cb is not None: + self._pong_response_cb.cancel() + self._pong_response_cb = None + + if self._heartbeat_cb is not None: + self._heartbeat_cb.cancel() + self._heartbeat_cb = None + + def _reset_heartbeat(self) -> None: + self._cancel_heartbeat() + + if self._heartbeat is not None: + self._heartbeat_cb = call_later( + self._send_heartbeat, self._heartbeat, self._loop + ) + + def _send_heartbeat(self) -> None: + if self._heartbeat is not None and not self._closed: + # fire-and-forget a task is not perfect but maybe ok for + # sending ping. Otherwise we need a long-living heartbeat + # task in the class. + self._loop.create_task(self._writer.ping()) + + if self._pong_response_cb is not None: + self._pong_response_cb.cancel() + self._pong_response_cb = call_later( + self._pong_not_received, self._pong_heartbeat, self._loop + ) + + def _pong_not_received(self) -> None: + if not self._closed: + self._closed = True + self._close_code = WSCloseCode.ABNORMAL_CLOSURE + self._exception = asyncio.TimeoutError() + self._response.close() + + @property + def closed(self) -> bool: + return self._closed + + @property + def close_code(self) -> Optional[int]: + return self._close_code + + @property + def protocol(self) -> Optional[str]: + return self._protocol + + @property + def compress(self) -> int: + return self._compress + + @property + def client_notakeover(self) -> bool: + return self._client_notakeover + + def get_extra_info(self, name: str, default: Any = None) -> Any: + """extra info from connection transport""" + conn = self._response.connection + if conn is None: + return default + transport = conn.transport + if transport is None: + return default + return transport.get_extra_info(name, default) + + def exception(self) -> Optional[BaseException]: + return self._exception + + async def ping(self, message: bytes = b"") -> None: + await self._writer.ping(message) + + async def pong(self, message: bytes = b"") -> None: + await self._writer.pong(message) + + async def send_str(self, data: str, compress: Optional[int] = None) -> None: + if not isinstance(data, str): + raise TypeError("data argument must be str (%r)" % type(data)) + await self._writer.send(data, binary=False, compress=compress) + + async def send_bytes(self, data: bytes, compress: Optional[int] = None) -> None: + if not isinstance(data, (bytes, bytearray, memoryview)): + raise TypeError("data argument must be byte-ish (%r)" % type(data)) + await self._writer.send(data, binary=True, compress=compress) + + async def send_json( + self, + data: Any, + compress: Optional[int] = None, + *, + dumps: JSONEncoder = DEFAULT_JSON_ENCODER, + ) -> None: + await self.send_str(dumps(data), compress=compress) + + async def close(self, *, code: int = WSCloseCode.OK, message: bytes = b"") -> bool: + # we need to break `receive()` cycle first, + # `close()` may be called from different task + if self._waiting is not None and not self._closed: + self._reader.feed_data(WS_CLOSING_MESSAGE, 0) + await self._waiting + + if not self._closed: + self._cancel_heartbeat() + self._closed = True + try: + await self._writer.close(code, message) + except asyncio.CancelledError: + self._close_code = WSCloseCode.ABNORMAL_CLOSURE + self._response.close() + raise + except Exception as exc: + self._close_code = WSCloseCode.ABNORMAL_CLOSURE + self._exception = exc + self._response.close() + return True + + if self._closing: + self._response.close() + return True + + while True: + try: + async with async_timeout.timeout(self._timeout): + msg = await self._reader.read() + except asyncio.CancelledError: + self._close_code = WSCloseCode.ABNORMAL_CLOSURE + self._response.close() + raise + except Exception as exc: + self._close_code = WSCloseCode.ABNORMAL_CLOSURE + self._exception = exc + self._response.close() + return True + + if msg.type == WSMsgType.CLOSE: + self._close_code = msg.data + self._response.close() + return True + else: + return False + + async def receive(self, timeout: Optional[float] = None) -> WSMessage: + while True: + if self._waiting is not None: + raise RuntimeError("Concurrent call to receive() is not allowed") + + if self._closed: + return WS_CLOSED_MESSAGE + elif self._closing: + await self.close() + return WS_CLOSED_MESSAGE + + try: + self._waiting = self._loop.create_future() + try: + async with async_timeout.timeout(timeout or self._receive_timeout): + msg = await self._reader.read() + self._reset_heartbeat() + finally: + waiter = self._waiting + self._waiting = None + set_result(waiter, True) + except (asyncio.CancelledError, asyncio.TimeoutError): + self._close_code = WSCloseCode.ABNORMAL_CLOSURE + raise + except EofStream: + self._close_code = WSCloseCode.OK + await self.close() + return WSMessage(WSMsgType.CLOSED, None, None) + except ClientError: + self._closed = True + self._close_code = WSCloseCode.ABNORMAL_CLOSURE + return WS_CLOSED_MESSAGE + except WebSocketError as exc: + self._close_code = exc.code + await self.close(code=exc.code) + return WSMessage(WSMsgType.ERROR, exc, None) + except Exception as exc: + self._exception = exc + self._closing = True + self._close_code = WSCloseCode.ABNORMAL_CLOSURE + await self.close() + return WSMessage(WSMsgType.ERROR, exc, None) + + if msg.type == WSMsgType.CLOSE: + self._closing = True + self._close_code = msg.data + if not self._closed and self._autoclose: + await self.close() + elif msg.type == WSMsgType.CLOSING: + self._closing = True + elif msg.type == WSMsgType.PING and self._autoping: + await self.pong(msg.data) + continue + elif msg.type == WSMsgType.PONG and self._autoping: + continue + + return msg + + async def receive_str(self, *, timeout: Optional[float] = None) -> str: + msg = await self.receive(timeout) + if msg.type != WSMsgType.TEXT: + raise TypeError(f"Received message {msg.type}:{msg.data!r} is not str") + return cast(str, msg.data) + + async def receive_bytes(self, *, timeout: Optional[float] = None) -> bytes: + msg = await self.receive(timeout) + if msg.type != WSMsgType.BINARY: + raise TypeError(f"Received message {msg.type}:{msg.data!r} is not bytes") + return cast(bytes, msg.data) + + async def receive_json( + self, + *, + loads: JSONDecoder = DEFAULT_JSON_DECODER, + timeout: Optional[float] = None, + ) -> Any: + data = await self.receive_str(timeout=timeout) + return loads(data) + + def __aiter__(self) -> "ClientWebSocketResponse": + return self + + async def __anext__(self) -> WSMessage: + msg = await self.receive() + if msg.type in (WSMsgType.CLOSE, WSMsgType.CLOSING, WSMsgType.CLOSED): + raise StopAsyncIteration + return msg diff --git a/sbsheriff/Lib/site-packages/aiohttp/connector.py b/sbsheriff/Lib/site-packages/aiohttp/connector.py new file mode 100644 index 0000000..08dc496 --- /dev/null +++ b/sbsheriff/Lib/site-packages/aiohttp/connector.py @@ -0,0 +1,1449 @@ +import asyncio +import functools +import random +import sys +import traceback +import warnings +from collections import defaultdict, deque +from contextlib import suppress +from http.cookies import SimpleCookie +from itertools import cycle, islice +from time import monotonic +from types import TracebackType +from typing import ( + TYPE_CHECKING, + Any, + Awaitable, + Callable, + DefaultDict, + Dict, + Iterator, + List, + Optional, + Set, + Tuple, + Type, + Union, + cast, +) + +import attr + +from . import hdrs, helpers +from .abc import AbstractResolver +from .client_exceptions import ( + ClientConnectionError, + ClientConnectorCertificateError, + ClientConnectorError, + ClientConnectorSSLError, + ClientHttpProxyError, + ClientProxyConnectionError, + ServerFingerprintMismatch, + UnixClientConnectorError, + cert_errors, + ssl_errors, +) +from .client_proto import ResponseHandler +from .client_reqrep import ClientRequest, Fingerprint, _merge_ssl_params +from .helpers import ( + PY_36, + ceil_timeout, + get_running_loop, + is_ip_address, + noop, + sentinel, +) +from .http import RESPONSES +from .locks import EventResultOrError +from .resolver import DefaultResolver + +try: + import ssl + + SSLContext = ssl.SSLContext +except ImportError: # pragma: no cover + ssl = None # type: ignore[assignment] + SSLContext = object # type: ignore[misc,assignment] + + +__all__ = ("BaseConnector", "TCPConnector", "UnixConnector", "NamedPipeConnector") + + +if TYPE_CHECKING: # pragma: no cover + from .client import ClientTimeout + from .client_reqrep import ConnectionKey + from .tracing import Trace + + +class _DeprecationWaiter: + __slots__ = ("_awaitable", "_awaited") + + def __init__(self, awaitable: Awaitable[Any]) -> None: + self._awaitable = awaitable + self._awaited = False + + def __await__(self) -> Any: + self._awaited = True + return self._awaitable.__await__() + + def __del__(self) -> None: + if not self._awaited: + warnings.warn( + "Connector.close() is a coroutine, " + "please use await connector.close()", + DeprecationWarning, + ) + + +class Connection: + + _source_traceback = None + _transport = None + + def __init__( + self, + connector: "BaseConnector", + key: "ConnectionKey", + protocol: ResponseHandler, + loop: asyncio.AbstractEventLoop, + ) -> None: + self._key = key + self._connector = connector + self._loop = loop + self._protocol = protocol # type: Optional[ResponseHandler] + self._callbacks = [] # type: List[Callable[[], None]] + + if loop.get_debug(): + self._source_traceback = traceback.extract_stack(sys._getframe(1)) + + def __repr__(self) -> str: + return f"Connection<{self._key}>" + + def __del__(self, _warnings: Any = warnings) -> None: + if self._protocol is not None: + if PY_36: + kwargs = {"source": self} + else: + kwargs = {} + _warnings.warn(f"Unclosed connection {self!r}", ResourceWarning, **kwargs) + if self._loop.is_closed(): + return + + self._connector._release(self._key, self._protocol, should_close=True) + + context = {"client_connection": self, "message": "Unclosed connection"} + if self._source_traceback is not None: + context["source_traceback"] = self._source_traceback + self._loop.call_exception_handler(context) + + @property + def loop(self) -> asyncio.AbstractEventLoop: + warnings.warn( + "connector.loop property is deprecated", DeprecationWarning, stacklevel=2 + ) + return self._loop + + @property + def transport(self) -> Optional[asyncio.Transport]: + if self._protocol is None: + return None + return self._protocol.transport + + @property + def protocol(self) -> Optional[ResponseHandler]: + return self._protocol + + def add_callback(self, callback: Callable[[], None]) -> None: + if callback is not None: + self._callbacks.append(callback) + + def _notify_release(self) -> None: + callbacks, self._callbacks = self._callbacks[:], [] + + for cb in callbacks: + with suppress(Exception): + cb() + + def close(self) -> None: + self._notify_release() + + if self._protocol is not None: + self._connector._release(self._key, self._protocol, should_close=True) + self._protocol = None + + def release(self) -> None: + self._notify_release() + + if self._protocol is not None: + self._connector._release( + self._key, self._protocol, should_close=self._protocol.should_close + ) + self._protocol = None + + @property + def closed(self) -> bool: + return self._protocol is None or not self._protocol.is_connected() + + +class _TransportPlaceholder: + """placeholder for BaseConnector.connect function""" + + def close(self) -> None: + pass + + +class BaseConnector: + """Base connector class. + + keepalive_timeout - (optional) Keep-alive timeout. + force_close - Set to True to force close and do reconnect + after each request (and between redirects). + limit - The total number of simultaneous connections. + limit_per_host - Number of simultaneous connections to one host. + enable_cleanup_closed - Enables clean-up closed ssl transports. + Disabled by default. + loop - Optional event loop. + """ + + _closed = True # prevent AttributeError in __del__ if ctor was failed + _source_traceback = None + + # abort transport after 2 seconds (cleanup broken connections) + _cleanup_closed_period = 2.0 + + def __init__( + self, + *, + keepalive_timeout: Union[object, None, float] = sentinel, + force_close: bool = False, + limit: int = 100, + limit_per_host: int = 0, + enable_cleanup_closed: bool = False, + loop: Optional[asyncio.AbstractEventLoop] = None, + ) -> None: + + if force_close: + if keepalive_timeout is not None and keepalive_timeout is not sentinel: + raise ValueError( + "keepalive_timeout cannot " "be set if force_close is True" + ) + else: + if keepalive_timeout is sentinel: + keepalive_timeout = 15.0 + + loop = get_running_loop(loop) + + self._closed = False + if loop.get_debug(): + self._source_traceback = traceback.extract_stack(sys._getframe(1)) + + self._conns = ( + {} + ) # type: Dict[ConnectionKey, List[Tuple[ResponseHandler, float]]] + self._limit = limit + self._limit_per_host = limit_per_host + self._acquired = set() # type: Set[ResponseHandler] + self._acquired_per_host = defaultdict( + set + ) # type: DefaultDict[ConnectionKey, Set[ResponseHandler]] + self._keepalive_timeout = cast(float, keepalive_timeout) + self._force_close = force_close + + # {host_key: FIFO list of waiters} + self._waiters = defaultdict(deque) # type: ignore[var-annotated] + + self._loop = loop + self._factory = functools.partial(ResponseHandler, loop=loop) + + self.cookies = SimpleCookie() # type: SimpleCookie[str] + + # start keep-alive connection cleanup task + self._cleanup_handle: Optional[asyncio.TimerHandle] = None + + # start cleanup closed transports task + self._cleanup_closed_handle: Optional[asyncio.TimerHandle] = None + self._cleanup_closed_disabled = not enable_cleanup_closed + self._cleanup_closed_transports = [] # type: List[Optional[asyncio.Transport]] + self._cleanup_closed() + + def __del__(self, _warnings: Any = warnings) -> None: + if self._closed: + return + if not self._conns: + return + + conns = [repr(c) for c in self._conns.values()] + + self._close() + + if PY_36: + kwargs = {"source": self} + else: + kwargs = {} + _warnings.warn(f"Unclosed connector {self!r}", ResourceWarning, **kwargs) + context = { + "connector": self, + "connections": conns, + "message": "Unclosed connector", + } + if self._source_traceback is not None: + context["source_traceback"] = self._source_traceback + self._loop.call_exception_handler(context) + + def __enter__(self) -> "BaseConnector": + warnings.warn( + '"witn Connector():" is deprecated, ' + 'use "async with Connector():" instead', + DeprecationWarning, + ) + return self + + def __exit__(self, *exc: Any) -> None: + self.close() + + async def __aenter__(self) -> "BaseConnector": + return self + + async def __aexit__( + self, + exc_type: Optional[Type[BaseException]] = None, + exc_value: Optional[BaseException] = None, + exc_traceback: Optional[TracebackType] = None, + ) -> None: + await self.close() + + @property + def force_close(self) -> bool: + """Ultimately close connection on releasing if True.""" + return self._force_close + + @property + def limit(self) -> int: + """The total number for simultaneous connections. + + If limit is 0 the connector has no limit. + The default limit size is 100. + """ + return self._limit + + @property + def limit_per_host(self) -> int: + """The limit for simultaneous connections to the same endpoint. + + Endpoints are the same if they are have equal + (host, port, is_ssl) triple. + """ + return self._limit_per_host + + def _cleanup(self) -> None: + """Cleanup unused transports.""" + if self._cleanup_handle: + self._cleanup_handle.cancel() + # _cleanup_handle should be unset, otherwise _release() will not + # recreate it ever! + self._cleanup_handle = None + + now = self._loop.time() + timeout = self._keepalive_timeout + + if self._conns: + connections = {} + deadline = now - timeout + for key, conns in self._conns.items(): + alive = [] + for proto, use_time in conns: + if proto.is_connected(): + if use_time - deadline < 0: + transport = proto.transport + proto.close() + if key.is_ssl and not self._cleanup_closed_disabled: + self._cleanup_closed_transports.append(transport) + else: + alive.append((proto, use_time)) + else: + transport = proto.transport + proto.close() + if key.is_ssl and not self._cleanup_closed_disabled: + self._cleanup_closed_transports.append(transport) + + if alive: + connections[key] = alive + + self._conns = connections + + if self._conns: + self._cleanup_handle = helpers.weakref_handle( + self, "_cleanup", timeout, self._loop + ) + + def _drop_acquired_per_host( + self, key: "ConnectionKey", val: ResponseHandler + ) -> None: + acquired_per_host = self._acquired_per_host + if key not in acquired_per_host: + return + conns = acquired_per_host[key] + conns.remove(val) + if not conns: + del self._acquired_per_host[key] + + def _cleanup_closed(self) -> None: + """Double confirmation for transport close. + + Some broken ssl servers may leave socket open without proper close. + """ + if self._cleanup_closed_handle: + self._cleanup_closed_handle.cancel() + + for transport in self._cleanup_closed_transports: + if transport is not None: + transport.abort() + + self._cleanup_closed_transports = [] + + if not self._cleanup_closed_disabled: + self._cleanup_closed_handle = helpers.weakref_handle( + self, "_cleanup_closed", self._cleanup_closed_period, self._loop + ) + + def close(self) -> Awaitable[None]: + """Close all opened transports.""" + self._close() + return _DeprecationWaiter(noop()) + + def _close(self) -> None: + if self._closed: + return + + self._closed = True + + try: + if self._loop.is_closed(): + return + + # cancel cleanup task + if self._cleanup_handle: + self._cleanup_handle.cancel() + + # cancel cleanup close task + if self._cleanup_closed_handle: + self._cleanup_closed_handle.cancel() + + for data in self._conns.values(): + for proto, t0 in data: + proto.close() + + for proto in self._acquired: + proto.close() + + for transport in self._cleanup_closed_transports: + if transport is not None: + transport.abort() + + finally: + self._conns.clear() + self._acquired.clear() + self._waiters.clear() + self._cleanup_handle = None + self._cleanup_closed_transports.clear() + self._cleanup_closed_handle = None + + @property + def closed(self) -> bool: + """Is connector closed. + + A readonly property. + """ + return self._closed + + def _available_connections(self, key: "ConnectionKey") -> int: + """ + Return number of available connections. + + The limit, limit_per_host and the connection key are taken into account. + + If it returns less than 1 means that there are no connections + available. + """ + if self._limit: + # total calc available connections + available = self._limit - len(self._acquired) + + # check limit per host + if ( + self._limit_per_host + and available > 0 + and key in self._acquired_per_host + ): + acquired = self._acquired_per_host.get(key) + assert acquired is not None + available = self._limit_per_host - len(acquired) + + elif self._limit_per_host and key in self._acquired_per_host: + # check limit per host + acquired = self._acquired_per_host.get(key) + assert acquired is not None + available = self._limit_per_host - len(acquired) + else: + available = 1 + + return available + + async def connect( + self, req: "ClientRequest", traces: List["Trace"], timeout: "ClientTimeout" + ) -> Connection: + """Get from pool or create new connection.""" + key = req.connection_key + available = self._available_connections(key) + + # Wait if there are no available connections or if there are/were + # waiters (i.e. don't steal connection from a waiter about to wake up) + if available <= 0 or key in self._waiters: + fut = self._loop.create_future() + + # This connection will now count towards the limit. + self._waiters[key].append(fut) + + if traces: + for trace in traces: + await trace.send_connection_queued_start() + + try: + await fut + except BaseException as e: + if key in self._waiters: + # remove a waiter even if it was cancelled, normally it's + # removed when it's notified + try: + self._waiters[key].remove(fut) + except ValueError: # fut may no longer be in list + pass + + raise e + finally: + if key in self._waiters and not self._waiters[key]: + del self._waiters[key] + + if traces: + for trace in traces: + await trace.send_connection_queued_end() + + proto = self._get(key) + if proto is None: + placeholder = cast(ResponseHandler, _TransportPlaceholder()) + self._acquired.add(placeholder) + self._acquired_per_host[key].add(placeholder) + + if traces: + for trace in traces: + await trace.send_connection_create_start() + + try: + proto = await self._create_connection(req, traces, timeout) + if self._closed: + proto.close() + raise ClientConnectionError("Connector is closed.") + except BaseException: + if not self._closed: + self._acquired.remove(placeholder) + self._drop_acquired_per_host(key, placeholder) + self._release_waiter() + raise + else: + if not self._closed: + self._acquired.remove(placeholder) + self._drop_acquired_per_host(key, placeholder) + + if traces: + for trace in traces: + await trace.send_connection_create_end() + else: + if traces: + # Acquire the connection to prevent race conditions with limits + placeholder = cast(ResponseHandler, _TransportPlaceholder()) + self._acquired.add(placeholder) + self._acquired_per_host[key].add(placeholder) + for trace in traces: + await trace.send_connection_reuseconn() + self._acquired.remove(placeholder) + self._drop_acquired_per_host(key, placeholder) + + self._acquired.add(proto) + self._acquired_per_host[key].add(proto) + return Connection(self, key, proto, self._loop) + + def _get(self, key: "ConnectionKey") -> Optional[ResponseHandler]: + try: + conns = self._conns[key] + except KeyError: + return None + + t1 = self._loop.time() + while conns: + proto, t0 = conns.pop() + if proto.is_connected(): + if t1 - t0 > self._keepalive_timeout: + transport = proto.transport + proto.close() + # only for SSL transports + if key.is_ssl and not self._cleanup_closed_disabled: + self._cleanup_closed_transports.append(transport) + else: + if not conns: + # The very last connection was reclaimed: drop the key + del self._conns[key] + return proto + else: + transport = proto.transport + proto.close() + if key.is_ssl and not self._cleanup_closed_disabled: + self._cleanup_closed_transports.append(transport) + + # No more connections: drop the key + del self._conns[key] + return None + + def _release_waiter(self) -> None: + """ + Iterates over all waiters until one to be released is found. + + The one to be released is not finsihed and + belongs to a host that has available connections. + """ + if not self._waiters: + return + + # Having the dict keys ordered this avoids to iterate + # at the same order at each call. + queues = list(self._waiters.keys()) + random.shuffle(queues) + + for key in queues: + if self._available_connections(key) < 1: + continue + + waiters = self._waiters[key] + while waiters: + waiter = waiters.popleft() + if not waiter.done(): + waiter.set_result(None) + return + + def _release_acquired(self, key: "ConnectionKey", proto: ResponseHandler) -> None: + if self._closed: + # acquired connection is already released on connector closing + return + + try: + self._acquired.remove(proto) + self._drop_acquired_per_host(key, proto) + except KeyError: # pragma: no cover + # this may be result of undetermenistic order of objects + # finalization due garbage collection. + pass + else: + self._release_waiter() + + def _release( + self, + key: "ConnectionKey", + protocol: ResponseHandler, + *, + should_close: bool = False, + ) -> None: + if self._closed: + # acquired connection is already released on connector closing + return + + self._release_acquired(key, protocol) + + if self._force_close: + should_close = True + + if should_close or protocol.should_close: + transport = protocol.transport + protocol.close() + + if key.is_ssl and not self._cleanup_closed_disabled: + self._cleanup_closed_transports.append(transport) + else: + conns = self._conns.get(key) + if conns is None: + conns = self._conns[key] = [] + conns.append((protocol, self._loop.time())) + + if self._cleanup_handle is None: + self._cleanup_handle = helpers.weakref_handle( + self, "_cleanup", self._keepalive_timeout, self._loop + ) + + async def _create_connection( + self, req: "ClientRequest", traces: List["Trace"], timeout: "ClientTimeout" + ) -> ResponseHandler: + raise NotImplementedError() + + +class _DNSCacheTable: + def __init__(self, ttl: Optional[float] = None) -> None: + self._addrs_rr = ( + {} + ) # type: Dict[Tuple[str, int], Tuple[Iterator[Dict[str, Any]], int]] + self._timestamps = {} # type: Dict[Tuple[str, int], float] + self._ttl = ttl + + def __contains__(self, host: object) -> bool: + return host in self._addrs_rr + + def add(self, key: Tuple[str, int], addrs: List[Dict[str, Any]]) -> None: + self._addrs_rr[key] = (cycle(addrs), len(addrs)) + + if self._ttl: + self._timestamps[key] = monotonic() + + def remove(self, key: Tuple[str, int]) -> None: + self._addrs_rr.pop(key, None) + + if self._ttl: + self._timestamps.pop(key, None) + + def clear(self) -> None: + self._addrs_rr.clear() + self._timestamps.clear() + + def next_addrs(self, key: Tuple[str, int]) -> List[Dict[str, Any]]: + loop, length = self._addrs_rr[key] + addrs = list(islice(loop, length)) + # Consume one more element to shift internal state of `cycle` + next(loop) + return addrs + + def expired(self, key: Tuple[str, int]) -> bool: + if self._ttl is None: + return False + + return self._timestamps[key] + self._ttl < monotonic() + + +class TCPConnector(BaseConnector): + """TCP connector. + + verify_ssl - Set to True to check ssl certifications. + fingerprint - Pass the binary sha256 + digest of the expected certificate in DER format to verify + that the certificate the server presents matches. See also + https://en.wikipedia.org/wiki/Transport_Layer_Security#Certificate_pinning + resolver - Enable DNS lookups and use this + resolver + use_dns_cache - Use memory cache for DNS lookups. + ttl_dns_cache - Max seconds having cached a DNS entry, None forever. + family - socket address family + local_addr - local tuple of (host, port) to bind socket to + + keepalive_timeout - (optional) Keep-alive timeout. + force_close - Set to True to force close and do reconnect + after each request (and between redirects). + limit - The total number of simultaneous connections. + limit_per_host - Number of simultaneous connections to one host. + enable_cleanup_closed - Enables clean-up closed ssl transports. + Disabled by default. + loop - Optional event loop. + """ + + def __init__( + self, + *, + verify_ssl: bool = True, + fingerprint: Optional[bytes] = None, + use_dns_cache: bool = True, + ttl_dns_cache: Optional[int] = 10, + family: int = 0, + ssl_context: Optional[SSLContext] = None, + ssl: Union[None, bool, Fingerprint, SSLContext] = None, + local_addr: Optional[Tuple[str, int]] = None, + resolver: Optional[AbstractResolver] = None, + keepalive_timeout: Union[None, float, object] = sentinel, + force_close: bool = False, + limit: int = 100, + limit_per_host: int = 0, + enable_cleanup_closed: bool = False, + loop: Optional[asyncio.AbstractEventLoop] = None, + ): + super().__init__( + keepalive_timeout=keepalive_timeout, + force_close=force_close, + limit=limit, + limit_per_host=limit_per_host, + enable_cleanup_closed=enable_cleanup_closed, + loop=loop, + ) + + self._ssl = _merge_ssl_params(ssl, verify_ssl, ssl_context, fingerprint) + if resolver is None: + resolver = DefaultResolver(loop=self._loop) + self._resolver = resolver + + self._use_dns_cache = use_dns_cache + self._cached_hosts = _DNSCacheTable(ttl=ttl_dns_cache) + self._throttle_dns_events = ( + {} + ) # type: Dict[Tuple[str, int], EventResultOrError] + self._family = family + self._local_addr = local_addr + + def close(self) -> Awaitable[None]: + """Close all ongoing DNS calls.""" + for ev in self._throttle_dns_events.values(): + ev.cancel() + + return super().close() + + @property + def family(self) -> int: + """Socket family like AF_INET.""" + return self._family + + @property + def use_dns_cache(self) -> bool: + """True if local DNS caching is enabled.""" + return self._use_dns_cache + + def clear_dns_cache( + self, host: Optional[str] = None, port: Optional[int] = None + ) -> None: + """Remove specified host/port or clear all dns local cache.""" + if host is not None and port is not None: + self._cached_hosts.remove((host, port)) + elif host is not None or port is not None: + raise ValueError("either both host and port " "or none of them are allowed") + else: + self._cached_hosts.clear() + + async def _resolve_host( + self, host: str, port: int, traces: Optional[List["Trace"]] = None + ) -> List[Dict[str, Any]]: + if is_ip_address(host): + return [ + { + "hostname": host, + "host": host, + "port": port, + "family": self._family, + "proto": 0, + "flags": 0, + } + ] + + if not self._use_dns_cache: + + if traces: + for trace in traces: + await trace.send_dns_resolvehost_start(host) + + res = await self._resolver.resolve(host, port, family=self._family) + + if traces: + for trace in traces: + await trace.send_dns_resolvehost_end(host) + + return res + + key = (host, port) + + if (key in self._cached_hosts) and (not self._cached_hosts.expired(key)): + # get result early, before any await (#4014) + result = self._cached_hosts.next_addrs(key) + + if traces: + for trace in traces: + await trace.send_dns_cache_hit(host) + return result + + if key in self._throttle_dns_events: + # get event early, before any await (#4014) + event = self._throttle_dns_events[key] + if traces: + for trace in traces: + await trace.send_dns_cache_hit(host) + await event.wait() + else: + # update dict early, before any await (#4014) + self._throttle_dns_events[key] = EventResultOrError(self._loop) + if traces: + for trace in traces: + await trace.send_dns_cache_miss(host) + try: + + if traces: + for trace in traces: + await trace.send_dns_resolvehost_start(host) + + addrs = await self._resolver.resolve(host, port, family=self._family) + if traces: + for trace in traces: + await trace.send_dns_resolvehost_end(host) + + self._cached_hosts.add(key, addrs) + self._throttle_dns_events[key].set() + except BaseException as e: + # any DNS exception, independently of the implementation + # is set for the waiters to raise the same exception. + self._throttle_dns_events[key].set(exc=e) + raise + finally: + self._throttle_dns_events.pop(key) + + return self._cached_hosts.next_addrs(key) + + async def _create_connection( + self, req: "ClientRequest", traces: List["Trace"], timeout: "ClientTimeout" + ) -> ResponseHandler: + """Create connection. + + Has same keyword arguments as BaseEventLoop.create_connection. + """ + if req.proxy: + _, proto = await self._create_proxy_connection(req, traces, timeout) + else: + _, proto = await self._create_direct_connection(req, traces, timeout) + + return proto + + @staticmethod + @functools.lru_cache(None) + def _make_ssl_context(verified: bool) -> SSLContext: + if verified: + return ssl.create_default_context() + else: + sslcontext = ssl.SSLContext(ssl.PROTOCOL_TLS_CLIENT) + sslcontext.options |= ssl.OP_NO_SSLv2 + sslcontext.options |= ssl.OP_NO_SSLv3 + sslcontext.check_hostname = False + sslcontext.verify_mode = ssl.CERT_NONE + try: + sslcontext.options |= ssl.OP_NO_COMPRESSION + except AttributeError as attr_err: + warnings.warn( + "{!s}: The Python interpreter is compiled " + "against OpenSSL < 1.0.0. Ref: " + "https://docs.python.org/3/library/ssl.html" + "#ssl.OP_NO_COMPRESSION".format(attr_err), + ) + sslcontext.set_default_verify_paths() + return sslcontext + + def _get_ssl_context(self, req: "ClientRequest") -> Optional[SSLContext]: + """Logic to get the correct SSL context + + 0. if req.ssl is false, return None + + 1. if ssl_context is specified in req, use it + 2. if _ssl_context is specified in self, use it + 3. otherwise: + 1. if verify_ssl is not specified in req, use self.ssl_context + (will generate a default context according to self.verify_ssl) + 2. if verify_ssl is True in req, generate a default SSL context + 3. if verify_ssl is False in req, generate a SSL context that + won't verify + """ + if req.is_ssl(): + if ssl is None: # pragma: no cover + raise RuntimeError("SSL is not supported.") + sslcontext = req.ssl + if isinstance(sslcontext, ssl.SSLContext): + return sslcontext + if sslcontext is not None: + # not verified or fingerprinted + return self._make_ssl_context(False) + sslcontext = self._ssl + if isinstance(sslcontext, ssl.SSLContext): + return sslcontext + if sslcontext is not None: + # not verified or fingerprinted + return self._make_ssl_context(False) + return self._make_ssl_context(True) + else: + return None + + def _get_fingerprint(self, req: "ClientRequest") -> Optional["Fingerprint"]: + ret = req.ssl + if isinstance(ret, Fingerprint): + return ret + ret = self._ssl + if isinstance(ret, Fingerprint): + return ret + return None + + async def _wrap_create_connection( + self, + *args: Any, + req: "ClientRequest", + timeout: "ClientTimeout", + client_error: Type[Exception] = ClientConnectorError, + **kwargs: Any, + ) -> Tuple[asyncio.Transport, ResponseHandler]: + try: + async with ceil_timeout(timeout.sock_connect): + return await self._loop.create_connection(*args, **kwargs) # type: ignore[return-value] # noqa + except cert_errors as exc: + raise ClientConnectorCertificateError(req.connection_key, exc) from exc + except ssl_errors as exc: + raise ClientConnectorSSLError(req.connection_key, exc) from exc + except OSError as exc: + raise client_error(req.connection_key, exc) from exc + + def _fail_on_no_start_tls(self, req: "ClientRequest") -> None: + """Raise a :py:exc:`RuntimeError` on missing ``start_tls()``. + + One case is that :py:meth:`asyncio.loop.start_tls` is not yet + implemented under Python 3.6. It is necessary for TLS-in-TLS so + that it is possible to send HTTPS queries through HTTPS proxies. + + This doesn't affect regular HTTP requests, though. + """ + if not req.is_ssl(): + return + + proxy_url = req.proxy + assert proxy_url is not None + if proxy_url.scheme != "https": + return + + self._check_loop_for_start_tls() + + def _check_loop_for_start_tls(self) -> None: + try: + self._loop.start_tls + except AttributeError as attr_exc: + raise RuntimeError( + "An HTTPS request is being sent through an HTTPS proxy. " + "This needs support for TLS in TLS but it is not implemented " + "in your runtime for the stdlib asyncio.\n\n" + "Please upgrade to Python 3.7 or higher. For more details, " + "please see:\n" + "* https://bugs.python.org/issue37179\n" + "* https://github.com/python/cpython/pull/28073\n" + "* https://docs.aiohttp.org/en/stable/" + "client_advanced.html#proxy-support\n" + "* https://github.com/aio-libs/aiohttp/discussions/6044\n", + ) from attr_exc + + def _loop_supports_start_tls(self) -> bool: + try: + self._check_loop_for_start_tls() + except RuntimeError: + return False + else: + return True + + def _warn_about_tls_in_tls( + self, + underlying_transport: asyncio.Transport, + req: "ClientRequest", + ) -> None: + """Issue a warning if the requested URL has HTTPS scheme.""" + if req.request_info.url.scheme != "https": + return + + asyncio_supports_tls_in_tls = getattr( + underlying_transport, + "_start_tls_compatible", + False, + ) + + if asyncio_supports_tls_in_tls: + return + + warnings.warn( + "An HTTPS request is being sent through an HTTPS proxy. " + "This support for TLS in TLS is known to be disabled " + "in the stdlib asyncio. This is why you'll probably see " + "an error in the log below.\n\n" + "It is possible to enable it via monkeypatching under " + "Python 3.7 or higher. For more details, see:\n" + "* https://bugs.python.org/issue37179\n" + "* https://github.com/python/cpython/pull/28073\n\n" + "You can temporarily patch this as follows:\n" + "* https://docs.aiohttp.org/en/stable/client_advanced.html#proxy-support\n" + "* https://github.com/aio-libs/aiohttp/discussions/6044\n", + RuntimeWarning, + source=self, + # Why `4`? At least 3 of the calls in the stack originate + # from the methods in this class. + stacklevel=3, + ) + + async def _start_tls_connection( + self, + underlying_transport: asyncio.Transport, + req: "ClientRequest", + timeout: "ClientTimeout", + client_error: Type[Exception] = ClientConnectorError, + ) -> Tuple[asyncio.BaseTransport, ResponseHandler]: + """Wrap the raw TCP transport with TLS.""" + tls_proto = self._factory() # Create a brand new proto for TLS + + # Safety of the `cast()` call here is based on the fact that + # internally `_get_ssl_context()` only returns `None` when + # `req.is_ssl()` evaluates to `False` which is never gonna happen + # in this code path. Of course, it's rather fragile + # maintainability-wise but this is to be solved separately. + sslcontext = cast(ssl.SSLContext, self._get_ssl_context(req)) + + try: + async with ceil_timeout(timeout.sock_connect): + try: + tls_transport = await self._loop.start_tls( + underlying_transport, + tls_proto, + sslcontext, + server_hostname=req.host, + ssl_handshake_timeout=timeout.total, + ) + except BaseException: + # We need to close the underlying transport since + # `start_tls()` probably failed before it had a + # chance to do this: + underlying_transport.close() + raise + except cert_errors as exc: + raise ClientConnectorCertificateError(req.connection_key, exc) from exc + except ssl_errors as exc: + raise ClientConnectorSSLError(req.connection_key, exc) from exc + except OSError as exc: + raise client_error(req.connection_key, exc) from exc + except TypeError as type_err: + # Example cause looks like this: + # TypeError: transport is not supported by start_tls() + + raise ClientConnectionError( + "Cannot initialize a TLS-in-TLS connection to host " + f"{req.host!s}:{req.port:d} through an underlying connection " + f"to an HTTPS proxy {req.proxy!s} ssl:{req.ssl or 'default'} " + f"[{type_err!s}]" + ) from type_err + else: + tls_proto.connection_made( + tls_transport + ) # Kick the state machine of the new TLS protocol + + return tls_transport, tls_proto + + async def _create_direct_connection( + self, + req: "ClientRequest", + traces: List["Trace"], + timeout: "ClientTimeout", + *, + client_error: Type[Exception] = ClientConnectorError, + ) -> Tuple[asyncio.Transport, ResponseHandler]: + sslcontext = self._get_ssl_context(req) + fingerprint = self._get_fingerprint(req) + + host = req.url.raw_host + assert host is not None + port = req.port + assert port is not None + host_resolved = asyncio.ensure_future( + self._resolve_host(host, port, traces=traces), loop=self._loop + ) + try: + # Cancelling this lookup should not cancel the underlying lookup + # or else the cancel event will get broadcast to all the waiters + # across all connections. + hosts = await asyncio.shield(host_resolved) + except asyncio.CancelledError: + + def drop_exception(fut: "asyncio.Future[List[Dict[str, Any]]]") -> None: + with suppress(Exception, asyncio.CancelledError): + fut.result() + + host_resolved.add_done_callback(drop_exception) + raise + except OSError as exc: + # in case of proxy it is not ClientProxyConnectionError + # it is problem of resolving proxy ip itself + raise ClientConnectorError(req.connection_key, exc) from exc + + last_exc = None # type: Optional[Exception] + + for hinfo in hosts: + host = hinfo["host"] + port = hinfo["port"] + + try: + transp, proto = await self._wrap_create_connection( + self._factory, + host, + port, + timeout=timeout, + ssl=sslcontext, + family=hinfo["family"], + proto=hinfo["proto"], + flags=hinfo["flags"], + server_hostname=hinfo["hostname"] if sslcontext else None, + local_addr=self._local_addr, + req=req, + client_error=client_error, + ) + except ClientConnectorError as exc: + last_exc = exc + continue + + if req.is_ssl() and fingerprint: + try: + fingerprint.check(transp) + except ServerFingerprintMismatch as exc: + transp.close() + if not self._cleanup_closed_disabled: + self._cleanup_closed_transports.append(transp) + last_exc = exc + continue + + return transp, proto + else: + assert last_exc is not None + raise last_exc + + async def _create_proxy_connection( + self, req: "ClientRequest", traces: List["Trace"], timeout: "ClientTimeout" + ) -> Tuple[asyncio.BaseTransport, ResponseHandler]: + self._fail_on_no_start_tls(req) + runtime_has_start_tls = self._loop_supports_start_tls() + + headers = {} # type: Dict[str, str] + if req.proxy_headers is not None: + headers = req.proxy_headers # type: ignore[assignment] + headers[hdrs.HOST] = req.headers[hdrs.HOST] + + url = req.proxy + assert url is not None + proxy_req = ClientRequest( + hdrs.METH_GET, + url, + headers=headers, + auth=req.proxy_auth, + loop=self._loop, + ssl=req.ssl, + ) + + # create connection to proxy server + transport, proto = await self._create_direct_connection( + proxy_req, [], timeout, client_error=ClientProxyConnectionError + ) + + # Many HTTP proxies has buggy keepalive support. Let's not + # reuse connection but close it after processing every + # response. + proto.force_close() + + auth = proxy_req.headers.pop(hdrs.AUTHORIZATION, None) + if auth is not None: + if not req.is_ssl(): + req.headers[hdrs.PROXY_AUTHORIZATION] = auth + else: + proxy_req.headers[hdrs.PROXY_AUTHORIZATION] = auth + + if req.is_ssl(): + if runtime_has_start_tls: + self._warn_about_tls_in_tls(transport, req) + + # For HTTPS requests over HTTP proxy + # we must notify proxy to tunnel connection + # so we send CONNECT command: + # CONNECT www.python.org:443 HTTP/1.1 + # Host: www.python.org + # + # next we must do TLS handshake and so on + # to do this we must wrap raw socket into secure one + # asyncio handles this perfectly + proxy_req.method = hdrs.METH_CONNECT + proxy_req.url = req.url + key = attr.evolve( + req.connection_key, proxy=None, proxy_auth=None, proxy_headers_hash=None + ) + conn = Connection(self, key, proto, self._loop) + proxy_resp = await proxy_req.send(conn) + try: + protocol = conn._protocol + assert protocol is not None + + # read_until_eof=True will ensure the connection isn't closed + # once the response is received and processed allowing + # START_TLS to work on the connection below. + protocol.set_response_params(read_until_eof=runtime_has_start_tls) + resp = await proxy_resp.start(conn) + except BaseException: + proxy_resp.close() + conn.close() + raise + else: + conn._protocol = None + conn._transport = None + try: + if resp.status != 200: + message = resp.reason + if message is None: + message = RESPONSES[resp.status][0] + raise ClientHttpProxyError( + proxy_resp.request_info, + resp.history, + status=resp.status, + message=message, + headers=resp.headers, + ) + if not runtime_has_start_tls: + rawsock = transport.get_extra_info("socket", default=None) + if rawsock is None: + raise RuntimeError( + "Transport does not expose socket instance" + ) + # Duplicate the socket, so now we can close proxy transport + rawsock = rawsock.dup() + except BaseException: + # It shouldn't be closed in `finally` because it's fed to + # `loop.start_tls()` and the docs say not to touch it after + # passing there. + transport.close() + raise + finally: + if not runtime_has_start_tls: + transport.close() + + if not runtime_has_start_tls: + # HTTP proxy with support for upgrade to HTTPS + sslcontext = self._get_ssl_context(req) + return await self._wrap_create_connection( + self._factory, + timeout=timeout, + ssl=sslcontext, + sock=rawsock, + server_hostname=req.host, + req=req, + ) + + return await self._start_tls_connection( + # Access the old transport for the last time before it's + # closed and forgotten forever: + transport, + req=req, + timeout=timeout, + ) + finally: + proxy_resp.close() + + return transport, proto + + +class UnixConnector(BaseConnector): + """Unix socket connector. + + path - Unix socket path. + keepalive_timeout - (optional) Keep-alive timeout. + force_close - Set to True to force close and do reconnect + after each request (and between redirects). + limit - The total number of simultaneous connections. + limit_per_host - Number of simultaneous connections to one host. + loop - Optional event loop. + """ + + def __init__( + self, + path: str, + force_close: bool = False, + keepalive_timeout: Union[object, float, None] = sentinel, + limit: int = 100, + limit_per_host: int = 0, + loop: Optional[asyncio.AbstractEventLoop] = None, + ) -> None: + super().__init__( + force_close=force_close, + keepalive_timeout=keepalive_timeout, + limit=limit, + limit_per_host=limit_per_host, + loop=loop, + ) + self._path = path + + @property + def path(self) -> str: + """Path to unix socket.""" + return self._path + + async def _create_connection( + self, req: "ClientRequest", traces: List["Trace"], timeout: "ClientTimeout" + ) -> ResponseHandler: + try: + async with ceil_timeout(timeout.sock_connect): + _, proto = await self._loop.create_unix_connection( + self._factory, self._path + ) + except OSError as exc: + raise UnixClientConnectorError(self.path, req.connection_key, exc) from exc + + return cast(ResponseHandler, proto) + + +class NamedPipeConnector(BaseConnector): + """Named pipe connector. + + Only supported by the proactor event loop. + See also: https://docs.python.org/3.7/library/asyncio-eventloop.html + + path - Windows named pipe path. + keepalive_timeout - (optional) Keep-alive timeout. + force_close - Set to True to force close and do reconnect + after each request (and between redirects). + limit - The total number of simultaneous connections. + limit_per_host - Number of simultaneous connections to one host. + loop - Optional event loop. + """ + + def __init__( + self, + path: str, + force_close: bool = False, + keepalive_timeout: Union[object, float, None] = sentinel, + limit: int = 100, + limit_per_host: int = 0, + loop: Optional[asyncio.AbstractEventLoop] = None, + ) -> None: + super().__init__( + force_close=force_close, + keepalive_timeout=keepalive_timeout, + limit=limit, + limit_per_host=limit_per_host, + loop=loop, + ) + if not isinstance( + self._loop, asyncio.ProactorEventLoop # type: ignore[attr-defined] + ): + raise RuntimeError( + "Named Pipes only available in proactor " "loop under windows" + ) + self._path = path + + @property + def path(self) -> str: + """Path to the named pipe.""" + return self._path + + async def _create_connection( + self, req: "ClientRequest", traces: List["Trace"], timeout: "ClientTimeout" + ) -> ResponseHandler: + try: + async with ceil_timeout(timeout.sock_connect): + _, proto = await self._loop.create_pipe_connection( # type: ignore[attr-defined] # noqa: E501 + self._factory, self._path + ) + # the drain is required so that the connection_made is called + # and transport is set otherwise it is not set before the + # `assert conn.transport is not None` + # in client.py's _request method + await asyncio.sleep(0) + # other option is to manually set transport like + # `proto.transport = trans` + except OSError as exc: + raise ClientConnectorError(req.connection_key, exc) from exc + + return cast(ResponseHandler, proto) diff --git a/sbsheriff/Lib/site-packages/aiohttp/cookiejar.py b/sbsheriff/Lib/site-packages/aiohttp/cookiejar.py new file mode 100644 index 0000000..0a26566 --- /dev/null +++ b/sbsheriff/Lib/site-packages/aiohttp/cookiejar.py @@ -0,0 +1,413 @@ +import asyncio +import contextlib +import datetime +import os # noqa +import pathlib +import pickle +import re +from collections import defaultdict +from http.cookies import BaseCookie, Morsel, SimpleCookie +from typing import ( # noqa + DefaultDict, + Dict, + Iterable, + Iterator, + List, + Mapping, + Optional, + Set, + Tuple, + Union, + cast, +) + +from yarl import URL + +from .abc import AbstractCookieJar, ClearCookiePredicate +from .helpers import is_ip_address, next_whole_second +from .typedefs import LooseCookies, PathLike, StrOrURL + +__all__ = ("CookieJar", "DummyCookieJar") + + +CookieItem = Union[str, "Morsel[str]"] + + +class CookieJar(AbstractCookieJar): + """Implements cookie storage adhering to RFC 6265.""" + + DATE_TOKENS_RE = re.compile( + r"[\x09\x20-\x2F\x3B-\x40\x5B-\x60\x7B-\x7E]*" + r"(?P[\x00-\x08\x0A-\x1F\d:a-zA-Z\x7F-\xFF]+)" + ) + + DATE_HMS_TIME_RE = re.compile(r"(\d{1,2}):(\d{1,2}):(\d{1,2})") + + DATE_DAY_OF_MONTH_RE = re.compile(r"(\d{1,2})") + + DATE_MONTH_RE = re.compile( + "(jan)|(feb)|(mar)|(apr)|(may)|(jun)|(jul)|" "(aug)|(sep)|(oct)|(nov)|(dec)", + re.I, + ) + + DATE_YEAR_RE = re.compile(r"(\d{2,4})") + + MAX_TIME = datetime.datetime.max.replace(tzinfo=datetime.timezone.utc) + + MAX_32BIT_TIME = datetime.datetime.utcfromtimestamp(2 ** 31 - 1) + + def __init__( + self, + *, + unsafe: bool = False, + quote_cookie: bool = True, + treat_as_secure_origin: Union[StrOrURL, List[StrOrURL], None] = None, + loop: Optional[asyncio.AbstractEventLoop] = None, + ) -> None: + super().__init__(loop=loop) + self._cookies = defaultdict( + SimpleCookie + ) # type: DefaultDict[str, SimpleCookie[str]] + self._host_only_cookies = set() # type: Set[Tuple[str, str]] + self._unsafe = unsafe + self._quote_cookie = quote_cookie + if treat_as_secure_origin is None: + treat_as_secure_origin = [] + elif isinstance(treat_as_secure_origin, URL): + treat_as_secure_origin = [treat_as_secure_origin.origin()] + elif isinstance(treat_as_secure_origin, str): + treat_as_secure_origin = [URL(treat_as_secure_origin).origin()] + else: + treat_as_secure_origin = [ + URL(url).origin() if isinstance(url, str) else url.origin() + for url in treat_as_secure_origin + ] + self._treat_as_secure_origin = treat_as_secure_origin + self._next_expiration = next_whole_second() + self._expirations = {} # type: Dict[Tuple[str, str], datetime.datetime] + # #4515: datetime.max may not be representable on 32-bit platforms + self._max_time = self.MAX_TIME + try: + self._max_time.timestamp() + except OverflowError: + self._max_time = self.MAX_32BIT_TIME + + def save(self, file_path: PathLike) -> None: + file_path = pathlib.Path(file_path) + with file_path.open(mode="wb") as f: + pickle.dump(self._cookies, f, pickle.HIGHEST_PROTOCOL) + + def load(self, file_path: PathLike) -> None: + file_path = pathlib.Path(file_path) + with file_path.open(mode="rb") as f: + self._cookies = pickle.load(f) + + def clear(self, predicate: Optional[ClearCookiePredicate] = None) -> None: + if predicate is None: + self._next_expiration = next_whole_second() + self._cookies.clear() + self._host_only_cookies.clear() + self._expirations.clear() + return + + to_del = [] + now = datetime.datetime.now(datetime.timezone.utc) + for domain, cookie in self._cookies.items(): + for name, morsel in cookie.items(): + key = (domain, name) + if ( + key in self._expirations and self._expirations[key] <= now + ) or predicate(morsel): + to_del.append(key) + + for domain, name in to_del: + key = (domain, name) + self._host_only_cookies.discard(key) + if key in self._expirations: + del self._expirations[(domain, name)] + self._cookies[domain].pop(name, None) + + next_expiration = min(self._expirations.values(), default=self._max_time) + try: + self._next_expiration = next_expiration.replace( + microsecond=0 + ) + datetime.timedelta(seconds=1) + except OverflowError: + self._next_expiration = self._max_time + + def clear_domain(self, domain: str) -> None: + self.clear(lambda x: self._is_domain_match(domain, x["domain"])) + + def __iter__(self) -> "Iterator[Morsel[str]]": + self._do_expiration() + for val in self._cookies.values(): + yield from val.values() + + def __len__(self) -> int: + return sum(1 for i in self) + + def _do_expiration(self) -> None: + self.clear(lambda x: False) + + def _expire_cookie(self, when: datetime.datetime, domain: str, name: str) -> None: + self._next_expiration = min(self._next_expiration, when) + self._expirations[(domain, name)] = when + + def update_cookies(self, cookies: LooseCookies, response_url: URL = URL()) -> None: + """Update cookies.""" + hostname = response_url.raw_host + + if not self._unsafe and is_ip_address(hostname): + # Don't accept cookies from IPs + return + + if isinstance(cookies, Mapping): + cookies = cookies.items() + + for name, cookie in cookies: + if not isinstance(cookie, Morsel): + tmp = SimpleCookie() # type: SimpleCookie[str] + tmp[name] = cookie # type: ignore[assignment] + cookie = tmp[name] + + domain = cookie["domain"] + + # ignore domains with trailing dots + if domain.endswith("."): + domain = "" + del cookie["domain"] + + if not domain and hostname is not None: + # Set the cookie's domain to the response hostname + # and set its host-only-flag + self._host_only_cookies.add((hostname, name)) + domain = cookie["domain"] = hostname + + if domain.startswith("."): + # Remove leading dot + domain = domain[1:] + cookie["domain"] = domain + + if hostname and not self._is_domain_match(domain, hostname): + # Setting cookies for different domains is not allowed + continue + + path = cookie["path"] + if not path or not path.startswith("/"): + # Set the cookie's path to the response path + path = response_url.path + if not path.startswith("/"): + path = "/" + else: + # Cut everything from the last slash to the end + path = "/" + path[1 : path.rfind("/")] + cookie["path"] = path + + max_age = cookie["max-age"] + if max_age: + try: + delta_seconds = int(max_age) + try: + max_age_expiration = datetime.datetime.now( + datetime.timezone.utc + ) + datetime.timedelta(seconds=delta_seconds) + except OverflowError: + max_age_expiration = self._max_time + self._expire_cookie(max_age_expiration, domain, name) + except ValueError: + cookie["max-age"] = "" + + else: + expires = cookie["expires"] + if expires: + expire_time = self._parse_date(expires) + if expire_time: + self._expire_cookie(expire_time, domain, name) + else: + cookie["expires"] = "" + + self._cookies[domain][name] = cookie + + self._do_expiration() + + def filter_cookies( + self, request_url: URL = URL() + ) -> Union["BaseCookie[str]", "SimpleCookie[str]"]: + """Returns this jar's cookies filtered by their attributes.""" + self._do_expiration() + request_url = URL(request_url) + filtered: Union["SimpleCookie[str]", "BaseCookie[str]"] = ( + SimpleCookie() if self._quote_cookie else BaseCookie() + ) + hostname = request_url.raw_host or "" + request_origin = URL() + with contextlib.suppress(ValueError): + request_origin = request_url.origin() + + is_not_secure = ( + request_url.scheme not in ("https", "wss") + and request_origin not in self._treat_as_secure_origin + ) + + for cookie in self: + name = cookie.key + domain = cookie["domain"] + + # Send shared cookies + if not domain: + filtered[name] = cookie.value + continue + + if not self._unsafe and is_ip_address(hostname): + continue + + if (domain, name) in self._host_only_cookies: + if domain != hostname: + continue + elif not self._is_domain_match(domain, hostname): + continue + + if not self._is_path_match(request_url.path, cookie["path"]): + continue + + if is_not_secure and cookie["secure"]: + continue + + # It's critical we use the Morsel so the coded_value + # (based on cookie version) is preserved + mrsl_val = cast("Morsel[str]", cookie.get(cookie.key, Morsel())) + mrsl_val.set(cookie.key, cookie.value, cookie.coded_value) + filtered[name] = mrsl_val + + return filtered + + @staticmethod + def _is_domain_match(domain: str, hostname: str) -> bool: + """Implements domain matching adhering to RFC 6265.""" + if hostname == domain: + return True + + if not hostname.endswith(domain): + return False + + non_matching = hostname[: -len(domain)] + + if not non_matching.endswith("."): + return False + + return not is_ip_address(hostname) + + @staticmethod + def _is_path_match(req_path: str, cookie_path: str) -> bool: + """Implements path matching adhering to RFC 6265.""" + if not req_path.startswith("/"): + req_path = "/" + + if req_path == cookie_path: + return True + + if not req_path.startswith(cookie_path): + return False + + if cookie_path.endswith("/"): + return True + + non_matching = req_path[len(cookie_path) :] + + return non_matching.startswith("/") + + @classmethod + def _parse_date(cls, date_str: str) -> Optional[datetime.datetime]: + """Implements date string parsing adhering to RFC 6265.""" + if not date_str: + return None + + found_time = False + found_day = False + found_month = False + found_year = False + + hour = minute = second = 0 + day = 0 + month = 0 + year = 0 + + for token_match in cls.DATE_TOKENS_RE.finditer(date_str): + + token = token_match.group("token") + + if not found_time: + time_match = cls.DATE_HMS_TIME_RE.match(token) + if time_match: + found_time = True + hour, minute, second = (int(s) for s in time_match.groups()) + continue + + if not found_day: + day_match = cls.DATE_DAY_OF_MONTH_RE.match(token) + if day_match: + found_day = True + day = int(day_match.group()) + continue + + if not found_month: + month_match = cls.DATE_MONTH_RE.match(token) + if month_match: + found_month = True + assert month_match.lastindex is not None + month = month_match.lastindex + continue + + if not found_year: + year_match = cls.DATE_YEAR_RE.match(token) + if year_match: + found_year = True + year = int(year_match.group()) + + if 70 <= year <= 99: + year += 1900 + elif 0 <= year <= 69: + year += 2000 + + if False in (found_day, found_month, found_year, found_time): + return None + + if not 1 <= day <= 31: + return None + + if year < 1601 or hour > 23 or minute > 59 or second > 59: + return None + + return datetime.datetime( + year, month, day, hour, minute, second, tzinfo=datetime.timezone.utc + ) + + +class DummyCookieJar(AbstractCookieJar): + """Implements a dummy cookie storage. + + It can be used with the ClientSession when no cookie processing is needed. + + """ + + def __init__(self, *, loop: Optional[asyncio.AbstractEventLoop] = None) -> None: + super().__init__(loop=loop) + + def __iter__(self) -> "Iterator[Morsel[str]]": + while False: + yield None + + def __len__(self) -> int: + return 0 + + def clear(self, predicate: Optional[ClearCookiePredicate] = None) -> None: + pass + + def clear_domain(self, domain: str) -> None: + pass + + def update_cookies(self, cookies: LooseCookies, response_url: URL = URL()) -> None: + pass + + def filter_cookies(self, request_url: URL) -> "BaseCookie[str]": + return SimpleCookie() diff --git a/sbsheriff/Lib/site-packages/aiohttp/formdata.py b/sbsheriff/Lib/site-packages/aiohttp/formdata.py new file mode 100644 index 0000000..4857c89 --- /dev/null +++ b/sbsheriff/Lib/site-packages/aiohttp/formdata.py @@ -0,0 +1,172 @@ +import io +from typing import Any, Iterable, List, Optional +from urllib.parse import urlencode + +from multidict import MultiDict, MultiDictProxy + +from . import hdrs, multipart, payload +from .helpers import guess_filename +from .payload import Payload + +__all__ = ("FormData",) + + +class FormData: + """Helper class for form body generation. + + Supports multipart/form-data and application/x-www-form-urlencoded. + """ + + def __init__( + self, + fields: Iterable[Any] = (), + quote_fields: bool = True, + charset: Optional[str] = None, + ) -> None: + self._writer = multipart.MultipartWriter("form-data") + self._fields = [] # type: List[Any] + self._is_multipart = False + self._is_processed = False + self._quote_fields = quote_fields + self._charset = charset + + if isinstance(fields, dict): + fields = list(fields.items()) + elif not isinstance(fields, (list, tuple)): + fields = (fields,) + self.add_fields(*fields) + + @property + def is_multipart(self) -> bool: + return self._is_multipart + + def add_field( + self, + name: str, + value: Any, + *, + content_type: Optional[str] = None, + filename: Optional[str] = None, + content_transfer_encoding: Optional[str] = None, + ) -> None: + + if isinstance(value, io.IOBase): + self._is_multipart = True + elif isinstance(value, (bytes, bytearray, memoryview)): + if filename is None and content_transfer_encoding is None: + filename = name + + type_options = MultiDict({"name": name}) # type: MultiDict[str] + if filename is not None and not isinstance(filename, str): + raise TypeError( + "filename must be an instance of str. " "Got: %s" % filename + ) + if filename is None and isinstance(value, io.IOBase): + filename = guess_filename(value, name) + if filename is not None: + type_options["filename"] = filename + self._is_multipart = True + + headers = {} + if content_type is not None: + if not isinstance(content_type, str): + raise TypeError( + "content_type must be an instance of str. " "Got: %s" % content_type + ) + headers[hdrs.CONTENT_TYPE] = content_type + self._is_multipart = True + if content_transfer_encoding is not None: + if not isinstance(content_transfer_encoding, str): + raise TypeError( + "content_transfer_encoding must be an instance" + " of str. Got: %s" % content_transfer_encoding + ) + headers[hdrs.CONTENT_TRANSFER_ENCODING] = content_transfer_encoding + self._is_multipart = True + + self._fields.append((type_options, headers, value)) + + def add_fields(self, *fields: Any) -> None: + to_add = list(fields) + + while to_add: + rec = to_add.pop(0) + + if isinstance(rec, io.IOBase): + k = guess_filename(rec, "unknown") + self.add_field(k, rec) # type: ignore[arg-type] + + elif isinstance(rec, (MultiDictProxy, MultiDict)): + to_add.extend(rec.items()) + + elif isinstance(rec, (list, tuple)) and len(rec) == 2: + k, fp = rec + self.add_field(k, fp) # type: ignore[arg-type] + + else: + raise TypeError( + "Only io.IOBase, multidict and (name, file) " + "pairs allowed, use .add_field() for passing " + "more complex parameters, got {!r}".format(rec) + ) + + def _gen_form_urlencoded(self) -> payload.BytesPayload: + # form data (x-www-form-urlencoded) + data = [] + for type_options, _, value in self._fields: + data.append((type_options["name"], value)) + + charset = self._charset if self._charset is not None else "utf-8" + + if charset == "utf-8": + content_type = "application/x-www-form-urlencoded" + else: + content_type = "application/x-www-form-urlencoded; " "charset=%s" % charset + + return payload.BytesPayload( + urlencode(data, doseq=True, encoding=charset).encode(), + content_type=content_type, + ) + + def _gen_form_data(self) -> multipart.MultipartWriter: + """Encode a list of fields using the multipart/form-data MIME format""" + if self._is_processed: + raise RuntimeError("Form data has been processed already") + for dispparams, headers, value in self._fields: + try: + if hdrs.CONTENT_TYPE in headers: + part = payload.get_payload( + value, + content_type=headers[hdrs.CONTENT_TYPE], + headers=headers, + encoding=self._charset, + ) + else: + part = payload.get_payload( + value, headers=headers, encoding=self._charset + ) + except Exception as exc: + raise TypeError( + "Can not serialize value type: %r\n " + "headers: %r\n value: %r" % (type(value), headers, value) + ) from exc + + if dispparams: + part.set_content_disposition( + "form-data", quote_fields=self._quote_fields, **dispparams + ) + # FIXME cgi.FieldStorage doesn't likes body parts with + # Content-Length which were sent via chunked transfer encoding + assert part.headers is not None + part.headers.popall(hdrs.CONTENT_LENGTH, None) + + self._writer.append_payload(part) + + self._is_processed = True + return self._writer + + def __call__(self) -> Payload: + if self._is_multipart: + return self._gen_form_data() + else: + return self._gen_form_urlencoded() diff --git a/sbsheriff/Lib/site-packages/aiohttp/hdrs.py b/sbsheriff/Lib/site-packages/aiohttp/hdrs.py new file mode 100644 index 0000000..a619f25 --- /dev/null +++ b/sbsheriff/Lib/site-packages/aiohttp/hdrs.py @@ -0,0 +1,114 @@ +"""HTTP Headers constants.""" + +# After changing the file content call ./tools/gen.py +# to regenerate the headers parser +import sys +from typing import Set + +from multidict import istr + +if sys.version_info >= (3, 8): + from typing import Final +else: + from typing_extensions import Final + +METH_ANY: Final[str] = "*" +METH_CONNECT: Final[str] = "CONNECT" +METH_HEAD: Final[str] = "HEAD" +METH_GET: Final[str] = "GET" +METH_DELETE: Final[str] = "DELETE" +METH_OPTIONS: Final[str] = "OPTIONS" +METH_PATCH: Final[str] = "PATCH" +METH_POST: Final[str] = "POST" +METH_PUT: Final[str] = "PUT" +METH_TRACE: Final[str] = "TRACE" + +METH_ALL: Final[Set[str]] = { + METH_CONNECT, + METH_HEAD, + METH_GET, + METH_DELETE, + METH_OPTIONS, + METH_PATCH, + METH_POST, + METH_PUT, + METH_TRACE, +} + +ACCEPT: Final[istr] = istr("Accept") +ACCEPT_CHARSET: Final[istr] = istr("Accept-Charset") +ACCEPT_ENCODING: Final[istr] = istr("Accept-Encoding") +ACCEPT_LANGUAGE: Final[istr] = istr("Accept-Language") +ACCEPT_RANGES: Final[istr] = istr("Accept-Ranges") +ACCESS_CONTROL_MAX_AGE: Final[istr] = istr("Access-Control-Max-Age") +ACCESS_CONTROL_ALLOW_CREDENTIALS: Final[istr] = istr("Access-Control-Allow-Credentials") +ACCESS_CONTROL_ALLOW_HEADERS: Final[istr] = istr("Access-Control-Allow-Headers") +ACCESS_CONTROL_ALLOW_METHODS: Final[istr] = istr("Access-Control-Allow-Methods") +ACCESS_CONTROL_ALLOW_ORIGIN: Final[istr] = istr("Access-Control-Allow-Origin") +ACCESS_CONTROL_EXPOSE_HEADERS: Final[istr] = istr("Access-Control-Expose-Headers") +ACCESS_CONTROL_REQUEST_HEADERS: Final[istr] = istr("Access-Control-Request-Headers") +ACCESS_CONTROL_REQUEST_METHOD: Final[istr] = istr("Access-Control-Request-Method") +AGE: Final[istr] = istr("Age") +ALLOW: Final[istr] = istr("Allow") +AUTHORIZATION: Final[istr] = istr("Authorization") +CACHE_CONTROL: Final[istr] = istr("Cache-Control") +CONNECTION: Final[istr] = istr("Connection") +CONTENT_DISPOSITION: Final[istr] = istr("Content-Disposition") +CONTENT_ENCODING: Final[istr] = istr("Content-Encoding") +CONTENT_LANGUAGE: Final[istr] = istr("Content-Language") +CONTENT_LENGTH: Final[istr] = istr("Content-Length") +CONTENT_LOCATION: Final[istr] = istr("Content-Location") +CONTENT_MD5: Final[istr] = istr("Content-MD5") +CONTENT_RANGE: Final[istr] = istr("Content-Range") +CONTENT_TRANSFER_ENCODING: Final[istr] = istr("Content-Transfer-Encoding") +CONTENT_TYPE: Final[istr] = istr("Content-Type") +COOKIE: Final[istr] = istr("Cookie") +DATE: Final[istr] = istr("Date") +DESTINATION: Final[istr] = istr("Destination") +DIGEST: Final[istr] = istr("Digest") +ETAG: Final[istr] = istr("Etag") +EXPECT: Final[istr] = istr("Expect") +EXPIRES: Final[istr] = istr("Expires") +FORWARDED: Final[istr] = istr("Forwarded") +FROM: Final[istr] = istr("From") +HOST: Final[istr] = istr("Host") +IF_MATCH: Final[istr] = istr("If-Match") +IF_MODIFIED_SINCE: Final[istr] = istr("If-Modified-Since") +IF_NONE_MATCH: Final[istr] = istr("If-None-Match") +IF_RANGE: Final[istr] = istr("If-Range") +IF_UNMODIFIED_SINCE: Final[istr] = istr("If-Unmodified-Since") +KEEP_ALIVE: Final[istr] = istr("Keep-Alive") +LAST_EVENT_ID: Final[istr] = istr("Last-Event-ID") +LAST_MODIFIED: Final[istr] = istr("Last-Modified") +LINK: Final[istr] = istr("Link") +LOCATION: Final[istr] = istr("Location") +MAX_FORWARDS: Final[istr] = istr("Max-Forwards") +ORIGIN: Final[istr] = istr("Origin") +PRAGMA: Final[istr] = istr("Pragma") +PROXY_AUTHENTICATE: Final[istr] = istr("Proxy-Authenticate") +PROXY_AUTHORIZATION: Final[istr] = istr("Proxy-Authorization") +RANGE: Final[istr] = istr("Range") +REFERER: Final[istr] = istr("Referer") +RETRY_AFTER: Final[istr] = istr("Retry-After") +SEC_WEBSOCKET_ACCEPT: Final[istr] = istr("Sec-WebSocket-Accept") +SEC_WEBSOCKET_VERSION: Final[istr] = istr("Sec-WebSocket-Version") +SEC_WEBSOCKET_PROTOCOL: Final[istr] = istr("Sec-WebSocket-Protocol") +SEC_WEBSOCKET_EXTENSIONS: Final[istr] = istr("Sec-WebSocket-Extensions") +SEC_WEBSOCKET_KEY: Final[istr] = istr("Sec-WebSocket-Key") +SEC_WEBSOCKET_KEY1: Final[istr] = istr("Sec-WebSocket-Key1") +SERVER: Final[istr] = istr("Server") +SET_COOKIE: Final[istr] = istr("Set-Cookie") +TE: Final[istr] = istr("TE") +TRAILER: Final[istr] = istr("Trailer") +TRANSFER_ENCODING: Final[istr] = istr("Transfer-Encoding") +UPGRADE: Final[istr] = istr("Upgrade") +URI: Final[istr] = istr("URI") +USER_AGENT: Final[istr] = istr("User-Agent") +VARY: Final[istr] = istr("Vary") +VIA: Final[istr] = istr("Via") +WANT_DIGEST: Final[istr] = istr("Want-Digest") +WARNING: Final[istr] = istr("Warning") +WWW_AUTHENTICATE: Final[istr] = istr("WWW-Authenticate") +X_FORWARDED_FOR: Final[istr] = istr("X-Forwarded-For") +X_FORWARDED_HOST: Final[istr] = istr("X-Forwarded-Host") +X_FORWARDED_PROTO: Final[istr] = istr("X-Forwarded-Proto") diff --git a/sbsheriff/Lib/site-packages/aiohttp/helpers.py b/sbsheriff/Lib/site-packages/aiohttp/helpers.py new file mode 100644 index 0000000..536d219 --- /dev/null +++ b/sbsheriff/Lib/site-packages/aiohttp/helpers.py @@ -0,0 +1,875 @@ +"""Various helper functions""" + +import asyncio +import base64 +import binascii +import cgi +import datetime +import functools +import inspect +import netrc +import os +import platform +import re +import sys +import time +import warnings +import weakref +from collections import namedtuple +from contextlib import suppress +from email.utils import parsedate +from math import ceil +from pathlib import Path +from types import TracebackType +from typing import ( + Any, + Callable, + ContextManager, + Dict, + Generator, + Generic, + Iterable, + Iterator, + List, + Mapping, + Optional, + Pattern, + Set, + Tuple, + Type, + TypeVar, + Union, + cast, +) +from urllib.parse import quote +from urllib.request import getproxies, proxy_bypass + +import async_timeout +import attr +from multidict import MultiDict, MultiDictProxy +from yarl import URL + +from . import hdrs +from .log import client_logger, internal_logger +from .typedefs import PathLike, Protocol # noqa + +__all__ = ("BasicAuth", "ChainMapProxy", "ETag") + +IS_MACOS = platform.system() == "Darwin" +IS_WINDOWS = platform.system() == "Windows" + +PY_36 = sys.version_info >= (3, 6) +PY_37 = sys.version_info >= (3, 7) +PY_38 = sys.version_info >= (3, 8) +PY_310 = sys.version_info >= (3, 10) + +if sys.version_info < (3, 7): + import idna_ssl + + idna_ssl.patch_match_hostname() + + def all_tasks( + loop: Optional[asyncio.AbstractEventLoop] = None, + ) -> Set["asyncio.Task[Any]"]: + tasks = list(asyncio.Task.all_tasks(loop)) + return {t for t in tasks if not t.done()} + + +else: + all_tasks = asyncio.all_tasks + + +_T = TypeVar("_T") +_S = TypeVar("_S") + + +sentinel = object() # type: Any +NO_EXTENSIONS = bool(os.environ.get("AIOHTTP_NO_EXTENSIONS")) # type: bool + +# N.B. sys.flags.dev_mode is available on Python 3.7+, use getattr +# for compatibility with older versions +DEBUG = getattr(sys.flags, "dev_mode", False) or ( + not sys.flags.ignore_environment and bool(os.environ.get("PYTHONASYNCIODEBUG")) +) # type: bool + + +CHAR = {chr(i) for i in range(0, 128)} +CTL = {chr(i) for i in range(0, 32)} | { + chr(127), +} +SEPARATORS = { + "(", + ")", + "<", + ">", + "@", + ",", + ";", + ":", + "\\", + '"', + "/", + "[", + "]", + "?", + "=", + "{", + "}", + " ", + chr(9), +} +TOKEN = CHAR ^ CTL ^ SEPARATORS + + +class noop: + def __await__(self) -> Generator[None, None, None]: + yield + + +class BasicAuth(namedtuple("BasicAuth", ["login", "password", "encoding"])): + """Http basic authentication helper.""" + + def __new__( + cls, login: str, password: str = "", encoding: str = "latin1" + ) -> "BasicAuth": + if login is None: + raise ValueError("None is not allowed as login value") + + if password is None: + raise ValueError("None is not allowed as password value") + + if ":" in login: + raise ValueError('A ":" is not allowed in login (RFC 1945#section-11.1)') + + return super().__new__(cls, login, password, encoding) + + @classmethod + def decode(cls, auth_header: str, encoding: str = "latin1") -> "BasicAuth": + """Create a BasicAuth object from an Authorization HTTP header.""" + try: + auth_type, encoded_credentials = auth_header.split(" ", 1) + except ValueError: + raise ValueError("Could not parse authorization header.") + + if auth_type.lower() != "basic": + raise ValueError("Unknown authorization method %s" % auth_type) + + try: + decoded = base64.b64decode( + encoded_credentials.encode("ascii"), validate=True + ).decode(encoding) + except binascii.Error: + raise ValueError("Invalid base64 encoding.") + + try: + # RFC 2617 HTTP Authentication + # https://www.ietf.org/rfc/rfc2617.txt + # the colon must be present, but the username and password may be + # otherwise blank. + username, password = decoded.split(":", 1) + except ValueError: + raise ValueError("Invalid credentials.") + + return cls(username, password, encoding=encoding) + + @classmethod + def from_url(cls, url: URL, *, encoding: str = "latin1") -> Optional["BasicAuth"]: + """Create BasicAuth from url.""" + if not isinstance(url, URL): + raise TypeError("url should be yarl.URL instance") + if url.user is None: + return None + return cls(url.user, url.password or "", encoding=encoding) + + def encode(self) -> str: + """Encode credentials.""" + creds = (f"{self.login}:{self.password}").encode(self.encoding) + return "Basic %s" % base64.b64encode(creds).decode(self.encoding) + + +def strip_auth_from_url(url: URL) -> Tuple[URL, Optional[BasicAuth]]: + auth = BasicAuth.from_url(url) + if auth is None: + return url, None + else: + return url.with_user(None), auth + + +def netrc_from_env() -> Optional[netrc.netrc]: + """Load netrc from file. + + Attempt to load it from the path specified by the env-var + NETRC or in the default location in the user's home directory. + + Returns None if it couldn't be found or fails to parse. + """ + netrc_env = os.environ.get("NETRC") + + if netrc_env is not None: + netrc_path = Path(netrc_env) + else: + try: + home_dir = Path.home() + except RuntimeError as e: # pragma: no cover + # if pathlib can't resolve home, it may raise a RuntimeError + client_logger.debug( + "Could not resolve home directory when " + "trying to look for .netrc file: %s", + e, + ) + return None + + netrc_path = home_dir / ("_netrc" if IS_WINDOWS else ".netrc") + + try: + return netrc.netrc(str(netrc_path)) + except netrc.NetrcParseError as e: + client_logger.warning("Could not parse .netrc file: %s", e) + except OSError as e: + # we couldn't read the file (doesn't exist, permissions, etc.) + if netrc_env or netrc_path.is_file(): + # only warn if the environment wanted us to load it, + # or it appears like the default file does actually exist + client_logger.warning("Could not read .netrc file: %s", e) + + return None + + +@attr.s(auto_attribs=True, frozen=True, slots=True) +class ProxyInfo: + proxy: URL + proxy_auth: Optional[BasicAuth] + + +def proxies_from_env() -> Dict[str, ProxyInfo]: + proxy_urls = { + k: URL(v) + for k, v in getproxies().items() + if k in ("http", "https", "ws", "wss") + } + netrc_obj = netrc_from_env() + stripped = {k: strip_auth_from_url(v) for k, v in proxy_urls.items()} + ret = {} + for proto, val in stripped.items(): + proxy, auth = val + if proxy.scheme in ("https", "wss"): + client_logger.warning( + "%s proxies %s are not supported, ignoring", proxy.scheme.upper(), proxy + ) + continue + if netrc_obj and auth is None: + auth_from_netrc = None + if proxy.host is not None: + auth_from_netrc = netrc_obj.authenticators(proxy.host) + if auth_from_netrc is not None: + # auth_from_netrc is a (`user`, `account`, `password`) tuple, + # `user` and `account` both can be username, + # if `user` is None, use `account` + *logins, password = auth_from_netrc + login = logins[0] if logins[0] else logins[-1] + auth = BasicAuth(cast(str, login), cast(str, password)) + ret[proto] = ProxyInfo(proxy, auth) + return ret + + +def current_task( + loop: Optional[asyncio.AbstractEventLoop] = None, +) -> "Optional[asyncio.Task[Any]]": + if sys.version_info >= (3, 7): + return asyncio.current_task(loop=loop) + else: + return asyncio.Task.current_task(loop=loop) + + +def get_running_loop( + loop: Optional[asyncio.AbstractEventLoop] = None, +) -> asyncio.AbstractEventLoop: + if loop is None: + loop = asyncio.get_event_loop() + if not loop.is_running(): + warnings.warn( + "The object should be created within an async function", + DeprecationWarning, + stacklevel=3, + ) + if loop.get_debug(): + internal_logger.warning( + "The object should be created within an async function", stack_info=True + ) + return loop + + +def isasyncgenfunction(obj: Any) -> bool: + func = getattr(inspect, "isasyncgenfunction", None) + if func is not None: + return func(obj) # type: ignore[no-any-return] + else: + return False + + +def get_env_proxy_for_url(url: URL) -> Tuple[URL, Optional[BasicAuth]]: + """Get a permitted proxy for the given URL from the env.""" + if url.host is not None and proxy_bypass(url.host): + raise LookupError(f"Proxying is disallowed for `{url.host!r}`") + + proxies_in_env = proxies_from_env() + try: + proxy_info = proxies_in_env[url.scheme] + except KeyError: + raise LookupError(f"No proxies found for `{url!s}` in the env") + else: + return proxy_info.proxy, proxy_info.proxy_auth + + +@attr.s(auto_attribs=True, frozen=True, slots=True) +class MimeType: + type: str + subtype: str + suffix: str + parameters: "MultiDictProxy[str]" + + +@functools.lru_cache(maxsize=56) +def parse_mimetype(mimetype: str) -> MimeType: + """Parses a MIME type into its components. + + mimetype is a MIME type string. + + Returns a MimeType object. + + Example: + + >>> parse_mimetype('text/html; charset=utf-8') + MimeType(type='text', subtype='html', suffix='', + parameters={'charset': 'utf-8'}) + + """ + if not mimetype: + return MimeType( + type="", subtype="", suffix="", parameters=MultiDictProxy(MultiDict()) + ) + + parts = mimetype.split(";") + params = MultiDict() # type: MultiDict[str] + for item in parts[1:]: + if not item: + continue + key, value = cast( + Tuple[str, str], item.split("=", 1) if "=" in item else (item, "") + ) + params.add(key.lower().strip(), value.strip(' "')) + + fulltype = parts[0].strip().lower() + if fulltype == "*": + fulltype = "*/*" + + mtype, stype = ( + cast(Tuple[str, str], fulltype.split("/", 1)) + if "/" in fulltype + else (fulltype, "") + ) + stype, suffix = ( + cast(Tuple[str, str], stype.split("+", 1)) if "+" in stype else (stype, "") + ) + + return MimeType( + type=mtype, subtype=stype, suffix=suffix, parameters=MultiDictProxy(params) + ) + + +def guess_filename(obj: Any, default: Optional[str] = None) -> Optional[str]: + name = getattr(obj, "name", None) + if name and isinstance(name, str) and name[0] != "<" and name[-1] != ">": + return Path(name).name + return default + + +not_qtext_re = re.compile(r"[^\041\043-\133\135-\176]") +QCONTENT = {chr(i) for i in range(0x20, 0x7F)} | {"\t"} + + +def quoted_string(content: str) -> str: + """Return 7-bit content as quoted-string. + + Format content into a quoted-string as defined in RFC5322 for + Internet Message Format. Notice that this is not the 8-bit HTTP + format, but the 7-bit email format. Content must be in usascii or + a ValueError is raised. + """ + if not (QCONTENT > set(content)): + raise ValueError(f"bad content for quoted-string {content!r}") + return not_qtext_re.sub(lambda x: "\\" + x.group(0), content) + + +def content_disposition_header( + disptype: str, quote_fields: bool = True, _charset: str = "utf-8", **params: str +) -> str: + """Sets ``Content-Disposition`` header for MIME. + + This is the MIME payload Content-Disposition header from RFC 2183 + and RFC 7579 section 4.2, not the HTTP Content-Disposition from + RFC 6266. + + disptype is a disposition type: inline, attachment, form-data. + Should be valid extension token (see RFC 2183) + + quote_fields performs value quoting to 7-bit MIME headers + according to RFC 7578. Set to quote_fields to False if recipient + can take 8-bit file names and field values. + + _charset specifies the charset to use when quote_fields is True. + + params is a dict with disposition params. + """ + if not disptype or not (TOKEN > set(disptype)): + raise ValueError("bad content disposition type {!r}" "".format(disptype)) + + value = disptype + if params: + lparams = [] + for key, val in params.items(): + if not key or not (TOKEN > set(key)): + raise ValueError( + "bad content disposition parameter" " {!r}={!r}".format(key, val) + ) + if quote_fields: + if key.lower() == "filename": + qval = quote(val, "", encoding=_charset) + lparams.append((key, '"%s"' % qval)) + else: + try: + qval = quoted_string(val) + except ValueError: + qval = "".join( + (_charset, "''", quote(val, "", encoding=_charset)) + ) + lparams.append((key + "*", qval)) + else: + lparams.append((key, '"%s"' % qval)) + else: + qval = val.replace("\\", "\\\\").replace('"', '\\"') + lparams.append((key, '"%s"' % qval)) + sparams = "; ".join("=".join(pair) for pair in lparams) + value = "; ".join((value, sparams)) + return value + + +class _TSelf(Protocol, Generic[_T]): + _cache: Dict[str, _T] + + +class reify(Generic[_T]): + """Use as a class method decorator. + + It operates almost exactly like + the Python `@property` decorator, but it puts the result of the + method it decorates into the instance dict after the first call, + effectively replacing the function it decorates with an instance + variable. It is, in Python parlance, a data descriptor. + """ + + def __init__(self, wrapped: Callable[..., _T]) -> None: + self.wrapped = wrapped + self.__doc__ = wrapped.__doc__ + self.name = wrapped.__name__ + + def __get__(self, inst: _TSelf[_T], owner: Optional[Type[Any]] = None) -> _T: + try: + try: + return inst._cache[self.name] + except KeyError: + val = self.wrapped(inst) + inst._cache[self.name] = val + return val + except AttributeError: + if inst is None: + return self + raise + + def __set__(self, inst: _TSelf[_T], value: _T) -> None: + raise AttributeError("reified property is read-only") + + +reify_py = reify + +try: + from ._helpers import reify as reify_c + + if not NO_EXTENSIONS: + reify = reify_c # type: ignore[misc,assignment] +except ImportError: + pass + +_ipv4_pattern = ( + r"^(?:(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.){3}" + r"(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)$" +) +_ipv6_pattern = ( + r"^(?:(?:(?:[A-F0-9]{1,4}:){6}|(?=(?:[A-F0-9]{0,4}:){0,6}" + r"(?:[0-9]{1,3}\.){3}[0-9]{1,3}$)(([0-9A-F]{1,4}:){0,5}|:)" + r"((:[0-9A-F]{1,4}){1,5}:|:)|::(?:[A-F0-9]{1,4}:){5})" + r"(?:(?:25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9]?[0-9])\.){3}" + r"(?:25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9]?[0-9])|(?:[A-F0-9]{1,4}:){7}" + r"[A-F0-9]{1,4}|(?=(?:[A-F0-9]{0,4}:){0,7}[A-F0-9]{0,4}$)" + r"(([0-9A-F]{1,4}:){1,7}|:)((:[0-9A-F]{1,4}){1,7}|:)|(?:[A-F0-9]{1,4}:){7}" + r":|:(:[A-F0-9]{1,4}){7})$" +) +_ipv4_regex = re.compile(_ipv4_pattern) +_ipv6_regex = re.compile(_ipv6_pattern, flags=re.IGNORECASE) +_ipv4_regexb = re.compile(_ipv4_pattern.encode("ascii")) +_ipv6_regexb = re.compile(_ipv6_pattern.encode("ascii"), flags=re.IGNORECASE) + + +def _is_ip_address( + regex: Pattern[str], regexb: Pattern[bytes], host: Optional[Union[str, bytes]] +) -> bool: + if host is None: + return False + if isinstance(host, str): + return bool(regex.match(host)) + elif isinstance(host, (bytes, bytearray, memoryview)): + return bool(regexb.match(host)) + else: + raise TypeError(f"{host} [{type(host)}] is not a str or bytes") + + +is_ipv4_address = functools.partial(_is_ip_address, _ipv4_regex, _ipv4_regexb) +is_ipv6_address = functools.partial(_is_ip_address, _ipv6_regex, _ipv6_regexb) + + +def is_ip_address(host: Optional[Union[str, bytes, bytearray, memoryview]]) -> bool: + return is_ipv4_address(host) or is_ipv6_address(host) + + +def next_whole_second() -> datetime.datetime: + """Return current time rounded up to the next whole second.""" + return datetime.datetime.now(datetime.timezone.utc).replace( + microsecond=0 + ) + datetime.timedelta(seconds=0) + + +_cached_current_datetime = None # type: Optional[int] +_cached_formatted_datetime = "" + + +def rfc822_formatted_time() -> str: + global _cached_current_datetime + global _cached_formatted_datetime + + now = int(time.time()) + if now != _cached_current_datetime: + # Weekday and month names for HTTP date/time formatting; + # always English! + # Tuples are constants stored in codeobject! + _weekdayname = ("Mon", "Tue", "Wed", "Thu", "Fri", "Sat", "Sun") + _monthname = ( + "", # Dummy so we can use 1-based month numbers + "Jan", + "Feb", + "Mar", + "Apr", + "May", + "Jun", + "Jul", + "Aug", + "Sep", + "Oct", + "Nov", + "Dec", + ) + + year, month, day, hh, mm, ss, wd, *tail = time.gmtime(now) + _cached_formatted_datetime = "%s, %02d %3s %4d %02d:%02d:%02d GMT" % ( + _weekdayname[wd], + day, + _monthname[month], + year, + hh, + mm, + ss, + ) + _cached_current_datetime = now + return _cached_formatted_datetime + + +def _weakref_handle(info: "Tuple[weakref.ref[object], str]") -> None: + ref, name = info + ob = ref() + if ob is not None: + with suppress(Exception): + getattr(ob, name)() + + +def weakref_handle( + ob: object, name: str, timeout: float, loop: asyncio.AbstractEventLoop +) -> Optional[asyncio.TimerHandle]: + if timeout is not None and timeout > 0: + when = loop.time() + timeout + if timeout >= 5: + when = ceil(when) + + return loop.call_at(when, _weakref_handle, (weakref.ref(ob), name)) + return None + + +def call_later( + cb: Callable[[], Any], timeout: float, loop: asyncio.AbstractEventLoop +) -> Optional[asyncio.TimerHandle]: + if timeout is not None and timeout > 0: + when = loop.time() + timeout + if timeout > 5: + when = ceil(when) + return loop.call_at(when, cb) + return None + + +class TimeoutHandle: + """Timeout handle""" + + def __init__( + self, loop: asyncio.AbstractEventLoop, timeout: Optional[float] + ) -> None: + self._timeout = timeout + self._loop = loop + self._callbacks = ( + [] + ) # type: List[Tuple[Callable[..., None], Tuple[Any, ...], Dict[str, Any]]] + + def register( + self, callback: Callable[..., None], *args: Any, **kwargs: Any + ) -> None: + self._callbacks.append((callback, args, kwargs)) + + def close(self) -> None: + self._callbacks.clear() + + def start(self) -> Optional[asyncio.Handle]: + timeout = self._timeout + if timeout is not None and timeout > 0: + when = self._loop.time() + timeout + if timeout >= 5: + when = ceil(when) + return self._loop.call_at(when, self.__call__) + else: + return None + + def timer(self) -> "BaseTimerContext": + if self._timeout is not None and self._timeout > 0: + timer = TimerContext(self._loop) + self.register(timer.timeout) + return timer + else: + return TimerNoop() + + def __call__(self) -> None: + for cb, args, kwargs in self._callbacks: + with suppress(Exception): + cb(*args, **kwargs) + + self._callbacks.clear() + + +class BaseTimerContext(ContextManager["BaseTimerContext"]): + pass + + +class TimerNoop(BaseTimerContext): + def __enter__(self) -> BaseTimerContext: + return self + + def __exit__( + self, + exc_type: Optional[Type[BaseException]], + exc_val: Optional[BaseException], + exc_tb: Optional[TracebackType], + ) -> None: + return + + +class TimerContext(BaseTimerContext): + """Low resolution timeout context manager""" + + def __init__(self, loop: asyncio.AbstractEventLoop) -> None: + self._loop = loop + self._tasks = [] # type: List[asyncio.Task[Any]] + self._cancelled = False + + def __enter__(self) -> BaseTimerContext: + task = current_task(loop=self._loop) + + if task is None: + raise RuntimeError( + "Timeout context manager should be used " "inside a task" + ) + + if self._cancelled: + raise asyncio.TimeoutError from None + + self._tasks.append(task) + return self + + def __exit__( + self, + exc_type: Optional[Type[BaseException]], + exc_val: Optional[BaseException], + exc_tb: Optional[TracebackType], + ) -> Optional[bool]: + if self._tasks: + self._tasks.pop() + + if exc_type is asyncio.CancelledError and self._cancelled: + raise asyncio.TimeoutError from None + return None + + def timeout(self) -> None: + if not self._cancelled: + for task in set(self._tasks): + task.cancel() + + self._cancelled = True + + +def ceil_timeout(delay: Optional[float]) -> async_timeout.Timeout: + if delay is None or delay <= 0: + return async_timeout.timeout(None) + + loop = get_running_loop() + now = loop.time() + when = now + delay + if delay > 5: + when = ceil(when) + return async_timeout.timeout_at(when) + + +class HeadersMixin: + + ATTRS = frozenset(["_content_type", "_content_dict", "_stored_content_type"]) + + _content_type = None # type: Optional[str] + _content_dict = None # type: Optional[Dict[str, str]] + _stored_content_type = sentinel + + def _parse_content_type(self, raw: str) -> None: + self._stored_content_type = raw + if raw is None: + # default value according to RFC 2616 + self._content_type = "application/octet-stream" + self._content_dict = {} + else: + self._content_type, self._content_dict = cgi.parse_header(raw) + + @property + def content_type(self) -> str: + """The value of content part for Content-Type HTTP header.""" + raw = self._headers.get(hdrs.CONTENT_TYPE) # type: ignore[attr-defined] + if self._stored_content_type != raw: + self._parse_content_type(raw) + return self._content_type # type: ignore[return-value] + + @property + def charset(self) -> Optional[str]: + """The value of charset part for Content-Type HTTP header.""" + raw = self._headers.get(hdrs.CONTENT_TYPE) # type: ignore[attr-defined] + if self._stored_content_type != raw: + self._parse_content_type(raw) + return self._content_dict.get("charset") # type: ignore[union-attr] + + @property + def content_length(self) -> Optional[int]: + """The value of Content-Length HTTP header.""" + content_length = self._headers.get( # type: ignore[attr-defined] + hdrs.CONTENT_LENGTH + ) + + if content_length is not None: + return int(content_length) + else: + return None + + +def set_result(fut: "asyncio.Future[_T]", result: _T) -> None: + if not fut.done(): + fut.set_result(result) + + +def set_exception(fut: "asyncio.Future[_T]", exc: BaseException) -> None: + if not fut.done(): + fut.set_exception(exc) + + +class ChainMapProxy(Mapping[str, Any]): + __slots__ = ("_maps",) + + def __init__(self, maps: Iterable[Mapping[str, Any]]) -> None: + self._maps = tuple(maps) + + def __init_subclass__(cls) -> None: + raise TypeError( + "Inheritance class {} from ChainMapProxy " + "is forbidden".format(cls.__name__) + ) + + def __getitem__(self, key: str) -> Any: + for mapping in self._maps: + try: + return mapping[key] + except KeyError: + pass + raise KeyError(key) + + def get(self, key: str, default: Any = None) -> Any: + return self[key] if key in self else default + + def __len__(self) -> int: + # reuses stored hash values if possible + return len(set().union(*self._maps)) # type: ignore[arg-type] + + def __iter__(self) -> Iterator[str]: + d = {} # type: Dict[str, Any] + for mapping in reversed(self._maps): + # reuses stored hash values if possible + d.update(mapping) + return iter(d) + + def __contains__(self, key: object) -> bool: + return any(key in m for m in self._maps) + + def __bool__(self) -> bool: + return any(self._maps) + + def __repr__(self) -> str: + content = ", ".join(map(repr, self._maps)) + return f"ChainMapProxy({content})" + + +# https://tools.ietf.org/html/rfc7232#section-2.3 +_ETAGC = r"[!#-}\x80-\xff]+" +_ETAGC_RE = re.compile(_ETAGC) +_QUOTED_ETAG = fr'(W/)?"({_ETAGC})"' +QUOTED_ETAG_RE = re.compile(_QUOTED_ETAG) +LIST_QUOTED_ETAG_RE = re.compile(fr"({_QUOTED_ETAG})(?:\s*,\s*|$)|(.)") + +ETAG_ANY = "*" + + +@attr.s(auto_attribs=True, frozen=True, slots=True) +class ETag: + value: str + is_weak: bool = False + + +def validate_etag_value(value: str) -> None: + if value != ETAG_ANY and not _ETAGC_RE.fullmatch(value): + raise ValueError( + f"Value {value!r} is not a valid etag. Maybe it contains '\"'?" + ) + + +def parse_http_date(date_str: Optional[str]) -> Optional[datetime.datetime]: + """Process a date string, return a datetime object""" + if date_str is not None: + timetuple = parsedate(date_str) + if timetuple is not None: + with suppress(ValueError): + return datetime.datetime(*timetuple[:6], tzinfo=datetime.timezone.utc) + return None diff --git a/sbsheriff/Lib/site-packages/aiohttp/http.py b/sbsheriff/Lib/site-packages/aiohttp/http.py new file mode 100644 index 0000000..415ffbf --- /dev/null +++ b/sbsheriff/Lib/site-packages/aiohttp/http.py @@ -0,0 +1,72 @@ +import http.server +import sys +from typing import Mapping, Tuple + +from . import __version__ +from .http_exceptions import HttpProcessingError as HttpProcessingError +from .http_parser import ( + HeadersParser as HeadersParser, + HttpParser as HttpParser, + HttpRequestParser as HttpRequestParser, + HttpResponseParser as HttpResponseParser, + RawRequestMessage as RawRequestMessage, + RawResponseMessage as RawResponseMessage, +) +from .http_websocket import ( + WS_CLOSED_MESSAGE as WS_CLOSED_MESSAGE, + WS_CLOSING_MESSAGE as WS_CLOSING_MESSAGE, + WS_KEY as WS_KEY, + WebSocketError as WebSocketError, + WebSocketReader as WebSocketReader, + WebSocketWriter as WebSocketWriter, + WSCloseCode as WSCloseCode, + WSMessage as WSMessage, + WSMsgType as WSMsgType, + ws_ext_gen as ws_ext_gen, + ws_ext_parse as ws_ext_parse, +) +from .http_writer import ( + HttpVersion as HttpVersion, + HttpVersion10 as HttpVersion10, + HttpVersion11 as HttpVersion11, + StreamWriter as StreamWriter, +) + +__all__ = ( + "HttpProcessingError", + "RESPONSES", + "SERVER_SOFTWARE", + # .http_writer + "StreamWriter", + "HttpVersion", + "HttpVersion10", + "HttpVersion11", + # .http_parser + "HeadersParser", + "HttpParser", + "HttpRequestParser", + "HttpResponseParser", + "RawRequestMessage", + "RawResponseMessage", + # .http_websocket + "WS_CLOSED_MESSAGE", + "WS_CLOSING_MESSAGE", + "WS_KEY", + "WebSocketReader", + "WebSocketWriter", + "ws_ext_gen", + "ws_ext_parse", + "WSMessage", + "WebSocketError", + "WSMsgType", + "WSCloseCode", +) + + +SERVER_SOFTWARE = "Python/{0[0]}.{0[1]} aiohttp/{1}".format( + sys.version_info, __version__ +) # type: str + +RESPONSES = ( + http.server.BaseHTTPRequestHandler.responses +) # type: Mapping[int, Tuple[str, str]] diff --git a/sbsheriff/Lib/site-packages/aiohttp/http_exceptions.py b/sbsheriff/Lib/site-packages/aiohttp/http_exceptions.py new file mode 100644 index 0000000..c885f80 --- /dev/null +++ b/sbsheriff/Lib/site-packages/aiohttp/http_exceptions.py @@ -0,0 +1,105 @@ +"""Low-level http related exceptions.""" + + +from typing import Optional, Union + +from .typedefs import _CIMultiDict + +__all__ = ("HttpProcessingError",) + + +class HttpProcessingError(Exception): + """HTTP error. + + Shortcut for raising HTTP errors with custom code, message and headers. + + code: HTTP Error code. + message: (optional) Error message. + headers: (optional) Headers to be sent in response, a list of pairs + """ + + code = 0 + message = "" + headers = None + + def __init__( + self, + *, + code: Optional[int] = None, + message: str = "", + headers: Optional[_CIMultiDict] = None, + ) -> None: + if code is not None: + self.code = code + self.headers = headers + self.message = message + + def __str__(self) -> str: + return f"{self.code}, message={self.message!r}" + + def __repr__(self) -> str: + return f"<{self.__class__.__name__}: {self}>" + + +class BadHttpMessage(HttpProcessingError): + + code = 400 + message = "Bad Request" + + def __init__(self, message: str, *, headers: Optional[_CIMultiDict] = None) -> None: + super().__init__(message=message, headers=headers) + self.args = (message,) + + +class HttpBadRequest(BadHttpMessage): + + code = 400 + message = "Bad Request" + + +class PayloadEncodingError(BadHttpMessage): + """Base class for payload errors""" + + +class ContentEncodingError(PayloadEncodingError): + """Content encoding error.""" + + +class TransferEncodingError(PayloadEncodingError): + """transfer encoding error.""" + + +class ContentLengthError(PayloadEncodingError): + """Not enough data for satisfy content length header.""" + + +class LineTooLong(BadHttpMessage): + def __init__( + self, line: str, limit: str = "Unknown", actual_size: str = "Unknown" + ) -> None: + super().__init__( + f"Got more than {limit} bytes ({actual_size}) when reading {line}." + ) + self.args = (line, limit, actual_size) + + +class InvalidHeader(BadHttpMessage): + def __init__(self, hdr: Union[bytes, str]) -> None: + if isinstance(hdr, bytes): + hdr = hdr.decode("utf-8", "surrogateescape") + super().__init__(f"Invalid HTTP Header: {hdr}") + self.hdr = hdr + self.args = (hdr,) + + +class BadStatusLine(BadHttpMessage): + def __init__(self, line: str = "") -> None: + if not isinstance(line, str): + line = repr(line) + super().__init__(f"Bad status line {line!r}") + self.args = (line,) + self.line = line + + +class InvalidURLError(BadHttpMessage): + pass diff --git a/sbsheriff/Lib/site-packages/aiohttp/http_parser.py b/sbsheriff/Lib/site-packages/aiohttp/http_parser.py new file mode 100644 index 0000000..2dc9482 --- /dev/null +++ b/sbsheriff/Lib/site-packages/aiohttp/http_parser.py @@ -0,0 +1,956 @@ +import abc +import asyncio +import collections +import re +import string +import zlib +from contextlib import suppress +from enum import IntEnum +from typing import ( + Any, + Generic, + List, + NamedTuple, + Optional, + Pattern, + Set, + Tuple, + Type, + TypeVar, + Union, + cast, +) + +from multidict import CIMultiDict, CIMultiDictProxy, istr +from yarl import URL + +from . import hdrs +from .base_protocol import BaseProtocol +from .helpers import NO_EXTENSIONS, BaseTimerContext +from .http_exceptions import ( + BadHttpMessage, + BadStatusLine, + ContentEncodingError, + ContentLengthError, + InvalidHeader, + LineTooLong, + TransferEncodingError, +) +from .http_writer import HttpVersion, HttpVersion10 +from .log import internal_logger +from .streams import EMPTY_PAYLOAD, StreamReader +from .typedefs import Final, RawHeaders + +try: + import brotli + + HAS_BROTLI = True +except ImportError: # pragma: no cover + HAS_BROTLI = False + + +__all__ = ( + "HeadersParser", + "HttpParser", + "HttpRequestParser", + "HttpResponseParser", + "RawRequestMessage", + "RawResponseMessage", +) + +ASCIISET: Final[Set[str]] = set(string.printable) + +# See https://tools.ietf.org/html/rfc7230#section-3.1.1 +# and https://tools.ietf.org/html/rfc7230#appendix-B +# +# method = token +# tchar = "!" / "#" / "$" / "%" / "&" / "'" / "*" / "+" / "-" / "." / +# "^" / "_" / "`" / "|" / "~" / DIGIT / ALPHA +# token = 1*tchar +METHRE: Final[Pattern[str]] = re.compile(r"[!#$%&'*+\-.^_`|~0-9A-Za-z]+") +VERSRE: Final[Pattern[str]] = re.compile(r"HTTP/(\d+).(\d+)") +HDRRE: Final[Pattern[bytes]] = re.compile(rb"[\x00-\x1F\x7F()<>@,;:\[\]={} \t\\\\\"]") + + +class RawRequestMessage(NamedTuple): + method: str + path: str + version: HttpVersion + headers: "CIMultiDictProxy[str]" + raw_headers: RawHeaders + should_close: bool + compression: Optional[str] + upgrade: bool + chunked: bool + url: URL + + +RawResponseMessage = collections.namedtuple( + "RawResponseMessage", + [ + "version", + "code", + "reason", + "headers", + "raw_headers", + "should_close", + "compression", + "upgrade", + "chunked", + ], +) + + +_MsgT = TypeVar("_MsgT", RawRequestMessage, RawResponseMessage) + + +class ParseState(IntEnum): + + PARSE_NONE = 0 + PARSE_LENGTH = 1 + PARSE_CHUNKED = 2 + PARSE_UNTIL_EOF = 3 + + +class ChunkState(IntEnum): + PARSE_CHUNKED_SIZE = 0 + PARSE_CHUNKED_CHUNK = 1 + PARSE_CHUNKED_CHUNK_EOF = 2 + PARSE_MAYBE_TRAILERS = 3 + PARSE_TRAILERS = 4 + + +class HeadersParser: + def __init__( + self, + max_line_size: int = 8190, + max_headers: int = 32768, + max_field_size: int = 8190, + ) -> None: + self.max_line_size = max_line_size + self.max_headers = max_headers + self.max_field_size = max_field_size + + def parse_headers( + self, lines: List[bytes] + ) -> Tuple["CIMultiDictProxy[str]", RawHeaders]: + headers = CIMultiDict() # type: CIMultiDict[str] + raw_headers = [] + + lines_idx = 1 + line = lines[1] + line_count = len(lines) + + while line: + # Parse initial header name : value pair. + try: + bname, bvalue = line.split(b":", 1) + except ValueError: + raise InvalidHeader(line) from None + + bname = bname.strip(b" \t") + bvalue = bvalue.lstrip() + if HDRRE.search(bname): + raise InvalidHeader(bname) + if len(bname) > self.max_field_size: + raise LineTooLong( + "request header name {}".format( + bname.decode("utf8", "xmlcharrefreplace") + ), + str(self.max_field_size), + str(len(bname)), + ) + + header_length = len(bvalue) + + # next line + lines_idx += 1 + line = lines[lines_idx] + + # consume continuation lines + continuation = line and line[0] in (32, 9) # (' ', '\t') + + if continuation: + bvalue_lst = [bvalue] + while continuation: + header_length += len(line) + if header_length > self.max_field_size: + raise LineTooLong( + "request header field {}".format( + bname.decode("utf8", "xmlcharrefreplace") + ), + str(self.max_field_size), + str(header_length), + ) + bvalue_lst.append(line) + + # next line + lines_idx += 1 + if lines_idx < line_count: + line = lines[lines_idx] + if line: + continuation = line[0] in (32, 9) # (' ', '\t') + else: + line = b"" + break + bvalue = b"".join(bvalue_lst) + else: + if header_length > self.max_field_size: + raise LineTooLong( + "request header field {}".format( + bname.decode("utf8", "xmlcharrefreplace") + ), + str(self.max_field_size), + str(header_length), + ) + + bvalue = bvalue.strip() + name = bname.decode("utf-8", "surrogateescape") + value = bvalue.decode("utf-8", "surrogateescape") + + headers.add(name, value) + raw_headers.append((bname, bvalue)) + + return (CIMultiDictProxy(headers), tuple(raw_headers)) + + +class HttpParser(abc.ABC, Generic[_MsgT]): + def __init__( + self, + protocol: Optional[BaseProtocol] = None, + loop: Optional[asyncio.AbstractEventLoop] = None, + limit: int = 2 ** 16, + max_line_size: int = 8190, + max_headers: int = 32768, + max_field_size: int = 8190, + timer: Optional[BaseTimerContext] = None, + code: Optional[int] = None, + method: Optional[str] = None, + readall: bool = False, + payload_exception: Optional[Type[BaseException]] = None, + response_with_body: bool = True, + read_until_eof: bool = False, + auto_decompress: bool = True, + ) -> None: + self.protocol = protocol + self.loop = loop + self.max_line_size = max_line_size + self.max_headers = max_headers + self.max_field_size = max_field_size + self.timer = timer + self.code = code + self.method = method + self.readall = readall + self.payload_exception = payload_exception + self.response_with_body = response_with_body + self.read_until_eof = read_until_eof + + self._lines = [] # type: List[bytes] + self._tail = b"" + self._upgraded = False + self._payload = None + self._payload_parser = None # type: Optional[HttpPayloadParser] + self._auto_decompress = auto_decompress + self._limit = limit + self._headers_parser = HeadersParser(max_line_size, max_headers, max_field_size) + + @abc.abstractmethod + def parse_message(self, lines: List[bytes]) -> _MsgT: + pass + + def feed_eof(self) -> Optional[_MsgT]: + if self._payload_parser is not None: + self._payload_parser.feed_eof() + self._payload_parser = None + else: + # try to extract partial message + if self._tail: + self._lines.append(self._tail) + + if self._lines: + if self._lines[-1] != "\r\n": + self._lines.append(b"") + with suppress(Exception): + return self.parse_message(self._lines) + return None + + def feed_data( + self, + data: bytes, + SEP: bytes = b"\r\n", + EMPTY: bytes = b"", + CONTENT_LENGTH: istr = hdrs.CONTENT_LENGTH, + METH_CONNECT: str = hdrs.METH_CONNECT, + SEC_WEBSOCKET_KEY1: istr = hdrs.SEC_WEBSOCKET_KEY1, + ) -> Tuple[List[Tuple[_MsgT, StreamReader]], bool, bytes]: + + messages = [] + + if self._tail: + data, self._tail = self._tail + data, b"" + + data_len = len(data) + start_pos = 0 + loop = self.loop + + while start_pos < data_len: + + # read HTTP message (request/response line + headers), \r\n\r\n + # and split by lines + if self._payload_parser is None and not self._upgraded: + pos = data.find(SEP, start_pos) + # consume \r\n + if pos == start_pos and not self._lines: + start_pos = pos + 2 + continue + + if pos >= start_pos: + # line found + self._lines.append(data[start_pos:pos]) + start_pos = pos + 2 + + # \r\n\r\n found + if self._lines[-1] == EMPTY: + try: + msg: _MsgT = self.parse_message(self._lines) + finally: + self._lines.clear() + + def get_content_length() -> Optional[int]: + # payload length + length_hdr = msg.headers.get(CONTENT_LENGTH) + if length_hdr is None: + return None + + try: + length = int(length_hdr) + except ValueError: + raise InvalidHeader(CONTENT_LENGTH) + + if length < 0: + raise InvalidHeader(CONTENT_LENGTH) + + return length + + length = get_content_length() + # do not support old websocket spec + if SEC_WEBSOCKET_KEY1 in msg.headers: + raise InvalidHeader(SEC_WEBSOCKET_KEY1) + + self._upgraded = msg.upgrade + + method = getattr(msg, "method", self.method) + + assert self.protocol is not None + # calculate payload + if ( + (length is not None and length > 0) + or msg.chunked + and not msg.upgrade + ): + payload = StreamReader( + self.protocol, + timer=self.timer, + loop=loop, + limit=self._limit, + ) + payload_parser = HttpPayloadParser( + payload, + length=length, + chunked=msg.chunked, + method=method, + compression=msg.compression, + code=self.code, + readall=self.readall, + response_with_body=self.response_with_body, + auto_decompress=self._auto_decompress, + ) + if not payload_parser.done: + self._payload_parser = payload_parser + elif method == METH_CONNECT: + assert isinstance(msg, RawRequestMessage) + payload = StreamReader( + self.protocol, + timer=self.timer, + loop=loop, + limit=self._limit, + ) + self._upgraded = True + self._payload_parser = HttpPayloadParser( + payload, + method=msg.method, + compression=msg.compression, + readall=True, + auto_decompress=self._auto_decompress, + ) + else: + if ( + getattr(msg, "code", 100) >= 199 + and length is None + and self.read_until_eof + ): + payload = StreamReader( + self.protocol, + timer=self.timer, + loop=loop, + limit=self._limit, + ) + payload_parser = HttpPayloadParser( + payload, + length=length, + chunked=msg.chunked, + method=method, + compression=msg.compression, + code=self.code, + readall=True, + response_with_body=self.response_with_body, + auto_decompress=self._auto_decompress, + ) + if not payload_parser.done: + self._payload_parser = payload_parser + else: + payload = EMPTY_PAYLOAD + + messages.append((msg, payload)) + else: + self._tail = data[start_pos:] + data = EMPTY + break + + # no parser, just store + elif self._payload_parser is None and self._upgraded: + assert not self._lines + break + + # feed payload + elif data and start_pos < data_len: + assert not self._lines + assert self._payload_parser is not None + try: + eof, data = self._payload_parser.feed_data(data[start_pos:]) + except BaseException as exc: + if self.payload_exception is not None: + self._payload_parser.payload.set_exception( + self.payload_exception(str(exc)) + ) + else: + self._payload_parser.payload.set_exception(exc) + + eof = True + data = b"" + + if eof: + start_pos = 0 + data_len = len(data) + self._payload_parser = None + continue + else: + break + + if data and start_pos < data_len: + data = data[start_pos:] + else: + data = EMPTY + + return messages, self._upgraded, data + + def parse_headers( + self, lines: List[bytes] + ) -> Tuple[ + "CIMultiDictProxy[str]", RawHeaders, Optional[bool], Optional[str], bool, bool + ]: + """Parses RFC 5322 headers from a stream. + + Line continuations are supported. Returns list of header name + and value pairs. Header name is in upper case. + """ + headers, raw_headers = self._headers_parser.parse_headers(lines) + close_conn = None + encoding = None + upgrade = False + chunked = False + + # keep-alive + conn = headers.get(hdrs.CONNECTION) + if conn: + v = conn.lower() + if v == "close": + close_conn = True + elif v == "keep-alive": + close_conn = False + elif v == "upgrade": + upgrade = True + + # encoding + enc = headers.get(hdrs.CONTENT_ENCODING) + if enc: + enc = enc.lower() + if enc in ("gzip", "deflate", "br"): + encoding = enc + + # chunking + te = headers.get(hdrs.TRANSFER_ENCODING) + if te is not None: + if "chunked" == te.lower(): + chunked = True + else: + raise BadHttpMessage("Request has invalid `Transfer-Encoding`") + + if hdrs.CONTENT_LENGTH in headers: + raise BadHttpMessage( + "Content-Length can't be present with Transfer-Encoding", + ) + + return (headers, raw_headers, close_conn, encoding, upgrade, chunked) + + def set_upgraded(self, val: bool) -> None: + """Set connection upgraded (to websocket) mode. + + :param bool val: new state. + """ + self._upgraded = val + + +class HttpRequestParser(HttpParser[RawRequestMessage]): + """Read request status line. + + Exception .http_exceptions.BadStatusLine + could be raised in case of any errors in status line. + Returns RawRequestMessage. + """ + + def parse_message(self, lines: List[bytes]) -> RawRequestMessage: + # request line + line = lines[0].decode("utf-8", "surrogateescape") + try: + method, path, version = line.split(None, 2) + except ValueError: + raise BadStatusLine(line) from None + + if len(path) > self.max_line_size: + raise LineTooLong( + "Status line is too long", str(self.max_line_size), str(len(path)) + ) + + path_part, _hash_separator, url_fragment = path.partition("#") + path_part, _question_mark_separator, qs_part = path_part.partition("?") + + # method + if not METHRE.match(method): + raise BadStatusLine(method) + + # version + try: + if version.startswith("HTTP/"): + n1, n2 = version[5:].split(".", 1) + version_o = HttpVersion(int(n1), int(n2)) + else: + raise BadStatusLine(version) + except Exception: + raise BadStatusLine(version) + + # read headers + ( + headers, + raw_headers, + close, + compression, + upgrade, + chunked, + ) = self.parse_headers(lines) + + if close is None: # then the headers weren't set in the request + if version_o <= HttpVersion10: # HTTP 1.0 must asks to not close + close = True + else: # HTTP 1.1 must ask to close. + close = False + + return RawRequestMessage( + method, + path, + version_o, + headers, + raw_headers, + close, + compression, + upgrade, + chunked, + # NOTE: `yarl.URL.build()` is used to mimic what the Cython-based + # NOTE: parser does, otherwise it results into the same + # NOTE: HTTP Request-Line input producing different + # NOTE: `yarl.URL()` objects + URL.build( + path=path_part, + query_string=qs_part, + fragment=url_fragment, + encoded=True, + ), + ) + + +class HttpResponseParser(HttpParser[RawResponseMessage]): + """Read response status line and headers. + + BadStatusLine could be raised in case of any errors in status line. + Returns RawResponseMessage. + """ + + def parse_message(self, lines: List[bytes]) -> RawResponseMessage: + line = lines[0].decode("utf-8", "surrogateescape") + try: + version, status = line.split(None, 1) + except ValueError: + raise BadStatusLine(line) from None + + try: + status, reason = status.split(None, 1) + except ValueError: + reason = "" + + if len(reason) > self.max_line_size: + raise LineTooLong( + "Status line is too long", str(self.max_line_size), str(len(reason)) + ) + + # version + match = VERSRE.match(version) + if match is None: + raise BadStatusLine(line) + version_o = HttpVersion(int(match.group(1)), int(match.group(2))) + + # The status code is a three-digit number + try: + status_i = int(status) + except ValueError: + raise BadStatusLine(line) from None + + if status_i > 999: + raise BadStatusLine(line) + + # read headers + ( + headers, + raw_headers, + close, + compression, + upgrade, + chunked, + ) = self.parse_headers(lines) + + if close is None: + close = version_o <= HttpVersion10 + + return RawResponseMessage( + version_o, + status_i, + reason.strip(), + headers, + raw_headers, + close, + compression, + upgrade, + chunked, + ) + + +class HttpPayloadParser: + def __init__( + self, + payload: StreamReader, + length: Optional[int] = None, + chunked: bool = False, + compression: Optional[str] = None, + code: Optional[int] = None, + method: Optional[str] = None, + readall: bool = False, + response_with_body: bool = True, + auto_decompress: bool = True, + ) -> None: + self._length = 0 + self._type = ParseState.PARSE_NONE + self._chunk = ChunkState.PARSE_CHUNKED_SIZE + self._chunk_size = 0 + self._chunk_tail = b"" + self._auto_decompress = auto_decompress + self.done = False + + # payload decompression wrapper + if response_with_body and compression and self._auto_decompress: + real_payload = DeflateBuffer( + payload, compression + ) # type: Union[StreamReader, DeflateBuffer] + else: + real_payload = payload + + # payload parser + if not response_with_body: + # don't parse payload if it's not expected to be received + self._type = ParseState.PARSE_NONE + real_payload.feed_eof() + self.done = True + + elif chunked: + self._type = ParseState.PARSE_CHUNKED + elif length is not None: + self._type = ParseState.PARSE_LENGTH + self._length = length + if self._length == 0: + real_payload.feed_eof() + self.done = True + else: + if readall and code != 204: + self._type = ParseState.PARSE_UNTIL_EOF + elif method in ("PUT", "POST"): + internal_logger.warning( # pragma: no cover + "Content-Length or Transfer-Encoding header is required" + ) + self._type = ParseState.PARSE_NONE + real_payload.feed_eof() + self.done = True + + self.payload = real_payload + + def feed_eof(self) -> None: + if self._type == ParseState.PARSE_UNTIL_EOF: + self.payload.feed_eof() + elif self._type == ParseState.PARSE_LENGTH: + raise ContentLengthError( + "Not enough data for satisfy content length header." + ) + elif self._type == ParseState.PARSE_CHUNKED: + raise TransferEncodingError( + "Not enough data for satisfy transfer length header." + ) + + def feed_data( + self, chunk: bytes, SEP: bytes = b"\r\n", CHUNK_EXT: bytes = b";" + ) -> Tuple[bool, bytes]: + # Read specified amount of bytes + if self._type == ParseState.PARSE_LENGTH: + required = self._length + chunk_len = len(chunk) + + if required >= chunk_len: + self._length = required - chunk_len + self.payload.feed_data(chunk, chunk_len) + if self._length == 0: + self.payload.feed_eof() + return True, b"" + else: + self._length = 0 + self.payload.feed_data(chunk[:required], required) + self.payload.feed_eof() + return True, chunk[required:] + + # Chunked transfer encoding parser + elif self._type == ParseState.PARSE_CHUNKED: + if self._chunk_tail: + chunk = self._chunk_tail + chunk + self._chunk_tail = b"" + + while chunk: + + # read next chunk size + if self._chunk == ChunkState.PARSE_CHUNKED_SIZE: + pos = chunk.find(SEP) + if pos >= 0: + i = chunk.find(CHUNK_EXT, 0, pos) + if i >= 0: + size_b = chunk[:i] # strip chunk-extensions + else: + size_b = chunk[:pos] + + try: + size = int(bytes(size_b), 16) + except ValueError: + exc = TransferEncodingError( + chunk[:pos].decode("ascii", "surrogateescape") + ) + self.payload.set_exception(exc) + raise exc from None + + chunk = chunk[pos + 2 :] + if size == 0: # eof marker + self._chunk = ChunkState.PARSE_MAYBE_TRAILERS + else: + self._chunk = ChunkState.PARSE_CHUNKED_CHUNK + self._chunk_size = size + self.payload.begin_http_chunk_receiving() + else: + self._chunk_tail = chunk + return False, b"" + + # read chunk and feed buffer + if self._chunk == ChunkState.PARSE_CHUNKED_CHUNK: + required = self._chunk_size + chunk_len = len(chunk) + + if required > chunk_len: + self._chunk_size = required - chunk_len + self.payload.feed_data(chunk, chunk_len) + return False, b"" + else: + self._chunk_size = 0 + self.payload.feed_data(chunk[:required], required) + chunk = chunk[required:] + self._chunk = ChunkState.PARSE_CHUNKED_CHUNK_EOF + self.payload.end_http_chunk_receiving() + + # toss the CRLF at the end of the chunk + if self._chunk == ChunkState.PARSE_CHUNKED_CHUNK_EOF: + if chunk[:2] == SEP: + chunk = chunk[2:] + self._chunk = ChunkState.PARSE_CHUNKED_SIZE + else: + self._chunk_tail = chunk + return False, b"" + + # if stream does not contain trailer, after 0\r\n + # we should get another \r\n otherwise + # trailers needs to be skiped until \r\n\r\n + if self._chunk == ChunkState.PARSE_MAYBE_TRAILERS: + head = chunk[:2] + if head == SEP: + # end of stream + self.payload.feed_eof() + return True, chunk[2:] + # Both CR and LF, or only LF may not be received yet. It is + # expected that CRLF or LF will be shown at the very first + # byte next time, otherwise trailers should come. The last + # CRLF which marks the end of response might not be + # contained in the same TCP segment which delivered the + # size indicator. + if not head: + return False, b"" + if head == SEP[:1]: + self._chunk_tail = head + return False, b"" + self._chunk = ChunkState.PARSE_TRAILERS + + # read and discard trailer up to the CRLF terminator + if self._chunk == ChunkState.PARSE_TRAILERS: + pos = chunk.find(SEP) + if pos >= 0: + chunk = chunk[pos + 2 :] + self._chunk = ChunkState.PARSE_MAYBE_TRAILERS + else: + self._chunk_tail = chunk + return False, b"" + + # Read all bytes until eof + elif self._type == ParseState.PARSE_UNTIL_EOF: + self.payload.feed_data(chunk, len(chunk)) + + return False, b"" + + +class DeflateBuffer: + """DeflateStream decompress stream and feed data into specified stream.""" + + decompressor: Any + + def __init__(self, out: StreamReader, encoding: Optional[str]) -> None: + self.out = out + self.size = 0 + self.encoding = encoding + self._started_decoding = False + + if encoding == "br": + if not HAS_BROTLI: # pragma: no cover + raise ContentEncodingError( + "Can not decode content-encoding: brotli (br). " + "Please install `Brotli`" + ) + + class BrotliDecoder: + # Supports both 'brotlipy' and 'Brotli' packages + # since they share an import name. The top branches + # are for 'brotlipy' and bottom branches for 'Brotli' + def __init__(self) -> None: + self._obj = brotli.Decompressor() + + def decompress(self, data: bytes) -> bytes: + if hasattr(self._obj, "decompress"): + return cast(bytes, self._obj.decompress(data)) + return cast(bytes, self._obj.process(data)) + + def flush(self) -> bytes: + if hasattr(self._obj, "flush"): + return cast(bytes, self._obj.flush()) + return b"" + + self.decompressor = BrotliDecoder() + else: + zlib_mode = 16 + zlib.MAX_WBITS if encoding == "gzip" else zlib.MAX_WBITS + self.decompressor = zlib.decompressobj(wbits=zlib_mode) + + def set_exception(self, exc: BaseException) -> None: + self.out.set_exception(exc) + + def feed_data(self, chunk: bytes, size: int) -> None: + if not size: + return + + self.size += size + + # RFC1950 + # bits 0..3 = CM = 0b1000 = 8 = "deflate" + # bits 4..7 = CINFO = 1..7 = windows size. + if ( + not self._started_decoding + and self.encoding == "deflate" + and chunk[0] & 0xF != 8 + ): + # Change the decoder to decompress incorrectly compressed data + # Actually we should issue a warning about non-RFC-compliant data. + self.decompressor = zlib.decompressobj(wbits=-zlib.MAX_WBITS) + + try: + chunk = self.decompressor.decompress(chunk) + except Exception: + raise ContentEncodingError( + "Can not decode content-encoding: %s" % self.encoding + ) + + self._started_decoding = True + + if chunk: + self.out.feed_data(chunk, len(chunk)) + + def feed_eof(self) -> None: + chunk = self.decompressor.flush() + + if chunk or self.size > 0: + self.out.feed_data(chunk, len(chunk)) + if self.encoding == "deflate" and not self.decompressor.eof: + raise ContentEncodingError("deflate") + + self.out.feed_eof() + + def begin_http_chunk_receiving(self) -> None: + self.out.begin_http_chunk_receiving() + + def end_http_chunk_receiving(self) -> None: + self.out.end_http_chunk_receiving() + + +HttpRequestParserPy = HttpRequestParser +HttpResponseParserPy = HttpResponseParser +RawRequestMessagePy = RawRequestMessage +RawResponseMessagePy = RawResponseMessage + +try: + if not NO_EXTENSIONS: + from ._http_parser import ( # type: ignore[import,no-redef] + HttpRequestParser, + HttpResponseParser, + RawRequestMessage, + RawResponseMessage, + ) + + HttpRequestParserC = HttpRequestParser + HttpResponseParserC = HttpResponseParser + RawRequestMessageC = RawRequestMessage + RawResponseMessageC = RawResponseMessage +except ImportError: # pragma: no cover + pass diff --git a/sbsheriff/Lib/site-packages/aiohttp/http_websocket.py b/sbsheriff/Lib/site-packages/aiohttp/http_websocket.py new file mode 100644 index 0000000..991a149 --- /dev/null +++ b/sbsheriff/Lib/site-packages/aiohttp/http_websocket.py @@ -0,0 +1,701 @@ +"""WebSocket protocol versions 13 and 8.""" + +import asyncio +import collections +import json +import random +import re +import sys +import zlib +from enum import IntEnum +from struct import Struct +from typing import Any, Callable, List, Optional, Pattern, Set, Tuple, Union, cast + +from .base_protocol import BaseProtocol +from .helpers import NO_EXTENSIONS +from .streams import DataQueue +from .typedefs import Final + +__all__ = ( + "WS_CLOSED_MESSAGE", + "WS_CLOSING_MESSAGE", + "WS_KEY", + "WebSocketReader", + "WebSocketWriter", + "WSMessage", + "WebSocketError", + "WSMsgType", + "WSCloseCode", +) + + +class WSCloseCode(IntEnum): + OK = 1000 + GOING_AWAY = 1001 + PROTOCOL_ERROR = 1002 + UNSUPPORTED_DATA = 1003 + ABNORMAL_CLOSURE = 1006 + INVALID_TEXT = 1007 + POLICY_VIOLATION = 1008 + MESSAGE_TOO_BIG = 1009 + MANDATORY_EXTENSION = 1010 + INTERNAL_ERROR = 1011 + SERVICE_RESTART = 1012 + TRY_AGAIN_LATER = 1013 + BAD_GATEWAY = 1014 + + +ALLOWED_CLOSE_CODES: Final[Set[int]] = {int(i) for i in WSCloseCode} + + +class WSMsgType(IntEnum): + # websocket spec types + CONTINUATION = 0x0 + TEXT = 0x1 + BINARY = 0x2 + PING = 0x9 + PONG = 0xA + CLOSE = 0x8 + + # aiohttp specific types + CLOSING = 0x100 + CLOSED = 0x101 + ERROR = 0x102 + + text = TEXT + binary = BINARY + ping = PING + pong = PONG + close = CLOSE + closing = CLOSING + closed = CLOSED + error = ERROR + + +WS_KEY: Final[bytes] = b"258EAFA5-E914-47DA-95CA-C5AB0DC85B11" + + +UNPACK_LEN2 = Struct("!H").unpack_from +UNPACK_LEN3 = Struct("!Q").unpack_from +UNPACK_CLOSE_CODE = Struct("!H").unpack +PACK_LEN1 = Struct("!BB").pack +PACK_LEN2 = Struct("!BBH").pack +PACK_LEN3 = Struct("!BBQ").pack +PACK_CLOSE_CODE = Struct("!H").pack +MSG_SIZE: Final[int] = 2 ** 14 +DEFAULT_LIMIT: Final[int] = 2 ** 16 + + +_WSMessageBase = collections.namedtuple("_WSMessageBase", ["type", "data", "extra"]) + + +class WSMessage(_WSMessageBase): + def json(self, *, loads: Callable[[Any], Any] = json.loads) -> Any: + """Return parsed JSON data. + + .. versionadded:: 0.22 + """ + return loads(self.data) + + +WS_CLOSED_MESSAGE = WSMessage(WSMsgType.CLOSED, None, None) +WS_CLOSING_MESSAGE = WSMessage(WSMsgType.CLOSING, None, None) + + +class WebSocketError(Exception): + """WebSocket protocol parser error.""" + + def __init__(self, code: int, message: str) -> None: + self.code = code + super().__init__(code, message) + + def __str__(self) -> str: + return cast(str, self.args[1]) + + +class WSHandshakeError(Exception): + """WebSocket protocol handshake error.""" + + +native_byteorder: Final[str] = sys.byteorder + + +# Used by _websocket_mask_python +_XOR_TABLE: Final[List[bytes]] = [bytes(a ^ b for a in range(256)) for b in range(256)] + + +def _websocket_mask_python(mask: bytes, data: bytearray) -> None: + """Websocket masking function. + + `mask` is a `bytes` object of length 4; `data` is a `bytearray` + object of any length. The contents of `data` are masked with `mask`, + as specified in section 5.3 of RFC 6455. + + Note that this function mutates the `data` argument. + + This pure-python implementation may be replaced by an optimized + version when available. + + """ + assert isinstance(data, bytearray), data + assert len(mask) == 4, mask + + if data: + a, b, c, d = (_XOR_TABLE[n] for n in mask) + data[::4] = data[::4].translate(a) + data[1::4] = data[1::4].translate(b) + data[2::4] = data[2::4].translate(c) + data[3::4] = data[3::4].translate(d) + + +if NO_EXTENSIONS: # pragma: no cover + _websocket_mask = _websocket_mask_python +else: + try: + from ._websocket import _websocket_mask_cython # type: ignore[import] + + _websocket_mask = _websocket_mask_cython + except ImportError: # pragma: no cover + _websocket_mask = _websocket_mask_python + +_WS_DEFLATE_TRAILING: Final[bytes] = bytes([0x00, 0x00, 0xFF, 0xFF]) + + +_WS_EXT_RE: Final[Pattern[str]] = re.compile( + r"^(?:;\s*(?:" + r"(server_no_context_takeover)|" + r"(client_no_context_takeover)|" + r"(server_max_window_bits(?:=(\d+))?)|" + r"(client_max_window_bits(?:=(\d+))?)))*$" +) + +_WS_EXT_RE_SPLIT: Final[Pattern[str]] = re.compile(r"permessage-deflate([^,]+)?") + + +def ws_ext_parse(extstr: Optional[str], isserver: bool = False) -> Tuple[int, bool]: + if not extstr: + return 0, False + + compress = 0 + notakeover = False + for ext in _WS_EXT_RE_SPLIT.finditer(extstr): + defext = ext.group(1) + # Return compress = 15 when get `permessage-deflate` + if not defext: + compress = 15 + break + match = _WS_EXT_RE.match(defext) + if match: + compress = 15 + if isserver: + # Server never fail to detect compress handshake. + # Server does not need to send max wbit to client + if match.group(4): + compress = int(match.group(4)) + # Group3 must match if group4 matches + # Compress wbit 8 does not support in zlib + # If compress level not support, + # CONTINUE to next extension + if compress > 15 or compress < 9: + compress = 0 + continue + if match.group(1): + notakeover = True + # Ignore regex group 5 & 6 for client_max_window_bits + break + else: + if match.group(6): + compress = int(match.group(6)) + # Group5 must match if group6 matches + # Compress wbit 8 does not support in zlib + # If compress level not support, + # FAIL the parse progress + if compress > 15 or compress < 9: + raise WSHandshakeError("Invalid window size") + if match.group(2): + notakeover = True + # Ignore regex group 5 & 6 for client_max_window_bits + break + # Return Fail if client side and not match + elif not isserver: + raise WSHandshakeError("Extension for deflate not supported" + ext.group(1)) + + return compress, notakeover + + +def ws_ext_gen( + compress: int = 15, isserver: bool = False, server_notakeover: bool = False +) -> str: + # client_notakeover=False not used for server + # compress wbit 8 does not support in zlib + if compress < 9 or compress > 15: + raise ValueError( + "Compress wbits must between 9 and 15, " "zlib does not support wbits=8" + ) + enabledext = ["permessage-deflate"] + if not isserver: + enabledext.append("client_max_window_bits") + + if compress < 15: + enabledext.append("server_max_window_bits=" + str(compress)) + if server_notakeover: + enabledext.append("server_no_context_takeover") + # if client_notakeover: + # enabledext.append('client_no_context_takeover') + return "; ".join(enabledext) + + +class WSParserState(IntEnum): + READ_HEADER = 1 + READ_PAYLOAD_LENGTH = 2 + READ_PAYLOAD_MASK = 3 + READ_PAYLOAD = 4 + + +class WebSocketReader: + def __init__( + self, queue: DataQueue[WSMessage], max_msg_size: int, compress: bool = True + ) -> None: + self.queue = queue + self._max_msg_size = max_msg_size + + self._exc = None # type: Optional[BaseException] + self._partial = bytearray() + self._state = WSParserState.READ_HEADER + + self._opcode = None # type: Optional[int] + self._frame_fin = False + self._frame_opcode = None # type: Optional[int] + self._frame_payload = bytearray() + + self._tail = b"" + self._has_mask = False + self._frame_mask = None # type: Optional[bytes] + self._payload_length = 0 + self._payload_length_flag = 0 + self._compressed = None # type: Optional[bool] + self._decompressobj = None # type: Any # zlib.decompressobj actually + self._compress = compress + + def feed_eof(self) -> None: + self.queue.feed_eof() + + def feed_data(self, data: bytes) -> Tuple[bool, bytes]: + if self._exc: + return True, data + + try: + return self._feed_data(data) + except Exception as exc: + self._exc = exc + self.queue.set_exception(exc) + return True, b"" + + def _feed_data(self, data: bytes) -> Tuple[bool, bytes]: + for fin, opcode, payload, compressed in self.parse_frame(data): + if compressed and not self._decompressobj: + self._decompressobj = zlib.decompressobj(wbits=-zlib.MAX_WBITS) + if opcode == WSMsgType.CLOSE: + if len(payload) >= 2: + close_code = UNPACK_CLOSE_CODE(payload[:2])[0] + if close_code < 3000 and close_code not in ALLOWED_CLOSE_CODES: + raise WebSocketError( + WSCloseCode.PROTOCOL_ERROR, + f"Invalid close code: {close_code}", + ) + try: + close_message = payload[2:].decode("utf-8") + except UnicodeDecodeError as exc: + raise WebSocketError( + WSCloseCode.INVALID_TEXT, "Invalid UTF-8 text message" + ) from exc + msg = WSMessage(WSMsgType.CLOSE, close_code, close_message) + elif payload: + raise WebSocketError( + WSCloseCode.PROTOCOL_ERROR, + f"Invalid close frame: {fin} {opcode} {payload!r}", + ) + else: + msg = WSMessage(WSMsgType.CLOSE, 0, "") + + self.queue.feed_data(msg, 0) + + elif opcode == WSMsgType.PING: + self.queue.feed_data( + WSMessage(WSMsgType.PING, payload, ""), len(payload) + ) + + elif opcode == WSMsgType.PONG: + self.queue.feed_data( + WSMessage(WSMsgType.PONG, payload, ""), len(payload) + ) + + elif ( + opcode not in (WSMsgType.TEXT, WSMsgType.BINARY) + and self._opcode is None + ): + raise WebSocketError( + WSCloseCode.PROTOCOL_ERROR, f"Unexpected opcode={opcode!r}" + ) + else: + # load text/binary + if not fin: + # got partial frame payload + if opcode != WSMsgType.CONTINUATION: + self._opcode = opcode + self._partial.extend(payload) + if self._max_msg_size and len(self._partial) >= self._max_msg_size: + raise WebSocketError( + WSCloseCode.MESSAGE_TOO_BIG, + "Message size {} exceeds limit {}".format( + len(self._partial), self._max_msg_size + ), + ) + else: + # previous frame was non finished + # we should get continuation opcode + if self._partial: + if opcode != WSMsgType.CONTINUATION: + raise WebSocketError( + WSCloseCode.PROTOCOL_ERROR, + "The opcode in non-fin frame is expected " + "to be zero, got {!r}".format(opcode), + ) + + if opcode == WSMsgType.CONTINUATION: + assert self._opcode is not None + opcode = self._opcode + self._opcode = None + + self._partial.extend(payload) + if self._max_msg_size and len(self._partial) >= self._max_msg_size: + raise WebSocketError( + WSCloseCode.MESSAGE_TOO_BIG, + "Message size {} exceeds limit {}".format( + len(self._partial), self._max_msg_size + ), + ) + + # Decompress process must to be done after all packets + # received. + if compressed: + self._partial.extend(_WS_DEFLATE_TRAILING) + payload_merged = self._decompressobj.decompress( + self._partial, self._max_msg_size + ) + if self._decompressobj.unconsumed_tail: + left = len(self._decompressobj.unconsumed_tail) + raise WebSocketError( + WSCloseCode.MESSAGE_TOO_BIG, + "Decompressed message size {} exceeds limit {}".format( + self._max_msg_size + left, self._max_msg_size + ), + ) + else: + payload_merged = bytes(self._partial) + + self._partial.clear() + + if opcode == WSMsgType.TEXT: + try: + text = payload_merged.decode("utf-8") + self.queue.feed_data( + WSMessage(WSMsgType.TEXT, text, ""), len(text) + ) + except UnicodeDecodeError as exc: + raise WebSocketError( + WSCloseCode.INVALID_TEXT, "Invalid UTF-8 text message" + ) from exc + else: + self.queue.feed_data( + WSMessage(WSMsgType.BINARY, payload_merged, ""), + len(payload_merged), + ) + + return False, b"" + + def parse_frame( + self, buf: bytes + ) -> List[Tuple[bool, Optional[int], bytearray, Optional[bool]]]: + """Return the next frame from the socket.""" + frames = [] + if self._tail: + buf, self._tail = self._tail + buf, b"" + + start_pos = 0 + buf_length = len(buf) + + while True: + # read header + if self._state == WSParserState.READ_HEADER: + if buf_length - start_pos >= 2: + data = buf[start_pos : start_pos + 2] + start_pos += 2 + first_byte, second_byte = data + + fin = (first_byte >> 7) & 1 + rsv1 = (first_byte >> 6) & 1 + rsv2 = (first_byte >> 5) & 1 + rsv3 = (first_byte >> 4) & 1 + opcode = first_byte & 0xF + + # frame-fin = %x0 ; more frames of this message follow + # / %x1 ; final frame of this message + # frame-rsv1 = %x0 ; + # 1 bit, MUST be 0 unless negotiated otherwise + # frame-rsv2 = %x0 ; + # 1 bit, MUST be 0 unless negotiated otherwise + # frame-rsv3 = %x0 ; + # 1 bit, MUST be 0 unless negotiated otherwise + # + # Remove rsv1 from this test for deflate development + if rsv2 or rsv3 or (rsv1 and not self._compress): + raise WebSocketError( + WSCloseCode.PROTOCOL_ERROR, + "Received frame with non-zero reserved bits", + ) + + if opcode > 0x7 and fin == 0: + raise WebSocketError( + WSCloseCode.PROTOCOL_ERROR, + "Received fragmented control frame", + ) + + has_mask = (second_byte >> 7) & 1 + length = second_byte & 0x7F + + # Control frames MUST have a payload + # length of 125 bytes or less + if opcode > 0x7 and length > 125: + raise WebSocketError( + WSCloseCode.PROTOCOL_ERROR, + "Control frame payload cannot be " "larger than 125 bytes", + ) + + # Set compress status if last package is FIN + # OR set compress status if this is first fragment + # Raise error if not first fragment with rsv1 = 0x1 + if self._frame_fin or self._compressed is None: + self._compressed = True if rsv1 else False + elif rsv1: + raise WebSocketError( + WSCloseCode.PROTOCOL_ERROR, + "Received frame with non-zero reserved bits", + ) + + self._frame_fin = bool(fin) + self._frame_opcode = opcode + self._has_mask = bool(has_mask) + self._payload_length_flag = length + self._state = WSParserState.READ_PAYLOAD_LENGTH + else: + break + + # read payload length + if self._state == WSParserState.READ_PAYLOAD_LENGTH: + length = self._payload_length_flag + if length == 126: + if buf_length - start_pos >= 2: + data = buf[start_pos : start_pos + 2] + start_pos += 2 + length = UNPACK_LEN2(data)[0] + self._payload_length = length + self._state = ( + WSParserState.READ_PAYLOAD_MASK + if self._has_mask + else WSParserState.READ_PAYLOAD + ) + else: + break + elif length > 126: + if buf_length - start_pos >= 8: + data = buf[start_pos : start_pos + 8] + start_pos += 8 + length = UNPACK_LEN3(data)[0] + self._payload_length = length + self._state = ( + WSParserState.READ_PAYLOAD_MASK + if self._has_mask + else WSParserState.READ_PAYLOAD + ) + else: + break + else: + self._payload_length = length + self._state = ( + WSParserState.READ_PAYLOAD_MASK + if self._has_mask + else WSParserState.READ_PAYLOAD + ) + + # read payload mask + if self._state == WSParserState.READ_PAYLOAD_MASK: + if buf_length - start_pos >= 4: + self._frame_mask = buf[start_pos : start_pos + 4] + start_pos += 4 + self._state = WSParserState.READ_PAYLOAD + else: + break + + if self._state == WSParserState.READ_PAYLOAD: + length = self._payload_length + payload = self._frame_payload + + chunk_len = buf_length - start_pos + if length >= chunk_len: + self._payload_length = length - chunk_len + payload.extend(buf[start_pos:]) + start_pos = buf_length + else: + self._payload_length = 0 + payload.extend(buf[start_pos : start_pos + length]) + start_pos = start_pos + length + + if self._payload_length == 0: + if self._has_mask: + assert self._frame_mask is not None + _websocket_mask(self._frame_mask, payload) + + frames.append( + (self._frame_fin, self._frame_opcode, payload, self._compressed) + ) + + self._frame_payload = bytearray() + self._state = WSParserState.READ_HEADER + else: + break + + self._tail = buf[start_pos:] + + return frames + + +class WebSocketWriter: + def __init__( + self, + protocol: BaseProtocol, + transport: asyncio.Transport, + *, + use_mask: bool = False, + limit: int = DEFAULT_LIMIT, + random: Any = random.Random(), + compress: int = 0, + notakeover: bool = False, + ) -> None: + self.protocol = protocol + self.transport = transport + self.use_mask = use_mask + self.randrange = random.randrange + self.compress = compress + self.notakeover = notakeover + self._closing = False + self._limit = limit + self._output_size = 0 + self._compressobj = None # type: Any # actually compressobj + + async def _send_frame( + self, message: bytes, opcode: int, compress: Optional[int] = None + ) -> None: + """Send a frame over the websocket with message as its payload.""" + if self._closing and not (opcode & WSMsgType.CLOSE): + raise ConnectionResetError("Cannot write to closing transport") + + rsv = 0 + + # Only compress larger packets (disabled) + # Does small packet needs to be compressed? + # if self.compress and opcode < 8 and len(message) > 124: + if (compress or self.compress) and opcode < 8: + if compress: + # Do not set self._compress if compressing is for this frame + compressobj = zlib.compressobj(level=zlib.Z_BEST_SPEED, wbits=-compress) + else: # self.compress + if not self._compressobj: + self._compressobj = zlib.compressobj( + level=zlib.Z_BEST_SPEED, wbits=-self.compress + ) + compressobj = self._compressobj + + message = compressobj.compress(message) + message = message + compressobj.flush( + zlib.Z_FULL_FLUSH if self.notakeover else zlib.Z_SYNC_FLUSH + ) + if message.endswith(_WS_DEFLATE_TRAILING): + message = message[:-4] + rsv = rsv | 0x40 + + msg_length = len(message) + + use_mask = self.use_mask + if use_mask: + mask_bit = 0x80 + else: + mask_bit = 0 + + if msg_length < 126: + header = PACK_LEN1(0x80 | rsv | opcode, msg_length | mask_bit) + elif msg_length < (1 << 16): + header = PACK_LEN2(0x80 | rsv | opcode, 126 | mask_bit, msg_length) + else: + header = PACK_LEN3(0x80 | rsv | opcode, 127 | mask_bit, msg_length) + if use_mask: + mask = self.randrange(0, 0xFFFFFFFF) + mask = mask.to_bytes(4, "big") + message = bytearray(message) + _websocket_mask(mask, message) + self._write(header + mask + message) + self._output_size += len(header) + len(mask) + len(message) + else: + if len(message) > MSG_SIZE: + self._write(header) + self._write(message) + else: + self._write(header + message) + + self._output_size += len(header) + len(message) + + if self._output_size > self._limit: + self._output_size = 0 + await self.protocol._drain_helper() + + def _write(self, data: bytes) -> None: + if self.transport is None or self.transport.is_closing(): + raise ConnectionResetError("Cannot write to closing transport") + self.transport.write(data) + + async def pong(self, message: bytes = b"") -> None: + """Send pong message.""" + if isinstance(message, str): + message = message.encode("utf-8") + await self._send_frame(message, WSMsgType.PONG) + + async def ping(self, message: bytes = b"") -> None: + """Send ping message.""" + if isinstance(message, str): + message = message.encode("utf-8") + await self._send_frame(message, WSMsgType.PING) + + async def send( + self, + message: Union[str, bytes], + binary: bool = False, + compress: Optional[int] = None, + ) -> None: + """Send a frame over the websocket with message as its payload.""" + if isinstance(message, str): + message = message.encode("utf-8") + if binary: + await self._send_frame(message, WSMsgType.BINARY, compress) + else: + await self._send_frame(message, WSMsgType.TEXT, compress) + + async def close(self, code: int = 1000, message: bytes = b"") -> None: + """Close the websocket, sending the specified code and message.""" + if isinstance(message, str): + message = message.encode("utf-8") + try: + await self._send_frame( + PACK_CLOSE_CODE(code) + message, opcode=WSMsgType.CLOSE + ) + finally: + self._closing = True diff --git a/sbsheriff/Lib/site-packages/aiohttp/http_writer.py b/sbsheriff/Lib/site-packages/aiohttp/http_writer.py new file mode 100644 index 0000000..e091447 --- /dev/null +++ b/sbsheriff/Lib/site-packages/aiohttp/http_writer.py @@ -0,0 +1,200 @@ +"""Http related parsers and protocol.""" + +import asyncio +import zlib +from typing import Any, Awaitable, Callable, NamedTuple, Optional, Union # noqa + +from multidict import CIMultiDict + +from .abc import AbstractStreamWriter +from .base_protocol import BaseProtocol +from .helpers import NO_EXTENSIONS + +__all__ = ("StreamWriter", "HttpVersion", "HttpVersion10", "HttpVersion11") + + +class HttpVersion(NamedTuple): + major: int + minor: int + + +HttpVersion10 = HttpVersion(1, 0) +HttpVersion11 = HttpVersion(1, 1) + + +_T_OnChunkSent = Optional[Callable[[bytes], Awaitable[None]]] +_T_OnHeadersSent = Optional[Callable[["CIMultiDict[str]"], Awaitable[None]]] + + +class StreamWriter(AbstractStreamWriter): + def __init__( + self, + protocol: BaseProtocol, + loop: asyncio.AbstractEventLoop, + on_chunk_sent: _T_OnChunkSent = None, + on_headers_sent: _T_OnHeadersSent = None, + ) -> None: + self._protocol = protocol + self._transport = protocol.transport + + self.loop = loop + self.length = None + self.chunked = False + self.buffer_size = 0 + self.output_size = 0 + + self._eof = False + self._compress = None # type: Any + self._drain_waiter = None + + self._on_chunk_sent = on_chunk_sent # type: _T_OnChunkSent + self._on_headers_sent = on_headers_sent # type: _T_OnHeadersSent + + @property + def transport(self) -> Optional[asyncio.Transport]: + return self._transport + + @property + def protocol(self) -> BaseProtocol: + return self._protocol + + def enable_chunking(self) -> None: + self.chunked = True + + def enable_compression( + self, encoding: str = "deflate", strategy: int = zlib.Z_DEFAULT_STRATEGY + ) -> None: + zlib_mode = 16 + zlib.MAX_WBITS if encoding == "gzip" else zlib.MAX_WBITS + self._compress = zlib.compressobj(wbits=zlib_mode, strategy=strategy) + + def _write(self, chunk: bytes) -> None: + size = len(chunk) + self.buffer_size += size + self.output_size += size + + if self._transport is None or self._transport.is_closing(): + raise ConnectionResetError("Cannot write to closing transport") + self._transport.write(chunk) + + async def write( + self, chunk: bytes, *, drain: bool = True, LIMIT: int = 0x10000 + ) -> None: + """Writes chunk of data to a stream. + + write_eof() indicates end of stream. + writer can't be used after write_eof() method being called. + write() return drain future. + """ + if self._on_chunk_sent is not None: + await self._on_chunk_sent(chunk) + + if isinstance(chunk, memoryview): + if chunk.nbytes != len(chunk): + # just reshape it + chunk = chunk.cast("c") + + if self._compress is not None: + chunk = self._compress.compress(chunk) + if not chunk: + return + + if self.length is not None: + chunk_len = len(chunk) + if self.length >= chunk_len: + self.length = self.length - chunk_len + else: + chunk = chunk[: self.length] + self.length = 0 + if not chunk: + return + + if chunk: + if self.chunked: + chunk_len_pre = ("%x\r\n" % len(chunk)).encode("ascii") + chunk = chunk_len_pre + chunk + b"\r\n" + + self._write(chunk) + + if self.buffer_size > LIMIT and drain: + self.buffer_size = 0 + await self.drain() + + async def write_headers( + self, status_line: str, headers: "CIMultiDict[str]" + ) -> None: + """Write request/response status and headers.""" + if self._on_headers_sent is not None: + await self._on_headers_sent(headers) + + # status + headers + buf = _serialize_headers(status_line, headers) + self._write(buf) + + async def write_eof(self, chunk: bytes = b"") -> None: + if self._eof: + return + + if chunk and self._on_chunk_sent is not None: + await self._on_chunk_sent(chunk) + + if self._compress: + if chunk: + chunk = self._compress.compress(chunk) + + chunk = chunk + self._compress.flush() + if chunk and self.chunked: + chunk_len = ("%x\r\n" % len(chunk)).encode("ascii") + chunk = chunk_len + chunk + b"\r\n0\r\n\r\n" + else: + if self.chunked: + if chunk: + chunk_len = ("%x\r\n" % len(chunk)).encode("ascii") + chunk = chunk_len + chunk + b"\r\n0\r\n\r\n" + else: + chunk = b"0\r\n\r\n" + + if chunk: + self._write(chunk) + + await self.drain() + + self._eof = True + self._transport = None + + async def drain(self) -> None: + """Flush the write buffer. + + The intended use is to write + + await w.write(data) + await w.drain() + """ + if self._protocol.transport is not None: + await self._protocol._drain_helper() + + +def _safe_header(string: str) -> str: + if "\r" in string or "\n" in string: + raise ValueError( + "Newline or carriage return detected in headers. " + "Potential header injection attack." + ) + return string + + +def _py_serialize_headers(status_line: str, headers: "CIMultiDict[str]") -> bytes: + headers_gen = (_safe_header(k) + ": " + _safe_header(v) for k, v in headers.items()) + line = status_line + "\r\n" + "\r\n".join(headers_gen) + "\r\n\r\n" + return line.encode("utf-8") + + +_serialize_headers = _py_serialize_headers + +try: + import aiohttp._http_writer as _http_writer # type: ignore[import] + + _c_serialize_headers = _http_writer._serialize_headers + if not NO_EXTENSIONS: + _serialize_headers = _c_serialize_headers +except ImportError: + pass diff --git a/sbsheriff/Lib/site-packages/aiohttp/locks.py b/sbsheriff/Lib/site-packages/aiohttp/locks.py new file mode 100644 index 0000000..df65e3e --- /dev/null +++ b/sbsheriff/Lib/site-packages/aiohttp/locks.py @@ -0,0 +1,41 @@ +import asyncio +import collections +from typing import Any, Deque, Optional + + +class EventResultOrError: + """Event asyncio lock helper class. + + Wraps the Event asyncio lock allowing either to awake the + locked Tasks without any error or raising an exception. + + thanks to @vorpalsmith for the simple design. + """ + + def __init__(self, loop: asyncio.AbstractEventLoop) -> None: + self._loop = loop + self._exc = None # type: Optional[BaseException] + self._event = asyncio.Event() + self._waiters = collections.deque() # type: Deque[asyncio.Future[Any]] + + def set(self, exc: Optional[BaseException] = None) -> None: + self._exc = exc + self._event.set() + + async def wait(self) -> Any: + waiter = self._loop.create_task(self._event.wait()) + self._waiters.append(waiter) + try: + val = await waiter + finally: + self._waiters.remove(waiter) + + if self._exc is not None: + raise self._exc + + return val + + def cancel(self) -> None: + """Cancel all waiters""" + for waiter in self._waiters: + waiter.cancel() diff --git a/sbsheriff/Lib/site-packages/aiohttp/log.py b/sbsheriff/Lib/site-packages/aiohttp/log.py new file mode 100644 index 0000000..3cecea2 --- /dev/null +++ b/sbsheriff/Lib/site-packages/aiohttp/log.py @@ -0,0 +1,8 @@ +import logging + +access_logger = logging.getLogger("aiohttp.access") +client_logger = logging.getLogger("aiohttp.client") +internal_logger = logging.getLogger("aiohttp.internal") +server_logger = logging.getLogger("aiohttp.server") +web_logger = logging.getLogger("aiohttp.web") +ws_logger = logging.getLogger("aiohttp.websocket") diff --git a/sbsheriff/Lib/site-packages/aiohttp/multipart.py b/sbsheriff/Lib/site-packages/aiohttp/multipart.py new file mode 100644 index 0000000..c84e200 --- /dev/null +++ b/sbsheriff/Lib/site-packages/aiohttp/multipart.py @@ -0,0 +1,963 @@ +import base64 +import binascii +import json +import re +import uuid +import warnings +import zlib +from collections import deque +from types import TracebackType +from typing import ( + TYPE_CHECKING, + Any, + AsyncIterator, + Deque, + Dict, + Iterator, + List, + Mapping, + Optional, + Sequence, + Tuple, + Type, + Union, + cast, +) +from urllib.parse import parse_qsl, unquote, urlencode + +from multidict import CIMultiDict, CIMultiDictProxy, MultiMapping + +from .hdrs import ( + CONTENT_DISPOSITION, + CONTENT_ENCODING, + CONTENT_LENGTH, + CONTENT_TRANSFER_ENCODING, + CONTENT_TYPE, +) +from .helpers import CHAR, TOKEN, parse_mimetype, reify +from .http import HeadersParser +from .payload import ( + JsonPayload, + LookupError, + Order, + Payload, + StringPayload, + get_payload, + payload_type, +) +from .streams import StreamReader + +__all__ = ( + "MultipartReader", + "MultipartWriter", + "BodyPartReader", + "BadContentDispositionHeader", + "BadContentDispositionParam", + "parse_content_disposition", + "content_disposition_filename", +) + + +if TYPE_CHECKING: # pragma: no cover + from .client_reqrep import ClientResponse + + +class BadContentDispositionHeader(RuntimeWarning): + pass + + +class BadContentDispositionParam(RuntimeWarning): + pass + + +def parse_content_disposition( + header: Optional[str], +) -> Tuple[Optional[str], Dict[str, str]]: + def is_token(string: str) -> bool: + return bool(string) and TOKEN >= set(string) + + def is_quoted(string: str) -> bool: + return string[0] == string[-1] == '"' + + def is_rfc5987(string: str) -> bool: + return is_token(string) and string.count("'") == 2 + + def is_extended_param(string: str) -> bool: + return string.endswith("*") + + def is_continuous_param(string: str) -> bool: + pos = string.find("*") + 1 + if not pos: + return False + substring = string[pos:-1] if string.endswith("*") else string[pos:] + return substring.isdigit() + + def unescape(text: str, *, chars: str = "".join(map(re.escape, CHAR))) -> str: + return re.sub(f"\\\\([{chars}])", "\\1", text) + + if not header: + return None, {} + + disptype, *parts = header.split(";") + if not is_token(disptype): + warnings.warn(BadContentDispositionHeader(header)) + return None, {} + + params = {} # type: Dict[str, str] + while parts: + item = parts.pop(0) + + if "=" not in item: + warnings.warn(BadContentDispositionHeader(header)) + return None, {} + + key, value = item.split("=", 1) + key = key.lower().strip() + value = value.lstrip() + + if key in params: + warnings.warn(BadContentDispositionHeader(header)) + return None, {} + + if not is_token(key): + warnings.warn(BadContentDispositionParam(item)) + continue + + elif is_continuous_param(key): + if is_quoted(value): + value = unescape(value[1:-1]) + elif not is_token(value): + warnings.warn(BadContentDispositionParam(item)) + continue + + elif is_extended_param(key): + if is_rfc5987(value): + encoding, _, value = value.split("'", 2) + encoding = encoding or "utf-8" + else: + warnings.warn(BadContentDispositionParam(item)) + continue + + try: + value = unquote(value, encoding, "strict") + except UnicodeDecodeError: # pragma: nocover + warnings.warn(BadContentDispositionParam(item)) + continue + + else: + failed = True + if is_quoted(value): + failed = False + value = unescape(value[1:-1].lstrip("\\/")) + elif is_token(value): + failed = False + elif parts: + # maybe just ; in filename, in any case this is just + # one case fix, for proper fix we need to redesign parser + _value = f"{value};{parts[0]}" + if is_quoted(_value): + parts.pop(0) + value = unescape(_value[1:-1].lstrip("\\/")) + failed = False + + if failed: + warnings.warn(BadContentDispositionHeader(header)) + return None, {} + + params[key] = value + + return disptype.lower(), params + + +def content_disposition_filename( + params: Mapping[str, str], name: str = "filename" +) -> Optional[str]: + name_suf = "%s*" % name + if not params: + return None + elif name_suf in params: + return params[name_suf] + elif name in params: + return params[name] + else: + parts = [] + fnparams = sorted( + (key, value) for key, value in params.items() if key.startswith(name_suf) + ) + for num, (key, value) in enumerate(fnparams): + _, tail = key.split("*", 1) + if tail.endswith("*"): + tail = tail[:-1] + if tail == str(num): + parts.append(value) + else: + break + if not parts: + return None + value = "".join(parts) + if "'" in value: + encoding, _, value = value.split("'", 2) + encoding = encoding or "utf-8" + return unquote(value, encoding, "strict") + return value + + +class MultipartResponseWrapper: + """Wrapper around the MultipartReader. + + It takes care about + underlying connection and close it when it needs in. + """ + + def __init__( + self, + resp: "ClientResponse", + stream: "MultipartReader", + ) -> None: + self.resp = resp + self.stream = stream + + def __aiter__(self) -> "MultipartResponseWrapper": + return self + + async def __anext__( + self, + ) -> Union["MultipartReader", "BodyPartReader"]: + part = await self.next() + if part is None: + raise StopAsyncIteration + return part + + def at_eof(self) -> bool: + """Returns True when all response data had been read.""" + return self.resp.content.at_eof() + + async def next( + self, + ) -> Optional[Union["MultipartReader", "BodyPartReader"]]: + """Emits next multipart reader object.""" + item = await self.stream.next() + if self.stream.at_eof(): + await self.release() + return item + + async def release(self) -> None: + """Release the connection gracefully. + + All remaining content is read to the void. + """ + await self.resp.release() + + +class BodyPartReader: + """Multipart reader for single body part.""" + + chunk_size = 8192 + + def __init__( + self, boundary: bytes, headers: "CIMultiDictProxy[str]", content: StreamReader + ) -> None: + self.headers = headers + self._boundary = boundary + self._content = content + self._at_eof = False + length = self.headers.get(CONTENT_LENGTH, None) + self._length = int(length) if length is not None else None + self._read_bytes = 0 + # TODO: typeing.Deque is not supported by Python 3.5 + self._unread: Deque[bytes] = deque() + self._prev_chunk = None # type: Optional[bytes] + self._content_eof = 0 + self._cache = {} # type: Dict[str, Any] + + def __aiter__(self) -> AsyncIterator["BodyPartReader"]: + return self # type: ignore[return-value] + + async def __anext__(self) -> bytes: + part = await self.next() + if part is None: + raise StopAsyncIteration + return part + + async def next(self) -> Optional[bytes]: + item = await self.read() + if not item: + return None + return item + + async def read(self, *, decode: bool = False) -> bytes: + """Reads body part data. + + decode: Decodes data following by encoding + method from Content-Encoding header. If it missed + data remains untouched + """ + if self._at_eof: + return b"" + data = bytearray() + while not self._at_eof: + data.extend(await self.read_chunk(self.chunk_size)) + if decode: + return self.decode(data) + return data + + async def read_chunk(self, size: int = chunk_size) -> bytes: + """Reads body part content chunk of the specified size. + + size: chunk size + """ + if self._at_eof: + return b"" + if self._length: + chunk = await self._read_chunk_from_length(size) + else: + chunk = await self._read_chunk_from_stream(size) + + self._read_bytes += len(chunk) + if self._read_bytes == self._length: + self._at_eof = True + if self._at_eof: + clrf = await self._content.readline() + assert ( + b"\r\n" == clrf + ), "reader did not read all the data or it is malformed" + return chunk + + async def _read_chunk_from_length(self, size: int) -> bytes: + # Reads body part content chunk of the specified size. + # The body part must has Content-Length header with proper value. + assert self._length is not None, "Content-Length required for chunked read" + chunk_size = min(size, self._length - self._read_bytes) + chunk = await self._content.read(chunk_size) + return chunk + + async def _read_chunk_from_stream(self, size: int) -> bytes: + # Reads content chunk of body part with unknown length. + # The Content-Length header for body part is not necessary. + assert ( + size >= len(self._boundary) + 2 + ), "Chunk size must be greater or equal than boundary length + 2" + first_chunk = self._prev_chunk is None + if first_chunk: + self._prev_chunk = await self._content.read(size) + + chunk = await self._content.read(size) + self._content_eof += int(self._content.at_eof()) + assert self._content_eof < 3, "Reading after EOF" + assert self._prev_chunk is not None + window = self._prev_chunk + chunk + sub = b"\r\n" + self._boundary + if first_chunk: + idx = window.find(sub) + else: + idx = window.find(sub, max(0, len(self._prev_chunk) - len(sub))) + if idx >= 0: + # pushing boundary back to content + with warnings.catch_warnings(): + warnings.filterwarnings("ignore", category=DeprecationWarning) + self._content.unread_data(window[idx:]) + if size > idx: + self._prev_chunk = self._prev_chunk[:idx] + chunk = window[len(self._prev_chunk) : idx] + if not chunk: + self._at_eof = True + result = self._prev_chunk + self._prev_chunk = chunk + return result + + async def readline(self) -> bytes: + """Reads body part by line by line.""" + if self._at_eof: + return b"" + + if self._unread: + line = self._unread.popleft() + else: + line = await self._content.readline() + + if line.startswith(self._boundary): + # the very last boundary may not come with \r\n, + # so set single rules for everyone + sline = line.rstrip(b"\r\n") + boundary = self._boundary + last_boundary = self._boundary + b"--" + # ensure that we read exactly the boundary, not something alike + if sline == boundary or sline == last_boundary: + self._at_eof = True + self._unread.append(line) + return b"" + else: + next_line = await self._content.readline() + if next_line.startswith(self._boundary): + line = line[:-2] # strip CRLF but only once + self._unread.append(next_line) + + return line + + async def release(self) -> None: + """Like read(), but reads all the data to the void.""" + if self._at_eof: + return + while not self._at_eof: + await self.read_chunk(self.chunk_size) + + async def text(self, *, encoding: Optional[str] = None) -> str: + """Like read(), but assumes that body part contains text data.""" + data = await self.read(decode=True) + # see https://www.w3.org/TR/html5/forms.html#multipart/form-data-encoding-algorithm # NOQA + # and https://dvcs.w3.org/hg/xhr/raw-file/tip/Overview.html#dom-xmlhttprequest-send # NOQA + encoding = encoding or self.get_charset(default="utf-8") + return data.decode(encoding) + + async def json(self, *, encoding: Optional[str] = None) -> Optional[Dict[str, Any]]: + """Like read(), but assumes that body parts contains JSON data.""" + data = await self.read(decode=True) + if not data: + return None + encoding = encoding or self.get_charset(default="utf-8") + return cast(Dict[str, Any], json.loads(data.decode(encoding))) + + async def form(self, *, encoding: Optional[str] = None) -> List[Tuple[str, str]]: + """Like read(), but assumes that body parts contain form urlencoded data.""" + data = await self.read(decode=True) + if not data: + return [] + if encoding is not None: + real_encoding = encoding + else: + real_encoding = self.get_charset(default="utf-8") + return parse_qsl( + data.rstrip().decode(real_encoding), + keep_blank_values=True, + encoding=real_encoding, + ) + + def at_eof(self) -> bool: + """Returns True if the boundary was reached or False otherwise.""" + return self._at_eof + + def decode(self, data: bytes) -> bytes: + """Decodes data. + + Decoding is done according the specified Content-Encoding + or Content-Transfer-Encoding headers value. + """ + if CONTENT_TRANSFER_ENCODING in self.headers: + data = self._decode_content_transfer(data) + if CONTENT_ENCODING in self.headers: + return self._decode_content(data) + return data + + def _decode_content(self, data: bytes) -> bytes: + encoding = self.headers.get(CONTENT_ENCODING, "").lower() + + if encoding == "deflate": + return zlib.decompress(data, -zlib.MAX_WBITS) + elif encoding == "gzip": + return zlib.decompress(data, 16 + zlib.MAX_WBITS) + elif encoding == "identity": + return data + else: + raise RuntimeError(f"unknown content encoding: {encoding}") + + def _decode_content_transfer(self, data: bytes) -> bytes: + encoding = self.headers.get(CONTENT_TRANSFER_ENCODING, "").lower() + + if encoding == "base64": + return base64.b64decode(data) + elif encoding == "quoted-printable": + return binascii.a2b_qp(data) + elif encoding in ("binary", "8bit", "7bit"): + return data + else: + raise RuntimeError( + "unknown content transfer encoding: {}" "".format(encoding) + ) + + def get_charset(self, default: str) -> str: + """Returns charset parameter from Content-Type header or default.""" + ctype = self.headers.get(CONTENT_TYPE, "") + mimetype = parse_mimetype(ctype) + return mimetype.parameters.get("charset", default) + + @reify + def name(self) -> Optional[str]: + """Returns name specified in Content-Disposition header. + + If the header is missing or malformed, returns None. + """ + _, params = parse_content_disposition(self.headers.get(CONTENT_DISPOSITION)) + return content_disposition_filename(params, "name") + + @reify + def filename(self) -> Optional[str]: + """Returns filename specified in Content-Disposition header. + + Returns None if the header is missing or malformed. + """ + _, params = parse_content_disposition(self.headers.get(CONTENT_DISPOSITION)) + return content_disposition_filename(params, "filename") + + +@payload_type(BodyPartReader, order=Order.try_first) +class BodyPartReaderPayload(Payload): + def __init__(self, value: BodyPartReader, *args: Any, **kwargs: Any) -> None: + super().__init__(value, *args, **kwargs) + + params = {} # type: Dict[str, str] + if value.name is not None: + params["name"] = value.name + if value.filename is not None: + params["filename"] = value.filename + + if params: + self.set_content_disposition("attachment", True, **params) + + async def write(self, writer: Any) -> None: + field = self._value + chunk = await field.read_chunk(size=2 ** 16) + while chunk: + await writer.write(field.decode(chunk)) + chunk = await field.read_chunk(size=2 ** 16) + + +class MultipartReader: + """Multipart body reader.""" + + #: Response wrapper, used when multipart readers constructs from response. + response_wrapper_cls = MultipartResponseWrapper + #: Multipart reader class, used to handle multipart/* body parts. + #: None points to type(self) + multipart_reader_cls = None + #: Body part reader class for non multipart/* content types. + part_reader_cls = BodyPartReader + + def __init__(self, headers: Mapping[str, str], content: StreamReader) -> None: + self.headers = headers + self._boundary = ("--" + self._get_boundary()).encode() + self._content = content + self._last_part = ( + None + ) # type: Optional[Union['MultipartReader', BodyPartReader]] + self._at_eof = False + self._at_bof = True + self._unread = [] # type: List[bytes] + + def __aiter__( + self, + ) -> AsyncIterator["BodyPartReader"]: + return self # type: ignore[return-value] + + async def __anext__( + self, + ) -> Optional[Union["MultipartReader", BodyPartReader]]: + part = await self.next() + if part is None: + raise StopAsyncIteration + return part + + @classmethod + def from_response( + cls, + response: "ClientResponse", + ) -> MultipartResponseWrapper: + """Constructs reader instance from HTTP response. + + :param response: :class:`~aiohttp.client.ClientResponse` instance + """ + obj = cls.response_wrapper_cls( + response, cls(response.headers, response.content) + ) + return obj + + def at_eof(self) -> bool: + """Returns True if the final boundary was reached, false otherwise.""" + return self._at_eof + + async def next( + self, + ) -> Optional[Union["MultipartReader", BodyPartReader]]: + """Emits the next multipart body part.""" + # So, if we're at BOF, we need to skip till the boundary. + if self._at_eof: + return None + await self._maybe_release_last_part() + if self._at_bof: + await self._read_until_first_boundary() + self._at_bof = False + else: + await self._read_boundary() + if self._at_eof: # we just read the last boundary, nothing to do there + return None + self._last_part = await self.fetch_next_part() + return self._last_part + + async def release(self) -> None: + """Reads all the body parts to the void till the final boundary.""" + while not self._at_eof: + item = await self.next() + if item is None: + break + await item.release() + + async def fetch_next_part( + self, + ) -> Union["MultipartReader", BodyPartReader]: + """Returns the next body part reader.""" + headers = await self._read_headers() + return self._get_part_reader(headers) + + def _get_part_reader( + self, + headers: "CIMultiDictProxy[str]", + ) -> Union["MultipartReader", BodyPartReader]: + """Dispatches the response by the `Content-Type` header. + + Returns a suitable reader instance. + + :param dict headers: Response headers + """ + ctype = headers.get(CONTENT_TYPE, "") + mimetype = parse_mimetype(ctype) + + if mimetype.type == "multipart": + if self.multipart_reader_cls is None: + return type(self)(headers, self._content) + return self.multipart_reader_cls(headers, self._content) + else: + return self.part_reader_cls(self._boundary, headers, self._content) + + def _get_boundary(self) -> str: + mimetype = parse_mimetype(self.headers[CONTENT_TYPE]) + + assert mimetype.type == "multipart", "multipart/* content type expected" + + if "boundary" not in mimetype.parameters: + raise ValueError( + "boundary missed for Content-Type: %s" % self.headers[CONTENT_TYPE] + ) + + boundary = mimetype.parameters["boundary"] + if len(boundary) > 70: + raise ValueError("boundary %r is too long (70 chars max)" % boundary) + + return boundary + + async def _readline(self) -> bytes: + if self._unread: + return self._unread.pop() + return await self._content.readline() + + async def _read_until_first_boundary(self) -> None: + while True: + chunk = await self._readline() + if chunk == b"": + raise ValueError( + "Could not find starting boundary %r" % (self._boundary) + ) + chunk = chunk.rstrip() + if chunk == self._boundary: + return + elif chunk == self._boundary + b"--": + self._at_eof = True + return + + async def _read_boundary(self) -> None: + chunk = (await self._readline()).rstrip() + if chunk == self._boundary: + pass + elif chunk == self._boundary + b"--": + self._at_eof = True + epilogue = await self._readline() + next_line = await self._readline() + + # the epilogue is expected and then either the end of input or the + # parent multipart boundary, if the parent boundary is found then + # it should be marked as unread and handed to the parent for + # processing + if next_line[:2] == b"--": + self._unread.append(next_line) + # otherwise the request is likely missing an epilogue and both + # lines should be passed to the parent for processing + # (this handles the old behavior gracefully) + else: + self._unread.extend([next_line, epilogue]) + else: + raise ValueError(f"Invalid boundary {chunk!r}, expected {self._boundary!r}") + + async def _read_headers(self) -> "CIMultiDictProxy[str]": + lines = [b""] + while True: + chunk = await self._content.readline() + chunk = chunk.strip() + lines.append(chunk) + if not chunk: + break + parser = HeadersParser() + headers, raw_headers = parser.parse_headers(lines) + return headers + + async def _maybe_release_last_part(self) -> None: + """Ensures that the last read body part is read completely.""" + if self._last_part is not None: + if not self._last_part.at_eof(): + await self._last_part.release() + self._unread.extend(self._last_part._unread) + self._last_part = None + + +_Part = Tuple[Payload, str, str] + + +class MultipartWriter(Payload): + """Multipart body writer.""" + + def __init__(self, subtype: str = "mixed", boundary: Optional[str] = None) -> None: + boundary = boundary if boundary is not None else uuid.uuid4().hex + # The underlying Payload API demands a str (utf-8), not bytes, + # so we need to ensure we don't lose anything during conversion. + # As a result, require the boundary to be ASCII only. + # In both situations. + + try: + self._boundary = boundary.encode("ascii") + except UnicodeEncodeError: + raise ValueError("boundary should contain ASCII only chars") from None + ctype = f"multipart/{subtype}; boundary={self._boundary_value}" + + super().__init__(None, content_type=ctype) + + self._parts = [] # type: List[_Part] + + def __enter__(self) -> "MultipartWriter": + return self + + def __exit__( + self, + exc_type: Optional[Type[BaseException]], + exc_val: Optional[BaseException], + exc_tb: Optional[TracebackType], + ) -> None: + pass + + def __iter__(self) -> Iterator[_Part]: + return iter(self._parts) + + def __len__(self) -> int: + return len(self._parts) + + def __bool__(self) -> bool: + return True + + _valid_tchar_regex = re.compile(br"\A[!#$%&'*+\-.^_`|~\w]+\Z") + _invalid_qdtext_char_regex = re.compile(br"[\x00-\x08\x0A-\x1F\x7F]") + + @property + def _boundary_value(self) -> str: + """Wrap boundary parameter value in quotes, if necessary. + + Reads self.boundary and returns a unicode sting. + """ + # Refer to RFCs 7231, 7230, 5234. + # + # parameter = token "=" ( token / quoted-string ) + # token = 1*tchar + # quoted-string = DQUOTE *( qdtext / quoted-pair ) DQUOTE + # qdtext = HTAB / SP / %x21 / %x23-5B / %x5D-7E / obs-text + # obs-text = %x80-FF + # quoted-pair = "\" ( HTAB / SP / VCHAR / obs-text ) + # tchar = "!" / "#" / "$" / "%" / "&" / "'" / "*" + # / "+" / "-" / "." / "^" / "_" / "`" / "|" / "~" + # / DIGIT / ALPHA + # ; any VCHAR, except delimiters + # VCHAR = %x21-7E + value = self._boundary + if re.match(self._valid_tchar_regex, value): + return value.decode("ascii") # cannot fail + + if re.search(self._invalid_qdtext_char_regex, value): + raise ValueError("boundary value contains invalid characters") + + # escape %x5C and %x22 + quoted_value_content = value.replace(b"\\", b"\\\\") + quoted_value_content = quoted_value_content.replace(b'"', b'\\"') + + return '"' + quoted_value_content.decode("ascii") + '"' + + @property + def boundary(self) -> str: + return self._boundary.decode("ascii") + + def append(self, obj: Any, headers: Optional[MultiMapping[str]] = None) -> Payload: + if headers is None: + headers = CIMultiDict() + + if isinstance(obj, Payload): + obj.headers.update(headers) + return self.append_payload(obj) + else: + try: + payload = get_payload(obj, headers=headers) + except LookupError: + raise TypeError("Cannot create payload from %r" % obj) + else: + return self.append_payload(payload) + + def append_payload(self, payload: Payload) -> Payload: + """Adds a new body part to multipart writer.""" + # compression + encoding = payload.headers.get( + CONTENT_ENCODING, + "", + ).lower() # type: Optional[str] + if encoding and encoding not in ("deflate", "gzip", "identity"): + raise RuntimeError(f"unknown content encoding: {encoding}") + if encoding == "identity": + encoding = None + + # te encoding + te_encoding = payload.headers.get( + CONTENT_TRANSFER_ENCODING, + "", + ).lower() # type: Optional[str] + if te_encoding not in ("", "base64", "quoted-printable", "binary"): + raise RuntimeError( + "unknown content transfer encoding: {}" "".format(te_encoding) + ) + if te_encoding == "binary": + te_encoding = None + + # size + size = payload.size + if size is not None and not (encoding or te_encoding): + payload.headers[CONTENT_LENGTH] = str(size) + + self._parts.append((payload, encoding, te_encoding)) # type: ignore[arg-type] + return payload + + def append_json( + self, obj: Any, headers: Optional[MultiMapping[str]] = None + ) -> Payload: + """Helper to append JSON part.""" + if headers is None: + headers = CIMultiDict() + + return self.append_payload(JsonPayload(obj, headers=headers)) + + def append_form( + self, + obj: Union[Sequence[Tuple[str, str]], Mapping[str, str]], + headers: Optional[MultiMapping[str]] = None, + ) -> Payload: + """Helper to append form urlencoded part.""" + assert isinstance(obj, (Sequence, Mapping)) + + if headers is None: + headers = CIMultiDict() + + if isinstance(obj, Mapping): + obj = list(obj.items()) + data = urlencode(obj, doseq=True) + + return self.append_payload( + StringPayload( + data, headers=headers, content_type="application/x-www-form-urlencoded" + ) + ) + + @property + def size(self) -> Optional[int]: + """Size of the payload.""" + total = 0 + for part, encoding, te_encoding in self._parts: + if encoding or te_encoding or part.size is None: + return None + + total += int( + 2 + + len(self._boundary) + + 2 + + part.size # b'--'+self._boundary+b'\r\n' + + len(part._binary_headers) + + 2 # b'\r\n' + ) + + total += 2 + len(self._boundary) + 4 # b'--'+self._boundary+b'--\r\n' + return total + + async def write(self, writer: Any, close_boundary: bool = True) -> None: + """Write body.""" + for part, encoding, te_encoding in self._parts: + await writer.write(b"--" + self._boundary + b"\r\n") + await writer.write(part._binary_headers) + + if encoding or te_encoding: + w = MultipartPayloadWriter(writer) + if encoding: + w.enable_compression(encoding) + if te_encoding: + w.enable_encoding(te_encoding) + await part.write(w) # type: ignore[arg-type] + await w.write_eof() + else: + await part.write(writer) + + await writer.write(b"\r\n") + + if close_boundary: + await writer.write(b"--" + self._boundary + b"--\r\n") + + +class MultipartPayloadWriter: + def __init__(self, writer: Any) -> None: + self._writer = writer + self._encoding = None # type: Optional[str] + self._compress = None # type: Any + self._encoding_buffer = None # type: Optional[bytearray] + + def enable_encoding(self, encoding: str) -> None: + if encoding == "base64": + self._encoding = encoding + self._encoding_buffer = bytearray() + elif encoding == "quoted-printable": + self._encoding = "quoted-printable" + + def enable_compression( + self, encoding: str = "deflate", strategy: int = zlib.Z_DEFAULT_STRATEGY + ) -> None: + zlib_mode = 16 + zlib.MAX_WBITS if encoding == "gzip" else -zlib.MAX_WBITS + self._compress = zlib.compressobj(wbits=zlib_mode, strategy=strategy) + + async def write_eof(self) -> None: + if self._compress is not None: + chunk = self._compress.flush() + if chunk: + self._compress = None + await self.write(chunk) + + if self._encoding == "base64": + if self._encoding_buffer: + await self._writer.write(base64.b64encode(self._encoding_buffer)) + + async def write(self, chunk: bytes) -> None: + if self._compress is not None: + if chunk: + chunk = self._compress.compress(chunk) + if not chunk: + return + + if self._encoding == "base64": + buf = self._encoding_buffer + assert buf is not None + buf.extend(chunk) + + if buf: + div, mod = divmod(len(buf), 3) + enc_chunk, self._encoding_buffer = (buf[: div * 3], buf[div * 3 :]) + if enc_chunk: + b64chunk = base64.b64encode(enc_chunk) + await self._writer.write(b64chunk) + elif self._encoding == "quoted-printable": + await self._writer.write(binascii.b2a_qp(chunk)) + else: + await self._writer.write(chunk) diff --git a/sbsheriff/Lib/site-packages/aiohttp/payload.py b/sbsheriff/Lib/site-packages/aiohttp/payload.py new file mode 100644 index 0000000..2ee90be --- /dev/null +++ b/sbsheriff/Lib/site-packages/aiohttp/payload.py @@ -0,0 +1,465 @@ +import asyncio +import enum +import io +import json +import mimetypes +import os +import warnings +from abc import ABC, abstractmethod +from itertools import chain +from typing import ( + IO, + TYPE_CHECKING, + Any, + ByteString, + Dict, + Iterable, + Optional, + TextIO, + Tuple, + Type, + Union, +) + +from multidict import CIMultiDict + +from . import hdrs +from .abc import AbstractStreamWriter +from .helpers import ( + PY_36, + content_disposition_header, + guess_filename, + parse_mimetype, + sentinel, +) +from .streams import StreamReader +from .typedefs import Final, JSONEncoder, _CIMultiDict + +__all__ = ( + "PAYLOAD_REGISTRY", + "get_payload", + "payload_type", + "Payload", + "BytesPayload", + "StringPayload", + "IOBasePayload", + "BytesIOPayload", + "BufferedReaderPayload", + "TextIOPayload", + "StringIOPayload", + "JsonPayload", + "AsyncIterablePayload", +) + +TOO_LARGE_BYTES_BODY: Final[int] = 2 ** 20 # 1 MB + +if TYPE_CHECKING: # pragma: no cover + from typing import List + + +class LookupError(Exception): + pass + + +class Order(str, enum.Enum): + normal = "normal" + try_first = "try_first" + try_last = "try_last" + + +def get_payload(data: Any, *args: Any, **kwargs: Any) -> "Payload": + return PAYLOAD_REGISTRY.get(data, *args, **kwargs) + + +def register_payload( + factory: Type["Payload"], type: Any, *, order: Order = Order.normal +) -> None: + PAYLOAD_REGISTRY.register(factory, type, order=order) + + +class payload_type: + def __init__(self, type: Any, *, order: Order = Order.normal) -> None: + self.type = type + self.order = order + + def __call__(self, factory: Type["Payload"]) -> Type["Payload"]: + register_payload(factory, self.type, order=self.order) + return factory + + +PayloadType = Type["Payload"] +_PayloadRegistryItem = Tuple[PayloadType, Any] + + +class PayloadRegistry: + """Payload registry. + + note: we need zope.interface for more efficient adapter search + """ + + def __init__(self) -> None: + self._first = [] # type: List[_PayloadRegistryItem] + self._normal = [] # type: List[_PayloadRegistryItem] + self._last = [] # type: List[_PayloadRegistryItem] + + def get( + self, + data: Any, + *args: Any, + _CHAIN: "Type[chain[_PayloadRegistryItem]]" = chain, + **kwargs: Any, + ) -> "Payload": + if isinstance(data, Payload): + return data + for factory, type in _CHAIN(self._first, self._normal, self._last): + if isinstance(data, type): + return factory(data, *args, **kwargs) + + raise LookupError() + + def register( + self, factory: PayloadType, type: Any, *, order: Order = Order.normal + ) -> None: + if order is Order.try_first: + self._first.append((factory, type)) + elif order is Order.normal: + self._normal.append((factory, type)) + elif order is Order.try_last: + self._last.append((factory, type)) + else: + raise ValueError(f"Unsupported order {order!r}") + + +class Payload(ABC): + + _default_content_type = "application/octet-stream" # type: str + _size = None # type: Optional[int] + + def __init__( + self, + value: Any, + headers: Optional[ + Union[_CIMultiDict, Dict[str, str], Iterable[Tuple[str, str]]] + ] = None, + content_type: Optional[str] = sentinel, + filename: Optional[str] = None, + encoding: Optional[str] = None, + **kwargs: Any, + ) -> None: + self._encoding = encoding + self._filename = filename + self._headers = CIMultiDict() # type: _CIMultiDict + self._value = value + if content_type is not sentinel and content_type is not None: + self._headers[hdrs.CONTENT_TYPE] = content_type + elif self._filename is not None: + content_type = mimetypes.guess_type(self._filename)[0] + if content_type is None: + content_type = self._default_content_type + self._headers[hdrs.CONTENT_TYPE] = content_type + else: + self._headers[hdrs.CONTENT_TYPE] = self._default_content_type + self._headers.update(headers or {}) + + @property + def size(self) -> Optional[int]: + """Size of the payload.""" + return self._size + + @property + def filename(self) -> Optional[str]: + """Filename of the payload.""" + return self._filename + + @property + def headers(self) -> _CIMultiDict: + """Custom item headers""" + return self._headers + + @property + def _binary_headers(self) -> bytes: + return ( + "".join([k + ": " + v + "\r\n" for k, v in self.headers.items()]).encode( + "utf-8" + ) + + b"\r\n" + ) + + @property + def encoding(self) -> Optional[str]: + """Payload encoding""" + return self._encoding + + @property + def content_type(self) -> str: + """Content type""" + return self._headers[hdrs.CONTENT_TYPE] + + def set_content_disposition( + self, + disptype: str, + quote_fields: bool = True, + _charset: str = "utf-8", + **params: Any, + ) -> None: + """Sets ``Content-Disposition`` header.""" + self._headers[hdrs.CONTENT_DISPOSITION] = content_disposition_header( + disptype, quote_fields=quote_fields, _charset=_charset, **params + ) + + @abstractmethod + async def write(self, writer: AbstractStreamWriter) -> None: + """Write payload. + + writer is an AbstractStreamWriter instance: + """ + + +class BytesPayload(Payload): + def __init__(self, value: ByteString, *args: Any, **kwargs: Any) -> None: + if not isinstance(value, (bytes, bytearray, memoryview)): + raise TypeError(f"value argument must be byte-ish, not {type(value)!r}") + + if "content_type" not in kwargs: + kwargs["content_type"] = "application/octet-stream" + + super().__init__(value, *args, **kwargs) + + if isinstance(value, memoryview): + self._size = value.nbytes + else: + self._size = len(value) + + if self._size > TOO_LARGE_BYTES_BODY: + if PY_36: + kwargs = {"source": self} + else: + kwargs = {} + warnings.warn( + "Sending a large body directly with raw bytes might" + " lock the event loop. You should probably pass an " + "io.BytesIO object instead", + ResourceWarning, + **kwargs, + ) + + async def write(self, writer: AbstractStreamWriter) -> None: + await writer.write(self._value) + + +class StringPayload(BytesPayload): + def __init__( + self, + value: str, + *args: Any, + encoding: Optional[str] = None, + content_type: Optional[str] = None, + **kwargs: Any, + ) -> None: + + if encoding is None: + if content_type is None: + real_encoding = "utf-8" + content_type = "text/plain; charset=utf-8" + else: + mimetype = parse_mimetype(content_type) + real_encoding = mimetype.parameters.get("charset", "utf-8") + else: + if content_type is None: + content_type = "text/plain; charset=%s" % encoding + real_encoding = encoding + + super().__init__( + value.encode(real_encoding), + encoding=real_encoding, + content_type=content_type, + *args, + **kwargs, + ) + + +class StringIOPayload(StringPayload): + def __init__(self, value: IO[str], *args: Any, **kwargs: Any) -> None: + super().__init__(value.read(), *args, **kwargs) + + +class IOBasePayload(Payload): + _value: IO[Any] + + def __init__( + self, value: IO[Any], disposition: str = "attachment", *args: Any, **kwargs: Any + ) -> None: + if "filename" not in kwargs: + kwargs["filename"] = guess_filename(value) + + super().__init__(value, *args, **kwargs) + + if self._filename is not None and disposition is not None: + if hdrs.CONTENT_DISPOSITION not in self.headers: + self.set_content_disposition(disposition, filename=self._filename) + + async def write(self, writer: AbstractStreamWriter) -> None: + loop = asyncio.get_event_loop() + try: + chunk = await loop.run_in_executor(None, self._value.read, 2 ** 16) + while chunk: + await writer.write(chunk) + chunk = await loop.run_in_executor(None, self._value.read, 2 ** 16) + finally: + await loop.run_in_executor(None, self._value.close) + + +class TextIOPayload(IOBasePayload): + _value: TextIO + + def __init__( + self, + value: TextIO, + *args: Any, + encoding: Optional[str] = None, + content_type: Optional[str] = None, + **kwargs: Any, + ) -> None: + + if encoding is None: + if content_type is None: + encoding = "utf-8" + content_type = "text/plain; charset=utf-8" + else: + mimetype = parse_mimetype(content_type) + encoding = mimetype.parameters.get("charset", "utf-8") + else: + if content_type is None: + content_type = "text/plain; charset=%s" % encoding + + super().__init__( + value, + content_type=content_type, + encoding=encoding, + *args, + **kwargs, + ) + + @property + def size(self) -> Optional[int]: + try: + return os.fstat(self._value.fileno()).st_size - self._value.tell() + except OSError: + return None + + async def write(self, writer: AbstractStreamWriter) -> None: + loop = asyncio.get_event_loop() + try: + chunk = await loop.run_in_executor(None, self._value.read, 2 ** 16) + while chunk: + data = ( + chunk.encode(encoding=self._encoding) + if self._encoding + else chunk.encode() + ) + await writer.write(data) + chunk = await loop.run_in_executor(None, self._value.read, 2 ** 16) + finally: + await loop.run_in_executor(None, self._value.close) + + +class BytesIOPayload(IOBasePayload): + @property + def size(self) -> int: + position = self._value.tell() + end = self._value.seek(0, os.SEEK_END) + self._value.seek(position) + return end - position + + +class BufferedReaderPayload(IOBasePayload): + @property + def size(self) -> Optional[int]: + try: + return os.fstat(self._value.fileno()).st_size - self._value.tell() + except OSError: + # data.fileno() is not supported, e.g. + # io.BufferedReader(io.BytesIO(b'data')) + return None + + +class JsonPayload(BytesPayload): + def __init__( + self, + value: Any, + encoding: str = "utf-8", + content_type: str = "application/json", + dumps: JSONEncoder = json.dumps, + *args: Any, + **kwargs: Any, + ) -> None: + + super().__init__( + dumps(value).encode(encoding), + content_type=content_type, + encoding=encoding, + *args, + **kwargs, + ) + + +if TYPE_CHECKING: # pragma: no cover + from typing import AsyncIterable, AsyncIterator + + _AsyncIterator = AsyncIterator[bytes] + _AsyncIterable = AsyncIterable[bytes] +else: + from collections.abc import AsyncIterable, AsyncIterator + + _AsyncIterator = AsyncIterator + _AsyncIterable = AsyncIterable + + +class AsyncIterablePayload(Payload): + + _iter = None # type: Optional[_AsyncIterator] + + def __init__(self, value: _AsyncIterable, *args: Any, **kwargs: Any) -> None: + if not isinstance(value, AsyncIterable): + raise TypeError( + "value argument must support " + "collections.abc.AsyncIterablebe interface, " + "got {!r}".format(type(value)) + ) + + if "content_type" not in kwargs: + kwargs["content_type"] = "application/octet-stream" + + super().__init__(value, *args, **kwargs) + + self._iter = value.__aiter__() + + async def write(self, writer: AbstractStreamWriter) -> None: + if self._iter: + try: + # iter is not None check prevents rare cases + # when the case iterable is used twice + while True: + chunk = await self._iter.__anext__() + await writer.write(chunk) + except StopAsyncIteration: + self._iter = None + + +class StreamReaderPayload(AsyncIterablePayload): + def __init__(self, value: StreamReader, *args: Any, **kwargs: Any) -> None: + super().__init__(value.iter_any(), *args, **kwargs) + + +PAYLOAD_REGISTRY = PayloadRegistry() +PAYLOAD_REGISTRY.register(BytesPayload, (bytes, bytearray, memoryview)) +PAYLOAD_REGISTRY.register(StringPayload, str) +PAYLOAD_REGISTRY.register(StringIOPayload, io.StringIO) +PAYLOAD_REGISTRY.register(TextIOPayload, io.TextIOBase) +PAYLOAD_REGISTRY.register(BytesIOPayload, io.BytesIO) +PAYLOAD_REGISTRY.register(BufferedReaderPayload, (io.BufferedReader, io.BufferedRandom)) +PAYLOAD_REGISTRY.register(IOBasePayload, io.IOBase) +PAYLOAD_REGISTRY.register(StreamReaderPayload, StreamReader) +# try_last for giving a chance to more specialized async interables like +# multidict.BodyPartReaderPayload override the default +PAYLOAD_REGISTRY.register(AsyncIterablePayload, AsyncIterable, order=Order.try_last) diff --git a/sbsheriff/Lib/site-packages/aiohttp/payload_streamer.py b/sbsheriff/Lib/site-packages/aiohttp/payload_streamer.py new file mode 100644 index 0000000..9f8b8bc --- /dev/null +++ b/sbsheriff/Lib/site-packages/aiohttp/payload_streamer.py @@ -0,0 +1,75 @@ +""" +Payload implemenation for coroutines as data provider. + +As a simple case, you can upload data from file:: + + @aiohttp.streamer + async def file_sender(writer, file_name=None): + with open(file_name, 'rb') as f: + chunk = f.read(2**16) + while chunk: + await writer.write(chunk) + + chunk = f.read(2**16) + +Then you can use `file_sender` like this: + + async with session.post('http://httpbin.org/post', + data=file_sender(file_name='huge_file')) as resp: + print(await resp.text()) + +..note:: Coroutine must accept `writer` as first argument + +""" + +import types +import warnings +from typing import Any, Awaitable, Callable, Dict, Tuple + +from .abc import AbstractStreamWriter +from .payload import Payload, payload_type + +__all__ = ("streamer",) + + +class _stream_wrapper: + def __init__( + self, + coro: Callable[..., Awaitable[None]], + args: Tuple[Any, ...], + kwargs: Dict[str, Any], + ) -> None: + self.coro = types.coroutine(coro) + self.args = args + self.kwargs = kwargs + + async def __call__(self, writer: AbstractStreamWriter) -> None: + await self.coro(writer, *self.args, **self.kwargs) # type: ignore[operator] + + +class streamer: + def __init__(self, coro: Callable[..., Awaitable[None]]) -> None: + warnings.warn( + "@streamer is deprecated, use async generators instead", + DeprecationWarning, + stacklevel=2, + ) + self.coro = coro + + def __call__(self, *args: Any, **kwargs: Any) -> _stream_wrapper: + return _stream_wrapper(self.coro, args, kwargs) + + +@payload_type(_stream_wrapper) +class StreamWrapperPayload(Payload): + async def write(self, writer: AbstractStreamWriter) -> None: + await self._value(writer) + + +@payload_type(streamer) +class StreamPayload(StreamWrapperPayload): + def __init__(self, value: Any, *args: Any, **kwargs: Any) -> None: + super().__init__(value(), *args, **kwargs) + + async def write(self, writer: AbstractStreamWriter) -> None: + await self._value(writer) diff --git a/sbsheriff/Lib/site-packages/aiohttp/py.typed b/sbsheriff/Lib/site-packages/aiohttp/py.typed new file mode 100644 index 0000000..f5642f7 --- /dev/null +++ b/sbsheriff/Lib/site-packages/aiohttp/py.typed @@ -0,0 +1 @@ +Marker diff --git a/sbsheriff/Lib/site-packages/aiohttp/pytest_plugin.py b/sbsheriff/Lib/site-packages/aiohttp/pytest_plugin.py new file mode 100644 index 0000000..dd9a9f6 --- /dev/null +++ b/sbsheriff/Lib/site-packages/aiohttp/pytest_plugin.py @@ -0,0 +1,391 @@ +import asyncio +import contextlib +import warnings +from collections.abc import Callable +from typing import Any, Awaitable, Callable, Dict, Generator, Optional, Union + +import pytest + +from aiohttp.helpers import PY_37, isasyncgenfunction +from aiohttp.web import Application + +from .test_utils import ( + BaseTestServer, + RawTestServer, + TestClient, + TestServer, + loop_context, + setup_test_loop, + teardown_test_loop, + unused_port as _unused_port, +) + +try: + import uvloop +except ImportError: # pragma: no cover + uvloop = None + +try: + import tokio +except ImportError: # pragma: no cover + tokio = None + +AiohttpClient = Callable[[Union[Application, BaseTestServer]], Awaitable[TestClient]] + + +def pytest_addoption(parser): # type: ignore[no-untyped-def] + parser.addoption( + "--aiohttp-fast", + action="store_true", + default=False, + help="run tests faster by disabling extra checks", + ) + parser.addoption( + "--aiohttp-loop", + action="store", + default="pyloop", + help="run tests with specific loop: pyloop, uvloop, tokio or all", + ) + parser.addoption( + "--aiohttp-enable-loop-debug", + action="store_true", + default=False, + help="enable event loop debug mode", + ) + + +def pytest_fixture_setup(fixturedef): # type: ignore[no-untyped-def] + """Set up pytest fixture. + + Allow fixtures to be coroutines. Run coroutine fixtures in an event loop. + """ + func = fixturedef.func + + if isasyncgenfunction(func): + # async generator fixture + is_async_gen = True + elif asyncio.iscoroutinefunction(func): + # regular async fixture + is_async_gen = False + else: + # not an async fixture, nothing to do + return + + strip_request = False + if "request" not in fixturedef.argnames: + fixturedef.argnames += ("request",) + strip_request = True + + def wrapper(*args, **kwargs): # type: ignore[no-untyped-def] + request = kwargs["request"] + if strip_request: + del kwargs["request"] + + # if neither the fixture nor the test use the 'loop' fixture, + # 'getfixturevalue' will fail because the test is not parameterized + # (this can be removed someday if 'loop' is no longer parameterized) + if "loop" not in request.fixturenames: + raise Exception( + "Asynchronous fixtures must depend on the 'loop' fixture or " + "be used in tests depending from it." + ) + + _loop = request.getfixturevalue("loop") + + if is_async_gen: + # for async generators, we need to advance the generator once, + # then advance it again in a finalizer + gen = func(*args, **kwargs) + + def finalizer(): # type: ignore[no-untyped-def] + try: + return _loop.run_until_complete(gen.__anext__()) + except StopAsyncIteration: + pass + + request.addfinalizer(finalizer) + return _loop.run_until_complete(gen.__anext__()) + else: + return _loop.run_until_complete(func(*args, **kwargs)) + + fixturedef.func = wrapper + + +@pytest.fixture +def fast(request): # type: ignore[no-untyped-def] + """--fast config option""" + return request.config.getoption("--aiohttp-fast") + + +@pytest.fixture +def loop_debug(request): # type: ignore[no-untyped-def] + """--enable-loop-debug config option""" + return request.config.getoption("--aiohttp-enable-loop-debug") + + +@contextlib.contextmanager +def _runtime_warning_context(): # type: ignore[no-untyped-def] + """Context manager which checks for RuntimeWarnings. + + This exists specifically to + avoid "coroutine 'X' was never awaited" warnings being missed. + + If RuntimeWarnings occur in the context a RuntimeError is raised. + """ + with warnings.catch_warnings(record=True) as _warnings: + yield + rw = [ + "{w.filename}:{w.lineno}:{w.message}".format(w=w) + for w in _warnings + if w.category == RuntimeWarning + ] + if rw: + raise RuntimeError( + "{} Runtime Warning{},\n{}".format( + len(rw), "" if len(rw) == 1 else "s", "\n".join(rw) + ) + ) + + +@contextlib.contextmanager +def _passthrough_loop_context(loop, fast=False): # type: ignore[no-untyped-def] + """Passthrough loop context. + + Sets up and tears down a loop unless one is passed in via the loop + argument when it's passed straight through. + """ + if loop: + # loop already exists, pass it straight through + yield loop + else: + # this shadows loop_context's standard behavior + loop = setup_test_loop() + yield loop + teardown_test_loop(loop, fast=fast) + + +def pytest_pycollect_makeitem(collector, name, obj): # type: ignore[no-untyped-def] + """Fix pytest collecting for coroutines.""" + if collector.funcnamefilter(name) and asyncio.iscoroutinefunction(obj): + return list(collector._genfunctions(name, obj)) + + +def pytest_pyfunc_call(pyfuncitem): # type: ignore[no-untyped-def] + """Run coroutines in an event loop instead of a normal function call.""" + fast = pyfuncitem.config.getoption("--aiohttp-fast") + if asyncio.iscoroutinefunction(pyfuncitem.function): + existing_loop = pyfuncitem.funcargs.get( + "proactor_loop" + ) or pyfuncitem.funcargs.get("loop", None) + with _runtime_warning_context(): + with _passthrough_loop_context(existing_loop, fast=fast) as _loop: + testargs = { + arg: pyfuncitem.funcargs[arg] + for arg in pyfuncitem._fixtureinfo.argnames + } + _loop.run_until_complete(pyfuncitem.obj(**testargs)) + + return True + + +def pytest_generate_tests(metafunc): # type: ignore[no-untyped-def] + if "loop_factory" not in metafunc.fixturenames: + return + + loops = metafunc.config.option.aiohttp_loop + avail_factories = {"pyloop": asyncio.DefaultEventLoopPolicy} + + if uvloop is not None: # pragma: no cover + avail_factories["uvloop"] = uvloop.EventLoopPolicy + + if tokio is not None: # pragma: no cover + avail_factories["tokio"] = tokio.EventLoopPolicy + + if loops == "all": + loops = "pyloop,uvloop?,tokio?" + + factories = {} # type: ignore[var-annotated] + for name in loops.split(","): + required = not name.endswith("?") + name = name.strip(" ?") + if name not in avail_factories: # pragma: no cover + if required: + raise ValueError( + "Unknown loop '%s', available loops: %s" + % (name, list(factories.keys())) + ) + else: + continue + factories[name] = avail_factories[name] + metafunc.parametrize( + "loop_factory", list(factories.values()), ids=list(factories.keys()) + ) + + +@pytest.fixture +def loop(loop_factory, fast, loop_debug): # type: ignore[no-untyped-def] + """Return an instance of the event loop.""" + policy = loop_factory() + asyncio.set_event_loop_policy(policy) + with loop_context(fast=fast) as _loop: + if loop_debug: + _loop.set_debug(True) # pragma: no cover + asyncio.set_event_loop(_loop) + yield _loop + + +@pytest.fixture +def proactor_loop(): # type: ignore[no-untyped-def] + if not PY_37: + policy = asyncio.get_event_loop_policy() + policy._loop_factory = asyncio.ProactorEventLoop # type: ignore[attr-defined] + else: + policy = asyncio.WindowsProactorEventLoopPolicy() # type: ignore[attr-defined] + asyncio.set_event_loop_policy(policy) + + with loop_context(policy.new_event_loop) as _loop: + asyncio.set_event_loop(_loop) + yield _loop + + +@pytest.fixture +def unused_port(aiohttp_unused_port): # type: ignore[no-untyped-def] # pragma: no cover + warnings.warn( + "Deprecated, use aiohttp_unused_port fixture instead", + DeprecationWarning, + stacklevel=2, + ) + return aiohttp_unused_port + + +@pytest.fixture +def aiohttp_unused_port(): # type: ignore[no-untyped-def] + """Return a port that is unused on the current host.""" + return _unused_port + + +@pytest.fixture +def aiohttp_server(loop): # type: ignore[no-untyped-def] + """Factory to create a TestServer instance, given an app. + + aiohttp_server(app, **kwargs) + """ + servers = [] + + async def go(app, *, port=None, **kwargs): # type: ignore[no-untyped-def] + server = TestServer(app, port=port) + await server.start_server(loop=loop, **kwargs) + servers.append(server) + return server + + yield go + + async def finalize() -> None: + while servers: + await servers.pop().close() + + loop.run_until_complete(finalize()) + + +@pytest.fixture +def test_server(aiohttp_server): # type: ignore[no-untyped-def] # pragma: no cover + warnings.warn( + "Deprecated, use aiohttp_server fixture instead", + DeprecationWarning, + stacklevel=2, + ) + return aiohttp_server + + +@pytest.fixture +def aiohttp_raw_server(loop): # type: ignore[no-untyped-def] + """Factory to create a RawTestServer instance, given a web handler. + + aiohttp_raw_server(handler, **kwargs) + """ + servers = [] + + async def go(handler, *, port=None, **kwargs): # type: ignore[no-untyped-def] + server = RawTestServer(handler, port=port) + await server.start_server(loop=loop, **kwargs) + servers.append(server) + return server + + yield go + + async def finalize() -> None: + while servers: + await servers.pop().close() + + loop.run_until_complete(finalize()) + + +@pytest.fixture +def raw_test_server( # type: ignore[no-untyped-def] # pragma: no cover + aiohttp_raw_server, +): + warnings.warn( + "Deprecated, use aiohttp_raw_server fixture instead", + DeprecationWarning, + stacklevel=2, + ) + return aiohttp_raw_server + + +@pytest.fixture +def aiohttp_client( + loop: asyncio.AbstractEventLoop, +) -> Generator[AiohttpClient, None, None]: + """Factory to create a TestClient instance. + + aiohttp_client(app, **kwargs) + aiohttp_client(server, **kwargs) + aiohttp_client(raw_server, **kwargs) + """ + clients = [] + + async def go( + __param: Union[Application, BaseTestServer], + *args: Any, + server_kwargs: Optional[Dict[str, Any]] = None, + **kwargs: Any + ) -> TestClient: + + if isinstance(__param, Callable) and not isinstance( # type: ignore[arg-type] + __param, (Application, BaseTestServer) + ): + __param = __param(loop, *args, **kwargs) + kwargs = {} + else: + assert not args, "args should be empty" + + if isinstance(__param, Application): + server_kwargs = server_kwargs or {} + server = TestServer(__param, loop=loop, **server_kwargs) + client = TestClient(server, loop=loop, **kwargs) + elif isinstance(__param, BaseTestServer): + client = TestClient(__param, loop=loop, **kwargs) + else: + raise ValueError("Unknown argument type: %r" % type(__param)) + + await client.start_server() + clients.append(client) + return client + + yield go + + async def finalize() -> None: + while clients: + await clients.pop().close() + + loop.run_until_complete(finalize()) + + +@pytest.fixture +def test_client(aiohttp_client): # type: ignore[no-untyped-def] # pragma: no cover + warnings.warn( + "Deprecated, use aiohttp_client fixture instead", + DeprecationWarning, + stacklevel=2, + ) + return aiohttp_client diff --git a/sbsheriff/Lib/site-packages/aiohttp/resolver.py b/sbsheriff/Lib/site-packages/aiohttp/resolver.py new file mode 100644 index 0000000..531ce93 --- /dev/null +++ b/sbsheriff/Lib/site-packages/aiohttp/resolver.py @@ -0,0 +1,160 @@ +import asyncio +import socket +from typing import Any, Dict, List, Optional, Type, Union + +from .abc import AbstractResolver +from .helpers import get_running_loop + +__all__ = ("ThreadedResolver", "AsyncResolver", "DefaultResolver") + +try: + import aiodns + + # aiodns_default = hasattr(aiodns.DNSResolver, 'gethostbyname') +except ImportError: # pragma: no cover + aiodns = None + +aiodns_default = False + + +class ThreadedResolver(AbstractResolver): + """Threaded resolver. + + Uses an Executor for synchronous getaddrinfo() calls. + concurrent.futures.ThreadPoolExecutor is used by default. + """ + + def __init__(self, loop: Optional[asyncio.AbstractEventLoop] = None) -> None: + self._loop = get_running_loop(loop) + + async def resolve( + self, hostname: str, port: int = 0, family: int = socket.AF_INET + ) -> List[Dict[str, Any]]: + infos = await self._loop.getaddrinfo( + hostname, + port, + type=socket.SOCK_STREAM, + family=family, + flags=socket.AI_ADDRCONFIG, + ) + + hosts = [] + for family, _, proto, _, address in infos: + if family == socket.AF_INET6: + if len(address) < 3: + # IPv6 is not supported by Python build, + # or IPv6 is not enabled in the host + continue + if address[3]: # type: ignore[misc] + # This is essential for link-local IPv6 addresses. + # LL IPv6 is a VERY rare case. Strictly speaking, we should use + # getnameinfo() unconditionally, but performance makes sense. + host, _port = socket.getnameinfo( + address, socket.NI_NUMERICHOST | socket.NI_NUMERICSERV + ) + port = int(_port) + else: + host, port = address[:2] + else: # IPv4 + assert family == socket.AF_INET + host, port = address # type: ignore[misc] + hosts.append( + { + "hostname": hostname, + "host": host, + "port": port, + "family": family, + "proto": proto, + "flags": socket.AI_NUMERICHOST | socket.AI_NUMERICSERV, + } + ) + + return hosts + + async def close(self) -> None: + pass + + +class AsyncResolver(AbstractResolver): + """Use the `aiodns` package to make asynchronous DNS lookups""" + + def __init__( + self, + loop: Optional[asyncio.AbstractEventLoop] = None, + *args: Any, + **kwargs: Any + ) -> None: + if aiodns is None: + raise RuntimeError("Resolver requires aiodns library") + + self._loop = get_running_loop(loop) + self._resolver = aiodns.DNSResolver(*args, loop=loop, **kwargs) + + if not hasattr(self._resolver, "gethostbyname"): + # aiodns 1.1 is not available, fallback to DNSResolver.query + self.resolve = self._resolve_with_query # type: ignore + + async def resolve( + self, host: str, port: int = 0, family: int = socket.AF_INET + ) -> List[Dict[str, Any]]: + try: + resp = await self._resolver.gethostbyname(host, family) + except aiodns.error.DNSError as exc: + msg = exc.args[1] if len(exc.args) >= 1 else "DNS lookup failed" + raise OSError(msg) from exc + hosts = [] + for address in resp.addresses: + hosts.append( + { + "hostname": host, + "host": address, + "port": port, + "family": family, + "proto": 0, + "flags": socket.AI_NUMERICHOST | socket.AI_NUMERICSERV, + } + ) + + if not hosts: + raise OSError("DNS lookup failed") + + return hosts + + async def _resolve_with_query( + self, host: str, port: int = 0, family: int = socket.AF_INET + ) -> List[Dict[str, Any]]: + if family == socket.AF_INET6: + qtype = "AAAA" + else: + qtype = "A" + + try: + resp = await self._resolver.query(host, qtype) + except aiodns.error.DNSError as exc: + msg = exc.args[1] if len(exc.args) >= 1 else "DNS lookup failed" + raise OSError(msg) from exc + + hosts = [] + for rr in resp: + hosts.append( + { + "hostname": host, + "host": rr.host, + "port": port, + "family": family, + "proto": 0, + "flags": socket.AI_NUMERICHOST, + } + ) + + if not hosts: + raise OSError("DNS lookup failed") + + return hosts + + async def close(self) -> None: + self._resolver.cancel() + + +_DefaultType = Type[Union[AsyncResolver, ThreadedResolver]] +DefaultResolver: _DefaultType = AsyncResolver if aiodns_default else ThreadedResolver diff --git a/sbsheriff/Lib/site-packages/aiohttp/streams.py b/sbsheriff/Lib/site-packages/aiohttp/streams.py new file mode 100644 index 0000000..0558488 --- /dev/null +++ b/sbsheriff/Lib/site-packages/aiohttp/streams.py @@ -0,0 +1,660 @@ +import asyncio +import collections +import warnings +from typing import Awaitable, Callable, Deque, Generic, List, Optional, Tuple, TypeVar + +from .base_protocol import BaseProtocol +from .helpers import BaseTimerContext, set_exception, set_result +from .log import internal_logger +from .typedefs import Final + +__all__ = ( + "EMPTY_PAYLOAD", + "EofStream", + "StreamReader", + "DataQueue", + "FlowControlDataQueue", +) + +_T = TypeVar("_T") + + +class EofStream(Exception): + """eof stream indication.""" + + +class AsyncStreamIterator(Generic[_T]): + def __init__(self, read_func: Callable[[], Awaitable[_T]]) -> None: + self.read_func = read_func + + def __aiter__(self) -> "AsyncStreamIterator[_T]": + return self + + async def __anext__(self) -> _T: + try: + rv = await self.read_func() + except EofStream: + raise StopAsyncIteration + if rv == b"": + raise StopAsyncIteration + return rv + + +class ChunkTupleAsyncStreamIterator: + def __init__(self, stream: "StreamReader") -> None: + self._stream = stream + + def __aiter__(self) -> "ChunkTupleAsyncStreamIterator": + return self + + async def __anext__(self) -> Tuple[bytes, bool]: + rv = await self._stream.readchunk() + if rv == (b"", False): + raise StopAsyncIteration + return rv + + +class AsyncStreamReaderMixin: + def __aiter__(self) -> AsyncStreamIterator[bytes]: + return AsyncStreamIterator(self.readline) # type: ignore[attr-defined] + + def iter_chunked(self, n: int) -> AsyncStreamIterator[bytes]: + """Returns an asynchronous iterator that yields chunks of size n. + + Python-3.5 available for Python 3.5+ only + """ + return AsyncStreamIterator( + lambda: self.read(n) # type: ignore[attr-defined,no-any-return] + ) + + def iter_any(self) -> AsyncStreamIterator[bytes]: + """Yield all available data as soon as it is received. + + Python-3.5 available for Python 3.5+ only + """ + return AsyncStreamIterator(self.readany) # type: ignore[attr-defined] + + def iter_chunks(self) -> ChunkTupleAsyncStreamIterator: + """Yield chunks of data as they are received by the server. + + The yielded objects are tuples + of (bytes, bool) as returned by the StreamReader.readchunk method. + + Python-3.5 available for Python 3.5+ only + """ + return ChunkTupleAsyncStreamIterator(self) # type: ignore[arg-type] + + +class StreamReader(AsyncStreamReaderMixin): + """An enhancement of asyncio.StreamReader. + + Supports asynchronous iteration by line, chunk or as available:: + + async for line in reader: + ... + async for chunk in reader.iter_chunked(1024): + ... + async for slice in reader.iter_any(): + ... + + """ + + total_bytes = 0 + + def __init__( + self, + protocol: BaseProtocol, + limit: int, + *, + timer: Optional[BaseTimerContext] = None, + loop: Optional[asyncio.AbstractEventLoop] = None, + ) -> None: + self._protocol = protocol + self._low_water = limit + self._high_water = limit * 2 + if loop is None: + loop = asyncio.get_event_loop() + self._loop = loop + self._size = 0 + self._cursor = 0 + self._http_chunk_splits = None # type: Optional[List[int]] + self._buffer = collections.deque() # type: Deque[bytes] + self._buffer_offset = 0 + self._eof = False + self._waiter = None # type: Optional[asyncio.Future[None]] + self._eof_waiter = None # type: Optional[asyncio.Future[None]] + self._exception = None # type: Optional[BaseException] + self._timer = timer + self._eof_callbacks = [] # type: List[Callable[[], None]] + + def __repr__(self) -> str: + info = [self.__class__.__name__] + if self._size: + info.append("%d bytes" % self._size) + if self._eof: + info.append("eof") + if self._low_water != 2 ** 16: # default limit + info.append("low=%d high=%d" % (self._low_water, self._high_water)) + if self._waiter: + info.append("w=%r" % self._waiter) + if self._exception: + info.append("e=%r" % self._exception) + return "<%s>" % " ".join(info) + + def get_read_buffer_limits(self) -> Tuple[int, int]: + return (self._low_water, self._high_water) + + def exception(self) -> Optional[BaseException]: + return self._exception + + def set_exception(self, exc: BaseException) -> None: + self._exception = exc + self._eof_callbacks.clear() + + waiter = self._waiter + if waiter is not None: + self._waiter = None + set_exception(waiter, exc) + + waiter = self._eof_waiter + if waiter is not None: + self._eof_waiter = None + set_exception(waiter, exc) + + def on_eof(self, callback: Callable[[], None]) -> None: + if self._eof: + try: + callback() + except Exception: + internal_logger.exception("Exception in eof callback") + else: + self._eof_callbacks.append(callback) + + def feed_eof(self) -> None: + self._eof = True + + waiter = self._waiter + if waiter is not None: + self._waiter = None + set_result(waiter, None) + + waiter = self._eof_waiter + if waiter is not None: + self._eof_waiter = None + set_result(waiter, None) + + for cb in self._eof_callbacks: + try: + cb() + except Exception: + internal_logger.exception("Exception in eof callback") + + self._eof_callbacks.clear() + + def is_eof(self) -> bool: + """Return True if 'feed_eof' was called.""" + return self._eof + + def at_eof(self) -> bool: + """Return True if the buffer is empty and 'feed_eof' was called.""" + return self._eof and not self._buffer + + async def wait_eof(self) -> None: + if self._eof: + return + + assert self._eof_waiter is None + self._eof_waiter = self._loop.create_future() + try: + await self._eof_waiter + finally: + self._eof_waiter = None + + def unread_data(self, data: bytes) -> None: + """rollback reading some data from stream, inserting it to buffer head.""" + warnings.warn( + "unread_data() is deprecated " + "and will be removed in future releases (#3260)", + DeprecationWarning, + stacklevel=2, + ) + if not data: + return + + if self._buffer_offset: + self._buffer[0] = self._buffer[0][self._buffer_offset :] + self._buffer_offset = 0 + self._size += len(data) + self._cursor -= len(data) + self._buffer.appendleft(data) + self._eof_counter = 0 + + # TODO: size is ignored, remove the param later + def feed_data(self, data: bytes, size: int = 0) -> None: + assert not self._eof, "feed_data after feed_eof" + + if not data: + return + + self._size += len(data) + self._buffer.append(data) + self.total_bytes += len(data) + + waiter = self._waiter + if waiter is not None: + self._waiter = None + set_result(waiter, None) + + if self._size > self._high_water and not self._protocol._reading_paused: + self._protocol.pause_reading() + + def begin_http_chunk_receiving(self) -> None: + if self._http_chunk_splits is None: + if self.total_bytes: + raise RuntimeError( + "Called begin_http_chunk_receiving when" "some data was already fed" + ) + self._http_chunk_splits = [] + + def end_http_chunk_receiving(self) -> None: + if self._http_chunk_splits is None: + raise RuntimeError( + "Called end_chunk_receiving without calling " + "begin_chunk_receiving first" + ) + + # self._http_chunk_splits contains logical byte offsets from start of + # the body transfer. Each offset is the offset of the end of a chunk. + # "Logical" means bytes, accessible for a user. + # If no chunks containig logical data were received, current position + # is difinitely zero. + pos = self._http_chunk_splits[-1] if self._http_chunk_splits else 0 + + if self.total_bytes == pos: + # We should not add empty chunks here. So we check for that. + # Note, when chunked + gzip is used, we can receive a chunk + # of compressed data, but that data may not be enough for gzip FSM + # to yield any uncompressed data. That's why current position may + # not change after receiving a chunk. + return + + self._http_chunk_splits.append(self.total_bytes) + + # wake up readchunk when end of http chunk received + waiter = self._waiter + if waiter is not None: + self._waiter = None + set_result(waiter, None) + + async def _wait(self, func_name: str) -> None: + # StreamReader uses a future to link the protocol feed_data() method + # to a read coroutine. Running two read coroutines at the same time + # would have an unexpected behaviour. It would not possible to know + # which coroutine would get the next data. + if self._waiter is not None: + raise RuntimeError( + "%s() called while another coroutine is " + "already waiting for incoming data" % func_name + ) + + waiter = self._waiter = self._loop.create_future() + try: + if self._timer: + with self._timer: + await waiter + else: + await waiter + finally: + self._waiter = None + + async def readline(self) -> bytes: + return await self.readuntil() + + async def readuntil(self, separator: bytes = b"\n") -> bytes: + seplen = len(separator) + if seplen == 0: + raise ValueError("Separator should be at least one-byte string") + + if self._exception is not None: + raise self._exception + + chunk = b"" + chunk_size = 0 + not_enough = True + + while not_enough: + while self._buffer and not_enough: + offset = self._buffer_offset + ichar = self._buffer[0].find(separator, offset) + 1 + # Read from current offset to found separator or to the end. + data = self._read_nowait_chunk(ichar - offset if ichar else -1) + chunk += data + chunk_size += len(data) + if ichar: + not_enough = False + + if chunk_size > self._high_water: + raise ValueError("Chunk too big") + + if self._eof: + break + + if not_enough: + await self._wait("readuntil") + + return chunk + + async def read(self, n: int = -1) -> bytes: + if self._exception is not None: + raise self._exception + + # migration problem; with DataQueue you have to catch + # EofStream exception, so common way is to run payload.read() inside + # infinite loop. what can cause real infinite loop with StreamReader + # lets keep this code one major release. + if __debug__: + if self._eof and not self._buffer: + self._eof_counter = getattr(self, "_eof_counter", 0) + 1 + if self._eof_counter > 5: + internal_logger.warning( + "Multiple access to StreamReader in eof state, " + "might be infinite loop.", + stack_info=True, + ) + + if not n: + return b"" + + if n < 0: + # This used to just loop creating a new waiter hoping to + # collect everything in self._buffer, but that would + # deadlock if the subprocess sends more than self.limit + # bytes. So just call self.readany() until EOF. + blocks = [] + while True: + block = await self.readany() + if not block: + break + blocks.append(block) + return b"".join(blocks) + + # TODO: should be `if` instead of `while` + # because waiter maybe triggered on chunk end, + # without feeding any data + while not self._buffer and not self._eof: + await self._wait("read") + + return self._read_nowait(n) + + async def readany(self) -> bytes: + if self._exception is not None: + raise self._exception + + # TODO: should be `if` instead of `while` + # because waiter maybe triggered on chunk end, + # without feeding any data + while not self._buffer and not self._eof: + await self._wait("readany") + + return self._read_nowait(-1) + + async def readchunk(self) -> Tuple[bytes, bool]: + """Returns a tuple of (data, end_of_http_chunk). + + When chunked transfer + encoding is used, end_of_http_chunk is a boolean indicating if the end + of the data corresponds to the end of a HTTP chunk , otherwise it is + always False. + """ + while True: + if self._exception is not None: + raise self._exception + + while self._http_chunk_splits: + pos = self._http_chunk_splits.pop(0) + if pos == self._cursor: + return (b"", True) + if pos > self._cursor: + return (self._read_nowait(pos - self._cursor), True) + internal_logger.warning( + "Skipping HTTP chunk end due to data " + "consumption beyond chunk boundary" + ) + + if self._buffer: + return (self._read_nowait_chunk(-1), False) + # return (self._read_nowait(-1), False) + + if self._eof: + # Special case for signifying EOF. + # (b'', True) is not a final return value actually. + return (b"", False) + + await self._wait("readchunk") + + async def readexactly(self, n: int) -> bytes: + if self._exception is not None: + raise self._exception + + blocks = [] # type: List[bytes] + while n > 0: + block = await self.read(n) + if not block: + partial = b"".join(blocks) + raise asyncio.IncompleteReadError(partial, len(partial) + n) + blocks.append(block) + n -= len(block) + + return b"".join(blocks) + + def read_nowait(self, n: int = -1) -> bytes: + # default was changed to be consistent with .read(-1) + # + # I believe the most users don't know about the method and + # they are not affected. + if self._exception is not None: + raise self._exception + + if self._waiter and not self._waiter.done(): + raise RuntimeError( + "Called while some coroutine is waiting for incoming data." + ) + + return self._read_nowait(n) + + def _read_nowait_chunk(self, n: int) -> bytes: + first_buffer = self._buffer[0] + offset = self._buffer_offset + if n != -1 and len(first_buffer) - offset > n: + data = first_buffer[offset : offset + n] + self._buffer_offset += n + + elif offset: + self._buffer.popleft() + data = first_buffer[offset:] + self._buffer_offset = 0 + + else: + data = self._buffer.popleft() + + self._size -= len(data) + self._cursor += len(data) + + chunk_splits = self._http_chunk_splits + # Prevent memory leak: drop useless chunk splits + while chunk_splits and chunk_splits[0] < self._cursor: + chunk_splits.pop(0) + + if self._size < self._low_water and self._protocol._reading_paused: + self._protocol.resume_reading() + return data + + def _read_nowait(self, n: int) -> bytes: + """Read not more than n bytes, or whole buffer if n == -1""" + chunks = [] + + while self._buffer: + chunk = self._read_nowait_chunk(n) + chunks.append(chunk) + if n != -1: + n -= len(chunk) + if n == 0: + break + + return b"".join(chunks) if chunks else b"" + + +class EmptyStreamReader(StreamReader): # lgtm [py/missing-call-to-init] + def __init__(self) -> None: + pass + + def exception(self) -> Optional[BaseException]: + return None + + def set_exception(self, exc: BaseException) -> None: + pass + + def on_eof(self, callback: Callable[[], None]) -> None: + try: + callback() + except Exception: + internal_logger.exception("Exception in eof callback") + + def feed_eof(self) -> None: + pass + + def is_eof(self) -> bool: + return True + + def at_eof(self) -> bool: + return True + + async def wait_eof(self) -> None: + return + + def feed_data(self, data: bytes, n: int = 0) -> None: + pass + + async def readline(self) -> bytes: + return b"" + + async def read(self, n: int = -1) -> bytes: + return b"" + + # TODO add async def readuntil + + async def readany(self) -> bytes: + return b"" + + async def readchunk(self) -> Tuple[bytes, bool]: + return (b"", True) + + async def readexactly(self, n: int) -> bytes: + raise asyncio.IncompleteReadError(b"", n) + + def read_nowait(self, n: int = -1) -> bytes: + return b"" + + +EMPTY_PAYLOAD: Final[StreamReader] = EmptyStreamReader() + + +class DataQueue(Generic[_T]): + """DataQueue is a general-purpose blocking queue with one reader.""" + + def __init__(self, loop: asyncio.AbstractEventLoop) -> None: + self._loop = loop + self._eof = False + self._waiter = None # type: Optional[asyncio.Future[None]] + self._exception = None # type: Optional[BaseException] + self._size = 0 + self._buffer = collections.deque() # type: Deque[Tuple[_T, int]] + + def __len__(self) -> int: + return len(self._buffer) + + def is_eof(self) -> bool: + return self._eof + + def at_eof(self) -> bool: + return self._eof and not self._buffer + + def exception(self) -> Optional[BaseException]: + return self._exception + + def set_exception(self, exc: BaseException) -> None: + self._eof = True + self._exception = exc + + waiter = self._waiter + if waiter is not None: + self._waiter = None + set_exception(waiter, exc) + + def feed_data(self, data: _T, size: int = 0) -> None: + self._size += size + self._buffer.append((data, size)) + + waiter = self._waiter + if waiter is not None: + self._waiter = None + set_result(waiter, None) + + def feed_eof(self) -> None: + self._eof = True + + waiter = self._waiter + if waiter is not None: + self._waiter = None + set_result(waiter, None) + + async def read(self) -> _T: + if not self._buffer and not self._eof: + assert not self._waiter + self._waiter = self._loop.create_future() + try: + await self._waiter + except (asyncio.CancelledError, asyncio.TimeoutError): + self._waiter = None + raise + + if self._buffer: + data, size = self._buffer.popleft() + self._size -= size + return data + else: + if self._exception is not None: + raise self._exception + else: + raise EofStream + + def __aiter__(self) -> AsyncStreamIterator[_T]: + return AsyncStreamIterator(self.read) + + +class FlowControlDataQueue(DataQueue[_T]): + """FlowControlDataQueue resumes and pauses an underlying stream. + + It is a destination for parsed data. + """ + + def __init__( + self, protocol: BaseProtocol, limit: int, *, loop: asyncio.AbstractEventLoop + ) -> None: + super().__init__(loop=loop) + + self._protocol = protocol + self._limit = limit * 2 + + def feed_data(self, data: _T, size: int = 0) -> None: + super().feed_data(data, size) + + if self._size > self._limit and not self._protocol._reading_paused: + self._protocol.pause_reading() + + async def read(self) -> _T: + try: + return await super().read() + finally: + if self._size < self._limit and self._protocol._reading_paused: + self._protocol.resume_reading() diff --git a/sbsheriff/Lib/site-packages/aiohttp/tcp_helpers.py b/sbsheriff/Lib/site-packages/aiohttp/tcp_helpers.py new file mode 100644 index 0000000..0e1dbf1 --- /dev/null +++ b/sbsheriff/Lib/site-packages/aiohttp/tcp_helpers.py @@ -0,0 +1,38 @@ +"""Helper methods to tune a TCP connection""" + +import asyncio +import socket +from contextlib import suppress +from typing import Optional # noqa + +__all__ = ("tcp_keepalive", "tcp_nodelay") + + +if hasattr(socket, "SO_KEEPALIVE"): + + def tcp_keepalive(transport: asyncio.Transport) -> None: + sock = transport.get_extra_info("socket") + if sock is not None: + sock.setsockopt(socket.SOL_SOCKET, socket.SO_KEEPALIVE, 1) + + +else: + + def tcp_keepalive(transport: asyncio.Transport) -> None: # pragma: no cover + pass + + +def tcp_nodelay(transport: asyncio.Transport, value: bool) -> None: + sock = transport.get_extra_info("socket") + + if sock is None: + return + + if sock.family not in (socket.AF_INET, socket.AF_INET6): + return + + value = bool(value) + + # socket may be closed already, on windows OSError get raised + with suppress(OSError): + sock.setsockopt(socket.IPPROTO_TCP, socket.TCP_NODELAY, value) diff --git a/sbsheriff/Lib/site-packages/aiohttp/test_utils.py b/sbsheriff/Lib/site-packages/aiohttp/test_utils.py new file mode 100644 index 0000000..361dae4 --- /dev/null +++ b/sbsheriff/Lib/site-packages/aiohttp/test_utils.py @@ -0,0 +1,698 @@ +"""Utilities shared by tests.""" + +import asyncio +import contextlib +import gc +import inspect +import ipaddress +import os +import socket +import sys +import warnings +from abc import ABC, abstractmethod +from types import TracebackType +from typing import ( + TYPE_CHECKING, + Any, + Callable, + Iterator, + List, + Optional, + Type, + Union, + cast, +) +from unittest import mock + +from aiosignal import Signal +from multidict import CIMultiDict, CIMultiDictProxy +from yarl import URL + +import aiohttp +from aiohttp.client import _RequestContextManager, _WSRequestContextManager + +from . import ClientSession, hdrs +from .abc import AbstractCookieJar +from .client_reqrep import ClientResponse +from .client_ws import ClientWebSocketResponse +from .helpers import PY_38, sentinel +from .http import HttpVersion, RawRequestMessage +from .web import ( + Application, + AppRunner, + BaseRunner, + Request, + Server, + ServerRunner, + SockSite, + UrlMappingMatchInfo, +) +from .web_protocol import _RequestHandler + +if TYPE_CHECKING: # pragma: no cover + from ssl import SSLContext +else: + SSLContext = None + +if PY_38: + from unittest import IsolatedAsyncioTestCase as TestCase +else: + from asynctest import TestCase # type: ignore[no-redef] + +REUSE_ADDRESS = os.name == "posix" and sys.platform != "cygwin" + + +def get_unused_port_socket( + host: str, family: socket.AddressFamily = socket.AF_INET +) -> socket.socket: + return get_port_socket(host, 0, family) + + +def get_port_socket( + host: str, port: int, family: socket.AddressFamily +) -> socket.socket: + s = socket.socket(family, socket.SOCK_STREAM) + if REUSE_ADDRESS: + # Windows has different semantics for SO_REUSEADDR, + # so don't set it. Ref: + # https://docs.microsoft.com/en-us/windows/win32/winsock/using-so-reuseaddr-and-so-exclusiveaddruse + s.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1) + s.bind((host, port)) + return s + + +def unused_port() -> int: + """Return a port that is unused on the current host.""" + with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as s: + s.bind(("127.0.0.1", 0)) + return cast(int, s.getsockname()[1]) + + +class BaseTestServer(ABC): + __test__ = False + + def __init__( + self, + *, + scheme: Union[str, object] = sentinel, + loop: Optional[asyncio.AbstractEventLoop] = None, + host: str = "127.0.0.1", + port: Optional[int] = None, + skip_url_asserts: bool = False, + socket_factory: Callable[ + [str, int, socket.AddressFamily], socket.socket + ] = get_port_socket, + **kwargs: Any, + ) -> None: + self._loop = loop + self.runner = None # type: Optional[BaseRunner] + self._root = None # type: Optional[URL] + self.host = host + self.port = port + self._closed = False + self.scheme = scheme + self.skip_url_asserts = skip_url_asserts + self.socket_factory = socket_factory + + async def start_server( + self, loop: Optional[asyncio.AbstractEventLoop] = None, **kwargs: Any + ) -> None: + if self.runner: + return + self._loop = loop + self._ssl = kwargs.pop("ssl", None) + self.runner = await self._make_runner(**kwargs) + await self.runner.setup() + if not self.port: + self.port = 0 + try: + version = ipaddress.ip_address(self.host).version + except ValueError: + version = 4 + family = socket.AF_INET6 if version == 6 else socket.AF_INET + _sock = self.socket_factory(self.host, self.port, family) + self.host, self.port = _sock.getsockname()[:2] + site = SockSite(self.runner, sock=_sock, ssl_context=self._ssl) + await site.start() + server = site._server + assert server is not None + sockets = server.sockets + assert sockets is not None + self.port = sockets[0].getsockname()[1] + if self.scheme is sentinel: + if self._ssl: + scheme = "https" + else: + scheme = "http" + self.scheme = scheme + self._root = URL(f"{self.scheme}://{self.host}:{self.port}") + + @abstractmethod # pragma: no cover + async def _make_runner(self, **kwargs: Any) -> BaseRunner: + pass + + def make_url(self, path: str) -> URL: + assert self._root is not None + url = URL(path) + if not self.skip_url_asserts: + assert not url.is_absolute() + return self._root.join(url) + else: + return URL(str(self._root) + path) + + @property + def started(self) -> bool: + return self.runner is not None + + @property + def closed(self) -> bool: + return self._closed + + @property + def handler(self) -> Server: + # for backward compatibility + # web.Server instance + runner = self.runner + assert runner is not None + assert runner.server is not None + return runner.server + + async def close(self) -> None: + """Close all fixtures created by the test client. + + After that point, the TestClient is no longer usable. + + This is an idempotent function: running close multiple times + will not have any additional effects. + + close is also run when the object is garbage collected, and on + exit when used as a context manager. + + """ + if self.started and not self.closed: + assert self.runner is not None + await self.runner.cleanup() + self._root = None + self.port = None + self._closed = True + + def __enter__(self) -> None: + raise TypeError("Use async with instead") + + def __exit__( + self, + exc_type: Optional[Type[BaseException]], + exc_value: Optional[BaseException], + traceback: Optional[TracebackType], + ) -> None: + # __exit__ should exist in pair with __enter__ but never executed + pass # pragma: no cover + + async def __aenter__(self) -> "BaseTestServer": + await self.start_server(loop=self._loop) + return self + + async def __aexit__( + self, + exc_type: Optional[Type[BaseException]], + exc_value: Optional[BaseException], + traceback: Optional[TracebackType], + ) -> None: + await self.close() + + +class TestServer(BaseTestServer): + def __init__( + self, + app: Application, + *, + scheme: Union[str, object] = sentinel, + host: str = "127.0.0.1", + port: Optional[int] = None, + **kwargs: Any, + ): + self.app = app + super().__init__(scheme=scheme, host=host, port=port, **kwargs) + + async def _make_runner(self, **kwargs: Any) -> BaseRunner: + return AppRunner(self.app, **kwargs) + + +class RawTestServer(BaseTestServer): + def __init__( + self, + handler: _RequestHandler, + *, + scheme: Union[str, object] = sentinel, + host: str = "127.0.0.1", + port: Optional[int] = None, + **kwargs: Any, + ) -> None: + self._handler = handler + super().__init__(scheme=scheme, host=host, port=port, **kwargs) + + async def _make_runner(self, debug: bool = True, **kwargs: Any) -> ServerRunner: + srv = Server(self._handler, loop=self._loop, debug=debug, **kwargs) + return ServerRunner(srv, debug=debug, **kwargs) + + +class TestClient: + """ + A test client implementation. + + To write functional tests for aiohttp based servers. + + """ + + __test__ = False + + def __init__( + self, + server: BaseTestServer, + *, + cookie_jar: Optional[AbstractCookieJar] = None, + loop: Optional[asyncio.AbstractEventLoop] = None, + **kwargs: Any, + ) -> None: + if not isinstance(server, BaseTestServer): + raise TypeError( + "server must be TestServer " "instance, found type: %r" % type(server) + ) + self._server = server + self._loop = loop + if cookie_jar is None: + cookie_jar = aiohttp.CookieJar(unsafe=True, loop=loop) + self._session = ClientSession(loop=loop, cookie_jar=cookie_jar, **kwargs) + self._closed = False + self._responses = [] # type: List[ClientResponse] + self._websockets = [] # type: List[ClientWebSocketResponse] + + async def start_server(self) -> None: + await self._server.start_server(loop=self._loop) + + @property + def host(self) -> str: + return self._server.host + + @property + def port(self) -> Optional[int]: + return self._server.port + + @property + def server(self) -> BaseTestServer: + return self._server + + @property + def app(self) -> Optional[Application]: + return cast(Optional[Application], getattr(self._server, "app", None)) + + @property + def session(self) -> ClientSession: + """An internal aiohttp.ClientSession. + + Unlike the methods on the TestClient, client session requests + do not automatically include the host in the url queried, and + will require an absolute path to the resource. + + """ + return self._session + + def make_url(self, path: str) -> URL: + return self._server.make_url(path) + + async def _request(self, method: str, path: str, **kwargs: Any) -> ClientResponse: + resp = await self._session.request(method, self.make_url(path), **kwargs) + # save it to close later + self._responses.append(resp) + return resp + + def request(self, method: str, path: str, **kwargs: Any) -> _RequestContextManager: + """Routes a request to tested http server. + + The interface is identical to aiohttp.ClientSession.request, + except the loop kwarg is overridden by the instance used by the + test server. + + """ + return _RequestContextManager(self._request(method, path, **kwargs)) + + def get(self, path: str, **kwargs: Any) -> _RequestContextManager: + """Perform an HTTP GET request.""" + return _RequestContextManager(self._request(hdrs.METH_GET, path, **kwargs)) + + def post(self, path: str, **kwargs: Any) -> _RequestContextManager: + """Perform an HTTP POST request.""" + return _RequestContextManager(self._request(hdrs.METH_POST, path, **kwargs)) + + def options(self, path: str, **kwargs: Any) -> _RequestContextManager: + """Perform an HTTP OPTIONS request.""" + return _RequestContextManager(self._request(hdrs.METH_OPTIONS, path, **kwargs)) + + def head(self, path: str, **kwargs: Any) -> _RequestContextManager: + """Perform an HTTP HEAD request.""" + return _RequestContextManager(self._request(hdrs.METH_HEAD, path, **kwargs)) + + def put(self, path: str, **kwargs: Any) -> _RequestContextManager: + """Perform an HTTP PUT request.""" + return _RequestContextManager(self._request(hdrs.METH_PUT, path, **kwargs)) + + def patch(self, path: str, **kwargs: Any) -> _RequestContextManager: + """Perform an HTTP PATCH request.""" + return _RequestContextManager(self._request(hdrs.METH_PATCH, path, **kwargs)) + + def delete(self, path: str, **kwargs: Any) -> _RequestContextManager: + """Perform an HTTP PATCH request.""" + return _RequestContextManager(self._request(hdrs.METH_DELETE, path, **kwargs)) + + def ws_connect(self, path: str, **kwargs: Any) -> _WSRequestContextManager: + """Initiate websocket connection. + + The api corresponds to aiohttp.ClientSession.ws_connect. + + """ + return _WSRequestContextManager(self._ws_connect(path, **kwargs)) + + async def _ws_connect(self, path: str, **kwargs: Any) -> ClientWebSocketResponse: + ws = await self._session.ws_connect(self.make_url(path), **kwargs) + self._websockets.append(ws) + return ws + + async def close(self) -> None: + """Close all fixtures created by the test client. + + After that point, the TestClient is no longer usable. + + This is an idempotent function: running close multiple times + will not have any additional effects. + + close is also run on exit when used as a(n) (asynchronous) + context manager. + + """ + if not self._closed: + for resp in self._responses: + resp.close() + for ws in self._websockets: + await ws.close() + await self._session.close() + await self._server.close() + self._closed = True + + def __enter__(self) -> None: + raise TypeError("Use async with instead") + + def __exit__( + self, + exc_type: Optional[Type[BaseException]], + exc: Optional[BaseException], + tb: Optional[TracebackType], + ) -> None: + # __exit__ should exist in pair with __enter__ but never executed + pass # pragma: no cover + + async def __aenter__(self) -> "TestClient": + await self.start_server() + return self + + async def __aexit__( + self, + exc_type: Optional[Type[BaseException]], + exc: Optional[BaseException], + tb: Optional[TracebackType], + ) -> None: + await self.close() + + +class AioHTTPTestCase(TestCase): + """A base class to allow for unittest web applications using aiohttp. + + Provides the following: + + * self.client (aiohttp.test_utils.TestClient): an aiohttp test client. + * self.loop (asyncio.BaseEventLoop): the event loop in which the + application and server are running. + * self.app (aiohttp.web.Application): the application returned by + self.get_application() + + Note that the TestClient's methods are asynchronous: you have to + execute function on the test client using asynchronous methods. + """ + + async def get_application(self) -> Application: + """Get application. + + This method should be overridden + to return the aiohttp.web.Application + object to test. + """ + return self.get_app() + + def get_app(self) -> Application: + """Obsolete method used to constructing web application. + + Use .get_application() coroutine instead. + """ + raise RuntimeError("Did you forget to define get_application()?") + + def setUp(self) -> None: + try: + self.loop = asyncio.get_running_loop() + except (AttributeError, RuntimeError): # AttributeError->py36 + self.loop = asyncio.get_event_loop_policy().get_event_loop() + + self.loop.run_until_complete(self.setUpAsync()) + + async def setUpAsync(self) -> None: + self.app = await self.get_application() + self.server = await self.get_server(self.app) + self.client = await self.get_client(self.server) + + await self.client.start_server() + + def tearDown(self) -> None: + self.loop.run_until_complete(self.tearDownAsync()) + + async def tearDownAsync(self) -> None: + await self.client.close() + + async def get_server(self, app: Application) -> TestServer: + """Return a TestServer instance.""" + return TestServer(app, loop=self.loop) + + async def get_client(self, server: TestServer) -> TestClient: + """Return a TestClient instance.""" + return TestClient(server, loop=self.loop) + + +def unittest_run_loop(func: Any, *args: Any, **kwargs: Any) -> Any: + """ + A decorator dedicated to use with asynchronous AioHTTPTestCase test methods. + + In 3.8+, this does nothing. + """ + warnings.warn( + "Decorator `@unittest_run_loop` is no longer needed in aiohttp 3.8+", + DeprecationWarning, + stacklevel=2, + ) + return func + + +_LOOP_FACTORY = Callable[[], asyncio.AbstractEventLoop] + + +@contextlib.contextmanager +def loop_context( + loop_factory: _LOOP_FACTORY = asyncio.new_event_loop, fast: bool = False +) -> Iterator[asyncio.AbstractEventLoop]: + """A contextmanager that creates an event_loop, for test purposes. + + Handles the creation and cleanup of a test loop. + """ + loop = setup_test_loop(loop_factory) + yield loop + teardown_test_loop(loop, fast=fast) + + +def setup_test_loop( + loop_factory: _LOOP_FACTORY = asyncio.new_event_loop, +) -> asyncio.AbstractEventLoop: + """Create and return an asyncio.BaseEventLoop instance. + + The caller should also call teardown_test_loop, + once they are done with the loop. + """ + loop = loop_factory() + try: + module = loop.__class__.__module__ + skip_watcher = "uvloop" in module + except AttributeError: # pragma: no cover + # Just in case + skip_watcher = True + asyncio.set_event_loop(loop) + if sys.platform != "win32" and not skip_watcher: + policy = asyncio.get_event_loop_policy() + watcher: asyncio.AbstractChildWatcher + try: # Python >= 3.8 + # Refs: + # * https://github.com/pytest-dev/pytest-xdist/issues/620 + # * https://stackoverflow.com/a/58614689/595220 + # * https://bugs.python.org/issue35621 + # * https://github.com/python/cpython/pull/14344 + watcher = asyncio.ThreadedChildWatcher() + except AttributeError: # Python < 3.8 + watcher = asyncio.SafeChildWatcher() + watcher.attach_loop(loop) + with contextlib.suppress(NotImplementedError): + policy.set_child_watcher(watcher) + return loop + + +def teardown_test_loop(loop: asyncio.AbstractEventLoop, fast: bool = False) -> None: + """Teardown and cleanup an event_loop created by setup_test_loop.""" + closed = loop.is_closed() + if not closed: + loop.call_soon(loop.stop) + loop.run_forever() + loop.close() + + if not fast: + gc.collect() + + asyncio.set_event_loop(None) + + +def _create_app_mock() -> mock.MagicMock: + def get_dict(app: Any, key: str) -> Any: + return app.__app_dict[key] + + def set_dict(app: Any, key: str, value: Any) -> None: + app.__app_dict[key] = value + + app = mock.MagicMock() + app.__app_dict = {} + app.__getitem__ = get_dict + app.__setitem__ = set_dict + + app._debug = False + app.on_response_prepare = Signal(app) + app.on_response_prepare.freeze() + return app + + +def _create_transport(sslcontext: Optional[SSLContext] = None) -> mock.Mock: + transport = mock.Mock() + + def get_extra_info(key: str) -> Optional[SSLContext]: + if key == "sslcontext": + return sslcontext + else: + return None + + transport.get_extra_info.side_effect = get_extra_info + return transport + + +def make_mocked_request( + method: str, + path: str, + headers: Any = None, + *, + match_info: Any = sentinel, + version: HttpVersion = HttpVersion(1, 1), + closing: bool = False, + app: Any = None, + writer: Any = sentinel, + protocol: Any = sentinel, + transport: Any = sentinel, + payload: Any = sentinel, + sslcontext: Optional[SSLContext] = None, + client_max_size: int = 1024 ** 2, + loop: Any = ..., +) -> Request: + """Creates mocked web.Request testing purposes. + + Useful in unit tests, when spinning full web server is overkill or + specific conditions and errors are hard to trigger. + """ + task = mock.Mock() + if loop is ...: + loop = mock.Mock() + loop.create_future.return_value = () + + if version < HttpVersion(1, 1): + closing = True + + if headers: + headers = CIMultiDictProxy(CIMultiDict(headers)) + raw_hdrs = tuple( + (k.encode("utf-8"), v.encode("utf-8")) for k, v in headers.items() + ) + else: + headers = CIMultiDictProxy(CIMultiDict()) + raw_hdrs = () + + chunked = "chunked" in headers.get(hdrs.TRANSFER_ENCODING, "").lower() + + message = RawRequestMessage( + method, + path, + version, + headers, + raw_hdrs, + closing, + None, + False, + chunked, + URL(path), + ) + if app is None: + app = _create_app_mock() + + if transport is sentinel: + transport = _create_transport(sslcontext) + + if protocol is sentinel: + protocol = mock.Mock() + protocol.transport = transport + + if writer is sentinel: + writer = mock.Mock() + writer.write_headers = make_mocked_coro(None) + writer.write = make_mocked_coro(None) + writer.write_eof = make_mocked_coro(None) + writer.drain = make_mocked_coro(None) + writer.transport = transport + + protocol.transport = transport + protocol.writer = writer + + if payload is sentinel: + payload = mock.Mock() + + req = Request( + message, payload, protocol, writer, task, loop, client_max_size=client_max_size + ) + + match_info = UrlMappingMatchInfo( + {} if match_info is sentinel else match_info, mock.Mock() + ) + match_info.add_app(app) + req._match_info = match_info + + return req + + +def make_mocked_coro( + return_value: Any = sentinel, raise_exception: Any = sentinel +) -> Any: + """Creates a coroutine mock.""" + + async def mock_coro(*args: Any, **kwargs: Any) -> Any: + if raise_exception is not sentinel: + raise raise_exception + if not inspect.isawaitable(return_value): + return return_value + await return_value + + return mock.Mock(wraps=mock_coro) diff --git a/sbsheriff/Lib/site-packages/aiohttp/tracing.py b/sbsheriff/Lib/site-packages/aiohttp/tracing.py new file mode 100644 index 0000000..0e118a3 --- /dev/null +++ b/sbsheriff/Lib/site-packages/aiohttp/tracing.py @@ -0,0 +1,472 @@ +from types import SimpleNamespace +from typing import TYPE_CHECKING, Awaitable, Optional, Type, TypeVar + +import attr +from aiosignal import Signal +from multidict import CIMultiDict +from yarl import URL + +from .client_reqrep import ClientResponse + +if TYPE_CHECKING: # pragma: no cover + from .client import ClientSession + from .typedefs import Protocol + + _ParamT_contra = TypeVar("_ParamT_contra", contravariant=True) + + class _SignalCallback(Protocol[_ParamT_contra]): + def __call__( + self, + __client_session: ClientSession, + __trace_config_ctx: SimpleNamespace, + __params: _ParamT_contra, + ) -> Awaitable[None]: + ... + + +__all__ = ( + "TraceConfig", + "TraceRequestStartParams", + "TraceRequestEndParams", + "TraceRequestExceptionParams", + "TraceConnectionQueuedStartParams", + "TraceConnectionQueuedEndParams", + "TraceConnectionCreateStartParams", + "TraceConnectionCreateEndParams", + "TraceConnectionReuseconnParams", + "TraceDnsResolveHostStartParams", + "TraceDnsResolveHostEndParams", + "TraceDnsCacheHitParams", + "TraceDnsCacheMissParams", + "TraceRequestRedirectParams", + "TraceRequestChunkSentParams", + "TraceResponseChunkReceivedParams", + "TraceRequestHeadersSentParams", +) + + +class TraceConfig: + """First-class used to trace requests launched via ClientSession objects.""" + + def __init__( + self, trace_config_ctx_factory: Type[SimpleNamespace] = SimpleNamespace + ) -> None: + self._on_request_start = Signal( + self + ) # type: Signal[_SignalCallback[TraceRequestStartParams]] + self._on_request_chunk_sent = Signal( + self + ) # type: Signal[_SignalCallback[TraceRequestChunkSentParams]] + self._on_response_chunk_received = Signal( + self + ) # type: Signal[_SignalCallback[TraceResponseChunkReceivedParams]] + self._on_request_end = Signal( + self + ) # type: Signal[_SignalCallback[TraceRequestEndParams]] + self._on_request_exception = Signal( + self + ) # type: Signal[_SignalCallback[TraceRequestExceptionParams]] + self._on_request_redirect = Signal( + self + ) # type: Signal[_SignalCallback[TraceRequestRedirectParams]] + self._on_connection_queued_start = Signal( + self + ) # type: Signal[_SignalCallback[TraceConnectionQueuedStartParams]] + self._on_connection_queued_end = Signal( + self + ) # type: Signal[_SignalCallback[TraceConnectionQueuedEndParams]] + self._on_connection_create_start = Signal( + self + ) # type: Signal[_SignalCallback[TraceConnectionCreateStartParams]] + self._on_connection_create_end = Signal( + self + ) # type: Signal[_SignalCallback[TraceConnectionCreateEndParams]] + self._on_connection_reuseconn = Signal( + self + ) # type: Signal[_SignalCallback[TraceConnectionReuseconnParams]] + self._on_dns_resolvehost_start = Signal( + self + ) # type: Signal[_SignalCallback[TraceDnsResolveHostStartParams]] + self._on_dns_resolvehost_end = Signal( + self + ) # type: Signal[_SignalCallback[TraceDnsResolveHostEndParams]] + self._on_dns_cache_hit = Signal( + self + ) # type: Signal[_SignalCallback[TraceDnsCacheHitParams]] + self._on_dns_cache_miss = Signal( + self + ) # type: Signal[_SignalCallback[TraceDnsCacheMissParams]] + self._on_request_headers_sent = Signal( + self + ) # type: Signal[_SignalCallback[TraceRequestHeadersSentParams]] + + self._trace_config_ctx_factory = trace_config_ctx_factory + + def trace_config_ctx( + self, trace_request_ctx: Optional[SimpleNamespace] = None + ) -> SimpleNamespace: + """Return a new trace_config_ctx instance""" + return self._trace_config_ctx_factory(trace_request_ctx=trace_request_ctx) + + def freeze(self) -> None: + self._on_request_start.freeze() + self._on_request_chunk_sent.freeze() + self._on_response_chunk_received.freeze() + self._on_request_end.freeze() + self._on_request_exception.freeze() + self._on_request_redirect.freeze() + self._on_connection_queued_start.freeze() + self._on_connection_queued_end.freeze() + self._on_connection_create_start.freeze() + self._on_connection_create_end.freeze() + self._on_connection_reuseconn.freeze() + self._on_dns_resolvehost_start.freeze() + self._on_dns_resolvehost_end.freeze() + self._on_dns_cache_hit.freeze() + self._on_dns_cache_miss.freeze() + self._on_request_headers_sent.freeze() + + @property + def on_request_start(self) -> "Signal[_SignalCallback[TraceRequestStartParams]]": + return self._on_request_start + + @property + def on_request_chunk_sent( + self, + ) -> "Signal[_SignalCallback[TraceRequestChunkSentParams]]": + return self._on_request_chunk_sent + + @property + def on_response_chunk_received( + self, + ) -> "Signal[_SignalCallback[TraceResponseChunkReceivedParams]]": + return self._on_response_chunk_received + + @property + def on_request_end(self) -> "Signal[_SignalCallback[TraceRequestEndParams]]": + return self._on_request_end + + @property + def on_request_exception( + self, + ) -> "Signal[_SignalCallback[TraceRequestExceptionParams]]": + return self._on_request_exception + + @property + def on_request_redirect( + self, + ) -> "Signal[_SignalCallback[TraceRequestRedirectParams]]": + return self._on_request_redirect + + @property + def on_connection_queued_start( + self, + ) -> "Signal[_SignalCallback[TraceConnectionQueuedStartParams]]": + return self._on_connection_queued_start + + @property + def on_connection_queued_end( + self, + ) -> "Signal[_SignalCallback[TraceConnectionQueuedEndParams]]": + return self._on_connection_queued_end + + @property + def on_connection_create_start( + self, + ) -> "Signal[_SignalCallback[TraceConnectionCreateStartParams]]": + return self._on_connection_create_start + + @property + def on_connection_create_end( + self, + ) -> "Signal[_SignalCallback[TraceConnectionCreateEndParams]]": + return self._on_connection_create_end + + @property + def on_connection_reuseconn( + self, + ) -> "Signal[_SignalCallback[TraceConnectionReuseconnParams]]": + return self._on_connection_reuseconn + + @property + def on_dns_resolvehost_start( + self, + ) -> "Signal[_SignalCallback[TraceDnsResolveHostStartParams]]": + return self._on_dns_resolvehost_start + + @property + def on_dns_resolvehost_end( + self, + ) -> "Signal[_SignalCallback[TraceDnsResolveHostEndParams]]": + return self._on_dns_resolvehost_end + + @property + def on_dns_cache_hit(self) -> "Signal[_SignalCallback[TraceDnsCacheHitParams]]": + return self._on_dns_cache_hit + + @property + def on_dns_cache_miss(self) -> "Signal[_SignalCallback[TraceDnsCacheMissParams]]": + return self._on_dns_cache_miss + + @property + def on_request_headers_sent( + self, + ) -> "Signal[_SignalCallback[TraceRequestHeadersSentParams]]": + return self._on_request_headers_sent + + +@attr.s(auto_attribs=True, frozen=True, slots=True) +class TraceRequestStartParams: + """Parameters sent by the `on_request_start` signal""" + + method: str + url: URL + headers: "CIMultiDict[str]" + + +@attr.s(auto_attribs=True, frozen=True, slots=True) +class TraceRequestChunkSentParams: + """Parameters sent by the `on_request_chunk_sent` signal""" + + method: str + url: URL + chunk: bytes + + +@attr.s(auto_attribs=True, frozen=True, slots=True) +class TraceResponseChunkReceivedParams: + """Parameters sent by the `on_response_chunk_received` signal""" + + method: str + url: URL + chunk: bytes + + +@attr.s(auto_attribs=True, frozen=True, slots=True) +class TraceRequestEndParams: + """Parameters sent by the `on_request_end` signal""" + + method: str + url: URL + headers: "CIMultiDict[str]" + response: ClientResponse + + +@attr.s(auto_attribs=True, frozen=True, slots=True) +class TraceRequestExceptionParams: + """Parameters sent by the `on_request_exception` signal""" + + method: str + url: URL + headers: "CIMultiDict[str]" + exception: BaseException + + +@attr.s(auto_attribs=True, frozen=True, slots=True) +class TraceRequestRedirectParams: + """Parameters sent by the `on_request_redirect` signal""" + + method: str + url: URL + headers: "CIMultiDict[str]" + response: ClientResponse + + +@attr.s(auto_attribs=True, frozen=True, slots=True) +class TraceConnectionQueuedStartParams: + """Parameters sent by the `on_connection_queued_start` signal""" + + +@attr.s(auto_attribs=True, frozen=True, slots=True) +class TraceConnectionQueuedEndParams: + """Parameters sent by the `on_connection_queued_end` signal""" + + +@attr.s(auto_attribs=True, frozen=True, slots=True) +class TraceConnectionCreateStartParams: + """Parameters sent by the `on_connection_create_start` signal""" + + +@attr.s(auto_attribs=True, frozen=True, slots=True) +class TraceConnectionCreateEndParams: + """Parameters sent by the `on_connection_create_end` signal""" + + +@attr.s(auto_attribs=True, frozen=True, slots=True) +class TraceConnectionReuseconnParams: + """Parameters sent by the `on_connection_reuseconn` signal""" + + +@attr.s(auto_attribs=True, frozen=True, slots=True) +class TraceDnsResolveHostStartParams: + """Parameters sent by the `on_dns_resolvehost_start` signal""" + + host: str + + +@attr.s(auto_attribs=True, frozen=True, slots=True) +class TraceDnsResolveHostEndParams: + """Parameters sent by the `on_dns_resolvehost_end` signal""" + + host: str + + +@attr.s(auto_attribs=True, frozen=True, slots=True) +class TraceDnsCacheHitParams: + """Parameters sent by the `on_dns_cache_hit` signal""" + + host: str + + +@attr.s(auto_attribs=True, frozen=True, slots=True) +class TraceDnsCacheMissParams: + """Parameters sent by the `on_dns_cache_miss` signal""" + + host: str + + +@attr.s(auto_attribs=True, frozen=True, slots=True) +class TraceRequestHeadersSentParams: + """Parameters sent by the `on_request_headers_sent` signal""" + + method: str + url: URL + headers: "CIMultiDict[str]" + + +class Trace: + """Internal dependency holder class. + + Used to keep together the main dependencies used + at the moment of send a signal. + """ + + def __init__( + self, + session: "ClientSession", + trace_config: TraceConfig, + trace_config_ctx: SimpleNamespace, + ) -> None: + self._trace_config = trace_config + self._trace_config_ctx = trace_config_ctx + self._session = session + + async def send_request_start( + self, method: str, url: URL, headers: "CIMultiDict[str]" + ) -> None: + return await self._trace_config.on_request_start.send( + self._session, + self._trace_config_ctx, + TraceRequestStartParams(method, url, headers), + ) + + async def send_request_chunk_sent( + self, method: str, url: URL, chunk: bytes + ) -> None: + return await self._trace_config.on_request_chunk_sent.send( + self._session, + self._trace_config_ctx, + TraceRequestChunkSentParams(method, url, chunk), + ) + + async def send_response_chunk_received( + self, method: str, url: URL, chunk: bytes + ) -> None: + return await self._trace_config.on_response_chunk_received.send( + self._session, + self._trace_config_ctx, + TraceResponseChunkReceivedParams(method, url, chunk), + ) + + async def send_request_end( + self, + method: str, + url: URL, + headers: "CIMultiDict[str]", + response: ClientResponse, + ) -> None: + return await self._trace_config.on_request_end.send( + self._session, + self._trace_config_ctx, + TraceRequestEndParams(method, url, headers, response), + ) + + async def send_request_exception( + self, + method: str, + url: URL, + headers: "CIMultiDict[str]", + exception: BaseException, + ) -> None: + return await self._trace_config.on_request_exception.send( + self._session, + self._trace_config_ctx, + TraceRequestExceptionParams(method, url, headers, exception), + ) + + async def send_request_redirect( + self, + method: str, + url: URL, + headers: "CIMultiDict[str]", + response: ClientResponse, + ) -> None: + return await self._trace_config._on_request_redirect.send( + self._session, + self._trace_config_ctx, + TraceRequestRedirectParams(method, url, headers, response), + ) + + async def send_connection_queued_start(self) -> None: + return await self._trace_config.on_connection_queued_start.send( + self._session, self._trace_config_ctx, TraceConnectionQueuedStartParams() + ) + + async def send_connection_queued_end(self) -> None: + return await self._trace_config.on_connection_queued_end.send( + self._session, self._trace_config_ctx, TraceConnectionQueuedEndParams() + ) + + async def send_connection_create_start(self) -> None: + return await self._trace_config.on_connection_create_start.send( + self._session, self._trace_config_ctx, TraceConnectionCreateStartParams() + ) + + async def send_connection_create_end(self) -> None: + return await self._trace_config.on_connection_create_end.send( + self._session, self._trace_config_ctx, TraceConnectionCreateEndParams() + ) + + async def send_connection_reuseconn(self) -> None: + return await self._trace_config.on_connection_reuseconn.send( + self._session, self._trace_config_ctx, TraceConnectionReuseconnParams() + ) + + async def send_dns_resolvehost_start(self, host: str) -> None: + return await self._trace_config.on_dns_resolvehost_start.send( + self._session, self._trace_config_ctx, TraceDnsResolveHostStartParams(host) + ) + + async def send_dns_resolvehost_end(self, host: str) -> None: + return await self._trace_config.on_dns_resolvehost_end.send( + self._session, self._trace_config_ctx, TraceDnsResolveHostEndParams(host) + ) + + async def send_dns_cache_hit(self, host: str) -> None: + return await self._trace_config.on_dns_cache_hit.send( + self._session, self._trace_config_ctx, TraceDnsCacheHitParams(host) + ) + + async def send_dns_cache_miss(self, host: str) -> None: + return await self._trace_config.on_dns_cache_miss.send( + self._session, self._trace_config_ctx, TraceDnsCacheMissParams(host) + ) + + async def send_request_headers( + self, method: str, url: URL, headers: "CIMultiDict[str]" + ) -> None: + return await self._trace_config._on_request_headers_sent.send( + self._session, + self._trace_config_ctx, + TraceRequestHeadersSentParams(method, url, headers), + ) diff --git a/sbsheriff/Lib/site-packages/aiohttp/typedefs.py b/sbsheriff/Lib/site-packages/aiohttp/typedefs.py new file mode 100644 index 0000000..84283d9 --- /dev/null +++ b/sbsheriff/Lib/site-packages/aiohttp/typedefs.py @@ -0,0 +1,64 @@ +import json +import os +import sys +from typing import ( + TYPE_CHECKING, + Any, + Awaitable, + Callable, + Iterable, + Mapping, + Tuple, + Union, +) + +from multidict import CIMultiDict, CIMultiDictProxy, MultiDict, MultiDictProxy, istr +from yarl import URL + +# These are for other modules to use (to avoid repeating the conditional import). +if sys.version_info >= (3, 8): + from typing import Final as Final, Protocol as Protocol, TypedDict as TypedDict +else: + from typing_extensions import ( # noqa: F401 + Final, + Protocol as Protocol, + TypedDict as TypedDict, + ) + +DEFAULT_JSON_ENCODER = json.dumps +DEFAULT_JSON_DECODER = json.loads + +if TYPE_CHECKING: # pragma: no cover + _CIMultiDict = CIMultiDict[str] + _CIMultiDictProxy = CIMultiDictProxy[str] + _MultiDict = MultiDict[str] + _MultiDictProxy = MultiDictProxy[str] + from http.cookies import BaseCookie, Morsel + + from .web import Request, StreamResponse +else: + _CIMultiDict = CIMultiDict + _CIMultiDictProxy = CIMultiDictProxy + _MultiDict = MultiDict + _MultiDictProxy = MultiDictProxy + +Byteish = Union[bytes, bytearray, memoryview] +JSONEncoder = Callable[[Any], str] +JSONDecoder = Callable[[str], Any] +LooseHeaders = Union[Mapping[Union[str, istr], str], _CIMultiDict, _CIMultiDictProxy] +RawHeaders = Tuple[Tuple[bytes, bytes], ...] +StrOrURL = Union[str, URL] + +LooseCookiesMappings = Mapping[str, Union[str, "BaseCookie[str]", "Morsel[Any]"]] +LooseCookiesIterables = Iterable[ + Tuple[str, Union[str, "BaseCookie[str]", "Morsel[Any]"]] +] +LooseCookies = Union[ + LooseCookiesMappings, + LooseCookiesIterables, + "BaseCookie[str]", +] + +Handler = Callable[["Request"], Awaitable["StreamResponse"]] + +PathLike = Union[str, "os.PathLike[str]"] diff --git a/sbsheriff/Lib/site-packages/aiohttp/web.py b/sbsheriff/Lib/site-packages/aiohttp/web.py new file mode 100644 index 0000000..864428b --- /dev/null +++ b/sbsheriff/Lib/site-packages/aiohttp/web.py @@ -0,0 +1,586 @@ +import asyncio +import logging +import socket +import sys +from argparse import ArgumentParser +from collections.abc import Iterable +from importlib import import_module +from typing import ( + Any, + Awaitable, + Callable, + Iterable as TypingIterable, + List, + Optional, + Set, + Type, + Union, + cast, +) + +from .abc import AbstractAccessLogger +from .helpers import all_tasks +from .log import access_logger +from .web_app import Application as Application, CleanupError as CleanupError +from .web_exceptions import ( + HTTPAccepted as HTTPAccepted, + HTTPBadGateway as HTTPBadGateway, + HTTPBadRequest as HTTPBadRequest, + HTTPClientError as HTTPClientError, + HTTPConflict as HTTPConflict, + HTTPCreated as HTTPCreated, + HTTPError as HTTPError, + HTTPException as HTTPException, + HTTPExpectationFailed as HTTPExpectationFailed, + HTTPFailedDependency as HTTPFailedDependency, + HTTPForbidden as HTTPForbidden, + HTTPFound as HTTPFound, + HTTPGatewayTimeout as HTTPGatewayTimeout, + HTTPGone as HTTPGone, + HTTPInsufficientStorage as HTTPInsufficientStorage, + HTTPInternalServerError as HTTPInternalServerError, + HTTPLengthRequired as HTTPLengthRequired, + HTTPMethodNotAllowed as HTTPMethodNotAllowed, + HTTPMisdirectedRequest as HTTPMisdirectedRequest, + HTTPMovedPermanently as HTTPMovedPermanently, + HTTPMultipleChoices as HTTPMultipleChoices, + HTTPNetworkAuthenticationRequired as HTTPNetworkAuthenticationRequired, + HTTPNoContent as HTTPNoContent, + HTTPNonAuthoritativeInformation as HTTPNonAuthoritativeInformation, + HTTPNotAcceptable as HTTPNotAcceptable, + HTTPNotExtended as HTTPNotExtended, + HTTPNotFound as HTTPNotFound, + HTTPNotImplemented as HTTPNotImplemented, + HTTPNotModified as HTTPNotModified, + HTTPOk as HTTPOk, + HTTPPartialContent as HTTPPartialContent, + HTTPPaymentRequired as HTTPPaymentRequired, + HTTPPermanentRedirect as HTTPPermanentRedirect, + HTTPPreconditionFailed as HTTPPreconditionFailed, + HTTPPreconditionRequired as HTTPPreconditionRequired, + HTTPProxyAuthenticationRequired as HTTPProxyAuthenticationRequired, + HTTPRedirection as HTTPRedirection, + HTTPRequestEntityTooLarge as HTTPRequestEntityTooLarge, + HTTPRequestHeaderFieldsTooLarge as HTTPRequestHeaderFieldsTooLarge, + HTTPRequestRangeNotSatisfiable as HTTPRequestRangeNotSatisfiable, + HTTPRequestTimeout as HTTPRequestTimeout, + HTTPRequestURITooLong as HTTPRequestURITooLong, + HTTPResetContent as HTTPResetContent, + HTTPSeeOther as HTTPSeeOther, + HTTPServerError as HTTPServerError, + HTTPServiceUnavailable as HTTPServiceUnavailable, + HTTPSuccessful as HTTPSuccessful, + HTTPTemporaryRedirect as HTTPTemporaryRedirect, + HTTPTooManyRequests as HTTPTooManyRequests, + HTTPUnauthorized as HTTPUnauthorized, + HTTPUnavailableForLegalReasons as HTTPUnavailableForLegalReasons, + HTTPUnprocessableEntity as HTTPUnprocessableEntity, + HTTPUnsupportedMediaType as HTTPUnsupportedMediaType, + HTTPUpgradeRequired as HTTPUpgradeRequired, + HTTPUseProxy as HTTPUseProxy, + HTTPVariantAlsoNegotiates as HTTPVariantAlsoNegotiates, + HTTPVersionNotSupported as HTTPVersionNotSupported, +) +from .web_fileresponse import FileResponse as FileResponse +from .web_log import AccessLogger +from .web_middlewares import ( + middleware as middleware, + normalize_path_middleware as normalize_path_middleware, +) +from .web_protocol import ( + PayloadAccessError as PayloadAccessError, + RequestHandler as RequestHandler, + RequestPayloadError as RequestPayloadError, +) +from .web_request import ( + BaseRequest as BaseRequest, + FileField as FileField, + Request as Request, +) +from .web_response import ( + ContentCoding as ContentCoding, + Response as Response, + StreamResponse as StreamResponse, + json_response as json_response, +) +from .web_routedef import ( + AbstractRouteDef as AbstractRouteDef, + RouteDef as RouteDef, + RouteTableDef as RouteTableDef, + StaticDef as StaticDef, + delete as delete, + get as get, + head as head, + options as options, + patch as patch, + post as post, + put as put, + route as route, + static as static, + view as view, +) +from .web_runner import ( + AppRunner as AppRunner, + BaseRunner as BaseRunner, + BaseSite as BaseSite, + GracefulExit as GracefulExit, + NamedPipeSite as NamedPipeSite, + ServerRunner as ServerRunner, + SockSite as SockSite, + TCPSite as TCPSite, + UnixSite as UnixSite, +) +from .web_server import Server as Server +from .web_urldispatcher import ( + AbstractResource as AbstractResource, + AbstractRoute as AbstractRoute, + DynamicResource as DynamicResource, + PlainResource as PlainResource, + Resource as Resource, + ResourceRoute as ResourceRoute, + StaticResource as StaticResource, + UrlDispatcher as UrlDispatcher, + UrlMappingMatchInfo as UrlMappingMatchInfo, + View as View, +) +from .web_ws import ( + WebSocketReady as WebSocketReady, + WebSocketResponse as WebSocketResponse, + WSMsgType as WSMsgType, +) + +__all__ = ( + # web_app + "Application", + "CleanupError", + # web_exceptions + "HTTPAccepted", + "HTTPBadGateway", + "HTTPBadRequest", + "HTTPClientError", + "HTTPConflict", + "HTTPCreated", + "HTTPError", + "HTTPException", + "HTTPExpectationFailed", + "HTTPFailedDependency", + "HTTPForbidden", + "HTTPFound", + "HTTPGatewayTimeout", + "HTTPGone", + "HTTPInsufficientStorage", + "HTTPInternalServerError", + "HTTPLengthRequired", + "HTTPMethodNotAllowed", + "HTTPMisdirectedRequest", + "HTTPMovedPermanently", + "HTTPMultipleChoices", + "HTTPNetworkAuthenticationRequired", + "HTTPNoContent", + "HTTPNonAuthoritativeInformation", + "HTTPNotAcceptable", + "HTTPNotExtended", + "HTTPNotFound", + "HTTPNotImplemented", + "HTTPNotModified", + "HTTPOk", + "HTTPPartialContent", + "HTTPPaymentRequired", + "HTTPPermanentRedirect", + "HTTPPreconditionFailed", + "HTTPPreconditionRequired", + "HTTPProxyAuthenticationRequired", + "HTTPRedirection", + "HTTPRequestEntityTooLarge", + "HTTPRequestHeaderFieldsTooLarge", + "HTTPRequestRangeNotSatisfiable", + "HTTPRequestTimeout", + "HTTPRequestURITooLong", + "HTTPResetContent", + "HTTPSeeOther", + "HTTPServerError", + "HTTPServiceUnavailable", + "HTTPSuccessful", + "HTTPTemporaryRedirect", + "HTTPTooManyRequests", + "HTTPUnauthorized", + "HTTPUnavailableForLegalReasons", + "HTTPUnprocessableEntity", + "HTTPUnsupportedMediaType", + "HTTPUpgradeRequired", + "HTTPUseProxy", + "HTTPVariantAlsoNegotiates", + "HTTPVersionNotSupported", + # web_fileresponse + "FileResponse", + # web_middlewares + "middleware", + "normalize_path_middleware", + # web_protocol + "PayloadAccessError", + "RequestHandler", + "RequestPayloadError", + # web_request + "BaseRequest", + "FileField", + "Request", + # web_response + "ContentCoding", + "Response", + "StreamResponse", + "json_response", + # web_routedef + "AbstractRouteDef", + "RouteDef", + "RouteTableDef", + "StaticDef", + "delete", + "get", + "head", + "options", + "patch", + "post", + "put", + "route", + "static", + "view", + # web_runner + "AppRunner", + "BaseRunner", + "BaseSite", + "GracefulExit", + "ServerRunner", + "SockSite", + "TCPSite", + "UnixSite", + "NamedPipeSite", + # web_server + "Server", + # web_urldispatcher + "AbstractResource", + "AbstractRoute", + "DynamicResource", + "PlainResource", + "Resource", + "ResourceRoute", + "StaticResource", + "UrlDispatcher", + "UrlMappingMatchInfo", + "View", + # web_ws + "WebSocketReady", + "WebSocketResponse", + "WSMsgType", + # web + "run_app", +) + + +try: + from ssl import SSLContext +except ImportError: # pragma: no cover + SSLContext = Any # type: ignore[misc,assignment] + +HostSequence = TypingIterable[str] + + +async def _run_app( + app: Union[Application, Awaitable[Application]], + *, + host: Optional[Union[str, HostSequence]] = None, + port: Optional[int] = None, + path: Optional[str] = None, + sock: Optional[socket.socket] = None, + shutdown_timeout: float = 60.0, + keepalive_timeout: float = 75.0, + ssl_context: Optional[SSLContext] = None, + print: Callable[..., None] = print, + backlog: int = 128, + access_log_class: Type[AbstractAccessLogger] = AccessLogger, + access_log_format: str = AccessLogger.LOG_FORMAT, + access_log: Optional[logging.Logger] = access_logger, + handle_signals: bool = True, + reuse_address: Optional[bool] = None, + reuse_port: Optional[bool] = None, +) -> None: + # A internal functio to actually do all dirty job for application running + if asyncio.iscoroutine(app): + app = await app # type: ignore[misc] + + app = cast(Application, app) + + runner = AppRunner( + app, + handle_signals=handle_signals, + access_log_class=access_log_class, + access_log_format=access_log_format, + access_log=access_log, + keepalive_timeout=keepalive_timeout, + ) + + await runner.setup() + + sites = [] # type: List[BaseSite] + + try: + if host is not None: + if isinstance(host, (str, bytes, bytearray, memoryview)): + sites.append( + TCPSite( + runner, + host, + port, + shutdown_timeout=shutdown_timeout, + ssl_context=ssl_context, + backlog=backlog, + reuse_address=reuse_address, + reuse_port=reuse_port, + ) + ) + else: + for h in host: + sites.append( + TCPSite( + runner, + h, + port, + shutdown_timeout=shutdown_timeout, + ssl_context=ssl_context, + backlog=backlog, + reuse_address=reuse_address, + reuse_port=reuse_port, + ) + ) + elif path is None and sock is None or port is not None: + sites.append( + TCPSite( + runner, + port=port, + shutdown_timeout=shutdown_timeout, + ssl_context=ssl_context, + backlog=backlog, + reuse_address=reuse_address, + reuse_port=reuse_port, + ) + ) + + if path is not None: + if isinstance(path, (str, bytes, bytearray, memoryview)): + sites.append( + UnixSite( + runner, + path, + shutdown_timeout=shutdown_timeout, + ssl_context=ssl_context, + backlog=backlog, + ) + ) + else: + for p in path: + sites.append( + UnixSite( + runner, + p, + shutdown_timeout=shutdown_timeout, + ssl_context=ssl_context, + backlog=backlog, + ) + ) + + if sock is not None: + if not isinstance(sock, Iterable): + sites.append( + SockSite( + runner, + sock, + shutdown_timeout=shutdown_timeout, + ssl_context=ssl_context, + backlog=backlog, + ) + ) + else: + for s in sock: + sites.append( + SockSite( + runner, + s, + shutdown_timeout=shutdown_timeout, + ssl_context=ssl_context, + backlog=backlog, + ) + ) + for site in sites: + await site.start() + + if print: # pragma: no branch + names = sorted(str(s.name) for s in runner.sites) + print( + "======== Running on {} ========\n" + "(Press CTRL+C to quit)".format(", ".join(names)) + ) + + # sleep forever by 1 hour intervals, + # on Windows before Python 3.8 wake up every 1 second to handle + # Ctrl+C smoothly + if sys.platform == "win32" and sys.version_info < (3, 8): + delay = 1 + else: + delay = 3600 + + while True: + await asyncio.sleep(delay) + finally: + await runner.cleanup() + + +def _cancel_tasks( + to_cancel: Set["asyncio.Task[Any]"], loop: asyncio.AbstractEventLoop +) -> None: + if not to_cancel: + return + + for task in to_cancel: + task.cancel() + + loop.run_until_complete(asyncio.gather(*to_cancel, return_exceptions=True)) + + for task in to_cancel: + if task.cancelled(): + continue + if task.exception() is not None: + loop.call_exception_handler( + { + "message": "unhandled exception during asyncio.run() shutdown", + "exception": task.exception(), + "task": task, + } + ) + + +def run_app( + app: Union[Application, Awaitable[Application]], + *, + host: Optional[Union[str, HostSequence]] = None, + port: Optional[int] = None, + path: Optional[str] = None, + sock: Optional[socket.socket] = None, + shutdown_timeout: float = 60.0, + keepalive_timeout: float = 75.0, + ssl_context: Optional[SSLContext] = None, + print: Callable[..., None] = print, + backlog: int = 128, + access_log_class: Type[AbstractAccessLogger] = AccessLogger, + access_log_format: str = AccessLogger.LOG_FORMAT, + access_log: Optional[logging.Logger] = access_logger, + handle_signals: bool = True, + reuse_address: Optional[bool] = None, + reuse_port: Optional[bool] = None, + loop: Optional[asyncio.AbstractEventLoop] = None, +) -> None: + """Run an app locally""" + if loop is None: + loop = asyncio.new_event_loop() + + # Configure if and only if in debugging mode and using the default logger + if loop.get_debug() and access_log and access_log.name == "aiohttp.access": + if access_log.level == logging.NOTSET: + access_log.setLevel(logging.DEBUG) + if not access_log.hasHandlers(): + access_log.addHandler(logging.StreamHandler()) + + main_task = loop.create_task( + _run_app( + app, + host=host, + port=port, + path=path, + sock=sock, + shutdown_timeout=shutdown_timeout, + keepalive_timeout=keepalive_timeout, + ssl_context=ssl_context, + print=print, + backlog=backlog, + access_log_class=access_log_class, + access_log_format=access_log_format, + access_log=access_log, + handle_signals=handle_signals, + reuse_address=reuse_address, + reuse_port=reuse_port, + ) + ) + + try: + asyncio.set_event_loop(loop) + loop.run_until_complete(main_task) + except (GracefulExit, KeyboardInterrupt): # pragma: no cover + pass + finally: + _cancel_tasks({main_task}, loop) + _cancel_tasks(all_tasks(loop), loop) + loop.run_until_complete(loop.shutdown_asyncgens()) + loop.close() + + +def main(argv: List[str]) -> None: + arg_parser = ArgumentParser( + description="aiohttp.web Application server", prog="aiohttp.web" + ) + arg_parser.add_argument( + "entry_func", + help=( + "Callable returning the `aiohttp.web.Application` instance to " + "run. Should be specified in the 'module:function' syntax." + ), + metavar="entry-func", + ) + arg_parser.add_argument( + "-H", + "--hostname", + help="TCP/IP hostname to serve on (default: %(default)r)", + default="localhost", + ) + arg_parser.add_argument( + "-P", + "--port", + help="TCP/IP port to serve on (default: %(default)r)", + type=int, + default="8080", + ) + arg_parser.add_argument( + "-U", + "--path", + help="Unix file system path to serve on. Specifying a path will cause " + "hostname and port arguments to be ignored.", + ) + args, extra_argv = arg_parser.parse_known_args(argv) + + # Import logic + mod_str, _, func_str = args.entry_func.partition(":") + if not func_str or not mod_str: + arg_parser.error("'entry-func' not in 'module:function' syntax") + if mod_str.startswith("."): + arg_parser.error("relative module names not supported") + try: + module = import_module(mod_str) + except ImportError as ex: + arg_parser.error(f"unable to import {mod_str}: {ex}") + try: + func = getattr(module, func_str) + except AttributeError: + arg_parser.error(f"module {mod_str!r} has no attribute {func_str!r}") + + # Compatibility logic + if args.path is not None and not hasattr(socket, "AF_UNIX"): + arg_parser.error( + "file system paths not supported by your operating" " environment" + ) + + logging.basicConfig(level=logging.DEBUG) + + app = func(extra_argv) + run_app(app, host=args.hostname, port=args.port, path=args.path) + arg_parser.exit(message="Stopped\n") + + +if __name__ == "__main__": # pragma: no branch + main(sys.argv[1:]) # pragma: no cover diff --git a/sbsheriff/Lib/site-packages/aiohttp/web_app.py b/sbsheriff/Lib/site-packages/aiohttp/web_app.py new file mode 100644 index 0000000..d5dc90e --- /dev/null +++ b/sbsheriff/Lib/site-packages/aiohttp/web_app.py @@ -0,0 +1,557 @@ +import asyncio +import logging +import warnings +from functools import partial, update_wrapper +from typing import ( + TYPE_CHECKING, + Any, + AsyncIterator, + Awaitable, + Callable, + Dict, + Iterable, + Iterator, + List, + Mapping, + MutableMapping, + Optional, + Sequence, + Tuple, + Type, + Union, + cast, +) + +from aiosignal import Signal +from frozenlist import FrozenList + +from . import hdrs +from .abc import ( + AbstractAccessLogger, + AbstractMatchInfo, + AbstractRouter, + AbstractStreamWriter, +) +from .helpers import DEBUG +from .http_parser import RawRequestMessage +from .log import web_logger +from .streams import StreamReader +from .web_log import AccessLogger +from .web_middlewares import _fix_request_current_app +from .web_protocol import RequestHandler +from .web_request import Request +from .web_response import StreamResponse +from .web_routedef import AbstractRouteDef +from .web_server import Server +from .web_urldispatcher import ( + AbstractResource, + AbstractRoute, + Domain, + MaskDomain, + MatchedSubAppResource, + PrefixedSubAppResource, + UrlDispatcher, +) + +__all__ = ("Application", "CleanupError") + + +if TYPE_CHECKING: # pragma: no cover + from .typedefs import Handler + + _AppSignal = Signal[Callable[["Application"], Awaitable[None]]] + _RespPrepareSignal = Signal[Callable[[Request, StreamResponse], Awaitable[None]]] + _Middleware = Union[ + Callable[[Request, Handler], Awaitable[StreamResponse]], + Callable[["Application", Handler], Awaitable[Handler]], # old-style + ] + _Middlewares = FrozenList[_Middleware] + _MiddlewaresHandlers = Optional[Sequence[Tuple[_Middleware, bool]]] + _Subapps = List["Application"] +else: + # No type checker mode, skip types + _AppSignal = Signal + _RespPrepareSignal = Signal + _Middleware = Callable + _Middlewares = FrozenList + _MiddlewaresHandlers = Optional[Sequence] + _Subapps = List + + +class Application(MutableMapping[str, Any]): + ATTRS = frozenset( + [ + "logger", + "_debug", + "_router", + "_loop", + "_handler_args", + "_middlewares", + "_middlewares_handlers", + "_run_middlewares", + "_state", + "_frozen", + "_pre_frozen", + "_subapps", + "_on_response_prepare", + "_on_startup", + "_on_shutdown", + "_on_cleanup", + "_client_max_size", + "_cleanup_ctx", + ] + ) + + def __init__( + self, + *, + logger: logging.Logger = web_logger, + router: Optional[UrlDispatcher] = None, + middlewares: Iterable[_Middleware] = (), + handler_args: Optional[Mapping[str, Any]] = None, + client_max_size: int = 1024 ** 2, + loop: Optional[asyncio.AbstractEventLoop] = None, + debug: Any = ..., # mypy doesn't support ellipsis + ) -> None: + if router is None: + router = UrlDispatcher() + else: + warnings.warn( + "router argument is deprecated", DeprecationWarning, stacklevel=2 + ) + assert isinstance(router, AbstractRouter), router + + if loop is not None: + warnings.warn( + "loop argument is deprecated", DeprecationWarning, stacklevel=2 + ) + + if debug is not ...: + warnings.warn( + "debug argument is deprecated", DeprecationWarning, stacklevel=2 + ) + self._debug = debug + self._router = router # type: UrlDispatcher + self._loop = loop + self._handler_args = handler_args + self.logger = logger + + self._middlewares = FrozenList(middlewares) # type: _Middlewares + + # initialized on freezing + self._middlewares_handlers = None # type: _MiddlewaresHandlers + # initialized on freezing + self._run_middlewares = None # type: Optional[bool] + + self._state = {} # type: Dict[str, Any] + self._frozen = False + self._pre_frozen = False + self._subapps = [] # type: _Subapps + + self._on_response_prepare = Signal(self) # type: _RespPrepareSignal + self._on_startup = Signal(self) # type: _AppSignal + self._on_shutdown = Signal(self) # type: _AppSignal + self._on_cleanup = Signal(self) # type: _AppSignal + self._cleanup_ctx = CleanupContext() + self._on_startup.append(self._cleanup_ctx._on_startup) + self._on_cleanup.append(self._cleanup_ctx._on_cleanup) + self._client_max_size = client_max_size + + def __init_subclass__(cls: Type["Application"]) -> None: + warnings.warn( + "Inheritance class {} from web.Application " + "is discouraged".format(cls.__name__), + DeprecationWarning, + stacklevel=2, + ) + + if DEBUG: # pragma: no cover + + def __setattr__(self, name: str, val: Any) -> None: + if name not in self.ATTRS: + warnings.warn( + "Setting custom web.Application.{} attribute " + "is discouraged".format(name), + DeprecationWarning, + stacklevel=2, + ) + super().__setattr__(name, val) + + # MutableMapping API + + def __eq__(self, other: object) -> bool: + return self is other + + def __getitem__(self, key: str) -> Any: + return self._state[key] + + def _check_frozen(self) -> None: + if self._frozen: + warnings.warn( + "Changing state of started or joined " "application is deprecated", + DeprecationWarning, + stacklevel=3, + ) + + def __setitem__(self, key: str, value: Any) -> None: + self._check_frozen() + self._state[key] = value + + def __delitem__(self, key: str) -> None: + self._check_frozen() + del self._state[key] + + def __len__(self) -> int: + return len(self._state) + + def __iter__(self) -> Iterator[str]: + return iter(self._state) + + ######## + @property + def loop(self) -> asyncio.AbstractEventLoop: + # Technically the loop can be None + # but we mask it by explicit type cast + # to provide more convinient type annotation + warnings.warn("loop property is deprecated", DeprecationWarning, stacklevel=2) + return cast(asyncio.AbstractEventLoop, self._loop) + + def _set_loop(self, loop: Optional[asyncio.AbstractEventLoop]) -> None: + if loop is None: + loop = asyncio.get_event_loop() + if self._loop is not None and self._loop is not loop: + raise RuntimeError( + "web.Application instance initialized with different loop" + ) + + self._loop = loop + + # set loop debug + if self._debug is ...: + self._debug = loop.get_debug() + + # set loop to sub applications + for subapp in self._subapps: + subapp._set_loop(loop) + + @property + def pre_frozen(self) -> bool: + return self._pre_frozen + + def pre_freeze(self) -> None: + if self._pre_frozen: + return + + self._pre_frozen = True + self._middlewares.freeze() + self._router.freeze() + self._on_response_prepare.freeze() + self._cleanup_ctx.freeze() + self._on_startup.freeze() + self._on_shutdown.freeze() + self._on_cleanup.freeze() + self._middlewares_handlers = tuple(self._prepare_middleware()) + + # If current app and any subapp do not have middlewares avoid run all + # of the code footprint that it implies, which have a middleware + # hardcoded per app that sets up the current_app attribute. If no + # middlewares are configured the handler will receive the proper + # current_app without needing all of this code. + self._run_middlewares = True if self.middlewares else False + + for subapp in self._subapps: + subapp.pre_freeze() + self._run_middlewares = self._run_middlewares or subapp._run_middlewares + + @property + def frozen(self) -> bool: + return self._frozen + + def freeze(self) -> None: + if self._frozen: + return + + self.pre_freeze() + self._frozen = True + for subapp in self._subapps: + subapp.freeze() + + @property + def debug(self) -> bool: + warnings.warn("debug property is deprecated", DeprecationWarning, stacklevel=2) + return self._debug # type: ignore[no-any-return] + + def _reg_subapp_signals(self, subapp: "Application") -> None: + def reg_handler(signame: str) -> None: + subsig = getattr(subapp, signame) + + async def handler(app: "Application") -> None: + await subsig.send(subapp) + + appsig = getattr(self, signame) + appsig.append(handler) + + reg_handler("on_startup") + reg_handler("on_shutdown") + reg_handler("on_cleanup") + + def add_subapp(self, prefix: str, subapp: "Application") -> AbstractResource: + if not isinstance(prefix, str): + raise TypeError("Prefix must be str") + prefix = prefix.rstrip("/") + if not prefix: + raise ValueError("Prefix cannot be empty") + factory = partial(PrefixedSubAppResource, prefix, subapp) + return self._add_subapp(factory, subapp) + + def _add_subapp( + self, resource_factory: Callable[[], AbstractResource], subapp: "Application" + ) -> AbstractResource: + if self.frozen: + raise RuntimeError("Cannot add sub application to frozen application") + if subapp.frozen: + raise RuntimeError("Cannot add frozen application") + resource = resource_factory() + self.router.register_resource(resource) + self._reg_subapp_signals(subapp) + self._subapps.append(subapp) + subapp.pre_freeze() + if self._loop is not None: + subapp._set_loop(self._loop) + return resource + + def add_domain(self, domain: str, subapp: "Application") -> AbstractResource: + if not isinstance(domain, str): + raise TypeError("Domain must be str") + elif "*" in domain: + rule = MaskDomain(domain) # type: Domain + else: + rule = Domain(domain) + factory = partial(MatchedSubAppResource, rule, subapp) + return self._add_subapp(factory, subapp) + + def add_routes(self, routes: Iterable[AbstractRouteDef]) -> List[AbstractRoute]: + return self.router.add_routes(routes) + + @property + def on_response_prepare(self) -> _RespPrepareSignal: + return self._on_response_prepare + + @property + def on_startup(self) -> _AppSignal: + return self._on_startup + + @property + def on_shutdown(self) -> _AppSignal: + return self._on_shutdown + + @property + def on_cleanup(self) -> _AppSignal: + return self._on_cleanup + + @property + def cleanup_ctx(self) -> "CleanupContext": + return self._cleanup_ctx + + @property + def router(self) -> UrlDispatcher: + return self._router + + @property + def middlewares(self) -> _Middlewares: + return self._middlewares + + def _make_handler( + self, + *, + loop: Optional[asyncio.AbstractEventLoop] = None, + access_log_class: Type[AbstractAccessLogger] = AccessLogger, + **kwargs: Any, + ) -> Server: + + if not issubclass(access_log_class, AbstractAccessLogger): + raise TypeError( + "access_log_class must be subclass of " + "aiohttp.abc.AbstractAccessLogger, got {}".format(access_log_class) + ) + + self._set_loop(loop) + self.freeze() + + kwargs["debug"] = self._debug + kwargs["access_log_class"] = access_log_class + if self._handler_args: + for k, v in self._handler_args.items(): + kwargs[k] = v + + return Server( + self._handle, # type: ignore[arg-type] + request_factory=self._make_request, + loop=self._loop, + **kwargs, + ) + + def make_handler( + self, + *, + loop: Optional[asyncio.AbstractEventLoop] = None, + access_log_class: Type[AbstractAccessLogger] = AccessLogger, + **kwargs: Any, + ) -> Server: + + warnings.warn( + "Application.make_handler(...) is deprecated, " "use AppRunner API instead", + DeprecationWarning, + stacklevel=2, + ) + + return self._make_handler( + loop=loop, access_log_class=access_log_class, **kwargs + ) + + async def startup(self) -> None: + """Causes on_startup signal + + Should be called in the event loop along with the request handler. + """ + await self.on_startup.send(self) + + async def shutdown(self) -> None: + """Causes on_shutdown signal + + Should be called before cleanup() + """ + await self.on_shutdown.send(self) + + async def cleanup(self) -> None: + """Causes on_cleanup signal + + Should be called after shutdown() + """ + if self.on_cleanup.frozen: + await self.on_cleanup.send(self) + else: + # If an exception occurs in startup, ensure cleanup contexts are completed. + await self._cleanup_ctx._on_cleanup(self) + + def _make_request( + self, + message: RawRequestMessage, + payload: StreamReader, + protocol: RequestHandler, + writer: AbstractStreamWriter, + task: "asyncio.Task[None]", + _cls: Type[Request] = Request, + ) -> Request: + return _cls( + message, + payload, + protocol, + writer, + task, + self._loop, + client_max_size=self._client_max_size, + ) + + def _prepare_middleware(self) -> Iterator[Tuple[_Middleware, bool]]: + for m in reversed(self._middlewares): + if getattr(m, "__middleware_version__", None) == 1: + yield m, True + else: + warnings.warn( + 'old-style middleware "{!r}" deprecated, ' "see #2252".format(m), + DeprecationWarning, + stacklevel=2, + ) + yield m, False + + yield _fix_request_current_app(self), True + + async def _handle(self, request: Request) -> StreamResponse: + loop = asyncio.get_event_loop() + debug = loop.get_debug() + match_info = await self._router.resolve(request) + if debug: # pragma: no cover + if not isinstance(match_info, AbstractMatchInfo): + raise TypeError( + "match_info should be AbstractMatchInfo " + "instance, not {!r}".format(match_info) + ) + match_info.add_app(self) + + match_info.freeze() + + resp = None + request._match_info = match_info + expect = request.headers.get(hdrs.EXPECT) + if expect: + resp = await match_info.expect_handler(request) + await request.writer.drain() + + if resp is None: + handler = match_info.handler + + if self._run_middlewares: + for app in match_info.apps[::-1]: + for m, new_style in app._middlewares_handlers: # type: ignore[union-attr] # noqa + if new_style: + handler = update_wrapper( + partial(m, handler=handler), handler + ) + else: + handler = await m(app, handler) # type: ignore[arg-type] + + resp = await handler(request) + + return resp + + def __call__(self) -> "Application": + """gunicorn compatibility""" + return self + + def __repr__(self) -> str: + return f"" + + def __bool__(self) -> bool: + return True + + +class CleanupError(RuntimeError): + @property + def exceptions(self) -> List[BaseException]: + return cast(List[BaseException], self.args[1]) + + +if TYPE_CHECKING: # pragma: no cover + _CleanupContextBase = FrozenList[Callable[[Application], AsyncIterator[None]]] +else: + _CleanupContextBase = FrozenList + + +class CleanupContext(_CleanupContextBase): + def __init__(self) -> None: + super().__init__() + self._exits = [] # type: List[AsyncIterator[None]] + + async def _on_startup(self, app: Application) -> None: + for cb in self: + it = cb(app).__aiter__() + await it.__anext__() + self._exits.append(it) + + async def _on_cleanup(self, app: Application) -> None: + errors = [] + for it in reversed(self._exits): + try: + await it.__anext__() + except StopAsyncIteration: + pass + except Exception as exc: + errors.append(exc) + else: + errors.append(RuntimeError(f"{it!r} has more than one 'yield'")) + if errors: + if len(errors) == 1: + raise errors[0] + else: + raise CleanupError("Multiple errors on cleanup stage", errors) diff --git a/sbsheriff/Lib/site-packages/aiohttp/web_exceptions.py b/sbsheriff/Lib/site-packages/aiohttp/web_exceptions.py new file mode 100644 index 0000000..2eadca0 --- /dev/null +++ b/sbsheriff/Lib/site-packages/aiohttp/web_exceptions.py @@ -0,0 +1,441 @@ +import warnings +from typing import Any, Dict, Iterable, List, Optional, Set # noqa + +from yarl import URL + +from .typedefs import LooseHeaders, StrOrURL +from .web_response import Response + +__all__ = ( + "HTTPException", + "HTTPError", + "HTTPRedirection", + "HTTPSuccessful", + "HTTPOk", + "HTTPCreated", + "HTTPAccepted", + "HTTPNonAuthoritativeInformation", + "HTTPNoContent", + "HTTPResetContent", + "HTTPPartialContent", + "HTTPMultipleChoices", + "HTTPMovedPermanently", + "HTTPFound", + "HTTPSeeOther", + "HTTPNotModified", + "HTTPUseProxy", + "HTTPTemporaryRedirect", + "HTTPPermanentRedirect", + "HTTPClientError", + "HTTPBadRequest", + "HTTPUnauthorized", + "HTTPPaymentRequired", + "HTTPForbidden", + "HTTPNotFound", + "HTTPMethodNotAllowed", + "HTTPNotAcceptable", + "HTTPProxyAuthenticationRequired", + "HTTPRequestTimeout", + "HTTPConflict", + "HTTPGone", + "HTTPLengthRequired", + "HTTPPreconditionFailed", + "HTTPRequestEntityTooLarge", + "HTTPRequestURITooLong", + "HTTPUnsupportedMediaType", + "HTTPRequestRangeNotSatisfiable", + "HTTPExpectationFailed", + "HTTPMisdirectedRequest", + "HTTPUnprocessableEntity", + "HTTPFailedDependency", + "HTTPUpgradeRequired", + "HTTPPreconditionRequired", + "HTTPTooManyRequests", + "HTTPRequestHeaderFieldsTooLarge", + "HTTPUnavailableForLegalReasons", + "HTTPServerError", + "HTTPInternalServerError", + "HTTPNotImplemented", + "HTTPBadGateway", + "HTTPServiceUnavailable", + "HTTPGatewayTimeout", + "HTTPVersionNotSupported", + "HTTPVariantAlsoNegotiates", + "HTTPInsufficientStorage", + "HTTPNotExtended", + "HTTPNetworkAuthenticationRequired", +) + + +############################################################ +# HTTP Exceptions +############################################################ + + +class HTTPException(Response, Exception): + + # You should set in subclasses: + # status = 200 + + status_code = -1 + empty_body = False + + __http_exception__ = True + + def __init__( + self, + *, + headers: Optional[LooseHeaders] = None, + reason: Optional[str] = None, + body: Any = None, + text: Optional[str] = None, + content_type: Optional[str] = None, + ) -> None: + if body is not None: + warnings.warn( + "body argument is deprecated for http web exceptions", + DeprecationWarning, + ) + Response.__init__( + self, + status=self.status_code, + headers=headers, + reason=reason, + body=body, + text=text, + content_type=content_type, + ) + Exception.__init__(self, self.reason) + if self.body is None and not self.empty_body: + self.text = f"{self.status}: {self.reason}" + + def __bool__(self) -> bool: + return True + + +class HTTPError(HTTPException): + """Base class for exceptions with status codes in the 400s and 500s.""" + + +class HTTPRedirection(HTTPException): + """Base class for exceptions with status codes in the 300s.""" + + +class HTTPSuccessful(HTTPException): + """Base class for exceptions with status codes in the 200s.""" + + +class HTTPOk(HTTPSuccessful): + status_code = 200 + + +class HTTPCreated(HTTPSuccessful): + status_code = 201 + + +class HTTPAccepted(HTTPSuccessful): + status_code = 202 + + +class HTTPNonAuthoritativeInformation(HTTPSuccessful): + status_code = 203 + + +class HTTPNoContent(HTTPSuccessful): + status_code = 204 + empty_body = True + + +class HTTPResetContent(HTTPSuccessful): + status_code = 205 + empty_body = True + + +class HTTPPartialContent(HTTPSuccessful): + status_code = 206 + + +############################################################ +# 3xx redirection +############################################################ + + +class _HTTPMove(HTTPRedirection): + def __init__( + self, + location: StrOrURL, + *, + headers: Optional[LooseHeaders] = None, + reason: Optional[str] = None, + body: Any = None, + text: Optional[str] = None, + content_type: Optional[str] = None, + ) -> None: + if not location: + raise ValueError("HTTP redirects need a location to redirect to.") + super().__init__( + headers=headers, + reason=reason, + body=body, + text=text, + content_type=content_type, + ) + self.headers["Location"] = str(URL(location)) + self.location = location + + +class HTTPMultipleChoices(_HTTPMove): + status_code = 300 + + +class HTTPMovedPermanently(_HTTPMove): + status_code = 301 + + +class HTTPFound(_HTTPMove): + status_code = 302 + + +# This one is safe after a POST (the redirected location will be +# retrieved with GET): +class HTTPSeeOther(_HTTPMove): + status_code = 303 + + +class HTTPNotModified(HTTPRedirection): + # FIXME: this should include a date or etag header + status_code = 304 + empty_body = True + + +class HTTPUseProxy(_HTTPMove): + # Not a move, but looks a little like one + status_code = 305 + + +class HTTPTemporaryRedirect(_HTTPMove): + status_code = 307 + + +class HTTPPermanentRedirect(_HTTPMove): + status_code = 308 + + +############################################################ +# 4xx client error +############################################################ + + +class HTTPClientError(HTTPError): + pass + + +class HTTPBadRequest(HTTPClientError): + status_code = 400 + + +class HTTPUnauthorized(HTTPClientError): + status_code = 401 + + +class HTTPPaymentRequired(HTTPClientError): + status_code = 402 + + +class HTTPForbidden(HTTPClientError): + status_code = 403 + + +class HTTPNotFound(HTTPClientError): + status_code = 404 + + +class HTTPMethodNotAllowed(HTTPClientError): + status_code = 405 + + def __init__( + self, + method: str, + allowed_methods: Iterable[str], + *, + headers: Optional[LooseHeaders] = None, + reason: Optional[str] = None, + body: Any = None, + text: Optional[str] = None, + content_type: Optional[str] = None, + ) -> None: + allow = ",".join(sorted(allowed_methods)) + super().__init__( + headers=headers, + reason=reason, + body=body, + text=text, + content_type=content_type, + ) + self.headers["Allow"] = allow + self.allowed_methods = set(allowed_methods) # type: Set[str] + self.method = method.upper() + + +class HTTPNotAcceptable(HTTPClientError): + status_code = 406 + + +class HTTPProxyAuthenticationRequired(HTTPClientError): + status_code = 407 + + +class HTTPRequestTimeout(HTTPClientError): + status_code = 408 + + +class HTTPConflict(HTTPClientError): + status_code = 409 + + +class HTTPGone(HTTPClientError): + status_code = 410 + + +class HTTPLengthRequired(HTTPClientError): + status_code = 411 + + +class HTTPPreconditionFailed(HTTPClientError): + status_code = 412 + + +class HTTPRequestEntityTooLarge(HTTPClientError): + status_code = 413 + + def __init__(self, max_size: float, actual_size: float, **kwargs: Any) -> None: + kwargs.setdefault( + "text", + "Maximum request body size {} exceeded, " + "actual body size {}".format(max_size, actual_size), + ) + super().__init__(**kwargs) + + +class HTTPRequestURITooLong(HTTPClientError): + status_code = 414 + + +class HTTPUnsupportedMediaType(HTTPClientError): + status_code = 415 + + +class HTTPRequestRangeNotSatisfiable(HTTPClientError): + status_code = 416 + + +class HTTPExpectationFailed(HTTPClientError): + status_code = 417 + + +class HTTPMisdirectedRequest(HTTPClientError): + status_code = 421 + + +class HTTPUnprocessableEntity(HTTPClientError): + status_code = 422 + + +class HTTPFailedDependency(HTTPClientError): + status_code = 424 + + +class HTTPUpgradeRequired(HTTPClientError): + status_code = 426 + + +class HTTPPreconditionRequired(HTTPClientError): + status_code = 428 + + +class HTTPTooManyRequests(HTTPClientError): + status_code = 429 + + +class HTTPRequestHeaderFieldsTooLarge(HTTPClientError): + status_code = 431 + + +class HTTPUnavailableForLegalReasons(HTTPClientError): + status_code = 451 + + def __init__( + self, + link: str, + *, + headers: Optional[LooseHeaders] = None, + reason: Optional[str] = None, + body: Any = None, + text: Optional[str] = None, + content_type: Optional[str] = None, + ) -> None: + super().__init__( + headers=headers, + reason=reason, + body=body, + text=text, + content_type=content_type, + ) + self.headers["Link"] = '<%s>; rel="blocked-by"' % link + self.link = link + + +############################################################ +# 5xx Server Error +############################################################ +# Response status codes beginning with the digit "5" indicate cases in +# which the server is aware that it has erred or is incapable of +# performing the request. Except when responding to a HEAD request, the +# server SHOULD include an entity containing an explanation of the error +# situation, and whether it is a temporary or permanent condition. User +# agents SHOULD display any included entity to the user. These response +# codes are applicable to any request method. + + +class HTTPServerError(HTTPError): + pass + + +class HTTPInternalServerError(HTTPServerError): + status_code = 500 + + +class HTTPNotImplemented(HTTPServerError): + status_code = 501 + + +class HTTPBadGateway(HTTPServerError): + status_code = 502 + + +class HTTPServiceUnavailable(HTTPServerError): + status_code = 503 + + +class HTTPGatewayTimeout(HTTPServerError): + status_code = 504 + + +class HTTPVersionNotSupported(HTTPServerError): + status_code = 505 + + +class HTTPVariantAlsoNegotiates(HTTPServerError): + status_code = 506 + + +class HTTPInsufficientStorage(HTTPServerError): + status_code = 507 + + +class HTTPNotExtended(HTTPServerError): + status_code = 510 + + +class HTTPNetworkAuthenticationRequired(HTTPServerError): + status_code = 511 diff --git a/sbsheriff/Lib/site-packages/aiohttp/web_fileresponse.py b/sbsheriff/Lib/site-packages/aiohttp/web_fileresponse.py new file mode 100644 index 0000000..f41ed3f --- /dev/null +++ b/sbsheriff/Lib/site-packages/aiohttp/web_fileresponse.py @@ -0,0 +1,288 @@ +import asyncio +import mimetypes +import os +import pathlib +import sys +from typing import ( # noqa + IO, + TYPE_CHECKING, + Any, + Awaitable, + Callable, + Iterator, + List, + Optional, + Tuple, + Union, + cast, +) + +from . import hdrs +from .abc import AbstractStreamWriter +from .helpers import ETAG_ANY, ETag +from .typedefs import Final, LooseHeaders +from .web_exceptions import ( + HTTPNotModified, + HTTPPartialContent, + HTTPPreconditionFailed, + HTTPRequestRangeNotSatisfiable, +) +from .web_response import StreamResponse + +__all__ = ("FileResponse",) + +if TYPE_CHECKING: # pragma: no cover + from .web_request import BaseRequest + + +_T_OnChunkSent = Optional[Callable[[bytes], Awaitable[None]]] + + +NOSENDFILE: Final[bool] = bool(os.environ.get("AIOHTTP_NOSENDFILE")) + + +class FileResponse(StreamResponse): + """A response object can be used to send files.""" + + def __init__( + self, + path: Union[str, pathlib.Path], + chunk_size: int = 256 * 1024, + status: int = 200, + reason: Optional[str] = None, + headers: Optional[LooseHeaders] = None, + ) -> None: + super().__init__(status=status, reason=reason, headers=headers) + + if isinstance(path, str): + path = pathlib.Path(path) + + self._path = path + self._chunk_size = chunk_size + + async def _sendfile_fallback( + self, writer: AbstractStreamWriter, fobj: IO[Any], offset: int, count: int + ) -> AbstractStreamWriter: + # To keep memory usage low,fobj is transferred in chunks + # controlled by the constructor's chunk_size argument. + + chunk_size = self._chunk_size + loop = asyncio.get_event_loop() + + await loop.run_in_executor(None, fobj.seek, offset) + + chunk = await loop.run_in_executor(None, fobj.read, chunk_size) + while chunk: + await writer.write(chunk) + count = count - chunk_size + if count <= 0: + break + chunk = await loop.run_in_executor(None, fobj.read, min(chunk_size, count)) + + await writer.drain() + return writer + + async def _sendfile( + self, request: "BaseRequest", fobj: IO[Any], offset: int, count: int + ) -> AbstractStreamWriter: + writer = await super().prepare(request) + assert writer is not None + + if NOSENDFILE or sys.version_info < (3, 7) or self.compression: + return await self._sendfile_fallback(writer, fobj, offset, count) + + loop = request._loop + transport = request.transport + assert transport is not None + + try: + await loop.sendfile(transport, fobj, offset, count) + except NotImplementedError: + return await self._sendfile_fallback(writer, fobj, offset, count) + + await super().write_eof() + return writer + + @staticmethod + def _strong_etag_match(etag_value: str, etags: Tuple[ETag, ...]) -> bool: + if len(etags) == 1 and etags[0].value == ETAG_ANY: + return True + return any(etag.value == etag_value for etag in etags if not etag.is_weak) + + async def _not_modified( + self, request: "BaseRequest", etag_value: str, last_modified: float + ) -> Optional[AbstractStreamWriter]: + self.set_status(HTTPNotModified.status_code) + self._length_check = False + self.etag = etag_value # type: ignore[assignment] + self.last_modified = last_modified # type: ignore[assignment] + # Delete any Content-Length headers provided by user. HTTP 304 + # should always have empty response body + return await super().prepare(request) + + async def _precondition_failed( + self, request: "BaseRequest" + ) -> Optional[AbstractStreamWriter]: + self.set_status(HTTPPreconditionFailed.status_code) + self.content_length = 0 + return await super().prepare(request) + + async def prepare(self, request: "BaseRequest") -> Optional[AbstractStreamWriter]: + filepath = self._path + + gzip = False + if "gzip" in request.headers.get(hdrs.ACCEPT_ENCODING, ""): + gzip_path = filepath.with_name(filepath.name + ".gz") + + if gzip_path.is_file(): + filepath = gzip_path + gzip = True + + loop = asyncio.get_event_loop() + st: os.stat_result = await loop.run_in_executor(None, filepath.stat) + + etag_value = f"{st.st_mtime_ns:x}-{st.st_size:x}" + last_modified = st.st_mtime + + # https://tools.ietf.org/html/rfc7232#section-6 + ifmatch = request.if_match + if ifmatch is not None and not self._strong_etag_match(etag_value, ifmatch): + return await self._precondition_failed(request) + + unmodsince = request.if_unmodified_since + if ( + unmodsince is not None + and ifmatch is None + and st.st_mtime > unmodsince.timestamp() + ): + return await self._precondition_failed(request) + + ifnonematch = request.if_none_match + if ifnonematch is not None and self._strong_etag_match(etag_value, ifnonematch): + return await self._not_modified(request, etag_value, last_modified) + + modsince = request.if_modified_since + if ( + modsince is not None + and ifnonematch is None + and st.st_mtime <= modsince.timestamp() + ): + return await self._not_modified(request, etag_value, last_modified) + + if hdrs.CONTENT_TYPE not in self.headers: + ct, encoding = mimetypes.guess_type(str(filepath)) + if not ct: + ct = "application/octet-stream" + should_set_ct = True + else: + encoding = "gzip" if gzip else None + should_set_ct = False + + status = self._status + file_size = st.st_size + count = file_size + + start = None + + ifrange = request.if_range + if ifrange is None or st.st_mtime <= ifrange.timestamp(): + # If-Range header check: + # condition = cached date >= last modification date + # return 206 if True else 200. + # if False: + # Range header would not be processed, return 200 + # if True but Range header missing + # return 200 + try: + rng = request.http_range + start = rng.start + end = rng.stop + except ValueError: + # https://tools.ietf.org/html/rfc7233: + # A server generating a 416 (Range Not Satisfiable) response to + # a byte-range request SHOULD send a Content-Range header field + # with an unsatisfied-range value. + # The complete-length in a 416 response indicates the current + # length of the selected representation. + # + # Will do the same below. Many servers ignore this and do not + # send a Content-Range header with HTTP 416 + self.headers[hdrs.CONTENT_RANGE] = f"bytes */{file_size}" + self.set_status(HTTPRequestRangeNotSatisfiable.status_code) + return await super().prepare(request) + + # If a range request has been made, convert start, end slice + # notation into file pointer offset and count + if start is not None or end is not None: + if start < 0 and end is None: # return tail of file + start += file_size + if start < 0: + # if Range:bytes=-1000 in request header but file size + # is only 200, there would be trouble without this + start = 0 + count = file_size - start + else: + # rfc7233:If the last-byte-pos value is + # absent, or if the value is greater than or equal to + # the current length of the representation data, + # the byte range is interpreted as the remainder + # of the representation (i.e., the server replaces the + # value of last-byte-pos with a value that is one less than + # the current length of the selected representation). + count = ( + min(end if end is not None else file_size, file_size) - start + ) + + if start >= file_size: + # HTTP 416 should be returned in this case. + # + # According to https://tools.ietf.org/html/rfc7233: + # If a valid byte-range-set includes at least one + # byte-range-spec with a first-byte-pos that is less than + # the current length of the representation, or at least one + # suffix-byte-range-spec with a non-zero suffix-length, + # then the byte-range-set is satisfiable. Otherwise, the + # byte-range-set is unsatisfiable. + self.headers[hdrs.CONTENT_RANGE] = f"bytes */{file_size}" + self.set_status(HTTPRequestRangeNotSatisfiable.status_code) + return await super().prepare(request) + + status = HTTPPartialContent.status_code + # Even though you are sending the whole file, you should still + # return a HTTP 206 for a Range request. + self.set_status(status) + + if should_set_ct: + self.content_type = ct # type: ignore[assignment] + if encoding: + self.headers[hdrs.CONTENT_ENCODING] = encoding + if gzip: + self.headers[hdrs.VARY] = hdrs.ACCEPT_ENCODING + + self.etag = etag_value # type: ignore[assignment] + self.last_modified = st.st_mtime # type: ignore[assignment] + self.content_length = count + + self.headers[hdrs.ACCEPT_RANGES] = "bytes" + + real_start = cast(int, start) + + if status == HTTPPartialContent.status_code: + self.headers[hdrs.CONTENT_RANGE] = "bytes {}-{}/{}".format( + real_start, real_start + count - 1, file_size + ) + + # If we are sending 0 bytes calling sendfile() will throw a ValueError + if count == 0 or request.method == hdrs.METH_HEAD or self.status in [204, 304]: + return await super().prepare(request) + + fobj = await loop.run_in_executor(None, filepath.open, "rb") + if start: # be aware that start could be None or int=0 here. + offset = start + else: + offset = 0 + + try: + return await self._sendfile(request, fobj, offset, count) + finally: + await loop.run_in_executor(None, fobj.close) diff --git a/sbsheriff/Lib/site-packages/aiohttp/web_log.py b/sbsheriff/Lib/site-packages/aiohttp/web_log.py new file mode 100644 index 0000000..a977c1b --- /dev/null +++ b/sbsheriff/Lib/site-packages/aiohttp/web_log.py @@ -0,0 +1,208 @@ +import datetime +import functools +import logging +import os +import re +from collections import namedtuple +from typing import Any, Callable, Dict, Iterable, List, Tuple # noqa + +from .abc import AbstractAccessLogger +from .web_request import BaseRequest +from .web_response import StreamResponse + +KeyMethod = namedtuple("KeyMethod", "key method") + + +class AccessLogger(AbstractAccessLogger): + """Helper object to log access. + + Usage: + log = logging.getLogger("spam") + log_format = "%a %{User-Agent}i" + access_logger = AccessLogger(log, log_format) + access_logger.log(request, response, time) + + Format: + %% The percent sign + %a Remote IP-address (IP-address of proxy if using reverse proxy) + %t Time when the request was started to process + %P The process ID of the child that serviced the request + %r First line of request + %s Response status code + %b Size of response in bytes, including HTTP headers + %T Time taken to serve the request, in seconds + %Tf Time taken to serve the request, in seconds with floating fraction + in .06f format + %D Time taken to serve the request, in microseconds + %{FOO}i request.headers['FOO'] + %{FOO}o response.headers['FOO'] + %{FOO}e os.environ['FOO'] + + """ + + LOG_FORMAT_MAP = { + "a": "remote_address", + "t": "request_start_time", + "P": "process_id", + "r": "first_request_line", + "s": "response_status", + "b": "response_size", + "T": "request_time", + "Tf": "request_time_frac", + "D": "request_time_micro", + "i": "request_header", + "o": "response_header", + } + + LOG_FORMAT = '%a %t "%r" %s %b "%{Referer}i" "%{User-Agent}i"' + FORMAT_RE = re.compile(r"%(\{([A-Za-z0-9\-_]+)\}([ioe])|[atPrsbOD]|Tf?)") + CLEANUP_RE = re.compile(r"(%[^s])") + _FORMAT_CACHE = {} # type: Dict[str, Tuple[str, List[KeyMethod]]] + + def __init__(self, logger: logging.Logger, log_format: str = LOG_FORMAT) -> None: + """Initialise the logger. + + logger is a logger object to be used for logging. + log_format is a string with apache compatible log format description. + + """ + super().__init__(logger, log_format=log_format) + + _compiled_format = AccessLogger._FORMAT_CACHE.get(log_format) + if not _compiled_format: + _compiled_format = self.compile_format(log_format) + AccessLogger._FORMAT_CACHE[log_format] = _compiled_format + + self._log_format, self._methods = _compiled_format + + def compile_format(self, log_format: str) -> Tuple[str, List[KeyMethod]]: + """Translate log_format into form usable by modulo formatting + + All known atoms will be replaced with %s + Also methods for formatting of those atoms will be added to + _methods in appropriate order + + For example we have log_format = "%a %t" + This format will be translated to "%s %s" + Also contents of _methods will be + [self._format_a, self._format_t] + These method will be called and results will be passed + to translated string format. + + Each _format_* method receive 'args' which is list of arguments + given to self.log + + Exceptions are _format_e, _format_i and _format_o methods which + also receive key name (by functools.partial) + + """ + # list of (key, method) tuples, we don't use an OrderedDict as users + # can repeat the same key more than once + methods = list() + + for atom in self.FORMAT_RE.findall(log_format): + if atom[1] == "": + format_key1 = self.LOG_FORMAT_MAP[atom[0]] + m = getattr(AccessLogger, "_format_%s" % atom[0]) + key_method = KeyMethod(format_key1, m) + else: + format_key2 = (self.LOG_FORMAT_MAP[atom[2]], atom[1]) + m = getattr(AccessLogger, "_format_%s" % atom[2]) + key_method = KeyMethod(format_key2, functools.partial(m, atom[1])) + + methods.append(key_method) + + log_format = self.FORMAT_RE.sub(r"%s", log_format) + log_format = self.CLEANUP_RE.sub(r"%\1", log_format) + return log_format, methods + + @staticmethod + def _format_i( + key: str, request: BaseRequest, response: StreamResponse, time: float + ) -> str: + if request is None: + return "(no headers)" + + # suboptimal, make istr(key) once + return request.headers.get(key, "-") + + @staticmethod + def _format_o( + key: str, request: BaseRequest, response: StreamResponse, time: float + ) -> str: + # suboptimal, make istr(key) once + return response.headers.get(key, "-") + + @staticmethod + def _format_a(request: BaseRequest, response: StreamResponse, time: float) -> str: + if request is None: + return "-" + ip = request.remote + return ip if ip is not None else "-" + + @staticmethod + def _format_t(request: BaseRequest, response: StreamResponse, time: float) -> str: + now = datetime.datetime.utcnow() + start_time = now - datetime.timedelta(seconds=time) + return start_time.strftime("[%d/%b/%Y:%H:%M:%S +0000]") + + @staticmethod + def _format_P(request: BaseRequest, response: StreamResponse, time: float) -> str: + return "<%s>" % os.getpid() + + @staticmethod + def _format_r(request: BaseRequest, response: StreamResponse, time: float) -> str: + if request is None: + return "-" + return "{} {} HTTP/{}.{}".format( + request.method, + request.path_qs, + request.version.major, + request.version.minor, + ) + + @staticmethod + def _format_s(request: BaseRequest, response: StreamResponse, time: float) -> int: + return response.status + + @staticmethod + def _format_b(request: BaseRequest, response: StreamResponse, time: float) -> int: + return response.body_length + + @staticmethod + def _format_T(request: BaseRequest, response: StreamResponse, time: float) -> str: + return str(round(time)) + + @staticmethod + def _format_Tf(request: BaseRequest, response: StreamResponse, time: float) -> str: + return "%06f" % time + + @staticmethod + def _format_D(request: BaseRequest, response: StreamResponse, time: float) -> str: + return str(round(time * 1000000)) + + def _format_line( + self, request: BaseRequest, response: StreamResponse, time: float + ) -> Iterable[Tuple[str, Callable[[BaseRequest, StreamResponse, float], str]]]: + return [(key, method(request, response, time)) for key, method in self._methods] + + def log(self, request: BaseRequest, response: StreamResponse, time: float) -> None: + try: + fmt_info = self._format_line(request, response, time) + + values = list() + extra = dict() + for key, value in fmt_info: + values.append(value) + + if key.__class__ is str: + extra[key] = value + else: + k1, k2 = key # type: ignore[misc] + dct = extra.get(k1, {}) # type: ignore[var-annotated,has-type] + dct[k2] = value # type: ignore[index,has-type] + extra[k1] = dct # type: ignore[has-type,assignment] + + self.logger.info(self._log_format % tuple(values), extra=extra) + except Exception: + self.logger.exception("Error in logging") diff --git a/sbsheriff/Lib/site-packages/aiohttp/web_middlewares.py b/sbsheriff/Lib/site-packages/aiohttp/web_middlewares.py new file mode 100644 index 0000000..fabcc44 --- /dev/null +++ b/sbsheriff/Lib/site-packages/aiohttp/web_middlewares.py @@ -0,0 +1,119 @@ +import re +from typing import TYPE_CHECKING, Awaitable, Callable, Tuple, Type, TypeVar + +from .typedefs import Handler +from .web_exceptions import HTTPPermanentRedirect, _HTTPMove +from .web_request import Request +from .web_response import StreamResponse +from .web_urldispatcher import SystemRoute + +__all__ = ( + "middleware", + "normalize_path_middleware", +) + +if TYPE_CHECKING: # pragma: no cover + from .web_app import Application + +_Func = TypeVar("_Func") + + +async def _check_request_resolves(request: Request, path: str) -> Tuple[bool, Request]: + alt_request = request.clone(rel_url=path) + + match_info = await request.app.router.resolve(alt_request) + alt_request._match_info = match_info + + if match_info.http_exception is None: + return True, alt_request + + return False, request + + +def middleware(f: _Func) -> _Func: + f.__middleware_version__ = 1 # type: ignore[attr-defined] + return f + + +_Middleware = Callable[[Request, Handler], Awaitable[StreamResponse]] + + +def normalize_path_middleware( + *, + append_slash: bool = True, + remove_slash: bool = False, + merge_slashes: bool = True, + redirect_class: Type[_HTTPMove] = HTTPPermanentRedirect, +) -> _Middleware: + """Factory for producing a middleware that normalizes the path of a request. + + Normalizing means: + - Add or remove a trailing slash to the path. + - Double slashes are replaced by one. + + The middleware returns as soon as it finds a path that resolves + correctly. The order if both merge and append/remove are enabled is + 1) merge slashes + 2) append/remove slash + 3) both merge slashes and append/remove slash. + If the path resolves with at least one of those conditions, it will + redirect to the new path. + + Only one of `append_slash` and `remove_slash` can be enabled. If both + are `True` the factory will raise an assertion error + + If `append_slash` is `True` the middleware will append a slash when + needed. If a resource is defined with trailing slash and the request + comes without it, it will append it automatically. + + If `remove_slash` is `True`, `append_slash` must be `False`. When enabled + the middleware will remove trailing slashes and redirect if the resource + is defined + + If merge_slashes is True, merge multiple consecutive slashes in the + path into one. + """ + correct_configuration = not (append_slash and remove_slash) + assert correct_configuration, "Cannot both remove and append slash" + + @middleware + async def impl(request: Request, handler: Handler) -> StreamResponse: + if isinstance(request.match_info.route, SystemRoute): + paths_to_check = [] + if "?" in request.raw_path: + path, query = request.raw_path.split("?", 1) + query = "?" + query + else: + query = "" + path = request.raw_path + + if merge_slashes: + paths_to_check.append(re.sub("//+", "/", path)) + if append_slash and not request.path.endswith("/"): + paths_to_check.append(path + "/") + if remove_slash and request.path.endswith("/"): + paths_to_check.append(path[:-1]) + if merge_slashes and append_slash: + paths_to_check.append(re.sub("//+", "/", path + "/")) + if merge_slashes and remove_slash: + merged_slashes = re.sub("//+", "/", path) + paths_to_check.append(merged_slashes[:-1]) + + for path in paths_to_check: + path = re.sub("^//+", "/", path) # SECURITY: GHSA-v6wp-4m6f-gcjg + resolves, request = await _check_request_resolves(request, path) + if resolves: + raise redirect_class(request.raw_path + query) + + return await handler(request) + + return impl + + +def _fix_request_current_app(app: "Application") -> _Middleware: + @middleware + async def impl(request: Request, handler: Handler) -> StreamResponse: + with request.match_info.set_current_app(app): + return await handler(request) + + return impl diff --git a/sbsheriff/Lib/site-packages/aiohttp/web_protocol.py b/sbsheriff/Lib/site-packages/aiohttp/web_protocol.py new file mode 100644 index 0000000..ad0c049 --- /dev/null +++ b/sbsheriff/Lib/site-packages/aiohttp/web_protocol.py @@ -0,0 +1,681 @@ +import asyncio +import asyncio.streams +import traceback +import warnings +from collections import deque +from contextlib import suppress +from html import escape as html_escape +from http import HTTPStatus +from logging import Logger +from typing import ( + TYPE_CHECKING, + Any, + Awaitable, + Callable, + Deque, + Optional, + Sequence, + Tuple, + Type, + Union, + cast, +) + +import attr +import yarl + +from .abc import AbstractAccessLogger, AbstractStreamWriter +from .base_protocol import BaseProtocol +from .helpers import ceil_timeout +from .http import ( + HttpProcessingError, + HttpRequestParser, + HttpVersion10, + RawRequestMessage, + StreamWriter, +) +from .log import access_logger, server_logger +from .streams import EMPTY_PAYLOAD, StreamReader +from .tcp_helpers import tcp_keepalive +from .web_exceptions import HTTPException +from .web_log import AccessLogger +from .web_request import BaseRequest +from .web_response import Response, StreamResponse + +__all__ = ("RequestHandler", "RequestPayloadError", "PayloadAccessError") + +if TYPE_CHECKING: # pragma: no cover + from .web_server import Server + + +_RequestFactory = Callable[ + [ + RawRequestMessage, + StreamReader, + "RequestHandler", + AbstractStreamWriter, + "asyncio.Task[None]", + ], + BaseRequest, +] + +_RequestHandler = Callable[[BaseRequest], Awaitable[StreamResponse]] + +ERROR = RawRequestMessage( + "UNKNOWN", + "/", + HttpVersion10, + {}, # type: ignore[arg-type] + {}, # type: ignore[arg-type] + True, + None, + False, + False, + yarl.URL("/"), +) + + +class RequestPayloadError(Exception): + """Payload parsing error.""" + + +class PayloadAccessError(Exception): + """Payload was accessed after response was sent.""" + + +@attr.s(auto_attribs=True, frozen=True, slots=True) +class _ErrInfo: + status: int + exc: BaseException + message: str + + +_MsgType = Tuple[Union[RawRequestMessage, _ErrInfo], StreamReader] + + +class RequestHandler(BaseProtocol): + """HTTP protocol implementation. + + RequestHandler handles incoming HTTP request. It reads request line, + request headers and request payload and calls handle_request() method. + By default it always returns with 404 response. + + RequestHandler handles errors in incoming request, like bad + status line, bad headers or incomplete payload. If any error occurs, + connection gets closed. + + keepalive_timeout -- number of seconds before closing + keep-alive connection + + tcp_keepalive -- TCP keep-alive is on, default is on + + debug -- enable debug mode + + logger -- custom logger object + + access_log_class -- custom class for access_logger + + access_log -- custom logging object + + access_log_format -- access log format string + + loop -- Optional event loop + + max_line_size -- Optional maximum header line size + + max_field_size -- Optional maximum header field size + + max_headers -- Optional maximum header size + + """ + + KEEPALIVE_RESCHEDULE_DELAY = 1 + + __slots__ = ( + "_request_count", + "_keepalive", + "_manager", + "_request_handler", + "_request_factory", + "_tcp_keepalive", + "_keepalive_time", + "_keepalive_handle", + "_keepalive_timeout", + "_lingering_time", + "_messages", + "_message_tail", + "_waiter", + "_task_handler", + "_upgrade", + "_payload_parser", + "_request_parser", + "_reading_paused", + "logger", + "debug", + "access_log", + "access_logger", + "_close", + "_force_close", + "_current_request", + ) + + def __init__( + self, + manager: "Server", + *, + loop: asyncio.AbstractEventLoop, + keepalive_timeout: float = 75.0, # NGINX default is 75 secs + tcp_keepalive: bool = True, + logger: Logger = server_logger, + access_log_class: Type[AbstractAccessLogger] = AccessLogger, + access_log: Logger = access_logger, + access_log_format: str = AccessLogger.LOG_FORMAT, + debug: bool = False, + max_line_size: int = 8190, + max_headers: int = 32768, + max_field_size: int = 8190, + lingering_time: float = 10.0, + read_bufsize: int = 2 ** 16, + auto_decompress: bool = True, + ): + super().__init__(loop) + + self._request_count = 0 + self._keepalive = False + self._current_request = None # type: Optional[BaseRequest] + self._manager = manager # type: Optional[Server] + self._request_handler: Optional[_RequestHandler] = manager.request_handler + self._request_factory: Optional[_RequestFactory] = manager.request_factory + + self._tcp_keepalive = tcp_keepalive + # placeholder to be replaced on keepalive timeout setup + self._keepalive_time = 0.0 + self._keepalive_handle = None # type: Optional[asyncio.Handle] + self._keepalive_timeout = keepalive_timeout + self._lingering_time = float(lingering_time) + + self._messages: Deque[_MsgType] = deque() + self._message_tail = b"" + + self._waiter = None # type: Optional[asyncio.Future[None]] + self._task_handler = None # type: Optional[asyncio.Task[None]] + + self._upgrade = False + self._payload_parser = None # type: Any + self._request_parser = HttpRequestParser( + self, + loop, + read_bufsize, + max_line_size=max_line_size, + max_field_size=max_field_size, + max_headers=max_headers, + payload_exception=RequestPayloadError, + auto_decompress=auto_decompress, + ) # type: Optional[HttpRequestParser] + + self.logger = logger + self.debug = debug + self.access_log = access_log + if access_log: + self.access_logger = access_log_class( + access_log, access_log_format + ) # type: Optional[AbstractAccessLogger] + else: + self.access_logger = None + + self._close = False + self._force_close = False + + def __repr__(self) -> str: + return "<{} {}>".format( + self.__class__.__name__, + "connected" if self.transport is not None else "disconnected", + ) + + @property + def keepalive_timeout(self) -> float: + return self._keepalive_timeout + + async def shutdown(self, timeout: Optional[float] = 15.0) -> None: + """Do worker process exit preparations. + + We need to clean up everything and stop accepting requests. + It is especially important for keep-alive connections. + """ + self._force_close = True + + if self._keepalive_handle is not None: + self._keepalive_handle.cancel() + + if self._waiter: + self._waiter.cancel() + + # wait for handlers + with suppress(asyncio.CancelledError, asyncio.TimeoutError): + async with ceil_timeout(timeout): + if self._current_request is not None: + self._current_request._cancel(asyncio.CancelledError()) + + if self._task_handler is not None and not self._task_handler.done(): + await self._task_handler + + # force-close non-idle handler + if self._task_handler is not None: + self._task_handler.cancel() + + if self.transport is not None: + self.transport.close() + self.transport = None + + def connection_made(self, transport: asyncio.BaseTransport) -> None: + super().connection_made(transport) + + real_transport = cast(asyncio.Transport, transport) + if self._tcp_keepalive: + tcp_keepalive(real_transport) + + self._task_handler = self._loop.create_task(self.start()) + assert self._manager is not None + self._manager.connection_made(self, real_transport) + + def connection_lost(self, exc: Optional[BaseException]) -> None: + if self._manager is None: + return + self._manager.connection_lost(self, exc) + + super().connection_lost(exc) + + self._manager = None + self._force_close = True + self._request_factory = None + self._request_handler = None + self._request_parser = None + + if self._keepalive_handle is not None: + self._keepalive_handle.cancel() + + if self._current_request is not None: + if exc is None: + exc = ConnectionResetError("Connection lost") + self._current_request._cancel(exc) + + if self._task_handler is not None: + self._task_handler.cancel() + if self._waiter is not None: + self._waiter.cancel() + + self._task_handler = None + + if self._payload_parser is not None: + self._payload_parser.feed_eof() + self._payload_parser = None + + def set_parser(self, parser: Any) -> None: + # Actual type is WebReader + assert self._payload_parser is None + + self._payload_parser = parser + + if self._message_tail: + self._payload_parser.feed_data(self._message_tail) + self._message_tail = b"" + + def eof_received(self) -> None: + pass + + def data_received(self, data: bytes) -> None: + if self._force_close or self._close: + return + # parse http messages + messages: Sequence[_MsgType] + if self._payload_parser is None and not self._upgrade: + assert self._request_parser is not None + try: + messages, upgraded, tail = self._request_parser.feed_data(data) + except HttpProcessingError as exc: + messages = [ + (_ErrInfo(status=400, exc=exc, message=exc.message), EMPTY_PAYLOAD) + ] + upgraded = False + tail = b"" + + for msg, payload in messages or (): + self._request_count += 1 + self._messages.append((msg, payload)) + + waiter = self._waiter + if messages and waiter is not None and not waiter.done(): + # don't set result twice + waiter.set_result(None) + + self._upgrade = upgraded + if upgraded and tail: + self._message_tail = tail + + # no parser, just store + elif self._payload_parser is None and self._upgrade and data: + self._message_tail += data + + # feed payload + elif data: + eof, tail = self._payload_parser.feed_data(data) + if eof: + self.close() + + def keep_alive(self, val: bool) -> None: + """Set keep-alive connection mode. + + :param bool val: new state. + """ + self._keepalive = val + if self._keepalive_handle: + self._keepalive_handle.cancel() + self._keepalive_handle = None + + def close(self) -> None: + """Close connection. + + Stop accepting new pipelining messages and close + connection when handlers done processing messages. + """ + self._close = True + if self._waiter: + self._waiter.cancel() + + def force_close(self) -> None: + """Forcefully close connection.""" + self._force_close = True + if self._waiter: + self._waiter.cancel() + if self.transport is not None: + self.transport.close() + self.transport = None + + def log_access( + self, request: BaseRequest, response: StreamResponse, time: float + ) -> None: + if self.access_logger is not None: + self.access_logger.log(request, response, self._loop.time() - time) + + def log_debug(self, *args: Any, **kw: Any) -> None: + if self.debug: + self.logger.debug(*args, **kw) + + def log_exception(self, *args: Any, **kw: Any) -> None: + self.logger.exception(*args, **kw) + + def _process_keepalive(self) -> None: + if self._force_close or not self._keepalive: + return + + next = self._keepalive_time + self._keepalive_timeout + + # handler in idle state + if self._waiter: + if self._loop.time() > next: + self.force_close() + return + + # not all request handlers are done, + # reschedule itself to next second + self._keepalive_handle = self._loop.call_later( + self.KEEPALIVE_RESCHEDULE_DELAY, self._process_keepalive + ) + + async def _handle_request( + self, + request: BaseRequest, + start_time: float, + request_handler: Callable[[BaseRequest], Awaitable[StreamResponse]], + ) -> Tuple[StreamResponse, bool]: + assert self._request_handler is not None + try: + try: + self._current_request = request + resp = await request_handler(request) + finally: + self._current_request = None + except HTTPException as exc: + resp = exc + reset = await self.finish_response(request, resp, start_time) + except asyncio.CancelledError: + raise + except asyncio.TimeoutError as exc: + self.log_debug("Request handler timed out.", exc_info=exc) + resp = self.handle_error(request, 504) + reset = await self.finish_response(request, resp, start_time) + except Exception as exc: + resp = self.handle_error(request, 500, exc) + reset = await self.finish_response(request, resp, start_time) + else: + # Deprecation warning (See #2415) + if getattr(resp, "__http_exception__", False): + warnings.warn( + "returning HTTPException object is deprecated " + "(#2415) and will be removed, " + "please raise the exception instead", + DeprecationWarning, + ) + + reset = await self.finish_response(request, resp, start_time) + + return resp, reset + + async def start(self) -> None: + """Process incoming request. + + It reads request line, request headers and request payload, then + calls handle_request() method. Subclass has to override + handle_request(). start() handles various exceptions in request + or response handling. Connection is being closed always unless + keep_alive(True) specified. + """ + loop = self._loop + handler = self._task_handler + assert handler is not None + manager = self._manager + assert manager is not None + keepalive_timeout = self._keepalive_timeout + resp = None + assert self._request_factory is not None + assert self._request_handler is not None + + while not self._force_close: + if not self._messages: + try: + # wait for next request + self._waiter = loop.create_future() + await self._waiter + except asyncio.CancelledError: + break + finally: + self._waiter = None + + message, payload = self._messages.popleft() + + start = loop.time() + + manager.requests_count += 1 + writer = StreamWriter(self, loop) + if isinstance(message, _ErrInfo): + # make request_factory work + request_handler = self._make_error_handler(message) + message = ERROR + else: + request_handler = self._request_handler + + request = self._request_factory(message, payload, self, writer, handler) + try: + # a new task is used for copy context vars (#3406) + task = self._loop.create_task( + self._handle_request(request, start, request_handler) + ) + try: + resp, reset = await task + except (asyncio.CancelledError, ConnectionError): + self.log_debug("Ignored premature client disconnection") + break + + # Drop the processed task from asyncio.Task.all_tasks() early + del task + if reset: + self.log_debug("Ignored premature client disconnection 2") + break + + # notify server about keep-alive + self._keepalive = bool(resp.keep_alive) + + # check payload + if not payload.is_eof(): + lingering_time = self._lingering_time + if not self._force_close and lingering_time: + self.log_debug( + "Start lingering close timer for %s sec.", lingering_time + ) + + now = loop.time() + end_t = now + lingering_time + + with suppress(asyncio.TimeoutError, asyncio.CancelledError): + while not payload.is_eof() and now < end_t: + async with ceil_timeout(end_t - now): + # read and ignore + await payload.readany() + now = loop.time() + + # if payload still uncompleted + if not payload.is_eof() and not self._force_close: + self.log_debug("Uncompleted request.") + self.close() + + payload.set_exception(PayloadAccessError()) + + except asyncio.CancelledError: + self.log_debug("Ignored premature client disconnection ") + break + except RuntimeError as exc: + if self.debug: + self.log_exception("Unhandled runtime exception", exc_info=exc) + self.force_close() + except Exception as exc: + self.log_exception("Unhandled exception", exc_info=exc) + self.force_close() + finally: + if self.transport is None and resp is not None: + self.log_debug("Ignored premature client disconnection.") + elif not self._force_close: + if self._keepalive and not self._close: + # start keep-alive timer + if keepalive_timeout is not None: + now = self._loop.time() + self._keepalive_time = now + if self._keepalive_handle is None: + self._keepalive_handle = loop.call_at( + now + keepalive_timeout, self._process_keepalive + ) + else: + break + + # remove handler, close transport if no handlers left + if not self._force_close: + self._task_handler = None + if self.transport is not None: + self.transport.close() + + async def finish_response( + self, request: BaseRequest, resp: StreamResponse, start_time: float + ) -> bool: + """Prepare the response and write_eof, then log access. + + This has to + be called within the context of any exception so the access logger + can get exception information. Returns True if the client disconnects + prematurely. + """ + if self._request_parser is not None: + self._request_parser.set_upgraded(False) + self._upgrade = False + if self._message_tail: + self._request_parser.feed_data(self._message_tail) + self._message_tail = b"" + try: + prepare_meth = resp.prepare + except AttributeError: + if resp is None: + raise RuntimeError("Missing return " "statement on request handler") + else: + raise RuntimeError( + "Web-handler should return " + "a response instance, " + "got {!r}".format(resp) + ) + try: + await prepare_meth(request) + await resp.write_eof() + except ConnectionError: + self.log_access(request, resp, start_time) + return True + else: + self.log_access(request, resp, start_time) + return False + + def handle_error( + self, + request: BaseRequest, + status: int = 500, + exc: Optional[BaseException] = None, + message: Optional[str] = None, + ) -> StreamResponse: + """Handle errors. + + Returns HTTP response with specific status code. Logs additional + information. It always closes current connection. + """ + self.log_exception("Error handling request", exc_info=exc) + + # some data already got sent, connection is broken + if request.writer.output_size > 0: + raise ConnectionError( + "Response is sent already, cannot send another response " + "with the error message" + ) + + ct = "text/plain" + if status == HTTPStatus.INTERNAL_SERVER_ERROR: + title = "{0.value} {0.phrase}".format(HTTPStatus.INTERNAL_SERVER_ERROR) + msg = HTTPStatus.INTERNAL_SERVER_ERROR.description + tb = None + if self.debug: + with suppress(Exception): + tb = traceback.format_exc() + + if "text/html" in request.headers.get("Accept", ""): + if tb: + tb = html_escape(tb) + msg = f"

Traceback:

\n
{tb}
" + message = ( + "" + "{title}" + "\n

{title}

" + "\n{msg}\n\n" + ).format(title=title, msg=msg) + ct = "text/html" + else: + if tb: + msg = tb + message = title + "\n\n" + msg + + resp = Response(status=status, text=message, content_type=ct) + resp.force_close() + + return resp + + def _make_error_handler( + self, err_info: _ErrInfo + ) -> Callable[[BaseRequest], Awaitable[StreamResponse]]: + async def handler(request: BaseRequest) -> StreamResponse: + return self.handle_error( + request, err_info.status, err_info.exc, err_info.message + ) + + return handler diff --git a/sbsheriff/Lib/site-packages/aiohttp/web_request.py b/sbsheriff/Lib/site-packages/aiohttp/web_request.py new file mode 100644 index 0000000..b3574ca --- /dev/null +++ b/sbsheriff/Lib/site-packages/aiohttp/web_request.py @@ -0,0 +1,874 @@ +import asyncio +import datetime +import io +import re +import socket +import string +import tempfile +import types +import warnings +from http.cookies import SimpleCookie +from types import MappingProxyType +from typing import ( + TYPE_CHECKING, + Any, + Dict, + Iterator, + Mapping, + MutableMapping, + Optional, + Pattern, + Tuple, + Union, + cast, +) +from urllib.parse import parse_qsl + +import attr +from multidict import CIMultiDict, CIMultiDictProxy, MultiDict, MultiDictProxy +from yarl import URL + +from . import hdrs +from .abc import AbstractStreamWriter +from .helpers import ( + DEBUG, + ETAG_ANY, + LIST_QUOTED_ETAG_RE, + ChainMapProxy, + ETag, + HeadersMixin, + parse_http_date, + reify, + sentinel, +) +from .http_parser import RawRequestMessage +from .http_writer import HttpVersion +from .multipart import BodyPartReader, MultipartReader +from .streams import EmptyStreamReader, StreamReader +from .typedefs import ( + DEFAULT_JSON_DECODER, + Final, + JSONDecoder, + LooseHeaders, + RawHeaders, + StrOrURL, +) +from .web_exceptions import HTTPRequestEntityTooLarge +from .web_response import StreamResponse + +__all__ = ("BaseRequest", "FileField", "Request") + + +if TYPE_CHECKING: # pragma: no cover + from .web_app import Application + from .web_protocol import RequestHandler + from .web_urldispatcher import UrlMappingMatchInfo + + +@attr.s(auto_attribs=True, frozen=True, slots=True) +class FileField: + name: str + filename: str + file: io.BufferedReader + content_type: str + headers: "CIMultiDictProxy[str]" + + +_TCHAR: Final[str] = string.digits + string.ascii_letters + r"!#$%&'*+.^_`|~-" +# '-' at the end to prevent interpretation as range in a char class + +_TOKEN: Final[str] = fr"[{_TCHAR}]+" + +_QDTEXT: Final[str] = r"[{}]".format( + r"".join(chr(c) for c in (0x09, 0x20, 0x21) + tuple(range(0x23, 0x7F))) +) +# qdtext includes 0x5C to escape 0x5D ('\]') +# qdtext excludes obs-text (because obsoleted, and encoding not specified) + +_QUOTED_PAIR: Final[str] = r"\\[\t !-~]" + +_QUOTED_STRING: Final[str] = r'"(?:{quoted_pair}|{qdtext})*"'.format( + qdtext=_QDTEXT, quoted_pair=_QUOTED_PAIR +) + +_FORWARDED_PAIR: Final[ + str +] = r"({token})=({token}|{quoted_string})(:\d{{1,4}})?".format( + token=_TOKEN, quoted_string=_QUOTED_STRING +) + +_QUOTED_PAIR_REPLACE_RE: Final[Pattern[str]] = re.compile(r"\\([\t !-~])") +# same pattern as _QUOTED_PAIR but contains a capture group + +_FORWARDED_PAIR_RE: Final[Pattern[str]] = re.compile(_FORWARDED_PAIR) + +############################################################ +# HTTP Request +############################################################ + + +class BaseRequest(MutableMapping[str, Any], HeadersMixin): + + POST_METHODS = { + hdrs.METH_PATCH, + hdrs.METH_POST, + hdrs.METH_PUT, + hdrs.METH_TRACE, + hdrs.METH_DELETE, + } + + ATTRS = HeadersMixin.ATTRS | frozenset( + [ + "_message", + "_protocol", + "_payload_writer", + "_payload", + "_headers", + "_method", + "_version", + "_rel_url", + "_post", + "_read_bytes", + "_state", + "_cache", + "_task", + "_client_max_size", + "_loop", + "_transport_sslcontext", + "_transport_peername", + ] + ) + + def __init__( + self, + message: RawRequestMessage, + payload: StreamReader, + protocol: "RequestHandler", + payload_writer: AbstractStreamWriter, + task: "asyncio.Task[None]", + loop: asyncio.AbstractEventLoop, + *, + client_max_size: int = 1024 ** 2, + state: Optional[Dict[str, Any]] = None, + scheme: Optional[str] = None, + host: Optional[str] = None, + remote: Optional[str] = None, + ) -> None: + if state is None: + state = {} + self._message = message + self._protocol = protocol + self._payload_writer = payload_writer + + self._payload = payload + self._headers = message.headers + self._method = message.method + self._version = message.version + self._rel_url = message.url + self._post = ( + None + ) # type: Optional[MultiDictProxy[Union[str, bytes, FileField]]] + self._read_bytes = None # type: Optional[bytes] + + self._state = state + self._cache = {} # type: Dict[str, Any] + self._task = task + self._client_max_size = client_max_size + self._loop = loop + + transport = self._protocol.transport + assert transport is not None + self._transport_sslcontext = transport.get_extra_info("sslcontext") + self._transport_peername = transport.get_extra_info("peername") + + if scheme is not None: + self._cache["scheme"] = scheme + if host is not None: + self._cache["host"] = host + if remote is not None: + self._cache["remote"] = remote + + def clone( + self, + *, + method: str = sentinel, + rel_url: StrOrURL = sentinel, + headers: LooseHeaders = sentinel, + scheme: str = sentinel, + host: str = sentinel, + remote: str = sentinel, + ) -> "BaseRequest": + """Clone itself with replacement some attributes. + + Creates and returns a new instance of Request object. If no parameters + are given, an exact copy is returned. If a parameter is not passed, it + will reuse the one from the current request object. + """ + if self._read_bytes: + raise RuntimeError("Cannot clone request " "after reading its content") + + dct = {} # type: Dict[str, Any] + if method is not sentinel: + dct["method"] = method + if rel_url is not sentinel: + new_url = URL(rel_url) + dct["url"] = new_url + dct["path"] = str(new_url) + if headers is not sentinel: + # a copy semantic + dct["headers"] = CIMultiDictProxy(CIMultiDict(headers)) + dct["raw_headers"] = tuple( + (k.encode("utf-8"), v.encode("utf-8")) for k, v in headers.items() + ) + + message = self._message._replace(**dct) + + kwargs = {} + if scheme is not sentinel: + kwargs["scheme"] = scheme + if host is not sentinel: + kwargs["host"] = host + if remote is not sentinel: + kwargs["remote"] = remote + + return self.__class__( + message, + self._payload, + self._protocol, + self._payload_writer, + self._task, + self._loop, + client_max_size=self._client_max_size, + state=self._state.copy(), + **kwargs, + ) + + @property + def task(self) -> "asyncio.Task[None]": + return self._task + + @property + def protocol(self) -> "RequestHandler": + return self._protocol + + @property + def transport(self) -> Optional[asyncio.Transport]: + if self._protocol is None: + return None + return self._protocol.transport + + @property + def writer(self) -> AbstractStreamWriter: + return self._payload_writer + + @reify + def message(self) -> RawRequestMessage: + warnings.warn("Request.message is deprecated", DeprecationWarning, stacklevel=3) + return self._message + + @reify + def rel_url(self) -> URL: + return self._rel_url + + @reify + def loop(self) -> asyncio.AbstractEventLoop: + warnings.warn( + "request.loop property is deprecated", DeprecationWarning, stacklevel=2 + ) + return self._loop + + # MutableMapping API + + def __getitem__(self, key: str) -> Any: + return self._state[key] + + def __setitem__(self, key: str, value: Any) -> None: + self._state[key] = value + + def __delitem__(self, key: str) -> None: + del self._state[key] + + def __len__(self) -> int: + return len(self._state) + + def __iter__(self) -> Iterator[str]: + return iter(self._state) + + ######## + + @reify + def secure(self) -> bool: + """A bool indicating if the request is handled with SSL.""" + return self.scheme == "https" + + @reify + def forwarded(self) -> Tuple[Mapping[str, str], ...]: + """A tuple containing all parsed Forwarded header(s). + + Makes an effort to parse Forwarded headers as specified by RFC 7239: + + - It adds one (immutable) dictionary per Forwarded 'field-value', ie + per proxy. The element corresponds to the data in the Forwarded + field-value added by the first proxy encountered by the client. Each + subsequent item corresponds to those added by later proxies. + - It checks that every value has valid syntax in general as specified + in section 4: either a 'token' or a 'quoted-string'. + - It un-escapes found escape sequences. + - It does NOT validate 'by' and 'for' contents as specified in section + 6. + - It does NOT validate 'host' contents (Host ABNF). + - It does NOT validate 'proto' contents for valid URI scheme names. + + Returns a tuple containing one or more immutable dicts + """ + elems = [] + for field_value in self._message.headers.getall(hdrs.FORWARDED, ()): + length = len(field_value) + pos = 0 + need_separator = False + elem = {} # type: Dict[str, str] + elems.append(types.MappingProxyType(elem)) + while 0 <= pos < length: + match = _FORWARDED_PAIR_RE.match(field_value, pos) + if match is not None: # got a valid forwarded-pair + if need_separator: + # bad syntax here, skip to next comma + pos = field_value.find(",", pos) + else: + name, value, port = match.groups() + if value[0] == '"': + # quoted string: remove quotes and unescape + value = _QUOTED_PAIR_REPLACE_RE.sub(r"\1", value[1:-1]) + if port: + value += port + elem[name.lower()] = value + pos += len(match.group(0)) + need_separator = True + elif field_value[pos] == ",": # next forwarded-element + need_separator = False + elem = {} + elems.append(types.MappingProxyType(elem)) + pos += 1 + elif field_value[pos] == ";": # next forwarded-pair + need_separator = False + pos += 1 + elif field_value[pos] in " \t": + # Allow whitespace even between forwarded-pairs, though + # RFC 7239 doesn't. This simplifies code and is in line + # with Postel's law. + pos += 1 + else: + # bad syntax here, skip to next comma + pos = field_value.find(",", pos) + return tuple(elems) + + @reify + def scheme(self) -> str: + """A string representing the scheme of the request. + + Hostname is resolved in this order: + + - overridden value by .clone(scheme=new_scheme) call. + - type of connection to peer: HTTPS if socket is SSL, HTTP otherwise. + + 'http' or 'https'. + """ + if self._transport_sslcontext: + return "https" + else: + return "http" + + @reify + def method(self) -> str: + """Read only property for getting HTTP method. + + The value is upper-cased str like 'GET', 'POST', 'PUT' etc. + """ + return self._method + + @reify + def version(self) -> HttpVersion: + """Read only property for getting HTTP version of request. + + Returns aiohttp.protocol.HttpVersion instance. + """ + return self._version + + @reify + def host(self) -> str: + """Hostname of the request. + + Hostname is resolved in this order: + + - overridden value by .clone(host=new_host) call. + - HOST HTTP header + - socket.getfqdn() value + """ + host = self._message.headers.get(hdrs.HOST) + if host is not None: + return host + return socket.getfqdn() + + @reify + def remote(self) -> Optional[str]: + """Remote IP of client initiated HTTP request. + + The IP is resolved in this order: + + - overridden value by .clone(remote=new_remote) call. + - peername of opened socket + """ + if self._transport_peername is None: + return None + if isinstance(self._transport_peername, (list, tuple)): + return str(self._transport_peername[0]) + return str(self._transport_peername) + + @reify + def url(self) -> URL: + url = URL.build(scheme=self.scheme, host=self.host) + return url.join(self._rel_url) + + @reify + def path(self) -> str: + """The URL including *PATH INFO* without the host or scheme. + + E.g., ``/app/blog`` + """ + return self._rel_url.path + + @reify + def path_qs(self) -> str: + """The URL including PATH_INFO and the query string. + + E.g, /app/blog?id=10 + """ + return str(self._rel_url) + + @reify + def raw_path(self) -> str: + """The URL including raw *PATH INFO* without the host or scheme. + + Warning, the path is unquoted and may contains non valid URL characters + + E.g., ``/my%2Fpath%7Cwith%21some%25strange%24characters`` + """ + return self._message.path + + @reify + def query(self) -> "MultiDictProxy[str]": + """A multidict with all the variables in the query string.""" + return MultiDictProxy(self._rel_url.query) + + @reify + def query_string(self) -> str: + """The query string in the URL. + + E.g., id=10 + """ + return self._rel_url.query_string + + @reify + def headers(self) -> "CIMultiDictProxy[str]": + """A case-insensitive multidict proxy with all headers.""" + return self._headers + + @reify + def raw_headers(self) -> RawHeaders: + """A sequence of pairs for all headers.""" + return self._message.raw_headers + + @reify + def if_modified_since(self) -> Optional[datetime.datetime]: + """The value of If-Modified-Since HTTP header, or None. + + This header is represented as a `datetime` object. + """ + return parse_http_date(self.headers.get(hdrs.IF_MODIFIED_SINCE)) + + @reify + def if_unmodified_since(self) -> Optional[datetime.datetime]: + """The value of If-Unmodified-Since HTTP header, or None. + + This header is represented as a `datetime` object. + """ + return parse_http_date(self.headers.get(hdrs.IF_UNMODIFIED_SINCE)) + + @staticmethod + def _etag_values(etag_header: str) -> Iterator[ETag]: + """Extract `ETag` objects from raw header.""" + if etag_header == ETAG_ANY: + yield ETag( + is_weak=False, + value=ETAG_ANY, + ) + else: + for match in LIST_QUOTED_ETAG_RE.finditer(etag_header): + is_weak, value, garbage = match.group(2, 3, 4) + # Any symbol captured by 4th group means + # that the following sequence is invalid. + if garbage: + break + + yield ETag( + is_weak=bool(is_weak), + value=value, + ) + + @classmethod + def _if_match_or_none_impl( + cls, header_value: Optional[str] + ) -> Optional[Tuple[ETag, ...]]: + if not header_value: + return None + + return tuple(cls._etag_values(header_value)) + + @reify + def if_match(self) -> Optional[Tuple[ETag, ...]]: + """The value of If-Match HTTP header, or None. + + This header is represented as a `tuple` of `ETag` objects. + """ + return self._if_match_or_none_impl(self.headers.get(hdrs.IF_MATCH)) + + @reify + def if_none_match(self) -> Optional[Tuple[ETag, ...]]: + """The value of If-None-Match HTTP header, or None. + + This header is represented as a `tuple` of `ETag` objects. + """ + return self._if_match_or_none_impl(self.headers.get(hdrs.IF_NONE_MATCH)) + + @reify + def if_range(self) -> Optional[datetime.datetime]: + """The value of If-Range HTTP header, or None. + + This header is represented as a `datetime` object. + """ + return parse_http_date(self.headers.get(hdrs.IF_RANGE)) + + @reify + def keep_alive(self) -> bool: + """Is keepalive enabled by client?""" + return not self._message.should_close + + @reify + def cookies(self) -> Mapping[str, str]: + """Return request cookies. + + A read-only dictionary-like object. + """ + raw = self.headers.get(hdrs.COOKIE, "") + parsed = SimpleCookie(raw) # type: SimpleCookie[str] + return MappingProxyType({key: val.value for key, val in parsed.items()}) + + @reify + def http_range(self) -> slice: + """The content of Range HTTP header. + + Return a slice instance. + + """ + rng = self._headers.get(hdrs.RANGE) + start, end = None, None + if rng is not None: + try: + pattern = r"^bytes=(\d*)-(\d*)$" + start, end = re.findall(pattern, rng)[0] + except IndexError: # pattern was not found in header + raise ValueError("range not in acceptable format") + + end = int(end) if end else None + start = int(start) if start else None + + if start is None and end is not None: + # end with no start is to return tail of content + start = -end + end = None + + if start is not None and end is not None: + # end is inclusive in range header, exclusive for slice + end += 1 + + if start >= end: + raise ValueError("start cannot be after end") + + if start is end is None: # No valid range supplied + raise ValueError("No start or end of range specified") + + return slice(start, end, 1) + + @reify + def content(self) -> StreamReader: + """Return raw payload stream.""" + return self._payload + + @property + def has_body(self) -> bool: + """Return True if request's HTTP BODY can be read, False otherwise.""" + warnings.warn( + "Deprecated, use .can_read_body #2005", DeprecationWarning, stacklevel=2 + ) + return not self._payload.at_eof() + + @property + def can_read_body(self) -> bool: + """Return True if request's HTTP BODY can be read, False otherwise.""" + return not self._payload.at_eof() + + @reify + def body_exists(self) -> bool: + """Return True if request has HTTP BODY, False otherwise.""" + return type(self._payload) is not EmptyStreamReader + + async def release(self) -> None: + """Release request. + + Eat unread part of HTTP BODY if present. + """ + while not self._payload.at_eof(): + await self._payload.readany() + + async def read(self) -> bytes: + """Read request body if present. + + Returns bytes object with full request content. + """ + if self._read_bytes is None: + body = bytearray() + while True: + chunk = await self._payload.readany() + body.extend(chunk) + if self._client_max_size: + body_size = len(body) + if body_size >= self._client_max_size: + raise HTTPRequestEntityTooLarge( + max_size=self._client_max_size, actual_size=body_size + ) + if not chunk: + break + self._read_bytes = bytes(body) + return self._read_bytes + + async def text(self) -> str: + """Return BODY as text using encoding from .charset.""" + bytes_body = await self.read() + encoding = self.charset or "utf-8" + return bytes_body.decode(encoding) + + async def json(self, *, loads: JSONDecoder = DEFAULT_JSON_DECODER) -> Any: + """Return BODY as JSON.""" + body = await self.text() + return loads(body) + + async def multipart(self) -> MultipartReader: + """Return async iterator to process BODY as multipart.""" + return MultipartReader(self._headers, self._payload) + + async def post(self) -> "MultiDictProxy[Union[str, bytes, FileField]]": + """Return POST parameters.""" + if self._post is not None: + return self._post + if self._method not in self.POST_METHODS: + self._post = MultiDictProxy(MultiDict()) + return self._post + + content_type = self.content_type + if content_type not in ( + "", + "application/x-www-form-urlencoded", + "multipart/form-data", + ): + self._post = MultiDictProxy(MultiDict()) + return self._post + + out = MultiDict() # type: MultiDict[Union[str, bytes, FileField]] + + if content_type == "multipart/form-data": + multipart = await self.multipart() + max_size = self._client_max_size + + field = await multipart.next() + while field is not None: + size = 0 + field_ct = field.headers.get(hdrs.CONTENT_TYPE) + + if isinstance(field, BodyPartReader): + assert field.name is not None + + # Note that according to RFC 7578, the Content-Type header + # is optional, even for files, so we can't assume it's + # present. + # https://tools.ietf.org/html/rfc7578#section-4.4 + if field.filename: + # store file in temp file + tmp = tempfile.TemporaryFile() + chunk = await field.read_chunk(size=2 ** 16) + while chunk: + chunk = field.decode(chunk) + tmp.write(chunk) + size += len(chunk) + if 0 < max_size < size: + tmp.close() + raise HTTPRequestEntityTooLarge( + max_size=max_size, actual_size=size + ) + chunk = await field.read_chunk(size=2 ** 16) + tmp.seek(0) + + if field_ct is None: + field_ct = "application/octet-stream" + + ff = FileField( + field.name, + field.filename, + cast(io.BufferedReader, tmp), + field_ct, + field.headers, + ) + out.add(field.name, ff) + else: + # deal with ordinary data + value = await field.read(decode=True) + if field_ct is None or field_ct.startswith("text/"): + charset = field.get_charset(default="utf-8") + out.add(field.name, value.decode(charset)) + else: + out.add(field.name, value) + size += len(value) + if 0 < max_size < size: + raise HTTPRequestEntityTooLarge( + max_size=max_size, actual_size=size + ) + else: + raise ValueError( + "To decode nested multipart you need " "to use custom reader", + ) + + field = await multipart.next() + else: + data = await self.read() + if data: + charset = self.charset or "utf-8" + out.extend( + parse_qsl( + data.rstrip().decode(charset), + keep_blank_values=True, + encoding=charset, + ) + ) + + self._post = MultiDictProxy(out) + return self._post + + def get_extra_info(self, name: str, default: Any = None) -> Any: + """Extra info from protocol transport""" + protocol = self._protocol + if protocol is None: + return default + + transport = protocol.transport + if transport is None: + return default + + return transport.get_extra_info(name, default) + + def __repr__(self) -> str: + ascii_encodable_path = self.path.encode("ascii", "backslashreplace").decode( + "ascii" + ) + return "<{} {} {} >".format( + self.__class__.__name__, self._method, ascii_encodable_path + ) + + def __eq__(self, other: object) -> bool: + return id(self) == id(other) + + def __bool__(self) -> bool: + return True + + async def _prepare_hook(self, response: StreamResponse) -> None: + return + + def _cancel(self, exc: BaseException) -> None: + self._payload.set_exception(exc) + + +class Request(BaseRequest): + + ATTRS = BaseRequest.ATTRS | frozenset(["_match_info"]) + + def __init__(self, *args: Any, **kwargs: Any) -> None: + super().__init__(*args, **kwargs) + + # matchdict, route_name, handler + # or information about traversal lookup + + # initialized after route resolving + self._match_info = None # type: Optional[UrlMappingMatchInfo] + + if DEBUG: + + def __setattr__(self, name: str, val: Any) -> None: + if name not in self.ATTRS: + warnings.warn( + "Setting custom {}.{} attribute " + "is discouraged".format(self.__class__.__name__, name), + DeprecationWarning, + stacklevel=2, + ) + super().__setattr__(name, val) + + def clone( + self, + *, + method: str = sentinel, + rel_url: StrOrURL = sentinel, + headers: LooseHeaders = sentinel, + scheme: str = sentinel, + host: str = sentinel, + remote: str = sentinel, + ) -> "Request": + ret = super().clone( + method=method, + rel_url=rel_url, + headers=headers, + scheme=scheme, + host=host, + remote=remote, + ) + new_ret = cast(Request, ret) + new_ret._match_info = self._match_info + return new_ret + + @reify + def match_info(self) -> "UrlMappingMatchInfo": + """Result of route resolving.""" + match_info = self._match_info + assert match_info is not None + return match_info + + @property + def app(self) -> "Application": + """Application instance.""" + match_info = self._match_info + assert match_info is not None + return match_info.current_app + + @property + def config_dict(self) -> ChainMapProxy: + match_info = self._match_info + assert match_info is not None + lst = match_info.apps + app = self.app + idx = lst.index(app) + sublist = list(reversed(lst[: idx + 1])) + return ChainMapProxy(sublist) + + async def _prepare_hook(self, response: StreamResponse) -> None: + match_info = self._match_info + if match_info is None: + return + for app in match_info._apps: + await app.on_response_prepare.send(self, response) diff --git a/sbsheriff/Lib/site-packages/aiohttp/web_response.py b/sbsheriff/Lib/site-packages/aiohttp/web_response.py new file mode 100644 index 0000000..7880ab2 --- /dev/null +++ b/sbsheriff/Lib/site-packages/aiohttp/web_response.py @@ -0,0 +1,825 @@ +import asyncio +import collections.abc +import datetime +import enum +import json +import math +import time +import warnings +import zlib +from concurrent.futures import Executor +from http.cookies import Morsel, SimpleCookie +from typing import ( + TYPE_CHECKING, + Any, + Dict, + Iterator, + Mapping, + MutableMapping, + Optional, + Tuple, + Union, + cast, +) + +from multidict import CIMultiDict, istr + +from . import hdrs, payload +from .abc import AbstractStreamWriter +from .helpers import ( + ETAG_ANY, + PY_38, + QUOTED_ETAG_RE, + ETag, + HeadersMixin, + parse_http_date, + rfc822_formatted_time, + sentinel, + validate_etag_value, +) +from .http import RESPONSES, SERVER_SOFTWARE, HttpVersion10, HttpVersion11 +from .payload import Payload +from .typedefs import JSONEncoder, LooseHeaders + +__all__ = ("ContentCoding", "StreamResponse", "Response", "json_response") + + +if TYPE_CHECKING: # pragma: no cover + from .web_request import BaseRequest + + BaseClass = MutableMapping[str, Any] +else: + BaseClass = collections.abc.MutableMapping + + +if not PY_38: + # allow samesite to be used in python < 3.8 + # already permitted in python 3.8, see https://bugs.python.org/issue29613 + Morsel._reserved["samesite"] = "SameSite" # type: ignore[attr-defined] + + +class ContentCoding(enum.Enum): + # The content codings that we have support for. + # + # Additional registered codings are listed at: + # https://www.iana.org/assignments/http-parameters/http-parameters.xhtml#content-coding + deflate = "deflate" + gzip = "gzip" + identity = "identity" + + +############################################################ +# HTTP Response classes +############################################################ + + +class StreamResponse(BaseClass, HeadersMixin): + + _length_check = True + + def __init__( + self, + *, + status: int = 200, + reason: Optional[str] = None, + headers: Optional[LooseHeaders] = None, + ) -> None: + self._body = None + self._keep_alive = None # type: Optional[bool] + self._chunked = False + self._compression = False + self._compression_force = None # type: Optional[ContentCoding] + self._cookies = SimpleCookie() # type: SimpleCookie[str] + + self._req = None # type: Optional[BaseRequest] + self._payload_writer = None # type: Optional[AbstractStreamWriter] + self._eof_sent = False + self._body_length = 0 + self._state = {} # type: Dict[str, Any] + + if headers is not None: + self._headers = CIMultiDict(headers) # type: CIMultiDict[str] + else: + self._headers = CIMultiDict() + + self.set_status(status, reason) + + @property + def prepared(self) -> bool: + return self._payload_writer is not None + + @property + def task(self) -> "Optional[asyncio.Task[None]]": + if self._req: + return self._req.task + else: + return None + + @property + def status(self) -> int: + return self._status + + @property + def chunked(self) -> bool: + return self._chunked + + @property + def compression(self) -> bool: + return self._compression + + @property + def reason(self) -> str: + return self._reason + + def set_status( + self, + status: int, + reason: Optional[str] = None, + _RESPONSES: Mapping[int, Tuple[str, str]] = RESPONSES, + ) -> None: + assert not self.prepared, ( + "Cannot change the response status code after " "the headers have been sent" + ) + self._status = int(status) + if reason is None: + try: + reason = _RESPONSES[self._status][0] + except Exception: + reason = "" + self._reason = reason + + @property + def keep_alive(self) -> Optional[bool]: + return self._keep_alive + + def force_close(self) -> None: + self._keep_alive = False + + @property + def body_length(self) -> int: + return self._body_length + + @property + def output_length(self) -> int: + warnings.warn("output_length is deprecated", DeprecationWarning) + assert self._payload_writer + return self._payload_writer.buffer_size + + def enable_chunked_encoding(self, chunk_size: Optional[int] = None) -> None: + """Enables automatic chunked transfer encoding.""" + self._chunked = True + + if hdrs.CONTENT_LENGTH in self._headers: + raise RuntimeError( + "You can't enable chunked encoding when " "a content length is set" + ) + if chunk_size is not None: + warnings.warn("Chunk size is deprecated #1615", DeprecationWarning) + + def enable_compression( + self, force: Optional[Union[bool, ContentCoding]] = None + ) -> None: + """Enables response compression encoding.""" + # Backwards compatibility for when force was a bool <0.17. + if type(force) == bool: + force = ContentCoding.deflate if force else ContentCoding.identity + warnings.warn( + "Using boolean for force is deprecated #3318", DeprecationWarning + ) + elif force is not None: + assert isinstance(force, ContentCoding), ( + "force should one of " "None, bool or " "ContentEncoding" + ) + + self._compression = True + self._compression_force = force + + @property + def headers(self) -> "CIMultiDict[str]": + return self._headers + + @property + def cookies(self) -> "SimpleCookie[str]": + return self._cookies + + def set_cookie( + self, + name: str, + value: str, + *, + expires: Optional[str] = None, + domain: Optional[str] = None, + max_age: Optional[Union[int, str]] = None, + path: str = "/", + secure: Optional[bool] = None, + httponly: Optional[bool] = None, + version: Optional[str] = None, + samesite: Optional[str] = None, + ) -> None: + """Set or update response cookie. + + Sets new cookie or updates existent with new value. + Also updates only those params which are not None. + """ + old = self._cookies.get(name) + if old is not None and old.coded_value == "": + # deleted cookie + self._cookies.pop(name, None) + + self._cookies[name] = value + c = self._cookies[name] + + if expires is not None: + c["expires"] = expires + elif c.get("expires") == "Thu, 01 Jan 1970 00:00:00 GMT": + del c["expires"] + + if domain is not None: + c["domain"] = domain + + if max_age is not None: + c["max-age"] = str(max_age) + elif "max-age" in c: + del c["max-age"] + + c["path"] = path + + if secure is not None: + c["secure"] = secure + if httponly is not None: + c["httponly"] = httponly + if version is not None: + c["version"] = version + if samesite is not None: + c["samesite"] = samesite + + def del_cookie( + self, name: str, *, domain: Optional[str] = None, path: str = "/" + ) -> None: + """Delete cookie. + + Creates new empty expired cookie. + """ + # TODO: do we need domain/path here? + self._cookies.pop(name, None) + self.set_cookie( + name, + "", + max_age=0, + expires="Thu, 01 Jan 1970 00:00:00 GMT", + domain=domain, + path=path, + ) + + @property + def content_length(self) -> Optional[int]: + # Just a placeholder for adding setter + return super().content_length + + @content_length.setter + def content_length(self, value: Optional[int]) -> None: + if value is not None: + value = int(value) + if self._chunked: + raise RuntimeError( + "You can't set content length when " "chunked encoding is enable" + ) + self._headers[hdrs.CONTENT_LENGTH] = str(value) + else: + self._headers.pop(hdrs.CONTENT_LENGTH, None) + + @property + def content_type(self) -> str: + # Just a placeholder for adding setter + return super().content_type + + @content_type.setter + def content_type(self, value: str) -> None: + self.content_type # read header values if needed + self._content_type = str(value) + self._generate_content_type_header() + + @property + def charset(self) -> Optional[str]: + # Just a placeholder for adding setter + return super().charset + + @charset.setter + def charset(self, value: Optional[str]) -> None: + ctype = self.content_type # read header values if needed + if ctype == "application/octet-stream": + raise RuntimeError( + "Setting charset for application/octet-stream " + "doesn't make sense, setup content_type first" + ) + assert self._content_dict is not None + if value is None: + self._content_dict.pop("charset", None) + else: + self._content_dict["charset"] = str(value).lower() + self._generate_content_type_header() + + @property + def last_modified(self) -> Optional[datetime.datetime]: + """The value of Last-Modified HTTP header, or None. + + This header is represented as a `datetime` object. + """ + return parse_http_date(self._headers.get(hdrs.LAST_MODIFIED)) + + @last_modified.setter + def last_modified( + self, value: Optional[Union[int, float, datetime.datetime, str]] + ) -> None: + if value is None: + self._headers.pop(hdrs.LAST_MODIFIED, None) + elif isinstance(value, (int, float)): + self._headers[hdrs.LAST_MODIFIED] = time.strftime( + "%a, %d %b %Y %H:%M:%S GMT", time.gmtime(math.ceil(value)) + ) + elif isinstance(value, datetime.datetime): + self._headers[hdrs.LAST_MODIFIED] = time.strftime( + "%a, %d %b %Y %H:%M:%S GMT", value.utctimetuple() + ) + elif isinstance(value, str): + self._headers[hdrs.LAST_MODIFIED] = value + + @property + def etag(self) -> Optional[ETag]: + quoted_value = self._headers.get(hdrs.ETAG) + if not quoted_value: + return None + elif quoted_value == ETAG_ANY: + return ETag(value=ETAG_ANY) + match = QUOTED_ETAG_RE.fullmatch(quoted_value) + if not match: + return None + is_weak, value = match.group(1, 2) + return ETag( + is_weak=bool(is_weak), + value=value, + ) + + @etag.setter + def etag(self, value: Optional[Union[ETag, str]]) -> None: + if value is None: + self._headers.pop(hdrs.ETAG, None) + elif (isinstance(value, str) and value == ETAG_ANY) or ( + isinstance(value, ETag) and value.value == ETAG_ANY + ): + self._headers[hdrs.ETAG] = ETAG_ANY + elif isinstance(value, str): + validate_etag_value(value) + self._headers[hdrs.ETAG] = f'"{value}"' + elif isinstance(value, ETag) and isinstance(value.value, str): + validate_etag_value(value.value) + hdr_value = f'W/"{value.value}"' if value.is_weak else f'"{value.value}"' + self._headers[hdrs.ETAG] = hdr_value + else: + raise ValueError( + f"Unsupported etag type: {type(value)}. " + f"etag must be str, ETag or None" + ) + + def _generate_content_type_header( + self, CONTENT_TYPE: istr = hdrs.CONTENT_TYPE + ) -> None: + assert self._content_dict is not None + assert self._content_type is not None + params = "; ".join(f"{k}={v}" for k, v in self._content_dict.items()) + if params: + ctype = self._content_type + "; " + params + else: + ctype = self._content_type + self._headers[CONTENT_TYPE] = ctype + + async def _do_start_compression(self, coding: ContentCoding) -> None: + if coding != ContentCoding.identity: + assert self._payload_writer is not None + self._headers[hdrs.CONTENT_ENCODING] = coding.value + self._payload_writer.enable_compression(coding.value) + # Compressed payload may have different content length, + # remove the header + self._headers.popall(hdrs.CONTENT_LENGTH, None) + + async def _start_compression(self, request: "BaseRequest") -> None: + if self._compression_force: + await self._do_start_compression(self._compression_force) + else: + accept_encoding = request.headers.get(hdrs.ACCEPT_ENCODING, "").lower() + for coding in ContentCoding: + if coding.value in accept_encoding: + await self._do_start_compression(coding) + return + + async def prepare(self, request: "BaseRequest") -> Optional[AbstractStreamWriter]: + if self._eof_sent: + return None + if self._payload_writer is not None: + return self._payload_writer + + return await self._start(request) + + async def _start(self, request: "BaseRequest") -> AbstractStreamWriter: + self._req = request + writer = self._payload_writer = request._payload_writer + + await self._prepare_headers() + await request._prepare_hook(self) + await self._write_headers() + + return writer + + async def _prepare_headers(self) -> None: + request = self._req + assert request is not None + writer = self._payload_writer + assert writer is not None + keep_alive = self._keep_alive + if keep_alive is None: + keep_alive = request.keep_alive + self._keep_alive = keep_alive + + version = request.version + + headers = self._headers + for cookie in self._cookies.values(): + value = cookie.output(header="")[1:] + headers.add(hdrs.SET_COOKIE, value) + + if self._compression: + await self._start_compression(request) + + if self._chunked: + if version != HttpVersion11: + raise RuntimeError( + "Using chunked encoding is forbidden " + "for HTTP/{0.major}.{0.minor}".format(request.version) + ) + writer.enable_chunking() + headers[hdrs.TRANSFER_ENCODING] = "chunked" + if hdrs.CONTENT_LENGTH in headers: + del headers[hdrs.CONTENT_LENGTH] + elif self._length_check: + writer.length = self.content_length + if writer.length is None: + if version >= HttpVersion11 and self.status != 204: + writer.enable_chunking() + headers[hdrs.TRANSFER_ENCODING] = "chunked" + if hdrs.CONTENT_LENGTH in headers: + del headers[hdrs.CONTENT_LENGTH] + else: + keep_alive = False + # HTTP 1.1: https://tools.ietf.org/html/rfc7230#section-3.3.2 + # HTTP 1.0: https://tools.ietf.org/html/rfc1945#section-10.4 + elif version >= HttpVersion11 and self.status in (100, 101, 102, 103, 204): + del headers[hdrs.CONTENT_LENGTH] + + if self.status not in (204, 304): + headers.setdefault(hdrs.CONTENT_TYPE, "application/octet-stream") + headers.setdefault(hdrs.DATE, rfc822_formatted_time()) + headers.setdefault(hdrs.SERVER, SERVER_SOFTWARE) + + # connection header + if hdrs.CONNECTION not in headers: + if keep_alive: + if version == HttpVersion10: + headers[hdrs.CONNECTION] = "keep-alive" + else: + if version == HttpVersion11: + headers[hdrs.CONNECTION] = "close" + + async def _write_headers(self) -> None: + request = self._req + assert request is not None + writer = self._payload_writer + assert writer is not None + # status line + version = request.version + status_line = "HTTP/{}.{} {} {}".format( + version[0], version[1], self._status, self._reason + ) + await writer.write_headers(status_line, self._headers) + + async def write(self, data: bytes) -> None: + assert isinstance( + data, (bytes, bytearray, memoryview) + ), "data argument must be byte-ish (%r)" % type(data) + + if self._eof_sent: + raise RuntimeError("Cannot call write() after write_eof()") + if self._payload_writer is None: + raise RuntimeError("Cannot call write() before prepare()") + + await self._payload_writer.write(data) + + async def drain(self) -> None: + assert not self._eof_sent, "EOF has already been sent" + assert self._payload_writer is not None, "Response has not been started" + warnings.warn( + "drain method is deprecated, use await resp.write()", + DeprecationWarning, + stacklevel=2, + ) + await self._payload_writer.drain() + + async def write_eof(self, data: bytes = b"") -> None: + assert isinstance( + data, (bytes, bytearray, memoryview) + ), "data argument must be byte-ish (%r)" % type(data) + + if self._eof_sent: + return + + assert self._payload_writer is not None, "Response has not been started" + + await self._payload_writer.write_eof(data) + self._eof_sent = True + self._req = None + self._body_length = self._payload_writer.output_size + self._payload_writer = None + + def __repr__(self) -> str: + if self._eof_sent: + info = "eof" + elif self.prepared: + assert self._req is not None + info = f"{self._req.method} {self._req.path} " + else: + info = "not prepared" + return f"<{self.__class__.__name__} {self.reason} {info}>" + + def __getitem__(self, key: str) -> Any: + return self._state[key] + + def __setitem__(self, key: str, value: Any) -> None: + self._state[key] = value + + def __delitem__(self, key: str) -> None: + del self._state[key] + + def __len__(self) -> int: + return len(self._state) + + def __iter__(self) -> Iterator[str]: + return iter(self._state) + + def __hash__(self) -> int: + return hash(id(self)) + + def __eq__(self, other: object) -> bool: + return self is other + + +class Response(StreamResponse): + def __init__( + self, + *, + body: Any = None, + status: int = 200, + reason: Optional[str] = None, + text: Optional[str] = None, + headers: Optional[LooseHeaders] = None, + content_type: Optional[str] = None, + charset: Optional[str] = None, + zlib_executor_size: Optional[int] = None, + zlib_executor: Optional[Executor] = None, + ) -> None: + if body is not None and text is not None: + raise ValueError("body and text are not allowed together") + + if headers is None: + real_headers = CIMultiDict() # type: CIMultiDict[str] + elif not isinstance(headers, CIMultiDict): + real_headers = CIMultiDict(headers) + else: + real_headers = headers # = cast('CIMultiDict[str]', headers) + + if content_type is not None and "charset" in content_type: + raise ValueError("charset must not be in content_type " "argument") + + if text is not None: + if hdrs.CONTENT_TYPE in real_headers: + if content_type or charset: + raise ValueError( + "passing both Content-Type header and " + "content_type or charset params " + "is forbidden" + ) + else: + # fast path for filling headers + if not isinstance(text, str): + raise TypeError("text argument must be str (%r)" % type(text)) + if content_type is None: + content_type = "text/plain" + if charset is None: + charset = "utf-8" + real_headers[hdrs.CONTENT_TYPE] = content_type + "; charset=" + charset + body = text.encode(charset) + text = None + else: + if hdrs.CONTENT_TYPE in real_headers: + if content_type is not None or charset is not None: + raise ValueError( + "passing both Content-Type header and " + "content_type or charset params " + "is forbidden" + ) + else: + if content_type is not None: + if charset is not None: + content_type += "; charset=" + charset + real_headers[hdrs.CONTENT_TYPE] = content_type + + super().__init__(status=status, reason=reason, headers=real_headers) + + if text is not None: + self.text = text + else: + self.body = body + + self._compressed_body = None # type: Optional[bytes] + self._zlib_executor_size = zlib_executor_size + self._zlib_executor = zlib_executor + + @property + def body(self) -> Optional[Union[bytes, Payload]]: + return self._body + + @body.setter + def body( + self, + body: bytes, + CONTENT_TYPE: istr = hdrs.CONTENT_TYPE, + CONTENT_LENGTH: istr = hdrs.CONTENT_LENGTH, + ) -> None: + if body is None: + self._body = None # type: Optional[bytes] + self._body_payload = False # type: bool + elif isinstance(body, (bytes, bytearray)): + self._body = body + self._body_payload = False + else: + try: + self._body = body = payload.PAYLOAD_REGISTRY.get(body) + except payload.LookupError: + raise ValueError("Unsupported body type %r" % type(body)) + + self._body_payload = True + + headers = self._headers + + # set content-length header if needed + if not self._chunked and CONTENT_LENGTH not in headers: + size = body.size + if size is not None: + headers[CONTENT_LENGTH] = str(size) + + # set content-type + if CONTENT_TYPE not in headers: + headers[CONTENT_TYPE] = body.content_type + + # copy payload headers + if body.headers: + for (key, value) in body.headers.items(): + if key not in headers: + headers[key] = value + + self._compressed_body = None + + @property + def text(self) -> Optional[str]: + if self._body is None: + return None + return self._body.decode(self.charset or "utf-8") + + @text.setter + def text(self, text: str) -> None: + assert text is None or isinstance( + text, str + ), "text argument must be str (%r)" % type(text) + + if self.content_type == "application/octet-stream": + self.content_type = "text/plain" + if self.charset is None: + self.charset = "utf-8" + + self._body = text.encode(self.charset) + self._body_payload = False + self._compressed_body = None + + @property + def content_length(self) -> Optional[int]: + if self._chunked: + return None + + if hdrs.CONTENT_LENGTH in self._headers: + return super().content_length + + if self._compressed_body is not None: + # Return length of the compressed body + return len(self._compressed_body) + elif self._body_payload: + # A payload without content length, or a compressed payload + return None + elif self._body is not None: + return len(self._body) + else: + return 0 + + @content_length.setter + def content_length(self, value: Optional[int]) -> None: + raise RuntimeError("Content length is set automatically") + + async def write_eof(self, data: bytes = b"") -> None: + if self._eof_sent: + return + if self._compressed_body is None: + body = self._body # type: Optional[Union[bytes, Payload]] + else: + body = self._compressed_body + assert not data, f"data arg is not supported, got {data!r}" + assert self._req is not None + assert self._payload_writer is not None + if body is not None: + if self._req._method == hdrs.METH_HEAD or self._status in [204, 304]: + await super().write_eof() + elif self._body_payload: + payload = cast(Payload, body) + await payload.write(self._payload_writer) + await super().write_eof() + else: + await super().write_eof(cast(bytes, body)) + else: + await super().write_eof() + + async def _start(self, request: "BaseRequest") -> AbstractStreamWriter: + if not self._chunked and hdrs.CONTENT_LENGTH not in self._headers: + if not self._body_payload: + if self._body is not None: + self._headers[hdrs.CONTENT_LENGTH] = str(len(self._body)) + else: + self._headers[hdrs.CONTENT_LENGTH] = "0" + + return await super()._start(request) + + def _compress_body(self, zlib_mode: int) -> None: + assert zlib_mode > 0 + compressobj = zlib.compressobj(wbits=zlib_mode) + body_in = self._body + assert body_in is not None + self._compressed_body = compressobj.compress(body_in) + compressobj.flush() + + async def _do_start_compression(self, coding: ContentCoding) -> None: + if self._body_payload or self._chunked: + return await super()._do_start_compression(coding) + + if coding != ContentCoding.identity: + # Instead of using _payload_writer.enable_compression, + # compress the whole body + zlib_mode = ( + 16 + zlib.MAX_WBITS if coding == ContentCoding.gzip else zlib.MAX_WBITS + ) + body_in = self._body + assert body_in is not None + if ( + self._zlib_executor_size is not None + and len(body_in) > self._zlib_executor_size + ): + await asyncio.get_event_loop().run_in_executor( + self._zlib_executor, self._compress_body, zlib_mode + ) + else: + self._compress_body(zlib_mode) + + body_out = self._compressed_body + assert body_out is not None + + self._headers[hdrs.CONTENT_ENCODING] = coding.value + self._headers[hdrs.CONTENT_LENGTH] = str(len(body_out)) + + +def json_response( + data: Any = sentinel, + *, + text: Optional[str] = None, + body: Optional[bytes] = None, + status: int = 200, + reason: Optional[str] = None, + headers: Optional[LooseHeaders] = None, + content_type: str = "application/json", + dumps: JSONEncoder = json.dumps, +) -> Response: + if data is not sentinel: + if text or body: + raise ValueError("only one of data, text, or body should be specified") + else: + text = dumps(data) + return Response( + text=text, + body=body, + status=status, + reason=reason, + headers=headers, + content_type=content_type, + ) diff --git a/sbsheriff/Lib/site-packages/aiohttp/web_routedef.py b/sbsheriff/Lib/site-packages/aiohttp/web_routedef.py new file mode 100644 index 0000000..671e5c7 --- /dev/null +++ b/sbsheriff/Lib/site-packages/aiohttp/web_routedef.py @@ -0,0 +1,213 @@ +import abc +import os # noqa +from typing import ( + TYPE_CHECKING, + Any, + Callable, + Dict, + Iterator, + List, + Optional, + Sequence, + Type, + Union, + overload, +) + +import attr + +from . import hdrs +from .abc import AbstractView +from .typedefs import Handler, PathLike + +if TYPE_CHECKING: # pragma: no cover + from .web_request import Request + from .web_response import StreamResponse + from .web_urldispatcher import AbstractRoute, UrlDispatcher +else: + Request = StreamResponse = UrlDispatcher = AbstractRoute = None + + +__all__ = ( + "AbstractRouteDef", + "RouteDef", + "StaticDef", + "RouteTableDef", + "head", + "options", + "get", + "post", + "patch", + "put", + "delete", + "route", + "view", + "static", +) + + +class AbstractRouteDef(abc.ABC): + @abc.abstractmethod + def register(self, router: UrlDispatcher) -> List[AbstractRoute]: + pass # pragma: no cover + + +_HandlerType = Union[Type[AbstractView], Handler] + + +@attr.s(auto_attribs=True, frozen=True, repr=False, slots=True) +class RouteDef(AbstractRouteDef): + method: str + path: str + handler: _HandlerType + kwargs: Dict[str, Any] + + def __repr__(self) -> str: + info = [] + for name, value in sorted(self.kwargs.items()): + info.append(f", {name}={value!r}") + return " {handler.__name__!r}" "{info}>".format( + method=self.method, path=self.path, handler=self.handler, info="".join(info) + ) + + def register(self, router: UrlDispatcher) -> List[AbstractRoute]: + if self.method in hdrs.METH_ALL: + reg = getattr(router, "add_" + self.method.lower()) + return [reg(self.path, self.handler, **self.kwargs)] + else: + return [ + router.add_route(self.method, self.path, self.handler, **self.kwargs) + ] + + +@attr.s(auto_attribs=True, frozen=True, repr=False, slots=True) +class StaticDef(AbstractRouteDef): + prefix: str + path: PathLike + kwargs: Dict[str, Any] + + def __repr__(self) -> str: + info = [] + for name, value in sorted(self.kwargs.items()): + info.append(f", {name}={value!r}") + return " {path}" "{info}>".format( + prefix=self.prefix, path=self.path, info="".join(info) + ) + + def register(self, router: UrlDispatcher) -> List[AbstractRoute]: + resource = router.add_static(self.prefix, self.path, **self.kwargs) + routes = resource.get_info().get("routes", {}) + return list(routes.values()) + + +def route(method: str, path: str, handler: _HandlerType, **kwargs: Any) -> RouteDef: + return RouteDef(method, path, handler, kwargs) + + +def head(path: str, handler: _HandlerType, **kwargs: Any) -> RouteDef: + return route(hdrs.METH_HEAD, path, handler, **kwargs) + + +def options(path: str, handler: _HandlerType, **kwargs: Any) -> RouteDef: + return route(hdrs.METH_OPTIONS, path, handler, **kwargs) + + +def get( + path: str, + handler: _HandlerType, + *, + name: Optional[str] = None, + allow_head: bool = True, + **kwargs: Any, +) -> RouteDef: + return route( + hdrs.METH_GET, path, handler, name=name, allow_head=allow_head, **kwargs + ) + + +def post(path: str, handler: _HandlerType, **kwargs: Any) -> RouteDef: + return route(hdrs.METH_POST, path, handler, **kwargs) + + +def put(path: str, handler: _HandlerType, **kwargs: Any) -> RouteDef: + return route(hdrs.METH_PUT, path, handler, **kwargs) + + +def patch(path: str, handler: _HandlerType, **kwargs: Any) -> RouteDef: + return route(hdrs.METH_PATCH, path, handler, **kwargs) + + +def delete(path: str, handler: _HandlerType, **kwargs: Any) -> RouteDef: + return route(hdrs.METH_DELETE, path, handler, **kwargs) + + +def view(path: str, handler: Type[AbstractView], **kwargs: Any) -> RouteDef: + return route(hdrs.METH_ANY, path, handler, **kwargs) + + +def static(prefix: str, path: PathLike, **kwargs: Any) -> StaticDef: + return StaticDef(prefix, path, kwargs) + + +_Deco = Callable[[_HandlerType], _HandlerType] + + +class RouteTableDef(Sequence[AbstractRouteDef]): + """Route definition table""" + + def __init__(self) -> None: + self._items = [] # type: List[AbstractRouteDef] + + def __repr__(self) -> str: + return f"" + + @overload + def __getitem__(self, index: int) -> AbstractRouteDef: + ... + + @overload + def __getitem__(self, index: slice) -> List[AbstractRouteDef]: + ... + + def __getitem__(self, index): # type: ignore[no-untyped-def] + return self._items[index] + + def __iter__(self) -> Iterator[AbstractRouteDef]: + return iter(self._items) + + def __len__(self) -> int: + return len(self._items) + + def __contains__(self, item: object) -> bool: + return item in self._items + + def route(self, method: str, path: str, **kwargs: Any) -> _Deco: + def inner(handler: _HandlerType) -> _HandlerType: + self._items.append(RouteDef(method, path, handler, kwargs)) + return handler + + return inner + + def head(self, path: str, **kwargs: Any) -> _Deco: + return self.route(hdrs.METH_HEAD, path, **kwargs) + + def get(self, path: str, **kwargs: Any) -> _Deco: + return self.route(hdrs.METH_GET, path, **kwargs) + + def post(self, path: str, **kwargs: Any) -> _Deco: + return self.route(hdrs.METH_POST, path, **kwargs) + + def put(self, path: str, **kwargs: Any) -> _Deco: + return self.route(hdrs.METH_PUT, path, **kwargs) + + def patch(self, path: str, **kwargs: Any) -> _Deco: + return self.route(hdrs.METH_PATCH, path, **kwargs) + + def delete(self, path: str, **kwargs: Any) -> _Deco: + return self.route(hdrs.METH_DELETE, path, **kwargs) + + def view(self, path: str, **kwargs: Any) -> _Deco: + return self.route(hdrs.METH_ANY, path, **kwargs) + + def static(self, prefix: str, path: PathLike, **kwargs: Any) -> None: + self._items.append(StaticDef(prefix, path, kwargs)) diff --git a/sbsheriff/Lib/site-packages/aiohttp/web_runner.py b/sbsheriff/Lib/site-packages/aiohttp/web_runner.py new file mode 100644 index 0000000..f4a64bf --- /dev/null +++ b/sbsheriff/Lib/site-packages/aiohttp/web_runner.py @@ -0,0 +1,381 @@ +import asyncio +import signal +import socket +from abc import ABC, abstractmethod +from typing import Any, List, Optional, Set + +from yarl import URL + +from .web_app import Application +from .web_server import Server + +try: + from ssl import SSLContext +except ImportError: + SSLContext = object # type: ignore[misc,assignment] + + +__all__ = ( + "BaseSite", + "TCPSite", + "UnixSite", + "NamedPipeSite", + "SockSite", + "BaseRunner", + "AppRunner", + "ServerRunner", + "GracefulExit", +) + + +class GracefulExit(SystemExit): + code = 1 + + +def _raise_graceful_exit() -> None: + raise GracefulExit() + + +class BaseSite(ABC): + __slots__ = ("_runner", "_shutdown_timeout", "_ssl_context", "_backlog", "_server") + + def __init__( + self, + runner: "BaseRunner", + *, + shutdown_timeout: float = 60.0, + ssl_context: Optional[SSLContext] = None, + backlog: int = 128, + ) -> None: + if runner.server is None: + raise RuntimeError("Call runner.setup() before making a site") + self._runner = runner + self._shutdown_timeout = shutdown_timeout + self._ssl_context = ssl_context + self._backlog = backlog + self._server = None # type: Optional[asyncio.AbstractServer] + + @property + @abstractmethod + def name(self) -> str: + pass # pragma: no cover + + @abstractmethod + async def start(self) -> None: + self._runner._reg_site(self) + + async def stop(self) -> None: + self._runner._check_site(self) + if self._server is None: + self._runner._unreg_site(self) + return # not started yet + self._server.close() + # named pipes do not have wait_closed property + if hasattr(self._server, "wait_closed"): + await self._server.wait_closed() + await self._runner.shutdown() + assert self._runner.server + await self._runner.server.shutdown(self._shutdown_timeout) + self._runner._unreg_site(self) + + +class TCPSite(BaseSite): + __slots__ = ("_host", "_port", "_reuse_address", "_reuse_port") + + def __init__( + self, + runner: "BaseRunner", + host: Optional[str] = None, + port: Optional[int] = None, + *, + shutdown_timeout: float = 60.0, + ssl_context: Optional[SSLContext] = None, + backlog: int = 128, + reuse_address: Optional[bool] = None, + reuse_port: Optional[bool] = None, + ) -> None: + super().__init__( + runner, + shutdown_timeout=shutdown_timeout, + ssl_context=ssl_context, + backlog=backlog, + ) + self._host = host + if port is None: + port = 8443 if self._ssl_context else 8080 + self._port = port + self._reuse_address = reuse_address + self._reuse_port = reuse_port + + @property + def name(self) -> str: + scheme = "https" if self._ssl_context else "http" + host = "0.0.0.0" if self._host is None else self._host + return str(URL.build(scheme=scheme, host=host, port=self._port)) + + async def start(self) -> None: + await super().start() + loop = asyncio.get_event_loop() + server = self._runner.server + assert server is not None + self._server = await loop.create_server( + server, + self._host, + self._port, + ssl=self._ssl_context, + backlog=self._backlog, + reuse_address=self._reuse_address, + reuse_port=self._reuse_port, + ) + + +class UnixSite(BaseSite): + __slots__ = ("_path",) + + def __init__( + self, + runner: "BaseRunner", + path: str, + *, + shutdown_timeout: float = 60.0, + ssl_context: Optional[SSLContext] = None, + backlog: int = 128, + ) -> None: + super().__init__( + runner, + shutdown_timeout=shutdown_timeout, + ssl_context=ssl_context, + backlog=backlog, + ) + self._path = path + + @property + def name(self) -> str: + scheme = "https" if self._ssl_context else "http" + return f"{scheme}://unix:{self._path}:" + + async def start(self) -> None: + await super().start() + loop = asyncio.get_event_loop() + server = self._runner.server + assert server is not None + self._server = await loop.create_unix_server( + server, self._path, ssl=self._ssl_context, backlog=self._backlog + ) + + +class NamedPipeSite(BaseSite): + __slots__ = ("_path",) + + def __init__( + self, runner: "BaseRunner", path: str, *, shutdown_timeout: float = 60.0 + ) -> None: + loop = asyncio.get_event_loop() + if not isinstance( + loop, asyncio.ProactorEventLoop # type: ignore[attr-defined] + ): + raise RuntimeError( + "Named Pipes only available in proactor" "loop under windows" + ) + super().__init__(runner, shutdown_timeout=shutdown_timeout) + self._path = path + + @property + def name(self) -> str: + return self._path + + async def start(self) -> None: + await super().start() + loop = asyncio.get_event_loop() + server = self._runner.server + assert server is not None + _server = await loop.start_serving_pipe( # type: ignore[attr-defined] + server, self._path + ) + self._server = _server[0] + + +class SockSite(BaseSite): + __slots__ = ("_sock", "_name") + + def __init__( + self, + runner: "BaseRunner", + sock: socket.socket, + *, + shutdown_timeout: float = 60.0, + ssl_context: Optional[SSLContext] = None, + backlog: int = 128, + ) -> None: + super().__init__( + runner, + shutdown_timeout=shutdown_timeout, + ssl_context=ssl_context, + backlog=backlog, + ) + self._sock = sock + scheme = "https" if self._ssl_context else "http" + if hasattr(socket, "AF_UNIX") and sock.family == socket.AF_UNIX: + name = f"{scheme}://unix:{sock.getsockname()}:" + else: + host, port = sock.getsockname()[:2] + name = str(URL.build(scheme=scheme, host=host, port=port)) + self._name = name + + @property + def name(self) -> str: + return self._name + + async def start(self) -> None: + await super().start() + loop = asyncio.get_event_loop() + server = self._runner.server + assert server is not None + self._server = await loop.create_server( + server, sock=self._sock, ssl=self._ssl_context, backlog=self._backlog + ) + + +class BaseRunner(ABC): + __slots__ = ("_handle_signals", "_kwargs", "_server", "_sites") + + def __init__(self, *, handle_signals: bool = False, **kwargs: Any) -> None: + self._handle_signals = handle_signals + self._kwargs = kwargs + self._server = None # type: Optional[Server] + self._sites = [] # type: List[BaseSite] + + @property + def server(self) -> Optional[Server]: + return self._server + + @property + def addresses(self) -> List[Any]: + ret = [] # type: List[Any] + for site in self._sites: + server = site._server + if server is not None: + sockets = server.sockets + if sockets is not None: + for sock in sockets: + ret.append(sock.getsockname()) + return ret + + @property + def sites(self) -> Set[BaseSite]: + return set(self._sites) + + async def setup(self) -> None: + loop = asyncio.get_event_loop() + + if self._handle_signals: + try: + loop.add_signal_handler(signal.SIGINT, _raise_graceful_exit) + loop.add_signal_handler(signal.SIGTERM, _raise_graceful_exit) + except NotImplementedError: # pragma: no cover + # add_signal_handler is not implemented on Windows + pass + + self._server = await self._make_server() + + @abstractmethod + async def shutdown(self) -> None: + pass # pragma: no cover + + async def cleanup(self) -> None: + loop = asyncio.get_event_loop() + + # The loop over sites is intentional, an exception on gather() + # leaves self._sites in unpredictable state. + # The loop guaranties that a site is either deleted on success or + # still present on failure + for site in list(self._sites): + await site.stop() + await self._cleanup_server() + self._server = None + if self._handle_signals: + try: + loop.remove_signal_handler(signal.SIGINT) + loop.remove_signal_handler(signal.SIGTERM) + except NotImplementedError: # pragma: no cover + # remove_signal_handler is not implemented on Windows + pass + + @abstractmethod + async def _make_server(self) -> Server: + pass # pragma: no cover + + @abstractmethod + async def _cleanup_server(self) -> None: + pass # pragma: no cover + + def _reg_site(self, site: BaseSite) -> None: + if site in self._sites: + raise RuntimeError(f"Site {site} is already registered in runner {self}") + self._sites.append(site) + + def _check_site(self, site: BaseSite) -> None: + if site not in self._sites: + raise RuntimeError(f"Site {site} is not registered in runner {self}") + + def _unreg_site(self, site: BaseSite) -> None: + if site not in self._sites: + raise RuntimeError(f"Site {site} is not registered in runner {self}") + self._sites.remove(site) + + +class ServerRunner(BaseRunner): + """Low-level web server runner""" + + __slots__ = ("_web_server",) + + def __init__( + self, web_server: Server, *, handle_signals: bool = False, **kwargs: Any + ) -> None: + super().__init__(handle_signals=handle_signals, **kwargs) + self._web_server = web_server + + async def shutdown(self) -> None: + pass + + async def _make_server(self) -> Server: + return self._web_server + + async def _cleanup_server(self) -> None: + pass + + +class AppRunner(BaseRunner): + """Web Application runner""" + + __slots__ = ("_app",) + + def __init__( + self, app: Application, *, handle_signals: bool = False, **kwargs: Any + ) -> None: + super().__init__(handle_signals=handle_signals, **kwargs) + if not isinstance(app, Application): + raise TypeError( + "The first argument should be web.Application " + "instance, got {!r}".format(app) + ) + self._app = app + + @property + def app(self) -> Application: + return self._app + + async def shutdown(self) -> None: + await self._app.shutdown() + + async def _make_server(self) -> Server: + loop = asyncio.get_event_loop() + self._app._set_loop(loop) + self._app.on_startup.freeze() + await self._app.startup() + self._app.freeze() + + return self._app._make_handler(loop=loop, **self._kwargs) + + async def _cleanup_server(self) -> None: + await self._app.cleanup() diff --git a/sbsheriff/Lib/site-packages/aiohttp/web_server.py b/sbsheriff/Lib/site-packages/aiohttp/web_server.py new file mode 100644 index 0000000..5657ed9 --- /dev/null +++ b/sbsheriff/Lib/site-packages/aiohttp/web_server.py @@ -0,0 +1,62 @@ +"""Low level HTTP server.""" +import asyncio +from typing import Any, Awaitable, Callable, Dict, List, Optional # noqa + +from .abc import AbstractStreamWriter +from .helpers import get_running_loop +from .http_parser import RawRequestMessage +from .streams import StreamReader +from .web_protocol import RequestHandler, _RequestFactory, _RequestHandler +from .web_request import BaseRequest + +__all__ = ("Server",) + + +class Server: + def __init__( + self, + handler: _RequestHandler, + *, + request_factory: Optional[_RequestFactory] = None, + loop: Optional[asyncio.AbstractEventLoop] = None, + **kwargs: Any + ) -> None: + self._loop = get_running_loop(loop) + self._connections = {} # type: Dict[RequestHandler, asyncio.Transport] + self._kwargs = kwargs + self.requests_count = 0 + self.request_handler = handler + self.request_factory = request_factory or self._make_request + + @property + def connections(self) -> List[RequestHandler]: + return list(self._connections.keys()) + + def connection_made( + self, handler: RequestHandler, transport: asyncio.Transport + ) -> None: + self._connections[handler] = transport + + def connection_lost( + self, handler: RequestHandler, exc: Optional[BaseException] = None + ) -> None: + if handler in self._connections: + del self._connections[handler] + + def _make_request( + self, + message: RawRequestMessage, + payload: StreamReader, + protocol: RequestHandler, + writer: AbstractStreamWriter, + task: "asyncio.Task[None]", + ) -> BaseRequest: + return BaseRequest(message, payload, protocol, writer, task, self._loop) + + async def shutdown(self, timeout: Optional[float] = None) -> None: + coros = [conn.shutdown(timeout) for conn in self._connections] + await asyncio.gather(*coros) + self._connections.clear() + + def __call__(self) -> RequestHandler: + return RequestHandler(self, loop=self._loop, **self._kwargs) diff --git a/sbsheriff/Lib/site-packages/aiohttp/web_urldispatcher.py b/sbsheriff/Lib/site-packages/aiohttp/web_urldispatcher.py new file mode 100644 index 0000000..73ec4c0 --- /dev/null +++ b/sbsheriff/Lib/site-packages/aiohttp/web_urldispatcher.py @@ -0,0 +1,1220 @@ +import abc +import asyncio +import base64 +import hashlib +import inspect +import keyword +import os +import re +import warnings +from contextlib import contextmanager +from functools import wraps +from pathlib import Path +from types import MappingProxyType +from typing import ( + TYPE_CHECKING, + Any, + Awaitable, + Callable, + Container, + Dict, + Generator, + Iterable, + Iterator, + List, + Mapping, + Optional, + Pattern, + Set, + Sized, + Tuple, + Type, + Union, + cast, +) + +from yarl import URL, __version__ as yarl_version # type: ignore[attr-defined] + +from . import hdrs +from .abc import AbstractMatchInfo, AbstractRouter, AbstractView +from .helpers import DEBUG +from .http import HttpVersion11 +from .typedefs import Final, Handler, PathLike, TypedDict +from .web_exceptions import ( + HTTPException, + HTTPExpectationFailed, + HTTPForbidden, + HTTPMethodNotAllowed, + HTTPNotFound, +) +from .web_fileresponse import FileResponse +from .web_request import Request +from .web_response import Response, StreamResponse +from .web_routedef import AbstractRouteDef + +__all__ = ( + "UrlDispatcher", + "UrlMappingMatchInfo", + "AbstractResource", + "Resource", + "PlainResource", + "DynamicResource", + "AbstractRoute", + "ResourceRoute", + "StaticResource", + "View", +) + + +if TYPE_CHECKING: # pragma: no cover + from .web_app import Application + + BaseDict = Dict[str, str] +else: + BaseDict = dict + +YARL_VERSION: Final[Tuple[int, ...]] = tuple(map(int, yarl_version.split(".")[:2])) + +HTTP_METHOD_RE: Final[Pattern[str]] = re.compile( + r"^[0-9A-Za-z!#\$%&'\*\+\-\.\^_`\|~]+$" +) +ROUTE_RE: Final[Pattern[str]] = re.compile( + r"(\{[_a-zA-Z][^{}]*(?:\{[^{}]*\}[^{}]*)*\})" +) +PATH_SEP: Final[str] = re.escape("/") + + +_ExpectHandler = Callable[[Request], Awaitable[None]] +_Resolve = Tuple[Optional["UrlMappingMatchInfo"], Set[str]] + + +class _InfoDict(TypedDict, total=False): + path: str + + formatter: str + pattern: Pattern[str] + + directory: Path + prefix: str + routes: Mapping[str, "AbstractRoute"] + + app: "Application" + + domain: str + + rule: "AbstractRuleMatching" + + http_exception: HTTPException + + +class AbstractResource(Sized, Iterable["AbstractRoute"]): + def __init__(self, *, name: Optional[str] = None) -> None: + self._name = name + + @property + def name(self) -> Optional[str]: + return self._name + + @property + @abc.abstractmethod + def canonical(self) -> str: + """Exposes the resource's canonical path. + + For example '/foo/bar/{name}' + + """ + + @abc.abstractmethod # pragma: no branch + def url_for(self, **kwargs: str) -> URL: + """Construct url for resource with additional params.""" + + @abc.abstractmethod # pragma: no branch + async def resolve(self, request: Request) -> _Resolve: + """Resolve resource. + + Return (UrlMappingMatchInfo, allowed_methods) pair. + """ + + @abc.abstractmethod + def add_prefix(self, prefix: str) -> None: + """Add a prefix to processed URLs. + + Required for subapplications support. + """ + + @abc.abstractmethod + def get_info(self) -> _InfoDict: + """Return a dict with additional info useful for introspection""" + + def freeze(self) -> None: + pass + + @abc.abstractmethod + def raw_match(self, path: str) -> bool: + """Perform a raw match against path""" + + +class AbstractRoute(abc.ABC): + def __init__( + self, + method: str, + handler: Union[Handler, Type[AbstractView]], + *, + expect_handler: Optional[_ExpectHandler] = None, + resource: Optional[AbstractResource] = None, + ) -> None: + + if expect_handler is None: + expect_handler = _default_expect_handler + + assert asyncio.iscoroutinefunction( + expect_handler + ), f"Coroutine is expected, got {expect_handler!r}" + + method = method.upper() + if not HTTP_METHOD_RE.match(method): + raise ValueError(f"{method} is not allowed HTTP method") + + assert callable(handler), handler + if asyncio.iscoroutinefunction(handler): + pass + elif inspect.isgeneratorfunction(handler): + warnings.warn( + "Bare generators are deprecated, " "use @coroutine wrapper", + DeprecationWarning, + ) + elif isinstance(handler, type) and issubclass(handler, AbstractView): + pass + else: + warnings.warn( + "Bare functions are deprecated, " "use async ones", DeprecationWarning + ) + + @wraps(handler) + async def handler_wrapper(request: Request) -> StreamResponse: + result = old_handler(request) + if asyncio.iscoroutine(result): + return await result + return result # type: ignore[return-value] + + old_handler = handler + handler = handler_wrapper + + self._method = method + self._handler = handler + self._expect_handler = expect_handler + self._resource = resource + + @property + def method(self) -> str: + return self._method + + @property + def handler(self) -> Handler: + return self._handler + + @property + @abc.abstractmethod + def name(self) -> Optional[str]: + """Optional route's name, always equals to resource's name.""" + + @property + def resource(self) -> Optional[AbstractResource]: + return self._resource + + @abc.abstractmethod + def get_info(self) -> _InfoDict: + """Return a dict with additional info useful for introspection""" + + @abc.abstractmethod # pragma: no branch + def url_for(self, *args: str, **kwargs: str) -> URL: + """Construct url for route with additional params.""" + + async def handle_expect_header(self, request: Request) -> None: + await self._expect_handler(request) + + +class UrlMappingMatchInfo(BaseDict, AbstractMatchInfo): + def __init__(self, match_dict: Dict[str, str], route: AbstractRoute): + super().__init__(match_dict) + self._route = route + self._apps = [] # type: List[Application] + self._current_app = None # type: Optional[Application] + self._frozen = False + + @property + def handler(self) -> Handler: + return self._route.handler + + @property + def route(self) -> AbstractRoute: + return self._route + + @property + def expect_handler(self) -> _ExpectHandler: + return self._route.handle_expect_header + + @property + def http_exception(self) -> Optional[HTTPException]: + return None + + def get_info(self) -> _InfoDict: # type: ignore[override] + return self._route.get_info() + + @property + def apps(self) -> Tuple["Application", ...]: + return tuple(self._apps) + + def add_app(self, app: "Application") -> None: + if self._frozen: + raise RuntimeError("Cannot change apps stack after .freeze() call") + if self._current_app is None: + self._current_app = app + self._apps.insert(0, app) + + @property + def current_app(self) -> "Application": + app = self._current_app + assert app is not None + return app + + @contextmanager + def set_current_app(self, app: "Application") -> Generator[None, None, None]: + if DEBUG: # pragma: no cover + if app not in self._apps: + raise RuntimeError( + "Expected one of the following apps {!r}, got {!r}".format( + self._apps, app + ) + ) + prev = self._current_app + self._current_app = app + try: + yield + finally: + self._current_app = prev + + def freeze(self) -> None: + self._frozen = True + + def __repr__(self) -> str: + return f"" + + +class MatchInfoError(UrlMappingMatchInfo): + def __init__(self, http_exception: HTTPException) -> None: + self._exception = http_exception + super().__init__({}, SystemRoute(self._exception)) + + @property + def http_exception(self) -> HTTPException: + return self._exception + + def __repr__(self) -> str: + return "".format( + self._exception.status, self._exception.reason + ) + + +async def _default_expect_handler(request: Request) -> None: + """Default handler for Expect header. + + Just send "100 Continue" to client. + raise HTTPExpectationFailed if value of header is not "100-continue" + """ + expect = request.headers.get(hdrs.EXPECT, "") + if request.version == HttpVersion11: + if expect.lower() == "100-continue": + await request.writer.write(b"HTTP/1.1 100 Continue\r\n\r\n") + else: + raise HTTPExpectationFailed(text="Unknown Expect: %s" % expect) + + +class Resource(AbstractResource): + def __init__(self, *, name: Optional[str] = None) -> None: + super().__init__(name=name) + self._routes = [] # type: List[ResourceRoute] + + def add_route( + self, + method: str, + handler: Union[Type[AbstractView], Handler], + *, + expect_handler: Optional[_ExpectHandler] = None, + ) -> "ResourceRoute": + + for route_obj in self._routes: + if route_obj.method == method or route_obj.method == hdrs.METH_ANY: + raise RuntimeError( + "Added route will never be executed, " + "method {route.method} is already " + "registered".format(route=route_obj) + ) + + route_obj = ResourceRoute(method, handler, self, expect_handler=expect_handler) + self.register_route(route_obj) + return route_obj + + def register_route(self, route: "ResourceRoute") -> None: + assert isinstance( + route, ResourceRoute + ), f"Instance of Route class is required, got {route!r}" + self._routes.append(route) + + async def resolve(self, request: Request) -> _Resolve: + allowed_methods = set() # type: Set[str] + + match_dict = self._match(request.rel_url.raw_path) + if match_dict is None: + return None, allowed_methods + + for route_obj in self._routes: + route_method = route_obj.method + allowed_methods.add(route_method) + + if route_method == request.method or route_method == hdrs.METH_ANY: + return (UrlMappingMatchInfo(match_dict, route_obj), allowed_methods) + else: + return None, allowed_methods + + @abc.abstractmethod + def _match(self, path: str) -> Optional[Dict[str, str]]: + pass # pragma: no cover + + def __len__(self) -> int: + return len(self._routes) + + def __iter__(self) -> Iterator[AbstractRoute]: + return iter(self._routes) + + # TODO: implement all abstract methods + + +class PlainResource(Resource): + def __init__(self, path: str, *, name: Optional[str] = None) -> None: + super().__init__(name=name) + assert not path or path.startswith("/") + self._path = path + + @property + def canonical(self) -> str: + return self._path + + def freeze(self) -> None: + if not self._path: + self._path = "/" + + def add_prefix(self, prefix: str) -> None: + assert prefix.startswith("/") + assert not prefix.endswith("/") + assert len(prefix) > 1 + self._path = prefix + self._path + + def _match(self, path: str) -> Optional[Dict[str, str]]: + # string comparison is about 10 times faster than regexp matching + if self._path == path: + return {} + else: + return None + + def raw_match(self, path: str) -> bool: + return self._path == path + + def get_info(self) -> _InfoDict: + return {"path": self._path} + + def url_for(self) -> URL: # type: ignore[override] + return URL.build(path=self._path, encoded=True) + + def __repr__(self) -> str: + name = "'" + self.name + "' " if self.name is not None else "" + return f"" + + +class DynamicResource(Resource): + + DYN = re.compile(r"\{(?P[_a-zA-Z][_a-zA-Z0-9]*)\}") + DYN_WITH_RE = re.compile(r"\{(?P[_a-zA-Z][_a-zA-Z0-9]*):(?P.+)\}") + GOOD = r"[^{}/]+" + + def __init__(self, path: str, *, name: Optional[str] = None) -> None: + super().__init__(name=name) + pattern = "" + formatter = "" + for part in ROUTE_RE.split(path): + match = self.DYN.fullmatch(part) + if match: + pattern += "(?P<{}>{})".format(match.group("var"), self.GOOD) + formatter += "{" + match.group("var") + "}" + continue + + match = self.DYN_WITH_RE.fullmatch(part) + if match: + pattern += "(?P<{var}>{re})".format(**match.groupdict()) + formatter += "{" + match.group("var") + "}" + continue + + if "{" in part or "}" in part: + raise ValueError(f"Invalid path '{path}'['{part}']") + + part = _requote_path(part) + formatter += part + pattern += re.escape(part) + + try: + compiled = re.compile(pattern) + except re.error as exc: + raise ValueError(f"Bad pattern '{pattern}': {exc}") from None + assert compiled.pattern.startswith(PATH_SEP) + assert formatter.startswith("/") + self._pattern = compiled + self._formatter = formatter + + @property + def canonical(self) -> str: + return self._formatter + + def add_prefix(self, prefix: str) -> None: + assert prefix.startswith("/") + assert not prefix.endswith("/") + assert len(prefix) > 1 + self._pattern = re.compile(re.escape(prefix) + self._pattern.pattern) + self._formatter = prefix + self._formatter + + def _match(self, path: str) -> Optional[Dict[str, str]]: + match = self._pattern.fullmatch(path) + if match is None: + return None + else: + return { + key: _unquote_path(value) for key, value in match.groupdict().items() + } + + def raw_match(self, path: str) -> bool: + return self._formatter == path + + def get_info(self) -> _InfoDict: + return {"formatter": self._formatter, "pattern": self._pattern} + + def url_for(self, **parts: str) -> URL: + url = self._formatter.format_map({k: _quote_path(v) for k, v in parts.items()}) + return URL.build(path=url, encoded=True) + + def __repr__(self) -> str: + name = "'" + self.name + "' " if self.name is not None else "" + return "".format( + name=name, formatter=self._formatter + ) + + +class PrefixResource(AbstractResource): + def __init__(self, prefix: str, *, name: Optional[str] = None) -> None: + assert not prefix or prefix.startswith("/"), prefix + assert prefix in ("", "/") or not prefix.endswith("/"), prefix + super().__init__(name=name) + self._prefix = _requote_path(prefix) + self._prefix2 = self._prefix + "/" + + @property + def canonical(self) -> str: + return self._prefix + + def add_prefix(self, prefix: str) -> None: + assert prefix.startswith("/") + assert not prefix.endswith("/") + assert len(prefix) > 1 + self._prefix = prefix + self._prefix + self._prefix2 = self._prefix + "/" + + def raw_match(self, prefix: str) -> bool: + return False + + # TODO: impl missing abstract methods + + +class StaticResource(PrefixResource): + VERSION_KEY = "v" + + def __init__( + self, + prefix: str, + directory: PathLike, + *, + name: Optional[str] = None, + expect_handler: Optional[_ExpectHandler] = None, + chunk_size: int = 256 * 1024, + show_index: bool = False, + follow_symlinks: bool = False, + append_version: bool = False, + ) -> None: + super().__init__(prefix, name=name) + try: + directory = Path(directory) + if str(directory).startswith("~"): + directory = Path(os.path.expanduser(str(directory))) + directory = directory.resolve() + if not directory.is_dir(): + raise ValueError("Not a directory") + except (FileNotFoundError, ValueError) as error: + raise ValueError(f"No directory exists at '{directory}'") from error + self._directory = directory + self._show_index = show_index + self._chunk_size = chunk_size + self._follow_symlinks = follow_symlinks + self._expect_handler = expect_handler + self._append_version = append_version + + self._routes = { + "GET": ResourceRoute( + "GET", self._handle, self, expect_handler=expect_handler + ), + "HEAD": ResourceRoute( + "HEAD", self._handle, self, expect_handler=expect_handler + ), + } + + def url_for( # type: ignore[override] + self, + *, + filename: Union[str, Path], + append_version: Optional[bool] = None, + ) -> URL: + if append_version is None: + append_version = self._append_version + if isinstance(filename, Path): + filename = str(filename) + filename = filename.lstrip("/") + + url = URL.build(path=self._prefix, encoded=True) + # filename is not encoded + if YARL_VERSION < (1, 6): + url = url / filename.replace("%", "%25") + else: + url = url / filename + + if append_version: + try: + filepath = self._directory.joinpath(filename).resolve() + if not self._follow_symlinks: + filepath.relative_to(self._directory) + except (ValueError, FileNotFoundError): + # ValueError for case when path point to symlink + # with follow_symlinks is False + return url # relatively safe + if filepath.is_file(): + # TODO cache file content + # with file watcher for cache invalidation + with filepath.open("rb") as f: + file_bytes = f.read() + h = self._get_file_hash(file_bytes) + url = url.with_query({self.VERSION_KEY: h}) + return url + return url + + @staticmethod + def _get_file_hash(byte_array: bytes) -> str: + m = hashlib.sha256() # todo sha256 can be configurable param + m.update(byte_array) + b64 = base64.urlsafe_b64encode(m.digest()) + return b64.decode("ascii") + + def get_info(self) -> _InfoDict: + return { + "directory": self._directory, + "prefix": self._prefix, + "routes": self._routes, + } + + def set_options_route(self, handler: Handler) -> None: + if "OPTIONS" in self._routes: + raise RuntimeError("OPTIONS route was set already") + self._routes["OPTIONS"] = ResourceRoute( + "OPTIONS", handler, self, expect_handler=self._expect_handler + ) + + async def resolve(self, request: Request) -> _Resolve: + path = request.rel_url.raw_path + method = request.method + allowed_methods = set(self._routes) + if not path.startswith(self._prefix2) and path != self._prefix: + return None, set() + + if method not in allowed_methods: + return None, allowed_methods + + match_dict = {"filename": _unquote_path(path[len(self._prefix) + 1 :])} + return (UrlMappingMatchInfo(match_dict, self._routes[method]), allowed_methods) + + def __len__(self) -> int: + return len(self._routes) + + def __iter__(self) -> Iterator[AbstractRoute]: + return iter(self._routes.values()) + + async def _handle(self, request: Request) -> StreamResponse: + rel_url = request.match_info["filename"] + try: + filename = Path(rel_url) + if filename.anchor: + # rel_url is an absolute name like + # /static/\\machine_name\c$ or /static/D:\path + # where the static dir is totally different + raise HTTPForbidden() + filepath = self._directory.joinpath(filename).resolve() + if not self._follow_symlinks: + filepath.relative_to(self._directory) + except (ValueError, FileNotFoundError) as error: + # relatively safe + raise HTTPNotFound() from error + except HTTPForbidden: + raise + except Exception as error: + # perm error or other kind! + request.app.logger.exception(error) + raise HTTPNotFound() from error + + # on opening a dir, load its contents if allowed + if filepath.is_dir(): + if self._show_index: + try: + return Response( + text=self._directory_as_html(filepath), content_type="text/html" + ) + except PermissionError: + raise HTTPForbidden() + else: + raise HTTPForbidden() + elif filepath.is_file(): + return FileResponse(filepath, chunk_size=self._chunk_size) + else: + raise HTTPNotFound + + def _directory_as_html(self, filepath: Path) -> str: + # returns directory's index as html + + # sanity check + assert filepath.is_dir() + + relative_path_to_dir = filepath.relative_to(self._directory).as_posix() + index_of = f"Index of /{relative_path_to_dir}" + h1 = f"

{index_of}

" + + index_list = [] + dir_index = filepath.iterdir() + for _file in sorted(dir_index): + # show file url as relative to static path + rel_path = _file.relative_to(self._directory).as_posix() + file_url = self._prefix + "/" + rel_path + + # if file is a directory, add '/' to the end of the name + if _file.is_dir(): + file_name = f"{_file.name}/" + else: + file_name = _file.name + + index_list.append( + '
'.format( + url=file_url, name=file_name + ) + ) + ul = "
    \n{}\n
".format("\n".join(index_list)) + body = f"\n{h1}\n{ul}\n" + + head_str = f"\n{index_of}\n" + html = f"\n{head_str}\n{body}\n" + + return html + + def __repr__(self) -> str: + name = "'" + self.name + "'" if self.name is not None else "" + return " {directory!r}>".format( + name=name, path=self._prefix, directory=self._directory + ) + + +class PrefixedSubAppResource(PrefixResource): + def __init__(self, prefix: str, app: "Application") -> None: + super().__init__(prefix) + self._app = app + for resource in app.router.resources(): + resource.add_prefix(prefix) + + def add_prefix(self, prefix: str) -> None: + super().add_prefix(prefix) + for resource in self._app.router.resources(): + resource.add_prefix(prefix) + + def url_for(self, *args: str, **kwargs: str) -> URL: + raise RuntimeError(".url_for() is not supported " "by sub-application root") + + def get_info(self) -> _InfoDict: + return {"app": self._app, "prefix": self._prefix} + + async def resolve(self, request: Request) -> _Resolve: + if ( + not request.url.raw_path.startswith(self._prefix2) + and request.url.raw_path != self._prefix + ): + return None, set() + match_info = await self._app.router.resolve(request) + match_info.add_app(self._app) + if isinstance(match_info.http_exception, HTTPMethodNotAllowed): + methods = match_info.http_exception.allowed_methods + else: + methods = set() + return match_info, methods + + def __len__(self) -> int: + return len(self._app.router.routes()) + + def __iter__(self) -> Iterator[AbstractRoute]: + return iter(self._app.router.routes()) + + def __repr__(self) -> str: + return " {app!r}>".format( + prefix=self._prefix, app=self._app + ) + + +class AbstractRuleMatching(abc.ABC): + @abc.abstractmethod # pragma: no branch + async def match(self, request: Request) -> bool: + """Return bool if the request satisfies the criteria""" + + @abc.abstractmethod # pragma: no branch + def get_info(self) -> _InfoDict: + """Return a dict with additional info useful for introspection""" + + @property + @abc.abstractmethod # pragma: no branch + def canonical(self) -> str: + """Return a str""" + + +class Domain(AbstractRuleMatching): + re_part = re.compile(r"(?!-)[a-z\d-]{1,63}(? None: + super().__init__() + self._domain = self.validation(domain) + + @property + def canonical(self) -> str: + return self._domain + + def validation(self, domain: str) -> str: + if not isinstance(domain, str): + raise TypeError("Domain must be str") + domain = domain.rstrip(".").lower() + if not domain: + raise ValueError("Domain cannot be empty") + elif "://" in domain: + raise ValueError("Scheme not supported") + url = URL("http://" + domain) + assert url.raw_host is not None + if not all(self.re_part.fullmatch(x) for x in url.raw_host.split(".")): + raise ValueError("Domain not valid") + if url.port == 80: + return url.raw_host + return f"{url.raw_host}:{url.port}" + + async def match(self, request: Request) -> bool: + host = request.headers.get(hdrs.HOST) + if not host: + return False + return self.match_domain(host) + + def match_domain(self, host: str) -> bool: + return host.lower() == self._domain + + def get_info(self) -> _InfoDict: + return {"domain": self._domain} + + +class MaskDomain(Domain): + re_part = re.compile(r"(?!-)[a-z\d\*-]{1,63}(? None: + super().__init__(domain) + mask = self._domain.replace(".", r"\.").replace("*", ".*") + self._mask = re.compile(mask) + + @property + def canonical(self) -> str: + return self._mask.pattern + + def match_domain(self, host: str) -> bool: + return self._mask.fullmatch(host) is not None + + +class MatchedSubAppResource(PrefixedSubAppResource): + def __init__(self, rule: AbstractRuleMatching, app: "Application") -> None: + AbstractResource.__init__(self) + self._prefix = "" + self._app = app + self._rule = rule + + @property + def canonical(self) -> str: + return self._rule.canonical + + def get_info(self) -> _InfoDict: + return {"app": self._app, "rule": self._rule} + + async def resolve(self, request: Request) -> _Resolve: + if not await self._rule.match(request): + return None, set() + match_info = await self._app.router.resolve(request) + match_info.add_app(self._app) + if isinstance(match_info.http_exception, HTTPMethodNotAllowed): + methods = match_info.http_exception.allowed_methods + else: + methods = set() + return match_info, methods + + def __repr__(self) -> str: + return " {app!r}>" "".format(app=self._app) + + +class ResourceRoute(AbstractRoute): + """A route with resource""" + + def __init__( + self, + method: str, + handler: Union[Handler, Type[AbstractView]], + resource: AbstractResource, + *, + expect_handler: Optional[_ExpectHandler] = None, + ) -> None: + super().__init__( + method, handler, expect_handler=expect_handler, resource=resource + ) + + def __repr__(self) -> str: + return " {handler!r}".format( + method=self.method, resource=self._resource, handler=self.handler + ) + + @property + def name(self) -> Optional[str]: + if self._resource is None: + return None + return self._resource.name + + def url_for(self, *args: str, **kwargs: str) -> URL: + """Construct url for route with additional params.""" + assert self._resource is not None + return self._resource.url_for(*args, **kwargs) + + def get_info(self) -> _InfoDict: + assert self._resource is not None + return self._resource.get_info() + + +class SystemRoute(AbstractRoute): + def __init__(self, http_exception: HTTPException) -> None: + super().__init__(hdrs.METH_ANY, self._handle) + self._http_exception = http_exception + + def url_for(self, *args: str, **kwargs: str) -> URL: + raise RuntimeError(".url_for() is not allowed for SystemRoute") + + @property + def name(self) -> Optional[str]: + return None + + def get_info(self) -> _InfoDict: + return {"http_exception": self._http_exception} + + async def _handle(self, request: Request) -> StreamResponse: + raise self._http_exception + + @property + def status(self) -> int: + return self._http_exception.status + + @property + def reason(self) -> str: + return self._http_exception.reason + + def __repr__(self) -> str: + return "".format(self=self) + + +class View(AbstractView): + async def _iter(self) -> StreamResponse: + if self.request.method not in hdrs.METH_ALL: + self._raise_allowed_methods() + method: Callable[[], Awaitable[StreamResponse]] = getattr( + self, self.request.method.lower(), None + ) + if method is None: + self._raise_allowed_methods() + resp = await method() + return resp + + def __await__(self) -> Generator[Any, None, StreamResponse]: + return self._iter().__await__() + + def _raise_allowed_methods(self) -> None: + allowed_methods = {m for m in hdrs.METH_ALL if hasattr(self, m.lower())} + raise HTTPMethodNotAllowed(self.request.method, allowed_methods) + + +class ResourcesView(Sized, Iterable[AbstractResource], Container[AbstractResource]): + def __init__(self, resources: List[AbstractResource]) -> None: + self._resources = resources + + def __len__(self) -> int: + return len(self._resources) + + def __iter__(self) -> Iterator[AbstractResource]: + yield from self._resources + + def __contains__(self, resource: object) -> bool: + return resource in self._resources + + +class RoutesView(Sized, Iterable[AbstractRoute], Container[AbstractRoute]): + def __init__(self, resources: List[AbstractResource]): + self._routes = [] # type: List[AbstractRoute] + for resource in resources: + for route in resource: + self._routes.append(route) + + def __len__(self) -> int: + return len(self._routes) + + def __iter__(self) -> Iterator[AbstractRoute]: + yield from self._routes + + def __contains__(self, route: object) -> bool: + return route in self._routes + + +class UrlDispatcher(AbstractRouter, Mapping[str, AbstractResource]): + + NAME_SPLIT_RE = re.compile(r"[.:-]") + + def __init__(self) -> None: + super().__init__() + self._resources = [] # type: List[AbstractResource] + self._named_resources = {} # type: Dict[str, AbstractResource] + + async def resolve(self, request: Request) -> UrlMappingMatchInfo: + method = request.method + allowed_methods = set() # type: Set[str] + + for resource in self._resources: + match_dict, allowed = await resource.resolve(request) + if match_dict is not None: + return match_dict + else: + allowed_methods |= allowed + + if allowed_methods: + return MatchInfoError(HTTPMethodNotAllowed(method, allowed_methods)) + else: + return MatchInfoError(HTTPNotFound()) + + def __iter__(self) -> Iterator[str]: + return iter(self._named_resources) + + def __len__(self) -> int: + return len(self._named_resources) + + def __contains__(self, resource: object) -> bool: + return resource in self._named_resources + + def __getitem__(self, name: str) -> AbstractResource: + return self._named_resources[name] + + def resources(self) -> ResourcesView: + return ResourcesView(self._resources) + + def routes(self) -> RoutesView: + return RoutesView(self._resources) + + def named_resources(self) -> Mapping[str, AbstractResource]: + return MappingProxyType(self._named_resources) + + def register_resource(self, resource: AbstractResource) -> None: + assert isinstance( + resource, AbstractResource + ), f"Instance of AbstractResource class is required, got {resource!r}" + if self.frozen: + raise RuntimeError("Cannot register a resource into frozen router.") + + name = resource.name + + if name is not None: + parts = self.NAME_SPLIT_RE.split(name) + for part in parts: + if keyword.iskeyword(part): + raise ValueError( + f"Incorrect route name {name!r}, " + "python keywords cannot be used " + "for route name" + ) + if not part.isidentifier(): + raise ValueError( + "Incorrect route name {!r}, " + "the name should be a sequence of " + "python identifiers separated " + "by dash, dot or column".format(name) + ) + if name in self._named_resources: + raise ValueError( + "Duplicate {!r}, " + "already handled by {!r}".format(name, self._named_resources[name]) + ) + self._named_resources[name] = resource + self._resources.append(resource) + + def add_resource(self, path: str, *, name: Optional[str] = None) -> Resource: + if path and not path.startswith("/"): + raise ValueError("path should be started with / or be empty") + # Reuse last added resource if path and name are the same + if self._resources: + resource = self._resources[-1] + if resource.name == name and resource.raw_match(path): + return cast(Resource, resource) + if not ("{" in path or "}" in path or ROUTE_RE.search(path)): + resource = PlainResource(_requote_path(path), name=name) + self.register_resource(resource) + return resource + resource = DynamicResource(path, name=name) + self.register_resource(resource) + return resource + + def add_route( + self, + method: str, + path: str, + handler: Union[Handler, Type[AbstractView]], + *, + name: Optional[str] = None, + expect_handler: Optional[_ExpectHandler] = None, + ) -> AbstractRoute: + resource = self.add_resource(path, name=name) + return resource.add_route(method, handler, expect_handler=expect_handler) + + def add_static( + self, + prefix: str, + path: PathLike, + *, + name: Optional[str] = None, + expect_handler: Optional[_ExpectHandler] = None, + chunk_size: int = 256 * 1024, + show_index: bool = False, + follow_symlinks: bool = False, + append_version: bool = False, + ) -> AbstractResource: + """Add static files view. + + prefix - url prefix + path - folder with files + + """ + assert prefix.startswith("/") + if prefix.endswith("/"): + prefix = prefix[:-1] + resource = StaticResource( + prefix, + path, + name=name, + expect_handler=expect_handler, + chunk_size=chunk_size, + show_index=show_index, + follow_symlinks=follow_symlinks, + append_version=append_version, + ) + self.register_resource(resource) + return resource + + def add_head(self, path: str, handler: Handler, **kwargs: Any) -> AbstractRoute: + """Shortcut for add_route with method HEAD.""" + return self.add_route(hdrs.METH_HEAD, path, handler, **kwargs) + + def add_options(self, path: str, handler: Handler, **kwargs: Any) -> AbstractRoute: + """Shortcut for add_route with method OPTIONS.""" + return self.add_route(hdrs.METH_OPTIONS, path, handler, **kwargs) + + def add_get( + self, + path: str, + handler: Handler, + *, + name: Optional[str] = None, + allow_head: bool = True, + **kwargs: Any, + ) -> AbstractRoute: + """Shortcut for add_route with method GET. + + If allow_head is true, another + route is added allowing head requests to the same endpoint. + """ + resource = self.add_resource(path, name=name) + if allow_head: + resource.add_route(hdrs.METH_HEAD, handler, **kwargs) + return resource.add_route(hdrs.METH_GET, handler, **kwargs) + + def add_post(self, path: str, handler: Handler, **kwargs: Any) -> AbstractRoute: + """Shortcut for add_route with method POST.""" + return self.add_route(hdrs.METH_POST, path, handler, **kwargs) + + def add_put(self, path: str, handler: Handler, **kwargs: Any) -> AbstractRoute: + """Shortcut for add_route with method PUT.""" + return self.add_route(hdrs.METH_PUT, path, handler, **kwargs) + + def add_patch(self, path: str, handler: Handler, **kwargs: Any) -> AbstractRoute: + """Shortcut for add_route with method PATCH.""" + return self.add_route(hdrs.METH_PATCH, path, handler, **kwargs) + + def add_delete(self, path: str, handler: Handler, **kwargs: Any) -> AbstractRoute: + """Shortcut for add_route with method DELETE.""" + return self.add_route(hdrs.METH_DELETE, path, handler, **kwargs) + + def add_view( + self, path: str, handler: Type[AbstractView], **kwargs: Any + ) -> AbstractRoute: + """Shortcut for add_route with ANY methods for a class-based view.""" + return self.add_route(hdrs.METH_ANY, path, handler, **kwargs) + + def freeze(self) -> None: + super().freeze() + for resource in self._resources: + resource.freeze() + + def add_routes(self, routes: Iterable[AbstractRouteDef]) -> List[AbstractRoute]: + """Append routes to route table. + + Parameter should be a sequence of RouteDef objects. + + Returns a list of registered AbstractRoute instances. + """ + registered_routes = [] + for route_def in routes: + registered_routes.extend(route_def.register(self)) + return registered_routes + + +def _quote_path(value: str) -> str: + if YARL_VERSION < (1, 6): + value = value.replace("%", "%25") + return URL.build(path=value, encoded=False).raw_path + + +def _unquote_path(value: str) -> str: + return URL.build(path=value, encoded=True).path + + +def _requote_path(value: str) -> str: + # Quote non-ascii characters and other characters which must be quoted, + # but preserve existing %-sequences. + result = _quote_path(value) + if "%" in value: + result = result.replace("%25", "%") + return result diff --git a/sbsheriff/Lib/site-packages/aiohttp/web_ws.py b/sbsheriff/Lib/site-packages/aiohttp/web_ws.py new file mode 100644 index 0000000..16b0a17 --- /dev/null +++ b/sbsheriff/Lib/site-packages/aiohttp/web_ws.py @@ -0,0 +1,487 @@ +import asyncio +import base64 +import binascii +import hashlib +import json +from typing import Any, Iterable, Optional, Tuple, cast + +import async_timeout +import attr +from multidict import CIMultiDict + +from . import hdrs +from .abc import AbstractStreamWriter +from .helpers import call_later, set_result +from .http import ( + WS_CLOSED_MESSAGE, + WS_CLOSING_MESSAGE, + WS_KEY, + WebSocketError, + WebSocketReader, + WebSocketWriter, + WSCloseCode, + WSMessage, + WSMsgType as WSMsgType, + ws_ext_gen, + ws_ext_parse, +) +from .log import ws_logger +from .streams import EofStream, FlowControlDataQueue +from .typedefs import Final, JSONDecoder, JSONEncoder +from .web_exceptions import HTTPBadRequest, HTTPException +from .web_request import BaseRequest +from .web_response import StreamResponse + +__all__ = ( + "WebSocketResponse", + "WebSocketReady", + "WSMsgType", +) + +THRESHOLD_CONNLOST_ACCESS: Final[int] = 5 + + +@attr.s(auto_attribs=True, frozen=True, slots=True) +class WebSocketReady: + ok: bool + protocol: Optional[str] + + def __bool__(self) -> bool: + return self.ok + + +class WebSocketResponse(StreamResponse): + + _length_check = False + + def __init__( + self, + *, + timeout: float = 10.0, + receive_timeout: Optional[float] = None, + autoclose: bool = True, + autoping: bool = True, + heartbeat: Optional[float] = None, + protocols: Iterable[str] = (), + compress: bool = True, + max_msg_size: int = 4 * 1024 * 1024, + ) -> None: + super().__init__(status=101) + self._protocols = protocols + self._ws_protocol = None # type: Optional[str] + self._writer = None # type: Optional[WebSocketWriter] + self._reader = None # type: Optional[FlowControlDataQueue[WSMessage]] + self._closed = False + self._closing = False + self._conn_lost = 0 + self._close_code = None # type: Optional[int] + self._loop = None # type: Optional[asyncio.AbstractEventLoop] + self._waiting = None # type: Optional[asyncio.Future[bool]] + self._exception = None # type: Optional[BaseException] + self._timeout = timeout + self._receive_timeout = receive_timeout + self._autoclose = autoclose + self._autoping = autoping + self._heartbeat = heartbeat + self._heartbeat_cb: Optional[asyncio.TimerHandle] = None + if heartbeat is not None: + self._pong_heartbeat = heartbeat / 2.0 + self._pong_response_cb: Optional[asyncio.TimerHandle] = None + self._compress = compress + self._max_msg_size = max_msg_size + + def _cancel_heartbeat(self) -> None: + if self._pong_response_cb is not None: + self._pong_response_cb.cancel() + self._pong_response_cb = None + + if self._heartbeat_cb is not None: + self._heartbeat_cb.cancel() + self._heartbeat_cb = None + + def _reset_heartbeat(self) -> None: + self._cancel_heartbeat() + + if self._heartbeat is not None: + assert self._loop is not None + self._heartbeat_cb = call_later( + self._send_heartbeat, self._heartbeat, self._loop + ) + + def _send_heartbeat(self) -> None: + if self._heartbeat is not None and not self._closed: + assert self._loop is not None + # fire-and-forget a task is not perfect but maybe ok for + # sending ping. Otherwise we need a long-living heartbeat + # task in the class. + self._loop.create_task(self._writer.ping()) # type: ignore[union-attr] + + if self._pong_response_cb is not None: + self._pong_response_cb.cancel() + self._pong_response_cb = call_later( + self._pong_not_received, self._pong_heartbeat, self._loop + ) + + def _pong_not_received(self) -> None: + if self._req is not None and self._req.transport is not None: + self._closed = True + self._close_code = WSCloseCode.ABNORMAL_CLOSURE + self._exception = asyncio.TimeoutError() + self._req.transport.close() + + async def prepare(self, request: BaseRequest) -> AbstractStreamWriter: + # make pre-check to don't hide it by do_handshake() exceptions + if self._payload_writer is not None: + return self._payload_writer + + protocol, writer = self._pre_start(request) + payload_writer = await super().prepare(request) + assert payload_writer is not None + self._post_start(request, protocol, writer) + await payload_writer.drain() + return payload_writer + + def _handshake( + self, request: BaseRequest + ) -> Tuple["CIMultiDict[str]", str, bool, bool]: + headers = request.headers + if "websocket" != headers.get(hdrs.UPGRADE, "").lower().strip(): + raise HTTPBadRequest( + text=( + "No WebSocket UPGRADE hdr: {}\n Can " + '"Upgrade" only to "WebSocket".' + ).format(headers.get(hdrs.UPGRADE)) + ) + + if "upgrade" not in headers.get(hdrs.CONNECTION, "").lower(): + raise HTTPBadRequest( + text="No CONNECTION upgrade hdr: {}".format( + headers.get(hdrs.CONNECTION) + ) + ) + + # find common sub-protocol between client and server + protocol = None + if hdrs.SEC_WEBSOCKET_PROTOCOL in headers: + req_protocols = [ + str(proto.strip()) + for proto in headers[hdrs.SEC_WEBSOCKET_PROTOCOL].split(",") + ] + + for proto in req_protocols: + if proto in self._protocols: + protocol = proto + break + else: + # No overlap found: Return no protocol as per spec + ws_logger.warning( + "Client protocols %r don’t overlap server-known ones %r", + req_protocols, + self._protocols, + ) + + # check supported version + version = headers.get(hdrs.SEC_WEBSOCKET_VERSION, "") + if version not in ("13", "8", "7"): + raise HTTPBadRequest(text=f"Unsupported version: {version}") + + # check client handshake for validity + key = headers.get(hdrs.SEC_WEBSOCKET_KEY) + try: + if not key or len(base64.b64decode(key)) != 16: + raise HTTPBadRequest(text=f"Handshake error: {key!r}") + except binascii.Error: + raise HTTPBadRequest(text=f"Handshake error: {key!r}") from None + + accept_val = base64.b64encode( + hashlib.sha1(key.encode() + WS_KEY).digest() + ).decode() + response_headers = CIMultiDict( # type: ignore[var-annotated] + { + hdrs.UPGRADE: "websocket", # type: ignore[arg-type] + hdrs.CONNECTION: "upgrade", + hdrs.SEC_WEBSOCKET_ACCEPT: accept_val, + } + ) + + notakeover = False + compress = 0 + if self._compress: + extensions = headers.get(hdrs.SEC_WEBSOCKET_EXTENSIONS) + # Server side always get return with no exception. + # If something happened, just drop compress extension + compress, notakeover = ws_ext_parse(extensions, isserver=True) + if compress: + enabledext = ws_ext_gen( + compress=compress, isserver=True, server_notakeover=notakeover + ) + response_headers[hdrs.SEC_WEBSOCKET_EXTENSIONS] = enabledext + + if protocol: + response_headers[hdrs.SEC_WEBSOCKET_PROTOCOL] = protocol + return ( + response_headers, + protocol, + compress, + notakeover, + ) # type: ignore[return-value] + + def _pre_start(self, request: BaseRequest) -> Tuple[str, WebSocketWriter]: + self._loop = request._loop + + headers, protocol, compress, notakeover = self._handshake(request) + + self.set_status(101) + self.headers.update(headers) + self.force_close() + self._compress = compress + transport = request._protocol.transport + assert transport is not None + writer = WebSocketWriter( + request._protocol, transport, compress=compress, notakeover=notakeover + ) + + return protocol, writer + + def _post_start( + self, request: BaseRequest, protocol: str, writer: WebSocketWriter + ) -> None: + self._ws_protocol = protocol + self._writer = writer + + self._reset_heartbeat() + + loop = self._loop + assert loop is not None + self._reader = FlowControlDataQueue(request._protocol, 2 ** 16, loop=loop) + request.protocol.set_parser( + WebSocketReader(self._reader, self._max_msg_size, compress=self._compress) + ) + # disable HTTP keepalive for WebSocket + request.protocol.keep_alive(False) + + def can_prepare(self, request: BaseRequest) -> WebSocketReady: + if self._writer is not None: + raise RuntimeError("Already started") + try: + _, protocol, _, _ = self._handshake(request) + except HTTPException: + return WebSocketReady(False, None) + else: + return WebSocketReady(True, protocol) + + @property + def closed(self) -> bool: + return self._closed + + @property + def close_code(self) -> Optional[int]: + return self._close_code + + @property + def ws_protocol(self) -> Optional[str]: + return self._ws_protocol + + @property + def compress(self) -> bool: + return self._compress + + def exception(self) -> Optional[BaseException]: + return self._exception + + async def ping(self, message: bytes = b"") -> None: + if self._writer is None: + raise RuntimeError("Call .prepare() first") + await self._writer.ping(message) + + async def pong(self, message: bytes = b"") -> None: + # unsolicited pong + if self._writer is None: + raise RuntimeError("Call .prepare() first") + await self._writer.pong(message) + + async def send_str(self, data: str, compress: Optional[bool] = None) -> None: + if self._writer is None: + raise RuntimeError("Call .prepare() first") + if not isinstance(data, str): + raise TypeError("data argument must be str (%r)" % type(data)) + await self._writer.send(data, binary=False, compress=compress) + + async def send_bytes(self, data: bytes, compress: Optional[bool] = None) -> None: + if self._writer is None: + raise RuntimeError("Call .prepare() first") + if not isinstance(data, (bytes, bytearray, memoryview)): + raise TypeError("data argument must be byte-ish (%r)" % type(data)) + await self._writer.send(data, binary=True, compress=compress) + + async def send_json( + self, + data: Any, + compress: Optional[bool] = None, + *, + dumps: JSONEncoder = json.dumps, + ) -> None: + await self.send_str(dumps(data), compress=compress) + + async def write_eof(self) -> None: # type: ignore[override] + if self._eof_sent: + return + if self._payload_writer is None: + raise RuntimeError("Response has not been started") + + await self.close() + self._eof_sent = True + + async def close(self, *, code: int = WSCloseCode.OK, message: bytes = b"") -> bool: + if self._writer is None: + raise RuntimeError("Call .prepare() first") + + self._cancel_heartbeat() + reader = self._reader + assert reader is not None + + # we need to break `receive()` cycle first, + # `close()` may be called from different task + if self._waiting is not None and not self._closed: + reader.feed_data(WS_CLOSING_MESSAGE, 0) + await self._waiting + + if not self._closed: + self._closed = True + try: + await self._writer.close(code, message) + writer = self._payload_writer + assert writer is not None + await writer.drain() + except (asyncio.CancelledError, asyncio.TimeoutError): + self._close_code = WSCloseCode.ABNORMAL_CLOSURE + raise + except Exception as exc: + self._close_code = WSCloseCode.ABNORMAL_CLOSURE + self._exception = exc + return True + + if self._closing: + return True + + reader = self._reader + assert reader is not None + try: + async with async_timeout.timeout(self._timeout): + msg = await reader.read() + except asyncio.CancelledError: + self._close_code = WSCloseCode.ABNORMAL_CLOSURE + raise + except Exception as exc: + self._close_code = WSCloseCode.ABNORMAL_CLOSURE + self._exception = exc + return True + + if msg.type == WSMsgType.CLOSE: + self._close_code = msg.data + return True + + self._close_code = WSCloseCode.ABNORMAL_CLOSURE + self._exception = asyncio.TimeoutError() + return True + else: + return False + + async def receive(self, timeout: Optional[float] = None) -> WSMessage: + if self._reader is None: + raise RuntimeError("Call .prepare() first") + + loop = self._loop + assert loop is not None + while True: + if self._waiting is not None: + raise RuntimeError("Concurrent call to receive() is not allowed") + + if self._closed: + self._conn_lost += 1 + if self._conn_lost >= THRESHOLD_CONNLOST_ACCESS: + raise RuntimeError("WebSocket connection is closed.") + return WS_CLOSED_MESSAGE + elif self._closing: + return WS_CLOSING_MESSAGE + + try: + self._waiting = loop.create_future() + try: + async with async_timeout.timeout(timeout or self._receive_timeout): + msg = await self._reader.read() + self._reset_heartbeat() + finally: + waiter = self._waiting + set_result(waiter, True) + self._waiting = None + except (asyncio.CancelledError, asyncio.TimeoutError): + self._close_code = WSCloseCode.ABNORMAL_CLOSURE + raise + except EofStream: + self._close_code = WSCloseCode.OK + await self.close() + return WSMessage(WSMsgType.CLOSED, None, None) + except WebSocketError as exc: + self._close_code = exc.code + await self.close(code=exc.code) + return WSMessage(WSMsgType.ERROR, exc, None) + except Exception as exc: + self._exception = exc + self._closing = True + self._close_code = WSCloseCode.ABNORMAL_CLOSURE + await self.close() + return WSMessage(WSMsgType.ERROR, exc, None) + + if msg.type == WSMsgType.CLOSE: + self._closing = True + self._close_code = msg.data + if not self._closed and self._autoclose: + await self.close() + elif msg.type == WSMsgType.CLOSING: + self._closing = True + elif msg.type == WSMsgType.PING and self._autoping: + await self.pong(msg.data) + continue + elif msg.type == WSMsgType.PONG and self._autoping: + continue + + return msg + + async def receive_str(self, *, timeout: Optional[float] = None) -> str: + msg = await self.receive(timeout) + if msg.type != WSMsgType.TEXT: + raise TypeError( + "Received message {}:{!r} is not WSMsgType.TEXT".format( + msg.type, msg.data + ) + ) + return cast(str, msg.data) + + async def receive_bytes(self, *, timeout: Optional[float] = None) -> bytes: + msg = await self.receive(timeout) + if msg.type != WSMsgType.BINARY: + raise TypeError(f"Received message {msg.type}:{msg.data!r} is not bytes") + return cast(bytes, msg.data) + + async def receive_json( + self, *, loads: JSONDecoder = json.loads, timeout: Optional[float] = None + ) -> Any: + data = await self.receive_str(timeout=timeout) + return loads(data) + + async def write(self, data: bytes) -> None: + raise RuntimeError("Cannot call .write() for websocket") + + def __aiter__(self) -> "WebSocketResponse": + return self + + async def __anext__(self) -> WSMessage: + msg = await self.receive() + if msg.type in (WSMsgType.CLOSE, WSMsgType.CLOSING, WSMsgType.CLOSED): + raise StopAsyncIteration + return msg + + def _cancel(self, exc: BaseException) -> None: + if self._reader is not None: + self._reader.set_exception(exc) diff --git a/sbsheriff/Lib/site-packages/aiohttp/worker.py b/sbsheriff/Lib/site-packages/aiohttp/worker.py new file mode 100644 index 0000000..08945bc --- /dev/null +++ b/sbsheriff/Lib/site-packages/aiohttp/worker.py @@ -0,0 +1,269 @@ +"""Async gunicorn worker for aiohttp.web""" + +import asyncio +import os +import re +import signal +import sys +from types import FrameType +from typing import Any, Awaitable, Callable, Optional, Union # noqa + +from gunicorn.config import AccessLogFormat as GunicornAccessLogFormat +from gunicorn.workers import base + +from aiohttp import web + +from .helpers import set_result +from .web_app import Application +from .web_log import AccessLogger + +try: + import ssl + + SSLContext = ssl.SSLContext +except ImportError: # pragma: no cover + ssl = None # type: ignore[assignment] + SSLContext = object # type: ignore[misc,assignment] + + +__all__ = ("GunicornWebWorker", "GunicornUVLoopWebWorker", "GunicornTokioWebWorker") + + +class GunicornWebWorker(base.Worker): # type: ignore[misc,no-any-unimported] + + DEFAULT_AIOHTTP_LOG_FORMAT = AccessLogger.LOG_FORMAT + DEFAULT_GUNICORN_LOG_FORMAT = GunicornAccessLogFormat.default + + def __init__(self, *args: Any, **kw: Any) -> None: # pragma: no cover + super().__init__(*args, **kw) + + self._task = None # type: Optional[asyncio.Task[None]] + self.exit_code = 0 + self._notify_waiter = None # type: Optional[asyncio.Future[bool]] + + def init_process(self) -> None: + # create new event_loop after fork + asyncio.get_event_loop().close() + + self.loop = asyncio.new_event_loop() + asyncio.set_event_loop(self.loop) + + super().init_process() + + def run(self) -> None: + self._task = self.loop.create_task(self._run()) + + try: # ignore all finalization problems + self.loop.run_until_complete(self._task) + except Exception: + self.log.exception("Exception in gunicorn worker") + self.loop.run_until_complete(self.loop.shutdown_asyncgens()) + self.loop.close() + + sys.exit(self.exit_code) + + async def _run(self) -> None: + runner = None + if isinstance(self.wsgi, Application): + app = self.wsgi + elif asyncio.iscoroutinefunction(self.wsgi): + wsgi = await self.wsgi() + if isinstance(wsgi, web.AppRunner): + runner = wsgi + app = runner.app + else: + app = wsgi + else: + raise RuntimeError( + "wsgi app should be either Application or " + "async function returning Application, got {}".format(self.wsgi) + ) + + if runner is None: + access_log = self.log.access_log if self.cfg.accesslog else None + runner = web.AppRunner( + app, + logger=self.log, + keepalive_timeout=self.cfg.keepalive, + access_log=access_log, + access_log_format=self._get_valid_log_format( + self.cfg.access_log_format + ), + ) + await runner.setup() + + ctx = self._create_ssl_context(self.cfg) if self.cfg.is_ssl else None + + runner = runner + assert runner is not None + server = runner.server + assert server is not None + for sock in self.sockets: + site = web.SockSite( + runner, + sock, + ssl_context=ctx, + shutdown_timeout=self.cfg.graceful_timeout / 100 * 95, + ) + await site.start() + + # If our parent changed then we shut down. + pid = os.getpid() + try: + while self.alive: # type: ignore[has-type] + self.notify() + + cnt = server.requests_count + if self.cfg.max_requests and cnt > self.cfg.max_requests: + self.alive = False + self.log.info("Max requests, shutting down: %s", self) + + elif pid == os.getpid() and self.ppid != os.getppid(): + self.alive = False + self.log.info("Parent changed, shutting down: %s", self) + else: + await self._wait_next_notify() + except BaseException: + pass + + await runner.cleanup() + + def _wait_next_notify(self) -> "asyncio.Future[bool]": + self._notify_waiter_done() + + loop = self.loop + assert loop is not None + self._notify_waiter = waiter = loop.create_future() + self.loop.call_later(1.0, self._notify_waiter_done, waiter) + + return waiter + + def _notify_waiter_done( + self, waiter: Optional["asyncio.Future[bool]"] = None + ) -> None: + if waiter is None: + waiter = self._notify_waiter + if waiter is not None: + set_result(waiter, True) + + if waiter is self._notify_waiter: + self._notify_waiter = None + + def init_signals(self) -> None: + # Set up signals through the event loop API. + + self.loop.add_signal_handler( + signal.SIGQUIT, self.handle_quit, signal.SIGQUIT, None + ) + + self.loop.add_signal_handler( + signal.SIGTERM, self.handle_exit, signal.SIGTERM, None + ) + + self.loop.add_signal_handler( + signal.SIGINT, self.handle_quit, signal.SIGINT, None + ) + + self.loop.add_signal_handler( + signal.SIGWINCH, self.handle_winch, signal.SIGWINCH, None + ) + + self.loop.add_signal_handler( + signal.SIGUSR1, self.handle_usr1, signal.SIGUSR1, None + ) + + self.loop.add_signal_handler( + signal.SIGABRT, self.handle_abort, signal.SIGABRT, None + ) + + # Don't let SIGTERM and SIGUSR1 disturb active requests + # by interrupting system calls + signal.siginterrupt(signal.SIGTERM, False) + signal.siginterrupt(signal.SIGUSR1, False) + # Reset signals so Gunicorn doesn't swallow subprocess return codes + # See: https://github.com/aio-libs/aiohttp/issues/6130 + if sys.version_info < (3, 8): + # Starting from Python 3.8, + # the default child watcher is ThreadedChildWatcher. + # The watcher doesn't depend on SIGCHLD signal, + # there is no need to reset it. + signal.signal(signal.SIGCHLD, signal.SIG_DFL) + + def handle_quit(self, sig: int, frame: FrameType) -> None: + self.alive = False + + # worker_int callback + self.cfg.worker_int(self) + + # wakeup closing process + self._notify_waiter_done() + + def handle_abort(self, sig: int, frame: FrameType) -> None: + self.alive = False + self.exit_code = 1 + self.cfg.worker_abort(self) + sys.exit(1) + + @staticmethod + def _create_ssl_context(cfg: Any) -> "SSLContext": + """Creates SSLContext instance for usage in asyncio.create_server. + + See ssl.SSLSocket.__init__ for more details. + """ + if ssl is None: # pragma: no cover + raise RuntimeError("SSL is not supported.") + + ctx = ssl.SSLContext(cfg.ssl_version) + ctx.load_cert_chain(cfg.certfile, cfg.keyfile) + ctx.verify_mode = cfg.cert_reqs + if cfg.ca_certs: + ctx.load_verify_locations(cfg.ca_certs) + if cfg.ciphers: + ctx.set_ciphers(cfg.ciphers) + return ctx + + def _get_valid_log_format(self, source_format: str) -> str: + if source_format == self.DEFAULT_GUNICORN_LOG_FORMAT: + return self.DEFAULT_AIOHTTP_LOG_FORMAT + elif re.search(r"%\([^\)]+\)", source_format): + raise ValueError( + "Gunicorn's style options in form of `%(name)s` are not " + "supported for the log formatting. Please use aiohttp's " + "format specification to configure access log formatting: " + "http://docs.aiohttp.org/en/stable/logging.html" + "#format-specification" + ) + else: + return source_format + + +class GunicornUVLoopWebWorker(GunicornWebWorker): + def init_process(self) -> None: + import uvloop + + # Close any existing event loop before setting a + # new policy. + asyncio.get_event_loop().close() + + # Setup uvloop policy, so that every + # asyncio.get_event_loop() will create an instance + # of uvloop event loop. + asyncio.set_event_loop_policy(uvloop.EventLoopPolicy()) + + super().init_process() + + +class GunicornTokioWebWorker(GunicornWebWorker): + def init_process(self) -> None: # pragma: no cover + import tokio + + # Close any existing event loop before setting a + # new policy. + asyncio.get_event_loop().close() + + # Setup tokio policy, so that every + # asyncio.get_event_loop() will create an instance + # of tokio event loop. + asyncio.set_event_loop_policy(tokio.EventLoopPolicy()) + + super().init_process() diff --git a/sbsheriff/Lib/site-packages/aiosignal-1.2.0.dist-info/INSTALLER b/sbsheriff/Lib/site-packages/aiosignal-1.2.0.dist-info/INSTALLER new file mode 100644 index 0000000..a1b589e --- /dev/null +++ b/sbsheriff/Lib/site-packages/aiosignal-1.2.0.dist-info/INSTALLER @@ -0,0 +1 @@ +pip diff --git a/sbsheriff/Lib/site-packages/aiosignal-1.2.0.dist-info/LICENSE b/sbsheriff/Lib/site-packages/aiosignal-1.2.0.dist-info/LICENSE new file mode 100644 index 0000000..7082a2d --- /dev/null +++ b/sbsheriff/Lib/site-packages/aiosignal-1.2.0.dist-info/LICENSE @@ -0,0 +1,201 @@ +Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS + + APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "{}" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + + Copyright 2013-2019 Nikolay Kim and Andrew Svetlov + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. diff --git a/sbsheriff/Lib/site-packages/aiosignal-1.2.0.dist-info/METADATA b/sbsheriff/Lib/site-packages/aiosignal-1.2.0.dist-info/METADATA new file mode 100644 index 0000000..aa63d49 --- /dev/null +++ b/sbsheriff/Lib/site-packages/aiosignal-1.2.0.dist-info/METADATA @@ -0,0 +1,208 @@ +Metadata-Version: 2.1 +Name: aiosignal +Version: 1.2.0 +Summary: aiosignal: a list of registered asynchronous callbacks +Home-page: https://github.com/aio-libs/aiosignal +Author: Nikolay Kim +Author-email: fafhrd91@gmail.com +Maintainer: Martijn Pieters +Maintainer-email: aio-libs@googlegroups.com +License: Apache 2 +Project-URL: Chat: Gitter, https://gitter.im/aio-libs/Lobby +Project-URL: CI: GitHub Actions, https://github.com/aio-libs/aiosignal/actions +Project-URL: Coverage: codecov, https://codecov.io/github/aio-libs/aiosignal +Project-URL: Docs: RTD, https://docs.aiosignal.org +Project-URL: GitHub: issues, https://github.com/aio-libs/aiosignal/issues +Project-URL: GitHub: repo, https://github.com/aio-libs/aiosignal +Platform: UNKNOWN +Classifier: License :: OSI Approved :: Apache Software License +Classifier: Intended Audience :: Developers +Classifier: Programming Language :: Python +Classifier: Programming Language :: Python :: 3 +Classifier: Programming Language :: Python :: 3 :: Only +Classifier: Programming Language :: Python :: 3.6 +Classifier: Programming Language :: Python :: 3.7 +Classifier: Programming Language :: Python :: 3.8 +Classifier: Programming Language :: Python :: 3.9 +Classifier: Programming Language :: Python :: 3.10 +Classifier: Development Status :: 5 - Production/Stable +Classifier: Operating System :: POSIX +Classifier: Operating System :: MacOS :: MacOS X +Classifier: Operating System :: Microsoft :: Windows +Classifier: Framework :: AsyncIO +Requires-Python: >=3.6 +Description-Content-Type: text/x-rst +License-File: LICENSE +Requires-Dist: frozenlist (>=1.1.0) + +========= +aiosignal +========= + +.. image:: https://github.com/aio-libs/aiosignal/workflows/CI/badge.svg + :target: https://github.com/aio-libs/aiosignal/actions?query=workflow%3ACI + :alt: GitHub status for master branch + +.. image:: https://codecov.io/gh/aio-libs/aiosignal/branch/master/graph/badge.svg + :target: https://codecov.io/gh/aio-libs/aiosignal + :alt: codecov.io status for master branch + +.. image:: https://badge.fury.io/py/aiosignal.svg + :target: https://pypi.org/project/aiosignal + :alt: Latest PyPI package version + +.. image:: https://readthedocs.org/projects/aiosignal/badge/?version=latest + :target: https://aiosignal.readthedocs.io/ + :alt: Latest Read The Docs + +.. image:: https://img.shields.io/discourse/topics?server=https%3A%2F%2Faio-libs.discourse.group%2F + :target: https://aio-libs.discourse.group/ + :alt: Discourse group for io-libs + +.. image:: https://badges.gitter.im/Join%20Chat.svg + :target: https://gitter.im/aio-libs/Lobby + :alt: Chat on Gitter + +Introduction +============ + +A project to manage callbacks in `asyncio` projects. + +``Signal`` is a list of registered asynchronous callbacks. + +The signal's life-cycle has two stages: after creation its content +could be filled by using standard list operations: ``sig.append()`` +etc. + +After you call ``sig.freeze()`` the signal is *frozen*: adding, removing +and dropping callbacks is forbidden. + +The only available operation is calling the previously registered +callbacks by using ``await sig.send(data)``. + +For concrete usage examples see the `Signals + +section of the `Web Server Advanced +` chapter of the `aiohttp +documentation`_. + + +Installation +------------ + +:: + + $ pip install aiosignal + +The library requires Python 3.6 or newer. + + +Documentation +============= + +https://aiosignal.readthedocs.io/ + +Communication channels +====================== + +*aio-libs* google group: https://groups.google.com/forum/#!forum/aio-libs + +Feel free to post your questions and ideas here. + +*gitter chat* https://gitter.im/aio-libs/Lobby + +Requirements +============ + +- Python >= 3.6 +- frozenlist >= 1.0.0 + +License +======= + +``aiosignal`` is offered under the Apache 2 license. + +Source code +=========== + +The project is hosted on GitHub_ + +Please file an issue in the `bug tracker +`_ if you have found a bug +or have some suggestions to improve the library. + +.. _GitHub: https://github.com/aio-libs/aiosignal +.. _aiohttp documentation: https://docs.aiohttp.org/ + +========= +Changelog +========= + +.. + You should *NOT* be adding new change log entries to this file, this + file is managed by towncrier. You *may* edit previous change logs to + fix problems like typo corrections or such. + To add a new change log entry, please see + https://pip.pypa.io/en/latest/development/contributing/#news-entries + we named the news folder "changes". + + WARNING: Don't drop the next directive! + +.. towncrier release notes start + + +1.2.0 (2021-10-16) +================== + +Features +-------- + +- Added support for Python 3.10. + `#328 `_ + + +Bugfixes +-------- + +- Mark aiosignal as Python3-only package + `#165 `_ + + +---- + + +1.1.2 (2020-11-27) +================== + +Features +-------- + +- Fix MANIFEST.in to include ``aiosignal/py.typed`` marker + + +1.1.1 (2020-11-27) +================== + +Features +-------- + +- Support type hints + +1.1.0 (2020-10-13) +================== + +Features +-------- + +- Added support of Python 3.8 and 3.9 + + +1.0.0 (2019-11-11) +================== + +Deprecations and Removals +------------------------- + +- Dropped support for Python 3.5; only 3.6, 3.7 and 3.8 are supported going forward. + `#23 `_ + diff --git a/sbsheriff/Lib/site-packages/aiosignal-1.2.0.dist-info/RECORD b/sbsheriff/Lib/site-packages/aiosignal-1.2.0.dist-info/RECORD new file mode 100644 index 0000000..5dd9a5f --- /dev/null +++ b/sbsheriff/Lib/site-packages/aiosignal-1.2.0.dist-info/RECORD @@ -0,0 +1,10 @@ +aiosignal-1.2.0.dist-info/INSTALLER,sha256=zuuue4knoyJ-UwPPXg8fezS7VCrXJQrAP7zeNuwvFQg,4 +aiosignal-1.2.0.dist-info/LICENSE,sha256=b9UkPpLdf5jsacesN3co50kFcJ_1J6W_mNbQJjwE9bY,11332 +aiosignal-1.2.0.dist-info/METADATA,sha256=_mpNKRs47LsjeAv7Hv0LpexfFiH1B74eOtJhDA8w6-I,5500 +aiosignal-1.2.0.dist-info/RECORD,, +aiosignal-1.2.0.dist-info/WHEEL,sha256=ewwEueio1C2XeHTvT17n8dZUJgOvyCWCt0WVNLClP9o,92 +aiosignal-1.2.0.dist-info/top_level.txt,sha256=z45aNOKGDdrI1roqZY3BGXQ22kJFPHBmVdwtLYLtXC0,10 +aiosignal/__init__.py,sha256=MGQyLD_0xNqLqPpBqxPj0CHKQjCIY1UFUK5PtHvCWbU,867 +aiosignal/__init__.pyi,sha256=xeCddYSS8fZAkz8S4HuKSR2IDe3N7RW_LKcXDPPA1Xk,311 +aiosignal/__pycache__/__init__.cpython-310.pyc,, +aiosignal/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 diff --git a/sbsheriff/Lib/site-packages/aiosignal-1.2.0.dist-info/WHEEL b/sbsheriff/Lib/site-packages/aiosignal-1.2.0.dist-info/WHEEL new file mode 100644 index 0000000..5bad85f --- /dev/null +++ b/sbsheriff/Lib/site-packages/aiosignal-1.2.0.dist-info/WHEEL @@ -0,0 +1,5 @@ +Wheel-Version: 1.0 +Generator: bdist_wheel (0.37.0) +Root-Is-Purelib: true +Tag: py3-none-any + diff --git a/sbsheriff/Lib/site-packages/aiosignal-1.2.0.dist-info/top_level.txt b/sbsheriff/Lib/site-packages/aiosignal-1.2.0.dist-info/top_level.txt new file mode 100644 index 0000000..ac6df3a --- /dev/null +++ b/sbsheriff/Lib/site-packages/aiosignal-1.2.0.dist-info/top_level.txt @@ -0,0 +1 @@ +aiosignal diff --git a/sbsheriff/Lib/site-packages/aiosignal/__init__.py b/sbsheriff/Lib/site-packages/aiosignal/__init__.py new file mode 100644 index 0000000..f3b9085 --- /dev/null +++ b/sbsheriff/Lib/site-packages/aiosignal/__init__.py @@ -0,0 +1,36 @@ +from frozenlist import FrozenList + +__version__ = "1.2.0" + +__all__ = ("Signal",) + + +class Signal(FrozenList): + """Coroutine-based signal implementation. + + To connect a callback to a signal, use any list method. + + Signals are fired using the send() coroutine, which takes named + arguments. + """ + + __slots__ = ("_owner",) + + def __init__(self, owner): + super().__init__() + self._owner = owner + + def __repr__(self): + return "".format( + self._owner, self.frozen, list(self) + ) + + async def send(self, *args, **kwargs): + """ + Sends data to all registered receivers. + """ + if not self.frozen: + raise RuntimeError("Cannot send non-frozen signal.") + + for receiver in self: + await receiver(*args, **kwargs) # type: ignore diff --git a/sbsheriff/Lib/site-packages/aiosignal/__init__.pyi b/sbsheriff/Lib/site-packages/aiosignal/__init__.pyi new file mode 100644 index 0000000..d4e3416 --- /dev/null +++ b/sbsheriff/Lib/site-packages/aiosignal/__init__.pyi @@ -0,0 +1,12 @@ +from typing import Any, Generic, TypeVar + +from frozenlist import FrozenList + +__all__ = ("Signal",) + +_T = TypeVar("_T") + +class Signal(FrozenList[_T], Generic[_T]): + def __init__(self, owner: Any) -> None: ... + def __repr__(self) -> str: ... + async def send(self, *args: Any, **kwargs: Any) -> None: ... diff --git a/sbsheriff/Lib/site-packages/aiosignal/__pycache__/__init__.cpython-310.pyc b/sbsheriff/Lib/site-packages/aiosignal/__pycache__/__init__.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..e48b5ed05bce8e43b851c1602ad6d5f54ac15fe5 GIT binary patch literal 1344 zcmZ8h&yO256t?F_GCP}XD^V38A!NAFk#+-ATtKBl+Lj+uwFedsjDjp@>?H0^JgMz; zX_}SV?n=G!H?$I$-Z}C=aGxtD{sk`Zo+p6?OZL1M+wXnvd!N(n?d1fGwyNkQBE3)`%e zxv!mHr5_D%4L^h*d&hceL|x&T%LDR<;Xa0sA|;gsa?mn{T*(VEp)!`qMOLOVmAwm6 z_GDjX@a?}K2`MwkyJIoN>es`@HcPLKIv5M5By%Al)AL2G=E`{Cbz_Ek&R~4ou&Oae zRh|h}iMk$(>V)|QyzbgQTRO#rdCY1kgUywnHF9>Hd#36`N=asg_QgDf2VMoHFue z0l_y|_Sxx7S2O0tiE_+{xsm~Zu+t@ia>L*vLA*IN%2rXwM_AFui3Pgruy}G#UeZ^D zk~Liu9!UZO(4!)5Q@30w+h&|=qdn&qn^;6`;#56p(-8YLZFe}YYT+E`ugRa^AAUOe z&ME6g$KL86M|ahuk@Jn6kFA~xskoadt0$9@8*i=qdOUL4tAhm)CZ@`bgl;;@KG>!n zE*{$+WPbxuBaEEpbal0(ZMZ#EQP|lIwDHOzOm_noNnesRc>qN|h>rU{)U%s!SW0d6PI}^={bE4-d*y;;4EIpYpTgQ`kDSj zzlL}86}0eSE+eQZUVRcYfVw;e`8Xzp7eS15&8(UNXoV`Xs#5w9w5!t$o?pFlD2!=* z&>b_4Ip|8=sCal(MD_~6Y6ssejn{K^&)UWoNuZ!jK!vXDot)yg%(n6WPYp=O$hWaV zWGZ^vOEQ{8H;|m&O;hniv4bR{#5r$s&gYF>)@Tnnf4CI&W~a}&Y%2H}r0D9#gA{{W z>@^5(QRMC3Mx>RhYuNp_Q#*JBL4+rtfe|2O(5oaHL|Jkz4Le6gTIL-S*m8?+sNLlp n$%8)uNDe6A)kAQ6T9-0}T%90pcLm%*Z92>~AW4)&*W +Author-email: andrew.svetlov@gmail.com +License: Apache 2 +Project-URL: Chat: Gitter, https://gitter.im/aio-libs/Lobby +Project-URL: CI: GitHub Actions, https://github.com/aio-libs/async-timeout/actions +Project-URL: Coverage: codecov, https://codecov.io/github/aio-libs/async-timeout +Project-URL: GitHub: issues, https://github.com/aio-libs/async-timeout/issues +Project-URL: GitHub: repo, https://github.com/aio-libs/async-timeout +Platform: UNKNOWN +Classifier: Development Status :: 5 - Production/Stable +Classifier: Topic :: Software Development :: Libraries +Classifier: Framework :: AsyncIO +Classifier: Intended Audience :: Developers +Classifier: License :: OSI Approved :: Apache Software License +Classifier: Programming Language :: Python +Classifier: Programming Language :: Python :: 3 +Classifier: Programming Language :: Python :: 3 :: Only +Classifier: Programming Language :: Python :: 3.6 +Classifier: Programming Language :: Python :: 3.7 +Classifier: Programming Language :: Python :: 3.8 +Classifier: Programming Language :: Python :: 3.9 +Classifier: Programming Language :: Python :: 3.10 +Requires-Python: >=3.6 +Description-Content-Type: text/x-rst +License-File: LICENSE +Requires-Dist: typing-extensions (>=3.6.5) ; python_version < "3.8" + +async-timeout +============= +.. image:: https://travis-ci.com/aio-libs/async-timeout.svg?branch=master + :target: https://travis-ci.com/aio-libs/async-timeout +.. image:: https://codecov.io/gh/aio-libs/async-timeout/branch/master/graph/badge.svg + :target: https://codecov.io/gh/aio-libs/async-timeout +.. image:: https://img.shields.io/pypi/v/async-timeout.svg + :target: https://pypi.python.org/pypi/async-timeout +.. image:: https://badges.gitter.im/Join%20Chat.svg + :target: https://gitter.im/aio-libs/Lobby + :alt: Chat on Gitter + +asyncio-compatible timeout context manager. + + +Usage example +------------- + + +The context manager is useful in cases when you want to apply timeout +logic around block of code or in cases when ``asyncio.wait_for()`` is +not suitable. Also it's much faster than ``asyncio.wait_for()`` +because ``timeout`` doesn't create a new task. + +The ``timeout(delay, *, loop=None)`` call returns a context manager +that cancels a block on *timeout* expiring:: + + async with timeout(1.5): + await inner() + +1. If ``inner()`` is executed faster than in ``1.5`` seconds nothing + happens. +2. Otherwise ``inner()`` is cancelled internally by sending + ``asyncio.CancelledError`` into but ``asyncio.TimeoutError`` is + raised outside of context manager scope. + +*timeout* parameter could be ``None`` for skipping timeout functionality. + + +Alternatively, ``timeout_at(when)`` can be used for scheduling +at the absolute time:: + + loop = asyncio.get_event_loop() + now = loop.time() + + async with timeout_at(now + 1.5): + await inner() + + +Please note: it is not POSIX time but a time with +undefined starting base, e.g. the time of the system power on. + + +Context manager has ``.expired`` property for check if timeout happens +exactly in context manager:: + + async with timeout(1.5) as cm: + await inner() + print(cm.expired) + +The property is ``True`` if ``inner()`` execution is cancelled by +timeout context manager. + +If ``inner()`` call explicitly raises ``TimeoutError`` ``cm.expired`` +is ``False``. + +The scheduled deadline time is available as ``.deadline`` property:: + + async with timeout(1.5) as cm: + cm.deadline + +Not finished yet timeout can be rescheduled by ``shift_by()`` +or ``shift_to()`` methods:: + + async with timeout(1.5) as cm: + cm.shift(1) # add another second on waiting + cm.update(loop.time() + 5) # reschedule to now+5 seconds + +Rescheduling is forbidden if the timeout is expired or after exit from ``async with`` +code block. + + +Installation +------------ + +:: + + $ pip install async-timeout + +The library is Python 3 only! + + + +Authors and License +------------------- + +The module is written by Andrew Svetlov. + +It's *Apache 2* licensed and freely available. + + diff --git a/sbsheriff/Lib/site-packages/async_timeout-4.0.2.dist-info/RECORD b/sbsheriff/Lib/site-packages/async_timeout-4.0.2.dist-info/RECORD new file mode 100644 index 0000000..97f5f31 --- /dev/null +++ b/sbsheriff/Lib/site-packages/async_timeout-4.0.2.dist-info/RECORD @@ -0,0 +1,10 @@ +async_timeout-4.0.2.dist-info/INSTALLER,sha256=zuuue4knoyJ-UwPPXg8fezS7VCrXJQrAP7zeNuwvFQg,4 +async_timeout-4.0.2.dist-info/LICENSE,sha256=4Y17uPUT4sRrtYXJS1hb0wcg3TzLId2weG9y0WZY-Sw,568 +async_timeout-4.0.2.dist-info/METADATA,sha256=2pfMxxBst5vQ7SfMy5TDaDU0cRgCSQa7wcD5eI-Ew-8,4193 +async_timeout-4.0.2.dist-info/RECORD,, +async_timeout-4.0.2.dist-info/WHEEL,sha256=ewwEueio1C2XeHTvT17n8dZUJgOvyCWCt0WVNLClP9o,92 +async_timeout-4.0.2.dist-info/top_level.txt,sha256=9oM4e7Twq8iD_7_Q3Mz0E6GPIB6vJvRFo-UBwUQtBDU,14 +async_timeout-4.0.2.dist-info/zip-safe,sha256=AbpHGcgLb-kRsJGnwFEktk7uzpZOCcBY74-YBdrKVGs,1 +async_timeout/__init__.py,sha256=N-JUI_VExhHnO0emkF_-h08dl4HBgOje16N4Ci-W-go,7487 +async_timeout/__pycache__/__init__.cpython-310.pyc,, +async_timeout/py.typed,sha256=tyozzRT1fziXETDxokmuyt6jhOmtjUbnVNJdZcG7ik0,12 diff --git a/sbsheriff/Lib/site-packages/async_timeout-4.0.2.dist-info/WHEEL b/sbsheriff/Lib/site-packages/async_timeout-4.0.2.dist-info/WHEEL new file mode 100644 index 0000000..5bad85f --- /dev/null +++ b/sbsheriff/Lib/site-packages/async_timeout-4.0.2.dist-info/WHEEL @@ -0,0 +1,5 @@ +Wheel-Version: 1.0 +Generator: bdist_wheel (0.37.0) +Root-Is-Purelib: true +Tag: py3-none-any + diff --git a/sbsheriff/Lib/site-packages/async_timeout-4.0.2.dist-info/top_level.txt b/sbsheriff/Lib/site-packages/async_timeout-4.0.2.dist-info/top_level.txt new file mode 100644 index 0000000..ad29955 --- /dev/null +++ b/sbsheriff/Lib/site-packages/async_timeout-4.0.2.dist-info/top_level.txt @@ -0,0 +1 @@ +async_timeout diff --git a/sbsheriff/Lib/site-packages/async_timeout-4.0.2.dist-info/zip-safe b/sbsheriff/Lib/site-packages/async_timeout-4.0.2.dist-info/zip-safe new file mode 100644 index 0000000..8b13789 --- /dev/null +++ b/sbsheriff/Lib/site-packages/async_timeout-4.0.2.dist-info/zip-safe @@ -0,0 +1 @@ + diff --git a/sbsheriff/Lib/site-packages/async_timeout/__init__.py b/sbsheriff/Lib/site-packages/async_timeout/__init__.py new file mode 100644 index 0000000..179d1b0 --- /dev/null +++ b/sbsheriff/Lib/site-packages/async_timeout/__init__.py @@ -0,0 +1,247 @@ +import asyncio +import enum +import sys +import warnings +from types import TracebackType +from typing import Any, Optional, Type + + +if sys.version_info >= (3, 8): + from typing import final +else: + from typing_extensions import final + + +__version__ = "4.0.2" + + +__all__ = ("timeout", "timeout_at", "Timeout") + + +def timeout(delay: Optional[float]) -> "Timeout": + """timeout context manager. + + Useful in cases when you want to apply timeout logic around block + of code or in cases when asyncio.wait_for is not suitable. For example: + + >>> async with timeout(0.001): + ... async with aiohttp.get('https://github.com') as r: + ... await r.text() + + + delay - value in seconds or None to disable timeout logic + """ + loop = _get_running_loop() + if delay is not None: + deadline = loop.time() + delay # type: Optional[float] + else: + deadline = None + return Timeout(deadline, loop) + + +def timeout_at(deadline: Optional[float]) -> "Timeout": + """Schedule the timeout at absolute time. + + deadline argument points on the time in the same clock system + as loop.time(). + + Please note: it is not POSIX time but a time with + undefined starting base, e.g. the time of the system power on. + + >>> async with timeout_at(loop.time() + 10): + ... async with aiohttp.get('https://github.com') as r: + ... await r.text() + + + """ + loop = _get_running_loop() + return Timeout(deadline, loop) + + +class _State(enum.Enum): + INIT = "INIT" + ENTER = "ENTER" + TIMEOUT = "TIMEOUT" + EXIT = "EXIT" + + +@final +class Timeout: + # Internal class, please don't instantiate it directly + # Use timeout() and timeout_at() public factories instead. + # + # Implementation note: `async with timeout()` is preferred + # over `with timeout()`. + # While technically the Timeout class implementation + # doesn't need to be async at all, + # the `async with` statement explicitly points that + # the context manager should be used from async function context. + # + # This design allows to avoid many silly misusages. + # + # TimeoutError is raised immadiatelly when scheduled + # if the deadline is passed. + # The purpose is to time out as sson as possible + # without waiting for the next await expression. + + __slots__ = ("_deadline", "_loop", "_state", "_timeout_handler") + + def __init__( + self, deadline: Optional[float], loop: asyncio.AbstractEventLoop + ) -> None: + self._loop = loop + self._state = _State.INIT + + self._timeout_handler = None # type: Optional[asyncio.Handle] + if deadline is None: + self._deadline = None # type: Optional[float] + else: + self.update(deadline) + + def __enter__(self) -> "Timeout": + warnings.warn( + "with timeout() is deprecated, use async with timeout() instead", + DeprecationWarning, + stacklevel=2, + ) + self._do_enter() + return self + + def __exit__( + self, + exc_type: Optional[Type[BaseException]], + exc_val: Optional[BaseException], + exc_tb: Optional[TracebackType], + ) -> Optional[bool]: + self._do_exit(exc_type) + return None + + async def __aenter__(self) -> "Timeout": + self._do_enter() + return self + + async def __aexit__( + self, + exc_type: Optional[Type[BaseException]], + exc_val: Optional[BaseException], + exc_tb: Optional[TracebackType], + ) -> Optional[bool]: + self._do_exit(exc_type) + return None + + @property + def expired(self) -> bool: + """Is timeout expired during execution?""" + return self._state == _State.TIMEOUT + + @property + def deadline(self) -> Optional[float]: + return self._deadline + + def reject(self) -> None: + """Reject scheduled timeout if any.""" + # cancel is maybe better name but + # task.cancel() raises CancelledError in asyncio world. + if self._state not in (_State.INIT, _State.ENTER): + raise RuntimeError(f"invalid state {self._state.value}") + self._reject() + + def _reject(self) -> None: + if self._timeout_handler is not None: + self._timeout_handler.cancel() + self._timeout_handler = None + + def shift(self, delay: float) -> None: + """Advance timeout on delay seconds. + + The delay can be negative. + + Raise RuntimeError if shift is called when deadline is not scheduled + """ + deadline = self._deadline + if deadline is None: + raise RuntimeError("cannot shift timeout if deadline is not scheduled") + self.update(deadline + delay) + + def update(self, deadline: float) -> None: + """Set deadline to absolute value. + + deadline argument points on the time in the same clock system + as loop.time(). + + If new deadline is in the past the timeout is raised immediatelly. + + Please note: it is not POSIX time but a time with + undefined starting base, e.g. the time of the system power on. + """ + if self._state == _State.EXIT: + raise RuntimeError("cannot reschedule after exit from context manager") + if self._state == _State.TIMEOUT: + raise RuntimeError("cannot reschedule expired timeout") + if self._timeout_handler is not None: + self._timeout_handler.cancel() + self._deadline = deadline + if self._state != _State.INIT: + self._reschedule() + + def _reschedule(self) -> None: + assert self._state == _State.ENTER + deadline = self._deadline + if deadline is None: + return + + now = self._loop.time() + if self._timeout_handler is not None: + self._timeout_handler.cancel() + + task = _current_task(self._loop) + if deadline <= now: + self._timeout_handler = self._loop.call_soon(self._on_timeout, task) + else: + self._timeout_handler = self._loop.call_at(deadline, self._on_timeout, task) + + def _do_enter(self) -> None: + if self._state != _State.INIT: + raise RuntimeError(f"invalid state {self._state.value}") + self._state = _State.ENTER + self._reschedule() + + def _do_exit(self, exc_type: Optional[Type[BaseException]]) -> None: + if exc_type is asyncio.CancelledError and self._state == _State.TIMEOUT: + self._timeout_handler = None + raise asyncio.TimeoutError + # timeout has not expired + self._state = _State.EXIT + self._reject() + return None + + def _on_timeout(self, task: "asyncio.Task[None]") -> None: + task.cancel() + self._state = _State.TIMEOUT + # drop the reference early + self._timeout_handler = None + + +if sys.version_info >= (3, 7): + + def _current_task(loop: asyncio.AbstractEventLoop) -> "Optional[asyncio.Task[Any]]": + return asyncio.current_task(loop=loop) + +else: + + def _current_task(loop: asyncio.AbstractEventLoop) -> "Optional[asyncio.Task[Any]]": + return asyncio.Task.current_task(loop=loop) + + +if sys.version_info >= (3, 7): + + def _get_running_loop() -> asyncio.AbstractEventLoop: + return asyncio.get_running_loop() + +else: + + def _get_running_loop() -> asyncio.AbstractEventLoop: + loop = asyncio.get_event_loop() + if not loop.is_running(): + raise RuntimeError("no running event loop") + return loop diff --git a/sbsheriff/Lib/site-packages/async_timeout/__pycache__/__init__.cpython-310.pyc b/sbsheriff/Lib/site-packages/async_timeout/__pycache__/__init__.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..2b8948d865705040327243b22c380630c139b4ee GIT binary patch literal 6895 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 Z*;rnxF6hNMrv2Q0dRbpA*ybY2{{Wl&A#wl! literal 0 HcmV?d00001 diff --git a/sbsheriff/Lib/site-packages/async_timeout/py.typed b/sbsheriff/Lib/site-packages/async_timeout/py.typed new file mode 100644 index 0000000..3b94f91 --- /dev/null +++ b/sbsheriff/Lib/site-packages/async_timeout/py.typed @@ -0,0 +1 @@ +Placeholder diff --git a/sbsheriff/Lib/site-packages/attr/__init__.py b/sbsheriff/Lib/site-packages/attr/__init__.py new file mode 100644 index 0000000..386305d --- /dev/null +++ b/sbsheriff/Lib/site-packages/attr/__init__.py @@ -0,0 +1,79 @@ +# SPDX-License-Identifier: MIT + + +import sys + +from functools import partial + +from . import converters, exceptions, filters, setters, validators +from ._cmp import cmp_using +from ._config import get_run_validators, set_run_validators +from ._funcs import asdict, assoc, astuple, evolve, has, resolve_types +from ._make import ( + NOTHING, + Attribute, + Factory, + attrib, + attrs, + fields, + fields_dict, + make_class, + validate, +) +from ._version_info import VersionInfo + + +__version__ = "22.1.0" +__version_info__ = VersionInfo._from_version_string(__version__) + +__title__ = "attrs" +__description__ = "Classes Without Boilerplate" +__url__ = "https://www.attrs.org/" +__uri__ = __url__ +__doc__ = __description__ + " <" + __uri__ + ">" + +__author__ = "Hynek Schlawack" +__email__ = "hs@ox.cx" + +__license__ = "MIT" +__copyright__ = "Copyright (c) 2015 Hynek Schlawack" + + +s = attributes = attrs +ib = attr = attrib +dataclass = partial(attrs, auto_attribs=True) # happy Easter ;) + +__all__ = [ + "Attribute", + "Factory", + "NOTHING", + "asdict", + "assoc", + "astuple", + "attr", + "attrib", + "attributes", + "attrs", + "cmp_using", + "converters", + "evolve", + "exceptions", + "fields", + "fields_dict", + "filters", + "get_run_validators", + "has", + "ib", + "make_class", + "resolve_types", + "s", + "set_run_validators", + "setters", + "validate", + "validators", +] + +if sys.version_info[:2] >= (3, 6): + from ._next_gen import define, field, frozen, mutable # noqa: F401 + + __all__.extend(("define", "field", "frozen", "mutable")) diff --git a/sbsheriff/Lib/site-packages/attr/__init__.pyi b/sbsheriff/Lib/site-packages/attr/__init__.pyi new file mode 100644 index 0000000..03cc4c8 --- /dev/null +++ b/sbsheriff/Lib/site-packages/attr/__init__.pyi @@ -0,0 +1,486 @@ +import sys + +from typing import ( + Any, + Callable, + ClassVar, + Dict, + Generic, + List, + Mapping, + Optional, + Protocol, + Sequence, + Tuple, + Type, + TypeVar, + Union, + overload, +) + +# `import X as X` is required to make these public +from . import converters as converters +from . import exceptions as exceptions +from . import filters as filters +from . import setters as setters +from . import validators as validators +from ._cmp import cmp_using as cmp_using +from ._version_info import VersionInfo + +__version__: str +__version_info__: VersionInfo +__title__: str +__description__: str +__url__: str +__uri__: str +__author__: str +__email__: str +__license__: str +__copyright__: str + +_T = TypeVar("_T") +_C = TypeVar("_C", bound=type) + +_EqOrderType = Union[bool, Callable[[Any], Any]] +_ValidatorType = Callable[[Any, Attribute[_T], _T], Any] +_ConverterType = Callable[[Any], Any] +_FilterType = Callable[[Attribute[_T], _T], bool] +_ReprType = Callable[[Any], str] +_ReprArgType = Union[bool, _ReprType] +_OnSetAttrType = Callable[[Any, Attribute[Any], Any], Any] +_OnSetAttrArgType = Union[ + _OnSetAttrType, List[_OnSetAttrType], setters._NoOpType +] +_FieldTransformer = Callable[ + [type, List[Attribute[Any]]], List[Attribute[Any]] +] +# FIXME: in reality, if multiple validators are passed they must be in a list +# or tuple, but those are invariant and so would prevent subtypes of +# _ValidatorType from working when passed in a list or tuple. +_ValidatorArgType = Union[_ValidatorType[_T], Sequence[_ValidatorType[_T]]] + +# A protocol to be able to statically accept an attrs class. +class AttrsInstance(Protocol): + __attrs_attrs__: ClassVar[Any] + +# _make -- + +NOTHING: object + +# NOTE: Factory lies about its return type to make this possible: +# `x: List[int] # = Factory(list)` +# Work around mypy issue #4554 in the common case by using an overload. +if sys.version_info >= (3, 8): + from typing import Literal + @overload + def Factory(factory: Callable[[], _T]) -> _T: ... + @overload + def Factory( + factory: Callable[[Any], _T], + takes_self: Literal[True], + ) -> _T: ... + @overload + def Factory( + factory: Callable[[], _T], + takes_self: Literal[False], + ) -> _T: ... + +else: + @overload + def Factory(factory: Callable[[], _T]) -> _T: ... + @overload + def Factory( + factory: Union[Callable[[Any], _T], Callable[[], _T]], + takes_self: bool = ..., + ) -> _T: ... + +# Static type inference support via __dataclass_transform__ implemented as per: +# https://github.com/microsoft/pyright/blob/1.1.135/specs/dataclass_transforms.md +# This annotation must be applied to all overloads of "define" and "attrs" +# +# NOTE: This is a typing construct and does not exist at runtime. Extensions +# wrapping attrs decorators should declare a separate __dataclass_transform__ +# signature in the extension module using the specification linked above to +# provide pyright support. +def __dataclass_transform__( + *, + eq_default: bool = True, + order_default: bool = False, + kw_only_default: bool = False, + field_descriptors: Tuple[Union[type, Callable[..., Any]], ...] = (()), +) -> Callable[[_T], _T]: ... + +class Attribute(Generic[_T]): + name: str + default: Optional[_T] + validator: Optional[_ValidatorType[_T]] + repr: _ReprArgType + cmp: _EqOrderType + eq: _EqOrderType + order: _EqOrderType + hash: Optional[bool] + init: bool + converter: Optional[_ConverterType] + metadata: Dict[Any, Any] + type: Optional[Type[_T]] + kw_only: bool + on_setattr: _OnSetAttrType + def evolve(self, **changes: Any) -> "Attribute[Any]": ... + +# NOTE: We had several choices for the annotation to use for type arg: +# 1) Type[_T] +# - Pros: Handles simple cases correctly +# - Cons: Might produce less informative errors in the case of conflicting +# TypeVars e.g. `attr.ib(default='bad', type=int)` +# 2) Callable[..., _T] +# - Pros: Better error messages than #1 for conflicting TypeVars +# - Cons: Terrible error messages for validator checks. +# e.g. attr.ib(type=int, validator=validate_str) +# -> error: Cannot infer function type argument +# 3) type (and do all of the work in the mypy plugin) +# - Pros: Simple here, and we could customize the plugin with our own errors. +# - Cons: Would need to write mypy plugin code to handle all the cases. +# We chose option #1. + +# `attr` lies about its return type to make the following possible: +# attr() -> Any +# attr(8) -> int +# attr(validator=) -> Whatever the callable expects. +# This makes this type of assignments possible: +# x: int = attr(8) +# +# This form catches explicit None or no default but with no other arguments +# returns Any. +@overload +def attrib( + default: None = ..., + validator: None = ..., + repr: _ReprArgType = ..., + cmp: Optional[_EqOrderType] = ..., + hash: Optional[bool] = ..., + init: bool = ..., + metadata: Optional[Mapping[Any, Any]] = ..., + type: None = ..., + converter: None = ..., + factory: None = ..., + kw_only: bool = ..., + eq: Optional[_EqOrderType] = ..., + order: Optional[_EqOrderType] = ..., + on_setattr: Optional[_OnSetAttrArgType] = ..., +) -> Any: ... + +# This form catches an explicit None or no default and infers the type from the +# other arguments. +@overload +def attrib( + default: None = ..., + validator: Optional[_ValidatorArgType[_T]] = ..., + repr: _ReprArgType = ..., + cmp: Optional[_EqOrderType] = ..., + hash: Optional[bool] = ..., + init: bool = ..., + metadata: Optional[Mapping[Any, Any]] = ..., + type: Optional[Type[_T]] = ..., + converter: Optional[_ConverterType] = ..., + factory: Optional[Callable[[], _T]] = ..., + kw_only: bool = ..., + eq: Optional[_EqOrderType] = ..., + order: Optional[_EqOrderType] = ..., + on_setattr: Optional[_OnSetAttrArgType] = ..., +) -> _T: ... + +# This form catches an explicit default argument. +@overload +def attrib( + default: _T, + validator: Optional[_ValidatorArgType[_T]] = ..., + repr: _ReprArgType = ..., + cmp: Optional[_EqOrderType] = ..., + hash: Optional[bool] = ..., + init: bool = ..., + metadata: Optional[Mapping[Any, Any]] = ..., + type: Optional[Type[_T]] = ..., + converter: Optional[_ConverterType] = ..., + factory: Optional[Callable[[], _T]] = ..., + kw_only: bool = ..., + eq: Optional[_EqOrderType] = ..., + order: Optional[_EqOrderType] = ..., + on_setattr: Optional[_OnSetAttrArgType] = ..., +) -> _T: ... + +# This form covers type=non-Type: e.g. forward references (str), Any +@overload +def attrib( + default: Optional[_T] = ..., + validator: Optional[_ValidatorArgType[_T]] = ..., + repr: _ReprArgType = ..., + cmp: Optional[_EqOrderType] = ..., + hash: Optional[bool] = ..., + init: bool = ..., + metadata: Optional[Mapping[Any, Any]] = ..., + type: object = ..., + converter: Optional[_ConverterType] = ..., + factory: Optional[Callable[[], _T]] = ..., + kw_only: bool = ..., + eq: Optional[_EqOrderType] = ..., + order: Optional[_EqOrderType] = ..., + on_setattr: Optional[_OnSetAttrArgType] = ..., +) -> Any: ... +@overload +def field( + *, + default: None = ..., + validator: None = ..., + repr: _ReprArgType = ..., + hash: Optional[bool] = ..., + init: bool = ..., + metadata: Optional[Mapping[Any, Any]] = ..., + converter: None = ..., + factory: None = ..., + kw_only: bool = ..., + eq: Optional[bool] = ..., + order: Optional[bool] = ..., + on_setattr: Optional[_OnSetAttrArgType] = ..., +) -> Any: ... + +# This form catches an explicit None or no default and infers the type from the +# other arguments. +@overload +def field( + *, + default: None = ..., + validator: Optional[_ValidatorArgType[_T]] = ..., + repr: _ReprArgType = ..., + hash: Optional[bool] = ..., + init: bool = ..., + metadata: Optional[Mapping[Any, Any]] = ..., + converter: Optional[_ConverterType] = ..., + factory: Optional[Callable[[], _T]] = ..., + kw_only: bool = ..., + eq: Optional[_EqOrderType] = ..., + order: Optional[_EqOrderType] = ..., + on_setattr: Optional[_OnSetAttrArgType] = ..., +) -> _T: ... + +# This form catches an explicit default argument. +@overload +def field( + *, + default: _T, + validator: Optional[_ValidatorArgType[_T]] = ..., + repr: _ReprArgType = ..., + hash: Optional[bool] = ..., + init: bool = ..., + metadata: Optional[Mapping[Any, Any]] = ..., + converter: Optional[_ConverterType] = ..., + factory: Optional[Callable[[], _T]] = ..., + kw_only: bool = ..., + eq: Optional[_EqOrderType] = ..., + order: Optional[_EqOrderType] = ..., + on_setattr: Optional[_OnSetAttrArgType] = ..., +) -> _T: ... + +# This form covers type=non-Type: e.g. forward references (str), Any +@overload +def field( + *, + default: Optional[_T] = ..., + validator: Optional[_ValidatorArgType[_T]] = ..., + repr: _ReprArgType = ..., + hash: Optional[bool] = ..., + init: bool = ..., + metadata: Optional[Mapping[Any, Any]] = ..., + converter: Optional[_ConverterType] = ..., + factory: Optional[Callable[[], _T]] = ..., + kw_only: bool = ..., + eq: Optional[_EqOrderType] = ..., + order: Optional[_EqOrderType] = ..., + on_setattr: Optional[_OnSetAttrArgType] = ..., +) -> Any: ... +@overload +@__dataclass_transform__(order_default=True, field_descriptors=(attrib, field)) +def attrs( + maybe_cls: _C, + these: Optional[Dict[str, Any]] = ..., + repr_ns: Optional[str] = ..., + repr: bool = ..., + cmp: Optional[_EqOrderType] = ..., + hash: Optional[bool] = ..., + init: bool = ..., + slots: bool = ..., + frozen: bool = ..., + weakref_slot: bool = ..., + str: bool = ..., + auto_attribs: bool = ..., + kw_only: bool = ..., + cache_hash: bool = ..., + auto_exc: bool = ..., + eq: Optional[_EqOrderType] = ..., + order: Optional[_EqOrderType] = ..., + auto_detect: bool = ..., + collect_by_mro: bool = ..., + getstate_setstate: Optional[bool] = ..., + on_setattr: Optional[_OnSetAttrArgType] = ..., + field_transformer: Optional[_FieldTransformer] = ..., + match_args: bool = ..., +) -> _C: ... +@overload +@__dataclass_transform__(order_default=True, field_descriptors=(attrib, field)) +def attrs( + maybe_cls: None = ..., + these: Optional[Dict[str, Any]] = ..., + repr_ns: Optional[str] = ..., + repr: bool = ..., + cmp: Optional[_EqOrderType] = ..., + hash: Optional[bool] = ..., + init: bool = ..., + slots: bool = ..., + frozen: bool = ..., + weakref_slot: bool = ..., + str: bool = ..., + auto_attribs: bool = ..., + kw_only: bool = ..., + cache_hash: bool = ..., + auto_exc: bool = ..., + eq: Optional[_EqOrderType] = ..., + order: Optional[_EqOrderType] = ..., + auto_detect: bool = ..., + collect_by_mro: bool = ..., + getstate_setstate: Optional[bool] = ..., + on_setattr: Optional[_OnSetAttrArgType] = ..., + field_transformer: Optional[_FieldTransformer] = ..., + match_args: bool = ..., +) -> Callable[[_C], _C]: ... +@overload +@__dataclass_transform__(field_descriptors=(attrib, field)) +def define( + maybe_cls: _C, + *, + these: Optional[Dict[str, Any]] = ..., + repr: bool = ..., + hash: Optional[bool] = ..., + init: bool = ..., + slots: bool = ..., + frozen: bool = ..., + weakref_slot: bool = ..., + str: bool = ..., + auto_attribs: bool = ..., + kw_only: bool = ..., + cache_hash: bool = ..., + auto_exc: bool = ..., + eq: Optional[bool] = ..., + order: Optional[bool] = ..., + auto_detect: bool = ..., + getstate_setstate: Optional[bool] = ..., + on_setattr: Optional[_OnSetAttrArgType] = ..., + field_transformer: Optional[_FieldTransformer] = ..., + match_args: bool = ..., +) -> _C: ... +@overload +@__dataclass_transform__(field_descriptors=(attrib, field)) +def define( + maybe_cls: None = ..., + *, + these: Optional[Dict[str, Any]] = ..., + repr: bool = ..., + hash: Optional[bool] = ..., + init: bool = ..., + slots: bool = ..., + frozen: bool = ..., + weakref_slot: bool = ..., + str: bool = ..., + auto_attribs: bool = ..., + kw_only: bool = ..., + cache_hash: bool = ..., + auto_exc: bool = ..., + eq: Optional[bool] = ..., + order: Optional[bool] = ..., + auto_detect: bool = ..., + getstate_setstate: Optional[bool] = ..., + on_setattr: Optional[_OnSetAttrArgType] = ..., + field_transformer: Optional[_FieldTransformer] = ..., + match_args: bool = ..., +) -> Callable[[_C], _C]: ... + +mutable = define +frozen = define # they differ only in their defaults + +def fields(cls: Type[AttrsInstance]) -> Any: ... +def fields_dict(cls: Type[AttrsInstance]) -> Dict[str, Attribute[Any]]: ... +def validate(inst: AttrsInstance) -> None: ... +def resolve_types( + cls: _C, + globalns: Optional[Dict[str, Any]] = ..., + localns: Optional[Dict[str, Any]] = ..., + attribs: Optional[List[Attribute[Any]]] = ..., +) -> _C: ... + +# TODO: add support for returning a proper attrs class from the mypy plugin +# we use Any instead of _CountingAttr so that e.g. `make_class('Foo', +# [attr.ib()])` is valid +def make_class( + name: str, + attrs: Union[List[str], Tuple[str, ...], Dict[str, Any]], + bases: Tuple[type, ...] = ..., + repr_ns: Optional[str] = ..., + repr: bool = ..., + cmp: Optional[_EqOrderType] = ..., + hash: Optional[bool] = ..., + init: bool = ..., + slots: bool = ..., + frozen: bool = ..., + weakref_slot: bool = ..., + str: bool = ..., + auto_attribs: bool = ..., + kw_only: bool = ..., + cache_hash: bool = ..., + auto_exc: bool = ..., + eq: Optional[_EqOrderType] = ..., + order: Optional[_EqOrderType] = ..., + collect_by_mro: bool = ..., + on_setattr: Optional[_OnSetAttrArgType] = ..., + field_transformer: Optional[_FieldTransformer] = ..., +) -> type: ... + +# _funcs -- + +# TODO: add support for returning TypedDict from the mypy plugin +# FIXME: asdict/astuple do not honor their factory args. Waiting on one of +# these: +# https://github.com/python/mypy/issues/4236 +# https://github.com/python/typing/issues/253 +# XXX: remember to fix attrs.asdict/astuple too! +def asdict( + inst: AttrsInstance, + recurse: bool = ..., + filter: Optional[_FilterType[Any]] = ..., + dict_factory: Type[Mapping[Any, Any]] = ..., + retain_collection_types: bool = ..., + value_serializer: Optional[ + Callable[[type, Attribute[Any], Any], Any] + ] = ..., + tuple_keys: Optional[bool] = ..., +) -> Dict[str, Any]: ... + +# TODO: add support for returning NamedTuple from the mypy plugin +def astuple( + inst: AttrsInstance, + recurse: bool = ..., + filter: Optional[_FilterType[Any]] = ..., + tuple_factory: Type[Sequence[Any]] = ..., + retain_collection_types: bool = ..., +) -> Tuple[Any, ...]: ... +def has(cls: type) -> bool: ... +def assoc(inst: _T, **changes: Any) -> _T: ... +def evolve(inst: _T, **changes: Any) -> _T: ... + +# _config -- + +def set_run_validators(run: bool) -> None: ... +def get_run_validators() -> bool: ... + +# aliases -- + +s = attributes = attrs +ib = attr = attrib +dataclass = attrs # Technically, partial(attrs, auto_attribs=True) ;) diff --git a/sbsheriff/Lib/site-packages/attr/__pycache__/__init__.cpython-310.pyc b/sbsheriff/Lib/site-packages/attr/__pycache__/__init__.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..c540b43d4d7ec3010e5cb56408438c0df82227d6 GIT binary patch literal 1625 zcmZ8hOK;mo5GJVy^|WQ#u`D}r~7Z$0K+KwnR~$^*}Jc!3vXK^38>N>EZ|C@UX)Re?&rR+3d!gIX?^WnDF( zp_uLiw)MdD= zuD}(w37ffZRbEv+=%HMLEzx^@O>Dh!;WJ)`&v^s3c@wUS>#!rX`9jALI~|8Fb{x3D zTM+Oi_=30LOTG*@#d^_!ThJF>{O-bS;fZy=!Y}>d!JU!ASO0QhPdLAQ#a-U{-RnAh z?Wm;xL=L+0Yjqdys(Wxx-G}??0X%RWvG@8L-hJa@R_=cO2J7dP^`EfNB9tjpnJk?g- zB`L6q`Y%{F*84IUrnB%bY7GInt;;6SDjb(TeMn|*C*gQ#3`_ZW_{P^-9OzA~}5pJ79L6wJhTOKW^8phP4MDUX*30~?-I*%$}`DNqC;$v zVUy*_Tc2T{4&%{0Ps#|&j3Sv&c$im6h0OCWF}nIWV;2MxO>=54Xvk}(3ZcnxBB(7` zjD4Xu&}QrGgOR}s!{XEjgTbCmMz(d~Li-rARmQS7lLEy>#<(z%j`R6KgU{Gh%lAS& z7kC<>P-6_Qew=EQF@#WIOpcg>j3bd4iq~Yw$h$6LOm9&^R|$Fqn+Udw!y3+e9uEs8 z#b|t78B|#!PBS(ViQcAd*9mqAZcuNgY*pcvFg*ob8$Q{ zIEU&G8#?5InX%CEa5ylB@1-B&!-0u2achFJ5RQZyP=D?+WH-(j>rc*X<&jGHREo#+ xuVn5aR0<96ve$51ZqL2xHtNMf%`JLGmwv6egj%IgaT{*MYj3W(3tsWR{{ag4$U*=B literal 0 HcmV?d00001 diff --git a/sbsheriff/Lib/site-packages/attr/__pycache__/_cmp.cpython-310.pyc b/sbsheriff/Lib/site-packages/attr/__pycache__/_cmp.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..7bfa7b7cfd64a3c259ff4f599d39271185d260f8 GIT binary patch literal 3788 zcmb_eOK%*<5uVrX&W=cmdRT%TCutk7l_ltPCl>eD zE$yCI=(X3a(l%?lWs3*DvW{C=cd4|^x&=@jL%nm3x>!1fx&*3gsGpsqUM^ijT?Q5Q z#OV*tQLmJqpS{FrMrFs=}t89pND2_?2jL)QJ5D^;6{2<|i&*WGm zM2*?!6P@H)oIdEsX-Wut$i)5{i{`_K6=WA^CJy4XAoGd+B2E*1WJDpeLIQo5v%I$_ z`dW3({F~XQ`n%a5j-afNXWU6g!a#tLz{^(lny2(r3;!#!BA4JFasjDXM-V8D3cIn2uh#0&Oho?dbx(8 zXjN%FMY?!~#P;0YL^^906ON#Oo|CEPcIEYQe)Qb>_KUk~yT4aZeRoUC7M;^)yG&QXA;h>s}!2Thn`DpN$ceDadm%NDxgBMhx6cyv7}-0#WT0 zfCHJ2*~M_$?JQP7oww<3Bpw%5wNy{!6Cqb|wx(gQTii$1Zu9$jx{% z5gD(R!~RJ0ADy{I75ssq@LMT!S+xg6*4J<$RW0dU$7whht`nHMHrHyd(_EvuzMU(t z`CAnj5e&e0u4Toz<`WwBfTY^FJc<>eWof%h-RbubP*&ylNO)<-%02y%40cTv;= zDvr0zW9t~uLpFD(?-}2jrSiG6%ra!11^Tpo{!yQbL5)GMU0NZSf|)bDeHv#z#l7TyWCzeolB(lWo)YQ63~GZJtC7Lv5~?vu4O4IW?iqN_a5|UW zYz9}_^eQ8UIeM)s!m{7+nv!NNC`h=Q7e&@IZz!^ve~dS6i5JxkyxyR)r=j}W^RZJp zFhS#@J?ChCvpwfWnTSBgQA8;1XSQl-*z^g;droQZ;c0k`BeY#u@;XuIIC&ErI_}JY zE=Kd(s;>M9OR9#+?NzgWDN$S@h}PCIkZjgZqOY*nfF!ViK%mdFJ!krpi>`TQ@_N%0 zk?sS;+UfgW)_EmnA1K!A;(>^0P$09g-VvkVqq-fJA~K~2gx2M-whw&AOsT3BhCJ_w zA(nZxNPYr=S$r^gKzF*KU;V+jsy&2PU=dSq}p; zXbEGVIBF5EVHkDa<#dbg^w+glP*h>F7Zi((5s@X;>={aVgMwZ}z>R85-`@uGC^+F- z$n^4Ks*D;&gELT5)cY%n$pe8GKz`>XJecM$$Uk>EBR^3A2Wt=5qq-n3wx?ejd1v;g z2La{s6_RVkya!f{?C2w<();p!N?&F75$G{b@4v%DA;*(vb{qpCN~U$(3o&!1(kt40 z2)X`F+K{x%o}_W7wMpN$yhMXQ{tS(LA63;bh%zx={*q=1`NkK`^%)x&7UvxJ)N)8& k^7%JcO?FDDqbvz29^FR2v|G;1JZ!QG?1$O}J^#A|> literal 0 HcmV?d00001 diff --git a/sbsheriff/Lib/site-packages/attr/__pycache__/_compat.cpython-310.pyc b/sbsheriff/Lib/site-packages/attr/__pycache__/_compat.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..f21e145e99b12086a8168e99e095c14769bed447 GIT binary patch literal 4071 zcmb7H%WvGq8Rzh^%U$hCvMf2a>i|R%#9knk^FmrAhGD~Y(gLkwc$2s$)X)@XR_2OJ zZf0gJ?P7JQTr@qT=K{S*r^4s{14aJ~UUSm5$F_<4`-Xa0vic(N4d*@I{JtlPcDrfe z`SaCF$zPT%>sxBP{5WXb0;#{E;1*|@6;@vsGSjw0+kBnSF<&=y&DRS(eC@0@sE74| zANtG^Y`3vzac9F0o5JqTaK_!=*q1EsZFpfzw8Hj@-WqymMN{1rEqPnah4Z~N8{cpJS-Vrj<;F9>J%wLL4m$XVCw%%WMH!!%zn{jT_GB=SU*?)~xo@xF}-9ebZ{zF#wSNuPZJs>8~ePbC*p@VjZE z6LcLtw9W&43Q~(GwAE*vX`9>J`Nm;@4Gg#|lRrHeI#8ot zFHKUB>uik1a9BtkBn1~ivDO!frbV()LsZiuUk-w9F%Usd#Cjx!3bJ%V1Z%Mrv{uM# zouH6GoFqaiIx&ipELJLtg3UC`g1pedW+6Aw(oX`F6|1?%*V(gn*fwr0U!O7#AJTWV*RS>KqnCQR@K+F>Gx^+L zNrHM{;3u?C%PJ^(rn{F)r30w&XaFM&(q542t0WQ~h`~^gE4k2KE0VbG_!VkymMUE~ zhp~(YWYMauJtZ7f**sPVc>ycR#{I)drDyi+*zz(B)XZvi8ra2kp(DdrWF|zUX76Kx zYN4pPE}OS6uqJcuN#{(M&su*1a=Hk?ZXo|5Dg?8fGhoAm^_{*8U=P{{u-cQ4&Vsd4 z@Cx1k1YXCha64Bmh+YAyd!&`bP=^_aPD3+CS3B5&P`Qn%1{K${U(DL}_r42M-uSnu zytH(sZr@8IlQ*v$Sd0YH6xSY^$kzHi9l&q=kH@ieVuJPQ)kyly|Krbg?bb9 z8Bhz<2F-%zK=Yt;pasx*&?0CFL}xndZCb4_^k17gzqfv8{nqL+-oQ!z_CY}2cBk%+ z)xXGFm#l4XYE3=f-m!6_*T2Nu;B!cPJ~X$2)4Dv~t{j&BLCt!En{FaxPo@tltBr%+ zC^vD>80%(nWTq;(mWV8SD=;S4fm=-z1T>+QQBg8?GZIkPL5NFpW9vy)D1^;`)&`HM zd>rT^cx>iAt}Oi(=Sx!Ql4MBAQ)}0nvL2jo72hS2D2ka-89E)&0t)mTu9G$|J+tvC z%_!$F6LHzF64AUbXm>Klc{aH|h&K=*Pt91qkri;m>gMw4krQT3dyr|9?kOL|6hfjj z#IR}jfa`f11L0z?kco)4B3(plB8m+oX2x??vMp&m{34xJIU?foX)H1QOWNE;;WC#^ z-uoZ;J-vgZFm}j|$+d{rSAeJ67~m<^Pbu0R-vyAji6tZmNUCzJBn6>UNXvK7r-*2) zCOdHgiM0+gSOut1RQ=jY5kt5=g<|h{WN1^ib0F%Dvr^Uo2z>nk@1;jBNR_RR57d-` zXUCD(v713z{us6AEWB`xV^0b}I8usNv1_~qarzC&NX>Oy%ze>vPdEvZEAedjrMS%x z4UilK43HcJcs#KP(~cE_WcKw5WvCc9l13$TmyGU@m}^jjh;RKD5u0IJ6j54f6zN!B zslS4Y$&awV1wqI#-bAKf3>jd_92#nU8ECDUb%2HT+YEoR{aYBi_n}spLv4GfEMt;t;GJH+pF% zsAblf$}DX~iA*ehDhq6Uh%~tZ{EE5ktDO$)YXiVjnYmEIg5(CL50z46YD;trjg&$nX*~IxVn$Rt@)6k@7c|ovj~6DbepzM>W$=u z{KqRVdhNftFPaN2+n;IqO-gf+Pr9|%cRs%Im)Nv(smiPTVHRunv4OmU-m;;eND*`V ztC&m68S0!%iY%*sp44)@mPm31k_@R_8jkf766;`?2}=G&&rDv2OY)LUB zHvspAp9_QPabckKZ&Vq{O)`CT4TbOc?C_npTh0QoSzx|XBRjEuXSV5ItNp4q`!CP_ BAqD^d literal 0 HcmV?d00001 diff --git a/sbsheriff/Lib/site-packages/attr/__pycache__/_config.cpython-310.pyc b/sbsheriff/Lib/site-packages/attr/__pycache__/_config.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..f582f0a0b69cdfd54f67c37e372dcbbdafd2caa3 GIT binary patch literal 997 zcmd5*O>fjN5Ve!gW>*xXazJpJ+pkWKC#0{C5qECR@cUCxYh1D^to;7d?_ofq&L>JyR$!X2PG%G3kxw_&h}}! zyW~7OWuBi!uID4g&-h1v%4Dn}x*}eG?*rKwJscmQKSB$}LTx-;T?x`6P!|H=#R?Qo zWmEY*pyJi#R=eHOX*RKM)3HNcp@IcYXa9*)xj17g>$n+wFgDxL3@yuGn)k+ zROqTJ18<Gg)C9PdxvnI7gzm?z?#xd78R;{!^tI{uAN7zM3-3K z8qiDwm^aP?byXNsiMPX~?Q0hbWnE&MglyY8SS|3CwZ^tLf0JX#+n8WJGn*3AKgRo` zjC!&z8+)ryvX{8b9LY8>te#1Qxg&=4beg&1B6_2X%xRDJX`&BuhAs!&GCqmrUuEYx&@Clq)_((?7!Zq9e;8(aT_y8o4g;UoX6ghOrvB^~t} zE^uYTuXdZ33qg_wVYl;KR#l##9}0|hRU0RRhBh2;)2DNznhKwVG8gh`oJ47S{l-r- C$`8f> literal 0 HcmV?d00001 diff --git a/sbsheriff/Lib/site-packages/attr/__pycache__/_funcs.cpython-310.pyc b/sbsheriff/Lib/site-packages/attr/__pycache__/_funcs.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..6c2e7e80132567fe78eaf82a22afbaf47c9fdaab GIT binary patch literal 10180 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 literal 0 HcmV?d00001 diff --git a/sbsheriff/Lib/site-packages/attr/__pycache__/_make.cpython-310.pyc b/sbsheriff/Lib/site-packages/attr/__pycache__/_make.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..b248214adea9a9d92044359f6de360564700e009 GIT binary patch literal 72344 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 literal 0 HcmV?d00001 diff --git a/sbsheriff/Lib/site-packages/attr/__pycache__/_version_info.cpython-310.pyc b/sbsheriff/Lib/site-packages/attr/__pycache__/_version_info.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..5cfce748e9bcc5fb310b2c630374c3ca50dab0df GIT binary patch literal 2323 zcmbVOPj4JG6t_Kpb~2fSw5duXL1jvz-6&a_f{+@uQBi48r7A+SfVx`Anq7O7Y39$? z_6D-rTu3?g6L4vdxp3jz_{u3?0ffr4H@n%;Z~#yI=8gUQ{GNZm=S?*?7b9rDU0dor zj1cy3zRG&QppQw(_ysmVbvr2LyvvTVQkA`ch(*0g8>coVp)-r3G zz`oUkCw1Qt@!SM%i3wC*X=TE$tOla&Sg+H~gO9t=RSSebP0Ue~aNP8SF9J?p;$}F} zY7;F2ZN|;UVwQW{e}N$K#AfvZHRpJZNARBKGdza(JA4*0O3dtcLaMAPAC}!J{RI+< zDYP%>?r4}+?PsE+soqXC?W84b3)-oQUMdBrx}q*$T6JkI$}PQ3*H%|QTaTTOjg1Xz zvu{l8aDDC83SC>FH&*DCZdRuGl{%%j?@%{>v+mYCk$v%>9NZo)2e)fyc-YP8owMV( zc`A;{mayP0j}OvZodh+p7;X2~vZi_aPDA@qCD)gur?{0eCQ8t)U0hd^IWc8FXUl2=dwub~izNP9!V{UxA> z(}IZ>S`FsN60&6g1c?TpyR9uLzD}hQbXhIawB%F@-IpazDVxH#F)=o{ab!a?fx}ta z5|MV`$OaGP;O~i4nxM$a%DpXe2jqf^>h(m)jhB_W?isI> zD}&*0_YleVz~vuL@2$7KRY2R;V<^2JTVIOZmeQ3h+A`ZpxnOD=s^3-+#6Z_3{VbnmjIOh;MWN{_e<56fMuoOOqOY;0LMuwr*t>XGk#psjZrmQ z0(|2jx3;}XsjQvvQ7zL_b>WcVIv9Ji?5O&{m3&u#@wD$r0I)ArX(7h<23Q?0KcUcw zF7|jf>!F!ptdploF(&Phi8GazN~dK2=jKxwQs+S=QG{dSYD}#d?1sHW-DxFWLKZOb=J7@RH+N|`CjbBd literal 0 HcmV?d00001 diff --git a/sbsheriff/Lib/site-packages/attr/__pycache__/converters.cpython-310.pyc b/sbsheriff/Lib/site-packages/attr/__pycache__/converters.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..39720358b3a786e1512ec7bf9ab84bc3a5fc7f23 GIT binary patch literal 3534 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 literal 0 HcmV?d00001 diff --git a/sbsheriff/Lib/site-packages/attr/__pycache__/filters.cpython-310.pyc b/sbsheriff/Lib/site-packages/attr/__pycache__/filters.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..6d317554ffbf6b8effa423c0912ae5ea0921e6e9 GIT binary patch literal 1556 zcmbtU&u`N(6t>-TYr_U?AffTo2M{WPuyZv{pp63(;=lw*Q&5t|&K5|UV!LCjItjE% z8wbSS(KG)|uADgU#sTr3+mwPdgoGu(Jioj=fBwGbkmbcq^C)?vaEt6ix zlQc6@X`bYYhmkSLi?m2%6MF793L7+NQGW>GwAC{*#z;BP2Yh4=roIWrSR{vJK-S3t zJ)p3z2=;58Fu>sS*If?dnKV7s(LCa&*Uco)6CNfi@5_#sCe*l&vq)UjXJ<#1OHNm^>$apJR9!Hs8 z^(M)uo>*0&g2FNlrmE;8A8Hm2o?>Lqpf?BRJUa7WP}vFNuyAnWKfWl=Oo75;dIn2W z&r|1z!b&mB$-sRP3~p_80REv9eD;xkBuC_kCJcM^u(nSJ6ndf3|768{+=;WEko*oJ zxZ}At*z86sYI6)V`Ae|elbSpP zj=&=>@^SAzh0s6J`cqPi1h zJ?yJ0#y#SV*+8A%Jj4v;P=`WQ>m~dU@s4MWkWE%e{BiW{y9%tUdch}IMh))|c#cU9W tJPv}Q8nmM~a&#H(r9%~L+SDbR!ne}SMK6=9_+Ql+ci5a$tJK`Ng`eX*X^8*; literal 0 HcmV?d00001 diff --git a/sbsheriff/Lib/site-packages/attr/__pycache__/setters.cpython-310.pyc b/sbsheriff/Lib/site-packages/attr/__pycache__/setters.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..30566d5e74053ae1dabad0283be1044a2e3943b1 GIT binary patch literal 1516 zcma)6%Wm8@6y-xBY2>jJxIv3{QE*cj8q`YKU5y}U;nb_Z32JmBOe<(a%9f)MrzACT z1~LkC0<^!9b^k`&uKEjI^^#*xZ8r-OAbI(`hv%M4xxF1BD1YvKT3iee`pXV(76OBB zq3R=OI7$)6oYZ(mQi82bYdZ5%4{VPQ-l25BeI7vX^NBuGh13gDSg_mCEb*RG~UC~SWi`P*=iI3l-c+iJcqfOovqW3K+)wCZr;!Wl- z^+YXte~liv39jCutebyM4i6?jYQQ!*fnyhw=VCF@MylCVRi`-@nLZP$D$9wUURy7! z=|opX?9cP!b$%-J#JYTZb!{?#+mGI;d_EUEn^$w;UJ`;Y4~Jw2dt~{Uolc(CvdC-w zEV;Safr^P5!G5)48;eqH*=8G>-m_=zs`j861zxBgfN_gM%cs@EAyn-{W6%oyhGV>Z z;Rt`F#6mO%;>gxyfkK#(Y%17H@~W%^zfath^%K(`XFbWXlxA7BM(ZFuw0`MyXyd4@ z;(TB2LU#+TeTS_M?U!H}bPh^vkqSC;0`Wcv1$0#JxDj;N!d{M zcyX7C@M^c%gLQ2~8~GmgiHAKrA|6qXVCsLwSkI1_kHG*ckflNmJKB*IB&nkSFMs_I z1@IX_&Oyeq{r%g|wi9=Gxt-JQJ|%QpoBJpMKA+*n-3Q1h?vfE)?fwQ{r7dB80NDY# zp+14Zal8eeS;l3NWj%82_mQ|L#N5CSqLo#PQ@sOL2cw38SHbLCS=aJE1ghLwchQn|-diXCkF=MF! literal 0 HcmV?d00001 diff --git a/sbsheriff/Lib/site-packages/attr/__pycache__/validators.cpython-310.pyc b/sbsheriff/Lib/site-packages/attr/__pycache__/validators.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..a0452d7d6d1d1d96d6b1fe2a10e4680e461e8ae3 GIT binary patch literal 16525 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 ATmS$7 literal 0 HcmV?d00001 diff --git a/sbsheriff/Lib/site-packages/attr/_cmp.py b/sbsheriff/Lib/site-packages/attr/_cmp.py new file mode 100644 index 0000000..81b99e4 --- /dev/null +++ b/sbsheriff/Lib/site-packages/attr/_cmp.py @@ -0,0 +1,155 @@ +# SPDX-License-Identifier: MIT + + +import functools +import types + +from ._make import _make_ne + + +_operation_names = {"eq": "==", "lt": "<", "le": "<=", "gt": ">", "ge": ">="} + + +def cmp_using( + eq=None, + lt=None, + le=None, + gt=None, + ge=None, + require_same_type=True, + class_name="Comparable", +): + """ + Create a class that can be passed into `attr.ib`'s ``eq``, ``order``, and + ``cmp`` arguments to customize field comparison. + + The resulting class will have a full set of ordering methods if + at least one of ``{lt, le, gt, ge}`` and ``eq`` are provided. + + :param Optional[callable] eq: `callable` used to evaluate equality + of two objects. + :param Optional[callable] lt: `callable` used to evaluate whether + one object is less than another object. + :param Optional[callable] le: `callable` used to evaluate whether + one object is less than or equal to another object. + :param Optional[callable] gt: `callable` used to evaluate whether + one object is greater than another object. + :param Optional[callable] ge: `callable` used to evaluate whether + one object is greater than or equal to another object. + + :param bool require_same_type: When `True`, equality and ordering methods + will return `NotImplemented` if objects are not of the same type. + + :param Optional[str] class_name: Name of class. Defaults to 'Comparable'. + + See `comparison` for more details. + + .. versionadded:: 21.1.0 + """ + + body = { + "__slots__": ["value"], + "__init__": _make_init(), + "_requirements": [], + "_is_comparable_to": _is_comparable_to, + } + + # Add operations. + num_order_functions = 0 + has_eq_function = False + + if eq is not None: + has_eq_function = True + body["__eq__"] = _make_operator("eq", eq) + body["__ne__"] = _make_ne() + + if lt is not None: + num_order_functions += 1 + body["__lt__"] = _make_operator("lt", lt) + + if le is not None: + num_order_functions += 1 + body["__le__"] = _make_operator("le", le) + + if gt is not None: + num_order_functions += 1 + body["__gt__"] = _make_operator("gt", gt) + + if ge is not None: + num_order_functions += 1 + body["__ge__"] = _make_operator("ge", ge) + + type_ = types.new_class( + class_name, (object,), {}, lambda ns: ns.update(body) + ) + + # Add same type requirement. + if require_same_type: + type_._requirements.append(_check_same_type) + + # Add total ordering if at least one operation was defined. + if 0 < num_order_functions < 4: + if not has_eq_function: + # functools.total_ordering requires __eq__ to be defined, + # so raise early error here to keep a nice stack. + raise ValueError( + "eq must be define is order to complete ordering from " + "lt, le, gt, ge." + ) + type_ = functools.total_ordering(type_) + + return type_ + + +def _make_init(): + """ + Create __init__ method. + """ + + def __init__(self, value): + """ + Initialize object with *value*. + """ + self.value = value + + return __init__ + + +def _make_operator(name, func): + """ + Create operator method. + """ + + def method(self, other): + if not self._is_comparable_to(other): + return NotImplemented + + result = func(self.value, other.value) + if result is NotImplemented: + return NotImplemented + + return result + + method.__name__ = "__%s__" % (name,) + method.__doc__ = "Return a %s b. Computed by attrs." % ( + _operation_names[name], + ) + + return method + + +def _is_comparable_to(self, other): + """ + Check whether `other` is comparable to `self`. + """ + for func in self._requirements: + if not func(self, other): + return False + return True + + +def _check_same_type(self, other): + """ + Return True if *self* and *other* are of the same type, False otherwise. + """ + return other.value.__class__ is self.value.__class__ diff --git a/sbsheriff/Lib/site-packages/attr/_cmp.pyi b/sbsheriff/Lib/site-packages/attr/_cmp.pyi new file mode 100644 index 0000000..35437ef --- /dev/null +++ b/sbsheriff/Lib/site-packages/attr/_cmp.pyi @@ -0,0 +1,13 @@ +from typing import Any, Callable, Optional, Type + +_CompareWithType = Callable[[Any, Any], bool] + +def cmp_using( + eq: Optional[_CompareWithType], + lt: Optional[_CompareWithType], + le: Optional[_CompareWithType], + gt: Optional[_CompareWithType], + ge: Optional[_CompareWithType], + require_same_type: bool, + class_name: str, +) -> Type: ... diff --git a/sbsheriff/Lib/site-packages/attr/_compat.py b/sbsheriff/Lib/site-packages/attr/_compat.py new file mode 100644 index 0000000..5826493 --- /dev/null +++ b/sbsheriff/Lib/site-packages/attr/_compat.py @@ -0,0 +1,185 @@ +# SPDX-License-Identifier: MIT + + +import inspect +import platform +import sys +import threading +import types +import warnings + +from collections.abc import Mapping, Sequence # noqa + + +PYPY = platform.python_implementation() == "PyPy" +PY36 = sys.version_info[:2] >= (3, 6) +HAS_F_STRINGS = PY36 +PY310 = sys.version_info[:2] >= (3, 10) + + +if PYPY or PY36: + ordered_dict = dict +else: + from collections import OrderedDict + + ordered_dict = OrderedDict + + +def just_warn(*args, **kw): + warnings.warn( + "Running interpreter doesn't sufficiently support code object " + "introspection. Some features like bare super() or accessing " + "__class__ will not work with slotted classes.", + RuntimeWarning, + stacklevel=2, + ) + + +class _AnnotationExtractor: + """ + Extract type annotations from a callable, returning None whenever there + is none. + """ + + __slots__ = ["sig"] + + def __init__(self, callable): + try: + self.sig = inspect.signature(callable) + except (ValueError, TypeError): # inspect failed + self.sig = None + + def get_first_param_type(self): + """ + Return the type annotation of the first argument if it's not empty. + """ + if not self.sig: + return None + + params = list(self.sig.parameters.values()) + if params and params[0].annotation is not inspect.Parameter.empty: + return params[0].annotation + + return None + + def get_return_type(self): + """ + Return the return type if it's not empty. + """ + if ( + self.sig + and self.sig.return_annotation is not inspect.Signature.empty + ): + return self.sig.return_annotation + + return None + + +def make_set_closure_cell(): + """Return a function of two arguments (cell, value) which sets + the value stored in the closure cell `cell` to `value`. + """ + # pypy makes this easy. (It also supports the logic below, but + # why not do the easy/fast thing?) + if PYPY: + + def set_closure_cell(cell, value): + cell.__setstate__((value,)) + + return set_closure_cell + + # Otherwise gotta do it the hard way. + + # Create a function that will set its first cellvar to `value`. + def set_first_cellvar_to(value): + x = value + return + + # This function will be eliminated as dead code, but + # not before its reference to `x` forces `x` to be + # represented as a closure cell rather than a local. + def force_x_to_be_a_cell(): # pragma: no cover + return x + + try: + # Extract the code object and make sure our assumptions about + # the closure behavior are correct. + co = set_first_cellvar_to.__code__ + if co.co_cellvars != ("x",) or co.co_freevars != (): + raise AssertionError # pragma: no cover + + # Convert this code object to a code object that sets the + # function's first _freevar_ (not cellvar) to the argument. + if sys.version_info >= (3, 8): + + def set_closure_cell(cell, value): + cell.cell_contents = value + + else: + args = [co.co_argcount] + args.append(co.co_kwonlyargcount) + args.extend( + [ + co.co_nlocals, + co.co_stacksize, + co.co_flags, + co.co_code, + co.co_consts, + co.co_names, + co.co_varnames, + co.co_filename, + co.co_name, + co.co_firstlineno, + co.co_lnotab, + # These two arguments are reversed: + co.co_cellvars, + co.co_freevars, + ] + ) + set_first_freevar_code = types.CodeType(*args) + + def set_closure_cell(cell, value): + # Create a function using the set_first_freevar_code, + # whose first closure cell is `cell`. Calling it will + # change the value of that cell. + setter = types.FunctionType( + set_first_freevar_code, {}, "setter", (), (cell,) + ) + # And call it to set the cell. + setter(value) + + # Make sure it works on this interpreter: + def make_func_with_cell(): + x = None + + def func(): + return x # pragma: no cover + + return func + + cell = make_func_with_cell().__closure__[0] + set_closure_cell(cell, 100) + if cell.cell_contents != 100: + raise AssertionError # pragma: no cover + + except Exception: + return just_warn + else: + return set_closure_cell + + +set_closure_cell = make_set_closure_cell() + +# Thread-local global to track attrs instances which are already being repr'd. +# This is needed because there is no other (thread-safe) way to pass info +# about the instances that are already being repr'd through the call stack +# in order to ensure we don't perform infinite recursion. +# +# For instance, if an instance contains a dict which contains that instance, +# we need to know that we're already repr'ing the outside instance from within +# the dict's repr() call. +# +# This lives here rather than in _make.py so that the functions in _make.py +# don't have a direct reference to the thread-local in their globals dict. +# If they have such a reference, it breaks cloudpickle. +repr_context = threading.local() diff --git a/sbsheriff/Lib/site-packages/attr/_config.py b/sbsheriff/Lib/site-packages/attr/_config.py new file mode 100644 index 0000000..96d4200 --- /dev/null +++ b/sbsheriff/Lib/site-packages/attr/_config.py @@ -0,0 +1,31 @@ +# SPDX-License-Identifier: MIT + + +__all__ = ["set_run_validators", "get_run_validators"] + +_run_validators = True + + +def set_run_validators(run): + """ + Set whether or not validators are run. By default, they are run. + + .. deprecated:: 21.3.0 It will not be removed, but it also will not be + moved to new ``attrs`` namespace. Use `attrs.validators.set_disabled()` + instead. + """ + if not isinstance(run, bool): + raise TypeError("'run' must be bool.") + global _run_validators + _run_validators = run + + +def get_run_validators(): + """ + Return whether or not validators are run. + + .. deprecated:: 21.3.0 It will not be removed, but it also will not be + moved to new ``attrs`` namespace. Use `attrs.validators.get_disabled()` + instead. + """ + return _run_validators diff --git a/sbsheriff/Lib/site-packages/attr/_funcs.py b/sbsheriff/Lib/site-packages/attr/_funcs.py new file mode 100644 index 0000000..a982d7c --- /dev/null +++ b/sbsheriff/Lib/site-packages/attr/_funcs.py @@ -0,0 +1,420 @@ +# SPDX-License-Identifier: MIT + + +import copy + +from ._make import NOTHING, _obj_setattr, fields +from .exceptions import AttrsAttributeNotFoundError + + +def asdict( + inst, + recurse=True, + filter=None, + dict_factory=dict, + retain_collection_types=False, + value_serializer=None, +): + """ + Return the ``attrs`` attribute values of *inst* as a dict. + + Optionally recurse into other ``attrs``-decorated classes. + + :param inst: Instance of an ``attrs``-decorated class. + :param bool recurse: Recurse into classes that are also + ``attrs``-decorated. + :param callable filter: A callable whose return code determines whether an + attribute or element is included (``True``) or dropped (``False``). Is + called with the `attrs.Attribute` as the first argument and the + value as the second argument. + :param callable dict_factory: A callable to produce dictionaries from. For + example, to produce ordered dictionaries instead of normal Python + dictionaries, pass in ``collections.OrderedDict``. + :param bool retain_collection_types: Do not convert to ``list`` when + encountering an attribute whose type is ``tuple`` or ``set``. Only + meaningful if ``recurse`` is ``True``. + :param Optional[callable] value_serializer: A hook that is called for every + attribute or dict key/value. It receives the current instance, field + and value and must return the (updated) value. The hook is run *after* + the optional *filter* has been applied. + + :rtype: return type of *dict_factory* + + :raise attr.exceptions.NotAnAttrsClassError: If *cls* is not an ``attrs`` + class. + + .. versionadded:: 16.0.0 *dict_factory* + .. versionadded:: 16.1.0 *retain_collection_types* + .. versionadded:: 20.3.0 *value_serializer* + .. versionadded:: 21.3.0 If a dict has a collection for a key, it is + serialized as a tuple. + """ + attrs = fields(inst.__class__) + rv = dict_factory() + for a in attrs: + v = getattr(inst, a.name) + if filter is not None and not filter(a, v): + continue + + if value_serializer is not None: + v = value_serializer(inst, a, v) + + if recurse is True: + if has(v.__class__): + rv[a.name] = asdict( + v, + recurse=True, + filter=filter, + dict_factory=dict_factory, + retain_collection_types=retain_collection_types, + value_serializer=value_serializer, + ) + elif isinstance(v, (tuple, list, set, frozenset)): + cf = v.__class__ if retain_collection_types is True else list + rv[a.name] = cf( + [ + _asdict_anything( + i, + is_key=False, + filter=filter, + dict_factory=dict_factory, + retain_collection_types=retain_collection_types, + value_serializer=value_serializer, + ) + for i in v + ] + ) + elif isinstance(v, dict): + df = dict_factory + rv[a.name] = df( + ( + _asdict_anything( + kk, + is_key=True, + filter=filter, + dict_factory=df, + retain_collection_types=retain_collection_types, + value_serializer=value_serializer, + ), + _asdict_anything( + vv, + is_key=False, + filter=filter, + dict_factory=df, + retain_collection_types=retain_collection_types, + value_serializer=value_serializer, + ), + ) + for kk, vv in v.items() + ) + else: + rv[a.name] = v + else: + rv[a.name] = v + return rv + + +def _asdict_anything( + val, + is_key, + filter, + dict_factory, + retain_collection_types, + value_serializer, +): + """ + ``asdict`` only works on attrs instances, this works on anything. + """ + if getattr(val.__class__, "__attrs_attrs__", None) is not None: + # Attrs class. + rv = asdict( + val, + recurse=True, + filter=filter, + dict_factory=dict_factory, + retain_collection_types=retain_collection_types, + value_serializer=value_serializer, + ) + elif isinstance(val, (tuple, list, set, frozenset)): + if retain_collection_types is True: + cf = val.__class__ + elif is_key: + cf = tuple + else: + cf = list + + rv = cf( + [ + _asdict_anything( + i, + is_key=False, + filter=filter, + dict_factory=dict_factory, + retain_collection_types=retain_collection_types, + value_serializer=value_serializer, + ) + for i in val + ] + ) + elif isinstance(val, dict): + df = dict_factory + rv = df( + ( + _asdict_anything( + kk, + is_key=True, + filter=filter, + dict_factory=df, + retain_collection_types=retain_collection_types, + value_serializer=value_serializer, + ), + _asdict_anything( + vv, + is_key=False, + filter=filter, + dict_factory=df, + retain_collection_types=retain_collection_types, + value_serializer=value_serializer, + ), + ) + for kk, vv in val.items() + ) + else: + rv = val + if value_serializer is not None: + rv = value_serializer(None, None, rv) + + return rv + + +def astuple( + inst, + recurse=True, + filter=None, + tuple_factory=tuple, + retain_collection_types=False, +): + """ + Return the ``attrs`` attribute values of *inst* as a tuple. + + Optionally recurse into other ``attrs``-decorated classes. + + :param inst: Instance of an ``attrs``-decorated class. + :param bool recurse: Recurse into classes that are also + ``attrs``-decorated. + :param callable filter: A callable whose return code determines whether an + attribute or element is included (``True``) or dropped (``False``). Is + called with the `attrs.Attribute` as the first argument and the + value as the second argument. + :param callable tuple_factory: A callable to produce tuples from. For + example, to produce lists instead of tuples. + :param bool retain_collection_types: Do not convert to ``list`` + or ``dict`` when encountering an attribute which type is + ``tuple``, ``dict`` or ``set``. Only meaningful if ``recurse`` is + ``True``. + + :rtype: return type of *tuple_factory* + + :raise attr.exceptions.NotAnAttrsClassError: If *cls* is not an ``attrs`` + class. + + .. versionadded:: 16.2.0 + """ + attrs = fields(inst.__class__) + rv = [] + retain = retain_collection_types # Very long. :/ + for a in attrs: + v = getattr(inst, a.name) + if filter is not None and not filter(a, v): + continue + if recurse is True: + if has(v.__class__): + rv.append( + astuple( + v, + recurse=True, + filter=filter, + tuple_factory=tuple_factory, + retain_collection_types=retain, + ) + ) + elif isinstance(v, (tuple, list, set, frozenset)): + cf = v.__class__ if retain is True else list + rv.append( + cf( + [ + astuple( + j, + recurse=True, + filter=filter, + tuple_factory=tuple_factory, + retain_collection_types=retain, + ) + if has(j.__class__) + else j + for j in v + ] + ) + ) + elif isinstance(v, dict): + df = v.__class__ if retain is True else dict + rv.append( + df( + ( + astuple( + kk, + tuple_factory=tuple_factory, + retain_collection_types=retain, + ) + if has(kk.__class__) + else kk, + astuple( + vv, + tuple_factory=tuple_factory, + retain_collection_types=retain, + ) + if has(vv.__class__) + else vv, + ) + for kk, vv in v.items() + ) + ) + else: + rv.append(v) + else: + rv.append(v) + + return rv if tuple_factory is list else tuple_factory(rv) + + +def has(cls): + """ + Check whether *cls* is a class with ``attrs`` attributes. + + :param type cls: Class to introspect. + :raise TypeError: If *cls* is not a class. + + :rtype: bool + """ + return getattr(cls, "__attrs_attrs__", None) is not None + + +def assoc(inst, **changes): + """ + Copy *inst* and apply *changes*. + + :param inst: Instance of a class with ``attrs`` attributes. + :param changes: Keyword changes in the new copy. + + :return: A copy of inst with *changes* incorporated. + + :raise attr.exceptions.AttrsAttributeNotFoundError: If *attr_name* couldn't + be found on *cls*. + :raise attr.exceptions.NotAnAttrsClassError: If *cls* is not an ``attrs`` + class. + + .. deprecated:: 17.1.0 + Use `attrs.evolve` instead if you can. + This function will not be removed du to the slightly different approach + compared to `attrs.evolve`. + """ + import warnings + + warnings.warn( + "assoc is deprecated and will be removed after 2018/01.", + DeprecationWarning, + stacklevel=2, + ) + new = copy.copy(inst) + attrs = fields(inst.__class__) + for k, v in changes.items(): + a = getattr(attrs, k, NOTHING) + if a is NOTHING: + raise AttrsAttributeNotFoundError( + "{k} is not an attrs attribute on {cl}.".format( + k=k, cl=new.__class__ + ) + ) + _obj_setattr(new, k, v) + return new + + +def evolve(inst, **changes): + """ + Create a new instance, based on *inst* with *changes* applied. + + :param inst: Instance of a class with ``attrs`` attributes. + :param changes: Keyword changes in the new copy. + + :return: A copy of inst with *changes* incorporated. + + :raise TypeError: If *attr_name* couldn't be found in the class + ``__init__``. + :raise attr.exceptions.NotAnAttrsClassError: If *cls* is not an ``attrs`` + class. + + .. versionadded:: 17.1.0 + """ + cls = inst.__class__ + attrs = fields(cls) + for a in attrs: + if not a.init: + continue + attr_name = a.name # To deal with private attributes. + init_name = attr_name if attr_name[0] != "_" else attr_name[1:] + if init_name not in changes: + changes[init_name] = getattr(inst, attr_name) + + return cls(**changes) + + +def resolve_types(cls, globalns=None, localns=None, attribs=None): + """ + Resolve any strings and forward annotations in type annotations. + + This is only required if you need concrete types in `Attribute`'s *type* + field. In other words, you don't need to resolve your types if you only + use them for static type checking. + + With no arguments, names will be looked up in the module in which the class + was created. If this is not what you want, e.g. if the name only exists + inside a method, you may pass *globalns* or *localns* to specify other + dictionaries in which to look up these names. See the docs of + `typing.get_type_hints` for more details. + + :param type cls: Class to resolve. + :param Optional[dict] globalns: Dictionary containing global variables. + :param Optional[dict] localns: Dictionary containing local variables. + :param Optional[list] attribs: List of attribs for the given class. + This is necessary when calling from inside a ``field_transformer`` + since *cls* is not an ``attrs`` class yet. + + :raise TypeError: If *cls* is not a class. + :raise attr.exceptions.NotAnAttrsClassError: If *cls* is not an ``attrs`` + class and you didn't pass any attribs. + :raise NameError: If types cannot be resolved because of missing variables. + + :returns: *cls* so you can use this function also as a class decorator. + Please note that you have to apply it **after** `attrs.define`. That + means the decorator has to come in the line **before** `attrs.define`. + + .. versionadded:: 20.1.0 + .. versionadded:: 21.1.0 *attribs* + + """ + # Since calling get_type_hints is expensive we cache whether we've + # done it already. + if getattr(cls, "__attrs_types_resolved__", None) != cls: + import typing + + hints = typing.get_type_hints(cls, globalns=globalns, localns=localns) + for field in fields(cls) if attribs is None else attribs: + if field.name in hints: + # Since fields have been frozen we must work around it. + _obj_setattr(field, "type", hints[field.name]) + # We store the class we resolved so that subclasses know they haven't + # been resolved. + cls.__attrs_types_resolved__ = cls + + # Return the class so you can use it as a decorator too. + return cls diff --git a/sbsheriff/Lib/site-packages/attr/_make.py b/sbsheriff/Lib/site-packages/attr/_make.py new file mode 100644 index 0000000..4d1afe3 --- /dev/null +++ b/sbsheriff/Lib/site-packages/attr/_make.py @@ -0,0 +1,3006 @@ +# SPDX-License-Identifier: MIT + +import copy +import linecache +import sys +import types +import typing + +from operator import itemgetter + +# We need to import _compat itself in addition to the _compat members to avoid +# having the thread-local in the globals here. +from . import _compat, _config, setters +from ._compat import ( + HAS_F_STRINGS, + PY310, + PYPY, + _AnnotationExtractor, + ordered_dict, + set_closure_cell, +) +from .exceptions import ( + DefaultAlreadySetError, + FrozenInstanceError, + NotAnAttrsClassError, + UnannotatedAttributeError, +) + + +# This is used at least twice, so cache it here. +_obj_setattr = object.__setattr__ +_init_converter_pat = "__attr_converter_%s" +_init_factory_pat = "__attr_factory_{}" +_tuple_property_pat = ( + " {attr_name} = _attrs_property(_attrs_itemgetter({index}))" +) +_classvar_prefixes = ( + "typing.ClassVar", + "t.ClassVar", + "ClassVar", + "typing_extensions.ClassVar", +) +# we don't use a double-underscore prefix because that triggers +# name mangling when trying to create a slot for the field +# (when slots=True) +_hash_cache_field = "_attrs_cached_hash" + +_empty_metadata_singleton = types.MappingProxyType({}) + +# Unique object for unequivocal getattr() defaults. +_sentinel = object() + +_ng_default_on_setattr = setters.pipe(setters.convert, setters.validate) + + +class _Nothing: + """ + Sentinel class to indicate the lack of a value when ``None`` is ambiguous. + + ``_Nothing`` is a singleton. There is only ever one of it. + + .. versionchanged:: 21.1.0 ``bool(NOTHING)`` is now False. + """ + + _singleton = None + + def __new__(cls): + if _Nothing._singleton is None: + _Nothing._singleton = super().__new__(cls) + return _Nothing._singleton + + def __repr__(self): + return "NOTHING" + + def __bool__(self): + return False + + +NOTHING = _Nothing() +""" +Sentinel to indicate the lack of a value when ``None`` is ambiguous. +""" + + +class _CacheHashWrapper(int): + """ + An integer subclass that pickles / copies as None + + This is used for non-slots classes with ``cache_hash=True``, to avoid + serializing a potentially (even likely) invalid hash value. Since ``None`` + is the default value for uncalculated hashes, whenever this is copied, + the copy's value for the hash should automatically reset. + + See GH #613 for more details. + """ + + def __reduce__(self, _none_constructor=type(None), _args=()): + return _none_constructor, _args + + +def attrib( + default=NOTHING, + validator=None, + repr=True, + cmp=None, + hash=None, + init=True, + metadata=None, + type=None, + converter=None, + factory=None, + kw_only=False, + eq=None, + order=None, + on_setattr=None, +): + """ + Create a new attribute on a class. + + .. warning:: + + Does *not* do anything unless the class is also decorated with + `attr.s`! + + :param default: A value that is used if an ``attrs``-generated ``__init__`` + is used and no value is passed while instantiating or the attribute is + excluded using ``init=False``. + + If the value is an instance of `attrs.Factory`, its callable will be + used to construct a new value (useful for mutable data types like lists + or dicts). + + If a default is not set (or set manually to `attrs.NOTHING`), a value + *must* be supplied when instantiating; otherwise a `TypeError` + will be raised. + + The default can also be set using decorator notation as shown below. + + :type default: Any value + + :param callable factory: Syntactic sugar for + ``default=attr.Factory(factory)``. + + :param validator: `callable` that is called by ``attrs``-generated + ``__init__`` methods after the instance has been initialized. They + receive the initialized instance, the :func:`~attrs.Attribute`, and the + passed value. + + The return value is *not* inspected so the validator has to throw an + exception itself. + + If a `list` is passed, its items are treated as validators and must + all pass. + + Validators can be globally disabled and re-enabled using + `get_run_validators`. + + The validator can also be set using decorator notation as shown below. + + :type validator: `callable` or a `list` of `callable`\\ s. + + :param repr: Include this attribute in the generated ``__repr__`` + method. If ``True``, include the attribute; if ``False``, omit it. By + default, the built-in ``repr()`` function is used. To override how the + attribute value is formatted, pass a ``callable`` that takes a single + value and returns a string. Note that the resulting string is used + as-is, i.e. it will be used directly *instead* of calling ``repr()`` + (the default). + :type repr: a `bool` or a `callable` to use a custom function. + + :param eq: If ``True`` (default), include this attribute in the + generated ``__eq__`` and ``__ne__`` methods that check two instances + for equality. To override how the attribute value is compared, + pass a ``callable`` that takes a single value and returns the value + to be compared. + :type eq: a `bool` or a `callable`. + + :param order: If ``True`` (default), include this attributes in the + generated ``__lt__``, ``__le__``, ``__gt__`` and ``__ge__`` methods. + To override how the attribute value is ordered, + pass a ``callable`` that takes a single value and returns the value + to be ordered. + :type order: a `bool` or a `callable`. + + :param cmp: Setting *cmp* is equivalent to setting *eq* and *order* to the + same value. Must not be mixed with *eq* or *order*. + :type cmp: a `bool` or a `callable`. + + :param Optional[bool] hash: Include this attribute in the generated + ``__hash__`` method. If ``None`` (default), mirror *eq*'s value. This + is the correct behavior according the Python spec. Setting this value + to anything else than ``None`` is *discouraged*. + :param bool init: Include this attribute in the generated ``__init__`` + method. It is possible to set this to ``False`` and set a default + value. In that case this attributed is unconditionally initialized + with the specified default value or factory. + :param callable converter: `callable` that is called by + ``attrs``-generated ``__init__`` methods to convert attribute's value + to the desired format. It is given the passed-in value, and the + returned value will be used as the new value of the attribute. The + value is converted before being passed to the validator, if any. + :param metadata: An arbitrary mapping, to be used by third-party + components. See `extending_metadata`. + :param type: The type of the attribute. In Python 3.6 or greater, the + preferred method to specify the type is using a variable annotation + (see :pep:`526`). + This argument is provided for backward compatibility. + Regardless of the approach used, the type will be stored on + ``Attribute.type``. + + Please note that ``attrs`` doesn't do anything with this metadata by + itself. You can use it as part of your own code or for + `static type checking `. + :param kw_only: Make this attribute keyword-only (Python 3+) + in the generated ``__init__`` (if ``init`` is ``False``, this + parameter is ignored). + :param on_setattr: Allows to overwrite the *on_setattr* setting from + `attr.s`. If left `None`, the *on_setattr* value from `attr.s` is used. + Set to `attrs.setters.NO_OP` to run **no** `setattr` hooks for this + attribute -- regardless of the setting in `attr.s`. + :type on_setattr: `callable`, or a list of callables, or `None`, or + `attrs.setters.NO_OP` + + .. versionadded:: 15.2.0 *convert* + .. versionadded:: 16.3.0 *metadata* + .. versionchanged:: 17.1.0 *validator* can be a ``list`` now. + .. versionchanged:: 17.1.0 + *hash* is ``None`` and therefore mirrors *eq* by default. + .. versionadded:: 17.3.0 *type* + .. deprecated:: 17.4.0 *convert* + .. versionadded:: 17.4.0 *converter* as a replacement for the deprecated + *convert* to achieve consistency with other noun-based arguments. + .. versionadded:: 18.1.0 + ``factory=f`` is syntactic sugar for ``default=attr.Factory(f)``. + .. versionadded:: 18.2.0 *kw_only* + .. versionchanged:: 19.2.0 *convert* keyword argument removed. + .. versionchanged:: 19.2.0 *repr* also accepts a custom callable. + .. deprecated:: 19.2.0 *cmp* Removal on or after 2021-06-01. + .. versionadded:: 19.2.0 *eq* and *order* + .. versionadded:: 20.1.0 *on_setattr* + .. versionchanged:: 20.3.0 *kw_only* backported to Python 2 + .. versionchanged:: 21.1.0 + *eq*, *order*, and *cmp* also accept a custom callable + .. versionchanged:: 21.1.0 *cmp* undeprecated + """ + eq, eq_key, order, order_key = _determine_attrib_eq_order( + cmp, eq, order, True + ) + + if hash is not None and hash is not True and hash is not False: + raise TypeError( + "Invalid value for hash. Must be True, False, or None." + ) + + if factory is not None: + if default is not NOTHING: + raise ValueError( + "The `default` and `factory` arguments are mutually " + "exclusive." + ) + if not callable(factory): + raise ValueError("The `factory` argument must be a callable.") + default = Factory(factory) + + if metadata is None: + metadata = {} + + # Apply syntactic sugar by auto-wrapping. + if isinstance(on_setattr, (list, tuple)): + on_setattr = setters.pipe(*on_setattr) + + if validator and isinstance(validator, (list, tuple)): + validator = and_(*validator) + + if converter and isinstance(converter, (list, tuple)): + converter = pipe(*converter) + + return _CountingAttr( + default=default, + validator=validator, + repr=repr, + cmp=None, + hash=hash, + init=init, + converter=converter, + metadata=metadata, + type=type, + kw_only=kw_only, + eq=eq, + eq_key=eq_key, + order=order, + order_key=order_key, + on_setattr=on_setattr, + ) + + +def _compile_and_eval(script, globs, locs=None, filename=""): + """ + "Exec" the script with the given global (globs) and local (locs) variables. + """ + bytecode = compile(script, filename, "exec") + eval(bytecode, globs, locs) + + +def _make_method(name, script, filename, globs): + """ + Create the method with the script given and return the method object. + """ + locs = {} + + # In order of debuggers like PDB being able to step through the code, + # we add a fake linecache entry. + count = 1 + base_filename = filename + while True: + linecache_tuple = ( + len(script), + None, + script.splitlines(True), + filename, + ) + old_val = linecache.cache.setdefault(filename, linecache_tuple) + if old_val == linecache_tuple: + break + else: + filename = "{}-{}>".format(base_filename[:-1], count) + count += 1 + + _compile_and_eval(script, globs, locs, filename) + + return locs[name] + + +def _make_attr_tuple_class(cls_name, attr_names): + """ + Create a tuple subclass to hold `Attribute`s for an `attrs` class. + + The subclass is a bare tuple with properties for names. + + class MyClassAttributes(tuple): + __slots__ = () + x = property(itemgetter(0)) + """ + attr_class_name = "{}Attributes".format(cls_name) + attr_class_template = [ + "class {}(tuple):".format(attr_class_name), + " __slots__ = ()", + ] + if attr_names: + for i, attr_name in enumerate(attr_names): + attr_class_template.append( + _tuple_property_pat.format(index=i, attr_name=attr_name) + ) + else: + attr_class_template.append(" pass") + globs = {"_attrs_itemgetter": itemgetter, "_attrs_property": property} + _compile_and_eval("\n".join(attr_class_template), globs) + return globs[attr_class_name] + + +# Tuple class for extracted attributes from a class definition. +# `base_attrs` is a subset of `attrs`. +_Attributes = _make_attr_tuple_class( + "_Attributes", + [ + # all attributes to build dunder methods for + "attrs", + # attributes that have been inherited + "base_attrs", + # map inherited attributes to their originating classes + "base_attrs_map", + ], +) + + +def _is_class_var(annot): + """ + Check whether *annot* is a typing.ClassVar. + + The string comparison hack is used to avoid evaluating all string + annotations which would put attrs-based classes at a performance + disadvantage compared to plain old classes. + """ + annot = str(annot) + + # Annotation can be quoted. + if annot.startswith(("'", '"')) and annot.endswith(("'", '"')): + annot = annot[1:-1] + + return annot.startswith(_classvar_prefixes) + + +def _has_own_attribute(cls, attrib_name): + """ + Check whether *cls* defines *attrib_name* (and doesn't just inherit it). + + Requires Python 3. + """ + attr = getattr(cls, attrib_name, _sentinel) + if attr is _sentinel: + return False + + for base_cls in cls.__mro__[1:]: + a = getattr(base_cls, attrib_name, None) + if attr is a: + return False + + return True + + +def _get_annotations(cls): + """ + Get annotations for *cls*. + """ + if _has_own_attribute(cls, "__annotations__"): + return cls.__annotations__ + + return {} + + +def _counter_getter(e): + """ + Key function for sorting to avoid re-creating a lambda for every class. + """ + return e[1].counter + + +def _collect_base_attrs(cls, taken_attr_names): + """ + Collect attr.ibs from base classes of *cls*, except *taken_attr_names*. + """ + base_attrs = [] + base_attr_map = {} # A dictionary of base attrs to their classes. + + # Traverse the MRO and collect attributes. + for base_cls in reversed(cls.__mro__[1:-1]): + for a in getattr(base_cls, "__attrs_attrs__", []): + if a.inherited or a.name in taken_attr_names: + continue + + a = a.evolve(inherited=True) + base_attrs.append(a) + base_attr_map[a.name] = base_cls + + # For each name, only keep the freshest definition i.e. the furthest at the + # back. base_attr_map is fine because it gets overwritten with every new + # instance. + filtered = [] + seen = set() + for a in reversed(base_attrs): + if a.name in seen: + continue + filtered.insert(0, a) + seen.add(a.name) + + return filtered, base_attr_map + + +def _collect_base_attrs_broken(cls, taken_attr_names): + """ + Collect attr.ibs from base classes of *cls*, except *taken_attr_names*. + + N.B. *taken_attr_names* will be mutated. + + Adhere to the old incorrect behavior. + + Notably it collects from the front and considers inherited attributes which + leads to the buggy behavior reported in #428. + """ + base_attrs = [] + base_attr_map = {} # A dictionary of base attrs to their classes. + + # Traverse the MRO and collect attributes. + for base_cls in cls.__mro__[1:-1]: + for a in getattr(base_cls, "__attrs_attrs__", []): + if a.name in taken_attr_names: + continue + + a = a.evolve(inherited=True) + taken_attr_names.add(a.name) + base_attrs.append(a) + base_attr_map[a.name] = base_cls + + return base_attrs, base_attr_map + + +def _transform_attrs( + cls, these, auto_attribs, kw_only, collect_by_mro, field_transformer +): + """ + Transform all `_CountingAttr`s on a class into `Attribute`s. + + If *these* is passed, use that and don't look for them on the class. + + *collect_by_mro* is True, collect them in the correct MRO order, otherwise + use the old -- incorrect -- order. See #428. + + Return an `_Attributes`. + """ + cd = cls.__dict__ + anns = _get_annotations(cls) + + if these is not None: + ca_list = [(name, ca) for name, ca in these.items()] + + if not isinstance(these, ordered_dict): + ca_list.sort(key=_counter_getter) + elif auto_attribs is True: + ca_names = { + name + for name, attr in cd.items() + if isinstance(attr, _CountingAttr) + } + ca_list = [] + annot_names = set() + for attr_name, type in anns.items(): + if _is_class_var(type): + continue + annot_names.add(attr_name) + a = cd.get(attr_name, NOTHING) + + if not isinstance(a, _CountingAttr): + if a is NOTHING: + a = attrib() + else: + a = attrib(default=a) + ca_list.append((attr_name, a)) + + unannotated = ca_names - annot_names + if len(unannotated) > 0: + raise UnannotatedAttributeError( + "The following `attr.ib`s lack a type annotation: " + + ", ".join( + sorted(unannotated, key=lambda n: cd.get(n).counter) + ) + + "." + ) + else: + ca_list = sorted( + ( + (name, attr) + for name, attr in cd.items() + if isinstance(attr, _CountingAttr) + ), + key=lambda e: e[1].counter, + ) + + own_attrs = [ + Attribute.from_counting_attr( + name=attr_name, ca=ca, type=anns.get(attr_name) + ) + for attr_name, ca in ca_list + ] + + if collect_by_mro: + base_attrs, base_attr_map = _collect_base_attrs( + cls, {a.name for a in own_attrs} + ) + else: + base_attrs, base_attr_map = _collect_base_attrs_broken( + cls, {a.name for a in own_attrs} + ) + + if kw_only: + own_attrs = [a.evolve(kw_only=True) for a in own_attrs] + base_attrs = [a.evolve(kw_only=True) for a in base_attrs] + + attrs = base_attrs + own_attrs + + # Mandatory vs non-mandatory attr order only matters when they are part of + # the __init__ signature and when they aren't kw_only (which are moved to + # the end and can be mandatory or non-mandatory in any order, as they will + # be specified as keyword args anyway). Check the order of those attrs: + had_default = False + for a in (a for a in attrs if a.init is not False and a.kw_only is False): + if had_default is True and a.default is NOTHING: + raise ValueError( + "No mandatory attributes allowed after an attribute with a " + "default value or factory. Attribute in question: %r" % (a,) + ) + + if had_default is False and a.default is not NOTHING: + had_default = True + + if field_transformer is not None: + attrs = field_transformer(cls, attrs) + + # Create AttrsClass *after* applying the field_transformer since it may + # add or remove attributes! + attr_names = [a.name for a in attrs] + AttrsClass = _make_attr_tuple_class(cls.__name__, attr_names) + + return _Attributes((AttrsClass(attrs), base_attrs, base_attr_map)) + + +if PYPY: + + def _frozen_setattrs(self, name, value): + """ + Attached to frozen classes as __setattr__. + """ + if isinstance(self, BaseException) and name in ( + "__cause__", + "__context__", + ): + BaseException.__setattr__(self, name, value) + return + + raise FrozenInstanceError() + +else: + + def _frozen_setattrs(self, name, value): + """ + Attached to frozen classes as __setattr__. + """ + raise FrozenInstanceError() + + +def _frozen_delattrs(self, name): + """ + Attached to frozen classes as __delattr__. + """ + raise FrozenInstanceError() + + +class _ClassBuilder: + """ + Iteratively build *one* class. + """ + + __slots__ = ( + "_attr_names", + "_attrs", + "_base_attr_map", + "_base_names", + "_cache_hash", + "_cls", + "_cls_dict", + "_delete_attribs", + "_frozen", + "_has_pre_init", + "_has_post_init", + "_is_exc", + "_on_setattr", + "_slots", + "_weakref_slot", + "_wrote_own_setattr", + "_has_custom_setattr", + ) + + def __init__( + self, + cls, + these, + slots, + frozen, + weakref_slot, + getstate_setstate, + auto_attribs, + kw_only, + cache_hash, + is_exc, + collect_by_mro, + on_setattr, + has_custom_setattr, + field_transformer, + ): + attrs, base_attrs, base_map = _transform_attrs( + cls, + these, + auto_attribs, + kw_only, + collect_by_mro, + field_transformer, + ) + + self._cls = cls + self._cls_dict = dict(cls.__dict__) if slots else {} + self._attrs = attrs + self._base_names = {a.name for a in base_attrs} + self._base_attr_map = base_map + self._attr_names = tuple(a.name for a in attrs) + self._slots = slots + self._frozen = frozen + self._weakref_slot = weakref_slot + self._cache_hash = cache_hash + self._has_pre_init = bool(getattr(cls, "__attrs_pre_init__", False)) + self._has_post_init = bool(getattr(cls, "__attrs_post_init__", False)) + self._delete_attribs = not bool(these) + self._is_exc = is_exc + self._on_setattr = on_setattr + + self._has_custom_setattr = has_custom_setattr + self._wrote_own_setattr = False + + self._cls_dict["__attrs_attrs__"] = self._attrs + + if frozen: + self._cls_dict["__setattr__"] = _frozen_setattrs + self._cls_dict["__delattr__"] = _frozen_delattrs + + self._wrote_own_setattr = True + elif on_setattr in ( + _ng_default_on_setattr, + setters.validate, + setters.convert, + ): + has_validator = has_converter = False + for a in attrs: + if a.validator is not None: + has_validator = True + if a.converter is not None: + has_converter = True + + if has_validator and has_converter: + break + if ( + ( + on_setattr == _ng_default_on_setattr + and not (has_validator or has_converter) + ) + or (on_setattr == setters.validate and not has_validator) + or (on_setattr == setters.convert and not has_converter) + ): + # If class-level on_setattr is set to convert + validate, but + # there's no field to convert or validate, pretend like there's + # no on_setattr. + self._on_setattr = None + + if getstate_setstate: + ( + self._cls_dict["__getstate__"], + self._cls_dict["__setstate__"], + ) = self._make_getstate_setstate() + + def __repr__(self): + return "<_ClassBuilder(cls={cls})>".format(cls=self._cls.__name__) + + def build_class(self): + """ + Finalize class based on the accumulated configuration. + + Builder cannot be used after calling this method. + """ + if self._slots is True: + return self._create_slots_class() + else: + return self._patch_original_class() + + def _patch_original_class(self): + """ + Apply accumulated methods and return the class. + """ + cls = self._cls + base_names = self._base_names + + # Clean class of attribute definitions (`attr.ib()`s). + if self._delete_attribs: + for name in self._attr_names: + if ( + name not in base_names + and getattr(cls, name, _sentinel) is not _sentinel + ): + try: + delattr(cls, name) + except AttributeError: + # This can happen if a base class defines a class + # variable and we want to set an attribute with the + # same name by using only a type annotation. + pass + + # Attach our dunder methods. + for name, value in self._cls_dict.items(): + setattr(cls, name, value) + + # If we've inherited an attrs __setattr__ and don't write our own, + # reset it to object's. + if not self._wrote_own_setattr and getattr( + cls, "__attrs_own_setattr__", False + ): + cls.__attrs_own_setattr__ = False + + if not self._has_custom_setattr: + cls.__setattr__ = _obj_setattr + + return cls + + def _create_slots_class(self): + """ + Build and return a new class with a `__slots__` attribute. + """ + cd = { + k: v + for k, v in self._cls_dict.items() + if k not in tuple(self._attr_names) + ("__dict__", "__weakref__") + } + + # If our class doesn't have its own implementation of __setattr__ + # (either from the user or by us), check the bases, if one of them has + # an attrs-made __setattr__, that needs to be reset. We don't walk the + # MRO because we only care about our immediate base classes. + # XXX: This can be confused by subclassing a slotted attrs class with + # XXX: a non-attrs class and subclass the resulting class with an attrs + # XXX: class. See `test_slotted_confused` for details. For now that's + # XXX: OK with us. + if not self._wrote_own_setattr: + cd["__attrs_own_setattr__"] = False + + if not self._has_custom_setattr: + for base_cls in self._cls.__bases__: + if base_cls.__dict__.get("__attrs_own_setattr__", False): + cd["__setattr__"] = _obj_setattr + break + + # Traverse the MRO to collect existing slots + # and check for an existing __weakref__. + existing_slots = dict() + weakref_inherited = False + for base_cls in self._cls.__mro__[1:-1]: + if base_cls.__dict__.get("__weakref__", None) is not None: + weakref_inherited = True + existing_slots.update( + { + name: getattr(base_cls, name) + for name in getattr(base_cls, "__slots__", []) + } + ) + + base_names = set(self._base_names) + + names = self._attr_names + if ( + self._weakref_slot + and "__weakref__" not in getattr(self._cls, "__slots__", ()) + and "__weakref__" not in names + and not weakref_inherited + ): + names += ("__weakref__",) + + # We only add the names of attributes that aren't inherited. + # Setting __slots__ to inherited attributes wastes memory. + slot_names = [name for name in names if name not in base_names] + # There are slots for attributes from current class + # that are defined in parent classes. + # As their descriptors may be overridden by a child class, + # we collect them here and update the class dict + reused_slots = { + slot: slot_descriptor + for slot, slot_descriptor in existing_slots.items() + if slot in slot_names + } + slot_names = [name for name in slot_names if name not in reused_slots] + cd.update(reused_slots) + if self._cache_hash: + slot_names.append(_hash_cache_field) + cd["__slots__"] = tuple(slot_names) + + cd["__qualname__"] = self._cls.__qualname__ + + # Create new class based on old class and our methods. + cls = type(self._cls)(self._cls.__name__, self._cls.__bases__, cd) + + # The following is a fix for + # . On Python 3, + # if a method mentions `__class__` or uses the no-arg super(), the + # compiler will bake a reference to the class in the method itself + # as `method.__closure__`. Since we replace the class with a + # clone, we rewrite these references so it keeps working. + for item in cls.__dict__.values(): + if isinstance(item, (classmethod, staticmethod)): + # Class- and staticmethods hide their functions inside. + # These might need to be rewritten as well. + closure_cells = getattr(item.__func__, "__closure__", None) + elif isinstance(item, property): + # Workaround for property `super()` shortcut (PY3-only). + # There is no universal way for other descriptors. + closure_cells = getattr(item.fget, "__closure__", None) + else: + closure_cells = getattr(item, "__closure__", None) + + if not closure_cells: # Catch None or the empty list. + continue + for cell in closure_cells: + try: + match = cell.cell_contents is self._cls + except ValueError: # ValueError: Cell is empty + pass + else: + if match: + set_closure_cell(cell, cls) + + return cls + + def add_repr(self, ns): + self._cls_dict["__repr__"] = self._add_method_dunders( + _make_repr(self._attrs, ns, self._cls) + ) + return self + + def add_str(self): + repr = self._cls_dict.get("__repr__") + if repr is None: + raise ValueError( + "__str__ can only be generated if a __repr__ exists." + ) + + def __str__(self): + return self.__repr__() + + self._cls_dict["__str__"] = self._add_method_dunders(__str__) + return self + + def _make_getstate_setstate(self): + """ + Create custom __setstate__ and __getstate__ methods. + """ + # __weakref__ is not writable. + state_attr_names = tuple( + an for an in self._attr_names if an != "__weakref__" + ) + + def slots_getstate(self): + """ + Automatically created by attrs. + """ + return tuple(getattr(self, name) for name in state_attr_names) + + hash_caching_enabled = self._cache_hash + + def slots_setstate(self, state): + """ + Automatically created by attrs. + """ + __bound_setattr = _obj_setattr.__get__(self, Attribute) + for name, value in zip(state_attr_names, state): + __bound_setattr(name, value) + + # The hash code cache is not included when the object is + # serialized, but it still needs to be initialized to None to + # indicate that the first call to __hash__ should be a cache + # miss. + if hash_caching_enabled: + __bound_setattr(_hash_cache_field, None) + + return slots_getstate, slots_setstate + + def make_unhashable(self): + self._cls_dict["__hash__"] = None + return self + + def add_hash(self): + self._cls_dict["__hash__"] = self._add_method_dunders( + _make_hash( + self._cls, + self._attrs, + frozen=self._frozen, + cache_hash=self._cache_hash, + ) + ) + + return self + + def add_init(self): + self._cls_dict["__init__"] = self._add_method_dunders( + _make_init( + self._cls, + self._attrs, + self._has_pre_init, + self._has_post_init, + self._frozen, + self._slots, + self._cache_hash, + self._base_attr_map, + self._is_exc, + self._on_setattr, + attrs_init=False, + ) + ) + + return self + + def add_match_args(self): + self._cls_dict["__match_args__"] = tuple( + field.name + for field in self._attrs + if field.init and not field.kw_only + ) + + def add_attrs_init(self): + self._cls_dict["__attrs_init__"] = self._add_method_dunders( + _make_init( + self._cls, + self._attrs, + self._has_pre_init, + self._has_post_init, + self._frozen, + self._slots, + self._cache_hash, + self._base_attr_map, + self._is_exc, + self._on_setattr, + attrs_init=True, + ) + ) + + return self + + def add_eq(self): + cd = self._cls_dict + + cd["__eq__"] = self._add_method_dunders( + _make_eq(self._cls, self._attrs) + ) + cd["__ne__"] = self._add_method_dunders(_make_ne()) + + return self + + def add_order(self): + cd = self._cls_dict + + cd["__lt__"], cd["__le__"], cd["__gt__"], cd["__ge__"] = ( + self._add_method_dunders(meth) + for meth in _make_order(self._cls, self._attrs) + ) + + return self + + def add_setattr(self): + if self._frozen: + return self + + sa_attrs = {} + for a in self._attrs: + on_setattr = a.on_setattr or self._on_setattr + if on_setattr and on_setattr is not setters.NO_OP: + sa_attrs[a.name] = a, on_setattr + + if not sa_attrs: + return self + + if self._has_custom_setattr: + # We need to write a __setattr__ but there already is one! + raise ValueError( + "Can't combine custom __setattr__ with on_setattr hooks." + ) + + # docstring comes from _add_method_dunders + def __setattr__(self, name, val): + try: + a, hook = sa_attrs[name] + except KeyError: + nval = val + else: + nval = hook(self, a, val) + + _obj_setattr(self, name, nval) + + self._cls_dict["__attrs_own_setattr__"] = True + self._cls_dict["__setattr__"] = self._add_method_dunders(__setattr__) + self._wrote_own_setattr = True + + return self + + def _add_method_dunders(self, method): + """ + Add __module__ and __qualname__ to a *method* if possible. + """ + try: + method.__module__ = self._cls.__module__ + except AttributeError: + pass + + try: + method.__qualname__ = ".".join( + (self._cls.__qualname__, method.__name__) + ) + except AttributeError: + pass + + try: + method.__doc__ = "Method generated by attrs for class %s." % ( + self._cls.__qualname__, + ) + except AttributeError: + pass + + return method + + +def _determine_attrs_eq_order(cmp, eq, order, default_eq): + """ + Validate the combination of *cmp*, *eq*, and *order*. Derive the effective + values of eq and order. If *eq* is None, set it to *default_eq*. + """ + if cmp is not None and any((eq is not None, order is not None)): + raise ValueError("Don't mix `cmp` with `eq' and `order`.") + + # cmp takes precedence due to bw-compatibility. + if cmp is not None: + return cmp, cmp + + # If left None, equality is set to the specified default and ordering + # mirrors equality. + if eq is None: + eq = default_eq + + if order is None: + order = eq + + if eq is False and order is True: + raise ValueError("`order` can only be True if `eq` is True too.") + + return eq, order + + +def _determine_attrib_eq_order(cmp, eq, order, default_eq): + """ + Validate the combination of *cmp*, *eq*, and *order*. Derive the effective + values of eq and order. If *eq* is None, set it to *default_eq*. + """ + if cmp is not None and any((eq is not None, order is not None)): + raise ValueError("Don't mix `cmp` with `eq' and `order`.") + + def decide_callable_or_boolean(value): + """ + Decide whether a key function is used. + """ + if callable(value): + value, key = True, value + else: + key = None + return value, key + + # cmp takes precedence due to bw-compatibility. + if cmp is not None: + cmp, cmp_key = decide_callable_or_boolean(cmp) + return cmp, cmp_key, cmp, cmp_key + + # If left None, equality is set to the specified default and ordering + # mirrors equality. + if eq is None: + eq, eq_key = default_eq, None + else: + eq, eq_key = decide_callable_or_boolean(eq) + + if order is None: + order, order_key = eq, eq_key + else: + order, order_key = decide_callable_or_boolean(order) + + if eq is False and order is True: + raise ValueError("`order` can only be True if `eq` is True too.") + + return eq, eq_key, order, order_key + + +def _determine_whether_to_implement( + cls, flag, auto_detect, dunders, default=True +): + """ + Check whether we should implement a set of methods for *cls*. + + *flag* is the argument passed into @attr.s like 'init', *auto_detect* the + same as passed into @attr.s and *dunders* is a tuple of attribute names + whose presence signal that the user has implemented it themselves. + + Return *default* if no reason for either for or against is found. + """ + if flag is True or flag is False: + return flag + + if flag is None and auto_detect is False: + return default + + # Logically, flag is None and auto_detect is True here. + for dunder in dunders: + if _has_own_attribute(cls, dunder): + return False + + return default + + +def attrs( + maybe_cls=None, + these=None, + repr_ns=None, + repr=None, + cmp=None, + hash=None, + init=None, + slots=False, + frozen=False, + weakref_slot=True, + str=False, + auto_attribs=False, + kw_only=False, + cache_hash=False, + auto_exc=False, + eq=None, + order=None, + auto_detect=False, + collect_by_mro=False, + getstate_setstate=None, + on_setattr=None, + field_transformer=None, + match_args=True, +): + r""" + A class decorator that adds `dunder + `_\ -methods according to the + specified attributes using `attr.ib` or the *these* argument. + + :param these: A dictionary of name to `attr.ib` mappings. This is + useful to avoid the definition of your attributes within the class body + because you can't (e.g. if you want to add ``__repr__`` methods to + Django models) or don't want to. + + If *these* is not ``None``, ``attrs`` will *not* search the class body + for attributes and will *not* remove any attributes from it. + + If *these* is an ordered dict (`dict` on Python 3.6+, + `collections.OrderedDict` otherwise), the order is deduced from + the order of the attributes inside *these*. Otherwise the order + of the definition of the attributes is used. + + :type these: `dict` of `str` to `attr.ib` + + :param str repr_ns: When using nested classes, there's no way in Python 2 + to automatically detect that. Therefore it's possible to set the + namespace explicitly for a more meaningful ``repr`` output. + :param bool auto_detect: Instead of setting the *init*, *repr*, *eq*, + *order*, and *hash* arguments explicitly, assume they are set to + ``True`` **unless any** of the involved methods for one of the + arguments is implemented in the *current* class (i.e. it is *not* + inherited from some base class). + + So for example by implementing ``__eq__`` on a class yourself, + ``attrs`` will deduce ``eq=False`` and will create *neither* + ``__eq__`` *nor* ``__ne__`` (but Python classes come with a sensible + ``__ne__`` by default, so it *should* be enough to only implement + ``__eq__`` in most cases). + + .. warning:: + + If you prevent ``attrs`` from creating the ordering methods for you + (``order=False``, e.g. by implementing ``__le__``), it becomes + *your* responsibility to make sure its ordering is sound. The best + way is to use the `functools.total_ordering` decorator. + + + Passing ``True`` or ``False`` to *init*, *repr*, *eq*, *order*, + *cmp*, or *hash* overrides whatever *auto_detect* would determine. + + *auto_detect* requires Python 3. Setting it ``True`` on Python 2 raises + an `attrs.exceptions.PythonTooOldError`. + + :param bool repr: Create a ``__repr__`` method with a human readable + representation of ``attrs`` attributes.. + :param bool str: Create a ``__str__`` method that is identical to + ``__repr__``. This is usually not necessary except for + `Exception`\ s. + :param Optional[bool] eq: If ``True`` or ``None`` (default), add ``__eq__`` + and ``__ne__`` methods that check two instances for equality. + + They compare the instances as if they were tuples of their ``attrs`` + attributes if and only if the types of both classes are *identical*! + :param Optional[bool] order: If ``True``, add ``__lt__``, ``__le__``, + ``__gt__``, and ``__ge__`` methods that behave like *eq* above and + allow instances to be ordered. If ``None`` (default) mirror value of + *eq*. + :param Optional[bool] cmp: Setting *cmp* is equivalent to setting *eq* + and *order* to the same value. Must not be mixed with *eq* or *order*. + :param Optional[bool] hash: If ``None`` (default), the ``__hash__`` method + is generated according how *eq* and *frozen* are set. + + 1. If *both* are True, ``attrs`` will generate a ``__hash__`` for you. + 2. If *eq* is True and *frozen* is False, ``__hash__`` will be set to + None, marking it unhashable (which it is). + 3. If *eq* is False, ``__hash__`` will be left untouched meaning the + ``__hash__`` method of the base class will be used (if base class is + ``object``, this means it will fall back to id-based hashing.). + + Although not recommended, you can decide for yourself and force + ``attrs`` to create one (e.g. if the class is immutable even though you + didn't freeze it programmatically) by passing ``True`` or not. Both of + these cases are rather special and should be used carefully. + + See our documentation on `hashing`, Python's documentation on + `object.__hash__`, and the `GitHub issue that led to the default \ + behavior `_ for more + details. + :param bool init: Create a ``__init__`` method that initializes the + ``attrs`` attributes. Leading underscores are stripped for the argument + name. If a ``__attrs_pre_init__`` method exists on the class, it will + be called before the class is initialized. If a ``__attrs_post_init__`` + method exists on the class, it will be called after the class is fully + initialized. + + If ``init`` is ``False``, an ``__attrs_init__`` method will be + injected instead. This allows you to define a custom ``__init__`` + method that can do pre-init work such as ``super().__init__()``, + and then call ``__attrs_init__()`` and ``__attrs_post_init__()``. + :param bool slots: Create a `slotted class ` that's more + memory-efficient. Slotted classes are generally superior to the default + dict classes, but have some gotchas you should know about, so we + encourage you to read the `glossary entry `. + :param bool frozen: Make instances immutable after initialization. If + someone attempts to modify a frozen instance, + `attr.exceptions.FrozenInstanceError` is raised. + + .. note:: + + 1. This is achieved by installing a custom ``__setattr__`` method + on your class, so you can't implement your own. + + 2. True immutability is impossible in Python. + + 3. This *does* have a minor a runtime performance `impact + ` when initializing new instances. In other words: + ``__init__`` is slightly slower with ``frozen=True``. + + 4. If a class is frozen, you cannot modify ``self`` in + ``__attrs_post_init__`` or a self-written ``__init__``. You can + circumvent that limitation by using + ``object.__setattr__(self, "attribute_name", value)``. + + 5. Subclasses of a frozen class are frozen too. + + :param bool weakref_slot: Make instances weak-referenceable. This has no + effect unless ``slots`` is also enabled. + :param bool auto_attribs: If ``True``, collect :pep:`526`-annotated + attributes (Python 3.6 and later only) from the class body. + + In this case, you **must** annotate every field. If ``attrs`` + encounters a field that is set to an `attr.ib` but lacks a type + annotation, an `attr.exceptions.UnannotatedAttributeError` is + raised. Use ``field_name: typing.Any = attr.ib(...)`` if you don't + want to set a type. + + If you assign a value to those attributes (e.g. ``x: int = 42``), that + value becomes the default value like if it were passed using + ``attr.ib(default=42)``. Passing an instance of `attrs.Factory` also + works as expected in most cases (see warning below). + + Attributes annotated as `typing.ClassVar`, and attributes that are + neither annotated nor set to an `attr.ib` are **ignored**. + + .. warning:: + For features that use the attribute name to create decorators (e.g. + `validators `), you still *must* assign `attr.ib` to + them. Otherwise Python will either not find the name or try to use + the default value to call e.g. ``validator`` on it. + + These errors can be quite confusing and probably the most common bug + report on our bug tracker. + + :param bool kw_only: Make all attributes keyword-only (Python 3+) + in the generated ``__init__`` (if ``init`` is ``False``, this + parameter is ignored). + :param bool cache_hash: Ensure that the object's hash code is computed + only once and stored on the object. If this is set to ``True``, + hashing must be either explicitly or implicitly enabled for this + class. If the hash code is cached, avoid any reassignments of + fields involved in hash code computation or mutations of the objects + those fields point to after object creation. If such changes occur, + the behavior of the object's hash code is undefined. + :param bool auto_exc: If the class subclasses `BaseException` + (which implicitly includes any subclass of any exception), the + following happens to behave like a well-behaved Python exceptions + class: + + - the values for *eq*, *order*, and *hash* are ignored and the + instances compare and hash by the instance's ids (N.B. ``attrs`` will + *not* remove existing implementations of ``__hash__`` or the equality + methods. It just won't add own ones.), + - all attributes that are either passed into ``__init__`` or have a + default value are additionally available as a tuple in the ``args`` + attribute, + - the value of *str* is ignored leaving ``__str__`` to base classes. + :param bool collect_by_mro: Setting this to `True` fixes the way ``attrs`` + collects attributes from base classes. The default behavior is + incorrect in certain cases of multiple inheritance. It should be on by + default but is kept off for backward-compatibility. + + See issue `#428 `_ for + more details. + + :param Optional[bool] getstate_setstate: + .. note:: + This is usually only interesting for slotted classes and you should + probably just set *auto_detect* to `True`. + + If `True`, ``__getstate__`` and + ``__setstate__`` are generated and attached to the class. This is + necessary for slotted classes to be pickleable. If left `None`, it's + `True` by default for slotted classes and ``False`` for dict classes. + + If *auto_detect* is `True`, and *getstate_setstate* is left `None`, + and **either** ``__getstate__`` or ``__setstate__`` is detected directly + on the class (i.e. not inherited), it is set to `False` (this is usually + what you want). + + :param on_setattr: A callable that is run whenever the user attempts to set + an attribute (either by assignment like ``i.x = 42`` or by using + `setattr` like ``setattr(i, "x", 42)``). It receives the same arguments + as validators: the instance, the attribute that is being modified, and + the new value. + + If no exception is raised, the attribute is set to the return value of + the callable. + + If a list of callables is passed, they're automatically wrapped in an + `attrs.setters.pipe`. + :type on_setattr: `callable`, or a list of callables, or `None`, or + `attrs.setters.NO_OP` + + :param Optional[callable] field_transformer: + A function that is called with the original class object and all + fields right before ``attrs`` finalizes the class. You can use + this, e.g., to automatically add converters or validators to + fields based on their types. See `transform-fields` for more details. + + :param bool match_args: + If `True` (default), set ``__match_args__`` on the class to support + :pep:`634` (Structural Pattern Matching). It is a tuple of all + non-keyword-only ``__init__`` parameter names on Python 3.10 and later. + Ignored on older Python versions. + + .. versionadded:: 16.0.0 *slots* + .. versionadded:: 16.1.0 *frozen* + .. versionadded:: 16.3.0 *str* + .. versionadded:: 16.3.0 Support for ``__attrs_post_init__``. + .. versionchanged:: 17.1.0 + *hash* supports ``None`` as value which is also the default now. + .. versionadded:: 17.3.0 *auto_attribs* + .. versionchanged:: 18.1.0 + If *these* is passed, no attributes are deleted from the class body. + .. versionchanged:: 18.1.0 If *these* is ordered, the order is retained. + .. versionadded:: 18.2.0 *weakref_slot* + .. deprecated:: 18.2.0 + ``__lt__``, ``__le__``, ``__gt__``, and ``__ge__`` now raise a + `DeprecationWarning` if the classes compared are subclasses of + each other. ``__eq`` and ``__ne__`` never tried to compared subclasses + to each other. + .. versionchanged:: 19.2.0 + ``__lt__``, ``__le__``, ``__gt__``, and ``__ge__`` now do not consider + subclasses comparable anymore. + .. versionadded:: 18.2.0 *kw_only* + .. versionadded:: 18.2.0 *cache_hash* + .. versionadded:: 19.1.0 *auto_exc* + .. deprecated:: 19.2.0 *cmp* Removal on or after 2021-06-01. + .. versionadded:: 19.2.0 *eq* and *order* + .. versionadded:: 20.1.0 *auto_detect* + .. versionadded:: 20.1.0 *collect_by_mro* + .. versionadded:: 20.1.0 *getstate_setstate* + .. versionadded:: 20.1.0 *on_setattr* + .. versionadded:: 20.3.0 *field_transformer* + .. versionchanged:: 21.1.0 + ``init=False`` injects ``__attrs_init__`` + .. versionchanged:: 21.1.0 Support for ``__attrs_pre_init__`` + .. versionchanged:: 21.1.0 *cmp* undeprecated + .. versionadded:: 21.3.0 *match_args* + """ + eq_, order_ = _determine_attrs_eq_order(cmp, eq, order, None) + hash_ = hash # work around the lack of nonlocal + + if isinstance(on_setattr, (list, tuple)): + on_setattr = setters.pipe(*on_setattr) + + def wrap(cls): + is_frozen = frozen or _has_frozen_base_class(cls) + is_exc = auto_exc is True and issubclass(cls, BaseException) + has_own_setattr = auto_detect and _has_own_attribute( + cls, "__setattr__" + ) + + if has_own_setattr and is_frozen: + raise ValueError("Can't freeze a class with a custom __setattr__.") + + builder = _ClassBuilder( + cls, + these, + slots, + is_frozen, + weakref_slot, + _determine_whether_to_implement( + cls, + getstate_setstate, + auto_detect, + ("__getstate__", "__setstate__"), + default=slots, + ), + auto_attribs, + kw_only, + cache_hash, + is_exc, + collect_by_mro, + on_setattr, + has_own_setattr, + field_transformer, + ) + if _determine_whether_to_implement( + cls, repr, auto_detect, ("__repr__",) + ): + builder.add_repr(repr_ns) + if str is True: + builder.add_str() + + eq = _determine_whether_to_implement( + cls, eq_, auto_detect, ("__eq__", "__ne__") + ) + if not is_exc and eq is True: + builder.add_eq() + if not is_exc and _determine_whether_to_implement( + cls, order_, auto_detect, ("__lt__", "__le__", "__gt__", "__ge__") + ): + builder.add_order() + + builder.add_setattr() + + if ( + hash_ is None + and auto_detect is True + and _has_own_attribute(cls, "__hash__") + ): + hash = False + else: + hash = hash_ + if hash is not True and hash is not False and hash is not None: + # Can't use `hash in` because 1 == True for example. + raise TypeError( + "Invalid value for hash. Must be True, False, or None." + ) + elif hash is False or (hash is None and eq is False) or is_exc: + # Don't do anything. Should fall back to __object__'s __hash__ + # which is by id. + if cache_hash: + raise TypeError( + "Invalid value for cache_hash. To use hash caching," + " hashing must be either explicitly or implicitly " + "enabled." + ) + elif hash is True or ( + hash is None and eq is True and is_frozen is True + ): + # Build a __hash__ if told so, or if it's safe. + builder.add_hash() + else: + # Raise TypeError on attempts to hash. + if cache_hash: + raise TypeError( + "Invalid value for cache_hash. To use hash caching," + " hashing must be either explicitly or implicitly " + "enabled." + ) + builder.make_unhashable() + + if _determine_whether_to_implement( + cls, init, auto_detect, ("__init__",) + ): + builder.add_init() + else: + builder.add_attrs_init() + if cache_hash: + raise TypeError( + "Invalid value for cache_hash. To use hash caching," + " init must be True." + ) + + if ( + PY310 + and match_args + and not _has_own_attribute(cls, "__match_args__") + ): + builder.add_match_args() + + return builder.build_class() + + # maybe_cls's type depends on the usage of the decorator. It's a class + # if it's used as `@attrs` but ``None`` if used as `@attrs()`. + if maybe_cls is None: + return wrap + else: + return wrap(maybe_cls) + + +_attrs = attrs +""" +Internal alias so we can use it in functions that take an argument called +*attrs*. +""" + + +def _has_frozen_base_class(cls): + """ + Check whether *cls* has a frozen ancestor by looking at its + __setattr__. + """ + return cls.__setattr__ is _frozen_setattrs + + +def _generate_unique_filename(cls, func_name): + """ + Create a "filename" suitable for a function being generated. + """ + unique_filename = "".format( + func_name, + cls.__module__, + getattr(cls, "__qualname__", cls.__name__), + ) + return unique_filename + + +def _make_hash(cls, attrs, frozen, cache_hash): + attrs = tuple( + a for a in attrs if a.hash is True or (a.hash is None and a.eq is True) + ) + + tab = " " + + unique_filename = _generate_unique_filename(cls, "hash") + type_hash = hash(unique_filename) + # If eq is custom generated, we need to include the functions in globs + globs = {} + + hash_def = "def __hash__(self" + hash_func = "hash((" + closing_braces = "))" + if not cache_hash: + hash_def += "):" + else: + hash_def += ", *" + + hash_def += ( + ", _cache_wrapper=" + + "__import__('attr._make')._make._CacheHashWrapper):" + ) + hash_func = "_cache_wrapper(" + hash_func + closing_braces += ")" + + method_lines = [hash_def] + + def append_hash_computation_lines(prefix, indent): + """ + Generate the code for actually computing the hash code. + Below this will either be returned directly or used to compute + a value which is then cached, depending on the value of cache_hash + """ + + method_lines.extend( + [ + indent + prefix + hash_func, + indent + " %d," % (type_hash,), + ] + ) + + for a in attrs: + if a.eq_key: + cmp_name = "_%s_key" % (a.name,) + globs[cmp_name] = a.eq_key + method_lines.append( + indent + " %s(self.%s)," % (cmp_name, a.name) + ) + else: + method_lines.append(indent + " self.%s," % a.name) + + method_lines.append(indent + " " + closing_braces) + + if cache_hash: + method_lines.append(tab + "if self.%s is None:" % _hash_cache_field) + if frozen: + append_hash_computation_lines( + "object.__setattr__(self, '%s', " % _hash_cache_field, tab * 2 + ) + method_lines.append(tab * 2 + ")") # close __setattr__ + else: + append_hash_computation_lines( + "self.%s = " % _hash_cache_field, tab * 2 + ) + method_lines.append(tab + "return self.%s" % _hash_cache_field) + else: + append_hash_computation_lines("return ", tab) + + script = "\n".join(method_lines) + return _make_method("__hash__", script, unique_filename, globs) + + +def _add_hash(cls, attrs): + """ + Add a hash method to *cls*. + """ + cls.__hash__ = _make_hash(cls, attrs, frozen=False, cache_hash=False) + return cls + + +def _make_ne(): + """ + Create __ne__ method. + """ + + def __ne__(self, other): + """ + Check equality and either forward a NotImplemented or + return the result negated. + """ + result = self.__eq__(other) + if result is NotImplemented: + return NotImplemented + + return not result + + return __ne__ + + +def _make_eq(cls, attrs): + """ + Create __eq__ method for *cls* with *attrs*. + """ + attrs = [a for a in attrs if a.eq] + + unique_filename = _generate_unique_filename(cls, "eq") + lines = [ + "def __eq__(self, other):", + " if other.__class__ is not self.__class__:", + " return NotImplemented", + ] + + # We can't just do a big self.x = other.x and... clause due to + # irregularities like nan == nan is false but (nan,) == (nan,) is true. + globs = {} + if attrs: + lines.append(" return (") + others = [" ) == ("] + for a in attrs: + if a.eq_key: + cmp_name = "_%s_key" % (a.name,) + # Add the key function to the global namespace + # of the evaluated function. + globs[cmp_name] = a.eq_key + lines.append( + " %s(self.%s)," + % ( + cmp_name, + a.name, + ) + ) + others.append( + " %s(other.%s)," + % ( + cmp_name, + a.name, + ) + ) + else: + lines.append(" self.%s," % (a.name,)) + others.append(" other.%s," % (a.name,)) + + lines += others + [" )"] + else: + lines.append(" return True") + + script = "\n".join(lines) + + return _make_method("__eq__", script, unique_filename, globs) + + +def _make_order(cls, attrs): + """ + Create ordering methods for *cls* with *attrs*. + """ + attrs = [a for a in attrs if a.order] + + def attrs_to_tuple(obj): + """ + Save us some typing. + """ + return tuple( + key(value) if key else value + for value, key in ( + (getattr(obj, a.name), a.order_key) for a in attrs + ) + ) + + def __lt__(self, other): + """ + Automatically created by attrs. + """ + if other.__class__ is self.__class__: + return attrs_to_tuple(self) < attrs_to_tuple(other) + + return NotImplemented + + def __le__(self, other): + """ + Automatically created by attrs. + """ + if other.__class__ is self.__class__: + return attrs_to_tuple(self) <= attrs_to_tuple(other) + + return NotImplemented + + def __gt__(self, other): + """ + Automatically created by attrs. + """ + if other.__class__ is self.__class__: + return attrs_to_tuple(self) > attrs_to_tuple(other) + + return NotImplemented + + def __ge__(self, other): + """ + Automatically created by attrs. + """ + if other.__class__ is self.__class__: + return attrs_to_tuple(self) >= attrs_to_tuple(other) + + return NotImplemented + + return __lt__, __le__, __gt__, __ge__ + + +def _add_eq(cls, attrs=None): + """ + Add equality methods to *cls* with *attrs*. + """ + if attrs is None: + attrs = cls.__attrs_attrs__ + + cls.__eq__ = _make_eq(cls, attrs) + cls.__ne__ = _make_ne() + + return cls + + +if HAS_F_STRINGS: + + def _make_repr(attrs, ns, cls): + unique_filename = _generate_unique_filename(cls, "repr") + # Figure out which attributes to include, and which function to use to + # format them. The a.repr value can be either bool or a custom + # callable. + attr_names_with_reprs = tuple( + (a.name, (repr if a.repr is True else a.repr), a.init) + for a in attrs + if a.repr is not False + ) + globs = { + name + "_repr": r + for name, r, _ in attr_names_with_reprs + if r != repr + } + globs["_compat"] = _compat + globs["AttributeError"] = AttributeError + globs["NOTHING"] = NOTHING + attribute_fragments = [] + for name, r, i in attr_names_with_reprs: + accessor = ( + "self." + name + if i + else 'getattr(self, "' + name + '", NOTHING)' + ) + fragment = ( + "%s={%s!r}" % (name, accessor) + if r == repr + else "%s={%s_repr(%s)}" % (name, name, accessor) + ) + attribute_fragments.append(fragment) + repr_fragment = ", ".join(attribute_fragments) + + if ns is None: + cls_name_fragment = ( + '{self.__class__.__qualname__.rsplit(">.", 1)[-1]}' + ) + else: + cls_name_fragment = ns + ".{self.__class__.__name__}" + + lines = [ + "def __repr__(self):", + " try:", + " already_repring = _compat.repr_context.already_repring", + " except AttributeError:", + " already_repring = {id(self),}", + " _compat.repr_context.already_repring = already_repring", + " else:", + " if id(self) in already_repring:", + " return '...'", + " else:", + " already_repring.add(id(self))", + " try:", + " return f'%s(%s)'" % (cls_name_fragment, repr_fragment), + " finally:", + " already_repring.remove(id(self))", + ] + + return _make_method( + "__repr__", "\n".join(lines), unique_filename, globs=globs + ) + +else: + + def _make_repr(attrs, ns, _): + """ + Make a repr method that includes relevant *attrs*, adding *ns* to the + full name. + """ + + # Figure out which attributes to include, and which function to use to + # format them. The a.repr value can be either bool or a custom + # callable. + attr_names_with_reprs = tuple( + (a.name, repr if a.repr is True else a.repr) + for a in attrs + if a.repr is not False + ) + + def __repr__(self): + """ + Automatically created by attrs. + """ + try: + already_repring = _compat.repr_context.already_repring + except AttributeError: + already_repring = set() + _compat.repr_context.already_repring = already_repring + + if id(self) in already_repring: + return "..." + real_cls = self.__class__ + if ns is None: + class_name = real_cls.__qualname__.rsplit(">.", 1)[-1] + else: + class_name = ns + "." + real_cls.__name__ + + # Since 'self' remains on the stack (i.e.: strongly referenced) + # for the duration of this call, it's safe to depend on id(...) + # stability, and not need to track the instance and therefore + # worry about properties like weakref- or hash-ability. + already_repring.add(id(self)) + try: + result = [class_name, "("] + first = True + for name, attr_repr in attr_names_with_reprs: + if first: + first = False + else: + result.append(", ") + result.extend( + (name, "=", attr_repr(getattr(self, name, NOTHING))) + ) + return "".join(result) + ")" + finally: + already_repring.remove(id(self)) + + return __repr__ + + +def _add_repr(cls, ns=None, attrs=None): + """ + Add a repr method to *cls*. + """ + if attrs is None: + attrs = cls.__attrs_attrs__ + + cls.__repr__ = _make_repr(attrs, ns, cls) + return cls + + +def fields(cls): + """ + Return the tuple of ``attrs`` attributes for a class. + + The tuple also allows accessing the fields by their names (see below for + examples). + + :param type cls: Class to introspect. + + :raise TypeError: If *cls* is not a class. + :raise attr.exceptions.NotAnAttrsClassError: If *cls* is not an ``attrs`` + class. + + :rtype: tuple (with name accessors) of `attrs.Attribute` + + .. versionchanged:: 16.2.0 Returned tuple allows accessing the fields + by name. + """ + if not isinstance(cls, type): + raise TypeError("Passed object must be a class.") + attrs = getattr(cls, "__attrs_attrs__", None) + if attrs is None: + raise NotAnAttrsClassError( + "{cls!r} is not an attrs-decorated class.".format(cls=cls) + ) + return attrs + + +def fields_dict(cls): + """ + Return an ordered dictionary of ``attrs`` attributes for a class, whose + keys are the attribute names. + + :param type cls: Class to introspect. + + :raise TypeError: If *cls* is not a class. + :raise attr.exceptions.NotAnAttrsClassError: If *cls* is not an ``attrs`` + class. + + :rtype: an ordered dict where keys are attribute names and values are + `attrs.Attribute`\\ s. This will be a `dict` if it's + naturally ordered like on Python 3.6+ or an + :class:`~collections.OrderedDict` otherwise. + + .. versionadded:: 18.1.0 + """ + if not isinstance(cls, type): + raise TypeError("Passed object must be a class.") + attrs = getattr(cls, "__attrs_attrs__", None) + if attrs is None: + raise NotAnAttrsClassError( + "{cls!r} is not an attrs-decorated class.".format(cls=cls) + ) + return ordered_dict((a.name, a) for a in attrs) + + +def validate(inst): + """ + Validate all attributes on *inst* that have a validator. + + Leaves all exceptions through. + + :param inst: Instance of a class with ``attrs`` attributes. + """ + if _config._run_validators is False: + return + + for a in fields(inst.__class__): + v = a.validator + if v is not None: + v(inst, a, getattr(inst, a.name)) + + +def _is_slot_cls(cls): + return "__slots__" in cls.__dict__ + + +def _is_slot_attr(a_name, base_attr_map): + """ + Check if the attribute name comes from a slot class. + """ + return a_name in base_attr_map and _is_slot_cls(base_attr_map[a_name]) + + +def _make_init( + cls, + attrs, + pre_init, + post_init, + frozen, + slots, + cache_hash, + base_attr_map, + is_exc, + cls_on_setattr, + attrs_init, +): + has_cls_on_setattr = ( + cls_on_setattr is not None and cls_on_setattr is not setters.NO_OP + ) + + if frozen and has_cls_on_setattr: + raise ValueError("Frozen classes can't use on_setattr.") + + needs_cached_setattr = cache_hash or frozen + filtered_attrs = [] + attr_dict = {} + for a in attrs: + if not a.init and a.default is NOTHING: + continue + + filtered_attrs.append(a) + attr_dict[a.name] = a + + if a.on_setattr is not None: + if frozen is True: + raise ValueError("Frozen classes can't use on_setattr.") + + needs_cached_setattr = True + elif has_cls_on_setattr and a.on_setattr is not setters.NO_OP: + needs_cached_setattr = True + + unique_filename = _generate_unique_filename(cls, "init") + + script, globs, annotations = _attrs_to_init_script( + filtered_attrs, + frozen, + slots, + pre_init, + post_init, + cache_hash, + base_attr_map, + is_exc, + has_cls_on_setattr, + attrs_init, + ) + if cls.__module__ in sys.modules: + # This makes typing.get_type_hints(CLS.__init__) resolve string types. + globs.update(sys.modules[cls.__module__].__dict__) + + globs.update({"NOTHING": NOTHING, "attr_dict": attr_dict}) + + if needs_cached_setattr: + # Save the lookup overhead in __init__ if we need to circumvent + # setattr hooks. + globs["_setattr"] = _obj_setattr + + init = _make_method( + "__attrs_init__" if attrs_init else "__init__", + script, + unique_filename, + globs, + ) + init.__annotations__ = annotations + + return init + + +def _setattr(attr_name, value_var, has_on_setattr): + """ + Use the cached object.setattr to set *attr_name* to *value_var*. + """ + return "_setattr(self, '%s', %s)" % (attr_name, value_var) + + +def _setattr_with_converter(attr_name, value_var, has_on_setattr): + """ + Use the cached object.setattr to set *attr_name* to *value_var*, but run + its converter first. + """ + return "_setattr(self, '%s', %s(%s))" % ( + attr_name, + _init_converter_pat % (attr_name,), + value_var, + ) + + +def _assign(attr_name, value, has_on_setattr): + """ + Unless *attr_name* has an on_setattr hook, use normal assignment. Otherwise + relegate to _setattr. + """ + if has_on_setattr: + return _setattr(attr_name, value, True) + + return "self.%s = %s" % (attr_name, value) + + +def _assign_with_converter(attr_name, value_var, has_on_setattr): + """ + Unless *attr_name* has an on_setattr hook, use normal assignment after + conversion. Otherwise relegate to _setattr_with_converter. + """ + if has_on_setattr: + return _setattr_with_converter(attr_name, value_var, True) + + return "self.%s = %s(%s)" % ( + attr_name, + _init_converter_pat % (attr_name,), + value_var, + ) + + +def _attrs_to_init_script( + attrs, + frozen, + slots, + pre_init, + post_init, + cache_hash, + base_attr_map, + is_exc, + has_cls_on_setattr, + attrs_init, +): + """ + Return a script of an initializer for *attrs* and a dict of globals. + + The globals are expected by the generated script. + + If *frozen* is True, we cannot set the attributes directly so we use + a cached ``object.__setattr__``. + """ + lines = [] + if pre_init: + lines.append("self.__attrs_pre_init__()") + + if frozen is True: + if slots is True: + fmt_setter = _setattr + fmt_setter_with_converter = _setattr_with_converter + else: + # Dict frozen classes assign directly to __dict__. + # But only if the attribute doesn't come from an ancestor slot + # class. + # Note _inst_dict will be used again below if cache_hash is True + lines.append("_inst_dict = self.__dict__") + + def fmt_setter(attr_name, value_var, has_on_setattr): + if _is_slot_attr(attr_name, base_attr_map): + return _setattr(attr_name, value_var, has_on_setattr) + + return "_inst_dict['%s'] = %s" % (attr_name, value_var) + + def fmt_setter_with_converter( + attr_name, value_var, has_on_setattr + ): + if has_on_setattr or _is_slot_attr(attr_name, base_attr_map): + return _setattr_with_converter( + attr_name, value_var, has_on_setattr + ) + + return "_inst_dict['%s'] = %s(%s)" % ( + attr_name, + _init_converter_pat % (attr_name,), + value_var, + ) + + else: + # Not frozen. + fmt_setter = _assign + fmt_setter_with_converter = _assign_with_converter + + args = [] + kw_only_args = [] + attrs_to_validate = [] + + # This is a dictionary of names to validator and converter callables. + # Injecting this into __init__ globals lets us avoid lookups. + names_for_globals = {} + annotations = {"return": None} + + for a in attrs: + if a.validator: + attrs_to_validate.append(a) + + attr_name = a.name + has_on_setattr = a.on_setattr is not None or ( + a.on_setattr is not setters.NO_OP and has_cls_on_setattr + ) + arg_name = a.name.lstrip("_") + + has_factory = isinstance(a.default, Factory) + if has_factory and a.default.takes_self: + maybe_self = "self" + else: + maybe_self = "" + + if a.init is False: + if has_factory: + init_factory_name = _init_factory_pat.format(a.name) + if a.converter is not None: + lines.append( + fmt_setter_with_converter( + attr_name, + init_factory_name + "(%s)" % (maybe_self,), + has_on_setattr, + ) + ) + conv_name = _init_converter_pat % (a.name,) + names_for_globals[conv_name] = a.converter + else: + lines.append( + fmt_setter( + attr_name, + init_factory_name + "(%s)" % (maybe_self,), + has_on_setattr, + ) + ) + names_for_globals[init_factory_name] = a.default.factory + else: + if a.converter is not None: + lines.append( + fmt_setter_with_converter( + attr_name, + "attr_dict['%s'].default" % (attr_name,), + has_on_setattr, + ) + ) + conv_name = _init_converter_pat % (a.name,) + names_for_globals[conv_name] = a.converter + else: + lines.append( + fmt_setter( + attr_name, + "attr_dict['%s'].default" % (attr_name,), + has_on_setattr, + ) + ) + elif a.default is not NOTHING and not has_factory: + arg = "%s=attr_dict['%s'].default" % (arg_name, attr_name) + if a.kw_only: + kw_only_args.append(arg) + else: + args.append(arg) + + if a.converter is not None: + lines.append( + fmt_setter_with_converter( + attr_name, arg_name, has_on_setattr + ) + ) + names_for_globals[ + _init_converter_pat % (a.name,) + ] = a.converter + else: + lines.append(fmt_setter(attr_name, arg_name, has_on_setattr)) + + elif has_factory: + arg = "%s=NOTHING" % (arg_name,) + if a.kw_only: + kw_only_args.append(arg) + else: + args.append(arg) + lines.append("if %s is not NOTHING:" % (arg_name,)) + + init_factory_name = _init_factory_pat.format(a.name) + if a.converter is not None: + lines.append( + " " + + fmt_setter_with_converter( + attr_name, arg_name, has_on_setattr + ) + ) + lines.append("else:") + lines.append( + " " + + fmt_setter_with_converter( + attr_name, + init_factory_name + "(" + maybe_self + ")", + has_on_setattr, + ) + ) + names_for_globals[ + _init_converter_pat % (a.name,) + ] = a.converter + else: + lines.append( + " " + fmt_setter(attr_name, arg_name, has_on_setattr) + ) + lines.append("else:") + lines.append( + " " + + fmt_setter( + attr_name, + init_factory_name + "(" + maybe_self + ")", + has_on_setattr, + ) + ) + names_for_globals[init_factory_name] = a.default.factory + else: + if a.kw_only: + kw_only_args.append(arg_name) + else: + args.append(arg_name) + + if a.converter is not None: + lines.append( + fmt_setter_with_converter( + attr_name, arg_name, has_on_setattr + ) + ) + names_for_globals[ + _init_converter_pat % (a.name,) + ] = a.converter + else: + lines.append(fmt_setter(attr_name, arg_name, has_on_setattr)) + + if a.init is True: + if a.type is not None and a.converter is None: + annotations[arg_name] = a.type + elif a.converter is not None: + # Try to get the type from the converter. + t = _AnnotationExtractor(a.converter).get_first_param_type() + if t: + annotations[arg_name] = t + + if attrs_to_validate: # we can skip this if there are no validators. + names_for_globals["_config"] = _config + lines.append("if _config._run_validators is True:") + for a in attrs_to_validate: + val_name = "__attr_validator_" + a.name + attr_name = "__attr_" + a.name + lines.append( + " %s(self, %s, self.%s)" % (val_name, attr_name, a.name) + ) + names_for_globals[val_name] = a.validator + names_for_globals[attr_name] = a + + if post_init: + lines.append("self.__attrs_post_init__()") + + # because this is set only after __attrs_post_init__ is called, a crash + # will result if post-init tries to access the hash code. This seemed + # preferable to setting this beforehand, in which case alteration to + # field values during post-init combined with post-init accessing the + # hash code would result in silent bugs. + if cache_hash: + if frozen: + if slots: + # if frozen and slots, then _setattr defined above + init_hash_cache = "_setattr(self, '%s', %s)" + else: + # if frozen and not slots, then _inst_dict defined above + init_hash_cache = "_inst_dict['%s'] = %s" + else: + init_hash_cache = "self.%s = %s" + lines.append(init_hash_cache % (_hash_cache_field, "None")) + + # For exceptions we rely on BaseException.__init__ for proper + # initialization. + if is_exc: + vals = ",".join("self." + a.name for a in attrs if a.init) + + lines.append("BaseException.__init__(self, %s)" % (vals,)) + + args = ", ".join(args) + if kw_only_args: + args += "%s*, %s" % ( + ", " if args else "", # leading comma + ", ".join(kw_only_args), # kw_only args + ) + return ( + """\ +def {init_name}(self, {args}): + {lines} +""".format( + init_name=("__attrs_init__" if attrs_init else "__init__"), + args=args, + lines="\n ".join(lines) if lines else "pass", + ), + names_for_globals, + annotations, + ) + + +class Attribute: + """ + *Read-only* representation of an attribute. + + The class has *all* arguments of `attr.ib` (except for ``factory`` + which is only syntactic sugar for ``default=Factory(...)`` plus the + following: + + - ``name`` (`str`): The name of the attribute. + - ``inherited`` (`bool`): Whether or not that attribute has been inherited + from a base class. + - ``eq_key`` and ``order_key`` (`typing.Callable` or `None`): The callables + that are used for comparing and ordering objects by this attribute, + respectively. These are set by passing a callable to `attr.ib`'s ``eq``, + ``order``, or ``cmp`` arguments. See also :ref:`comparison customization + `. + + Instances of this class are frequently used for introspection purposes + like: + + - `fields` returns a tuple of them. + - Validators get them passed as the first argument. + - The :ref:`field transformer ` hook receives a list of + them. + + .. versionadded:: 20.1.0 *inherited* + .. versionadded:: 20.1.0 *on_setattr* + .. versionchanged:: 20.2.0 *inherited* is not taken into account for + equality checks and hashing anymore. + .. versionadded:: 21.1.0 *eq_key* and *order_key* + + For the full version history of the fields, see `attr.ib`. + """ + + __slots__ = ( + "name", + "default", + "validator", + "repr", + "eq", + "eq_key", + "order", + "order_key", + "hash", + "init", + "metadata", + "type", + "converter", + "kw_only", + "inherited", + "on_setattr", + ) + + def __init__( + self, + name, + default, + validator, + repr, + cmp, # XXX: unused, remove along with other cmp code. + hash, + init, + inherited, + metadata=None, + type=None, + converter=None, + kw_only=False, + eq=None, + eq_key=None, + order=None, + order_key=None, + on_setattr=None, + ): + eq, eq_key, order, order_key = _determine_attrib_eq_order( + cmp, eq_key or eq, order_key or order, True + ) + + # Cache this descriptor here to speed things up later. + bound_setattr = _obj_setattr.__get__(self, Attribute) + + # Despite the big red warning, people *do* instantiate `Attribute` + # themselves. + bound_setattr("name", name) + bound_setattr("default", default) + bound_setattr("validator", validator) + bound_setattr("repr", repr) + bound_setattr("eq", eq) + bound_setattr("eq_key", eq_key) + bound_setattr("order", order) + bound_setattr("order_key", order_key) + bound_setattr("hash", hash) + bound_setattr("init", init) + bound_setattr("converter", converter) + bound_setattr( + "metadata", + ( + types.MappingProxyType(dict(metadata)) # Shallow copy + if metadata + else _empty_metadata_singleton + ), + ) + bound_setattr("type", type) + bound_setattr("kw_only", kw_only) + bound_setattr("inherited", inherited) + bound_setattr("on_setattr", on_setattr) + + def __setattr__(self, name, value): + raise FrozenInstanceError() + + @classmethod + def from_counting_attr(cls, name, ca, type=None): + # type holds the annotated value. deal with conflicts: + if type is None: + type = ca.type + elif ca.type is not None: + raise ValueError( + "Type annotation and type argument cannot both be present" + ) + inst_dict = { + k: getattr(ca, k) + for k in Attribute.__slots__ + if k + not in ( + "name", + "validator", + "default", + "type", + "inherited", + ) # exclude methods and deprecated alias + } + return cls( + name=name, + validator=ca._validator, + default=ca._default, + type=type, + cmp=None, + inherited=False, + **inst_dict + ) + + # Don't use attr.evolve since fields(Attribute) doesn't work + def evolve(self, **changes): + """ + Copy *self* and apply *changes*. + + This works similarly to `attr.evolve` but that function does not work + with ``Attribute``. + + It is mainly meant to be used for `transform-fields`. + + .. versionadded:: 20.3.0 + """ + new = copy.copy(self) + + new._setattrs(changes.items()) + + return new + + # Don't use _add_pickle since fields(Attribute) doesn't work + def __getstate__(self): + """ + Play nice with pickle. + """ + return tuple( + getattr(self, name) if name != "metadata" else dict(self.metadata) + for name in self.__slots__ + ) + + def __setstate__(self, state): + """ + Play nice with pickle. + """ + self._setattrs(zip(self.__slots__, state)) + + def _setattrs(self, name_values_pairs): + bound_setattr = _obj_setattr.__get__(self, Attribute) + for name, value in name_values_pairs: + if name != "metadata": + bound_setattr(name, value) + else: + bound_setattr( + name, + types.MappingProxyType(dict(value)) + if value + else _empty_metadata_singleton, + ) + + +_a = [ + Attribute( + name=name, + default=NOTHING, + validator=None, + repr=True, + cmp=None, + eq=True, + order=False, + hash=(name != "metadata"), + init=True, + inherited=False, + ) + for name in Attribute.__slots__ +] + +Attribute = _add_hash( + _add_eq( + _add_repr(Attribute, attrs=_a), + attrs=[a for a in _a if a.name != "inherited"], + ), + attrs=[a for a in _a if a.hash and a.name != "inherited"], +) + + +class _CountingAttr: + """ + Intermediate representation of attributes that uses a counter to preserve + the order in which the attributes have been defined. + + *Internal* data structure of the attrs library. Running into is most + likely the result of a bug like a forgotten `@attr.s` decorator. + """ + + __slots__ = ( + "counter", + "_default", + "repr", + "eq", + "eq_key", + "order", + "order_key", + "hash", + "init", + "metadata", + "_validator", + "converter", + "type", + "kw_only", + "on_setattr", + ) + __attrs_attrs__ = tuple( + Attribute( + name=name, + default=NOTHING, + validator=None, + repr=True, + cmp=None, + hash=True, + init=True, + kw_only=False, + eq=True, + eq_key=None, + order=False, + order_key=None, + inherited=False, + on_setattr=None, + ) + for name in ( + "counter", + "_default", + "repr", + "eq", + "order", + "hash", + "init", + "on_setattr", + ) + ) + ( + Attribute( + name="metadata", + default=None, + validator=None, + repr=True, + cmp=None, + hash=False, + init=True, + kw_only=False, + eq=True, + eq_key=None, + order=False, + order_key=None, + inherited=False, + on_setattr=None, + ), + ) + cls_counter = 0 + + def __init__( + self, + default, + validator, + repr, + cmp, + hash, + init, + converter, + metadata, + type, + kw_only, + eq, + eq_key, + order, + order_key, + on_setattr, + ): + _CountingAttr.cls_counter += 1 + self.counter = _CountingAttr.cls_counter + self._default = default + self._validator = validator + self.converter = converter + self.repr = repr + self.eq = eq + self.eq_key = eq_key + self.order = order + self.order_key = order_key + self.hash = hash + self.init = init + self.metadata = metadata + self.type = type + self.kw_only = kw_only + self.on_setattr = on_setattr + + def validator(self, meth): + """ + Decorator that adds *meth* to the list of validators. + + Returns *meth* unchanged. + + .. versionadded:: 17.1.0 + """ + if self._validator is None: + self._validator = meth + else: + self._validator = and_(self._validator, meth) + return meth + + def default(self, meth): + """ + Decorator that allows to set the default for an attribute. + + Returns *meth* unchanged. + + :raises DefaultAlreadySetError: If default has been set before. + + .. versionadded:: 17.1.0 + """ + if self._default is not NOTHING: + raise DefaultAlreadySetError() + + self._default = Factory(meth, takes_self=True) + + return meth + + +_CountingAttr = _add_eq(_add_repr(_CountingAttr)) + + +class Factory: + """ + Stores a factory callable. + + If passed as the default value to `attrs.field`, the factory is used to + generate a new value. + + :param callable factory: A callable that takes either none or exactly one + mandatory positional argument depending on *takes_self*. + :param bool takes_self: Pass the partially initialized instance that is + being initialized as a positional argument. + + .. versionadded:: 17.1.0 *takes_self* + """ + + __slots__ = ("factory", "takes_self") + + def __init__(self, factory, takes_self=False): + """ + `Factory` is part of the default machinery so if we want a default + value here, we have to implement it ourselves. + """ + self.factory = factory + self.takes_self = takes_self + + def __getstate__(self): + """ + Play nice with pickle. + """ + return tuple(getattr(self, name) for name in self.__slots__) + + def __setstate__(self, state): + """ + Play nice with pickle. + """ + for name, value in zip(self.__slots__, state): + setattr(self, name, value) + + +_f = [ + Attribute( + name=name, + default=NOTHING, + validator=None, + repr=True, + cmp=None, + eq=True, + order=False, + hash=True, + init=True, + inherited=False, + ) + for name in Factory.__slots__ +] + +Factory = _add_hash(_add_eq(_add_repr(Factory, attrs=_f), attrs=_f), attrs=_f) + + +def make_class(name, attrs, bases=(object,), **attributes_arguments): + """ + A quick way to create a new class called *name* with *attrs*. + + :param str name: The name for the new class. + + :param attrs: A list of names or a dictionary of mappings of names to + attributes. + + If *attrs* is a list or an ordered dict (`dict` on Python 3.6+, + `collections.OrderedDict` otherwise), the order is deduced from + the order of the names or attributes inside *attrs*. Otherwise the + order of the definition of the attributes is used. + :type attrs: `list` or `dict` + + :param tuple bases: Classes that the new class will subclass. + + :param attributes_arguments: Passed unmodified to `attr.s`. + + :return: A new class with *attrs*. + :rtype: type + + .. versionadded:: 17.1.0 *bases* + .. versionchanged:: 18.1.0 If *attrs* is ordered, the order is retained. + """ + if isinstance(attrs, dict): + cls_dict = attrs + elif isinstance(attrs, (list, tuple)): + cls_dict = {a: attrib() for a in attrs} + else: + raise TypeError("attrs argument must be a dict or a list.") + + pre_init = cls_dict.pop("__attrs_pre_init__", None) + post_init = cls_dict.pop("__attrs_post_init__", None) + user_init = cls_dict.pop("__init__", None) + + body = {} + if pre_init is not None: + body["__attrs_pre_init__"] = pre_init + if post_init is not None: + body["__attrs_post_init__"] = post_init + if user_init is not None: + body["__init__"] = user_init + + type_ = types.new_class(name, bases, {}, lambda ns: ns.update(body)) + + # For pickling to work, the __module__ variable needs to be set to the + # frame where the class is created. Bypass this step in environments where + # sys._getframe is not defined (Jython for example) or sys._getframe is not + # defined for arguments greater than 0 (IronPython). + try: + type_.__module__ = sys._getframe(1).f_globals.get( + "__name__", "__main__" + ) + except (AttributeError, ValueError): + pass + + # We do it here for proper warnings with meaningful stacklevel. + cmp = attributes_arguments.pop("cmp", None) + ( + attributes_arguments["eq"], + attributes_arguments["order"], + ) = _determine_attrs_eq_order( + cmp, + attributes_arguments.get("eq"), + attributes_arguments.get("order"), + True, + ) + + return _attrs(these=cls_dict, **attributes_arguments)(type_) + + +# These are required by within this module so we define them here and merely +# import into .validators / .converters. + + +@attrs(slots=True, hash=True) +class _AndValidator: + """ + Compose many validators to a single one. + """ + + _validators = attrib() + + def __call__(self, inst, attr, value): + for v in self._validators: + v(inst, attr, value) + + +def and_(*validators): + """ + A validator that composes multiple validators into one. + + When called on a value, it runs all wrapped validators. + + :param callables validators: Arbitrary number of validators. + + .. versionadded:: 17.1.0 + """ + vals = [] + for validator in validators: + vals.extend( + validator._validators + if isinstance(validator, _AndValidator) + else [validator] + ) + + return _AndValidator(tuple(vals)) + + +def pipe(*converters): + """ + A converter that composes multiple converters into one. + + When called on a value, it runs all wrapped converters, returning the + *last* value. + + Type annotations will be inferred from the wrapped converters', if + they have any. + + :param callables converters: Arbitrary number of converters. + + .. versionadded:: 20.1.0 + """ + + def pipe_converter(val): + for converter in converters: + val = converter(val) + + return val + + if not converters: + # If the converter list is empty, pipe_converter is the identity. + A = typing.TypeVar("A") + pipe_converter.__annotations__ = {"val": A, "return": A} + else: + # Get parameter type from first converter. + t = _AnnotationExtractor(converters[0]).get_first_param_type() + if t: + pipe_converter.__annotations__["val"] = t + + # Get return type from last converter. + rt = _AnnotationExtractor(converters[-1]).get_return_type() + if rt: + pipe_converter.__annotations__["return"] = rt + + return pipe_converter diff --git a/sbsheriff/Lib/site-packages/attr/_next_gen.py b/sbsheriff/Lib/site-packages/attr/_next_gen.py new file mode 100644 index 0000000..5a06a74 --- /dev/null +++ b/sbsheriff/Lib/site-packages/attr/_next_gen.py @@ -0,0 +1,220 @@ +# SPDX-License-Identifier: MIT + +""" +These are Python 3.6+-only and keyword-only APIs that call `attr.s` and +`attr.ib` with different default values. +""" + + +from functools import partial + +from . import setters +from ._funcs import asdict as _asdict +from ._funcs import astuple as _astuple +from ._make import ( + NOTHING, + _frozen_setattrs, + _ng_default_on_setattr, + attrib, + attrs, +) +from .exceptions import UnannotatedAttributeError + + +def define( + maybe_cls=None, + *, + these=None, + repr=None, + hash=None, + init=None, + slots=True, + frozen=False, + weakref_slot=True, + str=False, + auto_attribs=None, + kw_only=False, + cache_hash=False, + auto_exc=True, + eq=None, + order=False, + auto_detect=True, + getstate_setstate=None, + on_setattr=None, + field_transformer=None, + match_args=True, +): + r""" + Define an ``attrs`` class. + + Differences to the classic `attr.s` that it uses underneath: + + - Automatically detect whether or not *auto_attribs* should be `True` (c.f. + *auto_attribs* parameter). + - If *frozen* is `False`, run converters and validators when setting an + attribute by default. + - *slots=True* + + .. caution:: + + Usually this has only upsides and few visible effects in everyday + programming. But it *can* lead to some suprising behaviors, so please + make sure to read :term:`slotted classes`. + - *auto_exc=True* + - *auto_detect=True* + - *order=False* + - Some options that were only relevant on Python 2 or were kept around for + backwards-compatibility have been removed. + + Please note that these are all defaults and you can change them as you + wish. + + :param Optional[bool] auto_attribs: If set to `True` or `False`, it behaves + exactly like `attr.s`. If left `None`, `attr.s` will try to guess: + + 1. If any attributes are annotated and no unannotated `attrs.fields`\ s + are found, it assumes *auto_attribs=True*. + 2. Otherwise it assumes *auto_attribs=False* and tries to collect + `attrs.fields`\ s. + + For now, please refer to `attr.s` for the rest of the parameters. + + .. versionadded:: 20.1.0 + .. versionchanged:: 21.3.0 Converters are also run ``on_setattr``. + """ + + def do_it(cls, auto_attribs): + return attrs( + maybe_cls=cls, + these=these, + repr=repr, + hash=hash, + init=init, + slots=slots, + frozen=frozen, + weakref_slot=weakref_slot, + str=str, + auto_attribs=auto_attribs, + kw_only=kw_only, + cache_hash=cache_hash, + auto_exc=auto_exc, + eq=eq, + order=order, + auto_detect=auto_detect, + collect_by_mro=True, + getstate_setstate=getstate_setstate, + on_setattr=on_setattr, + field_transformer=field_transformer, + match_args=match_args, + ) + + def wrap(cls): + """ + Making this a wrapper ensures this code runs during class creation. + + We also ensure that frozen-ness of classes is inherited. + """ + nonlocal frozen, on_setattr + + had_on_setattr = on_setattr not in (None, setters.NO_OP) + + # By default, mutable classes convert & validate on setattr. + if frozen is False and on_setattr is None: + on_setattr = _ng_default_on_setattr + + # However, if we subclass a frozen class, we inherit the immutability + # and disable on_setattr. + for base_cls in cls.__bases__: + if base_cls.__setattr__ is _frozen_setattrs: + if had_on_setattr: + raise ValueError( + "Frozen classes can't use on_setattr " + "(frozen-ness was inherited)." + ) + + on_setattr = setters.NO_OP + break + + if auto_attribs is not None: + return do_it(cls, auto_attribs) + + try: + return do_it(cls, True) + except UnannotatedAttributeError: + return do_it(cls, False) + + # maybe_cls's type depends on the usage of the decorator. It's a class + # if it's used as `@attrs` but ``None`` if used as `@attrs()`. + if maybe_cls is None: + return wrap + else: + return wrap(maybe_cls) + + +mutable = define +frozen = partial(define, frozen=True, on_setattr=None) + + +def field( + *, + default=NOTHING, + validator=None, + repr=True, + hash=None, + init=True, + metadata=None, + converter=None, + factory=None, + kw_only=False, + eq=None, + order=None, + on_setattr=None, +): + """ + Identical to `attr.ib`, except keyword-only and with some arguments + removed. + + .. versionadded:: 20.1.0 + """ + return attrib( + default=default, + validator=validator, + repr=repr, + hash=hash, + init=init, + metadata=metadata, + converter=converter, + factory=factory, + kw_only=kw_only, + eq=eq, + order=order, + on_setattr=on_setattr, + ) + + +def asdict(inst, *, recurse=True, filter=None, value_serializer=None): + """ + Same as `attr.asdict`, except that collections types are always retained + and dict is always used as *dict_factory*. + + .. versionadded:: 21.3.0 + """ + return _asdict( + inst=inst, + recurse=recurse, + filter=filter, + value_serializer=value_serializer, + retain_collection_types=True, + ) + + +def astuple(inst, *, recurse=True, filter=None): + """ + Same as `attr.astuple`, except that collections types are always retained + and `tuple` is always used as the *tuple_factory*. + + .. versionadded:: 21.3.0 + """ + return _astuple( + inst=inst, recurse=recurse, filter=filter, retain_collection_types=True + ) diff --git a/sbsheriff/Lib/site-packages/attr/_version_info.py b/sbsheriff/Lib/site-packages/attr/_version_info.py new file mode 100644 index 0000000..51a1312 --- /dev/null +++ b/sbsheriff/Lib/site-packages/attr/_version_info.py @@ -0,0 +1,86 @@ +# SPDX-License-Identifier: MIT + + +from functools import total_ordering + +from ._funcs import astuple +from ._make import attrib, attrs + + +@total_ordering +@attrs(eq=False, order=False, slots=True, frozen=True) +class VersionInfo: + """ + A version object that can be compared to tuple of length 1--4: + + >>> attr.VersionInfo(19, 1, 0, "final") <= (19, 2) + True + >>> attr.VersionInfo(19, 1, 0, "final") < (19, 1, 1) + True + >>> vi = attr.VersionInfo(19, 2, 0, "final") + >>> vi < (19, 1, 1) + False + >>> vi < (19,) + False + >>> vi == (19, 2,) + True + >>> vi == (19, 2, 1) + False + + .. versionadded:: 19.2 + """ + + year = attrib(type=int) + minor = attrib(type=int) + micro = attrib(type=int) + releaselevel = attrib(type=str) + + @classmethod + def _from_version_string(cls, s): + """ + Parse *s* and return a _VersionInfo. + """ + v = s.split(".") + if len(v) == 3: + v.append("final") + + return cls( + year=int(v[0]), minor=int(v[1]), micro=int(v[2]), releaselevel=v[3] + ) + + def _ensure_tuple(self, other): + """ + Ensure *other* is a tuple of a valid length. + + Returns a possibly transformed *other* and ourselves as a tuple of + the same length as *other*. + """ + + if self.__class__ is other.__class__: + other = astuple(other) + + if not isinstance(other, tuple): + raise NotImplementedError + + if not (1 <= len(other) <= 4): + raise NotImplementedError + + return astuple(self)[: len(other)], other + + def __eq__(self, other): + try: + us, them = self._ensure_tuple(other) + except NotImplementedError: + return NotImplemented + + return us == them + + def __lt__(self, other): + try: + us, them = self._ensure_tuple(other) + except NotImplementedError: + return NotImplemented + + # Since alphabetically "dev0" < "final" < "post1" < "post2", we don't + # have to do anything special with releaselevel for now. + return us < them diff --git a/sbsheriff/Lib/site-packages/attr/_version_info.pyi b/sbsheriff/Lib/site-packages/attr/_version_info.pyi new file mode 100644 index 0000000..45ced08 --- /dev/null +++ b/sbsheriff/Lib/site-packages/attr/_version_info.pyi @@ -0,0 +1,9 @@ +class VersionInfo: + @property + def year(self) -> int: ... + @property + def minor(self) -> int: ... + @property + def micro(self) -> int: ... + @property + def releaselevel(self) -> str: ... diff --git a/sbsheriff/Lib/site-packages/attr/converters.py b/sbsheriff/Lib/site-packages/attr/converters.py new file mode 100644 index 0000000..a73626c --- /dev/null +++ b/sbsheriff/Lib/site-packages/attr/converters.py @@ -0,0 +1,144 @@ +# SPDX-License-Identifier: MIT + +""" +Commonly useful converters. +""" + + +import typing + +from ._compat import _AnnotationExtractor +from ._make import NOTHING, Factory, pipe + + +__all__ = [ + "default_if_none", + "optional", + "pipe", + "to_bool", +] + + +def optional(converter): + """ + A converter that allows an attribute to be optional. An optional attribute + is one which can be set to ``None``. + + Type annotations will be inferred from the wrapped converter's, if it + has any. + + :param callable converter: the converter that is used for non-``None`` + values. + + .. versionadded:: 17.1.0 + """ + + def optional_converter(val): + if val is None: + return None + return converter(val) + + xtr = _AnnotationExtractor(converter) + + t = xtr.get_first_param_type() + if t: + optional_converter.__annotations__["val"] = typing.Optional[t] + + rt = xtr.get_return_type() + if rt: + optional_converter.__annotations__["return"] = typing.Optional[rt] + + return optional_converter + + +def default_if_none(default=NOTHING, factory=None): + """ + A converter that allows to replace ``None`` values by *default* or the + result of *factory*. + + :param default: Value to be used if ``None`` is passed. Passing an instance + of `attrs.Factory` is supported, however the ``takes_self`` option + is *not*. + :param callable factory: A callable that takes no parameters whose result + is used if ``None`` is passed. + + :raises TypeError: If **neither** *default* or *factory* is passed. + :raises TypeError: If **both** *default* and *factory* are passed. + :raises ValueError: If an instance of `attrs.Factory` is passed with + ``takes_self=True``. + + .. versionadded:: 18.2.0 + """ + if default is NOTHING and factory is None: + raise TypeError("Must pass either `default` or `factory`.") + + if default is not NOTHING and factory is not None: + raise TypeError( + "Must pass either `default` or `factory` but not both." + ) + + if factory is not None: + default = Factory(factory) + + if isinstance(default, Factory): + if default.takes_self: + raise ValueError( + "`takes_self` is not supported by default_if_none." + ) + + def default_if_none_converter(val): + if val is not None: + return val + + return default.factory() + + else: + + def default_if_none_converter(val): + if val is not None: + return val + + return default + + return default_if_none_converter + + +def to_bool(val): + """ + Convert "boolean" strings (e.g., from env. vars.) to real booleans. + + Values mapping to :code:`True`: + + - :code:`True` + - :code:`"true"` / :code:`"t"` + - :code:`"yes"` / :code:`"y"` + - :code:`"on"` + - :code:`"1"` + - :code:`1` + + Values mapping to :code:`False`: + + - :code:`False` + - :code:`"false"` / :code:`"f"` + - :code:`"no"` / :code:`"n"` + - :code:`"off"` + - :code:`"0"` + - :code:`0` + + :raises ValueError: for any other value. + + .. versionadded:: 21.3.0 + """ + if isinstance(val, str): + val = val.lower() + truthy = {True, "true", "t", "yes", "y", "on", "1", 1} + falsy = {False, "false", "f", "no", "n", "off", "0", 0} + try: + if val in truthy: + return True + if val in falsy: + return False + except TypeError: + # Raised when "val" is not hashable (e.g., lists) + pass + raise ValueError("Cannot convert value to bool: {}".format(val)) diff --git a/sbsheriff/Lib/site-packages/attr/converters.pyi b/sbsheriff/Lib/site-packages/attr/converters.pyi new file mode 100644 index 0000000..0f58088 --- /dev/null +++ b/sbsheriff/Lib/site-packages/attr/converters.pyi @@ -0,0 +1,13 @@ +from typing import Callable, Optional, TypeVar, overload + +from . import _ConverterType + +_T = TypeVar("_T") + +def pipe(*validators: _ConverterType) -> _ConverterType: ... +def optional(converter: _ConverterType) -> _ConverterType: ... +@overload +def default_if_none(default: _T) -> _ConverterType: ... +@overload +def default_if_none(*, factory: Callable[[], _T]) -> _ConverterType: ... +def to_bool(val: str) -> bool: ... diff --git a/sbsheriff/Lib/site-packages/attr/exceptions.py b/sbsheriff/Lib/site-packages/attr/exceptions.py new file mode 100644 index 0000000..5dc51e0 --- /dev/null +++ b/sbsheriff/Lib/site-packages/attr/exceptions.py @@ -0,0 +1,92 @@ +# SPDX-License-Identifier: MIT + + +class FrozenError(AttributeError): + """ + A frozen/immutable instance or attribute have been attempted to be + modified. + + It mirrors the behavior of ``namedtuples`` by using the same error message + and subclassing `AttributeError`. + + .. versionadded:: 20.1.0 + """ + + msg = "can't set attribute" + args = [msg] + + +class FrozenInstanceError(FrozenError): + """ + A frozen instance has been attempted to be modified. + + .. versionadded:: 16.1.0 + """ + + +class FrozenAttributeError(FrozenError): + """ + A frozen attribute has been attempted to be modified. + + .. versionadded:: 20.1.0 + """ + + +class AttrsAttributeNotFoundError(ValueError): + """ + An ``attrs`` function couldn't find an attribute that the user asked for. + + .. versionadded:: 16.2.0 + """ + + +class NotAnAttrsClassError(ValueError): + """ + A non-``attrs`` class has been passed into an ``attrs`` function. + + .. versionadded:: 16.2.0 + """ + + +class DefaultAlreadySetError(RuntimeError): + """ + A default has been set using ``attr.ib()`` and is attempted to be reset + using the decorator. + + .. versionadded:: 17.1.0 + """ + + +class UnannotatedAttributeError(RuntimeError): + """ + A class with ``auto_attribs=True`` has an ``attr.ib()`` without a type + annotation. + + .. versionadded:: 17.3.0 + """ + + +class PythonTooOldError(RuntimeError): + """ + It was attempted to use an ``attrs`` feature that requires a newer Python + version. + + .. versionadded:: 18.2.0 + """ + + +class NotCallableError(TypeError): + """ + A ``attr.ib()`` requiring a callable has been set with a value + that is not callable. + + .. versionadded:: 19.2.0 + """ + + def __init__(self, msg, value): + super(TypeError, self).__init__(msg, value) + self.msg = msg + self.value = value + + def __str__(self): + return str(self.msg) diff --git a/sbsheriff/Lib/site-packages/attr/exceptions.pyi b/sbsheriff/Lib/site-packages/attr/exceptions.pyi new file mode 100644 index 0000000..f268011 --- /dev/null +++ b/sbsheriff/Lib/site-packages/attr/exceptions.pyi @@ -0,0 +1,17 @@ +from typing import Any + +class FrozenError(AttributeError): + msg: str = ... + +class FrozenInstanceError(FrozenError): ... +class FrozenAttributeError(FrozenError): ... +class AttrsAttributeNotFoundError(ValueError): ... +class NotAnAttrsClassError(ValueError): ... +class DefaultAlreadySetError(RuntimeError): ... +class UnannotatedAttributeError(RuntimeError): ... +class PythonTooOldError(RuntimeError): ... + +class NotCallableError(TypeError): + msg: str = ... + value: Any = ... + def __init__(self, msg: str, value: Any) -> None: ... diff --git a/sbsheriff/Lib/site-packages/attr/filters.py b/sbsheriff/Lib/site-packages/attr/filters.py new file mode 100644 index 0000000..baa25e9 --- /dev/null +++ b/sbsheriff/Lib/site-packages/attr/filters.py @@ -0,0 +1,51 @@ +# SPDX-License-Identifier: MIT + +""" +Commonly useful filters for `attr.asdict`. +""" + +from ._make import Attribute + + +def _split_what(what): + """ + Returns a tuple of `frozenset`s of classes and attributes. + """ + return ( + frozenset(cls for cls in what if isinstance(cls, type)), + frozenset(cls for cls in what if isinstance(cls, Attribute)), + ) + + +def include(*what): + """ + Include *what*. + + :param what: What to include. + :type what: `list` of `type` or `attrs.Attribute`\\ s + + :rtype: `callable` + """ + cls, attrs = _split_what(what) + + def include_(attribute, value): + return value.__class__ in cls or attribute in attrs + + return include_ + + +def exclude(*what): + """ + Exclude *what*. + + :param what: What to exclude. + :type what: `list` of classes or `attrs.Attribute`\\ s. + + :rtype: `callable` + """ + cls, attrs = _split_what(what) + + def exclude_(attribute, value): + return value.__class__ not in cls and attribute not in attrs + + return exclude_ diff --git a/sbsheriff/Lib/site-packages/attr/filters.pyi b/sbsheriff/Lib/site-packages/attr/filters.pyi new file mode 100644 index 0000000..9938668 --- /dev/null +++ b/sbsheriff/Lib/site-packages/attr/filters.pyi @@ -0,0 +1,6 @@ +from typing import Any, Union + +from . import Attribute, _FilterType + +def include(*what: Union[type, Attribute[Any]]) -> _FilterType[Any]: ... +def exclude(*what: Union[type, Attribute[Any]]) -> _FilterType[Any]: ... diff --git a/sbsheriff/Lib/site-packages/attr/py.typed b/sbsheriff/Lib/site-packages/attr/py.typed new file mode 100644 index 0000000..e69de29 diff --git a/sbsheriff/Lib/site-packages/attr/setters.py b/sbsheriff/Lib/site-packages/attr/setters.py new file mode 100644 index 0000000..12ed675 --- /dev/null +++ b/sbsheriff/Lib/site-packages/attr/setters.py @@ -0,0 +1,73 @@ +# SPDX-License-Identifier: MIT + +""" +Commonly used hooks for on_setattr. +""" + + +from . import _config +from .exceptions import FrozenAttributeError + + +def pipe(*setters): + """ + Run all *setters* and return the return value of the last one. + + .. versionadded:: 20.1.0 + """ + + def wrapped_pipe(instance, attrib, new_value): + rv = new_value + + for setter in setters: + rv = setter(instance, attrib, rv) + + return rv + + return wrapped_pipe + + +def frozen(_, __, ___): + """ + Prevent an attribute to be modified. + + .. versionadded:: 20.1.0 + """ + raise FrozenAttributeError() + + +def validate(instance, attrib, new_value): + """ + Run *attrib*'s validator on *new_value* if it has one. + + .. versionadded:: 20.1.0 + """ + if _config._run_validators is False: + return new_value + + v = attrib.validator + if not v: + return new_value + + v(instance, attrib, new_value) + + return new_value + + +def convert(instance, attrib, new_value): + """ + Run *attrib*'s converter -- if it has one -- on *new_value* and return the + result. + + .. versionadded:: 20.1.0 + """ + c = attrib.converter + if c: + return c(new_value) + + return new_value + + +# Sentinel for disabling class-wide *on_setattr* hooks for certain attributes. +# autodata stopped working, so the docstring is inlined in the API docs. +NO_OP = object() diff --git a/sbsheriff/Lib/site-packages/attr/setters.pyi b/sbsheriff/Lib/site-packages/attr/setters.pyi new file mode 100644 index 0000000..3f5603c --- /dev/null +++ b/sbsheriff/Lib/site-packages/attr/setters.pyi @@ -0,0 +1,19 @@ +from typing import Any, NewType, NoReturn, TypeVar, cast + +from . import Attribute, _OnSetAttrType + +_T = TypeVar("_T") + +def frozen( + instance: Any, attribute: Attribute[Any], new_value: Any +) -> NoReturn: ... +def pipe(*setters: _OnSetAttrType) -> _OnSetAttrType: ... +def validate(instance: Any, attribute: Attribute[_T], new_value: _T) -> _T: ... + +# convert is allowed to return Any, because they can be chained using pipe. +def convert( + instance: Any, attribute: Attribute[Any], new_value: Any +) -> Any: ... + +_NoOpType = NewType("_NoOpType", object) +NO_OP: _NoOpType diff --git a/sbsheriff/Lib/site-packages/attr/validators.py b/sbsheriff/Lib/site-packages/attr/validators.py new file mode 100644 index 0000000..eece517 --- /dev/null +++ b/sbsheriff/Lib/site-packages/attr/validators.py @@ -0,0 +1,594 @@ +# SPDX-License-Identifier: MIT + +""" +Commonly useful validators. +""" + + +import operator +import re + +from contextlib import contextmanager + +from ._config import get_run_validators, set_run_validators +from ._make import _AndValidator, and_, attrib, attrs +from .exceptions import NotCallableError + + +try: + Pattern = re.Pattern +except AttributeError: # Python <3.7 lacks a Pattern type. + Pattern = type(re.compile("")) + + +__all__ = [ + "and_", + "deep_iterable", + "deep_mapping", + "disabled", + "ge", + "get_disabled", + "gt", + "in_", + "instance_of", + "is_callable", + "le", + "lt", + "matches_re", + "max_len", + "min_len", + "optional", + "provides", + "set_disabled", +] + + +def set_disabled(disabled): + """ + Globally disable or enable running validators. + + By default, they are run. + + :param disabled: If ``True``, disable running all validators. + :type disabled: bool + + .. warning:: + + This function is not thread-safe! + + .. versionadded:: 21.3.0 + """ + set_run_validators(not disabled) + + +def get_disabled(): + """ + Return a bool indicating whether validators are currently disabled or not. + + :return: ``True`` if validators are currently disabled. + :rtype: bool + + .. versionadded:: 21.3.0 + """ + return not get_run_validators() + + +@contextmanager +def disabled(): + """ + Context manager that disables running validators within its context. + + .. warning:: + + This context manager is not thread-safe! + + .. versionadded:: 21.3.0 + """ + set_run_validators(False) + try: + yield + finally: + set_run_validators(True) + + +@attrs(repr=False, slots=True, hash=True) +class _InstanceOfValidator: + type = attrib() + + def __call__(self, inst, attr, value): + """ + We use a callable class to be able to change the ``__repr__``. + """ + if not isinstance(value, self.type): + raise TypeError( + "'{name}' must be {type!r} (got {value!r} that is a " + "{actual!r}).".format( + name=attr.name, + type=self.type, + actual=value.__class__, + value=value, + ), + attr, + self.type, + value, + ) + + def __repr__(self): + return "".format( + type=self.type + ) + + +def instance_of(type): + """ + A validator that raises a `TypeError` if the initializer is called + with a wrong type for this particular attribute (checks are performed using + `isinstance` therefore it's also valid to pass a tuple of types). + + :param type: The type to check for. + :type type: type or tuple of types + + :raises TypeError: With a human readable error message, the attribute + (of type `attrs.Attribute`), the expected type, and the value it + got. + """ + return _InstanceOfValidator(type) + + +@attrs(repr=False, frozen=True, slots=True) +class _MatchesReValidator: + pattern = attrib() + match_func = attrib() + + def __call__(self, inst, attr, value): + """ + We use a callable class to be able to change the ``__repr__``. + """ + if not self.match_func(value): + raise ValueError( + "'{name}' must match regex {pattern!r}" + " ({value!r} doesn't)".format( + name=attr.name, pattern=self.pattern.pattern, value=value + ), + attr, + self.pattern, + value, + ) + + def __repr__(self): + return "".format( + pattern=self.pattern + ) + + +def matches_re(regex, flags=0, func=None): + r""" + A validator that raises `ValueError` if the initializer is called + with a string that doesn't match *regex*. + + :param regex: a regex string or precompiled pattern to match against + :param int flags: flags that will be passed to the underlying re function + (default 0) + :param callable func: which underlying `re` function to call. Valid options + are `re.fullmatch`, `re.search`, and `re.match`; the default ``None`` + means `re.fullmatch`. For performance reasons, the pattern is always + precompiled using `re.compile`. + + .. versionadded:: 19.2.0 + .. versionchanged:: 21.3.0 *regex* can be a pre-compiled pattern. + """ + valid_funcs = (re.fullmatch, None, re.search, re.match) + if func not in valid_funcs: + raise ValueError( + "'func' must be one of {}.".format( + ", ".join( + sorted( + e and e.__name__ or "None" for e in set(valid_funcs) + ) + ) + ) + ) + + if isinstance(regex, Pattern): + if flags: + raise TypeError( + "'flags' can only be used with a string pattern; " + "pass flags to re.compile() instead" + ) + pattern = regex + else: + pattern = re.compile(regex, flags) + + if func is re.match: + match_func = pattern.match + elif func is re.search: + match_func = pattern.search + else: + match_func = pattern.fullmatch + + return _MatchesReValidator(pattern, match_func) + + +@attrs(repr=False, slots=True, hash=True) +class _ProvidesValidator: + interface = attrib() + + def __call__(self, inst, attr, value): + """ + We use a callable class to be able to change the ``__repr__``. + """ + if not self.interface.providedBy(value): + raise TypeError( + "'{name}' must provide {interface!r} which {value!r} " + "doesn't.".format( + name=attr.name, interface=self.interface, value=value + ), + attr, + self.interface, + value, + ) + + def __repr__(self): + return "".format( + interface=self.interface + ) + + +def provides(interface): + """ + A validator that raises a `TypeError` if the initializer is called + with an object that does not provide the requested *interface* (checks are + performed using ``interface.providedBy(value)`` (see `zope.interface + `_). + + :param interface: The interface to check for. + :type interface: ``zope.interface.Interface`` + + :raises TypeError: With a human readable error message, the attribute + (of type `attrs.Attribute`), the expected interface, and the + value it got. + """ + return _ProvidesValidator(interface) + + +@attrs(repr=False, slots=True, hash=True) +class _OptionalValidator: + validator = attrib() + + def __call__(self, inst, attr, value): + if value is None: + return + + self.validator(inst, attr, value) + + def __repr__(self): + return "".format( + what=repr(self.validator) + ) + + +def optional(validator): + """ + A validator that makes an attribute optional. An optional attribute is one + which can be set to ``None`` in addition to satisfying the requirements of + the sub-validator. + + :param validator: A validator (or a list of validators) that is used for + non-``None`` values. + :type validator: callable or `list` of callables. + + .. versionadded:: 15.1.0 + .. versionchanged:: 17.1.0 *validator* can be a list of validators. + """ + if isinstance(validator, list): + return _OptionalValidator(_AndValidator(validator)) + return _OptionalValidator(validator) + + +@attrs(repr=False, slots=True, hash=True) +class _InValidator: + options = attrib() + + def __call__(self, inst, attr, value): + try: + in_options = value in self.options + except TypeError: # e.g. `1 in "abc"` + in_options = False + + if not in_options: + raise ValueError( + "'{name}' must be in {options!r} (got {value!r})".format( + name=attr.name, options=self.options, value=value + ), + attr, + self.options, + value, + ) + + def __repr__(self): + return "".format( + options=self.options + ) + + +def in_(options): + """ + A validator that raises a `ValueError` if the initializer is called + with a value that does not belong in the options provided. The check is + performed using ``value in options``. + + :param options: Allowed options. + :type options: list, tuple, `enum.Enum`, ... + + :raises ValueError: With a human readable error message, the attribute (of + type `attrs.Attribute`), the expected options, and the value it + got. + + .. versionadded:: 17.1.0 + .. versionchanged:: 22.1.0 + The ValueError was incomplete until now and only contained the human + readable error message. Now it contains all the information that has + been promised since 17.1.0. + """ + return _InValidator(options) + + +@attrs(repr=False, slots=False, hash=True) +class _IsCallableValidator: + def __call__(self, inst, attr, value): + """ + We use a callable class to be able to change the ``__repr__``. + """ + if not callable(value): + message = ( + "'{name}' must be callable " + "(got {value!r} that is a {actual!r})." + ) + raise NotCallableError( + msg=message.format( + name=attr.name, value=value, actual=value.__class__ + ), + value=value, + ) + + def __repr__(self): + return "" + + +def is_callable(): + """ + A validator that raises a `attr.exceptions.NotCallableError` if the + initializer is called with a value for this particular attribute + that is not callable. + + .. versionadded:: 19.1.0 + + :raises `attr.exceptions.NotCallableError`: With a human readable error + message containing the attribute (`attrs.Attribute`) name, + and the value it got. + """ + return _IsCallableValidator() + + +@attrs(repr=False, slots=True, hash=True) +class _DeepIterable: + member_validator = attrib(validator=is_callable()) + iterable_validator = attrib( + default=None, validator=optional(is_callable()) + ) + + def __call__(self, inst, attr, value): + """ + We use a callable class to be able to change the ``__repr__``. + """ + if self.iterable_validator is not None: + self.iterable_validator(inst, attr, value) + + for member in value: + self.member_validator(inst, attr, member) + + def __repr__(self): + iterable_identifier = ( + "" + if self.iterable_validator is None + else " {iterable!r}".format(iterable=self.iterable_validator) + ) + return ( + "" + ).format( + iterable_identifier=iterable_identifier, + member=self.member_validator, + ) + + +def deep_iterable(member_validator, iterable_validator=None): + """ + A validator that performs deep validation of an iterable. + + :param member_validator: Validator(s) to apply to iterable members + :param iterable_validator: Validator to apply to iterable itself + (optional) + + .. versionadded:: 19.1.0 + + :raises TypeError: if any sub-validators fail + """ + if isinstance(member_validator, (list, tuple)): + member_validator = and_(*member_validator) + return _DeepIterable(member_validator, iterable_validator) + + +@attrs(repr=False, slots=True, hash=True) +class _DeepMapping: + key_validator = attrib(validator=is_callable()) + value_validator = attrib(validator=is_callable()) + mapping_validator = attrib(default=None, validator=optional(is_callable())) + + def __call__(self, inst, attr, value): + """ + We use a callable class to be able to change the ``__repr__``. + """ + if self.mapping_validator is not None: + self.mapping_validator(inst, attr, value) + + for key in value: + self.key_validator(inst, attr, key) + self.value_validator(inst, attr, value[key]) + + def __repr__(self): + return ( + "" + ).format(key=self.key_validator, value=self.value_validator) + + +def deep_mapping(key_validator, value_validator, mapping_validator=None): + """ + A validator that performs deep validation of a dictionary. + + :param key_validator: Validator to apply to dictionary keys + :param value_validator: Validator to apply to dictionary values + :param mapping_validator: Validator to apply to top-level mapping + attribute (optional) + + .. versionadded:: 19.1.0 + + :raises TypeError: if any sub-validators fail + """ + return _DeepMapping(key_validator, value_validator, mapping_validator) + + +@attrs(repr=False, frozen=True, slots=True) +class _NumberValidator: + bound = attrib() + compare_op = attrib() + compare_func = attrib() + + def __call__(self, inst, attr, value): + """ + We use a callable class to be able to change the ``__repr__``. + """ + if not self.compare_func(value, self.bound): + raise ValueError( + "'{name}' must be {op} {bound}: {value}".format( + name=attr.name, + op=self.compare_op, + bound=self.bound, + value=value, + ) + ) + + def __repr__(self): + return "".format( + op=self.compare_op, bound=self.bound + ) + + +def lt(val): + """ + A validator that raises `ValueError` if the initializer is called + with a number larger or equal to *val*. + + :param val: Exclusive upper bound for values + + .. versionadded:: 21.3.0 + """ + return _NumberValidator(val, "<", operator.lt) + + +def le(val): + """ + A validator that raises `ValueError` if the initializer is called + with a number greater than *val*. + + :param val: Inclusive upper bound for values + + .. versionadded:: 21.3.0 + """ + return _NumberValidator(val, "<=", operator.le) + + +def ge(val): + """ + A validator that raises `ValueError` if the initializer is called + with a number smaller than *val*. + + :param val: Inclusive lower bound for values + + .. versionadded:: 21.3.0 + """ + return _NumberValidator(val, ">=", operator.ge) + + +def gt(val): + """ + A validator that raises `ValueError` if the initializer is called + with a number smaller or equal to *val*. + + :param val: Exclusive lower bound for values + + .. versionadded:: 21.3.0 + """ + return _NumberValidator(val, ">", operator.gt) + + +@attrs(repr=False, frozen=True, slots=True) +class _MaxLengthValidator: + max_length = attrib() + + def __call__(self, inst, attr, value): + """ + We use a callable class to be able to change the ``__repr__``. + """ + if len(value) > self.max_length: + raise ValueError( + "Length of '{name}' must be <= {max}: {len}".format( + name=attr.name, max=self.max_length, len=len(value) + ) + ) + + def __repr__(self): + return "".format(max=self.max_length) + + +def max_len(length): + """ + A validator that raises `ValueError` if the initializer is called + with a string or iterable that is longer than *length*. + + :param int length: Maximum length of the string or iterable + + .. versionadded:: 21.3.0 + """ + return _MaxLengthValidator(length) + + +@attrs(repr=False, frozen=True, slots=True) +class _MinLengthValidator: + min_length = attrib() + + def __call__(self, inst, attr, value): + """ + We use a callable class to be able to change the ``__repr__``. + """ + if len(value) < self.min_length: + raise ValueError( + "Length of '{name}' must be => {min}: {len}".format( + name=attr.name, min=self.min_length, len=len(value) + ) + ) + + def __repr__(self): + return "".format(min=self.min_length) + + +def min_len(length): + """ + A validator that raises `ValueError` if the initializer is called + with a string or iterable that is shorter than *length*. + + :param int length: Minimum length of the string or iterable + + .. versionadded:: 22.1.0 + """ + return _MinLengthValidator(length) diff --git a/sbsheriff/Lib/site-packages/attr/validators.pyi b/sbsheriff/Lib/site-packages/attr/validators.pyi new file mode 100644 index 0000000..54b9dba --- /dev/null +++ b/sbsheriff/Lib/site-packages/attr/validators.pyi @@ -0,0 +1,80 @@ +from typing import ( + Any, + AnyStr, + Callable, + Container, + ContextManager, + Iterable, + List, + Mapping, + Match, + Optional, + Pattern, + Tuple, + Type, + TypeVar, + Union, + overload, +) + +from . import _ValidatorType +from . import _ValidatorArgType + +_T = TypeVar("_T") +_T1 = TypeVar("_T1") +_T2 = TypeVar("_T2") +_T3 = TypeVar("_T3") +_I = TypeVar("_I", bound=Iterable) +_K = TypeVar("_K") +_V = TypeVar("_V") +_M = TypeVar("_M", bound=Mapping) + +def set_disabled(run: bool) -> None: ... +def get_disabled() -> bool: ... +def disabled() -> ContextManager[None]: ... + +# To be more precise on instance_of use some overloads. +# If there are more than 3 items in the tuple then we fall back to Any +@overload +def instance_of(type: Type[_T]) -> _ValidatorType[_T]: ... +@overload +def instance_of(type: Tuple[Type[_T]]) -> _ValidatorType[_T]: ... +@overload +def instance_of( + type: Tuple[Type[_T1], Type[_T2]] +) -> _ValidatorType[Union[_T1, _T2]]: ... +@overload +def instance_of( + type: Tuple[Type[_T1], Type[_T2], Type[_T3]] +) -> _ValidatorType[Union[_T1, _T2, _T3]]: ... +@overload +def instance_of(type: Tuple[type, ...]) -> _ValidatorType[Any]: ... +def provides(interface: Any) -> _ValidatorType[Any]: ... +def optional( + validator: Union[_ValidatorType[_T], List[_ValidatorType[_T]]] +) -> _ValidatorType[Optional[_T]]: ... +def in_(options: Container[_T]) -> _ValidatorType[_T]: ... +def and_(*validators: _ValidatorType[_T]) -> _ValidatorType[_T]: ... +def matches_re( + regex: Union[Pattern[AnyStr], AnyStr], + flags: int = ..., + func: Optional[ + Callable[[AnyStr, AnyStr, int], Optional[Match[AnyStr]]] + ] = ..., +) -> _ValidatorType[AnyStr]: ... +def deep_iterable( + member_validator: _ValidatorArgType[_T], + iterable_validator: Optional[_ValidatorType[_I]] = ..., +) -> _ValidatorType[_I]: ... +def deep_mapping( + key_validator: _ValidatorType[_K], + value_validator: _ValidatorType[_V], + mapping_validator: Optional[_ValidatorType[_M]] = ..., +) -> _ValidatorType[_M]: ... +def is_callable() -> _ValidatorType[_T]: ... +def lt(val: _T) -> _ValidatorType[_T]: ... +def le(val: _T) -> _ValidatorType[_T]: ... +def ge(val: _T) -> _ValidatorType[_T]: ... +def gt(val: _T) -> _ValidatorType[_T]: ... +def max_len(length: int) -> _ValidatorType[_T]: ... +def min_len(length: int) -> _ValidatorType[_T]: ... diff --git a/sbsheriff/Lib/site-packages/attrs-22.1.0.dist-info/AUTHORS.rst b/sbsheriff/Lib/site-packages/attrs-22.1.0.dist-info/AUTHORS.rst new file mode 100644 index 0000000..aa677e8 --- /dev/null +++ b/sbsheriff/Lib/site-packages/attrs-22.1.0.dist-info/AUTHORS.rst @@ -0,0 +1,11 @@ +Credits +======= + +``attrs`` is written and maintained by `Hynek Schlawack `_. + +The development is kindly supported by `Variomedia AG `_. + +A full list of contributors can be found in `GitHub's overview `_. + +It’s the spiritual successor of `characteristic `_ and aspires to fix some of it clunkiness and unfortunate decisions. +Both were inspired by Twisted’s `FancyEqMixin `_ but both are implemented using class decorators because `subclassing is bad for you `_, m’kay? diff --git a/sbsheriff/Lib/site-packages/attrs-22.1.0.dist-info/INSTALLER b/sbsheriff/Lib/site-packages/attrs-22.1.0.dist-info/INSTALLER new file mode 100644 index 0000000..a1b589e --- /dev/null +++ b/sbsheriff/Lib/site-packages/attrs-22.1.0.dist-info/INSTALLER @@ -0,0 +1 @@ +pip diff --git a/sbsheriff/Lib/site-packages/attrs-22.1.0.dist-info/LICENSE b/sbsheriff/Lib/site-packages/attrs-22.1.0.dist-info/LICENSE new file mode 100644 index 0000000..2bd6453 --- /dev/null +++ b/sbsheriff/Lib/site-packages/attrs-22.1.0.dist-info/LICENSE @@ -0,0 +1,21 @@ +The MIT License (MIT) + +Copyright (c) 2015 Hynek Schlawack and the attrs contributors + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. diff --git a/sbsheriff/Lib/site-packages/attrs-22.1.0.dist-info/METADATA b/sbsheriff/Lib/site-packages/attrs-22.1.0.dist-info/METADATA new file mode 100644 index 0000000..60b6653 --- /dev/null +++ b/sbsheriff/Lib/site-packages/attrs-22.1.0.dist-info/METADATA @@ -0,0 +1,240 @@ +Metadata-Version: 2.1 +Name: attrs +Version: 22.1.0 +Summary: Classes Without Boilerplate +Home-page: https://www.attrs.org/ +Author: Hynek Schlawack +Author-email: hs@ox.cx +Maintainer: Hynek Schlawack +Maintainer-email: hs@ox.cx +License: MIT +Project-URL: Documentation, https://www.attrs.org/ +Project-URL: Changelog, https://www.attrs.org/en/stable/changelog.html +Project-URL: Bug Tracker, https://github.com/python-attrs/attrs/issues +Project-URL: Source Code, https://github.com/python-attrs/attrs +Project-URL: Funding, https://github.com/sponsors/hynek +Project-URL: Tidelift, https://tidelift.com/subscription/pkg/pypi-attrs?utm_source=pypi-attrs&utm_medium=pypi +Project-URL: Ko-fi, https://ko-fi.com/the_hynek +Keywords: class,attribute,boilerplate +Classifier: Development Status :: 5 - Production/Stable +Classifier: Intended Audience :: Developers +Classifier: Natural Language :: English +Classifier: License :: OSI Approved :: MIT License +Classifier: Operating System :: OS Independent +Classifier: Programming Language :: Python +Classifier: Programming Language :: Python :: 3 +Classifier: Programming Language :: Python :: 3.5 +Classifier: Programming Language :: Python :: 3.6 +Classifier: Programming Language :: Python :: 3.7 +Classifier: Programming Language :: Python :: 3.8 +Classifier: Programming Language :: Python :: 3.9 +Classifier: Programming Language :: Python :: 3.10 +Classifier: Programming Language :: Python :: 3.11 +Classifier: Programming Language :: Python :: Implementation :: CPython +Classifier: Programming Language :: Python :: Implementation :: PyPy +Classifier: Topic :: Software Development :: Libraries :: Python Modules +Requires-Python: >=3.5 +Description-Content-Type: text/x-rst +License-File: LICENSE +License-File: AUTHORS.rst +Provides-Extra: dev +Requires-Dist: coverage[toml] (>=5.0.2) ; extra == 'dev' +Requires-Dist: hypothesis ; extra == 'dev' +Requires-Dist: pympler ; extra == 'dev' +Requires-Dist: pytest (>=4.3.0) ; extra == 'dev' +Requires-Dist: mypy (!=0.940,>=0.900) ; extra == 'dev' +Requires-Dist: pytest-mypy-plugins ; extra == 'dev' +Requires-Dist: zope.interface ; extra == 'dev' +Requires-Dist: furo ; extra == 'dev' +Requires-Dist: sphinx ; extra == 'dev' +Requires-Dist: sphinx-notfound-page ; extra == 'dev' +Requires-Dist: pre-commit ; extra == 'dev' +Requires-Dist: cloudpickle ; (platform_python_implementation == "CPython") and extra == 'dev' +Provides-Extra: docs +Requires-Dist: furo ; extra == 'docs' +Requires-Dist: sphinx ; extra == 'docs' +Requires-Dist: zope.interface ; extra == 'docs' +Requires-Dist: sphinx-notfound-page ; extra == 'docs' +Provides-Extra: tests +Requires-Dist: coverage[toml] (>=5.0.2) ; extra == 'tests' +Requires-Dist: hypothesis ; extra == 'tests' +Requires-Dist: pympler ; extra == 'tests' +Requires-Dist: pytest (>=4.3.0) ; extra == 'tests' +Requires-Dist: mypy (!=0.940,>=0.900) ; extra == 'tests' +Requires-Dist: pytest-mypy-plugins ; extra == 'tests' +Requires-Dist: zope.interface ; extra == 'tests' +Requires-Dist: cloudpickle ; (platform_python_implementation == "CPython") and extra == 'tests' +Provides-Extra: tests_no_zope +Requires-Dist: coverage[toml] (>=5.0.2) ; extra == 'tests_no_zope' +Requires-Dist: hypothesis ; extra == 'tests_no_zope' +Requires-Dist: pympler ; extra == 'tests_no_zope' +Requires-Dist: pytest (>=4.3.0) ; extra == 'tests_no_zope' +Requires-Dist: mypy (!=0.940,>=0.900) ; extra == 'tests_no_zope' +Requires-Dist: pytest-mypy-plugins ; extra == 'tests_no_zope' +Requires-Dist: cloudpickle ; (platform_python_implementation == "CPython") and extra == 'tests_no_zope' + + +.. image:: https://www.attrs.org/en/stable/_static/attrs_logo.png + :alt: attrs logo + :align: center + + +``attrs`` is the Python package that will bring back the **joy** of **writing classes** by relieving you from the drudgery of implementing object protocols (aka `dunder methods `_). +`Trusted by NASA `_ for Mars missions since 2020! + +Its main goal is to help you to write **concise** and **correct** software without slowing down your code. + +.. teaser-end + +For that, it gives you a class decorator and a way to declaratively define the attributes on that class: + +.. -code-begin- + +.. code-block:: pycon + + >>> from attrs import asdict, define, make_class, Factory + + >>> @define + ... class SomeClass: + ... a_number: int = 42 + ... list_of_numbers: list[int] = Factory(list) + ... + ... def hard_math(self, another_number): + ... return self.a_number + sum(self.list_of_numbers) * another_number + + + >>> sc = SomeClass(1, [1, 2, 3]) + >>> sc + SomeClass(a_number=1, list_of_numbers=[1, 2, 3]) + + >>> sc.hard_math(3) + 19 + >>> sc == SomeClass(1, [1, 2, 3]) + True + >>> sc != SomeClass(2, [3, 2, 1]) + True + + >>> asdict(sc) + {'a_number': 1, 'list_of_numbers': [1, 2, 3]} + + >>> SomeClass() + SomeClass(a_number=42, list_of_numbers=[]) + + >>> C = make_class("C", ["a", "b"]) + >>> C("foo", "bar") + C(a='foo', b='bar') + + +After *declaring* your attributes, ``attrs`` gives you: + +- a concise and explicit overview of the class's attributes, +- a nice human-readable ``__repr__``, +- equality-checking methods, +- an initializer, +- and much more, + +*without* writing dull boilerplate code again and again and *without* runtime performance penalties. + +**Hate type annotations**!? +No problem! +Types are entirely **optional** with ``attrs``. +Simply assign ``attrs.field()`` to the attributes instead of annotating them with types. + +---- + +This example uses ``attrs``'s modern APIs that have been introduced in version 20.1.0, and the ``attrs`` package import name that has been added in version 21.3.0. +The classic APIs (``@attr.s``, ``attr.ib``, plus their serious-business aliases) and the ``attr`` package import name will remain **indefinitely**. + +Please check out `On The Core API Names `_ for a more in-depth explanation. + + +Data Classes +============ + +On the tin, ``attrs`` might remind you of ``dataclasses`` (and indeed, ``dataclasses`` `are a descendant `_ of ``attrs``). +In practice it does a lot more and is more flexible. +For instance it allows you to define `special handling of NumPy arrays for equality checks `_, or allows more ways to `plug into the initialization process `_. + +For more details, please refer to our `comparison page `_. + +.. -project-information- + +Project Information +=================== + +- **License**: `MIT `_ +- **PyPI**: https://pypi.org/project/attrs/ +- **Source Code**: https://github.com/python-attrs/attrs +- **Documentation**: https://www.attrs.org/ +- **Changelog**: https://www.attrs.org/en/stable/changelog.html +- **Get Help**: please use the ``python-attrs`` tag on `StackOverflow `_ +- **Third-party Extensions**: https://github.com/python-attrs/attrs/wiki/Extensions-to-attrs +- **Supported Python Versions**: 3.5 and later (last 2.7-compatible release is `21.4.0 `_) + +If you'd like to contribute to ``attrs`` you're most welcome and we've written `a little guide `_ to get you started! + + +``attrs`` for Enterprise +------------------------ + +Available as part of the Tidelift Subscription. + +The maintainers of ``attrs`` and thousands of other packages are working with Tidelift to deliver commercial support and maintenance for the open source packages you use to build your applications. +Save time, reduce risk, and improve code health, while paying the maintainers of the exact packages you use. +`Learn more. `_ + + +Release Information +=================== + +22.1.0 (2022-07-28) +------------------- + +Backwards-incompatible Changes +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +- Python 2.7 is not supported anymore. + + Dealing with Python 2.7 tooling has become too difficult for a volunteer-run project. + + We have supported Python 2 more than 2 years after it was officially discontinued and feel that we have paid our dues. + All version up to 21.4.0 from December 2021 remain fully functional, of course. + `#936 `_ +- The deprecated ``cmp`` attribute of ``attrs.Attribute`` has been removed. + This does not affect the *cmp* argument to ``attr.s`` that can be used as a shortcut to set *eq* and *order* at the same time. + `#939 `_ + + +Changes +^^^^^^^ + +- Instantiation of frozen slotted classes is now faster. + `#898 `_ +- If an ``eq`` key is defined, it is also used before hashing the attribute. + `#909 `_ +- Added ``attrs.validators.min_len()``. + `#916 `_ +- ``attrs.validators.deep_iterable()``'s *member_validator* argument now also accepts a list of validators and wraps them in an ``attrs.validators.and_()``. + `#925 `_ +- Added missing type stub re-imports for ``attrs.converters`` and ``attrs.filters``. + `#931 `_ +- Added missing stub for ``attr(s).cmp_using()``. + `#949 `_ +- ``attrs.validators._in()``'s ``ValueError`` is not missing the attribute, expected options, and the value it got anymore. + `#951 `_ +- Python 3.11 is now officially supported. + `#969 `_ + +`Full changelog `_. + +Credits +======= + +``attrs`` is written and maintained by `Hynek Schlawack `_. + +The development is kindly supported by `Variomedia AG `_. + +A full list of contributors can be found in `GitHub's overview `_. + +It’s the spiritual successor of `characteristic `_ and aspires to fix some of it clunkiness and unfortunate decisions. +Both were inspired by Twisted’s `FancyEqMixin `_ but both are implemented using class decorators because `subclassing is bad for you `_, m’kay? diff --git a/sbsheriff/Lib/site-packages/attrs-22.1.0.dist-info/RECORD b/sbsheriff/Lib/site-packages/attrs-22.1.0.dist-info/RECORD new file mode 100644 index 0000000..7288f98 --- /dev/null +++ b/sbsheriff/Lib/site-packages/attrs-22.1.0.dist-info/RECORD @@ -0,0 +1,56 @@ +attr/__init__.py,sha256=KZjj88xCd_tH-W59HR1EvHiYAUi4Zd1dzOxx8P77jeI,1602 +attr/__init__.pyi,sha256=t-1r-I1VnyxFrqic__QxIk1HUc3ag53L2b8lv0xDZTw,15137 +attr/__pycache__/__init__.cpython-310.pyc,, +attr/__pycache__/_cmp.cpython-310.pyc,, +attr/__pycache__/_compat.cpython-310.pyc,, +attr/__pycache__/_config.cpython-310.pyc,, +attr/__pycache__/_funcs.cpython-310.pyc,, +attr/__pycache__/_make.cpython-310.pyc,, +attr/__pycache__/_next_gen.cpython-310.pyc,, +attr/__pycache__/_version_info.cpython-310.pyc,, +attr/__pycache__/converters.cpython-310.pyc,, +attr/__pycache__/exceptions.cpython-310.pyc,, +attr/__pycache__/filters.cpython-310.pyc,, +attr/__pycache__/setters.cpython-310.pyc,, +attr/__pycache__/validators.cpython-310.pyc,, +attr/_cmp.py,sha256=Mmqj-6w71g_vx0TTLLkU4pbmv28qz_FyBGcUb1HX9ZE,4102 +attr/_cmp.pyi,sha256=cSlVvIH4As2NlDIoLglPEbSrBMWVVTpwExVDDBH6pn8,357 +attr/_compat.py,sha256=Qr9kZOu95Og7joPaQiXoPb54epKqxNU39Xu0u4QVGZI,5568 +attr/_config.py,sha256=5W8lgRePuIOWu1ZuqF1899e2CmXGc95-ipwTpF1cEU4,826 +attr/_funcs.py,sha256=XTFKZtd5zxsUvWocBw7VAswTxH-nFHk0H8gJ2JQkxD4,14645 +attr/_make.py,sha256=Srxbhb8kB17T6nP9e_dgcXY72zda9xfL5uJzva6LExY,97569 +attr/_next_gen.py,sha256=N0Gb5WdBHfcfQhcUsLAc_2ZYzl0JtAX1NOHuDgvkecE,5882 +attr/_version_info.py,sha256=exSqb3b5E-fMSsgZAlEw9XcLpEgobPORCZpcaEglAM4,2121 +attr/_version_info.pyi,sha256=x_M3L3WuB7r_ULXAWjx959udKQ4HLB8l-hsc1FDGNvk,209 +attr/converters.py,sha256=TWCfmCAxk8s2tgTSYnyQv9MRDPf1pk8Rj16KO_Xqe1c,3610 +attr/converters.pyi,sha256=MQo7iEzPNVoFpKqD30sVwgVpdNoIeSCF2nsXvoxLZ-Y,416 +attr/exceptions.py,sha256=ZGEMLv0CDY1TOtj49OF84myejOn-LCCXAKGIKalKkVU,1915 +attr/exceptions.pyi,sha256=zZq8bCUnKAy9mDtBEw42ZhPhAUIHoTKedDQInJD883M,539 +attr/filters.py,sha256=aZep54h8-4ZYV5lmZ3Dx2mqeQH4cMx6tuCmCylLNbEU,1038 +attr/filters.pyi,sha256=_Sm80jGySETX_Clzdkon5NHVjQWRl3Y3liQKZX1czXc,215 +attr/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 +attr/setters.py,sha256=pbCZQ-pE6ZxjDqZfWWUhUFefXtpekIU4qS_YDMLPQ50,1400 +attr/setters.pyi,sha256=7dM10rqpQVDW0y-iJUnq8rabdO5Wx2Sbo5LwNa0IXl0,573 +attr/validators.py,sha256=cpOHMNSt02ApbTQtQAwBTMeWZqp0u_sx-e3xH-jTyR4,16793 +attr/validators.pyi,sha256=6ngbvnWnFSkbf5J2dK86pq2xpEtrwzWTKfJ4aUvSIlk,2355 +attrs-22.1.0.dist-info/AUTHORS.rst,sha256=jau5p7JMPbBJeCCpGBWsRj8zpxUVAhpyoHFJRfjM888,743 +attrs-22.1.0.dist-info/INSTALLER,sha256=zuuue4knoyJ-UwPPXg8fezS7VCrXJQrAP7zeNuwvFQg,4 +attrs-22.1.0.dist-info/LICENSE,sha256=iCEVyV38KvHutnFPjsbVy8q_Znyv-HKfQkINpj9xTp8,1109 +attrs-22.1.0.dist-info/METADATA,sha256=vwSMK_BbEgVHrgFWpj3iW0PISTMPHzi6qham9jg7LtA,11015 +attrs-22.1.0.dist-info/RECORD,, +attrs-22.1.0.dist-info/WHEEL,sha256=z9j0xAa_JmUKMpmz72K0ZGALSM_n-wQVmGbleXx2VHg,110 +attrs-22.1.0.dist-info/top_level.txt,sha256=AGbmKnOtYpdkLRsDRQVSBIwfL32pAQ6BSo1mt-BxI7M,11 +attrs/__init__.py,sha256=CeyxLGVViAEKKsLOLaif8vF3vs1a28vsrRVLv7eMEgM,1109 +attrs/__init__.pyi,sha256=vuFxNbulP9Q7hfpO6Lb5A-_0mbEJOiwYyefjzXMqVfs,2100 +attrs/__pycache__/__init__.cpython-310.pyc,, +attrs/__pycache__/converters.cpython-310.pyc,, +attrs/__pycache__/exceptions.cpython-310.pyc,, +attrs/__pycache__/filters.cpython-310.pyc,, +attrs/__pycache__/setters.cpython-310.pyc,, +attrs/__pycache__/validators.cpython-310.pyc,, +attrs/converters.py,sha256=fCBEdlYWcmI3sCnpUk2pz22GYtXzqTkp6NeOpdI64PY,70 +attrs/exceptions.py,sha256=SlDli6AY77f6ny-H7oy98OkQjsrw-D_supEuErIVYkE,70 +attrs/filters.py,sha256=dc_dNey29kH6KLU1mT2Dakq7tZ3kBfzEGwzOmDzw1F8,67 +attrs/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 +attrs/setters.py,sha256=oKw51C72Hh45wTwYvDHJP9kbicxiMhMR4Y5GvdpKdHQ,67 +attrs/validators.py,sha256=4ag1SyVD2Hm3PYKiNG_NOtR_e7f81Hr6GiNl4YvXo4Q,70 diff --git a/sbsheriff/Lib/site-packages/attrs-22.1.0.dist-info/WHEEL b/sbsheriff/Lib/site-packages/attrs-22.1.0.dist-info/WHEEL new file mode 100644 index 0000000..0b18a28 --- /dev/null +++ b/sbsheriff/Lib/site-packages/attrs-22.1.0.dist-info/WHEEL @@ -0,0 +1,6 @@ +Wheel-Version: 1.0 +Generator: bdist_wheel (0.37.1) +Root-Is-Purelib: true +Tag: py2-none-any +Tag: py3-none-any + diff --git a/sbsheriff/Lib/site-packages/attrs-22.1.0.dist-info/top_level.txt b/sbsheriff/Lib/site-packages/attrs-22.1.0.dist-info/top_level.txt new file mode 100644 index 0000000..eca8ba9 --- /dev/null +++ b/sbsheriff/Lib/site-packages/attrs-22.1.0.dist-info/top_level.txt @@ -0,0 +1,2 @@ +attr +attrs diff --git a/sbsheriff/Lib/site-packages/attrs/__init__.py b/sbsheriff/Lib/site-packages/attrs/__init__.py new file mode 100644 index 0000000..a704b8b --- /dev/null +++ b/sbsheriff/Lib/site-packages/attrs/__init__.py @@ -0,0 +1,70 @@ +# SPDX-License-Identifier: MIT + +from attr import ( + NOTHING, + Attribute, + Factory, + __author__, + __copyright__, + __description__, + __doc__, + __email__, + __license__, + __title__, + __url__, + __version__, + __version_info__, + assoc, + cmp_using, + define, + evolve, + field, + fields, + fields_dict, + frozen, + has, + make_class, + mutable, + resolve_types, + validate, +) +from attr._next_gen import asdict, astuple + +from . import converters, exceptions, filters, setters, validators + + +__all__ = [ + "__author__", + "__copyright__", + "__description__", + "__doc__", + "__email__", + "__license__", + "__title__", + "__url__", + "__version__", + "__version_info__", + "asdict", + "assoc", + "astuple", + "Attribute", + "cmp_using", + "converters", + "define", + "evolve", + "exceptions", + "Factory", + "field", + "fields_dict", + "fields", + "filters", + "frozen", + "has", + "make_class", + "mutable", + "NOTHING", + "resolve_types", + "setters", + "validate", + "validators", +] diff --git a/sbsheriff/Lib/site-packages/attrs/__init__.pyi b/sbsheriff/Lib/site-packages/attrs/__init__.pyi new file mode 100644 index 0000000..fc44de4 --- /dev/null +++ b/sbsheriff/Lib/site-packages/attrs/__init__.pyi @@ -0,0 +1,66 @@ +from typing import ( + Any, + Callable, + Dict, + Mapping, + Optional, + Sequence, + Tuple, + Type, +) + +# Because we need to type our own stuff, we have to make everything from +# attr explicitly public too. +from attr import __author__ as __author__ +from attr import __copyright__ as __copyright__ +from attr import __description__ as __description__ +from attr import __email__ as __email__ +from attr import __license__ as __license__ +from attr import __title__ as __title__ +from attr import __url__ as __url__ +from attr import __version__ as __version__ +from attr import __version_info__ as __version_info__ +from attr import _FilterType +from attr import assoc as assoc +from attr import Attribute as Attribute +from attr import cmp_using as cmp_using +from attr import converters as converters +from attr import define as define +from attr import evolve as evolve +from attr import exceptions as exceptions +from attr import Factory as Factory +from attr import field as field +from attr import fields as fields +from attr import fields_dict as fields_dict +from attr import filters as filters +from attr import frozen as frozen +from attr import has as has +from attr import make_class as make_class +from attr import mutable as mutable +from attr import NOTHING as NOTHING +from attr import resolve_types as resolve_types +from attr import setters as setters +from attr import validate as validate +from attr import validators as validators + +# TODO: see definition of attr.asdict/astuple +def asdict( + inst: Any, + recurse: bool = ..., + filter: Optional[_FilterType[Any]] = ..., + dict_factory: Type[Mapping[Any, Any]] = ..., + retain_collection_types: bool = ..., + value_serializer: Optional[ + Callable[[type, Attribute[Any], Any], Any] + ] = ..., + tuple_keys: bool = ..., +) -> Dict[str, Any]: ... + +# TODO: add support for returning NamedTuple from the mypy plugin +def astuple( + inst: Any, + recurse: bool = ..., + filter: Optional[_FilterType[Any]] = ..., + tuple_factory: Type[Sequence[Any]] = ..., + retain_collection_types: bool = ..., +) -> Tuple[Any, ...]: ... diff --git a/sbsheriff/Lib/site-packages/attrs/__pycache__/__init__.cpython-310.pyc b/sbsheriff/Lib/site-packages/attrs/__pycache__/__init__.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..16f6e2c5b50d29872511cbf38e635fe09a1e412a GIT binary patch literal 1075 zcmb7?OK%e~5XU#K-Mo{&n>3|K3#xLU+z~<`5Dy8J1N1VAWI4M|Vs&SCWjj&B$KeEL zzKyS(`V~0g*|dTK7gpNe&Wyd|zwLk8YSlgW{5bE0S7p!pNy*<&(Iqe3tG_u!UQ~!Z zEIKm(i5#1^!$4Q=c|2fNV4E!e_s*v1{$ z!ClzJJ=nv2*vA7nz(Y919`vve{Q|95jE`^t13ZRfmzSb)`~Xkj1cxxh5sdH@PVo%R z3f|m{DqjomF!Dcnrg?)~LkTYG7YlGCLTHh9BBld83?Gsc%@kt)V) zi?J}x)=JJ7#-$y`BB4ViGb7W)6#`dCLl@K-6Ub%k!Ukip3`L^Frf#H(DRgs}>TbeH zD81>>W$ZqY$t-pADqQO{w6zd3w$w72TR##rnF#BPRT{5^t<0o|BkSiMZ5x{}i)3hA zQKer*VoM9IZ5{cwU}5Y!+5ne^Ph(+QN@!}s%sLa=R#!Zh5jSF7v_98)lYncp%wlm{ zp!2HOdYC3orE#ilUEG8s-@ofQlW|@Qv@n~|yKbq{XNs!XcqYAj_&g;goPhICHohKeA=+ zY_OS;ub4OffAP8QTWa#5rQ+N9%xCE~`gxkxsrK?h;)4q)iw%@*@b zkbd$NkDaf+d+MBq3BRshJ)K->cVClF&fqtb*J3r%&fYk6UgnWtdLfjY%_e$!AAOM1 uiIzq@&Ukpu=R!|Njef$IOr&%FMYgupXP8FISUe|VXu8j=*c}Xt&C+j!h8FDr literal 0 HcmV?d00001 diff --git a/sbsheriff/Lib/site-packages/attrs/__pycache__/converters.cpython-310.pyc b/sbsheriff/Lib/site-packages/attrs/__pycache__/converters.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..a784f580a176e8e46a71ae38c4360e687a53529b GIT binary patch literal 212 zcmd1j<>g`kg3aoZ$!(44TX@fg%i=jJFuI z{4^P(_!CP?iu986^U6|-N>Yo8S27ea1LeWQuW)Cpn9yRNXiRWPQD#MqOKMq6aY=qr zZcg`kg3aoZ$!(44TX@fg%i=jJFuI z{4^P(_!CP?iu6(|l2Z#xGV}9_S27ea1LeWQuW)Cpn9$ literal 0 HcmV?d00001 diff --git a/sbsheriff/Lib/site-packages/attrs/__pycache__/filters.cpython-310.pyc b/sbsheriff/Lib/site-packages/attrs/__pycache__/filters.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..1b7a91a1487feb3e0378b9080c200112ced3d83a GIT binary patch literal 206 zcmd1j<>g`kg3aoZ$<9FfF^Gc(44TX@fg%i=jJFuI z{4^P(coIuWiuBSlb4pT+idQleF#{#R#IF!%tC-MYplD2RNl|7+j7w@+OmRtmQEpOE zW_n^uYJ71g`kg3aoZ$<9FfF^Gc(44TX@fg%i=jJFuI z{4^P(coIuWiu8(8OG;9UidQleF#{#R#IF!%tC-MYplD2RNl|7+j7w@+OmRtmQEpOE zW_n^uYJ71g`kg3aoZ$!(44TX@fg%i=jJFuI z{4^P(_!CP?iuB47b23vBOY)0~S27ea1LeWQuW)Cpn9$=3.6.0 +Description-Content-Type: text/markdown +License-File: LICENSE +Provides-Extra: unicode_backport +Requires-Dist: unicodedata2 ; extra == 'unicode_backport' + + + + +

+ The Real First Universal Charset Detector
+ + + + + + + + Download Count Total + +

+ +> A library that helps you read text from an unknown charset encoding.
Motivated by `chardet`, +> I'm trying to resolve the issue by taking a new approach. +> All IANA character set names for which the Python core library provides codecs are supported. + +

+ >>>>> 👉 Try Me Online Now, Then Adopt Me 👈 <<<<< +

+ +This project offers you an alternative to **Universal Charset Encoding Detector**, also known as **Chardet**. + +| Feature | [Chardet](https://github.com/chardet/chardet) | Charset Normalizer | [cChardet](https://github.com/PyYoshi/cChardet) | +| ------------- | :-------------: | :------------------: | :------------------: | +| `Fast` | ❌
| ✅
| ✅
| +| `Universal**` | ❌ | ✅ | ❌ | +| `Reliable` **without** distinguishable standards | ❌ | ✅ | ✅ | +| `Reliable` **with** distinguishable standards | ✅ | ✅ | ✅ | +| `License` | LGPL-2.1
_restrictive_ | MIT | MPL-1.1
_restrictive_ | +| `Native Python` | ✅ | ✅ | ❌ | +| `Detect spoken language` | ❌ | ✅ | N/A | +| `UnicodeDecodeError Safety` | ❌ | ✅ | ❌ | +| `Whl Size` | 193.6 kB | 39.5 kB | ~200 kB | +| `Supported Encoding` | 33 | :tada: [93](https://charset-normalizer.readthedocs.io/en/latest/user/support.html#supported-encodings) | 40 + +

+Reading Normalized TextCat Reading Text + +*\*\* : They are clearly using specific code for a specific encoding even if covering most of used one*
+Did you got there because of the logs? See [https://charset-normalizer.readthedocs.io/en/latest/user/miscellaneous.html](https://charset-normalizer.readthedocs.io/en/latest/user/miscellaneous.html) + +## ⭐ Your support + +*Fork, test-it, star-it, submit your ideas! We do listen.* + +## ⚡ Performance + +This package offer better performance than its counterpart Chardet. Here are some numbers. + +| Package | Accuracy | Mean per file (ms) | File per sec (est) | +| ------------- | :-------------: | :------------------: | :------------------: | +| [chardet](https://github.com/chardet/chardet) | 86 % | 200 ms | 5 file/sec | +| charset-normalizer | **98 %** | **39 ms** | 26 file/sec | + +| Package | 99th percentile | 95th percentile | 50th percentile | +| ------------- | :-------------: | :------------------: | :------------------: | +| [chardet](https://github.com/chardet/chardet) | 1200 ms | 287 ms | 23 ms | +| charset-normalizer | 400 ms | 200 ms | 15 ms | + +Chardet's performance on larger file (1MB+) are very poor. Expect huge difference on large payload. + +> Stats are generated using 400+ files using default parameters. More details on used files, see GHA workflows. +> And yes, these results might change at any time. The dataset can be updated to include more files. +> The actual delays heavily depends on your CPU capabilities. The factors should remain the same. +> Keep in mind that the stats are generous and that Chardet accuracy vs our is measured using Chardet initial capability +> (eg. Supported Encoding) Challenge-them if you want. + +[cchardet](https://github.com/PyYoshi/cChardet) is a non-native (cpp binding) and unmaintained faster alternative with +a better accuracy than chardet but lower than this package. If speed is the most important factor, you should try it. + +## ✨ Installation + +Using PyPi for latest stable +```sh +pip install charset-normalizer -U +``` + +If you want a more up-to-date `unicodedata` than the one available in your Python setup. +```sh +pip install charset-normalizer[unicode_backport] -U +``` + +## 🚀 Basic Usage + +### CLI +This package comes with a CLI. + +``` +usage: normalizer [-h] [-v] [-a] [-n] [-m] [-r] [-f] [-t THRESHOLD] + file [file ...] + +The Real First Universal Charset Detector. Discover originating encoding used +on text file. Normalize text to unicode. + +positional arguments: + files File(s) to be analysed + +optional arguments: + -h, --help show this help message and exit + -v, --verbose Display complementary information about file if any. + Stdout will contain logs about the detection process. + -a, --with-alternative + Output complementary possibilities if any. Top-level + JSON WILL be a list. + -n, --normalize Permit to normalize input file. If not set, program + does not write anything. + -m, --minimal Only output the charset detected to STDOUT. Disabling + JSON output. + -r, --replace Replace file when trying to normalize it instead of + creating a new one. + -f, --force Replace file without asking if you are sure, use this + flag with caution. + -t THRESHOLD, --threshold THRESHOLD + Define a custom maximum amount of chaos allowed in + decoded content. 0. <= chaos <= 1. + --version Show version information and exit. +``` + +```bash +normalizer ./data/sample.1.fr.srt +``` + +:tada: Since version 1.4.0 the CLI produce easily usable stdout result in JSON format. + +```json +{ + "path": "/home/default/projects/charset_normalizer/data/sample.1.fr.srt", + "encoding": "cp1252", + "encoding_aliases": [ + "1252", + "windows_1252" + ], + "alternative_encodings": [ + "cp1254", + "cp1256", + "cp1258", + "iso8859_14", + "iso8859_15", + "iso8859_16", + "iso8859_3", + "iso8859_9", + "latin_1", + "mbcs" + ], + "language": "French", + "alphabets": [ + "Basic Latin", + "Latin-1 Supplement" + ], + "has_sig_or_bom": false, + "chaos": 0.149, + "coherence": 97.152, + "unicode_path": null, + "is_preferred": true +} +``` + +### Python +*Just print out normalized text* +```python +from charset_normalizer import from_path + +results = from_path('./my_subtitle.srt') + +print(str(results.best())) +``` + +*Normalize any text file* +```python +from charset_normalizer import normalize +try: + normalize('./my_subtitle.srt') # should write to disk my_subtitle-***.srt +except IOError as e: + print('Sadly, we are unable to perform charset normalization.', str(e)) +``` + +*Upgrade your code without effort* +```python +from charset_normalizer import detect +``` + +The above code will behave the same as **chardet**. We ensure that we offer the best (reasonable) BC result possible. + +See the docs for advanced usage : [readthedocs.io](https://charset-normalizer.readthedocs.io/en/latest/) + +## 😇 Why + +When I started using Chardet, I noticed that it was not suited to my expectations, and I wanted to propose a +reliable alternative using a completely different method. Also! I never back down on a good challenge! + +I **don't care** about the **originating charset** encoding, because **two different tables** can +produce **two identical rendered string.** +What I want is to get readable text, the best I can. + +In a way, **I'm brute forcing text decoding.** How cool is that ? 😎 + +Don't confuse package **ftfy** with charset-normalizer or chardet. ftfy goal is to repair unicode string whereas charset-normalizer to convert raw file in unknown encoding to unicode. + +## 🍰 How + + - Discard all charset encoding table that could not fit the binary content. + - Measure chaos, or the mess once opened (by chunks) with a corresponding charset encoding. + - Extract matches with the lowest mess detected. + - Additionally, we measure coherence / probe for a language. + +**Wait a minute**, what is chaos/mess and coherence according to **YOU ?** + +*Chaos :* I opened hundred of text files, **written by humans**, with the wrong encoding table. **I observed**, then +**I established** some ground rules about **what is obvious** when **it seems like** a mess. + I know that my interpretation of what is chaotic is very subjective, feel free to contribute in order to + improve or rewrite it. + +*Coherence :* For each language there is on earth, we have computed ranked letter appearance occurrences (the best we can). So I thought +that intel is worth something here. So I use those records against decoded text to check if I can detect intelligent design. + +## ⚡ Known limitations + + - Language detection is unreliable when text contains two or more languages sharing identical letters. (eg. HTML (english tags) + Turkish content (Sharing Latin characters)) + - Every charset detector heavily depends on sufficient content. In common cases, do not bother run detection on very tiny content. + +## 👤 Contributing + +Contributions, issues and feature requests are very much welcome.
+Feel free to check [issues page](https://github.com/ousret/charset_normalizer/issues) if you want to contribute. + +## 📝 License + +Copyright © 2019 [Ahmed TAHRI @Ousret](https://github.com/Ousret).
+This project is [MIT](https://github.com/Ousret/charset_normalizer/blob/master/LICENSE) licensed. + +Characters frequencies used in this project © 2012 [Denny Vrandečić](http://simia.net/letters/) diff --git a/sbsheriff/Lib/site-packages/charset_normalizer-2.1.1.dist-info/RECORD b/sbsheriff/Lib/site-packages/charset_normalizer-2.1.1.dist-info/RECORD new file mode 100644 index 0000000..3dc101f --- /dev/null +++ b/sbsheriff/Lib/site-packages/charset_normalizer-2.1.1.dist-info/RECORD @@ -0,0 +1,33 @@ +../../Scripts/normalizer.exe,sha256=4lHLDRbNHtHACsL77rO6lAmos0R7Ogw3ZaaZfGEwjhg,106402 +charset_normalizer-2.1.1.dist-info/INSTALLER,sha256=zuuue4knoyJ-UwPPXg8fezS7VCrXJQrAP7zeNuwvFQg,4 +charset_normalizer-2.1.1.dist-info/LICENSE,sha256=6zGgxaT7Cbik4yBV0lweX5w1iidS_vPNcgIT0cz-4kE,1070 +charset_normalizer-2.1.1.dist-info/METADATA,sha256=C99l12g4d1E9_UiW-mqPCWx7v2M_lYGWxy1GTOjXSsA,11942 +charset_normalizer-2.1.1.dist-info/RECORD,, +charset_normalizer-2.1.1.dist-info/WHEEL,sha256=G16H4A3IeoQmnOrYV4ueZGKSjhipXx8zc8nu9FGlvMA,92 +charset_normalizer-2.1.1.dist-info/entry_points.txt,sha256=uYo8aIGLWv8YgWfSna5HnfY_En4pkF1w4bgawNAXzP0,76 +charset_normalizer-2.1.1.dist-info/top_level.txt,sha256=7ASyzePr8_xuZWJsnqJjIBtyV8vhEo0wBCv1MPRRi3Q,19 +charset_normalizer/__init__.py,sha256=jGhhf1IcOgCpZsr593E9fPvjWKnflVqHe_LwkOJjInU,1790 +charset_normalizer/__pycache__/__init__.cpython-310.pyc,, +charset_normalizer/__pycache__/api.cpython-310.pyc,, +charset_normalizer/__pycache__/cd.cpython-310.pyc,, +charset_normalizer/__pycache__/constant.cpython-310.pyc,, +charset_normalizer/__pycache__/legacy.cpython-310.pyc,, +charset_normalizer/__pycache__/md.cpython-310.pyc,, +charset_normalizer/__pycache__/models.cpython-310.pyc,, +charset_normalizer/__pycache__/utils.cpython-310.pyc,, +charset_normalizer/__pycache__/version.cpython-310.pyc,, +charset_normalizer/api.py,sha256=euVPmjAMbjpqhEHPjfKtyy1mK52U0TOUBUQgM_Qy6eE,19191 +charset_normalizer/assets/__init__.py,sha256=r7aakPaRIc2FFG2mw2V8NOTvkl25_euKZ3wPf5SAVa4,15222 +charset_normalizer/assets/__pycache__/__init__.cpython-310.pyc,, +charset_normalizer/cd.py,sha256=Pxdkbn4cy0iZF42KTb1FiWIqqKobuz_fDjGwc6JMNBc,10811 +charset_normalizer/cli/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 +charset_normalizer/cli/__pycache__/__init__.cpython-310.pyc,, +charset_normalizer/cli/__pycache__/normalizer.cpython-310.pyc,, +charset_normalizer/cli/normalizer.py,sha256=FmD1RXeMpRBg_mjR0MaJhNUpM2qZ8wz2neAE7AayBeg,9521 +charset_normalizer/constant.py,sha256=NgU-pY8JH2a9lkVT8oKwAFmIUYNKOuSBwZgF9MrlNCM,19157 +charset_normalizer/legacy.py,sha256=XKeZOts_HdYQU_Jb3C9ZfOjY2CiUL132k9_nXer8gig,3384 +charset_normalizer/md.py,sha256=pZP8IVpSC82D8INA9Tf_y0ijJSRI-UIncZvLdfTWEd4,17642 +charset_normalizer/models.py,sha256=i68YdlSLTEI3EEBVXq8TLNAbyyjrLC2OWszc-OBAk9I,13167 +charset_normalizer/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 +charset_normalizer/utils.py,sha256=ykOznhcAeH-ODLBWJuI7t1nbwa1SAfN_bDYTCJGyh4U,11771 +charset_normalizer/version.py,sha256=_eh2MA3qS__IajlePQxKBmlw6zaBDvPYlLdEgxgIojw,79 diff --git a/sbsheriff/Lib/site-packages/charset_normalizer-2.1.1.dist-info/WHEEL b/sbsheriff/Lib/site-packages/charset_normalizer-2.1.1.dist-info/WHEEL new file mode 100644 index 0000000..becc9a6 --- /dev/null +++ b/sbsheriff/Lib/site-packages/charset_normalizer-2.1.1.dist-info/WHEEL @@ -0,0 +1,5 @@ +Wheel-Version: 1.0 +Generator: bdist_wheel (0.37.1) +Root-Is-Purelib: true +Tag: py3-none-any + diff --git a/sbsheriff/Lib/site-packages/charset_normalizer-2.1.1.dist-info/entry_points.txt b/sbsheriff/Lib/site-packages/charset_normalizer-2.1.1.dist-info/entry_points.txt new file mode 100644 index 0000000..a06d360 --- /dev/null +++ b/sbsheriff/Lib/site-packages/charset_normalizer-2.1.1.dist-info/entry_points.txt @@ -0,0 +1,2 @@ +[console_scripts] +normalizer = charset_normalizer.cli.normalizer:cli_detect diff --git a/sbsheriff/Lib/site-packages/charset_normalizer-2.1.1.dist-info/top_level.txt b/sbsheriff/Lib/site-packages/charset_normalizer-2.1.1.dist-info/top_level.txt new file mode 100644 index 0000000..66958f0 --- /dev/null +++ b/sbsheriff/Lib/site-packages/charset_normalizer-2.1.1.dist-info/top_level.txt @@ -0,0 +1 @@ +charset_normalizer diff --git a/sbsheriff/Lib/site-packages/charset_normalizer/__init__.py b/sbsheriff/Lib/site-packages/charset_normalizer/__init__.py new file mode 100644 index 0000000..2dcaf56 --- /dev/null +++ b/sbsheriff/Lib/site-packages/charset_normalizer/__init__.py @@ -0,0 +1,56 @@ +# -*- coding: utf-8 -*- +""" +Charset-Normalizer +~~~~~~~~~~~~~~ +The Real First Universal Charset Detector. +A library that helps you read text from an unknown charset encoding. +Motivated by chardet, This package is trying to resolve the issue by taking a new approach. +All IANA character set names for which the Python core library provides codecs are supported. + +Basic usage: + >>> from charset_normalizer import from_bytes + >>> results = from_bytes('Bсеки човек има право на образование. Oбразованието!'.encode('utf_8')) + >>> best_guess = results.best() + >>> str(best_guess) + 'Bсеки човек има право на образование. Oбразованието!' + +Others methods and usages are available - see the full documentation +at . +:copyright: (c) 2021 by Ahmed TAHRI +:license: MIT, see LICENSE for more details. +""" +import logging + +from .api import from_bytes, from_fp, from_path, normalize +from .legacy import ( + CharsetDetector, + CharsetDoctor, + CharsetNormalizerMatch, + CharsetNormalizerMatches, + detect, +) +from .models import CharsetMatch, CharsetMatches +from .utils import set_logging_handler +from .version import VERSION, __version__ + +__all__ = ( + "from_fp", + "from_path", + "from_bytes", + "normalize", + "detect", + "CharsetMatch", + "CharsetMatches", + "CharsetNormalizerMatch", + "CharsetNormalizerMatches", + "CharsetDetector", + "CharsetDoctor", + "__version__", + "VERSION", + "set_logging_handler", +) + +# Attach a NullHandler to the top level logger by default +# https://docs.python.org/3.3/howto/logging.html#configuring-logging-for-a-library + +logging.getLogger("charset_normalizer").addHandler(logging.NullHandler()) diff --git a/sbsheriff/Lib/site-packages/charset_normalizer/__pycache__/__init__.cpython-310.pyc b/sbsheriff/Lib/site-packages/charset_normalizer/__pycache__/__init__.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..9d9ab3191fa7ba5b41a5c36ca40e6aab1cd9b64c GIT binary patch literal 1727 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 literal 0 HcmV?d00001 diff --git a/sbsheriff/Lib/site-packages/charset_normalizer/__pycache__/legacy.cpython-310.pyc b/sbsheriff/Lib/site-packages/charset_normalizer/__pycache__/legacy.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..8cb3fc66539a2180758cec3a523021a8c835f495 GIT binary patch literal 2907 zcmbVO&2JmW72nxil1qxD69jmNf4+7leXrwre<$Jm(}ZvbOaBE#c!K3#Ouv543P1LXAP$N!4w)wc5$3g`9@mRT z+$f?rDw=WA?bq^Fu@PTVQFaTjt!UJ#M=<+==H2>Qmzzv5l-h>k+h6s;#= zyz!AI)C)%=e8pIbNcSIL*S9T$9LcSo@A+O6#$ZtY^Lu^3aaPlR=9(cWrpCW#* z-wSNGlcmN+cc&(+$|Se7MTC|g(3 z%v70@_tjGaLu(sL{}se|bI&m2kNi_#ubV)yr=h9My;Js#owDDvh5po6SBy`)C!VR( z@6*OJ?}W{n@Mlb2owJXl68wq3+_{CFrU>=}k{B<_DV~+s!MUK@;uP^T zPs$Q5u+5b$s)HooYPnBtPZO0CE~C_fx2ZDxAu_+nvHWC)5=e?oK2D0PT;}ok*6!me zf`iR!=%SogZFGW z(AgLh8Let=BSbx(C1Yt@IQu9Q6iTmSTba&EZ4yYfdFIB}h}E|F5Mk^pRbieMX|N$h zrs{BK!=c16FM?H@AaM^=b;h=UJv+zNFs7&T~(F8$X}@cKi0;BQ2HQ zdw>Rfytg9{_OwB|hbkK<0)vbSWTVlZ9>fOZ{ zY)y}B9es$@64vUgAl;VFeAZ&&zgxA4wfznMTkI0M6h^Eb*8fxYNn8J?`VL-Av0ixy zN$z01XoE;EX2Oeo2Z28DY7s?$g<;C!Q~xn5(52v}7DakLGI zvl}~0puhnCdZAJc1pVB%VWRL_ozQKpKc9Yj=f`wH>g13b!w>(}tsOgbL%)5l(o%0N zkM^axQs0Lq^#hPzsIC)#gUA*UnkV%x5gLpI;lz>R17dy%a{Ts}6=>nyrSog~kI2RA z{FCCNGyiXWwSOw%*K$wu`C9j+xc7g!KkJ!(FH+y54`|xeH4xiA-+-?6i*&m)JI^n3 z?l?}L_CRi7=?##`Bhc`p)#@^*f90%r&09f)dJ6*ntXx>;YjF!#s;|Ba#km^4^hds8 zQocikr2lEXv$9^L0L`zkO?~{EGutHfzTrC1)`8|27DY3y0wOfoHb|z~B1tp`>MT=n zL>DJ+3*!LZ)`4d-*J_R4B3M+H-RHO#Y;BZRiE&WskjrJv9ZXRKuSObnQpUt76dAF?6>X~we^XXc)o-60-`EtHKP#&lcmIv!Y<)M0^ zT&Qm;Z>bl{#roFr*7|UHxIR)IsgIUN>)XoP>f6iP>tp4y`i}ArEp;{}ERngF5}CVt zc_(sNkwY%$?YwK0cOjn_1IQ0>emC-iVhH&m&hJ6KAhsaCh4XunFN&?mZ{_?`$PbGV z$Lh+vQOBXL*nsla4O`LH~O^u&F?~I>2b@|lzl{1&8 zqJ38<&yQa^ea4wOGk$6E^r_45JC{#Qo;~Bdb>{u|E?qudDn4Ls+DD}8sS=0z5jT$_&u@b>D>(62NbQ4X0ow^41?xO~o+Zq;qLoSAn+ zcb+oTYt0S)29LMUYE)=A%p@8_P2erK(hZxEI}2{tXPUJrgNks@_4$idV?p|jkg*t& z82g47V;v2(8o)z%jsy~3g=p9RGm$xoCwLpcOO-W|D(gZk8$$O?VR-3TQ1}fMK{9$mEKRi{d#Z^ri*cY!(U9r7e zq1O<$i^s1o)Vw;@%dYx2yasv-=b9q^G|E-xK*~z!$;gsk*piKkj)`}El%}0Cj^`nf zCQSXBR?-$v^1y^OO-0uIhG+Y;@d({6?O?9istJ3>vu806zoGD@&mL&e$Ye7--$Bk3 zXQXV(2iUlQSDTePG1h~WwDEd0J^tGC)xeX%^i(MQThph#8`A-(SD%r7)x}B%bDs2P zXQzXiPU?a`GadM$_uPV8nRlyRFil7WUg$LNom=x4J^6fH99_5_WxbkT^|4*|VXTKV zVbfgPy>^w3cG^v@OCh-%UxPZIbg6S?&a>;T->_w~h28AgVUwug-SR3eaF5+uz+!gk z)g#aO2Id>uAwI7)t9}Kvvv2xgWsZwNEU$gDLs~FZ;0sTpJM=_c*6T;^0Y>sE0(KYd zM=COBJx?4$D&Q%n7snE&Ol>N({+%DCJNuzC+c&zieVcXyux{GY1FacXwNt5#CgV5! z(06Ng5JGsYLi2$pX$e*%n&!T~Of^pfEbd6albdXa=*L||$D8#9(4SEvnguq*iI1fL z3kn-ca&yiN?c2?k#K!f+k&-><26o_ieLMJKD+uk$OIK(;Yt5UUL~m}xe&OiX>`5j7 z_G*PhmR$`|+8tXh2~mFSObLmvphm5Ul{{B!^gx%p&~CCc7-b!&;nqFJiSmw9Z;Dop z(u0n3z2(;8nvCO!W(CCtq)TMZG@CVffG{{n;2D4@yC9nj*mJj|^lYu^hVn2~*((9< z9JvF4*fS^qWK*U#oF2CF8QmJyxNcpM`tV(R&=si#Quz>-hDbxOYAjeuRg+-l5}`w| zlDa0rT3|)31gpk^l@v88%K@Q7ux^R$E6wIbw{d%l)xjnCc28+2F{>!HW|z?RC-D{# zL4?*$ISOi=)5dMIsNMR&nQW6JDl+w|#)2Er7O0(4nqajD>qc~f1y4)R?j6$&m zq0`k*+@QSOnUx+iLFa3~;oNLWA(QqAR-E|AagGt%WMWww|LJ*cv9u8xj&{Cg8M{W7 zb;$8Bi+WlpQrxTb6&w*z{6DjGeN6Mot)1BsQKbJ}yEfip3 zMpEt@cmi6xyl!fF!_>?#isojfNs?F|!G{k9WeG3&EP*c(c$L6&1db9oK%gsZ<@1y! zGORCUNez4rPb_8g+HiK*$PepjNLi{|SIWv?LM`Osj(C|)^^EmR$-#$3e7|DvfFtAy z6hi3`r6KnE4ggB3CCMqK!8|@-!;!bn{`GL$q)?JyMR)R-0dU*_@42-Fm~~0aMg(tC zW0H}J>yNv!03yp{r2q=CJ0WgHxfEvu79UU)*r_Bd!C)jjI{T93sGJ~>geUI_R0h-x zLO~za%*Ts+*QL`F*AQPq2^a`&Qls_Q=IW|jo|{qI4oP03NoUt zPSAo%3j%mE`q(AfrtE6=8ug6sL>Wk2^v5*Iu2rKi9@zl#4LGZ_!U1VdWi~f6N>M<2 zvc}ToIn+sNkf;g{pyG2pyt^RPHpFOS-V4#)O5H`4mPoZU`EsZ;PtqG@;LewUw(%LX z2IV^`aA?<{4%74nAh(C@_A>X~t?wDoijOU|Z|T%0X(N-yZY|)DDX&ryEp;Lxh_%0m zC!mui>BQJjhH*Tc2BYf*GD8n;v|vwUeK|#=lT{9{&eC>~$$U;HC_P^OSP$5ILBW@Y)uw#RlZHDXzX)q|uXXWfL7YLpHR#cd~) z123-cIq@b!IPPMH-b9$|OXquO-WeTfss$HmcL1{iNZ$9uL28Hh5WVH!k#$25mQNwZ ztPpOYQj)h^UTo_;54?p5FV*j%)@bXyQzAWY$|W9ctFo(vwKIiYsf9-A`@^uXkVEey zaqlClJ^IR^ukWFyNid;B>e^QMS6nk1f2({D+dB9$R**8_fUU91I*YU>a)5@KwaCL| z`tO+i_SiN0;}DKg;P{gm4;s0)!?u;_-JuwBC9`9`vorn^H^-sR)Dt~Q0L_} z7~&!uC258ov5AEy^Yokec7m6$l$E?bOjKSPrYDhHQJX2tgiexSq*Grf^3j6EGK?mQ zKS;1$iPKuEXwgAW(b9^5JxI}Na*$a{$1!A3803VXQFTj4k8M z`y~l)Ql4iCZwrZ0axv-aVY>;v>7bLJ;pyqk0`%r9dL9RAsw0F}{7mFd;t9we>t2>o z{K1wu?!Xk5mqzSCf7}6=2m=>par^;VbL2re=jG9M0FekoqQDnsOfE!njE-NMKi{~4 z%WyFjHW!peZv6nm@?GWGH;#BNnSwt7$j<4RYjb>=i;({1q2|Ppv_ocW!_1wV6H!8Zp6G!bS z&y^L7UFFaR>IU%}60r~%**^T^zxentM>ZgJ@36X9-RJ~z8ncRh*l-}+l%(Sc>8_$j zm`cxSuz_a2irt|caC?(T_zTv<@6%{X4=0Y6sE5fmHSmn%3BC$|`xFi5iXqk>xKUwE z!IC}pX7Az}*j8NA^=9L`^Eh?ZqTWFH_uBcf5}L71xjgX^@S2$L;U}5m0IZK65&GV)7^bOJxt#2 z412q&c3pwgxmOxH1>SW1%2o2@T%f>*&Drut(RqSWBGuHf3=jxnP@{lsc#)<>wEvgM1aPrhM7z?s*8-QPJ1 zaJ-w-Y}9Ti?mx2Ln?z(XTS&z#yPYj}dmZZif`vvK!z-b&?tqDMgS1aqZX84>%6{*- zGGYJ1U*AeC8Er$3gFzrKVDYMy0j2yUw1*Fo+91uoLzRL}Nq$3%r3!Ow?uAqxqq-=%qs?_XlCy&!Gfw+2#^h z`<%)O>gg7bWeJ6mrB02F43C*@;7o$CVLJowEb|G zt;ReBL?&6UAJQhAKvzYwU15DH>k^R%>}0VXTc$F|$PzX6?KocMaREtoYZgx)c4`*x zSJ!aXA(f1`T#rTsN#IK-6p{KiYiP!CKnT~N3%Ob zt|YNbTHrw+7qaCUTc3N^o5<$X!pg{nj#}umIAg~yqnm^usf8a9eqFVoFRqVQS2L`C zkGY5r8=VPfaX&RY1j+uao`b1Lb<5byd~aTNZv_+p`2h;$HwcirTM>ejK>^7EwjXBD zX`6XEz*(Dl8#X1G+--{BD3bXtz=yCecHvES#x5=c|K5Oy4?IO>2Yc;;FURd(5f-<3 z32$oiiZbQzBVPM6oI%xF*Ozoi9Q}0agTj*8HbZLp=JoNm*(P7I{yNbD&F+1&!ePe6Ln3-D$n&d1*8k=e=~0XVch;Bg_RhX*Mm>c zKi+6VvsV3nSG5bi3k(MF{rAy^-vag)#{C>`>i19hn*x{psVH#S_qmKi*cM&3idRI` zhBuq`RTZ#|7)AKnISSEkPy{GqDm_Gd+f7)=(vFSkzGzSiS?s!Tm7P3!WulzEfX&n> z=g!0t*+Dsnc*q%qlr^f4G#gja*>jzs?Ce{eh-_p0&9@@!90zVM4j@(;L8;sk?4RGD zJ@o4U(Li6+T{%60Sla;or32gqhLScF__@37%Efu_HbuDwu`|io&CSa{)1Zy@f-R z7i|R#`t?>F0qc-BbIqEF(!!f*RV$=?J3lh3(|DK({}l;=ll(ngrqh+dX}Fc(_J`nv z^UD}ZEg>v@DcweBIvmYAgtcTfa>!+%l=q1&a=OSZS%{RwzdVekLa@(AU(L0Yv=B#+h9I<3@M9JTI%`>?JPFEDbKdEZEHLJT>^}75o!1lcBH@z(_u#a z;{^4Bel=hMriVKVhJQo5{%l*9^E^UsDG!HT{#p)C{;rO`-Eg3t7KOWt1#U76bmDVe z75A=!b5;1di*q7V)1J8<;!N40=~4R%&WSNyarBJost%rfK2^t23j8Hu+5qp!n(s-) z7%Rd;JEx~9(41YcRmi#z(&Wd#oBCA04pe*l4f|U^`a(Hd7Y@hl_i8x2B+4JF;Xg4d zh&Vo;L&xgQnask+i%(HhKlVP*IeM(tthlw{I1-)aY)SA{p-(=LWgFqmsXMd)8ky^Hwm>wLV6k3ZHY!%s;@?(k6%L1u(mtFTx1wyPOZodWjNJwMk&5!Yjy0mmYbdlJC#=VVrU^64 zVku(kyXgK3fBGG|-@==nd&36FBK;0pLTco7`8htH#0q>H?}^gkC^t)?%ZSkqBrRiP zg|``i4GlC4fYn$y8sc~j{`qFkzce(gC@ zN2r25tlKC>yM`|Vc>y`#kYk}Z2t?8)vHUs#a$!k2HnN4$7w|}OP`*HbX4gkRo3c#B z>@gLsejH*t6`TYZgrQp0&uN9x;(_Ax#a+c6#Y4rH@PA(WvKMrg%PgDq!7s8Cx^6xu L8Qp#K;urr10G0&3 literal 0 HcmV?d00001 diff --git a/sbsheriff/Lib/site-packages/charset_normalizer/__pycache__/models.cpython-310.pyc b/sbsheriff/Lib/site-packages/charset_normalizer/__pycache__/models.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..9cc16bae1f283a1a38e7331239a9baf567b21cf6 GIT binary patch literal 13266 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 literal 0 HcmV?d00001 diff --git a/sbsheriff/Lib/site-packages/charset_normalizer/__pycache__/version.cpython-310.pyc b/sbsheriff/Lib/site-packages/charset_normalizer/__pycache__/version.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..b0458e600438a8e05319c685e54caf12c5cfbae6 GIT binary patch literal 275 zcmd1j<>g`kg3aoZ$^Jn4F^GcKWc*)brD1xy2qIpOT*(AAgHGJ|3z9$YCum z$jL0Z#UADw6zu8mx00cV4QL0L_?75v6%$$vG%O~#q$sl@#wE2Zrnn@(C^xAnGd(dS zHNH3_wJ0+!Ev7gL#`4KbiYd-4N!2Y#OwLYBPc4o~&PXgOPA!Sg1L{l6$*f8((udlv cS5SG2!zMRBr8FnijuGTNkku> CharsetMatches: + """ + Given a raw bytes sequence, return the best possibles charset usable to render str objects. + If there is no results, it is a strong indicator that the source is binary/not text. + By default, the process will extract 5 blocs of 512o each to assess the mess and coherence of a given sequence. + And will give up a particular code page after 20% of measured mess. Those criteria are customizable at will. + + The preemptive behavior DOES NOT replace the traditional detection workflow, it prioritize a particular code page + but never take it for granted. Can improve the performance. + + You may want to focus your attention to some code page or/and not others, use cp_isolation and cp_exclusion for that + purpose. + + This function will strip the SIG in the payload/sequence every time except on UTF-16, UTF-32. + By default the library does not setup any handler other than the NullHandler, if you choose to set the 'explain' + toggle to True it will alter the logger configuration to add a StreamHandler that is suitable for debugging. + Custom logging format and handler can be set manually. + """ + + if not isinstance(sequences, (bytearray, bytes)): + raise TypeError( + "Expected object of type bytes or bytearray, got: {0}".format( + type(sequences) + ) + ) + + if explain: + previous_logger_level: int = logger.level + logger.addHandler(explain_handler) + logger.setLevel(TRACE) + + length: int = len(sequences) + + if length == 0: + logger.debug("Encoding detection on empty bytes, assuming utf_8 intention.") + if explain: + logger.removeHandler(explain_handler) + logger.setLevel(previous_logger_level or logging.WARNING) + return CharsetMatches([CharsetMatch(sequences, "utf_8", 0.0, False, [], "")]) + + if cp_isolation is not None: + logger.log( + TRACE, + "cp_isolation is set. use this flag for debugging purpose. " + "limited list of encoding allowed : %s.", + ", ".join(cp_isolation), + ) + cp_isolation = [iana_name(cp, False) for cp in cp_isolation] + else: + cp_isolation = [] + + if cp_exclusion is not None: + logger.log( + TRACE, + "cp_exclusion is set. use this flag for debugging purpose. " + "limited list of encoding excluded : %s.", + ", ".join(cp_exclusion), + ) + cp_exclusion = [iana_name(cp, False) for cp in cp_exclusion] + else: + cp_exclusion = [] + + if length <= (chunk_size * steps): + logger.log( + TRACE, + "override steps (%i) and chunk_size (%i) as content does not fit (%i byte(s) given) parameters.", + steps, + chunk_size, + length, + ) + steps = 1 + chunk_size = length + + if steps > 1 and length / steps < chunk_size: + chunk_size = int(length / steps) + + is_too_small_sequence: bool = len(sequences) < TOO_SMALL_SEQUENCE + is_too_large_sequence: bool = len(sequences) >= TOO_BIG_SEQUENCE + + if is_too_small_sequence: + logger.log( + TRACE, + "Trying to detect encoding from a tiny portion of ({}) byte(s).".format( + length + ), + ) + elif is_too_large_sequence: + logger.log( + TRACE, + "Using lazy str decoding because the payload is quite large, ({}) byte(s).".format( + length + ), + ) + + prioritized_encodings: List[str] = [] + + specified_encoding: Optional[str] = ( + any_specified_encoding(sequences) if preemptive_behaviour else None + ) + + if specified_encoding is not None: + prioritized_encodings.append(specified_encoding) + logger.log( + TRACE, + "Detected declarative mark in sequence. Priority +1 given for %s.", + specified_encoding, + ) + + tested: Set[str] = set() + tested_but_hard_failure: List[str] = [] + tested_but_soft_failure: List[str] = [] + + fallback_ascii: Optional[CharsetMatch] = None + fallback_u8: Optional[CharsetMatch] = None + fallback_specified: Optional[CharsetMatch] = None + + results: CharsetMatches = CharsetMatches() + + sig_encoding, sig_payload = identify_sig_or_bom(sequences) + + if sig_encoding is not None: + prioritized_encodings.append(sig_encoding) + logger.log( + TRACE, + "Detected a SIG or BOM mark on first %i byte(s). Priority +1 given for %s.", + len(sig_payload), + sig_encoding, + ) + + prioritized_encodings.append("ascii") + + if "utf_8" not in prioritized_encodings: + prioritized_encodings.append("utf_8") + + for encoding_iana in prioritized_encodings + IANA_SUPPORTED: + + if cp_isolation and encoding_iana not in cp_isolation: + continue + + if cp_exclusion and encoding_iana in cp_exclusion: + continue + + if encoding_iana in tested: + continue + + tested.add(encoding_iana) + + decoded_payload: Optional[str] = None + bom_or_sig_available: bool = sig_encoding == encoding_iana + strip_sig_or_bom: bool = bom_or_sig_available and should_strip_sig_or_bom( + encoding_iana + ) + + if encoding_iana in {"utf_16", "utf_32"} and not bom_or_sig_available: + logger.log( + TRACE, + "Encoding %s wont be tested as-is because it require a BOM. Will try some sub-encoder LE/BE.", + encoding_iana, + ) + continue + + try: + is_multi_byte_decoder: bool = is_multi_byte_encoding(encoding_iana) + except (ModuleNotFoundError, ImportError): + logger.log( + TRACE, + "Encoding %s does not provide an IncrementalDecoder", + encoding_iana, + ) + continue + + try: + if is_too_large_sequence and is_multi_byte_decoder is False: + str( + sequences[: int(50e4)] + if strip_sig_or_bom is False + else sequences[len(sig_payload) : int(50e4)], + encoding=encoding_iana, + ) + else: + decoded_payload = str( + sequences + if strip_sig_or_bom is False + else sequences[len(sig_payload) :], + encoding=encoding_iana, + ) + except (UnicodeDecodeError, LookupError) as e: + if not isinstance(e, LookupError): + logger.log( + TRACE, + "Code page %s does not fit given bytes sequence at ALL. %s", + encoding_iana, + str(e), + ) + tested_but_hard_failure.append(encoding_iana) + continue + + similar_soft_failure_test: bool = False + + for encoding_soft_failed in tested_but_soft_failure: + if is_cp_similar(encoding_iana, encoding_soft_failed): + similar_soft_failure_test = True + break + + if similar_soft_failure_test: + logger.log( + TRACE, + "%s is deemed too similar to code page %s and was consider unsuited already. Continuing!", + encoding_iana, + encoding_soft_failed, + ) + continue + + r_ = range( + 0 if not bom_or_sig_available else len(sig_payload), + length, + int(length / steps), + ) + + multi_byte_bonus: bool = ( + is_multi_byte_decoder + and decoded_payload is not None + and len(decoded_payload) < length + ) + + if multi_byte_bonus: + logger.log( + TRACE, + "Code page %s is a multi byte encoding table and it appear that at least one character " + "was encoded using n-bytes.", + encoding_iana, + ) + + max_chunk_gave_up: int = int(len(r_) / 4) + + max_chunk_gave_up = max(max_chunk_gave_up, 2) + early_stop_count: int = 0 + lazy_str_hard_failure = False + + md_chunks: List[str] = [] + md_ratios = [] + + try: + for chunk in cut_sequence_chunks( + sequences, + encoding_iana, + r_, + chunk_size, + bom_or_sig_available, + strip_sig_or_bom, + sig_payload, + is_multi_byte_decoder, + decoded_payload, + ): + md_chunks.append(chunk) + + md_ratios.append(mess_ratio(chunk, threshold)) + + if md_ratios[-1] >= threshold: + early_stop_count += 1 + + if (early_stop_count >= max_chunk_gave_up) or ( + bom_or_sig_available and strip_sig_or_bom is False + ): + break + except UnicodeDecodeError as e: # Lazy str loading may have missed something there + logger.log( + TRACE, + "LazyStr Loading: After MD chunk decode, code page %s does not fit given bytes sequence at ALL. %s", + encoding_iana, + str(e), + ) + early_stop_count = max_chunk_gave_up + lazy_str_hard_failure = True + + # We might want to check the sequence again with the whole content + # Only if initial MD tests passes + if ( + not lazy_str_hard_failure + and is_too_large_sequence + and not is_multi_byte_decoder + ): + try: + sequences[int(50e3) :].decode(encoding_iana, errors="strict") + except UnicodeDecodeError as e: + logger.log( + TRACE, + "LazyStr Loading: After final lookup, code page %s does not fit given bytes sequence at ALL. %s", + encoding_iana, + str(e), + ) + tested_but_hard_failure.append(encoding_iana) + continue + + mean_mess_ratio: float = sum(md_ratios) / len(md_ratios) if md_ratios else 0.0 + if mean_mess_ratio >= threshold or early_stop_count >= max_chunk_gave_up: + tested_but_soft_failure.append(encoding_iana) + logger.log( + TRACE, + "%s was excluded because of initial chaos probing. Gave up %i time(s). " + "Computed mean chaos is %f %%.", + encoding_iana, + early_stop_count, + round(mean_mess_ratio * 100, ndigits=3), + ) + # Preparing those fallbacks in case we got nothing. + if ( + encoding_iana in ["ascii", "utf_8", specified_encoding] + and not lazy_str_hard_failure + ): + fallback_entry = CharsetMatch( + sequences, encoding_iana, threshold, False, [], decoded_payload + ) + if encoding_iana == specified_encoding: + fallback_specified = fallback_entry + elif encoding_iana == "ascii": + fallback_ascii = fallback_entry + else: + fallback_u8 = fallback_entry + continue + + logger.log( + TRACE, + "%s passed initial chaos probing. Mean measured chaos is %f %%", + encoding_iana, + round(mean_mess_ratio * 100, ndigits=3), + ) + + if not is_multi_byte_decoder: + target_languages: List[str] = encoding_languages(encoding_iana) + else: + target_languages = mb_encoding_languages(encoding_iana) + + if target_languages: + logger.log( + TRACE, + "{} should target any language(s) of {}".format( + encoding_iana, str(target_languages) + ), + ) + + cd_ratios = [] + + # We shall skip the CD when its about ASCII + # Most of the time its not relevant to run "language-detection" on it. + if encoding_iana != "ascii": + for chunk in md_chunks: + chunk_languages = coherence_ratio( + chunk, 0.1, ",".join(target_languages) if target_languages else None + ) + + cd_ratios.append(chunk_languages) + + cd_ratios_merged = merge_coherence_ratios(cd_ratios) + + if cd_ratios_merged: + logger.log( + TRACE, + "We detected language {} using {}".format( + cd_ratios_merged, encoding_iana + ), + ) + + results.append( + CharsetMatch( + sequences, + encoding_iana, + mean_mess_ratio, + bom_or_sig_available, + cd_ratios_merged, + decoded_payload, + ) + ) + + if ( + encoding_iana in [specified_encoding, "ascii", "utf_8"] + and mean_mess_ratio < 0.1 + ): + logger.debug( + "Encoding detection: %s is most likely the one.", encoding_iana + ) + if explain: + logger.removeHandler(explain_handler) + logger.setLevel(previous_logger_level) + return CharsetMatches([results[encoding_iana]]) + + if encoding_iana == sig_encoding: + logger.debug( + "Encoding detection: %s is most likely the one as we detected a BOM or SIG within " + "the beginning of the sequence.", + encoding_iana, + ) + if explain: + logger.removeHandler(explain_handler) + logger.setLevel(previous_logger_level) + return CharsetMatches([results[encoding_iana]]) + + if len(results) == 0: + if fallback_u8 or fallback_ascii or fallback_specified: + logger.log( + TRACE, + "Nothing got out of the detection process. Using ASCII/UTF-8/Specified fallback.", + ) + + if fallback_specified: + logger.debug( + "Encoding detection: %s will be used as a fallback match", + fallback_specified.encoding, + ) + results.append(fallback_specified) + elif ( + (fallback_u8 and fallback_ascii is None) + or ( + fallback_u8 + and fallback_ascii + and fallback_u8.fingerprint != fallback_ascii.fingerprint + ) + or (fallback_u8 is not None) + ): + logger.debug("Encoding detection: utf_8 will be used as a fallback match") + results.append(fallback_u8) + elif fallback_ascii: + logger.debug("Encoding detection: ascii will be used as a fallback match") + results.append(fallback_ascii) + + if results: + logger.debug( + "Encoding detection: Found %s as plausible (best-candidate) for content. With %i alternatives.", + results.best().encoding, # type: ignore + len(results) - 1, + ) + else: + logger.debug("Encoding detection: Unable to determine any suitable charset.") + + if explain: + logger.removeHandler(explain_handler) + logger.setLevel(previous_logger_level) + + return results + + +def from_fp( + fp: BinaryIO, + steps: int = 5, + chunk_size: int = 512, + threshold: float = 0.20, + cp_isolation: Optional[List[str]] = None, + cp_exclusion: Optional[List[str]] = None, + preemptive_behaviour: bool = True, + explain: bool = False, +) -> CharsetMatches: + """ + Same thing than the function from_bytes but using a file pointer that is already ready. + Will not close the file pointer. + """ + return from_bytes( + fp.read(), + steps, + chunk_size, + threshold, + cp_isolation, + cp_exclusion, + preemptive_behaviour, + explain, + ) + + +def from_path( + path: "PathLike[Any]", + steps: int = 5, + chunk_size: int = 512, + threshold: float = 0.20, + cp_isolation: Optional[List[str]] = None, + cp_exclusion: Optional[List[str]] = None, + preemptive_behaviour: bool = True, + explain: bool = False, +) -> CharsetMatches: + """ + Same thing than the function from_bytes but with one extra step. Opening and reading given file path in binary mode. + Can raise IOError. + """ + with open(path, "rb") as fp: + return from_fp( + fp, + steps, + chunk_size, + threshold, + cp_isolation, + cp_exclusion, + preemptive_behaviour, + explain, + ) + + +def normalize( + path: "PathLike[Any]", + steps: int = 5, + chunk_size: int = 512, + threshold: float = 0.20, + cp_isolation: Optional[List[str]] = None, + cp_exclusion: Optional[List[str]] = None, + preemptive_behaviour: bool = True, +) -> CharsetMatch: + """ + Take a (text-based) file path and try to create another file next to it, this time using UTF-8. + """ + warnings.warn( + "normalize is deprecated and will be removed in 3.0", + DeprecationWarning, + ) + + results = from_path( + path, + steps, + chunk_size, + threshold, + cp_isolation, + cp_exclusion, + preemptive_behaviour, + ) + + filename = basename(path) + target_extensions = list(splitext(filename)) + + if len(results) == 0: + raise IOError( + 'Unable to normalize "{}", no encoding charset seems to fit.'.format( + filename + ) + ) + + result = results.best() + + target_extensions[0] += "-" + result.encoding # type: ignore + + with open( + "{}".format(str(path).replace(filename, "".join(target_extensions))), "wb" + ) as fp: + fp.write(result.output()) # type: ignore + + return result # type: ignore diff --git a/sbsheriff/Lib/site-packages/charset_normalizer/assets/__init__.py b/sbsheriff/Lib/site-packages/charset_normalizer/assets/__init__.py new file mode 100644 index 0000000..3c33ba3 --- /dev/null +++ b/sbsheriff/Lib/site-packages/charset_normalizer/assets/__init__.py @@ -0,0 +1,1122 @@ +# -*- coding: utf-8 -*- +from typing import Dict, List + +FREQUENCIES: Dict[str, List[str]] = { + "English": [ + "e", + "a", + "t", + "i", + "o", + "n", + "s", + "r", + "h", + "l", + "d", + "c", + "u", + "m", + "f", + "p", + "g", + "w", + "y", + "b", + "v", + "k", + "x", + "j", + "z", + "q", + ], + "German": [ + "e", + "n", + "i", + "r", + "s", + "t", + "a", + "d", + "h", + "u", + "l", + "g", + "o", + "c", + "m", + "b", + "f", + "k", + "w", + "z", + "p", + "v", + "ü", + "ä", + "ö", + "j", + ], + "French": [ + "e", + "a", + "s", + "n", + "i", + "t", + "r", + "l", + "u", + "o", + "d", + "c", + "p", + "m", + "é", + "v", + "g", + "f", + "b", + "h", + "q", + "à", + "x", + "è", + "y", + "j", + ], + "Dutch": [ + "e", + "n", + "a", + "i", + "r", + "t", + "o", + "d", + "s", + "l", + "g", + "h", + "v", + "m", + "u", + "k", + "c", + "p", + "b", + "w", + "j", + "z", + "f", + "y", + "x", + "ë", + ], + "Italian": [ + "e", + "i", + "a", + "o", + "n", + "l", + "t", + "r", + "s", + "c", + "d", + "u", + "p", + "m", + "g", + "v", + "f", + "b", + "z", + "h", + "q", + "è", + "à", + "k", + "y", + "ò", + ], + "Polish": [ + "a", + "i", + "o", + "e", + "n", + "r", + "z", + "w", + "s", + "c", + "t", + "k", + "y", + "d", + "p", + "m", + "u", + "l", + "j", + "ł", + "g", + "b", + "h", + "ą", + "ę", + "ó", + ], + "Spanish": [ + "e", + "a", + "o", + "n", + "s", + "r", + "i", + "l", + "d", + "t", + "c", + "u", + "m", + "p", + "b", + "g", + "v", + "f", + "y", + "ó", + "h", + "q", + "í", + "j", + "z", + "á", + ], + "Russian": [ + "о", + "а", + "е", + "и", + "н", + "с", + "т", + "р", + "в", + "л", + "к", + "м", + "д", + "п", + "у", + "г", + "я", + "ы", + "з", + "б", + "й", + "ь", + "ч", + "х", + "ж", + "ц", + ], + "Japanese": [ + "の", + "に", + "る", + "た", + "は", + "ー", + "と", + "し", + "を", + "で", + "て", + "が", + "い", + "ン", + "れ", + "な", + "年", + "ス", + "っ", + "ル", + "か", + "ら", + "あ", + "さ", + "も", + "り", + ], + "Portuguese": [ + "a", + "e", + "o", + "s", + "i", + "r", + "d", + "n", + "t", + "m", + "u", + "c", + "l", + "p", + "g", + "v", + "b", + "f", + "h", + "ã", + "q", + "é", + "ç", + "á", + "z", + "í", + ], + "Swedish": [ + "e", + "a", + "n", + "r", + "t", + "s", + "i", + "l", + "d", + "o", + "m", + "k", + "g", + "v", + "h", + "f", + "u", + "p", + "ä", + "c", + "b", + "ö", + "å", + "y", + "j", + "x", + ], + "Chinese": [ + "的", + "一", + "是", + "不", + "了", + "在", + "人", + "有", + "我", + "他", + "这", + "个", + "们", + "中", + "来", + "上", + "大", + "为", + "和", + "国", + "地", + "到", + "以", + "说", + "时", + "要", + "就", + "出", + "会", + ], + "Ukrainian": [ + "о", + "а", + "н", + "і", + "и", + "р", + "в", + "т", + "е", + "с", + "к", + "л", + "у", + "д", + "м", + "п", + "з", + "я", + "ь", + "б", + "г", + "й", + "ч", + "х", + "ц", + "ї", + ], + "Norwegian": [ + "e", + "r", + "n", + "t", + "a", + "s", + "i", + "o", + "l", + "d", + "g", + "k", + "m", + "v", + "f", + "p", + "u", + "b", + "h", + "å", + "y", + "j", + "ø", + "c", + "æ", + "w", + ], + "Finnish": [ + "a", + "i", + "n", + "t", + "e", + "s", + "l", + "o", + "u", + "k", + "ä", + "m", + "r", + "v", + "j", + "h", + "p", + "y", + "d", + "ö", + "g", + "c", + "b", + "f", + "w", + "z", + ], + "Vietnamese": [ + "n", + "h", + "t", + "i", + "c", + "g", + "a", + "o", + "u", + "m", + "l", + "r", + "à", + "đ", + "s", + "e", + "v", + "p", + "b", + "y", + "ư", + "d", + "á", + "k", + "ộ", + "ế", + ], + "Czech": [ + "o", + "e", + "a", + "n", + "t", + "s", + "i", + "l", + "v", + "r", + "k", + "d", + "u", + "m", + "p", + "í", + "c", + "h", + "z", + "á", + "y", + "j", + "b", + "ě", + "é", + "ř", + ], + "Hungarian": [ + "e", + "a", + "t", + "l", + "s", + "n", + "k", + "r", + "i", + "o", + "z", + "á", + "é", + "g", + "m", + "b", + "y", + "v", + "d", + "h", + "u", + "p", + "j", + "ö", + "f", + "c", + ], + "Korean": [ + "이", + "다", + "에", + "의", + "는", + "로", + "하", + "을", + "가", + "고", + "지", + "서", + "한", + "은", + "기", + "으", + "년", + "대", + "사", + "시", + "를", + "리", + "도", + "인", + "스", + "일", + ], + "Indonesian": [ + "a", + "n", + "e", + "i", + "r", + "t", + "u", + "s", + "d", + "k", + "m", + "l", + "g", + "p", + "b", + "o", + "h", + "y", + "j", + "c", + "w", + "f", + "v", + "z", + "x", + "q", + ], + "Turkish": [ + "a", + "e", + "i", + "n", + "r", + "l", + "ı", + "k", + "d", + "t", + "s", + "m", + "y", + "u", + "o", + "b", + "ü", + "ş", + "v", + "g", + "z", + "h", + "c", + "p", + "ç", + "ğ", + ], + "Romanian": [ + "e", + "i", + "a", + "r", + "n", + "t", + "u", + "l", + "o", + "c", + "s", + "d", + "p", + "m", + "ă", + "f", + "v", + "î", + "g", + "b", + "ș", + "ț", + "z", + "h", + "â", + "j", + ], + "Farsi": [ + "ا", + "ی", + "ر", + "د", + "ن", + "ه", + "و", + "م", + "ت", + "ب", + "س", + "ل", + "ک", + "ش", + "ز", + "ف", + "گ", + "ع", + "خ", + "ق", + "ج", + "آ", + "پ", + "ح", + "ط", + "ص", + ], + "Arabic": [ + "ا", + "ل", + "ي", + "م", + "و", + "ن", + "ر", + "ت", + "ب", + "ة", + "ع", + "د", + "س", + "ف", + "ه", + "ك", + "ق", + "أ", + "ح", + "ج", + "ش", + "ط", + "ص", + "ى", + "خ", + "إ", + ], + "Danish": [ + "e", + "r", + "n", + "t", + "a", + "i", + "s", + "d", + "l", + "o", + "g", + "m", + "k", + "f", + "v", + "u", + "b", + "h", + "p", + "å", + "y", + "ø", + "æ", + "c", + "j", + "w", + ], + "Serbian": [ + "а", + "и", + "о", + "е", + "н", + "р", + "с", + "у", + "т", + "к", + "ј", + "в", + "д", + "м", + "п", + "л", + "г", + "з", + "б", + "a", + "i", + "e", + "o", + "n", + "ц", + "ш", + ], + "Lithuanian": [ + "i", + "a", + "s", + "o", + "r", + "e", + "t", + "n", + "u", + "k", + "m", + "l", + "p", + "v", + "d", + "j", + "g", + "ė", + "b", + "y", + "ų", + "š", + "ž", + "c", + "ą", + "į", + ], + "Slovene": [ + "e", + "a", + "i", + "o", + "n", + "r", + "s", + "l", + "t", + "j", + "v", + "k", + "d", + "p", + "m", + "u", + "z", + "b", + "g", + "h", + "č", + "c", + "š", + "ž", + "f", + "y", + ], + "Slovak": [ + "o", + "a", + "e", + "n", + "i", + "r", + "v", + "t", + "s", + "l", + "k", + "d", + "m", + "p", + "u", + "c", + "h", + "j", + "b", + "z", + "á", + "y", + "ý", + "í", + "č", + "é", + ], + "Hebrew": [ + "י", + "ו", + "ה", + "ל", + "ר", + "ב", + "ת", + "מ", + "א", + "ש", + "נ", + "ע", + "ם", + "ד", + "ק", + "ח", + "פ", + "ס", + "כ", + "ג", + "ט", + "צ", + "ן", + "ז", + "ך", + ], + "Bulgarian": [ + "а", + "и", + "о", + "е", + "н", + "т", + "р", + "с", + "в", + "л", + "к", + "д", + "п", + "м", + "з", + "г", + "я", + "ъ", + "у", + "б", + "ч", + "ц", + "й", + "ж", + "щ", + "х", + ], + "Croatian": [ + "a", + "i", + "o", + "e", + "n", + "r", + "j", + "s", + "t", + "u", + "k", + "l", + "v", + "d", + "m", + "p", + "g", + "z", + "b", + "c", + "č", + "h", + "š", + "ž", + "ć", + "f", + ], + "Hindi": [ + "क", + "र", + "स", + "न", + "त", + "म", + "ह", + "प", + "य", + "ल", + "व", + "ज", + "द", + "ग", + "ब", + "श", + "ट", + "अ", + "ए", + "थ", + "भ", + "ड", + "च", + "ध", + "ष", + "इ", + ], + "Estonian": [ + "a", + "i", + "e", + "s", + "t", + "l", + "u", + "n", + "o", + "k", + "r", + "d", + "m", + "v", + "g", + "p", + "j", + "h", + "ä", + "b", + "õ", + "ü", + "f", + "c", + "ö", + "y", + ], + "Simple English": [ + "e", + "a", + "t", + "i", + "o", + "n", + "s", + "r", + "h", + "l", + "d", + "c", + "m", + "u", + "f", + "p", + "g", + "w", + "b", + "y", + "v", + "k", + "j", + "x", + "z", + "q", + ], + "Thai": [ + "า", + "น", + "ร", + "อ", + "ก", + "เ", + "ง", + "ม", + "ย", + "ล", + "ว", + "ด", + "ท", + "ส", + "ต", + "ะ", + "ป", + "บ", + "ค", + "ห", + "แ", + "จ", + "พ", + "ช", + "ข", + "ใ", + ], + "Greek": [ + "α", + "τ", + "ο", + "ι", + "ε", + "ν", + "ρ", + "σ", + "κ", + "η", + "π", + "ς", + "υ", + "μ", + "λ", + "ί", + "ό", + "ά", + "γ", + "έ", + "δ", + "ή", + "ω", + "χ", + "θ", + "ύ", + ], + "Tamil": [ + "க", + "த", + "ப", + "ட", + "ர", + "ம", + "ல", + "ன", + "வ", + "ற", + "ய", + "ள", + "ச", + "ந", + "இ", + "ண", + "அ", + "ஆ", + "ழ", + "ங", + "எ", + "உ", + "ஒ", + "ஸ", + ], + "Classical Chinese": [ + "之", + "年", + "為", + "也", + "以", + "一", + "人", + "其", + "者", + "國", + "有", + "二", + "十", + "於", + "曰", + "三", + "不", + "大", + "而", + "子", + "中", + "五", + "四", + ], + "Kazakh": [ + "а", + "ы", + "е", + "н", + "т", + "р", + "л", + "і", + "д", + "с", + "м", + "қ", + "к", + "о", + "б", + "и", + "у", + "ғ", + "ж", + "ң", + "з", + "ш", + "й", + "п", + "г", + "ө", + ], +} diff --git a/sbsheriff/Lib/site-packages/charset_normalizer/assets/__pycache__/__init__.cpython-310.pyc b/sbsheriff/Lib/site-packages/charset_normalizer/assets/__pycache__/__init__.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..44cc324334aab2897c9ee43a6571ed0de9cf5ae5 GIT binary patch literal 7742 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 BpJ4z1 literal 0 HcmV?d00001 diff --git a/sbsheriff/Lib/site-packages/charset_normalizer/cd.py b/sbsheriff/Lib/site-packages/charset_normalizer/cd.py new file mode 100644 index 0000000..ee4b742 --- /dev/null +++ b/sbsheriff/Lib/site-packages/charset_normalizer/cd.py @@ -0,0 +1,339 @@ +import importlib +from codecs import IncrementalDecoder +from collections import Counter +from functools import lru_cache +from typing import Counter as TypeCounter, Dict, List, Optional, Tuple + +from .assets import FREQUENCIES +from .constant import KO_NAMES, LANGUAGE_SUPPORTED_COUNT, TOO_SMALL_SEQUENCE, ZH_NAMES +from .md import is_suspiciously_successive_range +from .models import CoherenceMatches +from .utils import ( + is_accentuated, + is_latin, + is_multi_byte_encoding, + is_unicode_range_secondary, + unicode_range, +) + + +def encoding_unicode_range(iana_name: str) -> List[str]: + """ + Return associated unicode ranges in a single byte code page. + """ + if is_multi_byte_encoding(iana_name): + raise IOError("Function not supported on multi-byte code page") + + decoder = importlib.import_module( + "encodings.{}".format(iana_name) + ).IncrementalDecoder + + p: IncrementalDecoder = decoder(errors="ignore") + seen_ranges: Dict[str, int] = {} + character_count: int = 0 + + for i in range(0x40, 0xFF): + chunk: str = p.decode(bytes([i])) + + if chunk: + character_range: Optional[str] = unicode_range(chunk) + + if character_range is None: + continue + + if is_unicode_range_secondary(character_range) is False: + if character_range not in seen_ranges: + seen_ranges[character_range] = 0 + seen_ranges[character_range] += 1 + character_count += 1 + + return sorted( + [ + character_range + for character_range in seen_ranges + if seen_ranges[character_range] / character_count >= 0.15 + ] + ) + + +def unicode_range_languages(primary_range: str) -> List[str]: + """ + Return inferred languages used with a unicode range. + """ + languages: List[str] = [] + + for language, characters in FREQUENCIES.items(): + for character in characters: + if unicode_range(character) == primary_range: + languages.append(language) + break + + return languages + + +@lru_cache() +def encoding_languages(iana_name: str) -> List[str]: + """ + Single-byte encoding language association. Some code page are heavily linked to particular language(s). + This function does the correspondence. + """ + unicode_ranges: List[str] = encoding_unicode_range(iana_name) + primary_range: Optional[str] = None + + for specified_range in unicode_ranges: + if "Latin" not in specified_range: + primary_range = specified_range + break + + if primary_range is None: + return ["Latin Based"] + + return unicode_range_languages(primary_range) + + +@lru_cache() +def mb_encoding_languages(iana_name: str) -> List[str]: + """ + Multi-byte encoding language association. Some code page are heavily linked to particular language(s). + This function does the correspondence. + """ + if ( + iana_name.startswith("shift_") + or iana_name.startswith("iso2022_jp") + or iana_name.startswith("euc_j") + or iana_name == "cp932" + ): + return ["Japanese"] + if iana_name.startswith("gb") or iana_name in ZH_NAMES: + return ["Chinese", "Classical Chinese"] + if iana_name.startswith("iso2022_kr") or iana_name in KO_NAMES: + return ["Korean"] + + return [] + + +@lru_cache(maxsize=LANGUAGE_SUPPORTED_COUNT) +def get_target_features(language: str) -> Tuple[bool, bool]: + """ + Determine main aspects from a supported language if it contains accents and if is pure Latin. + """ + target_have_accents: bool = False + target_pure_latin: bool = True + + for character in FREQUENCIES[language]: + if not target_have_accents and is_accentuated(character): + target_have_accents = True + if target_pure_latin and is_latin(character) is False: + target_pure_latin = False + + return target_have_accents, target_pure_latin + + +def alphabet_languages( + characters: List[str], ignore_non_latin: bool = False +) -> List[str]: + """ + Return associated languages associated to given characters. + """ + languages: List[Tuple[str, float]] = [] + + source_have_accents = any(is_accentuated(character) for character in characters) + + for language, language_characters in FREQUENCIES.items(): + + target_have_accents, target_pure_latin = get_target_features(language) + + if ignore_non_latin and target_pure_latin is False: + continue + + if target_have_accents is False and source_have_accents: + continue + + character_count: int = len(language_characters) + + character_match_count: int = len( + [c for c in language_characters if c in characters] + ) + + ratio: float = character_match_count / character_count + + if ratio >= 0.2: + languages.append((language, ratio)) + + languages = sorted(languages, key=lambda x: x[1], reverse=True) + + return [compatible_language[0] for compatible_language in languages] + + +def characters_popularity_compare( + language: str, ordered_characters: List[str] +) -> float: + """ + Determine if a ordered characters list (by occurrence from most appearance to rarest) match a particular language. + The result is a ratio between 0. (absolutely no correspondence) and 1. (near perfect fit). + Beware that is function is not strict on the match in order to ease the detection. (Meaning close match is 1.) + """ + if language not in FREQUENCIES: + raise ValueError("{} not available".format(language)) + + character_approved_count: int = 0 + FREQUENCIES_language_set = set(FREQUENCIES[language]) + + for character in ordered_characters: + if character not in FREQUENCIES_language_set: + continue + + characters_before_source: List[str] = FREQUENCIES[language][ + 0 : FREQUENCIES[language].index(character) + ] + characters_after_source: List[str] = FREQUENCIES[language][ + FREQUENCIES[language].index(character) : + ] + characters_before: List[str] = ordered_characters[ + 0 : ordered_characters.index(character) + ] + characters_after: List[str] = ordered_characters[ + ordered_characters.index(character) : + ] + + before_match_count: int = len( + set(characters_before) & set(characters_before_source) + ) + + after_match_count: int = len( + set(characters_after) & set(characters_after_source) + ) + + if len(characters_before_source) == 0 and before_match_count <= 4: + character_approved_count += 1 + continue + + if len(characters_after_source) == 0 and after_match_count <= 4: + character_approved_count += 1 + continue + + if ( + before_match_count / len(characters_before_source) >= 0.4 + or after_match_count / len(characters_after_source) >= 0.4 + ): + character_approved_count += 1 + continue + + return character_approved_count / len(ordered_characters) + + +def alpha_unicode_split(decoded_sequence: str) -> List[str]: + """ + Given a decoded text sequence, return a list of str. Unicode range / alphabet separation. + Ex. a text containing English/Latin with a bit a Hebrew will return two items in the resulting list; + One containing the latin letters and the other hebrew. + """ + layers: Dict[str, str] = {} + + for character in decoded_sequence: + if character.isalpha() is False: + continue + + character_range: Optional[str] = unicode_range(character) + + if character_range is None: + continue + + layer_target_range: Optional[str] = None + + for discovered_range in layers: + if ( + is_suspiciously_successive_range(discovered_range, character_range) + is False + ): + layer_target_range = discovered_range + break + + if layer_target_range is None: + layer_target_range = character_range + + if layer_target_range not in layers: + layers[layer_target_range] = character.lower() + continue + + layers[layer_target_range] += character.lower() + + return list(layers.values()) + + +def merge_coherence_ratios(results: List[CoherenceMatches]) -> CoherenceMatches: + """ + This function merge results previously given by the function coherence_ratio. + The return type is the same as coherence_ratio. + """ + per_language_ratios: Dict[str, List[float]] = {} + for result in results: + for sub_result in result: + language, ratio = sub_result + if language not in per_language_ratios: + per_language_ratios[language] = [ratio] + continue + per_language_ratios[language].append(ratio) + + merge = [ + ( + language, + round( + sum(per_language_ratios[language]) / len(per_language_ratios[language]), + 4, + ), + ) + for language in per_language_ratios + ] + + return sorted(merge, key=lambda x: x[1], reverse=True) + + +@lru_cache(maxsize=2048) +def coherence_ratio( + decoded_sequence: str, threshold: float = 0.1, lg_inclusion: Optional[str] = None +) -> CoherenceMatches: + """ + Detect ANY language that can be identified in given sequence. The sequence will be analysed by layers. + A layer = Character extraction by alphabets/ranges. + """ + + results: List[Tuple[str, float]] = [] + ignore_non_latin: bool = False + + sufficient_match_count: int = 0 + + lg_inclusion_list = lg_inclusion.split(",") if lg_inclusion is not None else [] + if "Latin Based" in lg_inclusion_list: + ignore_non_latin = True + lg_inclusion_list.remove("Latin Based") + + for layer in alpha_unicode_split(decoded_sequence): + sequence_frequencies: TypeCounter[str] = Counter(layer) + most_common = sequence_frequencies.most_common() + + character_count: int = sum(o for c, o in most_common) + + if character_count <= TOO_SMALL_SEQUENCE: + continue + + popular_character_ordered: List[str] = [c for c, o in most_common] + + for language in lg_inclusion_list or alphabet_languages( + popular_character_ordered, ignore_non_latin + ): + ratio: float = characters_popularity_compare( + language, popular_character_ordered + ) + + if ratio < threshold: + continue + elif ratio >= 0.8: + sufficient_match_count += 1 + + results.append((language, round(ratio, 4))) + + if sufficient_match_count >= 3: + break + + return sorted(results, key=lambda x: x[1], reverse=True) diff --git a/sbsheriff/Lib/site-packages/charset_normalizer/cli/__init__.py b/sbsheriff/Lib/site-packages/charset_normalizer/cli/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/sbsheriff/Lib/site-packages/charset_normalizer/cli/__pycache__/__init__.cpython-310.pyc b/sbsheriff/Lib/site-packages/charset_normalizer/cli/__pycache__/__init__.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..ebef6e94b5bfdc3ea8d579adc9c93560f2f6f3af GIT binary patch literal 195 zcmd1j<>g`kg3aoZ$sqbMh(HF6K#l_t7qb9~6oz01O-8?!3`HPe1o11)*(xTqIJKxa zCb*<1vm(YNwJfH%B)=#(sVFl&F(oy=I3u+vGc7HqI0?q`$xMnV&MZmQEl5nxPE1cN zj!Di)EGkYdiO&P-OU%ivN-fe)&dJn|kI&4@EQycTE2zB1VUwGmQks)$2eQAI2}rOo F005PFG{67= literal 0 HcmV?d00001 diff --git a/sbsheriff/Lib/site-packages/charset_normalizer/cli/__pycache__/normalizer.cpython-310.pyc b/sbsheriff/Lib/site-packages/charset_normalizer/cli/__pycache__/normalizer.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..52ddffd19a7b68910793505313cc277156abe3b5 GIT binary patch literal 6285 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 L__K_{=I{P5?@!jq literal 0 HcmV?d00001 diff --git a/sbsheriff/Lib/site-packages/charset_normalizer/cli/normalizer.py b/sbsheriff/Lib/site-packages/charset_normalizer/cli/normalizer.py new file mode 100644 index 0000000..b8b652a --- /dev/null +++ b/sbsheriff/Lib/site-packages/charset_normalizer/cli/normalizer.py @@ -0,0 +1,295 @@ +import argparse +import sys +from json import dumps +from os.path import abspath +from platform import python_version +from typing import List, Optional + +try: + from unicodedata2 import unidata_version +except ImportError: + from unicodedata import unidata_version + +from charset_normalizer import from_fp +from charset_normalizer.models import CliDetectionResult +from charset_normalizer.version import __version__ + + +def query_yes_no(question: str, default: str = "yes") -> bool: + """Ask a yes/no question via input() and return their answer. + + "question" is a string that is presented to the user. + "default" is the presumed answer if the user just hits . + It must be "yes" (the default), "no" or None (meaning + an answer is required of the user). + + The "answer" return value is True for "yes" or False for "no". + + Credit goes to (c) https://stackoverflow.com/questions/3041986/apt-command-line-interface-like-yes-no-input + """ + valid = {"yes": True, "y": True, "ye": True, "no": False, "n": False} + if default is None: + prompt = " [y/n] " + elif default == "yes": + prompt = " [Y/n] " + elif default == "no": + prompt = " [y/N] " + else: + raise ValueError("invalid default answer: '%s'" % default) + + while True: + sys.stdout.write(question + prompt) + choice = input().lower() + if default is not None and choice == "": + return valid[default] + elif choice in valid: + return valid[choice] + else: + sys.stdout.write("Please respond with 'yes' or 'no' " "(or 'y' or 'n').\n") + + +def cli_detect(argv: Optional[List[str]] = None) -> int: + """ + CLI assistant using ARGV and ArgumentParser + :param argv: + :return: 0 if everything is fine, anything else equal trouble + """ + parser = argparse.ArgumentParser( + description="The Real First Universal Charset Detector. " + "Discover originating encoding used on text file. " + "Normalize text to unicode." + ) + + parser.add_argument( + "files", type=argparse.FileType("rb"), nargs="+", help="File(s) to be analysed" + ) + parser.add_argument( + "-v", + "--verbose", + action="store_true", + default=False, + dest="verbose", + help="Display complementary information about file if any. " + "Stdout will contain logs about the detection process.", + ) + parser.add_argument( + "-a", + "--with-alternative", + action="store_true", + default=False, + dest="alternatives", + help="Output complementary possibilities if any. Top-level JSON WILL be a list.", + ) + parser.add_argument( + "-n", + "--normalize", + action="store_true", + default=False, + dest="normalize", + help="Permit to normalize input file. If not set, program does not write anything.", + ) + parser.add_argument( + "-m", + "--minimal", + action="store_true", + default=False, + dest="minimal", + help="Only output the charset detected to STDOUT. Disabling JSON output.", + ) + parser.add_argument( + "-r", + "--replace", + action="store_true", + default=False, + dest="replace", + help="Replace file when trying to normalize it instead of creating a new one.", + ) + parser.add_argument( + "-f", + "--force", + action="store_true", + default=False, + dest="force", + help="Replace file without asking if you are sure, use this flag with caution.", + ) + parser.add_argument( + "-t", + "--threshold", + action="store", + default=0.2, + type=float, + dest="threshold", + help="Define a custom maximum amount of chaos allowed in decoded content. 0. <= chaos <= 1.", + ) + parser.add_argument( + "--version", + action="version", + version="Charset-Normalizer {} - Python {} - Unicode {}".format( + __version__, python_version(), unidata_version + ), + help="Show version information and exit.", + ) + + args = parser.parse_args(argv) + + if args.replace is True and args.normalize is False: + print("Use --replace in addition of --normalize only.", file=sys.stderr) + return 1 + + if args.force is True and args.replace is False: + print("Use --force in addition of --replace only.", file=sys.stderr) + return 1 + + if args.threshold < 0.0 or args.threshold > 1.0: + print("--threshold VALUE should be between 0. AND 1.", file=sys.stderr) + return 1 + + x_ = [] + + for my_file in args.files: + + matches = from_fp(my_file, threshold=args.threshold, explain=args.verbose) + + best_guess = matches.best() + + if best_guess is None: + print( + 'Unable to identify originating encoding for "{}". {}'.format( + my_file.name, + "Maybe try increasing maximum amount of chaos." + if args.threshold < 1.0 + else "", + ), + file=sys.stderr, + ) + x_.append( + CliDetectionResult( + abspath(my_file.name), + None, + [], + [], + "Unknown", + [], + False, + 1.0, + 0.0, + None, + True, + ) + ) + else: + x_.append( + CliDetectionResult( + abspath(my_file.name), + best_guess.encoding, + best_guess.encoding_aliases, + [ + cp + for cp in best_guess.could_be_from_charset + if cp != best_guess.encoding + ], + best_guess.language, + best_guess.alphabets, + best_guess.bom, + best_guess.percent_chaos, + best_guess.percent_coherence, + None, + True, + ) + ) + + if len(matches) > 1 and args.alternatives: + for el in matches: + if el != best_guess: + x_.append( + CliDetectionResult( + abspath(my_file.name), + el.encoding, + el.encoding_aliases, + [ + cp + for cp in el.could_be_from_charset + if cp != el.encoding + ], + el.language, + el.alphabets, + el.bom, + el.percent_chaos, + el.percent_coherence, + None, + False, + ) + ) + + if args.normalize is True: + + if best_guess.encoding.startswith("utf") is True: + print( + '"{}" file does not need to be normalized, as it already came from unicode.'.format( + my_file.name + ), + file=sys.stderr, + ) + if my_file.closed is False: + my_file.close() + continue + + o_: List[str] = my_file.name.split(".") + + if args.replace is False: + o_.insert(-1, best_guess.encoding) + if my_file.closed is False: + my_file.close() + elif ( + args.force is False + and query_yes_no( + 'Are you sure to normalize "{}" by replacing it ?'.format( + my_file.name + ), + "no", + ) + is False + ): + if my_file.closed is False: + my_file.close() + continue + + try: + x_[0].unicode_path = abspath("./{}".format(".".join(o_))) + + with open(x_[0].unicode_path, "w", encoding="utf-8") as fp: + fp.write(str(best_guess)) + except IOError as e: + print(str(e), file=sys.stderr) + if my_file.closed is False: + my_file.close() + return 2 + + if my_file.closed is False: + my_file.close() + + if args.minimal is False: + print( + dumps( + [el.__dict__ for el in x_] if len(x_) > 1 else x_[0].__dict__, + ensure_ascii=True, + indent=4, + ) + ) + else: + for my_file in args.files: + print( + ", ".join( + [ + el.encoding or "undefined" + for el in x_ + if el.path == abspath(my_file.name) + ] + ) + ) + + return 0 + + +if __name__ == "__main__": + cli_detect() diff --git a/sbsheriff/Lib/site-packages/charset_normalizer/constant.py b/sbsheriff/Lib/site-packages/charset_normalizer/constant.py new file mode 100644 index 0000000..ac840c4 --- /dev/null +++ b/sbsheriff/Lib/site-packages/charset_normalizer/constant.py @@ -0,0 +1,497 @@ +from codecs import BOM_UTF8, BOM_UTF16_BE, BOM_UTF16_LE, BOM_UTF32_BE, BOM_UTF32_LE +from encodings.aliases import aliases +from re import IGNORECASE, compile as re_compile +from typing import Dict, List, Set, Union + +from .assets import FREQUENCIES + +# Contain for each eligible encoding a list of/item bytes SIG/BOM +ENCODING_MARKS: Dict[str, Union[bytes, List[bytes]]] = { + "utf_8": BOM_UTF8, + "utf_7": [ + b"\x2b\x2f\x76\x38", + b"\x2b\x2f\x76\x39", + b"\x2b\x2f\x76\x2b", + b"\x2b\x2f\x76\x2f", + b"\x2b\x2f\x76\x38\x2d", + ], + "gb18030": b"\x84\x31\x95\x33", + "utf_32": [BOM_UTF32_BE, BOM_UTF32_LE], + "utf_16": [BOM_UTF16_BE, BOM_UTF16_LE], +} + +TOO_SMALL_SEQUENCE: int = 32 +TOO_BIG_SEQUENCE: int = int(10e6) + +UTF8_MAXIMAL_ALLOCATION: int = 1112064 + +UNICODE_RANGES_COMBINED: Dict[str, range] = { + "Control character": range(31 + 1), + "Basic Latin": range(32, 127 + 1), + "Latin-1 Supplement": range(128, 255 + 1), + "Latin Extended-A": range(256, 383 + 1), + "Latin Extended-B": range(384, 591 + 1), + "IPA Extensions": range(592, 687 + 1), + "Spacing Modifier Letters": range(688, 767 + 1), + "Combining Diacritical Marks": range(768, 879 + 1), + "Greek and Coptic": range(880, 1023 + 1), + "Cyrillic": range(1024, 1279 + 1), + "Cyrillic Supplement": range(1280, 1327 + 1), + "Armenian": range(1328, 1423 + 1), + "Hebrew": range(1424, 1535 + 1), + "Arabic": range(1536, 1791 + 1), + "Syriac": range(1792, 1871 + 1), + "Arabic Supplement": range(1872, 1919 + 1), + "Thaana": range(1920, 1983 + 1), + "NKo": range(1984, 2047 + 1), + "Samaritan": range(2048, 2111 + 1), + "Mandaic": range(2112, 2143 + 1), + "Syriac Supplement": range(2144, 2159 + 1), + "Arabic Extended-A": range(2208, 2303 + 1), + "Devanagari": range(2304, 2431 + 1), + "Bengali": range(2432, 2559 + 1), + "Gurmukhi": range(2560, 2687 + 1), + "Gujarati": range(2688, 2815 + 1), + "Oriya": range(2816, 2943 + 1), + "Tamil": range(2944, 3071 + 1), + "Telugu": range(3072, 3199 + 1), + "Kannada": range(3200, 3327 + 1), + "Malayalam": range(3328, 3455 + 1), + "Sinhala": range(3456, 3583 + 1), + "Thai": range(3584, 3711 + 1), + "Lao": range(3712, 3839 + 1), + "Tibetan": range(3840, 4095 + 1), + "Myanmar": range(4096, 4255 + 1), + "Georgian": range(4256, 4351 + 1), + "Hangul Jamo": range(4352, 4607 + 1), + "Ethiopic": range(4608, 4991 + 1), + "Ethiopic Supplement": range(4992, 5023 + 1), + "Cherokee": range(5024, 5119 + 1), + "Unified Canadian Aboriginal Syllabics": range(5120, 5759 + 1), + "Ogham": range(5760, 5791 + 1), + "Runic": range(5792, 5887 + 1), + "Tagalog": range(5888, 5919 + 1), + "Hanunoo": range(5920, 5951 + 1), + "Buhid": range(5952, 5983 + 1), + "Tagbanwa": range(5984, 6015 + 1), + "Khmer": range(6016, 6143 + 1), + "Mongolian": range(6144, 6319 + 1), + "Unified Canadian Aboriginal Syllabics Extended": range(6320, 6399 + 1), + "Limbu": range(6400, 6479 + 1), + "Tai Le": range(6480, 6527 + 1), + "New Tai Lue": range(6528, 6623 + 1), + "Khmer Symbols": range(6624, 6655 + 1), + "Buginese": range(6656, 6687 + 1), + "Tai Tham": range(6688, 6831 + 1), + "Combining Diacritical Marks Extended": range(6832, 6911 + 1), + "Balinese": range(6912, 7039 + 1), + "Sundanese": range(7040, 7103 + 1), + "Batak": range(7104, 7167 + 1), + "Lepcha": range(7168, 7247 + 1), + "Ol Chiki": range(7248, 7295 + 1), + "Cyrillic Extended C": range(7296, 7311 + 1), + "Sundanese Supplement": range(7360, 7375 + 1), + "Vedic Extensions": range(7376, 7423 + 1), + "Phonetic Extensions": range(7424, 7551 + 1), + "Phonetic Extensions Supplement": range(7552, 7615 + 1), + "Combining Diacritical Marks Supplement": range(7616, 7679 + 1), + "Latin Extended Additional": range(7680, 7935 + 1), + "Greek Extended": range(7936, 8191 + 1), + "General Punctuation": range(8192, 8303 + 1), + "Superscripts and Subscripts": range(8304, 8351 + 1), + "Currency Symbols": range(8352, 8399 + 1), + "Combining Diacritical Marks for Symbols": range(8400, 8447 + 1), + "Letterlike Symbols": range(8448, 8527 + 1), + "Number Forms": range(8528, 8591 + 1), + "Arrows": range(8592, 8703 + 1), + "Mathematical Operators": range(8704, 8959 + 1), + "Miscellaneous Technical": range(8960, 9215 + 1), + "Control Pictures": range(9216, 9279 + 1), + "Optical Character Recognition": range(9280, 9311 + 1), + "Enclosed Alphanumerics": range(9312, 9471 + 1), + "Box Drawing": range(9472, 9599 + 1), + "Block Elements": range(9600, 9631 + 1), + "Geometric Shapes": range(9632, 9727 + 1), + "Miscellaneous Symbols": range(9728, 9983 + 1), + "Dingbats": range(9984, 10175 + 1), + "Miscellaneous Mathematical Symbols-A": range(10176, 10223 + 1), + "Supplemental Arrows-A": range(10224, 10239 + 1), + "Braille Patterns": range(10240, 10495 + 1), + "Supplemental Arrows-B": range(10496, 10623 + 1), + "Miscellaneous Mathematical Symbols-B": range(10624, 10751 + 1), + "Supplemental Mathematical Operators": range(10752, 11007 + 1), + "Miscellaneous Symbols and Arrows": range(11008, 11263 + 1), + "Glagolitic": range(11264, 11359 + 1), + "Latin Extended-C": range(11360, 11391 + 1), + "Coptic": range(11392, 11519 + 1), + "Georgian Supplement": range(11520, 11567 + 1), + "Tifinagh": range(11568, 11647 + 1), + "Ethiopic Extended": range(11648, 11743 + 1), + "Cyrillic Extended-A": range(11744, 11775 + 1), + "Supplemental Punctuation": range(11776, 11903 + 1), + "CJK Radicals Supplement": range(11904, 12031 + 1), + "Kangxi Radicals": range(12032, 12255 + 1), + "Ideographic Description Characters": range(12272, 12287 + 1), + "CJK Symbols and Punctuation": range(12288, 12351 + 1), + "Hiragana": range(12352, 12447 + 1), + "Katakana": range(12448, 12543 + 1), + "Bopomofo": range(12544, 12591 + 1), + "Hangul Compatibility Jamo": range(12592, 12687 + 1), + "Kanbun": range(12688, 12703 + 1), + "Bopomofo Extended": range(12704, 12735 + 1), + "CJK Strokes": range(12736, 12783 + 1), + "Katakana Phonetic Extensions": range(12784, 12799 + 1), + "Enclosed CJK Letters and Months": range(12800, 13055 + 1), + "CJK Compatibility": range(13056, 13311 + 1), + "CJK Unified Ideographs Extension A": range(13312, 19903 + 1), + "Yijing Hexagram Symbols": range(19904, 19967 + 1), + "CJK Unified Ideographs": range(19968, 40959 + 1), + "Yi Syllables": range(40960, 42127 + 1), + "Yi Radicals": range(42128, 42191 + 1), + "Lisu": range(42192, 42239 + 1), + "Vai": range(42240, 42559 + 1), + "Cyrillic Extended-B": range(42560, 42655 + 1), + "Bamum": range(42656, 42751 + 1), + "Modifier Tone Letters": range(42752, 42783 + 1), + "Latin Extended-D": range(42784, 43007 + 1), + "Syloti Nagri": range(43008, 43055 + 1), + "Common Indic Number Forms": range(43056, 43071 + 1), + "Phags-pa": range(43072, 43135 + 1), + "Saurashtra": range(43136, 43231 + 1), + "Devanagari Extended": range(43232, 43263 + 1), + "Kayah Li": range(43264, 43311 + 1), + "Rejang": range(43312, 43359 + 1), + "Hangul Jamo Extended-A": range(43360, 43391 + 1), + "Javanese": range(43392, 43487 + 1), + "Myanmar Extended-B": range(43488, 43519 + 1), + "Cham": range(43520, 43615 + 1), + "Myanmar Extended-A": range(43616, 43647 + 1), + "Tai Viet": range(43648, 43743 + 1), + "Meetei Mayek Extensions": range(43744, 43775 + 1), + "Ethiopic Extended-A": range(43776, 43823 + 1), + "Latin Extended-E": range(43824, 43887 + 1), + "Cherokee Supplement": range(43888, 43967 + 1), + "Meetei Mayek": range(43968, 44031 + 1), + "Hangul Syllables": range(44032, 55215 + 1), + "Hangul Jamo Extended-B": range(55216, 55295 + 1), + "High Surrogates": range(55296, 56191 + 1), + "High Private Use Surrogates": range(56192, 56319 + 1), + "Low Surrogates": range(56320, 57343 + 1), + "Private Use Area": range(57344, 63743 + 1), + "CJK Compatibility Ideographs": range(63744, 64255 + 1), + "Alphabetic Presentation Forms": range(64256, 64335 + 1), + "Arabic Presentation Forms-A": range(64336, 65023 + 1), + "Variation Selectors": range(65024, 65039 + 1), + "Vertical Forms": range(65040, 65055 + 1), + "Combining Half Marks": range(65056, 65071 + 1), + "CJK Compatibility Forms": range(65072, 65103 + 1), + "Small Form Variants": range(65104, 65135 + 1), + "Arabic Presentation Forms-B": range(65136, 65279 + 1), + "Halfwidth and Fullwidth Forms": range(65280, 65519 + 1), + "Specials": range(65520, 65535 + 1), + "Linear B Syllabary": range(65536, 65663 + 1), + "Linear B Ideograms": range(65664, 65791 + 1), + "Aegean Numbers": range(65792, 65855 + 1), + "Ancient Greek Numbers": range(65856, 65935 + 1), + "Ancient Symbols": range(65936, 65999 + 1), + "Phaistos Disc": range(66000, 66047 + 1), + "Lycian": range(66176, 66207 + 1), + "Carian": range(66208, 66271 + 1), + "Coptic Epact Numbers": range(66272, 66303 + 1), + "Old Italic": range(66304, 66351 + 1), + "Gothic": range(66352, 66383 + 1), + "Old Permic": range(66384, 66431 + 1), + "Ugaritic": range(66432, 66463 + 1), + "Old Persian": range(66464, 66527 + 1), + "Deseret": range(66560, 66639 + 1), + "Shavian": range(66640, 66687 + 1), + "Osmanya": range(66688, 66735 + 1), + "Osage": range(66736, 66815 + 1), + "Elbasan": range(66816, 66863 + 1), + "Caucasian Albanian": range(66864, 66927 + 1), + "Linear A": range(67072, 67455 + 1), + "Cypriot Syllabary": range(67584, 67647 + 1), + "Imperial Aramaic": range(67648, 67679 + 1), + "Palmyrene": range(67680, 67711 + 1), + "Nabataean": range(67712, 67759 + 1), + "Hatran": range(67808, 67839 + 1), + "Phoenician": range(67840, 67871 + 1), + "Lydian": range(67872, 67903 + 1), + "Meroitic Hieroglyphs": range(67968, 67999 + 1), + "Meroitic Cursive": range(68000, 68095 + 1), + "Kharoshthi": range(68096, 68191 + 1), + "Old South Arabian": range(68192, 68223 + 1), + "Old North Arabian": range(68224, 68255 + 1), + "Manichaean": range(68288, 68351 + 1), + "Avestan": range(68352, 68415 + 1), + "Inscriptional Parthian": range(68416, 68447 + 1), + "Inscriptional Pahlavi": range(68448, 68479 + 1), + "Psalter Pahlavi": range(68480, 68527 + 1), + "Old Turkic": range(68608, 68687 + 1), + "Old Hungarian": range(68736, 68863 + 1), + "Rumi Numeral Symbols": range(69216, 69247 + 1), + "Brahmi": range(69632, 69759 + 1), + "Kaithi": range(69760, 69839 + 1), + "Sora Sompeng": range(69840, 69887 + 1), + "Chakma": range(69888, 69967 + 1), + "Mahajani": range(69968, 70015 + 1), + "Sharada": range(70016, 70111 + 1), + "Sinhala Archaic Numbers": range(70112, 70143 + 1), + "Khojki": range(70144, 70223 + 1), + "Multani": range(70272, 70319 + 1), + "Khudawadi": range(70320, 70399 + 1), + "Grantha": range(70400, 70527 + 1), + "Newa": range(70656, 70783 + 1), + "Tirhuta": range(70784, 70879 + 1), + "Siddham": range(71040, 71167 + 1), + "Modi": range(71168, 71263 + 1), + "Mongolian Supplement": range(71264, 71295 + 1), + "Takri": range(71296, 71375 + 1), + "Ahom": range(71424, 71487 + 1), + "Warang Citi": range(71840, 71935 + 1), + "Zanabazar Square": range(72192, 72271 + 1), + "Soyombo": range(72272, 72367 + 1), + "Pau Cin Hau": range(72384, 72447 + 1), + "Bhaiksuki": range(72704, 72815 + 1), + "Marchen": range(72816, 72895 + 1), + "Masaram Gondi": range(72960, 73055 + 1), + "Cuneiform": range(73728, 74751 + 1), + "Cuneiform Numbers and Punctuation": range(74752, 74879 + 1), + "Early Dynastic Cuneiform": range(74880, 75087 + 1), + "Egyptian Hieroglyphs": range(77824, 78895 + 1), + "Anatolian Hieroglyphs": range(82944, 83583 + 1), + "Bamum Supplement": range(92160, 92735 + 1), + "Mro": range(92736, 92783 + 1), + "Bassa Vah": range(92880, 92927 + 1), + "Pahawh Hmong": range(92928, 93071 + 1), + "Miao": range(93952, 94111 + 1), + "Ideographic Symbols and Punctuation": range(94176, 94207 + 1), + "Tangut": range(94208, 100351 + 1), + "Tangut Components": range(100352, 101119 + 1), + "Kana Supplement": range(110592, 110847 + 1), + "Kana Extended-A": range(110848, 110895 + 1), + "Nushu": range(110960, 111359 + 1), + "Duployan": range(113664, 113823 + 1), + "Shorthand Format Controls": range(113824, 113839 + 1), + "Byzantine Musical Symbols": range(118784, 119039 + 1), + "Musical Symbols": range(119040, 119295 + 1), + "Ancient Greek Musical Notation": range(119296, 119375 + 1), + "Tai Xuan Jing Symbols": range(119552, 119647 + 1), + "Counting Rod Numerals": range(119648, 119679 + 1), + "Mathematical Alphanumeric Symbols": range(119808, 120831 + 1), + "Sutton SignWriting": range(120832, 121519 + 1), + "Glagolitic Supplement": range(122880, 122927 + 1), + "Mende Kikakui": range(124928, 125151 + 1), + "Adlam": range(125184, 125279 + 1), + "Arabic Mathematical Alphabetic Symbols": range(126464, 126719 + 1), + "Mahjong Tiles": range(126976, 127023 + 1), + "Domino Tiles": range(127024, 127135 + 1), + "Playing Cards": range(127136, 127231 + 1), + "Enclosed Alphanumeric Supplement": range(127232, 127487 + 1), + "Enclosed Ideographic Supplement": range(127488, 127743 + 1), + "Miscellaneous Symbols and Pictographs": range(127744, 128511 + 1), + "Emoticons range(Emoji)": range(128512, 128591 + 1), + "Ornamental Dingbats": range(128592, 128639 + 1), + "Transport and Map Symbols": range(128640, 128767 + 1), + "Alchemical Symbols": range(128768, 128895 + 1), + "Geometric Shapes Extended": range(128896, 129023 + 1), + "Supplemental Arrows-C": range(129024, 129279 + 1), + "Supplemental Symbols and Pictographs": range(129280, 129535 + 1), + "CJK Unified Ideographs Extension B": range(131072, 173791 + 1), + "CJK Unified Ideographs Extension C": range(173824, 177983 + 1), + "CJK Unified Ideographs Extension D": range(177984, 178207 + 1), + "CJK Unified Ideographs Extension E": range(178208, 183983 + 1), + "CJK Unified Ideographs Extension F": range(183984, 191471 + 1), + "CJK Compatibility Ideographs Supplement": range(194560, 195103 + 1), + "Tags": range(917504, 917631 + 1), + "Variation Selectors Supplement": range(917760, 917999 + 1), +} + + +UNICODE_SECONDARY_RANGE_KEYWORD: List[str] = [ + "Supplement", + "Extended", + "Extensions", + "Modifier", + "Marks", + "Punctuation", + "Symbols", + "Forms", + "Operators", + "Miscellaneous", + "Drawing", + "Block", + "Shapes", + "Supplemental", + "Tags", +] + +RE_POSSIBLE_ENCODING_INDICATION = re_compile( + r"(?:(?:encoding)|(?:charset)|(?:coding))(?:[\:= ]{1,10})(?:[\"\']?)([a-zA-Z0-9\-_]+)(?:[\"\']?)", + IGNORECASE, +) + +IANA_SUPPORTED: List[str] = sorted( + filter( + lambda x: x.endswith("_codec") is False + and x not in {"rot_13", "tactis", "mbcs"}, + list(set(aliases.values())), + ) +) + +IANA_SUPPORTED_COUNT: int = len(IANA_SUPPORTED) + +# pre-computed code page that are similar using the function cp_similarity. +IANA_SUPPORTED_SIMILAR: Dict[str, List[str]] = { + "cp037": ["cp1026", "cp1140", "cp273", "cp500"], + "cp1026": ["cp037", "cp1140", "cp273", "cp500"], + "cp1125": ["cp866"], + "cp1140": ["cp037", "cp1026", "cp273", "cp500"], + "cp1250": ["iso8859_2"], + "cp1251": ["kz1048", "ptcp154"], + "cp1252": ["iso8859_15", "iso8859_9", "latin_1"], + "cp1253": ["iso8859_7"], + "cp1254": ["iso8859_15", "iso8859_9", "latin_1"], + "cp1257": ["iso8859_13"], + "cp273": ["cp037", "cp1026", "cp1140", "cp500"], + "cp437": ["cp850", "cp858", "cp860", "cp861", "cp862", "cp863", "cp865"], + "cp500": ["cp037", "cp1026", "cp1140", "cp273"], + "cp850": ["cp437", "cp857", "cp858", "cp865"], + "cp857": ["cp850", "cp858", "cp865"], + "cp858": ["cp437", "cp850", "cp857", "cp865"], + "cp860": ["cp437", "cp861", "cp862", "cp863", "cp865"], + "cp861": ["cp437", "cp860", "cp862", "cp863", "cp865"], + "cp862": ["cp437", "cp860", "cp861", "cp863", "cp865"], + "cp863": ["cp437", "cp860", "cp861", "cp862", "cp865"], + "cp865": ["cp437", "cp850", "cp857", "cp858", "cp860", "cp861", "cp862", "cp863"], + "cp866": ["cp1125"], + "iso8859_10": ["iso8859_14", "iso8859_15", "iso8859_4", "iso8859_9", "latin_1"], + "iso8859_11": ["tis_620"], + "iso8859_13": ["cp1257"], + "iso8859_14": [ + "iso8859_10", + "iso8859_15", + "iso8859_16", + "iso8859_3", + "iso8859_9", + "latin_1", + ], + "iso8859_15": [ + "cp1252", + "cp1254", + "iso8859_10", + "iso8859_14", + "iso8859_16", + "iso8859_3", + "iso8859_9", + "latin_1", + ], + "iso8859_16": [ + "iso8859_14", + "iso8859_15", + "iso8859_2", + "iso8859_3", + "iso8859_9", + "latin_1", + ], + "iso8859_2": ["cp1250", "iso8859_16", "iso8859_4"], + "iso8859_3": ["iso8859_14", "iso8859_15", "iso8859_16", "iso8859_9", "latin_1"], + "iso8859_4": ["iso8859_10", "iso8859_2", "iso8859_9", "latin_1"], + "iso8859_7": ["cp1253"], + "iso8859_9": [ + "cp1252", + "cp1254", + "cp1258", + "iso8859_10", + "iso8859_14", + "iso8859_15", + "iso8859_16", + "iso8859_3", + "iso8859_4", + "latin_1", + ], + "kz1048": ["cp1251", "ptcp154"], + "latin_1": [ + "cp1252", + "cp1254", + "cp1258", + "iso8859_10", + "iso8859_14", + "iso8859_15", + "iso8859_16", + "iso8859_3", + "iso8859_4", + "iso8859_9", + ], + "mac_iceland": ["mac_roman", "mac_turkish"], + "mac_roman": ["mac_iceland", "mac_turkish"], + "mac_turkish": ["mac_iceland", "mac_roman"], + "ptcp154": ["cp1251", "kz1048"], + "tis_620": ["iso8859_11"], +} + + +CHARDET_CORRESPONDENCE: Dict[str, str] = { + "iso2022_kr": "ISO-2022-KR", + "iso2022_jp": "ISO-2022-JP", + "euc_kr": "EUC-KR", + "tis_620": "TIS-620", + "utf_32": "UTF-32", + "euc_jp": "EUC-JP", + "koi8_r": "KOI8-R", + "iso8859_1": "ISO-8859-1", + "iso8859_2": "ISO-8859-2", + "iso8859_5": "ISO-8859-5", + "iso8859_6": "ISO-8859-6", + "iso8859_7": "ISO-8859-7", + "iso8859_8": "ISO-8859-8", + "utf_16": "UTF-16", + "cp855": "IBM855", + "mac_cyrillic": "MacCyrillic", + "gb2312": "GB2312", + "gb18030": "GB18030", + "cp932": "CP932", + "cp866": "IBM866", + "utf_8": "utf-8", + "utf_8_sig": "UTF-8-SIG", + "shift_jis": "SHIFT_JIS", + "big5": "Big5", + "cp1250": "windows-1250", + "cp1251": "windows-1251", + "cp1252": "Windows-1252", + "cp1253": "windows-1253", + "cp1255": "windows-1255", + "cp1256": "windows-1256", + "cp1254": "Windows-1254", + "cp949": "CP949", +} + + +COMMON_SAFE_ASCII_CHARACTERS: Set[str] = { + "<", + ">", + "=", + ":", + "/", + "&", + ";", + "{", + "}", + "[", + "]", + ",", + "|", + '"', + "-", +} + + +KO_NAMES: Set[str] = {"johab", "cp949", "euc_kr"} +ZH_NAMES: Set[str] = {"big5", "cp950", "big5hkscs", "hz"} + +NOT_PRINTABLE_PATTERN = re_compile(r"[0-9\W\n\r\t]+") + +LANGUAGE_SUPPORTED_COUNT: int = len(FREQUENCIES) + +# Logging LEVEL bellow DEBUG +TRACE: int = 5 diff --git a/sbsheriff/Lib/site-packages/charset_normalizer/legacy.py b/sbsheriff/Lib/site-packages/charset_normalizer/legacy.py new file mode 100644 index 0000000..cdebe2b --- /dev/null +++ b/sbsheriff/Lib/site-packages/charset_normalizer/legacy.py @@ -0,0 +1,95 @@ +import warnings +from typing import Dict, Optional, Union + +from .api import from_bytes, from_fp, from_path, normalize +from .constant import CHARDET_CORRESPONDENCE +from .models import CharsetMatch, CharsetMatches + + +def detect(byte_str: bytes) -> Dict[str, Optional[Union[str, float]]]: + """ + chardet legacy method + Detect the encoding of the given byte string. It should be mostly backward-compatible. + Encoding name will match Chardet own writing whenever possible. (Not on encoding name unsupported by it) + This function is deprecated and should be used to migrate your project easily, consult the documentation for + further information. Not planned for removal. + + :param byte_str: The byte sequence to examine. + """ + if not isinstance(byte_str, (bytearray, bytes)): + raise TypeError( # pragma: nocover + "Expected object of type bytes or bytearray, got: " + "{0}".format(type(byte_str)) + ) + + if isinstance(byte_str, bytearray): + byte_str = bytes(byte_str) + + r = from_bytes(byte_str).best() + + encoding = r.encoding if r is not None else None + language = r.language if r is not None and r.language != "Unknown" else "" + confidence = 1.0 - r.chaos if r is not None else None + + # Note: CharsetNormalizer does not return 'UTF-8-SIG' as the sig get stripped in the detection/normalization process + # but chardet does return 'utf-8-sig' and it is a valid codec name. + if r is not None and encoding == "utf_8" and r.bom: + encoding += "_sig" + + return { + "encoding": encoding + if encoding not in CHARDET_CORRESPONDENCE + else CHARDET_CORRESPONDENCE[encoding], + "language": language, + "confidence": confidence, + } + + +class CharsetNormalizerMatch(CharsetMatch): + pass + + +class CharsetNormalizerMatches(CharsetMatches): + @staticmethod + def from_fp(*args, **kwargs): # type: ignore + warnings.warn( # pragma: nocover + "staticmethod from_fp, from_bytes, from_path and normalize are deprecated " + "and scheduled to be removed in 3.0", + DeprecationWarning, + ) + return from_fp(*args, **kwargs) # pragma: nocover + + @staticmethod + def from_bytes(*args, **kwargs): # type: ignore + warnings.warn( # pragma: nocover + "staticmethod from_fp, from_bytes, from_path and normalize are deprecated " + "and scheduled to be removed in 3.0", + DeprecationWarning, + ) + return from_bytes(*args, **kwargs) # pragma: nocover + + @staticmethod + def from_path(*args, **kwargs): # type: ignore + warnings.warn( # pragma: nocover + "staticmethod from_fp, from_bytes, from_path and normalize are deprecated " + "and scheduled to be removed in 3.0", + DeprecationWarning, + ) + return from_path(*args, **kwargs) # pragma: nocover + + @staticmethod + def normalize(*args, **kwargs): # type: ignore + warnings.warn( # pragma: nocover + "staticmethod from_fp, from_bytes, from_path and normalize are deprecated " + "and scheduled to be removed in 3.0", + DeprecationWarning, + ) + return normalize(*args, **kwargs) # pragma: nocover + + +class CharsetDetector(CharsetNormalizerMatches): + pass + + +class CharsetDoctor(CharsetNormalizerMatches): + pass diff --git a/sbsheriff/Lib/site-packages/charset_normalizer/md.py b/sbsheriff/Lib/site-packages/charset_normalizer/md.py new file mode 100644 index 0000000..31808af --- /dev/null +++ b/sbsheriff/Lib/site-packages/charset_normalizer/md.py @@ -0,0 +1,553 @@ +from functools import lru_cache +from typing import List, Optional + +from .constant import COMMON_SAFE_ASCII_CHARACTERS, UNICODE_SECONDARY_RANGE_KEYWORD +from .utils import ( + is_accentuated, + is_ascii, + is_case_variable, + is_cjk, + is_emoticon, + is_hangul, + is_hiragana, + is_katakana, + is_latin, + is_punctuation, + is_separator, + is_symbol, + is_thai, + is_unprintable, + remove_accent, + unicode_range, +) + + +class MessDetectorPlugin: + """ + Base abstract class used for mess detection plugins. + All detectors MUST extend and implement given methods. + """ + + def eligible(self, character: str) -> bool: + """ + Determine if given character should be fed in. + """ + raise NotImplementedError # pragma: nocover + + def feed(self, character: str) -> None: + """ + The main routine to be executed upon character. + Insert the logic in witch the text would be considered chaotic. + """ + raise NotImplementedError # pragma: nocover + + def reset(self) -> None: # pragma: no cover + """ + Permit to reset the plugin to the initial state. + """ + raise NotImplementedError + + @property + def ratio(self) -> float: + """ + Compute the chaos ratio based on what your feed() has seen. + Must NOT be lower than 0.; No restriction gt 0. + """ + raise NotImplementedError # pragma: nocover + + +class TooManySymbolOrPunctuationPlugin(MessDetectorPlugin): + def __init__(self) -> None: + self._punctuation_count: int = 0 + self._symbol_count: int = 0 + self._character_count: int = 0 + + self._last_printable_char: Optional[str] = None + self._frenzy_symbol_in_word: bool = False + + def eligible(self, character: str) -> bool: + return character.isprintable() + + def feed(self, character: str) -> None: + self._character_count += 1 + + if ( + character != self._last_printable_char + and character not in COMMON_SAFE_ASCII_CHARACTERS + ): + if is_punctuation(character): + self._punctuation_count += 1 + elif ( + character.isdigit() is False + and is_symbol(character) + and is_emoticon(character) is False + ): + self._symbol_count += 2 + + self._last_printable_char = character + + def reset(self) -> None: # pragma: no cover + self._punctuation_count = 0 + self._character_count = 0 + self._symbol_count = 0 + + @property + def ratio(self) -> float: + if self._character_count == 0: + return 0.0 + + ratio_of_punctuation: float = ( + self._punctuation_count + self._symbol_count + ) / self._character_count + + return ratio_of_punctuation if ratio_of_punctuation >= 0.3 else 0.0 + + +class TooManyAccentuatedPlugin(MessDetectorPlugin): + def __init__(self) -> None: + self._character_count: int = 0 + self._accentuated_count: int = 0 + + def eligible(self, character: str) -> bool: + return character.isalpha() + + def feed(self, character: str) -> None: + self._character_count += 1 + + if is_accentuated(character): + self._accentuated_count += 1 + + def reset(self) -> None: # pragma: no cover + self._character_count = 0 + self._accentuated_count = 0 + + @property + def ratio(self) -> float: + if self._character_count == 0: + return 0.0 + ratio_of_accentuation: float = self._accentuated_count / self._character_count + return ratio_of_accentuation if ratio_of_accentuation >= 0.35 else 0.0 + + +class UnprintablePlugin(MessDetectorPlugin): + def __init__(self) -> None: + self._unprintable_count: int = 0 + self._character_count: int = 0 + + def eligible(self, character: str) -> bool: + return True + + def feed(self, character: str) -> None: + if is_unprintable(character): + self._unprintable_count += 1 + self._character_count += 1 + + def reset(self) -> None: # pragma: no cover + self._unprintable_count = 0 + + @property + def ratio(self) -> float: + if self._character_count == 0: + return 0.0 + + return (self._unprintable_count * 8) / self._character_count + + +class SuspiciousDuplicateAccentPlugin(MessDetectorPlugin): + def __init__(self) -> None: + self._successive_count: int = 0 + self._character_count: int = 0 + + self._last_latin_character: Optional[str] = None + + def eligible(self, character: str) -> bool: + return character.isalpha() and is_latin(character) + + def feed(self, character: str) -> None: + self._character_count += 1 + if ( + self._last_latin_character is not None + and is_accentuated(character) + and is_accentuated(self._last_latin_character) + ): + if character.isupper() and self._last_latin_character.isupper(): + self._successive_count += 1 + # Worse if its the same char duplicated with different accent. + if remove_accent(character) == remove_accent(self._last_latin_character): + self._successive_count += 1 + self._last_latin_character = character + + def reset(self) -> None: # pragma: no cover + self._successive_count = 0 + self._character_count = 0 + self._last_latin_character = None + + @property + def ratio(self) -> float: + if self._character_count == 0: + return 0.0 + + return (self._successive_count * 2) / self._character_count + + +class SuspiciousRange(MessDetectorPlugin): + def __init__(self) -> None: + self._suspicious_successive_range_count: int = 0 + self._character_count: int = 0 + self._last_printable_seen: Optional[str] = None + + def eligible(self, character: str) -> bool: + return character.isprintable() + + def feed(self, character: str) -> None: + self._character_count += 1 + + if ( + character.isspace() + or is_punctuation(character) + or character in COMMON_SAFE_ASCII_CHARACTERS + ): + self._last_printable_seen = None + return + + if self._last_printable_seen is None: + self._last_printable_seen = character + return + + unicode_range_a: Optional[str] = unicode_range(self._last_printable_seen) + unicode_range_b: Optional[str] = unicode_range(character) + + if is_suspiciously_successive_range(unicode_range_a, unicode_range_b): + self._suspicious_successive_range_count += 1 + + self._last_printable_seen = character + + def reset(self) -> None: # pragma: no cover + self._character_count = 0 + self._suspicious_successive_range_count = 0 + self._last_printable_seen = None + + @property + def ratio(self) -> float: + if self._character_count == 0: + return 0.0 + + ratio_of_suspicious_range_usage: float = ( + self._suspicious_successive_range_count * 2 + ) / self._character_count + + if ratio_of_suspicious_range_usage < 0.1: + return 0.0 + + return ratio_of_suspicious_range_usage + + +class SuperWeirdWordPlugin(MessDetectorPlugin): + def __init__(self) -> None: + self._word_count: int = 0 + self._bad_word_count: int = 0 + self._foreign_long_count: int = 0 + + self._is_current_word_bad: bool = False + self._foreign_long_watch: bool = False + + self._character_count: int = 0 + self._bad_character_count: int = 0 + + self._buffer: str = "" + self._buffer_accent_count: int = 0 + + def eligible(self, character: str) -> bool: + return True + + def feed(self, character: str) -> None: + if character.isalpha(): + self._buffer += character + if is_accentuated(character): + self._buffer_accent_count += 1 + if ( + self._foreign_long_watch is False + and (is_latin(character) is False or is_accentuated(character)) + and is_cjk(character) is False + and is_hangul(character) is False + and is_katakana(character) is False + and is_hiragana(character) is False + and is_thai(character) is False + ): + self._foreign_long_watch = True + return + if not self._buffer: + return + if ( + character.isspace() or is_punctuation(character) or is_separator(character) + ) and self._buffer: + self._word_count += 1 + buffer_length: int = len(self._buffer) + + self._character_count += buffer_length + + if buffer_length >= 4: + if self._buffer_accent_count / buffer_length > 0.34: + self._is_current_word_bad = True + # Word/Buffer ending with a upper case accentuated letter are so rare, + # that we will consider them all as suspicious. Same weight as foreign_long suspicious. + if is_accentuated(self._buffer[-1]) and self._buffer[-1].isupper(): + self._foreign_long_count += 1 + self._is_current_word_bad = True + if buffer_length >= 24 and self._foreign_long_watch: + self._foreign_long_count += 1 + self._is_current_word_bad = True + + if self._is_current_word_bad: + self._bad_word_count += 1 + self._bad_character_count += len(self._buffer) + self._is_current_word_bad = False + + self._foreign_long_watch = False + self._buffer = "" + self._buffer_accent_count = 0 + elif ( + character not in {"<", ">", "-", "=", "~", "|", "_"} + and character.isdigit() is False + and is_symbol(character) + ): + self._is_current_word_bad = True + self._buffer += character + + def reset(self) -> None: # pragma: no cover + self._buffer = "" + self._is_current_word_bad = False + self._foreign_long_watch = False + self._bad_word_count = 0 + self._word_count = 0 + self._character_count = 0 + self._bad_character_count = 0 + self._foreign_long_count = 0 + + @property + def ratio(self) -> float: + if self._word_count <= 10 and self._foreign_long_count == 0: + return 0.0 + + return self._bad_character_count / self._character_count + + +class CjkInvalidStopPlugin(MessDetectorPlugin): + """ + GB(Chinese) based encoding often render the stop incorrectly when the content does not fit and + can be easily detected. Searching for the overuse of '丅' and '丄'. + """ + + def __init__(self) -> None: + self._wrong_stop_count: int = 0 + self._cjk_character_count: int = 0 + + def eligible(self, character: str) -> bool: + return True + + def feed(self, character: str) -> None: + if character in {"丅", "丄"}: + self._wrong_stop_count += 1 + return + if is_cjk(character): + self._cjk_character_count += 1 + + def reset(self) -> None: # pragma: no cover + self._wrong_stop_count = 0 + self._cjk_character_count = 0 + + @property + def ratio(self) -> float: + if self._cjk_character_count < 16: + return 0.0 + return self._wrong_stop_count / self._cjk_character_count + + +class ArchaicUpperLowerPlugin(MessDetectorPlugin): + def __init__(self) -> None: + self._buf: bool = False + + self._character_count_since_last_sep: int = 0 + + self._successive_upper_lower_count: int = 0 + self._successive_upper_lower_count_final: int = 0 + + self._character_count: int = 0 + + self._last_alpha_seen: Optional[str] = None + self._current_ascii_only: bool = True + + def eligible(self, character: str) -> bool: + return True + + def feed(self, character: str) -> None: + is_concerned = character.isalpha() and is_case_variable(character) + chunk_sep = is_concerned is False + + if chunk_sep and self._character_count_since_last_sep > 0: + if ( + self._character_count_since_last_sep <= 64 + and character.isdigit() is False + and self._current_ascii_only is False + ): + self._successive_upper_lower_count_final += ( + self._successive_upper_lower_count + ) + + self._successive_upper_lower_count = 0 + self._character_count_since_last_sep = 0 + self._last_alpha_seen = None + self._buf = False + self._character_count += 1 + self._current_ascii_only = True + + return + + if self._current_ascii_only is True and is_ascii(character) is False: + self._current_ascii_only = False + + if self._last_alpha_seen is not None: + if (character.isupper() and self._last_alpha_seen.islower()) or ( + character.islower() and self._last_alpha_seen.isupper() + ): + if self._buf is True: + self._successive_upper_lower_count += 2 + self._buf = False + else: + self._buf = True + else: + self._buf = False + + self._character_count += 1 + self._character_count_since_last_sep += 1 + self._last_alpha_seen = character + + def reset(self) -> None: # pragma: no cover + self._character_count = 0 + self._character_count_since_last_sep = 0 + self._successive_upper_lower_count = 0 + self._successive_upper_lower_count_final = 0 + self._last_alpha_seen = None + self._buf = False + self._current_ascii_only = True + + @property + def ratio(self) -> float: + if self._character_count == 0: + return 0.0 + + return self._successive_upper_lower_count_final / self._character_count + + +@lru_cache(maxsize=1024) +def is_suspiciously_successive_range( + unicode_range_a: Optional[str], unicode_range_b: Optional[str] +) -> bool: + """ + Determine if two Unicode range seen next to each other can be considered as suspicious. + """ + if unicode_range_a is None or unicode_range_b is None: + return True + + if unicode_range_a == unicode_range_b: + return False + + if "Latin" in unicode_range_a and "Latin" in unicode_range_b: + return False + + if "Emoticons" in unicode_range_a or "Emoticons" in unicode_range_b: + return False + + # Latin characters can be accompanied with a combining diacritical mark + # eg. Vietnamese. + if ("Latin" in unicode_range_a or "Latin" in unicode_range_b) and ( + "Combining" in unicode_range_a or "Combining" in unicode_range_b + ): + return False + + keywords_range_a, keywords_range_b = unicode_range_a.split( + " " + ), unicode_range_b.split(" ") + + for el in keywords_range_a: + if el in UNICODE_SECONDARY_RANGE_KEYWORD: + continue + if el in keywords_range_b: + return False + + # Japanese Exception + range_a_jp_chars, range_b_jp_chars = ( + unicode_range_a + in ( + "Hiragana", + "Katakana", + ), + unicode_range_b in ("Hiragana", "Katakana"), + ) + if (range_a_jp_chars or range_b_jp_chars) and ( + "CJK" in unicode_range_a or "CJK" in unicode_range_b + ): + return False + if range_a_jp_chars and range_b_jp_chars: + return False + + if "Hangul" in unicode_range_a or "Hangul" in unicode_range_b: + if "CJK" in unicode_range_a or "CJK" in unicode_range_b: + return False + if unicode_range_a == "Basic Latin" or unicode_range_b == "Basic Latin": + return False + + # Chinese/Japanese use dedicated range for punctuation and/or separators. + if ("CJK" in unicode_range_a or "CJK" in unicode_range_b) or ( + unicode_range_a in ["Katakana", "Hiragana"] + and unicode_range_b in ["Katakana", "Hiragana"] + ): + if "Punctuation" in unicode_range_a or "Punctuation" in unicode_range_b: + return False + if "Forms" in unicode_range_a or "Forms" in unicode_range_b: + return False + + return True + + +@lru_cache(maxsize=2048) +def mess_ratio( + decoded_sequence: str, maximum_threshold: float = 0.2, debug: bool = False +) -> float: + """ + Compute a mess ratio given a decoded bytes sequence. The maximum threshold does stop the computation earlier. + """ + + detectors: List[MessDetectorPlugin] = [ + md_class() for md_class in MessDetectorPlugin.__subclasses__() + ] + + length: int = len(decoded_sequence) + 1 + + mean_mess_ratio: float = 0.0 + + if length < 512: + intermediary_mean_mess_ratio_calc: int = 32 + elif length <= 1024: + intermediary_mean_mess_ratio_calc = 64 + else: + intermediary_mean_mess_ratio_calc = 128 + + for character, index in zip(decoded_sequence + "\n", range(length)): + for detector in detectors: + if detector.eligible(character): + detector.feed(character) + + if ( + index > 0 and index % intermediary_mean_mess_ratio_calc == 0 + ) or index == length - 1: + mean_mess_ratio = sum(dt.ratio for dt in detectors) + + if mean_mess_ratio >= maximum_threshold: + break + + if debug: + for dt in detectors: # pragma: nocover + print(dt.__class__, dt.ratio) + + return round(mean_mess_ratio, 3) diff --git a/sbsheriff/Lib/site-packages/charset_normalizer/models.py b/sbsheriff/Lib/site-packages/charset_normalizer/models.py new file mode 100644 index 0000000..ccb0d47 --- /dev/null +++ b/sbsheriff/Lib/site-packages/charset_normalizer/models.py @@ -0,0 +1,401 @@ +import warnings +from collections import Counter +from encodings.aliases import aliases +from hashlib import sha256 +from json import dumps +from re import sub +from typing import ( + Any, + Counter as TypeCounter, + Dict, + Iterator, + List, + Optional, + Tuple, + Union, +) + +from .constant import NOT_PRINTABLE_PATTERN, TOO_BIG_SEQUENCE +from .md import mess_ratio +from .utils import iana_name, is_multi_byte_encoding, unicode_range + + +class CharsetMatch: + def __init__( + self, + payload: bytes, + guessed_encoding: str, + mean_mess_ratio: float, + has_sig_or_bom: bool, + languages: "CoherenceMatches", + decoded_payload: Optional[str] = None, + ): + self._payload: bytes = payload + + self._encoding: str = guessed_encoding + self._mean_mess_ratio: float = mean_mess_ratio + self._languages: CoherenceMatches = languages + self._has_sig_or_bom: bool = has_sig_or_bom + self._unicode_ranges: Optional[List[str]] = None + + self._leaves: List[CharsetMatch] = [] + self._mean_coherence_ratio: float = 0.0 + + self._output_payload: Optional[bytes] = None + self._output_encoding: Optional[str] = None + + self._string: Optional[str] = decoded_payload + + def __eq__(self, other: object) -> bool: + if not isinstance(other, CharsetMatch): + raise TypeError( + "__eq__ cannot be invoked on {} and {}.".format( + str(other.__class__), str(self.__class__) + ) + ) + return self.encoding == other.encoding and self.fingerprint == other.fingerprint + + def __lt__(self, other: object) -> bool: + """ + Implemented to make sorted available upon CharsetMatches items. + """ + if not isinstance(other, CharsetMatch): + raise ValueError + + chaos_difference: float = abs(self.chaos - other.chaos) + coherence_difference: float = abs(self.coherence - other.coherence) + + # Bellow 1% difference --> Use Coherence + if chaos_difference < 0.01 and coherence_difference > 0.02: + # When having a tough decision, use the result that decoded as many multi-byte as possible. + if chaos_difference == 0.0 and self.coherence == other.coherence: + return self.multi_byte_usage > other.multi_byte_usage + return self.coherence > other.coherence + + return self.chaos < other.chaos + + @property + def multi_byte_usage(self) -> float: + return 1.0 - len(str(self)) / len(self.raw) + + @property + def chaos_secondary_pass(self) -> float: + """ + Check once again chaos in decoded text, except this time, with full content. + Use with caution, this can be very slow. + Notice: Will be removed in 3.0 + """ + warnings.warn( + "chaos_secondary_pass is deprecated and will be removed in 3.0", + DeprecationWarning, + ) + return mess_ratio(str(self), 1.0) + + @property + def coherence_non_latin(self) -> float: + """ + Coherence ratio on the first non-latin language detected if ANY. + Notice: Will be removed in 3.0 + """ + warnings.warn( + "coherence_non_latin is deprecated and will be removed in 3.0", + DeprecationWarning, + ) + return 0.0 + + @property + def w_counter(self) -> TypeCounter[str]: + """ + Word counter instance on decoded text. + Notice: Will be removed in 3.0 + """ + warnings.warn( + "w_counter is deprecated and will be removed in 3.0", DeprecationWarning + ) + + string_printable_only = sub(NOT_PRINTABLE_PATTERN, " ", str(self).lower()) + + return Counter(string_printable_only.split()) + + def __str__(self) -> str: + # Lazy Str Loading + if self._string is None: + self._string = str(self._payload, self._encoding, "strict") + return self._string + + def __repr__(self) -> str: + return "".format(self.encoding, self.fingerprint) + + def add_submatch(self, other: "CharsetMatch") -> None: + if not isinstance(other, CharsetMatch) or other == self: + raise ValueError( + "Unable to add instance <{}> as a submatch of a CharsetMatch".format( + other.__class__ + ) + ) + + other._string = None # Unload RAM usage; dirty trick. + self._leaves.append(other) + + @property + def encoding(self) -> str: + return self._encoding + + @property + def encoding_aliases(self) -> List[str]: + """ + Encoding name are known by many name, using this could help when searching for IBM855 when it's listed as CP855. + """ + also_known_as: List[str] = [] + for u, p in aliases.items(): + if self.encoding == u: + also_known_as.append(p) + elif self.encoding == p: + also_known_as.append(u) + return also_known_as + + @property + def bom(self) -> bool: + return self._has_sig_or_bom + + @property + def byte_order_mark(self) -> bool: + return self._has_sig_or_bom + + @property + def languages(self) -> List[str]: + """ + Return the complete list of possible languages found in decoded sequence. + Usually not really useful. Returned list may be empty even if 'language' property return something != 'Unknown'. + """ + return [e[0] for e in self._languages] + + @property + def language(self) -> str: + """ + Most probable language found in decoded sequence. If none were detected or inferred, the property will return + "Unknown". + """ + if not self._languages: + # Trying to infer the language based on the given encoding + # Its either English or we should not pronounce ourselves in certain cases. + if "ascii" in self.could_be_from_charset: + return "English" + + # doing it there to avoid circular import + from charset_normalizer.cd import encoding_languages, mb_encoding_languages + + languages = ( + mb_encoding_languages(self.encoding) + if is_multi_byte_encoding(self.encoding) + else encoding_languages(self.encoding) + ) + + if len(languages) == 0 or "Latin Based" in languages: + return "Unknown" + + return languages[0] + + return self._languages[0][0] + + @property + def chaos(self) -> float: + return self._mean_mess_ratio + + @property + def coherence(self) -> float: + if not self._languages: + return 0.0 + return self._languages[0][1] + + @property + def percent_chaos(self) -> float: + return round(self.chaos * 100, ndigits=3) + + @property + def percent_coherence(self) -> float: + return round(self.coherence * 100, ndigits=3) + + @property + def raw(self) -> bytes: + """ + Original untouched bytes. + """ + return self._payload + + @property + def submatch(self) -> List["CharsetMatch"]: + return self._leaves + + @property + def has_submatch(self) -> bool: + return len(self._leaves) > 0 + + @property + def alphabets(self) -> List[str]: + if self._unicode_ranges is not None: + return self._unicode_ranges + # list detected ranges + detected_ranges: List[Optional[str]] = [ + unicode_range(char) for char in str(self) + ] + # filter and sort + self._unicode_ranges = sorted(list({r for r in detected_ranges if r})) + return self._unicode_ranges + + @property + def could_be_from_charset(self) -> List[str]: + """ + The complete list of encoding that output the exact SAME str result and therefore could be the originating + encoding. + This list does include the encoding available in property 'encoding'. + """ + return [self._encoding] + [m.encoding for m in self._leaves] + + def first(self) -> "CharsetMatch": + """ + Kept for BC reasons. Will be removed in 3.0. + """ + return self + + def best(self) -> "CharsetMatch": + """ + Kept for BC reasons. Will be removed in 3.0. + """ + return self + + def output(self, encoding: str = "utf_8") -> bytes: + """ + Method to get re-encoded bytes payload using given target encoding. Default to UTF-8. + Any errors will be simply ignored by the encoder NOT replaced. + """ + if self._output_encoding is None or self._output_encoding != encoding: + self._output_encoding = encoding + self._output_payload = str(self).encode(encoding, "replace") + + return self._output_payload # type: ignore + + @property + def fingerprint(self) -> str: + """ + Retrieve the unique SHA256 computed using the transformed (re-encoded) payload. Not the original one. + """ + return sha256(self.output()).hexdigest() + + +class CharsetMatches: + """ + Container with every CharsetMatch items ordered by default from most probable to the less one. + Act like a list(iterable) but does not implements all related methods. + """ + + def __init__(self, results: Optional[List[CharsetMatch]] = None): + self._results: List[CharsetMatch] = sorted(results) if results else [] + + def __iter__(self) -> Iterator[CharsetMatch]: + yield from self._results + + def __getitem__(self, item: Union[int, str]) -> CharsetMatch: + """ + Retrieve a single item either by its position or encoding name (alias may be used here). + Raise KeyError upon invalid index or encoding not present in results. + """ + if isinstance(item, int): + return self._results[item] + if isinstance(item, str): + item = iana_name(item, False) + for result in self._results: + if item in result.could_be_from_charset: + return result + raise KeyError + + def __len__(self) -> int: + return len(self._results) + + def __bool__(self) -> bool: + return len(self._results) > 0 + + def append(self, item: CharsetMatch) -> None: + """ + Insert a single match. Will be inserted accordingly to preserve sort. + Can be inserted as a submatch. + """ + if not isinstance(item, CharsetMatch): + raise ValueError( + "Cannot append instance '{}' to CharsetMatches".format( + str(item.__class__) + ) + ) + # We should disable the submatch factoring when the input file is too heavy (conserve RAM usage) + if len(item.raw) <= TOO_BIG_SEQUENCE: + for match in self._results: + if match.fingerprint == item.fingerprint and match.chaos == item.chaos: + match.add_submatch(item) + return + self._results.append(item) + self._results = sorted(self._results) + + def best(self) -> Optional["CharsetMatch"]: + """ + Simply return the first match. Strict equivalent to matches[0]. + """ + if not self._results: + return None + return self._results[0] + + def first(self) -> Optional["CharsetMatch"]: + """ + Redundant method, call the method best(). Kept for BC reasons. + """ + return self.best() + + +CoherenceMatch = Tuple[str, float] +CoherenceMatches = List[CoherenceMatch] + + +class CliDetectionResult: + def __init__( + self, + path: str, + encoding: Optional[str], + encoding_aliases: List[str], + alternative_encodings: List[str], + language: str, + alphabets: List[str], + has_sig_or_bom: bool, + chaos: float, + coherence: float, + unicode_path: Optional[str], + is_preferred: bool, + ): + self.path: str = path + self.unicode_path: Optional[str] = unicode_path + self.encoding: Optional[str] = encoding + self.encoding_aliases: List[str] = encoding_aliases + self.alternative_encodings: List[str] = alternative_encodings + self.language: str = language + self.alphabets: List[str] = alphabets + self.has_sig_or_bom: bool = has_sig_or_bom + self.chaos: float = chaos + self.coherence: float = coherence + self.is_preferred: bool = is_preferred + + @property + def __dict__(self) -> Dict[str, Any]: # type: ignore + return { + "path": self.path, + "encoding": self.encoding, + "encoding_aliases": self.encoding_aliases, + "alternative_encodings": self.alternative_encodings, + "language": self.language, + "alphabets": self.alphabets, + "has_sig_or_bom": self.has_sig_or_bom, + "chaos": self.chaos, + "coherence": self.coherence, + "unicode_path": self.unicode_path, + "is_preferred": self.is_preferred, + } + + def to_json(self) -> str: + return dumps(self.__dict__, ensure_ascii=True, indent=4) diff --git a/sbsheriff/Lib/site-packages/charset_normalizer/py.typed b/sbsheriff/Lib/site-packages/charset_normalizer/py.typed new file mode 100644 index 0000000..e69de29 diff --git a/sbsheriff/Lib/site-packages/charset_normalizer/utils.py b/sbsheriff/Lib/site-packages/charset_normalizer/utils.py new file mode 100644 index 0000000..859f212 --- /dev/null +++ b/sbsheriff/Lib/site-packages/charset_normalizer/utils.py @@ -0,0 +1,424 @@ +try: + # WARNING: unicodedata2 support is going to be removed in 3.0 + # Python is quickly catching up. + import unicodedata2 as unicodedata +except ImportError: + import unicodedata # type: ignore[no-redef] + +import importlib +import logging +from codecs import IncrementalDecoder +from encodings.aliases import aliases +from functools import lru_cache +from re import findall +from typing import Generator, List, Optional, Set, Tuple, Union + +from _multibytecodec import MultibyteIncrementalDecoder + +from .constant import ( + ENCODING_MARKS, + IANA_SUPPORTED_SIMILAR, + RE_POSSIBLE_ENCODING_INDICATION, + UNICODE_RANGES_COMBINED, + UNICODE_SECONDARY_RANGE_KEYWORD, + UTF8_MAXIMAL_ALLOCATION, +) + + +@lru_cache(maxsize=UTF8_MAXIMAL_ALLOCATION) +def is_accentuated(character: str) -> bool: + try: + description: str = unicodedata.name(character) + except ValueError: + return False + return ( + "WITH GRAVE" in description + or "WITH ACUTE" in description + or "WITH CEDILLA" in description + or "WITH DIAERESIS" in description + or "WITH CIRCUMFLEX" in description + or "WITH TILDE" in description + ) + + +@lru_cache(maxsize=UTF8_MAXIMAL_ALLOCATION) +def remove_accent(character: str) -> str: + decomposed: str = unicodedata.decomposition(character) + if not decomposed: + return character + + codes: List[str] = decomposed.split(" ") + + return chr(int(codes[0], 16)) + + +@lru_cache(maxsize=UTF8_MAXIMAL_ALLOCATION) +def unicode_range(character: str) -> Optional[str]: + """ + Retrieve the Unicode range official name from a single character. + """ + character_ord: int = ord(character) + + for range_name, ord_range in UNICODE_RANGES_COMBINED.items(): + if character_ord in ord_range: + return range_name + + return None + + +@lru_cache(maxsize=UTF8_MAXIMAL_ALLOCATION) +def is_latin(character: str) -> bool: + try: + description: str = unicodedata.name(character) + except ValueError: + return False + return "LATIN" in description + + +@lru_cache(maxsize=UTF8_MAXIMAL_ALLOCATION) +def is_ascii(character: str) -> bool: + try: + character.encode("ascii") + except UnicodeEncodeError: + return False + return True + + +@lru_cache(maxsize=UTF8_MAXIMAL_ALLOCATION) +def is_punctuation(character: str) -> bool: + character_category: str = unicodedata.category(character) + + if "P" in character_category: + return True + + character_range: Optional[str] = unicode_range(character) + + if character_range is None: + return False + + return "Punctuation" in character_range + + +@lru_cache(maxsize=UTF8_MAXIMAL_ALLOCATION) +def is_symbol(character: str) -> bool: + character_category: str = unicodedata.category(character) + + if "S" in character_category or "N" in character_category: + return True + + character_range: Optional[str] = unicode_range(character) + + if character_range is None: + return False + + return "Forms" in character_range + + +@lru_cache(maxsize=UTF8_MAXIMAL_ALLOCATION) +def is_emoticon(character: str) -> bool: + character_range: Optional[str] = unicode_range(character) + + if character_range is None: + return False + + return "Emoticons" in character_range + + +@lru_cache(maxsize=UTF8_MAXIMAL_ALLOCATION) +def is_separator(character: str) -> bool: + if character.isspace() or character in {"|", "+", ",", ";", "<", ">"}: + return True + + character_category: str = unicodedata.category(character) + + return "Z" in character_category + + +@lru_cache(maxsize=UTF8_MAXIMAL_ALLOCATION) +def is_case_variable(character: str) -> bool: + return character.islower() != character.isupper() + + +def is_private_use_only(character: str) -> bool: + character_category: str = unicodedata.category(character) + + return character_category == "Co" + + +@lru_cache(maxsize=UTF8_MAXIMAL_ALLOCATION) +def is_cjk(character: str) -> bool: + try: + character_name = unicodedata.name(character) + except ValueError: + return False + + return "CJK" in character_name + + +@lru_cache(maxsize=UTF8_MAXIMAL_ALLOCATION) +def is_hiragana(character: str) -> bool: + try: + character_name = unicodedata.name(character) + except ValueError: + return False + + return "HIRAGANA" in character_name + + +@lru_cache(maxsize=UTF8_MAXIMAL_ALLOCATION) +def is_katakana(character: str) -> bool: + try: + character_name = unicodedata.name(character) + except ValueError: + return False + + return "KATAKANA" in character_name + + +@lru_cache(maxsize=UTF8_MAXIMAL_ALLOCATION) +def is_hangul(character: str) -> bool: + try: + character_name = unicodedata.name(character) + except ValueError: + return False + + return "HANGUL" in character_name + + +@lru_cache(maxsize=UTF8_MAXIMAL_ALLOCATION) +def is_thai(character: str) -> bool: + try: + character_name = unicodedata.name(character) + except ValueError: + return False + + return "THAI" in character_name + + +@lru_cache(maxsize=len(UNICODE_RANGES_COMBINED)) +def is_unicode_range_secondary(range_name: str) -> bool: + return any(keyword in range_name for keyword in UNICODE_SECONDARY_RANGE_KEYWORD) + + +@lru_cache(maxsize=UTF8_MAXIMAL_ALLOCATION) +def is_unprintable(character: str) -> bool: + return ( + character.isspace() is False # includes \n \t \r \v + and character.isprintable() is False + and character != "\x1A" # Why? Its the ASCII substitute character. + and character != "\ufeff" # bug discovered in Python, + # Zero Width No-Break Space located in Arabic Presentation Forms-B, Unicode 1.1 not acknowledged as space. + ) + + +def any_specified_encoding(sequence: bytes, search_zone: int = 4096) -> Optional[str]: + """ + Extract using ASCII-only decoder any specified encoding in the first n-bytes. + """ + if not isinstance(sequence, bytes): + raise TypeError + + seq_len: int = len(sequence) + + results: List[str] = findall( + RE_POSSIBLE_ENCODING_INDICATION, + sequence[: min(seq_len, search_zone)].decode("ascii", errors="ignore"), + ) + + if len(results) == 0: + return None + + for specified_encoding in results: + specified_encoding = specified_encoding.lower().replace("-", "_") + + encoding_alias: str + encoding_iana: str + + for encoding_alias, encoding_iana in aliases.items(): + if encoding_alias == specified_encoding: + return encoding_iana + if encoding_iana == specified_encoding: + return encoding_iana + + return None + + +@lru_cache(maxsize=128) +def is_multi_byte_encoding(name: str) -> bool: + """ + Verify is a specific encoding is a multi byte one based on it IANA name + """ + return name in { + "utf_8", + "utf_8_sig", + "utf_16", + "utf_16_be", + "utf_16_le", + "utf_32", + "utf_32_le", + "utf_32_be", + "utf_7", + } or issubclass( + importlib.import_module("encodings.{}".format(name)).IncrementalDecoder, + MultibyteIncrementalDecoder, + ) + + +def identify_sig_or_bom(sequence: bytes) -> Tuple[Optional[str], bytes]: + """ + Identify and extract SIG/BOM in given sequence. + """ + + for iana_encoding in ENCODING_MARKS: + marks: Union[bytes, List[bytes]] = ENCODING_MARKS[iana_encoding] + + if isinstance(marks, bytes): + marks = [marks] + + for mark in marks: + if sequence.startswith(mark): + return iana_encoding, mark + + return None, b"" + + +def should_strip_sig_or_bom(iana_encoding: str) -> bool: + return iana_encoding not in {"utf_16", "utf_32"} + + +def iana_name(cp_name: str, strict: bool = True) -> str: + cp_name = cp_name.lower().replace("-", "_") + + encoding_alias: str + encoding_iana: str + + for encoding_alias, encoding_iana in aliases.items(): + if cp_name in [encoding_alias, encoding_iana]: + return encoding_iana + + if strict: + raise ValueError("Unable to retrieve IANA for '{}'".format(cp_name)) + + return cp_name + + +def range_scan(decoded_sequence: str) -> List[str]: + ranges: Set[str] = set() + + for character in decoded_sequence: + character_range: Optional[str] = unicode_range(character) + + if character_range is None: + continue + + ranges.add(character_range) + + return list(ranges) + + +def cp_similarity(iana_name_a: str, iana_name_b: str) -> float: + + if is_multi_byte_encoding(iana_name_a) or is_multi_byte_encoding(iana_name_b): + return 0.0 + + decoder_a = importlib.import_module( + "encodings.{}".format(iana_name_a) + ).IncrementalDecoder + decoder_b = importlib.import_module( + "encodings.{}".format(iana_name_b) + ).IncrementalDecoder + + id_a: IncrementalDecoder = decoder_a(errors="ignore") + id_b: IncrementalDecoder = decoder_b(errors="ignore") + + character_match_count: int = 0 + + for i in range(255): + to_be_decoded: bytes = bytes([i]) + if id_a.decode(to_be_decoded) == id_b.decode(to_be_decoded): + character_match_count += 1 + + return character_match_count / 254 + + +def is_cp_similar(iana_name_a: str, iana_name_b: str) -> bool: + """ + Determine if two code page are at least 80% similar. IANA_SUPPORTED_SIMILAR dict was generated using + the function cp_similarity. + """ + return ( + iana_name_a in IANA_SUPPORTED_SIMILAR + and iana_name_b in IANA_SUPPORTED_SIMILAR[iana_name_a] + ) + + +def set_logging_handler( + name: str = "charset_normalizer", + level: int = logging.INFO, + format_string: str = "%(asctime)s | %(levelname)s | %(message)s", +) -> None: + + logger = logging.getLogger(name) + logger.setLevel(level) + + handler = logging.StreamHandler() + handler.setFormatter(logging.Formatter(format_string)) + logger.addHandler(handler) + + +def cut_sequence_chunks( + sequences: bytes, + encoding_iana: str, + offsets: range, + chunk_size: int, + bom_or_sig_available: bool, + strip_sig_or_bom: bool, + sig_payload: bytes, + is_multi_byte_decoder: bool, + decoded_payload: Optional[str] = None, +) -> Generator[str, None, None]: + + if decoded_payload and is_multi_byte_decoder is False: + for i in offsets: + chunk = decoded_payload[i : i + chunk_size] + if not chunk: + break + yield chunk + else: + for i in offsets: + chunk_end = i + chunk_size + if chunk_end > len(sequences) + 8: + continue + + cut_sequence = sequences[i : i + chunk_size] + + if bom_or_sig_available and strip_sig_or_bom is False: + cut_sequence = sig_payload + cut_sequence + + chunk = cut_sequence.decode( + encoding_iana, + errors="ignore" if is_multi_byte_decoder else "strict", + ) + + # multi-byte bad cutting detector and adjustment + # not the cleanest way to perform that fix but clever enough for now. + if is_multi_byte_decoder and i > 0 and sequences[i] >= 0x80: + + chunk_partial_size_chk: int = min(chunk_size, 16) + + if ( + decoded_payload + and chunk[:chunk_partial_size_chk] not in decoded_payload + ): + for j in range(i, i - 4, -1): + cut_sequence = sequences[j:chunk_end] + + if bom_or_sig_available and strip_sig_or_bom is False: + cut_sequence = sig_payload + cut_sequence + + chunk = cut_sequence.decode(encoding_iana, errors="ignore") + + if chunk[:chunk_partial_size_chk] in decoded_payload: + break + + yield chunk diff --git a/sbsheriff/Lib/site-packages/charset_normalizer/version.py b/sbsheriff/Lib/site-packages/charset_normalizer/version.py new file mode 100644 index 0000000..64c0dbd --- /dev/null +++ b/sbsheriff/Lib/site-packages/charset_normalizer/version.py @@ -0,0 +1,6 @@ +""" +Expose version +""" + +__version__ = "2.1.1" +VERSION = __version__.split(".") diff --git a/sbsheriff/Lib/site-packages/disnake-2.5.2.dist-info/INSTALLER b/sbsheriff/Lib/site-packages/disnake-2.5.2.dist-info/INSTALLER new file mode 100644 index 0000000..a1b589e --- /dev/null +++ b/sbsheriff/Lib/site-packages/disnake-2.5.2.dist-info/INSTALLER @@ -0,0 +1 @@ +pip diff --git a/sbsheriff/Lib/site-packages/disnake-2.5.2.dist-info/LICENSE b/sbsheriff/Lib/site-packages/disnake-2.5.2.dist-info/LICENSE new file mode 100644 index 0000000..4c0a44e --- /dev/null +++ b/sbsheriff/Lib/site-packages/disnake-2.5.2.dist-info/LICENSE @@ -0,0 +1,22 @@ +The MIT License (MIT) + +Copyright (c) 2015-2021 Rapptz +Copyright (c) 2021-present Disnake Development + +Permission is hereby granted, free of charge, to any person obtaining a +copy of this software and associated documentation files (the "Software"), +to deal in the Software without restriction, including without limitation +the rights to use, copy, modify, merge, publish, distribute, sublicense, +and/or sell copies of the Software, and to permit persons to whom the +Software is furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS +OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER +DEALINGS IN THE SOFTWARE. diff --git a/sbsheriff/Lib/site-packages/disnake-2.5.2.dist-info/METADATA b/sbsheriff/Lib/site-packages/disnake-2.5.2.dist-info/METADATA new file mode 100644 index 0000000..6f4c362 --- /dev/null +++ b/sbsheriff/Lib/site-packages/disnake-2.5.2.dist-info/METADATA @@ -0,0 +1,156 @@ +Metadata-Version: 2.1 +Name: disnake +Version: 2.5.2 +Summary: A Python wrapper for the Discord API +Home-page: https://github.com/DisnakeDev/disnake +Author: Rapptz, EQUENOS +License: MIT +Project-URL: Documentation, https://docs.disnake.dev/en/latest +Project-URL: Issue tracker, https://github.com/DisnakeDev/disnake/issues +Classifier: Development Status :: 5 - Production/Stable +Classifier: License :: OSI Approved :: MIT License +Classifier: Intended Audience :: Developers +Classifier: Natural Language :: English +Classifier: Operating System :: OS Independent +Classifier: Programming Language :: Python :: 3.8 +Classifier: Programming Language :: Python :: 3.9 +Classifier: Programming Language :: Python :: 3.10 +Classifier: Topic :: Internet +Classifier: Topic :: Software Development :: Libraries +Classifier: Topic :: Software Development :: Libraries :: Python Modules +Classifier: Topic :: Utilities +Classifier: Typing :: Typed +Requires-Python: >=3.8.0 +Description-Content-Type: text/markdown +License-File: LICENSE +Requires-Dist: aiohttp (<3.9.0,>=3.7.0) +Provides-Extra: discord +Requires-Dist: discord-disnake ; extra == 'discord' +Provides-Extra: docs +Requires-Dist: sphinx (~=4.4.0) ; extra == 'docs' +Requires-Dist: sphinxcontrib-trio (==1.1.2) ; extra == 'docs' +Requires-Dist: sphinx-hoverxref (~=1.0.0) ; extra == 'docs' +Requires-Dist: sphinx-autobuild (==2021.3.14) ; extra == 'docs' +Provides-Extra: speed +Requires-Dist: orjson (>=3.5.4) ; extra == 'speed' +Requires-Dist: aiodns (>=1.1) ; extra == 'speed' +Requires-Dist: Brotli ; extra == 'speed' +Requires-Dist: cchardet ; extra == 'speed' +Provides-Extra: voice +Requires-Dist: PyNaCl (<1.5,>=1.3.0) ; extra == 'voice' + +[![Disnake Banner](https://raw.githubusercontent.com/DisnakeDev/disnake/master/assets/banner.png)](https://disnake.dev/) + +disnake +======= + +

+ Discord server invite + PyPI version info + PyPI supported Python versions + Commit activity +

+ +A modern, easy to use, feature-rich, and async ready API wrapper for Discord written in Python. + +Key Features +------------ + +- Proper rate limit handling. +- Type-safety measures. +- [FastAPI](https://fastapi.tiangolo.com/)-like slash command syntax. + +The syntax and structure of `discord.py 2.0` is preserved. + +Installing +---------- + +**Python 3.8 or higher is required.** + +To install the library without full voice support, you can just run the +following command: + +``` sh +# Linux/macOS +python3 -m pip install -U disnake + +# Windows +py -3 -m pip install -U disnake +``` + +Installing `disnake` with full voice support requires you to replace `disnake` here, with `disnake[voice]`. To learn more about voice support (or installing the development version), please visit [this section of our guide](https://guide.disnake.dev/prerequisites/installing-disnake/). + +(You can optionally install [PyNaCl](https://pypi.org/project/PyNaCl/) for voice support.) + +Note that voice support on Linux requires installation of `libffi-dev` and `python-dev` packages, via your preferred package manager (e.g. `apt`, `dnf`, etc.) before running the following commands. + +Versioning +---------- + +This project does **not** quite follow semantic versioning; for more details, see [version guarantees](https://docs.disnake.dev/en/latest/version_guarantees.html). + +To be on the safe side and avoid unexpected breaking changes, pin the dependency to a minor version (e.g. `disnake==a.b.*` or `disnake~=a.b.c`) or an exact version (e.g. `disnake==a.b.c`). + +Quick Example +------------- + +### Slash Commands Example + +``` py +import disnake +from disnake.ext import commands + +bot = commands.InteractionBot(test_guilds=[12345]) + +@bot.slash_command() +async def ping(inter): + await inter.response.send_message("Pong!") + +bot.run("BOT_TOKEN") +``` + +### Context Menus Example + +``` py +import disnake +from disnake.ext import commands + +bot = commands.InteractionBot(test_guilds=[12345]) + +@bot.user_command() +async def avatar(inter, user): + embed = disnake.Embed(title=str(user)) + embed.set_image(url=user.display_avatar.url) + await inter.response.send_message(embed=embed) + +bot.run("BOT_TOKEN") +``` + +### Prefix Commands Example + +``` py +import disnake +from disnake.ext import commands + +bot = commands.Bot(command_prefix=commands.when_mentioned) + +@bot.command() +async def ping(ctx): + await ctx.send("Pong!") + +bot.run("BOT_TOKEN") +``` + +You can find more examples in the [examples directory](./examples). + +
+

+ Documentation + ⁕ + Guide + ⁕ + Discord Server + ⁕ + Discord Developers +

+
diff --git a/sbsheriff/Lib/site-packages/disnake-2.5.2.dist-info/RECORD b/sbsheriff/Lib/site-packages/disnake-2.5.2.dist-info/RECORD new file mode 100644 index 0000000..04fbb3d --- /dev/null +++ b/sbsheriff/Lib/site-packages/disnake-2.5.2.dist-info/RECORD @@ -0,0 +1,256 @@ +disnake-2.5.2.dist-info/INSTALLER,sha256=zuuue4knoyJ-UwPPXg8fezS7VCrXJQrAP7zeNuwvFQg,4 +disnake-2.5.2.dist-info/LICENSE,sha256=pB25mQJG0UEDi1ute6I2vSZKTQCrxesdN1zkrSX7Jx4,1125 +disnake-2.5.2.dist-info/METADATA,sha256=3ckVJnDrnYfWznki8OIMl48kqRW6O5oQfyKoKppPkJE,5342 +disnake-2.5.2.dist-info/RECORD,, +disnake-2.5.2.dist-info/REQUESTED,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 +disnake-2.5.2.dist-info/WHEEL,sha256=G16H4A3IeoQmnOrYV4ueZGKSjhipXx8zc8nu9FGlvMA,92 +disnake-2.5.2.dist-info/top_level.txt,sha256=bE9MjBh6vntNyVUSzAkqcDtaUBkeY3v6we6_-Yh_eBc,8 +disnake/__init__.py,sha256=UxrSzvjeBU7_vAs6niwFPwYcvbQQ6MIkdpy11zj6eOc,2017 +disnake/__main__.py,sha256=Kd9qHBfzeIxuanOuZMsdgVZgvrKYYOiskXN8Kjyhapo,10119 +disnake/__pycache__/__init__.cpython-310.pyc,, +disnake/__pycache__/__main__.cpython-310.pyc,, +disnake/__pycache__/abc.cpython-310.pyc,, +disnake/__pycache__/activity.cpython-310.pyc,, +disnake/__pycache__/app_commands.cpython-310.pyc,, +disnake/__pycache__/appinfo.cpython-310.pyc,, +disnake/__pycache__/asset.cpython-310.pyc,, +disnake/__pycache__/audit_logs.cpython-310.pyc,, +disnake/__pycache__/backoff.cpython-310.pyc,, +disnake/__pycache__/bans.cpython-310.pyc,, +disnake/__pycache__/channel.cpython-310.pyc,, +disnake/__pycache__/client.cpython-310.pyc,, +disnake/__pycache__/colour.cpython-310.pyc,, +disnake/__pycache__/components.cpython-310.pyc,, +disnake/__pycache__/context_managers.cpython-310.pyc,, +disnake/__pycache__/custom_warnings.cpython-310.pyc,, +disnake/__pycache__/embeds.cpython-310.pyc,, +disnake/__pycache__/emoji.cpython-310.pyc,, +disnake/__pycache__/enums.cpython-310.pyc,, +disnake/__pycache__/errors.cpython-310.pyc,, +disnake/__pycache__/file.cpython-310.pyc,, +disnake/__pycache__/flags.cpython-310.pyc,, +disnake/__pycache__/gateway.cpython-310.pyc,, +disnake/__pycache__/guild.cpython-310.pyc,, +disnake/__pycache__/guild_preview.cpython-310.pyc,, +disnake/__pycache__/guild_scheduled_event.cpython-310.pyc,, +disnake/__pycache__/http.cpython-310.pyc,, +disnake/__pycache__/i18n.cpython-310.pyc,, +disnake/__pycache__/integrations.cpython-310.pyc,, +disnake/__pycache__/invite.cpython-310.pyc,, +disnake/__pycache__/iterators.cpython-310.pyc,, +disnake/__pycache__/member.cpython-310.pyc,, +disnake/__pycache__/mentions.cpython-310.pyc,, +disnake/__pycache__/message.cpython-310.pyc,, +disnake/__pycache__/mixins.cpython-310.pyc,, +disnake/__pycache__/object.cpython-310.pyc,, +disnake/__pycache__/oggparse.cpython-310.pyc,, +disnake/__pycache__/opus.cpython-310.pyc,, +disnake/__pycache__/partial_emoji.cpython-310.pyc,, +disnake/__pycache__/permissions.cpython-310.pyc,, +disnake/__pycache__/player.cpython-310.pyc,, +disnake/__pycache__/raw_models.cpython-310.pyc,, +disnake/__pycache__/reaction.cpython-310.pyc,, +disnake/__pycache__/role.cpython-310.pyc,, +disnake/__pycache__/shard.cpython-310.pyc,, +disnake/__pycache__/stage_instance.cpython-310.pyc,, +disnake/__pycache__/state.cpython-310.pyc,, +disnake/__pycache__/sticker.cpython-310.pyc,, +disnake/__pycache__/team.cpython-310.pyc,, +disnake/__pycache__/template.cpython-310.pyc,, +disnake/__pycache__/threads.cpython-310.pyc,, +disnake/__pycache__/user.cpython-310.pyc,, +disnake/__pycache__/utils.cpython-310.pyc,, +disnake/__pycache__/voice_client.cpython-310.pyc,, +disnake/__pycache__/voice_region.cpython-310.pyc,, +disnake/__pycache__/welcome_screen.cpython-310.pyc,, +disnake/__pycache__/widget.cpython-310.pyc,, +disnake/abc.py,sha256=GkR1aNFaOblGANz1LZJMkeJUoE6cO1kEe1tQE2AAwVE,61532 +disnake/activity.py,sha256=CY78JIsr4ZxbqzvUUGvAoU4Q5BI3WjTJ25KHVL1AgXk,27232 +disnake/app_commands.py,sha256=YBoX9JPu-wEc6WqE8z5snAb9wblocUyRt0HcRivrBb8,34497 +disnake/appinfo.py,sha256=WpU0go0U_UNzc0zolZLzDLnJ-5a_av-igYiRst1i1OE,12025 +disnake/asset.py,sha256=f3mzuAZxNYnJ23FhWUtTPjwWda6kw8ZK6KqkGs6F5Hs,14862 +disnake/audit_logs.py,sha256=YGr5-7FplkU2hbIYE1zF2LpSyzAbvUvVcJh8uvZMGh0,23564 +disnake/backoff.py,sha256=c0CpN0dt1BykrZn7rawAofl8PRdC-mHp_0SdGKbbgIM,3791 +disnake/bans.py,sha256=4OSpLUIRj20JelJ_ye5c81izXphAcaXm61I3Qt3R-jg,1336 +disnake/bin/libopus-0.x64.dll,sha256=yE2oNujZJCGsMFhCz-WnJImO0J00DUaxKeIQvclEgTE,441856 +disnake/bin/libopus-0.x86.dll,sha256=O1v-EpUPNQQ-110rb6kCyTbWelBxYL92NY1nx2wdveg,366080 +disnake/channel.py,sha256=j0BoY3G8TUivfF03Xiok8bqKUAdedWxbJy756Kvb3PE,105589 +disnake/client.py,sha256=BWc1stk2PNoaFWA1OQ8WD45pM4RRtFVdhjpshq7KgiE,83084 +disnake/colour.py,sha256=-hwgF3VmpmBtCyF7Eidw0C3uwgCyVUVLDsqnfNzOtaQ,10230 +disnake/components.py,sha256=sfQ7hiY2mWAmqMRzkPu0gHXacAWnopbYofw6nblvLBQ,15019 +disnake/context_managers.py,sha256=H2FJb624Zy7H0DczThIMdlc7VQ8ro_KqaLLouuSY3as,3061 +disnake/custom_warnings.py,sha256=U3PNEGJqHsVWrQ32lpSKXZb2XGgJpB2PxDwsid46c74,701 +disnake/embeds.py,sha256=RqfzTyRIWRSK4NwlsgqKNtM1yOfcpL3Jo_TfoLTOACg,23772 +disnake/emoji.py,sha256=9toPy1Z0Uwd9dqRz96n1y5BT0qAnTnySsdTAhQOSQOg,8607 +disnake/enums.py,sha256=5YI0f9TbhWpIzTYLJn47ozjtLzQOz1-BTeOY58zZCOc,22252 +disnake/errors.py,sha256=WOpxPciIGW_xT1AffjJFdruKOzT3IlNuqBDrMiqNcFM,12194 +disnake/ext/commands/__init__.py,sha256=x3bUVCn9Yo3woWCe99a4Mn8hxLHhpIH1HNONzowFIOM,554 +disnake/ext/commands/__pycache__/__init__.cpython-310.pyc,, +disnake/ext/commands/__pycache__/_types.cpython-310.pyc,, +disnake/ext/commands/__pycache__/base_core.cpython-310.pyc,, +disnake/ext/commands/__pycache__/bot.cpython-310.pyc,, +disnake/ext/commands/__pycache__/bot_base.cpython-310.pyc,, +disnake/ext/commands/__pycache__/cog.cpython-310.pyc,, +disnake/ext/commands/__pycache__/common_bot_base.cpython-310.pyc,, +disnake/ext/commands/__pycache__/context.cpython-310.pyc,, +disnake/ext/commands/__pycache__/converter.cpython-310.pyc,, +disnake/ext/commands/__pycache__/cooldowns.cpython-310.pyc,, +disnake/ext/commands/__pycache__/core.cpython-310.pyc,, +disnake/ext/commands/__pycache__/ctx_menus_core.cpython-310.pyc,, +disnake/ext/commands/__pycache__/custom_warnings.cpython-310.pyc,, +disnake/ext/commands/__pycache__/errors.cpython-310.pyc,, +disnake/ext/commands/__pycache__/flags.cpython-310.pyc,, +disnake/ext/commands/__pycache__/help.cpython-310.pyc,, +disnake/ext/commands/__pycache__/interaction_bot_base.cpython-310.pyc,, +disnake/ext/commands/__pycache__/params.cpython-310.pyc,, +disnake/ext/commands/__pycache__/slash_core.cpython-310.pyc,, +disnake/ext/commands/__pycache__/view.cpython-310.pyc,, +disnake/ext/commands/_types.py,sha256=sm0Bn9rEM1cuGY5b0WPMKQpthPJTLBGjf15b0WHkccQ,1974 +disnake/ext/commands/base_core.py,sha256=vKMMmDiugYBbJlY4USbOZ4dhfGeJOC4EbRxSo-csvwU,26180 +disnake/ext/commands/bot.py,sha256=0ZNKozjEn1L3bteLlIVob1tH1swk81a2lR9zO28AX9U,11778 +disnake/ext/commands/bot_base.py,sha256=S7s8ThoDFyh38uo6wKO0Uj0lu3Mnx0nKMTpEk3RuBHY,20857 +disnake/ext/commands/cog.py,sha256=d-Qt2c-ZwOpNQW1Pt3QzePgKtLFkDVnHgaSg1P8NSNs,34796 +disnake/ext/commands/common_bot_base.py,sha256=wRJna--IK1sagSMb0kPko3vViUUiw8jfptBnr9RC6AU,21592 +disnake/ext/commands/context.py,sha256=6ji-FxF9T7ldOahZoGtMKZtO5Sg9xyMb7fdvM7egLCU,15087 +disnake/ext/commands/converter.py,sha256=huDpjmHoWW_LL8UP98aGPsBfApE_oBxLPkmSV1bT9d8,43449 +disnake/ext/commands/cooldowns.py,sha256=KcGM6RF3CnSunZHzkRhID7Hm0EkNQNjcu33l4Pi2WMU,13032 +disnake/ext/commands/core.py,sha256=VJwbK-8UuinBy8GSRjj4pHEJXvO75k6IDMDD7igSEpg,79640 +disnake/ext/commands/ctx_menus_core.py,sha256=FfPibA6I8qUkxqoiHbDBdRDfcf5rkHZAeSIhkJvT-rw,15539 +disnake/ext/commands/custom_warnings.py,sha256=o604WYBtJgWqk3e9LA0lp8vnNah1AJ_0vyAiiLtSFDg,1318 +disnake/ext/commands/errors.py,sha256=dXV2SayfN5d2WjqaviewyWMi8b19QLjcxh9zcvFdutU,33283 +disnake/ext/commands/flags.py,sha256=qxAlToNKDjPOmzmJrEkB5b4PL1uc8O94sgNbHYn5EV4,21691 +disnake/ext/commands/help.py,sha256=APcL1cy4C8d0RDIwWOT6Cu3zhT_HFf5F7xSM1GbRm_U,48176 +disnake/ext/commands/interaction_bot_base.py,sha256=DkGXmUUZBxD_anIRare6Ke-swjApQLN1LIWzem-0VJo,49098 +disnake/ext/commands/params.py,sha256=OIDwemhTirtSfcvbaVdg45qNeoOM1jTeV4H471FZ1-M,36216 +disnake/ext/commands/slash_core.py,sha256=ycfSUAZTiIx5BUAC8lmJ9O8cSJPZaUrM78ncf4Akvqs,29105 +disnake/ext/commands/view.py,sha256=AlWMDF6dXvR9kCDjlOcfLEWFzFuS6UjfskY_XpCAB5M,6064 +disnake/ext/mypy_plugin/__init__.py,sha256=EgYPN5QKMtVUx0uL6-kNnv-AW4l_yMR3c5U3mOdHyOw,1470 +disnake/ext/mypy_plugin/__pycache__/__init__.cpython-310.pyc,, +disnake/ext/tasks/__init__.py,sha256=2Va2g7yDaA9sJoF3UJ2I6A568Ozf0HPMw1sQwyZUvZM,26260 +disnake/ext/tasks/__pycache__/__init__.cpython-310.pyc,, +disnake/file.py,sha256=OF1mxdCIPqvj9k4Ab3zi-Bkm1bedIG4T7T5XbiFtwVw,4686 +disnake/flags.py,sha256=YKBDbjAl-S6YZ4WdupI4876lpHXFiboFhoB_SppJRFs,38762 +disnake/gateway.py,sha256=qV-GwQrHPyJPFX290yCIixImB2ofF9QHs4nZ7ugYw48,37490 +disnake/guild.py,sha256=n6Fplg0FZRcYm3kNQGg6s66NZqjNmThtqM4cRskuC-8,140878 +disnake/guild_preview.py,sha256=00zkJf6-9LcU9ZJZ3KEetIHUBqlC4X-NppCvULHILwQ,5035 +disnake/guild_scheduled_event.py,sha256=M_4MJs60YndAYVaOpYzKhVeOU8Vb0hfBo55nno2r6QI,17357 +disnake/http.py,sha256=dPwnGQV-AVB-SecYEywTPM09j7uB4hKx4VzyBK55Q3g,84499 +disnake/i18n.py,sha256=4Klr23iBZXq_v5n85xUrnFlCqzteBfX6mf9274p1MFw,13966 +disnake/integrations.py,sha256=EGCSjWVyMZqNg_GDTpURWJfOWFMY5p_szEQPb_hii4Y,12551 +disnake/interactions/__init__.py,sha256=1lKbFbExEl_2r5rNZ5lPbu4IRyVyoqDH7aN25SA1Re0,248 +disnake/interactions/__pycache__/__init__.cpython-310.pyc,, +disnake/interactions/__pycache__/application_command.cpython-310.pyc,, +disnake/interactions/__pycache__/base.cpython-310.pyc,, +disnake/interactions/__pycache__/message.cpython-310.pyc,, +disnake/interactions/__pycache__/modal.cpython-310.pyc,, +disnake/interactions/application_command.py,sha256=TNL6IwUMuUxcS-jzT6Xa-uncH_chKxBF5jhg3mIq6Pk,20372 +disnake/interactions/base.py,sha256=EdnjDkWWpVOYJ2Xy4_MGb8LM8zzM4Nuk4Zx1nwW2igA,56801 +disnake/interactions/message.py,sha256=zwtfFGbFurJ_REwNh6l6zzYIvUKM1x-2pM_Qs3Ta21U,5465 +disnake/interactions/modal.py,sha256=6AeJJ_QNsaikg8u0pq4SyMCwMcCauaYr79_q_KP2J6k,5489 +disnake/invite.py,sha256=0nQKvoohoNdy97BsOPm_O5bk2NRFpPwRPpSujhggLo4,20719 +disnake/iterators.py,sha256=FhzuB6EDtKzMdk4dL2tb5KGByBZbGZCEUP6DF_VQ228,34070 +disnake/member.py,sha256=4Sw-dFXkXuVf4nNBsFcPJ_67RAt6bzgygjy4_a_it4M,38953 +disnake/mentions.py,sha256=q2pzBiCaJOQlnuqxLdD3u1BUG-vadf_AVRefdA5jClk,5560 +disnake/message.py,sha256=d43BOlcnibsiu7OCrW7UEL1Xev1_qN9mSXyFyOUq2Po,82316 +disnake/mixins.py,sha256=5Qbd5qzQAstoW4IR-4jCquEKczcHVDIWTnfq9Wy3yFQ,1638 +disnake/object.py,sha256=dU53LK_yTHwlUnV8qWZsr7BprRheUILQn596tWa2_VI,2973 +disnake/oggparse.py,sha256=4_Q-qU-6tbQ878pSRkx-UAXT_jkh1iqAom7lxOpsNnI,3802 +disnake/opus.py,sha256=ieWpZm_-R4mBPmjc_133RLYPLmaRjlCTzQVc3-MrVLQ,15612 +disnake/partial_emoji.py,sha256=VRPlcjdiCp2j479Tuodn9DYPGEvIk2lF5gJE2PAmCgA,7787 +disnake/permissions.py,sha256=3c1fIIfJcPN0fA6f3Sa-DzWjQ9HgaCkR6a0neh3g6m0,31167 +disnake/player.py,sha256=FQ8-fKCjATzMGyiZo5y0JxecuCRtTegc12Mv-Yh0LAg,27130 +disnake/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 +disnake/raw_models.py,sha256=R6ith_HEd_tJ9bX2_0NRrQd4lhO7NGqKglK3iEK1q5E,14044 +disnake/reaction.py,sha256=arfoKm8qs12KuQrT722K9zbQJWjJcVashKi1G5MFQZs,7158 +disnake/role.py,sha256=GUVWFHjdD-mhGWOSF4MWwzXKEdAMrwkk4XFSdx_yenA,16658 +disnake/shard.py,sha256=epQT_9x2XFs1cNdedufYtD48N4ZUFdLhruWe_qTvBPY,20114 +disnake/stage_instance.py,sha256=wmIBYQc2min4wJHIr_IgoBUQhRczRhmpu6k3-kBuvsg,7864 +disnake/state.py,sha256=6ewUbw12LvbAWsXdxCUhkY8nNLj3Gch5M6_lV_H2FKk,81401 +disnake/sticker.py,sha256=0zx2PHYgPA9FN1TPgtgD0wqASsLi-awBmsvek9i2jcg,16078 +disnake/team.py,sha256=mH0ZfWsKUBw_IOOp6oCTgoFgU8_hY6kTxQRw7p7wIt8,4744 +disnake/template.py,sha256=noTMHt5kczMqSrewHhLUdlBlxu5ehYDh_kM-Fkmk8S8,9685 +disnake/threads.py,sha256=7Hh8R7EQqF5b4w6i0-cnifdbpyB40KuJpVpTybvbk9g,30396 +disnake/types/__init__.py,sha256=jOYTyfcMJByIZydoCX8BWGuujWheISOrjCigOdvmLkA,180 +disnake/types/__pycache__/__init__.cpython-310.pyc,, +disnake/types/__pycache__/activity.cpython-310.pyc,, +disnake/types/__pycache__/appinfo.cpython-310.pyc,, +disnake/types/__pycache__/audit_log.cpython-310.pyc,, +disnake/types/__pycache__/channel.cpython-310.pyc,, +disnake/types/__pycache__/components.cpython-310.pyc,, +disnake/types/__pycache__/embed.cpython-310.pyc,, +disnake/types/__pycache__/emoji.cpython-310.pyc,, +disnake/types/__pycache__/gateway.cpython-310.pyc,, +disnake/types/__pycache__/guild.cpython-310.pyc,, +disnake/types/__pycache__/guild_scheduled_event.cpython-310.pyc,, +disnake/types/__pycache__/integration.cpython-310.pyc,, +disnake/types/__pycache__/interactions.cpython-310.pyc,, +disnake/types/__pycache__/invite.cpython-310.pyc,, +disnake/types/__pycache__/member.cpython-310.pyc,, +disnake/types/__pycache__/message.cpython-310.pyc,, +disnake/types/__pycache__/raw_models.cpython-310.pyc,, +disnake/types/__pycache__/role.cpython-310.pyc,, +disnake/types/__pycache__/snowflake.cpython-310.pyc,, +disnake/types/__pycache__/sticker.cpython-310.pyc,, +disnake/types/__pycache__/team.cpython-310.pyc,, +disnake/types/__pycache__/template.cpython-310.pyc,, +disnake/types/__pycache__/threads.cpython-310.pyc,, +disnake/types/__pycache__/user.cpython-310.pyc,, +disnake/types/__pycache__/voice.cpython-310.pyc,, +disnake/types/__pycache__/webhook.cpython-310.pyc,, +disnake/types/__pycache__/welcome_screen.cpython-310.pyc,, +disnake/types/__pycache__/widget.cpython-310.pyc,, +disnake/types/activity.py,sha256=XzXMdvFDNqbWEMGn7VUdqKTReV5Ngl7DwsoCfuLizPM,2864 +disnake/types/appinfo.py,sha256=UxIcvwb0gI44HsGf7eo5dKWI3ZEGsHHnHF8yVTesoIk,2267 +disnake/types/audit_log.py,sha256=vIZigrqyWsmtgkEFXHLHy0XSapErGfOKUVi_bpR1uv0,6945 +disnake/types/channel.py,sha256=XVDQEbBYlkg9LNZrGldPM0-SvzHgCE-7e1U8ipQgYpc,4735 +disnake/types/components.py,sha256=vB4jQw0aQLmZ59s84J8y8Yhoy_kWAaM-KtIvY58e1y4,2556 +disnake/types/embed.py,sha256=x3DyqELd-fW6qOznjEWOsEW7Ct6bD_altBfoz6eezXU,2380 +disnake/types/emoji.py,sha256=cZpBBdFaK2LsCgYEeTtAKnlRwdbDgb4Rb1l1uuKu2_8,1573 +disnake/types/gateway.py,sha256=bwKfk4A5eeWDGGuKW1sVc-4KvzI0E7SJtlqz4-udy0c,4709 +disnake/types/guild.py,sha256=fgmZx3uyUPGdAUXIM9IWbnOWBpUbyJ1QjUDia4Zm1qE,5044 +disnake/types/guild_scheduled_event.py,sha256=MRqQy-hJsJuMFpMqjqepyik-Y8pldJf-CvFwtuWbFSI,2317 +disnake/types/integration.py,sha256=LT8l5GCzqOBXv-YAMN6HCVlyrk1RWnBPlvPwwQvw26I,2312 +disnake/types/interactions.py,sha256=hd2xsO8a2caniFYImb6WZTApiWkdaQQ3qy7_VFavcBo,8596 +disnake/types/invite.py,sha256=7GSy2dJUzrNy-j6nItcOxBCv0HwJ4AvHr6dq-sGY-wQ,2825 +disnake/types/member.py,sha256=G1udrj65-eEHZl8HobUheaqrVnjfsH7GtBBSEMVK7Ow,1727 +disnake/types/message.py,sha256=EQrW8G21pTNsRoqc38MGHeDU3c2D5DMm6YKmjJ15wJk,3783 +disnake/types/raw_models.py,sha256=St_WBj1NRJcPWFg20a3cXmiQ4nO5czw2sOWxCSlJMxo,3328 +disnake/types/role.py,sha256=jvRMMBseU-2c52VNhFr2Ai3Is_TC0yo99uChEEYAtVc,1660 +disnake/types/snowflake.py,sha256=Xz9v0S4CZIoAHYNFgakz1TWSU0YJ6hrDkPLspxvmz7A,1268 +disnake/types/sticker.py,sha256=HIFE00f1G0g5-PtgjVODBP1LeZOmCyAbl71GGNdPFc0,2380 +disnake/types/team.py,sha256=fIJvhCzyTbmMYc3-66_LIgxCQgP0GGziC0hYr24iCmo,1543 +disnake/types/template.py,sha256=uUZE1uEo5XUBjOI07cM_6s-yWsYcaT12S2jY5HlCQIc,1659 +disnake/types/threads.py,sha256=-80zDrLBfQmEQXim1UD4T5-QgijWCKv6itKRZwUGNW8,2375 +disnake/types/user.py,sha256=Og0zTUclHLkVzAUyNVAxQbF8HWP5uAbVyQxWhkuCafo,1585 +disnake/types/voice.py,sha256=uKtYeZGCso2KkWQOMGCMogaVsCFswzcFa3jiVd9RE7M,2316 +disnake/types/webhook.py,sha256=Cz_A2tQjbSQVXLqV4MJXHajWFBVZwAszoVj8jsgf-FI,2045 +disnake/types/welcome_screen.py,sha256=pZ6EGf-f7X4UnzGurZwHLd2xlAdNOPzFGwAjc9P78Ls,1515 +disnake/types/widget.py,sha256=-D0t5_Hiqtx8BelRPuZ_pI785iyKeWYtq052W5NC-nA,1867 +disnake/ui/__init__.py,sha256=FOYzbQ4WY5SHS-Yn3z2cvKrG7eYC11Ghjbfhme9ydr4,342 +disnake/ui/__pycache__/__init__.cpython-310.pyc,, +disnake/ui/__pycache__/action_row.cpython-310.pyc,, +disnake/ui/__pycache__/button.cpython-310.pyc,, +disnake/ui/__pycache__/item.cpython-310.pyc,, +disnake/ui/__pycache__/modal.cpython-310.pyc,, +disnake/ui/__pycache__/select.cpython-310.pyc,, +disnake/ui/__pycache__/text_input.cpython-310.pyc,, +disnake/ui/__pycache__/view.cpython-310.pyc,, +disnake/ui/action_row.py,sha256=Pd_jYIFshzayr7M9MkRXHJD91krWih2_ojqYe-AtEMA,10514 +disnake/ui/button.py,sha256=ST_XK_2dG_iUi2pdXH5jdX08zZLpy3pRm4_ifTU_5uA,10458 +disnake/ui/item.py,sha256=3aFqjYde_O8r_bE0UaFgrC22UBUqRkGHd4Q6SqTqRBs,5659 +disnake/ui/modal.py,sha256=tlM6kOKCyIhKtBRrc_m9ehqBDpq0YWgt0Bj4qAXh8Ik,9633 +disnake/ui/select.py,sha256=hT09QhBMA7oYIT3lZco-MRB-WevxV4vMM2a844uCo9Y,13997 +disnake/ui/text_input.py,sha256=YMRVMNE2dHtzanudFrln1j-nfuZhJPUkjoN8rEILBPE,5669 +disnake/ui/view.py,sha256=EbeaLuPm9VGv8Hbysm8pKEqcKvcUcHgnduw-sJ1i7UM,19051 +disnake/user.py,sha256=DrlkzPXNjgDU46fW_8X1gkINsiJ6_60msodK-SekHfo,15671 +disnake/utils.py,sha256=R4Mx59vyPRkDMi2PJrljrm3BWBN9LMkS1UtPLmEwQDI,38247 +disnake/voice_client.py,sha256=ZCi_INpxtiJ0V4oOkbuz8XIJisPp6FJQxAIb5WkDuqk,24599 +disnake/voice_region.py,sha256=4VFHr2IC_CAD9N1zk_EM5dizECZmHu-pYMTYlDIz56w,2390 +disnake/webhook/__init__.py,sha256=8-iIexpQlOcv3xIOYBcL5VbfmMHV0JT_gl3EfxM5aDw,287 +disnake/webhook/__pycache__/__init__.cpython-310.pyc,, +disnake/webhook/__pycache__/async_.cpython-310.pyc,, +disnake/webhook/__pycache__/sync.cpython-310.pyc,, +disnake/webhook/async_.py,sha256=PYz739CBM4x621m_UsWyet886kqEqTltA5mzY9f8sJo,63656 +disnake/webhook/sync.py,sha256=yFCTK11w4jnhzJE0mrNlF818R7quDNySp00HN8drSO8,41381 +disnake/welcome_screen.py,sha256=ZZOzmyTsCgdLAoA33pBZS7IArx-dB-VXzS99McjQ_Mw,7272 +disnake/widget.py,sha256=W69qGTQRsFlRkXpK-Cv6kgVSw7TOgYfRZAKehy_PoaA,14105 diff --git a/sbsheriff/Lib/site-packages/disnake-2.5.2.dist-info/REQUESTED b/sbsheriff/Lib/site-packages/disnake-2.5.2.dist-info/REQUESTED new file mode 100644 index 0000000..e69de29 diff --git a/sbsheriff/Lib/site-packages/disnake-2.5.2.dist-info/WHEEL b/sbsheriff/Lib/site-packages/disnake-2.5.2.dist-info/WHEEL new file mode 100644 index 0000000..becc9a6 --- /dev/null +++ b/sbsheriff/Lib/site-packages/disnake-2.5.2.dist-info/WHEEL @@ -0,0 +1,5 @@ +Wheel-Version: 1.0 +Generator: bdist_wheel (0.37.1) +Root-Is-Purelib: true +Tag: py3-none-any + diff --git a/sbsheriff/Lib/site-packages/disnake-2.5.2.dist-info/top_level.txt b/sbsheriff/Lib/site-packages/disnake-2.5.2.dist-info/top_level.txt new file mode 100644 index 0000000..c2bc05a --- /dev/null +++ b/sbsheriff/Lib/site-packages/disnake-2.5.2.dist-info/top_level.txt @@ -0,0 +1 @@ +disnake diff --git a/sbsheriff/Lib/site-packages/disnake/__init__.py b/sbsheriff/Lib/site-packages/disnake/__init__.py new file mode 100644 index 0000000..d12a303 --- /dev/null +++ b/sbsheriff/Lib/site-packages/disnake/__init__.py @@ -0,0 +1,82 @@ +""" +Discord API Wrapper +~~~~~~~~~~~~~~~~~~~ + +A basic wrapper for the Discord API. + +:copyright: (c) 2015-2021 Rapptz, 2021-present Disnake Development +:license: MIT, see LICENSE for more details. + +""" + +__title__ = "disnake" +__author__ = "Rapptz, EQUENOS" +__license__ = "MIT" +__copyright__ = "Copyright 2015-present Rapptz, 2021-present EQUENOS" +__version__ = "2.5.2" + +__path__ = __import__("pkgutil").extend_path(__path__, __name__) + +import logging +from typing import Literal, NamedTuple + +from . import abc as abc, opus as opus, ui as ui, utils as utils # explicitly re-export modules +from .activity import * +from .app_commands import * +from .appinfo import * +from .asset import * +from .audit_logs import * +from .bans import * +from .channel import * +from .client import * +from .colour import * +from .components import * +from .custom_warnings import * +from .embeds import * +from .emoji import * +from .enums import * +from .errors import * +from .file import * +from .flags import * +from .guild import * +from .guild_preview import * +from .guild_scheduled_event import * +from .i18n import * +from .integrations import * +from .interactions import * +from .invite import * +from .member import * +from .mentions import * +from .message import * +from .object import * +from .partial_emoji import * +from .permissions import * +from .player import * +from .raw_models import * +from .reaction import * +from .role import * +from .shard import * +from .stage_instance import * +from .sticker import * +from .team import * +from .template import * +from .threads import * +from .user import * +from .voice_client import * +from .voice_region import * +from .webhook import * +from .welcome_screen import * +from .widget import * + + +class VersionInfo(NamedTuple): + major: int + minor: int + micro: int + releaselevel: Literal["alpha", "beta", "candidate", "final"] + serial: int + + +version_info: VersionInfo = VersionInfo(major=2, minor=5, micro=2, releaselevel="final", serial=0) + +logging.getLogger(__name__).addHandler(logging.NullHandler()) diff --git a/sbsheriff/Lib/site-packages/disnake/__main__.py b/sbsheriff/Lib/site-packages/disnake/__main__.py new file mode 100644 index 0000000..0a28a2f --- /dev/null +++ b/sbsheriff/Lib/site-packages/disnake/__main__.py @@ -0,0 +1,341 @@ +""" +The MIT License (MIT) + +Copyright (c) 2015-2021 Rapptz +Copyright (c) 2021-present Disnake Development + +Permission is hereby granted, free of charge, to any person obtaining a +copy of this software and associated documentation files (the "Software"), +to deal in the Software without restriction, including without limitation +the rights to use, copy, modify, merge, publish, distribute, sublicense, +and/or sell copies of the Software, and to permit persons to whom the +Software is furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS +OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER +DEALINGS IN THE SOFTWARE. +""" + +import argparse +import platform +import sys +from pathlib import Path + +import aiohttp +import pkg_resources + +import disnake + + +def show_version(): + entries = [] + + entries.append( + "- Python v{0.major}.{0.minor}.{0.micro}-{0.releaselevel}".format(sys.version_info) + ) + version_info = disnake.version_info + entries.append("- disnake v{0.major}.{0.minor}.{0.micro}-{0.releaselevel}".format(version_info)) + if pkg := pkg_resources.get_distribution("disnake"): + entries.append(f" - disnake pkg_resources: v{pkg.version}") + + entries.append(f"- aiohttp v{aiohttp.__version__}") + uname = platform.uname() + entries.append("- system info: {0.system} {0.release} {0.version}".format(uname)) + print("\n".join(entries)) + + +def core(parser, args): + if args.version: + show_version() + + +_bot_template = """#!/usr/bin/env python3 + +from disnake.ext import commands +import disnake +import config + +class Bot(commands.{base}): + def __init__(self, **kwargs): + super().__init__(command_prefix=commands.when_mentioned_or('{prefix}'), **kwargs) + for cog in config.cogs: + try: + self.load_extension(cog) + except Exception as exc: + print(f'Could not load extension {{cog}} due to {{exc.__class__.__name__}}: {{exc}}') + + async def on_ready(self): + print(f'Logged on as {{self.user}} (ID: {{self.user.id}})') + + +bot = Bot() + +# write general commands here + +bot.run(config.token) +""" + +_gitignore_template = """# Byte-compiled / optimized / DLL files +__pycache__/ +*.py[cod] +*$py.class + +# C extensions +*.so + +# Distribution / packaging +.Python +env/ +build/ +develop-eggs/ +dist/ +downloads/ +eggs/ +.eggs/ +lib/ +lib64/ +parts/ +sdist/ +var/ +*.egg-info/ +.installed.cfg +*.egg + +# Our configuration files +config.py +""" + +_cog_template = '''from disnake.ext import commands +import disnake + +class {name}(commands.Cog{attrs}): + """The description for {name} goes here.""" + + def __init__(self, bot): + self.bot = bot +{extra} +def setup(bot): + bot.add_cog({name}(bot)) +''' + +_cog_extras = """ + def cog_unload(self): + # clean up logic goes here + pass + + async def cog_check(self, ctx): + # checks that apply to every command in here + return True + + async def bot_check(self, ctx): + # checks that apply to every command to the bot + return True + + async def bot_check_once(self, ctx): + # check that apply to every command but is guaranteed to be called only once + return True + + async def cog_command_error(self, ctx, error): + # error handling to every command in here + pass + + async def cog_before_invoke(self, ctx): + # called before a command is called here + pass + + async def cog_after_invoke(self, ctx): + # called after a command is called here + pass + +""" + + +# certain file names and directory names are forbidden +# see: https://msdn.microsoft.com/en-us/library/windows/desktop/aa365247%28v=vs.85%29.aspx +# although some of this doesn't apply to Linux, we might as well be consistent +_ascii_table = dict.fromkeys('<>:"|?*', "-") + +# NUL (0) and 1-31 are disallowed +_byte_table = dict.fromkeys(map(chr, range(32))) +_base_table = {**_ascii_table, **_byte_table} + +_translation_table = str.maketrans(_base_table) + + +def to_path(parser, name, *, replace_spaces=False): + if isinstance(name, Path): + return name + + if sys.platform == "win32": + forbidden = ( + "CON", + "PRN", + "AUX", + "NUL", + "COM1", + "COM2", + "COM3", + "COM4", + "COM5", + "COM6", + "COM7", + "COM8", + "COM9", + "LPT1", + "LPT2", + "LPT3", + "LPT4", + "LPT5", + "LPT6", + "LPT7", + "LPT8", + "LPT9", + ) + if len(name) <= 4 and name.upper() in forbidden: + parser.error("invalid directory name given, use a different one") + + name = name.translate(_translation_table) + if replace_spaces: + name = name.replace(" ", "-") + return Path(name) + + +def newbot(parser, args): + new_directory = to_path(parser, args.directory) / to_path(parser, args.name) + + # as a note exist_ok for Path is a 3.5+ only feature + # since we already checked above that we're >3.5 + try: + new_directory.mkdir(exist_ok=True, parents=True) + except OSError as exc: + parser.error(f"could not create our bot directory ({exc})") + + cogs = new_directory / "cogs" + + try: + cogs.mkdir(exist_ok=True) + init = cogs / "__init__.py" + init.touch() + except OSError as exc: + print(f"warning: could not create cogs directory ({exc})") + + try: + with open(str(new_directory / "config.py"), "w", encoding="utf-8") as fp: + fp.write('token = "place your token here"\ncogs = []\n') + except OSError as exc: + parser.error(f"could not create config file ({exc})") + + try: + with open(str(new_directory / "bot.py"), "w", encoding="utf-8") as fp: + base = "Bot" if not args.sharded else "AutoShardedBot" + fp.write(_bot_template.format(base=base, prefix=args.prefix)) + except OSError as exc: + parser.error(f"could not create bot file ({exc})") + + if not args.no_git: + try: + with open(str(new_directory / ".gitignore"), "w", encoding="utf-8") as fp: + fp.write(_gitignore_template) + except OSError as exc: + print(f"warning: could not create .gitignore file ({exc})") + + print("successfully made bot at", new_directory) + + +def newcog(parser, args): + cog_dir = to_path(parser, args.directory) + try: + cog_dir.mkdir(exist_ok=True) + except OSError as exc: + print(f"warning: could not create cogs directory ({exc})") + + directory = cog_dir / to_path(parser, args.name) + directory = directory.with_suffix(".py") + try: + with open(str(directory), "w", encoding="utf-8") as fp: + attrs = "" + extra = _cog_extras if args.full else "" + if args.class_name: + name = args.class_name + else: + name = str(directory.stem) + if "-" in name or "_" in name: + translation = str.maketrans("-_", " ") + name = name.translate(translation).title().replace(" ", "") + else: + name = name.title() + + if args.display_name: + attrs += f', name="{args.display_name}"' + if args.hide_commands: + attrs += ", command_attrs=dict(hidden=True)" + fp.write(_cog_template.format(name=name, extra=extra, attrs=attrs)) + except OSError as exc: + parser.error(f"could not create cog file ({exc})") + else: + print("successfully made cog at", directory) + + +def add_newbot_args(subparser): + parser = subparser.add_parser("newbot", help="creates a command bot project quickly") + parser.set_defaults(func=newbot) + + parser.add_argument("name", help="the bot project name") + parser.add_argument( + "directory", help="the directory to place it in (default: .)", nargs="?", default=Path.cwd() + ) + parser.add_argument( + "--prefix", help="the bot prefix (default: $)", default="$", metavar="" + ) + parser.add_argument("--sharded", help="whether to use AutoShardedBot", action="store_true") + parser.add_argument( + "--no-git", help="do not create a .gitignore file", action="store_true", dest="no_git" + ) + + +def add_newcog_args(subparser): + parser = subparser.add_parser("newcog", help="creates a new cog template quickly") + parser.set_defaults(func=newcog) + + parser.add_argument("name", help="the cog name") + parser.add_argument( + "directory", + help="the directory to place it in (default: cogs)", + nargs="?", + default=Path("cogs"), + ) + parser.add_argument( + "--class-name", help="the class name of the cog (default: )", dest="class_name" + ) + parser.add_argument("--display-name", help="the cog name (default: )") + parser.add_argument( + "--hide-commands", help="whether to hide all commands in the cog", action="store_true" + ) + parser.add_argument("--full", help="add all special methods as well", action="store_true") + + +def parse_args(): + parser = argparse.ArgumentParser(prog="disnake", description="Tools for helping with disnake") + parser.add_argument("-v", "--version", action="store_true", help="shows the library version") + parser.set_defaults(func=core) + + subparser = parser.add_subparsers(dest="subcommand", title="subcommands") + add_newbot_args(subparser) + add_newcog_args(subparser) + return parser, parser.parse_args() + + +def main(): + parser, args = parse_args() + args.func(parser, args) + + +if __name__ == "__main__": + main() diff --git a/sbsheriff/Lib/site-packages/disnake/__pycache__/__init__.cpython-310.pyc b/sbsheriff/Lib/site-packages/disnake/__pycache__/__init__.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..1f1f40e38f28428bef0d1028c36f661ca0c762d3 GIT binary patch literal 2200 zcmcJPOLH7G5P)ZQXLiT4yI$u>UXbCLY>1uMArOp7VjPpW%9w|3Ql)a0N;_)rDxMdT z){cGP60ZD*rz~9h~;^e=;iPnw`p*S;B)1TBDwOZXR72R&+;q&XYi^=aT&-=r6 zUVl*MJ;YCS>YlglagTVsMryoH>byZ3+$TN{NB~XVd{KMZf)J)&)k(-(JWL}JA*a%I z)*+p&OS(0WN4%X*XFbx(X2?u-ik!+$lhYG@Cq1)e$2;j+$8(P79p7-g;CRvTlH+B^ zD~@kEzU6q;F?M|0@g2u^9p7_&-|+*-YmV0)`;IppKXkn5IO{m)c+2s&+{~k3VeanSf@zg|!?70W zu{};3{kmzb3k{N`CfZ;b@U3x~!f_1;`@U(gL1O%(94k{F3lrFhs$Vm;8;PC%`qRM9 zL;Tbt3h?kOdZfPXK?8hV!+crR9UI7i`xiab1y0vo@^}mL7n=6>AeAWcwS2cQLB^gH z5+U*mi7e2ufTiV#8GnE=GgAr6x!_EL33f$}Tj@whfhiQ20@G9=1xq*jO%qa@<1Q&R z5v5td$Ej_1DE(o~Qa92Nxi&pYS)Lb~Y4k)!d$c3hK4hyY=OFY3( z*+%4rHT!n(os1mgh36dyDC8Lw{XlkYd)kVg6=$tDhr)FBt3aad-J<{4v?%38g8QAK zR0}=XI);Ib^{9}jZd2;Y6gyo?|1SG#?8Mq6b|Nbai4L1KJlBwOS~5Md;kCqYowp9O z(qcFi`Oq}=VTqgsQCi=PC+!t3Lo24Nu=hO)S)#?h(1)ahCkq|OGEA)^E$rD%kbo%# znnY~OF*DJ%}tEC$aY(WF~4sj+_P z#7WY|+bk2xo)9!srtA=>N0J@bdWKYyP(rne@nw+$3Dk&5PNtPct5^%jJOR>DS|oco z*Vn)@6KcrN7`oKbBeZ}~@yA%+q_bb(-9@Xgp7bOPaedM{fWfFJ_Q>=Bq!?%{`a}Zc zqejI)0Q15)e}c(PvEAMnr>X1wbHb|D6+16ns?O?tdoQVd e6iv@>`?czwsfYEM+J$;`QvM$~)3_8~sQ(2jkaacy literal 0 HcmV?d00001 diff --git a/sbsheriff/Lib/site-packages/disnake/__pycache__/__main__.cpython-310.pyc b/sbsheriff/Lib/site-packages/disnake/__pycache__/__main__.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..6ee7c1a71ecfb9df5596de75ebe6a98ecfcf302b GIT binary patch literal 9233 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 literal 0 HcmV?d00001 diff --git a/sbsheriff/Lib/site-packages/disnake/__pycache__/activity.cpython-310.pyc b/sbsheriff/Lib/site-packages/disnake/__pycache__/activity.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..659ebe9167f796f812625829b48e44ea8cc8bd8d GIT binary patch literal 25816 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 Zt&LvA^||r788^+byC8LjnH<0Se*i02bo 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 literal 0 HcmV?d00001 diff --git a/sbsheriff/Lib/site-packages/disnake/__pycache__/asset.cpython-310.pyc b/sbsheriff/Lib/site-packages/disnake/__pycache__/asset.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..d29f8fb2864ceedecb9ba2c2636c65c0be0a1929 GIT binary patch literal 14670 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 Z)!=(x5A_*tU2Xr1C+#l&_FGRn{{pRw_z3_2 literal 0 HcmV?d00001 diff --git a/sbsheriff/Lib/site-packages/disnake/__pycache__/channel.cpython-310.pyc b/sbsheriff/Lib/site-packages/disnake/__pycache__/channel.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..6bece890850ac1a76de1322a419c3e1042731ed7 GIT binary patch literal 99832 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 Az5oCK literal 0 HcmV?d00001 diff --git a/sbsheriff/Lib/site-packages/disnake/__pycache__/client.cpython-310.pyc b/sbsheriff/Lib/site-packages/disnake/__pycache__/client.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..29a13e9f1e968e8c2684df1a38fd72192dd97410 GIT binary patch literal 81792 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%0D6&4uK#*J1coK z=_voSdjk?g)EnDpH)M=+#oN0k(a0;sX+^JC*$|tq89=nolVxbO1>@JKWzr)?s4%5v z)2iu85NzPph)mlIDZRzUHpskTergLCH!Ngd3jhcjl+3;tCiK%P zrI3IE$G+-?lU#*-kU3Gk)^a%|sL2WC9>RZ5kZJVWr}{W>T2a3)i!KjR6!cxrm&8I{ z+aoEa)G)zZF;vi?_H_}1Am4*;uX>0e9Oc<1b}Q(TDC!oFrL8j@r?KhBXxiTw00=R7 zbf1S-tC=8DllzuMp^*TW`_2@Fo22HpM=`XiM&7ypcw3L zBW_P4N}I-NbR~wT@fTqJaviq5v}-IeUB^oNI{f=?L~-3I*D<;7l2W?yBn2&N&`~cN@AsBCArecnw+i|J5X*fuKV!mhxIR8vB^o{ZlJ_E zH%o3v*%vXb_q`J^?=rUX3QD*&%v}W=eiU!;#$*A}^R6O1K}voVnkL zuV$}blprtx$mtNFX?8%D4J#>V4WYlwZc-8ur~)Vqn_0?kQAi}fl^$y|$D!%#7J>-v zvR;6R^()bFpOMd1w#HieG`k)t=PT1r{;{jbC#KGc$nrf(muYRVe8$c?_3~R!FOBC% zK+LM$gtQZOGE%9RY00m)I=UQ@qgz~{=Tp(iZVB1`v)e-VtXE)juTo2Ehwf>{uGHNr zw7%IN)Q8DHHoL($s*!wcJ7w}jx$W_+Qx;6A|D3F^#XjjY6w zO5)YrW^Tnil?IPQY_R21sZhx-Xbxcc+%jJ|x-2x4@>9=l&4tV!n##UV4h%mNQ#5d9 zvy<{Bpe(qj(8w6Y2$(ecbHP^hO96IE&GyK>+DzTY(5GxSddM(kBh<1Igx1&Ec2qVCxHU=DsCSls0iuNKc&AwC752ek0YN@A^9C09utAO4Qu=T)Lx*a~93xF5wO zD*0~y#MQ{Wf@@W-XD%n*{S01w#4Md;e0iH`Ea%lui~ANNE3hu}M}*#m&wIF1@54nS zqHGvxzew9f+AZP(*X)-%R-#0buwRUi!{MsSh+mpr76Lm6Yju}iAZh~HOxUEeUiTmJ z>t%lZFu!afSQUz`qD*#6zpf+Y$JnnyT);}v`}a4oWb)?nW`92ge%(o=4D^xxWj{H- zV#kjD!1$idCPcJqoMY~%k)#>N@^wAjB(0GF{uJJR(hP8aba|_(*uO?sul5dPH`Tgg z`6_qVDgBLzyFbQ8Bun)i+wqTZ6WW-U@Zx1QhR~A2n4m#-v@|HVK08Fe5NIEV#10Fc zU)Un?)9G%&vgsNodL=p!=a-?_^5+a)tJD;S(* zFkCn8PvfiEsT*kkP2RKs+Rq^2k8ns6xJV`kqs#qzKy~K8*abj}R>&MXx691%1Pp>@ z+`fFy8EPAcTOOhYYQj{jNzJAIv=Lan*;F>rlD@r$mob4)V;$Fw`97Y(GHRDiq+L z6SB0Ln~~;9Alc^(Y$sEM?&TeND%ujd??feSGsD>tWJ=7&Ihp5dM3sXHywO|L zW^B8YDr0ENe-YLGGFtBbJT8{|bh}js-EwhWUBBgz2U{+=Ov{V(f8}yFd~j>a=kj&0 zxhi#NbN?Ay`T4fysth*=y@A%Ar0ci(Qn1xB-a4~sy!Jy~ule383ghDr*rjTqsmqib z+RzW%iAz;B(Qje2gu56_E^pUx+>+$xR+;UfA8-4(p&%JIy(aT_;6V^f^3#P( zuoMFW>aQ74+<4w(b`&~w<{Zn z9?(gQ2Yfwj-rUb)bpMT+tFCUkJJS3%)0+9_78&z^tMj^ZwfvFbLsK{jRw1&Eh&VbQUQ6xP}+Wu$P`dPuCvo67xoZLy!>gYpFo z${%7-++V?kB|roDnsH3rdizKIP88C%6(Xa7Pt}MJyFS}t$m|=U1J*)Zh#asDlBAfL zG9FV?S}Si70wCQI1fHJi4ABs3i?hlO+Nhv~wxNVwd|ENw%I}l7gq~`&N@YC$z+Ij@$iZ$h&5CT97f z!LYU;!=8duS^cS9K6Hk}VDNSKakIanQbcGse;w`rvIRavkhSH#dAqEw(8vbu3)5^q zuhJ8Zj?wdAIIhQUz==k-o)1Z35-G%L%rhvP^xBBhBv0-0)*9aEohkgKKNd(EtZVJJ zuSbv_Yb83uJS2z*6p437PNmKH(gNC4+Gg@{z6>YQut99zzDCB^Ft|b*4#bytD}<3* zBl*p3W}yAOT4RW}V~AB`21OB5O3TO$80h%&Q7OzoABWgq>S|+EXKWR3lmg&QB9|U{ z6BKIf!o@76_d@s8D5g2uh+d1i@DKgC1XmEz4V*SpB`_!oLApDU4r2rkGdaGP~~ohLYUh z+F}|23~UWA5*or)u;?4)S|=Hh}KB{{|P!4+ck>)vYR5>^9zP2%3t$Wqd>>d5Z2BYP;= zVO`@b4(@Gwa9c~+ZpZhowX18!Al}?;X$Cz?7pxc)eG*v`g(t#ID1^=kFc2d`n)IT` zk@EKe$sHF{QS9et6s-k~vh^D~s;%>pWV%KR6_ZdXb>9Zp;@m{y*M?u%Z)p|!Ul`0r zBFDa9da}%@5cC}>3{w$kW$0utQcvfr?uP#NU_NIxZlsOe~vFKPZ5>!Wh+YTp{Q5);BHK;@Hqp0%Y$ZWz1JC+Ue(P` zS!|$dK7qTN{W^TtQ=;CzaI@d`=PZ`BH`ka#E3yWiu0+<)!5>nKQWYN20_#6!Ls@)l zYd5pCH8(ed5I1ux^>^dqIYw>49(E&oHNFyeqKG-vy8;iwj^$e>VP3Kt}?s9_K)w%`{67lgqBQnMVkOemQY(X5GW z0J`9tri}<(!A5=>^}0XBudw~Ki-K6X#hhi&*w|Eu6&RU!%>-fb=AIF-OEmU-3eiIL z!Qe#){(A}$0TH`Ue_goHObM4JK_H+xX&|H;d|>L$dEpJ3~_uVHj5H| zBzgw61+AsnJS^uiQ;vFiC2~cpeG*!gJ0dZ)z$1>jE>QDdpn-@@Sj|C}i?DVb3T*xo zPu>5*ufO8gm-!`l#3Ba9hUIAwgkqh$prWDvF&2Fju0W-}7W=BFys~+2_8OCn zNd(CX3?Ru%BBN6rK*k&)j9~y{v$5b1Twad`ly5M{u%x~%Yrd*wJJw^eM0jO{Q*yLTETVqz- z){>~%A!#knMe;~LK7U*)cD3?TcBwifUlZYP!>kv>D*W-eRJ61Z}kIY7{CJ|Mx z<60E)xV&4_HnmQM$-T}DkTtWoo zt3A=k@&M9zt@Mc1hRtz~I2-Rj&~s^r`n?jp5?M*Pml`PN8hrmR#@zGBnSxyhYN&3} z&l7k)%jd9;K~x-h*P-r%HC)<(9EhiZZ}b4Uo|FFduzx5o)#&A0^sM7*FYH}^sC>%>6z-CryH|Zio#<3;Uuw$NMA!qw1*j(??SX z8~4q1m>|VxpnTx;?fxJibRilg3?yJ-&R*G2-{yzBrW7`j2pQFmXDvIc>Zf>Z!2sL18TrxiMr29Xrb%| z?MRkP#bo0o=0R18`Dn&Ee}g`Pk+cP|(hS`!pn-ri3IHlFCa^*Av2}zdgJ(=>eJ&&w zV1p8D-fe0Ay4A915%t?8)nb4yK4i*f*B3j^mfJ3JJ_s)Z`+8%h;WNc-4 zbyz#Dc5!hxJ>27o;x%M?#Rm2HY5aLqET+p8LAsR#E7m4hWy&Gcy!964EWiYRTOWs! zs-iYJWVl@F%~~N8r!qu-mJmwD3*6w~R)i?CBA_s!XL!7eutPy6`$rJ9YwEqYAsQte z!5y^$Dxwj;7OQV>B%D|SrcKwP^T|&EnZ6vq7X2VsUnl5*DC5csNGHJ2#TqF*@4;T) z@gj|*dUCx^0sx-Or%`b$fS;iEjdn;;aHMo(0*BT`h<@b2gK(quL)pfFLHg`X83^!p zt_f!TaE*ilQTcO77WlH&wDEm$rt}OZkh91Elonc$_0Efxb)svZN<#@1{fvaU%0(iJ#(A!>s+Dxy|Xp>8~Iq7loeLGFPv zhUsWTE19Ya&S6{{)%I5_h*iH6^tf46DkWuCBQBnF)i`wEK$@OMXp|}sPXCnJAbO9l zd4bB=OpX-|(cn-YbU<6alhz`94WLlAI7|n}HW~WmyVVRB|3iwTU|~aVFKK#md@+Oq0_P*<2pOqx#>G;*y)%eu})+}P$A#x-l$zt`v zKHQ1F6bHN0aSgOTq%X-EuobLtUf$j4oQEyeOcY#U2YE}_iFePZRyv&oSFS1*<@7j7 zut}YdM7l{Q_gwEaHG)St3~IV>sRFK`3tYk7jsEMK5LLQse&7aUR!6RHcDjXv@0cHC z-uW$fw^gpTIjI-pi0?%Wo~cW*4WY5+1NFIJKA)|3?hUrrBF*Z zYWc9Q+-Ut}+}-K5sBzaycVj2?CNHgY&)@CzfJb;q*U|lfZrYoDknO@4xStI^mz>*? z^9#tCc6u*IaAn(#(^UkQ&2Mx1UQF0_qs&XU+d97}b@rpq-)-E3Ys`Za{a{SDB<_AO z*jBV8d42Z{@K+eOd!0=yDUMpB`}%#j((*BkqSpq~0{_UN1ywMySMe*{mg-xYJ>_R; zApcRI_*Set0wD(jf*?MO_3zQ3$5=uPlYrpS3YU2)6#HP;GKdH*NX2%}NHO4%u=b6^ zJg_C~0<6;xxOY_^@vIM}DP~IhqqAc8VLF=xyXLZLrSU`1;4_3V>^mnrrxg7P6$Bscm;S#1y=#b zhIsp8QlcACo!yr%!WabnfVL-5qAs7KKaoA9m)HP^VnN}l{jlIYt(q~1sB8fiFc=pV z$;XZh3jsH!`_37F;TXbJi{0onegs2eNAn!Um8~wk#p^1PO`t6Jv**htWMkAOqUi+{ z0v9vn!ZnV?Vu!55E7oRPd!IXwDS%(@c&%}aE`K%`8;&vL#$v1<0C2h=Bw#hPaV|OY z%3;tLJ}4i%lDE6EIPTvtrog6$QsoOHD`0BMg5)<1?>*RndAleeP5VZTh>?Gwg_GQj z!*i1qVdim+NvGxzzVs(?>|C)gJ&f(7bZif<6Yc|SjI`*@yxNDa z(obxHO7U)p83?*U+@O9l0oa}I&m5Ym58bae%S{w2LlKqJeUa$1?hl{}Wr zs`8X@KZpBl57CCU=27%+7Xyyuz}+ar*wg|J08(}>`WHY6yc0uo6_vWNjS3E_XUWf?4}kl%nr0pJ0kI`5NKI#lB&w-om7!nl~vqbLdz0L^I5 z-Gg5lM!1I5b6Df~3XUxy|BVw=L@Lva7Tp1+hHp~CU23I3I`xeG326`#E3s#{?|=X% zE;9PBCX={^)E+__{0=}2(+`0R?TO*s@mg;jq8mI{|0vw)znSW$CH>ZDe+-fCk#;Le zVtju}{F7hlO{P#HV&5YT-}j=N`w}SSw+H^x8jI^DSpo;G63qY)0r)&6x8H#aMc}w_ zgCmCwLWJZ8g?rntMxjO$2@em>P=pG%;{XwWG=i+{=L|>P zxA7}!LGtvI3qju3|Ul;s$h2sFi0)9l3!!*;8|r!@@eI(RFZ zD~VaI#27HY_!3XkaMiG={S2Wp)DELJaG(g^)-Wt)Y2>VwLp$EW3Qer}F{%=m1e^J8 zx454pQgm>#Rtb@T(}yV##7O}Lop>A_DG2Ya=yIm0AfE&7;?XQHz0=OphzCF>%IeCH z$ft0!SY9cfWb8>QC*+{Iav*sENqh9fTYQ$dc4NU~)K2+QX-${b!LXBd4DJd=T#oo({%&nxqh0Er(m(vQz#a?fqOcP3i~`x&0_N zwS?m%`L6-?OR-d{1}M)vu0wIbeDV&A1FrgCfVu?=kxgs81#axPz6s~|e0Z6)58MC- z74>0i=>=6ASTn@ozarm5z4^y6ro-uJIDkrw5sE<-IhohzAc0zE@JNzuimE5|Z-GFI zy$~RUe&&i}2ns|%?umqw!7aljlU}igg!7Sj48tl#YoeP}p>hiXOL7*b#~Q!|2BtjV zw=Dz(tCJX*_f~;g6+YB;hDN!F>oAIq93(NN^o<%Af)*=t?8t|01!?`qap5UIEob%Y zm6q*&fNJ4==?5NA3gV%mKz=2yPrs+QG+hG;PI|(17Z(~EuSHP)-j-t7vU`bp!Fx&E zM>+oocHIaNOf5m64G5r#$zQEwx_plTfJ|4rv9^xRBxP!L-i%O(00g5+(DY_TN%<4p zG^@k}JQGfVU&)J&#$KRA1EZ9MgWd53E@}5<5Rm7fN27M#Pd)dMqlM#@B(aRXbvH^I1mUW5G#5?A-JdT zT3v~O;m2_MJy?%o3)>a3wv+%WzuBhp7GJeecZ3M^qb&NUMWrD%eJ^Tqk0C`{No+M- z*rN4GT)Z#@HqxO;@{dyrp3 zV^b3e9_p{ybg?iXQRIye6qt+P+T0&R!{q>v7|7TiAV&wIy|0nTUEZaIZ-D_*nL?={ z&XI`l)Et50G4mut2NEwj<2xmalhnM8(e@%k6!{H2_Jxb3!16&$lS!y zoF&e~BY2+N5raT>7ina`#z4Hcb0AI@h#G6KF*vp?g?s$_8o#?hPm{$-f}T!%73U2r zF)j*hgB-L(`9J+QF5r`R-ct{)A~yi`QXH~xtJ#ogQ&dr-Ve}@K&CeN_OLi;|=oVY@ z`Q~lbig8$<6-pwm-fkOARnZ8S!XPe;F9H|>P)N#nb@|=4C}XiEVa-js##q<}wN=VC z=qe$!^M}ucwt>gE`^%=kgPv7^dDrX^?*mI?qj2GP zkVSQlk`dVBGExg{RnR@0*u?d2^kMF8(0L_p_}@SVON|&$o!evTQBe}1{O2iNA|dq$ z`Q<5eH&Bs#4t-P_iS4+BV+6e}RS*J@Qj0uyI_TL(_2rCJa30BTs@9z7(?<7#uan2W-MQBovrw z87rI;iF5tHeYlVP4o8eb0t*D36RDSi>X2{iG|6Grb_0nK;zK1-;Rf#Gqa>UL8A&{3 z$MS)h8wYybp%$biqspwJ-*B1}*t0yV`BrH=Kz zfr>&vFg^}J8;+ip=;OLU^sZvZ97Uq2?|I4EG~c}uh^^xfmoB*ma;4^(dPl`IMfsp z&y;2tRd7xp9&HCd+7>9_g9EMhO&=q!3{f>=Ic203BCuhQ{-JYo_^*PsLtV^9t0mzqJAzh_z*CL?jLbLs_JIfL}NG#a7E? z@^CvjcLk@5h0QAyQcNtsJ4h*B%!Q=b(@EkQi%@+=@MFC0t8J5}C7x3Xb5JTo6Dc!C zK>HvHK*)3Bvy%38CheiNNrTallp8u%MKtu!?Od6N6*|Ywl(@HmKZNx@du0B2jZ6wQ ze*+hQ&GCRMjD<^PCNOH>hqUJpi}@0M82g(Riy0ADy;#gZ@cu7Ru*^+1DK^>l)xD}Z zq>#U6M_}|8u_8QqeDfi@Y?LRU_}?=kCw!-Iy1E?kye~~bG{jQ+`32>#Ks?Jo{+b?( zuNXH3oWB}XKJIxUS+9$X1B$Yh_Md__Pn2d{RD9F8G0oaWyih>y-jV@*%lH^L&Cmng zKUjWWNi}T#Ct?2T-swNYB~%G1z7MeN8>H5#7%dSl4f+uW6`jrf515gbt<0UrEPM^q zB&=U=&~ruS!-fbUctpN#ZnGU9Q8Px;?t*(aini#vwz_HA<$~Hs0Cd8hAU(VkHtvgjARrs0ahtbMt*DDPZd+_a zA1F9sp$E1vTd%zEq(0^bB+qPdOnc7;aUUr{gZt_vlu00$BbDe?2z|LJYb$!3(z*hV z3J_phSK{*>5MOX*B=V=wM{i|-=E7NC#!t5uF{-y_(gI84ZwF9m^7!>)Q41h}K@EXZ zg$ogPJ2)oT^w+_N%BVit?3EhyVi+GvHaqpuxitdT4Z;qQqEftenNc@J$pTxFa)F6j z0Bn!|CQU;uNBlzmc|T!`JXPaa#R*BTjnhn{B{bNKK1f4F;AzZFtz-Kf^$Ujkmmbw;gE{ z%#kC_8ho%m$~aW(!#d0Yy^%+}66X458~cp(H3ZlTI0OS`Z>m!p9()DUk|}fwE@Q~f z+bJ-zI!=M)xw$=vZ*+*Q^{3)}{;5zA(14RmIE!TM)v(T%gx65CwMSRtu{A1`4KaV! zfv(C_2jv!^$>`cL$_Z6BMW571xaJ>5RjcH5GQ=FJlol&M+0t^*28E0DfNuJA`=1Lg z)591t%Vvx=KEXo5>ujM@{0ydIj=KzzRqv*N^SRD<^WNk1)XL+q(5IwyH=BF4e5l`k}RVi zgd`^rEtQJcVs#pi4Osr_eDdY*G)JMaXgZdUw@@tHRQ-d`SHO^Ev%18!qG|Qo3 z3!{uIR^>Q8_O+e|o1+_Mtybgb|&K=y;pt_ke%%^^YV%kV>dfwx>{+l0U|f>b2i%964wS*i?o;T zC;epvY^^D8-svq9b@t=N7KpoyC8$FSc$9&+6oieXs>-(jRQXe_{ih(u1FCNj#Oou} zEWoS#HQ`+)@mjV)DA2uZnR{J774NOvZA0LA{QktNui_`iN-CE=28v>8lJg0WRLA!^w+_aDG_EB(&{%p0$96r%Z{HH zcFm5RC)F^TliL;j9vTNs#cUB7=x<^cU(wtf^MY)-ze51{U48|5cK7%2?0?2Iiv)C6Wce*^6CDgZ z=2PpjT@nxNm4p%;JVzY${j7ul=zcH+W$o~QE?DkQu?+%l{fLBp_d2au70}%0Q7Qa? zX>`917zvwaB9;Aj07YlPRIU$1fnL8p82Wdd)YV|TLsSr+}lz+kMU|JaoNGwAVt_vv-tq&<$6mIeIe+R&#MbPWROKaa>AISW{ zS|Ia93o;M2Eq7h*EkeyM56iR`^g9-C?pe3en|E9B0I>A1w?pe;Q*r`yQT~W|jnvzS zC#en&K|?xLqHo(Zu=UL%&-n&LNNuN&LdM7gK_mIRTh4ybAqRaq4ETfz4w@pZ)_L?c z@J9d+B}eEFNU4LV3Y=y0$7|#g>iJcM5i)w-mDml2qKM{yV-*+>S+%dRtAT(bY(UV` z%OEWMH;#(7RksMc4V$tq8Lr1w;zE4AN|L`{Aa|DnIZk32HExt~LVbS`V9`Q%H6lvS5Q{73-M`lR8YF4t5=0b_eFpnAh5X#1gg__!$1nh-xeeW zgHYBG*i_|2Mjvm!F+~a^etDc)Xt)SD=@Ibdg}*e=Wjg5xKDP0r)OK&_V82&UWZzkyG9cHW791sU^sX#^IJcLdPlMQ>_4l4(4O|@$O+)r>n zi7mfvy`HGpOxgr7*yJBWlilwo4hl2%-QjCX;5e~&pylrOBAZ1+tEJ?@l7iFSy{zT? z@pbb~i?T;Bl3tuqMw+;AK@$4Zv2x;=N86LGr~I6s5!!Pt;KIx?qC&!=3x>s;9K>6E zK0@citB{=1G3RP>xfAK)E6JUatDSH^9Dw^_V(9_p5QylJoh$nNBZ%BWC&!h}>m4{< zG&X}1O5u8#yxxhsxX_V_#V;a2W%$5Tjg$ACRHpn@u>C=gfj9;d{V%Y?iD2Et&7=NM zB3N)lMdgv_BiNBr?YIE9JY4VqCppi@i(`aJB?T<>gDJ#{v6e0({-KwTJaZn#hUJ<4 zfD0b6;X9TCo{m1!f~a6>O2=%NYB|AK#bv@7GpJj~>N5dM1tO@@$@q7ByThP0RKT?4T4M?pN`dHxU)%4F+p$vp* zN5MAwA=+n)#EEv27NhO!{+KR=q?ejWSE*rPpR5AMSx;Xme?3K7V-Yds=!z+$OH($) zd8~UKFz&$+$0H&SsoTHbQ{tQhymOe;@)3|1cyD(+eO#gDj5NVcAGa-m2ZrYZ zL>imAy?Ut(wJTgpGiDuSI8SJG1`2(*QKw>L@1FZ+-D0t^CnO{5(h9)zqh1-x2sO|m zrsN;ohXL_MA6iF@)V+Hq;88q>ctEv#_6&LBpwg>v_C!EnZ)KHMFrAv7bj5Tc{ph3V zJyP%YJ$fAX;1qfi>5s~H(1X{sJ*2lYd!Ard z)9*(e83v`RxmN@I4$gmLZm}|r?RbG3t@3>qHzR_eZU|4XM=5`Y@F9)-2EqrR1f5j~ z@h^V(<1gB=*p~)NSX>`!%-D%lin~4t$*Kd8=n>ZQBtQgiajz*ZBj!3o0%vU3o^WUi zbr3foV#-oYTOI05x*Ys20eTvdKl<>2%z+I6qIM|{+b7!5foWO@^zK17zYF7SlK6jd zfLrl(7xp42&la~a_FeFu$9{+M?+PuG!Py5V+DfUM7rKDU2ELZqIaC5UVioZ+i|Nq4 z!y_x$Q5vfgBO;&%w<1sjz^ad;nL-DsBgCr*K<}?-IxHPvTiNR=n({__9Uw%*>Co zjk{1(>RcCG9TRc-gENLX!(zq0){i*nHjcSzyL$@h18O~TXcRb&aFh<=f>C$rX$5yc zaA$Pnq(d$o0O9a?4b5+KTxSeQ+%pW#3N85J`7J1B7^EBm`Os2OO}dJ4L4PwCoT+6D z*Tz)N<%yk?4b-PU8>Fi9H$KuliWNVQ&5@$jv!S%UBq~Y<40dbT>iQ& z6XXLREvVLuLG*~dd<-5}AUk1BhjZ(MhoQ(+W^zh60Y=XCi$68xY(d%D$9ua6to<00 zZNJ0@Iea+1fQY@d>RY@7L@yg8nz7wFOM62o1&N5hch4EV572FEVW z7+Ow`1UjOXA*eldgl67L;w{K!#ovGun&qrxqp*IWzVtS{%JPE3_~PB>+O zgO=!pz7p`>z!Q9irvS3eEfVlkg^)6Qka90YtUyM7v zT!WwI8vG7iAg-2@jPy8&rAzngt1$#ois32-dC7JsE>B@!R!z{t>>5uulCW|-qs2*> zsJY@XgaA*lz1<0EOJcr@G8U1!yyemmPx?YYx<^)`GtrffTz56@;B5|PWZ*k>X-M#8 zGJi+BU3M}87G>6ioin00bqs64&yT-R>tPlo5~xma&T?Mpaoq0RZ4Kg}VBQ_1_5w^1 znW))f&NPqFjo=dhs3}a%NT%eJL4}!+36HWyAD`zLpR3XwtXzN00IriWAhZ!ROiaoi{*%$u5@x&Fz+#is z*z|Su4I(+oVT)CR7uF6njx9D=V>ro!v>{F$CLN%1lipIp$ZdepRZV+9o+2Wut&F33 zn9KL@l#cs=qhc8xK(H_PA3yG08?}w8c(KEpnh8{a2B2Cr!gQPDvJtd!2#D#Jg3>Jt z_pk|gNN(JvM}s@Xuj~BcUXAdX_u)sq%Jb=eeoLobhHdodwS0AE1@kfL(vuwZyY#%G3k4#XI?50Vx%dj=pC ztCU2WP<^DZQ%jvetX_E5g9y;T zsGgP}hnfms0Pzo10t`bHme;QTgUICs* z4?c8YRcb{NW;ixJyo+O$5%;&s35KmQW$9wk*&4r1RnjV#Sfv3OoSV!-_XhWjdsPQS z#ETONOjY1;jtdNAd{}!J;9@ZZrU4Xd4Y7%92!rKIwK3c-BNKv9X`8(k^Q!xdL4in7 zmW_v#h&Tgi72KjpWgKcGzt7`cNG?Ih6zuOa#{>o8+Y|R+sV%~prGn$T$%=wqB>heF zC{pfVQ;rsA@{qraKm63x!2<`TeC|~WpBzrNSOn0`X9Dwp$+}qdMLu9qW%B$PbI~$L z9uCn1WSDxG|eXwZtY7 zM;#atAP55Dg3B0B0g*sl@7SLwJHikI&&g3d6bitB&xRmSA%EfG0;MaSc9@e3^It_r zT9vKds`Nxi8PgDGzj$l|R-Zn&p<29>K6~Z_fl-~xV#jr3D3zJoR*bF9JA)6r zRJ9^)GT@8{M-~Q~wAYgxw6u2PM-2eKwx2OTXldw~A(qew9C&zO!?0{iX@h3W0yLLx zdObV37Me}hL#)G06Rm;=qw=7dB?ZXvzyfzHUNdPx0?5~`fT8RFj>M>yFBfyBdHQf0 znj70kghe5TjoH=PxG1Eo7Vz&^;B9igiwi(|>TMrn80&3;Wnj{|dr^ZxI~i~O`Jr80 zZOnl-gm(+$IFOO%2o}cw2H7_Rh+36~zUMP+Fzysh#9(Vwox$*@K z5|*Ug5eli^MyYDwwN;4KlSK-|GnV@akgWQpgn4fvTGgv>B-N_It6PioFv4|X7(wv+ zhFsrhe_#=JfVi^DWbHi%Wcak4plH)`T~Ne{s6pf;Re&KwZh5uc!cv!R$uTT}U2DVZ zTtR1`q28`#SGX5O%dT+u$GNls6Pj`xC4@p8wU5MQAp5@P@vfM*4XgF<(o?D`AU~(}QDUFge!DMP^A+Wul(| zN|w>~(f6w?TtAOifz^QY3u|gg6`&YciaDpIj*d-?oO*Kf%Ep{zV(LbgT#&#W~p`CgS8i6==K^$@7W4&eWMHjmTe!GiMNhSH#WMS zvOfEEombYw>Z@yuZ|P9Z$x(YhR+#&buuyD>>5xP)_)AcVA@rg9(_F_-aOL4b{QwXjPR1@GRRVeCH zdrMlj|4jO%ibs+@J${^w*}G34_Xw8N6^AXo0+jGDzDA=|G*NhPz8e9Kdb`6@I{ZzB znoZH>ioVDH^s%V`qqR|vMj?x~rJ!{7j^5gVw7IEz0{=RfnyfLkYx_?5;CRaP3)IjE z!yArqMILpzj{;pP_Ged4rd1#{hsfH~Fc^LKtvQMU6eG0Nm=EwMG6Rv#Uj0raR z`+xvd21M=c4G*im!NzJe%o9$VlsFhpY-i*eg$OEkAw&kya>ga1XCi+!gq8~x8bHnD z#ZH{^iB>kuSo!HQ!sCWz=pHu$1q?KbCQx4(TjC)-gClMs(x*4{-j)y=vP0TqtVQ85 z=tEeyh>cW zElkP3ahJ|7i2NZMHA*gI1!1Lq63<%=Rx1=QQ%^iXxa&=%LXAx3NbzC8q zZ8N^;mTwL!;UBgD*wAUw-_Ntrzre3wU%y30ujU>j{L>) z2Z5M?xk3V{q60^EcQz99-FVBxf0J^KLudXkL3_3mgFeInj!6>%8P&BmVdCtpktGJ! z#VX93)&)cQhGF7XK+RTO?*ZhAgfAooIbWk6hG?wyYij!Rk_`YNm4+qoY~V??bip+) z1Z|BMo(v1iz5vCcdQchc-6VJXFv@#iaJn~Y7&SvpH?>{F_+i1=RIKOnr1aTL-$ugWS!Y*U4Fh>y3f;X37)t79k(XyL zXl6Ayhk;4Mn&pD@^mXvWu=+-h&y+Hx_A_SW5BZAVSel`RulNjX)apS&3*eQBR&OBa zE#;48$}^47z}7CiSZx@67J#?7Wvl5H13ER25dOGdpDIBYdF$J=S{gz4pTvlog3W$R zB?8eiM~8nnt2C>&y9FBJ)ZGX-sGq~vxO+FgVP8Y7LbIO?BDD&tKvy?R6ma07=`ct643;1|=(o*7z5KuXrN%d=YXcQva3+~jiL+{1~ zcW7n63s*{|tFr>gf;=wBlh1|2w=NGF{`Hdumk1W zq8gL^QKQihWKMe#BQuqJl~l9dAz_6AV*wpb66M*c=Yj*TR4bH#bv0+kS|L4e0CD^3 z+}H-DntH2yn99xiAy&fx`Kn)gnQlxC;0=KoN2ogV==zT93l(Yl))DqIG*k{m$CB5p z-&;+q3k=S%Q$`7{`)XFZT8W^HLF00E`AWK*CQwSt}KaXGECh`4S^*5ZtLOge)@Z_5si} z&>Nn!+9l86No<}dALEsnj+U3m|0^`gM@TBeBJ4vJ`hBgKdfE?nUM|s!0Wv7|Q=}rH zmyTK5T|)2=HyE=o_~0jOGkxgRW$o6)*mNM=fJn6n@C?l7Z@E~yhqQ8SC|?V*#3+fd z)iO%j#=?TvYT9tq7;N7Pjh7tk;35}Wh5a12f@=Z`Bnl#&m>~DE9XGRZJ-^U-6&R9- zs=XNfcEIeZJVPe)us|i?jAwX zfMkc83Z*;TSk_XDL!J*Q4wyml0~y4~v~MidsMA|p=SmLXPl=PcWR!|g!RAKTG~zy$ z+S_zk&J`(Fn}>>YpJ2{?0|?UU%6yA(V|$2!zYPQ(iCY)5-MQ{HY+~pHiDrnZ_-AOP8UblZ-sg^#Xah0*|up0v;87tAtQFk*>Idfu< z@Nh)}b@ZA7>Dy7<>LAVWgxVOL_6J}I2eq|fV8herD_jfs)Ad@VI9I#khqsN+X-D~U$Od=j6|nHZ$b z2Ovd`K%Pvz-3@7SoK9{NkwyxHNr%XylTbnRtR!zl7v9zAg@ii!ViW;{;u1m#?ru(} z$urcIpTl;sI==VW6t$g0;fX`#c6hhU6wRK)hwE+3>KH+s>FA%p7{XjEOG)^{j23MKRm2b9s*`_V+0Csev^!Tt$>HWe;VG zhx?ZHofjiY1QehcN}K)O!h$yin>BB?j8K%L8=4-`>NLO9E1V8&-FZBj0Y^&cA4MGM zcDxQUAjIdwzp{O97vUh?3eWAv)OKu)q|e{qaXD*m`M}w*8G1k6?5>Lb#S{YU{Qi=2 zH3MWOE^mUzL{%q&>;8zi?VpeU=u=8NIgKrir`aAKd^A&_M#^b{W%tNgI^*~6t&+$+!|q^RrWPIXJ9p3bC3rwZUgn{?r%xu^#55xvziLTziAhA>)_G|1~QC8c*0o<-H9t=ymCgSP>+WM{wvS?2X` z8L)503+1|dn72XZ)+_*B<8~0j#_9tL091Bx3Fu^660SRN8mG&7F(Xi~Jznw}g`0cv z;JN4vf!L{6qaTXQK%jxhnq3fVBz8u$z2A}6Esn~v4!)o3l}16 z?xwIA^Fq;53L)keS@bSSr)e_Yewd-_32G$VEZfq&UE%4_42KBWO2ad-85*A5>$g-< zTB96>F?61`+in?)I-BB=$;7?9Jt=*7$&3WJFjw zGd`B5%SbECkBH$nEmAFP96dQ=tY)k*N6Dti{rccuWG!_>S%VWa%ynEyf)GA~r-9QZ z2+kc!=B&bJq#JI&ideEPf>t6G$WPd&*Bcgo7m77#oPDLQv#K^mT(QO8K4IkwLC0#_ zhJb(pe1$Rs#n>D@DO{?rb?Ys+kkM?b#*p+P;9?*%Ri9s)0n@u1nD*=)617^>=0<&- zn_iNmV12s$Z6Hcq0<#eDCZcGz9|o8?r(!Z1#4R*Fd530)m{*6=F5TJ`)~OsLaPy3c z*t5y4jIot~&1@=a4*|9bhoa4tj>t&EfCPOpT!OFr`>4!9IIab{NvDhuXHZf@#Z&`= z=XxJwZvn>RpNhSV=spm6M0tu_eOm)=wsIetXM|&TV%&&9t*_4hejdw(T2qEv@I%+Dy0%hDA#r z-XP2jtQ76E%QWMtF4R>+Fdk|%U`0UbdAT%GEG!kU)o2?asQqSP^5JXB8?qYMQg1aF z*{2y1+fcI%q+?hH)VXmyWziy+1ca86GW&ox*&7bxptDfgC`aJC{y41g#>J}Ho#a{(LlejxHn-cUEC=bnn z^NfmFji9c+OyUv7Oqe7U=UG96>40z2*53KU9R`NgC=eY;B{Z4$VT3315n+Rg}%tE`2#^-z%4x+SV2$&`kwTi^vS{Q@)~@f1dD+ zN)WOVzDsDQWcPHRUXR8hq!0rr!8!K;&$tf0vVEm`&Krwn${S3DWx;YG@LrDaV`RlV z`$Vu-D@EHyl**LT1}mm^!iq_3m=doICT!e6lkR5!1jW@Dg{Ro?ASp{!$Pdw=`?I(h ziY_nO^ma30#;FU3F{O1~7Dv?Ul1wkq9$j)cbcD%*ibUhdF2hlYS<0Y_ZlM0=fLE$? zv+g6wgt!;F?BAo&-$uIZSCGf5s#>$Y5^WBOskX%SC@qV#X5IY*WVQq(dk^W0NA7IL zjUsoHwe^d1v5P$s5heQ{B6%w*gDu%aPO^q9tDltRH)aVNk%QiVZH&}t@1TcjH)OLL z7#yhTW%g*d47(aw>;?nKOuCCjMvw_C-mrf7tZCMxS%gJs;Vuzc=`3id5q-L(Pri>g zCl!7Se;GWLGAI=twiD#jY7*N(4e0o6zTE#C^URYfZU7jX+Z5p)JWZ>Px661d(A2U> z-Tw#KKg#t<5(9@;+_rp2fFN%v3XVRi2^1m9HBlz211BxQ_L)&a#@UWF3|IHwbtFK+dhs%IpFr2fFRvCS)N;`_G@21B?Z*MfQ)^MmB8h+G6c+NWMzR5d;#y5(0^%@Ixk-^|uFyw}8?@XH1Rezut*+2E6|s0`*#rHH0Bep#PYF=|S-p=F7Ffu-1hLR{c^4Apa?z z{Wbtuhd=4vwl!+QGlZ14>K5#h2E=Jn|GpJH9u>RnZ&t8Ww%{IM+C6NWwh|8xxBDML zhWP)(vo8@>D6(g;*J6s$GMZa`P--wn{pJp#2ZucX9#I=xyE(c+CiMq^SwIy<5p20j zgp_u3yF~kx_U-Mopqec3EwDF)j0zi_ z!|9+vy?vNk)sI^jUe}NZYCfwr#a=&X!e-yjq{hH)oyKswV zP==LCex6cE8Yg&+C^V)~i7jqe(RZw4Gf;-?jFYL%mVK}kHluF{yh=@AVZ4oO9im?~ z4In5CmTi~V1bLX~e=xW~?)Qyna1EP6!$OOP4b+Qy4@D-eQ2(FtY@pjheR5YK+WT57 zzY-{Nb!yNPx=_E=LIHC3Z$;LAq06ce{zfC@HweI6;QNguE!_~q+;39OIS^J$kI*Zc z#1n`NeR4#mFN( zTA(diexKi*b7s!HXLnmA7?j=I@BQ6*{ASLa`Tfq!@67yW+8H-i5|2Zo(>+O?Zt(Da zO{it&#am;wX-sk>rpbo)v#6^yM!3SL|3$j@%Su11b;hwgC@5IHjb^>#{Xv3SO;Tv7aAy*hm}mtH@k=UP&L()d3-WA9X-iMr%%>|U&zd7OY2DkMlB`v;)}~2$8rTaK=SJ|W)bL6XkaxusocCsPl^wS=_$fI|7^shboIgkDebkQykhL63HzY$t8{~$m^zX$a~8voDS_?Oan zR_V6p*QVE&()^v~H8Q*oyaDV4b^#^e&6IMjyPtXX2n$*0$GW+F;a)MdeN0*MddC2H z+_h;hD4OAvldFBvEXqk+^3vwVPu(VQ?>kdi%boljB|x|K$+Nu_(5)#BqP=2%Yi#Q0 zxeKmmoJ(lQ>n{snv_9oF4-PH;X=5(0dTyxpjTR1@bJK1iG_LPfkN%oXeRsC*J8a#W zLRB(~R_@((s*JRR=1a@floo3a<#7YyR<)-M6K6yJRIVFhKm+S;dG;NTV_L>YWs}k_ADj4Ygl2^ z>Yg|k`Ww>5W&FQ}&Tf!_mv0G)^ z8s2u9oxm;tyP0_lU~*^}&3dM_GbvY>&Yvz6_qcwPq^PtN3vCw%LqQ?h8!RbK$oE9p z5q5^{K}WR^ii^~0At-vEve0}w7Gx^_pax(1`cXl~RM&5Mo}YAEXJ z8ww7r6@swmov1%LAnJ+wqG~X=XKyqdbqhTZMbThaWN1NA);iw*4DITa)I}YxMx`AGRDY(II*(izM4H9$^QUc0A1(*SJ0yBXS zm<3dU*#O5on>m0=;}T)suxDV{r*k(^ylOYS0wbYJqf&F8VY!Lv2L=Gu$*7o-vLthU z#FkRyVN#q2#n8;m7ie_I5$s=DYd&J>jhn@Bu#QF!B*j8POCr6SOkFnptsfh&n?*z% zqyVR{0z98bW~nJ4IZVl(zjQO{J_`I0_!xkN*FJ!G7>i3_Q4gF`UDs2vM=Ek&EN1Y! zIh^Q{T?uSHEwv25x ztBKeGoF>pHkB-W2Ea|-r?iw@1m)dISyK?_7Cdt{rI$$G!JmjgGMrGNCO`L~-c5f3u z(pcxi{)#wTvHwxwxI$%47<3he3Zf*?b8%8Ghr4u!TMmIC`UEE`&q6I5IZsABtY O(Ah5k1JxO|L*4~TNvCcA literal 0 HcmV?d00001 diff --git a/sbsheriff/Lib/site-packages/disnake/__pycache__/colour.cpython-310.pyc b/sbsheriff/Lib/site-packages/disnake/__pycache__/colour.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..86021227683b5413d877356d6026d9c516b554dd GIT binary patch literal 12567 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 Lkqkbm(d_>RJQV!_ literal 0 HcmV?d00001 diff --git a/sbsheriff/Lib/site-packages/disnake/__pycache__/emoji.cpython-310.pyc b/sbsheriff/Lib/site-packages/disnake/__pycache__/emoji.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..4bb158f3e14b012efa7691e2ceb4f4fdeb06754a GIT binary patch literal 9739 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 Hoz?yi3s$gW literal 0 HcmV?d00001 diff --git a/sbsheriff/Lib/site-packages/disnake/__pycache__/enums.cpython-310.pyc b/sbsheriff/Lib/site-packages/disnake/__pycache__/enums.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..9baf43d659be033ffc174bf33d6c860bd6309783 GIT binary patch literal 22474 zcmc(H3zQtkbzM)-uV?l*`@!N53_udVf(w8E_$Ns2VzB_01P0*l0uWoEnzK{Ay93M* z)iVHhy$C6TvE+}O<5-qt%W}vl$_XvUK1t*xj+K+dIaZv%^RseZ`Pud1dzFp$*n_oai|bH8_0)4oom`7Z`!3Xf9> zYnsqZO@xGA2$>-D<3+7@{nuy!Udtr0P4kN}83B)Aqp?l$bAu}bCqVG-392Wgz0Phjx7!*Uu zF=UV8n=v~oFQML4VM}q`91m%w1ab_E5#$)L$HeF-!sa+)#>5uHY_Z4j%~s&!Vk_{i z3f~5No7fI~yTZ2v-ywDa->L8&z;}t=z<1l@VvpGSiHNxqacQv+ar^3VyAZcuJb<_d z)OWjqKPVmo{*c1=06!oO0zX*)W-sCni3!9_s61)lhsDFdA6EE2;FIDA@FNP}5B#V& z2K<=99{~P{I1c={!XE^FLYxGCQsEB)e^fjM{4s?eun(9A5%;)w0&!2MxI@676i)$v zO5qd0pBB#me@5Ylfu9o30)JNF4+DQrJP-VNg--&X64St^6@CQxX)yzQM&U<+pAoab zXBB=7_*rod_&J3?0{py~13stl{3+n3_%QGfEBtBT z*TpNqUs3oo_JH^Zyol8R*>?% zUrKB_B34BnF;hZc&?atVmm`{%TwJx&7v~n!7xFo~Ly=SwKfP6tWpJNfErxmHc1IaQg@v5ZM%$`xvYGz7_od@=9UkmTozR}Lw! zIcNdtoJ<$XBEQVHt(sM-Efw<4>SS8vS@cq^ikuE373(LHXveX#Ogna=z!LJHTeY=8 z-K1(OY5{Lhzt197@150hku6EqTLKm>*JKG*f+=in87xyZ-mr63#*p&ma-mSZ!=~lR zC6Q-)ou`vZF0xDI+qP?UvkNTj;_Up)d6YbTdhWv9;>(lCvvZ3Xl$kz@LZ{Q0 zr{@>vX0BYAo=;!CGJpBf!YrykgJLstnX~h#W%lB1X7MO$MO=FJDvy<)QD+bkj1X;+iD`<3`mNT={7f=?uC)1MoXmXR&er6)%4pz(6 zY{4o^VM~bIM8X|deEIUMHFJJ;2K{!<4NsTWTw|ty;e0hK-N+e?KsRy$1IA5evPD}g z)+zsIN5?5SzN2wZk!MwOdN0{v!zS|ut<(F#N0;sxJ7B(AStdvV=zRKQrx>l{0OAFOCaD8ymeyuuJs?@3; zJ`4g^?8`ELJDXeccsDc$*2%15i7H@gQ^dUOplHYIheT%K>^1MBq}Q7&|M+yJ0)?o$ z1Edt86IFb=GrlpYs2qvQS?RNO_qkfWAQo~^e6@ltW^bc8vrsvH^7bytekbqklGM_` zEsLwt&WdT7Tg~6L&(x%%)a|>L7htHzm)M1JE?cm3l=|jBn7N+8dlms(gQ2UL`W4L% z%RW0|M@8tArrtW)39> z$`u@|gu&uQ6pY?xnj4dL71Kd3)I<`)aXd44oIL;{w4vS5KC1~G?-1T$y!FrOBJ#O7 zYKvyR6*}dHj;`xZr@s|?ZXzsC;v@Me!D9gLgxmrNHYxP%!cD{KpM6NcaNb!RCEUC1w8cOaohD%spkh?jF6(X)U9IZe< zSeCRa(y}h0j{7>mp3wT%RyG_B@^rM9y`b7Vf`H#zwi>PdTo`TCGxABKOz2H*dm0g{ zMILw-s2jH|Oyia{55yr6Bcb*24kA>R3=|!RW^Y)Qo3t!g1`tey`z`AhMxU1=NtzqR zC+?7CL4QG6s`(LZfvu*==Ln_<$lWGDg5(K+^LU&=fTR`)86iVALWBB9Sf%9<-SWpW zr|>wB00iX~;CD1n@ygnJ%Bf z_wpP;gA=M(VwPp!vaAmwNlC`G(E849WI{fe?|o3HEohQ#mU9Fby3t)GOndz zWP213OLqT{CRupgOCzrSy@~Qly7c*dN*zl59rr(Ms(E ziGhZ?r&k75NUw*&_qe2qWH>0HhB2@>I#mFpP1pq+)mkt>;;UIFTdhh2!{Bl|iGx<& zL3Sr6^A)HmfjZ^$1lLI$o|Zqdlz+}w0D|$O^!Wt!_;zSK>~d!f618wnA@0vY;3?%(Kh_TL(=MmCbw z=sjH?x;4DfCm*fGHjIq~a>I$V5#C5VtKAx2k8MOZlH0Yr{nxb8wun}Zug!-*5^|`# zBK!&cZvRFN7QsgVS{ci!eWG6t z6*q#_WYvvgt}HrAK;;X}-=|b%(Z(`XxN!^u%DZd4Xs^vmS%y7}CA?h{Zq%t^40E8A z>^m4S!xqdo%tc;5s)`2PFy7t(k1oNuaNHW?5?W6M!jAbsv7xI1Qi3{$y3{a)etgsTILxFo z5KW~cTRsZrIa)^dcL018TI&_#Zit_3Kx(f--frn4m`Bh&cJ@2Es~>$t@ftBj#55Z0 zCQhx`CHu9CeC|^$m4iutW1F`AU=#U}16U(RPZelSa+Zy72 zlJV;R>xY`Cl31uo#}?h&tGh;!p?Aw+c?Fp)>ocrHP1Rev*3!{_cJd4!hc0eTMr^fj z7)$CV)87awDK~#wyRg&GRN~+I>ovv)waArMr%7&g!%cqcv z9;fbZ;%B{bWkdc95>;mpwsy8>RrjvBAKz8Aw`jHLZ`Yd}cB3>095;2*8~K-I`8Bo1 z^|V-{SL;-`eXxPOb*^Q-9Z=J+ua7mczn-DRmLcakc_>yqiU5?lKd`Q0NI|KGs`|3N zw%t?gm@qd$&2(v)Kk5yDAY}GP3bAj^TlGVN*n(u zG}N2O2jfo>!){Oty`3GP$e(~L>*tY4NxKnhp{bssCo|*^vM$gvO6h2$MgEXVRD`$@ z&Q4v3fCb1D%lb>C^hW?%NT?@wkU(xIN!!nFVpyVJtk<+a($-R*l)VgwEoe%v&Z373 z$P5P&YE)icB|3=aqQy0WRZTmY!%)Tkf(MR^+)c~+67qX86y_v`3GKV-ecUy z2tH2m!vsG{@M8e(fWJV?!F3J2s>Znj4znm_{t7}ISxHx3wK{?o&l zpTkCs;Z#`i3urPbogAK)KZ@)W9*6T!V0vSj%DI__FBY#{5O^O`wu3*0>+0hWkRIw| z)VB*mF<5`>S~XWe;9tczk_}NKK>h$jjrOvsZlWsJJTvB3fO{I!qhYOe|> zM99QipUlE4KVrtPff^Svc$VU3LKtRJB)Hlz`$eBQAo{Vwz*>VV3^4@ersM#MQa0>n z2%$|@vB{3vj1W-nHaR_R_7RZmO@6V-`D=3spktz8G33B~$|tp-ulb;El#1!%hEeX2 z-{Lo{J{DRZZSwrWsPp|VsWu*C1q)xM8?VrL2{&-`b{Sh6ZgfSKYZcdk|Izc_Mqm^= zW*?zdRh~a{K<(q?0(8(XBEb9Lvsl3zm*ts5D|AF!0xsJe){|>ybh#{R#oj&~GUy-R zadrV1zHRGSxXrL%SIqC|WioJzpH~3he=nnl2eC~)g!N+zYsX=%8%MBa9L0KZ%p4b6 z%&lVF+$Oe~+r>6>huCiJ6gwahJ0-i;Th-7`m7gY1wv{sDehTO&yLOXGXwx9zSd=t` zjk1L%Z2cGXH% zD=UPVYM|0CVyDZEa8fo$u?@+s1J7MYWW{bo=CMm=`H=>eIS$KmlUzG^_KLX!JE6rq zmdsw?bH7Wu6R=-ljV&u+o_iH`!!YJUMZTp0-1AiXcRON z{HOFWVz0p#=Faw1X*Uul+Y_-xo3ky<0Qs`O?1bGxtPip0%I#S5@Vn+-&SQI~o_Ek2 zJiZ4=m{FLTg*A5+24mpux8OmdyWbr5^I{-Lu4#(i?v1&{t1quMFkrkF^CfH}nPcb? z4rb&l)f$ClYt=IStk{j950#5syt-;sO6|YF<50=;9(2tEusLjml-&0ojMUxle=uTT z4a$d6M1gAcCGCxoSDeiSg>2J)8@QdQYZGD0_EHM;yl5hCFnKv;n* z`qE1Eu12L}hoi0kvH65;MEU1InwfOUwUWT$0Ew+z%$H?}tvGKI{4yKI0n!ANnM01n zQLEa`XmpjK_lFfXdv?!#T6Mjoy|IUl!i?E~}b!8)(Dv~0mQ_|&mgVqkLPid2~KQrVJaXp%mz zzkT09Z#I$sy<`(D)PPN35#xI@r){IG&3NVpZ4@Iu2IJWq{V<@xtfZvff?b_bAz#8- zh4S*U3Pkcya&B0_7n|Uu=H$73mO$rX8i$^IFZ}#vl-yG{9Ix|p(A(Z_FtV?0w92or zpub1(YXpBE0QP>_f`fzx1a^*>Bn?yf4+*9Sx=9~fdWdXgAYf}SS%STc?#Redwd=EW4sK~V{n21#vW<~$e5p{AJfjj>k@gy4 zc8%)_+b)^0GLF2hpwFc(dh?J?dJGji9LlXc1P7Vg!9nC!Q`3Fg#hs%UoQg=A#|=(( zE<4SBZ{Vn-GLAU_ab2TLrFNjZb~a0#W@po;C!v@*8P}UUrgoCY#V1INN*eUCb>)zm zh_!P#=4~UoF>hbbjnygw>$R>Vvc$6_k&6wFmmrd{9YoT)n!@9J6QDbh?`4Jje%4Or zF0s?xEq0lE#BOu1*kh)}UUQ#FoBPE+^8vBnd{8`KJ|rGA4~U1%gW`aBNE|dL#3A#r zm@pp}hs{axuz5sGnn%SE^O!hlJ|d2p$HgP&3Hu}t@jhxlwq3(15+34>z&Y}`ANz!g z#|J#W#;=U1YaWfMS{Nyu(_Rp2G-_If?WhKPPNUw1Ze_J z(VG(lhY3y)oFt$HzDdQhNh4sBPN>cE1aky05WGlmncyXYd4dIkMS?2?Cc%dZt`i6X zn_!usM8NH%%?iO9fOlGfqbT^(5!j7q29NU3) z;u7`LWIeU7p4u-om21F%5Bl#R|DCFTGh7di_-Uj5d(3}tK@QNNs2i{6-inY%$u=(? z6mPGm?x?5ktf%g(r|zz&?y0Blt*55zsr%}o{q@iTK2;C;?}w1$ap?d;;M^C;yMxS+ z_aUa@J;5}*5Bu>C`|*>0{1HF?s2_jKkAK9EKkmn$@Z(SV@sASE4}KwZH^h@B+XHvf z#A8axU4Px|s}Cv#`I`XlV6eva6pj2>EsMG5&{5 zF}?ze+{BSRH`p$%$QrDK@KUzqMr$R$20UxV@(UR8QCd4eT%RAO{20SNf_WQj;}VaO z#FsFS(^Ju>zVbDwhxo;Mh)>dhzsmMA2B@DkK>f^vcf1pd{_5VX<9_x!?&t4^yX8hc z$n9f(ULOle_SgRY5e|1Wz?W);n?WSnuI4NY?iljQLuw_WBUqi-n1YoHz;8@ToL_BA zoL~7C&yyE;*#mmpqx}-vqk|SW-g(U6>%jmIcoX1${(%-pi5sAP?f~^O`>q}*IOu3$ zTNJA`znwi&{i1rL`XxWq#W6!akbjEb7dz~PJwvgN6>vVaR%x1n)e`P6AngsPPUmM4 z(8Kh88@m1-IQqYBMD+h-MD_n|#Pn|&as7YA4E>w2g#JHcN&SDs`t(0C`t?6F2K4)} zLH)nShV=gyOX+`L3`hQ}F{1w$V^sfrV@&@&V~hTujdA^Vjjj5ou}%L^#&-Qb8awoF z7(4afF?Q+y!Pu>T-Poi5``BLn-^J4U*NlDoSB?FVe``Fz0|4Fs#eUs5xxTgaDDTn0 z8{A?}a)RKaCJ0)_^jA~Sh!75?BzVUH;qXmO4$-!372bvLD`K|_??E^x_AY2VmN1ddYPn1j`}X}m5q*6}n_M+jl$m&{&CHeGCaK>c_$~nsjlg^-&5rQZ| zjDYSEX%Hj`k_3GO{RGNWG|12pL5g6QV1xksU7DodKyD$xtv5|>CD=xQ&2&xfAW;5{ zT@39e*h9c|v`iE1BiK*y0D)T2Kg7@k!C``j2@Vh(B;aCEP7?fSwo+{esF|3`!`rre zo~hjyo3vCfAkn#j0E~M*SZMz7y!9}4@t@chQpQ8a@&R;s%ZCpk@W-=!z{uPpx!=*W zMp7FqKgYPAC-^GB<`lsj1QeP))l?piUI45p^IDosI`q|xV~#W^#Q_{#^{`Hu{UAZ@j99Rc%<*On_Jz8_hKhD7Qwk3195%zf z?Ecn5S(;l`tJMnKq`}1pN0k+KD%m2gesvXH_TpD5x?BmhuJL;bFV?O6szdNN2~FX7 zcjr{g&MvRRVs{r)&P1Q&-kCfGS{lxQZX0(klOJ+ZwAAF+(SRk?9RsTz*!YRU)bfaqJ-0I>K!LbswoSaAns~2yF5YpS%WXyG?idDo( z)o-ybV!f&I8M2c($t6Wv7l!nCo2tqu>rGVMR5*(nsPlu^_pEt$P^psA&YE2Vx~e3y zQb^?h?N%+z*ix^SSVy&WchF&^cGKrL+#Rvw!Q~t{P;hJl1Im!}b+mO@cmD$2W;1xy z%^R$LVLAfhuo@uFW#q$+bt@0zhbyHOH*y1aVj+;KlJn>QoOxnAOzpF%&=uu%eXHRC@bYJB9y_FNNdyG2rdS$m_vc;@~3Q^F|n61 zgQEM|Q?}Mq>I;751?DMq-vQv^2fr8laFW2mwN5vxxY(6_Y}XTHAM7VjZo|PWjaiwg z9V|p{Z3>UG3!syQxLKva?HvW%Vls^^4LSM16YV+F?M<}X+OKyuCfoL512qDXawE$% zEcw1nf*MMsF@Qje{;0<7GNieo21MWYF)J_Hj2hM`sa-})WecXbDR>4i8T-8jf^Co%Tgze2MHs(dtd%s!P zscl%M^yHT_h1A~s!X6`M8XbF#I!w4Q4ogIEKre~|dfvA7puaJ;AH{UzrKIxtz%nN4 z3>|H{A>3eR`)Lq$(yo|=wV!ZoI3+PXui|`^?wD{V*b@@Hj^SI=CN#wCbQz2lvCafjK`S zqHjjf2i|7*1Nf+k*N+4Jz#OiiDc&d^Z@qTiU~-2RjXF5@QZ*C2iV3G@W!3D%CCU{{ z{@ifJ&*ebR+k??mBz#L5Lt&M~a+%>P0 zgwLbk^+VH*^J`EnJid0h?j+?6f<|YxA6<}-vX!d6Cm8CfbJ>D**7&Pz3bBqx<9pR; z=Sc)Qr1w1??uGsxkeu$@m?htJCU2bF%;1pPG(SI0FarSDt1Sfvi#gncSl%gH+GvnY z7fUDj=y?^5_g(F5sfjCO5`N;z+l5xwi(@!Fjo(LblQ__y&8;%2tE{js_rNxFLOifF zgIU{qWA0|I-t63l)DCv4^9W#9L~>?pu&YzD-I#Y&*p1~1WjH_Fq<4amJL_F(W`RG( zu2%9*tS4>vcXgw!-qp&kI7s>^8x11;G1wuDe+{`@12@cY8Z(cZ$4++HHV5f;4Solw z$AXr1d>SOToTC9_8Q+umKtD`&qpjUCkx!xt-Z?T52qz29m3HMGOZ%BR_lWf-U>Rk? z@;cHv?VG)ICtLCh ztn?~bM67q?{}xiQhIs@p7<#LDyMXJn*nWk(^LP+A5d=;Kfk!_OQ>IYa->x%dwCP7g zzzV2G{yaeY!Aea7%}vO2E>($^qN-ORVNsn1fhPHaNeA)Moih;Fh%+0fcS= zjF>S%coP9}Qv?uqMF4SI1Q7Q{0C8gk5O+oZaccx{z#Ia^odQ7IDgea20zlj>0L0w_ zK-?|>#Qg$5+%N#d9RonzG62Lq13=s~0Ni2j0>p_KK%AKY#HkrToSOmME7Dk7?GyVj zZuZOLXpXBdt+;y5adnZ!W4pRtSdZGJBj--5*OdjloFlUfuD+bdBVBzJ?^V2^3-ufL z=w{i~u}0KaYpz}@-~nDiA(iTp)AOz_fy&x?)VY0RVb;~Ft9bBr?WU{W&aX$;SC7nO z)NAqD2bPy`7=5S)(V+J`GYwJM->w;I6pPygcL-i1SOdT&T**3jTD`6;;N@7e3v!*w z-$$@PaF^gu5WG(C2Ej)OzMtS8!J7ns62Ju~tkd)I2N>}&72({r7G~wg8S#SzKSc1u zDrtSyn#s6ei?w*Ix74!heic&dY#_iH9QV5aKRj6ADj^CjdUp)NxGmcG>n0J<$Y%zR z!?{^)2g8?#>!;f1^t)mH0suB+^-u7ZD#97l@SWS1TtaT#bK{VNQBlN8ev-VZF!U%v zL$@n`-k7(+k8KX+9`~-AB_S4047p>WB<|M9pFj~E*BO&YR}@kQbi4Uh4KIh+u(b-EtBj;~UtSUq_eR(EZz|;Wg~i^52FQbdh&SG15fVV<^Z?%)Z7w3Ai&L zXG*r(XdDW-gew)K^8o4OsxPUAoB@I2=?(c=&^Iy7TLJiyMO^g!s488F1Wb2FVzhF@ zeN8zs$w=>#DXa+p&S{(>HqhJYWq-&%02ayPr7*Q7Ac~`1S15a1nfrdWGVNHz5P?}`FMLe-0YBQGh-J+y9tzUT{)ZS9re7L zX@>R@>?e4DKrL?%GsIIls&}}rxc0&aWGNIttT^-0maxR!BO3# z#=3C|Zb|%B)N{zCIT9eE8Qc3qllYB`)M0&aBxD#yG!=uMyeyNOf}OQt&X;`)vT(RNqH0XlFhN!cy+vWpn5=6x(88` zY94GIsvbg(tT}ETYG@~wYVN*bk0llJjg3!Lh5ni2)!YNcR@W6HZHzPzw~kbgw2oGf zqVG)g2e%Ys)X09J7+Le!i$wJ}=rLm)^tgE(^a;=hjDw&LGJO*CAtMJm$Ml=VkB#fb z3FG7!sp?yJ_ond{-o3@|PJupUoCbZ`JcYJSgMQmM1NscpZ-W-bJD}fT`V8m^<6Y42 znkP_SfIe%S1AUI^cR;^qoCkfL=?Tymj7iXwOuq~Ied7brA259u^ptTC^hKu6fzBJ3 zKwmP?q5bzjUpB6QzQXi*&{vHQL4U~f1<)TE*FaxmdJ^;xjgLWp%=G)9e`I_D`V*e- z2gdZ0GWn_ANGeLUvSy0A#fq4>>Za|Q;sS`tY-E7vYwy?phG zDC_OE*WLE|>XnOaX}YHEi8;%)^(Us7GoP7Fr`Yg&xK6`c*QJTd zhR|KtsarbQ6NXdoP`A2A{WYwn>52;;<~gwxelamQl|?6psW*jXqcu}Ruf)3LtvMY} zU^eR**D%G1EgT@fOZdxrX=pjp=Gp}44dB?>JXq;1`oZDMK9nD`VU#e{jRS$Et*L-o(Wjg z=tvt~f+;jz2Q1?rADeZLN@(N_r`dGYX=-)HHY}R2JDp{@&{v#iCeI}h1>5m3)L;m- z06d6bRl`^AnvSurm?6W^uVrVcD4Gst*I98rEW8EYw;jp-ZJlNw{ogK#rG=Z7`!nT& zC@zV`^1|oExx$>7m{|fnF(vL7E4LT!RRn63XG)a^V&SHkDLoK(ilw3<$TPZG-Xd1H%rAis(6lPhj#Gl?TE)}N4 zOu4v(p=NKE7tlPh6JHR|O7vZ+5VS(9W(LJ8f-1zYdzf@Qmbt>rJlewYl!hwjvtN;! znNSb{(;Ja#X@cNc3~E4cFRx9*c*Ow4m#&2=b<8gW}!{up*Q_hrPFSj ze(IhLdQ$Tb&NeM*c-eH@5LeSb9??Y`OlSTY#N)eWT=fH=T}c_y=xR zDvSNfqcQ$90gK}tu`$e!s<%b3$W-9Ho(Gjf&D%pae3RxSIc zZZ$j7^mDV0Z9|R0kJ+Z=z&QgA93QBPDfC|)WB$#q0ijX8)M=AS3azlr`GNVNj^(Jfp;7k&}k_iHe z2>gl!^UV$6woUyBa1Qo`z^m?bng&5tUGI>c101dafSZJG8~tWoA$1Gvg^^->#g|QM zMe1@R&#jkUC;d#VX6r4pR`av98bH6(r04Nk?P*7EhHpk{HQ1$E?X@D`$LRU?&Ar*_ zhxc5Vxra+I2+tqFWNXuW#T__b*}z0i$&9e9VFMHPZ%jgah0U zY-?ycr#;eIMm84Ql zK@Udc5mfBnnX&u)4A{A4E@b9c1B_zshtLzMfbDps1`UR;v@|{V41TiY09{BAqo0O{ zL~yC@Q9Kyxrs^p#l$UBxeWk)nS1=~6)V+))kGq3b!L1;mqGgRbUT6M!L7#bGa?0&M zs7R6E>3Ovpijr`H8vaPjbX|z~YtYf`L530NXfv}%C+_0!GR@slJ3dAnL?(qvxHOwnc=(mlQyz_OLSSA(TnzP<_BjH-r&AEJu<5pE^e z?Zm3-K@7C~WnXkfs##4_$MNrks(mXGIW40} zsl zZ3I9qviPnUjGek4@CG0y4q>4lw-s{2%?B=zYc7X&&4Y0CrwBzJo)5i_=EBO67qgMW z0TXJr+8#U-@X=lkEF5Ie>$v?EE!!JzF{l7EH8@r#OdsM7vxMI6(ME*7aE0nt!>S7& zTF@q$Wonc-4+k?Cm7j?g2Cx{hpt1q1CSCpJY~-N-j2-g;^M=vy(W5$9jp#=JM;FRe z_aE`lQ+rAc_s8@XmkNkb6#^J90XX}NKnocp?G<3KmSQSlBwqmt`8oAU1t2Enbq}!j z0?$SoAU0xTzEFC}ml=Xh0OJZPXs`CHQZqr?qE|Bt0A4gE6|9_OdPWt9iVJ-anHImevN_pJ;qTSW$%Ar%Mv)G_ zkvBoeTXdVDTbXWzU2>jojEPB73O~^_ZF!jr+1jQdcP-rmf?lOEYLnULCs&}QatU;G zWX){08=a<~XtX@ZW|*;*Z85d-r?^})=xH^h!rfJ~>OsJ07Ec*~X->^(SuL$5wJd0% zb&u`LmdRw${~}rn*6^qF^h3IFhkWb10R*ZZuD%=a1_Ny!WkbIxo{?u!3_tq^_|xsj zm+Z9lp_nw0eb7Ob|LF3E!l~Cg@bH7MW~s9hL_CCi@TaGjhb9G_B5>QoFQq}e#1%Ns zMD087W2p3<$Nkaoc-%CI*YUWC+IQT?Y207#X8K}&>*Ctw%ZLK(RTJ1ucpSp*cjG%V zKA#te>nY=@Bl0(R;pHnjhLiFWjyfe7(EOOmg%iU!F?X=uxy0* zgWPB5kX8jR#fHKs}JHA;)76+@fLs z3$6gSh}t&O6bkWET?*}nB5BP?{FQ2qv6oEyNe2hw>2diMs_W186Gak?D4Y(1Tc|l4 zQx=ChXX7}|4s2+c;s``647P(z6J^Jtgpjc&vPt~)-oEud?j3hMOjol!w;DTwcmcAT?jT|m;Br3ZUsBzGIc(}n_K>EfFe?v-?@tR1uND(k_TuUYaeUg+aQ9l4k<#- zQ=w<1bBJqV-O@_>Pa!n1Qk~&>!)5lC2iR-{< z#KS3h8Wp<#yr++~nJu#tIZ@yMul;fBCo3t$~*NmXuUI>~1)1Gf+E_V9I?5 zNtHkbL(6;+v+~CVYL_ro3Te0GsQp8=+Q2UAP=dN26cdkda3)}T7KlEcWxj1=`&K+B z-R=I*cVVuFoi;bv3ISl+;zOKYfZ!SdkVD79$qK^sP|gjrfwTeu_5bBktPs~}J+?s{ z2`R2XNVh}WAiQmW`vXD&uyLO3#3e!@WE_ViLM%4nHkde{0ybfT30r5R`x67wf&5Ic z^_}NR69Nt>VFSWe$%#jX9Kt#nxV)Ih?vG^GyoJaJ=X7vjChQaa;4F?wCqF`biB<>a zR(S7ar|zkK&A~3E1@E;MR-DL|91r$^i1DL(*%3GLh5X!q2>3PwBRF#x{Sf=)&a!yzP?8btfO}MVc24oY4 z$e_{{6VX7lsXjA|uyrWDW5Wz@5oHwCqfdTMfD2nYG?yVwW2W?%aY*4cEI=Z-)UPSc z6exV)&tUIL?QeNr3w9>@Hefpo2fGbfDGf9VDe6n+4nlc{WQSxUO`Dsiw=EouNGy@k zM7`Zbkt7OdEeAyLfTXg0MNy!VPG9aRiV=itF}}gXp{U`>Ic9k*wtXRuz@}kIH}dDV zNLj0cJ*lk{WLYms#__g8&IMvPi8xrml$ES9IP%rS8A(DK{af*!oan z4+m&)G>}8;2-Ub~4`<<{@9nqU-E#cv`#EpCvWJKtw3^Xx$CbVE0QoV%<&Z(!bJ}~a zt{t!L8J^3wqgXLIVBaVn=k6du3r1U2eS4LaTo%nL`n%O$P2h$83BKHOu|2sFE;RfB zF->X2AWjaQ=RhW1GtUl2hzY@>z{A-BEg_;%@xbxl2uLohuUYjqayco*3J=1*NR3jc zALV{`GD+9Iw=4~4*Z)C`wmF_Vi_tcKFdVqyBvl+DLybb`4gMufJHNLW{V^6U0EsgL z(*Q^mLYBp1w2zS?F>tA|1|B3)`(nhqsMP(ZJ;g>xYPo-IP~b=f3Y;gM_Rv|g@4cL8 zuOG^7ONwsmniE5u&kZ0sJjWC`6MP2bI?bCFF8a|kWu+4oJ@gYKku%Xl>e0}C)89`{ zl)958N~rf|?TU5mO9XwziCN;r`L1@JB7g3=@A8I@1()vNSo|3li8qSV*dgtno*(Gx zPIxXeUUNW4JgwcKgVym2TKXq=kVN4e52sI&n&k5_)AXX>Ql7|9ahsgt^H+3yveCi$ zGaR3k#4$gOof_bU1ltrzh$D%Kl6+}N#|R|lMkSq?s*Z%mOk|ddg3NJrdP9y=8ExzO zM}U$zp9#t4v%0)(QysVZhSBBFPZFBrU{ejbd7R}Ojir+hQu3igKE%hzzJiVJqtpj& zqe^lXdEbsVz<4u8Qd)yks+|7dV4ULs_Q2SdGR(5ZFz*I-oa4CO&s>Ko#PELtHY@HN zZb@bQBI6Ra~pyWhu6#vrWncU&r6hDvUGP!X)y`4LiJD7VbcLe`( HN8k8g;0^Ht literal 0 HcmV?d00001 diff --git a/sbsheriff/Lib/site-packages/disnake/__pycache__/file.cpython-310.pyc b/sbsheriff/Lib/site-packages/disnake/__pycache__/file.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..f750e4eb2196360879c881bdc200518c09208053 GIT binary patch literal 4239 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 VKcQe#WHZ}Xy;TGpM6z`~_h0R1j%@${ literal 0 HcmV?d00001 diff --git a/sbsheriff/Lib/site-packages/disnake/__pycache__/flags.cpython-310.pyc b/sbsheriff/Lib/site-packages/disnake/__pycache__/flags.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..d6d3bf9c89521c426a4d72e74fabf263380a28ee GIT binary patch literal 44156 zcmeHwYjj-Kb>6%H3v6nRPNL0Hs?)Wfl9N+Ae>B5V?*0Z_6aGJ}h`7r>B% z8R*;@Qka0YA}X<+#EBC(wHrq%>14%GnzVV09cb>0jD3vuSByW?*Ua%;u#nGh0wcm(`u$x->X5h_YmG)sOUk0WCep6+v>KHxqzto?Yp-+j8*eR{w;h^GhLr~BNe4_Xi5=|k>Q!-`Ku zh95EK6Ol-2deJt{jZYhAb6LCK*v29J7*3@|i_0r2x3E|;4rPapCypF_`mraDJaN>R zG?$l4m4@Uejy|@mY{xE?j8i$MU|zM2Q}#7GUtC_ovsCJWt(J0*lPeaCoMSB7%AQ*> z7L-{i+16oWUfH%$oHw$IrdqHM8>OOQ7FLX9TRA9DoGY2RLawl2n5itf#hj%@RO1xq zOV>?hBeP|gj#JF$Ow?ys#cY|)nkBY3pUc~hai|114@|iw4h$bop%KeA^G2?K+HAv1 zGOp)Ji^X!u05~O;%d(Ec$dt{OE%w1n&gYhLx`h;r3$7gYyzBr1_Vci@RJ3yQ{A&wX z%jLOz&RINcSUFZbS1uu^!-s zFB+d1pEz~c82i+P$+4-a)cHwc{M?1J<70R>J~4Xs;;He8=ZupmH*p@bejL*sl}?{G z*q~e0_}COHJ2y5tdImL*oE$$pKKA zpBh8+r%>(0_{8Z+v@&*XY+^c%R`JXjdmcZGsWT&I&$6l1$VK#i675VHqvtQYI63~@ znQ7z9`Ln0S@bKgqdNy+M?3iu}K#iUq89#T}I5l!^_k(m0P=CR5C&duP0GW{i*6 z-U$AWPLH3TAQ+?PC#EOy^Dv;Coc4>pFg`VQ*ch1{pF&qtrzg*&dZH60h_eZnn;6rz z5Y>Vpe?*Xl2)hWN{l1(U8##-*Fgz2X%<0q}68Pb0wa+YIqR6^*CWiZ}@sYwxH93k2 zV$S7l#PV3i&zq{6IE9s0O^%mrWtNKgeHKfmnmoVE>0;)qUDM@d6i7_3EZfx{hAfrD zbXEDHY25+qh`brC_Fi;sbvkb@IKw^F!KoFeWG{^_q7!yro>u$M*^Xl_*!tJz3$hsf zLe-ve5U4`Qsct!EFU{F%)XXlrdAE!#FJs{fEN)$)nq#M*ucqeFbmp3wFWUgVYpz%> zSk>6c)79RSrlaf05;MUMXtHL16NuQ6nJ8Fb%(~x-TZz{bGjTg%?E!<@^m+o!qzk_u z03&jLS$nN*jL&pg`@oELBG#?h&rFYXA4tBTcB9g2V!m9+zP;T;`%5oj6fTp-l`dyv zfxa-#?ASp;CW&=hDrfzwI`DS_044X0Ay@lJ%D0wM$|$4 zd3$>F*d^lDxikgx_sS)3h)WJecWDmf#kA}U2$jms&tG!pyx7^?+$AShvL9PEvsW=r z&Lz-JvX{r%oReP0^vPtv9ZH$ZGibvh`cl#UXk}Xs_h~POI)GHQ3qduRE079hF^49K z1-sf+yk4-?+euEPmrkC(T_0^pl*-N3_qaL9Wq zN$NrTBz6{T^mGJ2-XdlbvC3empOUQZXXeCQv6ye!ym}OQYE7%d{7Ed=np2PA=NKQQ z5xm{+EgpiW2uefcd`Q?FqKJcCj;QWcz_=Q{6GmEB^VegfJ>@9mR zjzp&$K{A@az^FZlR=Z?TG<1MCl@1Id;x)P&yG_Z@L$x&R0F8dr!$G`1fs%EIAl_LZ z!zJYq?}O1gyi0PHW9xkw_wg}+9~LJ3mB?3PR_qOmPw|P$*5kFYGZ=m5?dY?^Q9;L> zQ9Tz9qGWAII9ZjwtTLHT;<-$Lf%>Vc)3Kyv?Wn!TIGog#aafehu16S?DK^a5hZrz* zxLc=l2GyrO9!NjZB%RQDt#Bx7L|jBI1!Gc1g~ z&g)!ikz3K*kyD!5#y*FYUW(&s>{jA7p55xY9l0S*tVXv*b|Qa9mZ{a{#n5D^AvVH| z)f5{#fJhF7E^oRNyAiz+D@9ggrRdF=imgUhV^?BdioG1eIzNbP!|`e==XkVIhDxS4 zp2yNhstJy_o+r#5nCPkF7C3mexU~H2C8Wq$bw|2m$!P35-O=v9sC*c5c|JpFS{AaC zKAtaT&Ajt$+Oo4n;rg{lwaV`N1wMC(H%07&tz$m2Da^qxFp4Fo+V?!fkW-n{XGfl! zs>YYhSE}7YZJcUq4tyeS7Zys3)lH|yPLEtXJDox9i(^=A-;3(7eKcRmAeW=aO#<-r z`n{S#f($f(i6#F$(K8qwh$a%n}VEJVMu%Mk+B%KQR7B{`~gU&W4Z z!O`oGGr;>0E1cn<0PJs_M1+foA_~|@j7#bA5N3PqMtn7fl=!u%+Eq%d#z4=bZ^Uj! zUyGKoc#syq8IML@PKsa?n|S*^?pGnR8m56sl(U4+8=Us(H@l^edip?Can|#3!gD=e_O^>4Ki}(leQXeVKVx zT++1k(?}Oio{DvYmsfTKx>d^sQ3~5iB@%`(j!;**a{aE7V}baPv4Z>*`$*v+S;nsV z-Hodg$OBm;ljYXH?e&{6jnB(StM71kCS$*x$-Isv;jg=*l`VmON@D9C5%q#Rh&uhg z#1U1qY$?M)P*cMXnk#_+eHKX$VT0ruYL1B^O6>8BQH~WgVL$-E4@g!C2v&=FNIu-8 zNf10{$Yg%lYcvIMCJ3WWuEw##8rtR>k+z9^Ez?|yel=ooRmAW&{zey8Y+~Z==$Zm@40gKbo6z?x-f66E6P+CYlJsz0!is+xK~!x|d`Rr^x_i-OHClosFXc zb~Z~yokHXXh$x`SUCz5)=7j}aN`QH7eYpobGFIwBd>`l3t!^;0p4-v+*z=IuU+$?% zkVy^6X;i9Y;htcO9A9&|ql_5{Jjs&uq}iI4%?I|VnamfF!`Xr$_Ud*l+*mXf8;r(Y zP5i$w4#1(1xf(4tOhHZ_85hc$1avie0$+bAs0(=RP5d0xiw<{9OrNf7eV!AEDkqRcsGO8h*}h7)?gEN4Lj97@&Ah0eu1pBoP+&f%b%e#Q8uZXpxX( zI({Bc!K>xD9f&U=4tg%#VV+t^@Ppb@=_%{e>BRW(<~m8Vx;c{xC`2$XK5VY6yg*r81J)ofaL5_TT#6^l0XLyd|puIvSXB&4U;Nmh=i8m zhysUdVrpNOoBM2IPzD#1`ZvQG+|sb5lL*c2jDV%GhLqiZ=u65qcFy-FDJx zwnM$Ut&SZth%l|S)7>Dlk;Sr|EcDnma=cidMzm_s4bM*9_W3F=KABe-MDDT;Q_K4W56~nw{VtsPL$z(_yTxAYUTTtc8Wn1ah z!g11*)PG^h49Y8a4K*`GT{bIxo#XajFPrKi-^m02b%HLdcIrZ$mF`hX%pnMPd0Gc#-25B z-dKS1<_S|BtmG?yh_91EK>jLxHdbj0wa08j(j3KJehI5qor=Pya>*mqB#X1h481ZP zETU;uwy}0J9jzz*7;>DmVK;`guq3K^<4O@Hd8Bjmu2$YjE6P$DmL{@lb&y3ep(0fj zkZnUEUU{eyap}eqEumBn>Kcw!%y$mqfr(s6fjkt84$1g|dN9Y@g1H0haVb|`%JAe3 z^jgkPoIhomGJ?vXCU7<_(h=03eCMFzcmV1)vR!cgMLWMdU(Oq)93+9zIJs@W+XdY_hzoDp}4BeH-n;@xO*^aon zwJ}_QT0&sJG{{~Bnm}vwHKK_F~NxD4EQY8l07`(#Z`x(^8m&Al#Q@Z?le4YCc zK*bwN97y$~;;|$Z&hEEoASzO57Fj}{IDVZVnSK?KdJ)*}5^XO<*>1#PULs;`58@P! zwHVw*6BCK|;yDFnEe3b_qH-Ued!lkb;-09y32{$U9uQG^NDZPJ=27%YhO3FF?4D~j zk&$6);Z429!I}L){&Q(cK(_s^k^dSO^wIQ_ABcvYSX&bfJ5uK2-o|9UF{5{V>Xc zJ&_59NO{}ca;H^$QDY$IWCC^U^})D51V%VlM@Y`C4-)L=C=puR)M3LuXWQ7umzTLK zfykIv)Ume~3O9RMGrE$4J`8(8Fw|x12*k`9fpCgt1sf}O(g-gXV>chI+^TAzEIV&w zf~8fZEkr}Q%8XlO#w~Wp2kc-NFzG;j?vC(%Wn=Jhdx@PK?BifM==Lxm+>O+yaizgt z0|FxQ!-mjP4Pm!{{V+8(Q|7!~a&#}_d> z0Cu7+V7-2g&-ic+h2ZitbOh@cHVhV2GWI-9yKKvciV6{Bis2}YNS7g!+cGn?>~0zd zu%HW9Wg`b0q>`s|a|Mrv%}hWff3+<}dT9EFYR8C=Rb;Jf58=a2?ud=AZwwprQ0{=; zm5M$lXoQP>8LUp1pk6A{4p&TdE#z9XbKcfn%vZ@i*EI8=@~gi?jY8{{y`HEMq(05yGYnp3@EU{H8SrdgeU8BoGdLIy zWV=EM|Nr9aP{pCV+VEyoLTKB7Ui@89ihJ6-cR?fm&eY+grQT5{AH@~hPUHNY(p$9) zd~$wXE2*1ka@CI_Qw79av~|gNWk=nrNK5(FjPFNK9z7n}aE~vTs)VC5zr#Jt`a$b1 z{}`J54EYbOB`Q1XJM5P4*yZtccliv=lcsP2XBlJHz!n`>f9`j^cM%yJW@z2{A4i{G z_dCD4zVm(!9lQUrb$9<{dBHeSrikTDj?`RvA+sotTKD*i=<(+BKz;&%{Fo2O{(3+fYU&8jT6fpAWg3JBMw~gC(bt2t zJ=hU1Q){Sx5>S1~hw8z0P6$vivu=7? zFvd)UW7jDtKXB11K%O?+Ou&JVo6s7HzXB-U@S)gOKQMLmbcA93>wVfbmkf$%H3C(_ zqYS5G>u&!Py8Si3+YJQDuc2dy=hnU29c`o{%jHlmZKrukqff*gU*;^%P;DHjMS5NM`?~G)AC#qr_j9dxMnSxw-oQUw2@pU>s7|fIl8jeYw``? z@LL@IpFyPZXgxmK)Y%aopI$dQu=?~qtylop0-7A-%=GjHu`qHKYEB2d)O2MYUUn>& zO3P6B_&PbK{VM-iAmaCYj6772k*2kE#Kl_Grry+8GSyWODKYtSmdzz7PS*{1k6WW4SQm*ozwYXL?*jUWX&>U0RrF|^r*FBCjchvuydu$sP{x)J?c z!F!F8tN{$=T;{GtyJUY+i>Q}o~=TEjlX2d!-q??;>-J*a)$ggCEJGd=*%AmYgb z@hx~R{yPxginw^~KztB!@zsI&HpIn42jbfi7rz{c??64`jRWx^Jb&1FMC#v(_#tap z;=2(4koBmoJMnhv#YQaf#oL_z~-<#P=Z26V{Uwe*n*)vYwXsUc^6aeUHTV zA^s8TqY^i)V_1;SDBct@zaN+l>qcw#)(beCfJL+rU>vv6DAOfF-$j&>~*|41?yMtI*Nd%UlsS9TU>`6V7X_$$tBdR9CM8Q7tz z6`lt#xOXwEG;aI9gm$aFbkkAdZ4o-7u*z9DNYNKDaJ4jER2jK%sy>dqBIDt1)Aurd zfI%H<$i@eO8hw2;KE&&reI9}!jx?Ykjsir%TSJJ{P#}Ikq8R`#D*lhZW1wC7XmJNi zr~_AOe~~}KaNxo@j6Ze*khi*#nu^n>M5W&YgozE1AhWix--`$#k-PJ_77Xtt3~|#9 zVO$`JRc^myi1d}3nmK^|O4eR38SbuEYl1-MXAgUiwEa3C@NnGCx1&mHSNbG^hf?3X&3{Hp?s!Dd@N zQ(m?Jf4d63oSIgwC8svwT1(Dl_-^pK;Nwov4QC6yP1XkIRMhDEL^3tyN*!n!J*L6^ zm^dfP(j!uMRJ3|W3l?b^87I_J_h#O6w7j3y1|it?@h)Ahz1meQ3?uJ99-H+l#8plg zVWC;E#U>zkdcUKGWlgi zrL#B+z1lJrwvpLI*hA5qS+iDj9dtvb^MoqWD_du2R)tPKCzYqg)~ZQyH@SctEUi<) z+VqtrI9?2oqi*9OFp%ag%O+Jw8c1}>3?nH}l6p;r%fbb!S_9*Kn%BvS*o@^0xLLNO z9Y`*K6=`mCOxg3tW;Ns z@`^GDkb+fEj@!c`Zfij{1j)5up})Bt?@@YEx3Aw9M~W~zhr;kWoJZE^66?lMhtO;~ z$1{!|IimS8a^fV_V1Ef7+tGBEtWuB2CADjIYY<@@btkma4$q3(WZ0O5>*Bs0(-d*S9~qy0hWl~1L_b%w8{-rS zt(lEExhSD2YoIu(>i#s~4GihwKPWPv;j~ob_dX{S**QA1Aa%1@pH!-&93PWq> zRi9K2Rqpp>!Y27T&g(C9BAXOy;c{6lvhM}?)H5;AYHcGzBEU~@j~2*?J4Do)ghtM% zy1{(y76M!X2m^LOcCWnzn7s&hcau*4063vmVAM{QM4v&mQnfz-i1QVH7Hq0)A9od3 z!3-UTKi+BhuiJBr#p2a_!a3cxY6I@Cu)B`*n{APv^m_JnAK|H*rqE05i0p%%kPWAi zxHWoDaIKr_uw>Yq_h1G5VB5jy(Oq|b17o3n16gabqMOojAimXUAg&eZv0Sd%+>_Ce z_P~BYzV0#a)tu>h!aJ%RB&A)6J48pDWDE2;yd~6m&*}Y~u8Zn$7}VSm2TH(A6P-@UETto(?i*WoVa>?IXIxI%pLODPPukp%hE0*d7BJ3 zf~fq`QxeJrXEC>|Rb`z4X?t{porYZ1&A@xmdPdtX=PJ3^Gu&R2SsXd2R*m|@)q>Hw z%O>rS0&fC&Cx-Rh7c1M&$pHsn>7p4l3_-jBs4?SQWU$@7CFzy;pFTl)pe90li5;2n z=R2Jnx;3qh2u;DOjZB0l#6*s7u-ZwF++?qpvyw*25HPQN*C>vdu~Lt!sm_|H&AQ6? zv|>%Ano^l{mvkviLpguCzAveZaj12N-&1mLUg94A)n}06rpe6G_?24+kMX-gN)Mrn7qSP9)YG+YR#NCEU(H3lG=#iw^X1XCe z?;pUdO>+DFm=2jnWyPt19Os&O*lW9vuZSH}-r%P(69W01D|ZVHApp^#lBL}SYsGv+ z23LN>=81c~Fp>5<_L$+9!wKf~#awpLZvlHm*AGj;Sx%sU+W?%pYR_Y$4)7f5ESoEI zUn3s8VgD?^mR6SG>J@h=#fg02RJHXC;5>G#3`~aFTv(I7qHcn=Q(L%MJu|+)q}q!+ zkyqQ$6!o`2LQeR!WT!_<>TuJMp8TIqYP+Ty4Brvc8jf&9bX}h+!=t(lx{O*vJptRe zGQ+F$eYaN)kW&AgjuOX)I~*+Q^T0K0a6(Oc?67HRpK#sPU5lqj7ga~vLkgx$Kq=+w zq&)5y&`sqcI4^9?v3vdcUcwsFa{0EJhR{##xW2yGX?=Ng&#Q97TXU}hV1V0W$R`1* zye{$G-JE-syDP|-s`TEV`3~JL<4?r(74s(G+DZjyzE(-CzuY=I8f>yt(W8ZwbA@be74G{xOAHpCQ%d=(u2hrS*adi$_=}>tRF9H?v+H?xJbf&DN#g zn{^Y~S_GBoUT^4HoksTo1x)8M4U@2Sk>K2|TP|xWw4VM28*ARj_suFfb*{-0xf3zk zEs=ig?!0kxe$ZbZzCB7Xx#Qxv(dlHqiL^$69>%U~H%?lgtfs54KXh`RzI#%d*Gz!9 z2Tq*AGvqFsALSxv+6{KM?&eSXGDCmuN`g-6IK=aJd5G)jAm*Qk+eWb=nDXw@KCk9B zDrAu!@9J14+l^(v=3Kg?zsQCAPs!N)g&R!nII6jOJgULYwNTW0BfwF=+hZ$Sf06e`zhK2=)#CHVp5h!f7w$*K3D0HQ$Sut)?n-}fSUh9IPHhq-bgU#)8yv>)c z8_lqSQ`>m!jJ#k}m$`}VbgE=7*yFCsR$nD-UFr_+rnZ*Yy5PfG6zr>TvBYZC;-of7OepB!-y&K;L@$JW#uguwr?*P7i`108{e24Je zi|>7b?{>t!?uXdm#X1WVk$YC;p zD{VM;sNK@RnvUJ_mX<5i+FV8(Y19s{*cUKF^aGBJ-TdN8S04koh4i~7>?U9^&KzFb_9m{Zk<)9m6K0 zv{=Rq=k&WW(FM2LhB+_DDLHn2-W%h4^n%W5jJ$V^zxJX=TG|hy6@rmgua{QU%j8VeQfN$#Em-*N^J8H^4@x8U{P1NfKtPG$EwF`XZ!j|6d>SLcgn zXd14zU#id4#3>E=VjSO5qKv(0K$-Y5(I~rtSGnJUlbYMn8+af3YCO}minp2KO_Y;s z^=(q$qt?D^1iQoCO%W^ZT-aGpWcpW#Ya9x8>k#=hq;4T1>5*hG-VZd2M-sflgqPI= zNNne?M!m@fqm`+54_4nrjrt`5(8QyP$aK5WclFE2QQ6VZ;|9kx5VvS@r3bVh5qaY~ zX0`vmcliI4=|=Z@0WX4rvTF#LWL*7iQ=YgHj4GCNhNIUr2j&d?UUY zkO3wXbnvg;xY64H?q1;fe!eI-{pTSe)~h31;dM#C3R%oIL8;%NPG}wDY?C?G?8;)d zhA-{owYSNX(|M}6+$BEfw4l!k>V4vf_;a6A*>%bUr&3p>36lCW;?Edi}O)V5z@8fX6;%Eq&!x6 zpuVH&V42qM=01XoNFY^;Q^ZM?ARv(8<5^s7$Fqbpgl8fIknOvyzw%T=dz!ZRi^(0D zv^>_g_MFO*hEndbZYZX4=>TiQkl?DClJ{?qDFw$$fw ztWy*!G8BUOKjgDNV({-7)bK7bQXc8xx8p$g!}uk-k74LOlF)nb+YNn19N%7iQxHgo zVthd`fy&|=`k;=;2})kMYuf&sxr>s7S z_afeJZIXBjaZj(&hq&jvw%-~Aaonbc(5(3<7Yz%th}KT}pEowt#`A zMD7)~^A2Bh)wE9Tm%h@TRNA7pBX+dEf6V8|WMb=~1jZ*BxQy ziylwx@Zw&vB6b%86g=9~5hXL+4CJXYeX``rcR`{<0t- z`ND_S;kDx7TW#^Ms~)n9+um!yhx(5wTN&<%4X;c`to+o*u(FO>qE(2lfUs5+{qwdc z+To!{A5XY-f8NK>!!7X>D$o%*U)UIO)-Yu@gp}WEido#XDYH9<{!Rs1Z$E0b{SZUE2A z(-Djx*%%n>AQYZat$Wu*AOAGvBmg|o2JoHUN~p7||2cn{4>jPSMUjqZ`O;lSi%b2n zT@|D0+KpwPRxgQqMho;L+n{G(3s}7s|4Tlaj;s|;UeSr+O-;8gvK{#kT%`YrL6yO` z8T@Akf6U-d82l-NgW=#o{-jWU3H=g37k7yOR1Z->%V(y$MTX@eO_A_;rGN z6TT*;)!xKPU?0(?b|Q=UTaZ7RZXsO9GIx9XpwF=02QLQrV53mKQE-n9zxy`|A6X*_ z)9)mgbMqYB7g_1{?oX@TFkwZuKOi{~?z7EZH2MHYr%pgA@=>fbb&SEs80=>t6ywhr zYeo*ZHh-Pu0LFl#tcdNwlIK(Cm!4&*#~I%*byZWD%zT;e7|CQ5_Y>;p8Tp^sI3eJ8Ste+q7W7(icl-*e=~5a$>Vr|8T>jw%RQcR0zo3uzdH$y*i+H|fds5h p`lAE!ExWfQ28NPP4@MK8#Mc~*Mn02BGUUI+4f!2K%Eh7R{|5*hU~2#X literal 0 HcmV?d00001 diff --git a/sbsheriff/Lib/site-packages/disnake/__pycache__/gateway.cpython-310.pyc b/sbsheriff/Lib/site-packages/disnake/__pycache__/gateway.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..5395cec38c45a89cf76aae6f61ba7a189e84d5c7 GIT binary patch literal 32857 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 AZU6uP literal 0 HcmV?d00001 diff --git a/sbsheriff/Lib/site-packages/disnake/__pycache__/guild_preview.cpython-310.pyc b/sbsheriff/Lib/site-packages/disnake/__pycache__/guild_preview.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..88ad730878b4f49428ea17667bc27aba9c1f6120 GIT binary patch literal 5023 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 literal 0 HcmV?d00001 diff --git a/sbsheriff/Lib/site-packages/disnake/__pycache__/guild_scheduled_event.cpython-310.pyc b/sbsheriff/Lib/site-packages/disnake/__pycache__/guild_scheduled_event.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..6c4f428acd100c85e20656cafa5b25e7fda2dfaf GIT binary patch literal 15514 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 tWGk^j}{qB5?o! literal 0 HcmV?d00001 diff --git a/sbsheriff/Lib/site-packages/disnake/__pycache__/integrations.cpython-310.pyc b/sbsheriff/Lib/site-packages/disnake/__pycache__/integrations.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..fa3551ceda68547c1481b3f2608e790f0301d0ef GIT binary patch literal 12987 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 literal 0 HcmV?d00001 diff --git a/sbsheriff/Lib/site-packages/disnake/__pycache__/invite.cpython-310.pyc b/sbsheriff/Lib/site-packages/disnake/__pycache__/invite.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..2910eb50a2194cd5bacebdc73ae5bfcd697417f2 GIT binary patch literal 18671 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 Y4yf&a$V&`EkWA~t@!<=ZyW{cy1|0ZkcK`qY literal 0 HcmV?d00001 diff --git a/sbsheriff/Lib/site-packages/disnake/__pycache__/iterators.cpython-310.pyc b/sbsheriff/Lib/site-packages/disnake/__pycache__/iterators.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..85847cacd05da736e11357df9c07f67c27d24d89 GIT binary patch literal 29885 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 T9~{~}G(VIbdTHq4EzkXb=3_7B literal 0 HcmV?d00001 diff --git a/sbsheriff/Lib/site-packages/disnake/__pycache__/member.cpython-310.pyc b/sbsheriff/Lib/site-packages/disnake/__pycache__/member.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..4b7c6a02bc8656711591151041efab0ef5784d1b GIT binary patch literal 36516 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 LF+ZC%mJ`T)u&7^G>=TGA7sj||s)$coZdGE~( zAWE^5{Qn=2c)0JryWexqIrp4%&#m_Lr9$}m&fB)me0VGz`V3$EKYe(4C=?3UwnRfA zCzK62VJA`wmm}FonBizCnvKfeST-hq8_Gl3q4LJ;#`17>xV$O5sk}M68F>>OShNbmVKLq2TG&mec62y9xP?bcVzF7@P^Wz<^9?H z5*{iYDBqR6OTrsVcbD(U-Xr1R(!J&TviC`NQ|bQlmu0_9!kbG6%Wu!VUBWk%4wWCs zJ|N*Or7h*d*~8@rvk!(th15sF?qT$LYw4l#Saz)ZaQ5Nycy?S;ZYv!rAI%;uAIlyq zKazb!;o~+$I2(NCnUV9bh12=osjU2Xwj+cDG6^cokrew zO1Qf;iP1bG;dE)L{CM^W3GXgFiQd1f{8Tn8?|Vv5m!HX=Ex$XPD^F+h<#XAYvXd>K z_p|c-rqWz_K07brn@h#=LUuvIHUS$6UCWArB+Dq#mh)4 zHC|m@af@^F_4MAEk@SH(_usScz?}#7rzi7^i}gm^=L7rqExLtTp;AvDDb_0a^M&-0 z!i7Sqx>!bBDs{TxmW#Dov06zNYw7udTR69po^$h+dche@&$@*|x;mSlna{g(h0%1q zn$A~N(u)PRh78qn^?b2XtjwkJsTnkjDeLnnrdFM;FX!C?5TYp{WsD-x zOliqs8_Z`wNKw_0Vs;s;8e6_pLl4-_(R8`$6leLjAl+JAI#(*z=10>`kwu?dsv~8M zkuvn7DfHuxs++DAN+p(1M7yQ0Uh77suc!rMgZlLlNxjSS)iQgMvOU2N%`UkWREa@h zcdHmOsd1q&Q)diYK3gr7s>|%!Ots<^+27j1l)y#)T=hah`l3LgQmvz@stKF`X@r_p z{i!yeN88U8^njt>VkN~W(;f6~>0GUji7#U87ptz+*V@et>VNcT`pl_gQ%{af9!(!V zlRiCp>WSk=jvh(x89RgbJ)`L-k54^%>hY;GQcR9bOg)u8bu2wL@l^V;;}b_l(?{QR zdh+O*GpSRP>EkC)pE!OLamOddPdt9)_{1aWhmmjM6rlb%z#WB7ol3JpUDWZTXIR+D zqm$#0qU5oMkDoX`_0(wU*zu_el$kz;LdVjl$0nzak3W85Y%+cN@yXMt&KyPcM^Nm< z@rh%TsO9L%qZ3mZ)QY(D(I@bdKJ)0S}kDfYl zpqVlvgb^plSsWfbch!~gNA z>Z$Ih@GBF`Hn%iKD6%4z&!B zoe?DAfIW^*+qN7zI(7nOVR|M4i8HCsl01)un?3mo07ceiZ36Gf)A{=RiQ@UfNMEyW z>Z#L5bK{R59mfPd(u|H(R+`Ciz)t>Lsen)kEBuMP+l(E-qHM-aU=1~srxpo6`BF1J zwX}$2v8k2CLbHocrj0*d!RKadCeOqGX17$$JD&}!*2I_U#Zv8+aC0a(Q!Ou6E5I4K z+5Aks>aL)1@uTH)1xE#{3&oLmvuAuB9VnEfl7ZtuUM^Cj28rl7S*X?Wa|L-x*4>p{ zp|VtN4wz7`Ud7P6r}Y{lyo6qDmr8CoZu}~89N57g}=SJ%wwhe zT#Ze6WT{wUn-V7rXq}5t^3gn29ma^sPv^0q@};9?H24*Kn=GgXBHVKZi}!rNJzg)A zku)(i?-uebYRGoJ#wI!#Uc|;8uc7!zv+LyXGlY=lK%q91Uo7N^S&1V?qRn1ujUJTd zkZvp6V&b~bRI1CfCC~#T?>=(U#P>`UF4oOU?-Ny^75#>)yT{FJ;ALQp=&9hGG}WSM zlU3>Mz<3q2Aro*0K*a&r0;o|P8*^voix&zQcoSNw^2`?!H}m zqrpKpL{c_~eZye;-`sMfP%40U+87MDK=TY2i}_&~Ohag#-1RI1_0Vdl9)2$3CRalX zkxS}5iucWUk9{26HvYyx9(oxZhonv5+l{NCD_vJZIwpyj5yW&mk*i_ErJN}8^epru zckE^GFYgbJ#3!zW4>lr)4ma*95VX_a6J)8R%S*L7=?w@fa6Z3{ra?l@2&aK=(#>!N z_$5`W6)U7XGXW;FSip=6lb2ErE&{#bujkj$q zqs|(8k_sonsmM?`6;9$e6^%st!?D-h$MI>Tx7mfMkc8l7gh;K z+CqG-nXD}>lC!Hd2TTZ6BX6zQ>j=o?^0R=@<{&UN*Qv!1&DaG(C|EWFwasX`Hg|28 z;N+(@c#WomFnYGx=M-l1OC?}p;=E=QD6_d0O}J33F4c0awOre3NWjxAh~ljK1Sg`; ze#Zo!b)RJ1fQ>uKuAFt>#n>K_l&5vfQ;2bQ@sZ`XlzbynKI=Zsh;6nA`QjmovuE9B zkf0emSFM)Zvn=7=%;42I3mQ~E>*n}rnxFb@SzOa+-8>_QZKSvC&o&cop$?W#mbYD* z{YbwFzuowKl`Hd`BB9Xx!mF`*XesRWt;W^gde{kbHLWJ(ed}tM`iuC8#P`YjEvx#RSaDkT#ZV~GpkXD ztvFSWt)jHmK__`AREaqu71C|Vt|sQfm%4O|3#&1AW;He!u7u}8m*Tqp&pF*r>iN)W z{0M4A?w&&uKHGmOwi;WAyYFA^T3ki?u2qz?5Wf$hXY0DXUsF$9=~@k64PV-@np)kE zORjEM=tdd6D5Dqc47pcVBkq;e$d%MpwyY0r+_u{5eoA2?>A`oY@Rh#R-m76>y2NU) z_qLjpUjN)`5_v-IkIjWD38!D$oz(3fK%Hu&f0rd*>Bn>6Y8WHe=l=F;-<3gW!5~Lz zj%`6m&&Xe`_DiXMhEk*T4Xgb!4*1@pcnM?;r}o(!#aVXwY@wd+XeY}ciYs~fLux*7_HJ`#R*V`V_TjmWoT;M?xy&~m6w zyxzlFR)?IS7o(SkSNl-b5w!b;t0HS|@HXCr464SFTq z>@xgZq#4QF*$fwiIH|`J@-|b4N}W>B-Hy z)p8EZ_fkPnbu+HQ7gSQIQF_;m%N{bfUcXCKDfgDiK1 z#l+_8^~G$j45%jL?!VxN_)Mt^4uPCnwx@_vAmrdyJ&XCTx&^7CnNUP_WRrUi>0E~o zGF}20Ld|3*T%lJaRchc!f;{5m(Ha@i>i-ltm#`lMlkz^!+Cqm&N z{2~mdC2~0#5jF;2V&PuA$0EJ>f-+u5&M)-Fl964KE2hiX5{^VN;RH%$>cki1?-wHB zp~zrlP}reZ#QjP%Z3e%AA2PEKkz}qSPzYti5Enx}4=JYtd z2qm0Rpz{HQx)2(4HXxLAhMbMg@JkVApR>)`4l!Og-gmqdb~4T`=SIAz@V>FoFcpv@K^*k>qB1p`?a2DRrOyk=LSgFl`C}&pd5wo(jyuZMF3ABN_Qv zD>e$(n}=yBDm}LXgr~C47bqV-n6`|nzxK0hSFiF>rkY+XUM!Sqne?ejX(bKGGWX8t zF9D=j<`zgs;zH3WRCT4xMW;Uh=IfMfZ?Q@e4DRu~q2e5^-9M9Fjna}^x~_~|c#svU zMWYce77(Dow}O`Q=C$D125_**qsaap!t?n8CEAEuE<*5n_nmjEhAg_(iz~VHnCXqJ0$`n?`pXHfPuXB925jRSy-XkSfdCjF#pT>&z25ihhf z9TgG*l|}P_^&xUGh^T=m(zAtSTWq;lf%F{WaaVTuDp|gs#`aM4R&R83bw~m`fD31E z9T1%^gIwp+%$z<%`dvGC#~p=AX1RF2xX4eLsylZF-|jfcSE=Ukbk0MB9y-W7jztF2 z{=(vX0o+912N&EcdJu&%65NP~fATRlHfs=B>Zvg`9mwog4N-_%gpAh(gTM{GEbDdV zK;|y#%SewfKFt{MLo=b4b~7%^t(i0{p&12eG`lSXHsd)CYO~irOU-WEyJnBC8Hx?r z;KA8x&7-^*B-_0g56gOzdnFHTMO2sZ0E%TXtKm9a4i z$0Qs_inydmAe4|0wvJAhgp#WfY#c+ml;lWCjvfhPb9yy`FTL{CBVYO)2)RajCuEG= ze~HGpAK~Mx`1n_Rd^I0m!v{Gh_ut@g%>B1`j`X_)#*nR)oXzN5p}uzZ7ntsA`LG44 za-x`A`bw?PQZ@PMA`gE?Ir6yBj4!KgRh*yQW4 zmqNA?ZJnj)MLK&c0wVMbL3{~#SO|YSA_C0_{>Jbg#ozeL-57?%L}TEPS4X<&JkUsq zx{}o9fkr%yRr5fj$6NIeTnir_i7A-yz=uHNeu9tonRUTR=5i0ASF*LcwRINN_qOhE z{-irJwBXz=!cKxSH_^lfRY7g18oP2iVAfo2+*FtfH-@|}0&L{-)G;U)Qnfz#e}iA6zIioHYLM zZx?=(_cVW#!hy?La9Acmyc#9J=KtK_P zK$>_U_FUv&_FYP>CRDm7QH>Lc0nt1c4P%Y(57q8kMtc5x3cn8a;3M(;Zvzpnf?2Pw zdbspV{sQP$D`5x22A)_Ze_sjuFetsLqxAtl#H4@^f%?MO8OYtq6LZ1hTfQDB%+w%^A&RAf87y=j`ytlF9}lk9LJ~}6F%UWh zKx8Y~1A#{|Hqe@PR+ttMH#<)?dC{8zscvaz2E5GdQVBe)10|x@5)Z1cvn9xo){K=U zmeXnM=(ttFSX9hcVYQYya87l(!Yw;mW=DX{VrM+Wn!$`>Y=t8f5xVc2SPxKzg1Lp5 zjnaI@O=2$-D6$Nx1lT_)5NO~~UWDm|*cGrUw=lO<%Dck7EzcKc<~fyf1?);u9mYj* zr^-wsP^hYpMYMB-ne;@pPIv=nCo6_Kry7*DB?#e)vX3;~50q(Y^ZKv0qtz<(MQB>R z2mr+9%0M9PM_^3hRIxI-dxX64e4s#>k<_ZlLxxanGJGZb*63uuSSxtYq1LA@D4_JU zv79U51OirY%A|`0A6#QBj#0%I$T}66<}^15y7&Hesr|jps1b*Kx46Q;ZDhk(I&|1j zG?VR@yGZ z2rVijU5Ye+6SDYF`(?alyL6TAhxxIE$i)b@$53@`7+)iohxU?jiOFv-Btkd8-Wc#v zAf|Tz15!5Q(j80s*m&}dQTz(s*oy$@M%Yb|c2tCxU*a=zCAtb#CB*4r(2?jWjj1B} z-$TY$To1X5TZFt&Nmewot2R(r9Uct9cnJv5%!0IQx}5@a+EQpnpL2D61md4j(m$gl zk6lXM1-Ul6^ae#Xb?$evJZ=-+c|LaGVG$V-SRB6)Br8Nldk`Qp z>SIGt~0f_1Kj-nP7ZNtVX~rM_-HqwZ-x)D6SQ?jVm(*h1tA80yhRm z%EM*Hz&%aF^-Z2?O5c zvDW{L0somPQcY8_n+PW?#9UPHt2}r;@$SAI(HlJ+k4JDHXEwRd= zbS{$~R~Eu8TghN5@ND1*#hzv~Fe0^r7ywUCPhiI~Jb9-6CeX3@Ue&={Ick~g$R(8C}X8>MX1^J zFqJgNPf3=MxQ`gw>`ENi!b;OxfGzqssS=HfpozUJ0nKa#;=jb}0ZEQdYN-xVThYrn z#V+R%LB<)sq$p&ZNp&a!!&#e`Xs`e}NLTs!91;% zoL|7VU*^E25r{!?ZT=;$C6Y>=4a+=Q=aJ0&g<{%9gIvXBk#$gQ+7=>J^*K}kJ> z)PW!F?H(dvP9o5z=^u9DP6E34xU)&j%%JHnbUB-yUZ?N*7>>{+1*^aG*u;`fIkaoto^= z+$-Iuu~Lo_C0KhV)L$`IwsKtzt{@o7cZpzL6VWt~NDgLgXF{)pC*1#xPXJcoy?+>C zA1DbF5e)wl^W*+|1RA@KsNrj~cy3W{aIpo@97+%gv!FRHkQRA=$dmWK+y%&pPc(KO zTB|Zj{jc@%d9#1rZrpZO{C8}8Dn|&4Lk8jXJZRB2Lcmst}{QrR%iGjfzG%;jlenpWZ-ZDbNa(9 z>@XkSkB1=}LV`32`5DId2nlgN#e_e=#}D%HLwpFKxQb9S3Hdif2K5!C?UF&4#(F%9 zM;?fId8kLUmqH%8QxTAcD9pj)_>B#Q1v|G91#E0X50NOWBG5(@qE5_-!>nts)93WV zWGh}sI3qy(TLkTQ;VtHDeJKnxu^rCN=MzFEx?w7Iqmx#Iq0kK@u|3XB^45d!&CV?# zGQBVqyVbdkreB4=Y`>hw%*epy{|;ozZ~o=29-?q>U;SQvG{9_^%`UkUg1twv>)t1V zpD|EU*jMqVpc9H<_zjeB(x>h&%}^tQy#&OEuGw6Tt!s|tE$t4Q9O8|j`GvOx4JPr( zlwyXxMdR($SdL|~NdVhd^jgIkz`d^4wXUqS3Z+&eSDej(#ODeZVJlnn+8WeT8}$>= zZ)rt@|4RSl_1ZE5H5^9;U3RHlutMU1G=bGB zqIj4?;B>X(v2gaejSb`kR%~NMDj@1UX!fYeBm-*5_L|e+oA~i1m&{lR$CsrnjBpuN zreOC7COkxPI<##9Vt>6)M&0pRAq^YP6IW? z(`h(M2dny=*zY$t)Tt05q5wk7nGj@S1+=Lx8q?qEaX2q znqByn5gkQf6;cbxM8XSr)**pkfJq8YUqPWrX*=ZdVMs`#05d8TWBCQNX z=1eQYaOlPb%M<;WmA)3AK!V?S6j42*ZdB%;v$=3 zSZiR^!->C3Ca~gmwst1t&v$Ku-394%?HecJHLf~2BE_w16=s{XLBvze8DmE{ZHrlR zxtvuys~Keit=kPd@>!^|V2Yuwoe8=H*Uw={h75M@#78(zOjM?GtI_=g2eSnk^{Z-3 z!g&r4enZ32#*J+Q5=`4}mB@?<{0i#HAi(ZBVI0NeQSDF#Xy+2dtgB(zDN-nF{zhOH5pg zK2$DT+i9$?vEh+pFEBj1Lv#7HJFbQAz!(ed|1`QNL;H%B07-1i2q)P%+Q64Nw#3fE ziEW(-tVw5C1tb-5h{fi+5TOM>k#<8*Pw>+^afTfd@y?H;5ckLUxPk||(!wWnfD#ez zTtM^PpFoz5ynzzw1e#80FiWB~ffs=W9?VUtP84z27RPqEJj6y?#O)Ct-NZprr7Vt0 zTvXzC;1sYUVtLAh;vI>)``=NM`#pRFCqg8>E1Uxo+|7~5>#3-+HWumlmexVbXc;+# z-Yx8%FnTi8K^_k&h5Y|lRxUiiy$oIE;}`j`EKne&CF35q=u4@k82^L$DdGUANii&N zWMF-L#?9rssQ#IN)5vwZw7K0d<-gH&8_IOMj1HfuSK@vox?YnGOQxp zJdBLJ9ML@phzw-6h{mr)27p*oP~z;QBm~A$$y7AiGlNutA1;Q6$oO%b+C(86>`AyG za}o|R@Qvy$90ecFAfRB_J%-HrI3P`kk6)4j$4{QW6un8Z-4aBaH%mj~h$&humJ9ic z?1$i<1-5lWEP7DH1W|mpz~oICnkX+#lu{$75g;kOr?wJBBa9;_Tb++GDyv(XV|k}I zai(NBzk;(D+|Q?B2?)uz<+F5Kj7X%Nl-siy>q|@4J-p?~Mtno4$Tqii9xrs<8)0q< zJh8wOwrsKk#7?lSj5j#jB-XmzL81(OM2lWaI6`G826(8-4C$O(U0M{&TsV2s-_y$4 zch=;E8Hi;}_8Ogp$d+pGdr_#31Ste|)Ht>1DV)j6z~IQ=3vd2BFY;Sb4y<5@CcNJ7p-^eH`}+t1*-48pBRtZr zx**tB(r#ngEqr*nZs#krg0KlQX!H9pm>@68eLqR$l|mqao!2n-y_>-Y`o?6^;6S_k zRmhjr%nl5~LZ&;N$LK(&NyYrrS;c6ACK7jYEuINcJ0kZ%E$I zs&rIE2cgsbEOG_J`fMA(;GK;B6dympM+Z^9qHurAuO1WN(JfMp53ybS2ngNU2HAaA zBnp{5zXkfwwv$kSz=UgDPj&EM&xOA{^r6r!7+NR#Jega_Dz1j;Z9|+QK#GsJ*etky z9O$4xCk|zA6rMz2c_2PHLb9CY4}&<5v!I1f075gJ0e z2c3ry+KAAY^Dsig$T995L1+`oJL()mXtVP_okyMH2;JcPFXu7m1VUS!-*D)SG?v}! z{HF6xXA+@p&TomQ(O7o7^V{N8G?v}re8zd&c?Ms1I=|!OoN0u1IsXriz0M+ZViJ>Ty$3CZ7<$F>%7NVmA4VR{i1Wpd9S?Pj<-K>E<5j&x3@We=)B)~4y_!O zQlCeuA8s+~r_R^EL8^a;RDb4t!yBafMx^?4=bLP*{lIZQ~&7Xj$s|i|9xmR%C&jYeK|rPo9#LFH1es1{p(*Y% zE~eLYKG9kjxytnmq)&%+y-esW1?)JPR5xt>-9vqCJ>wZ#BF)m1Y>VttP6}cBq|e#G z9pk=wbsr3u3Nxsb+$(=%4@Pxxm6{)jYhkxfkBSAn!6i}w9u{Tqc5rs7GIMacS}|MJ zX{}AOCFQN+(es?!X%C}W-?jHIdVHY!tH8l7wq!Fn7)l`&_Iz4Zs?=~$2E!2v{R>lR z2JIXY%oj?FIH_k_1#bl^JG57T1thYr2lDCK3QiW5J=nwsK_AXjU*PITyy-#t&aqOw zQ|tLlY#}_A=a`k(>(olTM(Z)zc6nW%H7(F0F!);l6x;4VQ+RF?2mj$D|KhReGtWhw&p4B4rl80?xGXg zBNV3flC}c>D1L_wL5(qs^p2-uTh*!<7WYi-kL(!P9iypLDtcw9h5@kRNF4Wq4`wx> zOs`wRajW@HZgQ|&;2uc`N#c#k5k-0$V&1Z>7yyp084DG|OBW2X^F=0EE7C^m(V(=V z%2qzj4#L|uTn!re>QOo&^w~pn*-t?0dk^!Z}7*( z-hs%*7U4D5UvQwoL~zAAWi>Lrc>lE3DXH>7j)ZiNl2k}?C@M?cX+YYf1?do{F(d)E%ZW%#eNd_J;QeLC9 zoKwR%n!ZB#e7>@Q^s?`EHYrFk+py%6f zC$VvgP8yrOG{l8^Y@oGPZ8Kxlf+RbVO@k-RIu4LeF;mv1;T(0VZzVNCZOFp57=2de zLsE&)l*UvRq>&<(v};qT$G}mLfN1j@TXKiBuFvR9KchvIdDqRafHi@`Eg|1>&OVPp z!=wh;65mRpTvX2J7b}o{mi3y)8EeBdw6QI=Nm%=ImxxJd6}C=c>fvqH>1Xcq+f-EpS6$;XWMX(N;5!l0f02FDk@fWQ^tj7Gt`l>&p2J7Bv3ZeA0Gk z3p*fQAX8u0j#EaDT1_zl>e_-6g%q%bm^aU5c^Zd)K{}QT=jN-`^WK3my%dlh|A`Ac zjf5|E5T~`_QcX&9;eW3Vk>c4_vO(J6nQon~0<8o$AS+RG(mu}}7XK3#A->Ws-eIp9 zV9l`a(qDW7?ZJ>QV|osIA+&=gEP=v7#xbaGnq;6a*l8&fJow3D845p&%T=$qlZs8sxqnl z_rYjSG8j=aG3hhhT1osQe3k4wjX~ly0K`Zjeb!n*gAcH&#a)Gq`7&;r7)8=&mvBW) zdI5Hsz?-;N1zT;H#Yh-^BH1X2CmFy5-laC<_EHI9eG_q9NOm5CQ3f5TO>fN6C+~)q zs=n@m-h+8b3xStE`#_z^Moz;{V@xqWH2RgZMre<$Sz$8)2zm^>kx~Y$x;qBSOsP1E zQ(wViWyu_0dFT3v?;dmCjvinAQO}x(RjzO1aMjK{RjXFo3F)V*o~%V@4f}cwsdI=xYn`ib2w5ps41Q;lIxOOs|H@l;ArT{ALRBWeb*v zl~h^3Af{Lgm$Oy;A!yC;=9HYca9qDY*{@=7Bq=8hr;N=&!EX<*A8Ey~zFSFrOW8xQ zIvaQdC<{C!ODbemvp4shwlMdq&z?fR1)YtX`w2Q$?`3P@r+sU;z19PnJ5{YBmFTbl z9^nZuUxi#+N`le0Nj`^Lv?_DNtYUYjp%AM>&GtxIRIxCZrH5(Uzd%EC;M4MAbC`-6 zy$`hPQFBn#H~D2RW`m?7^KT?t%`GNTTlP)nOMvO(6*{og6@i&8Bnr8t@>4DTuKRrp z2p9#nw~EhTcu;e1c8jIFT2r;$Od8J46(!=+jEjpL2`VxnjLp74W0VT|JxteasThNL zbJ^_i?Lu+gg@r0597A8Ti9C{k)Vl-{;DSA4S$&A8l zRi$tiKknz4Yhy4M(&NkD;fwE12!V&QuGHdPEpbxOb}NlI>kdHs+t@0#E6Eu*A){%v z??JICe&5*PlZ;(MU1LFx_pIB8q&_V#r^wClaT$+hzplI0@*s+jz4)bq9pP~8W6-d@ z0EK6cmIttArkw%aV0i#nd2pkBHG;ReeuITL-V&m%g@rh@wb3hGPGT-}H9}1+z9r>b zm-^-;w~8JY@!dF<8;8y|>ZEL3N^-;1CceYA93|mq284T8SxX=4>__^(tx(S5eV{&w zI}@T#KU&D|LkJIS4I#9#K73`9pNe-tsTzx7bCp&0gw;t6Uy3IE}1+&g&j1g+vc{LmhT}rsk7eWhr zYJA=(;Tx~qw3?tM93@AcU0ZQW21@Ql$v3b3kt*5YnB0Q09>RSOw_dpoZR)xjiAn6G zF3EQz@+FZk#e5$LuOy7?!^*9wKgk~9#)qN$-c{(tR=aW|xJ{#L;db;Taz27DJ60o? zx+`7i!`oKjL=}p3+!}&5j;?mECSM3U=@+BSjxQ^bg zhMmxhMtvWK`OAw)pezV)MhFq2{0{riu3F7^1B*i}G!mg+QO@i2WQ|ukDd*k(^&0q^ zUo%gywiqy96JH5KJ${)@r0E7)caY%^^0CUtC;0H}E@(?|35~3=|A`PS2;}O3H4Ot^ z+l+)VK3yCiSW<_thW*z~L|mx$fO5rDn|!RQSE>xwdzpg+yb;|iSu zQ^>rR35e0f$(-BGR{)*92B8O`wsx;EuVS2G=hfZLLT+WjHy{LS46%C&HuocFuDcbV zvwfN<6L|r86 zxO!F*2+uw=J7lRGZ(@?|9&AelxnE{}b`RD)LP`IE5u_Nn(^d&ja-^d*u~Zq!w3>Jg zG5Ig?VHcD8F}@ON)wL7v;;WrZbyy&UEd#u}k}Yvx=XZj!yOj^Imy)Tyk+0A5A(Px; ze%+0%CC?duKBGl}+%F&~)TXnN3v9=d(%DqW?hXX#mP(zJcGx=CyMN$eiRR@-T zg+)HXhn(d4G(y=SuN=cgxu==r*YFtW^_jHU;m!65X8}hBa*YN|Tqrot_Nbb3ys@Mi z#SBR;*%+CtW;oaE()KI@4_L(?XDtGVf=_52S0z|*fD&CinM4=OFld3|i_O+B#p4?9!|ymbg+mC?UTpz(Sui^1fdhJl z!GQyDm_S23vDBhL9^&KpOV^7D{Ox+V4;BPT+yZx~5fgK~ZlmCM!2Ls%+em8l>jRCh zv`9#_WnPz>GBHy-iG*q?2;j*YAh?+kr$JfklDvwzALZC{Z70Kbhy8t5W_lCN7#Y49 zrZ7LWrb^;hI!+5kkWH9cf^5b#*$k}!f)%-<(Iv^YFakTlM!{}uHTGN-euVKwzef=h zHgW3gVZ^-^;0@Ps>NJiyYj_#exqpsFwi`mAN{zB$u_pijE1HTBKh@OI?3$gR$gA{)>3K*elcCl4`DS9bU2aK#Hz!fBL z3l-reawS3Ub+GY^oxyJmeuSLpeK^|*>%O>qKXS)#?-#y}bWH>>H^xv-fC4RRuOa}_ z7eeQGkJ797=1$@Pd%UnKAvKCzn9by&67G?9@`rx~9TI|;3N>!ClpeY}dqJO{+^an9 z2A0iH2y#miC5#UG_<6|}?qFWt`#6^8Dl@o;fLAC&MUz+83bEw^GeB6irxcB2> zT&iAXEDLe>6I^h3Rte>@adiVdHwB7h`gp(ckxEaU+NC9X8 zDChJ2@Ujp~^#2_ZP%P5e)Nu%!14bNZHWjTa#)8H)YFGm_6gX_G!#$x~TE~fwIkEdW z(F$oqQK}r7JM-Cf~)K>7hTwaJcs( z(74@pS-DZOBi26gjm@%XpdG-#JG7&r-!GRs|I!o!GA{LrNc@!A3|9t4ZuhYbK0F}}p$j~#dt^R+pQ zOYWZSCI)1>)#wAVuodQusmr{&dBH9(JSwOqAuC1uJ7YMT#2Fe_B@c8pfo#_Bd;u?LIQFk+x1xLKV1NX4 zW6u&^K_?Xncs5D`0E`Al^Wo65#DCZkpB=gsZ*U?Rn&r!n? z7lDIN1rabbyBx~1VVipk003vzg|WDdmI-}uZzouMfUkeahYX1~E?xS5Gc;AL`Tn?~ z4rC5`qwueS0m8ahEP=TaH=}b&xq;y!Gl0=m#_Jqnvx$I7c7*e+IuTW%e>2-gei1tv zX|}YprHNaNHFfK*VJF%w2pRWQKsut-9&065_gAoa=7(Yaj)Nq)KZ1a2TG$n4^-;T; zyuq?|-AW>bY0_?{Hn-NU60A8g?jtPyRn!T-y@f6ARB@l_m2f>bv0m(hLp~g=m`i<~ zs_`W-<_WzFHomR_5azy9J2skj_{3?q+EFk^=rbKsHO&x>X-&_YYS0jet5bspZB@G1 z5!)IMo9VGJQopuY=?Da}JLy!V1xK@;GG-d1w(2%uY)yK7O_05BrzZ56UPJbJhplyE zD-hyqTSaDV3i_*)?^Fkd0&BBn^VX>ey|xM92oJCg0+1g5)PqiiR9hoD4)_yXft{)v zFjZ-r!+UIxjq3{wa5}}c8$@{O>2)=*1&J10!QsGfxJJ23@LZ${TlL}%gpMKfTM?kYky~N>>u-bNeL-Pp~qxd#& zJz5oZ?S9lGSaFNz)WQysudZuDGDu>VxaRnnnUWLs^kM<&tc(rN`I=)x4i88(?C#`< z2>RTG5O!dcrMZ{+kXU)h?w5k9LmZ+s68iWo4MoaCa*fdud4xAQwovaFj>`UaGcd#9 zhQUU5U{sQ814^nc;(l!F+X2Q5NPu8aG}RGwE#4MQ#$k5w-=nAPcw1>YdMN1cgcvoL zD*oySN+8prgma{;WF8h`b+8Y(alE7LlbV2k?hb}zdofiK#vdRh49wkmH&62*3 zlsh{mH+lzWiJ})bjYl)3oEz{slbjm_-4cS${WWfgrJsbBIrWBL*-Ve2_j3M=`~)uz z#VPR5gX?UY3YFab3zpoclpbr1iQRo0vBRZE1Gjgnks&L^eu9~btN;}GuZ|5T7%e(Q z=TS(Ak(pu{usK0y6ldI}_t|01;3#+RWwm03!E$$_UD>|C2QwIKvKqY>@aD0nN7;XB zRT6M!ItXFRW}NA2@4Ye_xVBxXe=r?S!mu$g3PGUcZkxj(SnR_H%%Q{Vnp|U{y}*At zIu76P;5%zOTCtp2$@REHA!Y;|=^n7@*k|(uDbCl$scTq`1DJ3%k^s~F^!}qX4A1Un zxZb^xg43iZcIvSg0pNVMO_jcgRH{3 znX#xokW+-s*EY*AStEfrB!})(XlW<5fP;z_huuA#d1?DbM2X&^1wRV>K8p-;6?Vfo zd9=;+j1oFQFjhw%1ska*!!6}QTd$$PD`}C{J&mR{wzV!7FHy6b4!V?RJ&kgkJ$%lphFSloBNVLpPfPn2qtUAXoL#xNC2a~l4K z#$XktT%jskMs*3IGTjs_Vc2w$Hp9>c25uDQ(u5O~!CHsWR;IRsOQJ8*5O8|>&_h~E zdwAO1*J^BO%;6oMb&D9HYfnG4<%KnyKKUhPWwvTDEfYkB`Wfq8goSMojndL>#@4F3 zi@t+5Z8V{M*+5B0L;<;g(!c5x(lWW0V|>o8p1o$?T%XNLr*+fVc<7X&V65Y z_C5RW89i|4rIEw0M4J&8a&5|8F$l_>MY!x1VCwZ3{~p2*DcY8#CpYpZaHH#iic2Bj zNUZVEw+at>MZO7;xJhS$EO|YsNb8^Lm?pP|PPlbGfRw*1=pjPkT7&|bV4fn8%&uK$KLgBC!tfvBsaDhNF#iwHY7_v zpTw30lj?L|>B86KRhWZ;SA~Jqm2P@-UBJD~P$%}R!hts?J(Yhu;KocQcKbA`UV{Xa zuxh!IB5!-B8sHI%rNup#{K88T?wr#nT+ZcdI9KqK2yldWk}j@QuterE7_84Q>2{f>6?_Xax0OSO!*Sd?AV-X zd(sR?MVz!8F+44dD?R13 z7P*b(yz(kosLkXTJSI}EvWz`TQ zv(3~Y8ex%nKm4sEcoYRBLXpU}*WoN?#Nc#+SYxv5Beyp1n*DL#hbBooAJXl7NVn5{ zp7@657VvdntSy%ED>;IkX4!nZTWPW|Z683EZzt;iAOde#XB4cORO)_+RlUH+m-7)E z1DBMQm+szx!8UsM=p)F5p*{!t#kR;8~1a0^~4G87;(z-9Q8C@_*K`Scm_i`{~ zMnB9pN;mrg0Q(a9D_*-38)ES8lZeYR!DlKC(LG4M+R2_xI$hfpV^GV8>~r zmN9|0`2+=1x=TvxM0W{^h%gGi8&OPdTZ}$8Q&w_9oQ*IJ;FU*s?1~+D(?%yA8Mz+n zV%9{ovB7}3{Ti4zNu|3~yBz`87=Y6t5As|z;Qtmk!D~;r_^UnOK4$u?*Z}Q`Ieq;e zaD4}q6wdw)_Uktb`1!-{}ZKPc0Xz>lXtSbRP_?TO?6AobE6?9FKr!6aFozd1Dq{d5 z2;k&L$BCJDApm#)W`=AN)EB>Sm$(qeZ(=rnf&5^&@h8TixDQgr?Mll@Y+v8TT0W`d z8p<&?xYhxn0jvnXQg^EmH_CBnoNZ-2#;u9}0t(;?G9$*z0dFM79Pr${9k%wPNcKD@ zd6|PscqFb2y(6SSCk8;}zlUKF3tbwJ$mNmEIO)YocB4K!&lWz-Fa=p5=|W*`YflhAN9vlF-Wu3zr^Rfb#7C-aZF`kY6;zTY8UZl zrWQLsdjEz`eH{}+%mIYsnEJ#*7v65hTXLZrD1cJNlmk;ud5gYGYr@XoV)`4wrw3&` z9Vqdn%|&Zguf#;4#Nf9sUx~dav1H4jUqd3OZeNN%q*$>jQZIv@z#CiBk1rpzUwV9B z2Jqz@=0Z;I*JG_Tiq}>UtmF3BlV3mSl=Al8oDy9${>-`C2vChA4WJ@ z`)>6OZR*$MtMMD)SHuqbTDlpzen)csvdy&tp&O8HC@>x-_eT2_&d3pFueQjk5*dlw z-?o)Ayly$eMCrPmty0cDyhT3(9MD$Mrgcl&QYv}v|T zXa}L|We*~EN~))wt+tiBB*t;J*_az8rtECDF=>gp;Oww5yCvoYTiZ_EqFufg?U6M9 zieGHLn3XZvIak!cK=cZIAojc&AD3{TUI zK||1O>J46uNxxGp?&nYeOVxrOafW*ko?RLd{BG-*gr|%%jXm0lLE5?pPz@p-RKmN= zNMB>qd+xj>C+c-Ia@;)A=w&og(!))rvG>VB3A6`i@DZI!KUql6LqQ^rM$TcoG&f&I zU5!RQ(-4z~GL4PicSu~& zwxz}0jbYsk)rvEa%*+>eH?}h=+OvpMR%~O+*>n`e(Ss1YS4bC_cXwm+BPHDI33115 z;Go$@)w9N?N2*ov{6Zft_-vw|LR}P&l%Z6H^hct17iquS*oylX&@qs7aTdj?QkA1+ zYklJMb;B=@oE+YbSzN1#G`^9egG-DebUF?)p1|KydjD<|k+MasneG77tx?8Z{MMt& z7dQr3$~1To(%3>EC_xmn8)s~n!Bj%ISmwT>@!=`)|0nY$WeC@4AYAy>GwP#oR-6Vf zrZag8i{OvQyC`jur`FNMQc17wXP3a3aqkMxUgPvA22D31TqxlNG91~Kq;2iU&tZ2YSje)=Fm$QXfsYauf-$5s31@fX6aIpknpfjs zBD_u+Q%0y}VmIRO|Qd8$vmvP>lPBJhO=L$St6KIh_ z9Wt=C@=W7v{~qnTtEKvNTDo72H~SN4WMIC1&Dv!4ALy9EXM(e~+QYkGJ2h zzSIyo(YXIi)pa57Tc(5;*Y8zs1GcDQm2ySR7G10{!_H&4>I6QOy)pG9gdK1?NHO6& zP;eFF3I8R92UBOrAM+MPiC_ZwOcG>(baaqH@01FS(LI1vr6y_j$ZZ}|?tTI^Rzxp6 zx-nB+XzI48=2xq=r-ylolchKvA``4%tHZkIWD!UCv9p&OuS=kKaATz4XxJB_|k{u3y zs~53#*spedojx7tnBlJMkm-bSlfr?>_KJxDHYCIk>R{;(73J_68LobKp|0`TYC1=C zvfEp~a`l*xqpcrd%`;QT!KHt(ifei+MY>1KY5!T-+t*DEJ+d!tzk->Zme#mm$7#F5 z2M_wIQ-YgRc?yVl{DLPLTy5L{#k34`E!*cwd~#(i7Ze$SNX`0#t{FbZUDgFmRBsCQ z4Y==YM|cO$1e(8_C64dCa4|kKxD9{lm47qRB%lG>73sHsllpx#ERVJzo)$>{U&iwc z;Wq5$Qc-?`Erm7g3pUGrAA$A#d{pqTn>&n!nB$_=q35`7r=iFDcux)QGuq^M4h4E~ zu7uW)*vLEw87ofEVe5i((va?4iQzBK2H}~w8aa+Hk3x&c?;~CLdqF!_alcS?)!R#} zTM`wMX9QH<*QcsWaEZ1IAGAuc$L&0?=>)38p^E~gBs9WMeg{{y0x1ocDHm%sC=5VN z9tA5wLgG`RsI2KKuncZ|EL7oX2qHsM#i$^MN&#gP4QY<^y{CPJLfMp`qcb!yB=&iP z@@n=m$)31?iwL~k!Gr1jnf;bWrOaSVh%xKK%7>VTM@m*8=YbS>8BX5ziMLbmX+R;^ z{QC+&ZQ?whSKnQRKeh@fu7ih^Szuegb0;?C_$Th_^nOj_z$d3$=@p(Grgpw zm-8T7f|PMjdVc0S8Q_XzD`Y|XdJq|H;$imAOtJA3s6N6$4oR#)0Ugzm0jYuH@@C9* zajt@M#qi5z3!mgAt*!mFUyoJYb43hi#m2BPfFyH)&3yg>Z&s(dj~`UnD`^h55ME1d zDHGNDv9>-=c_}d@xFbhHr9O6MGY4*xwXtm25$0$a9?fug+l~oYudwsweAyL?^+^@I zn4f;Nw_=sl{Aw7hFT~Z?*s#Xhl&{uCw`&Ebfz*K~Ws|E+zmm zlUQcHfO?z#s=H<(DAFj>Ri0i{h{h8oiU#T{@ZrnjTKp8bJc#S)_Q3RuXJH$=PO1f! zQN?Urd9BfCT;*m1l-yTZW*b#v zqf+=7xt!dN)7V|yl8w?( zmAAxDO969?o93g+$08o~^afRnY#{m;dKG`f^Tqq%oWdNTB_(<#rA#@c{_AaQPz>IT zQOy4}7?0OT3nG_e{f%BTHT-0TA&akXFbtC9JkqV%3-?<&SLlzLmG<^uM=injyZ;d- zeiF@h{}TdetQ=6djyaQb3vact*IP@6#(rmOW8b*XZ)rTGiEmtXt6GHP`J<+Zw8Soy zoSKUWZ&nc&gJw#Gf10SMjsTbk$P}pv0s}!QCl~~Y!I^V;r^A>5^eJ819@DJV{IhMo9JxYhNO;jbjJ1FHcxBawd* zXTDq6jH3YCwU`Xza4r8ymt|j%y$bh{AP8VItl|_5fyf&2+!7OGUnu55s`0W{XCIk1 zSHu&ucc%My1+YKsMiEPkVAE^0H3`1Z77;x8$Y7`P55So;>oz}crhJFK_~?{4NX9|r zXY&`Z`xdiS(^MSfg+Fz)IM^U^t_fGLEXZzJc=J@^*cEqK4xRoFbsy=Shzv zLeL_!YL*UG3x&DZwD|`^8s#xE%xFE&PaAEfWTmV_a_R!TOwzj!ZIT&Xqg84|TH0h` zkedc=D+ZAOy(D9ymx~wmeuB*i%+U0-l*a{Xfy-;(^>j+|ds$R*Elv`T5<=JOk8s}p zL2l{LNrSy0w7gg>FO|7w_uuJN%a)4pXsuoY8A;RD?&uV!S>}rJ9MuoxdipG~=$k<> zmLlNu^X#nILs){!unn><9Qm26*VC6C<5~_(0s)R`h?kcZDJOb^DMYiFew|rkCEjwT z@EY5G5eEC#Gn~#sdc}yAMd-mopq&<)?=VwkZ?cr;_%P;Lqq5)I>`0atKw-06;KcLg zDH-1E7_B|utm~in5cx2p4@(5BipT8vT>oV!9DZ-$e8q71&SS4*cDQES8klDgHVyZ{ z#TJ)g>#BgC5CeSAMZ!x>1ykErfJ8tGq3K6(eLjYI^+l+yc|d1~tIYO%O+fPG46XbC zdwd4mM%4v7#CEa@+jjJt23w#kUPFDAw9tNUtp;rySckRdsNw<`#oQQNK|#K6b?G&% zh9XGYje0;M8T1|ml2bE1J>@Qe(u?rg#vOxIEg}PRBr@Z3lGK>N!vs>12l;@qW$w^tdnwGAN_$c#Z9#A2xC9Dj zjE05RrqRl&HkQK-m}gHGK)I%dg|Mg#=b8YssloI5IskMA1)Vn%8jFD&*XvN} z`n5vec!>tr`UbTGIzp_626HC`T^lI4N9Z_^?Ht1X%-vp+3&q0ndN8z9%shc4EwICx zQ8u>@wrt>7F`DW<04<7BU57oQi|#TE!vLYO?=dsazZg7=MFmv|JYt&Eph>lew+KHl zDDAxt@I_v&2h-TsnkM9EjIkOh$lp^h;al%7o6Q~Go9L;p+5m+Ml+mffzG+@xzPq+4 zm79DnKMcD;0d11h&eGv27y2oVQ!B9o^7Bk7jHZ4YEu|{Pl>(uin0B5Y@oiRw zF(E?;{!V=o?l7=x*9Nz?4y``0?}j>Q31E=E65=$rRsEt6T$2%7!h{kMiUf|*r&pq` zgFo&p9~4xMq?GJdWT>K06(O=XUi%mmiLCW28F~*NA7CDRW?clG-$NOq6xTtz_Dhgd zi4kh#@{S^$UPN}pQeisPgO^S|!?C}M#CtzCgEH(7!xVmsoOKTZMwZ3H1@xMTXRJlR z70Le^vb9Q{PA{FK*^%IAp)aB{BCK)pF)I})6=uZt!P@9}7>|=JGAW@H1Z=}{_&E+- z=U^St*04pjsw!6FkaiUPcaQ;D`IiV+;Cu z^oE9Y=cd2%K5FPQYSoJS0{|rpk%YzwekpPlh#d7nB;58{h@`Ui#VBN<5mCEB+KPL) zc>pGs{}vR`2AiP5eo*jH90>-r3R}5 zOVC+drIL%C4jsg`%s8x6`oaL85QDBkcH~uD;Z>L`YHf4SK)tLfuys=Wb z5S4z?u3^kjm1cdxiDEPOGx0`RNss_-yCFhkRv_MjC_q&E5#Nqyokh|%lN|Sa9?g zh*NLk!i4LlMSszZBHKAGJp4kPmEMZOwLO}g@dC&-*O~i+C=F|8uEW}Syn>wne_cIG z?EL?m){iv!A9n=_z_gB88-J?6{#XF)`=s@20KWS}9Uwj~Io|7o`7MBXIP+4T@8ql1 zAYxH;qAuEnEVXSoxN}8L?=OhYa2ymTjqyx-BKdbk+o=m|TEGZk&!apc6OH-U4j-lL0uo+LYpkZlml}F&-E*QzR993 zw3)`M!a#A8SE-(>!kcgbk|r^LmCmWHgRgJMqiBmy?jRjh1~r}dDoDg(cBV!u$im6C zQLIe;yXEVnk5Xyt<;7~uyc?h=b+zrc5x1u7OjV^4&aSjyD}3w-u1^ftCOCi|L!ZsK zv@MqFBc+^}&K#p^a4TGrRPkp`(yBTPe%ZGV%!V~u)*u-WSe7thee5J9?SZXts1j{r@46bM1AMrh-*$LDR?U);4Dm4_*reCu?6 zG;P4-ta}HFpTUB+KMa$$zDmviGy?C#-6b>*yaXe`1!53r{-N{dIhn{p>O&rV`yE>O(oAsv0vPubFX=Pfk9@g+h+dV^)*wsnWK zR}{X})2db2n+E`ZU%uz;U63oCKW0a`OpV} zX_R+d{XVq}={9strU9CI z|FGh?mW%6?8P(1$aGUW(UO8_S>^c$(b7swhjlVyyER;g)0xj_QBsKv7X>%YrH8tN< zcMy=eKY^L~JTa~^IZpR`xVEJrT;#Kf=j3wq;fqs>IcEu%lR!<~?5{!HT*l4TIS97$ zDLg4( z;zZ%j8F6rB7pYSf5QjgtIDDNb#jkh@&ULqcbXL=XO{{nGcteS{d=9Uo{UExw>!{l~|iwyQ}v( zxApJs+i6QcPkMc{g{Sa5c8@#SHYSfrXgSBFuLjy%Mjauqm3xJmux~RxC37{Vp!J9b z)($#q1IHYAoIevQ0eyzX9Hq2LLc0)s=biWC z%_}6hRJ{q|&;=&sj8=6jQLD+8=6yssq+Eu4o;^nk!Agmc9PL$;hC{1xi6d^Yd{~O( zF_y*_dr7w(&BBH7HClY*)RD#@v`PZr*H)A&^hj}_dwU1-MI)^^!t*AI;tr~tr!|~rk#X(atJ2UGOtLvjRo|;lr92T{-F1fX3 zMB_w@!5+5Bh}M_DU|KYBhxP^Y&%L+kUzC`!SedPAW4NFqQ@N(F!?BjmJfqfr5TXSq z3PR@zL*j97SxhwUnDSXLT}Pwbhd{2HJM|jQb;M7_E1)Uju>x9iOAxVP;?XHtL_BAk z<02BGiTzO%rK;O8FC#S4qat=Pc7TuVeEb?8;!;btVzLX{Dh`S?70J z9oczJQDj+kH$P1ReVGLZ_he0d_EwkN2a;X870Du(Q}-l!OCJ2r#a@rZ_)Nl~IBv`m zhy9Uo@3o<%&m*0Tye?(R{Z-cVb9mS-9O@TEEBOLB%5pyf;0GeLo;pO~s}OuU5nLV} zt3dIpE=9z#mhdc{jmL_(o?9PBiOF%4c>b@W?eu(%rqXVGW{C&fakM~ePxN7g3`G!H zQct9WBMTL0S_vB99ZHMQE$A8Z43lMjg1J9)ueXRj%tKnB4yGQ+1P`b{3=8o#45@J@ zB3GQvVS(hto|RVB`gAI2hO$%1;54InvXTXDtu(zFua88x*X7ZNwM|WFY`sEcV1)0M zZwIrgea;&Tb(bed(+3L|XJEW(SfT))2`<@U&|<=KWTA$F3W_5<^X@t@_u&C$;*r?` z+{6nL(Y}AU4#dAcitXHL3l%K?4B*BfM}y=zw0>G{i@83OO^&FuD4jqW>?@nVA6v!x zn3z&YZJY$U4$luj%^XF|hru=?HpeqdxRnL|gWG}J!!OV;=wt6b^z%;)8EA?2KRy=NpSjP&nAdBa zxAsi60j-A(Mf2scKpq<+aEtTS7Ge<=^9n*}D`D=%Ufh=XK0+tKt$)b7l)<0C{Y8AV zz=^N`CupQ{7I`}YdQ%*xANiNyEgtU?x$=ho>LS=Mg8(1G6M!3?K+Ap#dE8I)@#A=a zc@aiK_!6=)Mk{uiDOwiP?;`GN+2mdX;KVjem$tZxB;wsfg2rpm_Ie4wCNp)Y<=)F8 z@8v^k%P@4Ak4@xazMr92@jwfnWq2QAN0KVVgNzUX^qow*pN|6LB;_p#nUoLk)A}iO z`C}|UrY;+uuw_ZDI=0*~)~nZ__9W}|+O11C)iL(*j>smH?{1A1xjX?S z(1sKvoYvSrM$89eBkCZ239*`ukaSg%3MquY@zN48J)~05U)CwngO_n&V@d5Ag|*XNZmgR7Gz`XpLI3Omv=) zr}-%HA^rxw2(`#j@&%SCX1%+<)U|xE`;zd@i&zh1hvXYkOsMQe=54HA8Qway(+ud6 z*dHS_2-H$R?tuZy^1geyQfm7n>$F8aDeJMNe%UwqTm5sa#9PmV1Ju+KD+v5|_~`-n zoy_nlK7N3YALQeQ_~1^bIgrcANm%9bJePA{;-{;8+`*0=;^QGcj_`4ekK=qi#>WXh zCipnb$2<9$_z;9B^_*fm z>nrXGzsp@4s|;P{<7@f&Sr+zDhF;?1Gkm>?p{sm+10P?(xIsStBVXUf(DyU+pZWMN ze9%t9rT)+TaXu)Qc7KKsaU1pX43TK~2#JssTKT%1gC7C$tNjfEDbSPHzlhz0&8hES zDw2A;^oCvO~_8)9s|5k7YMH4?BHMKSINW zP0oNb=xlgC^jsvn*%^0+oQ;UT0r5wiP0r@$W6y=NTMApRY;$hFr2$8st<1Y&e9Ds^(V3CnQE=;6Mb;_Z5^P@2W{AbP8*WV_5oPaI6G zywjl@2Negs&vzVz~_Y4R3pqVWZOxNH1KPu6XAK^~9~SU&ANb=);93 zPOctI(|4946y8n+NpQpwjt9>bkm6$cfd|qn-d9Qj#IYx&^bn>1F!U6707r-shk!o) zQEQ>Q-%6nrBdlLAhGl;5#gSlh_0~%OtEI6}nlOuQ=$JitDU;FSe@(BIRvnQKBHMID zz6c94zBoU4`l8z*#;0VWw8E@fSZ-BkC`r*vUtp%ChiWfabUevhKr_SQG^W7aYAP|f z57`Bs1ny~e=Vog94$BYX-4!-RNV2z6VnW&T*zF)Uj#2z3@jFhELADP!_JrV=yzTA) z#C72}Iok!tLA&eSxM)m_4nGc8LCk}{(U;?*xy2STmqJ_*{`SbFm%VhGH4>X>I7ct? z<{^xQZ$?JbcHD!vYI=8V0w1*xxI(3Qs+WLQc|dbigjkJadN1D&rmuxZM*5VS(HqdW zW~^SgSZ~JQNTr4=S={0UOiPv*e%7>zI@=e}%Vzs^BJ(+ZftP+ZyXkHFsO!R^stm9U zItSR;I@zi5aW2BNkk9*7Zh>z_z+47k{wDr5(oH#f?DbeU@p|m_M4b0VH*N@aJ(Cj$ zonRU*duzq%C{%X%p#3tX;!`Z>v&{Vka#bxmb26BJz-AF9V$sIt)+*Hz-ib9Ua(|1Z zzKYyZH1>5%h-ijaT5Gxo(SL4h3bl3aP$^$N=j0DtC`FNCUBWGcKl zYz_AP|Fm~5v29dQ7`B}dTgGur;uH#%2vigWN(2SUE0jk?DugKAw3RGGYMQ2kx{Y*A zg-9jJl2sS%U`50hka!BQWruz^3rjqv=H2NOW;K zgJu?+vtBa5np0V#LA(TeLdw%EqSH2Wm}Wb=`)H6!3hvU++IY*97A3Ll{HPlsnA{Sxcvl{KWFo}sVy{(!6P2v>6-a73)H8oJ;Q z2Nb+JF8CuIF?4Ys4=8RaE-qF>#bv63Z8|ie@6YKs4k#hUPZ^^%<=HBRL=89MN}RHk zSQC{eV&;vU0A?~j%QIMzHL)hjcS~zTfz;HOOr#hSy@|Tm{OPLReg!fG->bweJ$?~* z2?DJ_jNbZ}7!!A8n36+J7Ob}6EoHgWY}snl89Jj2u#qfnm;?t?_lPSo<$2;MZ$?~+ zbIj{K&vrsbm08m<5=1Y+(8#P2S0c5>-)01mMw60^_@1*XLxK0$|Bx#&!wQ%z&6i+! ziF;?N*rqAUMa4JbN=)fNsGNlI&j2TvT1Q7x{(4C(rC^@Jh$}I2GVf}Sk6*T2i2<6z zJfrKDhnX_)&_{HN768K3x+6M8@k5X36cZ9b7!iY-IdVZ6j*XB3>_11RnC(BL7m+Qb zE0-SQ;HlPgCj>wBbM0sWv%n%)+I&;S$5`~>nvsfLLkawCQk}eyefS)c0Sj`!K9koN zNH!ub=2QIP?aap^p122S+4~J?qW5>j+wp zpzVlv&=dH+GU62sNMyQ`G}1f6!MNYtLEItqU1W{VG;1P zmw^@~HD)O@w}H&qzk-z-=1Bd9xIv;bp^z0Kp>sECLw4c_(_+s4ZaYUkK=Ztb zy+tw5A3dQf-OPza?|0TVPw2*^hI-FDwXA@oZk{uLM%;q96|qyIGbYa@cN?4bIvdK- zEFPG%+#QHrh&vGm)V+(;^W4PUq+UksM%*LOs9_RsD~NNTG;Y-PhV+5vOGJ2RTRCuWLhsi7Z z3!2ZJVV@r%x2Q+KM8Q3(Ew>l39|1V8hQj_px7x%Qh9)m0CsL6$PoR*|*=c@p7s~^v~%UyO;=Q~X!4Rg_nyPcD|zddq2c-Kmj~gbrfGlE;QCX+ z;5lCPE1F0<)1uN@=}3$8sQgij${+MI9ivKA#i+{l59PCRR2yiGjbMVUhBxKx*!Eag zggjB4?O@O_jFy~Vrs8~>v7NBN_8;&4_Hh64{vLCK`8<2~)%5<}!+FXTPcqgPDhXb3 z*5+?`Eax-W45QD}nNUi|gbBr_Jmup{cAf@F#-k>iq?|K3Vc|4L&v}z&k_E{noAXp* zgB)jpNJMhZ0wY9Nv@)9lM#)Kb5u_Z8BNiwnLlFRvMKWBF+aM!<6A^R8b~5nX9$f9% zZZr)ziFgn*kpPXe)fBrB*;Fnv20B?PLc(ZbQ5Y{GieWV!iTO3JfUD zCY#AfOz58%wC0O(EY!5gB0;db$y%%=dYO`%~fbn*do!DNdH}n`*xTfQsvfd#xom2LQ?X;WB`m^s^ zgMra=nSI>v+7@iK)9Mb}wsXV|u+Qls>usbvK)oI#hgVRxH6XBK%WZXlY#!KM+dFL< zhqmVclN|!oWPQ{1?AEYrx~xBR`@Mk$_ieyBwsYvhi*;-{-Y&et#;g|@utCS{cFC1t z4iUWzKQ3$a`lqga)bUuS*KJ!c9$1LXJm^|WS0L5un)Y#%wasJmh@x{@4=Aod%a+lx zla56u@@L}L^6Z{NG+I5!b1`g!rR%M?p4bDc$xPQCAXMYf?E#+T#17KTp?!|EL?NjQ zfz~I2B_!Aoq}Q>uEwc+O9FOzG;$5Sm=Udk6MG%YZvL$EpAPvSb&+DB434>mU()Go& zE^5zU=Gs{ag-st)X)E&zuSWV)lr~mtgl5;>pdwUlSL8lis8EA`8GTX@xdG@16k^j>>e`k>33?@KRr^z~Od5KGRda&8DE z63XO|=Qn&mj8TDnKc&b&>3Id0c#>8zNC~rO{vEcSjD`wTZ8X6Be>*~n9H~sEvoY>h z5OE(jH5HS|NR3y$t{9J$$oRu~5WWh|xf-E(PS=uaB zz7+_qbQ(rp$EIM0L2mdys^uc4{-*C!u3XJPTNTR;+U8}EWceN64-%A{qPml{CdX9I z^2%7sIK4%&-KJ)(`?5z-7MZ}%QAEMeDy6!gDdZd_2;&ZI|Bjlw)NE1nJvEfk*KiAU3QY)Z7jJQFb!f7s w7i649CExIUd`%%TIw<4FZ{l)|YXP&y%Ii;;r}&JPsXCg9R(Wu{_QUP}00xOr%>V!Z literal 0 HcmV?d00001 diff --git a/sbsheriff/Lib/site-packages/disnake/__pycache__/object.cpython-310.pyc b/sbsheriff/Lib/site-packages/disnake/__pycache__/object.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..09439e99bd07d335410f0cacf265815a04c0fbf3 GIT binary patch literal 3535 zcmb7HU2ogS6(uRjmT4z(w&_RuP|W5f5ukWC1_~5L5>%1sm{?gdC^^{(1{jJQSxhKW zof$@vk-jwf7mEPxW8eE@3cmJf|3V(RJ$EQM-t7la%A)4;+7y{Rhko=5uxN zZ{7P3?#~66JXNd{%QSe+S%<&jNj9IM&9+atn8i}YS;}I`rd;sxlAVhnRXl34iQt@N z6BbSban74eWh_XSY|e$mglw#WIE~YD7T6)&qLFF}7@1AfA`l#dBNj-Rg>e8p7G+^h zW&=g`CUL?gyQdK6oxy6xokr7!k%$Kgi&LO+w(eq!SWUBBF@&Q;91=zogTf?_$cJ@z z63^n&f=$ykSCTx>B_bd{n{1Xv@q~W44r`u|lUPohEQ$$woGXl!)TpU%+KA(;Ofbol zgb-r*tz-S{T~o&jE8qt9R}^Wxi)l8aNbJiZ(gl1Nc7XE5cwmPHk#hhlA+y zu~b<27~Ib@q3!)N%stpYa@e4MIDFpn9Oe$#iPwMTcAO5o(;A?Dr^%kX!=wJ`kYR+^ z>J4A8{vm7iUa)W6UZ=^NZ%;gDFtGa`bB|BDu7ftW*Y2Kn+}>061oL`*WW9@Y2k5ZR z$lwafbp`}>?0D@XAh({lU3d7RX&<`79x&M`1Id*!(Jy=B>bDp8X21l)KmrU8MQ+V&ej>p>llNX-*^k~SA`rVF$#wQLuYdz^Y zr6~l}?zY_HChN40TTjV5kM)7#*)**5jy*qesEO>g@Yf!?{T_wU?)Qcss!c@c4KJrY zcLz?BwLEtKSM5Wu4|t*zGl;Vu&FeWO3Q?^Ix?B+qA;L}(^rbHyr_}`(mZ$fl!F%@i zBzq0B*bY)8ir$y9Q7NtsUz|98`^afy&7Kz9gM3aIA>C9JwbK-t_`O+9tmP_BBoOLH z0dj1d@E$4~{V`>7Na$A|=vpbP`zUZ@WI|l6$Q)Io>m;EcAgU3BG1@|@#y6tfXgk{Z zPE@hyoQb4FDO4Cwk@r`-Y~^ zHEhaWn!yJc#yKFGEe+g5;B$X8HLPKZu(`2QOhjqKKs@7BpB%9dsFy zLF*eV2vv^GC17zpK-wlk>lqNV3!hmg!KW{|DzjOMF4=-km9k;M$2bgLbH&IZ1;5cF zc*x^7JksXD#{tfxoZpY;%Y&DY;~+i9x`~Jj_Hh5f&$3^>!trg%wA|jVprF4x|dLD=I?eI=*eXq5Tepiw$MGGvAwkG@l#k zZq-oc@)xE-9|duFXTGX@XMMEZLu~$JEim$(;a4LAa$@x^nsJ0pD}otUNQxP4TO5*D zRP1;~az?uvuIoM0s1+5I3;S7+LBxIB2}C@ZoXPRJ)Q!hyGFJTlJP2P0=UkrQ znnE|ZuU5Rxmqp$8Ay~@yzkv~X3opyu!N)Rf)B3@(tbbZR*tLrr{Zbg$ql*op*SDx( zqlF~t>xaq}d^O3}Q2>#~E8{yWvOZQoU8Q%i{jfx1arEeu`M6=0ftq3$!*#Uf>kCxL zK>@|~{ZrH=E#Yn|o;GB4b9uB~TZ!n{0S zS2J0r*iKJKe|LggLbCrw!OZ2CT~ z)L`~!1oA7qiuzoT3aO>|HMLRBU3t+`=p(d&f+Pm(M%A>xv~8=hYnDAI_S=873>%fZIc&WH7w&*7iB3KHF uy@2;PR{&3E`V}X&&t=j)ECYW`*{HL+YV6#;W$joyX4R^jyH?e@Rrwc!k@;=_ literal 0 HcmV?d00001 diff --git a/sbsheriff/Lib/site-packages/disnake/__pycache__/oggparse.cpython-310.pyc b/sbsheriff/Lib/site-packages/disnake/__pycache__/oggparse.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..f530e973ca711303a1a813a0b8c90703913444db GIT binary patch literal 4132 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 literal 0 HcmV?d00001 diff --git a/sbsheriff/Lib/site-packages/disnake/__pycache__/permissions.cpython-310.pyc b/sbsheriff/Lib/site-packages/disnake/__pycache__/permissions.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..993428550e9df6b093a09b57c20c7156e5703b93 GIT binary patch literal 31186 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 literal 0 HcmV?d00001 diff --git a/sbsheriff/Lib/site-packages/disnake/__pycache__/player.cpython-310.pyc b/sbsheriff/Lib/site-packages/disnake/__pycache__/player.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..ea3ee22012460c3457dbf5a6500a5545917b5f77 GIT binary patch literal 26296 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 literal 0 HcmV?d00001 diff --git a/sbsheriff/Lib/site-packages/disnake/__pycache__/raw_models.cpython-310.pyc b/sbsheriff/Lib/site-packages/disnake/__pycache__/raw_models.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..f3c99587754e4114c7eb9b08a97a0d13ae6115bf GIT binary patch literal 14270 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 literal 0 HcmV?d00001 diff --git a/sbsheriff/Lib/site-packages/disnake/__pycache__/reaction.cpython-310.pyc b/sbsheriff/Lib/site-packages/disnake/__pycache__/reaction.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..163f2d1ffefb6352cd8d9a13b6b839fe4ef7e845 GIT binary patch literal 7973 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 P#5Mbk;dJT3!Sw$Dq6K;N literal 0 HcmV?d00001 diff --git a/sbsheriff/Lib/site-packages/disnake/__pycache__/shard.cpython-310.pyc b/sbsheriff/Lib/site-packages/disnake/__pycache__/shard.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..4ed70b30f5de29f453efd1b9348578befcd3e339 GIT binary patch literal 19926 zcmd6PTWlOxnqF7+y?7N#Q8!yI%hpIeL(!6EY|nCSk0^?gIF=|aNm;A5G|gsLHQ7{O zsH$qw?2umB((ZV7qTTFFvPpo!EENnEFoH=C>@N0#Y%YO^~Kj-}S|1UQB`ivMpzjxwL>D#lh*ni?h=O=-S zbFrA_PH3^170bsg&C;t{P0#BZ>+xzlAD7=mK7rpvHCapLQ?+zHUCZP%wQN3HGxA2Q zC*M=+&G**&@_n`be1GulKz_hVTB+(_ZC`#L?j@~sb*MI+AFhq$N8~zF-CrBck4imT zJy1KCKUh1IKU6!MKU_PKKT>-k|AMp`)fX4|d{6ag?WO!nTFg#4Yq;*MnzfhnFYg+w zuli!`SpFFL^;`YcfHnA7&%a{r%fD(TwvXFic%tP`T#8vk*6^d4HT+P|pTyOOHGr!D zT;*`J-x|f$D6YPUs{__STph&KmvD8+I*hBs_VB}ae$0x`$8txCWo)Ifuwt86XBNyW zm6Ba|ZSy29a)vS0Sle(a%PXFFvXnE=o<8&Xsk5igo-yZ&YinL>SM%93r`8Ys_mL5J*@NCeDK7v+?at$EW21WD|L)!n_-i=Uh!5MP0z$~Jf~9P7-Q&E zsx~dc5H?pUwTha-;N!AaE+KEaSOMW2Giwd2Qs%EM%UWwLRV(hwm}ylw^itD9PnS1k z>&FbN@D-%nb`|t=JYRKpPQbaH?GZ@ zGgq%)nVH7Dnc1l;H!jS~UNX<)x!G&L`Wc`*23@#ja>8J!ndx~Bc6EAg>M};2JU??~ zX5rSDadBp07Gs(hG3caueR6JLX6nY3$vN}-jk)XB=BF|J1q?eoGkb9kvrJ!|o?RHn zthi@RzlRHR{_^CNE1b%hyaDLvFwdMhb?y4CxtU9s7tG7ou3VVL&GXZMZ1Vh-X*CrV zHFafj=IWSvVe;zaB|Tf%$t{|d5iN+;{Vjb%(YoAW9r)M!W=Hgu*$iG z=+T=q^V4JImyMaYVuw0m)yn?ZC zJhNS$$Boa(z;l}4Q>+6~gf89LT-NVfxOIKHFm-u)3Ws*dk5AS&{LB>arMOhJ{lo>3 zpP#q_YVkAI)`%&^s-IkFuCZ}pW6k!{EZ-|SpFtLIf}!aT)*5xtKCtV2v2?dlF6VSV zHC3(Pp1*J27HpmOijH@M1dK;gxbm8AF6j@bZqpx>Y?;g-oNCnTAQenJRc*Mojb`2Q`z|jmTyH;d=(rqZDA(uizp6HHoe9? z7@cKX?coW7jn>}tMc1ChjQ1euUKF3{EaEIEnLkUS;L&CZg?h1O7Ye>nD1Z?*tE~4H3iq1DYS5A_ zaaaAUV}tc@qx}@PE_k<}saQP3@`j)F$m#0X9>1qlwTtzFJoIVIIfa>|c)Bn(ar=e~ zX>ofVeD#Cd5IwhDui?~|z_*H)T>uAkD&_KRcPXr0sVv=gE1rF74OmiKw%yxc%9LBL zfrUBNIHcc882=r7-F_6ASV9Z`Wi)BqwWZvIbKKIeqSCdc2Q0(tc|?8WpfzaiLoJCK zWjQzb5ajrN)Y8@{w)wDg1do3j_Y)p5JSp(_N!xK64u0fjyi)g^GwAkoUq~14pOCXY zamP8!`@_-w2s!U?cRdIMKQRj$De<_%59>V0DS|(W%BHp%E5tT+l-gz-rEbOMW1niX z&TDARCHw@WRN475E(8#nwS6ScI2wop5Zqp&@O50dDHJI!r5RdlC_>=zu!}Rnp$_x0 zWCL=^@e@mpMzut!!Vl}*WPy@hJ;3Q{4|O-~>GQG8*lK)JTaDiZq|VQw`O}1NRNP9P z@}^|VzWV(j-I*FV2sH%Ta!#|Ku4aD=^_^=-6$(|X;2N6#J6B);4SKcKVCM?h;b#IA zKntJ_@ywardwTm`p|HRvEIZacF`G&x#qh&=bdJ=cu|u&{?V%P-1U8XaDY`3a*_v8* zL`c!8u}h(F3(vb8ZRd%p=Gk0Eo&Q(RMIpiKtP%g5H(0#Mg2a$ZwU5`4UFPYj_P0^P z0Z3ntgi*$8r5;7|HVAzfczcb!9k!cUcieLFAm zB73iCH|@e&(|dX(6pin{AEDo!F_YAMr@h&`2%BgtB$G#_i?H=o5_nt)JV8WRP2xIf zk@!=a`f3`#X)p5-NL0vLEDf*6>-GA)es5rP(A&2e%~ zxf!t4wW3#A!6`;n141BJlb@(I8f*C;HikmLC`1Cm>Emdb!jh8ZezM>d-MfAo$`<*d zGlFJkn8lDxTdXuzJP+dqqFk6}y6A4yOO=M-yHKgw(Cy_}f4Hy$g}Z871v`}ZZZ4q^ zm5Xq$u(-;ijbegb#KLdj>zXK1sg#xxw#Hx9bY0i@kMhEJ+Ul3nZ8JI|`7WX*;mR3h zP{B#yEFzLsTbdC;P^ehWMReH#lCM{+`?xLSnu)hEYR-zaYa-&iOe9<$6K&(LxAiBn zCp`2x4^mhXc48h~A#@!Z!dLBkYQ5pyg(P~95bOm;s#r&R4+$J; zVnplLGS6B=!TEG_*#%}C-G4+baSWA@xMMMb1mLt)9Zm-Qu{HzXE(c)d;}&t`9_;Of29p!zcvI(s32^2@HMD(k=D^A7YT40Ujh0s za9(Ytr9IKOncFc7{Ag7pzy#cV0r%ow!b`4#%WP^7QJ_{X;;0sKnv=uDXMbk^trlvn*CsvK00V5BhZVQ%xh&6x}4 zahI-+Uqo(JWu+{hhr+DE^D(VRIJ)ImkdRoFrG$In(=rF>h?*VufMH>sG` z8~)H-IBR682$aH?9h=?1#9}{-8}guKSBo2dqEKxtE1iM*2K3#kZLc{eQ4g8%3h&1O zu%Cni>ul`geM12w@4)I`!y_&g5&eMyDo<%6k^_#IcB+n67)V8qXdV4V;MgLYC1vQTOaIz$zx#)3jLZ>+(; zRIq8VIt|_>?kdb8%kRLp_j%c5A&AgFCHx%nS&8}zTZlv8SQD%hEtCSfLp&GI@F~77 zCm;goIAHRsAu{|2gE(gX5-s|rCG$Z4$8fTn^AehrJPR|LQ1? zKdw05-ed9jw-0d5Jp5d`gHyH6Txxj2grMTN;$#Hlp`UTxUV?`fE)28inL=WUD~*H9 z1t)G}ul=;ETr_^hh2zAAME}pYjnC}4Pc=X7DFrTfP|4Fa=emb3eu50m*Bfg}jqWKs zjas0HDzub&6j}!JP@nn$&nleDtQTRff^9l&WTaZ<2=eVWoXy{&`jhy=N;q;((G{VwjsOisoJifY9d#GsaCuL$I=mwWj5XfZUBP?$H16&u^9bBaSH&)P!k+W zf-z0*z_Ffi(Ds}3N zMTa2=aej#fPy44k&49f;;DdXdqll(|hDP@&3Lc=2<2wwdvd3`^C|MGTWZKLEkpL|Q z28}#rWz4b`+04#mT!x0R7|{s@j^JX{4agU9s`kUV{vAfNSk8WC&1t}S=WQrWZ;=z0 zSU|6cDRn~_Fgd965sQ;7+K4PQv4Osh25z-`5Jd(q0{vjGW+aR_zWn!+v9JGt!(N=A z>q9N@9F=L>P?5o0Y5eM~OY zQA9q0|As~}-slOS(`=p_O80x)`hOdJx_CA)lj@@ahVClxXIKoYdM{;2c2K6_{HJNeSmH_K|y}HglP^y=;6o`~+V&g95@MLzAR6 z(%#JWe9zxaB3vlhU0Af;J1N)7^yu8#OP{;5V17c7!CIBdrm(HJjPQHsLK8a|Dneqf z)v}=n$Q`aWIS75b6LliN`258l>s;*Tp-y4v0;g0^sRM7GcgR1(2|sVmemWQo*&^+A z%PH?`pK{R0PnN3{(gsl5 zTem?TMf37BBGl)nCl^$LMEklhIrT1`0WNKJ3t0l)0-%c{q=Rwy#OB8U?t3VBdZ&|T7N=xxf1$xeUj=*bA41ob@B$p3ZpkppQYPL zEB;oDuE6hV*12!S%9_<@^*`#*r?Lra688si|GdO*kR)bJ1qx)w&RQ2#^ahHhfvagK znnxuP)MH(=Ubc==&BXmnh!Gu^`+bP~oWN+8tugD=qg1}%nz6>M*U)dkI&Gan%h#JknTq1!O=;Ep??xwLi!o zBM>s&%=Ia93JG4rk_h%$QlQFC5gA|25~A;Ruro6rbr;IN8Y0oq>Ny~{pktrRMxD@> zWp0@itbPqP40^+cK{kY|R&wU_>C@(Nvr@I(aQHGH4eg6@IbfyDFLGKO)P49Ol+vWM z@M>krDS{2ksVF$qp`OQrgRB=5fUY&Lk)m@E;BsXdOEQ@+w*poRG}#C?FIY|+oFY_z z1xLkl7Z**S5As8BCIpD)SY1>&LIW)}IL(<0ZiFWQ%94%7yegU`963DK=+F@0=PqJ{ z0`sbS`8C)iloH_{C{$=0D4b^8JP*y!E*F6iV@iNDkS!$1ij)EY^~qiZpvcl7O5t*n z5l?di!WApK=#+V8F*NBu-)@Wcsl)bS8r1tC1z^#OciI-%B(fxf{3ysqtS=;LxVJ#} zUHcUPO0-oy7W)M1t^^6sqLx4nSppuil^$vzYhH@29zxb-9a$k~aX-oX6+BhQqRqg!r(lQ- zNLlGe8M%f_YP3eo=F?~Lwqa-Cr8JF#}v2m5_YHS!~GlPzHtLTfzG7t)3!8i>);fre&(%e zv9@Ft-zkRLK_b=~+wGVLb8yDrsy1Lvx$mH&9?T8;@iq8U{|1Lkx=lEbl#u@>ZaDi` zFcgF+K9ls40=Iv-uxkoraBw4BzrR2)NTl02-@(&}{`00HD&>gnLmpkjK@Qw6Fj2ri zwAYAG+nRRhdnLL$e~raoM*&wcl19Yw0o6oyB{I@yxfd^>Q*XRq8)ae$9C+})J{yc9 zc%LvNI?(D$(-T?SHsL?U!+u8CE#1eWKZ$FSPQ55vz{85;8!5cUZ~nB$ljk_+Aj*yihL?pT&lu$Aq)j1nP+8j5ZDoA(dQ#SHQb3ta-@9;+VdXZNs z4mD;@R=MmU^a*|F^7~^wm3rEG;W=9XR}+K}wc4(whsQR>rH`SN<`?qIaA3@$@^re( zAMtMdLJWan&12#WYDZ|pB#O5%K***4AKGYv9Hpm0loGme0Y5Ytr2#@u0Gkh7k4irp z4@|I5RS?2W>4DH-9B6bRsyJxSmx2R6P3QqauO}k261q^s#D0T0bqSd8L8QE|*rmIa z$kCXA_*FwAnH@4ea6gZmbCQWjcVN9(hc*Bu2aiIPU_L)I7sW21AHfIH_C5G<^zJ$? zQW(E3kBhFnk8m`1(zg-a0A1A%clCq5cOg-&P5mM3|FGrdFW623wJ%T1718r)&8{ z4IUwQi6%^cndo5z=mDlnS8G}SP5mBIF^LM`I1-@YVSwfS06&V`o?(qWR3QS^c#E)7 z*MH{|9vpf73(Uvp$njRfBigABY>A$QiA{9zlSoLexqDgs&fi1($Kezssn(ItnZjX) zSw{x&eCUO~6A34D5V9eYpW@yy7};V-8ouyD5J?CE8i|;vZQvy+{zFCq5M>?wkKXas z_(Ks@tzWrhd!4?*&VUM7Nl_{GikcB>7^8s{MF2qaw5H0;U+=(%ZjVW%afVnKt!A;U z|IR`UkR8mtYj3D@fumTENYGGjipUh#$BskHiWuP@{Tes87Z2*mekA!KlaC?SJ+?Y} z;^_$AQBdR;0k$^<0u>d966KRrNaeGe3X50qdKGj_HQ*jAo`@JH40F{t()F>wqU(c? zRvd6nMz8Q90WIHhBM4B9@1hPW3&RAB8&)B8^n}!b++pb9NPp75(?uVhTid1&*;-Mx zWPbztu&_NsAAgg3OLR-cQhM*R)U&-5QK4+NgG8doo!`f!9h4yx$s8&5&~I^kF2;yw z^wdvU2X_;Q>UfcP1WZfEDt1COE1h3?8lUjKfh6VvT(U^AQ1WpRcXMf_*G6EgRXjkGib=&8Y3-(2 z=TFi4J)ZbsRP+Z-o`CZH>|neXbUO&OUjJW*Q_z2p?#6;n*t)18jiHD@a?XDR6^2+8 zfvOX^9j8*U#RLka#*awcQ1_5P{g9DEYJ%jB$pXvN+HsE@Rez{$B{tcXL{fF)LhR1) zRuX55B#c9`yE@L1i9kB;q>x7%S93va8RHYH*=-{_+jTLs<;2z?_2<53w+AWqv@>MnP>3UUZ7Pwilj^*dcN}{|J5M zVI>j;-MUZ4@9W%O_Xj*9s%6lj5D~@8AG)Cr>d2GENgdP%_0~(De?l(P9Zzyv7SVZ; zE=i;O%6S>MgY)7kfL6AVIvnmJt`J{vA7VF=h!x(aa=4mg8WvJM&!bN|YyoBBG*+`g zLMduUDb>*HO{A3St4Paw2>-*!e4Z^jQbEtL{xR+%tf@vFz{rDT9f_##@tN&??9rz6 z`iY?55XQBo$54Cz`oW-e7_H52*f`F|)LRJq2->$~R#~GX-V5Qj{|Y!HIR-p&#$rdEDIV_Ds6K=Yoh$zVeN}7ax6Y#AxHBi)@Un*vX*y| zjRkFHC*ghzEkDFrx#ZpY17_f5^g$3U1+FSnl9)M)t0B3QLYdG8|I1#waKOkSyuhG> z6IuK|B)|S1Dj#W|#F($G0?(HCmLS)3P~zwoQmm1LhqvC41jP(W37OuE-Rl#+{fgq- zw{X246Tyurf(UMK@+UE>&%`8W!b3W8kRT-^V0@w6a70}9gsD$Z!NY`ND&MKr#IDFC z1Nlm?YJ25q;7K$buct-Y?kwm7QN)H*vb#2cnkbo>h;|bdQG9!m^F_fWk#~R;w_=Y2 zbTe1{7WPGFs=LQ8m<>e73GUWU2H}Jl3;23gMev(KXo~oa^U#ud>P{ErJq4Fug zIKhG_?tn9NW-@nRsIT8I`5CW)u`!cEQdx~Ggd_YLF60<02+}7LS_*tihg=~l>d&BK zU~!2!Qc3m0TI;}b770r;1K+5;%;~4-aA>-UbN+J-{B$(ZZ9CukyyN@}HV#IO^YUC< zsU*+q!IyC_!SVly3V5GxX>=`FI&={n@>a4Au7jG6yQ5ZI?&`RU7kjpnkXa&^J^{v~ z{j1=PiR~mY`c5A;i&ZA5YLHP0NevX7zIU9GYBjr+t{-9lPhzkXp3_%o1<9+AnEsAu zgiHO=$YqLu zf~D^w6}X!4`lf^elm`(`3-z}MN@1*pX5sV)MFxeC1%sE{c_aKRBMM=@%{&jj{yBaL zmnV;j%}G!H;M>k%b6A3Bmxw5 zZR^JoMTYw$QJAP>xGmuWoxotXLL3Ppqv;zY7zS}I4!}=`jU0r;7!742Q@FOy;X;pH z7aRhE&;+yVm>1#NozyT_L`ZZeT0|qv)WKRS)}*s6e@7#_PvB<6QAZ>U&>5H*As<6| zTo+(cu0F{;>yTD{O6_w#TdCj2tGNg$!{I`1C|qxs2&3;tL>Tpa5neKjJTPCzV*ljd-&_4*!6yPKN#l2I}s(jW#giSw^fY z14JF?hrC6}@1pPrb}$H0zx|X7)%rT#bT@*1gnv}F0D8T+`J+7%fsyZ32wo7G zm+uL#?0U1NM6u5)|2>L)QU-Va9dC$i=C;V2z0SWy?Y~m4(c1&L_A0F=z6X=h64c4{ ze(2=X&_^NZhH!^@jJlSBv`hTY*319L4eL5S%oF4BO;HV_34j!I*Wh8La059rTyt^b*kVeXjTgO?N1dM}(qX=7k;*f^-a zz^HHkkB81nT2=0pEQf!rM43F856BX{7nH_3ip$V({1h^&@hhuV$4D*QNwG+?$gs$= zVCtsR!{QfF`03ykc6p;+y;|PSM)A}n$;e$1Dt-zf_J-rC;JTRM!|XT0LTquKJYw+@ zzC6IYa*E`z%1uYwWL_Tfmhcx>=-s{o=rO7sA02ke;y=RL*I688!JX{b;)rmNMWFtC z%RA)g@=|3Y)_W)e@h}FF(JR*b3tA=((+DAF`KKpz{IP|2f3|-#_DlVVk?a2(ydZ2P literal 0 HcmV?d00001 diff --git a/sbsheriff/Lib/site-packages/disnake/__pycache__/stage_instance.cpython-310.pyc b/sbsheriff/Lib/site-packages/disnake/__pycache__/stage_instance.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..30eece9cfacee40de42b0c4fc94944bbbf2ac4dc GIT binary patch literal 7994 zcmdT}%X1q?ddCa~AUFgck|Q>_%&xbA9Qy`^i^PrK=^ z(K5Q3Rt95(XWVRep|#M>wQ_2lbr-v4%T)aZcd46i#>I`@QZvt#`H5 z{S;r}t6!w}s>r`cx8C7vja1>BeF#F#W=F6G)h63<+M?$Rb_0WgX_meIsdSDy0lU#I zusgSIe{}QCtvk0_-R}2;;Va8`Zr|)n;fr3twj94_e=gXTcqUx0-^HA1?g`m-eBbeU z%<)-ANO5q=j-=fS1m9qXQV8Z9vUbOoM`D8o920X^S_JGjZ0pUAzT;a1D0qDHe7@fFQ*f4>F3)^K*56}dQ zm)MCDbi6^pKu#c?Ho@4yrnWoabccA^b-GT3!KCAgS3cc*;DZ9X=LYL~+&QFgp~&hF z4qV6YY%uN+=z~Fkojy$})^C`g<3mp}U$`zoaBy!$>-csXidJ9&Z-9TqB8B&)<8_G= zGob`5IvmIzP=YB$t_PMWjK`uK&_{-&w)!anex2}Mh!3Oz5t zRii7A0MsQSsg9QXj*Yt?h!Mkp*Xfxw6_W$%1_yos!8_o6-;)a8ESW{%->$I6?!D%t zQoX{e4YpU`{j9oG*<#m94UDgCut(MA_U^+b!;X5X)_lx%@3B(tG5f1(ZEJ&7{(7%o zX*A5;I;%d|+o@JCSFM$I9&S}@_t~d7SKEcwSE23z+T3M?a0IGaX%Mgnm3ny_kV~Id zcdE_D8|J-gvj&*#9)OnEUa8)!mLKkv>TK^}eQ&o>0s1X~tyOFH>cCQYP^mSGz=}Cm z`3wWr*e>nt5Gu3u5Vx-bPo0%__a4`)_qUsDdv|B6g2_)SxLN7bol1lXM3r|+)dw4F ztMs6BpKe!YyMR(RXTO%^cyR~K=!wpbbZze|{RU4HJR;pJU zxT<-tz6uqPidEjOlp(YGVQ#li+F-liXtZ4q&ou)3NbE`HncY6!A$t<$0(okQ z-k=L;tJU5!+jV$J9;x?^sob^=6+Cc7!3Y-~R2xKFc+NT!fo1!a-}6omT^Ofuy=}Mg zDlFgi0;?}QXmW5GuELu1EG}Tm+GI%pa9LfU+9Q>13rytIM7aY>go|5Ov@-n1 ze3`GHm*pFLjh{nrLFD-P7aG6G*ZIXSj2BvKQJB2Q-{P0mXbJr*{B7*aWBx<_4u4n8 zFN+ni!msl0|2EBU@gMT{zsR;$G5+AU8o$kN@B+qb{3?9J9l3%_+5ehOrRu~LGVngL z8MtvoZ#?1(z20~ZCY%_9HB225Yw(sCKE)z?276BO~y?JJIWo={@iB{e8UOs+|&heWq1kkw*%W9-DV!l_uc>| zwE2I4+kryfcn*(BDC19E1Tf4n+pxdWSN#Cq5hq61ECnM!;j7~}laCrYe3NaqU3k9D zeWw@fCn%cpz*e`4YJ(EW_@L6->7!}~?qeRJr-L{yUiX9_rC61=*8AHf6JyNF8CuLfc%+x0!RX+wK9 z_ltAywjUiREQVPNSOXF24i7VGZ)lDM8fFx0!{sRkhL#zkJFW(`efa67QWbtRM7;_lg}u4nTwE7g+;jhY8*O8$X9uuCbj zpY&a(i2QAI&a|_Xl{(YWqW7hKmi|gZJe-0((`tpZynsClYq($y`oKxf!a&ef z z0&%l%w?Bui^q+u56c&G|L~O;Tv)Dfka~6h9U|COr%+I39YFTYX8(x~?L^0mh*0Cl2 zP@g!UsBfYZfPSuBNxdL0XlkU7Mmko~S5lZy2S$*=$iNEmDSM`Uxxh0#`xT9H!6Mcc z)QYM2maEBiz?PS&d5fCMXu^wgmEfKvDHN8%G>p>hxdl2*G)558@XYcG4VS1<2X%Rk z`Xm9x|ET!^4c|j^fPbI#Wd%GkwKcT5W@zRghZkq~6$v*?!&)R7gL5g;o<;mCp1qF_ z2d|D(ze#aWf2{pR=V^TF7#sLbW1RWjBD5!48=n7o3I}ue-Qhyy=k5;kl)#YpgTB+W zdO3GrYM&I0hz&~B6CQr8MTC-$jcFuxknpvZg} zPhX)qjm?T?a_U6!mqfSzl}0aPxSK$UE!8Bn{imCZ+{%c;$UFE`UUtSaj9yx6iGr`u zu}Fb_4D>US4Hrf`Jgh0ASBzPCj&_8`f#o z?{Bh49Rc?yDH|JEGRJj-QzS(4Tl`*Z=4OM4I9^mi%}3L&UNO;UZM(;M9&^3k5l|vQ z8e^R_-owXge{B7Vle-ctON<@|sVW^iaiX+KiY|;YWnIih@`orx#9`Mrq)K0Fp$VzA zKUW^Dpvz^Fg?fNw>04j8rm`$Os%HHIXq>Q56+M@HpElJ4`m;IO#a;&g6a(M^`_qqJ)K{XnvIC z@8c!XdSM)&Q3yhQPK6+?3uGM=%A>e(uD~zOjjaBjgir3&%o!9i%skAwXXpZBACADv zMwM+m6M5%91I(Api9F##$J#-DBs2Q|XNtOhiNP;4C-ry686u8>CYKO{8C?4qQJ5Ov z2sHHc7rK8rKwkSo`=uHm8_=ffL58QPN~(;tew@Y0EKVBor_ip2zPL#g_FHsiM{{X`AC*bed((Z}?5oEF}$>eS(Q?JW$ zD6l8@`^ux~iIXVK7%SLRq&_xd$|USf)KbQ&&TFAh)%QGk;Glldn*vPwgW@WkR2no^3{{yW>gG^BhPvHs z?p2<*g(`ndK_=x@mG2qJvqKwYZPZqXF8ZkVJG?bT8A{*6<&kE?s8J~yj*U&~!0@w% z2o#3tlT=|=h3Pl*YQ?czQ*pi|b5biTNs1#v)A8f{Co(oU%*vloLmn{9psF_zDo+cI zP7w547l?(Fr{eu3M=6jlWTF^4v1bZXxX_Q%#@Q&-AUOYkb3Q|(|J-0XJ*VY#Q_CTh zAoocDj+rs^A8E!Phv(IsNrEvtjG&!pNrD^7B`C0>@Kf1BhR!ckK5?ualYdN8KK3ge z)=F2_N=J~Bw*MUmXD!v1aA73=U)ZYe^!0N^_jmIA-{^ft_}}n_DxuL6C7UsAo?m^W zpFlZk2=r75;x900U5t>=)$LItO!_vf$l2)FzhKEH)zg1|b$vKpIVnb43c0ANFHude>*G&ja#s0Sox zX3tUH+k=<1tkAS9{BnjOI{JCbqO$F1Wx=xW;~u6LEmgYrkt_d@z`sY$1~qwVifF=I zT-R4=jQkT?_)}`g2+6zD{FIvO(~T-LP=-wO`ZUU=49&Q1=FN<0X4831&*U|8SzkqO zg)GL(f3E*T70PRctFnv(L_w5%;eKQt!YnK=ltiX6kR-4$LqB5pk^Q5hNSGB;deWC< z48v^Kc@9G-sZ0@O27%-H(X~~XMA4{BB^ZKV*MNm6maEhx^|XlCb2O*wTBHH3WpV+2 vG0w+{PN~#j4j01Q$B`U9AuH$8HY1h4vZk-;c`dJ9)(qWHJsRb;_4I!O=^UX} literal 0 HcmV?d00001 diff --git a/sbsheriff/Lib/site-packages/disnake/__pycache__/state.cpython-310.pyc b/sbsheriff/Lib/site-packages/disnake/__pycache__/state.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..3b40705d3d00ddd7f21f771723561b5e06216645 GIT binary patch literal 65747 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 Ytq$}Jr$)-dpxKX&MWR{#J2 literal 0 HcmV?d00001 diff --git a/sbsheriff/Lib/site-packages/disnake/__pycache__/team.cpython-310.pyc b/sbsheriff/Lib/site-packages/disnake/__pycache__/team.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..a87a594cdf0c37d3cb0626a7bc56a81b0ca9592c GIT binary patch literal 5492 zcmb7ITXWmS6$U_%qM*AkNz_R*Yxfedr5W34rme>Igr;bV6N%K2R9qwSz#y;`;eZ6Q z0If))KH1acC7tPWCY|=t@BKA+?Nk1OUfl02NJ6xoy2VI~-No+NbIzXq&bJJfmJ9{Y zzdl@dzP+F*|E9+IM@QpRMNz}Qqv9&2;;OFZt9{MXRH|qEOkX$ke%8$Pb7l^Gx|{Xq z`gt=i>p6eEZ$0 zA?QT5H}D3B%r+dTMI)mg#DqaNI**m<=z zo^iEMG_Z)vZJ&7qNaJksi5+=SFBnA(=0w7CNJbHZ9Dn4J4wKKm*Y}bY44N)|6_Vzo z5EhW0Mb-~ouS;((%^Hq6z8Ch2%=JigXB1&%NS)I4MFVzx6bKe_-zNzk^p>`!+7+d( zSOvbp`ePT#b&q;MpDZz^mcT{bkr-e}IEBm&;4-=56YfORLz;I3-w%$+G$$Ci9@!gi z8Zs{IPVkgVTar*11QAqCRG2*?KK;p*S4x#>}t7%_SGVLP-|~D_S+02n&o=?A#2=Y z<@!VRS*^ZRWYs_IHLI$ z*TgE--Doi%VvG=f9yT9FL+l`&ADmw30p;`Iv zPBmEyMpbsowcR4yD({x>lXgwkfRv^|!xHV-gY7DH(RyY4Rob;ioy@2->g^_)MOfKv zPp3YpwW>u{Zq`~*)wtJeKs>n6Sn`OnoP=$BF_&o zJ6jGz9u>6sVw>CjUEc2iAbQ@g1&KV)N8;GxgHazN^LOo#?}uEVzETMW1H?OI%7K`# z)BM;-r8uPD`DY5`Tj=GAsRGP3S2Z)PX6o)Gch1c}*UhYZS;DMt=J=fZj=SuxJlCJ8 zW*)6~-8J`uY|XnD0k`joC5W;+FsjMNSQ+9dF#sw6Ai=5#df`9{X0uL!(=CFho{K{S zumr3+fpBp$7@l%829QuTuT3A>^xRFh>G*)e&Bxv#dMrC>S{vtGu2I`6$JQz;|h)Ad+ z)yEDXYf2^d6cIqd;=)Uto9ssEV=1YSi*puG24SIjZmg3Dan|yHaB+TOMLahaA7|xI zv4{wJwSo>C^E~?I)|IVfX5Lj0D*3utg=DdYBGyT1b16|8xrO}i z(8-uQ8Y(&bUnGrwhRUIGsyv$ivl>BzZ%lZr}hZG=8ovNOEIa`^)>=zPMAHAkN?T%Fc*Qk*4 zt~!F3UA2X1e?mr(0lNHxDF04}5&B7GDt20#Z^*!}u zUTz;Pd3I^4DD~}1gnHcxbkwC2D8wQDU0`(1+#94Xx_sJI8%L|zknYv1{yADAzq6xi{uznY{7n-HsMi7R65QPZ6E0`jFL-X>; zPoRL&vGldLP9M@poQ9)JeAnj7eRpoaFpJpENJRUV9v9D#| z6$zm8uJL>kS$I`mZ;*w*0XCa-n${%D*&jg4`D~jczXb3oso1h(oKlcZ5EyjV-~zdX zOiP$bl5)ox$K{~|?#?mdYj*oKJ5ImSh)Rz;Um~h;ML7b$MreWkOQOQ)rozd&vngyw z;FbSZAn4Rvg!b&PxA8Tubfn(o!BGTmP0!(2N5m+N{z?6Saz7y{J<_QtiXnMjqWcbf z*7pWBQb_9UHzaSV{rSSnxluJ~OKX zD8QWwe}~>vK43>Z6a<759m)3;fnCtSC`>fApMs5uP4*hd5LHWA6M;-JRBqs_`%0Z9 zRtZKvs3d3gU@&$FNM>qGCkXtM{8%{Da=zjgny}= z3I0KbjXNg8F>zc-Z?~ZwBXQ~#tc}-Fw4cz$F>(=lNvcTg3?bPcP&q{g zA-Wi8r^q27jL0USiMUs+BgtBziO-ZLAd2V#adh?X=!YXBh1t6JJ?0A%66+K*fb}Vr zDa<7*($7<3o{DsEHXOkeiQC8(k^+&*>Esux*r1LSu?ge0_(JV=_6K?Xf{ z^_tSPG}F9BA{H>eGC}d55(x1Cx!rEk4A^LN2k15?sob%%zzlnKF-@3M(yHxrQ_>P$K literal 0 HcmV?d00001 diff --git a/sbsheriff/Lib/site-packages/disnake/__pycache__/template.cpython-310.pyc b/sbsheriff/Lib/site-packages/disnake/__pycache__/template.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..8ba9dc53dc1841b3287dfd7a6bc90c108c60ebb9 GIT binary patch literal 10845 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 literal 0 HcmV?d00001 diff --git a/sbsheriff/Lib/site-packages/disnake/__pycache__/threads.cpython-310.pyc b/sbsheriff/Lib/site-packages/disnake/__pycache__/threads.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..31adcc37262624b94e887297f82790b9b4e62e88 GIT binary patch literal 30529 zcmdsgd2n3Encv(P3=V?eEy>c;VUgg1;GxTcMOhF4ijYZ=0YFO{i5Wc1dmsj!1A1?U zAYjldS=wD+vSsgjFWWI$wY7=1Dt5Bj9Gf_&Hm8%nwvs<4RjDMdN|p0Rs#2~>QcP-@ z-|y@0_ud>JAs?yKf}Ec2_xk+$>+kBXdujs%xfuTb=xKVl;Kmqy}+SS;>u z#$z!jmXA4cCsB@968S`&@nkufPs(>HpTc*loUUZ@nMzN-r;^QQE4}&NN-m$P^yT|1 z{rP^BNjsVHKxHsLDDj^1uF6n;sIoi1yE2>~uI$P0k>}a+-paoGK8g31_g4<&4@f*$ zK3F-FKP2(K@_m*2^Y>RC$Uji|SpH*`2lEf&d4K*PH{<<*^vTLwXm0@RJ)D2I@<{#> zDK}VtwDMT~vC7BuAFn)~e_WpJDj%*K$sdvUPa@>=km|R zV{X5@+kJL9aVVBQ{Zh<1;2eB6<{Wef-9zuB^3UMOA?H3kxew`Ne%wjU$42hAms7D= zZehi>&d)4Z=SoGl>buqvBt~+%$=ce6SGuxNw~iD?tWzgWK6UKWiBl)7IeTrbzS;5m z)X8IOp6k2Sx;0hutM*mbnsTqX<=R>W&vLnou2(7feyLWqO1`z?dhXJOb;Yx*b=MiS zmOaMONI z-NJC{Ua81BMvGPq0el&-19Ittn@0QD~p@e?RSi|0p%2?3~V1xEGh@{>1m0E=($ps?; zh?W~(6-@#t9BvIDlNMLqVx3Re^W|E(TwCYRinXd!;&}b>oZyAMRJ-QNSQIK$Yjt#0 zb%7Hgolvu?U->IG`o839fT7(|HOEJ0I2c`H$**JLOMv}a&6D=phdGA!&rVzO7tSoa zGBG!8&CFXD=PrC^W@>uMdSqfA=|@JbS7sK@UbwViA;;Xr?80l-g)`Q~>}%GiXJ)5H zt?5@U&P~tH=Pt}yGv_a!o0-P5nc2y6m!@WBU$S0Ax!DWA`Wc`*DqXl>u|Zwc%=A1f zJ3l=)c@{NKyf|}iX5qEb+?kn$S=4ErL8TMc#fiCvnaNA%Cg!Y*m*y^Bn4d=TQ>b=! zX7o11y*?1FXn!nvtw zJbZB)J)3y(+_Y*6gPJ@yF>`*@nwmI2@e+GCXI(%ob2(;Hy|Z39JIzOIZvy`(7iKQZ zau|~rW*6p=9K|T-7J{O$%*;=ZS`%|K^XO{s%-jW3PjI3HVK&Qhv(u^;f?5C+%m}g& zV3#oHpf6L?6X#GDrf0S#^H}c3WB?=aW}jUJqR6`RXGeOP0}HQRoGwhBou0&`z0}N3 z0#)p#vfE5eVdXWmGj-Qf>2p{z&FqCWqKjQ_rY}_y`7t<%RD0g_efx^btRtyr-{cC~ zamx!EYi@Jj!iwkG&V*N7DP41?8lJS?%+|e)f?I7=n!8M_P_GqA)jGPlYqDGd{g}R9 zbfrN&>eqFiDce_kq_byj;JRwB=lsk(f!N$#xZ>6ewqNk8we{sPs9-a5)V;qdM2@SKsH|%988hdGCBs!9WmQKpi7VbPh!BO3mBQJ!4Xx(jMH|b{F6%Th^@VhrgG|lU08qlC26zf7oX70(QP?fc z%t*>RfT?Ic&=uI{N}R^BcaT{I%~0#MW7q8>p0)h-BJ~2rgFnIKy0Ls5B0|E6LnKH* z9QcCM>*U@|<~eZf0 z$-nc?taIVpJ`~`;opt9rVvk|$8_p(TA4ff(MPI(^l57&e9Ih@D{k?sZpo@@cbbIZ6tgQnfrCGy+UN`ly%a>b#1QF1~q)L@`-6{hAD3?a+SAzkJ>xGKq zT|2FtWgt)rzhetpKr~N81Q*FJ7z-p2l(08~E*=Hu9);|Mj#CJZcC@5wfgXaNM%J5l(i;WPzW8fw51%OKFnJydq4^sx;8=bsIA4l3QPQ-72y` z+(etY>k1o*QX-K@x;<<+j2D!>yf1fprB10oB=)S|tHA=a&@PMAgs{GYu|)&k;5wJ0(P+ceo_ za0^0jmADaE7!zh`X@u|$FCY$V)EW?z%FEESmYFyVy<-&!DyzoO$#8a6XKIbIW049& z->|RQB@rD}CR>Sn5yG-mtCd5_^2&+}`s<-frgEZ@DW&Qt*NRs`IRkpJlNwYRRlZcc z1`QEtd9Ny}wdyf0FL1gVAYa6S1ktu?(!;iwZA&}ARe=bHP+qq;d~0!W!E3mSi_q>o zOZ3j72EVTX)PS_B$6Ii;R2+7+V`ZBx#EVL)3f0xOfZL^VI|xxPu((u&B)<^=)N-(V z(e+Z*h7<{~Y^YvvrC##El9@MLKB4j4^qMj?G|9?Z z*lkFZE+3DXNI2tMWMV7`ijhpMuYeGRNC2X3aKJ*<^#&-1?OQ@~8*8kT3axc%VN&&9 zQFf8$bx%5$y6H*SrI1(bs87-Z!$P8s6L@CYYgIzftO1#I#mIn8n)}$xkiucfId$sT ziIc}pJliU6bO;MiDq%rb)LN08gm_Kn=U%hZv$YBT?f*scti&r5Y_-{bKpi%R< zUQ}ai8vq2X1*LkS@Bv!!vj{SA{u_*M?oy*4GdY6sBU6m9;O9e*KZD5I82Nn6djV1D z@dt75MH80?-V~C}elad+LFM~+;uDgIw^H%VJ*GXHA9Rjp#uG)OnS>1A(ScnkDic6R zIq1M@>{|&3fM1Q{JBjZEzEk*4;yaD+6uvX~PUE`=-x+*ozq1SaUGMB>-*c)5R>?WN znGx;a^k&vlsDFAhXPM=|rwWJp)L`-H%^tPK8ehqCGJEfNagN;4=0H5`3WZoqcsyW z5|@5;ZM&y{C4#2^m`x`TWa69J+5t?ES4BQHe@R4$HZl+Y0g*ZuffGLzdq629NE!NyG@tnj5 z>VuN%yA_vqcGZV&?v^M0EGc=0u^jiHm4QPsF3HUd;)91`HxjSJsspK5eecF{92m{T zirV+RCX04GR^Pvcr7eBg$7MXSYgSF{D2A#gRHisZ^5PxC!{#1HKyE=S>jgY3PMw96&h6!=JT)%*-yJ0)1FuJypt?Ui`Pg}EoZJYZ;nAL&UzDg z_5*x;f@2W$qd%UD45){1Iq^2DaivFQwRcu6$)`}g z_cQ}8(=*k-4vs1>!=T)y1V?IbD{H0R0RQ1qfrEndE?2CI!q zdd!d$1Kl`k&%$D-Sd{OJaAHpgUN>lb8d?7vJ_3!w1dY5BNUfz8MwMY_k65ruob#n7lrqke~8vPKX=|Idt&>(B;J}n1SGr9Q- z%V$KGAKOek_o(+WIt1xT#EUNT(d^L$ZzG@g27+M8m>0v`?RZ@w?L8-js0c1D6LAZC zoTzB;2S1Za%z&bmaV{pTGTKmfJsPgH0joE170w#8{Mv(8f`(?&$m(^hKh*tz#c1Ji<_It6ViVKld(j%y_tm0|l5 z5MKe;hSfpzbQ|UiZ11K}AMOxKR+o{x`cmTm+ z)t__ACEA#*GlVnNLjYbjt8okt7v;6(MmajygTa-VU3gI-p^*T@5*pV=sBp7=G~b3JV$@z###+K!8(`bi z=GIzh(-l{W2$1v^OVC@r!x5wd)G%vMqe#SB$qtgoMF-h2-5utNIxH`ZY6PcAHYs0< z`kGfNoSxLKnB5;8YcEKJp!dN&fr=M>fBR4{khVSHR$M2q<%j(7Cx%nph*SOnx9F=w z6nrQCd8Ahpq_y_*XqRIzVqJ5i*)V#+>^43a?vse=7ItiSvk)Pp(_xoHiF4$ z+iMS=n;B?pkme$;9a&*;`+Bqn+BxSR= z4_=gwssMECvfu^~f^6R#LeR{bqDJzSSD2@WPV22A2{$xtV;Ia*9|&y>riR-C0Wv`O z*&YGB6;y{w{={~ZEW1`<6s`ULb2rblaEF%I?#LFI+h7BdIcL3+05LL?eP$l8kLO(t zCQzo5<{Phq0FHfn7I*1c9MVy#0bthU(gCac9Xlv}vL4DYt*QR3fyeoQV`N`lt!7~F-J~29nMq`Q&QLzE`H17Sw z)sLHa>ySk#oIu~Feci89?1{=G=mzfjL#8gt^C|7n{&G|Y498aM~WOYt=_)QPrNL<-rsxK@Jv zNFhc9${M^-1ua%=>;f)vtJu9xwo-za62M#R-ar@dV994TYsb3m?y8>ni;=#JE2d#l z@eFqdTDSOsVxq`$@cBVKtb(enEBDTo{DRK*Du69&U4Mve;oEHi?fGa6!2NgI0k`Tx z&FKQ!$a8|#)_Dvd`9xE6wQbG^QbyxaDDIcW+%Y4VjYSmXF?63LD8mQ)i$4oQ`&irE zz}cf)Tmme;1^^QX`T9i*7>TO}UwtlG;;WW&;3fxdxS3b0k9A#1h61YruD6~-%s3_F}RAiLR z3h=SGPx~2xx~hySKkSa9YIBa9!#4WIVv9v3)Iu)Gwx32-ZoR_!0dkVPybNc*y1IJ-AoY5k@FT8edpCy`6qyTNeh_aC zmabHxO$qyhD|s_nTUx!nM;W!0)nL@3YvpC{v#7*-1c4YUStTLPsR{VcV@L=pV@s?} zU{9{XBD)0><$Dy|Q}zZ5orOe9hj(cC#^WAVfm*pC7LjG(w`f+{zw2{)V{1%xD^#tJ z&xj5|9(FlOL+9ZYZ^%4+aB4DnLX6Qw32s2^)krsdGJAIeh{63fcpj~|m4KQDigT;j zIR+gJ)J6yz6wGUG6@IyBQ){OfO;7{P4pcm~N*Q!IO2I;y_yv@OvyaFXK^<+4M-bKa zu)&M{^L8zU>O@c+vpjC8S?++HhHq$O3_2)K?UY1OnRe2b=>sQ>^qw318a8k-f)@N@+-y6=dW#4|+uF6IM&8MX}(NyKFbgw7t{En$Y-Y7h#lOAB92s~$@SDHfOwpyJWjn}F z*bm9qej81^9p`>)9lK%6*t7Kep-y2(^hTUJs_(#1ay8-YbwFixI*If#wSlynxF zy_&&R5cbKp61NgF&=bybM>H&vx|;Hysb`%uO)U=g)ZRsVQ?Lr(;BGrh_eyDOE=5a^ zWbOCR*)3>GwXJZzr`$5g5m&J>78?kJB-6(UrLqlrAJ}5GnQIJgoG2a6yDJAB=u5fO zC|`wxrK-Gwg;!dGSRT|Jc3^^S`)e+aT;Xt!%`;DM*a0=^>b~e(@Z}OxgQeDDr37hr zFgZe(wl95B6{ck|>`s7rs=wqCK~+NH#G(mt7esy?=bohf$N*V@8fQe3cn$jp(B3G7 zL^FmJ!3`~d24zJ98B}i9gAP%Usg-FAmDW!_X*qPt!=tvg#3|NrOk?is=AUZXS&S@6 zOl;61#(}mlu*Qlq&p?ufIQ=EvbmtWM+v-p}?@aV%JBZ59>C z&fq3;f`{t7sYQA4l3A~>l!`0pq9U~skVoM3vr*M9&a_w$8e?cnY?<4T_nfJDOC@;D zR|61}I1)dia*o9*~{(d1clw0t<}%aqTJF8uyDN+ zR7)DQBkhULAWqys|K8Apjj-*r3kw&6vrR2EPjTgQVj^|n5FuP^qikRHuV=j+$mWk7 z1e+%&vBrdPMy4WS#kitHc>@oOb&%q1HF8j|TVv3FAno!_r zezGBBdP``nnXWfL0Gr9OTUACTx}h~wG|J=$TkBL7-CeB@eZ%d3ndNf2dDsYXcscO< z_uIzeeF>Sr&q3UWNaC%*N3-$%L<*l={9v5lV1|hYLU!2JruTUin?19D19oX~rfH_J z8&$m8%q+QJz-}`wzM##F?Gd+{{iIbmiLhMqaL6vjIrP4QD!lg)+&(l3$(q)g*Iz%c zchW|IthMrG@2h-&Ah0_JWMBc3+-2`;tm1tJUuV9-AfGDy4L%$=2j~a&258ZPcQkGC zTUhiWpz$_Toq7yA7QHx$op=`xNMM*ilC9)cYAdsqh8mQtvsg-RQ&dFdiRE-RR%y@s5-2R^wa!HwLz{r(&D0J`r;U&cc`D z#^6@Y83dzW*y_b0vw>fM!_19cTLW9W-id=nBM%rnTT0)|I77FBXYgknd?)U|_U02? zgR4DTeOF`N=TXxTYAU0q-G^c~v$tZVhUzfh4PQ-rpWEu)%Jre%?b?wZqMm1BH*#CO z5ElmNbModBPsel(x9(QMRxf-4R4=~Q*$ciM*=zrINL%fq#>EB>FL#qPgy&(EyQ0g% zFKOaZ!+QaZz}_4XIwI$&bl-13R%WZ0;tTRVx+( zh3p|kGzYS2AoU>fROP%_gn^J~|J)d@YCY@`w#vceMDn4#yDKLdMDsn;s6r1{J_&qb z%Tbho+-hDtLU}FN>1<*Bq~3;L70eE5gx3IGVQpm}>bGpDQ{IDd(<`BCrk|EB9)ZgA zb$HIBgFzK~XY5!g<4qZE0NDZhSuhLZI37+WX8s%(I;D@U9;u9sx4dBvZD_5G!Hly4 zkqO83igLVmjCx;tO_V$x>ok4!#YP||h8fNgf8=oFgx=2NA?Zq&qc7bzmAcCyzDxI4EFuu$D=VSc&Lu$h zt4g(uE-FKb8P{x_=uuG+U}co#)h0wJNeIZst&o@-l~5D)#mk{>Ld@WuCW+-nRn7pb zeHx&d)Jg28p+TKU^U(oikI;Pzdq8BEf!{w5g4KCLL}(v0eZVaa=sRzAfS3=5aU!LBZ-6aqV1_8!epD7l+~2{N%c^E68QjOuS=*1TKSVl8+K5O;C$ z41_;9WgLk?*;}Ohv+D2sf=;@_;i=Q(legba&U7ekRRET^YhdTyXaRX&0Zf z9jO)+BevBn0zll$jwRxv!7UiAmB&!)VkSSOP~W0*DsqW?XFAoPB4o?pk8yrP8KIR( z`GCzXh>Q-`)_3u&Ou>p`(~0}%H9jef~y@eigIH&iH&p}@PUFtP#y>d!{*@z`U-8FMe#n`nN~0oMJl?mEF`qR+pc|>+Wxf|@EER;>F(xe{&5tnA{>vx~a7||8 zDd=~ZJ1IEJK9I;I22(@O^LPp%1yE)aiFhuNg)=t|p?C&;FpKj5iT|2CG?+j-o&7(< ziBuwRvXusmYxxssLmi)?TfREyAP)Q2k>p7s8y77pFZ6C%315%-n+GSV8)`-;S}#=b zSd;fx5JVi20Fe+Qi5A>R=lx$F5+naLB5&iw*9{z1fnFE)29(hi+DZI5937Eo`=Cwr zItipRl70w>5HdKb((5GgEGf?pLj#1)hjdEP$Dt4QI%%ZSl740@jdTX-9!b9p&5%c% zV066|hc4B#l`G)0nnA7}1;BAnb87tN_Fa9rd=y4$fqsAoZyFhXgM45jGkflyylXSp~! zZ2*D*3g%13Xv~>+8$r+nd)uh$ohL^LM%N zf+8zhhNprYY73l_^i1+S{|rd)CZU)uFmQJ>&JZaAzXMgDr2)Ic`Zx=m0|OyUE3}Ak z0)sQ6JE^bjz`5YjM?H4iyY#ZE!74=l$V7qMvN4!K75A34BfQfZME0tYfPO_t@ zIC`uJmo<-L6i_YJFa#N(joSn3Sk+e|CYT-c>gOWL2c96J`v^Y>iA6YZ+iwd@2O|tf zjM)n1ZSJ5XO@r}J-o`zEeC>ueQd;dM~VW|?ZjG&xxPotp{|;E>%Lt9R`AWX zSmAvS+2IQLh4yJb=fdfByLrDmD7U8{tn?!dzQ4?F+;jA4$@UK;!_Ni!kGyK8$Pm3l z7;KCC2TF*8oh%RwiPi;zjYs8%5nUu7qEI`uCLFoqijB}}^HEkyi&)&UT-x^d>B4p9+zPx9x!Wj1(QctX9S_oI7jOumCnR-( z#^}iAh>55YoN!N?*R4n9{Lc@n=@AkNQ3!{4es6q}IcmYUz%(6q2$I4RHZ; z8odyb=b(wya)392%y%bXF!pqM9I`%K-@R5nTIs~}o=H*6Kfd?!~80EDOo z0H;9(It1J5%DZ^V+&B_UWnGR*|Z=`;=D|Fn>}Cx z0Bu1xZGq_|s-Sn6q?26*i7DBb z+D?(Vw*uQPJb;d>og6*W(f!t)k?^11z$6VTsu`}y|Bo$90ieR(25WBnRVy=Qc!OR} zhBp|Y#QVFzh*k;Kcwy?Jb}e{H>}sRS9=8Dx6FZ4ziMJly7u>p|y6t_Lg&s!GRd4{- ztF=lW#B!_>zmbT`4Tiu>a}4W4Ao3)pTRG?(QVT4JT(*y!SkT@1r$OW zofEL}0s;w^tFCNbuX$J1CQImfL+wrMrQ%P{JtqhQ+Cw3z)`3v~zoWv<7MzISHYKii zn7BBD?V@tqz33e`g6iwTITt&_cs(!(V)u|*LI_Y^QEH|o2Ug`*Ld~HTRI5>Sl~l?0JKN{d@Wo zoA+t**d?P}8P}mpp|ra0ie9q3I&&4_Dz;6-jr@e%qtmh;=GbLmunvT7_Z6tHDaL$> zoucT0Q=vw(j=a9TKXBny{Z-uXa!2pDw9ri4=M6~g8!qDlJG(_s?icU~d_?Z}Nv_q_ z3{Rmz)!8>>(0zN=^bN;=g1&{XM>6UdJlz~TvHm{Bm{?msg&2grvwSdv08IwZP5iKW zE_t|1jpq`7JrchhiQAF58;R3n!;~#Y;?+ppV?3h{K;1xGor2<1)#f97pHlt~Zv{`^ z=F=hNG{Tz2JKOtp#>9u@Hy9J2Yl*$jq{PIpgF)ENZz4G|tZeIqi!x@*`%^(q zaTt(iC-`ihff%?yVC;I3PiXBQFez}OwH$B|`vJ{w7>~@bl$RVL%A`aB@WOI3%9J9) zVP08+DRp}y%c(YW-nM%G0b4uD>sh(6TPWbF*aB|XZj>4CFBJF-5c&;n?8I+H;c+kS z=PcvKc-$U3&FWubaE`$&g9!$oVelG)W>y{hsBg%1c1nr(i+sDtz+te=V3h&y{qSlG z-egc`aE$>EVtX45_AvMygD)}o%MAW1gYPr=YYhH~!QW)?cNqLJ19CF&2Mqo`gMY*z zT-*}l3YTBspxEZWg&-TlRj9MMgV{_jnd`ylKsK8ggda&te=_>J7vFpF8OCQ1K1k=X zIsWw}h6ew4?pWfP1n#CZ{|5hOV$;Oc_u&7?E@XG-`f~?!`*Med_U8`d4h$xxH$`-$ z<&Om81riJdoj>|A%xg^Xb0TTuw~wEF+3O5AgLu~CW}SWNCt&b{F7U300<>SmWcz(k zvb+4?h*n0lzJcArU(D~07@bEP_kKPy;Baajr&a=QKYbaMv`H#wWEp8%m?SEThzmj< ze-(|0a+eWjv`zgJTdHHhrPqo^ldl8{9^&F$*@JKCf;0-&$?bF}s!D3F& zZtm8%OREOtj_E!%vn|&JSn6}e$$0J5TD0}~c!M|i6dTQHHNZ-HAp^*AKkiZ40 z?E}%5LxYY4e~f4Gk?wy5kH0MLz zGONp*i=NXcKPcs&3Cd?={?aPHT=;CR>xI!rUj^OEIR&utJv8gm_DKlj2Z>zaHB5qG zaGw;;Dj<3Vxzy!!J-kDm1qEt?0Q>k-;P)(JuQF%@B9Z2O0`WdX67gZ|TMuE6I`L3&I=9cmu8U zzssyQGpgu!(PuA@w#?0Xx@YPwRm|4a=lv_>_5LveBQf%Uk@UDo0oH%QJRdUn69)g3 z!9QalLWRf^gqQcv8T^m|Mj8!-UsJ$&1KpF$y@X#|x!znlmrm>&(iWiSrEW?#%MJXR z6eJsui0R#A@LdEL<_3Igu6U>?<`KcYG=mHSE>@YCx6U0zo_SZoKFYTQ#IYbNF^Ti1n+SMB4f&oA7=6c23@8Kj^9eMm#)sg&%QWxyHgEcShLf>h4*%`7{x9AEdu9Lt literal 0 HcmV?d00001 diff --git a/sbsheriff/Lib/site-packages/disnake/__pycache__/user.cpython-310.pyc b/sbsheriff/Lib/site-packages/disnake/__pycache__/user.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..ee5e4259ae376262d7f2120740a344da62650276 GIT binary patch literal 17563 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 GV*D2d!COuM literal 0 HcmV?d00001 diff --git a/sbsheriff/Lib/site-packages/disnake/__pycache__/utils.cpython-310.pyc b/sbsheriff/Lib/site-packages/disnake/__pycache__/utils.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..48224eb8d3598f8e959cc05ef395753f291a2fe2 GIT binary patch literal 41723 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 literal 0 HcmV?d00001 diff --git a/sbsheriff/Lib/site-packages/disnake/__pycache__/voice_client.cpython-310.pyc b/sbsheriff/Lib/site-packages/disnake/__pycache__/voice_client.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..8f2fed2d042d022e1a785186663251f4939b6de1 GIT binary patch literal 22652 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 O4@;-=*}>Go#{UC0DZ`Nf literal 0 HcmV?d00001 diff --git a/sbsheriff/Lib/site-packages/disnake/__pycache__/voice_region.cpython-310.pyc b/sbsheriff/Lib/site-packages/disnake/__pycache__/voice_region.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..a17d11cf63418aef072e7991c555ad999bd45720 GIT binary patch literal 2800 zcma)8&u`nt5+*6?hZ(1@bzfhROR-1~jQ~Y?4e%~T6O@){i>OQq6dgb78DJ^y%3?~9 zDwj&0joh05qA1WFd+%SPYft?Hdg-a(tR&k>TcET}?(ELaH}lQxtn<5fEe+34pWKU| z?P%K1B;0-~5I)y5T^?Y-wXw!^ZlwC$7#li`D`{nJj!j(?X7Mj>@@iV0*T!|MRmY7Z zjn{bnwZ`k;7~>jmjI`!XbYyCp70d)Xb_3Q=Vv$L~9zbYXRwrLv7Rkk|WDnvdd;IUm zpFUg^LW-5SAuoL3z6oFIp!>DD2jO^Ws+wsk!&UkF}Y+HMU<6-x7f50g5^^d z&!XZ&v{;$5D7$0}QAljaCuNjmNp`^^D+VrUmNS@<`Lui)6#~kfMN;N*62TthdAuap zs3g2;k_yQllnCVhXtU#fvt69CLy^LLIm_o1iFF+bD4H&d43Hp&!p%XMLVPabl4i*BX`ZI} zOA0N{GoDbqa^F&kk0$vGp<-F*I?GGAx^{sQpqyA|b+aUA5qzJB4Pn4dGK;3R;UK!@ zM3zW=0`3=iq43@gvkm;7!$yO{;MDdV=8o9VA3SrrPM6)cN09Hg*r^-z1}6c7hHrbp z85R9>vj4kUDrEe2iWHgP}VN$8AgKvBfyO* z*BOzqW5@6GVA(!!`)+X7vJTzAgH3h_qc$7be&BXa`nJ!8C;o6Sasc0jSGy99Cpxi%IP++q=d7&|)rz3&j6j75J3-LbzH}YC4_io&_l9!Y`h_}GQ(xVQG8BqB zmlERL;B4rGou1P{&W?W3H%iZPRGBX>P>C^Zy!~9axi)5nHrCPV46ctW+!&jDmsff1 zwK=ZxI&Zwz(8_kWg>RkTK})+^RIw@g6*#`wv@6LX>R54JaQ1?5aqbBi70B?k+w29p z5GEqd1>fIikK6xQFWKeh3`?c?@cL0=!uQ#JoT4l3e~H8XrJ5v*Ct33KQZToRgIA~n zxCNxuESihI*cjlf((?AK+}@Ti%48m;H#;YJp59;v1rP}?ViE^E-3AHxsHBD*r@2JC zqn2=)FAK;C`e$1?&55d*8tY$~Kb;9Q5();U@Ef7AZuh)FDti!tW6mU+Xgs5qv+hAs zG}l=1QkMDr@8hiX-@-rx<|GE&ZZq`;KPjEuVwrVm?7nkGKeNI~2)udM+p1Q9qfS%cK+!7g79GbRpz9 zE-bp!AE^@(ZYpnaxoU(VZssx!p8`sfkCtxf@8D-ozxwAb`r2E?YXYIGNF*W^ffV*D z?KzR4dre)1`lDXFgJ~7X`t>fvRXq%GrozyHASnwq{p$TU(bW1Mz=%}^_7MhLC%A77 zj?6sQ@vY!%;A?(YhZ9xr>fO(78D$B7a#d4D@X6H<+mz3f-}I-=%1vI@+1P{mx19!8 z1&&1+_OPhD{^$=Jtrfhcp;B1vLbKT*mZ@aJaAk!d{-;=`G~Nxvua{A}Spg;Zw+GWZ z;3myW3AFdfi}&gE0llakZoP;})et|%KoV3#Gj(&%YBcJ*6}93ucZz#hAl&J)To%AB zi0@Ucyj_y*Mg literal 0 HcmV?d00001 diff --git a/sbsheriff/Lib/site-packages/disnake/__pycache__/welcome_screen.cpython-310.pyc b/sbsheriff/Lib/site-packages/disnake/__pycache__/welcome_screen.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..d28a64a50ff1a8cc05e0ddd77316d4cbe2e1bec6 GIT binary patch literal 7308 zcmbtZ-E$k)b>CeqKDY!aiLxcrlI?3Hjf@zA9e2{StfU48K@k%Y!#k% zn%REN%=PnTzF#m4SkrmdTj(36A^SORv0pTc{UvirRUBPxU_I|G_pg{&K?0%s7ibvGE;pE+#ZdFFWju#Y*z*mXqT4FcC6FgIYwj&Kgo*paXYp~K6pCme_Q zJ=Q(8#gS8Hq0j8W85=qxzybd-wB3O_IAXTZ1zy@29s^9^_rgTD zzdItdc1ZYouIB{ogAk0|X-`hvDU}T%;g0PwcK~P(OP1KF8y@?kkb#|0xLtx##-^?} z;zUET?74k6#$eEKDU5(99|hom=q$6o&)pvVI+Cs7=+JY6<1*tefj%6C*cs5Ilx^7n zA0PRG1&-$t1Q&EmUZ>QRC9l8&*#Q4UL=x}mvEL_7jFc0Is5cS=poCC}T^}No7*CvT zNHauv&-Xn4lvwNf1MU*P!I~izZy);49LY

wzDF)R+WPfFvT;>SQT6wn6)$GZ7f@ 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 literal 0 HcmV?d00001 diff --git a/sbsheriff/Lib/site-packages/disnake/__pycache__/widget.cpython-310.pyc b/sbsheriff/Lib/site-packages/disnake/__pycache__/widget.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..734420a5ffa76a3965c576b581d26fcbc82e1b91 GIT binary patch literal 14893 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 str: + return "see-below" + + +_undefined: Any = _Undefined() + + +@runtime_checkable +class Snowflake(Protocol): + """An ABC that details the common operations on a Discord model. + + Almost all :ref:`Discord models ` meet this + abstract base class. + + If you want to create a snowflake on your own, consider using + :class:`.Object`. + + Attributes + ---------- + id: :class:`int` + The model's unique ID. + """ + + __slots__ = () + id: int + + +@runtime_checkable +class User(Snowflake, Protocol): + """An ABC that details the common operations on a Discord user. + + The following classes implement this ABC: + + - :class:`~disnake.User` + - :class:`~disnake.ClientUser` + - :class:`~disnake.Member` + + This ABC must also implement :class:`~disnake.abc.Snowflake`. + + Attributes + ---------- + name: :class:`str` + The user's username. + discriminator: :class:`str` + The user's discriminator. + avatar: :class:`~disnake.Asset` + The avatar asset the user has. + bot: :class:`bool` + Whether the user is a bot account. + """ + + __slots__ = () + + name: str + discriminator: str + avatar: Asset + bot: bool + + @property + def display_name(self) -> str: + """:class:`str`: Returns the user's display name.""" + raise NotImplementedError + + @property + def mention(self) -> str: + """:class:`str`: Returns a string that allows you to mention the given user.""" + raise NotImplementedError + + +@runtime_checkable +class PrivateChannel(Snowflake, Protocol): + """An ABC that details the common operations on a private Discord channel. + + The following classes implement this ABC: + + - :class:`~disnake.DMChannel` + - :class:`~disnake.GroupChannel` + + This ABC must also implement :class:`~disnake.abc.Snowflake`. + + Attributes + ---------- + me: :class:`~disnake.ClientUser` + The user representing yourself. + """ + + __slots__ = () + + me: ClientUser + + +class _Overwrites: + __slots__ = ("id", "allow", "deny", "type") + + ROLE = 0 + MEMBER = 1 + + def __init__(self, data: PermissionOverwritePayload): + self.id: int = int(data["id"]) + self.allow: int = int(data.get("allow", 0)) + self.deny: int = int(data.get("deny", 0)) + self.type: OverwriteType = data["type"] + + def _asdict(self) -> PermissionOverwritePayload: + return { + "id": self.id, + "allow": str(self.allow), + "deny": str(self.deny), + "type": self.type, + } + + def is_role(self) -> bool: + return self.type == 0 + + def is_member(self) -> bool: + return self.type == 1 + + +GCH = TypeVar("GCH", bound="GuildChannel") + + +class GuildChannel(ABC): + """An ABC that details the common operations on a Discord guild channel. + + The following classes implement this ABC: + + - :class:`.TextChannel` + - :class:`.VoiceChannel` + - :class:`.CategoryChannel` + - :class:`.StageChannel` + - :class:`.ForumChannel` + + This ABC must also implement :class:`.abc.Snowflake`. + + Attributes + ---------- + name: :class:`str` + The channel name. + guild: :class:`.Guild` + The guild the channel belongs to. + position: :class:`int` + The position in the channel list. This is a number that starts at 0. + e.g. the top channel is position 0. + """ + + __slots__ = () + + id: int + name: str + guild: Guild + type: ChannelType + position: int + category_id: Optional[int] + _state: ConnectionState + _overwrites: List[_Overwrites] + + if TYPE_CHECKING: + + def __init__(self, *, state: ConnectionState, guild: Guild, data: Mapping[str, Any]): + ... + + def __str__(self) -> str: + return self.name + + @property + def _sorting_bucket(self) -> int: + raise NotImplementedError + + def _update(self, guild: Guild, data: Dict[str, Any]) -> None: + raise NotImplementedError + + async def _move( + self, + position: int, + parent_id: Optional[Any] = None, + lock_permissions: bool = False, + *, + reason: Optional[str], + ) -> None: + if position < 0: + raise InvalidArgument("Channel position cannot be less than 0.") + + http = self._state.http + bucket = self._sorting_bucket + channels = [c for c in self.guild.channels if c._sorting_bucket == bucket] + channels = cast(List[GuildChannel], channels) + + channels.sort(key=lambda c: c.position) + + try: + # remove ourselves from the channel list + channels.remove(self) + except ValueError: + # not there somehow lol + return + else: + index = next( + (i for i, c in enumerate(channels) if c.position >= position), len(channels) + ) + # add ourselves at our designated position + channels.insert(index, self) + + payload = [] + for index, c in enumerate(channels): + d: Dict[str, Any] = {"id": c.id, "position": index} + if parent_id is not _undefined and c.id == self.id: + d.update(parent_id=parent_id, lock_permissions=lock_permissions) + payload.append(d) + + await http.bulk_channel_update(self.guild.id, payload, reason=reason) + + async def _edit( + self, options: Dict[str, Any], reason: Optional[str] + ) -> Optional[ChannelPayload]: + try: + parent = options.pop("category") + except KeyError: + parent_id = _undefined + else: + parent_id = parent and parent.id + + try: + options["rate_limit_per_user"] = options.pop("slowmode_delay") + except KeyError: + pass + + try: + rtc_region = options.pop("rtc_region") + except KeyError: + pass + else: + options["rtc_region"] = None if rtc_region is None else str(rtc_region) + + try: + video_quality_mode = options.pop("video_quality_mode") + except KeyError: + pass + else: + options["video_quality_mode"] = int(video_quality_mode) + + try: + default_auto_archive_duration = options.pop("default_auto_archive_duration") + except KeyError: + pass + else: + options["default_auto_archive_duration"] = ( + int(default_auto_archive_duration) + if default_auto_archive_duration is not None + else None + ) + + lock_permissions = options.pop("sync_permissions", False) + + try: + position = options.pop("position") + except KeyError: + if parent_id is not _undefined: + if lock_permissions: + category = self.guild.get_channel(parent_id) + if category: + options["permission_overwrites"] = [ + c._asdict() for c in category._overwrites + ] + options["parent_id"] = parent_id + elif lock_permissions and self.category_id is not None: + # if we're syncing permissions on a pre-existing channel category without changing it + # we need to update the permissions to point to the pre-existing category + category = self.guild.get_channel(self.category_id) + if category: + options["permission_overwrites"] = [c._asdict() for c in category._overwrites] + else: + await self._move( + position, parent_id=parent_id, lock_permissions=lock_permissions, reason=reason + ) + + overwrites = options.get("overwrites", None) + if overwrites is not None: + perms = [] + for target, perm in overwrites.items(): + if not isinstance(perm, PermissionOverwrite): + raise InvalidArgument( + f"Expected PermissionOverwrite received {perm.__class__.__name__}" + ) + + allow, deny = perm.pair() + payload = { + "allow": allow.value, + "deny": deny.value, + "id": target.id, + } + + if isinstance(target, Role): + payload["type"] = _Overwrites.ROLE + else: + payload["type"] = _Overwrites.MEMBER + + perms.append(payload) + options["permission_overwrites"] = perms + + try: + ch_type = options["type"] + except KeyError: + pass + else: + if not isinstance(ch_type, ChannelType): + raise InvalidArgument("type field must be of type ChannelType") + options["type"] = ch_type.value + + if options: + return await self._state.http.edit_channel(self.id, reason=reason, **options) + + def _fill_overwrites(self, data: GuildChannelPayload) -> None: + self._overwrites = [] + everyone_index = 0 + everyone_id = self.guild.id + + for index, overridden in enumerate(data.get("permission_overwrites", [])): + overwrite = _Overwrites(overridden) + self._overwrites.append(overwrite) + + if overwrite.type == _Overwrites.MEMBER: + continue + + if overwrite.id == everyone_id: + # the @everyone role is not guaranteed to be the first one + # in the list of permission overwrites, however the permission + # resolution code kind of requires that it is the first one in + # the list since it is special. So we need the index so we can + # swap it to be the first one. + everyone_index = index + + # do the swap + tmp = self._overwrites + if tmp: + tmp[everyone_index], tmp[0] = tmp[0], tmp[everyone_index] + + @property + def changed_roles(self) -> List[Role]: + """List[:class:`.Role`]: Returns a list of roles that have been overridden from + their default values in the :attr:`.Guild.roles` attribute.""" + ret = [] + g = self.guild + for overwrite in filter(lambda o: o.is_role(), self._overwrites): + role = g.get_role(overwrite.id) + if role is None: + continue + + role = copy.copy(role) + role.permissions.handle_overwrite(overwrite.allow, overwrite.deny) + ret.append(role) + return ret + + @property + def mention(self) -> str: + """:class:`str`: The string that allows you to mention the channel.""" + return f"<#{self.id}>" + + @property + def created_at(self) -> datetime: + """:class:`datetime.datetime`: Returns the channel's creation time in UTC.""" + return utils.snowflake_time(self.id) + + def overwrites_for(self, obj: Union[Role, User]) -> PermissionOverwrite: + """Returns the channel-specific overwrites for a member or a role. + + Parameters + ---------- + obj: Union[:class:`.Role`, :class:`.abc.User`] + The role or user denoting + whose overwrite to get. + + Returns + ------- + :class:`~disnake.PermissionOverwrite` + The permission overwrites for this object. + """ + predicate: Callable[[_Overwrites], bool] + if isinstance(obj, User): + predicate = lambda p: p.is_member() + elif isinstance(obj, Role): + predicate = lambda p: p.is_role() + else: + predicate = lambda p: True + + for overwrite in filter(predicate, self._overwrites): + if overwrite.id == obj.id: + allow = Permissions(overwrite.allow) + deny = Permissions(overwrite.deny) + return PermissionOverwrite.from_pair(allow, deny) + + return PermissionOverwrite() + + @property + def overwrites(self) -> Dict[Union[Role, Member], PermissionOverwrite]: + """Returns all of the channel's overwrites. + + This is returned as a dictionary where the key contains the target which + can be either a :class:`~disnake.Role` or a :class:`~disnake.Member` and the value is the + overwrite as a :class:`~disnake.PermissionOverwrite`. + + Returns + ------- + Dict[Union[:class:`~disnake.Role`, :class:`~disnake.Member`], :class:`~disnake.PermissionOverwrite`] + The channel's permission overwrites. + """ + ret = {} + for ow in self._overwrites: + allow = Permissions(ow.allow) + deny = Permissions(ow.deny) + overwrite = PermissionOverwrite.from_pair(allow, deny) + target = None + + if ow.is_role(): + target = self.guild.get_role(ow.id) + elif ow.is_member(): + target = self.guild.get_member(ow.id) + + # TODO: There is potential data loss here in the non-chunked + # case, i.e. target is None because get_member returned nothing. + # This can be fixed with a slight breaking change to the return type, + # i.e. adding disnake.Object to the list of it + # However, for now this is an acceptable compromise. + if target is not None: + ret[target] = overwrite + return ret + + @property + def category(self) -> Optional[CategoryChannel]: + """Optional[:class:`~disnake.CategoryChannel`]: The category this channel belongs to. + + If there is no category then this is ``None``. + """ + return self.guild.get_channel(self.category_id) # type: ignore + + @property + def permissions_synced(self) -> bool: + """:class:`bool`: Whether or not the permissions for this channel are synced with the + category it belongs to. + + If there is no category then this is ``False``. + + .. versionadded:: 1.3 + """ + if self.category_id is None: + return False + + category = self.guild.get_channel(self.category_id) + return bool(category and category.overwrites == self.overwrites) + + @property + def jump_url(self) -> str: + """ + A URL that can be used to jump to this channel. + + .. versionadded:: 2.4 + + .. note:: + + This exists for all guild channels but may not be usable by the client for all guild channel types. + """ + return f"https://discord.com/channels/{self.guild.id}/{self.id}" + + def permissions_for( + self, + obj: Union[Member, Role], + /, + *, + ignore_timeout: bool = MISSING, + ) -> Permissions: + """Handles permission resolution for the :class:`~disnake.Member` + or :class:`~disnake.Role`. + + This function takes into consideration the following cases: + + - Guild owner + - Guild roles + - Channel overrides + - Member overrides + - Timeouts + + If a :class:`~disnake.Role` is passed, then it checks the permissions + someone with that role would have, which is essentially: + + - The default role permissions + - The permissions of the role used as a parameter + - The default role permission overwrites + - The permission overwrites of the role used as a parameter + + .. versionchanged:: 2.0 + The object passed in can now be a role object. + + Parameters + ---------- + obj: Union[:class:`~disnake.Member`, :class:`~disnake.Role`] + The object to resolve permissions for. This could be either + a member or a role. If it's a role then member overwrites + are not computed. + ignore_timeout: :class:`bool` + Whether or not to ignore the user's timeout. + Defaults to ``True`` for backwards compatibility. + + .. versionadded:: 2.4 + + .. note:: + + This only applies to :class:`~disnake.Member` objects. + + Raises + ------ + TypeError + ``ignore_timeout`` is only supported for :class:`~disnake.Member` objects. + + Returns + ------- + :class:`~disnake.Permissions` + The resolved permissions for the member or role. + """ + # The current cases can be explained as: + # Guild owner get all permissions -- no questions asked. Otherwise... + # The @everyone role gets the first application. + # After that, the applied roles that the user has in the channel + # (or otherwise) are then OR'd together. + # After the role permissions are resolved, the member permissions + # have to take into effect. + # After all that is done.. you have to do the following: + + # The operation first takes into consideration the denied + # and then the allowed. + + # Timeouted users have only view_channel and read_message_history + # if they already have them. + if ignore_timeout is not MISSING and isinstance(obj, Role): + raise TypeError("ignore_timeout is only supported for disnake.Member objects") + + if ignore_timeout is MISSING: + ignore_timeout = True + + if self.guild.owner_id == obj.id: + return Permissions.all() + + default = self.guild.default_role + base = Permissions(default.permissions.value) + + # Handle the role case first + if isinstance(obj, Role): + base.value |= obj._permissions + + if base.administrator: + return Permissions.all() + + # Apply @everyone allow/deny first since it's special + try: + maybe_everyone = self._overwrites[0] + if maybe_everyone.id == self.guild.id: + base.handle_overwrite(allow=maybe_everyone.allow, deny=maybe_everyone.deny) + except IndexError: + pass + + if obj.is_default(): + return base + + overwrite = utils.get(self._overwrites, type=_Overwrites.ROLE, id=obj.id) + if overwrite is not None: + base.handle_overwrite(overwrite.allow, overwrite.deny) + + return base + + roles = obj._roles + get_role = self.guild.get_role + + # Apply guild roles that the member has. + for role_id in roles: + role = get_role(role_id) + if role is not None: + base.value |= role._permissions + + # Guild-wide Administrator -> True for everything + # Bypass all channel-specific overrides + if base.administrator: + return Permissions.all() + + # Apply @everyone allow/deny first since it's special + try: + maybe_everyone = self._overwrites[0] + if maybe_everyone.id == self.guild.id: + base.handle_overwrite(allow=maybe_everyone.allow, deny=maybe_everyone.deny) + remaining_overwrites = self._overwrites[1:] + else: + remaining_overwrites = self._overwrites + except IndexError: + remaining_overwrites = self._overwrites + + denies = 0 + allows = 0 + + # Apply channel specific role permission overwrites + for overwrite in remaining_overwrites: + if overwrite.is_role() and roles.has(overwrite.id): + denies |= overwrite.deny + allows |= overwrite.allow + + base.handle_overwrite(allow=allows, deny=denies) + + # Apply member specific permission overwrites + for overwrite in remaining_overwrites: + if overwrite.is_member() and overwrite.id == obj.id: + base.handle_overwrite(allow=overwrite.allow, deny=overwrite.deny) + break + + # if you can't send a message in a channel then you can't have certain + # permissions as well + if not base.send_messages: + base.send_tts_messages = False + base.mention_everyone = False + base.embed_links = False + base.attach_files = False + + # if you can't view a channel then you have no permissions there + if not base.view_channel: + denied = Permissions.all_channel() + base.value &= ~denied.value + + # if you have a timeout then you can't have any permissions + # except read messages and read message history + if not ignore_timeout and obj.current_timeout: + denied = Permissions(view_channel=True, read_message_history=True) + base.value &= denied.value + + return base + + async def delete(self, *, reason: Optional[str] = None) -> None: + """|coro| + + Deletes the channel. + + You must have :attr:`.Permissions.manage_channels` permission to do this. + + Parameters + ---------- + reason: Optional[:class:`str`] + The reason for deleting this channel. Shows up on the audit log. + + Raises + ------ + Forbidden + You do not have proper permissions to delete the channel. + NotFound + The channel was not found or was already deleted. + HTTPException + Deleting the channel failed. + """ + await self._state.http.delete_channel(self.id, reason=reason) + + @overload + async def set_permissions( + self, + target: Union[Member, Role], + *, + overwrite: Optional[Union[PermissionOverwrite, _Undefined]] = ..., + reason: Optional[str] = ..., + ) -> None: + ... + + @overload + async def set_permissions( + self, + target: Union[Member, Role], + *, + reason: Optional[str] = ..., + **permissions: Optional[bool], + ) -> None: + ... + + async def set_permissions(self, target, *, overwrite=_undefined, reason=None, **permissions): + """ + |coro| + + Sets the channel specific permission overwrites for a target in the + channel. + + The ``target`` parameter should either be a :class:`.Member` or a + :class:`.Role` that belongs to guild. + + The ``overwrite`` parameter, if given, must either be ``None`` or + :class:`.PermissionOverwrite`. For convenience, you can pass in + keyword arguments denoting :class:`.Permissions` attributes. If this is + done, then you cannot mix the keyword arguments with the ``overwrite`` + parameter. + + If the ``overwrite`` parameter is ``None``, then the permission + overwrites are deleted. + + You must have :attr:`.Permissions.manage_roles` permission to do this. + + .. note:: + + This method *replaces* the old overwrites with the ones given. + + Examples + -------- + + Setting allow and deny: :: + + await message.channel.set_permissions(message.author, view_channel=True, + send_messages=False) + + Deleting overwrites :: + + await channel.set_permissions(member, overwrite=None) + + Using :class:`.PermissionOverwrite` :: + + overwrite = disnake.PermissionOverwrite() + overwrite.send_messages = False + overwrite.view_channel = True + await channel.set_permissions(member, overwrite=overwrite) + + Parameters + ---------- + target: Union[:class:`.Member`, :class:`.Role`] + The member or role to overwrite permissions for. + overwrite: Optional[:class:`.PermissionOverwrite`] + The permissions to allow and deny to the target, or ``None`` to + delete the overwrite. + **permissions + A keyword argument list of permissions to set for ease of use. + Cannot be mixed with ``overwrite``. + reason: Optional[:class:`str`] + The reason for doing this action. Shows up on the audit log. + + Raises + ------ + Forbidden + You do not have permissions to edit channel specific permissions. + HTTPException + Editing channel specific permissions failed. + NotFound + The role or member being edited is not part of the guild. + InvalidArgument + The overwrite parameter invalid or the target type was not + :class:`.Role` or :class:`.Member`. + """ + http = self._state.http + + if isinstance(target, User): + perm_type = _Overwrites.MEMBER + elif isinstance(target, Role): + perm_type = _Overwrites.ROLE + else: + raise InvalidArgument("target parameter must be either Member or Role") + + if overwrite is _undefined: + if len(permissions) == 0: + raise InvalidArgument("No overwrite provided.") + try: + overwrite = PermissionOverwrite(**permissions) + except (ValueError, TypeError): + raise InvalidArgument("Invalid permissions given to keyword arguments.") + else: + if len(permissions) > 0: + raise InvalidArgument("Cannot mix overwrite and keyword arguments.") + + # TODO: wait for event + + if overwrite is None: + await http.delete_channel_permissions(self.id, target.id, reason=reason) + elif isinstance(overwrite, PermissionOverwrite): + (allow, deny) = overwrite.pair() + await http.edit_channel_permissions( + self.id, target.id, allow.value, deny.value, perm_type, reason=reason + ) + else: + raise InvalidArgument("Invalid overwrite type provided.") + + async def _clone_impl( + self: GCH, + base_attrs: Dict[str, Any], + *, + name: Optional[str] = None, + reason: Optional[str] = None, + ) -> GCH: + base_attrs["permission_overwrites"] = [x._asdict() for x in self._overwrites] + base_attrs["parent_id"] = self.category_id + base_attrs["name"] = name or self.name + guild_id = self.guild.id + cls = self.__class__ + data = await self._state.http.create_channel( + guild_id, self.type.value, reason=reason, **base_attrs + ) + obj = cls(state=self._state, guild=self.guild, data=data) + + # temporarily add it to the cache + self.guild._channels[obj.id] = obj # type: ignore + return obj + + async def clone(self: GCH, *, name: Optional[str] = None, reason: Optional[str] = None) -> GCH: + """|coro| + + Clones this channel. This creates a channel with the same properties + as this channel. + + You must have :attr:`.Permissions.manage_channels` permission to + do this. + + .. versionadded:: 1.1 + + Parameters + ---------- + name: Optional[:class:`str`] + The name of the new channel. If not provided, defaults to this channel name. + reason: Optional[:class:`str`] + The reason for cloning this channel. Shows up on the audit log. + + Raises + ------ + Forbidden + You do not have the proper permissions to create this channel. + HTTPException + Creating the channel failed. + + Returns + ------- + :class:`.abc.GuildChannel` + The channel that was created. + """ + raise NotImplementedError + + @overload + async def move( + self, + *, + beginning: bool, + offset: int = ..., + category: Optional[Snowflake] = ..., + sync_permissions: bool = ..., + reason: Optional[str] = ..., + ) -> None: + ... + + @overload + async def move( + self, + *, + end: bool, + offset: int = ..., + category: Optional[Snowflake] = ..., + sync_permissions: bool = ..., + reason: Optional[str] = ..., + ) -> None: + ... + + @overload + async def move( + self, + *, + before: Snowflake, + offset: int = ..., + category: Optional[Snowflake] = ..., + sync_permissions: bool = ..., + reason: Optional[str] = ..., + ) -> None: + ... + + @overload + async def move( + self, + *, + after: Snowflake, + offset: int = ..., + category: Optional[Snowflake] = ..., + sync_permissions: bool = ..., + reason: Optional[str] = ..., + ) -> None: + ... + + async def move(self, **kwargs) -> None: + """|coro| + + A rich interface to help move a channel relative to other channels. + + If exact position movement is required, ``edit`` should be used instead. + + You must have :attr:`.Permissions.manage_channels` permission to + do this. + + .. note:: + + Voice channels will always be sorted below text channels. + This is a Discord limitation. + + .. versionadded:: 1.7 + + Parameters + ---------- + beginning: :class:`bool` + Whether to move the channel to the beginning of the + channel list (or category if given). + This is mutually exclusive with ``end``, ``before``, and ``after``. + end: :class:`bool` + Whether to move the channel to the end of the + channel list (or category if given). + This is mutually exclusive with ``beginning``, ``before``, and ``after``. + before: :class:`.abc.Snowflake` + The channel that should be before our current channel. + This is mutually exclusive with ``beginning``, ``end``, and ``after``. + after: :class:`.abc.Snowflake` + The channel that should be after our current channel. + This is mutually exclusive with ``beginning``, ``end``, and ``before``. + offset: :class:`int` + The number of channels to offset the move by. For example, + an offset of ``2`` with ``beginning=True`` would move + it 2 after the beginning. A positive number moves it below + while a negative number moves it above. Note that this + number is relative and computed after the ``beginning``, + ``end``, ``before``, and ``after`` parameters. + category: Optional[:class:`.abc.Snowflake`] + The category to move this channel under. + If ``None`` is given then it moves it out of the category. + This parameter is ignored if moving a category channel. + sync_permissions: :class:`bool` + Whether to sync the permissions with the category (if given). + reason: Optional[:class:`str`] + The reason for moving this channel. Shows up on the audit log. + + Raises + ------ + InvalidArgument + An invalid position was given or a bad mix of arguments were passed. + Forbidden + You do not have permissions to move the channel. + HTTPException + Moving the channel failed. + """ + if not kwargs: + return + + beginning, end = kwargs.get("beginning"), kwargs.get("end") + before, after = kwargs.get("before"), kwargs.get("after") + offset = kwargs.get("offset", 0) + if sum(bool(a) for a in (beginning, end, before, after)) > 1: + raise InvalidArgument("Only one of [before, after, end, beginning] can be used.") + + bucket = self._sorting_bucket + parent_id = kwargs.get("category", MISSING) + # fmt: off + if parent_id not in (MISSING, None): + parent_id = parent_id.id + channels = [ + ch + for ch in self.guild.channels + if ch._sorting_bucket == bucket + and ch.category_id == parent_id + ] + else: + channels = [ + ch + for ch in self.guild.channels + if ch._sorting_bucket == bucket + and ch.category_id == self.category_id + ] + # fmt: on + + channels.sort(key=lambda c: (c.position, c.id)) + channels = cast(List[GuildChannel], channels) + + try: + # Try to remove ourselves from the channel list + channels.remove(self) + except ValueError: + # If we're not there then it's probably due to not being in the category + pass + + index = None + if beginning: + index = 0 + elif end: + index = len(channels) + elif before: + index = next((i for i, c in enumerate(channels) if c.id == before.id), None) + elif after: + index = next((i + 1 for i, c in enumerate(channels) if c.id == after.id), None) + + if index is None: + raise InvalidArgument("Could not resolve appropriate move position") + + channels.insert(max((index + offset), 0), self) + payload = [] + lock_permissions = kwargs.get("sync_permissions", False) + reason = kwargs.get("reason") + for index, channel in enumerate(channels): + d = {"id": channel.id, "position": index} + if parent_id is not MISSING and channel.id == self.id: + d.update(parent_id=parent_id, lock_permissions=lock_permissions) + payload.append(d) + + await self._state.http.bulk_channel_update(self.guild.id, payload, reason=reason) + + async def create_invite( + self, + *, + reason: Optional[str] = None, + max_age: int = 0, + max_uses: int = 0, + temporary: bool = False, + unique: bool = True, + target_type: Optional[InviteTarget] = None, + target_user: Optional[User] = None, + target_application: Optional[PartyType] = None, + guild_scheduled_event: Optional[GuildScheduledEvent] = None, + ) -> Invite: + """|coro| + + Creates an instant invite from a text or voice channel. + + You must have :attr:`.Permissions.create_instant_invite` permission to + do this. + + Parameters + ---------- + max_age: :class:`int` + How long the invite should last in seconds. If it's 0 then the invite + doesn't expire. Defaults to ``0``. + max_uses: :class:`int` + How many uses the invite could be used for. If it's 0 then there + are unlimited uses. Defaults to ``0``. + temporary: :class:`bool` + Whether the invite grants temporary membership + (i.e. they get kicked after they disconnect). Defaults to ``False``. + unique: :class:`bool` + Whether a unique invite URL should be created. Defaults to ``True``. + If this is set to ``False`` then it will return a previously created + invite. + target_type: Optional[:class:`.InviteTarget`] + The type of target for the voice channel invite, if any. + + .. versionadded:: 2.0 + + target_user: Optional[:class:`User`] + The user whose stream to display for this invite, required if `target_type` is `TargetType.stream`. + The user must be streaming in the channel. + + .. versionadded:: 2.0 + + target_application: Optional[:class:`.PartyType`] + The ID of the embedded application for the invite, required if `target_type` is `TargetType.embedded_application`. + + .. versionadded:: 2.0 + + guild_scheduled_event: Optional[:class:`.GuildScheduledEvent`] + The guild scheduled event to include with the invite. + + .. versionadded:: 2.3 + + reason: Optional[:class:`str`] + The reason for creating this invite. Shows up on the audit log. + + Raises + ------ + HTTPException + Invite creation failed. + NotFound + The channel that was passed is a category or an invalid channel. + + Returns + ------- + :class:`.Invite` + The newly created invite. + """ + data = await self._state.http.create_invite( + self.id, + reason=reason, + max_age=max_age, + max_uses=max_uses, + temporary=temporary, + unique=unique, + target_type=try_enum_to_int(target_type), + target_user_id=target_user.id if target_user else None, + target_application_id=try_enum_to_int(target_application), + ) + invite = Invite.from_incomplete(data=data, state=self._state) + invite.guild_scheduled_event = guild_scheduled_event + return invite + + async def invites(self) -> List[Invite]: + """|coro| + + Returns a list of all active instant invites from this channel. + + You must have :attr:`.Permissions.manage_channels` permission to use this. + + Raises + ------ + Forbidden + You do not have proper permissions to get the information. + HTTPException + An error occurred while fetching the information. + + Returns + ------- + List[:class:`.Invite`] + The list of invites that are currently active. + """ + state = self._state + data = await state.http.invites_from_channel(self.id) + guild = self.guild + return [Invite(state=state, data=invite, channel=self, guild=guild) for invite in data] + + +class Messageable: + """An ABC that details the common operations on a model that can send messages. + + The following classes implement this ABC: + + - :class:`~disnake.TextChannel` + - :class:`~disnake.DMChannel` + - :class:`~disnake.GroupChannel` + - :class:`~disnake.User` + - :class:`~disnake.Member` + - :class:`~disnake.ext.commands.Context` + - :class:`~disnake.Thread` + - :class:`~disnake.VoiceChannel` + - :class:`~disnake.PartialMessageable` + """ + + __slots__ = () + _state: ConnectionState + + async def _get_channel(self) -> MessageableChannel: + raise NotImplementedError + + @overload + async def send( + self, + content: Optional[str] = ..., + *, + tts: bool = ..., + embed: Embed = ..., + file: File = ..., + stickers: Sequence[Union[GuildSticker, StickerItem]] = ..., + delete_after: float = ..., + nonce: Union[str, int] = ..., + suppress_embeds: bool = ..., + allowed_mentions: AllowedMentions = ..., + reference: Union[Message, MessageReference, PartialMessage] = ..., + mention_author: bool = ..., + view: View = ..., + components: Components = ..., + ) -> Message: + ... + + @overload + async def send( + self, + content: Optional[str] = ..., + *, + tts: bool = ..., + embed: Embed = ..., + files: List[File] = ..., + stickers: Sequence[Union[GuildSticker, StickerItem]] = ..., + delete_after: float = ..., + nonce: Union[str, int] = ..., + suppress_embeds: bool = ..., + allowed_mentions: AllowedMentions = ..., + reference: Union[Message, MessageReference, PartialMessage] = ..., + mention_author: bool = ..., + view: View = ..., + components: Components = ..., + ) -> Message: + ... + + @overload + async def send( + self, + content: Optional[str] = ..., + *, + tts: bool = ..., + embeds: List[Embed] = ..., + file: File = ..., + stickers: Sequence[Union[GuildSticker, StickerItem]] = ..., + delete_after: float = ..., + nonce: Union[str, int] = ..., + suppress_embeds: bool = ..., + allowed_mentions: AllowedMentions = ..., + reference: Union[Message, MessageReference, PartialMessage] = ..., + mention_author: bool = ..., + view: View = ..., + components: Components = ..., + ) -> Message: + ... + + @overload + async def send( + self, + content: Optional[str] = ..., + *, + tts: bool = ..., + embeds: List[Embed] = ..., + files: List[File] = ..., + stickers: Sequence[Union[GuildSticker, StickerItem]] = ..., + delete_after: float = ..., + nonce: Union[str, int] = ..., + suppress_embeds: bool = ..., + allowed_mentions: AllowedMentions = ..., + reference: Union[Message, MessageReference, PartialMessage] = ..., + mention_author: bool = ..., + view: View = ..., + components: Components = ..., + ) -> Message: + ... + + async def send( + self, + content: Optional[str] = None, + *, + tts: bool = False, + embed: Embed = None, + embeds: List[Embed] = None, + file: File = None, + files: List[File] = None, + stickers: Sequence[Union[GuildSticker, StickerItem]] = None, + delete_after: float = None, + nonce: Union[str, int] = None, + suppress_embeds: bool = False, + allowed_mentions: AllowedMentions = None, + reference: Union[Message, MessageReference, PartialMessage] = None, + mention_author: bool = None, + view: View = None, + components: Components = None, + ): + """|coro| + + Sends a message to the destination with the content given. + + The content must be a type that can convert to a string through ``str(content)``. + + At least one of ``content``, ``embed``/``embeds``, ``file``/``files`` + or ``stickers`` must be provided. + + To upload a single file, the ``file`` parameter should be used with a + single :class:`.File` object. To upload multiple files, the ``files`` + parameter should be used with a :class:`list` of :class:`.File` objects. + **Specifying both parameters will lead to an exception**. + + To upload a single embed, the ``embed`` parameter should be used with a + single :class:`.Embed` object. To upload multiple embeds, the ``embeds`` + parameter should be used with a :class:`list` of :class:`.Embed` objects. + **Specifying both parameters will lead to an exception**. + + Parameters + ---------- + content: Optional[:class:`str`] + The content of the message to send. + tts: :class:`bool` + Whether the message should be sent using text-to-speech. + embed: :class:`.Embed` + The rich embed for the content to send. This cannot be mixed with the + ``embeds`` parameter. + embeds: List[:class:`.Embed`] + A list of embeds to send with the content. Must be a maximum of 10. + This cannot be mixed with the ``embed`` parameter. + + .. versionadded:: 2.0 + + file: :class:`.File` + The file to upload. This cannot be mixed with the ``files`` parameter. + files: List[:class:`.File`] + A list of files to upload. Must be a maximum of 10. + This cannot be mixed with the ``file`` parameter. + stickers: Sequence[Union[:class:`.GuildSticker`, :class:`.StickerItem`]] + A list of stickers to upload. Must be a maximum of 3. + + .. versionadded:: 2.0 + + nonce: Union[:class:`str`, :class:`int`] + The nonce to use for sending this message. If the message was successfully sent, + then the message will have a nonce with this value. + delete_after: :class:`float` + If provided, the number of seconds to wait in the background + before deleting the message we just sent. If the deletion fails, + then it is silently ignored. + allowed_mentions: :class:`.AllowedMentions` + Controls the mentions being processed in this message. If this is + passed, then the object is merged with :attr:`.Client.allowed_mentions`. + The merging behaviour only overrides attributes that have been explicitly passed + to the object, otherwise it uses the attributes set in :attr:`.Client.allowed_mentions`. + If no object is passed at all then the defaults given by :attr:`.Client.allowed_mentions` + are used instead. + + .. versionadded:: 1.4 + + reference: Union[:class:`.Message`, :class:`.MessageReference`, :class:`.PartialMessage`] + A reference to the :class:`.Message` to which you are replying, this can be created using + :meth:`.Message.to_reference` or passed directly as a :class:`.Message`. You can control + whether this mentions the author of the referenced message using the :attr:`.AllowedMentions.replied_user` + attribute of ``allowed_mentions`` or by setting ``mention_author``. + + .. versionadded:: 1.6 + + mention_author: Optional[:class:`bool`] + If set, overrides the :attr:`.AllowedMentions.replied_user` attribute of ``allowed_mentions``. + + .. versionadded:: 1.6 + + view: :class:`.ui.View` + A Discord UI View to add to the message. This cannot be mixed with ``components``. + + .. versionadded:: 2.0 + + components: |components_type| + A list of components to include in the message. This cannot be mixed with ``view``. + + .. versionadded:: 2.4 + + suppress_embeds: :class:`bool` + Whether to suppress embeds for the message. This hides + all embeds from the UI if set to ``True``. + + .. versionadded:: 2.5 + + Raises + ------ + HTTPException + Sending the message failed. + Forbidden + You do not have the proper permissions to send the message. + InvalidArgument + The ``files`` list is not of the appropriate size, + you specified both ``file`` and ``files``, + or you specified both ``embed`` and ``embeds``, + or the ``reference`` object is not a :class:`.Message`, + :class:`.MessageReference` or :class:`.PartialMessage`. + + Returns + ------- + :class:`.Message` + The message that was sent. + """ + channel = await self._get_channel() + state = self._state + content = str(content) if content is not None else None + + if file is not None and files is not None: + raise InvalidArgument("cannot pass both file and files parameter to send()") + + if file is not None: + if not isinstance(file, File): + raise InvalidArgument("file parameter must be File") + files = [file] + + if embed is not None and embeds is not None: + raise InvalidArgument("cannot pass both embed and embeds parameter to send()") + + if embed is not None: + embeds = [embed] + + embeds_payload = None + if embeds is not None: + if len(embeds) > 10: + raise InvalidArgument("embeds parameter must be a list of up to 10 elements") + for embed in embeds: + if embed._files: + files = files or [] + files += embed._files + embeds_payload = [embed.to_dict() for embed in embeds] + + stickers_payload = None + if stickers is not None: + stickers_payload = [sticker.id for sticker in stickers] + + allowed_mentions_payload = None + if allowed_mentions is None: + allowed_mentions_payload = state.allowed_mentions and state.allowed_mentions.to_dict() + elif state.allowed_mentions is not None: + allowed_mentions_payload = state.allowed_mentions.merge(allowed_mentions).to_dict() + else: + allowed_mentions_payload = allowed_mentions.to_dict() + + if mention_author is not None: + allowed_mentions_payload = allowed_mentions_payload or AllowedMentions().to_dict() + allowed_mentions_payload["replied_user"] = bool(mention_author) + + reference_payload = None + if reference is not None: + try: + reference_payload = reference.to_message_reference_dict() + except AttributeError: + raise InvalidArgument( + "reference parameter must be Message, MessageReference, or PartialMessage" + ) from None + + if view is not None and components is not None: + raise InvalidArgument("cannot pass both view and components parameter to send()") + + elif view: + if not hasattr(view, "__discord_ui_view__"): + raise InvalidArgument(f"view parameter must be View not {view.__class__!r}") + + components_payload = view.to_components() + + elif components: + components_payload = components_to_dict(components) + + else: + components_payload = None + + if suppress_embeds: + flags = MessageFlags.suppress_embeds.flag + else: + flags = 0 + + if files is not None: + if len(files) > 10: + raise InvalidArgument("files parameter must be a list of up to 10 elements") + elif not all(isinstance(file, File) for file in files): + raise InvalidArgument("files parameter must be a list of File") + + try: + data = await state.http.send_files( + channel.id, + files=files, + content=content, + tts=tts, + embeds=embeds_payload, + nonce=nonce, + allowed_mentions=allowed_mentions_payload, + message_reference=reference_payload, + stickers=stickers_payload, + components=components_payload, # type: ignore + flags=flags, + ) + finally: + for f in files: + f.close() + else: + data = await state.http.send_message( + channel.id, + content, + tts=tts, + embeds=embeds_payload, + nonce=nonce, + allowed_mentions=allowed_mentions_payload, + message_reference=reference_payload, + stickers=stickers_payload, + components=components_payload, # type: ignore + flags=flags, + ) + + ret = state.create_message(channel=channel, data=data) + if view: + state.store_view(view, ret.id) + + if delete_after is not None: + await ret.delete(delay=delete_after) + return ret + + async def trigger_typing(self) -> None: + """|coro| + + Triggers a *typing* indicator to the destination. + + *Typing* indicator will go away after 10 seconds, or after a message is sent. + """ + channel = await self._get_channel() + await self._state.http.send_typing(channel.id) + + def typing(self) -> Typing: + """Returns a context manager that allows you to type for an indefinite period of time. + + This is useful for denoting long computations in your bot. + + .. note:: + + This is both a regular context manager and an async context manager. + This means that both ``with`` and ``async with`` work with this. + + Example Usage: :: + + async with channel.typing(): + # simulate something heavy + await asyncio.sleep(10) + + await channel.send('done!') + + """ + return Typing(self) + + async def fetch_message(self, id: int, /) -> Message: + """|coro| + + Retrieves a single :class:`.Message` from the destination. + + Parameters + ---------- + id: :class:`int` + The message ID to look for. + + Raises + ------ + NotFound + The specified message was not found. + Forbidden + You do not have the permissions required to get a message. + HTTPException + Retrieving the message failed. + + Returns + ------- + :class:`.Message` + The message asked for. + """ + channel = await self._get_channel() + data = await self._state.http.get_message(channel.id, id) + return self._state.create_message(channel=channel, data=data) + + async def pins(self) -> List[Message]: + """|coro| + + Retrieves all messages that are currently pinned in the channel. + + .. note:: + + Due to a limitation with the Discord API, the :class:`.Message` + objects returned by this method do not contain complete + :attr:`.Message.reactions` data. + + Raises + ------ + HTTPException + Retrieving the pinned messages failed. + + Returns + ------- + List[:class:`.Message`] + The messages that are currently pinned. + """ + channel = await self._get_channel() + state = self._state + data = await state.http.pins_from(channel.id) + return [state.create_message(channel=channel, data=m) for m in data] + + def history( + self, + *, + limit: Optional[int] = 100, + before: Optional[SnowflakeTime] = None, + after: Optional[SnowflakeTime] = None, + around: Optional[SnowflakeTime] = None, + oldest_first: Optional[bool] = None, + ) -> HistoryIterator: + """Returns an :class:`.AsyncIterator` that enables receiving the destination's message history. + + You must have :attr:`.Permissions.read_message_history` permission to use this. + + Examples + -------- + + Usage :: + + counter = 0 + async for message in channel.history(limit=200): + if message.author == client.user: + counter += 1 + + Flattening into a list: :: + + messages = await channel.history(limit=123).flatten() + # messages is now a list of Message... + + All parameters are optional. + + Parameters + ---------- + limit: Optional[:class:`int`] + The number of messages to retrieve. + If ``None``, retrieves every message in the channel. Note, however, + that this would make it a slow operation. + before: Optional[Union[:class:`.abc.Snowflake`, :class:`datetime.datetime`]] + Retrieve messages before this date or message. + If a datetime is provided, it is recommended to use a UTC aware datetime. + If the datetime is naive, it is assumed to be local time. + after: Optional[Union[:class:`.abc.Snowflake`, :class:`datetime.datetime`]] + Retrieve messages after this date or message. + If a datetime is provided, it is recommended to use a UTC aware datetime. + If the datetime is naive, it is assumed to be local time. + around: Optional[Union[:class:`.abc.Snowflake`, :class:`datetime.datetime`]] + Retrieve messages around this date or message. + If a datetime is provided, it is recommended to use a UTC aware datetime. + If the datetime is naive, it is assumed to be local time. + When using this argument, the maximum limit is 101. Note that if the limit is an + even number then this will return at most limit + 1 messages. + oldest_first: Optional[:class:`bool`] + If set to ``True``, return messages in oldest->newest order. Defaults to ``True`` if + ``after`` is specified, otherwise ``False``. + + Raises + ------ + Forbidden + You do not have permissions to get channel message history. + HTTPException + The request to get message history failed. + + Yields + ------- + :class:`.Message` + The message with the message data parsed. + """ + return HistoryIterator( + self, limit=limit, before=before, after=after, around=around, oldest_first=oldest_first + ) + + +class Connectable(Protocol): + """An ABC that details the common operations on a channel that can + connect to a voice server. + + The following classes implement this ABC: + + - :class:`~disnake.VoiceChannel` + - :class:`~disnake.StageChannel` + + Note + ---- + This ABC is not decorated with :func:`typing.runtime_checkable`, so will fail :func:`isinstance`/:func:`issubclass` + checks. + """ + + __slots__ = () + _state: ConnectionState + guild: Guild + id: int + + def _get_voice_client_key(self) -> Tuple[int, str]: + raise NotImplementedError + + def _get_voice_state_pair(self) -> Tuple[int, int]: + raise NotImplementedError + + async def connect( + self, + *, + timeout: float = 60.0, + reconnect: bool = True, + cls: Callable[[Client, Connectable], T] = VoiceClient, + ) -> T: + """|coro| + + Connects to voice and creates a :class:`VoiceClient` to establish + your connection to the voice server. + + This requires :attr:`Intents.voice_states`. + + Parameters + ---------- + timeout: :class:`float` + The timeout in seconds to wait for the voice endpoint. + reconnect: :class:`bool` + Whether the bot should automatically attempt + a reconnect if a part of the handshake fails + or the gateway goes down. + cls: Type[:class:`VoiceProtocol`] + A type that subclasses :class:`VoiceProtocol` to connect with. + Defaults to :class:`VoiceClient`. + + Raises + ------ + asyncio.TimeoutError + Could not connect to the voice channel in time. + ClientException + You are already connected to a voice channel. + opus.OpusNotLoaded + The opus library has not been loaded. + + Returns + ------- + :class:`VoiceProtocol` + A voice client that is fully connected to the voice server. + """ + key_id, _ = self._get_voice_client_key() + state = self._state + + if state._get_voice_client(key_id): + raise ClientException("Already connected to a voice channel.") + + client = state._get_client() + voice = cls(client, self) + + if not isinstance(voice, VoiceProtocol): + raise TypeError("Type must meet VoiceProtocol abstract base class.") + + state._add_voice_client(key_id, voice) + + try: + await voice.connect(timeout=timeout, reconnect=reconnect) + except asyncio.TimeoutError: + try: + await voice.disconnect(force=True) + except Exception: + # we don't care if disconnect failed because connection failed + pass + raise # re-raise + + return voice diff --git a/sbsheriff/Lib/site-packages/disnake/activity.py b/sbsheriff/Lib/site-packages/disnake/activity.py new file mode 100644 index 0000000..c5c59be --- /dev/null +++ b/sbsheriff/Lib/site-packages/disnake/activity.py @@ -0,0 +1,878 @@ +""" +The MIT License (MIT) + +Copyright (c) 2015-2021 Rapptz +Copyright (c) 2021-present Disnake Development + +Permission is hereby granted, free of charge, to any person obtaining a +copy of this software and associated documentation files (the "Software"), +to deal in the Software without restriction, including without limitation +the rights to use, copy, modify, merge, publish, distribute, sublicense, +and/or sell copies of the Software, and to permit persons to whom the +Software is furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS +OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER +DEALINGS IN THE SOFTWARE. +""" + +from __future__ import annotations + +import datetime +from typing import TYPE_CHECKING, Any, Dict, List, Optional, Union, overload + +from .asset import Asset +from .colour import Colour +from .enums import ActivityType, try_enum +from .partial_emoji import PartialEmoji +from .utils import _get_as_snowflake + +__all__ = ( + "BaseActivity", + "Activity", + "Streaming", + "Game", + "Spotify", + "CustomActivity", +) + +"""If curious, this is the current schema for an activity. + +It's fairly long so I will document it here: + +All keys are optional. + +state: str (max: 128), +details: str (max: 128) +timestamps: dict + start: int (min: 1) + end: int (min: 1) +assets: dict + large_image: str (max: 32) + large_text: str (max: 128) + small_image: str (max: 32) + small_text: str (max: 128) +party: dict + id: str (max: 128), + size: List[int] (max-length: 2) + elem: int (min: 1) +secrets: dict + match: str (max: 128) + join: str (max: 128) + spectate: str (max: 128) +instance: bool +application_id: str +name: str (max: 128) +url: str +type: int +sync_id: str +session_id: str +flags: int +buttons: list[dict] + label: str (max: 32) + url: str (max: 512) + +There are also activity flags which are mostly uninteresting for the library atm. + +t.ActivityFlags = { + INSTANCE: 1, + JOIN: 2, + SPECTATE: 4, + JOIN_REQUEST: 8, + SYNC: 16, + PLAY: 32 +} +""" + +if TYPE_CHECKING: + from .state import ConnectionState + from .types.activity import ( + Activity as ActivityPayload, + ActivityAssets, + ActivityButton, + ActivityEmoji as ActivityEmojiPayload, + ActivityParty, + ActivityTimestamps, + ) + + +class BaseActivity: + """The base activity that all user-settable activities inherit from. + A user-settable activity is one that can be used in :meth:`Client.change_presence`. + + The following types currently count as user-settable: + + - :class:`Activity` + - :class:`Game` + - :class:`Streaming` + - :class:`CustomActivity` + + Note that although these types are considered user-settable by the library, + Discord typically ignores certain combinations of activity depending on + what is currently set. This behaviour may change in the future so there are + no guarantees on whether Discord will actually let you set these types. + + .. versionadded:: 1.3 + """ + + __slots__ = ("_created_at",) + + def __init__(self, **kwargs): + self._created_at: Optional[float] = kwargs.pop("created_at", None) + + @property + def created_at(self) -> Optional[datetime.datetime]: + """Optional[:class:`datetime.datetime`]: When the user started doing this activity in UTC. + + .. versionadded:: 1.3 + """ + if self._created_at is not None: + return datetime.datetime.fromtimestamp( + self._created_at / 1000, tz=datetime.timezone.utc + ) + + def to_dict(self) -> ActivityPayload: + raise NotImplementedError + + +class Activity(BaseActivity): + """Represents an activity in Discord. + + This could be an activity such as streaming, playing, listening + or watching. + + For memory optimisation purposes, some activities are offered in slimmed + down versions: + + - :class:`Game` + - :class:`Streaming` + + Attributes + ---------- + application_id: Optional[:class:`int`] + The application ID of the game. + name: Optional[:class:`str`] + The name of the activity. + url: Optional[:class:`str`] + A stream URL that the activity could be doing. + type: :class:`ActivityType` + The type of activity currently being done. + state: Optional[:class:`str`] + The user's current state. For example, "In Game". + details: Optional[:class:`str`] + The detail of the user's current activity. + timestamps: :class:`dict` + A dictionary of timestamps. It contains the following optional keys: + + - ``start``: Corresponds to when the user started doing the + activity in milliseconds since Unix epoch. + - ``end``: Corresponds to when the user will finish doing the + activity in milliseconds since Unix epoch. + assets: :class:`dict` + A dictionary representing the images and their hover text of an activity. + It contains the following optional keys: + + - ``large_image``: A string representing the ID for the large image asset. + - ``large_text``: A string representing the text when hovering over the large image asset. + - ``small_image``: A string representing the ID for the small image asset. + - ``small_text``: A string representing the text when hovering over the small image asset. + party: :class:`dict` + A dictionary representing the activity party. It contains the following optional keys: + + - ``id``: A string representing the party ID. + - ``size``: A list of up to two integer elements denoting (current_size, maximum_size). + buttons: List[:class:`dict`] + A list of dictionaries representing custom buttons shown in a rich presence. + Each dictionary contains the following keys: + + - ``label``: A string representing the text shown on the button. + - ``url``: A string representing the URL opened upon clicking the button. + + .. versionadded:: 2.0 + + emoji: Optional[:class:`PartialEmoji`] + The emoji that belongs to this activity. + """ + + __slots__ = ( + "state", + "details", + "timestamps", + "assets", + "party", + "flags", + "sync_id", + "session_id", + "type", + "name", + "url", + "application_id", + "emoji", + "buttons", + ) + + def __init__(self, **kwargs): + super().__init__(**kwargs) + self.state: Optional[str] = kwargs.pop("state", None) + self.details: Optional[str] = kwargs.pop("details", None) + self.timestamps: ActivityTimestamps = kwargs.pop("timestamps", {}) + self.assets: ActivityAssets = kwargs.pop("assets", {}) + self.party: ActivityParty = kwargs.pop("party", {}) + self.application_id: Optional[int] = _get_as_snowflake(kwargs, "application_id") + self.name: Optional[str] = kwargs.pop("name", None) + self.url: Optional[str] = kwargs.pop("url", None) + self.flags: int = kwargs.pop("flags", 0) + self.sync_id: Optional[str] = kwargs.pop("sync_id", None) + self.session_id: Optional[str] = kwargs.pop("session_id", None) + self.buttons: List[ActivityButton] = kwargs.pop("buttons", []) + + activity_type = kwargs.pop("type", -1) + self.type: ActivityType = ( + activity_type + if isinstance(activity_type, ActivityType) + else try_enum(ActivityType, activity_type) + ) + + emoji = kwargs.pop("emoji", None) + self.emoji: Optional[PartialEmoji] = ( + PartialEmoji.from_dict(emoji) if emoji is not None else None + ) + + def __repr__(self) -> str: + attrs = ( + ("type", self.type), + ("name", self.name), + ("url", self.url), + ("details", self.details), + ("application_id", self.application_id), + ("session_id", self.session_id), + ("emoji", self.emoji), + ) + inner = " ".join("%s=%r" % t for t in attrs) + return f"" + + def to_dict(self) -> Dict[str, Any]: + ret: Dict[str, Any] = {} + for attr in self.__slots__: + value = getattr(self, attr, None) + if value is None: + continue + + if isinstance(value, dict) and len(value) == 0: + continue + + ret[attr] = value + ret["type"] = int(self.type) + if self.emoji: + ret["emoji"] = self.emoji.to_dict() + return ret + + @property + def start(self) -> Optional[datetime.datetime]: + """Optional[:class:`datetime.datetime`]: When the user started doing this activity in UTC, if applicable.""" + try: + timestamp = self.timestamps["start"] / 1000 + except KeyError: + return None + else: + return datetime.datetime.fromtimestamp(timestamp, tz=datetime.timezone.utc) + + @property + def end(self) -> Optional[datetime.datetime]: + """Optional[:class:`datetime.datetime`]: When the user will stop doing this activity in UTC, if applicable.""" + try: + timestamp = self.timestamps["end"] / 1000 + except KeyError: + return None + else: + return datetime.datetime.fromtimestamp(timestamp, tz=datetime.timezone.utc) + + @property + def large_image_url(self) -> Optional[str]: + """Optional[:class:`str`]: Returns a URL pointing to the large image asset of this activity, if applicable.""" + if self.application_id is None: + return None + + try: + large_image = self.assets["large_image"] + except KeyError: + return None + else: + return Asset.BASE + f"/app-assets/{self.application_id}/{large_image}.png" + + @property + def small_image_url(self) -> Optional[str]: + """Optional[:class:`str`]: Returns a URL pointing to the small image asset of this activity, if applicable.""" + if self.application_id is None: + return None + + try: + small_image = self.assets["small_image"] + except KeyError: + return None + else: + return Asset.BASE + f"/app-assets/{self.application_id}/{small_image}.png" + + @property + def large_image_text(self) -> Optional[str]: + """Optional[:class:`str`]: Returns the large image asset hover text of this activity, if applicable.""" + return self.assets.get("large_text", None) + + @property + def small_image_text(self) -> Optional[str]: + """Optional[:class:`str`]: Returns the small image asset hover text of this activity, if applicable.""" + return self.assets.get("small_text", None) + + +class Game(BaseActivity): + """A slimmed down version of :class:`Activity` that represents a Discord game. + + This is typically displayed via **Playing** on the official Discord client. + + .. container:: operations + + .. describe:: x == y + + Checks if two games are equal. + + .. describe:: x != y + + Checks if two games are not equal. + + .. describe:: hash(x) + + Returns the game's hash. + + .. describe:: str(x) + + Returns the game's name. + + Parameters + ---------- + name: :class:`str` + The game's name. + + Attributes + ---------- + name: :class:`str` + The game's name. + """ + + __slots__ = ("name", "_end", "_start") + + def __init__(self, name: str, **extra): + super().__init__(**extra) + self.name: str = name + + try: + timestamps: ActivityTimestamps = extra["timestamps"] + except KeyError: + self._start = 0 + self._end = 0 + else: + self._start = timestamps.get("start", 0) + self._end = timestamps.get("end", 0) + + @property + def type(self) -> ActivityType: + """:class:`ActivityType`: Returns the game's type. This is for compatibility with :class:`Activity`. + + It always returns :attr:`ActivityType.playing`. + """ + return ActivityType.playing + + @property + def start(self) -> Optional[datetime.datetime]: + """Optional[:class:`datetime.datetime`]: When the user started playing this game in UTC, if applicable.""" + if self._start: + return datetime.datetime.fromtimestamp(self._start / 1000, tz=datetime.timezone.utc) + return None + + @property + def end(self) -> Optional[datetime.datetime]: + """Optional[:class:`datetime.datetime`]: When the user will stop playing this game in UTC, if applicable.""" + if self._end: + return datetime.datetime.fromtimestamp(self._end / 1000, tz=datetime.timezone.utc) + return None + + def __str__(self) -> str: + return str(self.name) + + def __repr__(self) -> str: + return f"" + + def to_dict(self) -> Dict[str, Any]: + timestamps: Dict[str, Any] = {} + if self._start: + timestamps["start"] = self._start + + if self._end: + timestamps["end"] = self._end + + # fmt: off + return { + 'type': ActivityType.playing.value, + 'name': str(self.name), + 'timestamps': timestamps + } + # fmt: on + + def __eq__(self, other: Any) -> bool: + return isinstance(other, Game) and other.name == self.name + + def __ne__(self, other: Any) -> bool: + return not self.__eq__(other) + + def __hash__(self) -> int: + return hash(self.name) + + +class Streaming(BaseActivity): + """A slimmed down version of :class:`Activity` that represents a Discord streaming status. + + This is typically displayed via **Streaming** on the official Discord client. + + .. container:: operations + + .. describe:: x == y + + Checks if two streams are equal. + + .. describe:: x != y + + Checks if two streams are not equal. + + .. describe:: hash(x) + + Returns the stream's hash. + + .. describe:: str(x) + + Returns the stream's name. + + Attributes + ---------- + platform: Optional[:class:`str`] + Where the user is streaming from (ie. YouTube, Twitch). + + .. versionadded:: 1.3 + + name: Optional[:class:`str`] + The stream's name. + details: Optional[:class:`str`] + An alias for :attr:`name` + game: Optional[:class:`str`] + The game being streamed. + + .. versionadded:: 1.3 + + url: :class:`str` + The stream's URL. + assets: :class:`dict` + A dictionary comprising of similar keys than those in :attr:`Activity.assets`. + """ + + __slots__ = ("platform", "name", "game", "url", "details", "assets") + + def __init__(self, *, name: Optional[str], url: str, **extra: Any): + super().__init__(**extra) + self.platform: Optional[str] = name + self.name: Optional[str] = extra.pop("details", name) + self.game: Optional[str] = extra.pop("state", None) + self.url: str = url + self.details: Optional[str] = extra.pop("details", self.name) # compatibility + self.assets: ActivityAssets = extra.pop("assets", {}) + + @property + def type(self) -> ActivityType: + """:class:`ActivityType`: Returns the game's type. This is for compatibility with :class:`Activity`. + + It always returns :attr:`ActivityType.streaming`. + """ + return ActivityType.streaming + + def __str__(self) -> str: + return str(self.name) + + def __repr__(self) -> str: + return f"" + + @property + def twitch_name(self): + """Optional[:class:`str`]: If provided, the twitch name of the user streaming. + + This corresponds to the ``large_image`` key of the :attr:`Streaming.assets` + dictionary if it starts with ``twitch:``. Typically set by the Discord client. + """ + try: + name = self.assets["large_image"] + except KeyError: + return None + else: + return name[7:] if name[:7] == "twitch:" else None + + def to_dict(self) -> Dict[str, Any]: + # fmt: off + ret: Dict[str, Any] = { + 'type': ActivityType.streaming.value, + 'name': str(self.name), + 'url': str(self.url), + 'assets': self.assets + } + # fmt: on + if self.details: + ret["details"] = self.details + return ret + + def __eq__(self, other: Any) -> bool: + return isinstance(other, Streaming) and other.name == self.name and other.url == self.url + + def __ne__(self, other: Any) -> bool: + return not self.__eq__(other) + + def __hash__(self) -> int: + return hash(self.name) + + +class Spotify: + """Represents a Spotify listening activity from Discord. This is a special case of + :class:`Activity` that makes it easier to work with the Spotify integration. + + .. container:: operations + + .. describe:: x == y + + Checks if two activities are equal. + + .. describe:: x != y + + Checks if two activities are not equal. + + .. describe:: hash(x) + + Returns the activity's hash. + + .. describe:: str(x) + + Returns the string 'Spotify'. + """ + + __slots__ = ( + "_state", + "_details", + "_timestamps", + "_assets", + "_party", + "_sync_id", + "_session_id", + "_created_at", + ) + + def __init__(self, **data): + self._state: str = data.pop("state", "") + self._details: str = data.pop("details", "") + self._timestamps: Dict[str, int] = data.pop("timestamps", {}) + self._assets: ActivityAssets = data.pop("assets", {}) + self._party: ActivityParty = data.pop("party", {}) + self._sync_id: str = data.pop("sync_id") + self._session_id: str = data.pop("session_id") + self._created_at: Optional[float] = data.pop("created_at", None) + + @property + def type(self) -> ActivityType: + """:class:`ActivityType`: Returns the activity's type. This is for compatibility with :class:`Activity`. + + It always returns :attr:`ActivityType.listening`. + """ + return ActivityType.listening + + @property + def created_at(self) -> Optional[datetime.datetime]: + """Optional[:class:`datetime.datetime`]: When the user started listening in UTC. + + .. versionadded:: 1.3 + """ + if self._created_at is not None: + return datetime.datetime.fromtimestamp( + self._created_at / 1000, tz=datetime.timezone.utc + ) + + @property + def colour(self) -> Colour: + """:class:`Colour`: Returns the Spotify integration colour, as a :class:`Colour`. + + There is an alias for this named :attr:`color`""" + return Colour(0x1DB954) + + @property + def color(self) -> Colour: + """:class:`Colour`: Returns the Spotify integration colour, as a :class:`Colour`. + + There is an alias for this named :attr:`colour`""" + return self.colour + + def to_dict(self) -> Dict[str, Any]: + return { + "flags": 48, # SYNC | PLAY + "name": "Spotify", + "assets": self._assets, + "party": self._party, + "sync_id": self._sync_id, + "session_id": self._session_id, + "timestamps": self._timestamps, + "details": self._details, + "state": self._state, + } + + @property + def name(self) -> str: + """:class:`str`: The activity's name. This will always return "Spotify".""" + return "Spotify" + + def __eq__(self, other: Any) -> bool: + return ( + isinstance(other, Spotify) + and other._session_id == self._session_id + and other._sync_id == self._sync_id + and other.start == self.start + ) + + def __ne__(self, other: Any) -> bool: + return not self.__eq__(other) + + def __hash__(self) -> int: + return hash(self._session_id) + + def __str__(self) -> str: + return "Spotify" + + def __repr__(self) -> str: + return f"" + + @property + def title(self) -> str: + """:class:`str`: The title of the song being played.""" + return self._details + + @property + def artists(self) -> List[str]: + """List[:class:`str`]: The artists of the song being played.""" + return self._state.split("; ") + + @property + def artist(self) -> str: + """:class:`str`: The artist of the song being played. + + This does not attempt to split the artist information into + multiple artists. Useful if there's only a single artist. + """ + return self._state + + @property + def album(self) -> str: + """:class:`str`: The album that the song being played belongs to.""" + return self._assets.get("large_text", "") + + @property + def album_cover_url(self) -> str: + """:class:`str`: The album cover image URL from Spotify's CDN.""" + large_image = self._assets.get("large_image", "") + if large_image[:8] != "spotify:": + return "" + album_image_id = large_image[8:] + return "https://i.scdn.co/image/" + album_image_id + + @property + def track_id(self) -> str: + """:class:`str`: The track ID used by Spotify to identify this song.""" + return self._sync_id + + @property + def track_url(self) -> str: + """:class:`str`: The track URL to listen on Spotify. + + .. versionadded:: 2.0 + """ + return f"https://open.spotify.com/track/{self.track_id}" + + @property + def start(self) -> datetime.datetime: + """:class:`datetime.datetime`: When the user started playing this song in UTC.""" + return datetime.datetime.fromtimestamp( + self._timestamps["start"] / 1000, tz=datetime.timezone.utc + ) + + @property + def end(self) -> datetime.datetime: + """:class:`datetime.datetime`: When the user will stop playing this song in UTC.""" + return datetime.datetime.fromtimestamp( + self._timestamps["end"] / 1000, tz=datetime.timezone.utc + ) + + @property + def duration(self) -> datetime.timedelta: + """:class:`datetime.timedelta`: The duration of the song being played.""" + return self.end - self.start + + @property + def party_id(self) -> str: + """:class:`str`: The party ID of the listening party.""" + return self._party.get("id", "") + + +class CustomActivity(BaseActivity): + """Represents a Custom activity from Discord. + + .. container:: operations + + .. describe:: x == y + + Checks if two activities are equal. + + .. describe:: x != y + + Checks if two activities are not equal. + + .. describe:: hash(x) + + Returns the activity's hash. + + .. describe:: str(x) + + Returns the custom status text. + + .. versionadded:: 1.3 + + Attributes + ---------- + name: Optional[:class:`str`] + The custom activity's name. + emoji: Optional[:class:`PartialEmoji`] + The emoji to pass to the activity, if any. + """ + + __slots__ = ("name", "emoji", "state") + + def __init__( + self, + name: Optional[str], + *, + emoji: Optional[Union[ActivityEmojiPayload, str, PartialEmoji]] = None, + **extra: Any, + ): + super().__init__(**extra) + self.name: Optional[str] = name + self.state: Optional[str] = extra.pop("state", None) + if self.name == "Custom Status": + self.name = self.state + + self.emoji: Optional[PartialEmoji] + if emoji is None: + self.emoji = emoji + elif isinstance(emoji, dict): + self.emoji = PartialEmoji.from_dict(emoji) + elif isinstance(emoji, str): + self.emoji = PartialEmoji(name=emoji) + elif isinstance(emoji, PartialEmoji): + self.emoji = emoji + else: + raise TypeError( + f"Expected str, PartialEmoji, or None, received {type(emoji)!r} instead." + ) + + @property + def type(self) -> ActivityType: + """:class:`ActivityType`: Returns the activity's type. This is for compatibility with :class:`Activity`. + + It always returns :attr:`ActivityType.custom`. + """ + return ActivityType.custom + + def to_dict(self) -> Dict[str, Any]: + if self.name == self.state: + o = { + "type": ActivityType.custom.value, + "state": self.name, + "name": "Custom Status", + } + else: + o = { + "type": ActivityType.custom.value, + "name": self.name, + } + + if self.emoji: + o["emoji"] = self.emoji.to_dict() + return o + + def __eq__(self, other: Any) -> bool: + return ( + isinstance(other, CustomActivity) + and other.name == self.name + and other.emoji == self.emoji + ) + + def __ne__(self, other: Any) -> bool: + return not self.__eq__(other) + + def __hash__(self) -> int: + return hash((self.name, str(self.emoji))) + + def __str__(self) -> str: + if self.emoji: + if self.name: + return f"{self.emoji} {self.name}" + return str(self.emoji) + else: + return str(self.name) + + def __repr__(self) -> str: + return f"" + + +ActivityTypes = Union[Activity, Game, CustomActivity, Streaming, Spotify] + + +@overload +def create_activity( + data: ActivityPayload, *, state: Optional[ConnectionState] = None +) -> ActivityTypes: + ... + + +@overload +def create_activity(data: None, *, state: Optional[ConnectionState] = None) -> None: + ... + + +def create_activity( + data: Optional[ActivityPayload], *, state: Optional[ConnectionState] = None +) -> Optional[ActivityTypes]: + if not data: + return None + + activity: ActivityTypes + game_type = try_enum(ActivityType, data.get("type", -1)) + if game_type is ActivityType.playing and not ("application_id" in data or "session_id" in data): + activity = Game(**data) + elif game_type is ActivityType.custom and "name" in data: + activity = CustomActivity(**data) + elif game_type is ActivityType.streaming and "url" in data: + # url won't be None here + activity = Streaming(**data) # type: ignore + elif game_type is ActivityType.listening and "sync_id" in data and "session_id" in data: + activity = Spotify(**data) + else: + activity = Activity(**data) + + if isinstance(activity, (Activity, CustomActivity)) and activity.emoji and state: + activity.emoji._state = state + + return activity diff --git a/sbsheriff/Lib/site-packages/disnake/app_commands.py b/sbsheriff/Lib/site-packages/disnake/app_commands.py new file mode 100644 index 0000000..d22f22c --- /dev/null +++ b/sbsheriff/Lib/site-packages/disnake/app_commands.py @@ -0,0 +1,997 @@ +# The MIT License (MIT) + +# Copyright (c) 2021-present EQUENOS + +# Permission is hereby granted, free of charge, to any person obtaining a +# copy of this software and associated documentation files (the "Software"), +# to deal in the Software without restriction, including without limitation +# the rights to use, copy, modify, merge, publish, distribute, sublicense, +# and/or sell copies of the Software, and to permit persons to whom the +# Software is furnished to do so, subject to the following conditions: + +# The above copyright notice and this permission notice shall be included in +# all copies or substantial portions of the Software. + +# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS +# OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +# FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER +# DEALINGS IN THE SOFTWARE. + +from __future__ import annotations + +import math +import re +from abc import ABC +from typing import TYPE_CHECKING, ClassVar, Dict, List, Mapping, Optional, Tuple, Union + +from .enums import ( + ApplicationCommandPermissionType, + ApplicationCommandType, + ChannelType, + Locale, + OptionType, + enum_if_int, + try_enum, + try_enum_to_int, +) +from .errors import InvalidArgument +from .i18n import Localized +from .permissions import Permissions +from .utils import MISSING, _get_as_snowflake, _maybe_cast + +if TYPE_CHECKING: + from .i18n import LocalizationProtocol, LocalizationValue, LocalizedOptional, LocalizedRequired + from .state import ConnectionState + from .types.interactions import ( + ApplicationCommand as ApplicationCommandPayload, + ApplicationCommandOption as ApplicationCommandOptionPayload, + ApplicationCommandOptionChoice as ApplicationCommandOptionChoicePayload, + ApplicationCommandOptionChoiceValue, + ApplicationCommandPermissions as ApplicationCommandPermissionsPayload, + EditApplicationCommand as EditApplicationCommandPayload, + GuildApplicationCommandPermissions as GuildApplicationCommandPermissionsPayload, + ) + + Choices = Union[ + List["OptionChoice"], + List[ApplicationCommandOptionChoiceValue], + Dict[str, ApplicationCommandOptionChoiceValue], + List[Localized[str]], + ] + + APIApplicationCommand = Union["APIUserCommand", "APIMessageCommand", "APISlashCommand"] + + +__all__ = ( + "application_command_factory", + "ApplicationCommand", + "SlashCommand", + "APISlashCommand", + "UserCommand", + "APIUserCommand", + "MessageCommand", + "APIMessageCommand", + "OptionChoice", + "Option", + "ApplicationCommandPermissions", + "GuildApplicationCommandPermissions", +) + + +def application_command_factory(data: ApplicationCommandPayload) -> APIApplicationCommand: + cmd_type = try_enum(ApplicationCommandType, data.get("type", 1)) + if cmd_type is ApplicationCommandType.chat_input: + return APISlashCommand.from_dict(data) + if cmd_type is ApplicationCommandType.user: + return APIUserCommand.from_dict(data) + if cmd_type is ApplicationCommandType.message: + return APIMessageCommand.from_dict(data) + + raise TypeError(f"Application command of type {cmd_type} is not valid") + + +def _validate_name(name: str) -> None: + # used for slash command names and option names + # see https://discord.com/developers/docs/interactions/application-commands#application-command-object-application-command-naming + + if name != name.lower() or not re.fullmatch(r"[\w-]{1,32}", name): + raise InvalidArgument( + f"Slash command or option name '{name}' should be lowercase, " + "between 1 and 32 characters long, and only consist of " + "these symbols: a-z, 0-9, -, _, and other languages'/scripts' symbols" + ) + + +class OptionChoice: + """Represents an option choice. + + Parameters + ---------- + name: Union[:class:`str`, :class:`.Localized`] + The name of the option choice (visible to users). + + .. versionchanged:: 2.5 + Added support for localizations. + + value: Union[:class:`str`, :class:`int`] + The value of the option choice. + """ + + def __init__( + self, + name: LocalizedRequired, + value: ApplicationCommandOptionChoiceValue, + ): + name_loc = Localized._cast(name, True) + self.name: str = name_loc.string + self.name_localizations: LocalizationValue = name_loc.localizations + self.value: ApplicationCommandOptionChoiceValue = value + + def __repr__(self) -> str: + return f"" + + def __eq__(self, other) -> bool: + return ( + self.name == other.name + and self.value == other.value + and self.name_localizations == other.name_localizations + ) + + def to_dict(self, *, locale: Optional[Locale] = None) -> ApplicationCommandOptionChoicePayload: + localizations = self.name_localizations.data + + name: Optional[str] = None + # if `locale` provided, get localized name from dict + if locale is not None and localizations: + name = localizations.get(str(locale)) + + # fall back to default name if no locale or no localized name + if name is None: + name = self.name + + payload: ApplicationCommandOptionChoicePayload = { + "name": name, + "value": self.value, + } + # if no `locale` provided, include all localizations in payload + if locale is None and localizations: + payload["name_localizations"] = localizations + return payload + + @classmethod + def from_dict(cls, data: ApplicationCommandOptionChoicePayload): + return OptionChoice( + name=Localized(data["name"], data=data.get("name_localizations")), + value=data["value"], + ) + + def localize(self, store: LocalizationProtocol) -> None: + self.name_localizations._link(store) + + +class Option: + """Represents a slash command option. + + Parameters + ---------- + name: Union[:class:`str`, :class:`.Localized`] + The option's name. + + .. versionchanged:: 2.5 + Added support for localizations. + + description: Optional[Union[:class:`str`, :class:`.Localized`]] + The option's description. + + .. versionchanged:: 2.5 + Added support for localizations. + + type: :class:`OptionType` + The option type, e.g. :class:`OptionType.user`. + required: :class:`bool` + Whether this option is required. + choices: Union[List[:class:`OptionChoice`], List[Union[:class:`str`, :class:`int`]], Dict[:class:`str`, Union[:class:`str`, :class:`int`]]] + The list of option choices. + options: List[:class:`Option`] + The list of sub options. Normally you don't have to specify it directly, + instead consider using ``@main_cmd.sub_command`` or ``@main_cmd.sub_command_group`` decorators. + channel_types: List[:class:`ChannelType`] + The list of channel types that your option supports, if the type is :class:`OptionType.channel`. + By default, it supports all channel types. + autocomplete: :class:`bool` + Whether this option can be autocompleted. + min_value: Union[:class:`int`, :class:`float`] + The minimum value permitted. + max_value: Union[:class:`int`, :class:`float`] + The maximum value permitted. + """ + + __slots__ = ( + "name", + "description", + "type", + "required", + "choices", + "options", + "channel_types", + "autocomplete", + "min_value", + "max_value", + "name_localizations", + "description_localizations", + ) + + def __init__( + self, + name: LocalizedRequired, + description: LocalizedOptional = None, + type: Union[OptionType, int] = None, + required: bool = False, + choices: Choices = None, + options: list = None, + channel_types: List[ChannelType] = None, + autocomplete: bool = False, + min_value: float = None, + max_value: float = None, + ): + name_loc = Localized._cast(name, True) + _validate_name(name_loc.string) + self.name: str = name_loc.string + self.name_localizations: LocalizationValue = name_loc.localizations + + desc_loc = Localized._cast(description, False) + self.description: str = desc_loc.string or "-" + self.description_localizations: LocalizationValue = desc_loc.localizations + + self.type: OptionType = enum_if_int(OptionType, type) or OptionType.string + self.required: bool = required + self.options: List[Option] = options or [] + + if min_value and self.type is OptionType.integer: + min_value = math.ceil(min_value) + if max_value and self.type is OptionType.integer: + max_value = math.floor(max_value) + + self.min_value: Optional[float] = min_value + self.max_value: Optional[float] = max_value + + if channel_types is not None and not all(isinstance(t, ChannelType) for t in channel_types): + raise InvalidArgument("channel_types must be a list of `ChannelType`s") + + self.channel_types: List[ChannelType] = channel_types or [] + + self.choices: List[OptionChoice] = [] + if choices is not None: + if autocomplete: + raise InvalidArgument("can not specify both choices and autocomplete args") + + if isinstance(choices, Mapping): + self.choices = [OptionChoice(name, value) for name, value in choices.items()] + else: + for c in choices: + if isinstance(c, Localized): + c = OptionChoice(c, c.string) + elif not isinstance(c, OptionChoice): + c = OptionChoice(str(c), c) + self.choices.append(c) + + self.autocomplete: bool = autocomplete + + def __repr__(self) -> str: + return ( + f"%Q0WxVV9B=(GDFxAo4^IJ+WYC>P zs(xX)|G_&pIcA+5gR+XRYo|tHu73eYnF)SA?%NRyklqLhZ08%Cg^-e;&hZ!CKwF}| z?Gjta>nDhuLjF#9U8jAg@xm#c#67&2A8DTNG>zofkb;Z_WQU?%tnVp3> zg1dyO!n_c$fwJtu90kZ5C=rO!A7zt< z@}DprhbzRn05HX$yqA7@g}G199Ubm4n`aN46J9Ak#ZX_h}2ha1<_ zUn_JWR+Lg=1w1BW<11__R$ew!-AP;>8`>-{H5OyNP}R$|&*moB8%S>DMTwYkdw?ae*x)RnFe%8*Ru0Jb}3Jp0|v&c8)v!lbBwv?KErlqLJg^hLz_OUUh)u z>7|(Sx)AWD}j=^H=b${b+|w}mJ<>dq_@QX0la z!|)F6QXldoI!^x=@R51vkKv;jVK;v8pCBTuo};}hDfH2|h-d!0i6~m;Q#GZ0^2H{W~tLl2z-e9pzkhsimjZh2RUTWZfppxrvoS zQm%SjH#(D}iSNHgEflRLa-BsZ(ZnkC79m9`S$|hGP&IGKxVXFOSt|B^93}6nNt5ZI zS75KE)hAcI#(3-kf4TK!d((})@QHRShCZH8JLUtN<}z_we1LT#w@JyxJJpv4NtvyD_HS>u!{1ob*XeG#z!f z+{JC&*^YTv1Ce-^GRDPG_h+(~v7JVFp+()h=Tf?e*}Qd40)HqBi88&W(V4$PJeY{WRO=z*vef<3= z2O!Q@X|YYeHCt(7@;Li4moKG^?rU*G%L}NCO__e-A5Y)OFZPMtvd`ckzc_4doYPNx z`G}VPj(D3fw{X|LU}1d(Cp^2iy~DFK$~UC@*HRaz%B~>?&oW zcFfpAEs&bHEg9v7SXz*hyA#`fe*5`|7@4`wh|%sqeJ~@3!?mKtHTqZ}swjry%AWizJpG*A%+n)+B_SRTK<-4mN4zceJ!rP!DP~$or(Od zrZr-AP~({*P3rG>!{_xN@ojYr`91_c0tGCSBUS0Iots+m!M~yp_~ZjkXb|`dr{ZqN zyP8f0;6yyk23@MQ8J>_yW-&waZgW+6TMs}l!nP;MG*JiGK&HfNO%E2)Q)wfIOFlkB zCHse(fnhz6A&w)dd_53eCp?FO=vkr0)B=BMK}F`9CEyXOWDGMdMA;TDgAgV6gYaWp zxLh|mHBy9Jq`XIfI_l3tchtCv7j!ML(R3Jn`?^abGy`umnr##%(si21;sso2QLysbv<`+hfz(vTF_DFjZ*Vv z@XI<)0O)=Uk2iUj470=xjpA8lbi#~`ab7s9GIOaJU$|(s8KU)6nDG8)j81rJ$_#M` zKmVBKhS2l(xp5ko0u@9Je}dVOA33?Jv^uQ(;@nbzdVy}%kg`P)x3N|)aJ`Ugft0S% zz&6HIi|e^u-=4dUaD7+qI>_~!T>WWW&&^$9>DXA3y9PM}V3{wI7P03a{y*EjJ7PNX z&W@?M7PNScpjPXigU0Zp94LmD4#8nK=!7d}k>Z%+nK)_Qbe3fvcpDEPv$e^^8M3yn z`Zp#YlUQr(w}nKR&a%v`lUNB@TV|En&KD*H4mphi#OxmRz-oL)D_ZBzvl>rug_?S8 z55Fi?=UY#1XkqGe3rc2b15xVUg#xGW(m_}X2R%Sq{cX_(*RRtit-k~(`Sm;VaEA!y zXVX=tu=Y3P6snZ>*Akz-8sGD9DUN;Tz}ofegevQaeY%tP0WI%+73%%L36QBy8MDBw zWExNW=aXRn{#_>_xn(Jnkym4}pK8Wy_&a=1I@cijM9x~~ZCW!^D`dFg&7G<#n}-wj zW71i{-@U z?mF$s2;%!dCyB@n9lurL%6y|lLHZ;=`kG$ah2Fb*R@I72y7^4qgc-?aFVTUNx8#Bu zZ7a;B`rBJPE9F%ojqwLypJADI7KD*%tXTqfC2vuQqmYg9NzS}tq-T>GYbw0?vl`#x z{i>JA*~4#BUJ&%DyAV<-PH;PZd zTt~LKa3CGnjo`4Ag=w*|+ao##j;v`E#NDtxMNC5dnAvW5elH&O+i>HjpbnA9Q?FKs z1KlC-yi@+XdolhI3`{vF^%{l|4Oy+{&_WTG=Bc7yKY#ZkL%Za0s-g^(T8*fn{UtY` zlgg_fi~em{UN6D;cVIQQ1CM_MMFp&>!NRPkfrlSyA+0AHb9-M~nmq=opRB9I?$A&H zz?P7_F_1G<{FL!fCL>ShO#V30#q+SA=yw)i2(zQ70$Vd-nkB6LsU`lZm+Kb@&0z9^ z-G;CV=aoS!HI;P6L~*JIxQJ*xB0aP@_K{3tDV`lY8v0t zf6f|n>H#_i$F39cyn59Z{^ro^&65J{$@G}?DI_+<<=B-wu4qTO4*#DosJ}lb0_%7J z4MqP}t`q$?iXO$7Fv7NwfA(C+&`nzh$EBWsnQ z?`>zf!6?oN7zPYEyD8n(A@d1y8J z1K|=}T~qVGHKt8I21j`yGw{Q+b4yb2JgSi% z?*fTXnbP3uX9O4oFU?Jrm3kdvOM@x(*N_K$u;U9g<<1Y7a>wmvxB~9IpVx~1pr70G zfgAXaIX{mR&*jteFvDFsDC|cr0zl#%VXeIykcg)4n-oobJrhqQz<~c;-a=#X)K_sO zcq^W|uOsIEO;J4c_4Zi8lfy>QXR&>m*+|%(T{wC@XFC4>Bmb8mcn&{OF+I*%_#U(# z5v2h1d=WB*|H_=ZxBz;oj%cd_IbQ@m$D^(bH6EPVw0z=4e)$@_2(7XJyc9sabWbOe zr_Z3i^cibev{9|7Abk|fEXm!>Ea8q=HmEasbW@q0RSrJm;;K+yUf1+w1hsUs|2?(8 z>w4CFy?5gM6SSh-K1?@E52Nni_OqocY!ih@sy1yMquD!<$&m6+Q>(5=?ri@zv}uUe z^se;FkYerDEooF;i5Bd$5`KrsFBe80iT3rUxR!6hsrS^r9!U^qYTK9f4A~ojVSIO$ zN2nta%%e1w8WT;-Iy3aDotkwf$}59S+2%P$HMypF?&pP~p#m)xg&aUTO9$Z~R+X{V z%rTNZ#Pc$ZG#b){o&Xpl$;A>>Y|=oI+n3@Bdp^Eg1U?eJTnN5gOc-2`Z9mQ{A!oBN zKOtm7zRfxb5XD6j-`sAlPK2D4c;qmqoT&vxm}QqBm%C^%4*0vovbb+P9||0eCfXt# z?$7dB>@yHNVWtJHn~8cgf>+fI9ocL&u~tpXI2ADU^;3>opi+@DoVEHq3^fOlvxh?{ zv!+^rW{ShWV}95%FGDJf0|V&1D#drHcxL9+1CS-o+6uNR*iU3BUBF4#dzVC`f?-1; zyYaG2A$d3=2@)B)Ch~FES!rJUYU>PRX;FeW02G=Emu0?QrKuuban*L)Gd!|x>4r4% z%x)%NxD+PV!#OrL+hucuxs5T+DN?MjbF7s{nA*HX-M#0V+HA*B=ufh?X`T3Au(r8w z*xKfOqpWQ%Hr6&mhsN4QDT21!sYZD%f!sUHYI<{|+-Xma(dwGXenynwRz)h2sCf#N zA2*eSn-`NGB|qI?j46rV+16WFwbP32tR^WzGOfr}2($5_`Gwu|*Jt$=6W$#Y&rIe= zFec8*+`*ydlmHX5KH|(nPbjXrg6CQ>;h#)X(Lgpl?T4Z~tQAM~_3MAAv)O8VjvLG> zS3V(lyR&2e-ZNRQe=vZJh9FJANV@&Y~Sk#>Zqtsq`M0Poq>+! zty4JEtGbqrt$M*ZV#Qw0^)T)})c!ux5nM6X{+JhdAYvfyuKZW-=;7QbqFPGJ^;y&X z2zL@%@i55cb*hKJl3RpeD@8nUSs|$={OpyIK3fmA47Av*S89;G??qq+K^U$j;N%bW zk?`st>dV}zFC0JG;5vTd^Z13fVj17{_&JZhYS)W7`YQOd9KHxIayFYGIY&u)PzG5A zLMXxw4#6LqI2Zyng7Hbx0x2pQ`2?I7bNX3_Q!`4!yF<{|MC&?)`YXTYjYmj?R}yj% zr}c%V9K&L!A{00l3miu$>>XD_^heCSyCUxU%}i(NpJO4i#Dbh;AIju0x23M)5*Guf zoo)2el-6MrH)9u>+nA~ZT*nf7x_%{-yQ?07bHT1F&^lxyxI2>AdH#OGi(RP?Mj5za zN;bRiFcKzs4r9M3H7q1Ui|hm2Wgpm1AbJehTCly8eH&S1@gvjCs zCD(iDt8MQQ5ixhLT8e#{6PymU|0S;~-X(&4vzbi_9q4Ve3KSVe-o&D+0NTqkCoqM` z)nq4C(kZsRw$bBUQX>*|A9|2W>IfL4%iAO*;DNS~Cl$Cw+Jb2jW<-<;))%*H7ZLj? z^JUcVA*ZpM+2y>EhxC`AVK|C3Z!vfFT#g1_)RBbPC>H3JHYWEWFGWf2BeYu~fHkB~ zCJxygar$~Tn08xb(|{1c`8^E~QsR@g?;)>a3o3H^A>{awJV5)(-sr09O&7c>pU1e` ztRnvKwzE}3RBVh^85d(ukDY0@mQ%4t%LA!0g+%Tx#CV#Uxj&&1Y}I7gZO}IQS*htW zm&vV$O<6LwY5a@-n{c1e#8^<@JmCd)0KwzMt&j0R?pe)iSE!99#Ma<|(kMABN`x1e zw+bFH(~I2MsrY@6jg)3O*J(=IIVdA>XNRWrmbYb%vsU~Bw=g~kD?d|`S-J?}o(BRE z_n}R>MT@v=*Xwi6N^c2nF45Z2Qf}I{fTQOeg^u9l@SlU)OTq|}<46cET&d6TyY`>? zMMAYmcyHcZ4dITZ=OI19Nas657O6*|d)t|a^LAYMvct}J3~2FV$jW@Kh%};KG9(SdxG6*UQu~M*A1GSjUtuIis9>WB0tTNJiXF6fi6nf8&|)~4cD@s5 zaN)Rn3xn&A`Suw4JDwo=SoF+IiPDFntaZ*f-nV;Zs`w%0jiJC8r{dO#SS=OBZnUd* zH-ePxPCPVH{;MFGIqPu)-5{?XM#OH^*ytl_DLLMb9M0Y#Ztqf`1;x#**CIHFHG~r5 z0DnUE@oT@y;>0i$Tdl`RRlv{}M^VeLg45W4&W{aoZ~KUO^5ybMc_KHcYT$^pnjnPR z%Sqk?e~`MaTp%?`YDA3Y#Bbb`@Lz1QLAAsJEwYMul{X;;Y+_&bA%y!&9Gzd__s)V? z;3Nudb&<#UG=spV**@b%Z3{WSkeJ7F)E+tCEV!Tiz%o0DoZ(Lp>w(91SdZ;v_OMy9 z9-|#|8KlZ%+r3MqSdX=tOaG&);5^4OG$^d8*Rv6>)`IR6u3cqWn#hZNakJZ?1P9Ek> z_Ac;)%&hk53<+-N>g-|`~R5~4m#nZ9B0l}rO4j(xRd zihN`_0t*-r9B*FlMC7=Q5IIpSwm;gkdihUz5l_%dk{}{$EARX5)QqJg^5IT093K=@ z$*A0}@x+NKZ^ek|>0}52CDm)+5!;;w@!x?R_H|IAXAo0D?H7O3tbZh-ctz1O*h9BO zaC@a&`IKOD{>w<>GP`M#0Lf}T%Jb*&Cg5kUHoC#3pvk;^Fe=D0^TY!P`x1=dWc}4s zc10Z$#5C|2EQeH(axg`)n5_S>b5&fH zk)p_e?`Yyveh?M{FWH)J*Z6$fi0Yb}aRx&#>}l;m-xANGz@xN`M?sE=GV~MF3-ney zCrBSi1-#HKS1FDwb2RiFNq3i|kNIMWR^-3w%}}tY*ID4eZe;9@yO!P9ci50m=eP#6 z$TfhN(L|2TxdyZjy9N+18H!4YuzD{L-Gq-kHl~VIH)WTmc`{3C`1g06U#q#zU6B9P z_Ufi7%nbYKa5%89+SiU+0DtjLy4fKI5$1S=KgDKm^zHal7@uJT($20&?5<Hh<_oR#*x{a_#QcR68JDh-OpqtMDIi7bg&-kX14YO44i*G@(}PV4hjHEyV(yo zOi`l!z{%JeOI)U@i)$8f8)62{I*Ve+%eR-eXfLo%Bj)t{31h+cFsa>UQsvQPs^AAy zXgq?D10-;+Ip)nMR6J7}3cNHlrMRWEo=>=k0%>Az7e*5;!&BP+U!&aNm4_+!t434q zC4#^rk8=fD$xHYXdA1SKEHOb-%7*Bc(Wm3y zy)YKe!AIEc!yx!B?oi$y6;IT46p+nrQ%H(!E94bawMpnHi6yj)a&16 zr(Vd!EV~j(f`b+(p6==;YKl|eXrS55S8zHOJGMD52qNh052sd%>`iVB(Ntc|&6@$)yuezC z3}6RP87U65%t4)XdS4h5$CHQq4yC(&#t*JpAZCAapJ{NcTo8X+PdX!Gi7k;`eMyM(`ArEgAoDdcRGyg(la`?5L8 z9TS*X;si@~oc9e&M7w0)LzLEF0*j`kjjg{O9i+r^;%tsfisH_LcW*;JgTC)UOG^5>7SOggO9_(G8feV3RuBk-Z3kN#wt1aV{Lcs_QsGK3dIC0KMz-|TmKmB+qJina<;pD`oB3Lj zUOg0KMpEGlP|{`5#5%1}?9QV%VDlt>V#s$)`|h*03yXVZ=bZi5O6eVa`uaZlh4TTg`W! zc~GYDN$%ue;GIt3>Okgm$U`V9!R0WP*k+itQd@PPG3?B(66%|QOFv&K=j!sQf zIuOT{;3CecE2tA@|kfU`~*?$%fh0m;r<^I;luR!*i48=|ECa_CPGx4VgVjOHp# zEQI49gpityFo>zkwm{NS`V(l5v_Xp#@(@ z%2dwjdNO~1wFIMH7u*f10Yn86T4WaeR{G+32tC4ikXzvuFQ7Zb6|qz57tC~8mKB0A zdq0aThi#}+)A;J4HX!-Ik_*7nW09}mtLL-3+QTdMH_2J=>AVKmzEFoe@2n?xb)AO% zNFH6LFdH0Au{+bx(~b@wTsrK|(>dq$-9|dKjL4CO-pF|&Vnx)l?7c&zM(@R3BB5;U z9nXUyGGk`S|KZ#+SZn{0)+33vnsCJ0_@Ozsy3<{}h!ccFU3w*FVM~sFJUEB}e7Cy6 zXkh>SZ_-EN&>W&p`_mO_Cr6fxRLslIT#FsoO^MBpcJAM#$91bZmb{#-#$ACM_x(&UC16(fvl@` z)7Q3UeVJ!}2dPQg(d*4Z*58AOwanCL*1quMx8vo;buPQn2D{NFMn>A1RwL34RhdR= z_XsKUUX8<^-!>~tn4(#dWdhB?uxtMwzp>ewFZ~WI6E2P>cleWG|0FdNE~`XeS7mUS zwdR`~jUMvw_GltpxmnT*1i2@fMj_e2?#xY?`)saIapF+sf64Y|tx%!HKY2t#l8SWmSqKgvGN209IO6`asvr{)sx z=OGQZ_9-$}nZ61V?Pu~@*xYxv{KF%kH3ybCnB3wZGQA4~J)ywip5^M{luvs-)CZC7 z{KF&cp~Nn)bDCg=Ye;yfU0vy8URrQ_wU>9RC(sE7go6{{{MTtzq3fSiZ|dJ4b=S@1 zo_xuUH{9&bR8A6XYSg~&^>Ofc`~s(|Fg&}|pO-%B4+z#7iaGuU_e~&eKq8r7Ee0Ifo5>AOP25vjKOf)~Xs5!(H?hfj&2#c;t2VllWN%%{1?Q=UqRN zYu@|TpYV~z=YM43|M*9gy5yXZd|5?ixvV3ma>#YmC_;fFObia-nkA7gX38{Q zBPL5R)z0~ZQA;|mMksOJ52y3%rJo$4d_5D8;5GH#a3-)sP6Jz_Dn(Ojo~wpv9g z6FUJ4a_x5qH5QSOV@@mFUC`spz5@l9zvlW#qVZ8)A&t?Oz9_fciQk!U2A?CHt8sr@ zIPd*Dw6;E2^z5e#sWf#*b_ihcc3^Fk-53 z5PR7&*sun)!~{nPPa|KBwe{wF92)q2FOkmzdk`SFeq>x>H4+JQIE|0I^ zzy8BmBvie;>;pzFPWC|QTm6s6@J0i_7m2$=J|v_lb=;kSt2H~B5*_c*^L{Ql1P-fgAH zNipBumGWeX`R zYy9T8 za7*(W4=x?w*e+f$wxhRbg1L%spONw>jmIYP>|{>?ZPyak?a2#JTOo108yPUbZf%v7 zOMQ$;4p;mddTB$;8xe09K9jbN(+ z*b2)Ivk2HKBW^N+OkgW0*a}ShlVM8&&2#zJc407}EEsVLOCBD{zdBn=3e@yrr?H<( zA?F8W+^51M`Di?@w^FE88z)g_yRmXVi%amw6d}4&CIlH0-w@f82+$KtnJpbjndn5Y z0V$G0d$1#A7xYmQr<-l@Z>Z+JJTl3n^F@*Pr!~!~0=?fY8<9+RR5*!c~Q1 zShh;Yk_&>@TeumB$aCgRYl88iQ;nPW8CE1Jw>6qkKoFLCki|mBw+n~9<4~!YuYa7k z0!I~8nw@Km=;7G@!kv@fc`6m3hG6bvNI#u{C^_kXAH?4Tq#%z;SHE&J<7k$@q|k{^ z>;08eH@SDbn4Hu`A$2?n;Yv-|PXcs+JKs%*Iq)%kyj!|Up^f>3WvKZxj0?St(y|mw zHMVFx&hwcWpB=~!kE{2FWVX2GBPh~yl|?V&n}^}hV4`!qn0a&bTfR6hYkWw7alMw! z+`QYwe983fsKK6C{~41wsXl>}uFTKoW3qr48fK_IjF5`hC6L=PlwpEqA|bzJ09g%* z?r`#0CNclhgJS-JY_o&aDLjC2^u|lidMYiBYOj6g_7!wEH&Lnh!a;@Xxt=V$rs>P^ZryT6eqRabgn~gLZW;Qcnwm#ApbD!D7YtEJm z02s%d62LiVEY`LIM<{)dBZxprT0_c(U-w!=`h4#N)PfDtOWB(%Xavj0GMisc8F`dB zCo?N6WC8Nsa*1MKmF*@~gNm1d-R>(?=IXm%xfi^_>CZgQ6Oi6t7vy1{|7BRTV&KP2adc{gG-XCN0*NP@>9sUw11A_|==$d$Q3bhNp^|GXTRIGt_DkJP>xiNCdwYA!~F&Ovs7eNh5tY7=X&Q+R$x%|1{|3`!O zp{~QldK)C1BEj|Hf)5XlWU2--t8FglZ3RanzjrK-F5mGDK!sB=h=Nc1wx$w{R$(>% zCHyuuF)=h4L1{CaBUH7MXZ$rYu)}E34N6M>tydcmf&;z|>#4TtzC+mq)#+}0nBiNE zKt?P;wQo1D8Yuvk*R}N$*?O&77%d;CEfb%ER>IXryWgy#Hu>91w)Ot4r{6YnCb{n|Gay0W&P=K-}$R{!2!kLH*0<=R26C;aIfgU&v zoe!fhdk*6tx`ah(ktmqtBw|iO&Z~p=3$Xhik2;7O&4C~{F#PV#aS;ie=D2|D%{bd2~CbNH1qW%2c6b;_-VTAnVBhK4YB5|s?*CRSM{UM zjdgS#>kU-(gCTYGzN*t!?6mVDmzPTUGKS03y%VOiI0Oe&Zc#-J`E!xRA`+a&23oF8 z-5Pn#LmK}MQS2;$>#12Rb4%e3d-)DSQ^@umRADuKfjS`vzyUWn@#zTJpxW$axP+{y zY-wl<2i0NtCqHgT6$rhii_j|b?P~hWym|BbdeGnXT!nBTK0QPR8f#i&85k@NqO}sZ}(ETIFfQV z@x1p#o1sKhZK&i5Qxb7688bJZ^*)N42z?37q~eQFAzN#|GDdI^&ugmYg4ASA=3x-j zE`)_};|q~9JW7iXr^54x;FZ9QKk3$I+>HWp@($}bRupolPoN!61;V5x#Te{{FhW;S zCpbT7pnk-82jAc7_10FRh@AGdE^pOL`*ue3!C2@uMLm-*+AHAf%5VwF5L zgFjMTh3));rZ(}CY4q-eh)VMskZ-o)i=(bo9l!|i=55x^2QX<)9D^>RrOeFz6ZRaC(T+bI>7Kq*R(ha!G}D=P8Hznp-@O` zgFHl|p6oBKnaK2saSGa_Q7BJ)38Ul?*u_g;==9YX(X zFM7?ain6_9c}Njz#n}UG#&fZusx{;sb6z1hJ*#9xdZ!uNhb&^ZpQ%l7%Yh?ihG z>Q0{!chZ1J2<*QVWR1CnyKI7u)H^i?GYh0FnTUJCQ6#1&Z{K^dMCVYOxR(O<*`i2W zxa9q;Cj9wz<9qQPc`mgc?f9Z z?1Qu$7tA1^AxK^NYjAR2g(s*$d~i|K)H9a*FmzrRS^O$Yfb|Wl)hUUUScWnfAnk_C z=iW5lfl`Z*b{!c5)8JJk>S+o&)X*E5Fa8=7Q#aY{E>>PEnRSbs;r{6}y9%VFHzNt$ z@QV>}G!u26NIWf>7cB1tC<|4+YOVVf(9Jnh>2yV%cI0I+J45@?dBymO{+KEe_ha=p zGZ%E1M?d0 z{8O?{o7EhjZ#9#3v2(K+(dqz}f6d0+M^-;53QV;ZtL9bImm-3)ecP+TwadmKyb3#K z*zHcZEKB_Hu%v#ak?c-eKC+8FG0Z||UQiwZc6Pg#GE{ZUTKh2_MtHi0S%C0dnB>pt zOmaG6jw>n#d7b1M_<==y@kQ3weB0L+W<(d;SYa2^^WMvC#)}zI?}c2bs8u#{Eff*F zDL>*nfUO&LiBLFc983FqKc^iW=OY*rc7jWCgq1H|5_3#Mft>x8_bo$8VXCIS4B6h< zDb&!k+v2tRJpCte`){Dajr;}|VJzhun|LL-nq0KKf1y(pN=c1i&70V+2qc*w{RQLl z-VhxXUzEDAI;A%B;_4E2Mn10$%FXY=XY$?U=7UC+%Ev@X92v(g!h}+0kJF}{Y}lN$ z`TnV#S!LqKQF=J+^w)gKd0-7ty}T!n6VTXFbe_um#e#t>G5npK*Z+r6?|eu~7Dy-d zM^2vxen10&o=P!mOE4ptgJvpeG*iE5+6poYBxT@W^eSJ!l?!TR*1v$Z&QYaD`ks*y zbjW#GSq{**^|U*P!*FJetZRP%OLNO<8omNqsA3OCs z+xNph>On*9fhqhe_A&34>MH__&abwAR0_;}oY<*v*Q#oAdxS(-6WXmcKh$Y2fL->Pc-G|Gkb2*m#g-&e0y~}UAKRVae{p^J+ce$W|=V51)yhi7bvjSw!x}1)XlP;I=qL=jAR&1vn#owi7F<`~W&NDbyyimB?*2NUUA+^I7V z6C?J+PCr~W=>KD+q=@K52@s+{83f8O^3V9X(AA;`h&m_9pIvS@LwSGzexUA;IIp9~ zSKWEYb?}tssyLbX%Doa}`=h?!V_*)4D<;&KE7uUitOl-}Jc{rb=4Wn3wo*d%@pJ?r=%NQL%J<1^f{-C}|4LD!wB*sFAE*g^>$H zQW_UQx0*UK(;j7udoJB1pD&q>dbYUIXq<00y4%oHoLf0_Wz0rFLPL}ly6qO(2Y9P6 z${6=1G6;+?#+BvhA27!Klf#*N_KC*l*S=? zmU#brr_OLn55T*#%i6JQ;FOgKP#I}iQpE=-8!TXl&q&4gP9;Ep9HG^AvoLHCJ9{7k zf0b-2idMa4tx191;lQt>iT&}!jwuIqj$z=F${fW{M{(c;J5Bt{t2%DQ2>vghWkHyN zs^#gIplUyW3?ZnR0M{Pn5u*IJ@(5Y}rm5-_{-|~csJm$sCkOcSM1LezTpo8`M7ed_ zuyTvAI(63&XKLTDeiZlxi-q=<@~KPuw0DN~+M;lky%A?Rt`)KJQh0PWkw)ct;IK3LX+=Bg zIKPBNx7PNl!1;x}g(DFrs?R1WJ%{F1E4bwe`k2zV@0Vbg^4vbrHo@J)a(}>cS)A;L zGbdH0bqlgr81ueE=h|u+vbP$I>=$wKk0wsaTs|rqu6q3pr*?bkOs8}^(QSvo%Om3C zoFhf~?l zs0BUUyesJWtIG}a2twq7VjSUf1h9OAka6FIzmYtC?9Z^>Vh&kidcv55K=TSI{YVp; z?Dt#W_(!giH+$cItb;TK{&%j1W9cW zKce9<$@fHvY}(2*lkI8RH7(WFbK8lu-ECeY1nY3s5j9Lm5xO%%&iYAi7n0tuFuaSKw>moo*raea=%_ezWS?W z9uw%qeh;b?W0j~9=(LEQs!rKxe&FMNX-v$Cr}62}2wiLf7&rrKmkyze#VSdBw>-ly zdS6A;fKE~%jkwdT@Q_G3PE4Wvz7D&oomo{-4KZdtQP;_UG;{7=)`gh%=uc38=IYNv z{aI{XxT3s)_cE_v3ryp`*3FmXUFZDP_^rLjGaZf{6q9hwoTtpAzm}w)>F$Yfc4a;4 zgtubu?WB?M{DnOCpCW}sK&~v4wtYIX!oHh+XQyWV&UR*!77$_#>pW2sFj&yzk^BdL zzDXa09n#^(G}*qHSi0Xt{s}6Znz?$0Tug2&h+^3N_xKt=!MWb%)j~?FCaE|l|H0p> z!Dv<1T0<6StS6+sbzatCpy8MRnN-lB(O~Y=+T5$T)aG7qe*d}rVLeLsm*EsPSxG*J zlkp|fWxW?06zkiiBz=SS3CZ*?Lhj7`;|%CYt) zg;5WrQ)Bf&Y@2vUd|J%*-pn=Io5;kEaV2MNw{#`3Otx>*ZPoFwU8uk&-VJ#h9-!2A zI+h;sXDRcQm6P{ zq9SOeAa~pTys2J{$Pm{LA7jK${*io)Ud9Y|>xg^@k@HXIfn2VG-O9(v5dPBu<6b_-E|T0@F7yurZyh|Q zKTFy~F9j|k$Ianv@-apTc%{>Mi2l#zV?-!3A|K;HyzILgYnNmnp&&b~fy+&vx3N2h1Rp~Tp9gXYf3&!|*3e=tAe z@WXe>&p7<>UGg&yKOD}_sML&CBOvM{DN2sM&gEwum7K9R>cdu5{?AN+)%YH8p20sk zOkt*4h+rB~2s+UADIp_~caiHVo9TLOdFQNkEhnKiGd{3)9`f?QdV=K9IU7NvE6PnW zB1F5SC@!-}+u;S>rFk%kF&tAKM{2GyNsYL8uzW6UQ%}Md>U8rHOD(|OPxN%EaUpw2 zfw73+MND}8nI5{{!)$Bg<4NOGLNzbpEt==RiDveG7L2yg4xD0(FAWnRueN*%8UDg} zvQt7@k_KL3C!QkTV?E6q{5H9e?>aTBq0cV@N`y$+zE=p)d4EwffW~s?fW$(+6J83) zhauydB#qOB_RjG<@E{)nEXNR>b5TMAJ>aK{8R3|Is5Cm2NQVY=^Khezv)6gBUWJ z3Wl@B8_gsgl)y3s6R zCy=rnoU+TD*TeZ9G0r$Y-y@&Rb;Jmk4M)1i3<8e9{Jw`Zao_X zVLDyD#|0SUqOkKi)40iYzjzk2pVhe)NG)hE^Z%wVY~6M+hEWUeXLF~WCO^dCL*mEY zk`eMY1Kcb^@%7-&>sf|Ub~XH#m-ewbOqQT?b3dwZHzGZD{YmAZ8Gz0?na7_j3@#QQ zJ6UWn@^rAr{6M=q*O+_^?mw{ey_Jv@U`Eh_5vQ4t6KcMrFLr<0o_ZGRan| zbeSeoCMhx-JHV`D$RsGKRH)JTfbmURDEsWfmo1<#|S1YBik{WOre#97dggHPvq zx^~Y|{dt3VdQEHdmRXzCX{`NsXxVC23py5F=ux?uqT?`74wlA zAWrTMGIrcDj33~)Fh`0O;M4HOvVl4Wy1IuYYswL7J}q*)tNt0L7VGj&W}lG{XAzk~ z!VfFQSj1|41~rJ%V1`000?G4!rWbAJY{>UBp=NSK&2VntsDz&z*XtgerWImP2m!j0 zSF?7r2-u?C`n?@^YVR8R6BOni?(&kiz0ZtZRfx_`94j$&xy*}DV~`G zpeEhtMA=fQ3`>(-x=&v}**-U@oNS*Pen-QK?lLmlCw|TFCDxh*eKkXzk@~L5<|hHt zP`1zSK*W4!RJKoBlHE6GFlT?>ESWiq*TUv9F0uz85Xjq!I_tlX>Jv;v6pH0B_o8+`3q^r);(mP$4i*%Wj}q_B%fZuL1%yf zXs`c~9G|fS^X#QbwY&aM;KB1n;&_jYG&E@cpH1<3ogo{~P4PLIEXK^D=cO$QWO2{m zGjIRzCHbU3BRV7VC6ni~n{Zu*(!yII1kFQ^PvwD29ETabDVjJ%n$L~b4db74@_n-8 zZQ79|@_nkvgj7=L4E$b*6!k(aA;EIFJ~vj%RITwZwRaO)&Rui{OGzk7womMh{@eLJ zV_3kp>fBJUDseZ46%^egBE%rK9Q_-r+G1GbHOGH1MZ$s>6l>?F`?T?IUoZLctv{(G zweU}bOWrNvC-JdzmIYGwq?T_;qhcab#@e+d? zhCEy~P-k4?U1IeI$PbDy1Q8WHjXjw``;ee82{^m%gDrv?dX2%78T4m^nL+=3bY{>U zJcbgva@ns$zm3Way8l1P49Y=zPCn2boRW60LCz-aP485;5oiSOjrh09;e=_Ge2)Hp_Y{q>)V z!zK}x5>W-tJn4*&*l!_svY-QH>k9oyzL*cGb#F1k#V9NNd#K52*I-=uoDoJqN-N#I7T4D&dfx*X`}|2a#Tos82ohDnS=?f zoqV+)jkA3+55LaNB?R;j7R3{D{e6c}C`g!nHA;+abDUDln`V|c5q9*!P_J(-c{051vkvgIi1sz@=3D2Dp7DC>z_i3=t3NqJ@)eB_bj>N zE_?Zj*>~JiLo^@fILQQ%afh*i`6qk%+jrh`M>ORx4^P<5nEcKugoH&%8;Wb@Mv@c1 z^~Hj`>@~-4%vv|JV8*|s;)aD|3i6h`?}o+txxDc4Q)jZt{<5!?M{u3f|JXIw|4!dW z?D@jrodxjk?fIcp;m5e_Wm^?q$3>GU&X5~--PF_5Heem1X)31)ZZ+v(H z$*c=cEh@-sE6jeOz_cDpO+3S;_4MndR`Q!_C^hkQ3ZB7!EH8CsxA*Ld`|hX4h^rOZnj15v<7i1Cd8g&Ux;X8bD|p05iS4uV zX}utgCtk|V#P7Y#v6$`57UusIldcYWHVi~?)U<*LkQ_1>WoY}1Xgm<#`NaEFYM1F!;cM%=@@HdFYCllCS1x?xr@8rvJ(7#7uQ!{oV-jp49xZSSmOv zHJ9~?6k$@J1qxy$g-xV$qVZsjb^Rsf^kLap>|n&Gxii>D`Ckj8-B^qbAg+xy_k$-hx@){KD^|!gLSf(l=9i$Xk&IsVKVEh2@ZYpx)I-8axL#Zm49{A;GGc9E|KyxtlhhPuo?!`y zAf=>{0LTy!u>N1{At)?nY@7k!1~`m$%O$rFQh)j@Bdr_Vw`yKnQ?Aa|D3|hym78hXl(cJ*Bjd+uDr4R zP3~&2yBgb9D1)-8jHF6&MVt7Yh4lDl!JFxu*1b$i9>kz9dr93Pb>f+R^@WplF6RBX z>-=Bd-UU3W>U#LjZ9*U!&VURCAsQvA(HKC38XBWBkjNQHG+xjIqhhJ3wJL=fz$%(J zNhKVoQhT$1FSWI;m)dGCBH%3{1Of;I@B(5bK(%KaR4xh$5$F4@y=RgM((iqr_j{i& z&oepuy7t<)wbx#I?X{!sJ0+Z*{CQ^Z`*|hAAwyEThDy$PsNV!-V5}0`|9A?DdF>Lg zQTN3PoO)n%wMV}-4=Jr!tP)9)GZ|x1_c6}SrMyY~_GoDPCsA4Q-0pGLYygp}owM%P2+p4>0({*>GPd?0$tC z{f~VG_8qTd$~l;kXMaL@IJf{PV@}2OLSbmc({C}YwEPKbe3=;$2UgSkBZ^!0o5tUq zuLCIX`FS!g3))^zjvR@NVf!tecaVMR5mb6c*&_d8$+)djflNEEB{Im)tWHXLIay_u z@>uxF7>6u;ztr&JuwKoQ(12tbZhvr<@(i+HAvCftA-}ziDEldbV}X*Nfy7Mzp{%np z1`FcEOS1cgK85XUg(f$`dXodg6xlT8jor0T_Xo6_44E3_os45ewUqH%u5wCS-xThe zN(yPiZLl7+lZ!@wU8Wdq5w@tC{o{OzfC5g(kyy_kfvHNC3$~i}8Ot0C$lSC}y;N}!D$_UbE@XE5#6PI%82HV$3j+?_`LdwPE8~>UyEw&dlKIMyP7Pcez|!v$vC6yixbK zZMdu_ZADIhxt&OsMMY4@NDP=?6en<@E)}a1^%FT%S3U@;>eXXcJEdJ*3==9 z5W;G%XGt-Fhzj&Be@seM>xa5!WqSp!SPuA@nQ%AN2r@i;uaV^=>i!QfVS;4k0iGb?Ufqc4k=&j^{R_FIaDc_Ob8-udDb~XcNnPnlzSMQm-F^G>HsjSHvzs$u*M^vU@L^PEatcA^ zi#;iA#ko@WBE~Ho*Y!+ZO)T~%}%Pz|xY_XZqUw*9UHo=E{I*XJa zhx01)U%{bV6F_nKM?yR}Ts1TyQTgKPp>2jMZCGV0`><9QyF|l(l2OnhrfDQx1scOL zD+^nz=+4&gAfs`ybj(@a{gtIoUv)~-{FB3sj0Alt;<}8pd@4WvG|Xi-w5rZL%Ue(Q zQo~g~j83c^_A+NoBz~H}mnE=80y_z5A*546x+G+O;4cEw7wme#C}@pj#qmPr!=;f* z^N&e5e>H}ARoQ|&B?P`8r{Q;U7@G_@7sJNn=iSdJrTIKbMj`kXf^T-?uq1|?z?X9S z@Gb=J!sGES1nK8h`Cpk3K4Sn=iFP>bBnuhPfhcyAHP+{*xKB zy3L8B_+glrZLKP7i#59cHsh@1h*Qh!XbhKe)?fug@a!@h!m;+9L&MFKh-!)O==QB9 z&?A8pBruok69~zb5SQV~8W#AgK#VnSyg^UtpHECPK~?aQ=G?EEliR?qAv_t8Nvt$v z0wvJS{`}X8h)$@%p%+LQCkFlT&;w)HR^N)`*dGd->xDWPKRGDl%4gh#tZrsYj3g{@ zh3`~B? z*EO4e`vdPttHhh+q!|5D?V*PjIxY;Ybf{2ya>95@W(@SfR|7@ES0e-XYQO>hUB-o! z5P5>(+gBe1g3zx^Ul;n-*ia4qLW0Mjq4B(sv8877l?R%y?3vws<*~(AM%%>yW%HF^ zL)))BA_064HDB2)PJN!yeC5IBE02=?8{%B@o84TUvAB9jJYM-F+$5auK>o1rHkI0A zgsW6vvYSQq%r1wCs@iY*1S8rFpv~1n{+jR{injUO~7T}(Wdx`p(|wxHm!|O_b7s`%3haO?FD?PZ;Lgn zYnZG)YbpW&&PjS*J`@1C+3ZVwN7iO8T1{o!ST0+xQuq`5T2e>XgwGewq$S)AWS{jw zE_a!HgphMKxf*7bZ_`y2a*0Q(IPU?TK}$oXo9iz}sTlV)kL4k2NOopG|XY#VR61U`#1+KTTV%Yf+Hm%Kom z;TdFm2_3jE*-YO6Futvc?RB`I-@j3ju*P+PA@-jEV}HZHgguPxF@D}3WTFav>tbH6 zAd}fJNsWxFgZE^o1(34m7UepAK8lwy7I;j{J3;Dkp@|S3?s%A)dL^PaUx9r#-4w}< zoO(FPu568gs`>@b@Z-&tz9=BAsaX2$$ME7-Ck&(V8Q z!IHxUM_MhcAp1~<{R2@)R(n?6e_}z;*=`~j?uq(~rPGGmtLPHT`7(jXFS);V6hAS3 zwiu3;vYRj6?&maNgPo&+>AjTd{8quN3u+0i3vXAd8k>4r?Ggx*Nz@q_?1}-H> z)ScQPMV1kYrLoCUUT}SsOK;TnRt?YEAGyJDjwXfu1L7&;@|E@E4PDk?ze_QeGdfiv zEXk3#cG^>PGFacXwNn`o zb8r)?L2Hc0Pr-raHk$V0sN&L8VjFhwOc*34hC=SouZME?Oi`^nlBQ9)qwewj z`A+p&YrwV$Y<&+k>Y{_~C^GE}-=_M#jaVZwmW~=s&qv)mC{GL%iu+yMGJKfW9lnPi zR+Wtmse0(2%7w&?ae;8-ha!!Wmp9or^%KOt`NRr+4H$D1D&&}ggBp}e4McV;&<)Cx ztRk3wM(PlAkEe79fri6IDCEp1o3haeq+uG;aDgPMhQI(;Ry^~J1VG=c7C;GbKI6i< zlJf#*hg?1nxj*1z9}}_mKsdt_;QUF!N!U|jcPHdrPEL!f?CzHYDibIPsE-S{zXA@G ze)z28eZwZoI)e}%RjD^T|EOzQTnX|(#w?rkEn;6FcX6G zUnBHgUG8bU}M_-lA~nJ7eVmaC6SYYXmRT$x(3pr7I-ax`-){V*8PF8Co;T%dv)HW^pu$-oQi!GV1QS5#Z5beyFB5dQ|?6q(?M|8oir zQ>ZHq&1iS=y{eEAt4Q@Osq%;GRG;8q&5zRVrj;4wHHb_4_zzOLpSw=7);V5Q-}qNt%x-M`1J& zn|^$xwF@*p?p*bCp>w;_{m*M@a>hX?BjVkOvyG!gtB9q~zY6C=EBopbI2FvC7m%96 z`SBoPulGQsP`_`aKc%Bw&JrE#me?01_U!)h%~Ho;qS=#|I`&V;vB}JIoU9AKi}$S) z@YegQ;+FQ^^ExN4-raLQuHKx{q-{U?$)Wb1okec}puJ~&(W`uoMkH-X?OVS1j1Wf6 zGmIM2xOYmL-n#r^$=5Uf{GEJ_M%mL4>-s$0Lhbsj^MfUmf`)_$nAwY}GsQ!8nE zT}7w!UA^bP^EuK!;wXwL++1BMbht`Zi)YJ%Dp)zOYb% z%UacbsAl8pJ?mCD7OR{!t?fPiBQV|{f=dT?ycG0-h1N)!t--gK39?8)81RV z1Ayy5dduoP;pg)Ykyso>LnJm*yQO_+?H;~c#Vt7QY2R75x4pM!bwaVyH0u%0wnysR ztK_?7-qwlj;hpa3;^`?^)xPCu(d~l9Q3lq%46ML7FmZlDe=weQ5o7=OV(FUxn#k_G zfBZ=5?K<@ZJ^;=ZW^8iDRiaWPH7fgHFAxgEE4WYb3cC(&Yn6QY%v;y|k`i zL>WzCMF0y# zM&tGv30;Rzlh7-OhlJMfIgW(hA~_yJg+h%;nbiMKup-VsOP-MP7hHj%h;I|k$A2Ob zt{mxKnXIp=@3)C&n+mUSS~|W9A|r%V5zSxgxB)~nRi|^lMo*J&Ao0B5r>Za^p050L zIz^mtLQIb*o(cU;2KRE6q0Z5wzBQ1jfOH^bTLb`{*a`Z_&?sjdsyv8r2if zPnUa)E+a-qUFUzz&;b^mzcWYYuWJM0F2WE37raeXg+5cU+D-gEB2HEV?pUx4B&-PZ zP_nLuy9ba|OOf3h1pEN9doQUJ**yTiHhZb2x9=gGXY3jvZhyD*czU~C$9_dldyK>m zq_@u#t?2Diaj5x#LssMe9eVpXY2)M0$Iu*7-H}P$lz3l?S@p#{kT=Vq>^HQuD5&yGaT{ z&8h@ywUoT>3>9AIaLG4P(+Ry@Pk6p7hFF36)*cu@Z}+MKp|?j>u7UKneOv9P?K^8e zhU9)iGv*xDCA1ON1zmPtD_HNW&A(B;dutuazqdB$VpSVRbT6wzZ%tbQrb4RkmS{-z zt@4eN>h;xlVx;G4!4h`en5rYCQLg26l-4E8u+0p zwHF($Nozt+Hn>;1e5)L>(TVe=837M)gJ8Ps!djl z&r0iLbJc+qxfL~!o|FaYYttD>QLO!N?XpIlgR1Wr$$_V|aA1N62iQ1@(nEsMUTiOJ zk7CKTU-wYWooF`Q4FaZ>m1z$l7=&)p{#44F5OoiGg+MuK4fbXScv{!#A=-ZSyAqmT zj9beML^jomQHlI5D9Od$8An0C@{8`xt5)2)7=+RQm582WcZndZ!hLXmN;rvchLpfl7K* zlCDkM>B~N!5rNP%5s_1EvmcQhjfmtz&rJ62VAN`7fzBZNIUq)M+oNdprGiWW4y#*S z!^O2W((x@>!Wu8CMIt=-5i;7Xeg{Xw5m&J6=1N*D;AD?lf1%RKNRM1@53Zt)m^c&V z^u;2GG@FOwTC7}GxI~)$(<`JIFzb4q%U-74R)bt~crFD+*p8HD=eOY-ql`@)sOTy(c>mPEAB?PIol|g?`WK8WmPehZ!-Ith_+mN`@P6YME zt4yB$6G57&8Jxywfp`>DAUn(wyN*tL=i#%zI!B?BiVAChcSYQ{=#&@pvF{u!x!m8= zL03!A3<*NXT#^r6%TNe>Cl&#RJF&Tkk-p#$pOzns%!{qfV!;A{9ke%Gn`L5uKZX8Me zK@67P;Xt_}dkw~hQ8eqS3{|~@KNq)M8LH^Qjaa5)Ket7;>)X?zDy-PP(_FFLp3amH zF3L^vXG$N;q$1Tfv;kAvyHCbuzr@f$m&0G6MDsI=vzETj|JF}44zEI2D(YVGvNTSI zwJqvih7$-VBk_s47f?UiB-XD=<4@juDPh)z+y}9-D~&LNM6|(aBJL@Pg-6|av8Kro zIM@AMN|0!#CStd!l&IRBvF02$8J!#H@N#a#haaL=l*t(IhN@G-A|1CJpTHCKiC&0h zj0X4Jh7L6y$uN6>Q7_ycvH~tVqo!f3Ja|cEsr$4_;djm@jU32g0mbc>kl<;O-Y7s| zQ0v}CHE?%TajBs-JQ4oV-9ZqmNKT20`b3y(=S8?-A0-Rydfi^WT)U8~z6J25b?~L^ z2PHjdh^MF!kGW;H*&05-vT&U**kjyZKw@ERh2KZ0AVBKy*C8CK3kx8A8*#Vu>*9y@ zhuR%Up`FIcE-?QkJtIXu`IMk2kX%JKEBCPP=jD=K_7415z$Zv4gaD}~=LVf#Vx@Fg z>zblbIt)x|a*DLuz40=NqoSE~GVKU5`BT8%X8>R?N9uq(yy0w4A}*R>F~O3O1> z-UTbALeL?(Y!;dfV9#6g?&GNZrT$-r@Hy@kNiS@_OFbLV^tZD zxv&_LLXqFM(T3bkGDP6qvDA*&^Pa{LEPJs`5#`Zn#3qhUND^~jn0(nqjFDtCjsPp>9(RGc=H_@4P|S$8_%MgdeoayYPE}~SHaF(g z(^^Ql%4D3AAiSX(cU4V*E)>>EOj2cJ`AA&W9xyAMtg zAwI6~!O2E#9^}IHwI&xL?{Z_JhnWeo_bOS9_2!L`pS+I|!+x2|@D!?nA_tU8%(P3|9}SVd=RIDs6rW!Nx;! z#xA}w;(PEDD8@nKlmAqP+|!s}*xM?HoWmzTrd{rA1*n!|mHT&_Yg^ddC5@GmXo^~A zriyfR7Iw7uq*FA#RP!FWsGrMmv5w3cslWN3BbFo+aY`aa`>Dkztix&?7wb04IjqwW zUX#CGyQMG|^4gCvfJv~_x~xyy&3T3i;@?hjFa5YJ3t=Y!4%ul9_ym#VK8ROaCp(gHIQJ0BWOeU+dRrGWnR7Q(f|8z)>Z z;W8fa(QyQSs)MWK9)vSzG8AUprYvI7SRukgGy$q z9O0_58;quBNlj2vUyz7&99K$aA-%NhD^hZ!@XvUjR-Q9-rcykb+McU||4bSh75(z? zD;zb;$f52sx`kG`#%+E1W`*WM^-QUmHLG`Vg!iKIa42NjG_NLShA zDx0Q-;V)>er6vYRvCw8Y_g*5SD(4)Jbbbem*;WF4MtKWyMlSu-j@he(A ze2-Y<=dCSyjL7+n&c9D3mBsK;T&7XJinv!3@^8RxG`@n47U(%X16uf8;KccXK6qD4 zp3IylR91mE8CMM6ttzm?XgU=%6o(l8j6tmUYs-DEB+Qh{WU;!r2TA(OoN7LLMLv9S zyl(E%3Rb7lbVeVn-ziv)%yBhL*O6F{xVLZ_jgy%DjLP9;G#c+C4HZ#52Qo;O2$y?1 z$;vI~bUyYIQ)#Gb1+YE_@18z*cPn^dUCa_4>@NcLUsc2exFYNg(dc(cT&eRq34WM! z>!h%se^Os2=2?VFRTZx>29JLRp{Y0sGU2|maRx?8JGE%S7k-Pb*Zfu@?veufaIG@V z;rvM%=>H2zP55V|j`xoYmQu%?#L*Y(>wlf5{fYnz-Nc7Njiz@&PZb!xMvCgEUvh=s za?jT3Dvk1-dj*swqvU7e%5=QIN1EHH*lsl8R&|5RvD_Ys$#gdJ(Ul#KOAk@^H4-9*^Iei*yl2Mb1u~k+b^tBO3od z#pBC!Uc;GCKQ-nA*`E^*vLD7$mbxFr6+`w}iHjrq0^N^rCs3i}^NgF*CAKN&$9&3- z3g;<&2lNsmhHZ9v1s&7f{Vn`O0MQoSB@yxScaTX3hHkR2OZ%`;<&5nN)O`y&NIXnB zdsjJy{9F|h@Bb5}{l29Ahorr=521K^;ZI9*-XukpQNF`}CZqUo+OwewRqnCw>y@tp z-!^*1y#DIkvh^AFTNmIQf{U^@xgdu2nw|Km3Vr$|w< zA-IQClrb%EjmFo-gFYx8J?CG;#p3jD`N-mAH2Tui{9muqf2}=|-e`P@-2s^&!=p3* zR0ZFrHW}^)Jh~IEli)|rRjJ)S=nFO__+c?Ht5qi0>b8i=#6mEQ9pSm_#Lcl>IX!AL z-Ve>vJAl{83!!*}kLLVkyTzRpt?uwE$;I*8Px->3PbD*}Ml~D&r*L~#H(U=-&rUGB z`ghmE)8qP@-SXRfx9}65{$q}I*y?@2X4<(zfc4h4po*|dGz^@N5uh9o#2vHa4(U%7 zHBmWwo)^W1qW8g)@}Fj&auA1ZM1$x?tp45AEYuXZp?z=N2SluJJVinRy7k#tf!*G7 zjpI}3Z=7fU2sbBm+uGaej>&mqds|H}XlkCFlHl11>fv_`A3Qq;aOgeM?&8$WRrZX?*@Q=@^~>htF&^rI%!qHH_#XVb z_<9wO{w&9(@aRu31-ql4yp3?-4aYnZwf7`2=!Q?`*unRx8i#cw+o@zaK_hc^;M)>aAUc`bq6MZSp^B6`b`~B|vJu z8m5~XZ$#|{rd#UmzXV2GF|dK@WP{so?-3HpvEA!=PeZA2oPgWzr=PTkBbzcczfESx z5RleDA}iwjwxl`;3Ne2BeI!5ucVc;wpZ4?HtcQn55M#Ul3%{M1IeZ~AE0$jx@;P#A z48mgL;&^`h9-=kBy_v~;+Ul6AYm*6rU8KoFq_m6e3=C}WXNAuf%mNbk1$Y6si zU5h8qZ^LZ=R#I8(6~Fzs%Axt~1*C>9E$s_Z{Pyni$sFUiD~K{0zYwUU?g`2x_lwB1 zfmE89wc;`w9|t=cRru{|VQb<%mh%}&mzlGVkLDjA#TDZpUzNBR|0wW`Mh7h!epa+) zxh1;az5x(`ew;Q;<|Eg`^ikxdiuWdy|5@|_YVEYEp;ur?>~ zv$SBdN+BpbfXisC)vdf$d4zvd&6&%8mMH$aA0vi!%+1HHE2E+AR{-ltDm^lZaNQ&0 z6^OyQcQ4byihsOIMfCHJ<0P)sd9nmQd^_pGjr@!8kKtnK8|NQC#H0AfHXKw|_{Z%y z10$uKT4K{kxNXf}B;qb9I@`lB{_#?B*-u_XS#Krq)0%(0UrL$CqPs{OrL^roaWEG` zd}L8>`ZxHg62lErR^NP~Jcmi5@DCJF=G%2G;Tx4(wU6e{(lr?2FGu6l{N=gg%5+@D zN19LZmqiq#hOn?~UFQ*#={zfzxzxRxfLJ$wDRFU@4Z)O5?z_;(Q2gabia}Q8Lrxtp zlQz6wg(2D#es?}0GIHQ2Eu7!tC$Ejim*?Dp^F;jQ6v9F7;aJL2_j$Nt$XzFKapb<^esUQw^h|gWR}2eP zj_{M;g3e&Rh;;TNQpn#F(;bI@qO>Cr`QrTK zu?do}Liow6h&WMcFObCkisSh3$&?2DM&C#HN&Yh*LH(DK;2lYD81`0+rThMKKDaPg zcKVr6MWg8oNC3N@zVpG@jk?$=;csBKj0dMF>i&VRHF8P(uu#jVwh|FL0CHbSQrwA$ zg{1_+=;k~wf*eC17XB9Z|LU;NlJxPz!k^;#zkXQw;A7AwL2b^1f}#jO(7#gdVK89S zL*$A4VxrEz!@>zVy~M^OjWtF48WfCA*`MVk>3FvXtQC*X?phxfF4L*t{7-OL=n20B zLVf!^eO~zWWCg?dLzUCzm>4TZAAJd)8b^IzIA5g}tZJNRtCTg4gY^QTrf5cA+`#j~ z|54#J&QEnZ$KTag4#NhX7oMWhab74TBCFBogdPX@G4Wo>jAsnivp9S0uQ0koA?>`b8@5dYH!4Vl;T$FmaXPR2v(q?sp>EfjLU9SOnW4h1kvD44uS~MDe>h7P>crnT4X06!hXlNm; z4@k~QC34BF#l_ii;1EaO2#buylSo=A_AbSfjt8Rvj)1cgOBvpf=j-rSk{f-TKn6N) z;s4+>tvgUpoR<+?n3iEQt&|Yan+yF+j#VS*VfoOsYsJdQ`oN)vl2B4oi*>Kd|Ko;| zpW^i2(NIFwTl{qmC8TfhS2dLUOuiR4lyDur#Xr8GfyY}b_ z0iyX{R|H$0X;M=a_&oy6<~uUNCqaAS-Emy6GIma&pLvb4(GKnc9;ssAR|pU(fmfj^bl7 zl0jnBQ4X~(%JrvRG#Hyh(X~qkMGi=CE5SVJ>ypVWrzuAg*9z(F-5gRyYfc$kW;*at zO70UB{Fjm_kO2;57Y+7LqCtvOeN}Cj3^LyAu>WHASC!|z5?VtlA6*;%9-R||j*&5e z9zK;IsQ{0weg`w~X;qCbj`Y3zn+UHra%pMLIX$i}(SJ+BNKL=1A@ z5sa>M%p1=cV=50VcQA{%XopGK`C~9~qgsYz7NuZoZMSE-WJa_pGm{jdY+)&VM0pNU zhJ~`;HlY|}y$7%!tS%gdykfF({z%&bOz5VO&Dr+NL(yRC4YM)S_j55iv=S>(-sNe8 za1#`hTfY+JTjU3~J#Y(6X0@(l}Gzroi){NF2I- zh`pq|trHk&Re0#}=A72N6cmvE!T;iQk=xM##PZ=HRCqVoZ^86h7#f#5|5YXSIlv}Z zV(nbq);AHfDoM_rRCKi`eHS{#1BJXXVooXveA(>0Nx@Xmn%y(-*kO>3gZP(nqfv;) zY;g4ixkt>~is*f)eozy$IBHHR`w&Oe$eFw|{nrHp%~pvp3;r06PS zC@R!flZ($pK6Jv5bh-BJdvnJsV&|mE-Zd+r|wEq+g{88mqyb6!%C~$yCj`?bdwp}D9Y1h z92Yo(1)2k7hIcR|B-Z+sb58S zBx-}r5-Rok8DUTj>k#fH1xMY}28i6!W=hFK(oNhZ3l6sJWT0UH;4PFeS+_)Evb4Y9 zm0gD&LL#`U-C>_6AVUwZGC}E}3R3c^v0`Gzvjm3R)wKpAUVIN37N!=Sl}WE}4fn_W zUB_9+#f6;BMA*wEIOJ>+cZax(=fgbUTc`-d=>~UaK z0Y&1^2^rA+-&&jFOM+?uo)pT4Xz4X{Ge9aWhn3Fs7UNyrW^t)fE51I%+_u?QyxrV} zxq+!vxciv#kZ2^6tjgL?no5g$L@*PsOpc-8n~L!O{}(A5y@_0o=6G z$*3T^Dy<wvMz_rJJGMrS1Ngm8}^VADeL&`Mnv8M&)AtX1j?V1<^eY z1q*(nvKb}hbmj2Ug)tX)qmL)JFMCgJWH>g zE8Sf0=WWLn`!{Jk6^x`N$;RUJ@$ww1&0qh13F~`uJO2kqT0uL>pJOab{%+ckzzy<{ zRd3%e-)r@;Ki|seH~No9YxB9clvLKuzXdHqS4si!D!evtdfFNDjVd0A z6i#JqtFNieznPg~j&5OzQS%{u3FU&3v}86>#;eJ*!RMser73}-z~ElaDxUAcCjZAo zVXm*Rm1(zHtRq(=5@^h;2W^YZI(mPLajtBM(hFvXX+5m;DUr%}y7*_p8x5=3jt%Qh zyURxtV^k{FK9xyB!E%G(UILX6#={V)?&p_eDbY4<*eqEGgL_Z2dJeZ{_(#Aq-ear~ zhSbiy41LYLMFyS*QxQ=GY`CC-D|tuV$!5l zHwm}qk+nw}8d9iE2bGk|w0A=d2@Ncu^*q5v52OT!Sru;uyHIN%7I-Pxk=k7GR=HJi zlbF7Q{o^*8exWo}aW_vCN#oB{%%J@?}OGGrBv7hRVL(~?+tfb({GjJ zNR*JV74V)dd4U&#B`5B-({6dp0@q7l%dleQ3E z?0T3nb2%RVGLp@~7s!OIV3@nC>4rJSC|D9c&(xQC9w!C%KZcCDYgr z+9{2_epYEm;G7d1>F2WGd&5$a^3pF#uYk`2+*-VRR`X%83a)lt58c?uuR3x!_EtwIP5 z4c|A>cW;ea6%ar-qwd>qGM`*c z(Lh$PH>xf+Er&5MEp5z}k^IIJ?3Y4MX5tRB^4 zX&M<5GUmAzl`FC$#kIrbUntB`jNf8ijxBw++#6f^s6RH)VoTr2n51XvOSYe4;9>uk zL~!*hB^VF|+?~uPh&yR$dR%`k2Rhc4ayD|ML;Qu&7GG*-u)ApP!I1Z}VE3>E>C55! zliC_u%K^1q*5F{zP_J=mOPkj!Z%tD?oV2gnzaiopOA^{IFqm2UbDATPhAb*rMu8P-u z39sRbJP+Pvs2DAt++`j)gh*}f6ke#?zFg)rtUepO?Gd;A(IoX~< zE|~YIJDm`#!xn=Y)V(kNapN?>)?{wE7$-ab;@cC9lTEW8{wDVi7{s*PpY#YPw>j#y zR{5;0X7Lto^e*Wz8Fr=b8;#e?3}^7M7g!ap#v`v#HtwJWwBfSD_0ObBV<0Rl-DNb& z)vNID`B!EA^KjQbZM$q!+;-WY?*W+Jjb9OUm*ErJWs^fSFGD|g_7SFag24e=DY{s6 z^I1CRh8Z%-Hre?)^dvQ^35dF{*YFU`@Yc@xH{6EJZ+2kVBU_7IGlf~?R0KD1j|?4c z#%#D`B-D{~ew7(CaF(-dDj6oY+cQ-#tfV z;Os-R0alCw5ErrE#!Yjr<712UJgM7Ak>RXu#tkkZCoudm7!a#Ivu*pN1!D*; zTmWmW#<{A}3IQWaA65FJ26Ll;DFO@tKqf1m^G^v-E(1y&9|h+gfg^MbIJamx-w`+; zBf&Zj&W#Ch4$c=iipDD%#6wXu&O`txgKE85KuyE9CwmpA{pdtWClv(70DsT8(*66C!IB%*SImt@o7WG+DJ+XAszF zoOK|rYhfD-zB-HW+Jx;NlI-a%X z0g*mfnX)Fhux}8RJHs3Nlo1@u56c4~$JdgC*Pph>H~29gO}{y$7G=Fzxr7d1`Wnna z5>z{{G{-{T;lItLC zo?GtF1hQpNr7bo!I!$}+k0CKq8K6$d;6P&#-|S!pC>wSyB_{M@Y|Ja%V(%uw5FOB_ z0K#nZmYP;hg-CT~IWFK+8Jeg#xDv6d*(d{1%48%`*R&%N5`S@^3H_}1 zaZ_eRH~e|F+H!DVzq#Vy_B)hPzsQxu8!$!%_w|FTJt8hYo-Q$`EFT@H`fVEh=D*Y` zExb1)ILifY^Wc1oo1*uhC%nxWkXM<~!pz!R%9D~xyZuA<2d9m2A^M68v!-B&B86^s z><`WwaZE34>_Gd?JM_uRlzojMpp<)kIE%%~zLkG4Ij1WanZUqi#s>RutP3zYa}`e& z5TSmm$kHWS+uMIj4sW4~F_;V~YNAKsnQF?U10@H0#2NPQu>-unVb%zF1Olv@r%+zggR{Zsk>jo*7XJ=uTJ;q(mQ zSu&&UZ4||zJlnL|p>A);IJP$O3~4%?gU`z9Fhe6+^Z?#cuq1tP`IZvS1x${pmE{u* zt2`t789|->40gEh$YxKI>$C1Rm94z-8_#n zhC}Cz==SnmjH4E21P5C~>MM7Z)Q2CTtTpAkN*b(998`@AhIzLRqZli`q(>uJD|lWe z8gZpR0iMXY!JgE> zIpWTU&cej=o&fU41SYpG!>~-vO8dPVI@1x(2S<< z`gyh&;m3=2vR8Uli?OooJ+L75Mj-wpStt1yN%~&H>E{_>7ei&kQl+o5N@aN%VviO1 zaWJoxe=H0Qy-AGZxk$XgL@y1o_3d~X3yJL_D?}{SoCU4HkWH&}0fXV?6n2AqFtsxR zW58)Ghs!%llKq42jkG@!{h@Z=A=y+6#v9xag>be2M?a+2w>5g3Wm^g9%~@N5N58?s z&E|tFBe_ZTfB5Rm5r5OVg*ByaFNX{Bs^vk@kmGzQT5O`M(!(KZoyMR842ncT;1RtH zelpCMrP`0%PI@9T+P*PX;QYPPayYjeLZe0-P?a6*9yhCB7*ykfGBPAzX`aI zxMkSQxl`?{UckP{52Xo-d!<6+-lxV>C_@?>K99+#+dQjd4f73y(EcoFQ-#L5|K&l5 ziL#?B{Ix9IZu?P^#LNfX$|IjbBvUPKHe^S5>7XxLQ6qK8!5IhV9Ao$uJmekGrpKkQ zJHei=1s4HsxvGoaZ=QO-A`M^qI-D)(JP@>Wo8IQwLa&}-CXc&zJ_+~es70%_$&R;rrg8kg9 zG8vI=H7v{uAEP(UfMXjZ%P+zn>wQ7=EG1U#pb>y#c0@**lb(|z0%yx!E8SQ&Xm)d| z>M>6VXZmpcz?%?!T5Ja$vs%M{rvk<@3=3gt*j`E}QoXB``Id5MyccqE|9Bn`xbJMs zmu0mB6NYo8%m(c9>J^zc-|V{!q=#W@S!@h*7N<+4`{!QlDY-k@Ujmp&&}#SUVWR-V z@?!Ukxk&Y--Eu86%RUo0Q2(ZBjB5LZFX-HLboJR37cLW$(_AzddZ3rUna6XsVn=43 zvLU1TA&~}%SP2@Co1tg`d=TX}EC%fUXc8xqb%ZA}L;o#*7smk55JOn;!S=) zWy9f`FZc`w9NndKyZdw4OEC2xSAr*Q=E!WW+783B9fk)>L{+)!I2@Bi_HxVT+DnueD59{RF|!HnYQB<$&g)0Xu0r5t;QPxy?Q34DALf>DW!)-t z*<_U}G`(PU^WxW~9%RC~iV-Y~mx>KO{j_lO_IFq^K&}(KKw>(jR%P2iBaoSoF(l!^ zXoXYaZ&KQ5831pCee^Sxgc%yIFN|Y_O`Z7(DEEum$w>oiDlzdI3frenj8@6)>9AiA zcovy0-yHkNeou|PwBIw+4)%L)v*-7FO#AkJPqkgw?^$SH(dTKdmnvVLNGU5!|?C`e>(9`T2RDPwSfe?cw zY+f;sG(_fD&NfoXlMVKRB!QCsXJrS?rYMhnZv-)b^LLU088d{+1u8R02XFE|agmjf zRNJRA28LVC1*9ZJi7IS!gu|=N_69@=B!7F)3&*Zu1FKr2pEtKR z?&;^Hoq2$iDvY-OhZz}b7dQv@Xp16uTF$gM`fWsm{%r~9zy7J9zvn-K{`NTfkCP63 zvIYH8#DF= z+h2h=g5>82^1AJB06X2_@eWAX6)Aopncf7W{Edhq#Q)v>d+{**SA+Qi^}1w#nDzh(hrK8Ma^M zM}jOl&VM-mAqPmu<=LR~JeD&sPmHJFe7A2w<1nR%)$A&Wn6ofcpH)vI zt~o00%H}Yd-+Qw<1B%hNoDbz_L*6%eh9rsao9rcB)cFR{RCQOMw5lKG+e!>2!?EZ>n2rdd3* z*Sb3k^LAOB?}sP)f~ztPO)>5!_{i=`s|723a=WDkpD(y~5Y|n$XZTWAnZd2}7MHsE zVk=WSk)vNAU^x^i+#m{;+w6I#`HpP$9ogdJNrsig$zOe<{<#_Kqy}9Gn9}mV6^)A_ zzHNKBipi^Q9v)}&8E>o)oWcbKE++Zbwn%;n@&zLvbziD76^=hV5w1V!zOjC96=iSx z)VD1x+07$6eA~LJGCLCPgGrdxs*2bhO9PsfnVr6EHYu0-8rr0x#PZ-o@Ttt)DmHa0 zGqp*uqKe}A*eB7P$iT>t)&Xk35b)RztmXZNTKQsou6B`O06gaW+;G$>$6xe=oJ=?EG`eEu&dhNN599=<03DteCFG^=@Eq38l}@2t(aT)unj{9ifW}Xb@E3bvXLpl1ej2zApfEBOISjsvWO$?!HrH;fZDJ!F>~ocX~x58KKhw z;la)*nNc8n*UMb?XCFnQi*G70n{Prgc2hRL-0;xkq@?~%dh3y`!97{VFItgl{i0>@R3KiFEw^;655m%MrZtr}JF_ECc@g0t z-YF1~l@jx8MC>!fE@Sjo&f;1_U}V(&a1A_7hwb|py!t=+XJtngaVW&vb720IlA9Fn zSGeqRH9pfqSr^#no(LVEQNC#)K1S0Ig*^osg@+s*S!*n<*`x4yMKo4sb;yx}Us6U< z%fBL5L`$+cigU-+@oO*>l(7H5wY#TyXGKidcYM1CsMhiAeg^G6d(x=DHODu+sT1pc z>r~ln{_i!s%mS(FV%l9AyF@B24sKGckxnSy>a{khZm_de#ceuZRMee$o$7#&opeC) zhtdJzCI#z?Y_l{xe{z2x{DoMl2S?F=m7Un}h?z$D#^bv{T|0_(fkG=b7A6#Lg}4+b zlpr8>6G!N=zPNp0U)1Qnpc~Xpiu*VuLbjp%f_i0$I+#l?4PE1%-hXjuCO21<)HN{D zzJaRg+d{=mOsg&YG>s2gGn>DQY=?KWMX0rCzicPaMx9Ja*_S{pJ&PAzWsmks z!*WKA)IdZnN>j!T0V0xx*riL}c^m{sDED+wvXa9ID>d@>O6wMzi$h)EZW>b@mDXkn z^I7lv2wXbk3o0&>$zpwS1R38UUA#)IHc4}4W*QPObv&j>OBGk&S6j9+Cb=`$? zV6MBgqH>&3$&9HvFT(e%ry+{iD^DhgH*k5HGF`K7z+KiUl z^cvt(PuTv#&B(zztE}`&>vLbUeM-qi1zd_L?8I%RPOq+Ft}rtnzgWvr0h)2_ zaa=otMBGlR3e87s+#A>@m#Z$7PC~~0MBdX~{lbfcO2sk{nTYR}IN zP390y?5rnhPpGRq3Wv6;(8A=()MJ9`*d3~&0W8H*=4%Xwo`+u!f!4M zWfc=sX>F{sR@=T<?7NirfQ%+y^Id?FmN6}K&IKlq>{@H>7S=Tx!)MTD z{|2V)u0Q1araH!0XLsVZ)`U}-d|4Fj$*k>K!q zaXC_M;&cqXnAdrX@*4I{V3r^>S-(~GJfcCH3(HbvF@p}6uO$l)kxPQoE&el>q?|MU zqM`*uOykWK(|D$BE=$iQ`$uXf(n)IqAC)gj@z!^LH^8&Xm!i<$>33IIVoP4c^PB81 zC@?HJU7*|WUX2F9<%UiGs>h`^xR?O(u-bJTW%c7t44pu zhilZILIXMwM~!+)nhg1e_boY%DW9}3E0FCex$pR6l?q;j_^utHt7z-dCrF?tYGmXI zqC^cKH2rC*z^UC*T-D1En9ima)NBew*Cy9ADmK&XA^^#|N*Z&!l7XI_Sa-Q!Xmy9D zLZGT3nHg1u6Z2$D&@zCSBUP*x*Fq{-&u=lmrPT5<`}`+$9c%h)cbh&ms*W8R>DoCH zYIj_M#M&JfrD}%-FhtZ}+smjQM6tf9g=r+Us-HA2Fl>o887=$Vi^c`gJtg-bQ=?wY zDbbC{QMIB?uP=^zN)|ol&ye{ynjuG%L63NR;FK%rZ`C_;jO1h>bEJyQK%Sc{?BsP7 zro}=3S-!&eWPr<_4at;O>37)a$R#2}>lZziqyevbSDFH#uT&$CSk#du0@JFO?H33a zWsQ&wUD4d%c(){cB5$#b?S|Dd#1p9%Z*5%HqX^XT^a(y4mSF&^HcHs9)WtLC>ltup zGvLr>4u~T+ z`y?kA&th~57nXj7VglN@lVy(sFkF}^To|)){t)2+mQqH zCS+pHH?$>MBGR;$pw@AF^ zMBQ627aAKF5p|omAi55)=Q-!6X%o@bo=HMvdp63Bp_7xBpWu-Ez2Icq#h2_vyu zC%DY94?~y$I+GD3wUQBJ-6=;nXqZrKG)&MgxtD$UUOChfGzYxTB06J8f3JZpTq^nu zeP@}dkZ@q;oGOP1tPgj~(tm?~gOy7ZJg{-U!Nc{#k`0&XGKTqFhRc&{4D;sVpMZY? zeh+>R{%ZWy_-EpuX{N3xXbwU9&D2#sR8a!UmLx4sj+_ZQxm+30*m*x==IEBbbNS7k zGOMTzZ#z}rKM+d?XM^;u^I16!0M8o*&&vNhsBr^pStLi$N}>?ET+o`;k5&n2i7uRK zvtjzUG$qK5lhN_ekRz!Rv?e9X0oP#rE%GYtS$ksH9#qGz+@VZtdO1cmY_~d^=synA zGHH*sgJCD5(BA%QBU7Zsk@x zE8FNrGHcAx{aI%7rD;kt*KGcY&^P1Nmf45?j3SOLQ?c-yC26NAivwoxv*f@*GxSsG z&6QGzC25luC(E^SxjJ}IpUc2Km1ymtpr~=kSZ1!vy&9S8^-x9Tdc8W8cD%Zt0u)Oy zCtXlOe=e<|N9Lo^i0Kk0GRiPfcg-}#RW+VNkf6+rdQ*yDoE&YT^wKqRzgkkB2M>Qu z-nGo`Ik}ND%8g}{lTm?+I7>Ip8)~(#DbJdd8*TNLcFad*vx~T>ghFaJW2&I!=(} z1vql;ITsz5h4D%9<8n34p&A1-UPwlDAY+DpDL5QXN%m*fS7v9smQ*_Kj<^q}r1*!5 zKX=K)j=RYoNjY!b;)k<2&xZW1N@2rb20u>@tc^@5-m01@bXhVl@B9|?B)P%vQ47#E z8*2DRzJNG zRnBa{h!efUuuVtHeYIsqHZ#Bmkor(EnApuFPCCYM|X0Y z&D{}hvCA=HzCCzjoZxZG19a@A1PEuKA87K(Rz-|XazDIvsu3hMvlYvGS^cA&4(S2La>qp^^7`3Tm?K$mFTXP z;O>TV+#j0afIG59hk=bN`W^NQOgqrRhOTU~Et0Z?G&_$l|H2m#q}LohPh*F9Oy?fU zaTX;tsfWhUBMq()RRF~k{YE+=@_ltpzxL9Inyy3sMQu{Z2_;-go@xl+-5s&oq{KA+N(qI~R;7 zTow9pa%eKlf4Z`lWD%dMrRSb54;;QO%sev1;aY zPtw)Q`45iD!jED-Ylg1PQvEqCbWx%4YWd0Cvzt@Q&{ZkYoL_`T$w;J|Q`lRvI*Ll3 z@RxJ7+d$1*(qIvNc<=QCm#Y8E4q8r*};oc!UGE4l=shHRuD<<=I6 zmDl)HTk+0Vd87Nw8?r)*GoERkJINb7dUm9caiPjO8;33ohbk=_hbqp%AuJ7=nJW(t zV%Vb9P?={|G@_qV&IZA#XyeEARsy-ODrCcRJ$OAhS)J>M(69z#ecbz|o~ZkF5{RC; zlK2^oe_%YD)_!#BC-}!;#sC3Z3!aIW1`eB{iIiPehNHwRJS1OaWNT8) zE#IK+3jb412m)h?$VIYa%gCB#!>dmd;qTwrAZk4-|2PGM90~@R5x|i#&M&=0MsmSV zAMs(VDAi|yK8K}}{$Tja>Qgjd! ziINUCumT^V=9I#G(fIb=7E%0JqK*zlpTh1&sdOnozlsAY-4(OXrxjU*e|LI6Krbk+ z$F##fL&g~xk5Gb=I&$I}q)32L;fC%1f7pBPu%?!-4|FyOCA5Hoiim)sfLKs0D1rn* zf`DSLD2QMe1VWLLgn$Au_TIa4>>WG7Ua^ZE+aZ{vqUTt!<^E>x;KB2q_r2|(d!OeE zE@$uAvuDq&Su?X{tu;#{!Eu zE*QrJ;}Kvv&eES#?KF=@$MP=7>vf>>WS2D2K_)OC8||>mBH39{!%q%V)EFf4h;a0&yW$Y;=*~ z^CSok?aVk=E+vrK&!zVuhfbBp(8gEUHtr(6c~uKZMHexAo^e$~KNRLt_EvPv3g+aB zuV$&f7`Y!NbqP@hVT8+NGpFO9XNV%!1PM$e12j*l=*^${I!XgLY07Ya&fjVlia`@} z09UZ}HLZIEKZF-VQL&D_Wl_Pd$AAQEUs6OtD-D!rwRpo11%;?vYs3|Wmfw`CPax_; zi_9)bW?>woAFd*t<;S{36{ottA@)-{pf4p}Rq=be^pew!CxI2`LCN zp;_$FG@x08p%!8*?FRZq6ICCc=GHxk^C+QeUKIk9(C^x=I|?jb6noiL-+?tEIt;dt zL%+6&s((R?7WWX1R<}(@I&5%flb)%YR6?C#hJas%;z!rw2o{v=SVe_no9Z8 z3G~WIgVi@BDlx_?cD}(%fICZDTp+I9Lgz#Uaq!M|<0K@AB?bNXSVveDL|~Aofw|~o ziB&STUIkg5oP*~IF`q${fj)}*s6>wHWy`rC=-1YRvh$2413}1 z(5KcIqoqGx^AedTDy-U5zgo2q1nLT&{(;Fa4@}h+2Kop5Umlq8O7!sth^NvWEam^a!6CaQ^d`tkAvWiKEVcT1WAL%m>E{ijy+D zr2gGd?&OG#>oiKhW+YZhycJ?6Mv>)DlD%mBk*65%oFmYPL7r56h&B@gp|sdhm@tB@ zoFk%WptLLyM^GVfIDD5p$2&@qlc;$KJ#SjXzRU{Jf|*fbmwA(erGW8DDEc?|xwa49B(aenzv8KEgTll!-xkm4=DX+x_HWe##YV{q@0LBbDeT zQ?C)et}VanPCf@RRD4HK@gQ6*gI?OB^!jJ8kx)pA;U<`eJ$DQ5UUN1gn$uP+?@&M8 zP?ZJ7P!-AeJjp(dc}{C4=6w_?b3c_MSzbw61K$_OD@iC`Du%~LW$w8IVBW*R* za58L}QTYg37uKC+U71uZFTu&sFI!RzYIOA&bb>m20#`y(@IUqhx@d~fzp(Px+1hjg z9Y4T4+EnxM2;~alJ>+~REW3G{54f+pU2q;g!HFxtT~iq-+Ry}SgSURKpoQkt&o{J_ zxjljo5Vh9s5wxa7`G2`b@H=KMZGFw~pC8h+I}F1A$KJrYvJ2H@mwS-RQn@N7NQVQM zAgK%^$Wa_~pY_lKRxn%#$_P?cL8Q{%<*P2NAgD5&rx6!KehO1Q4=b2*2z$g!Le$@k zdMk6EdTufzy_JF0Zph@M&h|NwMcH(yAq#@GXi7lgbR9G_$V(SQmmFEU086Nue?Rkr zLEA!nz6%wdFfl?Zpp0C>?v{jOutH1GNtBRaYqx(OEI zIqMw#eu(l*sEYqC(0ib_U$PmMYQp8I&M@;0TvQ8ZgHIr#%G^qtGE5nCD9qz*fbd{g zwO=pciDO-@<{M#-KNqBY8|d*WJmyijPq}c;c+3XWvkNwIyFlb-9OiMpugc~fhlc$~!64|eg32(8o`e4r$o9%a3LT%~G7y$nx{^R8{(aVjQDTLhQkZ)S z#T2Q6z&lPkB#!wk=KZL;fyxRG8c|Oy(1fCb-n4>nN=z-)eM*IMsF)KRY*@jdyYwRk zk|)R;pS%l!vTD#1e1rWUHi5nXfpg!PjCYWEpz^C$0&$xwD$-lIkgZ5SVc2`$k7|Ch zGf?v0Pxka{evpt;5EU8)7B`{_!1D`!3DD5VUD z3dj!xrNorNqf%xCI*N!_j_d-x2hI6ag^!G>W4s{ru<%{5K!h(s41nQ|R8&Oz(Z0Bn zb*=_wHXQ=$Dzk&YVdmY)4gfKIf*pOh^0r9vvPX#ei%}m{6WWJJIPa0DknbtdsX@kf z*^bAWDWP!p{6bjz%6trz^6poS21`*$H(`Hu{F~@?r%-0LCg_eF^~l1iefg+GRVTcl zvyJq`P#d&FmNkb|HD_Z&xft)rIaT!#!LA*t9Z)0c%c3{}c4eC4zKHjzz;M=Qw|+Rw zb@9iOu$UW=Zeu@!2xA$$E#G1#2ttGjAcO}~t!lB7uMWlb@GxcaH8-rE3XBVaO~QQ6 zB*lwWbjCqbxfB|~TR?YHi9i=@a+YTS=h~c>OqJ`>1K+@2oW#4F_b_%}w?{dp51eZP z&rBc+*5}eW)B%g8bxKI1nmw(Bwby&|Y}Rh?OlVKATFc6u~A2 zhp|4u#%3%)PZ?k*G7ZE)ik}`S7waHJtjCJ@`d1b!ya&JwP^7cnj_UslYVs*+BHI27 zYJ5=9|BRYnal<;GFHS&#Gz-IP@zZMOPy9sT2}>hTUX=!c!{KNo4SQ56jfC@HTKAcq z6l=+3EJr3VbUO>D7(&HW7DX`a4e|Mr)JAwnh(i(#;uJNe67wS*daSS*1$w|3zzc+G zmdj_X!LSfWyh_pI4g6Aj9d^Y=hqef@hnfy%tgmXMCRBk6whF9;Q=szvVJcvRQnxcK z1e6-!EyU|1{`aay^+NUq>W-Ywn=q~6!C>%mpvPIAZBHN*NgMH!UHn0NSCr>O9_I>r z@=@@rj%-hR+M2RCtOjP53q=j3#LHnEx+xMtiJ-zspy}uAxB-K`I(lEq{nS;FIKf^v z40g&f_oza=k!JB8jOR{7vlAi5MzOLF@I^^J4u;UBBu!$!{ij&{0|Q5!_h5U$hJ>kH zNS-J}dsPT59-t|OiQ_Po|eV`?3WQ3AMR%nVa1JV*u(F-Q&y$=Pv30ZaB%sNTC3Ufm@8S{MYvKHrjtC?ju)Fm4DBosWb5QZuJ1RdR(_ z$6+Dd0mDT>zKp<#-~YU+5gz8&ag~<319iD#ht-}W{nsou zd;vFo^w+p;UlF(E*SJ(@`m_sJoPcq<P^gs~~LDvZiLm0JX*mDWa9(6>Ew+hQ<|_=x$Xiq*n&L@ZgSO!0b=;?;z}7tZwVf zDOmBth=W~B9T6j`s`qD&J@TqmKqQY4tF{tqZ3-Xh(8Q*B;>3$sufQVgH&*N~T_nDeer%dHn| zLm-dAiWA7Q3oN>>2Bv!JC%{_A$YRwVwm?+K4te|49scDV zKePT-X3om&Swl7Uyb@34J9!Opg8vzJ4Z%A{sZ$Ji*1ok3sDwn0U5h5uwP+^07KQQf zDKDL>ud!x16cTflPn3q8(5+ck)2BMKGuA6DAczd<+Wkqgfwq}uE*5Pe1$>xEmq-j% zY35oRr6He=110_ihF{U^z+-6DhcWcyd~4*0@v0DON-$H8Aqs@Fk1k-@smh#nY@^@F z+TN9}?b&n(|64k1HXZn2$YOy)uHLLaBaGD;juU+xQc#Gbi5QOIB61?~qJjb(rGbH2 zj1dZUmmewFG1Mhf=4Uruat}>)V+_d<&bUJ5)4-!V*$h72?El535w&eSj{?v<#ELMy z3?EeuG|PZmZc@-p#U%)r6@#<-7}{3Av_Crm z*H3CCj=2D=Z9PJ<_P1{)8@)3g>JA8;SKu`_Z4=F>-?-6Q_%kcbiy}(P>{^Ct+q2s0x9N&B;Jv@CDqddOJ~9&A}Hv)DknC{F-bO z0x_24G~^cgI#_5{^rP9 zq-{%f3=`^XPrG2=Jg<@C6Iv)XX&NlflFviA1`PK?DJfCn19hDL$i`mxhCK6UBi8m| zc5#5d%*v_!L3ES}a?&hHz&?(ij4#2olnP4_ut5+)LIXXl1(87%X5dxwZ@Om%YZ1rh z1(~QmuL+H4-~Y@{Z4CQhCm4MYBFEs4=_mL)H8kPH6~NBrwC7J-I&=f9DSqK!#L8|^ z|FFjvVXMdcFm}_sF!v3*CBDNt`dNqTK<{=E6Hze=jg8}h@QXw5FuxP6urS!*V|loJ zNyw-25bUdkxiiP^!5PK*hBTLJED|Lc2$IJ^ND?8(!~zX=SFz$dlM*afL)idhOHvNp ztHEDIs5Pcy-IX|zSqT{KV!BZ|t~n%orwoe8LtL9-nuSR13(Jbbicgp~8k`;WXM_~^ zQPvxV7xp2_?{R?z9@;9zX_~>iGv|bdrE`w)nfy=2Cq((^|6V1PccJq89oxXz>Mf(y zQ_$AHfjl~hM?TZ>ZO7%y)jIfaQpziUE1HDI+62j~f4$ZGdP|ApXJVDeTT~1l2<(on z{bqEOt`XHxh$*e8vKZOH?OK|K&;@b?bfC3SB~EN7L|-UyLT***_^-CV{FHm5e>$OT zpK0cFqftq6I=D54MTNd#(F(X}94S^Rxq{;y2t`*SvDS>j=`4t)IcOTQ z0xl(2m!B!R*Ga(#Uy9T;Q;kcV_(trtqPE(>^keX>qcov-kXQYn>Hpfye#r_^CuN8b zdz5J^xVT0%8E&t0w=^5g8Sa|aU9*WMSM77d^>Gf784#=(UfoEM8C*@($Lx-jdbCa! znnLzfOHB?96;j|9{j@J|3lDBIg`s9V`{XQ^JLjBOL()BTP~gUZUo1we{E(8H&tc4D zIM#q-_I$Dx+mYbwNInu}(v_Sl1_etop5YUo1K3tk8FrzG(JDyaP{}65m~5fRWwCro z^I{V%9jl(^{01R^zCM3TjB`J8KVO?W%7O71-w@_521e-Ky6QkCq%L*x5n%#~s3p(Z z`&#;}y{~O4?!GRCrf;A~1%-khSqh~|;L?$jC=_ZOiR$C@G>XBVrBMx)j<5qeJFc_b znPvx2qs*tqf?`$iTogOcV$4>!_(3ThF~&(+vj#Y<9%C-lh!+o0q?Ktfq$4cn9{L_f zz8DYTNQ7l<^pb4NyA@QMPk99PTXerE`cE&~3L>%6PV94^9&mO}+gV)Dm1f%h8<&rk z@>#p7IyD2Xg&qO%_UmZFmM237e~I-4tUZT0iY18J`GCbc#T(bYl#L6))&z^uW^6lfgbj>3?m!RV9CB3YJ!+KT+FxiY^9<7x5(pSUU4x)5p$G_Dd%FM z5VMDiIZI>Mul<8ZfWeH4k7fe;-`DOO*Ex!tzeDq3$KoeyUjyyGnI@O!013MaCo_S! z{^OrhJlmdhWYT{CgDT5j9;X~F@>ky0$SFOmLcMWGZNpR&Ln`(SP0+yj7!Q=!kPZZ!+J?6=bEeC~QTz0TyW>13}-V6T7L4*|cU;FGM5 z#b}fmnio$j)T6LK9*<2~36NK=UV+Zxbp~rjNOxWZv8H)+$DAshXl9H<_dZU^2j?+> zO${2xrnZ5BK?=5*w=O*cRLvt3~*f>LheTcLFzF23eBM_Ar)Uuul{AeGD z90!Nc{m8H^YYHY%=om;)H_I6`bwx7$5Hqi&e-zbhe$?GGuqeZdtnd+2?Jt zJN2sZcl|`dgP_Q3Vvn1`gQocgqI{gIS;B5SdP$3l9BEbF*wLzFx8f=gj%*yUT{+yN zY%a==EX=J%`F!g-HK6;hYw@s$d$~<*?RCk`usItq(~|t>_aB8QKgG?3abSv52=6h> z@sb*GjyTy8jpQe8)}uY{LrByr5gQdFe(UN|mUh zP(ioahAFjGV-X@E$rk+>lu*D?LTyrHB2=7alYXya{SzuVninheeL$)26A(brJ_1r= z`vO&Z(0)fn&C%GQ0JRkDnB0DF&JL=U2Vr%o)_M{H*$l)@u)vZ_!r`1M{u5k12!1UX_SFFyX!{y9;14fNN+?V|JHgN^DfMh1-w8sX5*m?NU1*?n6duG5 z*H=8@!4gG|9nmq=5On~3!h;tSPq8Ck!@Kz`cOc(M z;)q@rRA>?e$Ncvw`vvs?Mfn>@{(+;RsC$XFN+X21H60}D{C?#TFa+F(KRQ=FwC{@N zLa>D)9#~f1N2!HF9^fED-JimEOdy{vQBAA|#^C@e8J?x?mQYc(HxLpiJa!)KFEI*K^?$Fm1tmc$!=7+P9hLd0MZ)=|P!f8m zp&y@Fh76RmW;p3+*{|xJBIg>0X3tdZXY)>~F`%~wRdn%0pYrG}uZpf5=q;b#@~dX* zZ`q<5YBT5~Bl^fl8&9vPFEvy(hF+V{YZL7ddM%*W0v0bdru5oW+k?iN(Q7lU7rka{ zZLW2t*A_J1LQ7qe)mYMNORbPz)Bo-XwLIaF3qdd|%&SIu&^kk`;54ih7=r67iXn+V zrV!SM@TXW4a*@$hL(rQk&MpUfkA`9AUcAlDHNU26k5oV|JgRxX_6dfliqBT5J3Zhl zTbMdsIcsqghec&6i^ngFHWsD&VxS#G10Gx9FMMqTy))E?(7;F=Km%i~4-HJT@a~oL zMWAg%15<5F8klJvX<)8xL<0-0H4QAa6j@)`3g3tmYN+_~WF+67(p@_31bQ{7_jhMG7bTMPI2Cg*n*h8=qJJYykFvW&n49 zC!ht`gFcFXf$N`w5 zi&+C20UQA>0c`*s0X~2LKnNfLFa$6P5DS+p&-!{O+j@nO6eGE?}+IV*4B7=GQ4}{e@+%+hVH%SnJYM z?1aEb4xZYo9q>eXYHGqpjig}=M$Q?re02lrOS22R#H*&#rk||!S;|^}WRtIX_+Heq4AGk@7aIT<8{8H`JnxTQ_K` zmZDfO?6x&uynKX~J}~c9a(`t|0?n}%B7Hs!=Q#cMoM8~-#pl5oh9*eEn>v3ZvWF-B=NuC z0bU8%($ZClrV^XCf%Enpy0Cn4#^EE7g#!WDAOfPmFd2(DH~PRyQ+$c5m?Y|#<;j!< z=pm4%e5A{kK7TJ;1|goBcZ8eJRZ0e}kP=j^1Qjbm#j04VS}UB$Qxu6<+;AAwE~=CN z7L5h+(XPeZ{Og>IbtJkXk!BYn!yupJa zVmBgi=Sl6@x6<^q1h`(y#XD(IA=yDs9nXqUk-2^=dKeal2`~t-!f6@sY4Dsne4sKk z&49DO!iC%t_z%N6Lc!`HIN2J^>-Wz4IiAd%3p~^+SHM5eMWe+*2t?>RFlRpn^NF8) z$lv2PzF{KV*~CT3r;aX7Ser}XPWS*hCEN*4@o)(kEaxy6q@i(f!nTHmouN&!p;!61 zN-=#e7PdK$|5~Xje;G&37TAKfLe~ZnI8p_OH`}c!?mRU)T)eUH5YVJGET$5Au3k#R z-Y74pYhhhf(R1zD5!CRE@+WWS33ek)<o!h_lnpErS6rU`pq1;b3si0_nimkIM`;JFf7D{!Sf)D=d`>t@#=Jq+=H{hvDV zc9_qVq$acsqE`3fM6gK_9y~=uBT+&9s&A;hDu=k~biO(iF~twVE3qa?o#_kIQJ)NX zBXl7qZ0Ls5EQrs*+(wBu6gdV34L;ouhq8xy@jj!ihf7WCIlpQ>=*$IX_^CVXnIo}l z0<#ZmUW`rNUL{Zx!g9Y9`?Yi>vhF5C@}AO-UU#K5T(JQDtRH~y`5|dbJEmu#swWSj z8`K4k9jUis9Ndax9zii-B6!P`_A$d)yoGmk!bPXB$iw%jB8rkBIzb5gtmb=t^7T{CLatvJ)b+(4cNAcN6 zG8*|;&8Oey@?XW~Pv-^{H^B>9ys?-YMD$S3f0n#4Ejb=LVLrh^@;qv>205`V5^n2k z=~>;_p$Hr8e{lw*Ytb65L%VZWjHo+M62?=*cQ90^{x(6vLqoBcDrtnR`axhWnkpmA z!+dTenkvO6yo+Hz*Ap#aaEJtMK|YrfpJB@j&8POqj)i&|HFSTzvp#)6BbI48q5|m6 z&FDTqRz#x7K`){+t5E6hqSiQmx~8aL*o|yxa=q9anHGl+M?b@v>P|T8qPv)7LkUHa&$Mq1!XOqNcAJxXmHgR(cah$a^R;uiA)`*k5 zp^l8<22SFLC1bLXdv4A>m%I}rSNjr0x$e|lBr-_u!k$im97bUO0;H{h)+X5gPLF-Z zrIo}NmynbPS~mjmDb!9Ox(kvkA&Lq}OW2Pjuc&?B9*-evxgdFi$HrQyuzZ)s(#|4EG12Iz?8s?SMsOooFXb6U5AAA7Z~? zZF(+omS=5Z%s{VDSZGEtBD+zeT5Q{IfNl?q?F8kZ@t8lOG$+78(VRRX&qGe^8(tUW z-iFvc#7;OgegORhI?^i`vcp$GxTh>@C`q1-X%*ivK?I#)-Q?aeNmDA|857rvv_^bM zC>xvRFC8b4OM%!4Pmt+Q6HOG2EEwvh=>j^N zdoIWc^hXa8Lt)(_=|0Jy^@dXnuI_sxYU_?{P@2{&)$ErCb&I$3(XXEh8d{s#8}MU) z7lQTez-4y(mj@7gvh_UqOROv_0is=QliVge`JW`CWVohIHkW%lpvjZz0cYH%(sPFhU>3>BB^Qn5_?I>%-OhaJxP{ zq7N_Y!~6R1cYXLpADZTK-*2K1Tk69O`p{1wM(D#a`Y=r&&en%p^f&XQL0B>BG+Y5L@op_8+JZ*&F;P_T$UIrTz@B2@Ki$e}=W`{~3yhbMO1lhytOg+eEbOR{-5b;?`fInk1{~?he;p&B%yZL?2nEg^ck%cjmONxrlDd- z`U9K8rZq=M)0qM2JC*>N9{d*jE;SCPd4p?W^C12ggY3g}{d0!z8?$~=l!P!0W5DC_ zYJu>~g`QsBdw}UEtA-CqyvF`$o^^rvBccxEfSsueMECRW2fW|t$Pe<}Kp*lD`n#UD zUuqTQ6VZ&2sJLsi8o&IkY&bkN(ubbca$mn6D3)>cb>SOiXN25}7bHC3^CN zu};y6<0MmJrzY2aWQ-&(E;i9AIX>PgX-f3u$+htlrY6TGPK}=I6q}eBpGZhdd}5*` zAvt!eQ&MtbZ1j}cbcwOkB(X`!PE+HPohD34m>f$pj~)B-dr8UB$+1X0C3Z@DV!9K) z5FZnrJRyFnQ(W|f$w;XGNv2Mk8lO6~_H$(Ngfa06k|d}0ZN1vIZ`0np&A6@|yvD?i z85`SX?1aSR^fqx5(&*dSnWl~q0rL8!W=&{Gc!|DQvv%kp+95xXY`MsVVxiUKm9(A-UjUsnM1Y=vAV4r61P}@c2lNH>0}KER0t^8R1B?Jf0!9O(0Wko|Ba8z~089c< z1|uFY4Uhzo08#n;3?oa;3c3EPzBHeUIX3&-U0pud;oj`)BwH$z5{ds>OGHcKr;jw0|Wpw zfCWGZum;oz*a8{?>;U!v2Y@5M8PFWi0^kauqHGTU^^e#NK=)NcOi4Ncx&XQYd;nB) z)dL^`^aKO}f&n3bP(V1KF97GFkpTcIP9Fjo1{eW|1dIk)pbmBbcYrTo5MUZ$9)RMU z;)&LYes>CB6W}Sp84O7*U2P`r}oxz1)2S`vj2P`Bm0MdoPi51!ju+AEEiyc`l>Z6?ihp|_) zz!r6a&0431z&Q+n-T`i-V#gbUrtCp?*d(TM0G(pbo!k-NgllKSHN&&!NaKREE$~iD zyz7cQfRIkDkf#UoZjEoW!MEDto1XY~dz7IA%HoAGbwb%Xql{fp)~+aXH4*ajV7Y4CZWxypzY$(hG@h=NoZ3E+BOw!oQ}56 z0G(!mW~Bf*t`&&O!?T%4Q-HKeyraUqbC3rJ;J^apxd?efe%5t4zO@qHT#aw9MHx1r zESpfKEht+N%D5e6-H9^qM%nkF4hK+|V$|sf>UIouJc+uhQRmaB`&r=N0&sB&IJpYk zTmz170#~0dV*TxU2w9p98lqfnyDDtp(0s1NYV3*oP{xeKwuJJ!nwG!x+Rz zeL!bacOn8kRf3LcKs(a0jaqwAkwa;M83+D81v1D-4ru&vfPX?!RDm$kU2^BuplSbSrBz&OEPn@ zC9$&=66sVOl$pO2(O_ zKX4`|i<=QOI^xW17h*TA1(6PDNz^@ENo5x|Qq#_z=sa2>y$3P&Y)$OE+mIfCZHatf zJ5o8`lcdYrlOC%(;IsrUe7_^Hv+PWCK3#}tsyC_J*p<{g=|-fE-HANLml$vNBX%`C z$jRO!!mJA*m0x?3^btYi!CzGZ#b#!HWKxZBt2G*CZfU7z<&&}D<4aAYvYJ0emtoRm`G~uCll$H zDePEX1UeNMg0?XBi7av50AmlvB6VBPmk9lEDB{p(dDlTM9?pu6a}Ob(Hbd{Ps}IoTjvqM$Q6Vs+(ekpyNO`z zQR3d{9FY&cNkq*nNKwvfB1r#A)TXA4sJk5_sOQcU&F#vlkM(Al6(bpU&v-^4&tc^A z7c=q++ZchFnsLv(%P^&H81+*lgQ5yY1HtL82BLWb4bzsS^^FYt-stM|>}i!zS$1xx?n z7g;$Nsc@le6+%>n1m@D;+)&2V$7s(bF3r5{B z7QJt5q7IBU5kwZ56b1ZgBKqzpkT0AiaJPCW5Tvy+Wp2q#nbvnq1^I2v+^c7p$tOQE z6B+uO7nQCt7wljx)R$u|M6E7c2(EUtEGk)JsW!C`G6yn+?&seK1>rGP^050>^0EQe zf+uCx?zw&HG3U$bsrL=2Uleh_zF=#Njp)={8}+tqTfro&21TZu8i*ElZz#9E+t7Vh zawCDItsS$j*pBHty0M^{z~0^EpuK!_Toch_JBOm*t~m(G3Y)42i5*2D0w=-#D^5jg z7dfl#qMI?TJe#{eG;k64+;frl+t*?N#?c_qs1ReOHO9#iLoi>=1|NvAxhoiqnBN() zXrBRbRP%_lgCW^=*N8ka5D?>iX5_*TOX8)gM_!gSB<z zGOSBD;q4hgI`y1PdbE@h(c*<9^yYSw<$RvFUickH0t%R$Bib=}uZJ;xTNW_=VvjQ` zEI%>f%FYIdLNX1~kDoW#FuDov_Rdt^=ynfy(UXGt+V{u!4kNo82KPK`C;MOs0uj3w)w@rmz33GQE4d!fe?Sjd{=a29}bK?S#^Y30CrzXRVc;JJdhE zcfZXz=e`ZxR~R&^FS=%Tru$+0IVC3?<{3Y8d@#tRndoSyR~iO zgm!D%6m(eUeyNkk>MmU)TU_ftGiI@Wi1DnzeHZqMW2c&j?>e=--=6iO2WPw;Iik(7 zg;5Qco5bDwbYzm^)Q)Kf?4GBdY!;dA&>Zt_IObihC%%v|U{ z$l$QYa|2tOS-fzQfqeC}9)_Z}1B|XLS!ldymO#)owb(Rd$X0X1ixrlU^(R`lcMZ3> zzIQ>x<1NMZn@S{(MT^{A?ya2S{^4-{c2my(-f7+DuD;QtkwH7wMD;oFX4p`>*&|~n zG|7&Cskoh~JC5-SyRqg>;*oc&jYyB?=0xplOXeJGPTqa%N_7235ax@L2qo9aw38i} z9?Odv^}{I!!m`o4X|q@Jbs4@!%)tRBb5?#ceHT5{vd5NL_0%oSG@KLLvFSUxO-tR^ zE$x_<-F$>&nuSc8Q8KJYVa^ow(C4{~C7;Z577**!^@-?B3nJ2J5$jKn2-7Qx zVdf7vux5&R^Ew?f6wTRUA~L#aZoPL!y?MgrjhV(NEtoLlj`LOz3ASFfJxa8Bp1gU# z2ILIpl7@#Tk!2st$)tj{jK%36298XGq4PZlf!AbD;qCPs8*Le9;_CiAt9!|F{?)5gOFP zyS-a82b+4}*|^`-vBL-U2^MwpYUAqE*amDI{iRGD7dbd0w3o=IQ#&`uhC*%*eqJy?gq0Y471;!>nJiaCV+FJ!x`W)bN4f!T4U=rp)$DtC!9x zP-LYfOdLCENIzQWHa6$=zq9INhxYE+x?%OQg>o?D`kw*t(1lDUdxxvy z^78nD3_BaS8oQfx6O1sOWp>%z-ZEYI(rR?Q-|J`CHfeaVQEuaqCU#B#biC_)y7}Q2 zhg^@jpYteh^R}I72ltMlo#VY1bvxSqnV*TMP0xs+_+VwohR_4yrG3x$J2&9OpdCXN z42vHT5NSI4Y*gA9hp~rZdyYFbzVpPDlRixLpPCiFBcW{C^Tbz4FOsiGcBkZ|iqn|% zUFrR%S58mN_%mZd=AF#0SqrmXX0^*s%-)gxG}}t*EgdPHE?p$uCOs~_BE2VlA^k)8 zUiwk`Mfy$pL#nIuS6lDekV@+5pB4LO3pq$5$Ud4u2f+Pcr1HzJ_C0s3NZm<){AG}h z$oSnFyx#No~lbsK%fEJE*KR)Def@g$5C!xM4C)me>}KQa?%AoUuYW*La7buapNRg0 zh721qa#Ylq*l`mkO`e*NC`nDv$jp|xHFWjr-ZP}{fFUDBMURb}FeyGMB|S4+u9&Hu zJ#XRSWh>Tf*j%)I=bnAdo3t1885T1sF)cecUo~&hvNfBw?cRU*c*(gdH_IPBeW`i- z;j684x4zK{Sp^GMZQgnC_^AtJ_nvG2{A%62$KZ(>%B7q396fXO&g0)-f3b7y5;|gn zL{>O|`MRw;_a8oS{@UHgFSXSlbXG2+VN+#u*X%fay6oPwSMR@=x%VC?TeAJ+^{4N2 z0*}5^3pX4od;ZbfH8>_??#6>>@4R^TUC_GUwAour?r3$!?T1U(o_zSp$ZPbB-!8o} zZZ{-jMe(iIMjfLIc3!JC>^gBtNu{Ar{OXH;8g?1C;An+m_i5{{e&&m&@2cSUlpe&W z#r-PuzqR-sK74rZ-mNoyThvBY<5yNzcJ}O{xdCo81^pq_VYOO)=+O2;|CTfb{UKEu z41?6_{c{4`XbSp6D*B@-MXodj{ZaFw3l}aNJGNUD;Kn83{x2;pEiT@n6uH(K7$Mb# zvuDp9J-TaFfLm>Oby%zakPi6qLAv={rL^YDEopeo5$U>5E2JMkq)L1L6((Kt-a-1I zT9Y06c1QMx*ORlqYF)DjzIu?gLsOV#TPjlR}S7o%p;sdxGpx z{&?quv&Ws@KQC_LK2@yk-Wg*{cTbN=+BI>E+s?t!PqzC;t=Q%~diZa;$fia2N50&$ zXT+|}is4zC`VWiP=rGiE!;8Vp`YnSh*2WDyy{6fKZL9D1TfAy^#LSiceKS_P4o_OX zBy8F;-_WF`&qC6c$i=yf9fIdCIvBKNVR+!l1VhseOgz|Jlbl=%$DvK zXUuU8objb z)?JabYsN~qor_mJ+5X$=728g&8UEXowM~nd^)I)y+^}nN-;G(DvNlC*+_~9x!}Bf7 z`X)scYlr=Idd>1}+g3l`zIav3oikS^?#ftEvO8&c{k_wcP1u*T^wj>eB~1_JE|wme zzvy}KmW92KoLsQ)=)?Ie(4D)tGZ>vtFD( zr5t~;p7QOb*uvB+Cs1RDg8A2E`A#>gX70T?WM&#cqF<%}(=BqgY3|Dhyjm!)(GHNWdu=E0{r0)+uj>7>)$a>s zA%Dfn{`$~Mw)RtNSy)YDw4|AA<2M6Y{~rum*g&>}F_R7F*`eiI%k~-dl8rWrm6@6r z$PSwAmqlAVmzfD0$q!f!kVn>AC^xjZC*N+{B4)c5T_x6rS}JmUXj-Zas}`A-5)EC>tSyzoHK z{6!AIIg4fDv?WhM5|?%ljbFAnENQtmeEJH%zB5*;A{MVI@Aunk=K-hI#14G2cJm-+ z{jH`ovDyRqM}tWApHJ2&qh@qEj@kxhzpk;8s-8ohj5_o&C)2SvBsIdM$luJo9a z-Fai{?^VT4*f%Hc)PB{trU&!KOAlpEcwRhpV(%lvCha>an%wlb%M{fKgQ>cc_opVS zcgFuwnw1cDI(XW%GZu+s&Rt1-aXvq3{6*j7x0l`|r(Rhh;g z%tt(}zHe4Sq2JDU;{RakG?Bs7Cjl-~!U6*(9|#&g$su^^M432y!jq8v@!dmbk6Roz zFHRe-ibd;=RYgpXDepINjProO(Xj)4qc#t69{p^vF4BJJ{gM5K?HQpMt{A?1ME_y; zMmh}DMZOs9GTek^^CtKamGEsjhd;nE(M z+nCYJSqMy~0HfuZq9$HhYZ?~<(+{!+HEfx^!*+7EvCWR`(e)~`4_Y}$&4ppoF%~J( zLuMFUMC5#Cf z58l*`$!FY1KG6^{mcU}Nm6$N&ne&VlNg&sVCo`AvBy+)eM&R(R2(p`4F$v5yrV&Yl zqa$x-DdSC+lFwu)Q_Kt{#iSAV$a02{_0nnL!sIe8B$vD(fy_oG5IioQ8Oxkz%(0@l zOj%yq^Ny2E?W zBQ0aPLJL>}P1Ip#81#8|OgeLqF@y&4476Z*Obh4|UqYX?i3uW`h#?cpoM9}WkGuk% zmj zDtOvj1-)G)bDW8U{?LKRVjeLDWDF@K&6pgf8Ob5fNC2~*2_Wl<0W*dvWlUk2bdj`T z3Yk`=NhW;NqSR>RzF6mx6{yIdq2`n4ZwU@|YOr6k`V6 z?5O=oR-d1E8I)&m=K78GEe4 z9zZv_g7JZd_barFN0|}O)!H)|%mc<4+U0Z5aL#00p(n0{u5t?#42`cbGmbgO2%&2( zgT8YP(+*nWx6oYfV){b=D`euCGNvIk&v&8yT*7pL4*3)Gn1`4l&;~bTQklDqBlOTu zpbK5Y^ngZL2d(BwW;Arej*OIfg8u7?9t<`H>ra35$F=B@P9y?-c{h49_Kl*SEksYV zA%W;M8_{oE$UyYC{pfQhuu&V2zIh&NRxx_(R`gdlSgYlumuev8=#E~v68*3V2}7US zj$YN8j6{Dth91d~_UK9T(3h;Cqo0Nzbe%Xu8!tzHcuFAC1HCT-#oI!2F9Dt3h6TVN zQ2qhXz5rVO3FspipqULpuPH*mafjx<0KKIO8e3oVhE?bf4$$&vp%*-YwLm2L#c}iu z16bCL0X3GwLu3Hxb3G`u8CKCbpvz~l!RrjVTMWu;Kzf0SHiM2@lEI+BgP=iE(hc;! z92DP}^al0*2KsG9hJ*5tfc7n6uQwGGb(J)QG$$L>_?WaMqd=c0K%qQXDa3#(PQlut zC+K7YD5W_p4-}w}=dg_Eg7#km3TOx`g;ccrUE&IRgqdi?O4v*IfbLd+^6X)|kO6vo z02_!ApunS`K_ToM;?c5Yu$SnIw%&!-ZU@_iIcVdzgrIG(nFnobf_C*r%Z^7&yP>Uz zqP6*Gn~rFmv1lz9wAVnimLU?~n*YYDs!2Id+7 zTfKm<6yVAp*a`){%zz^wU}+Mt<^jBo0OpKQ&n~FxIMmz~bsvJ-Lxv8#jRxijYC

?{OTS8Mq@SdJN#9A| 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Ν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 B;I9Ax literal 0 HcmV?d00001 diff --git a/sbsheriff/Lib/site-packages/disnake/bin/libopus-0.x86.dll b/sbsheriff/Lib/site-packages/disnake/bin/libopus-0.x86.dll new file mode 100644 index 0000000000000000000000000000000000000000..ee71317fa6291e8a015b57b5b42a968b49ceb7fd GIT binary patch literal 366080 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

ss8*YJa`<&!F4OE!PF< zqi$%O6ztESK_Ni0Rsn?Hl-2roX`j$r4ya!tMbdV~X9(=IP1C~mdh4_ST9j(et66oG zDA~tep#wH(Gktc=>N)Z59q*${o3S6SwxjmQAvsH>D{zQXML1;Hu?d4g+)>ilA7QPx zw$*Xc^)`9OCe`W6xL+so)k`R{iDXNs33lfeJ+Y=TiyM|)-YaxKiY}d9vn5B+DV`?v zfP&rR-b-C@CA{_^UW8w01m4(qvy^4fcWhR@hD~(>QZ1HK4RY)C8g_Dx1O)O6+Y2PH z^aa{bnvI^}ZX+p1hF+S_E8VP>-?xaz=x~|zYjpNwF-)b{1{+b*p)jl*J4uQs@)e1E zne=aywuvw>mwiCDjZ70oWR^T!feG;#BD^8tncefTvfR02YqoeZow*t}=A&Ax{7+H$cTyC;bGDdixpB7?+tJl~DAxNb zwTSFsXD3jJ-F1eVlms zld_Xv!rIW4j_<{Qa&@m12Z+^S319~6eN%FoC7J4{#gDY~4HE)-86?EPESP8m4heiB2`;)740y6~1x=

C`!Yl29KD9~wLBFIW>#KUj}}Aw6yQ97F|88!BwU&#@Ix z6Ia*=t#FWxTpDKye$s)nj(Z>S8f{@Jfe|$k;(4VFSds$@eI6yaI44>o-L@6vn zDeL@F;pmv9N;sOZ?kL~hV5wv6aZ4@W)|T!Czh2u)VkL(21f`9E0n4VFRtU2E!9$8| zpR7>=53X8wwjE;IVKN8Rq6pY=o-~mxC2_ocqDKHtLlKDo0Mc%F{UJzoynOq|Vg=xr2MUmk}x{Zd|%d%cfr@!v2Q^{YwR@=L6^yxxv>EV;fv<8V?b7GPw-#%tnK zwMi%G`&*YJkp$ccRw_p)zCU1Uu&LNJd_=KU4ch@wcnC{bD2* z|9w|SJ2utvb&hy~VZDRMqn&D}(_AMfzEO+<2B)oYxg5gkA1(E4rk-JL#}tdi)Q(g+HaKjz z`B~?o^vL-1{bs(oWH8vqrj+XN(0+5ZemD1oW0-7=HuVlZ{BIbcoX=4 zf4`Y#0{`#rH)okZ(qL2PxCt|6*oFLmyx+WD##V!}mt}qI^pBU3yhRs1e8HjWlPXQ* z*bXg|EzzXSpGei!_e^Y@Au-MLIM$h`M!8b6ZJ1)H1ToF|BD#7>J%g-^>%})Zf*YN| zjqa{$x@LN$@;ZzEA`)b5bo!G}hrOiUB^|=C3XCDNh9`WWq@*HJjE=;gtp18+o~a`l zAG0Jo+=d89Iosjwuu(>Jl)1#Y&Y91(&09@KX_58L$a=>hjGx3{_@2oPF5!gUpt4N+ z&H&?yCdMNL<3qS*2(EAjSCFvlA;I}jS;mF_G{Jd=(?3Sze1=UDYN?tkzJvGX)UY^n zDx^pbcqgj|bct!yY7py7G}gsD!8%VgUV~`=K?Cz&Q&>2NxQ0^nNhqDKO5NQil!RDq zqAq!l;Rnl&_a*d9S{d|BSxj~fIU;ffj!iEHr)0GcFy@g@2cfP%!wVocFHApF5==Ed z!W!kp;D)wf-r?Z#P9$PqL6%g8*zfZB1^Jto52%QqTn)K6ZM@ih6c!e!%>qJPS)yGH zj|&yG;bB?(VMYRt#81S^t{Ty?iF|&yJ%}bOf&32}8`_M#!$t!-?io!+uhB~WhBI+^ zGg*LjMCMDuqEi?2^u98s+xG>O`3DV$K3m@%JDH!?%{_vBwszG23n+%$-#UzpP;Z&9~D55+-DUwF|c&&SIRT zwjvwMY+jd8;VfO*!p&Ksl~!AOg|$$d0b$X;k z{;B(4jv-ui?0#6+AtPyh0$1yX9l`s44X43fgi~s*^Sd4 zl$#0PG<33B>*ktANj~pde_CjXHM7|_?iMs9g(d2!IUc%Rp|95JH0g%`Hxh6O^RBIJ z^v7+t&e(@JM^5lTxgD*yE%>15Qi?CA4?eh>z?6odzDq4wvzfQxgLm@W{NPB~4b@0(ar=_;do5>o)#Sl?M603EH{AFJCA`!2G3uW%^%k zRoQnBDg;>oxsMK8fth~d;3M(7EDk%2SA#mqk?Fv_)w~MW9${)KjXTFNL&?IMK%Z_pmewEgtCv=Yx56F%zRYj2^)+*(U~|^`y1SLqRS(Zk ztgqP`;wRVF4@Z0gN~MOf-GmZbUvI^pZm2WZrCC*oBo!BXv7l*)HT8;}cFZ#7<|O-U zn{$$Jo)OG(26Lij_*KWQID2;E_+3a2T9nIhEnrHxOAi|Vm>8S$;XW!v3l_;l=y3-g zJ}O;474uQziJo2HBf9%$WH86=Hp5gw!`6Fq0lXCLa8m1RRpW9$4>$4Urb(4$} z%q`}wMl1Nvk4T`kf)~C;+1k+Szu+D7D#>IL>S?P~%Cu_D4b-RR7ewZ~j8;s242NYT zJS{Gm3dH0!H(qRh0NpJg9L9p& zpfy?+7A?`lTK8$UWe+_Ae=BN!^XGB%XS@E<9hO;xIfG8! zi>5R%trO(Lf&&+|{;^H*@(S9xhpeN~!dC?PK0Z78afwa|^!4MB+jD9tgOTkxcczK% zDa8d*af$XjpB@RVO-1XP`%{|u2jCn00mqM=!9P!=2WiTNe&Brc(MPpQk{KV>+ONTT zlep;kFk}cdcL;TB?HQY`IdUD}hiLnw40_eER7`n>mRQaHmQ-!D%baN1ScPg-ADso` zrbx;&xa^_4o$KDmZ$_;Z2CAbF@S&Q1DX4^B^5qK$QgtO$g87LKTQc~qB=V$Gy-+Qk zD+4y0EUd4Rawtu?*e=G>U7^!WH5y${-RqHJdK#?0(UmtQoae5+H@+X>;gp_+I5R3u zqJS5Ut9^0vy$M1=sobvcb+J0X7%KQ>XhB+_@4WRRD{mZqo;#G2#>wC_=dDi)Ek4iI zQ0Yhu<#duC;*6I3Ihp&`yeMnY3R#RE`@yiqh~pai#6|+i#9-@3AcKQ;XApwMtoOtYVc{zMz6~~`LNLkqjoBAsYU&#v<)t%GEe$1 zP$yoDnf@6kOH|=r2Fps}x>_3b#kBG2Yg|Cclp+>ju7=bviIJVV>P~H$#Br?Ex#}Xx z)07BM3kMZFxX=pb=JMN9DW*(u{@?b*i#3APzcs|kFW6(Ok>W!hjuwmAk}$fa`Hom5 zVW0B=Y=;!>s{XdDd7fm$vQ3-?cdg(Rn}k%EeZE!8YK*4)DC?u`@0<{O={{zkkG zuNQA--wtC#r7A(+D=P8zxsrUjGc(YN z<+6nTfM+P+-6`<6?ciLqel-cx`Ms4{M`iT;=QYKPd4&LOikI1{?q4M&)7tj?!2eH& znam{xeYxUe<)l|L&+d+w+}v&4sK2R~4#`yPpx$z2j%gKXTF;Cs03&sH|?nYu>K#+@IMk!W*rPQv)lqVj0v2!-30H0q^Orgc8Fgbr> zm5}bb!XDV5;!IHf9hDo7ljpc^vdK!G?|O2->q$pALB@+cCv(rbo#8>}%=@sbSM%hl~OBI~WE>*Khw)Bk?g6EuCXnkH4MmqU%_H1PZNgVO-!EXlA#!k>McRRs=ooSKKS-`tY> zIqu16EwPGqGvt$T=()xv?B!GUXv&l8i*SH)GIUx<$6zfpLVZNGit%A5$=8lk@5$T6 z;t=u@6P&GLeCeRvgXIkqS{wjijQndn$~=j{#?x1umt1}0tn>UAq#wvAa^t6y8Ht`` zUp>WxvAeMocF~4ALRrC9oMoP>nPv8zu$eNcv26Y;%}4L&{AEf#op75toQ$OGl3+i< zm`f}w|MZ+)^vj0z(|z9v^j+>-l{JI+btzd_%FiuXSMlTfQdYYBEP@jXUzT)y+HOnxrUlCJNYlBLanktjF=M;ybCLJ5P_OzAicZwbGx#~r+L`T-6TOBT*X z$o4X!_HUUl`Qsk5)@h`g*I(+pDRBC7-}P0eHCA)0PHVI>s!nUXuBtjMh=nh#I<1kK zTy=p}3${Zm zH@>Ji&QOLc%*n;LQvGgRnPH{hmSr~iKb-N>{?no48_=Hc-G5|7Xh9sdP`ZwCE;5qR z3Mix7Ja$p6eh(V#yp6V!8L#dChy*3kTTG^!+xIVWrbadheX`zMC}(2X`~<#Nok|xn)+>Wa#b!$3rv#`F4jz1P*YYG?ziz3AZNM|aHEYEBc{K@gG?2Or5xJX zEf3$7nZ3SC0=xSI8?nS5r&A|kdOVok8#vCU&kp%Jxac0a!BA64eKY(H--T?$`XQm@ z8@#k!@@4uRxZmZJMYNF^1l#Oj8htHR7c=E(JIo0TrlIqUV$K$iE<()x$;-M~D(mJ| zSeNQ!aTfJWNM*9^+WVgIQsBr%>2n13!Iy@eyO5(IpIq%^EwrfH1%$x9Uts^0ee{s` zMaQRtcb^OXAGu-7b4RXH8jjg0)IC?u+{_dveR2SY1vp|z(4Go>V?~Ql=hT#`OE!O` zFd`lLM|bhtlA5tvX8Lm4nll@?Vz|hWk#7eAK7bqirvyfHnRQm!{*Lis5f5iJ4iMw94j+>H>LXKgce7n zS{LieT`Et%2bOVQl<)k&fD7@!K=Q`ffr0UxINBxNu~}Tg*C~gH&DsEomtXCV@|&za zk@R9U76kPPudyn5XN;|0FaYC(=O3fFqeL{MCt$4w9~TXuWi zwwR}O4)Zm6m>bG;_rX0RV)VL$MV-N-mjh?4xc%Skc^fwU_L>8x|8vFy2#>-K;DFtK ziAeN3t%0xEE%*n$P7Bp=Md{hA{zg5TEcZ(1D(d9h#ka-pm8P-TZcA#_0VJ%_M&kmj z9N20(!`+(kLH--G#`vbOZHxcgK*&(PWG3RMM2V5t86B!co!;JM>;#zGE3t#y{To^k|3cR?AXIP@|cm{@&j@|Ylx(ehvz+5ERx zaN}6T*zm}TF&t;JbDYhwvH&g)3FYtTS&)Yu+gRFDukf?w~4fEjQkbI%L#}-1dH)py2#tXkb2q zQ{{^I@PtPkdLCTf_y{ttiny>GV~l5TFK>j^3v|ZW^qBu#6os5=p@r(P8FCoEhR8c z2Hw7?r_tdX-{WyxeRBEP5`DJk?cS~jX;z~Veht#d4P#fDA3o};=0i`T)m8m}s3Z9t zuIep>Dv)cEgsq+TY4PnarNOr}3p)~v@0u)q`t^J!(XYZ!wI4rx9vbZUdKA6rw|{VB zICn5s-mfq}g|8kS`~3@}u@{~di{lm1i-)7X?VTOx1>PR$IwF`g#<{B7OcdGVyhMnZ zy~Oya;eC6DCGd_Fa-y9_H}5j!!UnO1HkH@E2WkB7(tN0YVZA$wy4#Oeoq353&4$GE z$ZIW2!ry#NtHE>pBbaTVhb3$`r^TM9ZT-x_ovuK$yDaGG$=ttTmf`6}VN!Ie$J0&k zg2T2h*{^!I6qh}&&w-0FOC_QG@1mfRT}+$Y{?WlFJf(qgM`}1eor?^X)I?S?kGR#t zG_^PI_QySqZr>Q_pT>NZrhaV3zRy9@o)t{IF`h}-=!xfeHqm!H(&vV_hV&K$sGK&E z^Lr)FgHk;+8DZ`*M5NHu;KuR4$MO7+`7ol?E&>mhNyqa)I=Gd`|o zXBr%-$1$Q5)MEX3j@gedHv6$K1D8p1hb=r=@U;dy2jtEnD-)gh`thj7aJM8$>lY}@ zYK(?7%%vC&lKo=+?alD{(e&>Gn(ZjK%*^3HGopA>7V?=3M zU_+Y4cZC30m39OZiFUfRqrDXAAYWJUG?q^ctXjn?3NpJ?Q)iX{;!9kz~AZbb!S&P$0L!UFrhTG)Sq=6J--+-vq%`tWg`)RlPm`;Tb#*=l&b0IuEv~0}iETJ;uX~Jya2tk+x3)&Hq8ZO7V%I}(ls2hk7_Op<_!$3=~c)Cv7@5n`V-*`QnHsfno-Cz zco*xd<@j&R8@;0sI+RV>Q9ej%pE(YwEFN?!jIkF!i8)z|**zF{dDE?fg66XeK4Gh11!4lVD0 zKxRX6)M&`l`ne|{6Hv$y^C89R;c{R0(6k=Y-*&qr=T&&eAdrQvpQJ}9KftM)-uIA-wZ1d`5D|6fz6TNEf&o5~e zEnn5A{O9U>`_8$v&pb^(xkTN-vLol$59__Rf0Fvj6L2lvrV=ZdpuWNDfA#FY-XvxT z60xn@;MxBql{^SA%>By$?KA(U;Yq{e)N_x=&{RE-F`9?Y`d1yh7s3tW!68bsQ3PK+ zzp(hW?zuRoCEp$>aR&*s8V-ZN_3 z7D$v=AKLKi^!i7+BtDo|{ph2{hMxsD9L^kY1riu6hW`<69r66t@N5q*uWRzO3A@6j zzv5$n-B;CVt+A<@NwiV)c%c4D+fHnDJonF?$i$u#I30i2hsK7VV^@MplDsx9*!j_~ z1c0a2_2i9n_b(C2Eb)Dxqdu~Y1lYe)3R}_;lIDuK7R9}lv4{b_us|z z*J^AyTvNXh|3^UZ+evecYahv%l2dTpgCGJi2Fj869lX-8JWlYT7a0TWh zkSx>lb5~#vaOIkXI*75ZUeEu!yz4c(d&8*}))I}3ci6`(_=pl4P07(ENY!wjQ%9R4 zXZLSb<(y?i?+JWycOXs<=qpJjFuM&3#H`27t3&kWCATW`?+NQP&t z>+V*fD>wXgq<=OZ<_ek5Uk-V;!UBXmFQ1+N7bFa9*lKm%{UD);=l6>Nk-337g#>b5 zb=TeOWN=|~iQzv?i`ov__8U&!^J?ws3pXzsc_l4RugiS>u1@-?t+#SRvjrI8LNc9* zWjZ&DPXAW;C8KD&G{W*Xqt|~*FNp>#Z?w*|FAi^yP9C0L&t2Y(oZ0hCV5?|?K4#hu z`G3v!$mmP|%fk;p%zUScR}G485O%U)r`L1q3Azjn>{ys=O{~_KiXw*5A(LrQ<4IeUcsYbfEkd#%d!6-@&9GTzHmvCFl zT-h2%2OfgXkK|TWR$|-!U`-!Ai-{(9-zfr*KAO2_?ONkmi3~l_&y)95%<1Nh^e09Z zI(8={Ek>Oj@_dxpz2+#IR#F7>+%vjE8V+LDVly%y&eH6XIIPm&tVmUMui^Bu+t5X2 z?pgETAO&sGY+TGF3ejJ&WsX(NEmd3b)&FkQx^>mU{=q6ub3G*j@<886t`=SBh^t6i zSr)u5up31U$Cw$oXQPnGfdghYjE@=t@u zz}m^Kr(E>j!0D0x5fw>aE(^L*yWus3XDF{Pvti94xr4I2h#4{zl0Hxn3Q5)(4g34@ zjfQ-_$;zVs_BI_C86*=@jUpM{ydeD$&pA*ibc~o8jm%BD-EF8EpAZxWJH#cn2PKK2 zvu3uT3vZeMlZd?hS;5wI_hJ$cQjA?7juOqTanCZLn0R~>zNGke6APUFq$ zwE)2UjEqsIz1KK4gbox(VhDL*n97&rkby9cuo>ZC?+ZhC&(KXglv8I6G0#%wpY&Z?pkE}gD)9dchSkn!@>NtW zI^R|i&bjlw!2fQ({{zIK2CBjSo)TY5uw3gy)@sp43lcgL&!P=96jU$R@vl?+#spc_ zRyY&#lb577b>&aRX()r=X&JnUQ7pEFCk9Y4FqEvofv@3QDps!Dg{1fol?j;w2X-8L zd=~yt6^%C8)^7#r_1HKmO@G7?S@W1MNb(-ZQy_2qkP8~nDf~A9RpSgU&|7ztQyDYR9vv0|B+P4ow zTaOkU-l9dX>uAxxjbWQH*sCs$jossHC3&dL>G>l@mgg**;x)4V#z+zW61uu$=Qzx~ zd~IaAhkui5O3I5|e zzbbSe)MNru-f^uW$8xIc#LlWT;2pO_b5b<6-Qc1D7U)&6EG}Yvep7xfRPBEdt}coG z9blss2sUmfSoc2(#&AU0EUO*^e~I;PN0PW5w8!#$MxnjG^%N|FO4|oQ*Ul34-?p(V z;9jE}1m|er=mH2-(%^w6Syw87Colc(lAZ9!4T{?kl0sD?l+L5T9`qBPs7Us_+W(;H zhy11bCNfcOH(?5cM@)1y;t=u(us?#gYxT?-dditaL_Wr%o_wFYj83 zYRDt{+==}I9W9*Im9PrDWs#tKqpiTY5eFDro`c24M%vC@al164UyKS_L#0$uIN+Py$kz{p73?L@M7BJF;+Y*J}?r9f-*0WWAHdCf0D}X~J z_0Vzo9mt=V#3re|n%E@`^MC9nDI?C$1{J?wkePp8=oCQv7cVIOxR}iprF<9C&CR&t z&PXJ3S9*{px?}>{XKa|;K1(LAbi}z-zK1-Euq}f+U3{>3 zY#QEXWw}8=-$}9Hc!EA8BHm#Pg4# z3m&O6S#-|DJ5i7A#krW>C;i&+4;zfZhB$W_p38;!XHo4g=_)f?)&8a+^No5S`LR`2 z9;BtR_)*!JPq^Z=q79qygdR*$hM7npPb57truR@wA~>GAq!R9=mXcGrff($DFF?X| z6FbwBiq)tcC3ndN`jLLC;$&6x(KmpH2?xC-xzzkmdy1ljZ0ROysmHd;@tvR?0fk1< zK@fl%1(U&2L3@I?w|<7AHknNwaW1vA7)?(nXlfy?yd)MfdOC9G-+TshcKGb_uRhBQ zU0jnCLYEF+;{KDD@FGN5a`wT?A70}APrRh^Z@i?E^{>1%9WkT4g!wz|7_`y-F|43! z8j@(tU5VAHYGzULgdEwva}bOSM+d_;oFj2L4rjE(D;+A|D9jdgAq$%R(ez?WOLvzv zXjG%kEl1)@-TXJ*NCuNwzt0<0!?M448+lR;6WkLTkIp9l42%wE|f!k42T-WP-HQb5EP%bjqn6;8K%n;|z*wpKXTZW19k8ECB_X*ZcJHyL8B@UGp& zg_?8(gc$^REd+gY&O%hiO-n=ShBs;H z6ue0$ZKRLW=;IjKqc43NA$ts6HaZLk5upQ#qKo@myK++IrF&PVa`(}i{p zq>U2sG)y*GN=G;uc*BAQT5dGcMVt%pkGOkEdO!mQY7r11(Fr|TmltV}qVdWYms#JS zr#{5XC6q~BCHvjr?-vxIp4Ezf{RMFtYWrgJ#G%m*LvFR=W#tXvpY|G6CYF&&VZ;?7MwKBraNY9v zTKk@uKERnP7}sgje=>~}+TTHy#exBNba6fvmZ`}<))zUzSNbf1#wU11MD=|CZT0zI?MI+eO#-L@ zevj`BCZ=1o=~;X)S_{8PAx;=)3a2PZ^CtlAQrdDi&V(9e`zm(X5K8opGTI-;pd|>) zA8COoI7U}76s-S_|5R_c;0ysVsCP|J?;A?|*U=7$Y`ng5E%LQPCwP@BUS9cCp?-Xb z4%xlxoG}Kna zi8sVIpr$p%q5@~E%f2lxRO1&-X2i#+kA;rX{4w1y_{$$JrQN$1Vp+81?!~f%u&5Qw zD3Oy60`un5C=}7yi7Uoo9t#gB77IU7gZQFs@q!{X*pMgV8x?B#7)?R(6|ro6$c+!Y z18r<{P&*Vh<&of{XvzYV^ngd`a!ZfN(&~!b^j|G&dda`GyLf|H?ti$zNLY6C^{oz{ z<(9oA6>@vx9GTB`@(7BTQ|jc2L(ku|Zc7{vanG?PkYU{%XCf|=aRSs~Wu7jlZ*n(s z?{8VRCE2!nDN8-}C+nspeeZu{(?6`sEoM9vuczrR4@G>8`q`)`=U=&Hah1h`_FR9O zsPFChM|V^fs^EURHFh_%5@%V^*42qd-tK=m@?WA# zqZoh3`g^Q(J738d!J?g8t!3->0R)?Tpi8_PIGwBL|o)~`jgu;Hjsl;a0Z~gz3u#4q7 zs1|DC8!${lbzTq4N*5WdFKm2`=7*E7(|Fb5zW9bWRt8}l)VYw;HJ>g{k2j@D5I#aH zhE%D5PkytA`3?p_$M5uPSp`WxckL1jFe1kEJP5J!w5gT*P9qbO-8cc z8%I3;%XS|0yg{$_^yd#}bZEsmHvZmEPwka?JCGFK_zzRAgPy@wI*-oHcBx--Yjls7@ z1?XJI(iIg>v=zp%+*T%{{9fcG%}POIqC0-XROKWUUMUNcBsv@{qQ3|^JGO~uEUu6L z_mR4|vV%qsk3aQ2?JjAfr<(v9iP z-)3}b6d+o^Rd|JJKl( z$v*VeWcxE@UxbB|RBtB-%Rg|~0yO=3*>sZKx{0@_1b53C4-YJ*NYMT5IJ(1eju_u% zJ1P`$hW&}i0P9M0aITI)5L6jHpjxRT76;LvmM=1JtyYr7qFR}%{lnHsnrN7jMz`vF z2bD?)2n9i(QjacI!bo>_tck&)H8q4j?~Q^#HMT-GEQ|2x;zR7q-U zz@|0X=XlF1#1-w@3zU~NCBDmk^YXH#$PzjUhi)axK>NX2-_cF$m>!U9!;loQ)ukfB zBIxBX?viR4p^(5-F$7FjL&vvt2hh!C&?D*Sr*xE3luvIjPt5PB*2KHfl9;Y`+~LUd zQUh8}d#k)GREjr6$uvUA%&KNaHpD89e38Ury&hSOrz$*M99fU^3!vC|!?I>%eLVLB zl0+KIYQ8V7m@(78y^omn&iGI1kk@Q#v}P;tdjt_AvP0o)Ul4~iL#VU3r!L<^N3^mL zr?g-%YAmzDcGNBC^(lw9O?xv2OpA%35n~k-W*4fC&UgDeyCzu^yr94}dJqkriUL20xs#+(r_gA$)Jal!-uRr2FhRg8Jx?c%pDU_fm${I{J{9}b zTUW(t_nG$+kqCkOi+b1%4~lPSD~B~{m^F)4h6v>;Ch=^kD1}dwhQe~SQ2!xL6u*ID+-R6$&ao24Dt-JX2*!QXq3O>{A zg>g)4Wrdjip5hO7dnbH+odMX6>h9jalgoP>Vz zdF!n2iV3|WrSMpS)=Y{zoz~d@;Q+mbj+z4krn54A@=&`T7}s*{Q;oy_hvPBh>!i|u z9FKV$udx3=9*?O8h4IbU`apg><|I7*e>xsh4GR%Ej>n9V1p%=aovoFc@DXL%{$Qxn z=z2VFv5O7+67RT!2Jg6!BK8hoSD>NmLDe~;)vViMxndV(_BHF4SQW>tb7t1JVkI&G z+wYN@oa0gdg|~%TVR9_gej}Sddoyy6xP$Q#fUL?IP}xoaUHzz;yZp;!HM4EC(BQg~-a?3FWlQ300KIkP$B02})&n z!f2NYOFD|W?CyoKt)Y4j=fX`e=Hpq-@@Df#aUGtNac>e=HP43mCGkaiXWwXa#xoWx zV1HCKYUjqA8xL>1y-}xHlklbav$zSiG+<+lF~9jW`$lXhYuHOtj^$ayZX$Q01wQn^ z7LAq<@uZ9=wdM!Sb=V?Td>NyN`!t-Hm3-Mo*6mb!drgHP;5~c(lkHF zsv|h*o7Mu9Y+ZcRaK<<7Ki_omO}jm6+SG&JQRDxPns$5Cv}IANLn3Iy6Ajqr-)OvX zUlz58h#HatQPY)0P5XD$G}@!amq$$-5z>`KO%_SF6s7-&-K2yLGryVsG^WB9`#4Qu zi$RZ>z+WmN$i1FeE`%S>CLo{b%ni+cE2~G@O_D3welniKHZ6=~OjwWyN!4 z*><$p&N=!a;dOg>0#aaNREsXdt$K?V%bTBhQ9SG+j14Q}v43zp-Ej7@(WL}!y78>h zCEl3|b~UsHutw{W6qDzT*FEv!zERzcXAo9a7+o4?bY(_|r7@Lg%W1F>T8ywf*IZ45 zir3_o@~kiO#=x6+182EmLL=QF7ygCtMg}=I*%wV1(ZqACNO%tq%9_B;M%bP616qQ3 z(oXM57)ozpgWr4KjeaCxuT|MsduXJ!do?Cr6k+Nh9$0UML@rKyglt={UJa!Ru*5csQEZL7Dv(=+@ZVEhhXCNEa&sk`93)Vo3dT7j zuf+RcnV5&%FriVk&Rbkn@q+KAS|?U1m$tQKKt-$B@(R0&-IDcDn$;w=thKzDRms7O z7sH4W3{B`Q{uaGKD?{`eUJDb>&-9;Rd9JF+QHs@2j;$lB;)h{e_jcrqc+>2c@y{zH zd>CoM=pKv|VN}~#Jkwuhy~wc*j^Xr|{MJfuU^S2SDcY zsi39FZkH(Du7rbGIaDij1xQU*2~|Uk?^B|T1{Q{Nod^v1=#k(JN;mY)fRDFMWs78Q zWs7AuS@#r?`Ty^lmZm`BfhE8W;3RMtXaW?|6^Je{4441}0I@(WumRW&oCGcd&w(F6 zmkb3m5*Q0i0cHUazyJ0oLxl2nh(ePRSuQlR5k`z%(EN zNCOrFyMQtvE+Hr=I4+KaMJ5JDgv~YxjGdD(FE}!ux}B8}5)vG15FZs~5H~L{B7&NQ zMaBomMg~S01joik#S#(}6&srn9UnZ~ATB;OIB*`d6B`_p5F8h85E&J35H>G5BA9v@ zJo|STaq)ri!LTKd9dztA2Av47QvVJZpAvzu952@hSa6!jh@WjI^YA-sWAov?%Lnu?Q{13{stq z907+SpOguoXcJ@7mkcIWWE2@qT*xFc4MXl+giDY3{_}(TfBdk4e7i5Q!!iGBSd@00 zBOd8B*4nb4nTeskZg(B6ZkifhyL9IBdAv^Q>T0-DRaI3~RJgKBnO;h=OYz?>g@0U} z|LFq5{Od(obJOb8C3d*idz77}cY90ADmzQrb<1weYI@zL=CF6)&gI#Bjs4DV+TY*U znforP{A%`vzT*1W;{aE{4VVOY0G_~9z#H%ZW&nPGKM)860krL(1B3x{0orMZ0%CwT zAOT1MQh-z-9S{H_APdL=@_+(B3={#2fMQ@NupC$ktOnKs>w%5HW?(C@9oPw!0DFLa zzyaV8a0EC890yJSr+_m+IZy#q0T+O3pa!@CTm@=@8^A5#4sZ{+4?F}O15bfxzzg6N z&;Yyv8iDt~2jC;{8Tbk`11-Q$;1?hT=)RKlOcDivZcoPr=xm5Ozymr1T>(u%3!uC4 z^#JI+u|8l37y%}LDPRs*0CXYU0ALVc3DD(T!+{ZiHDC+a0S>@uzzJ{$=yEStzzvuL zcmSTjRKOeX0qAk>etH)sf z1yAaMPkVxA^#KDs8^Wv?z8S%eG3=VaO>ek0g&#dZ4FiqCLF)+6JQB29BMwN+<)aWMJH*Waadbpn#~{v5h`Te=zy)bB9%+_X*zgT0EqCM1+yG{%Y&T)*cHP~5!^0< zA7FrEOX25o_`M2YtU*}o5GGdZJ=+8twt|-JplK&)D*=srLF<0dd=RuBK^%@DE@g<* zNyP0m;#iKjRv^yj5%-HogBqm86{N{Eq|J4t(JiFa9i&+u((WPB@G;V|9%=dlY5NLk zEJ0c~BF*0;?VIFvAEF>DvndST!GjKL)Il7?2Yg1CgFAqq8o);_;2l9%>q)9(64hB;k|)>zwo^a zLsC#^?NAUMrZXfjo*_Eedt15}?^hVo@RlJhSjsBs&myA9ETWXmB03vcq`VrV#7`{J zpvNXDu5401pG_+Euu0w%Hqq(IA%bxnQX%4yhEp8U(#(NSPJu9q3Ph<)f#|d<5IaXj zA}UlQ4Yw6ZilGv*i&i2IC|G$K%0wqznMf;?iGwbeG$eCL%RMd;j8Gw>^(sV(qe^t< zsgm+KRl+!{k%r@HB*j9Vly6oi72P|LycL~@jwX)?R`Br7Ck>nVq{X5$k(PBP%(yN@ z=}{M=6Wf*8scI0>P7Ts9R+FT>(Ij?@x)BE}Et2{`mRfq&gl^yaZgh2qfeN=2Bd*8BqQh|b)mtjnF=9mzHXKzw5+LSa5 zHzO?r%!$;Z5A0hIrGb5kj#WQmH>N)kO&LHMLI;u*(I8^CVK8whw?z0uh)$p zI7C{JhHWEA%hQoWpl?G&LAFF`?O6GnduQ93%6=uGq`cJHSVQSo%rFwz(C_ak=e{fUED zAksgG=+w<7(oG@6Au5zKIEIs!9uY+FW1g(8E&-o%6~J4l`y4vqxf|*p)I}Bj!Cww2 zhtpt&GAmjIRN=W9WaAnD4b9+^qwM=&>ac&9ow1b6a9=??{-P&ZHv1jg&-t!cQOKuqgoLcn;xuM3EB5 zB;v49Kt$pB#C%sV;rgy6OyPFI3_D1;vriFo?P?PboFd%{imNh(xSu*6e` z;dU`+N*0e`Do&4Qn6q$p`Yi7G z5iEz|DXa>&XckwxfK{@4H_O4Rh9y#Z!!ke5WpkHUu$iQZY$hd^&E2q)ZT{{ITNL(+ z?V#ICFX<%%(Z%3Qw^s(Dkcswm>Qs)K^PT1n+bHSRt}z2dK6b%#EGsdKLl=~QxV zW2Xugbslppjc0!8Zywhzh%cJ(fG?``?96>y+u1yOVi)F8ZI_B8o?T1aA9UsJ3es?> z`k+yK%tri)uNRJGfX-s|w^dXh(p08j8JnlD;+v9oyC;I3y5AJv#+IH{ZYT9$TKhwC~QY) zhf|Gv6@AY&Zgx^NJ+c0<`HRquzM9>m2W;$DFnF{1m7x|JhL7+wxo(pew8DOz(tIdH${Z=mv&|0G$a=-cH+^nj7F~@XXB$fB_%g{4IyX%H_ z7j5jX-V6y=W05yWY_fWb0vU?(+%H<4JbT%d7*^?$_s7jh!V)Xur8K#9^20)=$9-vGrqrWp83}klLySZ^m^## z9V2W59ekbkZ48)r>~EiGItzV+!gMpDUS-`$lb%8Sg{=`5&1I918x)D1ks7J6)g+5b zjmXE=5k%@SgD^j^duzfC5>q~yv0GEdR6Lr;;??@IV-{}UNK%Za{#k$q&06=uW>QC=X~r6Gv`%Idy&m_;*erPF6rF2 zD{=VSgg8ucCdH$Lq;vCQ!i4vTgwJ1AaL>wI`^mtx+U?o9VY z6J~X(<nbYLq@6~D=k(I~yVzBf zY_Y-e8FxzP6b|3ao5O$U!{M*<syxd*KI#>@KV5YCd<50tlr07t8AJ2&{jyA&vm>TGGRzt@xSCAY# zCve78xv9C4o)%w)SzM5r7Be^4f7;{;W9>)4XT$D1W>s-vc4|UY*eqW!_wl1`hYzwa z)?l`*UA8bskP;UW5-@#=n=``e-;>$9eZ#6n1zG8d(c!aadV5f!`)OQizb;msK7M%L zuB{tZFB8#C-Zd~Tk06JM3KP%#&7`ul*%#S4oT&=K6it=Pl}B=Cs4P(ZORYzz6y7Vo zf0x%?Q#Ez9E^B9ZAE&F+^Rxav!}CTbOpcqLHm|m*>-S-R%3$*$uEV0NmXADT^L&)D zL%-4PPEpR{aa&!Fxm8ZOG;xdm)mH< zD4G67;pffxGa*a_)A6O_F1IlV-|5dEzgQ-j$zZa;Li93|&-VYn|2N}l>FW0~?rmz` z$D(h){sRUK8f-aa=&<3#M~t+#u^nY+=ioScjMG?WXEO~$^MON0*xEZfIgfLlFwuST zRBxXdzB2=612r}vDRfwM!x=0?ROrle(vvhu_W zi{c)9VL7BA39>BJIG<8Pte@h}+J`6`m?ywf)ek3)k*GdHw!}j{b1h8DR;+ z!X;}q@7jO##Mw*N?>%|d*z{G(H+Jxe6fWMl@5K4q`_JEg`k`t*evWYE-trsIK1#V3 zlOhYZo~(WGP0iFfD0T6+(u;Rre*DGl>k+eX*SWimQl&xD1)ItrH7i>B=kC7pR%w8D z>e{l~?-hpx7VN*?q%b0U<+%n0>!=NvKPwEMv-DKGf=$fkYu`Bz^AFT>Mhi;c*0*1q zaGf}D;_%^Jxwa-9hE2F?YiloFJige`jM|_VY@Mj6s5pLnZ=ro}YJ*;|RSVgCMa9uY zj%L&by6YWiH)lab*s$}+-)$MZuCOBc>Lf3!Fx z{76x-=HcAgl?Ues#T^KrWwzfd@abOLfVF!J{ipAi`t>Y%;QMOlp&18uWKB=sKH0~8 zo8C0jtuMWpEjy>yZwi@meq%4sJsTc)tXRL$J#U@;q|~+V-Qw1)oDj3x)-`U`^Kr>5 zMK0MZ^qiM0FLm0v%xz5h(&vtkmc%)<6*Km|ix-TVyja6FYtb6(6AOEe{9Lrb%Cbmz zc=Cc(L#xD{hjbAa3=S@A9eB1Na)4ezeLrFT#J+FxPWAE5>ur8HcaiCs+;1k8IWvsM z=9KrU&F*FBo1LZqG3&WrVU~lgS=PqxS2J6*6Eml3nPl$Md>~TNSSIrC;wdWS>xk5N zFNCwyj|z{g77Eo=f`tLfV}(Z*`wEp5x(j{Ts>1yYONic#(6fyt+|jBkZ26%hbZhA= z+}u1?`0Z=3aQv47;l@u#gQd5zpz6UzuP%HpnsdHv;rq(0MTr%Y7n5@)#f#3i6&s#; zwB+civrAo1?pXGsY{_!r@yr#5rO7MLAB|lVek5wO=Ha+C$lbMZ2Xfb$?O(C}>E7KN z*6yj=IDPliO+8DPEw6U=-g;oiq;2Wj)3>{C+rPtf>x-St7TuEiO+LHNZ(Ory&xR*^ zSFG>7KW|;^fz-9<4#utNdN^iv*pawZRY#Lo_AJd_AvnHd`HQlh%f_E9UwY)!qa{7h zv=tYf?OiM_pS(D}B5TpR$`cDi&VMd?e!;S6R(0}%mzS!R#KN9DoTob3;5k#fG-Po8{4N){qT&9cg0T+Ix8 zm57u!$=oA(Ao6^>Ow`ioDcbyAM>PJ!3*nchqrwfJ3Wejo1Pi}>9V^__+*dfEr8{y` zRk*E{C7j&GActAPeT=GbI$H-h-&c4xeHA% z=Ng-P=bh;DCT~JtVgBQOx&`wFoGoY_7+jb)m@noJsT8jmnzW$D@WDmvtv(m^7+JP( zwRP5_uC|jG7mhM1CiZQ`F%FNGJas&~bi$Y&%Z@oMS+3`txkBiYyz=R|*i|;JQL9%> zh+EU>Hh=A?NxAEa+*hox^Vq$?(6ee|@RX;Uc1&fqJooCowa2tc+dO>Iw`Wb?zvJMH z7d!9!>Xu0Te0Cf7ui0Z0@MQ1Qz~1}AXT=^!2|9N$XLi@aMZsZ57KKzDEt=D_G(S{u zJT2@+S!DS5lRk5goN|chdB%8N(OFicwERJ2e8v8#ca`bUA?KZAo?lRpomG7`_T{Dg zxX{bC@gJ`I9iMb{Z33s(F>%TD7l{Tpg-M5RX(c<|DM@~CcUVeH-RTsS2czb1e|U1f z!{b4zPo8W`O|R#nHcU(_e^Hkf_{tKsWMTRq$-{Kdx4ko38Y40`zu%WJ{zF5?mnJ>I zhEEd&L*_WZ95s|T1(=@|V>tT9}c47MZ?w09xx^-#K z^^(%E^!aIqhTBrhds(JVH$FB0i^-_@3r)|Y7@H4EInk#ic|u>Udm%xU^uJ?F@9p-V>C({cHsHm(cjte8+7(&$zcjNF}F)~@~M%MJK=?7;__POt?H%;pI(#ybq=Tw`3kSS9GdwGV>df<@~ zw9q|gw*91{;P-BeLRL;Fnq%vlANqV;TA0WsGF;EuXKtyJLxkHH<9W{=S&?xL4rAKSnI>)TBR*&sD@@nh`tNb|K;kNOshW;JjdC1y?g29f6@r%UB0m7vEep<;B z`<5i1>N6~*xB2OmMW&3C zGxljlWGHFu%kb~gkWtFl6R7bf2xh4#3XZF;6{xA46a*;W793T4jhy@{@MX6N_M_Jp zK+X{ZM#vZtA*m63)w}KnNa2u!zaKJX{3y3qrX_ka4-%! zPmGyt#+YQ2mt+jHjTwW!EQguRoM+T968MYsWfm}fvG4plGJ)C4OdxxS8hWIEF*vx7 z+$KYqWy}z=jC>(en4`=Ta+GLb7*oS^hD7HE z`pCu1Ajow-LMC*G@qlElGZVwyV00kUyAS!!YGwqab1je%onU+*XVYO)nEQ+ZB!d?q zoyuWMAme)lIn#E=iEJkdOfYkSQHPxHDr8kfm`X2#%*>71$GAaur_Rh{t}>dC8s35A zYB@6$^1rW;K^ z*eXZ@vlt`DQ(r))x0M+U$tar%VyYNb$YifTE+}R!AYE;Qgl`Yy3OT7NGncu-bcKZW z7Nmqr8B54oKSSPkgz<#bv?~+G++uoQwDk}&!?lbxB(Faq{X50XfDE+9*$OcHaC(T9BaDP)uz89PXNrI0q3Gyag->N5i7Da!9alwfpY zFn3^&^0)~l(tx<5EFVN^=8z#MXUkC1G{_i~nr$dI#$*ag+)n@a6GiZzDqm)W8dtrl8xDMq|mrOvJ+KW=vm-wPQo<@np4%jG3#VAXiAv=#j3A#ZH zAte`~JUkCxV1`C>Pv%rm&qziEbe{KPX_QGg66MXp`I&j0l zcPqeo-N;yQ(GKuYZ{h_GECmm$kdff`HQ@N}WIVWcH~6;?nGViB3EuAneYr?*)HTu* zvosmt#wVmdnF;914+pD zd&Cra0(r>A2Iw(ZgYVXY^Ljw1AQk-f5V{F7z=5a0gFNUTL?LHup~o-@d3^x6Jpeid zi;%}32tnQqMD7G2w+xV9?#MAda>*X~6pj4VMGj9u9;+c=ZIH7O$mzbwYhUCxBxuN` zamXhw@@52bCk(k|j{NdLjwv90ha!c8k>Vyu^QlO6O{BCF(mDa@+#M-B9%-$D^c{&5 z4o8ajL7GoTsw*Omh9Q+gkZQe=ZeB>aZb+@MNUubsRS%?=E7D69X=II5nu}DkK)TI9 z$|)h9!x7Uth`A}^?v2=EZX4<5kCdaDrc{G*AmYYH?9329WyHw-xZIxPduUbrv-70U3JgC8vX;|fUN@ayMcju02bs4}+@mC9@>fO_3p z9kp+e^2aSiqcXP;5g;6@|Dp}I|2<56hSJC%w>EgCG%MiF2B2Y#`+pA;pGng{+{)*o z+62D@KLssAlMUtJWO6Pyqn7VH*m5v&mu3-Sd5L4she zAW+~Xa241Kh6v0AJp`QujNnVg>x{aLnv9bfdotE$h%-_%!ZUm_Tr!4b7-w|Jkfy&& zzn^{~{ZRV)^!)U=biZ`x^g-!8(mCnx)9$35N!y;bAT2I!dYVI;X_{Kvr__6?r&Bkj zW~YXxx~BF|?VS2~{+;>9=dYTdGJpE~k@LIH|B-S(r7UG-NaZh#iS>RrHKm@gA;8NyC%L(IG3;@VQzwbf@Z?o__Og# z;)CO@;#K3H#2t*wjGGc?689~(I(B93oY>*9im`WNw#CH7IK=Q`9!2ktPKq8K&5wQ* zwKFO%YE%?A>Q?0X$T^XNB7e-QnzvxylzF=IUPkPVh>I8*K_aT>7R{YJS9|W`@GapX z;eEpY4m%u{5M~wjGxThzFw`-W6MA7z?i}YiN^>rS*yn@ZKN$>=BSxp{r36= z`E~cZ?wjjt6?$2F zy_>pj>V&DSQ}#}oF-3LCNzYJEEzb*+<0czUuJuUsF!#9Yp5;E!{n4cSNkb;pPZUoa zHu0I;0=MCA&nAc`44v@QHQ#lx>%;Ncpxau z>>ei%r{*#1$2g8@7`%7c#QaHRctlL>iY2L;k@Ddhq(=VH?(l5`OxYiAwxJr zwpiL(J|3JpSbOlXL6Zl47`R}d`M`?6bmg1)-`_MWyq@90J7arD;eTIycz5!j=p`{M4V-OuVw)p@6#sjZ`ZP;0E#<8E=? zRJv`_9Hx0yBS@pA>!PkET~BrK=+e+Rt#g;oyZE;JTf8t{Tc>56%sZV`pQ8RoEkjL1 ztweQ{>MfN}l{W5Dt{L}?@?_-(r8K3^N;?!sD%L8@R%qcYu!(pIbi_e=_}a`s3t}4Nd7yU7B`%81>=S-(i1C-!Fe}@xJ1n z_q+FvS&cf42i}f-`{+&V8}6Hpl3|jo4M7b*UKhVMdtLs@>(%?0*)Mfp9(m#V;`#IW z&pSUadFJr!etk?mw|?`}kxy?vnfrwOWZmPTkFP!oc_e+f`r+V*R~`gEXuH4a{^0vp z>VoT}_txASa_`#Ru)CbQ8}5v_bNhDGZPnX5ZaLg~d^6>y#?6B_+-|(No^!p|^|Q4z zYQJAwer@oz+N<-fs$AXm*Vw;aUdg;-aHagR-{sbtwKXGa?q5p2q3d_m{J$@4SLw^psMva5PlnN?|0SzQrUp;oc~oX5E@<*UlA%b%XjJlp&1l`~Oi zx}GUJ?RT1Wdgm#(Q=d+*Iyvg(%M;=ggHF_y3CenxT|J&~T<`dW(s`wtrDumbLeJ+&2^g=ZyL9WwdvHx_>KKHN;YiS z;I~10!>#oT*N+?X>jn zk_}5jmJC?(y||)STs*Z{zxeIqV~d50CoI-l{9@6;Md^#iFVb4{YT@C9qJ@(d_FVYB z=uA;jkzY~2qP7LK3pOu^T`*>W)`BPs^X0KQLb<|5e_(ytR2rd7gO#^3?L);+( zo!Te$!~7%j6Xp+_|1ITcN=!=Ml!oL@$==E8$(2coNoGm+6AKcDC%#HpoM4^sGJZk4 zWqe&+TAY4dMQmU!iQN!m9dkE2I+`23Icj*+)yTle&+~HTY0ldgF*u@puIt=8;r`(b zVUb~9LX$&V=VZ*0h6qC1g42RqW+%-45EK^lY}T|{*8;}`mIYV@toK*K`#dC4fGnYu>Zw=zxod8JJ(`!pS$L2 z=Jsasrn`DSH0fmGU>s+(z1LksB||HNQ2kXstM!_7d+Sc=k=6Z>&J%4l?Gaib-Ii*W zYrN~K-F0-AsLpHo7kM8$>2`8fk5OBvdQqi`+nqZ`IZ|nrVx_`6jwZ*B9mZP1oF=cN zJgHUNtY6~RV?Uq%Q2sHv#rJz|^TBTqzAAhj@WtnI_NN0MA2ca64gBEycmDe$@18cQ zHCnw5ezQbU-thi)kJsZ~CB5A7;?8r<^C8b>*Drf|;mNnhW{-UyEqHkL!N>b1_kHS$ z?p5AxzSHkc(CyW?uHRI?X@4W-`r+EfYrU@pTwV89-4%^19+wx@T)m`r$+cR1@vjT& z7bcxwQgx?Nr_!%t>$x}O1Im-mmY-2RGx_woQw=9APYO<4E$dMhe*9#qN~!O${YROj zQ;(D!mL8gVXzxLVgEJ2t-`{0_wYhB{H4{O8MzFrfw=Gp3i)z4PVTJ>sW z*vh|G#IN|dJbStN@>R=>mmOMax3qSN|B{cz*~L1=`xiSce!M7gQRhW_7mi!lP?T3> zT2!-O-h$2xj*DlC6~zY&rxz*}9xVte=vr_-KPlfLzdmne-lRO`yvp2+T$|hc zb4KN`a;mczW_xApXTQxV&C1G}oYgDqOXkJQwVBbG&Y1?8KSXy#heV4+QKCtrK_X4j z4`IFVlJJmltuRj*FANfT3dabCqdXf5wNa8)QHoiz^4lu-EO;fjE+`eO6vPUg1zLh< z8QU{vXY|atkuFR(PyZ_|JdK^UBGo8$&;0)L_of)9tW4%4M)6t>2HB zXVo|?Wav{%ufdlG+78&)uSehfKA+5Hm{yvY8jE|qH<+luPftxZwEKB&eXV588(q!2 z2>EwA^;H+C-r@F9PFK9aF=i(*m!*1bF|Fr+Xt&I5KKE7QOW3FKrfwhRy}!`d^KG)^ z*6RVU7QA@-Y<&HmC!HS0KCHWMSGVhK*E_;nA8rI(zje*!YWbBBmycbttUh{S`1v!H zV=Hc!2b}$QI_H$`$>U{Hj(<6}>Zsk3w})099Cx5?U+Lc1J%e|D+jVAV{*GzeEw-_? zKHhw0)25C28{*doubaNsbB+6I&s9DvgI6RhFIcv9X~mM4#j3?ti^CReTKKR?w=#+-S-M#jnR7FHWL_7EMXsXGqQ}Dh z!W?0saI~CU9ZtJ?b@|)E*aa|NYu$D`$Tc3X~{5s^*v%eQNj+Xp* zS^6yLiQPlBx@Wh~+}M0=;g#%5*%ua8ZY{4m{o#b!@p(tf59uE$+N-jA#m>RoA8%Q` zDP+Uwb%WPft{S@{V%hd39~ZkXswx`4;8o%Bg6a7~@{Dp#a~!f`vPv^MXJ(01MZ1K4 zXsNhD;VFU{Am|#m<0|xaF@!bP1^pK~wuG9c?7J%NB#gtq4RZA|;JJEHV z^ThE^E@Q_}aJHcr+|$cN;2?4oItcC24%_4BJJENN@5Jeo;?3jCV$HI;1qt;56O>_Qx8IR%aP zah@@5#zY@4cV9<8`w;6nHla2NLsI(|8s+E*_IB%MJKfJFtj}EY$bRv?V|qvTPV1iC zBfskcjkTRN@;7wZt$s-5l=3;n1Kf=&nuo0;oxNPAPVt=KIBlG_i?8b}m#~p@hs6zv z9Ug5ZvdlJHVYonVmXTYZJ}Ci?5f)Kq34K!yl8uuL1%|o3#F|UBR%vX|S<`)o=01Lz zdYQ@!buq8oVY}Gzlc#w4PM$L=z$IXG@VL1yF~bvwqz_3Pk}y1PP=V=sgJQivLpL)P zo%V>sM2{!2uS!ty_8qWBhbXJ_yJ~7_ckiLA*HhoXz_3>@BV%I|6R3w{zC}JCft&oI zjPnl!7%}_~TsL6&6dhLSJ-Ro;r)bh+`0o00{PTO$al-FFeGi6D@z3vsXF9}o%=k%D zruq5@g@i>!K|5qVRRYP$D-bVSRJ?Tg%GGPvZ`ibD>-L?ycJJA@|KOn`M@x^NIC<*K z*>e?@=Py)Ws=4yl)!OSfZr#3fukQZCM~|P@KYQ`=b%W$>$mSMKU(R& z+_Fp8Vu-cF*zprRrg~5J^Pfc(Pv%9%#Kk8j&reMk2s5*Ca`Ouc7Zfd8T)cGI@|CMr zuUWT#!$uIWZTpU$yGr)#-M9b1!9$0S96eTgybN@lK7HnFIY_BGf8ipCxqJoWTmwBf zLD1d1An5^Udh)cs{@L>vFJFPKHz4fY`@cUlfwnJSzcquppRK>zI_M+HdggZ>OA+4%*v^r_@vOK|dn!o<@MifJTAFK^6(bfu{^rdo?yo zT}45W+le7uMK(u4nPJh%HhQrzS%+yiXm+>H(8=fN=zsZ>6fBI-(A48=_oAj!`X^=D zSZ!^rUo7^oR(30g^Hbr+PsJ8R1!d@o%iX~R9%Qzq3_Oui`)w>Z=&&FQk)gKeS1JBj zEGfIK4Ts`Umv9RcDU00(GY;pM!mn1vRz-!M%0GU#aDOUG6{U);DnC@(aQ~^&toBQ( zO{qm)=C_Ohc#I%fZL;uWUcnzWwN;j}CS^@ZNJv?RWt<{vP$h(?LRgAjRMas0M{7|o zM~Q%LSGbFp61lbHV$ww}|jb9*m+Bn=@u zr4p$NGp>)|Wl^R1DLw>oiERCI<)L;V1kko(?OE;MG#S!^3vDlcaTGY3_C~KqT|EC88Ki-kSq1V;dPmwSb-*0566jHu-j;f> z1}F|usaAXGt#E-&K1tt6KT5H(19QAOq)B>0x?FllIv8@oDArxJvO<}{vbl54cg8#? zH1o+f>09Y@X+8e4F*`gP@{7-qgQY`uR?T$%y8N|Im(S+n#}9#2Vb{0#$X01**4t07Las}{u@*FK_d6&pU?+S~^jt6fi=Fu)#Cf^2nk{ZJ zwO%b1vI9Tu@4sEDz^?r=v)2h}5NmVus%|%>CCug@M^)b=jMcz6peI1}FJ&xhk9B)~ z2tOL@p0IZ4a5^Ez0(^vd1lZ9Lm1Y-A{<e8hgelm~`>;et~ z=YV=Zc^TSh;5$H;bNGBfnQuUxtt@(KswtA{?Tgd?4|(qa7S-|njbC;bwin9M%K}T0 zE`p%K4j^{y-Dm_UHUt9*_QeuwG%>~4q9)c@q9(>(5GzelQ0Xka!_pR57WRK;OVs@G z{pI)m-{<+i@ALfUa`?nNE&l(pv%tc_rr4j8FdC%`&IemEl_6-Tk z!{<#KA2h<-&C%A%)QHET>yilWwmo}}9=&{d%%a5PZF~0ZIe75s!J{Y7p4^tY1MUMH zIB?+LQE>PkD@ae5Ui(A_D}HF z=`sA=s)t}j>QQJdF&>>T=8#GBrdi`#yFHdQ(hMBEObF@NnN3XH?ls1}a+5V(WODCf zONxv;IiOuh*+^259cP)=k=QP58@|Hd19r}t+G*GqJg=w2h%$X>l@T$C+@{;(wy;-c zz<7*}eDRPjU8m7Jg$^NK>sQk0ww_WyU6)Cw!iy=4c^;$%a~FL!W67$u$*eCD*Q7*_ znj4SeS5Mo#anr^v>o%KghkNmx#p}P^x+6L{<-q1S8`o|~xo~;qDgn&EMjlZ*^PoKs z9i;F~4@3JOfwl(h1quTHF(8(Gz|7d~KV5%W%@z1fj^6a+m5d5Qmyr1hyMMX$x|U_; zJw9UXcb8t2o4bu!kg)T_^_&W}vG24MTaR7Ospguw1uaP2fBs3Cp{Zy_)Y=2*AG|ZR z@t(SL?T;6-s`ys!!7DZ%y!b?7J#Fcv;#pZURNfF5h&ZQTc z+4_(D?2E6@JSpef4I3Y^=D@`#Wky!sqZh3C=KRxAV;irK#cRHWGE8lUO-|Zz{Q3(C z-*W8S6&ruJkX~qR>l-w4&7sTL6&7~Ei(|JO{q0SKk@@(@FSZ@I`l8s*HE_zJgrnDT zYD}z#M{L}4>W|ko){g%3leZlI{Y4$$YABi=zyH*uG7GQCOTRq+$CLNsGSby96s7; zZ8Qd5K{Em0c%~6!0Ud#~lBPbsrQM_p;ZVoLK1BDXf5UpoP)jRmmuV+xZ)xAsj?phb z*aFRg=u08Zk8CM(Duk=^!sWcByEi-?TvLPLKqx_$dXSHa!87rO4=E#9;A=&jqklWrb8v}=3ety>pP z7hXKNx9itiw=bM7C@qNpUY^l=RA zQ8eG2K~s5}t}oEXo?gkt2x|&X)qHue0~I{5sh{2f_^(tpFXD!)Jn1vd#+72iZvmIQ-+Oq|q}* zEgT;;e<1n=p@X)zfgFBpMe0E0p$Ww zO&o`hnH`n1?Ym!of0SF^#x@(`H)iIN)#Cj>UA&uB(#(ayF>uPl6`OY*I(Iv#LdxI^ zz0uUgahv!3boqWxX^Xy*!?00P=C9naS<2wus zp1S0V&3lfX|0C^n5sPc*ho;PpP2TqXx!YOA%{)Va(0}S@vB|rRT)dNA(!#WK9XWCS z^0hk;p1J-cud-c_XX_C#Y2nHZyN~^P`}w;HrlGal2#Bz5=b>NkWEM5D46QsyjGGs= zcKi2dZagn&&^NL7@SnVJ#fBZAZ+2M=N8jBSO`5+lar=)K@4YOQ(s@?S{^RB?P1$|q z;{BYm7M`KdYed-G<;mL*p1Yk{)XdVi8a{6N=gT(l`r-7AjM5garKf0WMB1Ju8yMc>%oW#p7aahvuYy>RcPL`vh@ zd5@kMnYis+Xph&DHa2fa$b>nI<5PDZJazMBMZ3P4gAbatFeYXDHz%(=%&#-F85%q@ zYR#A5{rubA7jLUN3~YQt=Pg~cdCw20u3`OnR-S=j3s$5+gsYIBl*_mG4xBJ2A}(di zzAMj)S|)H-G5_iKj`j6R)N2la?xi5Yl&wr1k+ zuNdB}@hVHGb;q?=TV|EUw}Q75O0t1E;u@_2T}CjYKu4_aCe{e%RnAq;C6*1u!J*?p zo(wtTym9;}1_$i7lZCC84CUjz*(_YP`Y>YXa;01=_C2;S%o^#C)*IRbTYfIo!5V68 zVPtK1n5E18f*rw{&YaEOz{YdP7f=Tr3U8zGayZ3cQ(QLIpaDYEgf);s{T~?CF$>w3 zSlIrlP?PB}H{kyEuL4dgGHx9>M3x1 z16IWS|ZR%41-sV-Vvy<4c||ua#xU z#`Yesiih>W+To*tAqD$k>#N%b=ZbrYI&3`5l~jXr{Rq|w-znqi(k10~|N#@bjzouwKZPJupy z&$v|RPhzli3AFw)b|KqJ)l%5DYWrnDjOh>$pOaaTR(+;oTdOsl#uamMPqbox1Ls6B zXt$R01+2opgf*BE!;?{wopI~tmE%Va?@USjB5qaWlEqU)eZ0NgT?IB41`INx>~E^g z&v8dgAejX{)BJyuEj6bZ-8>y_XMfSSnQKq~oPVLFmp6 zDJe_GED2q@HaR(F+>#x;e!6wz@ZKG{=X)pJ|9ag@!BAK=5c;GyO?x-o-o1RslAX(L zMBTi&BWi5u*pLvrZ9!*aLWM9R?*O#33)!A8JHB`2%DFL7#hcdePF}h_Vdw7U7gu=O zoqo6P>)SuBTbc&f!r*jrS53UTqwmD-n7AX!bE8wD;mS}b3<7#!$=yF+-!S4bSyp8nS()a!(<$758U{`y<9sH!;9J99WHPuuUG zS?l5jL)En?Lo9)f?I=g!zfxHh!(FKIyq#$}z8U)thS{QbfDhJ9cJ;#>rg!fi=Q?UH z4%!yt9kMbV77R&Ye!iQO$}8WWy!!j)-%elq?a7U2X*WVeApzsp%wCYZ>&N{k_a7zT zE(IB$X;ZHibm4h54qUG>fv3T9Y*awJrwqOie{nWJq@@NCIY(mPjd9pd@aOpx{RNk;-GWYn#`1Wh;EhJD9r+ zqs(HgCJI8FPW$%t$hx~4-(+UIc>3FnQT~3zJ&f@!1nun#LVAkA>jLU5O@p^xvCdM+ zK8j#0?cmJGskXwnX2w?5{38@IjAQkOGFr$>j4&3F-c$RYUFKr6yD>wzNPe1uacrlD zwQJQRj!jIesim70qbOp$LCdi&y=E^%X4N-mC@rV0NR0B8o&!UpCRl!NQ2c(4)Y81cE5fxOwi- zo{jNK=1me3QQp)9d5snNkrS-q*0cC6yc7h7|_KI|_s*w^&(bn;{m3m${2j-wptYb$wpEM@ix2NSNU zTFQZbSxb4=ABQ$BndIke1v`sC&+jSuWyNS0O9K`iSBq$W@cZ_;6Nhk!@<%^?wPJ*m z0o220#LAO7Ik=~4-5Af&@n=7g%$PWJ@v77VCokvZptIun+0+FiY}jOCP}Y!t^Sf0O z+)NlGLMfM)KZB5wwmdx;5Bj_6-u(G(+$0Y(79J-CdRt4MoK9UBU~fRfmsbOQ9W}Yv zzl{s?vf$toaSQRvn`qu*M0DRC&mj8VZgJ5gAtqD9_Xc<1}ru}%h96Gdm`3((8onvE}P z6y0^Nak-vmOw11SwiKtIN?jy!FjVO^C~vRKxpp9a>M(1r9%Q?P$Qn*GZZRRcZ%tqj z^7mVY=n{(h%X3W0#DMh07Jn{@80acI{kbCpZt!+j-rqjX0u&gK)n%Pn?r(yN?`?Yf z$CtA`4Y3slJ4@3~tQqUT!U_-eHs->pPn5r}x=xKWQ$M#unhUy_7 zn)S(v)nkMzbHGUh_Pe@kk)H)qJy{GW+Dg-puL*N8P>l?OLq|`Zu_*Ex)4VP^K_eOzGbxPwyM-9od`Qb3-QU_V3=~FdB-jQ)Lso#8 zK5{{NWS*8JtH|(NHTje9)ho!nzi12ifj&yE@utEr7XR-l*WtS8#}SuB^fMSmAAk&psR;YA42R)3I4(|u)8evmnYb)m2F@Gji_5{~Vm+{4SWm1Y)(z`~b-_Ap z3OpxzvzLJh`&ESfScb#?Ega{G%f{v5{BW6AA6y?h*A3ST*Av$p6ZT^n4#RP9T$~1{#d+Z}aM@T7TrMsL=Z(w6x?ml#URV!YF4h6- zhIOu8;Nzb%W!Q+k!i*8$9vC(4{xTA%1RwJ>a9cMs1%Q{MxEdD>!>le zGDht@+dQh?gC6i(j8#AnX;{E_$_W8e=Pe2NTz_ML$AP^8_n#jQSa|7tKxe?MfGz7@ z1hg(L3>YD842X0Y2=JxS0(sf`fjQL{ff3Uj1G6}=OPx(X;9%;wz-K-)1CjsYz~y^a z29EJq8@T+Nt$`c7b_Ys&z7E_|b1-m2-%o+phMftt{q9oWG}G&W!_w~tPCf8A&|rI3 zAn9mcpv}AD!1u$d1Fu|f4z!)u9eCbqF!1NCWKoA6P4xUIOH>-9FY=M`MPu%oi}b&- z5zR^xin5jt5e-}6A=#7K#`^1Xwm#><3;PwPZr%|&lJr_ohPCZpNnRF z6)EZvE*Cju#)*U*l0=vM)~n8&iw#>veFgBiRL(BZwC8(8e$V!cdNK}({&@4f$Wij6 zh}&^Q6iYiUvb6tMqzpbS%8fcFy0-U%$nwTz(X8sLqCEa}(VdAmMfF?ni2Cl|7qJy- zqRN0LqB*J0MdO}jihkg{6!p)04KJ$Zi`qNii!4KnMTI|YqM6^-i&%|K zqAS5|BFiHkB2H(wXjfRD$nLBH^dnH)B^`8cJ{hgk(?uP>>!BfwX-LjspgA{~$Ss16 zHZr-$@J}AbVB}X3f>I`jqQ^JJpeD<4Xiz*JHJ497-v&%V6+eWb#-_<= zooFihdfznUS~wk9+0I0X(X$Zy>}=FjIR_~$<{{7N^HJi~1t{anXNXg{5RD#Ogyz{S zMw0@n2^k0hZ>|BOq8<(SFt5%>r^H-wRL9uA6 z{VGJ!i9_v$aj5fhJhI%h8ci7Y1=`3;K-aSqkaTAv;)#-wVOtWCA6bL`2u?<*DjDq) zr=ZKmYtiQOYmtucI^=V29WoWIM?c+JkJ5*3Kq;p-pu60S=tS~HL@L;by5JSx=slZI zXz?cWhvR1Sb?j!;bZIj>Rks-xS&ET3OpLZ9ixKIl80Fp;Bg;H7dRi++SzTh}IUol6 zr6LM6GJZ@1|89y0ci4&&-h?6G4Ir3TfSiH6fc$}ifTjV31FZ(y1#}W94M+-P-1KLV z^~%qK>`zys+fTF6XB)o=x|PTXN(%oO?dsl-43Bmr#(R71BSVr!3Emq2Hvz_T>W*I_ zzrp-Tj5*n1fjQaPfxt`3Hx^@r^1s1-GWE~iYE|FFGH|JLe7y11!^tg|LolW#eYXr_ zP{sP~7-7Hi{TRW0qv4OM!b>8rVNA2XrNWbLIyW#6`9Ym8}@f%z()I8lsIVzIFtBlfD~8RiujAzn2`f$&C+3WFxs zVhkV0ufv!+)=PyacV?^k^zM2rPs`43R)rh=)`k(BR3)F^Ez|InAeES)Y0z4O0u9<} zP^du<4SH+PM}r~_PSao%M!}uct$>1H@T**OP7e5`!F?qDv|krT&I21g1b;3L)YB05 z<7e4a&$D4B2q<|hr2rx+H)5tfUQE@?lTDc||?_cu4Da99ET&;tB9%co*cM4st ziL~+>9IBRr{EbQ)q?P{qIM@e=o85r8gxZheKFq>7u!}+ZSKPN1su*do&*5X(OILNn z=AsLhKFq>eeJq`;>CbAZ*$rHVI$x}VD&M~}`}HxT2Uj=YgASPg)O}jd4`Eo2uQM@W z2agaCUn^|!X$sxze%mjqyBDx$uIt9q8+Gllvn!4>wcrc#HK)(BQ@aRBDl`G@{f)Y1 zroZMNs>6PDoNG>Bkf#4k{m^$FA`mKFY%abLz4}8a<0}Sx;SYS;I%+vZ@QQAIISdZ2iAhVBh^Vye|Gc zoBIsDV^%sBVo$__891H**Xx?oFT+&zg1YxQPc+5#`nc}p&(-;i=Be|+cH3_EX+GG_ z<8lN39eAv&^%pjLu?a^%uj8I%L-|H?SRX|_Ic5q`2?5sv3+p6Pc4AD<93HOrM;hM zirf7|o8t2RJNKXZ;iqYoVm%OG`pX5uIf4(B!{@o?oK6E7CU74~Rk85DPs>w^p}|yR zMkDrs%VYfgz|x^kL!FLa8|t*mZkeSD>;*s>-hk_!QO(KIOF>mVbP{tMbEn{-;BgFsE>sV~XivJJ|EmRCo9= z$9~wgcy}G_q*uDTE(gvZ7@az1vuCq^&RguZ*zM;$%w6ob*rDZT!`TYYl|ss#!W1}@ z4%^|>!yI7`@r)GHrKLDGbw1Ey>B@9HGaO%D3pbQiGdA`?e=t*Xup@HwUc-6s8b%Vt zymyPL_Zpsp{(OE2>@5ED{E#)Oaf2sO9Ri;EP;(LuC*VnNemLct=6Ua6XXcSO^U^{%%4@Ms%5+Rvre~(s3Fia5B{ zys2H{JarsKA*1jWzThW@`Vxc;>aO;|{_L4*4t8wk`!;4cjfT-T!^xwp))D6;72$fR>v0Xv7hDtGqp4l$dTw#UasJJHdj9>V z*nh=RtvAw?gjpyV6At8F?bp_0=NNAG$;@7$ju5k&Y((#6y{@Oi)^j6*^%hM6(8mAddr{ zNb=qXMdpt{(p@5y*As#++K)pf+)1e5-V}7%a|T+mVm5jiKMx%V`3&u^S%fBi7LMZ1 zET~ z8`0<88%@(82a>WR?5km3r#b{fR7{!!|5nm!kTPwvV zr&^3^;o2alUW~qN6r-`tV)UX#jGWuVXsuL?&bEuu;|?);*eOPL;QHbFZZY~?CPq#@ zV)P0qrB{pwfWGe&Bf1=}J%GA^=J$)yWgs1e7|jAY1XK)U4c8yjfVKkt2~-C}9~7fe zK#PDj1APs273d966;KxtUnxe8Kz=~ufaYmvIpBH??FBsg5nTd5ru!e!OYr}l%0Tu{ z)CThZRl?U+|8r8GHR|~Iy5+R$e1ctygCHarwXIy}XfttvNID*$813w8!2Z#gr3oCm_UAjsdolfgCXe;a2?4F85T?_*o;1``C_jJLP*mrM{%RNib=A4!Br0ksjVAIx>>mq?>)GAPf&u+LHgi-9L$8%!ljRMD%r>_2s&m$u zs!T#*TQ}%vFKqW9bxM1CS@k^`{XGIEmDMV{P&C}3&fqPzrY4h3Hy*2J-)GXEFQ-1Z zC~$7+>0`B1NqVJBOTwI^qeEdC*c-PFaFkR|ZwI_D-qNS6t1+t`v~8@Zqx4Yu=9P?| zW~K#0x0RzHwe|P)baJh9WKx;Eu&*&+-`be3H0~Dk_UX!Wt(&cy%UBAzUMHjfp3;D?p7#_%8ZTZ zbr$`WRaSa@dFyb>8xwvCSL6En?H8G&3f( zs+($5S(L|Vt?mg9G|noL3O$Sp1&`(OlJeGS|7dq+bwkx-qt_%ai#8o+9dZuW-qP6K z_i+_V-ozj`lj?NjHp~GXS+?HhAJ>ah#qbx)5__eVU~j5;KD^8e0RK+?X0$2zH?iZ5 z>GRG{9rpS_EobKWZ%plvF8L`p&tvA3YwpeO=@g&gi)0iwd4t~P2kv%MFj&6Vx|;^` zZ!HXd?q4K+f%BQO=Fe1d%TM1xIk^eRsi|w)n@p zsTK{_c5M-l53!;?c(FHim{f<|FPHW)5v4liAqv{y&^ zqF!z=XrkvKml@gTx4#ndbo;K|XN?`WmU*$>v(c76M#(hhNTrR{-OTqkwdE}e3&BfW zSy5xJeTB~Z_HH-Jw)YMCq=wqg&Ne+xMIF7xsh47-%3aS$W#9*;py?nzRl1!w1vc#T1pR_mwFaHv9@W*?o9Hmvv#&_B(Z8*ZDba`4_F*Z zZFMJ^U7O>eOKS2Yv(4Vu^eS|(ms>LEZ*CY`n%NA`2z9KNkSL){Wuz`|@P@N_t*wpn z9!G9Qw+aZP_7U~e$rL58kKNv4Sy3-_FlAdaDw#}~ae$@!KtX!{5xS%%lh5sUc-!sJ z;+d9Ov!DN9l*d5VuRRpQuS=$ks4ex6Q${p~AK}&5V7eT4JGF+Q4lzgvU?~8!S3q zt*Yeog7R_+otfL)knN%0_|CrlJf6(ZzCk)oU+ybudZ`=vq(6&M!Rn_@6B<;|mk1w~QaY>a zEjtZ(%GNT55tU-aH0u*`+)Z_))_V5x?s~S;!pX?1ThVFBtZ22VG9GM}>RNYI4=j?J z7*y$H7F!MsydEgY7#Je+95iw1yInIgjapALZ{xCTDvLVHUr^eN40I~{879ey=Z^Y+C5n zZox6^sqWS#mkpAPH>t=D6zV-<0iyZAIPLbm#CriF%%3PDYJF3pVUn>D;y_|ate}} z4;0)ZSLV=KYTgX<87^F~ki+gLctcC7fB18Oi(J&hyH07YL3i8z zPQGKlP->;GD>KlSkZ8s)+9l4eh8}&#P8#}}@@sRC{ubzXvARr&`um-niUeKNM$Ww? z8&+wjQJpo7+}YDi>NItb+3Fcd>*ey6eq%m^sel)Vh7M_e&QG6wx0AS`(^u51hb$@P z*)tH^z1%JPVbhyeL2Uxl&_Zc{t)=ecYLY3ltDIguP;Fe?Wk|FRa&#!PoNvx|F+`{dUvy53Mtn<_i# z+^$Z~nmT16Vbr5XrI4vk-o|~LW}UIsR___o{_4SEL94!~yZNP%pWgMt$6KH5<@O#v zkvc%w%DEPHb;fl4ZXs`w#m{yhlzH%5M^|@RJGk(An3Je!1v0A<4Z6O6klXq_GfGQ3 zeX?%*9B8PmwtDLao1+ZxD$g%$kyXg}j?ZC2fj9eET(dfErJQc&V5qQZBvD90D!J^c zP&U|aQ!@09Q3>DF>`jjFS#E*MZ=5GXsY7~mkH;o%R87ck?WX4cCb?6sEW9Uw&uWx9 zch?Q;;ZrDO)Zck}MU{j30>U^*_tszs4BU0Bm}d^M2JTR5AE{a5F88vuwpAL-t%KXF zCOXv0xb=n)jAa$d)*hyV!d-U=ydh)yY=~|Shvv$YDcuEWi7h zp(SicLw){3WxLKeq-!+5Z?KUV3|iQD^cVJ*8nhP3$Sl%eqqD9&KuET#VVGs=nmgIo z7h9jPR5aBT%5_<(j#8_it7Z(^lUTGy#iZhl98t;D=R zzpvU{ZmCyGVs|uj7<%wX?Y)m@iKjLLjjwXb_HQ8z+Z zu4mgzLdQ%Y*26nQI0mr`X(?c;Vg=aukg**&c^-b@Rf+Qz@^_70Mi3{HQ6VPBuQf}{hD!LKlP?V(7V)3b%fj>f{1da{OB z-161|VhF#5Z&KJG*YotJOeBt5z3wRCHyZQUEM7lbzq4JZtk#?*uwdV}Aki2GJfpU@ z5ox*{Lz~w8H&RNS{?>XY3eB&s%t=b7j~ic+p~t8bTx>Gv<+5t}beabHy`%;@jkP>Z zg@wGmiPB+EVl?_E){wfP`S#P}JnbHIaGuy%-DC{0pHD3{rdl-1{mn!4Y%_dynmGEQ zexnG39^LnP{rkJDTpAeDYmBlg)14QaDaZ!B?Nz^#o)0{(sv1hl(7pT9s~o*L)_k{e z-61+A#l_XRWXk)>=cR?p&KLdOLx(67wv9?#I|Ju;EFJlvfxeR)Gx$j!<1;=zy_+`1 z!L*WZUZYcO8q%wG+s@Q&zno zC52;MVeBmEE-QID(u|+k;Ot>Qu!f)f>8Wl?k+&a9I-0Pvcd}QGF}0{HRoo%v_sI== z0^FKp4zAJx>-L8>83xD0g3L@?`|imcEuIK%dDeD?#WpP8Oit~q)Xx6K?u&lCIo;*5 zitF!9+zK+c95rlc=UR+>LgSR{c=dFDN%l3NR2!43?h9E|zovOc%BD8*5P__t|M}<< ze3QYNoAqn?2Bj{2Z7{hr*{`W6GVeGKZvf}pGK;p}0ZxrA z+sU%8$cpD?=r=&`eD3OML!4?ed_n1|bGX>K$F|LX+*O5McdKW%8Qtp#9lp^3L#i;< zw|U(9(p1J8XU-geCwuw|3>?cG^=V}!{su{{E2m7^;~>>*OAj^HXZ~q>Rn+rmnDBjX zLHBLvLeZ-$yq;{IK>fotvfj++d=qK5(16iT<5uam6w|Ww42vDxycooEkFizJOt<_2 zQzn_y!{p?#JqDhKx}haz)eT&M%vV0xBj^3l-CaFuM5Ck2ObcDBN>)>+jbqbDnXG-V zpUJveU1UtEn~>d=A$Y_eX6sYyS6e$mqR4*CFF%tr=4@6`KI?k(xvIJ%5CY+}-jsa7_;Hug(H-G*V( zeoB29Bdfaa;Y4R?l|cHcbYRrUmv7%bZtpEAEALI*$v$wNwDCnk@xa5%OChQ%uC~Y}RKBr7!`p(LjYRPhNDr^aU@^VmT zhLd5#+s6B)WrCRLV&UjKo%`7edn3znb4q(Im$B##B#vbRwa%TYUre;vm^;@<^>v#} zOv5vLS~}!9-eq&L97)+FodFkj38-DhWBYz_yk61Ft)}WZ`_3af8uT_c40GsVOU#-q zY>W(gI(7K+23@=CBasN7BcXY73+C z%BHF;n*vi;MGJqlQIz!56nSfQaZgA^uekxmv{8Ss(}JM2*6B9Y_ZghxQ%Qf0@$PSL z3wYM6tyg{vL8mv4Oe#cNFF`xbDVE^vAUry z)qiS9q`a8gdG}3~Sx}R{j>`j`Y333>m#e2I0FR>y$kd;6!RfdjGQI%b#!=IYXOn(GEQ<(z>sV^&L%l*H$mS4?uN z;F*W$_cS&d=Nns)Ms_f6zVoYlJYH%2tPYvy7MNEC(At!(&92RgYVkp^d1Rkbs@ut940bRTc!MNudGxLaoeUf@AsbBa!+~gs$c~bZodg!EmY4h1c6`cg47-0uetVo4gzsN|>@csAX#%wO zI0<;h6+6shB6LWQ>xcbrV54)D0NYg+j(J_RomCN4ydD7}LdEMrI7OFAklb|6z@EA8 zgbDl(iQhi_uWqVmn4_!Up2cF*`~2gE<@zgl?p#ZbCwnpLJd?sqV6@Vc>2&&8+9aBc z`YSbpYE6~soyCm{PFo)>f<>l+crkvQ8;3g|*5$1Q;{U9E22=1J_6-2J8zAmnJ{mp< zkPdtpAnq^oG#CYl`%aQ3JQWZZy-UM?ufdamIKT6NIQ?}%{F7^%COi`mSRxw`+b|yx z$1efIx=R4DU8^-%uaP%vc&P@vG}sG>>p>|{r=tPld{`Qur$Hl)+*E^>8WaHHwh(G~ zXAQb(&=;#sXr!R%&!V?090b)K0&=v3`AdY_zPyi?av;(A+z<1*Sy#Qh8 zAr=DS2SU~Y;(ojfP#^FZAnu>qetBLazXyop7XV^=H3MROSf%RUPPFm0{Y~4SwC%0! z2hLz;+#j{}cZT%%2i?Vsmqa8+M`0Dg9~l)L84I{NA~7-|RxL|RiUL1o7B5a(wj2il zvv_e#L}HTGpBx>T6rZ4phVzNlGK&{SM=V*6<0qypk4aiQRF#j~@2&E$PD&W=1K|nL ziAf2|Ba?94HE|KK%a_JQM-f^nR!|TZodQ4zqM~D?lcHhIae@%Rc#AjhvIT!22yB5q zTLj-sUmcwg0XpIM?hpst-W3|k9iHXEkMrO*!~Mlw0LZ`*{2PHj2MSM)Ns3q!8|?&X!;_bM zBEpl_t&Wb5!NEj$Y&-}BiAfPj%OeF#*F+>lspZ%(aZAK*Uc&Av`KNCSpx&k{~iZPMb^+85^ItCPA$iZqtZ_|D0Zv|HsLfC#mg=mHJTr zU%7uA{8zYI^?%MKJb8IS(i*6J)bhmDv9QC`s_3{R!K#SWxPH;g1plJK$8kQ`M({z6 zkMj8M)F8qm<5#cy4~7a~6O|-Lh)!CQ5T|O6@G;|w@ENmaP597uf3>!zEj9cP&xQM0EQU7MVzsLJW z17h7iZil~F>4T*|iKn&oe~cX-wJt7V6?Avl88&G-ob~IY69h5w2?AVqZCFH7^xEY~ zA9ZVO42bhr$M}y${1xY4mBDrVFE;yc^8Ms|O3L1=VhWWw^*>eHGKgy2(sbZkUo;zuEZh$MmYCt<+}2@&hS zUYe-mm&2)<5V>sKM~NU5hsUp4jYm$w)Fmrm#1@3Xc%vyRJR&YWZr!T*HHiXfkLbkJ za0=o?VK7hZ0(t@z0Z&UWhtYEtZ0P4sq<}vTFcQAMkN{tSaEDF)mJ>_Bm!Jxdg|95Q zYltBJEo~xv$0H8%S_Wy#wG^GLc6FX z>a{V*#wJ8Zt3-GW1^l?^q&X3>Yd(?9)XMNYiQ`T9t4oeffX)dgno_~1dX}3=Tpp*2tP4vZ zydJ^M3j7*1;oB%5{QJO<*LK+L|H%LKNB(a<@*nuf|LsTq?>_QhCw<8C&yV~pD1!`y z*J#)+eyF~F*ssA2@5#KgKnsD#51=O{WS+2;%sb4a zsN#P{`>?ktPLJc4YVau_mhAwF)%bBZcIwwu;cZ%#;}YCn?D;xGi(pqQ5dVe#^1%>~ zTI99#`FC?WJz#~Pb~w_IF5>=rLM~OQEIIf7_LnhVTw@2R zLzPN)P|xtutV3q99|n+GCPC!rwW~F$;j$3E!19#L3x5G`-vLc~rnc~3;b}^xZ~8LZ zUy8UHN~HA-YVy+7o)$!-&}f(l3QJ9z45Ua*(xwsxsqNS%RtKt@61<1f)cm0!HA*$% zYEJuKo%Ta}s^n>^_a2~^79*afeYFVTU=fvd)VTJWWFmXKB`P|so0%_lAz2l-x0Dd||>@sJkm@i2D% z0*$3%PeB;Zv||`&3V{4;DZK4Kcz#X;B3q`S+jK0)g<^*SR&Xh0m@Ws5(TwL`5)_o(?&ub*m_A|33td1+XJ`jDp-%MQLQO) zAI5#?)0R=!F&geF7c6sDFSfy(gu(P5QRxOW%`y%milcSTC#Yf?|*o8Jxc;kV>fTjV> z0-6W35GWjI8PIB=wLsf}z5zM}bQc8-cb1eGhaV=sFONp9Yi-Q~*>D zqyS>I!khr)0~7!h3N#NW73h1QnQP*R$?^~f@Mu?M$1rRSz?IUpf1eFl#4(U|!A?=z3l@H!+i-;q}MlT^I!)IiIS0@0jBPK$b z6W7EN!E2ThGox1%Q{l$ol=x&KG&&N;hkIk|aGC^_2l9oqk;?!f{c=2qLweQ49pnMp zfqc!>DSuj(q0UWCuv+z0uj{+F+d5ULU zRWX|MA9!^>iGRgV=ZCL}KgiU1D1+X;ML{f5%Ys=B9w}+`o=V^^9I2dp#;7mxj8gMF%#kek0pzg_lp&*Y0ROb&nXG3l{A9Xo+WYS8s zW#a39ZMn-;WvI(kHKnTjSdD$uW#iFHeR-|cK|SuP??Gtw!Sg+yVYGVTnL#Vj>iDTF z7;22&G!0G$^aOiF!T)ud@-c@GH$niR>I3g_rIz4W>X_r<+nXby#8vPguN1J025Y;+ z_cHMs^#AWp0QURzaE5pF)yJpuf9A%+4D;U|+hIli_v6#}TVO4(J@AhF|C8h69Jaz< zMB0M{Yxw`kp-nIN|9kTjsrbVYU#h+wvG=QepL{yvsOmcxAALIFzkKQ9Zy&n&=sOo5 zK6CN$S1$hPBNwWl#r3E(I)lk#bGSTx14ARev5Bdf=IbQ3@NE(YM(~#w?#n_OW;Sdn5D~>uUHwoDlUHY7YT_;Ym!seu3P`v!bP7i4*$>L z8#cmsGyYH4|NnIP__+p(?*E4UgF{A#ju|^{{Dg^jE zMaC+x#lj$UdjHYz3x;{b^>5(5lNN(!_1oS?iL1#Td(0w7spEx1JnT{fH22E1_kU7V zV)gzT;FUg9hyQi=PaRC)a+hc4YyCoY(c9-gGUr>(q%Ql{LA zzxew$wEyW=<^6{*QQHXh{ZYtVb*Bw5XdJ)ip?dACy=V6qDzO&eQdR%qUaJPhYQ$F` z*!61T5&yT_J52`bbD#pCYM>RcMskOh&orpTdeyHZqhWo8e-pu1`;%1nv()lgu*TFn z?HyAMZq@9oqD7j9*W$OWNR?8H)*4=mzqP2twHTt|wOF9qzXcvr&|t#fkfY(Xc&SO9 zpBATRcrA7`s>8K-NW*I}M8j*bxj`LYi$^rP7RPINEy`8<&cF-)8ocy3T%zH%XsY40 zn5){q1|A^O;GVzXSPid5l7`n}x@un>g3#ht4X?!z4X;H#4X?#a)&4s0u!sit{|)D8 zcr99McrDgetL>%5s~TR5>ovR<$7*;j8fkbfR#vI=)8g+MUW;2bycTC@cr6MwycT7Z z>io2rso}MFT*GTINyBS#qK4O^K*MXXSG8Xe3=0~}{TrUw@LJre;kCF>!)tN4hS#Ej zhSy@V`nNSgi1fIAF*Zpcn+YJ=D!fX1-xsX0BQ?%-bJLt+2QrNmkcpygN zvYP7f0F|`9L!(D|1rn+G8;`$FL)8=3ZnwJ*56gsyv+@q7qe5EAI$|>9ml~h2cj^;# z{iy5c(=y;s)+Jxnd4_6Ul;^*n0p(AdZcM-W9G%ju%}ZTk1o}}<9+{Sbp7~DxY^gO0 zByxFkcFQtRlq=;<(`SB=-;u1Iec33^dVhCFE9fIwxqhe1OJq*lnX<*+KalWhjVrkM z3XSf!H+y9R@vm-Zpq$A?p{(V#-+O_+hq8XNjCqaruAs6AOL*F6ZCn4AA#c!O#jl&z zUonCFD(+P_yg}(!`wUoKQ2+6F=UAT0L)*5W|1jx6Mj5hulT8xSv|3p43pgl~Tj^{KM zqv=O?7RT*@Cz)t>-`)JS1f|FBRGt{*LHftvaE6zncihl<#cn>(-W8M!`K4&UTL5X1RUDcU>t+{7lmsp0BuLN$bd^Y|1bg}W*3Eb*L3um#j_v-_ERYEEINn6BKy^&f zkflWifkghTykWB|(Br(T=PeIGe>u&(bK|E9wCtDDU(Q%-g0N2 zc_4A`LBUn8O0*$ne4L&F(g$Q%A5W=7>yG*+4x0h?vE1G_VrZni=D)h&^n~lZafjwrKuRKyvg+$ip z7w0^O_9J$5y|SoA+g&)f-^EjL{a$?*S&c4d8sxvN2YU#8meilBMp4^)zWa45)IWAD zKexUb*$?;1O}hs5e{$4ul}ioE*ezRTM}qQuE#DuAtwG1*hQGeDK@vbvMtnByVhxf< zM$6VOc^g2O3NLJJtw9gQ7P0(Ekl%m!z4^nCP|Y|`-iR!Ern~#=!udgz-S}zlUZm^Q zKS*B*<)|7mUWtxe9M;#sed`F&__;yLLX(FL?4FZadVH}JGx&|~*u-j|V0 zXkl;hdPslr-D-X3t0;Ne73aO3z=yXt+Z?-w@@LPqMiS63EqcI${|EYE=~tB0N;qG` zpQbu}cO7+}S(0<<2|S6H+VFXz?hSNe)6e#=9>e*0a^k*}l{eA)xRVC;WJ^e2J%#!1 z7TOv%CA)@z`UDB>t`EC|eCICpS>2A$k8`tb{BRdNpOP&6oHGQ*uLhE1<2{s><*{|h z>!twWWbC8sArDZ)^zFt*)$tTN8=ST13L^ZaBTyHzZOI}e!>rcmtQ(*n-XFj68y%TFh zFFHYjV(KT77q}j$@9i7c@+7hAp**E`nYPD|FXrb@lHMWDoLx+@p1@kqFh1ZEv8=Nd z{}dYWh2r}43r`Uve@Dv(?{K{kQfsfBdzxgWE&kSK(HmU&y%Dftq*N~h3i*ApHl~f3nX@HkY{KS z@{9gF;n~a!BqlwfsaYx7OKx@eaixo7!qI-0YF(i17oNRx{zVeA{n?_f`}MmBsYd=^ zYhEH%7w?>Z*AC;^;QO{gt1pq*@LNi=@hG3)q&{70UnWl$S`~(_#Pu*;^In@}m&uIx z$*CV-L7%#4%)rK1h>%+6<*Qv7kI{D$iu!CmhdgE64rga8qYf8OoCyT5rj?t0ZlxWs}50*#E%o*5meFC6lI>1~^_p zdmQXk>u$kSlB-|M%xWO+2ky>Z`pvJA&yCl&Fql*e>DAmA5O9qc)~jY!Kf|z#kmI5n zz4RJMv|qJ7v?H!}imGFd-MB_X-5Qw>UUq^#9NF|wwd=$-XMer41sKo2Tc1#7eS>se z=*`zVa2Dj>k)9*e%u_H~O;uwitC^m8TMDnHVi=Rv^wwgsnxE$!aFl;qf`6A75kj z;mq5^WHoapF*`DZZKo>zS-(bOe*t z6xuRbO~t1RQhYT96_Y8A(GIf5Y%hi!qia4BdGt^k{X=^$P6zZt}mCi+v8fF(^5PN(IeWJDCn`i?UDfnWs75&Z4H!?UO&VK|})zgsbqacaRo4rfoJ_f z2Av<%HPDgv2pND{kn4ilpeab(-x{n0I)L;ydO4^Ix`T8LlQ&4$HVp)6Klp*PUqV3I zuhAgw=LC@UuL7j~I}@b+k_ys(T?$hBNC&AsZ3bz7W`MN64uZ7*R3PowvmmvzEKu6( z0@8lZ15LnuklIZFNbRo#GzEp4%>Hyi+V2J+?f1H%IcN&fes2NNezyiKKnIYn&60z3 zjg>pt8uSL+fCE8G&<|`2hJYQwXwV)^03ARD*b$rwI)bSn9au|2IhYPQftx`(VVVJ= z+k}H)S5O6Z1J8mUU>4XN%mI6Vc_5wZ%Ll!{0+7xFmVo_1!BEG5&iUzrgFyo@7_19Y zgE0j)U;yTzCTI<6fih4Vr1Oh9pgZJBpbv=u`z-i@x?nhne`zDoH2_t?1jyCEsbF<5 z71Re;fHlC)AT_wXU`>$DWg3EXF4Kt0@W=l#5iWwYs6SX6d;-=53&48dH?TgaYXo}$ zjlqVXDQE(=0ULo1U}Mk~GzGoECg4!8DHsBpfpMTYr~sRRDPVJODQE$%2U~&}U@K4w zwg%6FZNO~M5_}D|1xr9%P}^9?zz#G3+k*|k4qyw=9<&1;KsneE^aMMB1HsN<5afi7S==n5VL-N2JzS1=3g2HpcbzHLm%E11hJ2(LJ0SALYU@#a5hJjPTaBvZr45ot`xPWX2wLv;>T^T$GSr0r3 zRspj>tk)Ipf%Jlt4;q0*pfM=ah8=*_!1`ca&;+yw+ki5#Gw1{2pAZOspbHodhJjN- z4P2-ef!bg?h}jxpJE#X91o5xUg_B@4Fbk{?-UB;>MPL{x)ImD9pc#O4HF!g?GS~vt z1MR>npd6(CUC0xx4-N!7gFzq`Ity{2HmCqAgDIdMxD>1ct_Q1u8DM=-33djvK@D6O zpMZK`0ayk6237-g>mod840ZVKs|5~SOrX{ zdT=|{o1+|551yrZFq`VZJgRSj@=!hajp{+&dhl<9@_>4vDOd$;L;bBWKB+(GO8r6n zlO+QUJB&~24~9^GFpl~=puMOJrchai_M$Slp2~8x7nMOJr7Oxw>5g(zdZL_^-WaE# z_5_Smus*0;Uk7_v*o`$nTCsxrK7LoBhx#`acfJ}Ukgw68t7GUv*U`~~uBKy@9uFW( zw|;5Q3-uqt(+}a{*(x6a>-$(Zx;~K}^!FTk(BE(95y{hySNhN+6g8noJda0Lz|bT1XT4bY!ljiv7+XC55xl%( zkODnI`1%)rv>ZKxdATBZy8dVhdW7+KbX6)nLU??-&XOKsJbV~WFBYpl=@HMULrJ2=0&7>^xkQlp|dqN<-2$ovg*^8dfcv7rz=uDuvU!Ohb4aTqv0d5Zi$}LX8~#_ zmiSeW`cqq>Wv1yEgYnlBQXKDVYK!XrqV{Ns(6pRX zZ;8-OI8Tu3#m>h`;n_L0TXh&}yOyv3T28jAx~tTl)P`x zY>bwZjt{kegwz-6^3#4~=doqt(s4uEjm8a>%G?b-i7%~7aoJd)*DhK!7Ms?Gjw#y9 zgAh_ZwrDESQz|Ts)zVpNMQX=%EU|WvklM7D)JAL^dI-IxG-w@MB>Q9Q1%BGr*yOIUxi zal-oBS!%DceOWfVy8dpc4?S2t-6UIJ_aAr3PT94@Nh%+!vy(J-S)EzivpTy-wj9e_ zoz|gjeyn_~4(hzUrPfgA?J4yX%e${s4wknk&yU&w%Y)_JjgL**W~@)x^~9N%BLep| z^$1Ys;VShh%cG~%^Xfdp6A)gLqw7pU|l3sSw7BEKd9S+jtORe z-KFxgFh1PoXzor@Kd>;K(%4tmoxW?bbeJWxFg>JoCoGINAFnhW7xbArFQ+p7(ND5H z7T38%sY8 z21wgj3H}3~1-F58u7TcHvmws`-4VYs_yjVY%kYM*3l>0L2Yv%Dfx2co2HQbn@Em9g zE&$trhd~GM6zB@>1--$W;7~9N3<0HkJE(%J0I!1sk)Ixz0{JSq6ub|v2XBEH;CWC9 z?gP()$G~hb8_WaOgRj9IU~qAe}2C z;9mI80#AZ{!E}VT1+yS0f)0?If%hPf1g#;PgZYr@8%_~84-A2SYfxyeV-NvU1E+u` z@W+prLS4wy!Flk3QPgBz|~+LxS9GRd~L7* z@<8w`aZ z&<{KTMuQok0z3$&f)~Ja@C=xT^y-5dkcWcw9sevVrr=V@0iXc65wISzAD98zjuP@J@GLkUbceqMm3l+fv8i5m*;Y1D!9hpT2ph&)HibODB<+nZ8@Gr})4!&+p8K{SAj+{r*VjL@ZG zg!AF%VtGU-H1cEJ4EObt7y`?1t%G8uIt<%e#^TbyYX6bwPxX0-)MqSAg!KJLb{;9UDLZE~OzLym?&|Yj`9@1N z!TjkPqB=}`8UHc7-RL`JFh8g7=QNgjUL#bhJDVG#f7SB~Y?h3@qp+DdcFy`seNM+7 zJEwou=iyRcGye!!o%&s!<;&&>nC-H;C$_JS&1I3bcuX%jOzbpRsc`qs!(U)M02FvGKs>Z&+Sz4v)?FvN^l} zsgCTN%>b+4-|4<{dZ=Y){lDaBsYTWEe{9y6&Hu5PV>ZXb@@4Y_%>LLpDqwx>F^ zUDB&5onxZD<^9WEgIV}k*xB#GGyn48=^UiG9q75b?sR^ReszlG#pbryorcaO(%Q0i zWM7X^pVRqLHv7)z8(Dv|xl=Y9&*t=4f3W#dx&xNZ0n&O#BS-aoAe%`lTW99O{+6u+ znnQoX8P zM8Hq|;HE1VzO1@YthD-uRi#DJI;8Zu*W!QbulyZ0ea(b_#K0{(H$IvutsBdG(`MvP zeWKx)*pN<{V&~#Y4#QeMpy`{=sy zxApx|{gQaoM6cNgPifx+zJeU`Q*Zn3TUz4e^W;+Jq!FvqrF|NvcK7G-{PW1bvF3{| zwmU|g>eLETD5ZTQrVmd|{;8jl@@&~ZvD?YIHTo?_ESL7R#>heXjZL^kTkiW>wFaDwYBCkLBL;XeGe&i4BC-U|e|Iq#- z??3Sm{U`GN7yr=zBDWv%2m2AZ{gFS|pUCZ({K0-jZvW&D_Am1BL;f&+L_Yq=AI6`^ z$1nNA_!Y}^{%=kTD#oYb>GkEF-=|EaHFe^gJ$KTkieqWw}m z9sfV$SFnF6eT@H~@hglUDSeE8uFtAC{-pRA|3CE=#xK>=@z3*DQMt@fP(l7V{?*ry zit#I6f2iKHO#Y<8^^5B1^-EnoQsMe1#V=F;iq}u7FWY{k!u3~5zfAjAynajRm+3!J z;rcJ>%k)2~aQ~3>W$cGkxc^A{GWJI*+`lA!8T%y_?tfHI?|;013P^?fC)Jl7KNau4 zR9|-dRlI*o>6aP51mSV8>%KxI-5>Ceuo)GujH=4q|DtsN5#;kZ2QUhJpQ-ApbpH|* ze4nXmER$7EoYffRe4nXmy>vemRHGRcgi+x8Oy&3azS13xiiwD)oNT7$(d6aeYTl6Yj6UWxmf;b)M}TRqbMw|IH|j=l*_N?#8IFO36ZXDZL*`$X0IO!qQb&i9$B zW^y@}b2z65ryZlJF_)_{3ZM9X(8rut80AM8RhziHi0hL%BRPj~y*s0-J(tb6z9wfW z-|zW`QGSz_x z+rQ}hbn>bAcGqvKu)k0kXVdK2Vsh8Ge~>ao3W{2!sLl^Xf+&Eq1$VL)< zw`1J!G=x_S4g9CqcA|Il{Lux;-66MA%z2qXo;GN^Xi1%32)`wuV9P(mb#N`KcQxsL zrxLG_;QeG5*)q3qDwT(|Q`S2~l748tne2!CNpjV#L#L0Bfz5-R^A8|@#l43yF_~oO z+ID7JtdPD+fAXyq6{)1Tx8^Aq?B`Ln>-5*XW5hEqVq3}}gqQEK7}xp)+1)hw`k{1V=+uY87-JTn>ea=I7tJMm?Z z=UFng`|jS?hq@sB?W6k5J4X!O_P;u_A@&dEwbrt}a-Iaw7az2<$9^uqokq6RFOoNp z=ImD1>H+!Y&Cec}NK4B##|P}A^|PFPZpvj+ShxDskF8u0fAM2iK4Dp{-4x6%`RiV#nZ!XH5yJs`xZPNTXp+YvTl-gRf8qiAC_?~b%V<_ zGA#Q=e*ALiy%+8naQ7N_<{e9{E_jK?YBJ*=1FyN5~;# zZl6y%sDu4gej5gMnwLXzM_UajU4s2x-l5o+c$QbybK8*3x5>>t{#BOE zr1AydYwhlkn{(UTjvt8r@H;oJZRQ;^<>I4Mo3W^GmZL?m`(5JKc$HrFeW;&7g8rne zyTtTL^@hjkeprLZ!+wMAksrwy79ZV<{s-SwAU5y+Q;(9hCVf4^{IpYQ0#85tMQNwyjFSkxpipY{O1N{|k&VWCtY2n$qCV{#uKeqc*mtRy*GKKHM}>^XJ1f^v1SJ z3%eo4JU?usGU<2}UveF`x;R_xy0gc%hz|~k@6yC?O15Z|XuE9CiaeztuRi;bLAKaR zJHLf&R4s(B^kmA)>tcWHV=lFmkbd;Ol3H!9i#7{P@*YK2KPnW=*KK(CnrOSROL*nK z?NPt<9fcm(M6bpBe&{8%Lj2Tl`R%Kst!k6wt*)qFhS&A>p;yKAQ|H>9?%f3WlTLbH zv&0Q9dcyYYt&#qnlz}N(;+ot9uQq2~5Wgs;sY#aT^wj8VOsEX)F?!Ng-z(y=KBr8_ z)aruv>!LSl`ejk|t@Ojjs1B%q#1HT7mqb0&zm7}|LV60v{H50~iXG1`cyj5Z&QT$6 zh{@1z7et4B&ibiSEg(<%n%?|^cp$X#i?ku#k^YgvZ@kWnjZX(CBA1}N3fD(&6VHj7 zm->wiY>4(xch}po<*e9maADBlS)M3g)Agn|&WK$$=w`W&LVbj!WBawwh;MK9k5F_% z|H${R@N0KkYq6ERTy_hIt=<>~4+nb@oZ|KPFyn zuz%gngD9`ieC^Z4DzVt#(roF29?>wO z)K<~_)`Ytw8q)rpeC&I|CegO&cF^~0YL&EJycBV2VOM9^o1()8kI8Gq9({9t zt2cnX3Z`${H&`k5EZl2(pfRP%N-*LX>e8c&g^A+by&KI2doX^WK$$5h_oAWxO;u_~w&MeL=oR>K-abD!SzDZ8 zoN`WqQ>D%IoN`WqQ>DfAoN`WqQ>DrEoN`WqQ>DT6oN`WqQ>C5<;FOp74%qLm3d~P2 zp`~{d($C+zSWmA>7x?A1Zf8eKifr>zdh0<}`K`_*#J+R20m^fD9uoZ4*>7+o(|1|; z3(fF6g-xqH!+MaLtyU=;2jKY)yN1p!^(L)!ceHsu4$rfKL6GKzz9h5979WdTJU`=s zvX5_n^4d6H$*clA9|_UJ4?7Pcv$MbaC~|8KSyjDb^PwcED0jw%Ui5nx(Rr8kd`a#O zw*cE=PLNAp9WC}F4Gj<67-8lCIq%ErkO1Okn_9=+58pQs(pS#C6G(z>mmKi_VFS4! zd%9;ZvCW(;YWBhNr?7O*oXio#skmMJxxRQF#s_RxSci}y$|<&?!CsIvz8_c{N**+{ ziAmR?VV;laH4$j`QpqWc%B!s5_^A+Adb5mO&H)n%Qy4J z@~|j!+|h9K{XKZz6SAL{L`IWwrWz6BtJD1BcD8IWnixd1`Pladp63L?&F|r8GJny; z;Ko|Cy|TBgSQbOlCr;`#;#uD*r?v3X2X!=>X&8x?eHq8r`O}D_iR!;86Hid>=w}X6WvoyI*uW4YYxcYLTGtpm6Hp{kk-@9Qo9YJ z<#Dh7Y};5ey0VL6)(IMa<`3`S1Y&JiwfWrzcs>;d?mgBhk(|=pchW(?_YVYPnL|z@ zX;P=f_%4^+A)7AVJAWKG9Mq;;<73W{vyXS^F`isoS@_aTkEXxqc&7FQGB&f_Oq=J_ zzV`m@nK^-oCBqE{TGIYsD$5%?kytlOUDae7ZU6KGi8hnSgr+BVeeF%{$-HvCSCh!$ z4`H)LRHo&d+B$Q65?N8_aKMy))c#Tz*tJ!VR&#s!UXZndEL(OnPC;%|x;QtXDzy)N z+uc_cWbB|T{hK-A`wYUjz4NS+NkZe+vG&Jl`#P9K%}FN5g0H_@IfBXs6Z+&QlO8&; z4-U?vvd?h`x5;Eh7X#x%U+_LDq<(0!b~2g$v8C>k+-{I>8t9i!CT3mrb7oYh_R_!p z_aReA(!(X$E=I+8U+ZM>?%)&>_PPJNqEECu`wJh}no7PD)+xC$h_+wJvAZ!-iScOh zxt#@lf3TW#^U74R=2fFEseSSMFU+*aZZnP8A1>KEFx?EYU1s*IX~gCHy|CBEsXo9t z=h-xJvT(bbNi=N_=e-YHrW1>8wh8sZ@I4Db(>OnUI=OgoK)>bnsr^)ZUbr~_{EjhV zj{~QNq_4sAldz)OmEL2-VDmZQUmDQojl6l+KE{h#iL0{z`sNNfWn^|*yf`7{;F)#J zJRmQ+n%yN{%-ln?Ds}Avx!~gUhjC(Giw&donwZk?gRV}C6Ae8bCZrqE_(5YYwTu(D zE+4bptTKH*4R3z-QmmM)vBh!r6#6{0bi}dIvEs-{pU&7%YXLdO{!p!0F=cTFopteU zkXtO(V*hi#Pq;8(KIH0WcdFXb=f^xV z*Y?q(SLwDZZQD_~px*F3QKIqWY95(8n?UxfZu2El)HYu0y4!`8Pq(RtbEG&czFw8# zO{knT;PR{p@&4ybOUp}m9u}7FTzWNJoZ4&etHNmdyyxBAuU@#g;FF@}@iaW&3;CJm z{$b*le`ap#l~EJ2L&CGoqr^Q!^tG#7;(1qa=(C|9R7{+`bJEsEw0+Nd`a6V*L;kwG zeOy=iJeW1Iz9K{nlYO`@ccA^@zAo#`NO7Y5lsgMvH-oHOI;F-)F=Ax4P4jK^d0!ZB zH(-SLW95Diqwn;2wr-tAtAfRehrHGw-s}X~;d;umAn}9mP-V*Go{+tF*;xgNwNL!B zxqb)QU-E6Y;{(OC2il)(Ur>7}IX(VpfcSWy&+!3A@jNZ~X*SRa5c8}S#eA4p8}h(m z2R!}7OC5TiS`~x$B_ZpU_aZ;>{iV*QH|W#&(T^`5@D;a=(SIpZSW&!|-Q=1}qI9G!I+*Gm2Kv0d;GapwIao5CFNK8cmg-HQf^#?5tg?pf0EdCwa> zWuO@GBgbx<2YsKA+XovC5F4KN`kubFEltm4)S7(P8gpyPOZSKNKSd=6H&0 z$ED;r+tdC{*EcEl5TosyHkzzJUIWd5y?{{{JjjP!9kdD#ZCR8uK z-OS5LJaovZuwzrISDZ+=EfeEgz3k95C=0*4D2~rFwimS$bh|ytmFlx=u9uCtXN6ab zE1mIvh84=Mj4i}z4t?(DETZ)hI@haJNBq%hj_t7Pb*NnNpx^hTzayyJ80D^vf(xU< ziOX^>J2J|~kzRbiCt zak(;=D=`W>j0!C-YjRoOa;Y)vkME4~Z(RPu<l38SKz%OAP?fl*$_s4C#{J1)QB z@@q!n6{F$>m-D&&j8XoSQT3S1kGP!2sK{j$9&q^{m+x}&-~9OUu= zF7M;=UPjd(M)__o@8a@KMqvk|VjGvYa(OeOd=sN;1DDrxc`cXMFyi|ItRAblypqey z8Rg3uRZF?Ngv)<3Di$#c3%NX>%c)#m$LvnEmQl{BSi}9(xm|L~S2J0$itAT$J*RvH z_g~KaIpxcktVrYfrCiS`U&8f^xj(1;Z|=W{QMHikIpqtuem>Wyay_TwFYZ5&`*X_Y zGFg$r^>etMQ$CyPXK{Z{`AqIVgHbh|>pA7qxPB_vPvLq_#boZE%>6m#3MMO(xPB7X zbIK=j{|VfmQ$C)_ig8?@$n~7^1g;;;^!V#`UAPKc_sD`-d>9Mshu;d<54AbA1rkb1DM4e*pLAl>0MT z;m7s9T+b;V&h^8%Kc{>s_aDNj8qD>a@-z9reCet(iH#CzS;~d6DCEgZ;}ce5LP8f?pNYN5_EFPq~Xs==-a% zw5ssQajkA#(2IkT-n_b^#4-E(!;Y78yr}-7zVOA-S!vqq;4(>{Vxaiyczo1~=2N~) z`57CkzB%S;D=t~BqwlYHW0wDL)bR^n7_(PuKi%4@QpYCq-sOkK()kI&xLUeEwq0~M zcBM`wD*vb^*C4YEOmEhVkm}!DU(h6T5B7_j+}oV$2i8z&67NvwdE1N(HOl^TTPg<`r|Xbw2A-xz=SlIiYxz|o zuOhxZx}_(D_pW1FnY8z69MmjLkA`1dS5=ujo*7e6^p$?EQfN_Mp-WnwcOU7WF6DQ+ zfn1Mlb2+@C(M73$V@!l9`rUj&cS-VEQ@^TYR*%&;=4_Vw zJEo~=HS)|gdXL{|BO2b*Jg*x0RygTg@hz#n?3$-nCwr3;;a#AUbp9hP--Fhw8f3&ryW_h9rTTrXEjJ*e2WVZ598ce`h1@!+2ISpH z7t>XtbpAvru3KP0>ed{1yT<}4edGGxHA%P5yY=(?G^Kj`1{pO;y2ItKRHJ18oQ6rThIo>(RXZAyUpA#=IjZKY6_OhC%3opE& z<*V65VMInR9ni{5OR~qNO|y*1no)ue#fMU0X=t!mv%vfoWD(rXcg&A1(h$+GOm)es*M*22Jl<8&z%M`tF|^hCd|x?rddHhnQatI5t@@r25RZ(RIkk zmMw-%7>MtkV*J@;)gjv*NA~|*VnXFxw$^otk=Fy~OC?hLR(6WIB*1&Vwo}OzTHjOc z^Xigh{T;!ZrsDT?Y@4u`*CP{#jGsKImDHa49nm2Hy?eU zCH0?$%)36hI6mS?d=sg?A9l&8PZU+g485X~(py6e8juYyu0OjIsV$}N6y1P)8*jg> z$qlJI&zw~a$oB@@o~`~^jp`4$nl>c+y2M{Jy(Ep#zq%?Kl8d3uw-j2^`7I&bJ+C3T z^)V{*dy3Sbr5@HM#KXtjet&OCe$gYQ1(;JcXKkS;xcS_f3YpOvh!SO4~i>o3{1(3VQVUVyH4w`*k$QpO3t00=dos?q!+D1Oi96}_Mamz zNd0@Q?NU>6=Za~X?nB9*@~zLBlI^=U8fHwB%6HACz?7smJ$&e)ktDyhHElwaZxo3e z%<+4^pr~et`QQ(}hI-E%QTtL@wO2GD!{!vlKXs$?rHZBB>>G$loi6S5L_)A>Hd^-dv8Nq~#dos}xd zezQBLHYM>IPfZ^8p?aZe7gbYYJNxFnu@mX_K;i0G(3EIil(+cWL5iPDOwCA<#fl{l zH%s}Y$lc9|UAx*-#p+a6Ty{z@Bk{c^w$h$Q?O$Q+ve}HZ%#5)g6hr6B6vJF|%!r9r zidBy;()f;X6U<4a9V^erD5!lXR9&sjNxLpKZ>J2FuFr<5*zq z9=^P{rPl}A9)j3iWlpBq1*ca%E{*rR9{J{^^zrzqvW;~9TG6Fv-DV_y&<5|Z=jr`X zv8tDQGjb%^$g9cP+G{vSsh|W@Ko`Y9~9_Y6DqV(kH7Ku|3{# z@V6kzezbjr=48^K9upc@uS~(84Xh5quj z+}fi3y?|*Ehvj9g1(o%(|EevXYN*k7{W1D`r*Ig{fp))Ge^-)(fO9-VIzUf#S?OSH`}8GUDk4V72jT3t&V z?O*?l_ZAl__s)r`B_0wkzirmJBb7C8lUkzTbKg1E+a&$i+l_09b|ag0c)mf(ulb#K z#$wL}D>{eGl+*Cn?})~t!&aM8r>V|VPP+S-v1oHLzP9rPV=A}2=W8s^J+iavpsyuL z$XD;RH5NZCoVTt`<4#ncaKF?@ylQo0%JAcsR5p2V#Yp^+oc?bA4LaW>%zm)TNUSUt zX0Ocgpt5Cdl99OAsMD}6UUWW2xSZ={B$|!&9d-LJDgVg4#zx|X)afl+yO~mbwTJHv zMa!4{Cr$7*q4MU3qM`W8#ChULUneTNJo?K}?9t@j=9EEFdG0;(H583&w7>PC_<|US z&Euba*}dC}#us1IFc7sSb^R9GNeVwbTdX0T*VlWav#C4Pr`+(ZAX7|B~i6r{B)4E;gB9WoLZl zGu5}cv%0#Nw}0xy$ulK=qr0TK*sbZPh$@a)zknYM?&Ve!r?<*IwsV0OmA~CfswP@j zH(lFlwIt`?Z(L1Wy?lplk6BXqtOsIMvA5sJYdJbn`S<4fRuyY)GR>|!*p! ztg$7pgT^Asep@{htB6OY?<(Aw(Us~eJ@Tz0>iV=hzqY6cmGd5z>WK?`TJ65MR_f3F zk5}u7@{$9--%m^ZHTwzC6KmV77#h;=DXq`Ir@6Y~iRWu`qrXZ0)BIVIt~l*X_k&9k zr1}*+Ypg5Yy0-mv{Y?#N`um^5S`+e2+J;oKr?NwSQf1L|<(Vbg<+OMc_ZVp{*D z_p2R|;vak=RuVP-ajv8qBb7hqrEewidElCl&vr}swR%;mBQ9>=T(|BqY5e8ATCF3F zzH0b6_o@_s!E2%;cB((W&(00f^+f(AS6jR{Z?$<19Xg*aynd6UE$a7Ja9{JP1(k=s zCE8+g*4FWV2T1kTe3z>wrWcyK?HD83&&GF2TB65`u@3Y5Na4E{G}aQkmH3X@)21bj z|ENIJ6nC~B_1gK4)czCR`)Z0+{lavfBun;fSXindHnWJ?RLxl`@5aK_8ls-kXVIbh zQvEA^@YN7&8lL{5*-h&2#UDxq@v&K>Q1PM}P2aR=wIFt${a|>`0cm_~E+T^1p@m=f z&x<5`9r{u%&D`(qe6&%m_B6cTtI{8teh*$9wz83~Z$n>`ADO*3@6pv4rSkc_N&237 zU)J9>@2k`vu5ZO}nLV%U3G38P8sAUel5d&DwN|yU_(zkbclKS<*UW<%>?eran@pIs`AkE!oVKWE0J&d`$QOZg8hB%d?ue)#+E^ed8mntwa`IfMS*BFH|GqRej7%@m}jRKC1VNgpydPP80*`-LPcO2op< zYGZd#JvK_}zq+4G-)HuIl2BT?Q5_n8^Jnrtv-s%DR`~cJmF>PH6=ZIH@?wtOmo`+6 z{+RSGbJD%ceuGS<_NrT)^foj5#MKMS4oLMe_*D8jbMmz1rO^i^`!4yE^eQvrzJtM6 z8!5f4lF}EM7Hem3d=?>NcIr&rSw^5j~8zTS*xV$o9Wl2rHe1f zr8GD5mfwah`nl5mBK>RWz03<=Yr1urP=%(a_*Qy5Gd|a-=S)RqD$Bo@-powf+40Fb zm1O?~-%GD&YFz$uq~oy;QurUGS(#yVWL2IeNc|!FD7}zbIK^eOPao-er1(*KCi6(i zqiGL=r1mf^Ej^aG(Xd;NYNS*@d1>i^Oy7{K>dkbd@+eA6H)U4SpVznVKI!^`BK$gP zAN(gEJLx2OJ0NKB#uJH-fqUn)>gK&qtn3up)y3*2-H(8StxKS1?c06b(xr9*IdJLV zvX=hKW&Vn>j?3BTGulM6_DV)@#`PO z&XqkVzTYw|x_~s7?S7OyKSgYg5%)BR;rKAb-9xT=7(_qVB=;67hg zW7g;Jf%^(b75{tPtu`)|ed-p|dcnm4GTQ4=?R$+OE z%beenRUO_h6WcCS_MW%l?9##SiQcxihepXK%f|PfC_5PQp2W|-b;v0-S^08qio@sG z?@3sVC0ET1<}2ebM77u@jz2S3w)oz}`5ui6$(s#} z7ERhRS>_NBA34sUki_Vm**_^GO-45E@w(i*kgP8%%ItS+w(S0dN5O7kh2-`Nd0M-p zlV!<)A0OsUEhH1Glax-L%ajivH2%19RUzqTxMNqo;dEK*?K@dX2Mfu%`VKemRdG^Q z)q1jV+OZg*=ezIM2=3x&Xf;CshuX9`}Zp4r`1pG?r!=(9)0w`+2KjN^66%y6P71F zkP|J3*_V{AQZ}_S^xXL1139v)pr+oP*|LU;?b>c%K9CQe`+qjeTB2-a^{Gjf+C?N` zfpx>s55tv9HhbUxXj4R%Ci*_Ue8xrjU-FzA}zKZ}&kBd)ByQ~M)%yYOh}v@w4v zCwr~z-`egY*)H2{k~vPHtg&F&`Sra&l4Vcdyju}6S9!-`Ux#i{&@VL6Xmcb@_WjI~ zY{R)9$#ausLmvJ;S=Q3W{eI6c0!us>Z^k44$XrXdizfKvG%!|q5z4A%NrYuyNp15e&)uou& z&RQ8Sb5Bt=YuazJLqIWU*Kp7bz5UCTv0FT|`z05XAjeOxJ01LFY~N)u=@+!e$nO4f zrFf@myrHU?RI6G#vj40YW!w6}vOT%QWa~^BwgHDJr!MOKd17fXDb}CftcGl+GS2sP zethFkByHTx>D?lem2t@%+?SD0r1Op7@Y|bHmFGq}_kZR4iCmAc88FB^RY`_D@CsFY zB5i7GRyjCgsceSEt61YTpGey@?YCoVO;zImfM~oq_KDo+S^KJ|;c8hxuPYrsJo-c? zCDuBuIV@UcSl`jdLc4^tS`ra3eZm5z(PhuHS3MLe7)qf zZtBgM$~OyKm){O4A%}~zmzSJgtxOv+`}UdHC8X272_KFxN|W79Z{_@SdkJaYV|xGh zFBZ#ET=&(sy;4H9K7L_4{6@60!`NDBJKvX(@FkDe8eNJa14#H`sstHhft zl}}Gy%CNWpOpZ+2mwd)|q_Rezvlm>OAB~-_Of6V9dH%`IB(rdIM%M`wWO(PU7nuK~+m*_J|5zKX zO8i1j2c9}V>B4fE_&u>-*s3qY=KCl8b6-+r<33y$!%lo5S>eym+b#G@x#RlawAJ}v zNb<#Dc9+&Hk&W0tw`FDhuf+U`!t>*U<;t(Mybi8y_mxz>HPw2!B0$+`(9^jwgT9i- z5r>cDj$WbcHvDVhn53_y({`UpUIXKm-7BrJ&e-skShe)gzy58N^4hT;sf{jvB~w>f zj?3yYS*F+M){x_cUrEf0FmnF;D&>kk)9x>?_l?|l_nsAOkSrUQRqDG<{*6>QJtfcH zZMm$+)d5!TM}EWjaxd*UbAfE%^Gb^%{`y8-hbr8a+egbnQ{UY)J@Ad(^>}ghf>ylj z%ZXwAs^)$pF)Jtc?VK}LIbl}i?v|CmlNI9&|HVos6Bfa`brjmC70G zzuv1m@H?qwKjfC?o5`}JQ_j_XtoTmybKlH4)@Z(Rn(bY!XIs7#+kFwCg4qh0-(HOm zO|E|@$Lkg(47jsE=DU1+yCvVglOa9odR^KuU)gfaN8_%|e~`t-kE~SYq^?RnwyBgfTDajuU-ucZ_oM%6ef)YUd7c=& zIPTTYeZoKYA-2<|PXU6UCX;^sEv@|Pyv&)x1z$s?-+k74ClTaNl zNE6?T3eyo94$`4s0{te{|L(Cq72h%oW8Z1g?oGcmUgpp!bN)YYDqpQ7WUSQ^c5k3x ziNb;07vkgeR&n_M6Xp^0a}ZdvqAh5n99E%0_%|5l^mA1L$|=yMwX(Jj95E8Bc+|2> zA0P99E>1K|weo(0sh>ePKMyIKG5o4QXC=k;aG~K$%ZHQVnwRtQmg2U6pYG4N-t?1X zf_3?D18G3J@_tf!4(0rOr1WIv{iJYm_+{185UgTo{ZR+>yHs9DHjhnU-jY2~yI|qW z$Bi2o6o94?6cIYCtzzN=%{`o?e5RK38!Y8Bv#g&F3zt&PkA+KxUlzK{O3K(gf!5h? zw2p954}QU{Fm1-`2*&W|eP&C;$jke+qkcZ{E7P}j)NkMf9bqRrm&ffu{e)BuQ>&BUs}@gjNBu?1Lg1I)Wd9S;fT01e#mZPwxqS@Kb2~^pna!{mULd@DEL>oW-e@ zZ_Ut>#(`R{s9!mg>1o_loU6lSmq};bEG>gHI2uN+&ncttkg8?i0rw|;{2DETDR5== z70c0WS9yKe^euO58FYaw8^5fc`uk;+*Ox6n)th9N*O!g2cTCHmIvfqBu3yFSP0A^+ zFB_l6t9-k>es7ufq56L+=qr}5?)~!dE9x&*&{xcVz{B$KE9yr-`mgoJ|C{)AD#Wi? zzFE)9r(aQTugk8->h`TzzDZi;^%dj0)F`h%SfPF2)hw^C7=L|*_!af%Ov=Zv*#9${ z|JV8_Ez9dGrr+15yuNJx(_FO;w!=|7DSM!b(wJ@@rz2qaOW#E1{YeOu1V1VqsedR_nu8aRhD zg_FY-pe}9EPMzU;!ui9+z|DYL2X_eW0^BXQ7jWO<^y75|Gq{d$J>UZ2#>1t-9fG?F z_X)1v7#+bL&I>LAZZ6zbxC?M^;Hr+*5iH=`;3DDD;8bvT;ELf45_E*ta6RFM!9~F( z!!3f#gnJ2Rn5ZMPgzE|y43`YI2JSdqE?hC3(KsEUEu0rzFx(`#rEmw~uEV{A6L24D z2uJ^Ol_uIrThI|I36*hg*AuD;RdK(qF6aw2@OV;FFcge%Z>uHL7U~Ffg?d7Lp@Gm) zFcBIFjRjMoiO^Iq!!uhmp}Alov=CYft%TM>8+=jAN@$CJjb$U)3he|tp}o*SuooPJ zjzTA)vmg_?2#x{~so1!fsKoLyM+V3FMh5uC`bR{E2gm+f7aKaRLb{=mp*;8C$X{h+=Vi;r ze9D*Yr=PlPYL9YdQ+v{~{mNhM`zwE{9}^rC8yXeqi>if2j%4MJh!2kog-5V|M7j3+ zw}094{##qV?7!8k>+w5fxjOwWK>7OpF2t|8mesPB_;+2I|DWolZojg&^6ym3*v;>h zf2@-_^*`519pd+OiuMl-Lw82|BZGX^8T_e&{|fl$ zvi>XRuR`;}(6|BqkwIfagW^J1k;`Z>q5?zwBO`;u`H(8F8xi9lp&o4IHRZ-(85Q^U zjSi0Sm1396@@Kp77}5SQv3%5WpE7M19T?#o8#N-%H!wUjnkN$zH7YnTj*cV$h=9=8 zsL0U3*x$Bi^nV$$e1rbiVav4WuQbbE?aD-F-enE@U&``h^>=FZQ2mXroK^ou|Hpc< zg2nj$wld5f|JB0G`wx}*X~VxMty)*Ev@yY~hjE!k6R7VC<$cTC9Lg#FoDi)rY`CnQ zmWx@wLCUFqHAOk^sCa(UsOak(;~zPa8!NqLV=&Y2$ur2R>5tBI}CRo?h)JDmz`N2iPjf0y9w+b!;?l9bGxNC4v;ELg@ zp`K0QWN`iALf|IA&4gPDw;66f+gnwjUunR87H1oRuPTeC&XjsPACj_<`1W(}w_3fJ& z8y6hm6B-fh6pIQ3(=#DZ%L7jwq5k18@xGq8ue&3Pkc1Ms1_#8C92p#=E=iV@Mx1|4 zTzs@g>j`UEv@F?7Hg1Uys$A(C$3fHy!#D({Z92**m zZ)4MVp8m0MZp<8QX)BhIZ8Y3y8ZI#?SfGD+Uv}{ngri!X!Tw`{|K)F>;Tjws9QQAU zZ<)GPh~yL*)HgabQffKYRqENs)D z@C*%z@sCLqcGCLL4s;3%LbqYoMegT6(B2eKz!t3Y9FuO$(hC%_`s_olAujc58XM^z@JJD?Pj+ z-Zh$9-?$*wS%T1u%914{Mh6Si1()!sSl*MuHx1}qq9S9X!h_Mp!B{LSrQ9c&04GMM%@sAOH=%`P9 zqJHWHdzz11e#8hoA>&_c zR2l$d4W@p=OIAjyK6nT>6XFT#f)m{Dep`-%=z7-d9uR!pl49NUQ*ll zrEd#DO_mq$n*l-(w?4hxJlokyZ#BQWi2pz0XWmK>8m;+#W%H~sw~K$GKwSyKQKxXk z4qnWPQn$1dbEdtRKh=5TpCwSI8usg4w-4sS;e?4;iO`QZKm79o>Vz*?FtUg_?-Pgv zSN7OlPjv0|OnyY|7r#_}#z^N=)blIUr|dbEO?4L5qx{{WVfs7Y|K3j%@o2vPtB0mJ z7DxUsMyeQ|&a>0`{r}q!jsND*tZ-=YLtSrmKc~Obmj2HZ^)K5eWzW@dC>0CY|FKg0 z{h!L}bPg{4m9A-_wn6#_ZG*fQ|DFp}hgU7Y{~bYDT+|-_<23l=!Ll~}%dvx#N*|V3Icke!Zefsqu zFmRCcThxD~i2spH{%8gUEc-v2f$4vwc>k$P{x3HN4NdwV#qocTv~VAtoH)4&Z?}!P z>}1Ub#^lv`-{_fql0xEUgg>_K&N@@3{@35+AIwY6x$pmHcqblyKf+&G`($l>;py7^ zwL|`#{-iZhjNW)%?0skW9aF*g&Zs;8{z)|Xdd`Eq&w^kxiIq(KyOVAj{x8(J|K26> zqZ-1SBmAEn9(6Du{_A(ce--@y2@ehYet<8G;5J#ly7V^)tRwi1zaFMQ@RN=7+xEoY z+;n9mAtKzA&xm)iu(7hXFqI~aFf-o8qMuJ!O9uw4|cKvP31rBBi3jqBNrolhTSdEKDjYx@oa3 z?cV1cw!ORebMNQ=d(R)tXU<`Myx$+s^L)Sa&dkh(=ggZkYr*x=hT%E0uAe7oE}S=h zv6UW1#WUwxTu``tsQ*56H0&xI)@2J8Ei8+cNB`K{nEzvM_L$gq*m7aftVO6&Zv4kO zzFAOo!y+7|s4%i%&SKOcvx^q~^T&Vvd15&>jrKiqixwA^giE4-P5R7*7tCLL{dGkP z(!-19oI5Mp-Z1Ic&MaA2lpdb&&;95L|NBw&gnv6HJ>j2&!{&OzuXe-AzdP}NUIXe! zf&Ujb-Q=5tekdICf9QO=kS=4R{j2?D{;NLz0nU%c#u3&yE8n`;I?_4TxidNwA`2QD z3&Eza>sU2g&t7Bu_%LylSSD^Z_#ra1-AH#0kCP+h`La}YD12XliRf6&rhDiW?p<=X zis(E&P3P+ZU8sw7i7wS;x?ET2N?oOw>J@slS!13Ko{P?8D#cB?Sd1hq-B;Xq-CI4Z zR1O{I8ajurqhHY{-DlkS(eJB=z7Mm2B|E=yCOg+U>)cE)REK^Zex6HiAcgcgnrBb5 z^X&q=&@Q%1>{7eTF1IV}O1sH!wp;90yUpHVx7!_dr@hx6!G3a9%Tn`-dE2b=>wOVi zh8dCAStFi?g~jPK-G0&e$!p^$%53$EIm4gs7y2vx%3w(lY8^WFv1BrtMQ$T^k=+Cr zL}NBw&Fe*)%#fLqz)m}`ZH~%S5f$nl8pBq0qMRg`$fMK)YHQRd{X@swV?A!$Y_{9x z-6_74)74An2|p`%A=nl@C#d46-}0?I_-6t8k{xi*^&Y}=YU6N?5M2aoB0WGo_e^oR zwB-SHuddg)7#rJW2_5O>d7a)CRis}H-V8z{E*2|~lAqkJ=)SY!LfKfXAUoY%ZjyJh zx6k|9i{rQO2l$hGD}SH&@Spf5`Ko+dzO1&ZZq=ub(WhvobM*|pQ(qa2kGN_u_Ky#iArfLwvoDClwM)E5 zktA3zTDLGy->6sV7xX*&OMRkw(+rqg|89S^|FVBVAcHyBZfg)Kjf?qd7a40!u{K#R zTW3(4UPM>Y&GZ8MI(v^jS4Jo5L~E_TMQ83*$Hm^Ky@cdjbF4pFHP&NRtF_(w((1QH z(G)7^d2}Y7OP65}&(fFZr?i*;2OXq`+sXDR_8IosHnq>Uzp{^Gr?H9b5_Z1(P}Box zn++Yq^KS7%jYGCQ(M|NmMSp7@`fX>_&K*O){a}rxqv;Yq)IDVPS%}@6$sMHHI-Whv zvYh!&owL!|;=Jk1_BMMTdMEKPPv_(LBEFix$3Nts^M0Nwt`bX7w}<-ULbX`zaenXK z?>^6BcbBLZ+r$p>7hDK-q?QZhjqt=X@__tSj#ZiJN_7q5?-BK$`cNh5 z6ZIs0vAzTO`8qth!mKpUm@VdA^MUyuwm;TC$!EUuFZXBo<^HYyL;f1S#ed!Zv%en~ zmq!F+g0q4km=w$mii5Sm#$Z?QaV%zs#r)&aD`*K_3$J`a_tP`&@%A$NIr{^<*WTlX z@b=y)2BcY;)(FP=h^WoNn16sp57|mbx*^dbmaAsO&OY^}I;6sSoW4L$MdZ!Vck3;B zyqRjQHkD?nS%tXTZ4TmscY>en3xA%!A!rFY5bwicZ-d%NJ|(AFXIta#EPICiJNtIK z+FotD>}cl(XV6J=uW~zF=2d&g@sqgAPZ5j7BjRcCoOnU_GF!IGTs1{4R+A9*9r|c9 z&e*We48O*I#edHq7K{ws;PId_Xbxh&&KefV#~98d7m}$~x%H`)NWZ5E_7r~^OCUfbrr?Oy3!?|tHNK8Y_?PpMY*hT0X&wZEzpbcU|YLWzYm|r1t$eJ1UCljqdqLaybvtr0pT7ZP2_db zPQDU_Kr?T~iC=rwn{r?^-&CBpIJ>oI%LN7;Msv32ZZq_Zj zRk!IKx*ay`)O$5<%Z=q^x;+_aU12Y^?}1OALVRoiC$zacfpX`27kig^b6}lC-p$_M zy(9QB{CK{Nzs+~?JwT>k_;7KA7$L1-cF-Pl1|Q+M;i2kbm>YpPD8wO(oC}QJKn{Zk z%3!7GV7F)3VQQorrA|=757iBeVZ={SK5HBn!_2inuLjX5n#6V)7yZ6ka2FqlGF~*r@SuC67uv`{_^{26XR=^5bF)LxEtc;bj3RcOg*iyCv%({xzuv%8f z*0Ormz#3T-Yi2F1m9?=QtethRPWF~~MSZJI)}fAJF-&YCFOe#`l&+xFbQO(vj&hE3 zQk`Mmd)9z8h$$iQG=V14B$`aeyUZ>3D!qHX zulQ#3qM7N>^=Y7jhmo<^pnn+NnTB2~yPNHFHUf9HdM|rBy$^Mr7m``Lx=8n?p>;VrJw^*=kKwer7(ZW&si%e(l6;$%E`erVmZ4)VFt^UN9^ z!<5x(vwBs%sXBpP=_W82n>4yr2zW>Pf*fQs2 z?x=^r>P6s@;W7VDi0Yuq;h|nE44FzFr=#pKwhgSYFRzis@_M;g{$5te zi4_Hz9}K z&DaD!J?oF-dz){3!-}Kh2T}>#+N~V z@MF}D)x$#-SR{~R$xUPl*+}lP)?3e6?biF&N7gr196g+#L@jy=BCZq4;xPL-dm9^I ze`oPdf|KYZL4R#@8l5Jm*=cd6@?zf2kt<@q_(7~ud)23^2VCEW5lqs{bv3xW24{a= z@I&<2b;Cmms4>#X1Z3tVq?9}bB&)L=dM>@nE&@VU+b=<@eP_qB(Ll5)o-JaJu+8ip zwukLw-?5R-DNZ_6;4C0_xpRwC>pbZUbB}iKbf17;{M7xyjrWqg(>%{B@D_Rxdt1Dh zyjJgHuh;wD`w?+`0vI)uTR{2A{7OEXm+%|-J^VqaoelgM-hr{42jt%_Iz>EmoGr8D z6nJTm?2*av%Wt6NR;%@3ql4;jJx0&fx9iXKFZytEv>9zUo?bB3%rx`N&G1T{*=jyA zhs-cP$sg^X&%_z0rRkV(rhr#n^x0l zF7|8vb^aHAE;zj?mT--YvCV-MJ4*f@4RyMoPvn*F`A$?12}-E4Q7 zJIif!g;(Kif|nlPXM(FP7aK)`Y?1HC_mLq#$_LdNSbwv6LG3}DoeSME6S;Ateo%Mo zk>*%40eEncnQneIhxtcB30wlzG6%Y4xxWGY)(@S3UT{&67u<^6cq1B*9hk3(g-4zw zE3HSY4c5ojQBY`S!R8h8cKQH)lm3M!g1e{LRj_xh{j~ioFkw3?iCy+S`wRPPI|*DM z5vx%i~XOJ)NIv+Y;I^Q}!I7hpu0=ds|se7@T z@6L8h+#B3`+(+H@?k4xSn2tNuJJ&0ME&kxG@SgMD@OF8hVrt(A@H*q?LMP<$W&8v| zgd>Vo9hBTRP}f(X;##Y>>$8nAm%*B2HHJ5T8bd|_me)7Y+Y-u zwsu)(();N~I>|mAycS_|fp&MX4Qw~-Wk0hKPS_F7709%e&J)P`51no&&K>6l?qu-J z@7$%(0Zr~3?nls`BfL@GIPW)JjyKt>@xuH}?(j?a&HOh0NB%H>oYw;%ck(%6k+?(L zD>i{)-xA*nTL$tKIb0p7w3>+gS`Hs?g$8K`8CvN)1RE=6X2Oir=JSdUsyS>IbT!J#wk8xV!} z!iR_Kvz=*9fiuq$ZVgalCiw9~Z$G#$4mM8Xf?vg-03wWoW{QX}M6LWx?lg`5-NExg z^qpGqG3`BQok#2G>+~I(Wj}#T+;0=+F&{O;)oec4{|?MHu9kQz)0N`srBd-esr!FR!6)W=EjF&kV=rjRR0KABI(!^?G6v$fwk9%}J= zx&;1yggy^VK7q}FmUsw$ZFW*oxjHgm&qux91br4~GK~PQ{=wX522lsh^q2UL`MuDg z)xn>l#|g*Bc;s_(hII`xev7rude@pxm(vZj1$om;kFXabV_vs=?5kmk2KF{v;%s$x zIq~l4ZkBtJw+?#yR6d_8F;zSaWNH@gi%-Pi@+f&$tbU#$Yvg0{JH$qvYEq+6cTUu0 zi022P>*Mi`aD2!(GM%&nF^{r{^{n-Y^&R-@I69Vk^a6S%okwq__tGaY)(>z#KO>Vz z+n2FarvyCywU@#t@`w04{A3*YCy}pTMqM)qrSf3#WORI4@v+)?j5XJ~-5NntvDfjm zn9fIE1(kG4z;hW;-HDk6g1o(A1s0Oei`eu_p(Ij`WAQE^uqAJaEc zMvZFdB$I4%O~iyM<6|{=rCOzGP;J+%2Gt0gH6xGO)DG3II)LnZO_%95{iu@$;L#9x zDcMi)Q~j_Xsvg>2qdv;EbL?C@V*hJDg*)2Ga%ClW`fI)kp0{cY2IEaW&kcl!$CP(Ym#(#{#)S3pUmL{-HTeSA;7`i8` z+FoVX*mZWj-H6UjE4nrv=-70lX6y%dgjfPgf({P@s|fUW7PNN+y1M|HyA&B$39VfX zom~fw-3Wc%3T@rN_OfoESwB=v2pT5INdc;5IK<%?RSrfJMS^0d6pEtKSqf!cgF3uE zmKCke4yVJ}3)JfcPYqy-b%LAZrl11KaEZ$i$2o2U+*RNfyQOZqTM0z02BOrt^TNITm0ol~`h$Z&FJx~w?)`#3LVN?kl1MU1 zA*m!x(ntnjM3ZciLvl%k7@e#Uw}1APaSGj?9IA&6CrhU<+g+G;9fae`T^(>y*`;z7 zGPG9K$+hS&G{{ETB%8t3|2;aop`LnWpX`?h<$xT-(W75@ovE4DIve#(9y+dt=(d)j(^`ct&MIKTTHOE)Z$Z7? z4xH%HJ-SaH)Pp+SBmyx~O&YMB8I2gsMfH?#3W4)wrovR273ihZqMB$xUbY}F+kqQh z;MzW*#-ND@2PFeB()>(xg|wgT=lXemK6;}iewkkZwXwoq1^u|zZ}6MYCu;NC(e3N< zd;C8CAh0z)NDPv}T4_OMzycj)2f0vV`9Wb&5|jlMs9IJ8tAbk8r42z7Iyh~ys=h1e zL5>`Z=0_6dEh0bSNfIioFcdmLv}PevBZ$%hL})3Zvl5Y6jmWG+R5l_aTY*&_z^QIT zVLu`;gy>5`ZxX>%nHXmTF; str: + attrs = [ + ("id", self.id), + ("name", self.name), + ("position", self.position), + ("nsfw", self.nsfw), + ("news", self.is_news()), + ("category_id", self.category_id), + ("default_auto_archive_duration", self.default_auto_archive_duration), + ] + joined = " ".join("%s=%r" % t for t in attrs) + return f"<{self.__class__.__name__} {joined}>" + + def _update(self, guild: Guild, data: TextChannelPayload) -> None: + self.guild: Guild = guild + # apparently this can be nullable in the case of a bad api deploy + self.name: str = data.get("name") or "" + self.category_id: Optional[int] = utils._get_as_snowflake(data, "parent_id") + self.topic: Optional[str] = data.get("topic") + self.position: int = data["position"] + self.nsfw: bool = data.get("nsfw", False) + # Does this need coercion into `int`? No idea yet. + self.slowmode_delay: int = data.get("rate_limit_per_user", 0) + self.default_auto_archive_duration: ThreadArchiveDurationLiteral = data.get( + "default_auto_archive_duration", 1440 + ) + self._type: int = data.get("type", self._type) + self.last_message_id: Optional[int] = utils._get_as_snowflake(data, "last_message_id") + self.last_pin_timestamp: Optional[datetime.datetime] = utils.parse_time( + data.get("last_pin_timestamp") + ) + self._fill_overwrites(data) + + async def _get_channel(self): + return self + + @property + def type(self) -> ChannelType: + """:class:`ChannelType`: The channel's Discord type.""" + return try_enum(ChannelType, self._type) + + @property + def _sorting_bucket(self) -> int: + return ChannelType.text.value + + @utils.copy_doc(disnake.abc.GuildChannel.permissions_for) + def permissions_for( + self, + obj: Union[Member, Role], + /, + *, + ignore_timeout: bool = MISSING, + ) -> Permissions: + base = super().permissions_for(obj, ignore_timeout=ignore_timeout) + + # text channels do not have voice related permissions + denied = Permissions.voice() + base.value &= ~denied.value + return base + + @property + def members(self) -> List[Member]: + """List[:class:`Member`]: Returns all members that can see this channel.""" + return [m for m in self.guild.members if self.permissions_for(m).view_channel] + + @property + def threads(self) -> List[Thread]: + """List[:class:`Thread`]: Returns all the threads that you can see. + + .. versionadded:: 2.0 + """ + return [thread for thread in self.guild._threads.values() if thread.parent_id == self.id] + + def is_nsfw(self) -> bool: + """Whether the channel is marked as NSFW. + + :return type: :class:`bool` + """ + return self.nsfw + + def is_news(self) -> bool: + """Whether the channel is a news channel. + + :return type: :class:`bool` + """ + return self._type == ChannelType.news.value + + @property + def last_message(self) -> Optional[Message]: + """Gets the last message in this channel from the cache. + + The message might not be valid or point to an existing message. + + .. admonition:: Reliable Fetching + :class: helpful + + For a slightly more reliable method of fetching the + last message, consider using either :meth:`history` + or :meth:`fetch_message` with the :attr:`last_message_id` + attribute. + + Returns + ------- + Optional[:class:`Message`] + The last message in this channel or ``None`` if not found. + """ + return self._state._get_message(self.last_message_id) if self.last_message_id else None + + @overload + async def edit( + self, + *, + reason: Optional[str] = ..., + name: str = ..., + topic: Optional[str] = ..., + position: int = ..., + nsfw: bool = ..., + sync_permissions: bool = ..., + category: Optional[CategoryChannel] = ..., + slowmode_delay: int = ..., + default_auto_archive_duration: AnyThreadArchiveDuration = ..., + type: ChannelType = ..., + overwrites: Mapping[Union[Role, Member, Snowflake], PermissionOverwrite] = ..., + ) -> Optional[TextChannel]: + ... + + @overload + async def edit(self) -> Optional[TextChannel]: + ... + + async def edit(self, *, reason=None, **options): + """|coro| + + Edits the channel. + + You must have :attr:`~Permissions.manage_channels` permission to + do this. + + .. versionchanged:: 1.3 + The ``overwrites`` keyword-only parameter was added. + + .. versionchanged:: 1.4 + The ``type`` keyword-only parameter was added. + + .. versionchanged:: 2.0 + Edits are no longer in-place, the newly edited channel is returned instead. + + Parameters + ---------- + name: :class:`str` + The new channel's name. + topic: Optional[:class:`str`] + The new channel's topic. + position: :class:`int` + The new channel's position. + nsfw: :class:`bool` + Whether to mark the channel as NSFW. + sync_permissions: :class:`bool` + Whether to sync permissions with the channel's new or pre-existing + category. Defaults to ``False``. + category: Optional[:class:`CategoryChannel`] + The new category for this channel. Can be ``None`` to remove the + category. + slowmode_delay: :class:`int` + Specifies the slowmode rate limit for users in this channel, in seconds. + A value of ``0`` disables slowmode. The maximum value possible is ``21600``. + type: :class:`ChannelType` + The new type of this text channel. Currently, only conversion between + :attr:`ChannelType.text` and :attr:`ChannelType.news` is supported. This + is only available to guilds that contain ``NEWS`` in :attr:`Guild.features`. + overwrites: :class:`Mapping` + A :class:`Mapping` of target (either a role or a member) to + :class:`PermissionOverwrite` to apply to the channel. + default_auto_archive_duration: Union[:class:`int`, :class:`ThreadArchiveDuration`] + The new default auto archive duration in minutes for threads created in this channel. + Must be one of ``60``, ``1440``, ``4320``, or ``10080``. + reason: Optional[:class:`str`] + The reason for editing this channel. Shows up on the audit log. + + Raises + ------ + InvalidArgument + If position is less than 0 or greater than the number of channels, or if + the permission overwrite information is not in proper form. + Forbidden + You do not have permissions to edit the channel. + HTTPException + Editing the channel failed. + + Returns + ------- + Optional[:class:`.TextChannel`] + The newly edited text channel. If the edit was only positional + then ``None`` is returned instead. + """ + payload = await self._edit(options, reason=reason) + if payload is not None: + # the payload will always be the proper channel payload + return self.__class__(state=self._state, guild=self.guild, data=payload) # type: ignore + + @utils.copy_doc(disnake.abc.GuildChannel.clone) + async def clone( + self, *, name: Optional[str] = None, reason: Optional[str] = None + ) -> TextChannel: + return await self._clone_impl( + {"topic": self.topic, "nsfw": self.nsfw, "rate_limit_per_user": self.slowmode_delay}, + name=name, + reason=reason, + ) + + async def delete_messages(self, messages: Iterable[Snowflake]) -> None: + """|coro| + + Deletes a list of messages. This is similar to :meth:`Message.delete` + except it bulk deletes multiple messages. + + As a special case, if the number of messages is 0, then nothing + is done. If the number of messages is 1 then single message + delete is done. If it's more than two, then bulk delete is used. + + You cannot bulk delete more than 100 messages or messages that + are older than 14 days. + + You must have :attr:`~Permissions.manage_messages` permission to + do this. + + Parameters + ---------- + messages: Iterable[:class:`abc.Snowflake`] + An iterable of messages denoting which ones to bulk delete. + + Raises + ------ + ClientException + The number of messages to delete was more than 100. + Forbidden + You do not have proper permissions to delete the messages. + NotFound + If single delete, then the message was already deleted. + HTTPException + Deleting the messages failed. + """ + if not isinstance(messages, (list, tuple)): + messages = list(messages) + + if len(messages) == 0: + return # do nothing + + if len(messages) == 1: + message_id: int = messages[0].id + await self._state.http.delete_message(self.id, message_id) + return + + if len(messages) > 100: + raise ClientException("Can only bulk delete messages up to 100 messages") + + message_ids: SnowflakeList = [m.id for m in messages] + await self._state.http.delete_messages(self.id, message_ids) + + async def purge( + self, + *, + limit: Optional[int] = 100, + check: Callable[[Message], bool] = MISSING, + before: Optional[SnowflakeTime] = None, + after: Optional[SnowflakeTime] = None, + around: Optional[SnowflakeTime] = None, + oldest_first: Optional[bool] = False, + bulk: bool = True, + ) -> List[Message]: + """|coro| + + Purges a list of messages that meet the criteria given by the predicate + ``check``. If a ``check`` is not provided then all messages are deleted + without discrimination. + + You must have :attr:`~Permissions.manage_messages` permission to + delete messages even if they are your own. + :attr:`~Permissions.read_message_history` permission is + also needed to retrieve message history. + + Examples + -------- + + Deleting bot's messages :: + + def is_me(m): + return m.author == client.user + + deleted = await channel.purge(limit=100, check=is_me) + await channel.send(f'Deleted {len(deleted)} message(s)') + + Parameters + ---------- + limit: Optional[:class:`int`] + The number of messages to search through. This is not the number + of messages that will be deleted, though it can be. + check: Callable[[:class:`Message`], :class:`bool`] + The function used to check if a message should be deleted. + It must take a :class:`Message` as its sole parameter. + before: Optional[Union[:class:`abc.Snowflake`, :class:`datetime.datetime`]] + Same as ``before`` in :meth:`history`. + after: Optional[Union[:class:`abc.Snowflake`, :class:`datetime.datetime`]] + Same as ``after`` in :meth:`history`. + around: Optional[Union[:class:`abc.Snowflake`, :class:`datetime.datetime`]] + Same as ``around`` in :meth:`history`. + oldest_first: Optional[:class:`bool`] + Same as ``oldest_first`` in :meth:`history`. + bulk: :class:`bool` + If ``True``, use bulk delete. Setting this to ``False`` is useful for mass-deleting + a bot's own messages without :attr:`Permissions.manage_messages`. When ``True``, will + fall back to single delete if messages are older than two weeks. + + Raises + ------ + Forbidden + You do not have proper permissions to do the actions required. + HTTPException + Purging the messages failed. + + Returns + ------- + List[:class:`.Message`] + A list of messages that were deleted. + """ + if check is MISSING: + check = lambda m: True + + iterator = self.history( + limit=limit, before=before, after=after, oldest_first=oldest_first, around=around + ) + ret: List[Message] = [] + count = 0 + + minimum_time = int((time.time() - 14 * 24 * 60 * 60) * 1000.0 - 1420070400000) << 22 + strategy = self.delete_messages if bulk else _single_delete_strategy + + async for message in iterator: + if count == 100: + to_delete = ret[-100:] + await strategy(to_delete) + count = 0 + await asyncio.sleep(1) + + if not check(message): + continue + + if message.id < minimum_time: + # older than 14 days old + if count == 1: + await ret[-1].delete() + elif count >= 2: + to_delete = ret[-count:] + await strategy(to_delete) + + count = 0 + strategy = _single_delete_strategy + + count += 1 + ret.append(message) + + # SOme messages remaining to poll + if count >= 2: + # more than 2 messages -> bulk delete + to_delete = ret[-count:] + await strategy(to_delete) + elif count == 1: + # delete a single message + await ret[-1].delete() + + return ret + + async def webhooks(self) -> List[Webhook]: + """|coro| + + Retrieves the list of webhooks this channel has. + + You must have :attr:`~.Permissions.manage_webhooks` permission to + use this. + + Raises + ------ + Forbidden + You don't have permissions to get the webhooks. + + Returns + ------- + List[:class:`Webhook`] + The list of webhooks this channel has. + """ + from .webhook import Webhook + + data = await self._state.http.channel_webhooks(self.id) + return [Webhook.from_state(d, state=self._state) for d in data] + + async def create_webhook( + self, *, name: str, avatar: Optional[AssetBytes] = None, reason: Optional[str] = None + ) -> Webhook: + """|coro| + + Creates a webhook for this channel. + + You must have :attr:`~.Permissions.manage_webhooks` permission to + do this. + + .. versionchanged:: 1.1 + The ``reason`` keyword-only parameter was added. + + Parameters + ---------- + name: :class:`str` + The webhook's name. + avatar: Optional[|resource_type|] + The webhook's default avatar. + This operates similarly to :meth:`~ClientUser.edit`. + + .. versionchanged:: 2.5 + Now accepts various resource types in addition to :class:`bytes`. + + reason: Optional[:class:`str`] + The reason for creating this webhook. Shows up in the audit logs. + + Raises + ------ + NotFound + The ``avatar`` asset couldn't be found. + Forbidden + You do not have permissions to create a webhook. + HTTPException + Creating the webhook failed. + TypeError + The ``avatar`` asset is a lottie sticker (see :func:`Sticker.read`). + + Returns + ------- + :class:`Webhook` + The newly created webhook. + """ + from .webhook import Webhook + + avatar_data = await utils._assetbytes_to_base64_data(avatar) + + data = await self._state.http.create_webhook( + self.id, name=str(name), avatar=avatar_data, reason=reason + ) + return Webhook.from_state(data, state=self._state) + + async def follow(self, *, destination: TextChannel, reason: Optional[str] = None) -> Webhook: + """|coro| + + Follows a channel using a webhook. + + Only news channels can be followed. + + .. note:: + + The webhook returned will not provide a token to do webhook + actions, as Discord does not provide it. + + .. versionadded:: 1.3 + + Parameters + ---------- + destination: :class:`TextChannel` + The channel you would like to follow from. + reason: Optional[:class:`str`] + The reason for following the channel. Shows up on the destination guild's audit log. + + .. versionadded:: 1.4 + + Raises + ------ + HTTPException + Following the channel failed. + Forbidden + You do not have the permissions to create a webhook. + + Returns + ------- + :class:`Webhook` + The newly created webhook. + """ + if not self.is_news(): + raise ClientException("The channel must be a news channel.") + + if not isinstance(destination, TextChannel): + raise InvalidArgument(f"Expected TextChannel received {destination.__class__.__name__}") + + from .webhook import Webhook + + data = await self._state.http.follow_webhook( + self.id, webhook_channel_id=destination.id, reason=reason + ) + return Webhook._as_follower(data, channel=destination, user=self._state.user) + + def get_partial_message(self, message_id: int, /) -> PartialMessage: + """Creates a :class:`PartialMessage` from the given message ID. + + This is useful if you want to work with a message and only have its ID without + doing an unnecessary API call. + + .. versionadded:: 1.6 + + Parameters + ---------- + message_id: :class:`int` + The message ID to create a partial message for. + + Returns + ------- + :class:`PartialMessage` + The partial message object. + """ + from .message import PartialMessage + + return PartialMessage(channel=self, id=message_id) + + def get_thread(self, thread_id: int, /) -> Optional[Thread]: + """Returns a thread with the given ID. + + .. versionadded:: 2.0 + + Parameters + ---------- + thread_id: :class:`int` + The ID to search for. + + Returns + ------- + Optional[:class:`Thread`] + The returned thread or ``None`` if not found. + """ + return self.guild.get_thread(thread_id) + + @overload + async def create_thread( + self, + *, + name: str, + message: Snowflake, + auto_archive_duration: AnyThreadArchiveDuration = None, + slowmode_delay: int = None, + reason: Optional[str] = None, + ) -> Thread: + ... + + @overload + async def create_thread( + self, + *, + name: str, + type: Literal[ + ChannelType.public_thread, ChannelType.private_thread, ChannelType.news_thread + ], + auto_archive_duration: AnyThreadArchiveDuration = None, + invitable: bool = None, + slowmode_delay: int = None, + reason: Optional[str] = None, + ) -> Thread: + ... + + async def create_thread( + self, + *, + name: str, + message: Optional[Snowflake] = None, + auto_archive_duration: AnyThreadArchiveDuration = None, + type: Optional[ChannelType] = None, + invitable: bool = None, + slowmode_delay: int = None, + reason: Optional[str] = None, + ) -> Thread: + """|coro| + + Creates a thread in this text channel. + + To create a public thread, you must have :attr:`~disnake.Permissions.create_public_threads` permission. + For a private thread, :attr:`~disnake.Permissions.create_private_threads` permission is needed instead. + Additionally, the guild must have ``PRIVATE_THREADS`` in :attr:`Guild.features` to create private threads. + + .. versionadded:: 2.0 + + .. versionchanged:: 2.5 + + - Only one of ``message`` and ``type`` may be provided. + - ``type`` is now required if ``message`` is not provided. + + + Parameters + ---------- + name: :class:`str` + The name of the thread. + message: :class:`abc.Snowflake` + A snowflake representing the message to create the thread with. + + .. versionchanged:: 2.5 + + Cannot be provided with ``type``. + + type: :class:`ChannelType` + The type of thread to create. + + .. versionchanged:: 2.5 + + Cannot be provided with ``message``. + Now required if message is not provided. + + auto_archive_duration: Union[:class:`int`, :class:`ThreadArchiveDuration`] + The duration in minutes before a thread is automatically archived for inactivity. + If not provided, the channel's default auto archive duration is used. + Must be one of ``60``, ``1440``, ``4320``, or ``10080``. + invitable: :class:`bool` + Whether non-moderators can add other non-moderators to this thread. + Only available for private threads. + If a ``message`` is passed then this parameter is ignored, as a thread + created with a message is always a public thread. + Defaults to ``True``. + + .. versionadded:: 2.3 + + slowmode_delay: :class:`int` + Specifies the slowmode rate limit for users in this thread, in seconds. + A value of ``0`` disables slowmode. The maximum value possible is ``21600``. + If not provided, slowmode is disabled. + + .. versionadded:: 2.3 + + reason: Optional[:class:`str`] + The reason for creating the thread. Shows up on the audit log. + + Raises + ------ + Forbidden + You do not have permissions to create a thread. + HTTPException + Starting the thread failed. + + Returns + ------- + :class:`Thread` + The newly created thread + """ + if not ((message is None) ^ (type is None)): + raise ValueError("Exactly one of message and type must be provided.") + + if auto_archive_duration is not None: + auto_archive_duration = cast( + "ThreadArchiveDurationLiteral", try_enum_to_int(auto_archive_duration) + ) + + if message is None: + data = await self._state.http.start_thread_without_message( + self.id, + name=name, + auto_archive_duration=auto_archive_duration or self.default_auto_archive_duration, + type=type.value, # type:ignore + invitable=invitable if invitable is not None else True, + rate_limit_per_user=slowmode_delay or 0, + reason=reason, + ) + else: + data = await self._state.http.start_thread_with_message( + self.id, + message.id, + name=name, + auto_archive_duration=auto_archive_duration or self.default_auto_archive_duration, + rate_limit_per_user=slowmode_delay or 0, + reason=reason, + ) + + return Thread(guild=self.guild, state=self._state, data=data) + + def archived_threads( + self, + *, + private: bool = False, + joined: bool = False, + limit: Optional[int] = 50, + before: Optional[Union[Snowflake, datetime.datetime]] = None, + ) -> ArchivedThreadIterator: + """Returns an :class:`~disnake.AsyncIterator` that iterates over all archived threads in the channel. + + You must have :attr:`~Permissions.read_message_history` permission to use this. If iterating over private threads + then :attr:`~Permissions.manage_threads` permission is also required. + + .. versionadded:: 2.0 + + Parameters + ---------- + limit: Optional[:class:`int`] + The number of threads to retrieve. + If ``None``, retrieves every archived thread in the channel. Note, however, + that this would make it a slow operation. + before: Optional[Union[:class:`abc.Snowflake`, :class:`datetime.datetime`]] + Retrieve archived channels before the given date or ID. + private: :class:`bool` + Whether to retrieve private archived threads. + joined: :class:`bool` + Whether to retrieve private archived threads that you've joined. + You cannot set ``joined`` to ``True`` and ``private`` to ``False``. + + Raises + ------ + Forbidden + You do not have permissions to get archived threads. + HTTPException + The request to get the archived threads failed. + + Yields + ------- + :class:`Thread` + The archived threads. + """ + return ArchivedThreadIterator( + self.id, self.guild, limit=limit, joined=joined, private=private, before=before + ) + + +class VocalGuildChannel(disnake.abc.Connectable, disnake.abc.GuildChannel, Hashable): + __slots__ = ( + "name", + "id", + "guild", + "bitrate", + "user_limit", + "_state", + "position", + "_overwrites", + "category_id", + "rtc_region", + "video_quality_mode", + ) + + def __init__( + self, + *, + state: ConnectionState, + guild: Guild, + data: Union[VoiceChannelPayload, StageChannelPayload], + ): + self._state: ConnectionState = state + self.id: int = int(data["id"]) + self._update(guild, data) + + def _get_voice_client_key(self) -> Tuple[int, str]: + return self.guild.id, "guild_id" + + def _get_voice_state_pair(self) -> Tuple[int, int]: + return self.guild.id, self.id + + def _update(self, guild: Guild, data: Union[VoiceChannelPayload, StageChannelPayload]) -> None: + self.guild = guild + # apparently this can be nullable in the case of a bad api deploy + self.name: str = data.get("name") or "" + rtc = data.get("rtc_region") + self.rtc_region: Optional[str] = rtc + self.video_quality_mode: VideoQualityMode = try_enum( + VideoQualityMode, data.get("video_quality_mode", 1) + ) + self.category_id: Optional[int] = utils._get_as_snowflake(data, "parent_id") + self.position: int = data["position"] + # these don't exist in partial channel objects of slash command options + self.bitrate: int = data.get("bitrate", 0) + self.user_limit: int = data.get("user_limit", 0) + self._fill_overwrites(data) + + @property + def _sorting_bucket(self) -> int: + return ChannelType.voice.value + + @property + def members(self) -> List[Member]: + """List[:class:`Member`]: Returns all members that are currently inside this voice channel.""" + ret = [] + for user_id, state in self.guild._voice_states.items(): + if state.channel and state.channel.id == self.id: + member = self.guild.get_member(user_id) + if member is not None: + ret.append(member) + return ret + + @property + def voice_states(self) -> Dict[int, VoiceState]: + """Returns a mapping of member IDs who have voice states in this channel. + + .. versionadded:: 1.3 + + .. note:: + + This function is intentionally low level to replace :attr:`members` + when the member cache is unavailable. + + Returns + ------- + Mapping[:class:`int`, :class:`VoiceState`] + The mapping of member ID to a voice state. + """ + # fmt: off + return { + key: value + for key, value in self.guild._voice_states.items() + if value.channel and value.channel.id == self.id + } + # fmt: on + + +class VoiceChannel(disnake.abc.Messageable, VocalGuildChannel): + """Represents a Discord guild voice channel. + + .. container:: operations + + .. describe:: x == y + + Checks if two channels are equal. + + .. describe:: x != y + + Checks if two channels are not equal. + + .. describe:: hash(x) + + Returns the channel's hash. + + .. describe:: str(x) + + Returns the channel's name. + + Attributes + ---------- + name: :class:`str` + The channel's name. + guild: :class:`Guild` + The guild the channel belongs to. + id: :class:`int` + The channel's ID. + category_id: Optional[:class:`int`] + The category channel ID this channel belongs to, if applicable. + position: :class:`int` + The position in the channel list. This is a number that starts at 0. e.g. the + top channel is position 0. + bitrate: :class:`int` + The channel's preferred audio bitrate in bits per second. + user_limit: :class:`int` + The channel's limit for number of members that can be in a voice channel. + rtc_region: Optional[:class:`str`] + The region for the voice channel's voice communication. + A value of ``None`` indicates automatic voice region detection. + + .. versionadded:: 1.7 + + .. versionchanged:: 2.5 + No longer a ``VoiceRegion`` instance. + + video_quality_mode: :class:`VideoQualityMode` + The camera video quality for the voice channel's participants. + nsfw: :class:`bool` + Whether the channel is marked as "not safe for work". + + .. note:: + + To check if the channel or the guild of that channel are marked as NSFW, consider :meth:`is_nsfw` instead. + + .. versionadded:: 2.3 + + slowmode_delay: :class:`int` + The number of seconds a member must wait between sending messages + in this channel. A value of `0` denotes that it is disabled. + Bots and users with :attr:`~Permissions.manage_channels` or + :attr:`~Permissions.manage_messages` bypass slowmode. + + .. versionadded:: 2.3 + + last_message_id: Optional[:class:`int`] + The last message ID of the message sent to this channel. It may + *not* point to an existing or valid message. + + .. versionadded:: 2.3 + """ + + __slots__ = ( + "nsfw", + "slowmode_delay", + "last_message_id", + ) + + def __repr__(self) -> str: + attrs = [ + ("id", self.id), + ("name", self.name), + ("rtc_region", self.rtc_region), + ("position", self.position), + ("bitrate", self.bitrate), + ("video_quality_mode", self.video_quality_mode), + ("user_limit", self.user_limit), + ("category_id", self.category_id), + ("nsfw", self.nsfw), + ] + joined = " ".join("%s=%r" % t for t in attrs) + return f"<{self.__class__.__name__} {joined}>" + + def _update(self, guild: Guild, data: VoiceChannelPayload) -> None: + super()._update(guild, data) + self.nsfw: bool = data.get("nsfw", False) + self.slowmode_delay: int = data.get("rate_limit_per_user", 0) + self.last_message_id: Optional[int] = utils._get_as_snowflake(data, "last_message_id") + + async def _get_channel(self): + return self + + @property + def type(self) -> ChannelType: + """:class:`ChannelType`: The channel's Discord type.""" + return ChannelType.voice + + @utils.copy_doc(disnake.abc.GuildChannel.clone) + async def clone( + self, *, name: Optional[str] = None, reason: Optional[str] = None + ) -> VoiceChannel: + return await self._clone_impl( + {"bitrate": self.bitrate, "user_limit": self.user_limit}, name=name, reason=reason + ) + + def is_nsfw(self) -> bool: + """Whether the channel is marked as NSFW. + + .. versionadded:: 2.3 + + :return type: :class:`bool` + """ + return self.nsfw + + @property + def last_message(self) -> Optional[Message]: + """Gets the last message in this channel from the cache. + + The message might not be valid or point to an existing message. + + .. admonition:: Reliable Fetching + :class: helpful + + For a slightly more reliable method of fetching the + last message, consider using either :meth:`history` + or :meth:`fetch_message` with the :attr:`last_message_id` + attribute. + + .. versionadded:: 2.3 + + Returns + ------- + Optional[:class:`Message`] + The last message in this channel or ``None`` if not found. + """ + return self._state._get_message(self.last_message_id) if self.last_message_id else None + + def get_partial_message(self, message_id: int, /) -> PartialMessage: + """Creates a :class:`PartialMessage` from the given message ID. + + This is useful if you want to work with a message and only have its ID without + doing an unnecessary API call. + + .. versionadded:: 2.3 + + Parameters + ---------- + message_id: :class:`int` + The message ID to create a partial message for. + + Returns + ------- + :class:`PartialMessage` + The partial message object. + """ + from .message import PartialMessage + + return PartialMessage(channel=self, id=message_id) + + @utils.copy_doc(disnake.abc.GuildChannel.permissions_for) + def permissions_for( + self, + obj: Union[Member, Role], + /, + *, + ignore_timeout: bool = MISSING, + ) -> Permissions: + base = super().permissions_for(obj, ignore_timeout=ignore_timeout) + + # voice channels cannot be edited by people who can't connect to them + # It also implicitly denies all other voice perms + if not base.connect: + denied = Permissions.voice() + # voice channels also deny all text related permissions + denied.value |= Permissions.text().value + denied.update(manage_channels=True, manage_roles=True) + base.value &= ~denied.value + return base + + @overload + async def edit( + self, + *, + name: str = ..., + bitrate: int = ..., + user_limit: int = ..., + position: int = ..., + sync_permissions: int = ..., + category: Optional[CategoryChannel] = ..., + overwrites: Mapping[Union[Role, Member], PermissionOverwrite] = ..., + rtc_region: Optional[Union[str, VoiceRegion]] = ..., + video_quality_mode: VideoQualityMode = ..., + nsfw: bool = ..., + slowmode_delay: int = ..., + reason: Optional[str] = ..., + ) -> Optional[VoiceChannel]: + ... + + @overload + async def edit(self) -> Optional[VoiceChannel]: + ... + + async def edit(self, *, reason=None, **options): + """|coro| + + Edits the channel. + + You must have :attr:`~Permissions.manage_channels` permission to + do this. + + .. versionchanged:: 1.3 + The ``overwrites`` keyword-only parameter was added. + + .. versionchanged:: 2.0 + Edits are no longer in-place, the newly edited channel is returned instead. + + Parameters + ---------- + name: :class:`str` + The new channel's name. + bitrate: :class:`int` + The new channel's bitrate. + user_limit: :class:`int` + The new channel's user limit. + position: :class:`int` + The new channel's position. + sync_permissions: :class:`bool` + Whether to sync permissions with the channel's new or pre-existing + category. Defaults to ``False``. + category: Optional[:class:`CategoryChannel`] + The new category for this channel. Can be ``None`` to remove the + category. + reason: Optional[:class:`str`] + The reason for editing this channel. Shows up on the audit log. + overwrites: :class:`Mapping` + A :class:`Mapping` of target (either a role or a member) to + :class:`PermissionOverwrite` to apply to the channel. + rtc_region: Optional[Union[:class:`str`, :class:`VoiceRegion`]] + The new region for the voice channel's voice communication. + A value of ``None`` indicates automatic voice region detection. + + .. versionadded:: 1.7 + + video_quality_mode: :class:`VideoQualityMode` + The camera video quality for the voice channel's participants. + + .. versionadded:: 2.0 + + nsfw: :class:`bool` + Whether to mark the channel as NSFW. + + .. versionadded:: 2.3 + + slowmode_delay: :class:`int` + Specifies the slowmode rate limit for users in this channel, in seconds. + A value of ``0`` disables slowmode. The maximum value possible is ``21600``. + + .. versionadded:: 2.3 + + Raises + ------ + InvalidArgument + If the permission overwrite information is not in proper form. + Forbidden + You do not have permissions to edit the channel. + HTTPException + Editing the channel failed. + + Returns + ------- + Optional[:class:`.VoiceChannel`] + The newly edited voice channel. If the edit was only positional + then ``None`` is returned instead. + """ + payload = await self._edit(options, reason=reason) + if payload is not None: + # the payload will always be the proper channel payload + return self.__class__(state=self._state, guild=self.guild, data=payload) # type: ignore + + async def delete_messages(self, messages: Iterable[Snowflake]) -> None: + """|coro| + + Deletes a list of messages. This is similar to :meth:`Message.delete` + except it bulk deletes multiple messages. + + As a special case, if the number of messages is 0, then nothing + is done. If the number of messages is 1 then single message + delete is done. If it's more than two, then bulk delete is used. + + You cannot bulk delete more than 100 messages or messages that + are older than 14 days. + + You must have :attr:`~Permissions.manage_messages` permission to + do this. + + .. versionadded:: 2.5 + + Parameters + ---------- + messages: Iterable[:class:`abc.Snowflake`] + An iterable of messages denoting which ones to bulk delete. + + Raises + ------ + ClientException + The number of messages to delete was more than 100. + Forbidden + You do not have proper permissions to delete the messages. + NotFound + If single delete, then the message was already deleted. + HTTPException + Deleting the messages failed. + """ + if not isinstance(messages, (list, tuple)): + messages = list(messages) + + if len(messages) == 0: + return # do nothing + + if len(messages) == 1: + message_id: int = messages[0].id + await self._state.http.delete_message(self.id, message_id) + return + + if len(messages) > 100: + raise ClientException("Can only bulk delete messages up to 100 messages") + + message_ids: SnowflakeList = [m.id for m in messages] + await self._state.http.delete_messages(self.id, message_ids) + + async def purge( + self, + *, + limit: Optional[int] = 100, + check: Callable[[Message], bool] = MISSING, + before: Optional[SnowflakeTime] = None, + after: Optional[SnowflakeTime] = None, + around: Optional[SnowflakeTime] = None, + oldest_first: Optional[bool] = False, + bulk: bool = True, + ) -> List[Message]: + """|coro| + + Purges a list of messages that meet the criteria given by the predicate + ``check``. If a ``check`` is not provided then all messages are deleted + without discrimination. + + You must have :attr:`~Permissions.manage_messages` permission to + delete messages even if they are your own. + :attr:`~Permissions.read_message_history` permission is + also needed to retrieve message history. + + .. versionadded:: 2.5 + + .. note:: + + See :meth:`TextChannel.purge` for examples. + + Parameters + ---------- + limit: Optional[:class:`int`] + The number of messages to search through. This is not the number + of messages that will be deleted, though it can be. + check: Callable[[:class:`Message`], :class:`bool`] + The function used to check if a message should be deleted. + It must take a :class:`Message` as its sole parameter. + before: Optional[Union[:class:`abc.Snowflake`, :class:`datetime.datetime`]] + Same as ``before`` in :meth:`history`. + after: Optional[Union[:class:`abc.Snowflake`, :class:`datetime.datetime`]] + Same as ``after`` in :meth:`history`. + around: Optional[Union[:class:`abc.Snowflake`, :class:`datetime.datetime`]] + Same as ``around`` in :meth:`history`. + oldest_first: Optional[:class:`bool`] + Same as ``oldest_first`` in :meth:`history`. + bulk: :class:`bool` + If ``True``, use bulk delete. Setting this to ``False`` is useful for mass-deleting + a bot's own messages without :attr:`Permissions.manage_messages`. When ``True``, will + fall back to single delete if messages are older than two weeks. + + Raises + ------ + Forbidden + You do not have proper permissions to do the actions required. + HTTPException + Purging the messages failed. + + Returns + ------- + List[:class:`.Message`] + A list of messages that were deleted. + """ + if check is MISSING: + check = lambda m: True + + iterator = self.history( + limit=limit, before=before, after=after, oldest_first=oldest_first, around=around + ) + ret: List[Message] = [] + count = 0 + + minimum_time = int((time.time() - 14 * 24 * 60 * 60) * 1000.0 - 1420070400000) << 22 + strategy = self.delete_messages if bulk else _single_delete_strategy + + async for message in iterator: + if count == 100: + to_delete = ret[-100:] + await strategy(to_delete) + count = 0 + await asyncio.sleep(1) + + if not check(message): + continue + + if message.id < minimum_time: + # older than 14 days old + if count == 1: + await ret[-1].delete() + elif count >= 2: + to_delete = ret[-count:] + await strategy(to_delete) + + count = 0 + strategy = _single_delete_strategy + + count += 1 + ret.append(message) + + # SOme messages remaining to poll + if count >= 2: + # more than 2 messages -> bulk delete + to_delete = ret[-count:] + await strategy(to_delete) + elif count == 1: + # delete a single message + await ret[-1].delete() + + return ret + + async def webhooks(self) -> List[Webhook]: + """|coro| + + Retrieves the list of webhooks this channel has. + + You must have :attr:`~.Permissions.manage_webhooks` permission to + use this. + + .. versionadded:: 2.5 + + Raises + ------ + Forbidden + You don't have permissions to get the webhooks. + + Returns + ------- + List[:class:`Webhook`] + The list of webhooks this channel has. + """ + from .webhook import Webhook + + data = await self._state.http.channel_webhooks(self.id) + return [Webhook.from_state(d, state=self._state) for d in data] + + async def create_webhook( + self, *, name: str, avatar: Optional[bytes] = None, reason: Optional[str] = None + ) -> Webhook: + """|coro| + + Creates a webhook for this channel. + + You must have :attr:`~.Permissions.manage_webhooks` permission to + do this. + + .. versionadded:: 2.5 + + Parameters + ---------- + name: :class:`str` + The webhook's name. + avatar: Optional[:class:`bytes`] + The webhook's default avatar. + This operates similarly to :meth:`~ClientUser.edit`. + reason: Optional[:class:`str`] + The reason for creating this webhook. Shows up in the audit logs. + + Raises + ------ + NotFound + The ``avatar`` asset couldn't be found. + Forbidden + You do not have permissions to create a webhook. + HTTPException + Creating the webhook failed. + TypeError + The ``avatar`` asset is a lottie sticker (see :func:`Sticker.read`). + + Returns + ------- + :class:`Webhook` + The newly created webhook. + """ + from .webhook import Webhook + + avatar_data = await utils._assetbytes_to_base64_data(avatar) + + data = await self._state.http.create_webhook( + self.id, name=str(name), avatar=avatar_data, reason=reason + ) + return Webhook.from_state(data, state=self._state) + + +class StageChannel(VocalGuildChannel): + """Represents a Discord guild stage channel. + + .. versionadded:: 1.7 + + .. container:: operations + + .. describe:: x == y + + Checks if two channels are equal. + + .. describe:: x != y + + Checks if two channels are not equal. + + .. describe:: hash(x) + + Returns the channel's hash. + + .. describe:: str(x) + + Returns the channel's name. + + Attributes + ---------- + name: :class:`str` + The channel's name. + guild: :class:`Guild` + The guild the channel belongs to. + id: :class:`int` + The channel's ID. + topic: Optional[:class:`str`] + The channel's topic. ``None`` if it isn't set. + category_id: Optional[:class:`int`] + The category channel ID this channel belongs to, if applicable. + position: :class:`int` + The position in the channel list. This is a number that starts at 0. e.g. the + top channel is position 0. + bitrate: :class:`int` + The channel's preferred audio bitrate in bits per second. + user_limit: :class:`int` + The channel's limit for number of members that can be in a stage channel. + rtc_region: Optional[:class:`str`] + The region for the stage channel's voice communication. + A value of ``None`` indicates automatic voice region detection. + + .. versionchanged:: 2.5 + No longer a ``VoiceRegion`` instance. + + video_quality_mode: :class:`VideoQualityMode` + The camera video quality for the stage channel's participants. + + .. versionadded:: 2.0 + """ + + __slots__ = ("topic",) + + def __repr__(self) -> str: + attrs = [ + ("id", self.id), + ("name", self.name), + ("topic", self.topic), + ("rtc_region", self.rtc_region), + ("position", self.position), + ("bitrate", self.bitrate), + ("video_quality_mode", self.video_quality_mode), + ("user_limit", self.user_limit), + ("category_id", self.category_id), + ] + joined = " ".join("%s=%r" % t for t in attrs) + return f"<{self.__class__.__name__} {joined}>" + + def _update(self, guild: Guild, data: StageChannelPayload) -> None: + super()._update(guild, data) + self.topic: Optional[str] = data.get("topic") + + @property + def requesting_to_speak(self) -> List[Member]: + """List[:class:`Member`]: A list of members who are requesting to speak in the stage channel.""" + return [ + member + for member in self.members + if member.voice and member.voice.requested_to_speak_at is not None + ] + + @property + def speakers(self) -> List[Member]: + """List[:class:`Member`]: A list of members who have been permitted to speak in the stage channel. + + .. versionadded:: 2.0 + """ + return [ + member + for member in self.members + if member.voice + and not member.voice.suppress + and member.voice.requested_to_speak_at is None + ] + + @property + def listeners(self) -> List[Member]: + """List[:class:`Member`]: A list of members who are listening in the stage channel. + + .. versionadded:: 2.0 + """ + return [member for member in self.members if member.voice and member.voice.suppress] + + @property + def moderators(self) -> List[Member]: + """List[:class:`Member`]: A list of members who are moderating the stage channel. + + .. versionadded:: 2.0 + """ + required_permissions = Permissions.stage_moderator() + return [ + member + for member in self.members + if self.permissions_for(member) >= required_permissions + ] + + @property + def type(self) -> ChannelType: + """:class:`ChannelType`: The channel's Discord type.""" + return ChannelType.stage_voice + + @utils.copy_doc(disnake.abc.GuildChannel.clone) + async def clone( + self, *, name: Optional[str] = None, reason: Optional[str] = None + ) -> StageChannel: + return await self._clone_impl({}, name=name, reason=reason) + + @property + def instance(self) -> Optional[StageInstance]: + """Optional[:class:`StageInstance`]: The running stage instance of the stage channel. + + .. versionadded:: 2.0 + """ + return utils.get(self.guild.stage_instances, channel_id=self.id) + + @utils.copy_doc(disnake.abc.GuildChannel.permissions_for) + def permissions_for( + self, + obj: Union[Member, Role], + /, + *, + ignore_timeout: bool = MISSING, + ) -> Permissions: + base = super().permissions_for(obj, ignore_timeout=ignore_timeout) + + # voice channels cannot be edited by people who can't connect to them + # It also implicitly denies all other voice perms + if not base.connect: + denied = Permissions.voice() + denied.update(manage_channels=True, manage_roles=True) + base.value &= ~denied.value + return base + + async def create_instance( + self, + *, + topic: str, + privacy_level: StagePrivacyLevel = MISSING, + notify_everyone: bool = False, + reason: Optional[str] = None, + ) -> StageInstance: + """|coro| + + Creates a stage instance. + + You must have :attr:`~Permissions.manage_channels` permission to + do this. + + .. versionadded:: 2.0 + + Parameters + ---------- + topic: :class:`str` + The stage instance's topic. + privacy_level: :class:`StagePrivacyLevel` + The stage instance's privacy level. Defaults to :attr:`StagePrivacyLevel.guild_only`. + reason: Optional[:class:`str`] + The reason the stage instance was created. Shows up on the audit log. + notify_everyone: :class:`bool` + Whether to notify ``@everyone`` that the stage instance has started. + Requires the :attr:`~Permissions.mention_everyone` permission on the stage channel. + Defaults to ``False``. + + .. versionadded:: 2.5 + + Raises + ------ + InvalidArgument + If the ``privacy_level`` parameter is not the proper type. + Forbidden + You do not have permissions to create a stage instance. + HTTPException + Creating a stage instance failed. + + Returns + ------- + :class:`StageInstance` + The newly created stage instance. + """ + payload: Dict[str, Any] = { + "channel_id": self.id, + "topic": topic, + "send_start_notification": notify_everyone, + } + + if privacy_level is not MISSING: + if not isinstance(privacy_level, StagePrivacyLevel): + raise InvalidArgument("privacy_level field must be of type PrivacyLevel") + if privacy_level is StagePrivacyLevel.public: + utils.warn_deprecated( + "Setting privacy_level to public is deprecated and will be removed in a future version.", + stacklevel=2, + ) + + payload["privacy_level"] = privacy_level.value + + data = await self._state.http.create_stage_instance(**payload, reason=reason) + return StageInstance(guild=self.guild, state=self._state, data=data) + + async def fetch_instance(self) -> StageInstance: + """|coro| + + Retrieves the running :class:`StageInstance`. + + .. versionadded:: 2.0 + + Raises + ------ + NotFound + The stage instance or channel could not be found. + HTTPException + Retrieving the stage instance failed. + + Returns + ------- + :class:`StageInstance` + The stage instance. + """ + data = await self._state.http.get_stage_instance(self.id) + return StageInstance(guild=self.guild, state=self._state, data=data) + + @overload + async def edit( + self, + *, + name: str = ..., + topic: Optional[str] = ..., + position: int = ..., + sync_permissions: int = ..., + category: Optional[CategoryChannel] = ..., + overwrites: Mapping[Union[Role, Member], PermissionOverwrite] = ..., + rtc_region: Optional[Union[str, VoiceRegion]] = ..., + video_quality_mode: VideoQualityMode = ..., + reason: Optional[str] = ..., + ) -> Optional[StageChannel]: + ... + + @overload + async def edit(self) -> Optional[StageChannel]: + ... + + async def edit(self, *, reason=None, **options): + """|coro| + + Edits the channel. + + You must have :attr:`~Permissions.manage_channels` permission to + do this. + + .. versionchanged:: 2.0 + The ``topic`` parameter must now be set via :attr:`create_instance`. + + .. versionchanged:: 2.0 + Edits are no longer in-place, the newly edited channel is returned instead. + + Parameters + ---------- + name: :class:`str` + The new channel's name. + position: :class:`int` + The new channel's position. + sync_permissions: :class:`bool` + Whether to sync permissions with the channel's new or pre-existing + category. Defaults to ``False``. + category: Optional[:class:`CategoryChannel`] + The new category for this channel. Can be ``None`` to remove the + category. + overwrites: :class:`Mapping` + A :class:`Mapping` of target (either a role or a member) to + :class:`PermissionOverwrite` to apply to the channel. + rtc_region: Optional[Union[:class:`str`, :class:`VoiceRegion`]] + The new region for the stage channel's voice communication. + A value of ``None`` indicates automatic voice region detection. + video_quality_mode: :class:`VideoQualityMode` + The camera video quality for the stage channel's participants. + + .. versionadded:: 2.0 + + reason: Optional[:class:`str`] + The reason for editing this channel. Shows up on the audit log. + + Raises + ------ + InvalidArgument + If the permission overwrite information is not in proper form. + Forbidden + You do not have permissions to edit the channel. + HTTPException + Editing the channel failed. + + Returns + ------- + Optional[:class:`.StageChannel`] + The newly edited stage channel. If the edit was only positional + then ``None`` is returned instead. + """ + payload = await self._edit(options, reason=reason) + if payload is not None: + # the payload will always be the proper channel payload + return self.__class__(state=self._state, guild=self.guild, data=payload) # type: ignore + + +class CategoryChannel(disnake.abc.GuildChannel, Hashable): + """Represents a Discord channel category. + + These are useful to group channels to logical compartments. + + .. container:: operations + + .. describe:: x == y + + Checks if two channels are equal. + + .. describe:: x != y + + Checks if two channels are not equal. + + .. describe:: hash(x) + + Returns the category's hash. + + .. describe:: str(x) + + Returns the category's name. + + Attributes + ---------- + name: :class:`str` + The category name. + guild: :class:`Guild` + The guild the category belongs to. + id: :class:`int` + The category channel ID. + position: :class:`int` + The position in the category list. This is a number that starts at 0. e.g. the + top category is position 0. + nsfw: :class:`bool` + If the channel is marked as "not safe for work". + + .. note:: + + To check if the channel or the guild of that channel are marked as NSFW, consider :meth:`is_nsfw` instead. + """ + + __slots__ = ("name", "id", "guild", "nsfw", "_state", "position", "_overwrites", "category_id") + + def __init__(self, *, state: ConnectionState, guild: Guild, data: CategoryChannelPayload): + self._state: ConnectionState = state + self.id: int = int(data["id"]) + self._update(guild, data) + + def __repr__(self) -> str: + return f"" + + def _update(self, guild: Guild, data: CategoryChannelPayload) -> None: + self.guild: Guild = guild + # apparently this can be nullable in the case of a bad api deploy + self.name: str = data.get("name") or "" + self.category_id: Optional[int] = utils._get_as_snowflake(data, "parent_id") + self.nsfw: bool = data.get("nsfw", False) + self.position: int = data["position"] + self._fill_overwrites(data) + + @property + def _sorting_bucket(self) -> int: + return ChannelType.category.value + + @property + def type(self) -> ChannelType: + """:class:`ChannelType`: The channel's Discord type.""" + return ChannelType.category + + def is_nsfw(self) -> bool: + """Whether the category is marked as NSFW. + + :return type: :class:`bool` + """ + return self.nsfw + + @utils.copy_doc(disnake.abc.GuildChannel.clone) + async def clone( + self, *, name: Optional[str] = None, reason: Optional[str] = None + ) -> CategoryChannel: + return await self._clone_impl({"nsfw": self.nsfw}, name=name, reason=reason) + + @overload + async def edit( + self, + *, + name: str = ..., + position: int = ..., + nsfw: bool = ..., + overwrites: Mapping[Union[Role, Member], PermissionOverwrite] = ..., + reason: Optional[str] = ..., + ) -> Optional[CategoryChannel]: + ... + + @overload + async def edit(self) -> Optional[CategoryChannel]: + ... + + async def edit(self, *, reason=None, **options): + """|coro| + + Edits the category. + + You must have :attr:`~Permissions.manage_channels` permission to + do this. + + .. versionchanged:: 1.3 + The ``overwrites`` keyword-only parameter was added. + + .. versionchanged:: 2.0 + Edits are no longer in-place, the newly edited channel is returned instead. + + Parameters + ---------- + name: :class:`str` + The new category's name. + position: :class:`int` + The new category's position. + nsfw: :class:`bool` + Whether to mark the category as NSFW. + overwrites: :class:`Mapping` + A :class:`Mapping` of target (either a role or a member) to + :class:`PermissionOverwrite` to apply to the category. + reason: Optional[:class:`str`] + The reason for editing this category. Shows up on the audit log. + + Raises + ------ + InvalidArgument + If position is less than 0 or greater than the number of categories. + Forbidden + You do not have permissions to edit the category. + HTTPException + Editing the category failed. + + Returns + ------- + Optional[:class:`.CategoryChannel`] + The newly edited category channel. If the edit was only positional + then ``None`` is returned instead. + """ + payload = await self._edit(options, reason=reason) + if payload is not None: + # the payload will always be the proper channel payload + return self.__class__(state=self._state, guild=self.guild, data=payload) # type: ignore + + @overload + async def move( + self, + *, + beginning: bool, + offset: int = ..., + sync_permissions: bool = ..., + reason: Optional[str] = ..., + ) -> None: + ... + + @overload + async def move( + self, + *, + end: bool, + offset: int = ..., + sync_permissions: bool = ..., + reason: Optional[str] = ..., + ) -> None: + ... + + @overload + async def move( + self, + *, + before: Snowflake, + offset: int = ..., + sync_permissions: bool = ..., + reason: Optional[str] = ..., + ) -> None: + ... + + @overload + async def move( + self, + *, + after: Snowflake, + offset: int = ..., + sync_permissions: bool = ..., + reason: Optional[str] = ..., + ) -> None: + ... + + @utils.copy_doc(disnake.abc.GuildChannel.move) + async def move(self, **kwargs): + kwargs.pop("category", None) + await super().move(**kwargs) + + @property + def channels(self) -> List[GuildChannelType]: + """List[:class:`abc.GuildChannel`]: Returns the channels that are under this category. + + These are sorted by the official Discord UI, which places voice channels below the text channels. + """ + + def comparator(channel): + return (not isinstance(channel, (TextChannel, ForumChannel)), channel.position) + + ret = [c for c in self.guild.channels if c.category_id == self.id] + ret.sort(key=comparator) + return ret + + @property + def text_channels(self) -> List[TextChannel]: + """List[:class:`TextChannel`]: Returns the text channels that are under this category.""" + ret = [ + c + for c in self.guild.channels + if c.category_id == self.id and isinstance(c, TextChannel) + ] + ret.sort(key=lambda c: (c.position, c.id)) + return ret + + @property + def voice_channels(self) -> List[VoiceChannel]: + """List[:class:`VoiceChannel`]: Returns the voice channels that are under this category.""" + ret = [ + c + for c in self.guild.channels + if c.category_id == self.id and isinstance(c, VoiceChannel) + ] + ret.sort(key=lambda c: (c.position, c.id)) + return ret + + @property + def stage_channels(self) -> List[StageChannel]: + """List[:class:`StageChannel`]: Returns the stage channels that are under this category. + + .. versionadded:: 1.7 + """ + ret = [ + c + for c in self.guild.channels + if c.category_id == self.id and isinstance(c, StageChannel) + ] + ret.sort(key=lambda c: (c.position, c.id)) + return ret + + @property + def forum_channels(self) -> List[ForumChannel]: + """List[:class:`ForumChannel`]: Returns the forum channels that are under this category. + + .. versionadded:: 2.5 + """ + ret = [ + c + for c in self.guild.channels + if c.category_id == self.id and isinstance(c, ForumChannel) + ] + ret.sort(key=lambda c: (c.position, c.id)) + return ret + + async def create_text_channel(self, name: str, **options: Any) -> TextChannel: + """|coro| + + A shortcut method to :meth:`Guild.create_text_channel` to create a :class:`TextChannel` in the category. + + Returns + ------- + :class:`TextChannel` + The newly created text channel. + """ + if "category" in options: + raise TypeError("got an unexpected keyword argument 'category'") + return await self.guild.create_text_channel(name, category=self, **options) + + async def create_voice_channel(self, name: str, **options: Any) -> VoiceChannel: + """|coro| + + A shortcut method to :meth:`Guild.create_voice_channel` to create a :class:`VoiceChannel` in the category. + + Returns + ------- + :class:`VoiceChannel` + The newly created voice channel. + """ + if "category" in options: + raise TypeError("got an unexpected keyword argument 'category'") + return await self.guild.create_voice_channel(name, category=self, **options) + + async def create_stage_channel(self, name: str, **options: Any) -> StageChannel: + """|coro| + + A shortcut method to :meth:`Guild.create_stage_channel` to create a :class:`StageChannel` in the category. + + .. versionadded:: 1.7 + + Returns + ------- + :class:`StageChannel` + The newly created stage channel. + """ + if "category" in options: + raise TypeError("got an unexpected keyword argument 'category'") + return await self.guild.create_stage_channel(name, category=self, **options) + + async def create_forum_channel(self, name: str, **options: Any) -> ForumChannel: + """|coro| + + A shortcut method to :meth:`Guild.create_forum_channel` to create a :class:`ForumChannel` in the category. + + .. versionadded:: 2.5 + + Returns + ------- + :class:`ForumChannel` + The newly created forum channel. + """ + if "category" in options: + raise TypeError("got an unexpected keyword argument 'category'") + return await self.guild.create_forum_channel(name, category=self, **options) + + +class NewsChannel(TextChannel): + """Represents a Discord news channel + + An exact 1:1 copy of :class:`TextChannel` meant for command annotations + """ + + type: ChannelType = ChannelType.news + + +class ThreadWithMessage(NamedTuple): + thread: Thread + message: Message + + +class ForumChannel(disnake.abc.GuildChannel, Hashable): + """Represents a Discord Forum channel. + + .. versionadded:: 2.5 + + .. container:: operations + + .. describe:: x == y + + Checks if two channels are equal. + + .. describe:: x != y + + Checks if two channels are not equal. + + .. describe:: hash(x) + + Returns the channel's hash. + + .. describe:: str(x) + + Returns the channel's name. + + Attributes + ---------- + id: :class:`int` + The channel's ID. + name: :class:`str` + The channel's name. + guild: :class:`Guild` + The guild the channel belongs to. + topic: Optional[:class:`str`] + The channel's topic. ``None`` if it isn't set. + category_id: Optional[:class:`int`] + The category channel ID this channel belongs to, if applicable. + position: :class:`int` + The position in the channel list. This is a number that starts at 0. e.g. the + top channel is position 0. + nsfw: :class:`bool` + Whether the channel is marked as "not safe for work". + + .. note:: + + To check if the channel or the guild of that channel are marked as NSFW, consider :meth:`is_nsfw` instead. + last_thread_id: Optional[:class:`int`] + The ID of the last created thread in this channel. It may + *not* point to an existing or valid thread. + default_auto_archive_duration: :class:`int` + The default auto archive duration in minutes for threads created in this channel. + slowmode_delay: :class:`int` + The number of seconds a member must wait between creating threads + in this channel. A value of `0` denotes that it is disabled. + """ + + __slots__ = ( + "id", + "name", + "category_id", + "topic", + "position", + "nsfw", + "last_thread_id", + "default_auto_archive_duration", + "guild", + "slowmode_delay", + "_state", + "_type", + "_overwrites", + ) + + def __init__(self, *, state: ConnectionState, guild: Guild, data: ForumChannelPayload) -> None: + self._state: ConnectionState = state + self.id: int = int(data["id"]) + self._type: int = data["type"] + self._update(guild, data) + + def __repr__(self) -> str: + atts = [ + ("id", self.id), + ("name", self.name), + ("topic", self.topic), + ("position", self.position), + ("nsfw", self.nsfw), + ("category_id", self.category_id), + ("default_auto_archive_duration", self.default_auto_archive_duration), + ] + joined = " ".join("%s=%r" % t for t in atts) + return f"<{type(self).__name__} {joined}>" + + def _update(self, guild: Guild, data: ForumChannelPayload) -> None: + self.guild: Guild = guild + # apparently this can be nullable in the case of a bad api deploy + self.name: str = data.get("name") or "" + self.category_id: Optional[int] = utils._get_as_snowflake(data, "parent_id") + self.topic: Optional[str] = data.get("topic") + self.position: int = data["position"] + self.nsfw: bool = data.get("nsfw", False) + self.last_thread_id: Optional[int] = utils._get_as_snowflake(data, "last_message_id") + self.default_auto_archive_duration: ThreadArchiveDurationLiteral = data.get( + "default_auto_archive_duration", 1440 + ) + self.slowmode_delay = data.get("rate_limit_per_user", 0) + self._fill_overwrites(data) + + async def _get_channel(self) -> ForumChannel: + return self + + @property + def type(self) -> ChannelType: + """:class:`ChannelType`: The channel's Discord type.""" + return ChannelType.forum + + @property + def _sorting_bucket(self) -> int: + return ChannelType.text.value + + @utils.copy_doc(disnake.abc.GuildChannel.permissions_for) + def permissions_for( + self, + obj: Union[Member, Role], + /, + *, + ignore_timeout: bool = MISSING, + ) -> Permissions: + base = super().permissions_for(obj, ignore_timeout=ignore_timeout) + + # forum channels do not have voice related permissions + denied = Permissions.voice() + base.value &= ~denied.value + return base + + @property + def members(self) -> List[Member]: + """List[:class:`Member`]: Returns all members that can see this channel.""" + return [m for m in self.guild.members if self.permissions_for(m).view_channel] + + @property + def threads(self) -> List[Thread]: + """List[:class:`Thread`]: Returns all the threads that you can see.""" + return [thread for thread in self.guild._threads.values() if thread.parent_id == self.id] + + def is_nsfw(self) -> bool: + """Whether the channel is marked as NSFW. + + :return type: :class:`bool` + """ + return self.nsfw + + @property + def last_thread(self) -> Optional[Thread]: + """Gets the last created thread in this channel from the cache. + + The thread might not be valid or point to an existing thread. + + .. admonition:: Reliable Fetching + :class: helpful + + For a slightly more reliable method of fetching the + last thread, use :meth:`Guild.fetch_channel` with the :attr:`last_thread_id` + attribute. + + Returns + ------- + Optional[:class:`Thread`] + The last created thread in this channel or ``None`` if not found. + """ + return self._state.get_channel(self.last_thread_id) if self.last_thread_id else None # type: ignore + + # both of these are re-implemented due to forum channels not being messageables + async def trigger_typing(self) -> None: + """|coro| + + Triggers a *typing* indicator to the desination. + + *Typing* indicator will go away after 10 seconds. + """ + channel = await self._get_channel() + await self._state.http.send_typing(channel.id) + + @utils.copy_doc(disnake.abc.Messageable.typing) + def typing(self) -> Typing: + return Typing(self) + + @overload + async def edit( + self, + *, + name: str = ..., + topic: Optional[str] = ..., + position: int = ..., + nsfw: bool = ..., + sync_permissions: bool = ..., + category: Optional[CategoryChannel] = ..., + slowmode_delay: Optional[int] = ..., + default_auto_archive_duration: AnyThreadArchiveDuration = ..., + overwrites: Mapping[Union[Role, Member, Snowflake], PermissionOverwrite] = ..., + reason: Optional[str] = ..., + ) -> Optional[ForumChannel]: + ... + + @overload + async def edit(self) -> Optional[ForumChannel]: + ... + + async def edit(self, *, reason: Optional[str] = None, **options): + """|coro| + + Edits the channel. + + You must have :attr:`~Permissions.manage_channels` permission to + do this. + + Parameters + ---------- + name: :class:`str` + The new channel's name. + topic: Optional[:class:`str`] + The new channel's topic. + position: :class:`int` + The new channel's position. + nsfw: :class:`bool` + Whether to mark the channel as NSFW. + sync_permissions: :class:`bool` + Whether to sync permissions with the channel's new or pre-existing + category. Defaults to ``False``. + category: Optional[:class:`CategoryChannel`] + The new category for this channel. Can be ``None`` to remove the + category. + slowmode_delay: :class:`int` + Specifies the slowmode rate limit for users in this channel, in seconds. + A value of ``0`` disables slowmode. The maximum value possible is ``21600``. + overwrites: :class:`Mapping` + A :class:`Mapping` of target (either a role or a member) to + :class:`PermissionOverwrite` to apply to the channel. + default_auto_archive_duration: Union[:class:`int`, :class:`ThreadArchiveDuration`] + The new default auto archive duration in minutes for threads created in this channel. + Must be one of ``60``, ``1440``, ``4320``, or ``10080``. + reason: Optional[:class:`str`] + The reason for editing this channel. Shows up on the audit log. + + Raises + ------ + InvalidArgument + If position is less than 0 or greater than the number of channels, or if + the permission overwrite information is not in proper form. + Forbidden + You do not have permissions to edit the channel. + HTTPException + Editing the channel failed. + + Returns + ------- + Optional[:class:`ForumChannel`] + The newly edited forum channel. If the edit was only positional + then ``None`` is returned instead. + """ + payload = await self._edit(options, reason=reason) + if payload is not None: + # the payload will always be the proper channel payload + return self.__class__(state=self._state, guild=self.guild, data=payload) # type: ignore + + @utils.copy_doc(disnake.abc.GuildChannel.clone) + async def clone( + self, *, name: Optional[str] = None, reason: Optional[str] = None + ) -> ForumChannel: + return await self._clone_impl( + { + "topic": self.topic, + "nsfw": self.nsfw, + "rate_limit_per_user": self.slowmode_delay, + "default_auto_archive_duration": self.default_auto_archive_duration, + }, + name=name, + reason=reason, + ) + + def get_thread(self, thread_id: int, /) -> Optional[Thread]: + """Returns a thread with the given ID. + + Parameters + ---------- + thread_id: :class:`int` + The ID to search for. + + Returns + ------- + Optional[:class:`Thread`] + The returned thread of ``None`` if not found. + """ + return self.guild.get_thread(thread_id) + + @overload + async def create_thread( + self, + *, + name: str, + auto_archive_duration: AnyThreadArchiveDuration = ..., + slowmode_delay: int = ..., + content: str, + embed: Embed = ..., + file: File = ..., + suppress_embeds: bool = ..., + stickers: Sequence[Union[GuildSticker, StickerItem]] = ..., + allowed_mentions: AllowedMentions = ..., + view: View = ..., + components: Components = ..., + reason: Optional[str] = None, + ) -> ThreadWithMessage: + ... + + @overload + async def create_thread( + self, + *, + name: str, + auto_archive_duration: AnyThreadArchiveDuration = ..., + slowmode_delay: int = ..., + content: str, + embed: Embed = ..., + files: List[File] = ..., + suppress_embeds: bool = ..., + stickers: Sequence[Union[GuildSticker, StickerItem]] = ..., + allowed_mentions: AllowedMentions = ..., + view: View = ..., + components: Components = ..., + reason: Optional[str] = None, + ) -> ThreadWithMessage: + ... + + @overload + async def create_thread( + self, + *, + name: str, + auto_archive_duration: AnyThreadArchiveDuration = ..., + slowmode_delay: int = ..., + content: str, + embeds: List[Embed] = ..., + file: File = ..., + suppress_embeds: bool = ..., + stickers: Sequence[Union[GuildSticker, StickerItem]] = ..., + allowed_mentions: AllowedMentions = ..., + view: View = ..., + components: Components = ..., + reason: Optional[str] = None, + ) -> ThreadWithMessage: + ... + + @overload + async def create_thread( + self, + *, + name: str, + auto_archive_duration: AnyThreadArchiveDuration = ..., + slowmode_delay: int = ..., + content: str, + embeds: List[Embed] = ..., + files: List[File] = ..., + suppress_embeds: bool = ..., + stickers: Sequence[Union[GuildSticker, StickerItem]] = ..., + allowed_mentions: AllowedMentions = ..., + view: View = ..., + components: Components = ..., + reason: Optional[str] = None, + ) -> ThreadWithMessage: + ... + + async def create_thread( + self, + *, + name: str, + auto_archive_duration: AnyThreadArchiveDuration = MISSING, + slowmode_delay: int = MISSING, + content: str, + embed: Embed = MISSING, + embeds: List[Embed] = MISSING, + file: File = MISSING, + files: List[File] = MISSING, + suppress_embeds: bool = MISSING, + stickers: Sequence[Union[GuildSticker, StickerItem]] = MISSING, + allowed_mentions: AllowedMentions = MISSING, + view: View = MISSING, + components: Components = MISSING, + reason: Optional[str] = None, + ) -> ThreadWithMessage: + """|coro| + + Creates a thread in this forum channel. + + You must have the :attr:`~Permissions.create_forum_threads` permission to do this. + + Parameters + ---------- + name: :class:`str` + The name of the thread. + auto_archive_duration: Union[:class:`int`, :class:`ThreadArchiveDuration`] + The duration in minutes before the thread is automatically archived for inactivity. + If not provided, the channel's default auto archive duration is used. + Must be one of ``60``, ``1440``, ``4320``, or ``10080``. + slowmode_delay: :class:`int` + Specifies the slowmode rate limit for users in this thread, in seconds. + A value of ``0`` disables slowmode. The maximum value possible is ``21600``. + If not provided, slowmode is disabled. + content: :class:`str` + The content of the message to send. + embed: :class:`.Embed` + The rich embed for the content to send. This cannot be mixed with the + ``embeds`` parameter. + embeds: List[:class:`.Embed`] + A list of embeds to send with the content. Must be a maximum of 10. + This cannot be mixed with the ``embed`` parameter. + suppress_embeds: :class:`bool` + Whether to suppress embeds for the message. This hides + all embeds from the UI if set to ``True``. + file: :class:`.File` + The file to upload. This cannot be mixed with the ``files`` parameter. + files: List[:class:`.File`] + A list of files to upload. Must be a maximum of 10. + This cannot be mixed with the ``file`` parameter. + stickers: Sequence[Union[:class:`.GuildSticker`, :class:`.StickerItem`]] + A list of stickers to upload. Must be a maximum of 3. + allowed_mentions: :class:`.AllowedMentions` + Controls the mentions being processed in this message. If this is + passed, then the object is merged with :attr:`.Client.allowed_mentions`. + The merging behaviour only overrides attributes that have been explicitly passed + to the object, otherwise it uses the attributes set in :attr:`.Client.allowed_mentions`. + If no object is passed at all then the defaults given by :attr:`.Client.allowed_mentions` + are used instead. + view: :class:`.ui.View` + A Discord UI View to add to the message. This cannot be mixed with ``components``. + components: |components_type| + A list of components to include in the message. This cannot be mixed with ``view``. + reason: Optional[:class:`str`] + The reason for creating the thread. Shows up on the audit log. + + Raises + ------ + Forbidden + You do not have permissions to create a thread. + HTTPException + Starting the thread failed. + TypeError + Specified both ``file`` and ``files``, + or you specified both ``embed`` and ``embeds``, + or you specified both ``view`` and ``components``. + InvalidArgument + Specified more than 10 embeds, + or more than 10 files, + or you have passed an object that is not :class:`File`. + + Returns + ------- + Tuple[:class:`Thread`, :class:`Message`] + A :class:`~typing.NamedTuple` with the newly created thread and the message sent in it. + + These values can also be accessed through the ``thread`` and ``message`` fields. + """ + from .message import Message + from .webhook.async_ import handle_message_parameters_dict + + params = handle_message_parameters_dict( + content, + embed=embed, + embeds=embeds, + file=file, + files=files, + view=view, + components=components, + allowed_mentions=allowed_mentions, + stickers=stickers, + ) + + if auto_archive_duration is not None: + auto_archive_duration = cast( + "ThreadArchiveDurationLiteral", try_enum_to_int(auto_archive_duration) + ) + + if params.files and len(params.files) > 10: + raise InvalidArgument("files parameter must be a list of up to 10 elements") + elif params.files and not all(isinstance(file, File) for file in params.files): + raise InvalidArgument("files parameter must be a list of File") + + if suppress_embeds: + flags = MessageFlags.suppress_embeds.flag + else: + flags = 0 + + try: + data = await self._state.http.start_thread_in_forum_channel( + self.id, + name=name, + auto_archive_duration=auto_archive_duration or self.default_auto_archive_duration, + rate_limit_per_user=slowmode_delay or 0, + type=ChannelType.public_thread.value, + files=params.files, + flags=flags, + reason=reason, + **params.payload, + ) + finally: + if params.files: + for f in params.files: + f.close() + + thread = Thread(guild=self.guild, data=data, state=self._state) + message = Message(channel=thread, data=data["message"], state=self._state) + + if view: + self._state.store_view(view, message.id) + + return ThreadWithMessage(thread, message) + + def archived_threads( + self, + *, + limit: Optional[int] = 50, + before: Optional[Union[Snowflake, datetime.datetime]] = None, + ) -> ArchivedThreadIterator: + """Returns an :class:`~disnake.AsyncIterator` that iterates over all archived threads in the channel. + + You must have :attr:`~Permissions.read_message_history` permission to use this. + + Parameters + ---------- + limit: Optional[:class:`int`] + The number of threads to retrieve. + If ``None``, retrieves every archived thread in the channel. Note, however, + that this would make it a slow operation. + before: Optional[Union[:class:`abc.Snowflake`, :class:`datetime.datetime`]] + Retrieve archived channels before the given date or ID. + + Raises + ------ + Forbidden + You do not have permissions to get archived threads. + HTTPException + The request to get the archived threads failed. + + Yields + ------- + :class:`Thread` + The archived threads. + """ + return ArchivedThreadIterator( + self.id, self.guild, limit=limit, joined=False, private=False, before=before + ) + + +DMC = TypeVar("DMC", bound="DMChannel") + + +class DMChannel(disnake.abc.Messageable, Hashable): + """Represents a Discord direct message channel. + + .. container:: operations + + .. describe:: x == y + + Checks if two channels are equal. + + .. describe:: x != y + + Checks if two channels are not equal. + + .. describe:: hash(x) + + Returns the channel's hash. + + .. describe:: str(x) + + Returns a string representation of the channel + + Attributes + ---------- + recipient: Optional[:class:`User`] + The user you are participating with in the direct message channel. + If this channel is received through the gateway, the recipient information + may not be always available. + me: :class:`ClientUser` + The user presenting yourself. + id: :class:`int` + The direct message channel ID. + last_pin_timestamp: Optional[:class:`datetime.datetime`] + The time the most recent message was pinned, or ``None`` if no message is currently pinned. + + .. versionadded:: 2.5 + """ + + __slots__ = ("id", "recipient", "me", "last_pin_timestamp", "_state") + + def __init__(self, *, me: ClientUser, state: ConnectionState, data: DMChannelPayload): + self._state: ConnectionState = state + self.recipient: Optional[User] = state.store_user(data["recipients"][0]) # type: ignore + self.me: ClientUser = me + self.id: int = int(data["id"]) + self.last_pin_timestamp: Optional[datetime.datetime] = utils.parse_time( + data.get("last_pin_timestamp") + ) + + async def _get_channel(self): + return self + + def __str__(self) -> str: + if self.recipient: + return f"Direct Message with {self.recipient}" + return "Direct Message with Unknown User" + + def __repr__(self) -> str: + return f"" + + @classmethod + def _from_message(cls: Type[DMC], state: ConnectionState, channel_id: int, user_id: int) -> DMC: + self: DMC = cls.__new__(cls) + self._state = state + self.id = channel_id + # state.user won't be None here + self.me = state.user + self.recipient = state.get_user(user_id) if user_id != self.me.id else None + self.last_pin_timestamp = None + return self + + @property + def type(self) -> ChannelType: + """:class:`ChannelType`: The channel's Discord type.""" + return ChannelType.private + + @property + def created_at(self) -> datetime.datetime: + """:class:`datetime.datetime`: Returns the direct message channel's creation time in UTC.""" + return utils.snowflake_time(self.id) + + @property + def jump_url(self) -> str: + """ + A URL that can be used to jump to this channel. + + .. versionadded:: 2.4 + """ + return f"https://discord.com/channels/@me/{self.id}" + + def permissions_for( + self, + obj: Any = None, + /, + *, + ignore_timeout: bool = MISSING, + ) -> Permissions: + """Handles permission resolution for a :class:`User`. + + This function is there for compatibility with other channel types. + + Actual direct messages do not really have the concept of permissions. + + This returns all the :meth:`Permissions.private_channel` permissions set to ``True``. + + Parameters + ---------- + obj: :class:`User` + The user to check permissions for. This parameter is ignored + but kept for compatibility with other ``permissions_for`` methods. + + ignore_timeout: :class:`bool` + Whether to ignore the guild timeout when checking permsisions. + This parameter is ignored but kept for compatibility with other ``permissions_for`` methods. + + Returns + ------- + :class:`Permissions` + The resolved permissions. + """ + return Permissions.private_channel() + + def get_partial_message(self, message_id: int, /) -> PartialMessage: + """Creates a :class:`PartialMessage` from the given message ID. + + This is useful if you want to work with a message and only have its ID without + doing an unnecessary API call. + + .. versionadded:: 1.6 + + Parameters + ---------- + message_id: :class:`int` + The message ID to create a partial message for. + + Returns + ------- + :class:`PartialMessage` + The partial message object. + """ + from .message import PartialMessage + + return PartialMessage(channel=self, id=message_id) + + +class GroupChannel(disnake.abc.Messageable, Hashable): + """Represents a Discord group channel. + + .. container:: operations + + .. describe:: x == y + + Checks if two channels are equal. + + .. describe:: x != y + + Checks if two channels are not equal. + + .. describe:: hash(x) + + Returns the channel's hash. + + .. describe:: str(x) + + Returns a string representation of the channel + + Attributes + ---------- + recipients: List[:class:`User`] + The users you are participating with in the group channel. + me: :class:`ClientUser` + The user presenting yourself. + id: :class:`int` + The group channel ID. + owner: Optional[:class:`User`] + The user that owns the group channel. + owner_id: :class:`int` + The owner ID that owns the group channel. + + .. versionadded:: 2.0 + + name: Optional[:class:`str`] + The group channel's name if provided. + """ + + __slots__ = ("id", "recipients", "owner_id", "owner", "_icon", "name", "me", "_state") + + def __init__(self, *, me: ClientUser, state: ConnectionState, data: GroupChannelPayload): + self._state: ConnectionState = state + self.id: int = int(data["id"]) + self.me: ClientUser = me + self._update_group(data) + + def _update_group(self, data: GroupChannelPayload) -> None: + self.owner_id: Optional[int] = utils._get_as_snowflake(data, "owner_id") + self._icon: Optional[str] = data.get("icon") + self.name: Optional[str] = data.get("name") + self.recipients: List[User] = [ + self._state.store_user(u) for u in data.get("recipients", []) + ] + + self.owner: Optional[BaseUser] + if self.owner_id == self.me.id: + self.owner = self.me + else: + self.owner = utils.find(lambda u: u.id == self.owner_id, self.recipients) + + async def _get_channel(self): + return self + + def __str__(self) -> str: + if self.name: + return self.name + + if len(self.recipients) == 0: + return "Unnamed" + + return ", ".join(map(lambda x: x.name, self.recipients)) + + def __repr__(self) -> str: + return f"" + + @property + def type(self) -> ChannelType: + """:class:`ChannelType`: The channel's Discord type.""" + return ChannelType.group + + @property + def icon(self) -> Optional[Asset]: + """Optional[:class:`Asset`]: Returns the channel's icon asset if available.""" + if self._icon is None: + return None + return Asset._from_icon(self._state, self.id, self._icon, path="channel") + + @property + def created_at(self) -> datetime.datetime: + """:class:`datetime.datetime`: Returns the channel's creation time in UTC.""" + return utils.snowflake_time(self.id) + + def permissions_for( + self, + obj: Snowflake, + /, + *, + ignore_timeout: bool = MISSING, + ) -> Permissions: + """Handles permission resolution for a :class:`User`. + + This function is there for compatibility with other channel types. + + Actual direct messages do not really have the concept of permissions. + + This returns all the :meth:`Permissions.private_channel` permissions set to ``True``. + + This also checks the kick_members permission if the user is the owner. + + Parameters + ---------- + obj: :class:`~disnake.abc.Snowflake` + The user to check permissions for. + + ignore_timeout: :class:`bool` + Whether to ignore the guild timeout when checking permsisions. + This parameter is ignored but kept for compatibility with other ``permissions_for`` methods. + + Returns + ------- + :class:`Permissions` + The resolved permissions for the user. + """ + base = Permissions.private_channel() + + if obj.id == self.owner_id: + base.kick_members = True + + return base + + async def leave(self) -> None: + """|coro| + + Leaves the group. + + If you are the only one in the group, this deletes it as well. + + Raises + ------ + HTTPException + Leaving the group failed. + """ + await self._state.http.leave_group(self.id) + + +class PartialMessageable(disnake.abc.Messageable, Hashable): + """Represents a partial messageable to aid with working messageable channels when + only a channel ID is present. + + The only way to construct this class is through :meth:`Client.get_partial_messageable`. + + Note that this class is trimmed down and has no rich attributes. + + .. versionadded:: 2.0 + + .. container:: operations + + .. describe:: x == y + + Checks if two partial messageables are equal. + + .. describe:: x != y + + Checks if two partial messageables are not equal. + + .. describe:: hash(x) + + Returns the partial messageable's hash. + + Attributes + ---------- + id: :class:`int` + The channel ID associated with this partial messageable. + type: Optional[:class:`ChannelType`] + The channel type associated with this partial messageable, if given. + """ + + def __init__(self, state: ConnectionState, id: int, type: Optional[ChannelType] = None): + self._state: ConnectionState = state + self.id: int = id + self.type: Optional[ChannelType] = type + + async def _get_channel(self) -> PartialMessageable: + return self + + def get_partial_message(self, message_id: int, /) -> PartialMessage: + """Creates a :class:`PartialMessage` from the given message ID. + + This is useful if you want to work with a message and only have its ID without + doing an unnecessary API call. + + Parameters + ---------- + message_id: :class:`int` + The message ID to create a partial message for. + + Returns + ------- + :class:`PartialMessage` + The partial message object. + """ + from .message import PartialMessage + + return PartialMessage(channel=self, id=message_id) + + +def _guild_channel_factory(channel_type: int): + value = try_enum(ChannelType, channel_type) + if value is ChannelType.text: + return TextChannel, value + elif value is ChannelType.voice: + return VoiceChannel, value + elif value is ChannelType.category: + return CategoryChannel, value + elif value is ChannelType.news: + return TextChannel, value + elif value is ChannelType.stage_voice: + return StageChannel, value + elif value is ChannelType.forum: + return ForumChannel, value + else: + return None, value + + +def _channel_factory(channel_type: int): + cls, value = _guild_channel_factory(channel_type) + if value is ChannelType.private: + return DMChannel, value + elif value is ChannelType.group: + return GroupChannel, value + else: + return cls, value + + +def _threaded_channel_factory(channel_type: int): + cls, value = _channel_factory(channel_type) + if value in (ChannelType.private_thread, ChannelType.public_thread, ChannelType.news_thread): + return Thread, value + return cls, value + + +def _threaded_guild_channel_factory(channel_type: int): + cls, value = _guild_channel_factory(channel_type) + if value in (ChannelType.private_thread, ChannelType.public_thread, ChannelType.news_thread): + return Thread, value + return cls, value + + +def _channel_type_factory( + cls: Union[Type[disnake.abc.GuildChannel], Type[Thread]] +) -> List[ChannelType]: + return { + disnake.abc.GuildChannel: list(ChannelType.__members__.values()), + VocalGuildChannel: [ChannelType.voice, ChannelType.stage_voice], + disnake.abc.PrivateChannel: [ChannelType.private, ChannelType.group], + TextChannel: [ChannelType.text, ChannelType.news], + DMChannel: [ChannelType.private], + VoiceChannel: [ChannelType.voice], + GroupChannel: [ChannelType.group], + CategoryChannel: [ChannelType.category], + NewsChannel: [ChannelType.news], + Thread: [ChannelType.news_thread, ChannelType.public_thread, ChannelType.private_thread], + StageChannel: [ChannelType.stage_voice], + ForumChannel: [ChannelType.forum], + }.get(cls, []) diff --git a/sbsheriff/Lib/site-packages/disnake/client.py b/sbsheriff/Lib/site-packages/disnake/client.py new file mode 100644 index 0000000..80e7bb2 --- /dev/null +++ b/sbsheriff/Lib/site-packages/disnake/client.py @@ -0,0 +1,2504 @@ +""" +The MIT License (MIT) + +Copyright (c) 2015-2021 Rapptz +Copyright (c) 2021-present Disnake Development + +Permission is hereby granted, free of charge, to any person obtaining a +copy of this software and associated documentation files (the "Software"), +to deal in the Software without restriction, including without limitation +the rights to use, copy, modify, merge, publish, distribute, sublicense, +and/or sell copies of the Software, and to permit persons to whom the +Software is furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS +OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER +DEALINGS IN THE SOFTWARE. +""" + +from __future__ import annotations + +import asyncio +import logging +import signal +import sys +import traceback +from datetime import datetime, timedelta +from typing import ( + TYPE_CHECKING, + Any, + Callable, + Coroutine, + Dict, + Generator, + List, + Literal, + Optional, + Sequence, + Tuple, + TypeVar, + Union, + overload, +) + +import aiohttp + +from . import utils +from .activity import ActivityTypes, BaseActivity, create_activity +from .app_commands import ( + APIMessageCommand, + APISlashCommand, + APIUserCommand, + ApplicationCommand, + GuildApplicationCommandPermissions, +) +from .appinfo import AppInfo +from .backoff import ExponentialBackoff +from .channel import PartialMessageable, _threaded_channel_factory +from .emoji import Emoji +from .enums import ApplicationCommandType, ChannelType, Status +from .errors import * +from .flags import ApplicationFlags, Intents +from .gateway import * +from .guild import Guild +from .guild_preview import GuildPreview +from .http import HTTPClient +from .i18n import LocalizationProtocol, LocalizationStore +from .invite import Invite +from .iterators import GuildIterator +from .mentions import AllowedMentions +from .object import Object +from .stage_instance import StageInstance +from .state import ConnectionState +from .sticker import GuildSticker, StandardSticker, StickerPack, _sticker_factory +from .template import Template +from .threads import Thread +from .ui.view import View +from .user import ClientUser, User +from .utils import MISSING +from .voice_client import VoiceClient +from .voice_region import VoiceRegion +from .webhook import Webhook +from .widget import Widget + +if TYPE_CHECKING: + from .abc import GuildChannel, PrivateChannel, Snowflake, SnowflakeTime + from .app_commands import APIApplicationCommand + from .asset import AssetBytes + from .channel import DMChannel + from .member import Member + from .message import Message + from .types.gateway import SessionStartLimit as SessionStartLimitPayload + from .voice_client import VoiceProtocol + + +__all__ = ("Client", "SessionStartLimit") + +Coro = TypeVar("Coro", bound=Callable[..., Coroutine[Any, Any, Any]]) + + +_log = logging.getLogger(__name__) + + +def _cancel_tasks(loop: asyncio.AbstractEventLoop) -> None: + tasks = {t for t in asyncio.all_tasks(loop=loop) if not t.done()} + + if not tasks: + return + + _log.info("Cleaning up after %d tasks.", len(tasks)) + for task in tasks: + task.cancel() + + loop.run_until_complete(asyncio.gather(*tasks, return_exceptions=True)) + _log.info("All tasks finished cancelling.") + + for task in tasks: + if task.cancelled(): + continue + if task.exception() is not None: + loop.call_exception_handler( + { + "message": "Unhandled exception during Client.run shutdown.", + "exception": task.exception(), + "task": task, + } + ) + + +def _cleanup_loop(loop: asyncio.AbstractEventLoop) -> None: + try: + _cancel_tasks(loop) + loop.run_until_complete(loop.shutdown_asyncgens()) + finally: + _log.info("Closing the event loop.") + loop.close() + + +class SessionStartLimit: + """A class that contains information about the current session start limit, + at the time when the client connected for the first time. + + .. versionadded:: 2.5 + + Attributes + ---------- + total: :class:`int` + The total number of allowed session starts. + remaining: :class:`int` + The remaining number of allowed session starts. + reset_after: :class:`int` + The number of milliseconds after which the :attr:`.remaining` limit resets, + relative to when the client connected. + See also :attr:`reset_time`. + max_concurrency: :class:`int` + The number of allowed ``IDENTIFY`` requests per 5 seconds. + reset_time: :class:`datetime.datetime` + The approximate time at which which the :attr:`.remaining` limit resets. + """ + + __slots__: Tuple[str, ...] = ( + "total", + "remaining", + "reset_after", + "max_concurrency", + "reset_time", + ) + + def __init__(self, data: SessionStartLimitPayload): + self.total: int = data["total"] + self.remaining: int = data["remaining"] + self.reset_after: int = data["reset_after"] + self.max_concurrency: int = data["max_concurrency"] + + self.reset_time: datetime = utils.utcnow() + timedelta(milliseconds=self.reset_after) + + def __repr__(self): + return ( + f"" + ) + + +class Client: + """ + Represents a client connection that connects to Discord. + This class is used to interact with the Discord WebSocket and API. + + A number of options can be passed to the :class:`Client`. + + Parameters + ---------- + max_messages: Optional[:class:`int`] + The maximum number of messages to store in the internal message cache. + This defaults to ``1000``. Passing in ``None`` disables the message cache. + + .. versionchanged:: 1.3 + Allow disabling the message cache and change the default size to ``1000``. + loop: Optional[:class:`asyncio.AbstractEventLoop`] + The :class:`asyncio.AbstractEventLoop` to use for asynchronous operations. + Defaults to ``None``, in which case the default event loop is used via + :func:`asyncio.get_event_loop()`. + connector: Optional[:class:`aiohttp.BaseConnector`] + The connector to use for connection pooling. + proxy: Optional[:class:`str`] + Proxy URL. + proxy_auth: Optional[:class:`aiohttp.BasicAuth`] + An object that represents proxy HTTP Basic Authorization. + shard_id: Optional[:class:`int`] + Integer starting at ``0`` and less than :attr:`.shard_count`. + shard_count: Optional[:class:`int`] + The total number of shards. + application_id: :class:`int` + The client's application ID. + intents: :class:`Intents` + The intents that you want to enable for the session. This is a way of + disabling and enabling certain gateway events from triggering and being sent. + If not given, defaults to a regularly constructed :class:`Intents` class. + + .. versionadded:: 1.5 + + member_cache_flags: :class:`MemberCacheFlags` + Allows for finer control over how the library caches members. + If not given, defaults to cache as much as possible with the + currently selected intents. + + .. versionadded:: 1.5 + + chunk_guilds_at_startup: :class:`bool` + Indicates if :func:`.on_ready` should be delayed to chunk all guilds + at start-up if necessary. This operation is incredibly slow for large + amounts of guilds. The default is ``True`` if :attr:`Intents.members` + is ``True``. + + .. versionadded:: 1.5 + + status: Optional[:class:`.Status`] + A status to start your presence with upon logging on to Discord. + activity: Optional[:class:`.BaseActivity`] + An activity to start your presence with upon logging on to Discord. + allowed_mentions: Optional[:class:`AllowedMentions`] + Control how the client handles mentions by default on every message sent. + + .. versionadded:: 1.4 + + heartbeat_timeout: :class:`float` + The maximum numbers of seconds before timing out and restarting the + WebSocket in the case of not receiving a HEARTBEAT_ACK. Useful if + processing the initial packets take too long to the point of disconnecting + you. The default timeout is 60 seconds. + guild_ready_timeout: :class:`float` + The maximum number of seconds to wait for the GUILD_CREATE stream to end before + preparing the member cache and firing READY. The default timeout is 2 seconds. + + .. versionadded:: 1.4 + + assume_unsync_clock: :class:`bool` + Whether to assume the system clock is unsynced. This applies to the ratelimit handling + code. If this is set to ``True``, the default, then the library uses the time to reset + a rate limit bucket given by Discord. If this is ``False`` then your system clock is + used to calculate how long to sleep for. If this is set to ``False`` it is recommended to + sync your system clock to Google's NTP server. + + .. versionadded:: 1.3 + + enable_debug_events: :class:`bool` + Whether to enable events that are useful only for debugging gateway related information. + + Right now this involves :func:`on_socket_raw_receive` and :func:`on_socket_raw_send`. If + this is ``False`` then those events will not be dispatched (due to performance considerations). + To enable these events, this must be set to ``True``. Defaults to ``False``. + + .. versionadded:: 2.0 + + test_guilds: List[:class:`int`] + The list of IDs of the guilds where you're going to test your application commands. + Defaults to ``None``, which means global registration of commands across + all guilds. + + .. versionadded:: 2.1 + + sync_commands: :class:`bool` + Whether to enable automatic synchronization of application commands in your code. + Defaults to ``True``, which means that commands in API are automatically synced + with the commands specified in your code. + + .. versionadded:: 2.1 + + sync_commands_debug: :class:`bool` + Whether to always show sync debug logs (uses ``INFO`` log level if it's enabled, prints otherwise). + If disabled, uses the default ``DEBUG`` log level which isn't shown unless the log level is changed manually. + Useful for tracking the commands being registered in the API. + + .. versionadded:: 2.1 + + .. versionchanged:: 2.4 + Changes the log level of corresponding messages from ``DEBUG`` to ``INFO`` or ``print``\\s them, + instead of controlling whether they are enabled at all. + + localization_provider: :class:`.LocalizationProtocol` + An implementation of :class:`.LocalizationProtocol` to use for localization of + application commands. + If not provided, the default :class:`.LocalizationStore` implementation is used. + + .. versionadded:: 2.5 + + strict_localization: :class:`bool` + Whether to raise an exception when localizations for a specific key couldn't be found. + This is mainly useful for testing/debugging, consider disabling this eventually + as missing localized names will automatically fall back to the default/base name without it. + Only applicable if the ``localization_provider`` parameter is not provided. + Defaults to ``False``. + + .. versionadded:: 2.5 + + Attributes + ---------- + ws + The websocket gateway the client is currently connected to. Could be ``None``. + loop: :class:`asyncio.AbstractEventLoop` + The event loop that the client uses for asynchronous operations. + asyncio_debug: :class:`bool` + Whether to enable asyncio debugging when the client starts. + Defaults to False. + session_start_limit: Optional[:class:`SessionStartLimit`] + Information about the current session start limit. + Only available after initiating the connection. + + .. versionadded:: 2.5 + i18n: :class:`.LocalizationProtocol` + An implementation of :class:`.LocalizationProtocol` used for localization of + application commands. + + .. versionadded:: 2.5 + """ + + def __init__( + self, + *, + asyncio_debug: bool = False, + loop: Optional[asyncio.AbstractEventLoop] = None, + **options: Any, + ): + # self.ws is set in the connect method + self.ws: DiscordWebSocket = None # type: ignore + self.loop: asyncio.AbstractEventLoop = asyncio.get_event_loop() if loop is None else loop + self.loop.set_debug(asyncio_debug) + self._listeners: Dict[str, List[Tuple[asyncio.Future, Callable[..., bool]]]] = {} + self.shard_id: Optional[int] = options.get("shard_id") + self.shard_count: Optional[int] = options.get("shard_count") + self.session_start_limit: Optional[SessionStartLimit] = None + + connector: Optional[aiohttp.BaseConnector] = options.pop("connector", None) + proxy: Optional[str] = options.pop("proxy", None) + proxy_auth: Optional[aiohttp.BasicAuth] = options.pop("proxy_auth", None) + unsync_clock: bool = options.pop("assume_unsync_clock", True) + self.http: HTTPClient = HTTPClient( + connector, proxy=proxy, proxy_auth=proxy_auth, unsync_clock=unsync_clock, loop=self.loop + ) + + self._handlers: Dict[str, Callable] = { + "ready": self._handle_ready, + "connect_internal": self._handle_first_connect, + } + + self._hooks: Dict[str, Callable] = {"before_identify": self._call_before_identify_hook} + + self._enable_debug_events: bool = options.pop("enable_debug_events", False) + self._connection: ConnectionState = self._get_state(**options) + self._connection.shard_count = self.shard_count + self._closed: bool = False + self._ready: asyncio.Event = asyncio.Event() + self._first_connect: asyncio.Event = asyncio.Event() + self._connection._get_websocket = self._get_websocket + self._connection._get_client = lambda: self + + if VoiceClient.warn_nacl: + VoiceClient.warn_nacl = False + _log.warning("PyNaCl is not installed, voice will NOT be supported") + + i18n_strict: bool = options.pop("strict_localization", False) + i18n = options.pop("localization_provider", None) + if i18n is None: + i18n = LocalizationStore(strict=i18n_strict) + self.i18n: LocalizationProtocol = i18n + + # internals + + def _get_websocket( + self, guild_id: Optional[int] = None, *, shard_id: Optional[int] = None + ) -> DiscordWebSocket: + return self.ws + + def _get_state(self, **options: Any) -> ConnectionState: + return ConnectionState( + dispatch=self.dispatch, + handlers=self._handlers, + hooks=self._hooks, + http=self.http, + loop=self.loop, + **options, + ) + + def _handle_ready(self) -> None: + self._ready.set() + + def _handle_first_connect(self) -> None: + if self._first_connect.is_set(): + return + self._first_connect.set() + + @property + def latency(self) -> float: + """:class:`float`: Measures latency between a HEARTBEAT and a HEARTBEAT_ACK in seconds. + + This could be referred to as the Discord WebSocket protocol latency. + """ + ws = self.ws + return float("nan") if not ws else ws.latency + + def is_ws_ratelimited(self) -> bool: + """Whether the websocket is currently rate limited. + + This can be useful to know when deciding whether you should query members + using HTTP or via the gateway. + + .. versionadded:: 1.6 + + :return type: :class:`bool` + """ + if self.ws: + return self.ws.is_ratelimited() + return False + + @property + def user(self) -> ClientUser: + """Optional[:class:`.ClientUser`]: Represents the connected client. ``None`` if not logged in.""" + return self._connection.user + + @property + def guilds(self) -> List[Guild]: + """List[:class:`.Guild`]: The guilds that the connected client is a member of.""" + return self._connection.guilds + + @property + def emojis(self) -> List[Emoji]: + """List[:class:`.Emoji`]: The emojis that the connected client has.""" + return self._connection.emojis + + @property + def stickers(self) -> List[GuildSticker]: + """List[:class:`.GuildSticker`]: The stickers that the connected client has. + + .. versionadded:: 2.0 + """ + return self._connection.stickers + + @property + def cached_messages(self) -> Sequence[Message]: + """Sequence[:class:`.Message`]: Read-only list of messages the connected client has cached. + + .. versionadded:: 1.1 + """ + return utils.SequenceProxy(self._connection._messages or []) + + @property + def private_channels(self) -> List[PrivateChannel]: + """List[:class:`.abc.PrivateChannel`]: The private channels that the connected client is participating on. + + .. note:: + + This returns only up to 128 most recent private channels due to an internal working + on how Discord deals with private channels. + """ + return self._connection.private_channels + + @property + def voice_clients(self) -> List[VoiceProtocol]: + """List[:class:`.VoiceProtocol`]: Represents a list of voice connections. + + These are usually :class:`.VoiceClient` instances. + """ + return self._connection.voice_clients + + @property + def application_id(self) -> int: + """Optional[:class:`int`]: The client's application ID. + + If this is not passed via ``__init__`` then this is retrieved + through the gateway when an event contains the data. Usually + after :func:`~disnake.on_connect` is called. + + .. versionadded:: 2.0 + """ + return self._connection.application_id # type: ignore + + @property + def application_flags(self) -> ApplicationFlags: + """:class:`~disnake.ApplicationFlags`: The client's application flags. + + .. versionadded:: 2.0 + """ + return self._connection.application_flags + + @property + def global_application_commands(self) -> List[APIApplicationCommand]: + """List[Union[:class:`.APIUserCommand`, :class:`.APIMessageCommand`, :class:`.APISlashCommand`]: The client's global application commands.""" + return list(self._connection._global_application_commands.values()) + + @property + def global_slash_commands(self) -> List[APISlashCommand]: + """List[:class:`.APISlashCommand`]: The client's global slash commands.""" + return [ + cmd + for cmd in self._connection._global_application_commands.values() + if isinstance(cmd, APISlashCommand) + ] + + @property + def global_user_commands(self) -> List[APIUserCommand]: + """List[:class:`.APIUserCommand`]: The client's global user commands.""" + return [ + cmd + for cmd in self._connection._global_application_commands.values() + if isinstance(cmd, APIUserCommand) + ] + + @property + def global_message_commands(self) -> List[APIMessageCommand]: + """List[:class:`.APIMessageCommand`]: The client's global message commands.""" + return [ + cmd + for cmd in self._connection._global_application_commands.values() + if isinstance(cmd, APIMessageCommand) + ] + + def get_message(self, id: int) -> Optional[Message]: + """Gets the message with the given ID from the bot's message cache. + + Parameters + ---------- + id: :class:`int` + The ID of the message to look for. + + Returns + ------- + Optional[:class:`.Message`] + The corresponding message. + """ + return utils.get(self.cached_messages, id=id) + + @overload + async def get_or_fetch_user( + self, user_id: int, *, strict: Literal[False] = ... + ) -> Optional[User]: + ... + + @overload + async def get_or_fetch_user(self, user_id: int, *, strict: Literal[True]) -> User: + ... + + async def get_or_fetch_user(self, user_id: int, *, strict: bool = False) -> Optional[User]: + """|coro| + + Tries to get the user from the cache. If fails, it tries to + fetch the user from the API. + + Parameters + ---------- + user_id: :class:`int` + The ID to search for. + + Returns + ------- + :class:`~disnake.User` + The user with the given ID + """ + user = self.get_user(user_id) + if user is not None: + return user + try: + user = await self.fetch_user(user_id) + except Exception: + if strict: + raise + return None + return user + + getch_user = get_or_fetch_user + + def is_ready(self) -> bool: + """Whether the client's internal cache is ready for use. + + :return type: :class:`bool` + """ + return self._ready.is_set() + + async def _run_event( + self, + coro: Callable[..., Coroutine[Any, Any, Any]], + event_name: str, + *args: Any, + **kwargs: Any, + ) -> None: + try: + await coro(*args, **kwargs) + except asyncio.CancelledError: + pass + except Exception: + try: + await self.on_error(event_name, *args, **kwargs) + except asyncio.CancelledError: + pass + + def _schedule_event( + self, + coro: Callable[..., Coroutine[Any, Any, Any]], + event_name: str, + *args: Any, + **kwargs: Any, + ) -> asyncio.Task: + wrapped = self._run_event(coro, event_name, *args, **kwargs) + # Schedules the task + return asyncio.create_task(wrapped, name=f"disnake: {event_name}") + + def dispatch(self, event: str, *args: Any, **kwargs: Any) -> None: + _log.debug("Dispatching event %s", event) + method = "on_" + event + + listeners = self._listeners.get(event) + if listeners: + removed = [] + for i, (future, condition) in enumerate(listeners): + if future.cancelled(): + removed.append(i) + continue + + try: + result = condition(*args) + except Exception as exc: + future.set_exception(exc) + removed.append(i) + else: + if result: + if len(args) == 0: + future.set_result(None) + elif len(args) == 1: + future.set_result(args[0]) + else: + future.set_result(args) + removed.append(i) + + if len(removed) == len(listeners): + self._listeners.pop(event) + else: + for idx in reversed(removed): + del listeners[idx] + + try: + coro = getattr(self, method) + except AttributeError: + pass + else: + self._schedule_event(coro, method, *args, **kwargs) + + async def on_error(self, event_method: str, *args: Any, **kwargs: Any) -> None: + """|coro| + + The default error handler provided by the client. + + By default this prints to :data:`sys.stderr` however it could be + overridden to have a different implementation. + Check :func:`~disnake.on_error` for more details. + """ + print(f"Ignoring exception in {event_method}", file=sys.stderr) + traceback.print_exc() + + # hooks + + async def _call_before_identify_hook( + self, shard_id: Optional[int], *, initial: bool = False + ) -> None: + # This hook is an internal hook that actually calls the public one. + # It allows the library to have its own hook without stepping on the + # toes of those who need to override their own hook. + await self.before_identify_hook(shard_id, initial=initial) + + async def before_identify_hook(self, shard_id: Optional[int], *, initial: bool = False) -> None: + """|coro| + + A hook that is called before IDENTIFYing a session. This is useful + if you wish to have more control over the synchronization of multiple + IDENTIFYing clients. + + The default implementation sleeps for 5 seconds. + + .. versionadded:: 1.4 + + Parameters + ---------- + shard_id: :class:`int` + The shard ID that requested being IDENTIFY'd + initial: :class:`bool` + Whether this IDENTIFY is the first initial IDENTIFY. + """ + if not initial: + await asyncio.sleep(5.0) + + # login state management + + async def login(self, token: str) -> None: + """|coro| + + Logs in the client with the specified credentials. + + Parameters + ---------- + token: :class:`str` + The authentication token. Do not prefix this token with + anything as the library will do it for you. + + Raises + ------ + LoginFailure + The wrong credentials are passed. + HTTPException + An unknown HTTP related error occurred, + usually when it isn't 200 or the known incorrect credentials + passing status code. + """ + _log.info("logging in using static token") + if not isinstance(token, str): + raise TypeError(f"token must be of type str, got {type(token).__name__} instead") + + data = await self.http.static_login(token.strip()) + self._connection.user = ClientUser(state=self._connection, data=data) + + async def connect(self, *, reconnect: bool = True) -> None: + """|coro| + + Creates a websocket connection and lets the websocket listen + to messages from Discord. This is a loop that runs the entire + event system and miscellaneous aspects of the library. Control + is not resumed until the WebSocket connection is terminated. + + Parameters + ---------- + reconnect: :class:`bool` + If we should attempt reconnecting, either due to internet + failure or a specific failure on Discord's part. Certain + disconnects that lead to bad state will not be handled (such as + invalid sharding payloads or bad tokens). + + Raises + ------ + GatewayNotFound + If the gateway to connect to Discord is not found. Usually if this + is thrown then there is a Discord API outage. + ConnectionClosed + The websocket connection has been terminated. + """ + _, gateway, session_start_limit = await self.http.get_bot_gateway() + self.session_start_limit = SessionStartLimit(session_start_limit) + + ws_params = { + "initial": True, + "shard_id": self.shard_id, + "gateway": gateway, + } + + backoff = ExponentialBackoff() + while not self.is_closed(): + try: + coro = DiscordWebSocket.from_client(self, **ws_params) + self.ws = await asyncio.wait_for(coro, timeout=60.0) + ws_params["initial"] = False + while True: + await self.ws.poll_event() + except ReconnectWebSocket as e: + _log.info("Got a request to %s the websocket.", e.op) + self.dispatch("disconnect") + ws_params.update( + sequence=self.ws.sequence, resume=e.resume, session=self.ws.session_id + ) + continue + except ( + OSError, + HTTPException, + GatewayNotFound, + ConnectionClosed, + aiohttp.ClientError, + asyncio.TimeoutError, + ) as exc: + + self.dispatch("disconnect") + if not reconnect: + await self.close() + if isinstance(exc, ConnectionClosed) and exc.code == 1000: + # clean close, don't re-raise this + return + raise + + if self.is_closed(): + return + + # If we get connection reset by peer then try to RESUME + if isinstance(exc, OSError) and exc.errno in (54, 10054): + ws_params.update( + sequence=self.ws.sequence, + initial=False, + resume=True, + session=self.ws.session_id, + ) + continue + + # We should only get this when an unhandled close code happens, + # such as a clean disconnect (1000) or a bad state (bad token, no sharding, etc) + # sometimes, Discord sends us 1000 for unknown reasons so we should reconnect + # regardless and rely on is_closed instead + if isinstance(exc, ConnectionClosed): + if exc.code == 4014: + raise PrivilegedIntentsRequired(exc.shard_id) from None + if exc.code != 1000: + await self.close() + raise + + retry = backoff.delay() + _log.exception("Attempting a reconnect in %.2fs", retry) + await asyncio.sleep(retry) + # Always try to RESUME the connection + # If the connection is not RESUME-able then the gateway will invalidate the session. + # This is apparently what the official Discord client does. + ws_params.update(sequence=self.ws.sequence, resume=True, session=self.ws.session_id) + + async def close(self) -> None: + """|coro| + + Closes the connection to Discord. + """ + if self._closed: + return + + self._closed = True + + for voice in self.voice_clients: + try: + await voice.disconnect(force=True) + except Exception: + # if an error happens during disconnects, disregard it. + pass + + if self.ws is not None and self.ws.open: + await self.ws.close(code=1000) + + await self.http.close() + self._ready.clear() + + def clear(self) -> None: + """Clears the internal state of the bot. + + After this, the bot can be considered "re-opened", i.e. :meth:`is_closed` + and :meth:`is_ready` both return ``False`` along with the bot's internal + cache cleared. + """ + self._closed = False + self._ready.clear() + self._connection.clear() + self.http.recreate() + + async def start(self, token: str, *, reconnect: bool = True) -> None: + """|coro| + + A shorthand coroutine for :meth:`login` + :meth:`connect`. + + Raises + ------ + TypeError + An unexpected keyword argument was received. + """ + await self.login(token) + await self.connect(reconnect=reconnect) + + def run(self, *args: Any, **kwargs: Any) -> None: + """A blocking call that abstracts away the event loop + initialisation from you. + + If you want more control over the event loop then this + function should not be used. Use :meth:`start` coroutine + or :meth:`connect` + :meth:`login`. + + Roughly Equivalent to: :: + + try: + loop.run_until_complete(start(*args, **kwargs)) + except KeyboardInterrupt: + loop.run_until_complete(close()) + # cancel all tasks lingering + finally: + loop.close() + + .. warning:: + + This function must be the last function to call due to the fact that it + is blocking. That means that registration of events or anything being + called after this function call will not execute until it returns. + """ + loop = self.loop + + try: + loop.add_signal_handler(signal.SIGINT, lambda: loop.stop()) + loop.add_signal_handler(signal.SIGTERM, lambda: loop.stop()) + except NotImplementedError: + pass + + async def runner(): + try: + await self.start(*args, **kwargs) + finally: + if not self.is_closed(): + await self.close() + + def stop_loop_on_completion(f): + loop.stop() + + future = asyncio.ensure_future(runner(), loop=loop) + future.add_done_callback(stop_loop_on_completion) + try: + loop.run_forever() + except KeyboardInterrupt: + _log.info("Received signal to terminate bot and event loop.") + finally: + future.remove_done_callback(stop_loop_on_completion) + _log.info("Cleaning up tasks.") + _cleanup_loop(loop) + + if not future.cancelled(): + try: + return future.result() + except KeyboardInterrupt: + # I am unsure why this gets raised here but suppress it anyway + return None + + # properties + + def is_closed(self) -> bool: + """Whether the websocket connection is closed. + + :return type: :class:`bool` + """ + return self._closed + + @property + def activity(self) -> Optional[ActivityTypes]: + """Optional[:class:`.BaseActivity`]: The activity being used upon logging in.""" + return create_activity(self._connection._activity, state=self._connection) + + @activity.setter + def activity(self, value: Optional[ActivityTypes]) -> None: + if value is None: + self._connection._activity = None + elif isinstance(value, BaseActivity): + # ConnectionState._activity is typehinted as ActivityPayload, we're passing Dict[str, Any] + self._connection._activity = value.to_dict() # type: ignore + else: + raise TypeError("activity must derive from BaseActivity.") + + @property + def status(self): + """:class:`.Status`: The status being used upon logging on to Discord. + + .. versionadded:: 2.0 + """ + if self._connection._status in set(state.value for state in Status): + return Status(self._connection._status) + return Status.online + + @status.setter + def status(self, value): + if value is Status.offline: + self._connection._status = "invisible" + elif isinstance(value, Status): + self._connection._status = str(value) + else: + raise TypeError("status must derive from Status.") + + @property + def allowed_mentions(self) -> Optional[AllowedMentions]: + """Optional[:class:`~disnake.AllowedMentions`]: The allowed mention configuration. + + .. versionadded:: 1.4 + """ + return self._connection.allowed_mentions + + @allowed_mentions.setter + def allowed_mentions(self, value: Optional[AllowedMentions]) -> None: + if value is None or isinstance(value, AllowedMentions): + self._connection.allowed_mentions = value + else: + raise TypeError(f"allowed_mentions must be AllowedMentions not {value.__class__!r}") + + @property + def intents(self) -> Intents: + """:class:`~disnake.Intents`: The intents configured for this connection. + + .. versionadded:: 1.5 + """ + return self._connection.intents + + # helpers/getters + + @property + def users(self) -> List[User]: + """List[:class:`~disnake.User`]: Returns a list of all the users the bot can see.""" + return list(self._connection._users.values()) + + def get_channel(self, id: int, /) -> Optional[Union[GuildChannel, Thread, PrivateChannel]]: + """Returns a channel or thread with the given ID. + + Parameters + ---------- + id: :class:`int` + The ID to search for. + + Returns + ------- + Optional[Union[:class:`.abc.GuildChannel`, :class:`.Thread`, :class:`.abc.PrivateChannel`]] + The returned channel or ``None`` if not found. + """ + return self._connection.get_channel(id) + + def get_partial_messageable( + self, id: int, *, type: Optional[ChannelType] = None + ) -> PartialMessageable: + """Returns a partial messageable with the given channel ID. + + This is useful if you have a channel_id but don't want to do an API call + to send messages to it. + + .. versionadded:: 2.0 + + Parameters + ---------- + id: :class:`int` + The channel ID to create a partial messageable for. + type: Optional[:class:`.ChannelType`] + The underlying channel type for the partial messageable. + + Returns + ------- + :class:`.PartialMessageable` + The partial messageable + """ + return PartialMessageable(state=self._connection, id=id, type=type) + + def get_stage_instance(self, id: int, /) -> Optional[StageInstance]: + """Returns a stage instance with the given stage channel ID. + + .. versionadded:: 2.0 + + Parameters + ---------- + id: :class:`int` + The ID to search for. + + Returns + ------- + Optional[:class:`.StageInstance`] + The returns stage instance or ``None`` if not found. + """ + from .channel import StageChannel + + channel = self._connection.get_channel(id) + + if isinstance(channel, StageChannel): + return channel.instance + + def get_guild(self, id: int, /) -> Optional[Guild]: + """Returns a guild with the given ID. + + Parameters + ---------- + id: :class:`int` + The ID to search for. + + Returns + ------- + Optional[:class:`.Guild`] + The guild or ``None`` if not found. + """ + return self._connection._get_guild(id) + + def get_user(self, id: int, /) -> Optional[User]: + """Returns a user with the given ID. + + Parameters + ---------- + id: :class:`int` + The ID to search for. + + Returns + ------- + Optional[:class:`~disnake.User`] + The user or ``None`` if not found. + """ + return self._connection.get_user(id) + + def get_emoji(self, id: int, /) -> Optional[Emoji]: + """Returns an emoji with the given ID. + + Parameters + ---------- + id: :class:`int` + The ID to search for. + + Returns + ------- + Optional[:class:`.Emoji`] + The custom emoji or ``None`` if not found. + """ + return self._connection.get_emoji(id) + + def get_sticker(self, id: int, /) -> Optional[GuildSticker]: + """Returns a guild sticker with the given ID. + + .. versionadded:: 2.0 + + .. note:: + + To retrieve standard stickers, use :meth:`.fetch_sticker`. + or :meth:`.fetch_premium_sticker_packs`. + + Returns + ------- + Optional[:class:`.GuildSticker`] + The sticker or ``None`` if not found. + """ + return self._connection.get_sticker(id) + + def get_all_channels(self) -> Generator[GuildChannel, None, None]: + """A generator that retrieves every :class:`.abc.GuildChannel` the client can 'access'. + + This is equivalent to: :: + + for guild in client.guilds: + for channel in guild.channels: + yield channel + + .. note:: + + Just because you receive a :class:`.abc.GuildChannel` does not mean that + you can communicate in said channel. :meth:`.abc.GuildChannel.permissions_for` should + be used for that. + + Yields + ------ + :class:`.abc.GuildChannel` + A channel the client can 'access'. + """ + for guild in self.guilds: + yield from guild.channels + + def get_all_members(self) -> Generator[Member, None, None]: + """Returns a generator with every :class:`.Member` the client can see. + + This is equivalent to: :: + + for guild in client.guilds: + for member in guild.members: + yield member + + Yields + ------ + :class:`.Member` + A member the client can see. + """ + for guild in self.guilds: + yield from guild.members + + def get_guild_application_commands(self, guild_id: int) -> List[APIApplicationCommand]: + """Returns a list of all application commands in the guild with the given ID. + + Parameters + ---------- + guild_id: :class:`int` + The ID to search for. + + Returns + ------- + List[Union[:class:`.APIUserCommand`, :class:`.APIMessageCommand`, :class:`.APISlashCommand`]] + The list of application commands. + """ + data = self._connection._guild_application_commands.get(guild_id, {}) + return list(data.values()) + + def get_guild_slash_commands(self, guild_id: int) -> List[APISlashCommand]: + """ + Returns a list of all slash commands in the guild with the given ID. + + Parameters + ---------- + guild_id: :class:`int` + The ID to search for. + + Returns + ------- + List[:class:`.APISlashCommand`] + The list of slash commands. + """ + data = self._connection._guild_application_commands.get(guild_id, {}) + return [cmd for cmd in data.values() if isinstance(cmd, APISlashCommand)] + + def get_guild_user_commands(self, guild_id: int) -> List[APIUserCommand]: + """ + Returns a list of all user commands in the guild with the given ID. + + Parameters + ---------- + guild_id: :class:`int` + The ID to search for. + + Returns + ------- + List[:class:`.APIUserCommand`] + The list of user commands. + """ + data = self._connection._guild_application_commands.get(guild_id, {}) + return [cmd for cmd in data.values() if isinstance(cmd, APIUserCommand)] + + def get_guild_message_commands(self, guild_id: int) -> List[APIMessageCommand]: + """ + Returns a list of all message commands in the guild with the given ID. + + Parameters + ---------- + guild_id: :class:`int` + The ID to search for. + + Returns + ------- + List[:class:`.APIMessageCommand`] + The list of message commands. + """ + data = self._connection._guild_application_commands.get(guild_id, {}) + return [cmd for cmd in data.values() if isinstance(cmd, APIMessageCommand)] + + def get_global_command(self, id: int) -> Optional[APIApplicationCommand]: + """ + Returns a global application command with the given ID. + + Parameters + ---------- + id: :class:`int` + The ID to search for. + + Returns + ------- + Optional[Union[:class:`.APIUserCommand`, :class:`.APIMessageCommand`, :class:`.APISlashCommand`]] + The application command. + """ + return self._connection._get_global_application_command(id) + + def get_guild_command(self, guild_id: int, id: int) -> Optional[APIApplicationCommand]: + """ + Returns a guild application command with the given guild ID and application command ID. + + Parameters + ---------- + guild_id: :class:`int` + The guild ID to search for. + id: :class:`int` + The command ID to search for. + + Returns + ------- + Optional[Union[:class:`.APIUserCommand`, :class:`.APIMessageCommand`, :class:`.APISlashCommand`]] + The application command. + """ + return self._connection._get_guild_application_command(guild_id, id) + + def get_global_command_named( + self, name: str, cmd_type: ApplicationCommandType = None + ) -> Optional[APIApplicationCommand]: + """ + Returns a global application command matching the given name. + + Parameters + ---------- + name: :class:`str` + The name to look for. + cmd_type: :class:`.ApplicationCommandType` + The type to look for. By default, no types are checked. + + Returns + ------- + Optional[Union[:class:`.APIUserCommand`, :class:`.APIMessageCommand`, :class:`.APISlashCommand`]] + The application command. + """ + return self._connection._get_global_command_named(name, cmd_type) + + def get_guild_command_named( + self, guild_id: int, name: str, cmd_type: ApplicationCommandType = None + ) -> Optional[APIApplicationCommand]: + """ + Returns a guild application command matching the given name. + + Parameters + ---------- + guild_id: :class:`int` + The guild ID to search for. + name: :class:`str` + The command name to search for. + cmd_type: :class:`.ApplicationCommandType` + The type to look for. By default, no types are checked. + + Returns + ------- + Optional[Union[:class:`.APIUserCommand`, :class:`.APIMessageCommand`, :class:`.APISlashCommand`]] + The application command. + """ + return self._connection._get_guild_command_named(guild_id, name, cmd_type) + + # listeners/waiters + + async def wait_until_ready(self) -> None: + """|coro| + + Waits until the client's internal cache is all ready. + """ + await self._ready.wait() + + async def wait_until_first_connect(self) -> None: + """|coro| + + Waits until the first connect. + """ + await self._first_connect.wait() + + def wait_for( + self, + event: str, + *, + check: Optional[Callable[..., bool]] = None, + timeout: Optional[float] = None, + ) -> Any: + """|coro| + + Waits for a WebSocket event to be dispatched. + + This could be used to wait for a user to reply to a message, + or to react to a message, or to edit a message in a self-contained + way. + + The ``timeout`` parameter is passed onto :func:`asyncio.wait_for`. By default, + it does not timeout. Note that this does propagate the + :exc:`asyncio.TimeoutError` for you in case of timeout and is provided for + ease of use. + + In case the event returns multiple arguments, a :class:`tuple` containing those + arguments is returned instead. Please check the + :ref:`documentation ` for a list of events and their + parameters. + + This function returns the **first event that meets the requirements**. + + Examples + -------- + + Waiting for a user reply: :: + + @client.event + async def on_message(message): + if message.content.startswith('$greet'): + channel = message.channel + await channel.send('Say hello!') + + def check(m): + return m.content == 'hello' and m.channel == channel + + msg = await client.wait_for('message', check=check) + await channel.send(f'Hello {msg.author}!') + + Waiting for a thumbs up reaction from the message author: :: + + @client.event + async def on_message(message): + if message.content.startswith('$thumb'): + channel = message.channel + await channel.send('Send me that \N{THUMBS UP SIGN} reaction, mate') + + def check(reaction, user): + return user == message.author and str(reaction.emoji) == '\N{THUMBS UP SIGN}' + + try: + reaction, user = await client.wait_for('reaction_add', timeout=60.0, check=check) + except asyncio.TimeoutError: + await channel.send('\N{THUMBS DOWN SIGN}') + else: + await channel.send('\N{THUMBS UP SIGN}') + + + Parameters + ---------- + event: :class:`str` + The event name, similar to the :ref:`event reference `, + but without the ``on_`` prefix, to wait for. + check: Optional[Callable[..., :class:`bool`]] + A predicate to check what to wait for. The arguments must meet the + parameters of the event being waited for. + timeout: Optional[:class:`float`] + The number of seconds to wait before timing out and raising + :exc:`asyncio.TimeoutError`. + + Raises + ------ + asyncio.TimeoutError + If a timeout is provided and it was reached. + + Returns + ------- + Any + Returns no arguments, a single argument, or a :class:`tuple` of multiple + arguments that mirrors the parameters passed in the + :ref:`event reference `. + """ + future = self.loop.create_future() + if check is None: + + def _check(*args): + return True + + check = _check + + ev = event.lower() + try: + listeners = self._listeners[ev] + except KeyError: + listeners = [] + self._listeners[ev] = listeners + + listeners.append((future, check)) + return asyncio.wait_for(future, timeout) + + # event registration + + def event(self, coro: Coro) -> Coro: + """A decorator that registers an event to listen to. + + You can find more info about the events on the :ref:`documentation below `. + + The events must be a :ref:`coroutine `, if not, :exc:`TypeError` is raised. + + Example + --------- + + .. code-block:: python3 + + @client.event + async def on_ready(): + print('Ready!') + + Raises + ------ + TypeError + The coroutine passed is not actually a coroutine. + """ + if not asyncio.iscoroutinefunction(coro): + raise TypeError("event registered must be a coroutine function") + + setattr(self, coro.__name__, coro) + _log.debug("%s has successfully been registered as an event", coro.__name__) + return coro + + async def change_presence( + self, + *, + activity: Optional[BaseActivity] = None, + status: Optional[Status] = None, + ): + """|coro| + + Changes the client's presence. + + Example + --------- + + .. code-block:: python3 + + game = disnake.Game("with the API") + await client.change_presence(status=disnake.Status.idle, activity=game) + + .. versionchanged:: 2.0 + Removed the ``afk`` keyword-only parameter. + + Parameters + ---------- + activity: Optional[:class:`.BaseActivity`] + The activity being done. ``None`` if no currently active activity is done. + status: Optional[:class:`.Status`] + Indicates what status to change to. If ``None``, then + :attr:`.Status.online` is used. + + Raises + ------ + InvalidArgument + If the ``activity`` parameter is not the proper type. + """ + if status is None: + status_str = "online" + status = Status.online + elif status is Status.offline: + status_str = "invisible" + status = Status.offline + else: + status_str = str(status) + + await self.ws.change_presence(activity=activity, status=status_str) + + for guild in self._connection.guilds: + me = guild.me + if me is None: + continue + + if activity is not None: + me.activities = (activity,) # type: ignore + else: + me.activities = () + + me.status = status + + # Guild stuff + + def fetch_guilds( + self, + *, + limit: Optional[int] = 100, + before: SnowflakeTime = None, + after: SnowflakeTime = None, + ) -> GuildIterator: + """Retrieves an :class:`.AsyncIterator` that enables receiving your guilds. + + .. note:: + + Using this, you will only receive :attr:`.Guild.owner`, :attr:`.Guild.icon`, + :attr:`.Guild.id`, and :attr:`.Guild.name` per :class:`.Guild`. + + .. note:: + + This method is an API call. For general usage, consider :attr:`guilds` instead. + + Examples + -------- + + Usage :: + + async for guild in client.fetch_guilds(limit=150): + print(guild.name) + + Flattening into a list :: + + guilds = await client.fetch_guilds(limit=150).flatten() + # guilds is now a list of Guild... + + All parameters are optional. + + Parameters + ---------- + limit: Optional[:class:`int`] + The number of guilds to retrieve. + If ``None``, it retrieves every guild you have access to. Note, however, + that this would make it a slow operation. + Defaults to ``100``. + before: Union[:class:`.abc.Snowflake`, :class:`datetime.datetime`] + Retrieves guilds before this date or object. + If a datetime is provided, it is recommended to use a UTC aware datetime. + If the datetime is naive, it is assumed to be local time. + after: Union[:class:`.abc.Snowflake`, :class:`datetime.datetime`] + Retrieve guilds after this date or object. + If a datetime is provided, it is recommended to use a UTC aware datetime. + If the datetime is naive, it is assumed to be local time. + + Raises + ------ + HTTPException + Retrieving the guilds failed. + + Yields + -------- + :class:`.Guild` + The guild with the guild data parsed. + """ + return GuildIterator(self, limit=limit, before=before, after=after) + + async def fetch_template(self, code: Union[Template, str]) -> Template: + """|coro| + + Retrieves a :class:`.Template` from a discord.new URL or code. + + Parameters + ---------- + code: Union[:class:`.Template`, :class:`str`] + The Discord Template Code or URL (must be a discord.new URL). + + Raises + ------ + NotFound + The template is invalid. + HTTPException + Retrieving the template failed. + + Returns + ------- + :class:`.Template` + The template from the URL/code. + """ + code = utils.resolve_template(code) + data = await self.http.get_template(code) + return Template(data=data, state=self._connection) + + async def fetch_guild(self, guild_id: int, /) -> Guild: + """|coro| + + Retrieves a :class:`.Guild` from the given ID. + + .. note:: + + Using this, you will **not** receive :attr:`.Guild.channels`, :attr:`.Guild.members`, + :attr:`.Member.activity` and :attr:`.Member.voice` per :class:`.Member`. + + .. note:: + + This method is an API call. For general usage, consider :meth:`get_guild` instead. + + Parameters + ---------- + guild_id: :class:`int` + The ID of the guild to retrieve. + + Raises + ------ + Forbidden + You do not have access to the guild. + HTTPException + Retrieving the guild failed. + + Returns + ------- + :class:`.Guild` + The guild from the given ID. + """ + data = await self.http.get_guild(guild_id) + return Guild(data=data, state=self._connection) + + async def fetch_guild_preview( + self, + guild_id: int, + /, + ) -> GuildPreview: + """|coro| + + Retrieves a :class:`.GuildPreview` from the given ID. Your bot does not have to be in this guild. + + .. note:: + + This method may fetch any guild that has ``DISCOVERABLE`` in :attr:`.Guild.features`, + but this information can not be known ahead of time. + + This will work for any guild that you are in. + + Parameters + ---------- + guild_id: :class:`int` + The ID of the guild to to retrieve a preview object. + + Raises + ------ + NotFound + Retrieving the guild preview failed. + + Returns + ------- + :class:`.GuildPreview` + The guild preview from the given ID. + """ + data = await self.http.get_guild_preview(guild_id) + return GuildPreview(data=data, state=self._connection) + + async def create_guild( + self, + *, + name: str, + icon: AssetBytes = MISSING, + code: str = MISSING, + ) -> Guild: + """|coro| + + Creates a :class:`.Guild`. + + Bot accounts in more than 10 guilds are not allowed to create guilds. + + .. versionchanged:: 2.5 + Removed the ``region`` parameter. + + Parameters + ---------- + name: :class:`str` + The name of the guild. + icon: |resource_type| + The icon of the guild. + See :meth:`.ClientUser.edit` for more details on what is expected. + + .. versionchanged:: 2.5 + Now accepts various resource types in addition to :class:`bytes`. + + code: :class:`str` + The code for a template to create the guild with. + + .. versionadded:: 1.4 + + Raises + ------ + NotFound + The ``icon`` asset couldn't be found. + HTTPException + Guild creation failed. + InvalidArgument + Invalid icon image format given. Must be PNG or JPG. + TypeError + The ``icon`` asset is a lottie sticker (see :func:`Sticker.read `). + + Returns + ------- + :class:`.Guild` + The created guild. This is not the same guild that is + added to cache. + """ + if icon is not MISSING: + icon_base64 = await utils._assetbytes_to_base64_data(icon) + else: + icon_base64 = None + + if code: + data = await self.http.create_from_template(code, name, icon_base64) + else: + data = await self.http.create_guild(name, icon_base64) + return Guild(data=data, state=self._connection) + + async def fetch_stage_instance(self, channel_id: int, /) -> StageInstance: + """|coro| + + Retrieves a :class:`.StageInstance` with the given ID. + + .. note:: + + This method is an API call. For general usage, consider :meth:`get_stage_instance` instead. + + .. versionadded:: 2.0 + + Parameters + ---------- + channel_id: :class:`int` + The stage channel ID. + + Raises + ------ + NotFound + The stage instance or channel could not be found. + HTTPException + Retrieving the stage instance failed. + + Returns + ------- + :class:`.StageInstance` + The stage instance from the given ID. + """ + data = await self.http.get_stage_instance(channel_id) + guild = self.get_guild(int(data["guild_id"])) + return StageInstance(guild=guild, state=self._connection, data=data) # type: ignore + + # Invite management + + async def fetch_invite( + self, + url: Union[Invite, str], + *, + with_counts: bool = True, + with_expiration: bool = True, + guild_scheduled_event_id: Optional[int] = None, + ) -> Invite: + """|coro| + + Retrieves an :class:`.Invite` from a discord.gg URL or ID. + + .. note:: + + If the invite is for a guild you have not joined, the guild and channel + attributes of the returned :class:`.Invite` will be :class:`.PartialInviteGuild` and + :class:`.PartialInviteChannel` respectively. + + Parameters + ---------- + url: Union[:class:`.Invite`, :class:`str`] + The Discord invite ID or URL (must be a discord.gg URL). + with_counts: :class:`bool` + Whether to include count information in the invite. This fills the + :attr:`.Invite.approximate_member_count` and :attr:`.Invite.approximate_presence_count` + fields. + with_expiration: :class:`bool` + Whether to include the expiration date of the invite. This fills the + :attr:`.Invite.expires_at` field. + + .. versionadded:: 2.0 + + guild_scheduled_event_id: :class:`int` + The ID of the scheduled event to include in the invite. + If not provided, defaults to the ``event`` parameter in the URL if it exists, + or the ID of the scheduled event contained in the provided invite object. + + .. versionadded:: 2.3 + + Raises + ------ + NotFound + The invite has expired or is invalid. + HTTPException + Retrieving the invite failed. + + Returns + ------- + :class:`.Invite` + The invite from the URL/ID. + """ + invite_id, params = utils.resolve_invite(url, with_params=True) + + if not guild_scheduled_event_id: + # keep scheduled event ID from invite url/object + if "event" in params: + guild_scheduled_event_id = int(params["event"]) + elif isinstance(url, Invite) and url.guild_scheduled_event: + guild_scheduled_event_id = url.guild_scheduled_event.id + + data = await self.http.get_invite( + invite_id, + with_counts=with_counts, + with_expiration=with_expiration, + guild_scheduled_event_id=guild_scheduled_event_id, + ) + return Invite.from_incomplete(state=self._connection, data=data) + + async def delete_invite(self, invite: Union[Invite, str]) -> None: + """|coro| + + Revokes an :class:`.Invite`, URL, or ID to an invite. + + You must have :attr:`~.Permissions.manage_channels` permission in + the associated guild to do this. + + Parameters + ---------- + invite: Union[:class:`.Invite`, :class:`str`] + The invite to revoke. + + Raises + ------ + Forbidden + You do not have permissions to revoke invites. + NotFound + The invite is invalid or expired. + HTTPException + Revoking the invite failed. + """ + invite_id = utils.resolve_invite(invite) + await self.http.delete_invite(invite_id) + + # Voice region stuff + + async def fetch_voice_regions(self, guild_id: Optional[int] = None) -> List[VoiceRegion]: + """Retrieves a list of :class:`.VoiceRegion`\\s. + + Retrieves voice regions for the user, or a guild if provided. + + .. versionadded:: 2.5 + + Parameters + ---------- + guild_id: Optional[:class:`int`] + The guild to get regions for, if provided. + + Raises + ------ + HTTPException + Retrieving voice regions failed. + NotFound + The provided ``guild_id`` could not be found. + """ + if guild_id: + regions = await self.http.get_guild_voice_regions(guild_id) + else: + regions = await self.http.get_voice_regions() + return [VoiceRegion(data=data) for data in regions] + + # Miscellaneous stuff + + async def fetch_widget(self, guild_id: int, /) -> Widget: + """|coro| + + Retrieves a :class:`.Widget` for the given guild ID. + + .. note:: + + The guild must have the widget enabled to get this information. + + Parameters + ---------- + guild_id: :class:`int` + The ID of the guild. + + Raises + ------ + Forbidden + The widget for this guild is disabled. + HTTPException + Retrieving the widget failed. + + Returns + ------- + :class:`.Widget` + The guild's widget. + """ + data = await self.http.get_widget(guild_id) + return Widget(state=self._connection, data=data) + + async def application_info(self) -> AppInfo: + """|coro| + + Retrieves the bot's application information. + + Raises + ------ + HTTPException + Retrieving the information failed somehow. + + Returns + ------- + :class:`.AppInfo` + The bot's application information. + """ + data = await self.http.application_info() + if "rpc_origins" not in data: + data["rpc_origins"] = None + return AppInfo(self._connection, data) + + async def fetch_user(self, user_id: int, /) -> User: + """|coro| + + Retrieves a :class:`~disnake.User` based on their ID. + You do not have to share any guilds with the user to get this information, + however many operations do require that you do. + + .. note:: + + This method is an API call. If you have :attr:`disnake.Intents.members` and member cache enabled, consider :meth:`get_user` instead. + + Parameters + ---------- + user_id: :class:`int` + The ID of the user to retrieve. + + Raises + ------ + NotFound + A user with this ID does not exist. + HTTPException + Retrieving the user failed. + + Returns + ------- + :class:`~disnake.User` + The user you requested. + """ + data = await self.http.get_user(user_id) + return User(state=self._connection, data=data) + + async def fetch_channel( + self, + channel_id: int, + /, + ) -> Union[GuildChannel, PrivateChannel, Thread]: + """|coro| + + Retrieves a :class:`.abc.GuildChannel`, :class:`.abc.PrivateChannel`, or :class:`.Thread` with the specified ID. + + .. note:: + + This method is an API call. For general usage, consider :meth:`get_channel` instead. + + .. versionadded:: 1.2 + + Parameters + ---------- + channel_id: :class:`int` + The ID of the channel to retrieve. + + Raises + ------ + InvalidData + An unknown channel type was received from Discord. + HTTPException + Retrieving the channel failed. + NotFound + Invalid Channel ID. + Forbidden + You do not have permission to fetch this channel. + + Returns + ------- + Union[:class:`.abc.GuildChannel`, :class:`.abc.PrivateChannel`, :class:`.Thread`] + The channel from the ID. + """ + data = await self.http.get_channel(channel_id) + + factory, ch_type = _threaded_channel_factory(data["type"]) + if factory is None: + raise InvalidData("Unknown channel type {type} for channel ID {id}.".format_map(data)) + + if ch_type in (ChannelType.group, ChannelType.private): + # the factory will be a DMChannel or GroupChannel here + channel = factory(me=self.user, data=data, state=self._connection) # type: ignore + else: + # the factory can't be a DMChannel or GroupChannel here + guild_id = int(data["guild_id"]) # type: ignore + guild = self.get_guild(guild_id) or Object(id=guild_id) + # GuildChannels expect a Guild, we may be passing an Object + channel = factory(guild=guild, state=self._connection, data=data) # type: ignore + + return channel + + async def fetch_webhook(self, webhook_id: int, /) -> Webhook: + """|coro| + + Retrieves a :class:`.Webhook` with the given ID. + + Parameters + ---------- + webhook_id: :class:`int` + The ID of the webhook to retrieve. + + Raises + ------ + HTTPException + Retrieving the webhook failed. + NotFound + Invalid webhook ID. + Forbidden + You do not have permission to fetch this webhook. + + Returns + ------- + :class:`.Webhook` + The webhook you requested. + """ + data = await self.http.get_webhook(webhook_id) + return Webhook.from_state(data, state=self._connection) + + async def fetch_sticker(self, sticker_id: int, /) -> Union[StandardSticker, GuildSticker]: + """|coro| + + Retrieves a :class:`.Sticker` with the given ID. + + .. versionadded:: 2.0 + + Parameters + ---------- + sticker_id: :class:`int` + The ID of the sticker to retrieve. + + Raises + ------ + HTTPException + Retrieving the sticker failed. + NotFound + Invalid sticker ID. + + Returns + ------- + Union[:class:`.StandardSticker`, :class:`.GuildSticker`] + The sticker you requested. + """ + data = await self.http.get_sticker(sticker_id) + cls, _ = _sticker_factory(data["type"]) # type: ignore + return cls(state=self._connection, data=data) # type: ignore + + async def fetch_premium_sticker_packs(self) -> List[StickerPack]: + """|coro| + + Retrieves all available premium sticker packs. + + .. versionadded:: 2.0 + + Raises + ------ + HTTPException + Retrieving the sticker packs failed. + + Returns + ------- + List[:class:`.StickerPack`] + All available premium sticker packs. + """ + data = await self.http.list_premium_sticker_packs() + return [StickerPack(state=self._connection, data=pack) for pack in data["sticker_packs"]] + + async def create_dm(self, user: Snowflake) -> DMChannel: + """|coro| + + Creates a :class:`.DMChannel` with the given user. + + This should be rarely called, as this is done transparently for most + people. + + .. versionadded:: 2.0 + + Parameters + ---------- + user: :class:`~disnake.abc.Snowflake` + The user to create a DM with. + + Returns + ------- + :class:`.DMChannel` + The channel that was created. + """ + state = self._connection + found = state._get_private_channel_by_user(user.id) + if found: + return found + + data = await state.http.start_private_message(user.id) + return state.add_dm_channel(data) + + def add_view(self, view: View, *, message_id: Optional[int] = None) -> None: + """Registers a :class:`~disnake.ui.View` for persistent listening. + + This method should be used for when a view is comprised of components + that last longer than the lifecycle of the program. + + .. versionadded:: 2.0 + + Parameters + ---------- + view: :class:`disnake.ui.View` + The view to register for dispatching. + message_id: Optional[:class:`int`] + The message ID that the view is attached to. This is currently used to + refresh the view's state during message update events. If not given + then message update events are not propagated for the view. + + Raises + ------ + TypeError + A view was not passed. + ValueError + The view is not persistent. A persistent view has no timeout + and all their components have an explicitly provided custom_id. + """ + if not isinstance(view, View): + raise TypeError(f"expected an instance of View not {view.__class__!r}") + + if not view.is_persistent(): + raise ValueError( + "View is not persistent. Items need to have a custom_id set and View must have no timeout" + ) + + self._connection.store_view(view, message_id) + + @property + def persistent_views(self) -> Sequence[View]: + """Sequence[:class:`.View`]: A sequence of persistent views added to the client. + + .. versionadded:: 2.0 + """ + return self._connection.persistent_views + + # Application commands (global) + + async def fetch_global_commands( + self, + *, + with_localizations: bool = True, + ) -> List[APIApplicationCommand]: + """|coro| + + Retrieves a list of global application commands. + + .. versionadded:: 2.1 + + Parameters + ---------- + with_localizations: :class:`bool` + Whether to include localizations in the response. Defaults to ``True``. + + .. versionadded:: 2.5 + + Returns + ------- + List[Union[:class:`.APIUserCommand`, :class:`.APIMessageCommand`, :class:`.APISlashCommand`]] + A list of application commands. + """ + return await self._connection.fetch_global_commands(with_localizations=with_localizations) + + async def fetch_global_command(self, command_id: int) -> APIApplicationCommand: + """|coro| + + Retrieves a global application command. + + .. versionadded:: 2.1 + + Parameters + ---------- + command_id: :class:`int` + The ID of the command to retrieve. + + Returns + ------- + Union[:class:`.APIUserCommand`, :class:`.APIMessageCommand`, :class:`.APISlashCommand`] + The requested application command. + """ + return await self._connection.fetch_global_command(command_id) + + async def create_global_command( + self, application_command: ApplicationCommand + ) -> APIApplicationCommand: + """|coro| + + Creates a global application command. + + .. versionadded:: 2.1 + + Parameters + ---------- + application_command: :class:`.ApplicationCommand` + An object representing the application command to create. + + Returns + ------- + Union[:class:`.APIUserCommand`, :class:`.APIMessageCommand`, :class:`.APISlashCommand`] + The application command that was created. + """ + application_command.localize(self.i18n) + return await self._connection.create_global_command(application_command) + + async def edit_global_command( + self, command_id: int, new_command: ApplicationCommand + ) -> APIApplicationCommand: + """|coro| + + Edits a global application command. + + .. versionadded:: 2.1 + + Parameters + ---------- + command_id: :class:`int` + The ID of the application command to edit. + new_command: :class:`.ApplicationCommand` + An object representing the edited application command. + + Returns + ------- + Union[:class:`.APIUserCommand`, :class:`.APIMessageCommand`, :class:`.APISlashCommand`] + The edited application command. + """ + new_command.localize(self.i18n) + return await self._connection.edit_global_command(command_id, new_command) + + async def delete_global_command(self, command_id: int) -> None: + """|coro| + + Deletes a global application command. + + .. versionadded:: 2.1 + + Parameters + ---------- + command_id: :class:`int` + The ID of the application command to delete. + """ + return await self._connection.delete_global_command(command_id) + + async def bulk_overwrite_global_commands( + self, application_commands: List[ApplicationCommand] + ) -> List[APIApplicationCommand]: + """|coro| + + Overwrites several global application commands in one API request. + + .. versionadded:: 2.1 + + Parameters + ---------- + application_commands: List[:class:`.ApplicationCommand`] + A list of application commands to insert instead of the existing commands. + + Returns + ------- + List[Union[:class:`.APIUserCommand`, :class:`.APIMessageCommand`, :class:`.APISlashCommand`]] + A list of registered application commands. + """ + for cmd in application_commands: + cmd.localize(self.i18n) + return await self._connection.bulk_overwrite_global_commands(application_commands) + + # Application commands (guild) + + async def fetch_guild_commands( + self, + guild_id: int, + *, + with_localizations: bool = True, + ) -> List[APIApplicationCommand]: + """|coro| + + Retrieves a list of guild application commands. + + .. versionadded:: 2.1 + + Parameters + ---------- + guild_id: :class:`int` + The ID of the guild to fetch commands from. + with_localizations: :class:`bool` + Whether to include localizations in the response. Defaults to ``True``. + + .. versionadded:: 2.5 + + Returns + ------- + List[Union[:class:`.APIUserCommand`, :class:`.APIMessageCommand`, :class:`.APISlashCommand`]] + A list of application commands. + """ + return await self._connection.fetch_guild_commands( + guild_id, with_localizations=with_localizations + ) + + async def fetch_guild_command(self, guild_id: int, command_id: int) -> APIApplicationCommand: + """|coro| + + Retrieves a guild application command. + + .. versionadded:: 2.1 + + Parameters + ---------- + guild_id: :class:`int` + The ID of the guild to fetch command from. + command_id: :class:`int` + The ID of the application command to retrieve. + + Returns + ------- + Union[:class:`.APIUserCommand`, :class:`.APIMessageCommand`, :class:`.APISlashCommand`] + The requested application command. + """ + return await self._connection.fetch_guild_command(guild_id, command_id) + + async def create_guild_command( + self, guild_id: int, application_command: ApplicationCommand + ) -> APIApplicationCommand: + """|coro| + + Creates a guild application command. + + .. versionadded:: 2.1 + + Parameters + ---------- + guild_id: :class:`int` + The ID of the guild where the application command should be created. + application_command: :class:`.ApplicationCommand` + The application command. + + Returns + ------- + Union[:class:`.APIUserCommand`, :class:`.APIMessageCommand`, :class:`.APISlashCommand`] + The newly created application command. + """ + application_command.localize(self.i18n) + return await self._connection.create_guild_command(guild_id, application_command) + + async def edit_guild_command( + self, guild_id: int, command_id: int, new_command: ApplicationCommand + ) -> APIApplicationCommand: + """|coro| + + Edits a guild application command. + + .. versionadded:: 2.1 + + Parameters + ---------- + guild_id: :class:`int` + The ID of the guild where the application command should be edited. + command_id: :class:`int` + The ID of the application command to edit. + new_command: :class:`.ApplicationCommand` + An object representing the edited application command. + + Returns + ------- + Union[:class:`.APIUserCommand`, :class:`.APIMessageCommand`, :class:`.APISlashCommand`] + The newly edited application command. + """ + new_command.localize(self.i18n) + return await self._connection.edit_guild_command(guild_id, command_id, new_command) + + async def delete_guild_command(self, guild_id: int, command_id: int) -> None: + """|coro| + + Deletes a guild application command. + + .. versionadded:: 2.1 + + Parameters + ---------- + guild_id: :class:`int` + The ID of the guild where the applcation command should be deleted. + command_id: :class:`int` + The ID of the application command to delete. + """ + await self.http.delete_guild_command(self.application_id, guild_id, command_id) + + async def bulk_overwrite_guild_commands( + self, guild_id: int, application_commands: List[ApplicationCommand] + ) -> List[APIApplicationCommand]: + """|coro| + + Overwrites several guild application commands in one API request. + + .. versionadded:: 2.1 + + Parameters + ---------- + guild_id: :class:`int` + The ID of the guild where the application commands should be overwritten. + application_commands: List[:class:`.ApplicationCommand`] + A list of application commands to insert instead of the existing commands. + + Returns + ------- + List[Union[:class:`.APIUserCommand`, :class:`.APIMessageCommand`, :class:`.APISlashCommand`]] + A list of registered application commands. + """ + for cmd in application_commands: + cmd.localize(self.i18n) + return await self._connection.bulk_overwrite_guild_commands(guild_id, application_commands) + + # Application command permissions + + async def bulk_fetch_command_permissions( + self, guild_id: int + ) -> List[GuildApplicationCommandPermissions]: + """|coro| + + Retrieves a list of :class:`.GuildApplicationCommandPermissions` configured for the guild with the given ID. + + .. versionadded:: 2.1 + + Parameters + ---------- + guild_id: :class:`int` + The ID of the guild to inspect. + """ + return await self._connection.bulk_fetch_command_permissions(guild_id) + + async def fetch_command_permissions( + self, guild_id: int, command_id: int + ) -> GuildApplicationCommandPermissions: + """|coro| + + Retrieves :class:`.GuildApplicationCommandPermissions` for a specific application command in the guild with the given ID. + + .. versionadded:: 2.1 + + Parameters + ---------- + guild_id: :class:`int` + The ID of the guild to inspect. + command_id: :class:`int` + The ID of the application command, or the application ID to fetch application-wide permissions. + + .. versionchanged:: 2.5 + Can now also fetch application-wide permissions. + + Returns + ------- + :class:`.GuildApplicationCommandPermissions` + The permissions configured for the specified application command. + """ + return await self._connection.fetch_command_permissions(guild_id, command_id) diff --git a/sbsheriff/Lib/site-packages/disnake/colour.py b/sbsheriff/Lib/site-packages/disnake/colour.py new file mode 100644 index 0000000..321f62f --- /dev/null +++ b/sbsheriff/Lib/site-packages/disnake/colour.py @@ -0,0 +1,326 @@ +""" +The MIT License (MIT) + +Copyright (c) 2015-2021 Rapptz +Copyright (c) 2021-present Disnake Development + +Permission is hereby granted, free of charge, to any person obtaining a +copy of this software and associated documentation files (the "Software"), +to deal in the Software without restriction, including without limitation +the rights to use, copy, modify, merge, publish, distribute, sublicense, +and/or sell copies of the Software, and to permit persons to whom the +Software is furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS +OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER +DEALINGS IN THE SOFTWARE. +""" + +import colorsys +import random +from typing import Any, Optional, Tuple, Type, TypeVar, Union + +__all__ = ( + "Colour", + "Color", +) + +CT = TypeVar("CT", bound="Colour") + + +class Colour: + """Represents a Discord role colour. This class is similar + to a (red, green, blue) :class:`tuple`. + + There is an alias for this called Color. + + .. container:: operations + + .. describe:: x == y + + Checks if two colours are equal. + + .. describe:: x != y + + Checks if two colours are not equal. + + .. describe:: hash(x) + + Return the colour's hash. + + .. describe:: str(x) + + Returns the hex format for the colour. + + .. describe:: int(x) + + Returns the raw colour value. + + Attributes + ---------- + value: :class:`int` + The raw integer colour value. + """ + + __slots__ = ("value",) + + def __init__(self, value: int): + if not isinstance(value, int): + raise TypeError(f"Expected int parameter, received {value.__class__.__name__} instead.") + + self.value: int = value + + def _get_byte(self, byte: int) -> int: + return (self.value >> (8 * byte)) & 0xFF + + def __eq__(self, other: Any) -> bool: + return isinstance(other, Colour) and self.value == other.value + + def __ne__(self, other: Any) -> bool: + return not self.__eq__(other) + + def __str__(self) -> str: + return f"#{self.value:0>6x}" + + def __int__(self) -> int: + return self.value + + def __repr__(self) -> str: + return f"" + + def __hash__(self) -> int: + return hash(self.value) + + @property + def r(self) -> int: + """:class:`int`: Returns the red component of the colour.""" + return self._get_byte(2) + + @property + def g(self) -> int: + """:class:`int`: Returns the green component of the colour.""" + return self._get_byte(1) + + @property + def b(self) -> int: + """:class:`int`: Returns the blue component of the colour.""" + return self._get_byte(0) + + def to_rgb(self) -> Tuple[int, int, int]: + """Tuple[:class:`int`, :class:`int`, :class:`int`]: Returns an (r, g, b) tuple representing the colour.""" + return (self.r, self.g, self.b) + + @classmethod + def from_rgb(cls: Type[CT], r: int, g: int, b: int) -> CT: + """Constructs a :class:`Colour` from an RGB tuple.""" + return cls((r << 16) + (g << 8) + b) + + @classmethod + def from_hsv(cls: Type[CT], h: float, s: float, v: float) -> CT: + """Constructs a :class:`Colour` from an HSV tuple.""" + rgb = colorsys.hsv_to_rgb(h, s, v) + return cls.from_rgb(*(int(x * 255) for x in rgb)) + + @classmethod + def default(cls: Type[CT]) -> CT: + """A factory method that returns a :class:`Colour` with a value of ``0``.""" + return cls(0) + + @classmethod + def random( + cls: Type[CT], *, seed: Optional[Union[int, str, float, bytes, bytearray]] = None + ) -> CT: + """A factory method that returns a :class:`Colour` with a random hue. + + .. note:: + + The random algorithm works by choosing a colour with a random hue but + with maxed out saturation and value. + + .. versionadded:: 1.6 + + Parameters + ---------- + seed: Optional[Union[:class:`int`, :class:`str`, :class:`float`, :class:`bytes`, :class:`bytearray`]] + The seed to initialize the RNG with. If ``None`` is passed the default RNG is used. + + .. versionadded:: 1.7 + """ + rand = random if seed is None else random.Random(seed) + return cls.from_hsv(rand.random(), 1, 1) + + @classmethod + def teal(cls: Type[CT]) -> CT: + """A factory method that returns a :class:`Colour` with a value of ``0x1abc9c``.""" + return cls(0x1ABC9C) + + @classmethod + def dark_teal(cls: Type[CT]) -> CT: + """A factory method that returns a :class:`Colour` with a value of ``0x11806a``.""" + return cls(0x11806A) + + @classmethod + def brand_green(cls: Type[CT]) -> CT: + """A factory method that returns a :class:`Colour` with a value of ``0x57F287``. + + .. versionadded:: 2.0 + """ + return cls(0x57F287) + + @classmethod + def green(cls: Type[CT]) -> CT: + """A factory method that returns a :class:`Colour` with a value of ``0x2ecc71``.""" + return cls(0x2ECC71) + + @classmethod + def dark_green(cls: Type[CT]) -> CT: + """A factory method that returns a :class:`Colour` with a value of ``0x1f8b4c``.""" + return cls(0x1F8B4C) + + @classmethod + def blue(cls: Type[CT]) -> CT: + """A factory method that returns a :class:`Colour` with a value of ``0x3498db``.""" + return cls(0x3498DB) + + @classmethod + def dark_blue(cls: Type[CT]) -> CT: + """A factory method that returns a :class:`Colour` with a value of ``0x206694``.""" + return cls(0x206694) + + @classmethod + def purple(cls: Type[CT]) -> CT: + """A factory method that returns a :class:`Colour` with a value of ``0x9b59b6``.""" + return cls(0x9B59B6) + + @classmethod + def dark_purple(cls: Type[CT]) -> CT: + """A factory method that returns a :class:`Colour` with a value of ``0x71368a``.""" + return cls(0x71368A) + + @classmethod + def magenta(cls: Type[CT]) -> CT: + """A factory method that returns a :class:`Colour` with a value of ``0xe91e63``.""" + return cls(0xE91E63) + + @classmethod + def dark_magenta(cls: Type[CT]) -> CT: + """A factory method that returns a :class:`Colour` with a value of ``0xad1457``.""" + return cls(0xAD1457) + + @classmethod + def gold(cls: Type[CT]) -> CT: + """A factory method that returns a :class:`Colour` with a value of ``0xf1c40f``.""" + return cls(0xF1C40F) + + @classmethod + def dark_gold(cls: Type[CT]) -> CT: + """A factory method that returns a :class:`Colour` with a value of ``0xc27c0e``.""" + return cls(0xC27C0E) + + @classmethod + def orange(cls: Type[CT]) -> CT: + """A factory method that returns a :class:`Colour` with a value of ``0xe67e22``.""" + return cls(0xE67E22) + + @classmethod + def dark_orange(cls: Type[CT]) -> CT: + """A factory method that returns a :class:`Colour` with a value of ``0xa84300``.""" + return cls(0xA84300) + + @classmethod + def brand_red(cls: Type[CT]) -> CT: + """A factory method that returns a :class:`Colour` with a value of ``0xED4245``. + + .. versionadded:: 2.0 + """ + return cls(0xED4245) + + @classmethod + def red(cls: Type[CT]) -> CT: + """A factory method that returns a :class:`Colour` with a value of ``0xe74c3c``.""" + return cls(0xE74C3C) + + @classmethod + def dark_red(cls: Type[CT]) -> CT: + """A factory method that returns a :class:`Colour` with a value of ``0x992d22``.""" + return cls(0x992D22) + + @classmethod + def lighter_grey(cls: Type[CT]) -> CT: + """A factory method that returns a :class:`Colour` with a value of ``0x95a5a6``.""" + return cls(0x95A5A6) + + lighter_gray = lighter_grey + + @classmethod + def dark_grey(cls: Type[CT]) -> CT: + """A factory method that returns a :class:`Colour` with a value of ``0x607d8b``.""" + return cls(0x607D8B) + + dark_gray = dark_grey + + @classmethod + def light_grey(cls: Type[CT]) -> CT: + """A factory method that returns a :class:`Colour` with a value of ``0x979c9f``.""" + return cls(0x979C9F) + + light_gray = light_grey + + @classmethod + def darker_grey(cls: Type[CT]) -> CT: + """A factory method that returns a :class:`Colour` with a value of ``0x546e7a``.""" + return cls(0x546E7A) + + darker_gray = darker_grey + + @classmethod + def og_blurple(cls: Type[CT]) -> CT: + """A factory method that returns a :class:`Colour` with a value of ``0x7289da``.""" + return cls(0x7289DA) + + old_blurple = og_blurple + + @classmethod + def blurple(cls: Type[CT]) -> CT: + """A factory method that returns a :class:`Colour` with a value of ``0x5865F2``.""" + return cls(0x5865F2) + + @classmethod + def greyple(cls: Type[CT]) -> CT: + """A factory method that returns a :class:`Colour` with a value of ``0x99aab5``.""" + return cls(0x99AAB5) + + @classmethod + def dark_theme(cls: Type[CT]) -> CT: + """A factory method that returns a :class:`Colour` with a value of ``0x36393F``. + This will appear transparent on Discord's dark theme. + + .. versionadded:: 1.5 + """ + return cls(0x36393F) + + @classmethod + def fuchsia(cls: Type[CT]) -> CT: + """A factory method that returns a :class:`Colour` with a value of ``0xEB459E``. + + .. versionadded:: 2.0 + """ + return cls(0xEB459E) + + @classmethod + def yellow(cls: Type[CT]) -> CT: + """A factory method that returns a :class:`Colour` with a value of ``0xFEE75C``. + + .. versionadded:: 2.0 + """ + return cls(0xFEE75C) + + +Color = Colour diff --git a/sbsheriff/Lib/site-packages/disnake/components.py b/sbsheriff/Lib/site-packages/disnake/components.py new file mode 100644 index 0000000..b5d5304 --- /dev/null +++ b/sbsheriff/Lib/site-packages/disnake/components.py @@ -0,0 +1,491 @@ +""" +The MIT License (MIT) + +Copyright (c) 2015-2021 Rapptz +Copyright (c) 2021-present Disnake Development + +Permission is hereby granted, free of charge, to any person obtaining a +copy of this software and associated documentation files (the "Software"), +to deal in the Software without restriction, including without limitation +the rights to use, copy, modify, merge, publish, distribute, sublicense, +and/or sell copies of the Software, and to permit persons to whom the +Software is furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS +OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER +DEALINGS IN THE SOFTWARE. +""" + +from __future__ import annotations + +from typing import ( + TYPE_CHECKING, + Any, + ClassVar, + Dict, + List, + Optional, + Tuple, + Type, + TypeVar, + Union, + cast, +) + +from .enums import ButtonStyle, ComponentType, TextInputStyle, try_enum +from .partial_emoji import PartialEmoji, _EmojiTag +from .utils import MISSING, get_slots + +if TYPE_CHECKING: + from .emoji import Emoji + from .types.components import ( + ActionRow as ActionRowPayload, + ButtonComponent as ButtonComponentPayload, + Component as ComponentPayload, + SelectMenu as SelectMenuPayload, + SelectOption as SelectOptionPayload, + TextInput as TextInputPayload, + ) + + +__all__ = ( + "Component", + "ActionRow", + "Button", + "SelectMenu", + "SelectOption", + "TextInput", +) + +C = TypeVar("C", bound="Component") +NestedComponent = Union["Button", "SelectMenu", "TextInput"] + + +class Component: + """Represents a Discord Bot UI Kit Component. + + Currently, the only components supported by Discord are: + + - :class:`ActionRow` + - :class:`Button` + - :class:`SelectMenu` + - :class:`TextInput` + + This class is abstract and cannot be instantiated. + + .. versionadded:: 2.0 + + Attributes + ---------- + type: :class:`ComponentType` + The type of component. + """ + + __slots__: Tuple[str, ...] = ("type",) + + __repr_info__: ClassVar[Tuple[str, ...]] + type: ComponentType + + def __repr__(self) -> str: + attrs = " ".join(f"{key}={getattr(self, key)!r}" for key in self.__repr_info__) + return f"<{self.__class__.__name__} {attrs}>" + + @classmethod + def _raw_construct(cls: Type[C], **kwargs) -> C: + self: C = cls.__new__(cls) + for slot in get_slots(cls): + try: + value = kwargs[slot] + except KeyError: + pass + else: + setattr(self, slot, value) + return self + + def to_dict(self) -> Dict[str, Any]: + raise NotImplementedError + + +class ActionRow(Component): + """Represents an action row. + + This is a component that holds up to 5 children components in a row. + + This inherits from :class:`Component`. + + .. versionadded:: 2.0 + + Attributes + ---------- + type: :class:`ComponentType` + The type of component. + children: List[Union[:class:`Button`, :class:`SelectMenu`, :class:`TextInput`]] + The children components that this holds, if any. + """ + + __slots__: Tuple[str, ...] = ("children",) + + __repr_info__: ClassVar[Tuple[str, ...]] = __slots__ + + def __init__(self, data: ComponentPayload): + self.type: ComponentType = try_enum(ComponentType, data["type"]) + self.children: List[NestedComponent] = [ # type: ignore + _component_factory(d) for d in data.get("components", []) + ] + + def to_dict(self) -> ActionRowPayload: + return { + "type": int(self.type), + "components": [child.to_dict() for child in self.children], + } # type: ignore + + +class Button(Component): + """Represents a button from the Discord Bot UI Kit. + + This inherits from :class:`Component`. + + .. note:: + + The user constructible and usable type to create a button is :class:`disnake.ui.Button` + not this one. + + .. versionadded:: 2.0 + + Attributes + ---------- + style: :class:`.ButtonStyle` + The style of the button. + custom_id: Optional[:class:`str`] + The ID of the button that gets received during an interaction. + If this button is for a URL, it does not have a custom ID. + url: Optional[:class:`str`] + The URL this button sends you to. + disabled: :class:`bool` + Whether the button is disabled or not. + label: Optional[:class:`str`] + The label of the button, if any. + emoji: Optional[:class:`PartialEmoji`] + The emoji of the button, if available. + """ + + __slots__: Tuple[str, ...] = ( + "style", + "custom_id", + "url", + "disabled", + "label", + "emoji", + ) + + __repr_info__: ClassVar[Tuple[str, ...]] = __slots__ + + def __init__(self, data: ButtonComponentPayload): + self.type: ComponentType = try_enum(ComponentType, data["type"]) + self.style: ButtonStyle = try_enum(ButtonStyle, data["style"]) + self.custom_id: Optional[str] = data.get("custom_id") + self.url: Optional[str] = data.get("url") + self.disabled: bool = data.get("disabled", False) + self.label: Optional[str] = data.get("label") + self.emoji: Optional[PartialEmoji] + try: + self.emoji = PartialEmoji.from_dict(data["emoji"]) + except KeyError: + self.emoji = None + + def to_dict(self) -> ButtonComponentPayload: + payload = { + "type": 2, + "style": int(self.style), + "label": self.label, + "disabled": self.disabled, + } + if self.custom_id: + payload["custom_id"] = self.custom_id + + if self.url: + payload["url"] = self.url + + if self.emoji: + payload["emoji"] = self.emoji.to_dict() + + return payload # type: ignore + + +class SelectMenu(Component): + """Represents a select menu from the Discord Bot UI Kit. + + A select menu is functionally the same as a dropdown, however + on mobile it renders a bit differently. + + .. note:: + + The user constructible and usable type to create a select menu is + :class:`disnake.ui.Select` not this one. + + .. versionadded:: 2.0 + + Attributes + ---------- + custom_id: Optional[:class:`str`] + The ID of the select menu that gets received during an interaction. + placeholder: Optional[:class:`str`] + The placeholder text that is shown if nothing is selected, if any. + min_values: :class:`int` + The minimum number of items that must be chosen for this select menu. + Defaults to 1 and must be between 1 and 25. + max_values: :class:`int` + The maximum number of items that must be chosen for this select menu. + Defaults to 1 and must be between 1 and 25. + options: List[:class:`SelectOption`] + A list of options that can be selected in this select menu. + disabled: :class:`bool` + Whether the select menu is disabled or not. + """ + + __slots__: Tuple[str, ...] = ( + "custom_id", + "placeholder", + "min_values", + "max_values", + "options", + "disabled", + ) + + __repr_info__: ClassVar[Tuple[str, ...]] = __slots__ + + def __init__(self, data: SelectMenuPayload): + self.type = ComponentType.select + self.custom_id: str = data["custom_id"] + self.placeholder: Optional[str] = data.get("placeholder") + self.min_values: int = data.get("min_values", 1) + self.max_values: int = data.get("max_values", 1) + self.options: List[SelectOption] = [ + SelectOption.from_dict(option) for option in data.get("options", []) + ] + self.disabled: bool = data.get("disabled", False) + + def to_dict(self) -> SelectMenuPayload: + payload: SelectMenuPayload = { + "type": self.type.value, + "custom_id": self.custom_id, + "min_values": self.min_values, + "max_values": self.max_values, + "options": [op.to_dict() for op in self.options], + "disabled": self.disabled, + } + + if self.placeholder: + payload["placeholder"] = self.placeholder + + return payload + + +class SelectOption: + """Represents a select menu's option. + + These can be created by users. + + .. versionadded:: 2.0 + + Attributes + ---------- + label: :class:`str` + The label of the option. This is displayed to users. + Can only be up to 100 characters. + value: :class:`str` + The value of the option. This is not displayed to users. + If not provided when constructed then it defaults to the + label. Can only be up to 100 characters. + description: Optional[:class:`str`] + An additional description of the option, if any. + Can only be up to 100 characters. + emoji: Optional[Union[:class:`str`, :class:`Emoji`, :class:`PartialEmoji`]] + The emoji of the option, if available. + default: :class:`bool` + Whether this option is selected by default. + """ + + __slots__: Tuple[str, ...] = ( + "label", + "value", + "description", + "emoji", + "default", + ) + + def __init__( + self, + *, + label: str, + value: str = MISSING, + description: Optional[str] = None, + emoji: Optional[Union[str, Emoji, PartialEmoji]] = None, + default: bool = False, + ) -> None: + self.label = label + self.value = label if value is MISSING else value + self.description = description + + if emoji is not None: + if isinstance(emoji, str): + emoji = PartialEmoji.from_str(emoji) + elif isinstance(emoji, _EmojiTag): + emoji = emoji._to_partial() + else: + raise TypeError( + f"expected emoji to be str, Emoji, or PartialEmoji not {emoji.__class__}" + ) + + self.emoji = emoji + self.default = default + + def __repr__(self) -> str: + return ( + f"" + ) + + def __str__(self) -> str: + if self.emoji: + base = f"{self.emoji} {self.label}" + else: + base = self.label + + if self.description: + return f"{base}\n{self.description}" + return base + + @classmethod + def from_dict(cls, data: SelectOptionPayload) -> SelectOption: + try: + emoji = PartialEmoji.from_dict(data["emoji"]) + except KeyError: + emoji = None + + return cls( + label=data["label"], + value=data["value"], + description=data.get("description"), + emoji=emoji, + default=data.get("default", False), + ) + + def to_dict(self) -> SelectOptionPayload: + payload: SelectOptionPayload = { + "label": self.label, + "value": self.value, + "default": self.default, + } + + if self.emoji: + payload["emoji"] = self.emoji.to_dict() # type: ignore + + if self.description: + payload["description"] = self.description + + return payload + + +class TextInput(Component): + """Represents a text input from the Discord Bot UI Kit. + + .. versionadded:: 2.4 + + .. note:: + + The user constructible and usable type to create a text input is + :class:`disnake.ui.TextInput`, not this one. + + Attributes + ---------- + style: :class:`TextInputStyle` + The style of the text input. + label: Optional[:class:`str`] + The label of the text input. + custom_id: :class:`str` + The ID of the text input that gets received during an interaction. + placeholder: Optional[:class:`str`] + The placeholder text that is shown if nothing is entered. + value: Optional[:class:`str`] + The pre-filled text of the text input. + required: :class:`bool` + Whether the text input is required. Defaults to ``True``. + min_length: Optional[:class:`int`] + The minimum length of the text input. + max_length: Optional[:class:`int`] + The maximum length of the text input. + """ + + __slots__: Tuple[str, ...] = ( + "style", + "custom_id", + "label", + "placeholder", + "value", + "required", + "max_length", + "min_length", + ) + + __repr_info__: ClassVar[Tuple[str, ...]] = __slots__ + + def __init__(self, data: TextInputPayload) -> None: + style = data.get("style", TextInputStyle.short.value) + + self.type: ComponentType = try_enum(ComponentType, data["type"]) + self.custom_id: str = data["custom_id"] + self.style: TextInputStyle = try_enum(TextInputStyle, style) + self.label: Optional[str] = data.get("label") + self.placeholder: Optional[str] = data.get("placeholder") + self.value: Optional[str] = data.get("value") + self.required: bool = data.get("required", True) + self.min_length: Optional[int] = data.get("min_length") + self.max_length: Optional[int] = data.get("max_length") + + def to_dict(self) -> TextInputPayload: + payload: TextInputPayload = { + "type": self.type.value, + "style": self.style.value, + "label": cast(str, self.label), + "custom_id": self.custom_id, + "required": self.required, + } + + if self.placeholder is not None: + payload["placeholder"] = self.placeholder + + if self.value is not None: + payload["value"] = self.value + + if self.min_length is not None: + payload["min_length"] = self.min_length + + if self.max_length is not None: + payload["max_length"] = self.max_length + + return payload + + +def _component_factory(data: ComponentPayload) -> Component: + # NOTE: due to speed, this method does not use the ComponentType enum + # as this runs every single time a component is received from the api + component_type = data["type"] + if component_type == 1: + return ActionRow(data) + elif component_type == 2: + return Button(data) # type: ignore + elif component_type == 3: + return SelectMenu(data) # type: ignore + elif component_type == 4: + return TextInput(data) # type: ignore + else: + as_enum = try_enum(ComponentType, component_type) + return Component._raw_construct(type=as_enum) diff --git a/sbsheriff/Lib/site-packages/disnake/context_managers.py b/sbsheriff/Lib/site-packages/disnake/context_managers.py new file mode 100644 index 0000000..45da396 --- /dev/null +++ b/sbsheriff/Lib/site-packages/disnake/context_managers.py @@ -0,0 +1,91 @@ +""" +The MIT License (MIT) + +Copyright (c) 2015-2021 Rapptz +Copyright (c) 2021-present Disnake Development + +Permission is hereby granted, free of charge, to any person obtaining a +copy of this software and associated documentation files (the "Software"), +to deal in the Software without restriction, including without limitation +the rights to use, copy, modify, merge, publish, distribute, sublicense, +and/or sell copies of the Software, and to permit persons to whom the +Software is furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS +OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER +DEALINGS IN THE SOFTWARE. +""" + +from __future__ import annotations + +import asyncio +from typing import TYPE_CHECKING, Optional, Type, TypeVar, Union + +if TYPE_CHECKING: + from types import TracebackType + + from .abc import Messageable + from .channel import ForumChannel + + TypingT = TypeVar("TypingT", bound="Typing") + +__all__ = ("Typing",) + + +def _typing_done_callback(fut: asyncio.Future) -> None: + # just retrieve any exception and call it a day + try: + fut.exception() + except (asyncio.CancelledError, Exception): + pass + + +class Typing: + def __init__(self, messageable: Union[Messageable, ForumChannel]) -> None: + self.loop: asyncio.AbstractEventLoop = messageable._state.loop + self.messageable: Union[Messageable, ForumChannel] = messageable + + async def do_typing(self) -> None: + try: + channel = self._channel + except AttributeError: + channel = await self.messageable._get_channel() + + typing = channel._state.http.send_typing + + while True: + await typing(channel.id) + await asyncio.sleep(5) + + def __enter__(self: TypingT) -> TypingT: + self.task: asyncio.Task = self.loop.create_task(self.do_typing()) + self.task.add_done_callback(_typing_done_callback) + return self + + def __exit__( + self, + exc_type: Optional[Type[BaseException]], + exc_value: Optional[BaseException], + traceback: Optional[TracebackType], + ) -> None: + self.task.cancel() + + async def __aenter__(self: TypingT) -> TypingT: + self._channel = channel = await self.messageable._get_channel() + await channel._state.http.send_typing(channel.id) + return self.__enter__() + + async def __aexit__( + self, + exc_type: Optional[Type[BaseException]], + exc_value: Optional[BaseException], + traceback: Optional[TracebackType], + ) -> None: + self.task.cancel() diff --git a/sbsheriff/Lib/site-packages/disnake/custom_warnings.py b/sbsheriff/Lib/site-packages/disnake/custom_warnings.py new file mode 100644 index 0000000..8ca50b5 --- /dev/null +++ b/sbsheriff/Lib/site-packages/disnake/custom_warnings.py @@ -0,0 +1,48 @@ +from __future__ import annotations + +__all__ = ( + "DiscordWarning", + "ConfigWarning", + "SyncWarning", + "LocalizationWarning", +) + + +class DiscordWarning(Warning): + """ + Base warning class for disnake. + + .. versionadded:: 2.3 + """ + + pass + + +class ConfigWarning(DiscordWarning): + """ + Warning class related to configuration issues. + + .. versionadded:: 2.3 + """ + + pass + + +class SyncWarning(DiscordWarning): + """ + Warning class for application command synchronization issues. + + .. versionadded:: 2.3 + """ + + pass + + +class LocalizationWarning(DiscordWarning): + """ + Warning class for localization issues. + + .. versionadded:: 2.5 + """ + + pass diff --git a/sbsheriff/Lib/site-packages/disnake/embeds.py b/sbsheriff/Lib/site-packages/disnake/embeds.py new file mode 100644 index 0000000..4611c98 --- /dev/null +++ b/sbsheriff/Lib/site-packages/disnake/embeds.py @@ -0,0 +1,816 @@ +""" +The MIT License (MIT) + +Copyright (c) 2015-2021 Rapptz +Copyright (c) 2021-present Disnake Development + +Permission is hereby granted, free of charge, to any person obtaining a +copy of this software and associated documentation files (the "Software"), +to deal in the Software without restriction, including without limitation +the rights to use, copy, modify, merge, publish, distribute, sublicense, +and/or sell copies of the Software, and to permit persons to whom the +Software is furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS +OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER +DEALINGS IN THE SOFTWARE. +""" + +from __future__ import annotations + +import datetime +from typing import ( + TYPE_CHECKING, + Any, + Dict, + Final, + List, + Mapping, + Optional, + Protocol, + Type, + TypeVar, + Union, +) + +from . import utils +from .colour import Colour +from .file import File +from .utils import MISSING + +__all__ = ("Embed",) + + +class _EmptyEmbed: + def __bool__(self) -> bool: + return False + + def __repr__(self) -> str: + return "Embed.Empty" + + def __len__(self) -> int: + return 0 + + +EmptyEmbed: Final = _EmptyEmbed() + + +class EmbedProxy: + def __init__(self, layer: Dict[str, Any]): + self.__dict__.update(layer) + + def __len__(self) -> int: + return len(self.__dict__) + + def __repr__(self) -> str: + inner = ", ".join((f"{k}={v!r}" for k, v in self.__dict__.items() if not k.startswith("_"))) + return f"EmbedProxy({inner})" + + def __getattr__(self, attr: str) -> _EmptyEmbed: + return EmptyEmbed + + +E = TypeVar("E", bound="Embed") + +if TYPE_CHECKING: + from disnake.types.embed import Embed as EmbedData, EmbedType + + T = TypeVar("T") + MaybeEmpty = Union[T, _EmptyEmbed] + + class _EmbedFooterProxy(Protocol): + text: MaybeEmpty[str] + icon_url: MaybeEmpty[str] + + class _EmbedFieldProxy(Protocol): + name: MaybeEmpty[str] + value: MaybeEmpty[str] + inline: bool + + class _EmbedMediaProxy(Protocol): + url: MaybeEmpty[str] + proxy_url: MaybeEmpty[str] + height: MaybeEmpty[int] + width: MaybeEmpty[int] + + class _EmbedVideoProxy(Protocol): + url: MaybeEmpty[str] + height: MaybeEmpty[int] + width: MaybeEmpty[int] + + class _EmbedProviderProxy(Protocol): + name: MaybeEmpty[str] + url: MaybeEmpty[str] + + class _EmbedAuthorProxy(Protocol): + name: MaybeEmpty[str] + url: MaybeEmpty[str] + icon_url: MaybeEmpty[str] + proxy_icon_url: MaybeEmpty[str] + + +class Embed: + """Represents a Discord embed. + + .. container:: operations + + .. describe:: len(x) + + Returns the total size of the embed. + Useful for checking if it's within the 6000 character limit. + + .. describe:: bool(b) + + Returns whether the embed has any data set. + + .. versionadded:: 2.0 + + Certain properties return an ``EmbedProxy``, a type + that acts similar to a regular :class:`dict` except using dotted access, + e.g. ``embed.author.icon_url``. If the attribute + is invalid or empty, then a special sentinel value is returned, + :attr:`Embed.Empty`. + + For ease of use, all parameters that expect a :class:`str` are implicitly + casted to :class:`str` for you. + + Attributes + ---------- + title: :class:`str` + The title of the embed. + This can be set during initialisation. + type: :class:`str` + The type of embed. Usually "rich". + This can be set during initialisation. + Possible strings for embed types can be found on discord's + `api docs `_ + description: :class:`str` + The description of the embed. + This can be set during initialisation. + url: :class:`str` + The URL of the embed. + This can be set during initialisation. + timestamp: :class:`datetime.datetime` + The timestamp of the embed content. This is an aware datetime. + If a naive datetime is passed, it is converted to an aware + datetime with the local timezone. + colour: Union[:class:`Colour`, :class:`int`] + The colour code of the embed. Aliased to ``color`` as well. + This can be set during initialisation. + Empty + A special sentinel value used by ``EmbedProxy`` and this class + to denote that the value or attribute is empty. + """ + + __slots__ = ( + "title", + "url", + "type", + "_timestamp", + "_colour", + "_footer", + "_image", + "_thumbnail", + "_video", + "_provider", + "_author", + "_fields", + "description", + "_files", + ) + + Empty: Final = EmptyEmbed + _default_colour: MaybeEmpty[Colour] = Empty + + def __init__( + self, + *, + colour: Union[int, Colour, _EmptyEmbed] = EmptyEmbed, + color: Union[int, Colour, _EmptyEmbed] = EmptyEmbed, + title: MaybeEmpty[Any] = EmptyEmbed, + type: EmbedType = "rich", + url: MaybeEmpty[Any] = EmptyEmbed, + description: MaybeEmpty[Any] = EmptyEmbed, + timestamp: datetime.datetime = None, + ): + if colour or color: + self.colour = colour if colour is not EmptyEmbed else color + self.title = title + self.type = type + self.url = url + self.description = description + + if self.title is not EmptyEmbed: + self.title = str(self.title) + + if self.description is not EmptyEmbed: + self.description = str(self.description) + + if self.url is not EmptyEmbed: + self.url = str(self.url) + + if timestamp: + self.timestamp = timestamp + + self._files: List[File] = [] + + @classmethod + def from_dict(cls: Type[E], data: Mapping[str, Any]) -> E: + """Converts a :class:`dict` to a :class:`Embed` provided it is in the + format that Discord expects it to be in. + + You can find out about this format in the `official Discord documentation`__. + + .. _DiscordDocs: https://discord.com/developers/docs/resources/channel#embed-object + + __ DiscordDocs_ + + Parameters + ---------- + data: :class:`dict` + The dictionary to convert into an embed. + """ + # we are bypassing __init__ here since it doesn't apply here + self: E = cls.__new__(cls) + + # fill in the basic fields + + self.title = data.get("title", EmptyEmbed) + self.type = data.get("type", EmptyEmbed) + self.description = data.get("description", EmptyEmbed) + self.url = data.get("url", EmptyEmbed) + + if self.title is not EmptyEmbed: + self.title = str(self.title) + + if self.description is not EmptyEmbed: + self.description = str(self.description) + + if self.url is not EmptyEmbed: + self.url = str(self.url) + + self._files = [] + + # try to fill in the more rich fields + + try: + self._colour = Colour(value=data["color"]) + except KeyError: + self._colour = EmptyEmbed + + try: + self._timestamp = utils.parse_time(data["timestamp"]) + except KeyError: + pass + + for attr in ("thumbnail", "video", "provider", "author", "fields", "image", "footer"): + try: + value = data[attr] + except KeyError: + continue + else: + setattr(self, "_" + attr, value) + + return self + + def copy(self: E) -> E: + """Returns a shallow copy of the embed.""" + embed = type(self).from_dict(self.to_dict()) + embed.colour = getattr(self, "_colour", EmptyEmbed) + embed._files = self._files # TODO: Maybe copy these too? + return embed + + def __len__(self) -> int: + total = len(self.title) + len(self.description) + for field in getattr(self, "_fields", []): + total += len(field["name"]) + len(field["value"]) + + try: + footer_text = self._footer["text"] + except (AttributeError, KeyError): + pass + else: + total += len(footer_text) + + try: + author = self._author + except AttributeError: + pass + else: + total += len(author["name"]) + + return total + + def __bool__(self) -> bool: + return any( + ( + self.title, + self.url, + self.description, + hasattr(self, "_colour") and self.colour, + self.fields, + self.timestamp, + self.author, + self.thumbnail, + self.footer, + self.image, + self.provider, + self.video, + ) + ) + + @property + def colour(self) -> MaybeEmpty[Colour]: + return getattr(self, "_colour", type(self)._default_colour) + + @colour.setter + def colour(self, value: Union[int, Colour, _EmptyEmbed]): # type: ignore + if isinstance(value, (Colour, _EmptyEmbed)): + self._colour = value + elif isinstance(value, int): + self._colour = Colour(value=value) + else: + raise TypeError( + f"Expected disnake.Colour, int, or Embed.Empty but received {type(value).__name__} instead." + ) + + @colour.deleter + def colour(self): + del self._colour + + color = colour + + @property + def timestamp(self) -> MaybeEmpty[datetime.datetime]: + return getattr(self, "_timestamp", EmptyEmbed) + + @timestamp.setter + def timestamp(self, value: MaybeEmpty[datetime.datetime]): + if isinstance(value, datetime.datetime): + if value.tzinfo is None: + value = value.astimezone() + self._timestamp = value + elif isinstance(value, _EmptyEmbed): + self._timestamp = value + else: + raise TypeError( + f"Expected datetime.datetime or Embed.Empty received {type(value).__name__} instead" + ) + + @property + def footer(self) -> _EmbedFooterProxy: + """Returns an ``EmbedProxy`` denoting the footer contents. + + See :meth:`set_footer` for possible values you can access. + + If the attribute has no value then :attr:`Empty` is returned. + """ + return EmbedProxy(getattr(self, "_footer", {})) # type: ignore + + def set_footer( + self: E, *, text: MaybeEmpty[Any] = EmptyEmbed, icon_url: MaybeEmpty[Any] = EmptyEmbed + ) -> E: + """Sets the footer for the embed content. + + This function returns the class instance to allow for fluent-style + chaining. + + Parameters + ---------- + text: :class:`str` + The footer text. + icon_url: :class:`str` + The URL of the footer icon. Only HTTP(S) is supported. + """ + self._footer = {} + if text is not EmptyEmbed: + self._footer["text"] = str(text) + + if icon_url is not EmptyEmbed: + self._footer["icon_url"] = str(icon_url) + + return self + + def remove_footer(self: E) -> E: + """Clears embed's footer information. + + This function returns the class instance to allow for fluent-style + chaining. + + .. versionadded:: 2.0 + """ + try: + del self._footer + except AttributeError: + pass + + return self + + @property + def image(self) -> _EmbedMediaProxy: + """Returns an ``EmbedProxy`` denoting the image contents. + + Possible attributes you can access are: + + - ``url`` + - ``proxy_url`` + - ``width`` + - ``height`` + + If the attribute has no value then :attr:`Empty` is returned. + """ + return EmbedProxy(getattr(self, "_image", {})) # type: ignore + + def set_image(self: E, url: MaybeEmpty[Any] = MISSING, *, file: File = MISSING) -> E: + """Sets the image for the embed content. + + This function returns the class instance to allow for fluent-style + chaining. + + .. versionchanged:: 1.4 + Passing :attr:`Empty` removes the image. + + Parameters + ---------- + url: :class:`str` + The source URL for the image. Only HTTP(S) is supported. + file: :class:`File` + The file to use as the image. + + .. versionadded:: 2.2 + """ + if file: + if url: + raise TypeError("Cannot use both a url and a file at the same time") + if file.filename is None: + raise TypeError("File doesn't have a filename") + self._image = {"url": f"attachment://{file.filename}"} + self._files.append(file) + elif url is EmptyEmbed: + try: + del self._image + except AttributeError: + pass + elif url is MISSING: + raise TypeError("Neither a url nor a file have been provided") + else: + self._image = {"url": str(url)} + + return self + + @property + def thumbnail(self) -> _EmbedMediaProxy: + """Returns an ``EmbedProxy`` denoting the thumbnail contents. + + Possible attributes you can access are: + + - ``url`` + - ``proxy_url`` + - ``width`` + - ``height`` + + If the attribute has no value then :attr:`Empty` is returned. + """ + return EmbedProxy(getattr(self, "_thumbnail", {})) # type: ignore + + def set_thumbnail(self: E, url: MaybeEmpty[Any] = MISSING, *, file: File = MISSING) -> E: + """Sets the thumbnail for the embed content. + + This function returns the class instance to allow for fluent-style + chaining. + + .. versionchanged:: 1.4 + Passing :attr:`Empty` removes the thumbnail. + + Parameters + ---------- + url: :class:`str` + The source URL for the thumbnail. Only HTTP(S) is supported. + file: :class:`File` + The file to use as the image. + + .. versionadded:: 2.2 + """ + if file: + if url: + raise TypeError("Cannot use both a url and a file at the same time") + if file.filename is None: + raise TypeError("File doesn't have a filename") + self._thumbnail = {"url": f"attachment://{file.filename}"} + self._files.append(file) + elif url is EmptyEmbed: + try: + del self._thumbnail + except AttributeError: + pass + elif url is MISSING: + raise TypeError("Neither a url nor a file have been provided") + else: + self._thumbnail = {"url": str(url)} + + return self + + @property + def video(self) -> _EmbedVideoProxy: + """Returns an ``EmbedProxy`` denoting the video contents. + + Possible attributes include: + + - ``url`` for the video URL. + - ``height`` for the video height. + - ``width`` for the video width. + + If the attribute has no value then :attr:`Empty` is returned. + """ + return EmbedProxy(getattr(self, "_video", {})) # type: ignore + + @property + def provider(self) -> _EmbedProviderProxy: + """Returns an ``EmbedProxy`` denoting the provider contents. + + The only attributes that might be accessed are ``name`` and ``url``. + + If the attribute has no value then :attr:`Empty` is returned. + """ + return EmbedProxy(getattr(self, "_provider", {})) # type: ignore + + @property + def author(self) -> _EmbedAuthorProxy: + """Returns an ``EmbedProxy`` denoting the author contents. + + See :meth:`set_author` for possible values you can access. + + If the attribute has no value then :attr:`Empty` is returned. + """ + return EmbedProxy(getattr(self, "_author", {})) # type: ignore + + def set_author( + self: E, + *, + name: Any, + url: MaybeEmpty[Any] = EmptyEmbed, + icon_url: MaybeEmpty[Any] = EmptyEmbed, + ) -> E: + """Sets the author for the embed content. + + This function returns the class instance to allow for fluent-style + chaining. + + Parameters + ---------- + name: :class:`str` + The name of the author. + url: :class:`str` + The URL for the author. + icon_url: :class:`str` + The URL of the author icon. Only HTTP(S) is supported. + """ + self._author = { + "name": str(name), + } + + if url is not EmptyEmbed: + self._author["url"] = str(url) + + if icon_url is not EmptyEmbed: + self._author["icon_url"] = str(icon_url) + + return self + + def remove_author(self: E) -> E: + """Clears embed's author information. + + This function returns the class instance to allow for fluent-style + chaining. + + .. versionadded:: 1.4 + """ + try: + del self._author + except AttributeError: + pass + + return self + + @property + def fields(self) -> List[_EmbedFieldProxy]: + """List[Union[``EmbedProxy``, :attr:`Empty`]]: Returns a :class:`list` of ``EmbedProxy`` denoting the field contents. + + See :meth:`add_field` for possible values you can access. + + If the attribute has no value then :attr:`Empty` is returned. + """ + return [EmbedProxy(d) for d in getattr(self, "_fields", [])] # type: ignore + + def add_field(self: E, name: Any, value: Any, *, inline: bool = True) -> E: + """Adds a field to the embed object. + + This function returns the class instance to allow for fluent-style + chaining. + + Parameters + ---------- + name: :class:`str` + The name of the field. + value: :class:`str` + The value of the field. + inline: :class:`bool` + Whether the field should be displayed inline. + """ + field = { + "inline": inline, + "name": str(name), + "value": str(value), + } + + try: + self._fields.append(field) + except AttributeError: + self._fields = [field] + + return self + + def insert_field_at(self: E, index: int, name: Any, value: Any, *, inline: bool = True) -> E: + """Inserts a field before a specified index to the embed. + + This function returns the class instance to allow for fluent-style + chaining. + + .. versionadded:: 1.2 + + Parameters + ---------- + index: :class:`int` + The index of where to insert the field. + name: :class:`str` + The name of the field. + value: :class:`str` + The value of the field. + inline: :class:`bool` + Whether the field should be displayed inline. + """ + field = { + "inline": inline, + "name": str(name), + "value": str(value), + } + + try: + self._fields.insert(index, field) + except AttributeError: + self._fields = [field] + + return self + + def clear_fields(self) -> None: + """Removes all fields from this embed.""" + try: + self._fields.clear() + except AttributeError: + self._fields = [] + + def remove_field(self, index: int) -> None: + """Removes a field at a specified index. + + If the index is invalid or out of bounds then the error is + silently swallowed. + + .. note:: + + When deleting a field by index, the index of the other fields + shift to fill the gap just like a regular list. + + Parameters + ---------- + index: :class:`int` + The index of the field to remove. + """ + try: + del self._fields[index] + except (AttributeError, IndexError): + pass + + def set_field_at(self: E, index: int, name: Any, value: Any, *, inline: bool = True) -> E: + """Modifies a field to the embed object. + + The index must point to a valid pre-existing field. + + This function returns the class instance to allow for fluent-style + chaining. + + Parameters + ---------- + index: :class:`int` + The index of the field to modify. + name: :class:`str` + The name of the field. + value: :class:`str` + The value of the field. + inline: :class:`bool` + Whether the field should be displayed inline. + + Raises + ------ + IndexError + An invalid index was provided. + """ + try: + field = self._fields[index] + except (TypeError, IndexError, AttributeError): + raise IndexError("field index out of range") + + field["name"] = str(name) + field["value"] = str(value) + field["inline"] = inline + return self + + def to_dict(self) -> EmbedData: + """Converts this embed object into a dict.""" + + # add in the raw data into the dict + # fmt: off + result = { + key[1:]: getattr(self, key) + for key in self.__slots__ + if key[0] == '_' and hasattr(self, key) and key not in ("_colour", "_files") + } + # fmt: on + + # deal with basic convenience wrappers + + if isinstance(self.colour, Colour): + result["color"] = self.colour.value + + try: + timestamp = result.pop("timestamp") + except KeyError: + pass + else: + if timestamp: + result["timestamp"] = timestamp.astimezone(tz=datetime.timezone.utc).isoformat() + + # add in the non raw attribute ones + if self.type: + result["type"] = self.type + + if self.description: + result["description"] = self.description + + if self.url: + result["url"] = self.url + + if self.title: + result["title"] = self.title + + return result # type: ignore + + @classmethod + def set_default_colour(cls, value: Optional[Union[int, Colour]]): + """ + Set the default colour of all new embeds. + + .. versionadded:: 2.4 + + Returns + ------- + :class:`Colour` + The colour that was set. + + """ + if value == None: + cls._default_colour = cls.Empty + elif isinstance(value, (Colour, _EmptyEmbed)): + cls._default_colour = value + elif isinstance(value, int): + cls._default_colour = Colour(value=value) + else: + raise TypeError( + f"Expected disnake.Colour, or int, but received {type(value).__name__} instead." + ) + return cls._default_colour + + set_default_color = set_default_colour + + @classmethod + def get_default_colour(cls) -> MaybeEmpty[Colour]: + """ + Get the default colour of all new embeds. + + .. versionadded:: 2.4 + + Returns + ------- + :class:`Colour` + The default colour. + + """ + return cls._default_colour + + get_default_color = get_default_colour diff --git a/sbsheriff/Lib/site-packages/disnake/emoji.py b/sbsheriff/Lib/site-packages/disnake/emoji.py new file mode 100644 index 0000000..637de9c --- /dev/null +++ b/sbsheriff/Lib/site-packages/disnake/emoji.py @@ -0,0 +1,264 @@ +""" +The MIT License (MIT) + +Copyright (c) 2015-2021 Rapptz +Copyright (c) 2021-present Disnake Development + +Permission is hereby granted, free of charge, to any person obtaining a +copy of this software and associated documentation files (the "Software"), +to deal in the Software without restriction, including without limitation +the rights to use, copy, modify, merge, publish, distribute, sublicense, +and/or sell copies of the Software, and to permit persons to whom the +Software is furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS +OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER +DEALINGS IN THE SOFTWARE. +""" + +from __future__ import annotations + +from typing import TYPE_CHECKING, Any, Iterator, List, Optional, Tuple, Union + +from .asset import Asset, AssetMixin +from .partial_emoji import PartialEmoji, _EmojiTag +from .user import User +from .utils import MISSING, SnowflakeList, snowflake_time + +__all__ = ("Emoji",) + +if TYPE_CHECKING: + from datetime import datetime + + from .abc import Snowflake + from .guild import Guild + from .guild_preview import GuildPreview + from .role import Role + from .state import ConnectionState + from .types.emoji import Emoji as EmojiPayload + + +class Emoji(_EmojiTag, AssetMixin): + """Represents a custom emoji. + + Depending on the way this object was created, some of the attributes can + have a value of ``None``. + + .. container:: operations + + .. describe:: x == y + + Checks if two emoji are the same. + + .. describe:: x != y + + Checks if two emoji are not the same. + + .. describe:: hash(x) + + Return the emoji's hash. + + .. describe:: iter(x) + + Returns an iterator of ``(field, value)`` pairs. This allows this class + to be used as an iterable in list/dict/etc constructions. + + .. describe:: str(x) + + Returns the emoji rendered for Discord. + + Attributes + ---------- + name: :class:`str` + The emoji's name. + id: :class:`int` + The emoji's ID. + require_colons: :class:`bool` + Whether colons are required to use this emoji in the client (:PJSalt: vs PJSalt). + animated: :class:`bool` + Whether the emoji is animated or not. + managed: :class:`bool` + Whether the emoji is managed by a Twitch integration. + guild_id: :class:`int` + The guild ID the emoji belongs to. + available: :class:`bool` + Whether the emoji is available for use. + user: Optional[:class:`User`] + The user that created the emoji. This can only be retrieved using :meth:`Guild.fetch_emoji` and + having :attr:`~Permissions.manage_emojis` permission. + """ + + __slots__: Tuple[str, ...] = ( + "require_colons", + "animated", + "managed", + "id", + "name", + "_roles", + "guild_id", + "user", + "available", + ) + + def __init__( + self, *, guild: Union[Guild, GuildPreview], state: ConnectionState, data: EmojiPayload + ): + self.guild_id: int = guild.id + self._state: ConnectionState = state + self._from_data(data) + + def _from_data(self, emoji: EmojiPayload): + self.require_colons: bool = emoji.get("require_colons", False) + self.managed: bool = emoji.get("managed", False) + self.id: int = int(emoji["id"]) # type: ignore + self.name: str = emoji["name"] # type: ignore + self.animated: bool = emoji.get("animated", False) + self.available: bool = emoji.get("available", True) + self._roles: SnowflakeList = SnowflakeList(map(int, emoji.get("roles", []))) + user = emoji.get("user") + self.user: Optional[User] = User(state=self._state, data=user) if user else None + + def _to_partial(self) -> PartialEmoji: + return PartialEmoji(name=self.name, animated=self.animated, id=self.id) + + def __iter__(self) -> Iterator[Tuple[str, Any]]: + for attr in self.__slots__: + if attr[0] != "_": + value = getattr(self, attr, None) + if value is not None: + yield (attr, value) + + def __str__(self) -> str: + if self.animated: + return f"" + return f"<:{self.name}:{self.id}>" + + def __repr__(self) -> str: + return f"" + + def __eq__(self, other: Any) -> bool: + return isinstance(other, _EmojiTag) and self.id == other.id + + def __ne__(self, other: Any) -> bool: + return not self.__eq__(other) + + def __hash__(self) -> int: + return self.id >> 22 + + @property + def created_at(self) -> datetime: + """:class:`datetime.datetime`: Returns the emoji's creation time in UTC.""" + return snowflake_time(self.id) + + @property + def url(self) -> str: + """:class:`str`: Returns the URL of the emoji.""" + fmt = "gif" if self.animated else "png" + return f"{Asset.BASE}/emojis/{self.id}.{fmt}" + + @property + def roles(self) -> List[Role]: + """List[:class:`Role`]: A :class:`list` of roles that are allowed to use this emoji. + + If roles is empty, the emoji is unrestricted. + """ + guild = self.guild + if guild is None: + return [] + + return [role for role in guild.roles if self._roles.has(role.id)] + + @property + def guild(self) -> Guild: + """:class:`Guild`: The guild this emoji belongs to.""" + # this will most likely never return None but there's a possibility + return self._state._get_guild(self.guild_id) # type: ignore + + def is_usable(self) -> bool: + """Whether the bot can use this emoji. + + .. versionadded:: 1.3 + + :return type: :class:`bool` + """ + if not self.available: + return False + if not self._roles: + return True + emoji_roles, my_roles = self._roles, self.guild.me._roles + return any(my_roles.has(role_id) for role_id in emoji_roles) + + async def delete(self, *, reason: Optional[str] = None) -> None: + """|coro| + + Deletes the custom emoji. + + You must have :attr:`~Permissions.manage_emojis` permission to + do this. + + Parameters + ---------- + reason: Optional[:class:`str`] + The reason for deleting this emoji. Shows up on the audit log. + + Raises + ------ + Forbidden + You are not allowed to delete emojis. + HTTPException + An error occurred deleting the emoji. + """ + await self._state.http.delete_custom_emoji(self.guild.id, self.id, reason=reason) + + async def edit( + self, *, name: str = MISSING, roles: List[Snowflake] = MISSING, reason: Optional[str] = None + ) -> Emoji: + """ + |coro| + + Edits the custom emoji. + + You must have :attr:`~Permissions.manage_emojis` permission to + do this. + + .. versionchanged:: 2.0 + The newly updated emoji is returned. + + Parameters + ---------- + name: :class:`str` + The new emoji name. + roles: Optional[List[:class:`~disnake.abc.Snowflake`]] + A list of roles that can use this emoji. An empty list can be passed to make it available to everyone. + reason: Optional[:class:`str`] + The reason for editing this emoji. Shows up on the audit log. + + Raises + ------ + Forbidden + You are not allowed to edit emojis. + HTTPException + An error occurred editing the emoji. + + Returns + ------- + :class:`Emoji` + The newly updated emoji. + """ + payload = {} + if name is not MISSING: + payload["name"] = name + if roles is not MISSING: + payload["roles"] = [role.id for role in roles] + + data = await self._state.http.edit_custom_emoji( + self.guild.id, self.id, payload=payload, reason=reason + ) + return Emoji(guild=self.guild, data=data, state=self._state) diff --git a/sbsheriff/Lib/site-packages/disnake/enums.py b/sbsheriff/Lib/site-packages/disnake/enums.py new file mode 100644 index 0000000..792414b --- /dev/null +++ b/sbsheriff/Lib/site-packages/disnake/enums.py @@ -0,0 +1,812 @@ +""" +The MIT License (MIT) + +Copyright (c) 2015-2021 Rapptz +Copyright (c) 2021-present Disnake Development + +Permission is hereby granted, free of charge, to any person obtaining a +copy of this software and associated documentation files (the "Software"), +to deal in the Software without restriction, including without limitation +the rights to use, copy, modify, merge, publish, distribute, sublicense, +and/or sell copies of the Software, and to permit persons to whom the +Software is furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS +OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER +DEALINGS IN THE SOFTWARE. +""" + +import types +from functools import total_ordering +from typing import TYPE_CHECKING, Any, ClassVar, Dict, List, NamedTuple, Optional, Type, TypeVar + +__all__ = ( + "Enum", + "ChannelType", + "MessageType", + "SpeakingState", + "VerificationLevel", + "ContentFilter", + "Status", + "DefaultAvatar", + "AuditLogAction", + "AuditLogActionCategory", + "UserFlags", + "ActivityType", + "NotificationLevel", + "TeamMembershipState", + "WebhookType", + "ExpireBehaviour", + "ExpireBehavior", + "StickerType", + "StickerFormatType", + "InviteTarget", + "VideoQualityMode", + "ComponentType", + "ButtonStyle", + "TextInputStyle", + "StagePrivacyLevel", + "InteractionType", + "InteractionResponseType", + "NSFWLevel", + "OptionType", + "ApplicationCommandType", + "ApplicationCommandPermissionType", + "PartyType", + "GuildScheduledEventEntityType", + "GuildScheduledEventStatus", + "GuildScheduledEventPrivacyLevel", + "ThreadArchiveDuration", + "WidgetStyle", + "Locale", +) + + +class _EnumValueBase(NamedTuple): + if TYPE_CHECKING: + _cls_name: str + + name: str + value: Any + + def __repr__(self) -> str: + return f"<{self._cls_name}.{self.name}: {self.value!r}>" + + def __str__(self) -> str: + return f"{self._cls_name}.{self.name}" + + +@total_ordering +class _EnumValueComparable(_EnumValueBase): + def __eq__(self, other: object) -> bool: + return isinstance(other, self.__class__) and self.value == other.value + + def __lt__(self, other: object) -> bool: + return isinstance(other, self.__class__) and self.value < other.value + + +def _create_value_cls(name, comparable): + parent = _EnumValueComparable if comparable else _EnumValueBase + return type(parent.__name__ + "_" + name, (parent,), {"_cls_name": name}) + + +def _is_descriptor(obj): + return hasattr(obj, "__get__") or hasattr(obj, "__set__") or hasattr(obj, "__delete__") + + +class EnumMeta(type): + if TYPE_CHECKING: + __name__: ClassVar[str] + _enum_member_names_: ClassVar[List[str]] + _enum_member_map_: ClassVar[Dict[str, Any]] + _enum_value_map_: ClassVar[Dict[Any, Any]] + + def __new__(cls, name, bases, attrs, *, comparable: bool = False): + value_mapping = {} + member_mapping = {} + member_names = [] + + value_cls = _create_value_cls(name, comparable) + for key, value in list(attrs.items()): + is_descriptor = _is_descriptor(value) + if key[0] == "_" and not is_descriptor: + continue + + # Special case classmethod to just pass through + if isinstance(value, classmethod): + continue + + if is_descriptor: + setattr(value_cls, key, value) + del attrs[key] + continue + + try: + new_value = value_mapping[value] + except KeyError: + new_value = value_cls(name=key, value=value) + value_mapping[value] = new_value + member_names.append(key) + + member_mapping[key] = new_value + attrs[key] = new_value + + attrs["_enum_value_map_"] = value_mapping + attrs["_enum_member_map_"] = member_mapping + attrs["_enum_member_names_"] = member_names + attrs["_enum_value_cls_"] = value_cls + actual_cls = super().__new__(cls, name, bases, attrs) + value_cls._actual_enum_cls_ = actual_cls + return actual_cls + + def __iter__(cls): + return (cls._enum_member_map_[name] for name in cls._enum_member_names_) + + def __reversed__(cls): + return (cls._enum_member_map_[name] for name in reversed(cls._enum_member_names_)) + + def __len__(cls): + return len(cls._enum_member_names_) + + def __repr__(cls): + return f"" + + @property + def __members__(cls): + return types.MappingProxyType(cls._enum_member_map_) + + def __call__(cls, value): + try: + return cls._enum_value_map_[value] + except (KeyError, TypeError): + raise ValueError(f"{value!r} is not a valid {cls.__name__}") + + def __getitem__(cls, key): + return cls._enum_member_map_[key] + + def __setattr__(cls, name, value): + raise TypeError("Enums are immutable.") + + def __delattr__(cls, attr): + raise TypeError("Enums are immutable") + + def __instancecheck__(self, instance): + # isinstance(x, Y) + # -> __instancecheck__(Y, x) + try: + return instance._actual_enum_cls_ is self + except AttributeError: + return False + + +if TYPE_CHECKING: + from enum import Enum +else: + + class Enum(metaclass=EnumMeta): + @classmethod + def try_value(cls, value): + try: + return cls._enum_value_map_[value] + except (KeyError, TypeError): + return value + + +class ChannelType(Enum): + text = 0 + private = 1 + voice = 2 + group = 3 + category = 4 + news = 5 + news_thread = 10 + public_thread = 11 + private_thread = 12 + stage_voice = 13 + guild_directory = 14 + forum = 15 + + def __str__(self): + return self.name + + +class MessageType(Enum): + default = 0 + recipient_add = 1 + recipient_remove = 2 + call = 3 + channel_name_change = 4 + channel_icon_change = 5 + pins_add = 6 + new_member = 7 + premium_guild_subscription = 8 + premium_guild_tier_1 = 9 + premium_guild_tier_2 = 10 + premium_guild_tier_3 = 11 + channel_follow_add = 12 + guild_stream = 13 + guild_discovery_disqualified = 14 + guild_discovery_requalified = 15 + guild_discovery_grace_period_initial_warning = 16 + guild_discovery_grace_period_final_warning = 17 + thread_created = 18 + reply = 19 + application_command = 20 + thread_starter_message = 21 + guild_invite_reminder = 22 + context_menu_command = 23 + auto_moderation_action = 24 + + +class PartyType(Enum): + poker = 755827207812677713 + betrayal = 773336526917861400 + fishing = 814288819477020702 + chess = 832012774040141894 + letter_tile = 879863686565621790 + word_snack = 879863976006127627 + doodle_crew = 878067389634314250 + checkers = 832013003968348200 + spellcast = 852509694341283871 + watch_together = 880218394199220334 + sketch_heads = 902271654783242291 + ocho = 832025144389533716 + + +class SpeakingState(Enum): + none = 0 + voice = 1 + soundshare = 2 + priority = 4 + + def __str__(self): + return self.name + + def __int__(self): + return self.value + + +class VerificationLevel(Enum, comparable=True): + none = 0 + low = 1 + medium = 2 + high = 3 + highest = 4 + + def __str__(self): + return self.name + + +class ContentFilter(Enum, comparable=True): + disabled = 0 + no_role = 1 + all_members = 2 + + def __str__(self): + return self.name + + +class Status(Enum): + online = "online" + offline = "offline" + idle = "idle" + dnd = "dnd" + do_not_disturb = "dnd" + invisible = "invisible" + streaming = "streaming" + + def __str__(self): + return self.value + + +class DefaultAvatar(Enum): + blurple = 0 + grey = 1 + gray = 1 + green = 2 + orange = 3 + red = 4 + + def __str__(self): + return self.name + + +class NotificationLevel(Enum, comparable=True): + all_messages = 0 + only_mentions = 1 + + +class AuditLogActionCategory(Enum): + create = 1 + delete = 2 + update = 3 + + +class AuditLogAction(Enum): + # fmt: off + guild_update = 1 + channel_create = 10 + channel_update = 11 + channel_delete = 12 + overwrite_create = 13 + overwrite_update = 14 + overwrite_delete = 15 + kick = 20 + member_prune = 21 + ban = 22 + unban = 23 + member_update = 24 + member_role_update = 25 + member_move = 26 + member_disconnect = 27 + bot_add = 28 + role_create = 30 + role_update = 31 + role_delete = 32 + invite_create = 40 + invite_update = 41 + invite_delete = 42 + webhook_create = 50 + webhook_update = 51 + webhook_delete = 52 + emoji_create = 60 + emoji_update = 61 + emoji_delete = 62 + message_delete = 72 + message_bulk_delete = 73 + message_pin = 74 + message_unpin = 75 + integration_create = 80 + integration_update = 81 + integration_delete = 82 + stage_instance_create = 83 + stage_instance_update = 84 + stage_instance_delete = 85 + sticker_create = 90 + sticker_update = 91 + sticker_delete = 92 + guild_scheduled_event_create = 100 + guild_scheduled_event_update = 101 + guild_scheduled_event_delete = 102 + thread_create = 110 + thread_update = 111 + thread_delete = 112 + application_command_permission_update = 121 + # fmt: on + + @property + def category(self) -> Optional[AuditLogActionCategory]: + # fmt: off + lookup: Dict[AuditLogAction, Optional[AuditLogActionCategory]] = { + AuditLogAction.guild_update: AuditLogActionCategory.update, + AuditLogAction.channel_create: AuditLogActionCategory.create, + AuditLogAction.channel_update: AuditLogActionCategory.update, + AuditLogAction.channel_delete: AuditLogActionCategory.delete, + AuditLogAction.overwrite_create: AuditLogActionCategory.create, + AuditLogAction.overwrite_update: AuditLogActionCategory.update, + AuditLogAction.overwrite_delete: AuditLogActionCategory.delete, + AuditLogAction.kick: None, + AuditLogAction.member_prune: None, + AuditLogAction.ban: None, + AuditLogAction.unban: None, + AuditLogAction.member_update: AuditLogActionCategory.update, + AuditLogAction.member_role_update: AuditLogActionCategory.update, + AuditLogAction.member_move: None, + AuditLogAction.member_disconnect: None, + AuditLogAction.bot_add: None, + AuditLogAction.role_create: AuditLogActionCategory.create, + AuditLogAction.role_update: AuditLogActionCategory.update, + AuditLogAction.role_delete: AuditLogActionCategory.delete, + AuditLogAction.invite_create: AuditLogActionCategory.create, + AuditLogAction.invite_update: AuditLogActionCategory.update, + AuditLogAction.invite_delete: AuditLogActionCategory.delete, + AuditLogAction.webhook_create: AuditLogActionCategory.create, + AuditLogAction.webhook_update: AuditLogActionCategory.update, + AuditLogAction.webhook_delete: AuditLogActionCategory.delete, + AuditLogAction.emoji_create: AuditLogActionCategory.create, + AuditLogAction.emoji_update: AuditLogActionCategory.update, + AuditLogAction.emoji_delete: AuditLogActionCategory.delete, + AuditLogAction.message_delete: AuditLogActionCategory.delete, + AuditLogAction.message_bulk_delete: AuditLogActionCategory.delete, + AuditLogAction.message_pin: None, + AuditLogAction.message_unpin: None, + AuditLogAction.integration_create: AuditLogActionCategory.create, + AuditLogAction.integration_update: AuditLogActionCategory.update, + AuditLogAction.integration_delete: AuditLogActionCategory.delete, + AuditLogAction.stage_instance_create: AuditLogActionCategory.create, + AuditLogAction.stage_instance_update: AuditLogActionCategory.update, + AuditLogAction.stage_instance_delete: AuditLogActionCategory.delete, + AuditLogAction.sticker_create: AuditLogActionCategory.create, + AuditLogAction.sticker_update: AuditLogActionCategory.update, + AuditLogAction.sticker_delete: AuditLogActionCategory.delete, + AuditLogAction.thread_create: AuditLogActionCategory.create, + AuditLogAction.thread_update: AuditLogActionCategory.update, + AuditLogAction.thread_delete: AuditLogActionCategory.delete, + AuditLogAction.guild_scheduled_event_create: AuditLogActionCategory.create, + AuditLogAction.guild_scheduled_event_update: AuditLogActionCategory.update, + AuditLogAction.guild_scheduled_event_delete: AuditLogActionCategory.delete, + AuditLogAction.application_command_permission_update: AuditLogActionCategory.update, + } + # fmt: on + return lookup[self] + + @property + def target_type(self) -> Optional[str]: + v = self.value + if v == -1: + return "all" + elif v < 10: + return "guild" + elif v < 20: + return "channel" + elif v < 30: + return "user" + elif v < 40: + return "role" + elif v < 50: + return "invite" + elif v < 60: + return "webhook" + elif v < 70: + return "emoji" + elif v == 73: + return "channel" + elif v < 80: + return "message" + elif v < 83: + return "integration" + elif v < 90: + return "stage_instance" + elif v < 93: + return "sticker" + elif v < 103: + return "guild_scheduled_event" + elif v < 113: + return "thread" + elif v < 122: + return "application_command" + else: + return None + + +class UserFlags(Enum): + staff = 1 + partner = 2 + hypesquad = 4 + bug_hunter = 8 + mfa_sms = 16 + premium_promo_dismissed = 32 + hypesquad_bravery = 64 + hypesquad_brilliance = 128 + hypesquad_balance = 256 + early_supporter = 512 + team_user = 1024 + system = 4096 + has_unread_urgent_messages = 8192 + bug_hunter_level_2 = 16384 + verified_bot = 65536 + verified_bot_developer = 131072 + discord_certified_moderator = 262144 + http_interactions_bot = 524288 + spammer = 1048576 + + +class ActivityType(Enum): + unknown = -1 + playing = 0 + streaming = 1 + listening = 2 + watching = 3 + custom = 4 + competing = 5 + + def __int__(self): + return self.value + + +class TeamMembershipState(Enum): + invited = 1 + accepted = 2 + + +class WebhookType(Enum): + incoming = 1 + channel_follower = 2 + application = 3 + + +class ExpireBehaviour(Enum): + remove_role = 0 + kick = 1 + + +ExpireBehavior = ExpireBehaviour + + +class StickerType(Enum): + standard = 1 + guild = 2 + + +class StickerFormatType(Enum): + png = 1 + apng = 2 + lottie = 3 + + @property + def file_extension(self) -> str: + lookup: Dict[StickerFormatType, str] = { + StickerFormatType.png: "png", + StickerFormatType.apng: "png", + StickerFormatType.lottie: "json", + } + return lookup[self] + + +class InviteTarget(Enum): + unknown = 0 + stream = 1 + embedded_application = 2 + + +class InteractionType(Enum): + ping = 1 + application_command = 2 + component = 3 + application_command_autocomplete = 4 + modal_submit = 5 + + +class InteractionResponseType(Enum): + pong = 1 + # ack = 2 (deprecated) + # channel_message = 3 (deprecated) + channel_message = 4 # (with source) + deferred_channel_message = 5 # (with source) + deferred_message_update = 6 # for components + message_update = 7 # for components + application_command_autocomplete_result = 8 # for autocomplete + modal = 9 # for modals + + +class VideoQualityMode(Enum): + auto = 1 + full = 2 + + def __int__(self): + return self.value + + +class ComponentType(Enum): + action_row = 1 + button = 2 + select = 3 + text_input = 4 + + def __int__(self): + return self.value + + +class ButtonStyle(Enum): + primary = 1 + secondary = 2 + success = 3 + danger = 4 + link = 5 + + # Aliases + blurple = 1 + grey = 2 + gray = 2 + green = 3 + red = 4 + url = 5 + + def __int__(self): + return self.value + + +class TextInputStyle(Enum): + short = 1 + paragraph = 2 + # Aliases + single_line = 1 + multi_line = 2 + long = 2 + + def __int__(self) -> int: + return self.value + + +class ApplicationCommandType(Enum): + chat_input = 1 + user = 2 + message = 3 + + +class ApplicationCommandPermissionType(Enum): + role = 1 + user = 2 + channel = 3 + + def __int__(self): + return self.value + + +class OptionType(Enum): + sub_command = 1 + sub_command_group = 2 + string = 3 + integer = 4 + boolean = 5 + user = 6 + channel = 7 + role = 8 + mentionable = 9 + number = 10 + attachment = 11 + + +class StagePrivacyLevel(Enum): + public = 1 + closed = 2 + guild_only = 2 + + +class NSFWLevel(Enum, comparable=True): + default = 0 + explicit = 1 + safe = 2 + age_restricted = 3 + + +class GuildScheduledEventEntityType(Enum): + stage_instance = 1 + voice = 2 + external = 3 + + +class GuildScheduledEventStatus(Enum): + scheduled = 1 + active = 2 + completed = 3 + canceled = 4 + + +class GuildScheduledEventPrivacyLevel(Enum): + guild_only = 2 + + +class ThreadArchiveDuration(Enum): + hour = 60 + day = 1440 + three_days = 4320 + week = 10080 + + def __int__(self): + return self.value + + +class WidgetStyle(Enum): + shield = "shield" + banner1 = "banner1" + banner2 = "banner2" + banner3 = "banner3" + banner4 = "banner4" + + def __str__(self): + return self.value + + +# reference: https://discord.com/developers/docs/reference#locales +class Locale(Enum): + bg = "bg" + "Bulgarian | български" + cs = "cs" + "Czech | Čeština" + da = "da" + "Danish | Dansk" + de = "de" + "German | Deutsch" + el = "el" + "Greek | Ελληνικά" + en_GB = "en-GB" + "English, UK | English, UK" + en_US = "en-US" + "English, US | English, US" + es_ES = "es-ES" + "Spanish | Español" + fi = "fi" + "Finnish | Suomi" + fr = "fr" + "French | Français" + hi = "hi" + "Hindi | हिन्दी" + hr = "hr" + "Croatian | Hrvatski" + it = "it" + "Italian | Italiano" + ja = "ja" + "Japanese | 日本語" + ko = "ko" + "Korean | 한국어" + lt = "lt" + "Lithuanian | Lietuviškai" + hu = "hu" + "Hungarian | Magyar" + nl = "nl" + "Dutch | Nederlands" + no = "no" + "Norwegian | Norsk" + pl = "pl" + "Polish | Polski" + pt_BR = "pt-BR" + "Portuguese, Brazilian | Português do Brasil" + ro = "ro" + "Romanian, Romania | Română" + ru = "ru" + "Russian | Pусский" + sv_SE = "sv-SE" + "Swedish | Svenska" + th = "th" + "Thai | ไทย" + tr = "tr" + "Turkish | Türkçe" + uk = "uk" + "Ukrainian | Українська" + vi = "vi" + "Vietnamese | Tiếng Việt" + zh_CN = "zh-CN" + "Chinese, China | 中文" + zh_TW = "zh-TW" + "Chinese, Taiwan | 繁體中文" + + def __str__(self): + return self.value + + +T = TypeVar("T") + + +def create_unknown_value(cls: Type[T], val: Any) -> T: + value_cls = cls._enum_value_cls_ # type: ignore + name = f"unknown_{val}" + return value_cls(name=name, value=val) + + +def try_enum(cls: Type[T], val: Any) -> T: + """A function that tries to turn the value into enum ``cls``. + + If it fails it returns a proxy invalid value instead. + """ + + try: + return cls._enum_value_map_[val] # type: ignore + except (KeyError, TypeError, AttributeError): + return create_unknown_value(cls, val) + + +def enum_if_int(cls: Type[T], val: Any) -> T: + """A function that tries to turn the value into enum ``cls``. + + If it fails it returns a proxy invalid value instead. + """ + if not isinstance(val, int): + return val + return try_enum(cls, val) + + +def try_enum_to_int(val: Any) -> Any: + if isinstance(val, int): + return val + try: + return val.value + except Exception: + return val diff --git a/sbsheriff/Lib/site-packages/disnake/errors.py b/sbsheriff/Lib/site-packages/disnake/errors.py new file mode 100644 index 0000000..e5c03b4 --- /dev/null +++ b/sbsheriff/Lib/site-packages/disnake/errors.py @@ -0,0 +1,401 @@ +""" +The MIT License (MIT) + +Copyright (c) 2015-2021 Rapptz +Copyright (c) 2021-present Disnake Development + +Permission is hereby granted, free of charge, to any person obtaining a +copy of this software and associated documentation files (the "Software"), +to deal in the Software without restriction, including without limitation +the rights to use, copy, modify, merge, publish, distribute, sublicense, +and/or sell copies of the Software, and to permit persons to whom the +Software is furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS +OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER +DEALINGS IN THE SOFTWARE. +""" + +from __future__ import annotations + +from typing import TYPE_CHECKING, Any, Dict, List, Optional, Tuple, Union + +if TYPE_CHECKING: + from aiohttp import ClientResponse, ClientWebSocketResponse + + try: + from requests import Response + + _ResponseType = Union[ClientResponse, Response] + except ModuleNotFoundError: + _ResponseType = ClientResponse + + from .interactions import Interaction, ModalInteraction + +__all__ = ( + "DiscordException", + "ClientException", + "NoMoreItems", + "GatewayNotFound", + "HTTPException", + "Forbidden", + "NotFound", + "DiscordServerError", + "InvalidData", + "InvalidArgument", + "LoginFailure", + "ConnectionClosed", + "PrivilegedIntentsRequired", + "InteractionException", + "InteractionTimedOut", + "InteractionResponded", + "InteractionNotResponded", + "ModalChainNotSupported", + "InteractionNotEditable", + "LocalizationKeyError", +) + + +class DiscordException(Exception): + """Base exception class for disnake. + + Ideally speaking, this could be caught to handle any exceptions raised from this library. + """ + + pass + + +class ClientException(DiscordException): + """Exception that's raised when an operation in the :class:`Client` fails. + + These are usually for exceptions that happened due to user input. + """ + + pass + + +class NoMoreItems(DiscordException): + """Exception that is raised when an async iteration operation has no more items.""" + + pass + + +class GatewayNotFound(DiscordException): + """An exception that is raised when the gateway for Discord could not be found""" + + def __init__(self) -> None: + message = "The gateway to connect to Discord was not found." + super().__init__(message) + + +def _flatten_error_dict(d: Dict[str, Any], key: str = "") -> Dict[str, str]: + items: List[Tuple[str, str]] = [] + for k, v in d.items(): + new_key = key + "." + k if key else k + + if isinstance(v, dict): + try: + _errors: List[Dict[str, Any]] = v["_errors"] + except KeyError: + items.extend(_flatten_error_dict(v, new_key).items()) + else: + items.append((new_key, " ".join(x.get("message", "") for x in _errors))) + else: + items.append((new_key, v)) + + return dict(items) + + +class HTTPException(DiscordException): + """Exception that's raised when an HTTP request operation fails. + + Attributes + ---------- + response: :class:`aiohttp.ClientResponse` + The response of the failed HTTP request. This is an + instance of :class:`aiohttp.ClientResponse`. In some cases + this could also be a :class:`requests.Response`. + + text: :class:`str` + The text of the error. Could be an empty string. + status: :class:`int` + The status code of the HTTP request. + code: :class:`int` + The Discord specific error code for the failure. + """ + + def __init__(self, response: _ResponseType, message: Optional[Union[str, Dict[str, Any]]]): + self.response: _ResponseType = response + self.status: int = response.status # type: ignore + self.code: int + self.text: str + if isinstance(message, dict): + self.code = message.get("code", 0) + base = message.get("message", "") + errors = message.get("errors") + if errors: + errors = _flatten_error_dict(errors) + helpful = "\n".join("In %s: %s" % t for t in errors.items()) + self.text = base + "\n" + helpful + else: + self.text = base + else: + self.text = message or "" + self.code = 0 + + fmt = "{0.status} {0.reason} (error code: {1})" + if len(self.text): + fmt += ": {2}" + + super().__init__(fmt.format(self.response, self.code, self.text)) + + +class Forbidden(HTTPException): + """Exception that's raised for when status code 403 occurs. + + Subclass of :exc:`HTTPException`. + """ + + pass + + +class NotFound(HTTPException): + """Exception that's raised for when status code 404 occurs. + + Subclass of :exc:`HTTPException`. + """ + + pass + + +class DiscordServerError(HTTPException): + """Exception that's raised for when a 500 range status code occurs. + + Subclass of :exc:`HTTPException`. + + .. versionadded:: 1.5 + """ + + pass + + +class InvalidData(ClientException): + """Exception that's raised when the library encounters unknown + or invalid data from Discord. + """ + + pass + + +class InvalidArgument(ClientException): + """Exception that's raised when an argument to a function + is invalid some way (e.g. wrong value or wrong type). + + This could be considered the analogous of ``ValueError`` and + ``TypeError`` except inherited from :exc:`ClientException` and thus + :exc:`DiscordException`. + """ + + pass + + +class LoginFailure(ClientException): + """Exception that's raised when the :meth:`Client.login` function + fails to log you in from improper credentials or some other misc. + failure. + """ + + pass + + +class ConnectionClosed(ClientException): + """Exception that's raised when the gateway connection is + closed for reasons that could not be handled internally. + + Attributes + ---------- + code: :class:`int` + The close code of the websocket. + reason: :class:`str` + The reason provided for the closure. + shard_id: Optional[:class:`int`] + The shard ID that got closed if applicable. + """ + + def __init__( + self, + socket: ClientWebSocketResponse, + *, + shard_id: Optional[int], + code: Optional[int] = None, + ): + # This exception is just the same exception except + # reconfigured to subclass ClientException for users + self.code: int = code or socket.close_code or -1 + # aiohttp doesn't seem to consistently provide close reason + self.reason: str = "" + self.shard_id: Optional[int] = shard_id + super().__init__(f"Shard ID {self.shard_id} WebSocket closed with {self.code}") + + +class PrivilegedIntentsRequired(ClientException): + """Exception that's raised when the gateway is requesting privileged intents + but they're not ticked in the developer page yet. + + Go to https://discord.com/developers/applications/ and enable the intents + that are required. Currently these are as follows: + + - :attr:`Intents.members` + - :attr:`Intents.presences` + - :attr:`Intents.message_content` + + Attributes + ---------- + shard_id: Optional[:class:`int`] + The shard ID that got closed if applicable. + """ + + def __init__(self, shard_id: Optional[int]): + self.shard_id: Optional[int] = shard_id + msg = ( + "Shard ID %s is requesting privileged intents that have not been explicitly enabled in the " + "developer portal. It is recommended to go to https://discord.com/developers/applications/ " + "and explicitly enable the privileged intents within your application's page. If this is not " + "possible, then consider disabling the privileged intents instead." + ) + super().__init__(msg % shard_id) + + +class InteractionException(ClientException): + """Exception that's raised when an interaction operation fails + + .. versionadded:: 2.0 + + Attributes + ---------- + interaction: :class:`Interaction` + The interaction that was responded to. + """ + + interaction: Interaction + + +class InteractionTimedOut(InteractionException): + """Exception that's raised when an interaction takes more than 3 seconds + to respond but is not deferred. + + .. versionadded:: 2.0 + + Attributes + ---------- + interaction: :class:`Interaction` + The interaction that was responded to. + """ + + def __init__(self, interaction: Interaction): + self.interaction: Interaction = interaction + + msg = ( + "Interaction took more than 3 seconds to be responded to. " + 'Please defer it using "interaction.response.defer" on the start of your command. ' + "Later you may send a response by editing the deferred message " + 'using "interaction.edit_original_message"' + "\n" + "Note: This might also be caused by a misconfiguration in the components " + "make sure you do not respond twice in case this is a component." + ) + super().__init__(msg) + + +class InteractionResponded(InteractionException): + """Exception that's raised when sending another interaction response using + :class:`InteractionResponse` when one has already been done before. + + An interaction can only be responded to once. + + .. versionadded:: 2.0 + + Attributes + ---------- + interaction: :class:`Interaction` + The interaction that's already been responded to. + """ + + def __init__(self, interaction: Interaction): + self.interaction: Interaction = interaction + super().__init__("This interaction has already been responded to before") + + +class InteractionNotResponded(InteractionException): + """Exception that's raised when editing an interaction response without + sending a response message first. + + An interaction must be responded to exactly once. + + .. versionadded:: 2.0 + + Attributes + ---------- + interaction: :class:`Interaction` + The interaction that hasn't been responded to. + """ + + def __init__(self, interaction: Interaction): + self.interaction: Interaction = interaction + super().__init__("This interaction hasn't been responded to yet") + + +class ModalChainNotSupported(InteractionException): + """Exception that's raised when responding to a modal with another modal. + + .. versionadded:: 2.4 + + Attributes + ---------- + interaction: :class:`ModalInteraction` + The interaction that was responded to. + """ + + def __init__(self, interaction: ModalInteraction): + self.interaction: ModalInteraction = interaction + super().__init__("You cannot respond to a modal with another modal.") + + +class InteractionNotEditable(InteractionException): + """Exception that's raised when trying to use :func:`InteractionResponse.edit_message` + on an interaction without an associated message (which is thus non-editable). + + .. versionadded:: 2.5 + + Attributes + ---------- + interaction: :class:`Interaction` + The interaction that was responded to. + """ + + def __init__(self, interaction: Interaction): + self.interaction: Interaction = interaction + super().__init__("This interaction does not have a message to edit.") + + +class LocalizationKeyError(DiscordException): + """Exception that's raised when a localization key lookup fails. + + .. versionadded:: 2.5 + + Attributes + ---------- + key: :class:`str` + The localization key that couldn't be found. + """ + + def __init__(self, key: str): + self.key: str = key + super().__init__(f"No localizations were found for the key '{key}'.") diff --git a/sbsheriff/Lib/site-packages/disnake/ext/commands/__init__.py b/sbsheriff/Lib/site-packages/disnake/ext/commands/__init__.py new file mode 100644 index 0000000..652afe5 --- /dev/null +++ b/sbsheriff/Lib/site-packages/disnake/ext/commands/__init__.py @@ -0,0 +1,24 @@ +""" +disnake.ext.commands +~~~~~~~~~~~~~~~~~~~~~ + +An extension module to facilitate creation of bot commands. + +:copyright: (c) 2015-2021 Rapptz, 2021-present Disnake Development +:license: MIT, see LICENSE for more details. +""" + +from .base_core import * +from .bot import * +from .cog import * +from .context import * +from .converter import * +from .cooldowns import * +from .core import * +from .ctx_menus_core import * +from .custom_warnings import * +from .errors import * +from .flags import * +from .help import * +from .params import * +from .slash_core import * diff --git a/sbsheriff/Lib/site-packages/disnake/ext/commands/__pycache__/__init__.cpython-310.pyc b/sbsheriff/Lib/site-packages/disnake/ext/commands/__pycache__/__init__.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..9c9748aa6a87becda8ff6f7b6e533b63fc9dd51b GIT binary patch literal 705 zcmZvZv2NQi5QZh&iESoM<}L-d)Tk0-J%Yz=OcUz;<9Kup7t%j{=Vadx0m!<}B*BUTT(UH1Yw4u=Yb`%Tk&Q*^k$Z zu`h;G85q>o@X}_h0=Tz4mr57fOAlN*kbd*k=6r5F-=8>SY^rSa?DS&kr~JL@^U1~d z!(ehT8S`(ls{G42WhUc6`*9tg-StoFwh)=AB-r)Ne}1x^hmlk{JkGg421P;(Q<7>UoOV x!=RGtK`sE(aET*oVYDClNC<7T7h+gF*PV~M>-w}A3ce-RiaM+lzy2J@{{TEi(|7;? literal 0 HcmV?d00001 diff --git a/sbsheriff/Lib/site-packages/disnake/ext/commands/__pycache__/_types.cpython-310.pyc b/sbsheriff/Lib/site-packages/disnake/ext/commands/__pycache__/_types.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..30e837dbee1f3cb6f790c23b44f7d3a8456ad8d4 GIT binary patch literal 2084 zcmZWqU31$+6qV%9D2WqFfhkWr83tm;P1+2+bQq?Jti&1|*(1vh5n(j4w6;YgtS5!x?6zo)R`9f@l}D1hLmRY3cWCR8G*vL(rPZ*BG3LtgN0_gM z8=*Q==q`P*vcjUy|@YYRh=zvvS>EX$$ro#M^B!9`}pX| z(Nkjki$(t1|E7BOwcx0@lw3-ZY9SC;K^g?v2(f_Szj4AR+Z*5~YYn$?X)mj`BHM<^*)|EDA)7 z4xEB`8HyZkr{gGzRtTzCUTVcf=1UF+BF_#UN0ng+W>I{egT!%7^kqCBX*m@6Ip zuOCe=d6d(~3qQE>XOv%}mWXnD2ssXel@|Qa%OM{>KnZUF@*6=4wO(pUO}VsK?azva z=b=y{-8!6c{WC>mR}qcy&1#|%uh9(eSIMmeY*xxxG*Bmm`k8nG7j-I>=PO;eglAQ3 zqq}kD-%Owux=qoZEYqN33txVghSr+ql%dXk-H(Sff-&`$+zu8v4U8ohLPOepKmujWqz@(?P&X0?HI0yRJnD${Xp%3_KDhw_Jg$trEIw6%w)Wh{!R3$(t4(e~-u>GnizLdy2E&a@w^J=Q*3J8NaUF*W8rqV}qN zpJr?4yi;ob4Xal5%IbhOJZ~S#)XsZ*y|Q=GJL{eEs`J?+8B;E0EI}PpBDEh^2WwwM zo8xHZ3H&{z4yz-d+O;nse^ecl{8{9Ws|O_iB=RTJgOYzrIqIRCncCCpq&kJa&%ByZ z539pBGwQHcxRI@WS)Ef=^_V()GhcgF*_SgD=l_KBIbnsvZl}`?+@RU*_|v$~UU+G0 zVmKU`x$?#<^{LlhnfltL=~q$OSq)25ZmZ?awY+d>s;j%bpxN=l+{?{I5azz#^n58}invZoBPv6iUapmhyRa z@(oY7o4(IZPT1j)>#ueib@V3O({@+qym}+<&!2!HGZWdc{8F!R%?tQ^xM!-{ZK>`` z=XG~^x!G9=M_+e8nCf;KJ*~Y?V-+v3&Y;<0mbrn~!EZS9hO6E7_SBJURy4`DNFgw*<2y;kg!V|l;Ff)VN`MGYdqr#y^_qwZ_ zZYKz>H>xN5F-Ja9U1y^}>f6>#;`T48kEH))#cT2ypF!qyVpIfn@V||sGD!13%-qH)Y6aR&%oGO&ar1X_M^xI znOoK;ncLR4GxMN;vTv4dSR2;51v+G>8>o={@G(l#U*n^5$b8FM8~FsJYi8E1-?YAC zU4q1XEwf?2lUc{A%%SO3NHzZZm{-=4z3Q0jE2t?ova634qPRvR<0qaCFM;G`v>JQ|89dD<3pGS+n83=m}vqPi{}- z!knuY{IGCsMgC^B7lc{wgT@^TOBqW}=1!l-z{28+c9)ku^$srl!$|CpYMQC+%8;GjS6sBfbDp>Kn{wUby2*F@mBUnyoX7aXoar_pkK-w77oz-hLzKeWA0 zz-!N0*4?1n=(e2su6A5!t{XVurg)2RqQzV-mmU1fEP80n)t-Z$%V}s2@>)6AM0((< z)w52s;|HFr*zl@Ui>q93x-67Nlm`ZOAz>W+7k-nS3lBrC&$|t;|1xx{)#|Qb=P)Di z{C@Y*UekB5XHJ^FopUB-l#{a`Ruj2>8RK4z*4M1OecNiUd%h1jcJGQ5lu0dV?*hbY zbFLS7zG?nk{3Dkgx9v?P9rFWiIuX&*;ccfoFB6eanm6AEL7VeUPu1_y!hEmQiYG~$ z<0Ld%Jw=)=W2QQR6oYUb^BS@PUg?uEj^CS$-s^KV7Jx05{i<}G-MEM{?*o?{b5@>C z`enLKo|&CJ-|cu#u+l{h?Rm4a&Pun}QqG)*dz)^Vrsuk9wNI5QcFLIF658_Z{JGF^ zx^qijBS3Q;lJ*vWcRUTYiw1PzjZ3E0SgxUE?afclCdkBjF3G+yNdKf9UFXv9F8S6?jSj4lQv(UT_%Ebh^N9P>Z zNFl%5f+!;H^Dwzp=hD36b}$*y9+|ualhE-RT&;Q)#3PS^=>RZ!;Wrn6fSq}_+3IP- zu;3o>X0t;G!&#lz-FDL0B-)>xtwua28}F>+FUCXc`Iu{Gx*PBvU= zIo`i$`Y_uc0{KU~O|;3bl2DVBeRzMjQ@WW#u(FTIR~ZU!Qa`DApk96J;b zh1E0{gLQ?AF=Lt=+Vv(jWRRZE%Nv8hZGbxs-J>Byy9|X)wd#Q3spGhSrfPE1d7}E1 zbp5kYc{|=}UK;MN*So;QO)y&BV6%E%?*XIy$(LDJ0B-B)&H$>75N!re zS^mSQ6=ZGz*RBKCZe#`30+QacZ)aZ45MtJ|>%{rMw`sKikXXRfWi~<$0=PEw-tbj> z!`iUdfl7Opw%4t7`@8o0z_3|VHt+YK7lp;BR+z^sZ2S5pw2r&kM$0!86Jq6j zuQd;VI|O}(cm;bIA4Q*BE zXQhc*)lO;oc!@!~)v(ZzJs~VLB6G*uWNi3w`lG;x#wVx;QUu2}BGU-r7jZz9hLsPn z7bHfKnTcbyF{=1xcbIRv3-vk{3FRj_n94mF9Lq&`c{BlOQXFQXc-MyOeX8pjFn3sP z`f+zOq(~+lqRB>f!5XAo^g6$8#)dZ*HFhHHd*Nt;d8M{~3s2V$rXPvOfF6zGo<7Lt zixGLz-8r!k`L*MzXEqHQ?;ERcDucY}F4TsSO|UkUY&+p-ea-_K_3BNUY`k!!?#=^A zM3)mK{W?4H(@aPtkv%QDk}FyG}a zs!yX2iMT>OL(xT%HAQjtbI3s4Kv+Rw!B&L75L*ye5Lwr<`T+B{vbT93!fGkEl-DP5 z4}blWypHZcxGWV=UcfV742%dX+=!nntYOJ7L1fj3U_yZf2BN3D`jQb3SEOXcY&#Rf zTA@eUV?th`1!H+tyUgaVL(x%sj`v2H9Aaq+m`G5NuHzCm2${VF-j^LA*%rd1b+6+C z?bWeg0RB<0t>a<7;EzyUwnofPG%K8&eKuzxm#h33GiKXAUVD01%J0~`^l4yE<|J@) zmq|E@3{7>|!Z8K&7WaWAo0caStTMN<>(*_Wt*o_wIVEZ|#2h+BH7sWH4HtTvqj`L z&6#G|f5op)VjV7l`JG+*StVHpn4OO$bbb*R>y|#gZr#eZSqV z!T*j&{R)zt@ZdNtarWBj-G-ZfoS?GX8elSl6aJFPe#j*cwgQ6*D?JlWyI}80Cjs5G zltcm@N^FN4AhjFJxAXGrK1|&j&1J%ofer4CWkx%=;(BNkW z6Qw2PRd{d5;c1Q6Ojzy>EUe_oc!ev zs<_cL$j%qy>at}oy4OAD47S)a)J$MANjC!IKwttjoFJkpTTWVmAz@udHma1GF~e!# z(oQ-G;n#~SD+DA!1yo`D^BU@Kq>01J(tp90X-pP;->~k?tvc&;dNyN=4@Mim&p90#XwCw|wFc%QMsl+kVatXYW#Vi? z6d9B0Wv45afNlDi8tl$`Ao(L&CHf2CN*yrSv@&?(GyIyBF}nN4vNPD+aXpCY!{r`J zEK7fLr@l~Tl_4jjF9mydc#(+j<9I5}5rz&3T&zF(V9drgh73CaF^eq>&RNPHd+onm zP>QTAa4}Z3x7|LH>510^))(x_opXJ|aAFE(L$RGiTAoc!m-q>3FWRyXVmnOULai^k z;5<@N#AatOD=a&r8^kgZCWB}ceU_cZ+zWCkU_@R=-H8y1;K@NQfQwWq1DZ!;`i~8- zJ+hmWOrF?6^#s$M2GyY;rs)2TP#&nuUfmy~F3!aYX2XROKJ%v6hEzyKBepMDocA#+ z34JKBl-FK{6%3Z-M3JKTU#wXu>f5*yGDoJebSr!!HbEOr=27fPqBs3%PiYrogG29+ zIDQYOpFh(R*=RmZ&9MA7C9zRwJ^-mVE$y&k>X~^ZaeX=$?aDp?N;MMZKj=SF?n!!}Vo^uE}xmvdtfOCG`dXrY4Y~;#uP-VF~dsNXhV%9f>|G2pxZEwvk2!tyama$Lw;hKy~)TU z!?yV&>wIo?84#W92>IRi8jEhH>9>6#SFlCwurTv<7FeZ&U4<*VFU;9ew9_uaZ;t&d z*0z!Lf=1Q3((M^_JAf-1L!eo+3#+oxc>hKb?c6X^2R8 zBfp;4=YulrNqK2&_(m4?DezPLi!cKi<_f`DvoqhFsEF>Sn|O6tj$C|oH=u=JxdjJa zSR#TBnlQSRn66<%3A4SR5f1SZHjwsmSY|wcQM+q|RUN!3f=GoX+hfRoHF@SRunBqUrd7+h}goS(n z+Ik5XJqHaw_oG}cXRq~ri5IrGsj6F>8<;5Wo1Cma;9~wu$Z#Bm7_tiVHMz?!L$s)Az6|VA>)hUEIbi(gvo# z-^RzZD6h$0D2p!H5e-6)m4(kr;^=@YU}7lTpOOKweF*e-J9XXbAn+mO_|P?sRrYV>?v>RL*=l4RlWSTYypmX4$<%J1xMDPKuX45+31WX#u*U3tRvEw4=f^R7 zWefRxScRi@2BwMT`Ye8@I884i19D+K`B*<9Q8Tw-I>9QT0VRvIlwHaNSY1m+Wn+Dn zu)cE8I)~PCw=I>u#u%@hyN-?uLBzoVkptJq4pNk$UgDtwxI+NfW7bRwp8G>OA}RU~ zn0vV15~)p@ID@{W_9Y;q$eWj%^1cR{^w#)fjZ}tTG->jF%@cz@B6bAv3Rsy?EYKY| zBj6^2(>H<>+w}#+8z33m;Lk<<5hhY&7BUm%zPQq#u=HalH<;XH^0Q2Sj>)%?7{L_4 zh}iM(&eUOn!mMCfGOH^o`-k$Q8!7h~i%w$-zWuM9bQl-B93Q0|OjN?o2rJ zVO$sv)er=b>oIqVY0d!h2$cWvo6uaNK#!QMNH5vowjpO~3jeHF4imaf#}dw(#wGHp9H;Ac5%m(nF?d^8`t?MDVvcLEMi^C0Ye@KiPe91|JUd^R2EM49wAh6k*I% zG)Kn==4i77;SN0@L9pjif@Iy_MF+8tbQ21;L1%6oVTxiU@DW1Ofx2bn=#JAF+j`gt zydVp1v-9V6hEpB8U+E!pFlff49P5*bV8dy7^PpM8^U=OW)guA`kTY-w2|4@v9wi9O z6tYafkh8OoS0A69r3Bv`6Ji22lGgf7i2R|&T7EvS4BA6*lm;??70qlGIfq#(9!I+N zY9f3_sh%7lqOsSW+)eoG)YKLhr`{vV$x*z7c;*%mjo=C>AiyRqq7x`6+o~Yq)O-m# ztF?+yZ~jvdUUgeSF0rk~u1-^W1ujr59=KHjR=>iWK|R1h@~#y2k!uP)v|U=giZIO_ z`cg9O1lXEk2F@W^)7r>=m}9VJs^!-GwVd?i=Dq7f2hXn66QLyvkcqmDVtZinXYfPM z7aOAJ#e@O$dY^R=O$PHCc(i|;aaz3TrGm4jXTVjzO1^jkNo_RZ?K8-A>&P?+DCP`W_8~!hm%lK;hqcI?5$Ed7%KcX|fx5AYx{b-We+koGFZ1d{{( zA);u(&frQo=EW}M{x*7f0Y*sZyb^OL2A?>JOpGIO06SxmTt{MJ9dSN6&{0(j;YfX8 zgNP}{%nsfcn=Z^C4BMeO6f#dX z+-Mjv;d61^)i$F^_32His z`vSW=K>3vSy#D|Y0C_vy-}IBhSXtNa;f`KH5}W8GdU+EA=jA2j3_$?pG3b7bCwXW$ zu9RoC*k)r^6nhZ;ePBWE-}c&-ge>=|2P~5RVm69cFPX47?2sgu@gc0Gh$k4`znw8U z+>4vWhgy%?`aO=9%cq=MJGa|Nw>+tTgH+{GZ*aWvPi(9D1L{o|QEIk>+Zn$|B{ZNC zYa>9P)`zSpv&YsY&$y%;S)qx6q<~kqPHh3@@?Gh1$P#s#a=t z7##|Ew`q=#7`uxw_#hpApL7^S3-(8)EF=}Q#{cD9U#ZOZJjJMm_}juc7L}Z!_66u2J}) zmI0&}&4~Up2V#t5`?5H~aCdi5KKSs!Hc`aOh{)OdAO3G-*!v~=hoRXEFFqWYyznBm zdianz8hYlV@mZM;;!F;En!|SgNXmHLWwAloe6-WtBx)B`GVR>?M^$nN8Y6 zv3V}uZX*IL_q~iNd>^ahMs_0)ppwUWDXbTyhc05Uu%Q`R!<$X}Ls=CEo{8(O4%Url zVWKq6@E``(A);nvAkH+b(Ak(6a`wP5#~}E)pf=1yMUkZj5qwSYa@G*NV*+gu*3saM zDkhI133IUexniZ$bP~Zd2HV26u`nwTWoWPp~ zNRftS`WEiO-|#=smCpmeV4pi@I1S!~?zI#cxd5a6z&)Z0b_y^{!Q0=U`7BY0iF+ho zu3szFmH_h2&CzQ>1UMLr4u^B!OMPLB3HVa~FyiNTO%lHRX`;DJBT5bU|1pv~O(eIe zH@jgueH+|ju$zdJU+3i@V}~P=+%ep749xaJ?iA&{5qR4*4rSokdou0+{Jc!t^@E+c zcGJy1L-yHL!~)F=_rbNBoBRKOZ8r_+&yH^=gl{)>=RO%%#P@cLTS-TvJ^{YfzYD(I z-D8}7UEkV9+qq9QB#%Grh1;leYt5y2b1q^W0s#O@)yAa1DZxboQKxuRT5;`wB$-4G?TEY(Lq~cv6-}*)hPkY^Rcx z6;SpF;9C|@Eq6Jy_Ac%e_47<`m3ZzLP%Qsi#(zE-QV5SWr=zKFNsMgElvc>qUPaRw zr*MKq7oSYZCIGO8_z<}}NtlMyms4irt;*v*Lg(WXlBsolf7XsaM-HuBEg|u0ibnp* z;Q1}8>^QKr?OGB&4%A~164d|bfSBs>yaRxTkWfHQ5~IY(1z7T-@h0{Kz5vrD*6P?0 zlA`tfn$!R9opBKlnH@ShC&|ujg2FS?YmZXUnge9fAmfe?`k(c8C{PeDzEBSfCi>>$ zfDMMiFN={KT8Q^bnEfV?je1VCp>i&DsE(Aul^-8dke61lM|2IXIT?E074 zh`828+KRFu>cD>9V1%09hh$=?uT&wHK02?a|2gl=gZ~1#+OV;W2#@J!SyE0Y;v4k! zZ}|iXqW?0IX_A8WG-y|cpivEIRknQ?&UZM{?iO+-s2kL<5JZ8p@=)PN_-mJQ$A1Dd z%dUsEqJbjHLrl=r;LTAD$-T_WN07h{B%yb2vfvFSmrW@hF8VYRsmok!Gul)d#gRy< z1nyiIe9AU0yw4V*d@q&fo8w;43TDC1#LzBN%D$tnuvot|s=KLF-nXUh_e=|7 z%cMozw96bQ)o=XM`B{ zIu99{Q%5}Ar@HvINVun7Pkqw{r+>c6R_B>qW3tF(8A(_&0a(GRgp-?)+BWa5GFfNx zA(Ky;{3?^b#^i4>`970hVVGyih0WHS@1DWQ?U_Ni zmqk6wqG3wAr;(w>Ie^7kC(aL^d63f%@|BaN+|OrJNgzXB6>e4-9R}<4ko)^!4%tAq zDCZI|aQ~6?iOOOO`EPYvO$6UXF}ojDVQItx4$;K@Dh{)&1jOs!I7f*pw z1eQsFD0h)d=D3}NoKFn&(7`~;|*srj9Wn5u;-dDZ}cq-i4K_1C62M|$5)ab z{1HP&Lba8yzGgyqwtU^;eEew#neCx&_H z0~l3&0)(c+$h-&8cLuJrGt%U?^{+Q^XxPP9DuQ|opG+7C=!eg2=VJtBo))_+Ja&*i z=YX9fo;Si#>MjWBl>VQGo!AT{IRQayq|}fuM#n9-zSjgSH}PQ%9=zvq1Rj^b*^KBA zJ>G)lk~%Vh8EW9{#ko1`t=Djle0dd&*ZET4f%qb9p49;}?CA;V184KaWTouPIj1*~ z`gxvUJ?jh-R0{j;%14NJ5W`vS=>_k!;OetZr`Mi@Ga{InOnSgx;NtDpzhhkg+l3htnsx#LN@Hq*56a+_HB(^K?7BGJZ#$;ekN20u_VQjZF`yRsA zaTX>H)2Ee~pPE5~W>#0Z?#+>W^Te4msr5Z6ab?Lk2|u@cSM(K}XdbH0?q`CM=29=B z%NKpz`D{>sIF}9UIBuF!cziZK%Hkv|+nt~1H&6_Te0+7xw6b<$R;FQ=kv^1Me6x(y zk#d8Q9*uXG0puL-C4i2WPfW?v>-?JFhSf$Cu{k{#E~bNhiBHl zHf2VEHMRR`Y=rY{`f^SGGWv+k+N<~57#2AeNciKV~9*{ZGsZsQLnOzre1Rktshy-wQl6dj$19Mgve~bcM+XlTjr2s+akwT@@Nxtcm&Zt&iGBe9MCj^~Fnr&w)kNQ^G)#IQ`oA zZX-T;K@Ck)VXNVTgHaT^9FaGN3rMu|q{8w0@j$b#g; z4x%-Q%5a8HKhESuCbAqj&nfGDpJPkU84cnEnCi?y`pS5T$LFCpK511Dtj44B2T+o; sd9eNfQX5)k0SD+SIAVW*0p53WcXNeOmUa2Blr81P#xg%+{*9gfKRO4CN&o-= literal 0 HcmV?d00001 diff --git a/sbsheriff/Lib/site-packages/disnake/ext/commands/__pycache__/bot.cpython-310.pyc b/sbsheriff/Lib/site-packages/disnake/ext/commands/__pycache__/bot.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..8c3d32deab7a9368fa06af144058554b67a16040 GIT binary patch literal 12197 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 JZahDk{YT7hbu$0} literal 0 HcmV?d00001 diff --git a/sbsheriff/Lib/site-packages/disnake/ext/commands/__pycache__/cog.cpython-310.pyc b/sbsheriff/Lib/site-packages/disnake/ext/commands/__pycache__/cog.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..0d9e98d7c314558c83dc3b36eda22612cb3c0031 GIT binary patch literal 29362 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 literal 0 HcmV?d00001 diff --git a/sbsheriff/Lib/site-packages/disnake/ext/commands/__pycache__/common_bot_base.cpython-310.pyc b/sbsheriff/Lib/site-packages/disnake/ext/commands/__pycache__/common_bot_base.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..c45b3fbd10b78cf721d262cbac0327f0dd3af0ed GIT binary patch literal 20728 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 Yh9`r@QN$*a;6)RNlaCtN#L?vc25-lwVgLXD literal 0 HcmV?d00001 diff --git a/sbsheriff/Lib/site-packages/disnake/ext/commands/__pycache__/context.cpython-310.pyc b/sbsheriff/Lib/site-packages/disnake/ext/commands/__pycache__/context.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..f7d6641cde6b559e3f9d04bcdc9b0f2199da7dd4 GIT binary patch literal 14368 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 literal 0 HcmV?d00001 diff --git a/sbsheriff/Lib/site-packages/disnake/ext/commands/__pycache__/cooldowns.cpython-310.pyc b/sbsheriff/Lib/site-packages/disnake/ext/commands/__pycache__/cooldowns.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..3f63eaf949f81e93471290d7294dac2b1a9bfe0c GIT binary patch literal 14051 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 P`4{qP>{|ZF_{IMPfF7P6 literal 0 HcmV?d00001 diff --git a/sbsheriff/Lib/site-packages/disnake/ext/commands/__pycache__/core.cpython-310.pyc b/sbsheriff/Lib/site-packages/disnake/ext/commands/__pycache__/core.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..d0b559b1b79fe7e8b24bd0e4f54f0be248763279 GIT binary patch literal 68157 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 literal 0 HcmV?d00001 diff --git a/sbsheriff/Lib/site-packages/disnake/ext/commands/__pycache__/ctx_menus_core.cpython-310.pyc b/sbsheriff/Lib/site-packages/disnake/ext/commands/__pycache__/ctx_menus_core.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..18ef6557636158caa833e001ee3e0b9e7535940d GIT binary patch literal 11893 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 H{=D-qEp_O^ literal 0 HcmV?d00001 diff --git a/sbsheriff/Lib/site-packages/disnake/ext/commands/__pycache__/errors.cpython-310.pyc b/sbsheriff/Lib/site-packages/disnake/ext/commands/__pycache__/errors.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..5c5f04078d7f0790b38bd9f45630c015fd006b59 GIT binary patch literal 38075 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 Iv32wR0j8qymH+?% literal 0 HcmV?d00001 diff --git a/sbsheriff/Lib/site-packages/disnake/ext/commands/__pycache__/flags.cpython-310.pyc b/sbsheriff/Lib/site-packages/disnake/ext/commands/__pycache__/flags.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..b0388210fdedc411dcdd512d39cf46d13c48ecfb GIT binary patch literal 16675 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 literal 0 HcmV?d00001 diff --git a/sbsheriff/Lib/site-packages/disnake/ext/commands/__pycache__/slash_core.cpython-310.pyc b/sbsheriff/Lib/site-packages/disnake/ext/commands/__pycache__/slash_core.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..2648d18d304c5fd5681149132577a4a4e567b63e GIT binary patch literal 24498 zcmeHvTW}oLnO=9#eK5EX04b89s1YfVgiJxUWbaxOMT;VJp)JFTN!hCr>A_&S0Sq`7 z=yZb+W(PJUXhSBkHkZwPsSTKH*2~!@}1Ke9xfXAeE;aa`X9Vz82^hG$q(;7Z5XCI zZyJVe*k;pcnHAGy+-h1COa4=p6#i4qbSqQIw6c|KD_6<2@|Aq6P${&Em11kCGSn(n zO0D6_aBHM8BJZc0qph*Zn8Y*9U9IuTcx$3EA=laFWNUY2x5RVJJ*|5x_eeb7+}qk$ z*(dQrbARjJ%Dspe?V;v@)_s-xS_dl!<+{|o{{qv8o8{I6l?PgfDu+zN$tVx?96?!! zD~BbIQRMw#Yw3Jz-D2ZB>rhr|f&}18=1(Q}&na z!}f!SJ^Z|3KV%GqnR zKT~TqYjaJT*rhTGjcLcHJL#USCEvb&`w6a%UDhjk?3=uBfVEe;{!*s3$va zu2#Q1mG*Z>6-u_;A3eV^7d-sD>Z~mL#W=wqcG*eQy6z=^IQixUb)O!=%v@)sZTo50 zY0lq1CLR82oX7F_-Ze2H*j3x7|acN{d)k`f|*Nw}TnzXH6s+zK`b;~r`=4;uW-AjXJOEb@1=mu0*KH8l;TDCim z+dk@*o!3E-SkG%(!uT{>+JsFT1#X@w}%R zuU|atT)F6a9o3psjfI-+RNX~KHRk6px^rRd#m3x4x8XUDEQ3~R3yyoyZn*8*W#>`n zb??z&_}xdt>L_P=dCf1_PQ9aQ$aw|@yBvkASv1pTw_HuubNXbHlgT|b9lbD>mWs!H zB(bTipPuX3Ykp3XhU=$=I7-Rf{Ngui%@yZar8>$Vd2I!=biU!(LPk>==>zEvKP!Xc z`dOWsdW>E4Sq6_X_#6U%xUZt8k>u_{kWQ7*kSv;#HmnZ4$imCmRqaVsS7fkb`0 z9Mk{#9 zWNex}^QK9Hw2c)*4cj0W&+4T&Om~7r+RgUTOR1&wdghx(dnj#qnKdweer;nt^9l%m z)#zDE+4XD>6JRN~lwT@5WpwxVGLqj@y>t)LWZr5Rz3lIrziF=L+C`*gBsCSMBKLjB zy|`A>xd-pRqTk=J@E&TS-`hy7=XA;5&}ONZyJ@OsFLw?#dI7cX<<1-GGicz{uzCc4 zehR$N&x2xw<*Vb8R_`qMBd0wO^xTRUj{bb3*~HLC)MD4Xnm;n%siT|2Wc3BUUm#!C zG?Qzz-DL->$WX(rt=1YIdGu6XQ_fR(Se;_SCf;_l#tUz zm9_4pDfJD!=>7@<>uM>R2SM>?StYZCnDs#xq-G&DX--<{t4zZk#H{yV|3Wy=KgtcHS<$HBw1C8GD~yvWMRSkyNq;EBxB~ zvDWXg?|Caz$z3zjXf1f$0d){r*8Vq2I9;xT`@3atu?F5op3`#L9y&HCDPyHC*OgQA9J`El7n8TSb{u@u^_-f` zjMwC`@R2Kx8WSaxhv4}L?5{%KRHo8Aq_h*i$!Nv zl7m{7dAr=1mnH@+;H`cxbBFimSDMYJ3z!)jS8uM^jrKwr>;U~IWw=}`*pKxZdIkmR z&U07hLSD;ON)6oUsD{rW&3V1XkvJ}INA=Pb=UB|nKH6zJWpA~ECzRvN&X!j@D^0sR z=iuI!TRLk!ed1P4YsM7!%;}fTm6fxsFp6z0sp&pyxaGLUIxo^cK%%6{FQDyNv}1<>mQWqq(9qrMB6J7&HnV9N2l)X+@cxK>jCY zr_bmy7A8Ggb{E4Yl9x}HXF49sAScotQJ1lhQrO=1w(NNSIbDa@xCta4RcjzmR+Urm z1epoS@3gmwTUfL^3I5=qKRrzc5Q2%3!0uL^K?#}h}y~23nb*u+!B^E@Y6MpL%p*Mai~0paY5sn zjX8xe3V36X5on64N)4Kaed0vp>c0+Aa`KsH|0mzo`>QS6}4K++xiIxheGmu0lzf>VxjP z?B&&(T5$b5m#r!!_FK?`t5sPkt5q%OP{>i=L~sK?_ZWgwZa?H?3(~ShvBu25m(6BV z5Nj;!C;621zLi1x2kHOY-Fv=Y&72O~Cn}OOX`7xzT7%qW{+Pr@;WrQzq4uy@_&bch zEkc-j9BKawzaLXg%v#;attC^%P+#MlLL6zbUcXrHw87G#%s}hltfl_IS$=y&W;q5y zPwv}C&jgYwv{TKpn7~C33_dRFQk}I9KcO_wDf44WSazNY<~8eD>RS3*=2~_>XJ_mz zRLvaa;i*Eciq=PS{d74Ne}oBY3CV@%g&_}Ru0W9qYfuU!?lwkGDCH%hwW>|&RhC7HY zStkv|(o31mEUwZwP1ER^81dB1t&E<^5oxM<6sZ;w+&0ToIjNt_W&PYMyesot=r~(j zUUp#0N=dUYkDXO99?2WGaym1~n>ngW45%B)EJ(~GndDTK{|kO@8G(g~ZGB)_^3REW z+sb9%EfvP0tBhgVcceQz9Po&4X_uip;p(Ub!xr0STszpwFD>K8-t&;97u7;X>NQ_;t90oF2 z3yewsHW-skmJpjNkfRH0t@_1kwbij#nhv;osamBJAKb}d?djCPZpmc*JOl=;1>TzQ zH03gFIAF+j@kQS<6}pzjmu zm2AQmy;56sQ#aD~gQ8sy+arN?`H;QK9@p9>bj>67q`h0Na{4+~}2-T=e=NIEA5K45{LYK1e|46>(4yA!&J^|NhS>o2v=Pe$vE z2ZUM!RokCU<4olDX;V8BRsW^#S^jzIp0S)dQ2z{tI5LT(BHDsg@6EhptdaOxQ{GGrq^~tNk{krQXuLNsdGFA}u!XC>jBALWe zK)(Qx)D|!VmmDg~l9|2ISudULK%Z_bI{ECzUphneL)T6gYcH?ua3@HZ{! z$+^Gm$6#5L zkk9e^Af1A8emk2VsGLunkCgK*difEQ-KP>!C+F`B71=x@)XSHkz=#V6ax>L$J+hQ8 zw<_n9=%?|%DCc>ryC+d{!gzCMdw{AjXS$5k9D_jxu^Nw|AY~)cO*pxyMg5QcJmbuP z&K~tNf<6}<=PV`SAF{3V3%+4e0qnun)k|%pLkE^_x%SjRvpI|hRh++MEyER$8ND{Y z!d_qr*44>W_h6zQ1~`%YG%eE+Gr?O%4!8 zrgryIn=r?oNT^>wuOBpoISjx`R(y3^-0+vt(>L;~k(!HO*YW>7|w>ZR<;``&~xYga2AYPrT#v>dwBIT~I_((R`90SSX)FE5Q|Ia2`T@%P=Tt1CI23=teJC_F4N`fyiYl1*Y21+0Vn^F$KqZ z(SE@`Za)HZ$B=!_e%$^%VkP^__809Z5F56?VxO>|L~O)@Oj0ObjHu zFgLy`P^;Q3c>YH+kOcJkskV+pZQ#WE|JyV|2_-i7OrK8x6=T==Y4}vN<8RKPVi)pC z`2GSv0NnP0+xn9+kAz(BW3i2dnSI&}BVoONX%+doT16IC;2W(rY&hj3Ac#PLBlkQE z7;w+S4V8dha5WEs7w68xlOA9!n3+rTN#G<42N{%3QI2?oeyj+mKp+Dky3p**)tbTF zi`Dpgdb_G?;+1XOegAl0m>k2P=H7DRS$7?4#BQf)|m zGV2-GpoW$vq1NrjZT>6q6>Fm%wBKUvEd-Ep1E>u#Htrzn)iuzkOKqeyLhDu595?s$*|3UG zM&ZT$0DuyDpJB@ygEKm`Y-LjfpOoJ19vlo@2!SSk1|tMa*8{BDQ3TP9L0r^Qs;2mv z?mt1qGd2RSH7u~kk~s4(r_?y(o2i?y0##v!T}so5kMu_v57H%VGb4tW!ny^-leJ;0 z2l)FI3=V+m%Ir4sI62;xIk zq=0U%86hknsA=nZ4UG)qu1Z%B? zut=wsiE6cjJp&Ec{i_-t1edcYa^z}28i-o^Px}8N^zrSW(&B|BMQ%Ylw6o z7+isbf$}a2n+j~9?5crf^2Q%WW!^WqOl_8MHN;?nSuHXUbiop0JEDx#W!wdh=yg~y zqXl%Eg=HX)2)lVG0YEsKBRqNgI(&B)71~J>;+S6BlK!a}5H$T_xZNs=ilwGU5v|YQ z68ZYe#{$km@NR4n;=@x3>kl)5+z?x;GaLLcgp_ruR=A|ipPT3+rbPuyNf{{=i= zQAZ|7;bUoHBEL`yb)%Lh%4JPI{?-IU766;WAqsKeu^W-4lPrSgx7SqqOlzXp7zB(d zby4V{QNMj8?}U2Fg++wZC@yFjA@8ciFZLl~{Dm%x@;O_D-XGBbgE4@07Us$6Sg zBZ9pKC#MI0uEswDiw>0ga;GhT{r=L9_hq%#S;6ivqQe(!R~%9xHg}#lHx+!f+nM7Fj5eA1}br0*|JgK0&GD3L+lCf#!y3o7k~9 zAy?K?O0LstVu5$9YKpF!J{Y3a2SemOMnVm<0r(JdHgjc)fDe%)5ZI7FBJg2)2Cf$@ zD@_J11i-7Mnt&RMED){uTM>wDK2GNWEZpM5>@Z=OLG0{$43}v%)IEgAL2i2DcN?5= zvJij?KRb0m;6~&|`vc9`W`|lJ$=yBWsXnNO9YkZ=Z+s7mH>K&23 z0(rbtr}P+pu;z;AQ1mZ)jAFR&d^!O7>OG}}+FraE(f!>m&;si%e@d2VUD=<*Vof%~ z&z}v$+_qzbMGrPu@XjwL+Z0kx;D%V!?Id{@nC$JmQ)m4%GSGvVN`0a?87L>4Fi=i+ zu*_5+1I705J_d^Gh=F2bxNY6Qc5&J1YU0g7tP}YKtW)wD%sL_MizYA9x#pni4^W@2 z9F#3cV7Ma=s{T1{!0RUOU*bcOohVrSyz~p?rSyyS^V0PDRyzCMWH#WUCq9&m>J1`; zcxfLdnwqkJg@vVu`$ponN?pn0HOv1#W5RM@MeH8dl`MDiV0xr`^e*dk7v5v__mC-k z#{SNnGjxc2TAjyg6HQb%83+NyR6yV9v+P+?f3eU#G`L^;G;-Qk^d9t#>}ykhl?im} z_AOjlBw*1J$csyd?i&zAaEJmxKI`f3gJRk<)dA1M)-D(|fH0v+4k_5_4fDo^rST%` zDd03x>H!+nFn3a$Y3_#TSvOPMhmN$AdOS4t4SEJRjMU6?l?idLhs%CdDh>)fgLNXdp*M^t~qY6#ZhSkk|i6g;jZCy>Lh?&R}C4r3*ycY1)Pf9Rpbsrx*N_Wg#yX(Ki z_CAeZM|6_9&PP7O;4d)viww3<4SnyksH^%*h;*m!RGU7^=`)kjv(EYaLkg__2N9r- zaM;GCdD8&m$XZX~ECSGlh_AbV+DW&6HAt}_(3U|*papIf+-L9NB zKwVyT!*ajyW#dgVptRGyOpu4gJlfd$j(pNy&c^n3JjJ6w@-P+4`3UaI$Ro`>)GNrn zfKv%lpj`a-a=q*l;F1W3Hc|oA=6iXe=2hfU0z5Jgpk#!RBAxO#l?{aDNi_dQoPxLa zoe7*jFfTyig$u~*bjsXVj4hR4!4oi~K8HVlx19STPgQxIi#Dny7K+n+s@QP3C7xg* z&3VOG`#f&RX#lb^_!+U=`FX9cVtXmMLI^12Z1*!#j&E`cA#4dP+s}wBrkGP@TqBH< z=ZQ#Fw~&p0Kocl|NmpvHBlgjTL)xeD&AK`Qz+o14JiRGs#Kh`k<*jjA_^dsM?SqDpq%Co~z3k0^dAiLv0dso= z#759t8w@rCzXem^_q(H*1ju#X+z!(tiAw(83-aI9%WTR2Mlyd*)?o=k;F$!0tAB&; zRzE;6H6%2w{*Vc=XhVus|CWJ>HbSbu!%HqOm3^9egst}T%_L$?{X4!OlEfb|_U{?I z!=Rss`J)Zl_g@XS!hVPJ_cR{V^p}P;nXZC<8ngg_9YGqL1Rnss_CY>vfjV`{h@_<7 z?>;n`GPji1M~qx6BVz1oVl+0f-o=C6z0rLdYb9I;feL?!@X?Kkr)!QXTnAS?=M)1oZ91+_V}_HuyF#421Z z32JkAX=H6JnHr!rM}@pQ$ZvFWEZG*+byxB_Ahhwd?}E@Wg4&ea;go~Ju9p$iX6D&abapw{bkZkOrQUOm(MboXYe+I-(*0wT>TXWB2SQ9 z)n8-qTMYg>gTKMxZ!-8>4E{EQzk{Gpo)EJAZQi=UU;x<);_V%h>RCJifTfwXMuY&f zRtUO0X!7)zJ3ub47SjpH<$*hq>(uzp?&y12M|vLA?=$#1gIf&FGx$dgeviRFW*|Mb z&e-=D@HyxP^!LPGG#&f)jweHyL{4$pF~?%nNC@CEBKIJrvw5~TJ19JRR&xy)xTyy$w*;IF_aLC zaIYROWA0Ps<>wgOhu~Y7?BcN$XyS1VO$@{FKN)%4n$RG{c*kYwwsjT^=>6h!ai};} z%oO*JAH-@c-9qP6Vuyp&QwBl$U%Fm8E$+kkjV)srkL-@481?_{$L?g`8c1N5>Zq!G z3J8bdpXok`i`dGgH??2OUCUo9%ohWTSFu-w_*AI9kSC6D%Z~Or4Z5lILuvyv^cIKH z7Wghjl8+J8Qa-Ca*5X&1oxPw|oY`3ob)iN6XY%)Kb7%G8hwsiv7Msp@_GaCkCoAD~ z`k7mm$Sd*-B^w8?j8|U8fn7YLO=in9F-6U zHVDz}PKzHh$nK76^Q){ z!NEz|0|ca&S9^UH{Uj%3X(H@9Q{+Q&Ts$Er@Ze$#D{v|f%F!UvvtLadF10h!hX9W4 zXQk{&G}8$P6PzZYHINv*E%3V_bHK}9TWR3zqcUM4!BLvx*z*z%(CugUo_BC?4^K0} z!9CkgUBW?wJ00&bE1BAkhrJm|hi*)C+x$@x=xYldNoyji#ZgImaB=#MKAo%HZ1B7< zq504lCG-#u2dE$90S~*BkQj@vAz7{BkRoQ37{74(gt?)+G}f?*6Mon&vET8hKpQ^O zXansSIXlVYg!Kh}Qn?=NQ~j9ysUMRs_3r$rF%4nFQ1Ve=Ja?RU$N5Cy=WRRa?mjDLK+kqE@{Rtnzmv9GiPr6={$GJqpLf=s?1I2`d2VvVf4-);b6J6Sa zkBo)y-UgrOKgT5@>58OC@vP5708z~-;Wt5x)iNRiL4@VV9r0j?f_9POSuO9t$@->A z$Euxzwdfw)6MNG2tUBUlM1XAqG%xe&V?#9PzdkBc_|TDz2A=Y~boGdHYnV1M3g*hd$hwP}gY z?x(=SaMY|d{n<)B@zz zKX<4gr2o_!%Kk}L3%cQ;$9)ya#WUOeFj8k04P(qtr8-FMSyMf@|A{fFeHpPIu=X6* z@-yk(iYcLjOQBwSV~#K;Gwc}e7qvnCBvYSaAopo@+;K}8RP!wgjHrWyG|;=yVnpwe z(TP>b|Hzs>%HwtBSHLB3ypH0$&NI9Nu@@D*(NYF|8D)H9q&nwqSeXY(Vtk zapJCYU}YkFIw23K3FcEEC=Z2VFY0bwiz5VwmGQ7b9Cj>nqpOV@`*@qoKuJ#@K+Mm5 z_1yXMJXjq^4Ph#viyq(uPcjfaSgd&W^HPYd%$N{+90*s)pVVgd@f~Y6oEPE$_@Dkih)0Ur literal 0 HcmV?d00001 diff --git a/sbsheriff/Lib/site-packages/disnake/ext/commands/__pycache__/view.cpython-310.pyc b/sbsheriff/Lib/site-packages/disnake/ext/commands/__pycache__/view.cpython-310.pyc new file mode 100644 index 0000000000000000000000000000000000000000..b0c87fa7dcc5352695a2bcc09bf5161fd6fb1861 GIT binary patch literal 5033 zcmbVQ*>4-i8Q+~c%TodJJh%$EU9s!IXH7!vVQHfMZDy|6uEX7$$D^a`5 z?9#GS3UFcMch9Zyyln|j;qgVb)4YDuU zk-@;%aV=WvsRQlWOMU>yJFtDrlZxMAHP3+mOqQ1l)8#9fVwUGhe7;zCH8+)=;uDz? z<`ZdtC0Cv)ER;ER6f^nqRbH6pnfz7$#aw*x%t^#7HhfuYfGgH`_Ek)HX(lr}ORTKS0;Dg3Pmxa+ z=C2lWmuJd+rZ78|#p0zbB+Fcy&4#R?)Z}a?H<#v9nYqkmlCH=Lpi;DGTPPjBGLxkx z;+MhSWI0#JlNytSe7T5e8d?_1dq=P2O4&5e6munrYE2glAW!DR39?z9&gHWq6*9Fl z(4I%Ig$%X;rT1i+%4TLk3+~DHZ9ZdtsG~ZjjP7{$dJCavi^-EA zBK)He-+4pfyEncS;crLyI}!eFgv0Z9Z-nRX-FaQD-;2)QyK^&|-wN@sL%R3g|8Y2f z|0f?Y$ot!$hUiyn^@AICBK%8*@80-EgufZ#uSfXJIu7@JNc)R;`~bk#Dmq#aqZV{a zs~EP4wqxEx3qWH)>k%wRcU&mpNRkaR5JzyRECXEcWY6=asSpGw7 z(^3Q70ml{g^=@pb-DuddYcy@QYuK*n#?fZ3IbPdOv95_i*^omxaa)r|fbM@~^1|YR zkG8Q$GF@Lp4_fpCPp&VafYpRuMJbd{qp|2O^+vPK(xUGK_6x0AeXX`^`-`Z~)WFW# z*MqZlZ+#tA**|*?+MQ`_cH`A5dQniVeir=vI6zE~=@!0Q$M@}Urnjq3f#3Vkc+Vgw zFzINknj9e2F@iBx**M0x^*mC=u)R<>Nf(gYx*P>kT87{#rrp7MTS|1g3z+ys`UKlL zc0i2i^~0q|;tWYa{MQCbnmmq$6jMCqFvju`0%Y8MwsH*9SMVs7Nwzg|fF;EKU)WU< zsr&3kh(780Aa-4|?F#SG9zT6+^Z-A4*T;}jg8ZVw&c#6J+hkkKe{O4x^u&YUJE@Ip z+pNQOj9twiyP~J{C;3_pZh5bNI9k0GZ;W@72ZOrqC$b{4k-#%s(J?s zgkf(Ul3OLfZ5H|^hWlW<85|ZmA?=!|(p_;8yi`FTkC0Ec#tw+Px9#Cxc=3R+$_t25 zvVPAeBr>870xQew9audS+&Cn7FP3yyJ_VwOWj0BerJlGaBK!7b747(hS@*JP8fUkx zJ;R2%M0qoWykVPQZBaHx)lHQ-Sisgl5H)L(qM z#6kl- zPHb1#QKE6u+C_O*YmiabUgI6ZU+d_BiM?yV5EZmHbWnYhqy@J(_qipt)>k{Rog^e3 z>$R3GB36|IuFpZ0eqdJ;>YiPt`^BNu8l^Zspu6I#_6`~junvsGT4lf{umL>qZUTOY<+qN$yw3waGyMyEYmn33 z5rY_qeM9UuF7W&MD@Z|g`%pzkU3-*k9&q=e3!t=HvReHOXUy?Iw+rRhYTf4ByCOAVL>g55K2_&9DS0{wf3>$6NU%fe8ZC(o{f6 zGKf4&;2eQ{U#bz^4<)7eXYiScOznDYpBQweVY!0(OnIr6v<|zAv Qd4&DmJZj!Mb^Ms|ACoz)<^TWy literal 0 HcmV?d00001 diff --git a/sbsheriff/Lib/site-packages/disnake/ext/commands/_types.py b/sbsheriff/Lib/site-packages/disnake/ext/commands/_types.py new file mode 100644 index 0000000..6283913 --- /dev/null +++ b/sbsheriff/Lib/site-packages/disnake/ext/commands/_types.py @@ -0,0 +1,53 @@ +""" +The MIT License (MIT) + +Copyright (c) 2015-2021 Rapptz +Copyright (c) 2021-present Disnake Development + +Permission is hereby granted, free of charge, to any person obtaining a +copy of this software and associated documentation files (the "Software"), +to deal in the Software without restriction, including without limitation +the rights to use, copy, modify, merge, publish, distribute, sublicense, +and/or sell copies of the Software, and to permit persons to whom the +Software is furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS +OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER +DEALINGS IN THE SOFTWARE. +""" + + +from typing import TYPE_CHECKING, Any, Callable, Coroutine, TypeVar, Union + +if TYPE_CHECKING: + from .cog import Cog + from .context import Context + from .errors import CommandError + +T = TypeVar("T") + +Coro = Coroutine[Any, Any, T] +MaybeCoro = Union[T, Coro[T]] +CoroFunc = Callable[..., Coro[Any]] + +Check = Union[ + Callable[["Cog", "Context[Any]"], MaybeCoro[bool]], Callable[["Context[Any]"], MaybeCoro[bool]] +] +Hook = Union[Callable[["Cog", "Context[Any]"], Coro[Any]], Callable[["Context[Any]"], Coro[Any]]] +Error = Union[ + Callable[["Cog", "Context[Any]", "CommandError"], Coro[Any]], + Callable[["Context[Any]", "CommandError"], Coro[Any]], +] + + +# This is merely a tag type to avoid circular import issues. +# Yes, this is a terrible solution but ultimately it is the only solution. +class _BaseCommand: + __slots__ = () diff --git a/sbsheriff/Lib/site-packages/disnake/ext/commands/base_core.py b/sbsheriff/Lib/site-packages/disnake/ext/commands/base_core.py new file mode 100644 index 0000000..eb1c21e --- /dev/null +++ b/sbsheriff/Lib/site-packages/disnake/ext/commands/base_core.py @@ -0,0 +1,708 @@ +# The MIT License (MIT) + +# Copyright (c) 2021-present EQUENOS + +# Permission is hereby granted, free of charge, to any person obtaining a +# copy of this software and associated documentation files (the "Software"), +# to deal in the Software without restriction, including without limitation +# the rights to use, copy, modify, merge, publish, distribute, sublicense, +# and/or sell copies of the Software, and to permit persons to whom the +# Software is furnished to do so, subject to the following conditions: + +# The above copyright notice and this permission notice shall be included in +# all copies or substantial portions of the Software. + +# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS +# OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +# FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER +# DEALINGS IN THE SOFTWARE. + +from __future__ import annotations + +import asyncio +import datetime +import functools +from abc import ABC +from typing import ( + TYPE_CHECKING, + Any, + Callable, + Coroutine, + Dict, + List, + Optional, + Tuple, + TypeVar, + Union, + cast, +) + +from disnake.app_commands import ApplicationCommand +from disnake.enums import ApplicationCommandType +from disnake.permissions import Permissions +from disnake.utils import async_all, maybe_coroutine + +from .cooldowns import BucketType, CooldownMapping, MaxConcurrency +from .errors import * + +if TYPE_CHECKING: + from typing_extensions import Concatenate, ParamSpec + + from disnake.interactions import ApplicationCommandInteraction + + from ._types import Check, Error, Hook + from .cog import Cog, CogT + + ApplicationCommandInteractionT = TypeVar( + "ApplicationCommandInteractionT", bound=ApplicationCommandInteraction, covariant=True + ) + + P = ParamSpec("P") + + CommandCallback = Callable[..., Coroutine] + InteractionCommandCallback = Union[ + Callable[Concatenate[CogT, ApplicationCommandInteractionT, P], Coroutine], + Callable[Concatenate[ApplicationCommandInteractionT, P], Coroutine], + ] + + +__all__ = ("InvokableApplicationCommand", "default_member_permissions") + + +T = TypeVar("T") +AppCommandT = TypeVar("AppCommandT", bound="InvokableApplicationCommand") +CogT = TypeVar("CogT", bound="Cog") +HookT = TypeVar("HookT", bound="Hook") +ErrorT = TypeVar("ErrorT", bound="Error") + + +def _get_overridden_method(method): + return getattr(method.__func__, "__cog_special_method__", method) + + +def wrap_callback(coro): + @functools.wraps(coro) + async def wrapped(*args, **kwargs): + try: + ret = await coro(*args, **kwargs) + except CommandError: + raise + except asyncio.CancelledError: + return + except Exception as exc: + raise CommandInvokeError(exc) from exc + return ret + + return wrapped + + +class InvokableApplicationCommand(ABC): + """A base class that implements the protocol for a bot application command. + + These are not created manually, instead they are created via the + decorator or functional interface. + + The following classes implement this ABC: + + - :class:`~.InvokableSlashCommand` + - :class:`~.InvokableMessageCommand` + - :class:`~.InvokableUserCommand` + + Attributes + ---------- + name: :class:`str` + The name of the command. + qualified_name: :class:`str` + The full command name, including parent names in the case of slash subcommands or groups. + For example, the qualified name for ``/one two three`` would be ``one two three``. + body: :class:`.ApplicationCommand` + An object being registered in the API. + callback: :ref:`coroutine ` + The coroutine that is executed when the command is called. + cog: Optional[:class:`Cog`] + The cog that this command belongs to. ``None`` if there isn't one. + checks: List[Callable[[:class:`.ApplicationCommandInteraction`], :class:`bool`]] + A list of predicates that verifies if the command could be executed + with the given :class:`.ApplicationCommandInteraction` as the sole parameter. If an exception + is necessary to be thrown to signal failure, then one inherited from + :exc:`.CommandError` should be used. Note that if the checks fail then + :exc:`.CheckFailure` exception is raised to the :func:`.on_slash_command_error` + event. + guild_ids: Optional[Tuple[:class:`int`, ...]] + The list of IDs of the guilds where the command is synced. ``None`` if this command is global. + auto_sync: :class:`bool` + Whether to automatically register the command. + extras: Dict[:class:`str`, Any] + A dict of user provided extras to attach to the command. + + .. versionadded:: 2.5 + """ + + __original_kwargs__: Dict[str, Any] + body: ApplicationCommand + + def __new__(cls, *args: Any, **kwargs: Any) -> InvokableApplicationCommand: + self = super().__new__(cls) + # todo: refactor to not require None and change this to be based on the presence of a kwarg + self.__original_kwargs__ = {k: v for k, v in kwargs.items() if v is not None} + return self + + def __init__(self, func: CommandCallback, *, name: str = None, **kwargs): + self.__command_flag__ = None + self._callback: CommandCallback = func + self.name: str = name or func.__name__ + self.qualified_name: str = self.name + # Annotation parser needs this attribute because body doesn't exist at this moment. + # We will use this attribute later in order to set the dm_permission. + self._guild_only: bool = kwargs.get("guild_only", False) + self.extras: Dict[str, Any] = kwargs.get("extras") or {} + + if not isinstance(self.name, str): + raise TypeError("Name of a command must be a string.") + + if "default_permission" in kwargs: + raise TypeError( + "`default_permission` is deprecated and will always be set to `True`. " + "See `default_member_permissions` and `dm_permission` instead." + ) + + try: + checks = func.__commands_checks__ + checks.reverse() + except AttributeError: + checks = kwargs.get("checks", []) + + self.checks: List[Check] = checks + + try: + cooldown = func.__commands_cooldown__ + except AttributeError: + cooldown = kwargs.get("cooldown") + + # TODO: Figure out how cooldowns even work with interactions + if cooldown is None: + buckets = CooldownMapping(cooldown, BucketType.default) + elif isinstance(cooldown, CooldownMapping): + buckets = cooldown + else: + raise TypeError("Cooldown must be a an instance of CooldownMapping or None.") + self._buckets: CooldownMapping = buckets + + try: + max_concurrency = func.__commands_max_concurrency__ + except AttributeError: + max_concurrency = kwargs.get("max_concurrency") + self._max_concurrency: Optional[MaxConcurrency] = max_concurrency + + self.cog: Optional[Cog] = None + self.guild_ids: Optional[Tuple[int, ...]] = None + self.auto_sync: bool = True + + self._before_invoke: Optional[Hook] = None + self._after_invoke: Optional[Hook] = None + + def _ensure_assignment_on_copy(self, other: AppCommandT) -> AppCommandT: + other._before_invoke = self._before_invoke + other._after_invoke = self._after_invoke + if self.checks != other.checks: + other.checks = self.checks.copy() + if self._buckets.valid and not other._buckets.valid: + other._buckets = self._buckets.copy() + if self._max_concurrency != other._max_concurrency: + # _max_concurrency won't be None at this point + other._max_concurrency = cast(MaxConcurrency, self._max_concurrency).copy() + + try: + other.on_error = self.on_error + except AttributeError: + pass + + return other + + def copy(self: AppCommandT) -> AppCommandT: + """Create a copy of this application command. + + Returns + ------- + :class:`InvokableApplicationCommand` + A new instance of this application command. + """ + copy = type(self)(self.callback, **self.__original_kwargs__) + return self._ensure_assignment_on_copy(copy) + + def _update_copy(self: AppCommandT, kwargs: Dict[str, Any]) -> AppCommandT: + if kwargs: + kw = kwargs.copy() + kw.update(self.__original_kwargs__) + copy = type(self)(self.callback, **kw) + return self._ensure_assignment_on_copy(copy) + else: + return self.copy() + + @property + def dm_permission(self) -> bool: + """:class:`bool`: Whether this command can be used in DMs.""" + return self.body.dm_permission + + @property + def default_member_permissions(self) -> Optional[Permissions]: + """Optional[:class:`.Permissions`]: The default required member permissions for this command. + A member must have *all* these permissions to be able to invoke the command in a guild. + + This is a default value, the set of users/roles that may invoke this command can be + overridden by moderators on a guild-specific basis, disregarding this setting. + + If ``None`` is returned, it means everyone can use the command by default. + If an empty :class:`.Permissions` object is returned (that is, all permissions set to ``False``), + this means no one can use the command. + + .. versionadded:: 2.5 + """ + return self.body.default_member_permissions + + @property + def callback(self) -> CommandCallback: + return self._callback + + def add_check(self, func: Check) -> None: + """Adds a check to the application command. + + This is the non-decorator interface to :func:`.check`. + + Parameters + ---------- + func + The function that will be used as a check. + """ + + self.checks.append(func) + + def remove_check(self, func: Check) -> None: + """Removes a check from the application command. + + This function is idempotent and will not raise an exception + if the function is not in the command's checks. + + Parameters + ---------- + func + The function to remove from the checks. + """ + + try: + self.checks.remove(func) + except ValueError: + pass + + async def __call__(self, interaction: ApplicationCommandInteraction, *args, **kwargs) -> Any: + """|coro| + + Calls the internal callback that the application command holds. + + .. note:: + + This bypasses all mechanisms -- including checks, converters, + invoke hooks, cooldowns, etc. You must take care to pass + the proper arguments and types to this function. + + """ + if self.cog is not None: + return await self.callback(self.cog, interaction, *args, **kwargs) + else: + return await self.callback(interaction, *args, **kwargs) + + def _prepare_cooldowns(self, inter: ApplicationCommandInteraction) -> None: + if self._buckets.valid: + dt = inter.created_at + current = dt.replace(tzinfo=datetime.timezone.utc).timestamp() + bucket = self._buckets.get_bucket(inter, current) # type: ignore + if bucket is not None: + retry_after = bucket.update_rate_limit(current) + if retry_after: + raise CommandOnCooldown(bucket, retry_after, self._buckets.type) # type: ignore + + async def prepare(self, inter: ApplicationCommandInteraction) -> None: + inter.application_command = self + + if not await self.can_run(inter): + raise CheckFailure(f"The check functions for command {self.qualified_name!r} failed.") + + if self._max_concurrency is not None: + await self._max_concurrency.acquire(inter) # type: ignore + + try: + self._prepare_cooldowns(inter) + await self.call_before_hooks(inter) + except: + if self._max_concurrency is not None: + await self._max_concurrency.release(inter) # type: ignore + raise + + def is_on_cooldown(self, inter: ApplicationCommandInteraction) -> bool: + """Checks whether the application command is currently on cooldown. + + Parameters + ---------- + inter: :class:`.ApplicationCommandInteraction` + The interaction with the application command currently being invoked. + + Returns + ------- + :class:`bool` + A boolean indicating if the application command is on cooldown. + """ + if not self._buckets.valid: + return False + + bucket = self._buckets.get_bucket(inter) # type: ignore + dt = inter.created_at + current = dt.replace(tzinfo=datetime.timezone.utc).timestamp() + return bucket.get_tokens(current) == 0 + + def reset_cooldown(self, inter: ApplicationCommandInteraction) -> None: + """Resets the cooldown on this application command. + + Parameters + ---------- + inter: :class:`.ApplicationCommandInteraction` + The interaction with this application command + """ + if self._buckets.valid: + bucket = self._buckets.get_bucket(inter) # type: ignore + bucket.reset() + + def get_cooldown_retry_after(self, inter: ApplicationCommandInteraction) -> float: + """Retrieves the amount of seconds before this application command can be tried again. + + Parameters + ---------- + inter: :class:`.ApplicationCommandInteraction` + The interaction with this application command. + + Returns + ------- + :class:`float` + The amount of time left on this command's cooldown in seconds. + If this is ``0.0`` then the command isn't on cooldown. + """ + if self._buckets.valid: + bucket = self._buckets.get_bucket(inter) # type: ignore + dt = inter.created_at + current = dt.replace(tzinfo=datetime.timezone.utc).timestamp() + return bucket.get_retry_after(current) + + return 0.0 + + async def invoke(self, inter: ApplicationCommandInteraction, *args, **kwargs) -> None: + """ + This method isn't really usable in this class, but it's usable in subclasses. + """ + await self.prepare(inter) + + try: + await self(inter, *args, **kwargs) + except CommandError: + inter.command_failed = True + raise + except asyncio.CancelledError: + inter.command_failed = True + return + except Exception as exc: + inter.command_failed = True + raise CommandInvokeError(exc) from exc + finally: + if self._max_concurrency is not None: + await self._max_concurrency.release(inter) # type: ignore + + await self.call_after_hooks(inter) + + def error(self, coro: ErrorT) -> ErrorT: + """A decorator that registers a coroutine as a local error handler. + + A local error handler is an error event limited to a single application command. + + Parameters + ---------- + coro: :ref:`coroutine ` + The coroutine to register as the local error handler. + + Raises + ------ + TypeError + The coroutine passed is not actually a coroutine. + """ + + if not asyncio.iscoroutinefunction(coro): + raise TypeError("The error handler must be a coroutine.") + + self.on_error: Error = coro + return coro + + def has_error_handler(self) -> bool: + """ + Checks whether the application command has an error handler registered. + """ + return hasattr(self, "on_error") + + async def _call_local_error_handler( + self, inter: ApplicationCommandInteraction, error: CommandError + ) -> Any: + if not self.has_error_handler(): + return + + injected = wrap_callback(self.on_error) + if self.cog is not None: + return await injected(self.cog, inter, error) + else: + return await injected(inter, error) + + async def _call_external_error_handlers( + self, inter: ApplicationCommandInteraction, error: CommandError + ) -> None: + """Overridden in subclasses""" + raise error + + async def dispatch_error( + self, inter: ApplicationCommandInteraction, error: CommandError + ) -> None: + if not await self._call_local_error_handler(inter, error): + await self._call_external_error_handlers(inter, error) + + async def call_before_hooks(self, inter: ApplicationCommandInteraction) -> None: + # now that we're done preparing we can call the pre-command hooks + # first, call the command local hook: + cog = self.cog + if self._before_invoke is not None: + # should be cog if @commands.before_invoke is used + instance = getattr(self._before_invoke, "__self__", cog) + # __self__ only exists for methods, not functions + # however, if @command.before_invoke is used, it will be a function + if instance: + await self._before_invoke(instance, inter) # type: ignore + else: + await self._before_invoke(inter) # type: ignore + + if inter.data.type is ApplicationCommandType.chat_input: + partial_attr_name = "slash_command" + elif inter.data.type is ApplicationCommandType.user: + partial_attr_name = "user_command" + elif inter.data.type is ApplicationCommandType.message: + partial_attr_name = "message_command" + else: + return + + # call the cog local hook if applicable: + if cog is not None: + meth = getattr(cog, f"cog_before_{partial_attr_name}_invoke", None) + hook = _get_overridden_method(meth) + if hook is not None: + await hook(inter) + + # call the bot global hook if necessary + hook = getattr(inter.bot, f"_before_{partial_attr_name}_invoke", None) + if hook is not None: + await hook(inter) + + async def call_after_hooks(self, inter: ApplicationCommandInteraction) -> None: + cog = self.cog + if self._after_invoke is not None: + instance = getattr(self._after_invoke, "__self__", cog) + if instance: + await self._after_invoke(instance, inter) # type: ignore + else: + await self._after_invoke(inter) # type: ignore + + if inter.data.type is ApplicationCommandType.chat_input: + partial_attr_name = "slash_command" + elif inter.data.type is ApplicationCommandType.user: + partial_attr_name = "user_command" + elif inter.data.type is ApplicationCommandType.message: + partial_attr_name = "message_command" + else: + return + + # call the cog local hook if applicable: + if cog is not None: + meth = getattr(cog, f"cog_after_{partial_attr_name}_invoke", None) + hook = _get_overridden_method(meth) + if hook is not None: + await hook(inter) + + # call the bot global hook if necessary + hook = getattr(inter.bot, f"_after_{partial_attr_name}_invoke", None) + if hook is not None: + await hook(inter) + + def before_invoke(self, coro: HookT) -> HookT: + """A decorator that registers a coroutine as a pre-invoke hook. + + A pre-invoke hook is called directly before the command is called. + + This pre-invoke hook takes a sole parameter, a :class:`.ApplicationCommandInteraction`. + + Parameters + ---------- + coro: :ref:`coroutine ` + The coroutine to register as the pre-invoke hook. + + Raises + ------ + TypeError + The coroutine passed is not actually a coroutine. + """ + if not asyncio.iscoroutinefunction(coro): + raise TypeError("The pre-invoke hook must be a coroutine.") + + self._before_invoke = coro + return coro + + def after_invoke(self, coro: HookT) -> HookT: + """A decorator that registers a coroutine as a post-invoke hook. + + A post-invoke hook is called directly after the command is called. + + This post-invoke hook takes a sole parameter, a :class:`.ApplicationCommandInteraction`. + + Parameters + ---------- + coro: :ref:`coroutine ` + The coroutine to register as the post-invoke hook. + + Raises + ------ + TypeError + The coroutine passed is not actually a coroutine. + """ + if not asyncio.iscoroutinefunction(coro): + raise TypeError("The post-invoke hook must be a coroutine.") + + self._after_invoke = coro + return coro + + @property + def cog_name(self) -> Optional[str]: + """Optional[:class:`str`]: The name of the cog this application command belongs to, if any.""" + return type(self.cog).__cog_name__ if self.cog is not None else None + + async def can_run(self, inter: ApplicationCommandInteraction) -> bool: + """|coro| + + Checks if the command can be executed by checking all the predicates + inside the :attr:`~Command.checks` attribute. + + Parameters + ---------- + inter: :class:`.ApplicationCommandInteraction` + The interaction with the application command currently being invoked. + + Raises + ------ + :class:`CommandError` + Any application command error that was raised during a check call will be propagated + by this function. + + Returns + ------- + :class:`bool` + A boolean indicating if the application command can be invoked. + """ + + original = inter.application_command + inter.application_command = self + + if inter.data.type is ApplicationCommandType.chat_input: + partial_attr_name = "slash_command" + elif inter.data.type is ApplicationCommandType.user: + partial_attr_name = "user_command" + elif inter.data.type is ApplicationCommandType.message: + partial_attr_name = "message_command" + else: + return True + + try: + if inter.bot and not await inter.bot.application_command_can_run(inter): + raise CheckFailure( + f"The global check functions for command {self.qualified_name} failed." + ) + + cog = self.cog + if cog is not None: + meth = getattr(cog, f"cog_{partial_attr_name}_check", None) + local_check = _get_overridden_method(meth) + if local_check is not None: + ret = await maybe_coroutine(local_check, inter) + if not ret: + return False + + predicates = self.checks + if not predicates: + # since we have no checks, then we just return True. + return True + + return await async_all(predicate(inter) for predicate in predicates) # type: ignore + finally: + inter.application_command = original + + +def default_member_permissions(value: int = 0, **permissions: bool) -> Callable[[T], T]: + """ + A decorator that sets default required member permissions for the command. + Unlike :func:`~.ext.commands.has_permissions`, this decorator does not add any checks. + Instead, it prevents the command from being run by members without *all* required permissions, + if not overridden by moderators on a guild-specific basis. + + See also the ``default_member_permissions`` parameter for application command decorators. + + .. note:: + This does not work with slash subcommands/groups. + + Example + ------- + + This would only allow members with :attr:`~.Permissions.manage_messages` *and* + :attr:`~.Permissions.view_audit_log` permissions to use the command by default, + however moderators can override this and allow/disallow specific users and + roles to use the command in their guilds regardless of this setting. + + .. code-block:: python3 + + @bot.slash_command() + @commands.default_member_permissions(manage_messages=True, view_audit_log=True) + async def purge(inter, num: int): + ... + + Parameters + ---------- + value: :class:`int` + A raw permission bitfield of an integer representing the required permissions. + May be used instead of specifying kwargs. + **permissions: bool + The required permissions for a command. A member must have *all* these + permissions to be able to invoke the command. + Setting a permission to ``False`` does not affect the result. + """ + if isinstance(value, bool): + raise TypeError("`value` cannot be a bool value") + perms_value = Permissions(value, **permissions).value + + def decorator(func: T) -> T: + from .slash_core import SubCommand, SubCommandGroup + + if isinstance(func, InvokableApplicationCommand): + if isinstance(func, (SubCommand, SubCommandGroup)): + raise TypeError( + "Cannot set `default_member_permissions` on subcommands or subcommand groups" + ) + if func.body._default_member_permissions is not None: + raise ValueError( + "Cannot set `default_member_permissions` in both parameter and decorator" + ) + func.body._default_member_permissions = perms_value + else: + func.__default_member_permissions__ = perms_value # type: ignore + return func + + return decorator diff --git a/sbsheriff/Lib/site-packages/disnake/ext/commands/bot.py b/sbsheriff/Lib/site-packages/disnake/ext/commands/bot.py new file mode 100644 index 0000000..8dbbbc7 --- /dev/null +++ b/sbsheriff/Lib/site-packages/disnake/ext/commands/bot.py @@ -0,0 +1,275 @@ +""" +The MIT License (MIT) + +Copyright (c) 2015-2021 Rapptz +Copyright (c) 2021-present Disnake Development + +Permission is hereby granted, free of charge, to any person obtaining a +copy of this software and associated documentation files (the "Software"), +to deal in the Software without restriction, including without limitation +the rights to use, copy, modify, merge, publish, distribute, sublicense, +and/or sell copies of the Software, and to permit persons to whom the +Software is furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS +OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER +DEALINGS IN THE SOFTWARE. +""" + +from __future__ import annotations + +from typing import TYPE_CHECKING, Any, TypeVar + +import disnake + +from .bot_base import BotBase, when_mentioned, when_mentioned_or +from .context import Context +from .interaction_bot_base import InteractionBotBase + +if TYPE_CHECKING: + from ._types import CoroFunc + + +__all__ = ( + "when_mentioned", + "when_mentioned_or", + "BotBase", + "Bot", + "InteractionBot", + "AutoShardedBot", + "AutoShardedInteractionBot", +) + +MISSING: Any = disnake.utils.MISSING + +T = TypeVar("T") +CFT = TypeVar("CFT", bound="CoroFunc") +CXT = TypeVar("CXT", bound="Context") + + +class Bot(BotBase, InteractionBotBase, disnake.Client): + """Represents a discord bot. + + This class is a subclass of :class:`disnake.Client` and as a result + anything that you can do with a :class:`disnake.Client` you can do with + this bot. + + This class also subclasses :class:`.GroupMixin` to provide the functionality + to manage commands. + + Attributes + ---------- + command_prefix + The command prefix is what the message content must contain initially + to have a command invoked. This prefix could either be a string to + indicate what the prefix should be, or a callable that takes in the bot + as its first parameter and :class:`disnake.Message` as its second + parameter and returns the prefix. This is to facilitate "dynamic" + command prefixes. This callable can be either a regular function or + a coroutine. + + An empty string as the prefix always matches, enabling prefix-less + command invocation. While this may be useful in DMs it should be avoided + in servers, as it's likely to cause performance issues and unintended + command invocations. + + The command prefix could also be an iterable of strings indicating that + multiple checks for the prefix should be used and the first one to + match will be the invocation prefix. You can get this prefix via + :attr:`.Context.prefix`. To avoid confusion empty iterables are not + allowed. + + .. note:: + + When passing multiple prefixes be careful to not pass a prefix + that matches a longer prefix occurring later in the sequence. For + example, if the command prefix is ``('!', '!?')`` the ``'!?'`` + prefix will never be matched to any message as the previous one + matches messages starting with ``!?``. This is especially important + when passing an empty string, it should always be last as no prefix + after it will be matched. + case_insensitive: :class:`bool` + Whether the commands should be case insensitive. Defaults to ``False``. This + attribute does not carry over to groups. You must set it to every group if + you require group commands to be case insensitive as well. + description: :class:`str` + The content prefixed into the default help message. + help_command: Optional[:class:`.HelpCommand`] + The help command implementation to use. This can be dynamically + set at runtime. To remove the help command pass ``None``. For more + information on implementing a help command, see :ref:`ext_commands_help_command`. + owner_id: Optional[:class:`int`] + The user ID that owns the bot. If this is not set and is then queried via + :meth:`.is_owner` then it is fetched automatically using + :meth:`~.Bot.application_info`. + owner_ids: Optional[Collection[:class:`int`]] + The user IDs that owns the bot. This is similar to :attr:`owner_id`. + If this is not set and the application is team based, then it is + fetched automatically using :meth:`~.Bot.application_info`. + For performance reasons it is recommended to use a :class:`set` + for the collection. You cannot set both ``owner_id`` and ``owner_ids``. + + .. versionadded:: 1.3 + + strip_after_prefix: :class:`bool` + Whether to strip whitespace characters after encountering the command + prefix. This allows for ``! hello`` and ``!hello`` to both work if + the ``command_prefix`` is set to ``!``. Defaults to ``False``. + + .. versionadded:: 1.7 + + test_guilds: List[:class:`int`] + The list of IDs of the guilds where you're going to test your application commands. + Defaults to ``None``, which means global registration of commands across + all guilds. + + .. versionadded:: 2.1 + + sync_commands: :class:`bool` + Whether to enable automatic synchronization of application commands in your code. + Defaults to ``True``, which means that commands in API are automatically synced + with the commands in your code. + + .. versionadded:: 2.1 + + sync_commands_on_cog_unload: :class:`bool` + Whether to sync the application commands on cog unload / reload. Defaults to ``True``. + + .. versionadded:: 2.1 + + sync_commands_debug: :class:`bool` + Whether to always show sync debug logs (uses ``INFO`` log level if it's enabled, prints otherwise). + If disabled, uses the default ``DEBUG`` log level which isn't shown unless the log level is changed manually. + Useful for tracking the commands being registered in the API. + Defaults to ``False``. + + .. versionadded:: 2.1 + + .. versionchanged:: 2.4 + Changes the log level of corresponding messages from ``DEBUG`` to ``INFO`` or ``print``\\s them, + instead of controlling whether they are enabled at all. + reload: :class:`bool` + Whether to enable automatic extension reloading on file modification for debugging. + Whenever you save an extension with reloading enabled the file will be automatically + reloaded for you so you do not have to reload the extension manually. Defaults to ``False`` + + .. versionadded:: 2.1 + localization_provider: :class:`.LocalizationProtocol` + An implementation of :class:`.LocalizationProtocol` to use for localization of + application commands. + If not provided, the default :class:`.LocalizationStore` implementation is used. + + .. versionadded:: 2.5 + + strict_localization: :class:`bool` + Whether to raise an exception when localizations for a specific key couldn't be found. + This is mainly useful for testing/debugging, consider disabling this eventually + as missing localized names will automatically fall back to the default/base name without it. + Only applicable if the ``localization_provider`` parameter is not provided. + Defaults to ``False``. + + .. versionadded:: 2.5 + """ + + pass + + +class AutoShardedBot(BotBase, InteractionBotBase, disnake.AutoShardedClient): + """This is similar to :class:`.Bot` except that it is inherited from + :class:`disnake.AutoShardedClient` instead. + """ + + pass + + +class InteractionBot(InteractionBotBase, disnake.Client): + """Represents a discord bot for application commands only. + + This class is a subclass of :class:`disnake.Client` and as a result + anything that you can do with a :class:`disnake.Client` you can do with + this bot. + + This class also subclasses InteractionBotBase to provide the functionality + to manage application commands. + + Attributes + ---------- + owner_id: Optional[:class:`int`] + The user ID that owns the bot. If this is not set and is then queried via + :meth:`.is_owner` then it is fetched automatically using + :meth:`~.Bot.application_info`. + owner_ids: Optional[Collection[:class:`int`]] + The user IDs that owns the bot. This is similar to :attr:`owner_id`. + If this is not set and the application is team based, then it is + fetched automatically using :meth:`~.Bot.application_info`. + For performance reasons it is recommended to use a :class:`set` + for the collection. You cannot set both ``owner_id`` and ``owner_ids``. + test_guilds: List[:class:`int`] + The list of IDs of the guilds where you're going to test your application commands. + Defaults to ``None``, which means global registration of commands across + all guilds. + + .. versionadded:: 2.1 + + sync_commands: :class:`bool` + Whether to enable automatic synchronization of application commands in your code. + Defaults to ``True``, which means that commands in API are automatically synced + with the commands in your code. + + .. versionadded:: 2.1 + + sync_commands_on_cog_unload: :class:`bool` + Whether to sync the application commands on cog unload / reload. Defaults to ``True``. + + .. versionadded:: 2.1 + + sync_commands_debug: :class:`bool` + Whether to always show sync debug logs (uses ``INFO`` log level if it's enabled, prints otherwise). + If disabled, uses the default ``DEBUG`` log level which isn't shown unless the log level is changed manually. + Useful for tracking the commands being registered in the API. + Defaults to ``False``. + + .. versionadded:: 2.1 + + .. versionchanged:: 2.4 + Changes the log level of corresponding messages from ``DEBUG`` to ``INFO`` or ``print``\\s them, + instead of controlling whether they are enabled at all. + reload: :class:`bool` + Whether to enable automatic extension reloading on file modification for debugging. + Whenever you save an extension with reloading enabled the file will be automatically + reloaded for you so you do not have to reload the extension manually. Defaults to ``False`` + + .. versionadded:: 2.1 + localization_provider: :class:`.LocalizationProtocol` + An implementation of :class:`.LocalizationProtocol` to use for localization of + application commands. + If not provided, the default :class:`.LocalizationStore` implementation is used. + + .. versionadded:: 2.5 + + strict_localization: :class:`bool` + Whether to raise an exception when localizations for a specific key couldn't be found. + This is mainly useful for testing/debugging, consider disabling this eventually + as missing localized names will automatically fall back to the default/base name without it. + Only applicable if the ``localization_provider`` parameter is not provided. + Defaults to ``False``. + + .. versionadded:: 2.5 + """ + + pass + + +class AutoShardedInteractionBot(InteractionBotBase, disnake.AutoShardedClient): + """This is similar to :class:`.InteractionBot` except that it is inherited from + :class:`disnake.AutoShardedClient` instead. + """ + + pass diff --git a/sbsheriff/Lib/site-packages/disnake/ext/commands/bot_base.py b/sbsheriff/Lib/site-packages/disnake/ext/commands/bot_base.py new file mode 100644 index 0000000..b6b1f14 --- /dev/null +++ b/sbsheriff/Lib/site-packages/disnake/ext/commands/bot_base.py @@ -0,0 +1,618 @@ +""" +The MIT License (MIT) + +Copyright (c) 2015-2021 Rapptz +Copyright (c) 2021-present Disnake Development + +Permission is hereby granted, free of charge, to any person obtaining a +copy of this software and associated documentation files (the "Software"), +to deal in the Software without restriction, including without limitation +the rights to use, copy, modify, merge, publish, distribute, sublicense, +and/or sell copies of the Software, and to permit persons to whom the +Software is furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS +OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER +DEALINGS IN THE SOFTWARE. +""" + +from __future__ import annotations + +import asyncio +import collections +import collections.abc +import inspect +import logging +import sys +import traceback +import warnings +from typing import TYPE_CHECKING, Any, Callable, List, Optional, Type, TypeVar, Union, cast + +import disnake + +from . import errors +from .common_bot_base import CommonBotBase +from .context import Context +from .core import GroupMixin +from .custom_warnings import MessageContentPrefixWarning +from .help import DefaultHelpCommand, HelpCommand +from .view import StringView + +if TYPE_CHECKING: + from disnake.message import Message + + from ._types import Check, CoroFunc + +__all__ = ( + "when_mentioned", + "when_mentioned_or", + "BotBase", +) + +MISSING: Any = disnake.utils.MISSING + +T = TypeVar("T") +CFT = TypeVar("CFT", bound="CoroFunc") +CXT = TypeVar("CXT", bound="Context") + +_log = logging.getLogger(__name__) + + +def when_mentioned(bot: BotBase, msg: Message) -> List[str]: + """A callable that implements a command prefix equivalent to being mentioned. + + These are meant to be passed into the :attr:`.Bot.command_prefix` attribute. + """ + # bot.user will never be None when this is called + return [f"<@{bot.user.id}> ", f"<@!{bot.user.id}> "] # type: ignore + + +def when_mentioned_or(*prefixes: str) -> Callable[[BotBase, Message], List[str]]: + """A callable that implements when mentioned or other prefixes provided. + + These are meant to be passed into the :attr:`.Bot.command_prefix` attribute. + + Example + -------- + + .. code-block:: python3 + + bot = commands.Bot(command_prefix=commands.when_mentioned_or('!')) + + + .. note:: + + This callable returns another callable, so if this is done inside a custom + callable, you must call the returned callable, for example: + + .. code-block:: python3 + + async def get_prefix(bot, message): + extras = await prefixes_for(message.guild) # returns a list + return commands.when_mentioned_or(*extras)(bot, message) + + + See Also + ---------- + :func:`.when_mentioned` + """ + + def inner(bot, msg): + r = list(prefixes) + r = when_mentioned(bot, msg) + r + return r + + return inner + + +def _is_submodule(parent: str, child: str) -> bool: + return parent == child or child.startswith(parent + ".") + + +class _DefaultRepr: + def __repr__(self): + return "" + + +_default: Any = _DefaultRepr() + + +class BotBase(CommonBotBase, GroupMixin): + def __init__( + self, + command_prefix: Optional[Union[str, List[str], Callable]] = None, + help_command: HelpCommand = _default, + description: str = None, + **options: Any, + ): + super().__init__(**options) + self.command_prefix = command_prefix + if ( + command_prefix is not when_mentioned + and not self.intents.message_content # type: ignore + ): + + warnings.warn( + "Message Content intent is not enabled and a prefix is configured. " + "This may cause limited functionality for prefix commands. " + "If you want prefix commands, pass an intents object with message_content set to True. " + "If you don't need any prefix functionality, " + "consider using InteractionBot instead. " + "Alternatively, set prefix to disnake.ext.commands.when_mentioned to silence this warning.", + MessageContentPrefixWarning, + stacklevel=2, + ) + + self._checks: List[Check] = [] + self._check_once = [] + + self._before_invoke = None + self._after_invoke = None + + self._help_command = None + self.description: str = inspect.cleandoc(description) if description else "" + self.strip_after_prefix: bool = options.get("strip_after_prefix", False) + + if help_command is _default: + self.help_command = DefaultHelpCommand() + else: + self.help_command = help_command + + # internal helpers + + async def on_command_error(self, context: Context, exception: errors.CommandError) -> None: + """|coro| + + The default command error handler provided by the bot. + + This is for text commands only, and doesn't apply to application commands. + + By default this prints to :data:`sys.stderr` however it could be + overridden to have a different implementation. + + This only fires if you do not specify any listeners for command error. + """ + if self.extra_events.get("on_command_error", None): + return + + command = context.command + if command and command.has_error_handler(): + return + + cog = context.cog + if cog and cog.has_error_handler(): + return + + print(f"Ignoring exception in command {context.command}:", file=sys.stderr) + traceback.print_exception( + type(exception), exception, exception.__traceback__, file=sys.stderr + ) + + # global check registration + + def add_check( + self, + func: Check, + *, + call_once: bool = False, + ) -> None: + """Adds a global check to the bot. + + This is for text commands only, and doesn't apply to application commands. + + This is the non-decorator interface to :meth:`.check` and :meth:`.check_once`. + + Parameters + ---------- + func + The function that was used as a global check. + call_once: :class:`bool` + If the function should only be called once per + :meth:`.invoke` call. + """ + if call_once: + self._check_once.append(func) + else: + self._checks.append(func) + + def remove_check( + self, + func: Check, + *, + call_once: bool = False, + ) -> None: + """Removes a global check from the bot. + + This is for text commands only, and doesn't apply to application commands. + + This function is idempotent and will not raise an exception + if the function is not in the global checks. + + Parameters + ---------- + func + The function to remove from the global checks. + call_once: :class:`bool` + If the function was added with ``call_once=True`` in + the :meth:`.Bot.add_check` call or using :meth:`.check_once`. + """ + l = self._check_once if call_once else self._checks + try: + l.remove(func) + except ValueError: + pass + + def check(self, func: T) -> T: + """ + A decorator that adds a global check to the bot. + + This is for text commands only, and doesn't apply to application commands. + + A global check is similar to a :func:`.check` that is applied + on a per command basis except it is run before any command checks + have been verified and applies to every command the bot has. + + .. note:: + + This function can either be a regular function or a coroutine. + + Similar to a command :func:`.check`\\, this takes a single parameter + of type :class:`.Context` and can only raise exceptions inherited from + :exc:`.CommandError`. + + Example + --------- + + .. code-block:: python3 + + @bot.check + def check_commands(ctx): + return ctx.command.qualified_name in allowed_commands + + """ + # T was used instead of Check to ensure the type matches on return + self.add_check(func) # type: ignore + return func + + def check_once(self, func: CFT) -> CFT: + """ + A decorator that adds a "call once" global check to the bot. + + This is for text commands only, and doesn't apply to application commands. + + Unlike regular global checks, this one is called only once + per :meth:`.invoke` call. + + Regular global checks are called whenever a command is called + or :meth:`.Command.can_run` is called. This type of check + bypasses that and ensures that it's called only once, even inside + the default help command. + + .. note:: + + When using this function the :class:`.Context` sent to a group subcommand + may only parse the parent command and not the subcommands due to it + being invoked once per :meth:`.Bot.invoke` call. + + .. note:: + + This function can either be a regular function or a coroutine. + + Similar to a command :func:`.check`\\, this takes a single parameter + of type :class:`.Context` and can only raise exceptions inherited from + :exc:`.CommandError`. + + Example + --------- + + .. code-block:: python3 + + @bot.check_once + def whitelist(ctx): + return ctx.message.author.id in my_whitelist + + """ + self.add_check(func, call_once=True) + return func + + async def can_run(self, ctx: Context, *, call_once: bool = False) -> bool: + data = self._check_once if call_once else self._checks + + if len(data) == 0: + return True + + # type-checker doesn't distinguish between functions and methods + return await disnake.utils.async_all(f(ctx) for f in data) # type: ignore + + def before_invoke(self, coro: CFT) -> CFT: + """A decorator that registers a coroutine as a pre-invoke hook. + + This is for text commands only, and doesn't apply to application commands. + + A pre-invoke hook is called directly before the command is + called. This makes it a useful function to set up database + connections or any type of set up required. + + This pre-invoke hook takes a sole parameter, a :class:`.Context`. + + .. note:: + + The :meth:`~.Bot.before_invoke` and :meth:`~.Bot.after_invoke` hooks are + only called if all checks and argument parsing procedures pass + without error. If any check or argument parsing procedures fail + then the hooks are not called. + + Parameters + ---------- + coro: :ref:`coroutine ` + The coroutine to register as the pre-invoke hook. + + Raises + ------ + TypeError + The coroutine passed is not actually a coroutine. + """ + if not asyncio.iscoroutinefunction(coro): + raise TypeError("The pre-invoke hook must be a coroutine.") + + self._before_invoke = coro + return coro + + def after_invoke(self, coro: CFT) -> CFT: + """ + A decorator that registers a coroutine as a post-invoke hook. + + This is for text commands only, and doesn't apply to application commands. + + A post-invoke hook is called directly after the command is + called. This makes it a useful function to clean-up database + connections or any type of clean up required. + + This post-invoke hook takes a sole parameter, a :class:`.Context`. + + .. note:: + + Similar to :meth:`~.Bot.before_invoke`\\, this is not called unless + checks and argument parsing procedures succeed. This hook is, + however, **always** called regardless of the internal command + callback raising an error (i.e. :exc:`.CommandInvokeError`\\). + This makes it ideal for clean-up scenarios. + + Parameters + ---------- + coro: :ref:`coroutine ` + The coroutine to register as the post-invoke hook. + + Raises + ------ + TypeError + The coroutine passed is not actually a coroutine. + """ + if not asyncio.iscoroutinefunction(coro): + raise TypeError("The post-invoke hook must be a coroutine.") + + self._after_invoke = coro + return coro + + # extensions + + def _remove_module_references(self, name: str) -> None: + super()._remove_module_references(name) + # remove all the commands from the module + for cmd in self.all_commands.copy().values(): + if cmd.module is not None and _is_submodule(name, cmd.module): + if isinstance(cmd, GroupMixin): + cmd.recursively_remove_all_commands() + self.remove_command(cmd.name) + + # help command stuff + + @property + def help_command(self) -> Optional[HelpCommand]: + return self._help_command + + @help_command.setter + def help_command(self, value: Optional[HelpCommand]) -> None: + if value is not None: + if not isinstance(value, HelpCommand): + raise TypeError("help_command must be a subclass of HelpCommand") + if self._help_command is not None: + self._help_command._remove_from_bot(self) + self._help_command = value + value._add_to_bot(self) + elif self._help_command is not None: + self._help_command._remove_from_bot(self) + self._help_command = None + else: + self._help_command = None + + # command processing + + async def get_prefix(self, message: Message) -> Optional[Union[List[str], str]]: + """|coro| + + Retrieves the prefix the bot is listening to + with the message as a context. + + Parameters + ---------- + message: :class:`disnake.Message` + The message context to get the prefix of. + + Returns + ------- + Optional[Union[List[:class:`str`], :class:`str`]] + A list of prefixes or a single prefix that the bot is + listening for. None if the bot isn't listening for prefixes. + """ + prefix = ret = self.command_prefix + if callable(prefix): + ret = await disnake.utils.maybe_coroutine(prefix, self, message) + + if ret is None: + return None + + if not isinstance(ret, str): + try: + ret = list(ret) + except TypeError: + # It's possible that a generator raised this exception. Don't + # replace it with our own error if that's the case. + if isinstance(ret, collections.abc.Iterable): + raise + + raise TypeError( + "command_prefix must be plain string, iterable of strings, or callable " + f"returning either of these, not {ret.__class__.__name__}" + ) + + if not ret: + raise ValueError("Iterable command_prefix must contain at least one prefix") + + return ret + + async def get_context(self, message: Message, *, cls: Type[CXT] = Context) -> CXT: + """ + |coro| + + Returns the invocation context from the message. + + This is a more low-level counter-part for :meth:`.process_commands` + to allow users more fine grained control over the processing. + + The returned context is not guaranteed to be a valid invocation + context, :attr:`.Context.valid` must be checked to make sure it is. + If the context is not valid then it is not a valid candidate to be + invoked under :meth:`~.Bot.invoke`. + + Parameters + ---------- + message: :class:`disnake.Message` + The message to get the invocation context from. + cls + The factory class that will be used to create the context. + By default, this is :class:`.Context`. Should a custom + class be provided, it must be similar enough to :class:`.Context`\'s + interface. + + Returns + ------- + :class:`.Context` + The invocation context. The type of this can change via the + ``cls`` parameter. + """ + + view = StringView(message.content) + ctx = cast("CXT", cls(prefix=None, view=view, bot=self, message=message)) + + if message.author.id == self.user.id: # type: ignore + return ctx + + prefix = await self.get_prefix(message) + invoked_prefix = prefix + + if prefix is None: + return ctx + elif isinstance(prefix, str): + if not view.skip_string(prefix): + return ctx + else: + try: + # if the context class' __init__ consumes something from the view this + # will be wrong. That seems unreasonable though. + if message.content.startswith(tuple(prefix)): + invoked_prefix = disnake.utils.find(view.skip_string, prefix) + else: + return ctx + + except TypeError: + if not isinstance(prefix, list): + raise TypeError( + "get_prefix must return either a string or a list of string, " + f"not {prefix.__class__.__name__}" + ) + + # It's possible a bad command_prefix got us here. + for value in prefix: + if not isinstance(value, str): + raise TypeError( + "Iterable command_prefix or list returned from get_prefix must " + f"contain only strings, not {value.__class__.__name__}" + ) + + # Getting here shouldn't happen + raise + + if self.strip_after_prefix: + view.skip_ws() + + invoker = view.get_word() + ctx.invoked_with = invoker + # type-checker fails to narrow invoked_prefix type. + ctx.prefix = invoked_prefix # type: ignore + ctx.command = self.all_commands.get(invoker) + return ctx + + async def invoke(self, ctx: Context) -> None: + """|coro| + + Invokes the command given under the invocation context and + handles all the internal event dispatch mechanisms. + + Parameters + ---------- + ctx: :class:`.Context` + The invocation context to invoke. + """ + if ctx.command is not None: + self.dispatch("command", ctx) + try: + if await self.can_run(ctx, call_once=True): + await ctx.command.invoke(ctx) + else: + raise errors.CheckFailure("The global check once functions failed.") + except errors.CommandError as exc: + await ctx.command.dispatch_error(ctx, exc) + else: + self.dispatch("command_completion", ctx) + elif ctx.invoked_with: + exc = errors.CommandNotFound(f'Command "{ctx.invoked_with}" is not found') + self.dispatch("command_error", ctx, exc) + + async def process_commands(self, message: Message) -> None: + """|coro| + + This function processes the commands that have been registered + to the bot and other groups. Without this coroutine, none of the + commands will be triggered. + + By default, this coroutine is called inside the :func:`.on_message` + event. If you choose to override the :func:`.on_message` event, then + you should invoke this coroutine as well. + + This is built using other low level tools, and is equivalent to a + call to :meth:`~.Bot.get_context` followed by a call to :meth:`~.Bot.invoke`. + + This also checks if the message's author is a bot and doesn't + call :meth:`~.Bot.get_context` or :meth:`~.Bot.invoke` if so. + + Parameters + ---------- + message: :class:`disnake.Message` + The message to process commands for. + """ + if message.author.bot: + return + + ctx = await self.get_context(message) + await self.invoke(ctx) + + async def on_message(self, message): + await self.process_commands(message) diff --git a/sbsheriff/Lib/site-packages/disnake/ext/commands/cog.py b/sbsheriff/Lib/site-packages/disnake/ext/commands/cog.py new file mode 100644 index 0000000..a17a673 --- /dev/null +++ b/sbsheriff/Lib/site-packages/disnake/ext/commands/cog.py @@ -0,0 +1,909 @@ +""" +The MIT License (MIT) + +Copyright (c) 2015-2021 Rapptz +Copyright (c) 2021-present Disnake Development + +Permission is hereby granted, free of charge, to any person obtaining a +copy of this software and associated documentation files (the "Software"), +to deal in the Software without restriction, including without limitation +the rights to use, copy, modify, merge, publish, distribute, sublicense, +and/or sell copies of the Software, and to permit persons to whom the +Software is furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS +OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER +DEALINGS IN THE SOFTWARE. +""" +from __future__ import annotations + +import asyncio +import inspect +from typing import ( + TYPE_CHECKING, + Any, + Callable, + ClassVar, + Dict, + Generator, + List, + Optional, + Tuple, + Type, + TypeVar, + Union, +) + +import disnake +import disnake.utils + +from ._types import _BaseCommand +from .base_core import InvokableApplicationCommand +from .ctx_menus_core import InvokableMessageCommand, InvokableUserCommand +from .slash_core import InvokableSlashCommand + +if TYPE_CHECKING: + from disnake.interactions import ApplicationCommandInteraction + + from .bot import AutoShardedBot, AutoShardedInteractionBot, Bot, InteractionBot + from .context import Context + from .core import Command + + AnyBot = Union[Bot, AutoShardedBot, InteractionBot, AutoShardedInteractionBot] + +__all__ = ( + "CogMeta", + "Cog", +) + +CogT = TypeVar("CogT", bound="Cog") +FuncT = TypeVar("FuncT", bound=Callable[..., Any]) + +MISSING: Any = disnake.utils.MISSING + + +def _cog_special_method(func: FuncT) -> FuncT: + func.__cog_special_method__ = None + return func + + +class CogMeta(type): + """A metaclass for defining a cog. + + Note that you should probably not use this directly. It is exposed + purely for documentation purposes along with making custom metaclasses to intermix + with other metaclasses such as the :class:`abc.ABCMeta` metaclass. + + For example, to create an abstract cog mixin class, the following would be done. + + .. code-block:: python3 + + import abc + + class CogABCMeta(commands.CogMeta, abc.ABCMeta): + pass + + class SomeMixin(metaclass=abc.ABCMeta): + pass + + class SomeCogMixin(SomeMixin, commands.Cog, metaclass=CogABCMeta): + pass + + .. note:: + + When passing an attribute of a metaclass that is documented below, note + that you must pass it as a keyword-only argument to the class creation + like the following example: + + .. code-block:: python3 + + class MyCog(commands.Cog, name='My Cog'): + pass + + Attributes + ---------- + name: :class:`str` + The cog name. By default, it is the name of the class with no modification. + description: :class:`str` + The cog description. By default, it is the cleaned docstring of the class. + + .. versionadded:: 1.6 + + command_attrs: Dict[:class:`str`, Any] + A list of attributes to apply to every command inside this cog. The dictionary + is passed into the :class:`Command` options at ``__init__``. + If you specify attributes inside the command attribute in the class, it will + override the one specified inside this attribute. For example: + + .. code-block:: python3 + + class MyCog(commands.Cog, command_attrs=dict(hidden=True)): + @commands.command() + async def foo(self, ctx): + pass # hidden -> True + + @commands.command(hidden=False) + async def bar(self, ctx): + pass # hidden -> False + + slash_command_attrs: Dict[:class:`str`, Any] + A list of attributes to apply to every slash command inside this cog. The dictionary + is passed into the options of every :class:`InvokableSlashCommand` at ``__init__``. + Usage of this kwarg is otherwise the same as with ``command_attrs``. + + .. note:: This does not apply to instances of :class:`SubCommand` or :class:`SubCommandGroup`. + + .. versionadded:: 2.5 + + user_command_attrs: Dict[:class:`str`, Any] + A list of attributes to apply to every user command inside this cog. The dictionary + is passed into the options of every :class:`InvokableUserCommand` at ``__init__``. + Usage of this kwarg is otherwise the same as with ``command_attrs``. + + .. versionadded:: 2.5 + + message_command_attrs: Dict[:class:`str`, Any] + A list of attributes to apply to every message command inside this cog. The dictionary + is passed into the options of every :class:`InvokableMessageCommand` at ``__init__``. + Usage of this kwarg is otherwise the same as with ``command_attrs``. + + .. versionadded:: 2.5 + """ + + __cog_name__: str + __cog_settings__: Dict[str, Any] + __cog_slash_settings__: Dict[str, Any] + __cog_user_settings__: Dict[str, Any] + __cog_message_settings__: Dict[str, Any] + __cog_commands__: List[Command] + __cog_app_commands__: List[InvokableApplicationCommand] + __cog_listeners__: List[Tuple[str, str]] + + def __new__(cls: Type[CogMeta], *args: Any, **kwargs: Any) -> CogMeta: + name, bases, attrs = args + attrs["__cog_name__"] = kwargs.pop("name", name) + attrs["__cog_settings__"] = kwargs.pop("command_attrs", {}) + attrs["__cog_slash_settings__"] = kwargs.pop("slash_command_attrs", {}) + attrs["__cog_user_settings__"] = kwargs.pop("user_command_attrs", {}) + attrs["__cog_message_settings__"] = kwargs.pop("message_command_attrs", {}) + + description = kwargs.pop("description", None) + if description is None: + description = inspect.cleandoc(attrs.get("__doc__", "")) + attrs["__cog_description__"] = description + + commands = {} + app_commands = {} + listeners = {} + no_bot_cog = ( + "Commands or listeners must not start with cog_ or bot_ (in method {0.__name__}.{1})" + ) + + new_cls = super().__new__(cls, name, bases, attrs, **kwargs) + for base in reversed(new_cls.__mro__): + for elem, value in base.__dict__.items(): + if elem in commands: + del commands[elem] + if elem in app_commands: + del app_commands[elem] + if elem in listeners: + del listeners[elem] + + is_static_method = isinstance(value, staticmethod) + if is_static_method: + value = value.__func__ + if isinstance(value, _BaseCommand): + if is_static_method: + raise TypeError( + f"Command in method {base}.{elem!r} must not be staticmethod." + ) + if elem.startswith(("cog_", "bot_")): + raise TypeError(no_bot_cog.format(base, elem)) + commands[elem] = value + elif isinstance(value, InvokableApplicationCommand): + if is_static_method: + raise TypeError( + f"Application command in method {base}.{elem!r} must not be staticmethod." + ) + if elem.startswith(("cog_", "bot_")): + raise TypeError(no_bot_cog.format(base, elem)) + app_commands[elem] = value + elif asyncio.iscoroutinefunction(value): + try: + getattr(value, "__cog_listener__") + except AttributeError: + continue + else: + if elem.startswith(("cog_", "bot_")): + raise TypeError(no_bot_cog.format(base, elem)) + listeners[elem] = value + + new_cls.__cog_commands__ = list(commands.values()) # this will be copied in Cog.__new__ + new_cls.__cog_app_commands__ = list(app_commands.values()) + + listeners_as_list = [] + for listener in listeners.values(): + for listener_name in listener.__cog_listener_names__: + # I use __name__ instead of just storing the value so I can inject + # the self attribute when the time comes to add them to the bot + listeners_as_list.append((listener_name, listener.__name__)) + + new_cls.__cog_listeners__ = listeners_as_list + return new_cls + + def __init__(self, *args: Any, **kwargs: Any) -> None: + super().__init__(*args) + + @classmethod + def qualified_name(cls) -> str: + return cls.__cog_name__ + + +class Cog(metaclass=CogMeta): + """The base class that all cogs must inherit from. + + A cog is a collection of commands, listeners, and optional state to + help group commands together. More information on them can be found on + the :ref:`ext_commands_cogs` page. + + When inheriting from this class, the options shown in :class:`CogMeta` + are equally valid here. + """ + + __cog_name__: ClassVar[str] + __cog_settings__: ClassVar[Dict[str, Any]] + __cog_commands__: ClassVar[List[Command]] + __cog_app_commands__: ClassVar[List[InvokableApplicationCommand]] + __cog_listeners__: ClassVar[List[Tuple[str, str]]] + + def __new__(cls: Type[CogT], *args: Any, **kwargs: Any) -> CogT: + # For issue 426, we need to store a copy of the command objects + # since we modify them to inject `self` to them. + # To do this, we need to interfere with the Cog creation process. + self = super().__new__(cls) + cmd_attrs = cls.__cog_settings__ + slash_cmd_attrs = cls.__cog_slash_settings__ + user_cmd_attrs = cls.__cog_user_settings__ + message_cmd_attrs = cls.__cog_message_settings__ + + # Either update the command with the cog provided defaults or copy it. + cog_app_commands: List[InvokableApplicationCommand] = [] + for c in cls.__cog_app_commands__: + if isinstance(c, InvokableSlashCommand): + c = c._update_copy(slash_cmd_attrs) + elif isinstance(c, InvokableUserCommand): + c = c._update_copy(user_cmd_attrs) + elif isinstance(c, InvokableMessageCommand): + c = c._update_copy(message_cmd_attrs) + + cog_app_commands.append(c) + + self.__cog_app_commands__ = tuple(cog_app_commands) # type: ignore # overriding ClassVar + # Replace the old command objects with the new copies + for app_command in self.__cog_app_commands__: + setattr(self, app_command.callback.__name__, app_command) + + self.__cog_commands__ = tuple(c._update_copy(cmd_attrs) for c in cls.__cog_commands__) # type: ignore # overriding ClassVar + + lookup = {cmd.qualified_name: cmd for cmd in self.__cog_commands__} + for command in self.__cog_commands__: + setattr(self, command.callback.__name__, command) + parent = command.parent + if parent is not None: + # Get the latest parent reference + parent = lookup[parent.qualified_name] # type: ignore + + # Update our parent's reference to our self + parent.remove_command(command.name) # type: ignore + parent.add_command(command) # type: ignore + + return self + + def get_commands(self) -> List[Command]: + """ + Returns a list of commands the cog has. + + Returns + ------- + List[:class:`.Command`] + A :class:`list` of :class:`.Command`\\s that are + defined inside this cog. + + .. note:: + + This does not include subcommands. + """ + return [c for c in self.__cog_commands__ if c.parent is None] + + def get_application_commands(self) -> List[InvokableApplicationCommand]: + """ + Returns a list of application commands the cog has. + + Returns + ------- + List[:class:`.InvokableApplicationCommand`] + A :class:`list` of :class:`.InvokableApplicationCommand`\\s that are + defined inside this cog. + + .. note:: + + This does not include subcommands. + """ + return [c for c in self.__cog_app_commands__] + + def get_slash_commands(self) -> List[InvokableSlashCommand]: + """ + Returns a list of slash commands the cog has. + + Returns + ------- + List[:class:`.InvokableSlashCommand`] + A :class:`list` of :class:`.InvokableSlashCommand`\\s that are + defined inside this cog. + + .. note:: + + This does not include subcommands. + """ + return [c for c in self.__cog_app_commands__ if isinstance(c, InvokableSlashCommand)] + + def get_user_commands(self) -> List[InvokableUserCommand]: + """ + Returns a list of user commands the cog has. + + Returns + ------- + List[:class:`.InvokableUserCommand`] + A :class:`list` of :class:`.InvokableUserCommand`\\s that are + defined inside this cog. + """ + return [c for c in self.__cog_app_commands__ if isinstance(c, InvokableUserCommand)] + + def get_message_commands(self) -> List[InvokableMessageCommand]: + """ + Returns a list of message commands the cog has. + + Returns + ------- + List[:class:`.InvokableMessageCommand`] + A :class:`list` of :class:`.InvokableMessageCommand`\\s that are + defined inside this cog. + """ + return [c for c in self.__cog_app_commands__ if isinstance(c, InvokableMessageCommand)] + + @property + def qualified_name(self) -> str: + """:class:`str`: Returns the cog's specified name, not the class name.""" + return self.__cog_name__ + + @property + def description(self) -> str: + """:class:`str`: Returns the cog's description, typically the cleaned docstring.""" + return self.__cog_description__ + + @description.setter + def description(self, description: str) -> None: + self.__cog_description__ = description + + def walk_commands(self) -> Generator[Command, None, None]: + """An iterator that recursively walks through this cog's commands and subcommands. + + Yields + ------ + Union[:class:`.Command`, :class:`.Group`] + A command or group from the cog. + """ + from .core import GroupMixin + + for command in self.__cog_commands__: + if command.parent is None: + yield command + if isinstance(command, GroupMixin): + yield from command.walk_commands() + + def get_listeners(self) -> List[Tuple[str, Callable[..., Any]]]: + """Returns a :class:`list` of (name, function) listener pairs the cog has. + + Returns + ------- + List[Tuple[:class:`str`, :ref:`coroutine `]] + The listeners defined in this cog. + """ + return [(name, getattr(self, method_name)) for name, method_name in self.__cog_listeners__] + + @classmethod + def _get_overridden_method(cls, method: FuncT) -> Optional[FuncT]: + """Return None if the method is not overridden. Otherwise returns the overridden method.""" + return getattr(method.__func__, "__cog_special_method__", method) + + @classmethod + def listener(cls, name: str = MISSING) -> Callable[[FuncT], FuncT]: + """A decorator that marks a function as a listener. + + This is the cog equivalent of :meth:`.Bot.listen`. + + Parameters + ---------- + name: :class:`str` + The name of the event being listened to. If not provided, it + defaults to the function's name. + + Raises + ------ + TypeError + The function is not a coroutine function or a string was not passed as + the name. + """ + if name is not MISSING and not isinstance(name, str): + raise TypeError( + f"Cog.listener expected str but received {name.__class__.__name__!r} instead." + ) + + def decorator(func: FuncT) -> FuncT: + actual = func + if isinstance(actual, staticmethod): + actual = actual.__func__ + if not asyncio.iscoroutinefunction(actual): + raise TypeError("Listener function must be a coroutine function.") + actual.__cog_listener__ = True + to_assign = name or actual.__name__ + try: + actual.__cog_listener_names__.append(to_assign) + except AttributeError: + actual.__cog_listener_names__ = [to_assign] + # we have to return `func` instead of `actual` because + # we need the type to be `staticmethod` for the metaclass + # to pick it up but the metaclass unfurls the function and + # thus the assignments need to be on the actual function + return func + + return decorator + + def has_error_handler(self) -> bool: + """Whether the cog has an error handler. + + .. versionadded:: 1.7 + + :return type: :class:`bool` + """ + return not hasattr(self.cog_command_error.__func__, "__cog_special_method__") + + def has_slash_error_handler(self) -> bool: + """Whether the cog has a slash command error handler. + + :return type: :class:`bool` + """ + return not hasattr(self.cog_slash_command_error.__func__, "__cog_special_method__") + + def has_user_error_handler(self) -> bool: + """Whether the cog has a user command error handler. + + :return type: :class:`bool` + """ + return not hasattr(self.cog_user_command_error.__func__, "__cog_special_method__") + + def has_message_error_handler(self) -> bool: + """Whether the cog has a message command error handler. + + :return type: :class:`bool` + """ + return not hasattr(self.cog_message_command_error.__func__, "__cog_special_method__") + + @_cog_special_method + async def cog_load(self) -> None: + """A special method that is called as a task when the cog is added.""" + pass + + @_cog_special_method + def cog_unload(self) -> None: + """A special method that is called when the cog gets removed. + + This function **cannot** be a coroutine. It must be a regular + function. + + Subclasses must replace this if they want special unloading behaviour. + """ + pass + + @_cog_special_method + def bot_check_once(self, ctx: Context) -> bool: + """A special method that registers as a :meth:`.Bot.check_once` + check. + + This is for text commands only, and doesn't apply to application commands. + + This function **can** be a coroutine and must take a sole parameter, + ``ctx``, to represent the :class:`.Context`. + """ + return True + + @_cog_special_method + def bot_check(self, ctx: Context) -> bool: + """A special method that registers as a :meth:`.Bot.check` + check. + + This is for text commands only, and doesn't apply to application commands. + + This function **can** be a coroutine and must take a sole parameter, + ``ctx``, to represent the :class:`.Context`. + """ + return True + + @_cog_special_method + def bot_slash_command_check_once(self, inter: ApplicationCommandInteraction) -> bool: + """A special method that registers as a :meth:`.Bot.slash_command_check_once` + check. + + This function **can** be a coroutine and must take a sole parameter, + ``inter``, to represent the :class:`.ApplicationCommandInteraction`. + """ + return True + + @_cog_special_method + def bot_slash_command_check(self, inter: ApplicationCommandInteraction) -> bool: + """A special method that registers as a :meth:`.Bot.slash_command_check` + check. + + This function **can** be a coroutine and must take a sole parameter, + ``inter``, to represent the :class:`.ApplicationCommandInteraction`. + """ + return True + + @_cog_special_method + def bot_user_command_check_once(self, inter: ApplicationCommandInteraction) -> bool: + """Similar to :meth:`.Bot.slash_command_check_once` but for user commands.""" + return True + + @_cog_special_method + def bot_user_command_check(self, inter: ApplicationCommandInteraction) -> bool: + """Similar to :meth:`.Bot.slash_command_check` but for user commands.""" + return True + + @_cog_special_method + def bot_message_command_check_once(self, inter: ApplicationCommandInteraction) -> bool: + """Similar to :meth:`.Bot.slash_command_check_once` but for message commands.""" + return True + + @_cog_special_method + def bot_message_command_check(self, inter: ApplicationCommandInteraction) -> bool: + """Similar to :meth:`.Bot.slash_command_check` but for message commands.""" + return True + + @_cog_special_method + def cog_check(self, ctx: Context) -> bool: + """A special method that registers as a :func:`~.ext.commands.check` + for every text command and subcommand in this cog. + + This is for text commands only, and doesn't apply to application commands. + + This function **can** be a coroutine and must take a sole parameter, + ``ctx``, to represent the :class:`.Context`. + """ + return True + + @_cog_special_method + def cog_slash_command_check(self, inter: ApplicationCommandInteraction) -> bool: + """A special method that registers as a :func:`~.ext.commands.check` + for every slash command and subcommand in this cog. + + This function **can** be a coroutine and must take a sole parameter, + ``inter``, to represent the :class:`.ApplicationCommandInteraction`. + """ + return True + + @_cog_special_method + def cog_user_command_check(self, inter: ApplicationCommandInteraction) -> bool: + """Similar to :meth:`.Cog.cog_slash_command_check` but for user commands.""" + return True + + @_cog_special_method + def cog_message_command_check(self, inter: ApplicationCommandInteraction) -> bool: + """Similar to :meth:`.Cog.cog_slash_command_check` but for message commands.""" + return True + + @_cog_special_method + async def cog_command_error(self, ctx: Context, error: Exception) -> None: + """A special method that is called whenever an error + is dispatched inside this cog. + + This is for text commands only, and doesn't apply to application commands. + + This is similar to :func:`.on_command_error` except only applying + to the commands inside this cog. + + This **must** be a coroutine. + + Parameters + ---------- + ctx: :class:`.Context` + The invocation context where the error happened. + error: :class:`CommandError` + The error that was raised. + """ + pass + + @_cog_special_method + async def cog_slash_command_error( + self, inter: ApplicationCommandInteraction, error: Exception + ) -> None: + """A special method that is called whenever an error + is dispatched inside this cog. + + This is similar to :func:`.on_slash_command_error` except only applying + to the slash commands inside this cog. + + This **must** be a coroutine. + + Parameters + ---------- + inter: :class:`.ApplicationCommandInteraction` + The interaction where the error happened. + error: :class:`CommandError` + The error that was raised. + """ + pass + + @_cog_special_method + async def cog_user_command_error( + self, inter: ApplicationCommandInteraction, error: Exception + ) -> None: + """Similar to :func:`cog_slash_command_error` but for user commands.""" + pass + + @_cog_special_method + async def cog_message_command_error( + self, inter: ApplicationCommandInteraction, error: Exception + ) -> None: + """Similar to :func:`cog_slash_command_error` but for message commands.""" + pass + + @_cog_special_method + async def cog_before_invoke(self, ctx: Context) -> None: + """A special method that acts as a cog local pre-invoke hook, + similar to :meth:`.Command.before_invoke`. + + This is for text commands only, and doesn't apply to application commands. + + This **must** be a coroutine. + + Parameters + ---------- + ctx: :class:`.Context` + The invocation context. + """ + pass + + @_cog_special_method + async def cog_after_invoke(self, ctx: Context) -> None: + """A special method that acts as a cog local post-invoke hook, + similar to :meth:`.Command.after_invoke`. + + This is for text commands only, and doesn't apply to application commands. + + This **must** be a coroutine. + + Parameters + ---------- + ctx: :class:`.Context` + The invocation context. + """ + pass + + @_cog_special_method + async def cog_before_slash_command_invoke(self, inter: ApplicationCommandInteraction) -> None: + """A special method that acts as a cog local pre-invoke hook. + + This is similar to :meth:`.Command.before_invoke` but for slash commands. + + This **must** be a coroutine. + + Parameters + ---------- + inter: :class:`.ApplicationCommandInteraction` + The interaction of the slash command. + """ + pass + + @_cog_special_method + async def cog_after_slash_command_invoke(self, inter: ApplicationCommandInteraction) -> None: + """A special method that acts as a cog local post-invoke hook. + + This is similar to :meth:`.Command.after_invoke` but for slash commands. + + This **must** be a coroutine. + + Parameters + ---------- + inter: :class:`.ApplicationCommandInteraction` + The interaction of the slash command. + """ + pass + + @_cog_special_method + async def cog_before_user_command_invoke(self, inter: ApplicationCommandInteraction) -> None: + """Similar to :meth:`cog_before_slash_command_invoke` but for user commands.""" + pass + + @_cog_special_method + async def cog_after_user_command_invoke(self, inter: ApplicationCommandInteraction) -> None: + """Similar to :meth:`cog_after_slash_command_invoke` but for user commands.""" + pass + + @_cog_special_method + async def cog_before_message_command_invoke(self, inter: ApplicationCommandInteraction) -> None: + """Similar to :meth:`cog_before_slash_command_invoke` but for message commands.""" + pass + + @_cog_special_method + async def cog_after_message_command_invoke(self, inter: ApplicationCommandInteraction) -> None: + """Similar to :meth:`cog_after_slash_command_invoke` but for message commands.""" + pass + + def _inject(self: CogT, bot: AnyBot) -> CogT: + cls = self.__class__ + + # realistically, the only thing that can cause loading errors + # is essentially just the command loading, which raises if there are + # duplicates. When this condition is met, we want to undo all what + # we've added so far for some form of atomic loading. + for index, command in enumerate(self.__cog_commands__): + command.cog = self + if command.parent is None: + try: + bot.add_command(command) # type: ignore + except Exception as e: + # undo our additions + for to_undo in self.__cog_commands__[:index]: + if to_undo.parent is None: + bot.remove_command(to_undo.name) # type: ignore + raise e + + for index, command in enumerate(self.__cog_app_commands__): + command.cog = self + try: + if isinstance(command, InvokableSlashCommand): + bot.add_slash_command(command) + elif isinstance(command, InvokableUserCommand): + bot.add_user_command(command) + elif isinstance(command, InvokableMessageCommand): + bot.add_message_command(command) + except Exception as e: + # undo our additions + for to_undo in self.__cog_app_commands__[:index]: + if isinstance(to_undo, InvokableSlashCommand): + bot.remove_slash_command(to_undo.name) + elif isinstance(to_undo, InvokableUserCommand): + bot.remove_user_command(to_undo.name) + elif isinstance(to_undo, InvokableMessageCommand): + bot.remove_message_command(to_undo.name) + raise e + + if not hasattr(self.cog_load.__func__, "__cog_special_method__"): + bot.loop.create_task(disnake.utils.maybe_coroutine(self.cog_load)) + + # check if we're overriding the default + if cls.bot_check is not Cog.bot_check: + bot.add_check(self.bot_check) # type: ignore + + if cls.bot_check_once is not Cog.bot_check_once: + bot.add_check(self.bot_check_once, call_once=True) # type: ignore + + # Add application command checks + if cls.bot_slash_command_check is not Cog.bot_slash_command_check: + bot.add_app_command_check(self.bot_slash_command_check, slash_commands=True) # type: ignore + + if cls.bot_user_command_check is not Cog.bot_user_command_check: + bot.add_app_command_check(self.bot_user_command_check, user_commands=True) # type: ignore + + if cls.bot_message_command_check is not Cog.bot_message_command_check: + bot.add_app_command_check(self.bot_message_command_check, message_commands=True) # type: ignore + + # Add app command one-off checks + if cls.bot_slash_command_check_once is not Cog.bot_slash_command_check_once: + bot.add_app_command_check( + self.bot_slash_command_check_once, # type: ignore + call_once=True, + slash_commands=True, + ) + + if cls.bot_user_command_check_once is not Cog.bot_user_command_check_once: + bot.add_app_command_check( + self.bot_user_command_check_once, call_once=True, user_commands=True # type: ignore + ) + + if cls.bot_message_command_check_once is not Cog.bot_message_command_check_once: + bot.add_app_command_check( + self.bot_message_command_check_once, # type: ignore + call_once=True, + message_commands=True, + ) + + # while Bot.add_listener can raise if it's not a coroutine, + # this precondition is already met by the listener decorator + # already, thus this should never raise. + # Outside of, memory errors and the like... + for name, method_name in self.__cog_listeners__: + bot.add_listener(getattr(self, method_name), name) + + try: + if bot._sync_commands_on_cog_unload: + bot._schedule_delayed_command_sync() + except Exception: + pass + + return self + + def _eject(self, bot: AnyBot) -> None: + cls = self.__class__ + + try: + for command in self.__cog_commands__: + if command.parent is None: + bot.remove_command(command.name) # type: ignore + + for app_command in self.__cog_app_commands__: + if isinstance(app_command, InvokableSlashCommand): + bot.remove_slash_command(app_command.name) + elif isinstance(app_command, InvokableUserCommand): + bot.remove_user_command(app_command.name) + elif isinstance(app_command, InvokableMessageCommand): + bot.remove_message_command(app_command.name) + + for name, method_name in self.__cog_listeners__: + bot.remove_listener(getattr(self, method_name), name) + + if cls.bot_check is not Cog.bot_check: + bot.remove_check(self.bot_check) # type: ignore + + if cls.bot_check_once is not Cog.bot_check_once: + bot.remove_check(self.bot_check_once, call_once=True) # type: ignore + + # Remove application command checks + if cls.bot_slash_command_check is not Cog.bot_slash_command_check: + bot.remove_app_command_check(self.bot_slash_command_check, slash_commands=True) # type: ignore + + if cls.bot_user_command_check is not Cog.bot_user_command_check: + bot.remove_app_command_check(self.bot_user_command_check, user_commands=True) # type: ignore + + if cls.bot_message_command_check is not Cog.bot_message_command_check: + bot.remove_app_command_check(self.bot_message_command_check, message_commands=True) # type: ignore + + # Remove app command one-off checks + if cls.bot_slash_command_check_once is not Cog.bot_slash_command_check_once: + bot.remove_app_command_check( + self.bot_slash_command_check_once, # type: ignore + call_once=True, + slash_commands=True, + ) + + if cls.bot_user_command_check_once is not Cog.bot_user_command_check_once: + bot.remove_app_command_check( + self.bot_user_command_check_once, # type: ignore + call_once=True, + user_commands=True, + ) + + if cls.bot_message_command_check_once is not Cog.bot_message_command_check_once: + bot.remove_app_command_check( + self.bot_message_command_check_once, # type: ignore + call_once=True, + message_commands=True, + ) + + finally: + try: + if bot._sync_commands_on_cog_unload: + bot._schedule_delayed_command_sync() + except Exception: + pass + try: + self.cog_unload() + except Exception: + pass diff --git a/sbsheriff/Lib/site-packages/disnake/ext/commands/common_bot_base.py b/sbsheriff/Lib/site-packages/disnake/ext/commands/common_bot_base.py new file mode 100644 index 0000000..a66daba --- /dev/null +++ b/sbsheriff/Lib/site-packages/disnake/ext/commands/common_bot_base.py @@ -0,0 +1,652 @@ +""" +The MIT License (MIT) + +Copyright (c) 2015-2021 Rapptz +Copyright (c) 2021-present Disnake Development + +Permission is hereby granted, free of charge, to any person obtaining a +copy of this software and associated documentation files (the "Software"), +to deal in the Software without restriction, including without limitation +the rights to use, copy, modify, merge, publish, distribute, sublicense, +and/or sell copies of the Software, and to permit persons to whom the +Software is furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS +OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER +DEALINGS IN THE SOFTWARE. +""" + +from __future__ import annotations + +import asyncio +import collections.abc +import importlib.util +import logging +import os +import sys +import time +import types +from typing import ( + TYPE_CHECKING, + Any, + Callable, + Dict, + Generic, + List, + Mapping, + Optional, + Set, + TypeVar, + Union, +) + +import disnake +import disnake.utils + +from . import errors +from .cog import Cog + +if TYPE_CHECKING: + import importlib.machinery + + from ._types import CoroFunc + from .bot import AutoShardedBot, AutoShardedInteractionBot, Bot, InteractionBot + + AnyBot = Union[Bot, AutoShardedBot, InteractionBot, AutoShardedInteractionBot] + +__all__ = ("CommonBotBase",) + +CogT = TypeVar("CogT", bound="Cog") +FuncT = TypeVar("FuncT", bound=Callable[..., Any]) +CFT = TypeVar("CFT", bound="CoroFunc") + +MISSING: Any = disnake.utils.MISSING + + +def _is_submodule(parent: str, child: str) -> bool: + return parent == child or child.startswith(parent + ".") + + +class CommonBotBase(Generic[CogT]): + def __init__(self, *args, **kwargs): + self.__cogs: Dict[str, Cog] = {} + self.__extensions: Dict[str, types.ModuleType] = {} + self.extra_events: Dict[str, List[CoroFunc]] = {} + self._is_closed: bool = False + + self.owner_id: Optional[int] = kwargs.get("owner_id") + self.owner_ids: Set[int] = kwargs.get("owner_ids", set()) + self.owner: Optional[disnake.User] = None + self.owners: Set[disnake.TeamMember] = set() + + if self.owner_id and self.owner_ids: + raise TypeError("Both owner_id and owner_ids are set.") + + if self.owner_ids and not isinstance(self.owner_ids, collections.abc.Collection): + raise TypeError(f"owner_ids must be a collection not {self.owner_ids.__class__!r}") + + self.reload: bool = kwargs.get("reload", False) + + loop = asyncio.get_event_loop() + loop.create_task(self._fill_owners()) + + if self.reload: + loop.create_task(self._watchdog()) + + super().__init__(*args, **kwargs) + + def dispatch(self, event_name: str, *args: Any, **kwargs: Any) -> None: + # super() will resolve to Client + super().dispatch(event_name, *args, **kwargs) # type: ignore + ev = "on_" + event_name + for event in self.extra_events.get(ev, []): + self._schedule_event(event, ev, *args, **kwargs) # type: ignore + + async def _fill_owners(self) -> None: + if self.owner_id or self.owner_ids: + return + + await self.wait_until_first_connect() # type: ignore + + app = await self.application_info() # type: ignore + if app.team: + self.owners = set(app.team.members) + self.owner_ids = {m.id for m in app.team.members} + else: + self.owner = app.owner + self.owner_id = app.owner.id + + async def close(self) -> None: + self._is_closed = True + + for extension in tuple(self.__extensions): + try: + self.unload_extension(extension) + except Exception: + pass + + for cog in tuple(self.__cogs): + try: + self.remove_cog(cog) + except Exception: + pass + + await super().close() # type: ignore + + async def is_owner(self, user: Union[disnake.User, disnake.Member]) -> bool: + """|coro| + + Checks if a :class:`~disnake.User` or :class:`~disnake.Member` is the owner of + this bot. + + If an :attr:`owner_id` is not set, it is fetched automatically + through the use of :meth:`~.Bot.application_info`. + + .. versionchanged:: 1.3 + The function also checks if the application is team-owned if + :attr:`owner_ids` is not set. + + Parameters + ---------- + user: :class:`.abc.User` + The user to check for. + + Returns + ------- + :class:`bool` + Whether the user is the owner. + """ + if self.owner_id: + return user.id == self.owner_id + elif self.owner_ids: + return user.id in self.owner_ids + else: + app = await self.application_info() # type: ignore + if app.team: + self.owners = set(app.team.members) + self.owner_ids = ids = {m.id for m in app.team.members} + return user.id in ids + else: + self.owner = app.owner + self.owner_id = owner_id = app.owner.id + return user.id == owner_id + + # listener registration + + def add_listener(self, func: CoroFunc, name: str = MISSING) -> None: + """The non decorator alternative to :meth:`.listen`. + + Parameters + ---------- + func: :ref:`coroutine ` + The function to call. + name: :class:`str` + The name of the event to listen for. Defaults to ``func.__name__``. + + Example + -------- + + .. code-block:: python + + async def on_ready(): pass + async def my_message(message): pass + + bot.add_listener(on_ready) + bot.add_listener(my_message, 'on_message') + + Raises + ------ + TypeError + The function is not a coroutine. + """ + name = func.__name__ if name is MISSING else name + + if not asyncio.iscoroutinefunction(func): + raise TypeError("Listeners must be coroutines") + + if name in self.extra_events: + self.extra_events[name].append(func) + else: + self.extra_events[name] = [func] + + def remove_listener(self, func: CoroFunc, name: str = MISSING) -> None: + """Removes a listener from the pool of listeners. + + Parameters + ---------- + func + The function that was used as a listener to remove. + name: :class:`str` + The name of the event we want to remove. Defaults to + ``func.__name__``. + """ + name = func.__name__ if name is MISSING else name + + if name in self.extra_events: + try: + self.extra_events[name].remove(func) + except ValueError: + pass + + def listen(self, name: str = MISSING) -> Callable[[CFT], CFT]: + """A decorator that registers another function as an external + event listener. Basically this allows you to listen to multiple + events from different places e.g. such as :func:`.on_ready` + + The functions being listened to must be a :ref:`coroutine `. + + Example + -------- + + .. code-block:: python3 + + @bot.listen() + async def on_message(message): + print('one') + + # in some other file... + + @bot.listen('on_message') + async def my_message(message): + print('two') + + Would print one and two in an unspecified order. + + Raises + ------ + TypeError + The function being listened to is not a coroutine. + """ + + def decorator(func: CFT) -> CFT: + self.add_listener(func, name) + return func + + return decorator + + # cogs + + def add_cog(self, cog: Cog, *, override: bool = False) -> None: + """Adds a "cog" to the bot. + + A cog is a class that has its own event listeners and commands. + + .. versionchanged:: 2.0 + + :exc:`.ClientException` is raised when a cog with the same name + is already loaded. + + Parameters + ---------- + cog: :class:`.Cog` + The cog to register to the bot. + override: :class:`bool` + If a previously loaded cog with the same name should be ejected + instead of raising an error. + + .. versionadded:: 2.0 + + Raises + ------ + TypeError + The cog does not inherit from :class:`.Cog`. + CommandError + An error happened during loading. + ClientException + A cog with the same name is already loaded. + """ + if not isinstance(cog, Cog): + raise TypeError("cogs must derive from Cog") + + cog_name = cog.__cog_name__ + existing = self.__cogs.get(cog_name) + + if existing is not None: + if not override: + raise disnake.ClientException(f"Cog named {cog_name!r} already loaded") + self.remove_cog(cog_name) + + # NOTE: Should be covariant + cog = cog._inject(self) # type: ignore + self.__cogs[cog_name] = cog + + def get_cog(self, name: str) -> Optional[Cog]: + """Gets the cog instance requested. + + If the cog is not found, ``None`` is returned instead. + + Parameters + ---------- + name: :class:`str` + The name of the cog you are requesting. + This is equivalent to the name passed via keyword + argument in class creation or the class name if unspecified. + + Returns + ------- + Optional[:class:`Cog`] + The cog that was requested. If not found, returns ``None``. + """ + return self.__cogs.get(name) + + def remove_cog(self, name: str) -> Optional[Cog]: + """Removes a cog from the bot and returns it. + + All registered commands and event listeners that the + cog has registered will be removed as well. + + If no cog is found then this method has no effect. + + Parameters + ---------- + name: :class:`str` + The name of the cog to remove. + + Returns + ------- + Optional[:class:`.Cog`] + The cog that was removed. Returns ``None`` if not found. + """ + cog = self.__cogs.pop(name, None) + if cog is None: + return + + help_command = getattr(self, "_help_command", None) + if help_command and help_command.cog is cog: + help_command.cog = None + # NOTE: Should be covariant + cog._eject(self) # type: ignore + + return cog + + @property + def cogs(self) -> Mapping[str, Cog]: + """Mapping[:class:`str`, :class:`Cog`]: A read-only mapping of cog name to cog.""" + return types.MappingProxyType(self.__cogs) + + # extensions + + def _remove_module_references(self, name: str) -> None: + # find all references to the module + # remove the cogs registered from the module + for cogname, cog in self.__cogs.copy().items(): + if _is_submodule(name, cog.__module__): + self.remove_cog(cogname) + # remove all the listeners from the module + for event_list in self.extra_events.copy().values(): + remove = [ + index + for index, event in enumerate(event_list) + if event.__module__ is not None and _is_submodule(name, event.__module__) + ] + + for index in reversed(remove): + del event_list[index] + + def _call_module_finalizers(self, lib: types.ModuleType, key: str) -> None: + try: + func = getattr(lib, "teardown") + except AttributeError: + pass + else: + try: + func(self) + except Exception: + pass + finally: + self.__extensions.pop(key, None) + sys.modules.pop(key, None) + name = lib.__name__ + for module in list(sys.modules.keys()): + if _is_submodule(name, module): + del sys.modules[module] + + def _load_from_module_spec(self, spec: importlib.machinery.ModuleSpec, key: str) -> None: + # precondition: key not in self.__extensions + lib = importlib.util.module_from_spec(spec) + sys.modules[key] = lib + try: + spec.loader.exec_module(lib) # type: ignore + except Exception as e: + del sys.modules[key] + raise errors.ExtensionFailed(key, e) from e + + try: + setup = getattr(lib, "setup") + except AttributeError: + del sys.modules[key] + raise errors.NoEntryPointError(key) + + try: + setup(self) + except Exception as e: + del sys.modules[key] + self._remove_module_references(lib.__name__) + self._call_module_finalizers(lib, key) + raise errors.ExtensionFailed(key, e) from e + else: + self.__extensions[key] = lib + + def _resolve_name(self, name: str, package: Optional[str]) -> str: + try: + return importlib.util.resolve_name(name, package) + except ImportError: + raise errors.ExtensionNotFound(name) + + def load_extension(self, name: str, *, package: Optional[str] = None) -> None: + """Loads an extension. + + An extension is a python module that contains commands, cogs, or + listeners. + + An extension must have a global function, ``setup`` defined as + the entry point on what to do when the extension is loaded. This entry + point must have a single argument, the ``bot``. + + Parameters + ---------- + name: :class:`str` + The extension name to load. It must be dot separated like + regular Python imports if accessing a sub-module. e.g. + ``foo.test`` if you want to import ``foo/test.py``. + package: Optional[:class:`str`] + The package name to resolve relative imports with. + This is required when loading an extension using a relative path, e.g ``.foo.test``. + Defaults to ``None``. + + .. versionadded:: 1.7 + + Raises + ------ + ExtensionNotFound + The extension could not be imported. + This is also raised if the name of the extension could not + be resolved using the provided ``package`` parameter. + ExtensionAlreadyLoaded + The extension is already loaded. + NoEntryPointError + The extension does not have a setup function. + ExtensionFailed + The extension or its setup function had an execution error. + """ + name = self._resolve_name(name, package) + if name in self.__extensions: + raise errors.ExtensionAlreadyLoaded(name) + + spec = importlib.util.find_spec(name) + if spec is None: + raise errors.ExtensionNotFound(name) + + self._load_from_module_spec(spec, name) + + def unload_extension(self, name: str, *, package: Optional[str] = None) -> None: + """Unloads an extension. + + When the extension is unloaded, all commands, listeners, and cogs are + removed from the bot and the module is un-imported. + + The extension can provide an optional global function, ``teardown``, + to do miscellaneous clean-up if necessary. This function takes a single + parameter, the ``bot``, similar to ``setup`` from + :meth:`~.Bot.load_extension`. + + Parameters + ---------- + name: :class:`str` + The extension name to unload. It must be dot separated like + regular Python imports if accessing a sub-module. e.g. + ``foo.test`` if you want to import ``foo/test.py``. + package: Optional[:class:`str`] + The package name to resolve relative imports with. + This is required when unloading an extension using a relative path, e.g ``.foo.test``. + Defaults to ``None``. + + .. versionadded:: 1.7 + + Raises + ------ + ExtensionNotFound + The name of the extension could not + be resolved using the provided ``package`` parameter. + ExtensionNotLoaded + The extension was not loaded. + """ + name = self._resolve_name(name, package) + lib = self.__extensions.get(name) + if lib is None: + raise errors.ExtensionNotLoaded(name) + + self._remove_module_references(lib.__name__) + self._call_module_finalizers(lib, name) + + def reload_extension(self, name: str, *, package: Optional[str] = None) -> None: + """Atomically reloads an extension. + + This replaces the extension with the same extension, only refreshed. This is + equivalent to a :meth:`unload_extension` followed by a :meth:`load_extension` + except done in an atomic way. That is, if an operation fails mid-reload then + the bot will roll-back to the prior working state. + + Parameters + ---------- + name: :class:`str` + The extension name to reload. It must be dot separated like + regular Python imports if accessing a sub-module. e.g. + ``foo.test`` if you want to import ``foo/test.py``. + package: Optional[:class:`str`] + The package name to resolve relative imports with. + This is required when reloading an extension using a relative path, e.g ``.foo.test``. + Defaults to ``None``. + + .. versionadded:: 1.7 + + Raises + ------ + ExtensionNotLoaded + The extension was not loaded. + ExtensionNotFound + The extension could not be imported. + This is also raised if the name of the extension could not + be resolved using the provided ``package`` parameter. + NoEntryPointError + The extension does not have a setup function. + ExtensionFailed + The extension setup function had an execution error. + """ + name = self._resolve_name(name, package) + lib = self.__extensions.get(name) + if lib is None: + raise errors.ExtensionNotLoaded(name) + + # get the previous module states from sys modules + modules = { + name: module + for name, module in sys.modules.items() + if _is_submodule(lib.__name__, name) + } + + try: + # Unload and then load the module... + self._remove_module_references(lib.__name__) + self._call_module_finalizers(lib, name) + self.load_extension(name) + except Exception: + # if the load failed, the remnants should have been + # cleaned from the load_extension function call + # so let's load it from our old compiled library. + lib.setup(self) + self.__extensions[name] = lib + + # revert sys.modules back to normal and raise back to caller + sys.modules.update(modules) + raise + + def load_extensions(self, path: str) -> None: + """Loads all extensions in a directory. + + .. versionadded:: 2.4 + + Parameters + ---------- + path: :class:`str` + The path to search for extensions + """ + for extension in disnake.utils.search_directory(path): + self.load_extension(extension) + + @property + def extensions(self) -> Mapping[str, types.ModuleType]: + """Mapping[:class:`str`, :class:`py:types.ModuleType`]: A read-only mapping of extension name to extension.""" + return types.MappingProxyType(self.__extensions) + + async def _watchdog(self): + """|coro| + + Starts the bot watchdog which will watch currently loaded extensions + and reload them when they're modified. + """ + if isinstance(self, disnake.Client): + await self.wait_until_ready() + + reload_log = logging.getLogger(__name__) + + if isinstance(self, disnake.Client): + is_closed = self.is_closed + else: + is_closed = lambda: False + + reload_log.info(f"WATCHDOG: Watching extensions") + + last = time.time() + while not is_closed(): + t = time.time() + + extensions = set() + for name, module in self.extensions.items(): + file = module.__file__ + if file and os.stat(file).st_mtime > last: + extensions.add(name) + + if extensions: + try: + self.i18n.reload() # type: ignore + except Exception as e: + reload_log.exception(e) + + for name in extensions: + try: + self.reload_extension(name) + except errors.ExtensionError as e: + reload_log.exception(e) + else: + reload_log.info(f"WATCHDOG: Reloaded '{name}'") + + await asyncio.sleep(1) + last = t diff --git a/sbsheriff/Lib/site-packages/disnake/ext/commands/context.py b/sbsheriff/Lib/site-packages/disnake/ext/commands/context.py new file mode 100644 index 0000000..44eec41 --- /dev/null +++ b/sbsheriff/Lib/site-packages/disnake/ext/commands/context.py @@ -0,0 +1,415 @@ +""" +The MIT License (MIT) + +Copyright (c) 2015-2021 Rapptz +Copyright (c) 2021-present Disnake Development + +Permission is hereby granted, free of charge, to any person obtaining a +copy of this software and associated documentation files (the "Software"), +to deal in the Software without restriction, including without limitation +the rights to use, copy, modify, merge, publish, distribute, sublicense, +and/or sell copies of the Software, and to permit persons to whom the +Software is furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS +OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER +DEALINGS IN THE SOFTWARE. +""" +from __future__ import annotations + +import inspect +import re +from typing import TYPE_CHECKING, Any, Dict, Generic, List, Optional, TypeVar, Union + +import disnake.abc +import disnake.utils +from disnake import ApplicationCommandInteraction +from disnake.message import Message + +if TYPE_CHECKING: + from typing_extensions import ParamSpec + + from disnake.channel import DMChannel, TextChannel, Thread, VoiceChannel + from disnake.guild import Guild + from disnake.member import Member + from disnake.state import ConnectionState + from disnake.user import ClientUser, User + from disnake.voice_client import VoiceProtocol + + from .bot import AutoShardedBot, Bot + from .cog import Cog + from .core import Command + from .view import StringView + +__all__ = ("Context", "GuildContext") + +MISSING: Any = disnake.utils.MISSING + + +T = TypeVar("T") +BotT = TypeVar("BotT", bound="Union[Bot, AutoShardedBot]") +CogT = TypeVar("CogT", bound="Cog") + +if TYPE_CHECKING: + P = ParamSpec("P") +else: + P = TypeVar("P") + + +class Context(disnake.abc.Messageable, Generic[BotT]): + """ + Represents the context in which a command is being invoked under. + + This class contains a lot of meta data to help you understand more about + the invocation context. This class is not created manually and is instead + passed around to commands as the first parameter. + + This class implements the :class:`.abc.Messageable` ABC. + + Attributes + ---------- + message: :class:`.Message` + The message that triggered the command being executed. + bot: :class:`.Bot` + The bot that contains the command being executed. + args: :class:`list` + The list of transformed arguments that were passed into the command. + If this is accessed during the :func:`.on_command_error` event + then this list could be incomplete. + kwargs: :class:`dict` + A dictionary of transformed arguments that were passed into the command. + Similar to :attr:`args`\\, if this is accessed in the + :func:`.on_command_error` event then this dict could be incomplete. + current_parameter: Optional[:class:`inspect.Parameter`] + The parameter that is currently being inspected and converted. + This is only of use for within converters. + + .. versionadded:: 2.0 + + prefix: Optional[:class:`str`] + The prefix that was used to invoke the command. + command: Optional[:class:`Command`] + The command that is being invoked currently. + invoked_with: Optional[:class:`str`] + The command name that triggered this invocation. Useful for finding out + which alias called the command. + invoked_parents: List[:class:`str`] + The command names of the parents that triggered this invocation. Useful for + finding out which aliases called the command. + + For example in commands ``?a b c test``, the invoked parents are ``['a', 'b', 'c']``. + + .. versionadded:: 1.7 + + invoked_subcommand: Optional[:class:`Command`] + The subcommand that was invoked. + If no valid subcommand was invoked then this is equal to ``None``. + subcommand_passed: Optional[:class:`str`] + The string that was attempted to call a subcommand. This does not have + to point to a valid registered subcommand and could just point to a + nonsense string. If nothing was passed to attempt a call to a + subcommand then this is set to ``None``. + command_failed: :class:`bool` + Whether the command failed to be parsed, checked, or invoked. + """ + + def __init__( + self, + *, + message: Message, + bot: BotT, + view: StringView, + args: List[Any] = MISSING, + kwargs: Dict[str, Any] = MISSING, + prefix: Optional[str] = None, + command: Optional[Command] = None, + invoked_with: Optional[str] = None, + invoked_parents: List[str] = MISSING, + invoked_subcommand: Optional[Command] = None, + subcommand_passed: Optional[str] = None, + command_failed: bool = False, + current_parameter: Optional[inspect.Parameter] = None, + ): + self.message: Message = message + self.bot: BotT = bot + self.args: List[Any] = args or [] + self.kwargs: Dict[str, Any] = kwargs or {} + self.prefix: Optional[str] = prefix + self.command: Optional[Command] = command + self.view: StringView = view + self.invoked_with: Optional[str] = invoked_with + self.invoked_parents: List[str] = invoked_parents or [] + self.invoked_subcommand: Optional[Command] = invoked_subcommand + self.subcommand_passed: Optional[str] = subcommand_passed + self.command_failed: bool = command_failed + self.current_parameter: Optional[inspect.Parameter] = current_parameter + self._state: ConnectionState = self.message._state + + async def invoke(self, command: Command[CogT, P, T], /, *args: P.args, **kwargs: P.kwargs) -> T: + """ + |coro| + + Calls a command with the arguments given. + + This is useful if you want to just call the callback that a + :class:`.Command` holds internally. + + .. note:: + + This does not handle converters, checks, cooldowns, pre-invoke, + or after-invoke hooks in any matter. It calls the internal callback + directly as-if it was a regular function. + + You must take care in passing the proper arguments when + using this function. + + Parameters + ---------- + command: :class:`.Command` + The command that is going to be called. + *args + The arguments to use. + **kwargs + The keyword arguments to use. + + Raises + ------ + TypeError + The command argument to invoke is missing. + """ + return await command(self, *args, **kwargs) + + async def reinvoke(self, *, call_hooks: bool = False, restart: bool = True) -> None: + """|coro| + + Calls the command again. + + This is similar to :meth:`.invoke` except that it bypasses + checks, cooldowns, and error handlers. + + .. note:: + + If you want to bypass :exc:`.UserInputError` derived exceptions, + it is recommended to use the regular :meth:`.invoke` + as it will work more naturally. After all, this will end up + using the old arguments the user has used and will thus just + fail again. + + Parameters + ---------- + call_hooks: :class:`bool` + Whether to call the before and after invoke hooks. + restart: :class:`bool` + Whether to start the call chain from the very beginning + or where we left off (i.e. the command that caused the error). + The default is to start where we left off. + + Raises + ------ + ValueError + The context to reinvoke is not valid. + """ + cmd = self.command + view = self.view + if cmd is None: + raise ValueError("This context is not valid.") + + # some state to revert to when we're done + index, previous = view.index, view.previous + invoked_with = self.invoked_with + invoked_subcommand = self.invoked_subcommand + invoked_parents = self.invoked_parents + subcommand_passed = self.subcommand_passed + + if restart: + to_call = cmd.root_parent or cmd + view.index = len(self.prefix or "") + view.previous = 0 + self.invoked_parents = [] + self.invoked_with = view.get_word() # advance to get the root command + else: + to_call = cmd + + try: + await to_call.reinvoke(self, call_hooks=call_hooks) + finally: + self.command = cmd + view.index = index + view.previous = previous + self.invoked_with = invoked_with + self.invoked_subcommand = invoked_subcommand + self.invoked_parents = invoked_parents + self.subcommand_passed = subcommand_passed + + @property + def valid(self) -> bool: + """:class:`bool`: Whether the invocation context is valid to be invoked with.""" + return self.prefix is not None and self.command is not None + + async def _get_channel(self) -> disnake.abc.Messageable: + return self.channel + + @property + def clean_prefix(self) -> str: + """:class:`str`: The cleaned up invoke prefix. i.e. mentions are ``@name`` instead of ``<@id>``. + + .. versionadded:: 2.0 + """ + if self.prefix is None: + return "" + + user = self.me + # this breaks if the prefix mention is not the bot itself but I + # consider this to be an *incredibly* strange use case. I'd rather go + # for this common use case rather than waste performance for the + # odd one. + pattern = re.compile(r"<@!?%s>" % user.id) + return pattern.sub("@%s" % user.display_name.replace("\\", r"\\"), self.prefix) + + @property + def cog(self) -> Optional[Cog]: + """Optional[:class:`.Cog`]: Returns the cog associated with this context's command. Returns ``None`` if it does not exist.""" + if self.command is None: + return None + return self.command.cog + + @disnake.utils.cached_property + def guild(self) -> Optional[Guild]: + """Optional[:class:`.Guild`]: Returns the guild associated with this context's command. Returns ``None`` if not available.""" + return self.message.guild + + @disnake.utils.cached_property + def channel(self) -> Union[TextChannel, Thread, DMChannel, VoiceChannel]: + """Union[:class:`.abc.Messageable`]: Returns the channel associated with this context's command. + Shorthand for :attr:`.Message.channel`. + """ + return self.message.channel + + @disnake.utils.cached_property + def author(self) -> Union[User, Member]: + """Union[:class:`~disnake.User`, :class:`.Member`]: + Returns the author associated with this context's command. Shorthand for :attr:`.Message.author` + """ + return self.message.author + + @disnake.utils.cached_property + def me(self) -> Union[Member, ClientUser]: + """Union[:class:`.Member`, :class:`.ClientUser`]: + Similar to :attr:`.Guild.me` except it may return the :class:`.ClientUser` in private message contexts. + """ + # bot.user will never be None at this point. + return self.guild.me if self.guild is not None else self.bot.user + + @property + def voice_client(self) -> Optional[VoiceProtocol]: + r"""Optional[:class:`.VoiceProtocol`]: A shortcut to :attr:`.Guild.voice_client`\, if applicable.""" + g = self.guild + return g.voice_client if g else None + + async def send_help(self, *args: Any) -> Any: + """send_help(entity=) + + |coro| + + Shows the help command for the specified entity if given. + The entity can be a command or a cog. + + If no entity is given, then it'll show help for the + entire bot. + + If the entity is a string, then it looks up whether it's a + :class:`Cog` or a :class:`Command`. + + .. note:: + + Due to the way this function works, instead of returning + something similar to :meth:`~.commands.HelpCommand.command_not_found` + this returns :class:`None` on bad input or no help command. + + Parameters + ---------- + entity: Optional[Union[:class:`Command`, :class:`Cog`, :class:`str`]] + The entity to show help for. + + Returns + ------- + Any + The result of the help command, if any. + """ + from .core import Command, Group, wrap_callback + from .errors import CommandError + + bot = self.bot + cmd = bot.help_command + + if cmd is None: + return None + + cmd = cmd.copy() + cmd.context = self + if len(args) == 0: + await cmd.prepare_help_command(self, None) + mapping = cmd.get_bot_mapping() + injected = wrap_callback(cmd.send_bot_help) + try: + return await injected(mapping) + except CommandError as e: + await cmd.on_help_command_error(self, e) + return None + + entity = args[0] + if isinstance(entity, str): + entity = bot.get_cog(entity) or bot.get_command(entity) + + if entity is None: + return None + + try: + entity.qualified_name + except AttributeError: + # if we're here then it's not a cog, group, or command. + return None + + await cmd.prepare_help_command(self, entity.qualified_name) + + try: + if hasattr(entity, "__cog_commands__"): + injected = wrap_callback(cmd.send_cog_help) + return await injected(entity) + elif isinstance(entity, Group): + injected = wrap_callback(cmd.send_group_help) + return await injected(entity) + elif isinstance(entity, Command): + injected = wrap_callback(cmd.send_command_help) + return await injected(entity) + else: + return None + except CommandError as e: + await cmd.on_help_command_error(self, e) + + @disnake.utils.copy_doc(Message.reply) + async def reply(self, content: Optional[str] = None, **kwargs: Any) -> Message: + return await self.message.reply(content, **kwargs) + + +class GuildContext(Context): + """A Context subclass meant for annotation + + No runtime behavior is changed but annotations are modified + to seem like the context may never be invoked in a DM. + """ + + guild: Guild + channel: Union[TextChannel, Thread, VoiceChannel] + author: Member + me: Member + + +AnyContext = Union[Context, ApplicationCommandInteraction] diff --git a/sbsheriff/Lib/site-packages/disnake/ext/commands/converter.py b/sbsheriff/Lib/site-packages/disnake/ext/commands/converter.py new file mode 100644 index 0000000..23092df --- /dev/null +++ b/sbsheriff/Lib/site-packages/disnake/ext/commands/converter.py @@ -0,0 +1,1302 @@ +""" +The MIT License (MIT) + +Copyright (c) 2015-2021 Rapptz +Copyright (c) 2021-present Disnake Development + +Permission is hereby granted, free of charge, to any person obtaining a +copy of this software and associated documentation files (the "Software"), +to deal in the Software without restriction, including without limitation +the rights to use, copy, modify, merge, publish, distribute, sublicense, +and/or sell copies of the Software, and to permit persons to whom the +Software is furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS +OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER +DEALINGS IN THE SOFTWARE. +""" + +from __future__ import annotations + +import functools +import inspect +import re +from typing import ( + TYPE_CHECKING, + Any, + Callable, + Dict, + Generic, + Iterable, + List, + Literal, + Optional, + Protocol, + Tuple, + Type, + TypeVar, + Union, + runtime_checkable, +) + +import disnake + +from .context import AnyContext, Context +from .errors import * + +if TYPE_CHECKING: + from disnake.message import MessageableChannel + + +# TODO: USE ACTUAL FUNCTIONS INSTEAD OF USELESS CLASSES + +__all__ = ( + "Converter", + "IDConverter", + "ObjectConverter", + "MemberConverter", + "UserConverter", + "PartialMessageConverter", + "MessageConverter", + "GuildChannelConverter", + "TextChannelConverter", + "VoiceChannelConverter", + "StageChannelConverter", + "CategoryChannelConverter", + "ForumChannelConverter", + "ThreadConverter", + "ColourConverter", + "ColorConverter", + "RoleConverter", + "GameConverter", + "InviteConverter", + "GuildConverter", + "EmojiConverter", + "PartialEmojiConverter", + "GuildStickerConverter", + "PermissionsConverter", + "GuildScheduledEventConverter", + "clean_content", + "Greedy", + "run_converters", +) + + +_utils_get = disnake.utils.get +T = TypeVar("T") +T_co = TypeVar("T_co", covariant=True) +CT = TypeVar("CT", bound=disnake.abc.GuildChannel) +TT = TypeVar("TT", bound=disnake.Thread) + + +def _get_from_guilds( + client: disnake.Client, func: Callable[[disnake.Guild], Optional[T]] +) -> Optional[T]: + for guild in client.guilds: + if result := func(guild): + return result + return None + + +@runtime_checkable +class Converter(Protocol[T_co]): + """The base class of custom converters that require the :class:`.Context` + or :class:`.ApplicationCommandInteraction` to be passed to be useful. + + This allows you to implement converters that function similar to the + special cased ``disnake`` classes. + + Classes that derive from this should override the :meth:`~.Converter.convert` + method to do its conversion logic. This method must be a :ref:`coroutine `. + """ + + async def convert(self, ctx: AnyContext, argument: str) -> T_co: + """|coro| + + The method to override to do conversion logic. + + If an error is found while converting, it is recommended to + raise a :exc:`.CommandError` derived exception as it will + properly propagate to the error handlers. + + Parameters + ----------- + ctx: Union[:class:`.Context`, :class:`.ApplicationCommandInteraction`] + The invocation context that the argument is being used in. + argument: :class:`str` + The argument that is being converted. + + Raises + ------ + CommandError + A generic exception occurred when converting the argument. + BadArgument + The converter failed to convert the argument. + """ + raise NotImplementedError("Derived classes need to implement this.") + + +_ID_REGEX = re.compile(r"([0-9]{15,20})$") + + +class IDConverter(Converter[T_co]): + @staticmethod + def _get_id_match(argument: str) -> Optional[re.Match[str]]: + return _ID_REGEX.match(argument) + + +class ObjectConverter(IDConverter[disnake.Object]): + """Converts to a :class:`~disnake.Object`. + + The argument must follow the valid ID or mention formats (e.g. `<@80088516616269824>`). + + .. versionadded:: 2.0 + + The lookup strategy is as follows (in order): + + 1. Lookup by ID. + 2. Lookup by member, role, or channel mention. + """ + + async def convert(self, ctx: AnyContext, argument: str) -> disnake.Object: + match = self._get_id_match(argument) or re.match( + r"<(?:@(?:!|&)?|#)([0-9]{15,20})>$", argument + ) + + if match is None: + raise ObjectNotFound(argument) + + result = int(match.group(1)) + + return disnake.Object(id=result) + + +class MemberConverter(IDConverter[disnake.Member]): + """Converts to a :class:`~disnake.Member`. + + All lookups are via the local guild. If in a DM context, then the lookup + is done by the global cache. + + The lookup strategy is as follows (in order): + + 1. Lookup by ID. + 2. Lookup by mention. + 3. Lookup by name#discrim + 4. Lookup by name + 5. Lookup by nickname + + .. versionchanged:: 1.5 + Raise :exc:`.MemberNotFound` instead of generic :exc:`.BadArgument` + + .. versionchanged:: 1.5.1 + This converter now lazily fetches members from the gateway and HTTP APIs, + optionally caching the result if :attr:`.MemberCacheFlags.joined` is enabled. + """ + + async def query_member_named( + self, guild: disnake.Guild, argument: str + ) -> Optional[disnake.Member]: + cache = guild._state.member_cache_flags.joined + if len(argument) > 5 and argument[-5] == "#": + username, _, discriminator = argument.rpartition("#") + members = await guild.query_members(username, limit=100, cache=cache) + return _utils_get(members, name=username, discriminator=discriminator) + else: + members = await guild.query_members(argument, limit=100, cache=cache) + return disnake.utils.find(lambda m: m.name == argument or m.nick == argument, members) + + async def query_member_by_id( + self, bot: disnake.Client, guild: disnake.Guild, user_id: int + ) -> Optional[disnake.Member]: + ws = bot._get_websocket(shard_id=guild.shard_id) + cache = guild._state.member_cache_flags.joined + if ws.is_ratelimited(): + # If we're being rate limited on the WS, then fall back to using the HTTP API + # So we don't have to wait ~60 seconds for the query to finish + try: + member = await guild.fetch_member(user_id) + except disnake.HTTPException: + return None + + if cache: + guild._add_member(member) + return member + + # If we're not being rate limited then we can use the websocket to actually query + members = await guild.query_members(limit=1, user_ids=[user_id], cache=cache) + if not members: + return None + return members[0] + + async def convert(self, ctx: AnyContext, argument: str) -> disnake.Member: + bot: disnake.Client = ctx.bot + match = self._get_id_match(argument) or re.match(r"<@!?([0-9]{15,20})>$", argument) + guild = ctx.guild + result: Optional[disnake.Member] = None + user_id: Optional[int] = None + + if match is None: + # not a mention... + if guild: + result = guild.get_member_named(argument) + else: + result = _get_from_guilds(bot, lambda g: g.get_member_named(argument)) + else: + user_id = int(match.group(1)) + if guild: + mentions: Iterable[disnake.Member] + if isinstance(ctx, Context): + mentions = ( + user for user in ctx.message.mentions if isinstance(user, disnake.Member) + ) + else: + mentions = [] + result = guild.get_member(user_id) or _utils_get(mentions, id=user_id) + else: + result = _get_from_guilds(bot, lambda g: g.get_member(user_id)) + + if result is None: + if guild is None: + raise MemberNotFound(argument) + + if user_id is not None: + result = await self.query_member_by_id(bot, guild, user_id) + else: + result = await self.query_member_named(guild, argument) + + if not result: + raise MemberNotFound(argument) + + return result + + +class UserConverter(IDConverter[disnake.User]): + """Converts to a :class:`~disnake.User`. + + All lookups are via the global user cache. + + The lookup strategy is as follows (in order): + + 1. Lookup by ID. + 2. Lookup by mention. + 3. Lookup by name#discrim + 4. Lookup by name + + .. versionchanged:: 1.5 + Raise :exc:`.UserNotFound` instead of generic :exc:`.BadArgument` + + .. versionchanged:: 1.6 + This converter now lazily fetches users from the HTTP APIs if an ID is passed + and it's not available in cache. + """ + + async def convert(self, ctx: AnyContext, argument: str) -> disnake.User: + match = self._get_id_match(argument) or re.match(r"<@!?([0-9]{15,20})>$", argument) + state = ctx._state + bot: disnake.Client = ctx.bot + result: Optional[Union[disnake.User, disnake.Member]] = None + + if match is not None: + user_id = int(match.group(1)) + + mentions: Iterable[Union[disnake.User, disnake.Member]] + if isinstance(ctx, Context): + mentions = ctx.message.mentions + else: + mentions = [] + result = bot.get_user(user_id) or _utils_get(mentions, id=user_id) + + if result is None: + try: + result = await bot.fetch_user(user_id) + except disnake.HTTPException: + raise UserNotFound(argument) from None + + if isinstance(result, disnake.Member): + return result._user + return result + + arg = argument + + # Remove the '@' character if this is the first character from the argument + if arg[0] == "@": + # Remove first character + arg = arg[1:] + + # check for discriminator if it exists, + if len(arg) > 5 and arg[-5] == "#": + discrim = arg[-4:] + name = arg[:-5] + result = disnake.utils.find( + lambda u: u.name == name and u.discriminator == discrim, state._users.values() + ) + if result is not None: + return result + + result = disnake.utils.find(lambda u: u.name == arg, state._users.values()) + + if result is None: + raise UserNotFound(argument) + + return result + + +class PartialMessageConverter(Converter[disnake.PartialMessage]): + """Converts to a :class:`~disnake.PartialMessage`. + + .. versionadded:: 1.7 + + The creation strategy is as follows (in order): + + 1. By "{channel ID}-{message ID}" (retrieved by shift-clicking on "Copy ID") + 2. By message ID (The message is assumed to be in the context channel.) + 3. By message URL + """ + + @staticmethod + def _get_id_matches(ctx: AnyContext, argument: str) -> Tuple[Optional[int], int, int]: + id_regex = re.compile(r"(?:(?P[0-9]{15,20})-)?(?P[0-9]{15,20})$") + link_regex = re.compile( + r"https?://(?:(ptb|canary|www)\.)?discord(?:app)?\.com/channels/" + r"(?P[0-9]{15,20}|@me)" + r"/(?P[0-9]{15,20})/(?P[0-9]{15,20})/?$" + ) + match = id_regex.match(argument) or link_regex.match(argument) + if not match: + raise MessageNotFound(argument) + data = match.groupdict() + channel_id = disnake.utils._get_as_snowflake(data, "channel_id") or ctx.channel.id + message_id = int(data["message_id"]) + guild_id_str: Optional[str] = data.get("guild_id") + if guild_id_str is None: + guild_id = ctx.guild and ctx.guild.id + elif guild_id_str == "@me": + guild_id = None + else: + guild_id = int(guild_id_str) + return guild_id, message_id, channel_id + + @staticmethod + def _resolve_channel( + ctx: AnyContext, guild_id: Optional[int], channel_id: int + ) -> Optional[MessageableChannel]: + bot: disnake.Client = ctx.bot + if guild_id is None: + return bot.get_channel(channel_id) if channel_id else ctx.channel # type: ignore + + guild = bot.get_guild(guild_id) + if guild is not None: + return guild._resolve_channel(channel_id) # type: ignore + return None + + async def convert(self, ctx: AnyContext, argument: str) -> disnake.PartialMessage: + guild_id, message_id, channel_id = self._get_id_matches(ctx, argument) + channel = self._resolve_channel(ctx, guild_id, channel_id) + if not channel: + raise ChannelNotFound(str(channel_id)) + return disnake.PartialMessage(channel=channel, id=message_id) + + +class MessageConverter(IDConverter[disnake.Message]): + """Converts to a :class:`~disnake.Message`. + + .. versionadded:: 1.1 + + The lookup strategy is as follows (in order): + + 1. Lookup by "{channel ID}-{message ID}" (retrieved by shift-clicking on "Copy ID") + 2. Lookup by message ID (the message **must** be in the context channel) + 3. Lookup by message URL + + .. versionchanged:: 1.5 + Raise :exc:`.ChannelNotFound`, :exc:`.MessageNotFound` or :exc:`.ChannelNotReadable` instead of generic :exc:`.BadArgument` + """ + + async def convert(self, ctx: AnyContext, argument: str) -> disnake.Message: + guild_id, message_id, channel_id = PartialMessageConverter._get_id_matches(ctx, argument) + bot: disnake.Client = ctx.bot + message = bot._connection._get_message(message_id) + if message: + return message + channel = PartialMessageConverter._resolve_channel(ctx, guild_id, channel_id) + if not channel: + raise ChannelNotFound(str(channel_id)) + try: + return await channel.fetch_message(message_id) + except disnake.NotFound: + raise MessageNotFound(argument) + except disnake.Forbidden: + raise ChannelNotReadable(channel) # type: ignore + + +class GuildChannelConverter(IDConverter[disnake.abc.GuildChannel]): + """Converts to a :class:`.abc.GuildChannel`. + + All lookups are via the local guild. If in a DM context, then the lookup + is done by the global cache. + + The lookup strategy is as follows (in order): + + 1. Lookup by ID. + 2. Lookup by mention. + 3. Lookup by name. + + .. versionadded:: 2.0 + """ + + async def convert(self, ctx: AnyContext, argument: str) -> disnake.abc.GuildChannel: + return self._resolve_channel(ctx, argument, "channels", disnake.abc.GuildChannel) + + @staticmethod + def _resolve_channel(ctx: AnyContext, argument: str, attribute: str, type: Type[CT]) -> CT: + bot: disnake.Client = ctx.bot + + match = IDConverter._get_id_match(argument) or re.match(r"<#([0-9]{15,20})>$", argument) + result: Optional[disnake.abc.GuildChannel] = None + guild = ctx.guild + + if match is None: + # not a mention + if guild: + iterable: Iterable[CT] = getattr(guild, attribute) + result = _utils_get(iterable, name=argument) + else: + result = disnake.utils.find( + lambda c: isinstance(c, type) and c.name == argument, bot.get_all_channels() + ) + else: + channel_id = int(match.group(1)) + if guild: + result = guild.get_channel(channel_id) + else: + result = _get_from_guilds(bot, lambda g: g.get_channel(channel_id)) + + if not isinstance(result, type): + raise ChannelNotFound(argument) + + return result + + @staticmethod + def _resolve_thread(ctx: AnyContext, argument: str, attribute: str, type: Type[TT]) -> TT: + match = IDConverter._get_id_match(argument) or re.match(r"<#([0-9]{15,20})>$", argument) + result: Optional[disnake.Thread] = None + guild = ctx.guild + + if match is None: + # not a mention + if guild: + iterable: Iterable[TT] = getattr(guild, attribute) + result = _utils_get(iterable, name=argument) + else: + thread_id = int(match.group(1)) + if guild: + result = guild.get_thread(thread_id) + + if not isinstance(result, type): + raise ThreadNotFound(argument) + + return result + + +class TextChannelConverter(IDConverter[disnake.TextChannel]): + """Converts to a :class:`~disnake.TextChannel`. + + All lookups are via the local guild. If in a DM context, then the lookup + is done by the global cache. + + The lookup strategy is as follows (in order): + + 1. Lookup by ID. + 2. Lookup by mention. + 3. Lookup by name + + .. versionchanged:: 1.5 + Raise :exc:`.ChannelNotFound` instead of generic :exc:`.BadArgument` + """ + + async def convert(self, ctx: AnyContext, argument: str) -> disnake.TextChannel: + return GuildChannelConverter._resolve_channel( + ctx, argument, "text_channels", disnake.TextChannel + ) + + +class VoiceChannelConverter(IDConverter[disnake.VoiceChannel]): + """Converts to a :class:`~disnake.VoiceChannel`. + + All lookups are via the local guild. If in a DM context, then the lookup + is done by the global cache. + + The lookup strategy is as follows (in order): + + 1. Lookup by ID. + 2. Lookup by mention. + 3. Lookup by name + + .. versionchanged:: 1.5 + Raise :exc:`.ChannelNotFound` instead of generic :exc:`.BadArgument` + """ + + async def convert(self, ctx: AnyContext, argument: str) -> disnake.VoiceChannel: + return GuildChannelConverter._resolve_channel( + ctx, argument, "voice_channels", disnake.VoiceChannel + ) + + +class StageChannelConverter(IDConverter[disnake.StageChannel]): + """Converts to a :class:`~disnake.StageChannel`. + + .. versionadded:: 1.7 + + All lookups are via the local guild. If in a DM context, then the lookup + is done by the global cache. + + The lookup strategy is as follows (in order): + + 1. Lookup by ID. + 2. Lookup by mention. + 3. Lookup by name + """ + + async def convert(self, ctx: AnyContext, argument: str) -> disnake.StageChannel: + return GuildChannelConverter._resolve_channel( + ctx, argument, "stage_channels", disnake.StageChannel + ) + + +class CategoryChannelConverter(IDConverter[disnake.CategoryChannel]): + """Converts to a :class:`~disnake.CategoryChannel`. + + All lookups are via the local guild. If in a DM context, then the lookup + is done by the global cache. + + The lookup strategy is as follows (in order): + + 1. Lookup by ID. + 2. Lookup by mention. + 3. Lookup by name + + .. versionchanged:: 1.5 + Raise :exc:`.ChannelNotFound` instead of generic :exc:`.BadArgument` + """ + + async def convert(self, ctx: AnyContext, argument: str) -> disnake.CategoryChannel: + return GuildChannelConverter._resolve_channel( + ctx, argument, "categories", disnake.CategoryChannel + ) + + +class ForumChannelConverter(IDConverter[disnake.ForumChannel]): + """Converts to a :class:`~disnake.ForumChannel`. + + .. versionadded:: 2.5 + + All lookups are via the local guild. If in a DM context, then the lookup + is done by the global cache. + + The lookup strategy is as follows (in order): + + 1. Lookup by ID. + 2. Lookup by mention. + 3. Lookup by name + """ + + async def convert(self, ctx: AnyContext, argument: str) -> disnake.ForumChannel: + return GuildChannelConverter._resolve_channel( + ctx, argument, "forum_channels", disnake.ForumChannel + ) + + +class ThreadConverter(IDConverter[disnake.Thread]): + """Coverts to a :class:`~disnake.Thread`. + + All lookups are via the local guild. + + The lookup strategy is as follows (in order): + + 1. Lookup by ID. + 2. Lookup by mention. + 3. Lookup by name. + + .. versionadded:: 2.0 + """ + + async def convert(self, ctx: AnyContext, argument: str) -> disnake.Thread: + return GuildChannelConverter._resolve_thread(ctx, argument, "threads", disnake.Thread) + + +class ColourConverter(Converter[disnake.Colour]): + """Converts to a :class:`~disnake.Colour`. + + .. versionchanged:: 1.5 + Add an alias named ColorConverter + + The following formats are accepted: + + - ``0x`` + - ``#`` + - ``0x#`` + - ``rgb(, , )`` + - Any of the ``classmethod`` in :class:`~disnake.Colour` + + - The ``_`` in the name can be optionally replaced with spaces. + + Like CSS, ```` can be either 0-255 or 0-100% and ```` can be + either a 6 digit hex number or a 3 digit hex shortcut (e.g. #fff). + + .. versionchanged:: 1.5 + Raise :exc:`.BadColourArgument` instead of generic :exc:`.BadArgument` + + .. versionchanged:: 1.7 + Added support for ``rgb`` function and 3-digit hex shortcuts + """ + + RGB_REGEX = re.compile( + r"rgb\s*\((?P[0-9]{1,3}%?)\s*,\s*(?P[0-9]{1,3}%?)\s*,\s*(?P[0-9]{1,3}%?)\s*\)" + ) + + def parse_hex_number(self, argument: str) -> disnake.Color: + arg = "".join(i * 2 for i in argument) if len(argument) == 3 else argument + try: + value = int(arg, base=16) + if not (0 <= value <= 0xFFFFFF): + raise BadColourArgument(argument) + except ValueError: + raise BadColourArgument(argument) + else: + return disnake.Color(value=value) + + def parse_rgb_number(self, argument: str, number: str) -> int: + if number[-1] == "%": + value = int(number[:-1]) + if not (0 <= value <= 100): + raise BadColourArgument(argument) + return round(255 * (value / 100)) + + value = int(number) + if not (0 <= value <= 255): + raise BadColourArgument(argument) + return value + + def parse_rgb(self, argument: str, *, regex: re.Pattern[str] = RGB_REGEX) -> disnake.Color: + match = regex.match(argument) + if match is None: + raise BadColourArgument(argument) + + red = self.parse_rgb_number(argument, match.group("r")) + green = self.parse_rgb_number(argument, match.group("g")) + blue = self.parse_rgb_number(argument, match.group("b")) + return disnake.Color.from_rgb(red, green, blue) + + async def convert(self, ctx: AnyContext, argument: str) -> disnake.Color: + if argument[0] == "#": + return self.parse_hex_number(argument[1:]) + + if argument[0:2] == "0x": + rest = argument[2:] + # Legacy backwards compatible syntax + if rest.startswith("#"): + return self.parse_hex_number(rest[1:]) + return self.parse_hex_number(rest) + + arg = argument.lower() + if arg[0:3] == "rgb": + return self.parse_rgb(arg) + + arg = arg.replace(" ", "_") + method = getattr(disnake.Colour, arg, None) + if arg.startswith("from_") or method is None or not inspect.ismethod(method): + raise BadColourArgument(arg) + return method() + + +ColorConverter = ColourConverter + + +class RoleConverter(IDConverter[disnake.Role]): + """Converts to a :class:`~disnake.Role`. + + All lookups are via the local guild. If in a DM context, the converter raises + :exc:`.NoPrivateMessage` exception. + + The lookup strategy is as follows (in order): + + 1. Lookup by ID. + 2. Lookup by mention. + 3. Lookup by name + + .. versionchanged:: 1.5 + Raise :exc:`.RoleNotFound` instead of generic :exc:`.BadArgument` + """ + + async def convert(self, ctx: AnyContext, argument: str) -> disnake.Role: + guild = ctx.guild + if not guild: + raise NoPrivateMessage() + + match = self._get_id_match(argument) or re.match(r"<@&([0-9]{15,20})>$", argument) + if match: + result = guild.get_role(int(match.group(1))) + else: + result = _utils_get(guild._roles.values(), name=argument) + + if result is None: + raise RoleNotFound(argument) + return result + + +class GameConverter(Converter[disnake.Game]): + """Converts to :class:`~disnake.Game`.""" + + async def convert(self, ctx: AnyContext, argument: str) -> disnake.Game: + return disnake.Game(name=argument) + + +class InviteConverter(Converter[disnake.Invite]): + """Converts to a :class:`~disnake.Invite`. + + This is done via an HTTP request using :meth:`.Bot.fetch_invite`. + + .. versionchanged:: 1.5 + Raise :exc:`.BadInviteArgument` instead of generic :exc:`.BadArgument` + """ + + async def convert(self, ctx: AnyContext, argument: str) -> disnake.Invite: + try: + return await ctx.bot.fetch_invite(argument) + except Exception as exc: + raise BadInviteArgument(argument) from exc + + +class GuildConverter(IDConverter[disnake.Guild]): + """Converts to a :class:`~disnake.Guild`. + + The lookup strategy is as follows (in order): + + 1. Lookup by ID. + 2. Lookup by name. (There is no disambiguation for Guilds with multiple matching names). + + .. versionadded:: 1.7 + """ + + async def convert(self, ctx: AnyContext, argument: str) -> disnake.Guild: + match = self._get_id_match(argument) + bot: disnake.Client = ctx.bot + result: Optional[disnake.Guild] = None + + if match is not None: + guild_id = int(match.group(1)) + result = bot.get_guild(guild_id) + + if result is None: + result = _utils_get(bot.guilds, name=argument) + + if result is None: + raise GuildNotFound(argument) + return result + + +class EmojiConverter(IDConverter[disnake.Emoji]): + """Converts to a :class:`~disnake.Emoji`. + + All lookups are done for the local guild first, if available. If that lookup + fails, then it checks the client's global cache. + + The lookup strategy is as follows (in order): + + 1. Lookup by ID. + 2. Lookup by extracting ID from the emoji. + 3. Lookup by name + + .. versionchanged:: 1.5 + Raise :exc:`.EmojiNotFound` instead of generic :exc:`.BadArgument` + """ + + async def convert(self, ctx: AnyContext, argument: str) -> disnake.Emoji: + match = self._get_id_match(argument) or re.match( + r"$", argument + ) + result: Optional[disnake.Emoji] = None + bot = ctx.bot + guild = ctx.guild + + if match is None: + # Try to get the emoji by name. Try local guild first. + if guild: + result = _utils_get(guild.emojis, name=argument) + + if result is None: + result = _utils_get(bot.emojis, name=argument) + else: + # Try to look up emoji by id. + result = bot.get_emoji(int(match.group(1))) + + if result is None: + raise EmojiNotFound(argument) + + return result + + +class PartialEmojiConverter(Converter[disnake.PartialEmoji]): + """Converts to a :class:`~disnake.PartialEmoji`. + + This is done by extracting the animated flag, name and ID from the emoji. + + .. versionchanged:: 1.5 + Raise :exc:`.PartialEmojiConversionFailure` instead of generic :exc:`.BadArgument` + """ + + async def convert(self, ctx: AnyContext, argument: str) -> disnake.PartialEmoji: + match = re.match(r"<(a?):([a-zA-Z0-9\_]{1,32}):([0-9]{15,20})>$", argument) + + if match: + emoji_animated = bool(match.group(1)) + emoji_name: str = match.group(2) + emoji_id = int(match.group(3)) + + return disnake.PartialEmoji.with_state( + ctx.bot._connection, animated=emoji_animated, name=emoji_name, id=emoji_id + ) + + raise PartialEmojiConversionFailure(argument) + + +class GuildStickerConverter(IDConverter[disnake.GuildSticker]): + """Converts to a :class:`~disnake.GuildSticker`. + + All lookups are done for the local guild first, if available. If that lookup + fails, then it checks the client's global cache. + + The lookup strategy is as follows (in order): + + 1. Lookup by ID + 2. Lookup by name + + .. versionadded:: 2.0 + """ + + async def convert(self, ctx: AnyContext, argument: str) -> disnake.GuildSticker: + match = self._get_id_match(argument) + result = None + bot: disnake.Client = ctx.bot + guild = ctx.guild + + if match is None: + # Try to get the sticker by name. Try local guild first. + if guild: + result = _utils_get(guild.stickers, name=argument) + + if result is None: + result = _utils_get(bot.stickers, name=argument) + else: + # Try to look up sticker by id. + result = bot.get_sticker(int(match.group(1))) + + if result is None: + raise GuildStickerNotFound(argument) + + return result + + +class PermissionsConverter(Converter[disnake.Permissions]): + """Converts to a :class:`~disnake.Permissions`. + + Accepts an integer or a string of space-separated permission names (or just a single one) as input. + + .. versionadded:: 2.3 + """ + + async def convert(self, ctx: AnyContext, argument: str) -> disnake.Permissions: + # try the permission bit value + try: + value = int(argument) + except ValueError: + pass + else: + return disnake.Permissions(value) + + argument = argument.replace("server", "guild") + + # try multiple attributes, then a single one + perms: List[disnake.Permissions] = [] + for name in argument.split(): + attr = getattr(disnake.Permissions, name, None) + if attr is None: + break + + if callable(attr): + perms.append(attr()) + else: + perms.append(disnake.Permissions(**{name: True})) + else: + return functools.reduce(lambda a, b: disnake.Permissions(a.value | b.value), perms) + + name = argument.replace(" ", "_") + + attr = getattr(disnake.Permissions, name, None) + if attr is None: + raise BadArgument(f"Invalid Permissions: {name!r}") + + if callable(attr): + return attr() + else: + return disnake.Permissions(**{name: True}) + + +class GuildScheduledEventConverter(IDConverter[disnake.GuildScheduledEvent]): + """Converts to a :class:`~disnake.GuildScheduledEvent`. + + The lookup strategy is as follows (in order): + + 1. Lookup by ID (in current guild) + 2. Lookup as event URL + 3. Lookup by name (in current guild; there is no disambiguation for scheduled events with multiple matching names) + + .. versionadded:: 2.5 + """ + + async def convert(self, ctx: AnyContext, argument: str) -> disnake.GuildScheduledEvent: + event_regex = re.compile( + r"https?://(?:(?:ptb|canary|www)\.)?discord(?:app)?\.com/events/" + r"([0-9]{15,20})/([0-9]{15,20})/?$" + ) + bot: disnake.Client = ctx.bot + result: Optional[disnake.GuildScheduledEvent] = None + guild = ctx.guild + + # 1. + if guild and (match := self._get_id_match(argument)): + result = guild.get_scheduled_event(int(match.group(1))) + + # 2. + if not result and (match := event_regex.match(argument)): + event_guild = bot.get_guild(int(match.group(1))) + if event_guild: + result = event_guild.get_scheduled_event(int(match.group(2))) + + # 3. + if not result and guild: + result = _utils_get(guild.scheduled_events, name=argument) + + if not result: + raise GuildScheduledEventNotFound(argument) + return result + + +class clean_content(Converter[str]): + """Converts the argument to mention scrubbed version of + said content. + + This behaves similarly to :attr:`~disnake.Message.clean_content`. + + Attributes + ---------- + fix_channel_mentions: :class:`bool` + Whether to clean channel mentions. + use_nicknames: :class:`bool` + Whether to use nicknames when transforming mentions. + escape_markdown: :class:`bool` + Whether to also escape special markdown characters. + remove_markdown: :class:`bool` + Whether to also remove special markdown characters. This option is not supported with ``escape_markdown`` + + .. versionadded:: 1.7 + """ + + def __init__( + self, + *, + fix_channel_mentions: bool = False, + use_nicknames: bool = True, + escape_markdown: bool = False, + remove_markdown: bool = False, + ) -> None: + self.fix_channel_mentions = fix_channel_mentions + self.use_nicknames = use_nicknames + self.escape_markdown = escape_markdown + self.remove_markdown = remove_markdown + + async def convert(self, ctx: AnyContext, argument: str) -> str: + msg = ctx.message if isinstance(ctx, Context) else None + bot: disnake.Client = ctx.bot + + def resolve_user(id: int) -> str: + m = (msg and _utils_get(msg.mentions, id=id)) or bot.get_user(id) + if m is None and ctx.guild: + m = ctx.guild.get_member(id) + return f"@{m.display_name if self.use_nicknames else m.name}" if m else "@deleted-user" + + def resolve_role(id: int) -> str: + if ctx.guild is None: + return "@deleted-role" + r = (msg and _utils_get(msg.role_mentions, id=id)) or ctx.guild.get_role(id) + return f"@{r.name}" if r else "@deleted-role" + + def resolve_channel(id: int) -> str: + if ctx.guild and self.fix_channel_mentions: + c = ctx.guild.get_channel(id) + return f"#{c.name}" if c else "#deleted-channel" + + return f"<#{id}>" + + transforms: Dict[str, Callable[[int], str]] = { + "@": resolve_user, + "@!": resolve_user, + "#": resolve_channel, + "@&": resolve_role, + } + + def repl(match: re.Match) -> str: + type = match[1] + id = int(match[2]) + return transforms[type](id) + + result = re.sub(r"<(@[!&]?|#)([0-9]{15,20})>", repl, argument) + if self.escape_markdown: + result = disnake.utils.escape_markdown(result) + elif self.remove_markdown: + result = disnake.utils.remove_markdown(result) + + # Completely ensure no mentions escape: + return disnake.utils.escape_mentions(result) + + +class Greedy(List[T]): + """ + A special converter that greedily consumes arguments until it can't. + As a consequence of this behaviour, most input errors are silently discarded, + since it is used as an indicator of when to stop parsing. + + When a parser error is met the greedy converter stops converting, undoes the + internal string parsing routine, and continues parsing regularly. + + For example, in the following code: + + .. code-block:: python3 + + @commands.command() + async def test(ctx, numbers: Greedy[int], reason: str): + await ctx.send("numbers: {}, reason: {}".format(numbers, reason)) + + An invocation of ``[p]test 1 2 3 4 5 6 hello`` would pass ``numbers`` with + ``[1, 2, 3, 4, 5, 6]`` and ``reason`` with ``hello``. + + For more information, check :ref:`ext_commands_special_converters`. + """ + + __slots__ = ("converter",) + + def __init__(self, *, converter: T): + self.converter = converter + + def __repr__(self): + converter = getattr(self.converter, "__name__", repr(self.converter)) + return f"Greedy[{converter}]" + + def __class_getitem__(cls, params: Union[Tuple[T], T]) -> Greedy[T]: + if not isinstance(params, tuple): + params = (params,) + if len(params) != 1: + raise TypeError("Greedy[...] only takes a single argument") + converter = params[0] + + origin = getattr(converter, "__origin__", None) + args = getattr(converter, "__args__", ()) + + if not (callable(converter) or isinstance(converter, Converter) or origin is not None): + raise TypeError("Greedy[...] expects a type or a Converter instance.") + + if converter in (str, type(None)) or origin is Greedy: + raise TypeError(f"Greedy[{converter.__name__}] is invalid.") # type: ignore + + if origin is Union and type(None) in args: + raise TypeError(f"Greedy[{converter!r}] is invalid.") + + return cls(converter=converter) + + +def _convert_to_bool(argument: str) -> bool: + lowered = argument.lower() + if lowered in ("yes", "y", "true", "t", "1", "enable", "on"): + return True + elif lowered in ("no", "n", "false", "f", "0", "disable", "off"): + return False + else: + raise BadBoolArgument(lowered) + + +def get_converter(param: inspect.Parameter) -> Any: + converter = param.annotation + if converter is param.empty: + if param.default is not param.empty: + converter = str if param.default is None else type(param.default) + else: + converter = str + return converter + + +_GenericAlias = type(List[T]) + + +def is_generic_type(tp: Any, *, _GenericAlias: Type = _GenericAlias) -> bool: + return isinstance(tp, type) and issubclass(tp, Generic) or isinstance(tp, _GenericAlias) + + +CONVERTER_MAPPING: Dict[Type[Any], Type[Converter]] = { + disnake.Object: ObjectConverter, + disnake.Member: MemberConverter, + disnake.User: UserConverter, + disnake.Message: MessageConverter, + disnake.PartialMessage: PartialMessageConverter, + disnake.TextChannel: TextChannelConverter, + disnake.Invite: InviteConverter, + disnake.Guild: GuildConverter, + disnake.Role: RoleConverter, + disnake.Game: GameConverter, + disnake.Colour: ColourConverter, + disnake.VoiceChannel: VoiceChannelConverter, + disnake.StageChannel: StageChannelConverter, + disnake.Emoji: EmojiConverter, + disnake.PartialEmoji: PartialEmojiConverter, + disnake.CategoryChannel: CategoryChannelConverter, + disnake.ForumChannel: ForumChannelConverter, + disnake.Thread: ThreadConverter, + disnake.abc.GuildChannel: GuildChannelConverter, + disnake.GuildSticker: GuildStickerConverter, + disnake.Permissions: PermissionsConverter, + disnake.GuildScheduledEvent: GuildScheduledEventConverter, +} + + +async def _actual_conversion( + ctx: Context, + converter: Union[Type[T], Converter[T], Callable[[str], T]], + argument: str, + param: inspect.Parameter, +) -> T: + if converter is bool: + return _convert_to_bool(argument) # type: ignore + + if isinstance(converter, type): + module = converter.__module__ + if module.startswith("disnake.") and not module.endswith("converter"): + converter = CONVERTER_MAPPING.get(converter, converter) + + try: + if isinstance(converter, type) and issubclass(converter, Converter): + if inspect.ismethod(converter.convert): + return await converter.convert(ctx, argument) + else: + return await converter().convert(ctx, argument) # type: ignore + elif isinstance(converter, Converter): + return await converter.convert(ctx, argument) # type: ignore + except CommandError: + raise + except Exception as exc: + raise ConversionError(converter, exc) from exc + + try: + return converter(argument) # type: ignore + except CommandError: + raise + except Exception as exc: + try: + name = converter.__name__ + except AttributeError: + name = converter.__class__.__name__ + + raise BadArgument(f'Converting to "{name}" failed for parameter "{param.name}".') from exc + + +async def run_converters(ctx: Context, converter, argument: str, param: inspect.Parameter): + """|coro| + + Runs converters for a given converter, argument, and parameter. + + This function does the same work that the library does under the hood. + + .. versionadded:: 2.0 + + Parameters + ---------- + ctx: :class:`Context` + The invocation context to run the converters under. + converter: Any + The converter to run, this corresponds to the annotation in the function. + argument: :class:`str` + The argument to convert to. + param: :class:`inspect.Parameter` + The parameter being converted. This is mainly for error reporting. + + Raises + ------ + CommandError + The converter failed to convert. + + Returns + ------- + Any + The resulting conversion. + """ + origin = getattr(converter, "__origin__", None) + + if origin is Union: + errors = [] + _NoneType = type(None) + union_args = converter.__args__ + for conv in union_args: + # if we got to this part in the code, then the previous conversions have failed + # so we should just undo the view, return the default, and allow parsing to continue + # with the other parameters + if conv is _NoneType and param.kind != param.VAR_POSITIONAL: + ctx.view.undo() + return None if param.default is param.empty else param.default + + try: + value = await run_converters(ctx, conv, argument, param) + except CommandError as exc: + errors.append(exc) + else: + return value + + # if we're here, then we failed all the converters + raise BadUnionArgument(param, union_args, errors) + + if origin is Literal: + errors = [] + conversions = {} + literal_args = converter.__args__ + for literal in literal_args: + literal_type = type(literal) + try: + value = conversions[literal_type] + except KeyError: + try: + value = await _actual_conversion(ctx, literal_type, argument, param) + except CommandError as exc: + errors.append(exc) + conversions[literal_type] = object() + continue + else: + conversions[literal_type] = value + + if value == literal: + return value + + # if we're here, then we failed to match all the literals + raise BadLiteralArgument(param, literal_args, errors) + + # This must be the last if-clause in the chain of origin checking + # Nearly every type is a generic type within the typing library + # So care must be taken to make sure a more specialised origin handle + # isn't overwritten by the widest if clause + if origin is not None and is_generic_type(converter): + converter = origin + + return await _actual_conversion(ctx, converter, argument, param) diff --git a/sbsheriff/Lib/site-packages/disnake/ext/commands/cooldowns.py b/sbsheriff/Lib/site-packages/disnake/ext/commands/cooldowns.py new file mode 100644 index 0000000..dcc90f0 --- /dev/null +++ b/sbsheriff/Lib/site-packages/disnake/ext/commands/cooldowns.py @@ -0,0 +1,403 @@ +""" +The MIT License (MIT) + +Copyright (c) 2015-2021 Rapptz +Copyright (c) 2021-present Disnake Development + +Permission is hereby granted, free of charge, to any person obtaining a +copy of this software and associated documentation files (the "Software"), +to deal in the Software without restriction, including without limitation +the rights to use, copy, modify, merge, publish, distribute, sublicense, +and/or sell copies of the Software, and to permit persons to whom the +Software is furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS +OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER +DEALINGS IN THE SOFTWARE. +""" + +from __future__ import annotations + +import asyncio +import time +from collections import deque +from typing import TYPE_CHECKING, Any, Callable, Deque, Dict, Optional, Type, TypeVar + +from disnake.enums import Enum + +from ...abc import PrivateChannel +from .errors import MaxConcurrencyReached + +if TYPE_CHECKING: + from ...message import Message + +__all__ = ( + "BucketType", + "Cooldown", + "CooldownMapping", + "DynamicCooldownMapping", + "MaxConcurrency", +) + +C = TypeVar("C", bound="CooldownMapping") +MC = TypeVar("MC", bound="MaxConcurrency") + + +class BucketType(Enum): + default = 0 + user = 1 + guild = 2 + channel = 3 + member = 4 + category = 5 + role = 6 + + def get_key(self, msg: Message) -> Any: + if self is BucketType.user: + return msg.author.id + elif self is BucketType.guild: + return (msg.guild or msg.author).id + elif self is BucketType.channel: + return msg.channel.id + elif self is BucketType.member: + return ((msg.guild and msg.guild.id), msg.author.id) + elif self is BucketType.category: + return (msg.channel.category or msg.channel).id # type: ignore + elif self is BucketType.role: + # we return the channel id of a private-channel as there are only roles in guilds + # and that yields the same result as for a guild with only the @everyone role + # NOTE: PrivateChannel doesn't actually have an id attribute but we assume we are + # recieving a DMChannel or GroupChannel which inherit from PrivateChannel and do + return (msg.channel if isinstance(msg.channel, PrivateChannel) else msg.author.top_role).id # type: ignore + + def __call__(self, msg: Message) -> Any: + return self.get_key(msg) + + +class Cooldown: + """Represents a cooldown for a command. + + Attributes + ---------- + rate: :class:`int` + The total number of tokens available per :attr:`per` seconds. + per: :class:`float` + The length of the cooldown period in seconds. + """ + + __slots__ = ("rate", "per", "_window", "_tokens", "_last") + + def __init__(self, rate: float, per: float) -> None: + self.rate: int = int(rate) + self.per: float = float(per) + self._window: float = 0.0 + self._tokens: int = self.rate + self._last: float = 0.0 + + def get_tokens(self, current: Optional[float] = None) -> int: + """Returns the number of available tokens before rate limiting is applied. + + Parameters + ---------- + current: Optional[:class:`float`] + The time in seconds since Unix epoch to calculate tokens at. + If not supplied then :func:`time.time()` is used. + + Returns + ------- + :class:`int` + The number of tokens available before the cooldown is to be applied. + """ + if not current: + current = time.time() + + tokens = self._tokens + + if current > self._window + self.per: + tokens = self.rate + return tokens + + def get_retry_after(self, current: Optional[float] = None) -> float: + """Returns the time in seconds until the cooldown will be reset. + + Parameters + ---------- + current: Optional[:class:`float`] + The current time in seconds since Unix epoch. + If not supplied, then :func:`time.time()` is used. + + Returns + ------- + :class:`float` + The number of seconds to wait before this cooldown will be reset. + """ + current = current or time.time() + tokens = self.get_tokens(current) + + if tokens == 0: + return self.per - (current - self._window) + + return 0.0 + + def update_rate_limit(self, current: Optional[float] = None) -> Optional[float]: + """Updates the cooldown rate limit. + + Parameters + ---------- + current: Optional[:class:`float`] + The time in seconds since Unix epoch to update the rate limit at. + If not supplied, then :func:`time.time()` is used. + + Returns + ------- + Optional[:class:`float`] + The retry-after time in seconds if rate limited. + """ + current = current or time.time() + self._last = current + + self._tokens = self.get_tokens(current) + + # first token used means that we start a new rate limit window + if self._tokens == self.rate: + self._window = current + + # check if we are rate limited + if self._tokens == 0: + return self.per - (current - self._window) + + # we're not so decrement our tokens + self._tokens -= 1 + + def reset(self) -> None: + """Reset the cooldown to its initial state.""" + self._tokens = self.rate + self._last = 0.0 + + def copy(self) -> Cooldown: + """Creates a copy of this cooldown. + + Returns + ------- + :class:`Cooldown` + A new instance of this cooldown. + """ + return Cooldown(self.rate, self.per) + + def __repr__(self) -> str: + return f"" + + +class CooldownMapping: + def __init__( + self, + original: Optional[Cooldown], + type: Callable[[Message], Any], + ) -> None: + if not callable(type): + raise TypeError("Cooldown type must be a BucketType or callable") + + self._cache: Dict[Any, Cooldown] = {} + self._cooldown: Optional[Cooldown] = original + self._type: Callable[[Message], Any] = type + + def copy(self) -> CooldownMapping: + ret = CooldownMapping(self._cooldown, self._type) + ret._cache = self._cache.copy() + return ret + + @property + def valid(self) -> bool: + return self._cooldown is not None + + @property + def type(self) -> Callable[[Message], Any]: + return self._type + + @classmethod + def from_cooldown(cls: Type[C], rate, per, type) -> C: + return cls(Cooldown(rate, per), type) + + def _bucket_key(self, msg: Message) -> Any: + return self._type(msg) + + def _verify_cache_integrity(self, current: Optional[float] = None) -> None: + # we want to delete all cache objects that haven't been used + # in a cooldown window. e.g. if we have a command that has a + # cooldown of 60s and it has not been used in 60s then that key should be deleted + current = current or time.time() + dead_keys = [k for k, v in self._cache.items() if current > v._last + v.per] + for k in dead_keys: + del self._cache[k] + + def _is_default(self) -> bool: + # This method can be overridden in subclasses + return self._type is BucketType.default + + def create_bucket(self, message: Message) -> Cooldown: + return self._cooldown.copy() # type: ignore + + def get_bucket(self, message: Message, current: Optional[float] = None) -> Cooldown: + if self._is_default(): + return self._cooldown # type: ignore + + self._verify_cache_integrity(current) + key = self._bucket_key(message) + if key not in self._cache: + bucket = self.create_bucket(message) + if bucket is not None: + self._cache[key] = bucket + else: + bucket = self._cache[key] + + return bucket + + def update_rate_limit( + self, message: Message, current: Optional[float] = None + ) -> Optional[float]: + bucket = self.get_bucket(message, current) + return bucket.update_rate_limit(current) + + +class DynamicCooldownMapping(CooldownMapping): + def __init__( + self, factory: Callable[[Message], Cooldown], type: Callable[[Message], Any] + ) -> None: + super().__init__(None, type) + self._factory: Callable[[Message], Cooldown] = factory + + def copy(self) -> DynamicCooldownMapping: + ret = DynamicCooldownMapping(self._factory, self._type) + ret._cache = self._cache.copy() + return ret + + @property + def valid(self) -> bool: + return True + + def _is_default(self) -> bool: + # In dynamic mappings even default bucket types may have custom behavior + return False + + def create_bucket(self, message: Message) -> Cooldown: + return self._factory(message) + + +class _Semaphore: + """This class is a version of a semaphore. + + If you're wondering why asyncio.Semaphore isn't being used, + it's because it doesn't expose the internal value. This internal + value is necessary because I need to support both `wait=True` and + `wait=False`. + + An asyncio.Queue could have been used to do this as well -- but it is + not as inefficient since internally that uses two queues and is a bit + overkill for what is basically a counter. + """ + + __slots__ = ("value", "loop", "_waiters") + + def __init__(self, number: int) -> None: + self.value: int = number + self.loop: asyncio.AbstractEventLoop = asyncio.get_event_loop() + self._waiters: Deque[asyncio.Future] = deque() + + def __repr__(self) -> str: + return f"<_Semaphore value={self.value} waiters={len(self._waiters)}>" + + def locked(self) -> bool: + return self.value == 0 + + def is_active(self) -> bool: + return len(self._waiters) > 0 + + def wake_up(self) -> None: + while self._waiters: + future = self._waiters.popleft() + if not future.done(): + future.set_result(None) + return + + async def acquire(self, *, wait: bool = False) -> bool: + if not wait and self.value <= 0: + # signal that we're not acquiring + return False + + while self.value <= 0: + future = self.loop.create_future() + self._waiters.append(future) + try: + await future + except: + future.cancel() + if self.value > 0 and not future.cancelled(): + self.wake_up() + raise + + self.value -= 1 + return True + + def release(self) -> None: + self.value += 1 + self.wake_up() + + +class MaxConcurrency: + __slots__ = ("number", "per", "wait", "_mapping") + + def __init__(self, number: int, *, per: BucketType, wait: bool) -> None: + self._mapping: Dict[Any, _Semaphore] = {} + self.per: BucketType = per + self.number: int = number + self.wait: bool = wait + + if number <= 0: + raise ValueError("max_concurrency 'number' cannot be less than 1") + + if not isinstance(per, BucketType): + raise TypeError(f"max_concurrency 'per' must be of type BucketType not {type(per)!r}") + + def copy(self: MC) -> MC: + return self.__class__(self.number, per=self.per, wait=self.wait) + + def __repr__(self) -> str: + return f"" + + def get_key(self, message: Message) -> Any: + return self.per.get_key(message) + + async def acquire(self, message: Message) -> None: + key = self.get_key(message) + + try: + sem = self._mapping[key] + except KeyError: + self._mapping[key] = sem = _Semaphore(self.number) + + acquired = await sem.acquire(wait=self.wait) + if not acquired: + raise MaxConcurrencyReached(self.number, self.per) + + async def release(self, message: Message) -> None: + # Technically there's no reason for this function to be async + # But it might be more useful in the future + key = self.get_key(message) + + try: + sem = self._mapping[key] + except KeyError: + # ...? peculiar + return + else: + sem.release() + + if sem.value >= self.number and not sem.is_active(): + del self._mapping[key] diff --git a/sbsheriff/Lib/site-packages/disnake/ext/commands/core.py b/sbsheriff/Lib/site-packages/disnake/ext/commands/core.py new file mode 100644 index 0000000..e201d9b --- /dev/null +++ b/sbsheriff/Lib/site-packages/disnake/ext/commands/core.py @@ -0,0 +1,2333 @@ +""" +The MIT License (MIT) + +Copyright (c) 2015-2021 Rapptz +Copyright (c) 2021-present Disnake Development + +Permission is hereby granted, free of charge, to any person obtaining a +copy of this software and associated documentation files (the "Software"), +to deal in the Software without restriction, including without limitation +the rights to use, copy, modify, merge, publish, distribute, sublicense, +and/or sell copies of the Software, and to permit persons to whom the +Software is furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS +OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER +DEALINGS IN THE SOFTWARE. +""" +from __future__ import annotations + +import asyncio +import datetime +import functools +import inspect +from typing import ( + TYPE_CHECKING, + Any, + Callable, + Dict, + Generator, + Generic, + List, + Literal, + Optional, + Set, + Tuple, + Type, + TypeVar, + Union, + cast, + overload, +) + +import disnake + +from ._types import _BaseCommand +from .cog import Cog +from .context import AnyContext, Context +from .converter import Greedy, get_converter, run_converters +from .cooldowns import BucketType, Cooldown, CooldownMapping, DynamicCooldownMapping, MaxConcurrency +from .errors import * + +if TYPE_CHECKING: + from typing_extensions import Concatenate, ParamSpec, TypeGuard + + from disnake.message import Message + + from ._types import Check, Coro, CoroFunc, Error, Hook + + +__all__ = ( + "Command", + "Group", + "GroupMixin", + "command", + "group", + "has_role", + "has_permissions", + "has_any_role", + "check", + "check_any", + "before_invoke", + "after_invoke", + "bot_has_role", + "bot_has_permissions", + "bot_has_any_role", + "cooldown", + "dynamic_cooldown", + "max_concurrency", + "dm_only", + "guild_only", + "is_owner", + "is_nsfw", + "has_guild_permissions", + "bot_has_guild_permissions", +) + +MISSING: Any = disnake.utils.MISSING + +T = TypeVar("T") +CogT = TypeVar("CogT", bound="Cog") +CommandT = TypeVar("CommandT", bound="Command") +ContextT = TypeVar("ContextT", bound="Context") +GroupT = TypeVar("GroupT", bound="Group") +HookT = TypeVar("HookT", bound="Hook") +ErrorT = TypeVar("ErrorT", bound="Error") + + +if TYPE_CHECKING: + P = ParamSpec("P") + + CommandCallback = Union[ + Callable[Concatenate[CogT, ContextT, P], Coro[T]], + Callable[Concatenate[ContextT, P], Coro[T]], + ] +else: + P = TypeVar("P") + + +def unwrap_function(function: Callable[..., Any]) -> Callable[..., Any]: + partial = functools.partial + while True: + if hasattr(function, "__wrapped__"): + function = function.__wrapped__ + elif isinstance(function, partial): + function = function.func + else: + return function + + +def get_signature_parameters( + function: Callable[..., Any], globalns: Dict[str, Any] +) -> Dict[str, inspect.Parameter]: + signature = inspect.signature(function) + params = {} + cache: Dict[str, Any] = {} + eval_annotation = disnake.utils.evaluate_annotation + for name, parameter in signature.parameters.items(): + annotation = parameter.annotation + if annotation is parameter.empty: + params[name] = parameter + continue + if annotation is None: + params[name] = parameter.replace(annotation=type(None)) + continue + + annotation = eval_annotation(annotation, globalns, globalns, cache) + if annotation is Greedy: + raise TypeError("Unparameterized Greedy[...] is disallowed in signature.") + + params[name] = parameter.replace(annotation=annotation) + + return params + + +def wrap_callback(coro): + @functools.wraps(coro) + async def wrapped(*args, **kwargs): + try: + ret = await coro(*args, **kwargs) + except CommandError: + raise + except asyncio.CancelledError: + return + except Exception as exc: + raise CommandInvokeError(exc) from exc + return ret + + return wrapped + + +def hooked_wrapped_callback(command, ctx, coro): + @functools.wraps(coro) + async def wrapped(*args, **kwargs): + try: + ret = await coro(*args, **kwargs) + except CommandError: + ctx.command_failed = True + raise + except asyncio.CancelledError: + ctx.command_failed = True + return + except Exception as exc: + ctx.command_failed = True + raise CommandInvokeError(exc) from exc + finally: + if command._max_concurrency is not None: + await command._max_concurrency.release(ctx) + + await command.call_after_hooks(ctx) + return ret + + return wrapped + + +class _CaseInsensitiveDict(dict): + def __contains__(self, k): + return super().__contains__(k.casefold()) + + def __delitem__(self, k): + return super().__delitem__(k.casefold()) + + def __getitem__(self, k): + return super().__getitem__(k.casefold()) + + def get(self, k, default=None): + return super().get(k.casefold(), default) + + def pop(self, k, default=None): + return super().pop(k.casefold(), default) + + def __setitem__(self, k, v): + super().__setitem__(k.casefold(), v) + + +class Command(_BaseCommand, Generic[CogT, P, T]): + """ + A class that implements the protocol for a bot text command. + + These are not created manually, instead they are created via the + decorator or functional interface. + + Attributes + ---------- + name: :class:`str` + The name of the command. + callback: :ref:`coroutine ` + The coroutine that is executed when the command is called. + help: Optional[:class:`str`] + The long help text for the command. + brief: Optional[:class:`str`] + The short help text for the command. + usage: Optional[:class:`str`] + A replacement for arguments in the default help text. + aliases: Union[List[:class:`str`], Tuple[:class:`str`]] + The list of aliases the command can be invoked under. + enabled: :class:`bool` + Whether the command is currently enabled. + If the command is invoked while it is disabled, then + :exc:`.DisabledCommand` is raised to the :func:`.on_command_error` + event. Defaults to ``True``. + parent: Optional[:class:`Group`] + The parent group that this command belongs to. ``None`` if there isn't one. + cog: Optional[:class:`Cog`] + The cog that this command belongs to. ``None`` if there isn't one. + checks: List[Callable[[:class:`.Context`], :class:`bool`]] + A list of predicates that verifies if the command could be executed + with the given :class:`.Context` as the sole parameter. If an exception + is necessary to be thrown to signal failure, then one inherited from + :exc:`.CommandError` should be used. Note that if the checks fail then + :exc:`.CheckFailure` exception is raised to the :func:`.on_command_error` + event. + description: :class:`str` + The message prefixed into the default help command. + hidden: :class:`bool` + If ``True``, the default help command does not show this in the help output. + rest_is_raw: :class:`bool` + If ``False`` and a keyword-only argument is provided then the keyword + only argument is stripped and handled as if it was a regular argument + that handles :exc:`.MissingRequiredArgument` and default values in a + regular matter rather than passing the rest completely raw. If ``True`` + then the keyword-only argument will pass in the rest of the arguments + in a completely raw matter. Defaults to ``False``. + invoked_subcommand: Optional[:class:`Command`] + The subcommand that was invoked, if any. + require_var_positional: :class:`bool` + If ``True`` and a variadic positional argument is specified, requires + the user to specify at least one argument. Defaults to ``False``. + + .. versionadded:: 1.5 + + ignore_extra: :class:`bool` + If ``True``, ignores extraneous strings passed to a command if all its + requirements are met (e.g. ``?foo a b c`` when only expecting ``a`` + and ``b``). Otherwise :func:`.on_command_error` and local error handlers + are called with :exc:`.TooManyArguments`. Defaults to ``True``. + cooldown_after_parsing: :class:`bool` + If ``True``, cooldown processing is done after argument parsing, + which calls converters. If ``False`` then cooldown processing is done + first and then the converters are called second. Defaults to ``False``. + extras: :class:`dict` + A dict of user provided extras to attach to the Command. + + .. note:: + This object may be copied by the library. + + .. versionadded:: 2.0 + """ + + __original_kwargs__: Dict[str, Any] + + def __new__(cls: Type[CommandT], *args: Any, **kwargs: Any) -> CommandT: + # if you're wondering why this is done, it's because we need to ensure + # we have a complete original copy of **kwargs even for classes that + # mess with it by popping before delegating to the subclass __init__. + # In order to do this, we need to control the instance creation and + # inject the original kwargs through __new__ rather than doing it + # inside __init__. + self = super().__new__(cls) + + # we do a shallow copy because it's probably the most common use case. + # this could potentially break if someone modifies a list or something + # while it's in movement, but for now this is the cheapest and + # fastest way to do what we want. + self.__original_kwargs__ = kwargs.copy() + return self + + def __init__( + self, + func: CommandCallback[CogT, ContextT, P, T], + **kwargs: Any, + ): + if not asyncio.iscoroutinefunction(func): + raise TypeError("Callback must be a coroutine.") + + name = kwargs.get("name") or func.__name__ + if not isinstance(name, str): + raise TypeError("Name of a command must be a string.") + self.name: str = name + + self.callback = func + self.enabled: bool = kwargs.get("enabled", True) + + help_doc = kwargs.get("help") + if help_doc is not None: + help_doc = inspect.cleandoc(help_doc) + else: + help_doc = inspect.getdoc(func) + if isinstance(help_doc, bytes): + help_doc = help_doc.decode("utf-8") + + self.help: Optional[str] = help_doc + + self.brief: Optional[str] = kwargs.get("brief") + self.usage: Optional[str] = kwargs.get("usage") + self.rest_is_raw: bool = kwargs.get("rest_is_raw", False) + self.aliases: Union[List[str], Tuple[str]] = kwargs.get("aliases", []) + self.extras: Dict[str, Any] = kwargs.get("extras", {}) + + if not isinstance(self.aliases, (list, tuple)): + raise TypeError("Aliases of a command must be a list or a tuple of strings.") + + self.description: str = inspect.cleandoc(kwargs.get("description", "")) + self.hidden: bool = kwargs.get("hidden", False) + + try: + checks = func.__commands_checks__ + checks.reverse() + except AttributeError: + checks = kwargs.get("checks", []) + + self.checks: List[Check] = checks + + try: + cooldown = func.__commands_cooldown__ + except AttributeError: + cooldown = kwargs.get("cooldown") + + if cooldown is None: + buckets = CooldownMapping(cooldown, BucketType.default) + elif isinstance(cooldown, CooldownMapping): + buckets = cooldown + else: + raise TypeError("Cooldown must be a an instance of CooldownMapping or None.") + self._buckets: CooldownMapping = buckets + + try: + max_concurrency = func.__commands_max_concurrency__ + except AttributeError: + max_concurrency = kwargs.get("max_concurrency") + + self._max_concurrency: Optional[MaxConcurrency] = max_concurrency + + self.require_var_positional: bool = kwargs.get("require_var_positional", False) + self.ignore_extra: bool = kwargs.get("ignore_extra", True) + self.cooldown_after_parsing: bool = kwargs.get("cooldown_after_parsing", False) + self.cog: Optional[CogT] = None + + # bandaid for the fact that sometimes parent can be the bot instance + parent = kwargs.get("parent") + self.parent: Optional[GroupMixin] = parent if isinstance(parent, _BaseCommand) else None # type: ignore + + self._before_invoke: Optional[Hook] = None + try: + before_invoke = func.__before_invoke__ + except AttributeError: + pass + else: + self.before_invoke(before_invoke) + + self._after_invoke: Optional[Hook] = None + try: + after_invoke = func.__after_invoke__ + except AttributeError: + pass + else: + self.after_invoke(after_invoke) + + self.__command_flag__ = None + + @property + def callback( + self, + ) -> CommandCallback[CogT, ContextT, P, T]: + return self._callback + + @callback.setter + def callback( + self, + function: CommandCallback[CogT, ContextT, P, T], + ) -> None: + self._callback = function + unwrap = unwrap_function(function) + self.module = unwrap.__module__ + + try: + globalns = unwrap.__globals__ + except AttributeError: + globalns = {} + + self.params = get_signature_parameters(function, globalns) + + def add_check(self, func: Check) -> None: + """Adds a check to the command. + + This is the non-decorator interface to :func:`.check`. + + .. versionadded:: 1.3 + + Parameters + ---------- + func + The function that will be used as a check. + """ + self.checks.append(func) + + def remove_check(self, func: Check) -> None: + """Removes a check from the command. + + This function is idempotent and will not raise an exception + if the function is not in the command's checks. + + .. versionadded:: 1.3 + + Parameters + ---------- + func + The function to remove from the checks. + """ + try: + self.checks.remove(func) + except ValueError: + pass + + def update(self, **kwargs: Any) -> None: + """Updates :class:`Command` instance with updated attribute. + + This works similarly to the :func:`.command` decorator in terms + of parameters in that they are passed to the :class:`Command` or + subclass constructors, sans the name and callback. + """ + self.__init__(self.callback, **dict(self.__original_kwargs__, **kwargs)) + + async def __call__(self, context: Context, *args: P.args, **kwargs: P.kwargs) -> T: + """|coro| + + Calls the internal callback that the command holds. + + .. note:: + + This bypasses all mechanisms -- including checks, converters, + invoke hooks, cooldowns, etc. You must take care to pass + the proper arguments and types to this function. + + .. versionadded:: 1.3 + """ + if self.cog is not None: + return await self.callback(self.cog, context, *args, **kwargs) # type: ignore + else: + return await self.callback(context, *args, **kwargs) # type: ignore + + def _ensure_assignment_on_copy(self, other: CommandT) -> CommandT: + other._before_invoke = self._before_invoke + other._after_invoke = self._after_invoke + if self.checks != other.checks: + other.checks = self.checks.copy() + if self._buckets.valid and not other._buckets.valid: + other._buckets = self._buckets.copy() + if self._max_concurrency != other._max_concurrency: + # _max_concurrency won't be None at this point + other._max_concurrency = self._max_concurrency.copy() # type: ignore + + try: + other.on_error = self.on_error + except AttributeError: + pass + return other + + def copy(self: CommandT) -> CommandT: + """Creates a copy of this command. + + Returns + ------- + :class:`Command` + A new instance of this command. + """ + ret = self.__class__(self.callback, **self.__original_kwargs__) + return self._ensure_assignment_on_copy(ret) + + def _update_copy(self: CommandT, kwargs: Dict[str, Any]) -> CommandT: + if kwargs: + kw = kwargs.copy() + kw.update(self.__original_kwargs__) + copy = self.__class__(self.callback, **kw) + return self._ensure_assignment_on_copy(copy) + else: + return self.copy() + + async def dispatch_error(self, ctx: Context, error: Exception) -> None: + stop_propagation = False + ctx.command_failed = True + cog = self.cog + try: + coro = self.on_error + except AttributeError: + pass + else: + injected = wrap_callback(coro) + if cog is not None: + stop_propagation = await injected(cog, ctx, error) + else: + stop_propagation = await injected(ctx, error) + if stop_propagation: + return + + try: + if cog is not None: + local = Cog._get_overridden_method(cog.cog_command_error) + if local is not None: + wrapped = wrap_callback(local) + stop_propagation = await wrapped(ctx, error) + # User has an option to cancel the global error handler by returning True + finally: + if stop_propagation: + return + ctx.bot.dispatch("command_error", ctx, error) + + async def transform(self, ctx: Context, param: inspect.Parameter) -> Any: + required = param.default is param.empty + converter = get_converter(param) + consume_rest_is_special = param.kind == param.KEYWORD_ONLY and not self.rest_is_raw + view = ctx.view + view.skip_ws() + + # The greedy converter is simple -- it keeps going until it fails in which case, + # it undos the view ready for the next parameter to use instead + if isinstance(converter, Greedy): + if param.kind in (param.POSITIONAL_OR_KEYWORD, param.POSITIONAL_ONLY): + return await self._transform_greedy_pos(ctx, param, required, converter.converter) + elif param.kind == param.VAR_POSITIONAL: + return await self._transform_greedy_var_pos(ctx, param, converter.converter) + else: + # if we're here, then it's a KEYWORD_ONLY param type + # since this is mostly useless, we'll helpfully transform Greedy[X] + # into just X and do the parsing that way. + converter = converter.converter + + if view.eof: + if param.kind == param.VAR_POSITIONAL: + raise RuntimeError() # break the loop + if required: + if self._is_typing_optional(param.annotation): + return None + if hasattr(converter, "__commands_is_flag__") and converter._can_be_constructible(): + return await converter._construct_default(ctx) + raise MissingRequiredArgument(param) + return param.default + + previous = view.index + if consume_rest_is_special: + argument = view.read_rest().strip() + else: + try: + argument = view.get_quoted_word() + except ArgumentParsingError as exc: + if self._is_typing_optional(param.annotation): + view.index = previous + return None + else: + raise exc + view.previous = previous + + # type-checker fails to narrow argument + return await run_converters(ctx, converter, argument, param) + + async def _transform_greedy_pos( + self, ctx: Context, param: inspect.Parameter, required: bool, converter: Any + ) -> Any: + view = ctx.view + result = [] + while not view.eof: + # for use with a manual undo + previous = view.index + + view.skip_ws() + try: + argument = view.get_quoted_word() + value = await run_converters(ctx, converter, argument, param) # type: ignore + except (CommandError, ArgumentParsingError): + view.index = previous + break + else: + result.append(value) + + if not result and not required: + return param.default + return result + + async def _transform_greedy_var_pos( + self, ctx: Context, param: inspect.Parameter, converter: Any + ) -> Any: + view = ctx.view + previous = view.index + try: + argument = view.get_quoted_word() + value = await run_converters(ctx, converter, argument, param) # type: ignore + except (CommandError, ArgumentParsingError): + view.index = previous + raise RuntimeError() from None # break loop + else: + return value + + @property + def clean_params(self) -> Dict[str, inspect.Parameter]: + """Dict[:class:`str`, :class:`inspect.Parameter`]: + Retrieves the parameter dictionary without the context or self parameters. + + Useful for inspecting signature. + """ + result = self.params.copy() + if self.cog is not None: + # first parameter is self + try: + del result[next(iter(result))] + except StopIteration: + raise ValueError("missing 'self' parameter") from None + + try: + # first/second parameter is context + del result[next(iter(result))] + except StopIteration: + raise ValueError("missing 'context' parameter") from None + + return result + + @property + def full_parent_name(self) -> str: + """:class:`str`: Retrieves the fully qualified parent command name. + + This the base command name required to execute it. For example, + in ``?one two three`` the parent name would be ``one two``. + """ + entries = [] + command = self + # command.parent is type-hinted as GroupMixin some attributes are resolved via MRO + while command.parent is not None: # type: ignore + command = command.parent # type: ignore + entries.append(command.name) # type: ignore + + return " ".join(reversed(entries)) + + @property + def parents(self) -> List[Group]: + """List[:class:`Group`]: Retrieves the parents of this command. + + If the command has no parents then it returns an empty :class:`list`. + + For example in commands ``?a b c test``, the parents are ``[c, b, a]``. + + .. versionadded:: 1.1 + """ + entries = [] + command = self + while command.parent is not None: # type: ignore + command = command.parent # type: ignore + entries.append(command) + + return entries + + @property + def root_parent(self) -> Optional[Group]: + """Optional[:class:`Group`]: Retrieves the root parent of this command. + + If the command has no parents then it returns ``None``. + + For example in commands ``?a b c test``, the root parent is ``a``. + """ + if not self.parent: + return None + return self.parents[-1] + + @property + def qualified_name(self) -> str: + """:class:`str`: Retrieves the fully qualified command name. + + This is the full parent name with the command name as well. + For example, in ``?one two three`` the qualified name would be + ``one two three``. + """ + + parent = self.full_parent_name + if parent: + return parent + " " + self.name + else: + return self.name + + def __str__(self) -> str: + return self.qualified_name + + async def _parse_arguments(self, ctx: Context) -> None: + ctx.args = [ctx] if self.cog is None else [self.cog, ctx] + ctx.kwargs = {} + args = ctx.args + kwargs = ctx.kwargs + + view = ctx.view + iterator = iter(self.params.items()) + + if self.cog is not None: + # we have 'self' as the first parameter so just advance + # the iterator and resume parsing + try: + next(iterator) + except StopIteration: + raise disnake.ClientException( + f'Callback for {self.name} command is missing "self" parameter.' + ) + + # next we have the 'ctx' as the next parameter + try: + next(iterator) + except StopIteration: + raise disnake.ClientException( + f'Callback for {self.name} command is missing "ctx" parameter.' + ) + + for name, param in iterator: + ctx.current_parameter = param + if param.kind in (param.POSITIONAL_OR_KEYWORD, param.POSITIONAL_ONLY): + transformed = await self.transform(ctx, param) + args.append(transformed) + elif param.kind == param.KEYWORD_ONLY: + # kwarg only param denotes "consume rest" semantics + if self.rest_is_raw: + converter = get_converter(param) + argument = view.read_rest() + kwargs[name] = await run_converters(ctx, converter, argument, param) + else: + kwargs[name] = await self.transform(ctx, param) + break + elif param.kind == param.VAR_POSITIONAL: + if view.eof and self.require_var_positional: + raise MissingRequiredArgument(param) + while not view.eof: + try: + transformed = await self.transform(ctx, param) + args.append(transformed) + except RuntimeError: + break + + if not self.ignore_extra and not view.eof: + raise TooManyArguments("Too many arguments passed to " + self.qualified_name) + + async def call_before_hooks(self, ctx: Context) -> None: + # now that we're done preparing we can call the pre-command hooks + # first, call the command local hook: + cog = self.cog + if self._before_invoke is not None: + # should be cog if @commands.before_invoke is used + instance = getattr(self._before_invoke, "__self__", cog) + # __self__ only exists for methods, not functions + # however, if @command.before_invoke is used, it will be a function + if instance: + await self._before_invoke(instance, ctx) # type: ignore + else: + await self._before_invoke(ctx) # type: ignore + + # call the cog local hook if applicable: + if cog is not None: + hook = Cog._get_overridden_method(cog.cog_before_invoke) + if hook is not None: + await hook(ctx) + + # call the bot global hook if necessary + hook = ctx.bot._before_invoke + if hook is not None: + await hook(ctx) + + async def call_after_hooks(self, ctx: Context) -> None: + cog = self.cog + if self._after_invoke is not None: + instance = getattr(self._after_invoke, "__self__", cog) + if instance: + await self._after_invoke(instance, ctx) # type: ignore + else: + await self._after_invoke(ctx) # type: ignore + + # call the cog local hook if applicable: + if cog is not None: + hook = Cog._get_overridden_method(cog.cog_after_invoke) + if hook is not None: + await hook(ctx) + + hook = ctx.bot._after_invoke + if hook is not None: + await hook(ctx) + + def _prepare_cooldowns(self, ctx: Context) -> None: + if self._buckets.valid: + dt = ctx.message.edited_at or ctx.message.created_at + current = dt.replace(tzinfo=datetime.timezone.utc).timestamp() + bucket = self._buckets.get_bucket(ctx.message, current) + if bucket is not None: + retry_after = bucket.update_rate_limit(current) + if retry_after: + raise CommandOnCooldown(bucket, retry_after, self._buckets.type) # type: ignore + + async def prepare(self, ctx: Context) -> None: + ctx.command = self + + if not await self.can_run(ctx): + raise CheckFailure(f"The check functions for command {self.qualified_name} failed.") + + if self._max_concurrency is not None: + # For this application, context can be duck-typed as a Message + await self._max_concurrency.acquire(ctx) # type: ignore + + try: + if self.cooldown_after_parsing: + await self._parse_arguments(ctx) + self._prepare_cooldowns(ctx) + else: + self._prepare_cooldowns(ctx) + await self._parse_arguments(ctx) + + await self.call_before_hooks(ctx) + except: + if self._max_concurrency is not None: + await self._max_concurrency.release(ctx) # type: ignore + raise + + def is_on_cooldown(self, ctx: Context) -> bool: + """Checks whether the command is currently on cooldown. + + Parameters + ---------- + ctx: :class:`.Context` + The invocation context to use when checking the commands cooldown status. + + Returns + ------- + :class:`bool` + A boolean indicating if the command is on cooldown. + """ + if not self._buckets.valid: + return False + + bucket = self._buckets.get_bucket(ctx.message) + dt = ctx.message.edited_at or ctx.message.created_at + current = dt.replace(tzinfo=datetime.timezone.utc).timestamp() + return bucket.get_tokens(current) == 0 + + def reset_cooldown(self, ctx: Context) -> None: + """Resets the cooldown on this command. + + Parameters + ---------- + ctx: :class:`.Context` + The invocation context to reset the cooldown under. + """ + if self._buckets.valid: + bucket = self._buckets.get_bucket(ctx.message) + bucket.reset() + + def get_cooldown_retry_after(self, ctx: Context) -> float: + """Retrieves the amount of seconds before this command can be tried again. + + .. versionadded:: 1.4 + + Parameters + ---------- + ctx: :class:`.Context` + The invocation context to retrieve the cooldown from. + + Returns + ------- + :class:`float` + The amount of time left on this command's cooldown in seconds. + If this is ``0.0`` then the command isn't on cooldown. + """ + if self._buckets.valid: + bucket = self._buckets.get_bucket(ctx.message) + dt = ctx.message.edited_at or ctx.message.created_at + current = dt.replace(tzinfo=datetime.timezone.utc).timestamp() + return bucket.get_retry_after(current) + + return 0.0 + + async def invoke(self, ctx: Context) -> None: + await self.prepare(ctx) + + # terminate the invoked_subcommand chain. + # since we're in a regular command (and not a group) then + # the invoked subcommand is None. + ctx.invoked_subcommand = None + ctx.subcommand_passed = None + injected = hooked_wrapped_callback(self, ctx, self.callback) + await injected(*ctx.args, **ctx.kwargs) + + async def reinvoke(self, ctx: Context, *, call_hooks: bool = False) -> None: + ctx.command = self + await self._parse_arguments(ctx) + + if call_hooks: + await self.call_before_hooks(ctx) + + ctx.invoked_subcommand = None + try: + await self.callback(*ctx.args, **ctx.kwargs) # type: ignore + except: + ctx.command_failed = True + raise + finally: + if call_hooks: + await self.call_after_hooks(ctx) + + def error(self, coro: ErrorT) -> ErrorT: + """A decorator that registers a coroutine as a local error handler. + + A local error handler is an :func:`.on_command_error` event limited to + a single command. However, the :func:`.on_command_error` is still + invoked afterwards as the catch-all. + + Parameters + ---------- + coro: :ref:`coroutine ` + The coroutine to register as the local error handler. + + Raises + ------ + TypeError + The coroutine passed is not actually a coroutine. + """ + if not asyncio.iscoroutinefunction(coro): + raise TypeError("The error handler must be a coroutine.") + + self.on_error: Error = coro + return coro + + def has_error_handler(self) -> bool: + """Whether the command has an error handler registered. + + .. versionadded:: 1.7 + + :return type: :class:`bool` + """ + return hasattr(self, "on_error") + + def before_invoke(self, coro: HookT) -> HookT: + """A decorator that registers a coroutine as a pre-invoke hook. + + A pre-invoke hook is called directly before the command is + called. This makes it a useful function to set up database + connections or any type of set up required. + + This pre-invoke hook takes a sole parameter, a :class:`.Context`. + + See :meth:`.Bot.before_invoke` for more info. + + Parameters + ---------- + coro: :ref:`coroutine ` + The coroutine to register as the pre-invoke hook. + + Raises + ------ + TypeError + The coroutine passed is not actually a coroutine. + """ + if not asyncio.iscoroutinefunction(coro): + raise TypeError("The pre-invoke hook must be a coroutine.") + + self._before_invoke = coro + return coro + + def after_invoke(self, coro: HookT) -> HookT: + """A decorator that registers a coroutine as a post-invoke hook. + + A post-invoke hook is called directly after the command is + called. This makes it a useful function to clean-up database + connections or any type of clean up required. + + This post-invoke hook takes a sole parameter, a :class:`.Context`. + + See :meth:`.Bot.after_invoke` for more info. + + Parameters + ---------- + coro: :ref:`coroutine ` + The coroutine to register as the post-invoke hook. + + Raises + ------ + TypeError + The coroutine passed is not actually a coroutine. + """ + if not asyncio.iscoroutinefunction(coro): + raise TypeError("The post-invoke hook must be a coroutine.") + + self._after_invoke = coro + return coro + + @property + def cog_name(self) -> Optional[str]: + """Optional[:class:`str`]: The name of the cog this command belongs to, if any.""" + return type(self.cog).__cog_name__ if self.cog is not None else None + + @property + def short_doc(self) -> str: + """:class:`str`: Gets the "short" documentation of a command. + + By default, this is the :attr:`.brief` attribute. + If that lookup leads to an empty string then the first line of the + :attr:`.help` attribute is used instead. + """ + if self.brief is not None: + return self.brief + if self.help is not None: + return self.help.split("\n", 1)[0] + return "" + + def _is_typing_optional(self, annotation: Union[T, Optional[T]]) -> TypeGuard[Optional[T]]: + return getattr(annotation, "__origin__", None) is Union and type(None) in annotation.__args__ # type: ignore + + @property + def signature(self) -> str: + """:class:`str`: Returns a POSIX-like signature useful for help command output.""" + if self.usage is not None: + return self.usage + + params = self.clean_params + if not params: + return "" + + result = [] + for name, param in params.items(): + greedy = isinstance(param.annotation, Greedy) + optional = False # postpone evaluation of if it's an optional argument + + # for typing.Literal[...], typing.Optional[typing.Literal[...]], and Greedy[typing.Literal[...]], the + # parameter signature is a literal list of it's values + annotation = param.annotation.converter if greedy else param.annotation + origin = getattr(annotation, "__origin__", None) + if not greedy and origin is Union: + none_cls = type(None) + union_args = annotation.__args__ + optional = union_args[-1] is none_cls + if len(union_args) == 2 and optional: + annotation = union_args[0] + origin = getattr(annotation, "__origin__", None) + + if origin is Literal: + name = "|".join( + f'"{v}"' if isinstance(v, str) else str(v) for v in annotation.__args__ + ) + if param.default is not param.empty: + # We don't want None or '' to trigger the [name=value] case and instead it should + # do [name] since [name=None] or [name=] are not exactly useful for the user. + should_print = ( + param.default if isinstance(param.default, str) else param.default is not None + ) + if should_print: + result.append( + f"[{name}={param.default}]" + if not greedy + else f"[{name}={param.default}]..." + ) + continue + else: + result.append(f"[{name}]") + + elif param.kind == param.VAR_POSITIONAL: + if self.require_var_positional: + result.append(f"<{name}...>") + else: + result.append(f"[{name}...]") + elif greedy: + result.append(f"[{name}]...") + elif optional: + result.append(f"[{name}]") + else: + result.append(f"<{name}>") + + return " ".join(result) + + async def can_run(self, ctx: Context) -> bool: + """|coro| + + Checks if the command can be executed by checking all the predicates + inside the :attr:`~Command.checks` attribute. This also checks whether the + command is disabled. + + .. versionchanged:: 1.3 + Checks whether the command is disabled. + + Parameters + ---------- + ctx: :class:`.Context` + The ctx of the command currently being invoked. + + Raises + ------ + CommandError + Any command error that was raised during a check call will be propagated + by this function. + + Returns + ------- + :class:`bool` + Whether the command can be invoked. + """ + if not self.enabled: + raise DisabledCommand(f"{self.name} command is disabled") + + original = ctx.command + ctx.command = self + + try: + if not await ctx.bot.can_run(ctx): + raise CheckFailure( + f"The global check functions for command {self.qualified_name} failed." + ) + + cog = self.cog + if cog is not None: + local_check = Cog._get_overridden_method(cog.cog_check) + if local_check is not None: + ret = await disnake.utils.maybe_coroutine(local_check, ctx) + if not ret: + return False + + predicates = self.checks + if not predicates: + # since we have no checks, then we just return True. + return True + + return await disnake.utils.async_all(predicate(ctx) for predicate in predicates) # type: ignore + finally: + ctx.command = original + + +class GroupMixin(Generic[CogT]): + """A mixin that implements common functionality for classes that behave + similar to :class:`.Group` and are allowed to register commands. + + Attributes + ---------- + all_commands: :class:`dict` + A mapping of command name to :class:`.Command` + objects. + case_insensitive: :class:`bool` + Whether the commands should be case insensitive. Defaults to ``False``. + """ + + def __init__(self, *args: Any, **kwargs: Any) -> None: + case_insensitive = kwargs.get("case_insensitive", False) + self.all_commands: Dict[str, Command[CogT, Any, Any]] = ( + _CaseInsensitiveDict() if case_insensitive else {} + ) + self.case_insensitive: bool = case_insensitive + super().__init__(*args, **kwargs) + + @property + def commands(self) -> Set[Command[CogT, Any, Any]]: + """Set[:class:`.Command`]: A unique set of commands without aliases that are registered.""" + return set(self.all_commands.values()) + + def recursively_remove_all_commands(self) -> None: + for command in self.all_commands.copy().values(): + if isinstance(command, GroupMixin): + command.recursively_remove_all_commands() + self.remove_command(command.name) + + def add_command(self, command: Command[CogT, Any, Any]) -> None: + """Adds a :class:`.Command` into the internal list of commands. + + This is usually not called, instead the :meth:`~.GroupMixin.command` or + :meth:`~.GroupMixin.group` shortcut decorators are used instead. + + .. versionchanged:: 1.4 + Raise :exc:`.CommandRegistrationError` instead of generic :exc:`.ClientException` + + Parameters + ---------- + command: :class:`Command` + The command to add. + + Raises + ------ + CommandRegistrationError + If the command or its alias is already registered by different command. + TypeError + If the command passed is not a subclass of :class:`.Command`. + """ + if not isinstance(command, Command): + raise TypeError("The command passed must be a subclass of Command") + + if isinstance(self, Command): + command.parent = self + + if command.name in self.all_commands: + raise CommandRegistrationError(command.name) + + self.all_commands[command.name] = command + for alias in command.aliases: + if alias in self.all_commands: + self.remove_command(command.name) + raise CommandRegistrationError(alias, alias_conflict=True) + self.all_commands[alias] = command + + def remove_command(self, name: str) -> Optional[Command[CogT, Any, Any]]: + """Remove a :class:`.Command` from the internal list + of commands. + + This could also be used as a way to remove aliases. + + Parameters + ---------- + name: :class:`str` + The name of the command to remove. + + Returns + ------- + Optional[:class:`.Command`] + The command that was removed. If the name is not valid then + ``None`` is returned instead. + """ + command = self.all_commands.pop(name, None) + + # does not exist + if command is None: + return None + + if name in command.aliases: + # we're removing an alias so we don't want to remove the rest + return command + + # we're not removing the alias so let's delete the rest of them. + for alias in command.aliases: + cmd = self.all_commands.pop(alias, None) + # in the case of a CommandRegistrationError, an alias might conflict + # with an already existing command. If this is the case, we want to + # make sure the pre-existing command is not removed. + if cmd is not None and cmd != command: + self.all_commands[alias] = cmd + return command + + def walk_commands(self) -> Generator[Command[CogT, Any, Any], None, None]: + """An iterator that recursively walks through all commands and subcommands. + + .. versionchanged:: 1.4 + Duplicates due to aliases are no longer returned + + Yields + ------ + Union[:class:`.Command`, :class:`.Group`] + A command or group from the internal list of commands. + """ + for command in self.commands: + yield command + if isinstance(command, GroupMixin): + yield from command.walk_commands() + + def get_command(self, name: str) -> Optional[Command[CogT, Any, Any]]: + """Get a :class:`.Command` from the internal list + of commands. + + This could also be used as a way to get aliases. + + The name could be fully qualified (e.g. ``'foo bar'``) will get + the subcommand ``bar`` of the group command ``foo``. If a + subcommand is not found then ``None`` is returned just as usual. + + Parameters + ---------- + name: :class:`str` + The name of the command to get. + + Returns + ------- + Optional[:class:`Command`] + The command that was requested. If not found, returns ``None``. + """ + # fast path, no space in name. + if " " not in name: + return self.all_commands.get(name) + + names = name.split() + if not names: + return None + obj = self.all_commands.get(names[0]) + if not isinstance(obj, GroupMixin): + return obj + + for name in names[1:]: + try: + obj = obj.all_commands[name] # type: ignore + except (AttributeError, KeyError): + return None + + return obj + + @overload + def command( + self, + name: str = ..., + cls: Type[Command[CogT, P, T]] = ..., + *args: Any, + **kwargs: Any, + ) -> Callable[[CommandCallback[CogT, ContextT, P, T]], Command[CogT, P, T]]: + ... + + @overload + def command( + self, + name: str = ..., + cls: Type[CommandT] = ..., + *args: Any, + **kwargs: Any, + ) -> Callable[[CommandCallback[CogT, ContextT, P, T]], CommandT]: + ... + + def command( + self, + name: str = MISSING, + cls: Union[Type[Command[CogT, P, T]], Type[CommandT]] = MISSING, + *args: Any, + **kwargs: Any, + ) -> Callable[[CommandCallback[CogT, ContextT, P, T]], Union[Command[CogT, P, T], CommandT]]: + """A shortcut decorator that invokes :func:`.command` and adds it to + the internal command list via :meth:`~.GroupMixin.add_command`. + + Returns + ------- + Callable[..., :class:`Command`] + A decorator that converts the provided method into a Command, adds it to the bot, then returns it. + """ + + def decorator( + func: CommandCallback[CogT, ContextT, P, T] + ) -> Union[Command[CogT, P, T], CommandT]: + kwargs.setdefault("parent", self) + result = command(name=name, cls=cls, *args, **kwargs)(func) + self.add_command(result) + return result + + return decorator + + @overload + def group( + self, + name: str = ..., + cls: Type[Group[CogT, P, T]] = ..., + *args: Any, + **kwargs: Any, + ) -> Callable[[CommandCallback[CogT, ContextT, P, T]], Group[CogT, P, T]]: + ... + + @overload + def group( + self, + name: str = ..., + cls: Type[GroupT] = ..., + *args: Any, + **kwargs: Any, + ) -> Callable[[CommandCallback[CogT, ContextT, P, T]], GroupT]: + ... + + def group( + self, + name: str = MISSING, + cls: Union[Type[Group[CogT, P, T]], Type[GroupT]] = MISSING, + *args: Any, + **kwargs: Any, + ) -> Callable[[CommandCallback[CogT, ContextT, P, T]], Union[Group[CogT, P, T], GroupT]]: + """A shortcut decorator that invokes :func:`.group` and adds it to + the internal command list via :meth:`~.GroupMixin.add_command`. + + Returns + ------- + Callable[..., :class:`Group`] + A decorator that converts the provided method into a Group, adds it to the bot, then returns it. + """ + + def decorator( + func: CommandCallback[CogT, ContextT, P, T] + ) -> Union[Group[CogT, P, T], GroupT]: + kwargs.setdefault("parent", self) + result = group(name=name, cls=cls, *args, **kwargs)(func) + self.add_command(result) + return result + + return decorator + + +class Group(GroupMixin[CogT], Command[CogT, P, T]): + """A class that implements a grouping protocol for commands to be + executed as subcommands. + + This class is a subclass of :class:`.Command` and thus all options + valid in :class:`.Command` are valid in here as well. + + Attributes + ---------- + invoke_without_command: :class:`bool` + Indicates if the group callback should begin parsing and + invocation only if no subcommand was found. Useful for + making it an error handling function to tell the user that + no subcommand was found or to have different functionality + in case no subcommand was found. If this is ``False``, then + the group callback will always be invoked first. This means + that the checks and the parsing dictated by its parameters + will be executed. Defaults to ``False``. + case_insensitive: :class:`bool` + Indicates if the group's commands should be case insensitive. + Defaults to ``False``. + """ + + def __init__(self, *args: Any, **attrs: Any) -> None: + self.invoke_without_command: bool = attrs.pop("invoke_without_command", False) + super().__init__(*args, **attrs) + + def copy(self: GroupT) -> GroupT: + """Creates a copy of this :class:`Group`. + + Returns + ------- + :class:`Group` + A new instance of this group. + """ + ret = super().copy() + for cmd in self.commands: + ret.add_command(cmd.copy()) + return ret + + async def invoke(self, ctx: Context) -> None: + ctx.invoked_subcommand = None + ctx.subcommand_passed = None + early_invoke = not self.invoke_without_command + if early_invoke: + await self.prepare(ctx) + + view = ctx.view + previous = view.index + view.skip_ws() + trigger = view.get_word() + + if trigger: + ctx.subcommand_passed = trigger + ctx.invoked_subcommand = self.all_commands.get(trigger, None) + + if early_invoke: + injected = hooked_wrapped_callback(self, ctx, self.callback) + await injected(*ctx.args, **ctx.kwargs) + + ctx.invoked_parents.append(ctx.invoked_with) # type: ignore + + if trigger and ctx.invoked_subcommand: + ctx.invoked_with = trigger + await ctx.invoked_subcommand.invoke(ctx) + elif not early_invoke: + # undo the trigger parsing + view.index = previous + view.previous = previous + await super().invoke(ctx) + + async def reinvoke(self, ctx: Context, *, call_hooks: bool = False) -> None: + ctx.invoked_subcommand = None + early_invoke = not self.invoke_without_command + if early_invoke: + ctx.command = self + await self._parse_arguments(ctx) + + if call_hooks: + await self.call_before_hooks(ctx) + + view = ctx.view + previous = view.index + view.skip_ws() + trigger = view.get_word() + + if trigger: + ctx.subcommand_passed = trigger + ctx.invoked_subcommand = self.all_commands.get(trigger, None) + + if early_invoke: + try: + await self.callback(*ctx.args, **ctx.kwargs) # type: ignore + except: + ctx.command_failed = True + raise + finally: + if call_hooks: + await self.call_after_hooks(ctx) + + ctx.invoked_parents.append(ctx.invoked_with) # type: ignore + + if trigger and ctx.invoked_subcommand: + ctx.invoked_with = trigger + await ctx.invoked_subcommand.reinvoke(ctx, call_hooks=call_hooks) + elif not early_invoke: + # undo the trigger parsing + view.index = previous + view.previous = previous + await super().reinvoke(ctx, call_hooks=call_hooks) + + +# Decorators + + +@overload +def command( + name: str = ..., + cls: Type[Command[CogT, P, T]] = ..., + **attrs: Any, +) -> Callable[[CommandCallback[CogT, ContextT, P, T]], Command[CogT, P, T]]: + ... + + +@overload +def command( + name: str = ..., + cls: Type[CommandT] = ..., + **attrs: Any, +) -> Callable[[CommandCallback[CogT, ContextT, P, T]], CommandT]: + ... + + +def command( + name: str = MISSING, + cls: Union[Type[Command[CogT, P, T]], Type[CommandT]] = MISSING, + **attrs: Any, +) -> Callable[[CommandCallback[CogT, ContextT, P, T]], Union[Command[CogT, P, T], CommandT]]: + """A decorator that transforms a function into a :class:`.Command` + or if called with :func:`.group`, :class:`.Group`. + + By default the ``help`` attribute is received automatically from the + docstring of the function and is cleaned up with the use of + ``inspect.cleandoc``. If the docstring is ``bytes``, then it is decoded + into :class:`str` using utf-8 encoding. + + All checks added using the :func:`.check` & co. decorators are added into + the function. There is no way to supply your own checks through this + decorator. + + Parameters + ---------- + name: :class:`str` + The name to create the command with. By default this uses the + function name unchanged. + cls + The class to construct with. By default this is :class:`.Command`. + You usually do not change this. + attrs + Keyword arguments to pass into the construction of the class denoted + by ``cls``. + + Raises + ------ + TypeError + If the function is not a coroutine or is already a command. + """ + if cls is MISSING: + cls = Command + + def decorator( + func: CommandCallback[CogT, ContextT, P, T] + ) -> Union[Command[CogT, P, T], CommandT]: + if hasattr(func, "__command_flag__"): + raise TypeError("Callback is already a command.") + return cls(func, name=name, **attrs) # type: ignore + + return decorator + + +@overload +def group( + name: str = ..., + cls: Type[Group[CogT, P, T]] = ..., + **attrs: Any, +) -> Callable[[CommandCallback[CogT, ContextT, P, T]], Group[CogT, P, T]]: + ... + + +@overload +def group( + name: str = ..., + cls: Type[GroupT] = ..., + **attrs: Any, +) -> Callable[[CommandCallback[CogT, ContextT, P, T]], GroupT]: + ... + + +def group( + name: str = MISSING, + cls: Union[Type[Group[CogT, P, T]], Type[GroupT]] = MISSING, + **attrs: Any, +) -> Callable[[CommandCallback[CogT, ContextT, P, T]], Union[Group[CogT, P, T], GroupT]]: + """A decorator that transforms a function into a :class:`.Group`. + + This is similar to the :func:`.command` decorator but the ``cls`` + parameter is set to :class:`Group` by default. + + .. versionchanged:: 1.1 + The ``cls`` parameter can now be passed. + """ + if cls is MISSING: + cls = Group + return command(name=name, cls=cls, **attrs) # type: ignore + + +def check(predicate: Check) -> Callable[[T], T]: + """ + A decorator that adds a check to the :class:`.Command` or its + subclasses. These checks could be accessed via :attr:`.Command.checks`. + + These checks should be predicates that take in a single parameter taking + a :class:`.Context`. If the check returns a ``False``-like value then + during invocation a :exc:`.CheckFailure` exception is raised and sent to + the :func:`.on_command_error` event. + + If an exception should be thrown in the predicate then it should be a + subclass of :exc:`.CommandError`. Any exception not subclassed from it + will be propagated while those subclassed will be sent to + :func:`.on_command_error`. + + A special attribute named ``predicate`` is bound to the value + returned by this decorator to retrieve the predicate passed to the + decorator. This allows the following introspection and chaining to be done: + + .. code-block:: python3 + + def owner_or_permissions(**perms): + original = commands.has_permissions(**perms).predicate + async def extended_check(ctx): + if ctx.guild is None: + return False + return ctx.guild.owner_id == ctx.author.id or await original(ctx) + return commands.check(extended_check) + + .. note:: + + The function returned by ``predicate`` is **always** a coroutine, + even if the original function was not a coroutine. + + .. versionchanged:: 1.3 + The ``predicate`` attribute was added. + + Examples + -------- + + Creating a basic check to see if the command invoker is you. + + .. code-block:: python3 + + def check_if_it_is_me(ctx): + return ctx.message.author.id == 85309593344815104 + + @bot.command() + @commands.check(check_if_it_is_me) + async def only_for_me(ctx): + await ctx.send('I know you!') + + Transforming common checks into its own decorator: + + .. code-block:: python3 + + def is_me(): + def predicate(ctx): + return ctx.message.author.id == 85309593344815104 + return commands.check(predicate) + + @bot.command() + @is_me() + async def only_me(ctx): + await ctx.send('Only you!') + + Parameters + ---------- + predicate: Callable[[:class:`Context`], :class:`bool`] + The predicate to check if the command should be invoked. + """ + + def decorator(func: Union[Command, CoroFunc]) -> Union[Command, CoroFunc]: + if hasattr(func, "__command_flag__"): + func.checks.append(predicate) + else: + if not hasattr(func, "__commands_checks__"): + func.__commands_checks__ = [] # type: ignore + + func.__commands_checks__.append(predicate) # type: ignore + + return func + + if asyncio.iscoroutinefunction(predicate): + decorator.predicate = predicate + else: + + @functools.wraps(predicate) + async def wrapper(ctx): + return predicate(ctx) # type: ignore + + decorator.predicate = wrapper + + return decorator # type: ignore + + +def check_any(*checks: Check) -> Callable[[T], T]: + """ + A :func:`check` that is added that checks if any of the checks passed + will pass, i.e. using logical OR. + + If all checks fail then :exc:`.CheckAnyFailure` is raised to signal the failure. + It inherits from :exc:`.CheckFailure`. + + .. note:: + + The ``predicate`` attribute for this function **is** a coroutine. + + .. versionadded:: 1.3 + + Parameters + ---------- + *checks: Callable[[:class:`Context`], :class:`bool`] + An argument list of checks that have been decorated with + the :func:`check` decorator. + + Raises + ------ + TypeError + A check passed has not been decorated with the :func:`check` + decorator. + + Examples + -------- + + Creating a basic check to see if it's the bot owner or + the server owner: + + .. code-block:: python3 + + def is_guild_owner(): + def predicate(ctx): + return ctx.guild is not None and ctx.guild.owner_id == ctx.author.id + return commands.check(predicate) + + @bot.command() + @commands.check_any(commands.is_owner(), is_guild_owner()) + async def only_for_owners(ctx): + await ctx.send('Hello mister owner!') + """ + unwrapped = [] + for wrapped in checks: + try: + pred = wrapped.predicate + except AttributeError: + raise TypeError(f"{wrapped!r} must be wrapped by commands.check decorator") from None + else: + unwrapped.append(pred) + + async def predicate(ctx: AnyContext) -> bool: + errors = [] + for func in unwrapped: + try: + value = await func(ctx) + except CheckFailure as e: + errors.append(e) + else: + if value: + return True + # if we're here, all checks failed + raise CheckAnyFailure(unwrapped, errors) + + return check(predicate) + + +def has_role(item: Union[int, str]) -> Callable[[T], T]: + """A :func:`.check` that is added that checks if the member invoking the + command has the role specified via the name or ID specified. + + If a string is specified, you must give the exact name of the role, including + caps and spelling. + + If an integer is specified, you must give the exact snowflake ID of the role. + + If the message is invoked in a private message context then the check will + return ``False``. + + This check raises one of two special exceptions, :exc:`.MissingRole` if the user + is missing a role, or :exc:`.NoPrivateMessage` if it is used in a private message. + Both inherit from :exc:`.CheckFailure`. + + .. versionchanged:: 1.1 + + Raise :exc:`.MissingRole` or :exc:`.NoPrivateMessage` + instead of generic :exc:`.CheckFailure` + + Parameters + ---------- + item: Union[:class:`int`, :class:`str`] + The name or ID of the role to check. + """ + + def predicate(ctx: AnyContext) -> bool: + if ctx.guild is None: + raise NoPrivateMessage() + + # ctx.guild is None doesn't narrow ctx.author to Member + if isinstance(item, int): + role = disnake.utils.get(ctx.author.roles, id=item) # type: ignore + else: + role = disnake.utils.get(ctx.author.roles, name=item) # type: ignore + if role is None: + raise MissingRole(item) + return True + + return check(predicate) + + +def has_any_role(*items: Union[int, str]) -> Callable[[T], T]: + """ + A :func:`.check` that is added that checks if the member invoking the + command has **any** of the roles specified. This means that if they have + one out of the three roles specified, then this check will return `True`. + + Similar to :func:`.has_role`\\, the names or IDs passed in must be exact. + + This check raises one of two special exceptions, :exc:`.MissingAnyRole` if the user + is missing all roles, or :exc:`.NoPrivateMessage` if it is used in a private message. + Both inherit from :exc:`.CheckFailure`. + + .. versionchanged:: 1.1 + + Raise :exc:`.MissingAnyRole` or :exc:`.NoPrivateMessage` + instead of generic :exc:`.CheckFailure` + + Parameters + ---------- + items: List[Union[:class:`str`, :class:`int`]] + An argument list of names or IDs to check that the member has roles wise. + + Example + -------- + + .. code-block:: python3 + + @bot.command() + @commands.has_any_role('Library Devs', 'Moderators', 492212595072434186) + async def cool(ctx): + await ctx.send('You are cool indeed') + """ + + def predicate(ctx: AnyContext) -> bool: + if ctx.guild is None: + raise NoPrivateMessage() + + # ctx.guild is None doesn't narrow ctx.author to Member + getter = functools.partial(disnake.utils.get, ctx.author.roles) # type: ignore + if any( + getter(id=item) is not None if isinstance(item, int) else getter(name=item) is not None + for item in items + ): + return True + # NOTE: variance problems + raise MissingAnyRole(list(items)) # type: ignore + + return check(predicate) + + +def bot_has_role(item: int) -> Callable[[T], T]: + """Similar to :func:`.has_role` except checks if the bot itself has the + role. + + This check raises one of two special exceptions, :exc:`.BotMissingRole` if the bot + is missing the role, or :exc:`.NoPrivateMessage` if it is used in a private message. + Both inherit from :exc:`.CheckFailure`. + + .. versionchanged:: 1.1 + + Raise :exc:`.BotMissingRole` or :exc:`.NoPrivateMessage` + instead of generic :exc:`.CheckFailure` + """ + + def predicate(ctx: AnyContext) -> bool: + if ctx.guild is None: + raise NoPrivateMessage() + + me = cast(disnake.Member, ctx.me) + if isinstance(item, int): + role = disnake.utils.get(me.roles, id=item) + else: + role = disnake.utils.get(me.roles, name=item) + if role is None: + raise BotMissingRole(item) + return True + + return check(predicate) + + +def bot_has_any_role(*items: int) -> Callable[[T], T]: + """Similar to :func:`.has_any_role` except checks if the bot itself has + any of the roles listed. + + This check raises one of two special exceptions, :exc:`.BotMissingAnyRole` if the bot + is missing all roles, or :exc:`.NoPrivateMessage` if it is used in a private message. + Both inherit from :exc:`.CheckFailure`. + + .. versionchanged:: 1.1 + + Raise :exc:`.BotMissingAnyRole` or :exc:`.NoPrivateMessage` + instead of generic checkfailure + """ + + def predicate(ctx: AnyContext) -> bool: + if ctx.guild is None: + raise NoPrivateMessage() + + me = cast(disnake.Member, ctx.me) + getter = functools.partial(disnake.utils.get, me.roles) + if any( + getter(id=item) is not None if isinstance(item, int) else getter(name=item) is not None + for item in items + ): + return True + raise BotMissingAnyRole(list(items)) + + return check(predicate) + + +def has_permissions(**perms: bool) -> Callable[[T], T]: + """A :func:`.check` that is added that checks if the member has all of + the permissions necessary. + + Note that this check operates on the current channel permissions, not the + guild wide permissions. + + The permissions passed in must be exactly like the properties shown under + :class:`.disnake.Permissions`. + + This check raises a special exception, :exc:`.MissingPermissions` + that is inherited from :exc:`.CheckFailure`. + + Parameters + ---------- + perms + An argument list of permissions to check for. + + Example + --------- + + .. code-block:: python3 + + @bot.command() + @commands.has_permissions(manage_messages=True) + async def test(ctx): + await ctx.send('You can manage messages.') + + """ + invalid = set(perms) - set(disnake.Permissions.VALID_FLAGS) + if invalid: + raise TypeError(f"Invalid permission(s): {', '.join(invalid)}") + + def predicate(ctx: AnyContext) -> bool: + ch = ctx.channel + permissions = ch.permissions_for(ctx.author) # type: ignore + + missing = [perm for perm, value in perms.items() if getattr(permissions, perm) != value] + + if not missing: + return True + + raise MissingPermissions(missing) + + return check(predicate) + + +def bot_has_permissions(**perms: bool) -> Callable[[T], T]: + """Similar to :func:`.has_permissions` except checks if the bot itself has + the permissions listed. + + This check raises a special exception, :exc:`.BotMissingPermissions` + that is inherited from :exc:`.CheckFailure`. + """ + invalid = set(perms) - set(disnake.Permissions.VALID_FLAGS) + if invalid: + raise TypeError(f"Invalid permission(s): {', '.join(invalid)}") + + def predicate(ctx: AnyContext) -> bool: + permissions = ctx.channel.permissions_for(ctx.me) # type: ignore + + missing = [perm for perm, value in perms.items() if getattr(permissions, perm) != value] + + if not missing: + return True + + raise BotMissingPermissions(missing) + + return check(predicate) + + +def has_guild_permissions(**perms: bool) -> Callable[[T], T]: + """Similar to :func:`.has_permissions`, but operates on guild wide + permissions instead of the current channel permissions. + + If this check is called in a DM context, it will raise an + exception, :exc:`.NoPrivateMessage`. + + .. versionadded:: 1.3 + """ + invalid = set(perms) - set(disnake.Permissions.VALID_FLAGS) + if invalid: + raise TypeError(f"Invalid permission(s): {', '.join(invalid)}") + + def predicate(ctx: AnyContext) -> bool: + if not ctx.guild: + raise NoPrivateMessage + + permissions = ctx.author.guild_permissions # type: ignore + missing = [perm for perm, value in perms.items() if getattr(permissions, perm) != value] + + if not missing: + return True + + raise MissingPermissions(missing) + + return check(predicate) + + +def bot_has_guild_permissions(**perms: bool) -> Callable[[T], T]: + """Similar to :func:`.has_guild_permissions`, but checks the bot + members guild permissions. + + .. versionadded:: 1.3 + """ + invalid = set(perms) - set(disnake.Permissions.VALID_FLAGS) + if invalid: + raise TypeError(f"Invalid permission(s): {', '.join(invalid)}") + + def predicate(ctx: AnyContext) -> bool: + if not ctx.guild: + raise NoPrivateMessage + + permissions = ctx.me.guild_permissions # type: ignore + missing = [perm for perm, value in perms.items() if getattr(permissions, perm) != value] + + if not missing: + return True + + raise BotMissingPermissions(missing) + + return check(predicate) + + +def dm_only() -> Callable[[T], T]: + """A :func:`.check` that indicates this command must only be used in a + DM context. Only private messages are allowed when + using the command. + + This check raises a special exception, :exc:`.PrivateMessageOnly` + that is inherited from :exc:`.CheckFailure`. + + .. versionadded:: 1.1 + """ + + def predicate(ctx: AnyContext) -> bool: + if ctx.guild is not None: + raise PrivateMessageOnly() + return True + + return check(predicate) + + +def guild_only() -> Callable[[T], T]: + """A :func:`.check` that indicates this command must only be used in a + guild context only. Basically, no private messages are allowed when + using the command. + + This check raises a special exception, :exc:`.NoPrivateMessage` + that is inherited from :exc:`.CheckFailure`. + """ + + def predicate(ctx: AnyContext) -> bool: + if ctx.guild is None: + raise NoPrivateMessage() + return True + + return check(predicate) + + +def is_owner() -> Callable[[T], T]: + """A :func:`.check` that checks if the person invoking this command is the + owner of the bot. + + This is powered by :meth:`.Bot.is_owner`. + + This check raises a special exception, :exc:`.NotOwner` that is derived + from :exc:`.CheckFailure`. + """ + + async def predicate(ctx: AnyContext) -> bool: + if not await ctx.bot.is_owner(ctx.author): + raise NotOwner("You do not own this bot.") + return True + + return check(predicate) + + +def is_nsfw() -> Callable[[T], T]: + """A :func:`.check` that checks if the channel is a NSFW channel. + + This check raises a special exception, :exc:`.NSFWChannelRequired` + that is derived from :exc:`.CheckFailure`. + + .. versionchanged:: 1.1 + + Raise :exc:`.NSFWChannelRequired` instead of generic :exc:`.CheckFailure`. + DM channels will also now pass this check. + """ + + def pred(ctx: AnyContext) -> bool: + ch = ctx.channel + if ctx.guild is None or ( + isinstance(ch, (disnake.TextChannel, disnake.VoiceChannel, disnake.Thread)) + and ch.is_nsfw() + ): + return True + raise NSFWChannelRequired(ch) # type: ignore + + return check(pred) + + +def cooldown( + rate: int, per: float, type: Union[BucketType, Callable[[Message], Any]] = BucketType.default +) -> Callable[[T], T]: + """A decorator that adds a cooldown to a :class:`.Command` + + A cooldown allows a command to only be used a specific amount + of times in a specific time frame. These cooldowns can be based + either on a per-guild, per-channel, per-user, per-role or global basis. + Denoted by the third argument of ``type`` which must be of enum + type :class:`.BucketType`. + + If a cooldown is triggered, then :exc:`.CommandOnCooldown` is triggered in + :func:`.on_command_error` and the local error handler. + + A command can only have a single cooldown. + + Parameters + ---------- + rate: :class:`int` + The number of times a command can be used before triggering a cooldown. + per: :class:`float` + The amount of seconds to wait for a cooldown when it's been triggered. + type: Union[:class:`.BucketType`, Callable[[:class:`.Message`], Any]] + The type of cooldown to have. If callable, should return a key for the mapping. + + .. versionchanged:: 1.7 + Callables are now supported for custom bucket types. + """ + + def decorator(func: Union[Command, CoroFunc]) -> Union[Command, CoroFunc]: + if hasattr(func, "__command_flag__"): + func._buckets = CooldownMapping(Cooldown(rate, per), type) + else: + func.__commands_cooldown__ = CooldownMapping(Cooldown(rate, per), type) # type: ignore + return func + + return decorator # type: ignore + + +def dynamic_cooldown( + cooldown: Union[BucketType, Callable[[Message], Any]], type: BucketType = BucketType.default +) -> Callable[[T], T]: + """A decorator that adds a dynamic cooldown to a :class:`.Command` + + This differs from :func:`.cooldown` in that it takes a function that + accepts a single parameter of type :class:`.disnake.Message` and must + return a :class:`.Cooldown` or ``None``. If ``None`` is returned then + that cooldown is effectively bypassed. + + A cooldown allows a command to only be used a specific amount + of times in a specific time frame. These cooldowns can be based + either on a per-guild, per-channel, per-user, per-role or global basis. + Denoted by the third argument of ``type`` which must be of enum + type :class:`.BucketType`. + + If a cooldown is triggered, then :exc:`.CommandOnCooldown` is triggered in + :func:`.on_command_error` and the local error handler. + + A command can only have a single cooldown. + + .. versionadded:: 2.0 + + Parameters + ---------- + cooldown: Callable[[:class:`.disnake.Message`], Optional[:class:`.Cooldown`]] + A function that takes a message and returns a cooldown that will + apply to this invocation or ``None`` if the cooldown should be bypassed. + type: :class:`.BucketType` + The type of cooldown to have. + """ + if not callable(cooldown): + raise TypeError("A callable must be provided") + + def decorator(func: Union[Command, CoroFunc]) -> Union[Command, CoroFunc]: + if hasattr(func, "__command_flag__"): + func._buckets = DynamicCooldownMapping(cooldown, type) + else: + func.__commands_cooldown__ = DynamicCooldownMapping(cooldown, type) # type: ignore + return func + + return decorator # type: ignore + + +def max_concurrency( + number: int, per: BucketType = BucketType.default, *, wait: bool = False +) -> Callable[[T], T]: + """A decorator that adds a maximum concurrency to a :class:`.Command` or its subclasses. + + This enables you to only allow a certain number of command invocations at the same time, + for example if a command takes too long or if only one user can use it at a time. This + differs from a cooldown in that there is no set waiting period or token bucket -- only + a set number of people can run the command. + + .. versionadded:: 1.3 + + Parameters + ---------- + number: :class:`int` + The maximum number of invocations of this command that can be running at the same time. + per: :class:`.BucketType` + The bucket that this concurrency is based on, e.g. ``BucketType.guild`` would allow + it to be used up to ``number`` times per guild. + wait: :class:`bool` + Whether the command should wait for the queue to be over. If this is set to ``False`` + then instead of waiting until the command can run again, the command raises + :exc:`.MaxConcurrencyReached` to its error handler. If this is set to ``True`` + then the command waits until it can be executed. + """ + + def decorator(func: Union[Command, CoroFunc]) -> Union[Command, CoroFunc]: + value = MaxConcurrency(number, per=per, wait=wait) + if hasattr(func, "__command_flag__"): + func._max_concurrency = value + else: + func.__commands_max_concurrency__ = value # type: ignore + return func + + return decorator # type: ignore + + +def before_invoke(coro) -> Callable[[T], T]: + """A decorator that registers a coroutine as a pre-invoke hook. + + This allows you to refer to one before invoke hook for several commands that + do not have to be within the same cog. + + .. versionadded:: 1.4 + + Example + --------- + + .. code-block:: python3 + + async def record_usage(ctx): + print(ctx.author, 'used', ctx.command, 'at', ctx.message.created_at) + + @bot.command() + @commands.before_invoke(record_usage) + async def who(ctx): # Output: used who at

Charset Detection, for Everyone 👋

  • {name}