final fixes: huggingface works now
parent
5e2054fc43
commit
091e0b27e6
9
Makefile
9
Makefile
|
@ -16,6 +16,10 @@ docs-dev:
|
|||
docs-build:
|
||||
mkdocs build
|
||||
|
||||
.PHONY: publish
|
||||
publish:
|
||||
poetry build && poetry publish --build --username $PYPI_USERNAME --password $PYPI_PASSWORD
|
||||
|
||||
#* Poetry
|
||||
.PHONY: poetry-download
|
||||
poetry-download:
|
||||
|
@ -78,10 +82,11 @@ update-dev-deps:
|
|||
poetry add --group dev --allow-prereleases black@latest
|
||||
|
||||
.PHONY: update-deps
|
||||
update-deps: poetry update --lock && pip install -r requirements.txt
|
||||
update-deps:
|
||||
poetry update --lock
|
||||
|
||||
.PHONY: update
|
||||
update: update-dev-deps update-deps
|
||||
update: update-dev-deps update-deps install
|
||||
|
||||
|
||||
#* Container / Docker
|
||||
|
|
|
@ -1,5 +1,4 @@
|
|||
# type: ignore
|
||||
|
||||
"""
|
||||
model naming convention
|
||||
# Open-AI models:
|
||||
|
@ -7,25 +6,23 @@ include prefix openai-*
|
|||
# HuggingFace
|
||||
include prefix hf-*
|
||||
"""
|
||||
|
||||
from typing import Any, List, Tuple
|
||||
|
||||
import os
|
||||
import sys
|
||||
from pathlib import Path
|
||||
|
||||
import dotenv
|
||||
import openai
|
||||
from transformers import pipeline
|
||||
|
||||
sys.path.append(str(Path(__file__).parent.parent.parent) + "/tools/NLP/data")
|
||||
sys.path.append(str(Path(__file__).parent.parent.parent) + "/tools/NLP")
|
||||
sys.path.append(str(Path(__file__).parent.parent.parent) + "/tools")
|
||||
sys.path.append(str(Path(__file__).parent.parent.parent) + "/utils")
|
||||
|
||||
import config
|
||||
import dotenv
|
||||
import internet
|
||||
import openai
|
||||
from ChatGPT import Chatbot
|
||||
from transformers import pipeline
|
||||
|
||||
dotenv.load_dotenv()
|
||||
|
||||
|
@ -37,18 +34,12 @@ def answer(
|
|||
GOOGLE_SEARCH_ENGINE_ID: str = "",
|
||||
OPENAI_API_KEY: str = "",
|
||||
CHATGPT_SESSION_TOKEN: str = "",
|
||||
CHATGPT_CONVERSATION_ID: str = "",
|
||||
CHATGPT_PARENT_ID: str = "",
|
||||
) -> tuple[Any, list[str]]:
|
||||
if OPENAI_API_KEY == "":
|
||||
OPENAI_API_KEY = str(os.environ.get("OPENAI_API_KEY"))
|
||||
openai.api_key = OPENAI_API_KEY
|
||||
if CHATGPT_SESSION_TOKEN == "":
|
||||
CHATGPT_SESSION_TOKEN = str(os.environ.get("CHATGPT_SESSION_TOKEN"))
|
||||
if CHATGPT_CONVERSATION_ID == "":
|
||||
CHATGPT_CONVERSATION_ID = str(os.environ.get("CHATGPT_CONVERSATION_ID"))
|
||||
if CHATGPT_PARENT_ID == "":
|
||||
CHATGPT_PARENT_ID = str(os.environ.get("CHATGPT_PARENT_ID"))
|
||||
|
||||
if not (model.startswith("openai-") or model.startswith("hf-")):
|
||||
model = "openai-chatgpt" # Default
|
||||
|
@ -56,13 +47,13 @@ def answer(
|
|||
results: tuple[list[str], list[str]] = internet.Google(
|
||||
query, GOOGLE_SEARCH_API_KEY, GOOGLE_SEARCH_ENGINE_ID
|
||||
).google()
|
||||
context: str = str(" ".join([str(string) for string in results[0]]))
|
||||
print(f"context: {context}")
|
||||
|
||||
if model.startswith("openai-"):
|
||||
if model == "openai-chatgpt":
|
||||
# ChatGPT
|
||||
prompt = f"Using the context: {' '.join(filter(lambda x: isinstance(x, str), results[0]))[:3000]} and answer the question with the context above and previous knowledge: \"{query}\". Also write long answers or essays if asked."
|
||||
print(prompt)
|
||||
exit(1)
|
||||
prompt = f'Use the context: {context[:4000]} and answer the question: "{query}" with the context and prior knowledge. Also write at the very least long answers.'
|
||||
chatbot = Chatbot(
|
||||
{"session_token": CHATGPT_SESSION_TOKEN},
|
||||
conversation_id=None,
|
||||
|
@ -77,7 +68,7 @@ def answer(
|
|||
else:
|
||||
if model == "openai-text-davinci-003":
|
||||
# text-davinci-003
|
||||
prompt = f"Using the context: {' '.join(filter(lambda x: isinstance(x, str), results[0]))[:3000]} and answer the question with the context above and previous knowledge: \"{query}\". Also write long answers or essays if asked."
|
||||
prompt = f'Use the context: {context[:3000]} and answer the question: "{query}" with the context and prior knowledge. Also write at the very least long answers.'
|
||||
response = openai.Completion.create(
|
||||
model="text-davinci-003",
|
||||
prompt=prompt,
|
||||
|
@ -89,15 +80,16 @@ def answer(
|
|||
return (response.choices[0].text, results[1])
|
||||
# TODO: add suport later
|
||||
else:
|
||||
# HuggingFace
|
||||
model = model.replace("hf-", "", 1)
|
||||
qa_model = pipeline("question-answering", model=model)
|
||||
response = qa_model(question=query, context=" ".join(results[0]))
|
||||
response = qa_model(question=query, context=context)
|
||||
return (response["answer"], results[1])
|
||||
|
||||
|
||||
print(
|
||||
answer(
|
||||
query="Best original song in 80th Golden Globe award 2023?",
|
||||
model="openai-chatgpt",
|
||||
query="What is the newest pokemon game?",
|
||||
model="hf-deepset/xlm-roberta-large-squad2",
|
||||
)
|
||||
)
|
||||
|
|
|
@ -3,13 +3,19 @@
|
|||
# Copied and updated from https://github.com/acheong08/ChatGPT/blob/main/src/revChatGPT/ChatGPT.py
|
||||
# credits to https://github.com/acheong08/ChatGPT
|
||||
|
||||
import uuid, re, json, tls_client, logging
|
||||
import undetected_chromedriver as uc
|
||||
from selenium.webdriver.support.ui import WebDriverWait
|
||||
from selenium.webdriver.support import expected_conditions as EC
|
||||
from selenium.webdriver.common.by import By
|
||||
import json
|
||||
import logging
|
||||
import re
|
||||
import uuid
|
||||
from time import sleep
|
||||
|
||||
import tls_client
|
||||
import undetected_chromedriver as uc
|
||||
from selenium.webdriver.common.by import By
|
||||
from selenium.webdriver.support import expected_conditions as EC
|
||||
from selenium.webdriver.support.ui import WebDriverWait
|
||||
from twocaptcha import TwoCaptcha
|
||||
|
||||
# Disable all logging
|
||||
logging.basicConfig(level=logging.ERROR)
|
||||
|
||||
|
@ -17,17 +23,16 @@ BASE_URL = "https://chat.openai.com/"
|
|||
|
||||
|
||||
class Chrome(uc.Chrome):
|
||||
|
||||
def __del__(self):
|
||||
self.quit()
|
||||
|
||||
|
||||
class Chatbot:
|
||||
def __init__(self, config, conversation_id=None, parent_id=None, no_refresh=False) -> None:
|
||||
def __init__(
|
||||
self, config, conversation_id=None, parent_id=None, no_refresh=False
|
||||
) -> None:
|
||||
self.config = config
|
||||
self.session = tls_client.Session(
|
||||
client_identifier="chrome_108"
|
||||
)
|
||||
self.session = tls_client.Session(client_identifier="chrome_108")
|
||||
if "proxy" in config:
|
||||
if type(config["proxy"]) != str:
|
||||
raise Exception("Proxy must be a string!")
|
||||
|
@ -50,9 +55,9 @@ class Chatbot:
|
|||
self.isMicrosoftLogin = False
|
||||
self.twocaptcha_key = None
|
||||
# stdout colors
|
||||
self.GREEN = '\033[92m'
|
||||
self.WARNING = '\033[93m'
|
||||
self.ENDCOLOR = '\033[0m'
|
||||
self.GREEN = "\033[92m"
|
||||
self.WARNING = "\033[93m"
|
||||
self.ENDCOLOR = "\033[0m"
|
||||
if "email" in config and "password" in config:
|
||||
if type(config["email"]) != str:
|
||||
raise Exception("Email must be a string!")
|
||||
|
@ -78,7 +83,8 @@ class Chatbot:
|
|||
raise Exception("Session token must be a string!")
|
||||
self.session_token = config["session_token"]
|
||||
self.session.cookies.set(
|
||||
"__Secure-next-auth.session-token", config["session_token"])
|
||||
"__Secure-next-auth.session-token", config["session_token"]
|
||||
)
|
||||
self.get_cf_cookies()
|
||||
else:
|
||||
raise Exception("Invalid config!")
|
||||
|
@ -96,10 +102,16 @@ class Chatbot:
|
|||
raise exc
|
||||
retries -= 1
|
||||
|
||||
def ask(self, prompt, conversation_id=None, parent_id=None, gen_title=False, session_token=None):
|
||||
def ask(
|
||||
self,
|
||||
prompt,
|
||||
conversation_id=None,
|
||||
parent_id=None,
|
||||
gen_title=False,
|
||||
session_token=None,
|
||||
):
|
||||
if session_token:
|
||||
self.session.cookies.set(
|
||||
"__Secure-next-auth.session-token", session_token)
|
||||
self.session.cookies.set("__Secure-next-auth.session-token", session_token)
|
||||
self.session_token = session_token
|
||||
self.config["session_token"] = session_token
|
||||
self.retry_refresh()
|
||||
|
@ -107,8 +119,11 @@ class Chatbot:
|
|||
if conversation_id == None:
|
||||
conversation_id = self.conversation_id
|
||||
if parent_id == None:
|
||||
parent_id = self.parent_id if conversation_id == self.conversation_id else self.conversation_mapping[
|
||||
conversation_id]
|
||||
parent_id = (
|
||||
self.parent_id
|
||||
if conversation_id == self.conversation_id
|
||||
else self.conversation_mapping[conversation_id]
|
||||
)
|
||||
data = {
|
||||
"action": "next",
|
||||
"messages": [
|
||||
|
@ -123,13 +138,12 @@ class Chatbot:
|
|||
"model": "text-davinci-002-render",
|
||||
}
|
||||
new_conv = data["conversation_id"] is None
|
||||
self.conversation_id_prev_queue.append(
|
||||
data["conversation_id"]) # for rollback
|
||||
self.conversation_id_prev_queue.append(data["conversation_id"]) # for rollback
|
||||
self.parent_id_prev_queue.append(data["parent_message_id"])
|
||||
response = self.session.post(
|
||||
url=BASE_URL + "backend-api/conversation",
|
||||
data=json.dumps(data),
|
||||
timeout_seconds=180
|
||||
timeout_seconds=180,
|
||||
)
|
||||
if response.status_code != 200:
|
||||
print(response.text)
|
||||
|
@ -155,12 +169,12 @@ class Chatbot:
|
|||
}
|
||||
if gen_title and new_conv:
|
||||
try:
|
||||
title = self.gen_title(
|
||||
self.conversation_id, self.parent_id)["title"]
|
||||
title = self.gen_title(self.conversation_id, self.parent_id)[
|
||||
"title"
|
||||
]
|
||||
except Exception as exc:
|
||||
split = prompt.split(" ")
|
||||
title = " ".join(split[:3]) + \
|
||||
("..." if len(split) > 3 else "")
|
||||
title = " ".join(split[:3]) + ("..." if len(split) > 3 else "")
|
||||
res["title"] = title
|
||||
return res
|
||||
else:
|
||||
|
@ -172,8 +186,7 @@ class Chatbot:
|
|||
raise Exception("Response code error: ", response.status_code)
|
||||
|
||||
def get_conversations(self, offset=0, limit=20):
|
||||
url = BASE_URL + \
|
||||
f"backend-api/conversations?offset={offset}&limit={limit}"
|
||||
url = BASE_URL + f"backend-api/conversations?offset={offset}&limit={limit}"
|
||||
response = self.session.get(url)
|
||||
self.check_response(response)
|
||||
data = json.loads(response.text)
|
||||
|
@ -188,8 +201,12 @@ class Chatbot:
|
|||
|
||||
def gen_title(self, id, message_id):
|
||||
url = BASE_URL + f"backend-api/conversation/gen_title/{id}"
|
||||
response = self.session.post(url, data=json.dumps(
|
||||
{"message_id": message_id, "model": "text-davinci-002-render"}))
|
||||
response = self.session.post(
|
||||
url,
|
||||
data=json.dumps(
|
||||
{"message_id": message_id, "model": "text-davinci-002-render"}
|
||||
),
|
||||
)
|
||||
self.check_response(response)
|
||||
data = json.loads(response.text)
|
||||
return data
|
||||
|
@ -212,8 +229,7 @@ class Chatbot:
|
|||
|
||||
def refresh_session(self, session_token=None):
|
||||
if session_token:
|
||||
self.session.cookies.set(
|
||||
"__Secure-next-auth.session-token", session_token)
|
||||
self.session.cookies.set("__Secure-next-auth.session-token", session_token)
|
||||
self.session_token = session_token
|
||||
self.config["session_token"] = session_token
|
||||
url = BASE_URL + "api/auth/session"
|
||||
|
@ -224,15 +240,23 @@ class Chatbot:
|
|||
try:
|
||||
if "error" in response.json():
|
||||
raise Exception(
|
||||
f"Failed to refresh session! Error: {response.json()['error']}")
|
||||
elif response.status_code != 200 or response.json() == {} or "accessToken" not in response.json():
|
||||
raise Exception(f'Response code: {response.status_code} \n Response: {response.text}')
|
||||
f"Failed to refresh session! Error: {response.json()['error']}"
|
||||
)
|
||||
elif (
|
||||
response.status_code != 200
|
||||
or response.json() == {}
|
||||
or "accessToken" not in response.json()
|
||||
):
|
||||
raise Exception(
|
||||
f"Response code: {response.status_code} \n Response: {response.text}"
|
||||
)
|
||||
else:
|
||||
self.session.headers.update({
|
||||
"Authorization": "Bearer " + response.json()["accessToken"]
|
||||
})
|
||||
self.session.headers.update(
|
||||
{"Authorization": "Bearer " + response.json()["accessToken"]}
|
||||
)
|
||||
self.session_token = self.session.cookies._find(
|
||||
"__Secure-next-auth.session-token", )
|
||||
"__Secure-next-auth.session-token",
|
||||
)
|
||||
except Exception as exc:
|
||||
print("Failed to refresh session!")
|
||||
if self.isMicrosoftLogin:
|
||||
|
@ -268,65 +292,86 @@ class Chatbot:
|
|||
options = self.__get_ChromeOptions()
|
||||
print("Spawning browser...")
|
||||
driver = uc.Chrome(
|
||||
enable_cdp_events=True, options=options,
|
||||
enable_cdp_events=True,
|
||||
options=options,
|
||||
driver_executable_path=self.config.get("driver_exec_path"),
|
||||
browser_executable_path=self.config.get("browser_exec_path")
|
||||
browser_executable_path=self.config.get("browser_exec_path"),
|
||||
)
|
||||
print("Browser spawned.")
|
||||
driver.add_cdp_listener(
|
||||
"Network.responseReceivedExtraInfo", lambda msg: self.detect_cookies(msg))
|
||||
"Network.responseReceivedExtraInfo",
|
||||
lambda msg: self.detect_cookies(msg),
|
||||
)
|
||||
driver.add_cdp_listener(
|
||||
"Network.requestWillBeSentExtraInfo", lambda msg: self.detect_user_agent(msg))
|
||||
"Network.requestWillBeSentExtraInfo",
|
||||
lambda msg: self.detect_user_agent(msg),
|
||||
)
|
||||
driver.get(BASE_URL)
|
||||
while not self.agent_found or not self.cf_cookie_found:
|
||||
sleep(5)
|
||||
self.refresh_headers(cf_clearance=self.cf_clearance,
|
||||
user_agent=self.user_agent)
|
||||
self.refresh_headers(
|
||||
cf_clearance=self.cf_clearance, user_agent=self.user_agent
|
||||
)
|
||||
# Wait for the login button to appear
|
||||
WebDriverWait(driver, 120).until(EC.element_to_be_clickable(
|
||||
(By.XPATH, "//button[contains(text(), 'Log in')]")))
|
||||
WebDriverWait(driver, 120).until(
|
||||
EC.element_to_be_clickable(
|
||||
(By.XPATH, "//button[contains(text(), 'Log in')]")
|
||||
)
|
||||
)
|
||||
# Click the login button
|
||||
driver.find_element(
|
||||
by=By.XPATH, value="//button[contains(text(), 'Log in')]").click()
|
||||
by=By.XPATH, value="//button[contains(text(), 'Log in')]"
|
||||
).click()
|
||||
# Wait for the Login with Microsoft button to be clickable
|
||||
WebDriverWait(driver, 60).until(EC.element_to_be_clickable(
|
||||
(By.XPATH, "//button[@data-provider='windowslive']")))
|
||||
WebDriverWait(driver, 60).until(
|
||||
EC.element_to_be_clickable(
|
||||
(By.XPATH, "//button[@data-provider='windowslive']")
|
||||
)
|
||||
)
|
||||
# Click the Login with Microsoft button
|
||||
driver.find_element(
|
||||
by=By.XPATH, value="//button[@data-provider='windowslive']").click()
|
||||
by=By.XPATH, value="//button[@data-provider='windowslive']"
|
||||
).click()
|
||||
# Wait for the email input field to appear
|
||||
WebDriverWait(driver, 60).until(EC.visibility_of_element_located(
|
||||
(By.XPATH, "//input[@type='email']")))
|
||||
WebDriverWait(driver, 60).until(
|
||||
EC.visibility_of_element_located((By.XPATH, "//input[@type='email']"))
|
||||
)
|
||||
# Enter the email
|
||||
driver.find_element(
|
||||
by=By.XPATH, value="//input[@type='email']").send_keys(self.config["email"])
|
||||
driver.find_element(by=By.XPATH, value="//input[@type='email']").send_keys(
|
||||
self.config["email"]
|
||||
)
|
||||
# Wait for the Next button to be clickable
|
||||
WebDriverWait(driver, 60).until(EC.element_to_be_clickable(
|
||||
(By.XPATH, "//input[@type='submit']")))
|
||||
WebDriverWait(driver, 60).until(
|
||||
EC.element_to_be_clickable((By.XPATH, "//input[@type='submit']"))
|
||||
)
|
||||
# Click the Next button
|
||||
driver.find_element(
|
||||
by=By.XPATH, value="//input[@type='submit']").click()
|
||||
driver.find_element(by=By.XPATH, value="//input[@type='submit']").click()
|
||||
# Wait for the password input field to appear
|
||||
WebDriverWait(driver, 60).until(EC.visibility_of_element_located(
|
||||
(By.XPATH, "//input[@type='password']")))
|
||||
WebDriverWait(driver, 60).until(
|
||||
EC.visibility_of_element_located(
|
||||
(By.XPATH, "//input[@type='password']")
|
||||
)
|
||||
)
|
||||
# Enter the password
|
||||
driver.find_element(
|
||||
by=By.XPATH, value="//input[@type='password']").send_keys(self.config["password"])
|
||||
by=By.XPATH, value="//input[@type='password']"
|
||||
).send_keys(self.config["password"])
|
||||
# Wait for the Sign in button to be clickable
|
||||
WebDriverWait(driver, 60).until(EC.element_to_be_clickable(
|
||||
(By.XPATH, "//input[@type='submit']")))
|
||||
WebDriverWait(driver, 60).until(
|
||||
EC.element_to_be_clickable((By.XPATH, "//input[@type='submit']"))
|
||||
)
|
||||
# Click the Sign in button
|
||||
driver.find_element(
|
||||
by=By.XPATH, value="//input[@type='submit']").click()
|
||||
driver.find_element(by=By.XPATH, value="//input[@type='submit']").click()
|
||||
# Wait for the Allow button to appear
|
||||
WebDriverWait(driver, 60).until(EC.element_to_be_clickable(
|
||||
(By.XPATH, "//input[@type='submit']")))
|
||||
WebDriverWait(driver, 60).until(
|
||||
EC.element_to_be_clickable((By.XPATH, "//input[@type='submit']"))
|
||||
)
|
||||
# click Yes button
|
||||
driver.find_element(
|
||||
by=By.XPATH, value="//input[@type='submit']").click()
|
||||
driver.find_element(by=By.XPATH, value="//input[@type='submit']").click()
|
||||
# wait for input box to appear (to make sure we're signed in)
|
||||
WebDriverWait(driver, 60).until(EC.visibility_of_element_located(
|
||||
(By.XPATH, "//textarea")))
|
||||
WebDriverWait(driver, 60).until(
|
||||
EC.visibility_of_element_located((By.XPATH, "//textarea"))
|
||||
)
|
||||
while not self.session_cookie_found:
|
||||
sleep(5)
|
||||
print(self.GREEN + "Login successful." + self.ENDCOLOR)
|
||||
|
@ -343,20 +388,26 @@ class Chatbot:
|
|||
"""
|
||||
twocaptcha_key = self.twocaptcha_key
|
||||
twocaptcha_solver_config = {
|
||||
'apiKey': twocaptcha_key,
|
||||
'defaultTimeout': 120,
|
||||
'recaptchaTimeout': 600,
|
||||
'pollingInterval': 10,
|
||||
"apiKey": twocaptcha_key,
|
||||
"defaultTimeout": 120,
|
||||
"recaptchaTimeout": 600,
|
||||
"pollingInterval": 10,
|
||||
}
|
||||
twocaptcha_solver = TwoCaptcha(**twocaptcha_solver_config)
|
||||
print('Waiting for captcha to be solved...')
|
||||
print("Waiting for captcha to be solved...")
|
||||
solved_captcha = twocaptcha_solver.recaptcha(
|
||||
sitekey='6Lc-wnQjAAAAADa5SPd68d0O3xmj0030uaVzpnXP', url="https://auth0.openai.com/u/login/identifier")
|
||||
sitekey="6Lc-wnQjAAAAADa5SPd68d0O3xmj0030uaVzpnXP",
|
||||
url="https://auth0.openai.com/u/login/identifier",
|
||||
)
|
||||
if "code" in solved_captcha:
|
||||
print(self.GREEN + "Captcha solved successfully!" + self.ENDCOLOR)
|
||||
if self.verbose:
|
||||
print(self.GREEN + "Captcha token: " +
|
||||
self.ENDCOLOR + solved_captcha["code"])
|
||||
print(
|
||||
self.GREEN
|
||||
+ "Captcha token: "
|
||||
+ self.ENDCOLOR
|
||||
+ solved_captcha["code"]
|
||||
)
|
||||
return solved_captcha
|
||||
|
||||
def email_login(self, solved_captcha) -> None:
|
||||
|
@ -375,74 +426,105 @@ class Chatbot:
|
|||
options = self.__get_ChromeOptions()
|
||||
print("Spawning browser...")
|
||||
driver = uc.Chrome(
|
||||
enable_cdp_events=True, options=options,
|
||||
enable_cdp_events=True,
|
||||
options=options,
|
||||
driver_executable_path=self.config.get("driver_exec_path"),
|
||||
browser_executable_path=self.config.get("browser_exec_path")
|
||||
browser_executable_path=self.config.get("browser_exec_path"),
|
||||
)
|
||||
print("Browser spawned.")
|
||||
driver.add_cdp_listener(
|
||||
"Network.responseReceivedExtraInfo", lambda msg: self.detect_cookies(msg))
|
||||
"Network.responseReceivedExtraInfo",
|
||||
lambda msg: self.detect_cookies(msg),
|
||||
)
|
||||
driver.add_cdp_listener(
|
||||
"Network.requestWillBeSentExtraInfo", lambda msg: self.detect_user_agent(msg))
|
||||
"Network.requestWillBeSentExtraInfo",
|
||||
lambda msg: self.detect_user_agent(msg),
|
||||
)
|
||||
driver.get(BASE_URL)
|
||||
while not self.agent_found or not self.cf_cookie_found:
|
||||
sleep(5)
|
||||
self.refresh_headers(cf_clearance=self.cf_clearance,
|
||||
user_agent=self.user_agent)
|
||||
self.refresh_headers(
|
||||
cf_clearance=self.cf_clearance, user_agent=self.user_agent
|
||||
)
|
||||
# Wait for the login button to appear
|
||||
WebDriverWait(driver, 120).until(EC.element_to_be_clickable(
|
||||
(By.XPATH, "//button[contains(text(), 'Log in')]")))
|
||||
WebDriverWait(driver, 120).until(
|
||||
EC.element_to_be_clickable(
|
||||
(By.XPATH, "//button[contains(text(), 'Log in')]")
|
||||
)
|
||||
)
|
||||
# Click the login button
|
||||
driver.find_element(
|
||||
by=By.XPATH, value="//button[contains(text(), 'Log in')]").click()
|
||||
by=By.XPATH, value="//button[contains(text(), 'Log in')]"
|
||||
).click()
|
||||
# Wait for the email input field to appear
|
||||
WebDriverWait(driver, 60).until(EC.visibility_of_element_located(
|
||||
(By.ID, "username")))
|
||||
WebDriverWait(driver, 60).until(
|
||||
EC.visibility_of_element_located((By.ID, "username"))
|
||||
)
|
||||
# Enter the email
|
||||
driver.find_element(by=By.ID, value="username").send_keys(
|
||||
self.config["email"])
|
||||
self.config["email"]
|
||||
)
|
||||
# Wait for Recaptcha to appear
|
||||
WebDriverWait(driver, 60).until(EC.presence_of_element_located(
|
||||
(By.CSS_SELECTOR, "*[name*='g-recaptcha-response']")))
|
||||
WebDriverWait(driver, 60).until(
|
||||
EC.presence_of_element_located(
|
||||
(By.CSS_SELECTOR, "*[name*='g-recaptcha-response']")
|
||||
)
|
||||
)
|
||||
# Find Recaptcha
|
||||
google_captcha_response_input = driver.find_element(
|
||||
By.CSS_SELECTOR, "*[name*='g-recaptcha-response']")
|
||||
captcha_input = driver.find_element(By.NAME, 'captcha')
|
||||
By.CSS_SELECTOR, "*[name*='g-recaptcha-response']"
|
||||
)
|
||||
captcha_input = driver.find_element(By.NAME, "captcha")
|
||||
# Make input visible
|
||||
driver.execute_script("arguments[0].setAttribute('style','type: text; visibility:visible;');",
|
||||
google_captcha_response_input)
|
||||
driver.execute_script("arguments[0].setAttribute('style','type: text; visibility:visible;');",
|
||||
captcha_input)
|
||||
driver.execute_script("""
|
||||
driver.execute_script(
|
||||
"arguments[0].setAttribute('style','type: text; visibility:visible;');",
|
||||
google_captcha_response_input,
|
||||
)
|
||||
driver.execute_script(
|
||||
"arguments[0].setAttribute('style','type: text; visibility:visible;');",
|
||||
captcha_input,
|
||||
)
|
||||
driver.execute_script(
|
||||
"""
|
||||
document.getElementById("g-recaptcha-response").innerHTML = arguments[0]
|
||||
""", solved_captcha.get('code'))
|
||||
driver.execute_script("""
|
||||
""",
|
||||
solved_captcha.get("code"),
|
||||
)
|
||||
driver.execute_script(
|
||||
"""
|
||||
document.querySelector("input[name='captcha']").value = arguments[0]
|
||||
""", solved_captcha.get('code'))
|
||||
""",
|
||||
solved_captcha.get("code"),
|
||||
)
|
||||
# Hide the captcha input
|
||||
driver.execute_script("arguments[0].setAttribute('style', 'display:none;');",
|
||||
google_captcha_response_input)
|
||||
driver.execute_script(
|
||||
"arguments[0].setAttribute('style', 'display:none;');",
|
||||
google_captcha_response_input,
|
||||
)
|
||||
# Wait for the Continue button to be clickable
|
||||
WebDriverWait(driver, 60).until(EC.element_to_be_clickable(
|
||||
(By.XPATH, "//button[@type='submit']")))
|
||||
WebDriverWait(driver, 60).until(
|
||||
EC.element_to_be_clickable((By.XPATH, "//button[@type='submit']"))
|
||||
)
|
||||
# Click the Continue button
|
||||
driver.find_element(
|
||||
by=By.XPATH, value="//button[@type='submit']").click()
|
||||
driver.find_element(by=By.XPATH, value="//button[@type='submit']").click()
|
||||
# Wait for the password input field to appear
|
||||
WebDriverWait(driver, 60).until(EC.visibility_of_element_located(
|
||||
(By.ID, "password")))
|
||||
WebDriverWait(driver, 60).until(
|
||||
EC.visibility_of_element_located((By.ID, "password"))
|
||||
)
|
||||
# Enter the password
|
||||
driver.find_element(by=By.ID, value="password").send_keys(
|
||||
self.config["password"])
|
||||
self.config["password"]
|
||||
)
|
||||
# Wait for the Sign in button to be clickable
|
||||
WebDriverWait(driver, 60).until(EC.element_to_be_clickable(
|
||||
(By.XPATH, "//button[@type='submit']")))
|
||||
WebDriverWait(driver, 60).until(
|
||||
EC.element_to_be_clickable((By.XPATH, "//button[@type='submit']"))
|
||||
)
|
||||
# Click the Sign in button
|
||||
driver.find_element(
|
||||
by=By.XPATH, value="//button[@type='submit']").click()
|
||||
driver.find_element(by=By.XPATH, value="//button[@type='submit']").click()
|
||||
# wait for input box to appear (to make sure we're signed in)
|
||||
WebDriverWait(driver, 60).until(EC.visibility_of_element_located(
|
||||
(By.XPATH, "//textarea")))
|
||||
WebDriverWait(driver, 60).until(
|
||||
EC.visibility_of_element_located((By.XPATH, "//textarea"))
|
||||
)
|
||||
while not self.session_cookie_found:
|
||||
sleep(5)
|
||||
print(self.GREEN + "Login successful." + self.ENDCOLOR)
|
||||
|
@ -453,10 +535,10 @@ class Chatbot:
|
|||
|
||||
def __get_ChromeOptions(self):
|
||||
options = uc.ChromeOptions()
|
||||
options.add_argument('--start_maximized')
|
||||
options.add_argument("--start_maximized")
|
||||
options.add_argument("--disable-extensions")
|
||||
options.add_argument('--disable-application-cache')
|
||||
options.add_argument('--disable-gpu')
|
||||
options.add_argument("--disable-application-cache")
|
||||
options.add_argument("--disable-gpu")
|
||||
options.add_argument("--no-sandbox")
|
||||
options.add_argument("--disable-setuid-sandbox")
|
||||
options.add_argument("--disable-dev-shm-usage")
|
||||
|
@ -478,15 +560,20 @@ class Chatbot:
|
|||
options = self.__get_ChromeOptions()
|
||||
print("Spawning browser...")
|
||||
driver = uc.Chrome(
|
||||
enable_cdp_events=True, options=options,
|
||||
enable_cdp_events=True,
|
||||
options=options,
|
||||
driver_executable_path=self.config.get("driver_exec_path"),
|
||||
browser_executable_path=self.config.get("browser_exec_path")
|
||||
browser_executable_path=self.config.get("browser_exec_path"),
|
||||
)
|
||||
print("Browser spawned.")
|
||||
driver.add_cdp_listener(
|
||||
"Network.responseReceivedExtraInfo", lambda msg: self.detect_cookies(msg))
|
||||
"Network.responseReceivedExtraInfo",
|
||||
lambda msg: self.detect_cookies(msg),
|
||||
)
|
||||
driver.add_cdp_listener(
|
||||
"Network.requestWillBeSentExtraInfo", lambda msg: self.detect_user_agent(msg))
|
||||
"Network.requestWillBeSentExtraInfo",
|
||||
lambda msg: self.detect_user_agent(msg),
|
||||
)
|
||||
driver.get("https://chat.openai.com/chat")
|
||||
while not self.agent_found or not self.cf_cookie_found:
|
||||
sleep(5)
|
||||
|
@ -494,18 +581,22 @@ class Chatbot:
|
|||
# Close the browser
|
||||
driver.quit()
|
||||
del driver
|
||||
self.refresh_headers(cf_clearance=self.cf_clearance,
|
||||
user_agent=self.user_agent)
|
||||
self.refresh_headers(
|
||||
cf_clearance=self.cf_clearance, user_agent=self.user_agent
|
||||
)
|
||||
|
||||
def detect_cookies(self, message):
|
||||
if 'params' in message:
|
||||
if 'headers' in message['params']:
|
||||
if 'set-cookie' in message['params']['headers']:
|
||||
if "params" in message:
|
||||
if "headers" in message["params"]:
|
||||
if "set-cookie" in message["params"]["headers"]:
|
||||
# Use regex to get the cookie for cf_clearance=*;
|
||||
cf_clearance_cookie = re.search(
|
||||
"cf_clearance=.*?;", message['params']['headers']['set-cookie'])
|
||||
"cf_clearance=.*?;", message["params"]["headers"]["set-cookie"]
|
||||
)
|
||||
session_cookie = re.search(
|
||||
"__Secure-next-auth.session-token=.*?;", message['params']['headers']['set-cookie'])
|
||||
"__Secure-next-auth.session-token=.*?;",
|
||||
message["params"]["headers"]["set-cookie"],
|
||||
)
|
||||
if cf_clearance_cookie and not self.cf_cookie_found:
|
||||
print("Found Cloudflare Cookie!")
|
||||
# remove the semicolon and 'cf_clearance=' from the string
|
||||
|
@ -513,46 +604,55 @@ class Chatbot:
|
|||
self.cf_clearance = raw_cf_cookie.split("=")[1][:-1]
|
||||
if self.verbose:
|
||||
print(
|
||||
self.GREEN+"Cloudflare Cookie: "+self.ENDCOLOR + self.cf_clearance)
|
||||
self.GREEN
|
||||
+ "Cloudflare Cookie: "
|
||||
+ self.ENDCOLOR
|
||||
+ self.cf_clearance
|
||||
)
|
||||
self.cf_cookie_found = True
|
||||
if session_cookie and not self.session_cookie_found:
|
||||
print("Found Session Token!")
|
||||
# remove the semicolon and '__Secure-next-auth.session-token=' from the string
|
||||
raw_session_cookie = session_cookie.group(0)
|
||||
self.session_token = raw_session_cookie.split("=")[
|
||||
1][:-1]
|
||||
self.session_token = raw_session_cookie.split("=")[1][:-1]
|
||||
self.session.cookies.set(
|
||||
"__Secure-next-auth.session-token", self.session_token)
|
||||
"__Secure-next-auth.session-token", self.session_token
|
||||
)
|
||||
if self.verbose:
|
||||
print(
|
||||
self.GREEN+"Session Token: "+self.ENDCOLOR + self.session_token)
|
||||
self.GREEN
|
||||
+ "Session Token: "
|
||||
+ self.ENDCOLOR
|
||||
+ self.session_token
|
||||
)
|
||||
self.session_cookie_found = True
|
||||
|
||||
def detect_user_agent(self, message):
|
||||
if 'params' in message:
|
||||
if 'headers' in message['params']:
|
||||
if 'user-agent' in message['params']['headers']:
|
||||
if "params" in message:
|
||||
if "headers" in message["params"]:
|
||||
if "user-agent" in message["params"]["headers"]:
|
||||
# Use regex to get the cookie for cf_clearance=*;
|
||||
user_agent = message['params']['headers']['user-agent']
|
||||
user_agent = message["params"]["headers"]["user-agent"]
|
||||
self.user_agent = user_agent
|
||||
self.agent_found = True
|
||||
self.refresh_headers(cf_clearance=self.cf_clearance,
|
||||
user_agent=self.user_agent)
|
||||
self.refresh_headers(cf_clearance=self.cf_clearance, user_agent=self.user_agent)
|
||||
|
||||
def refresh_headers(self, cf_clearance, user_agent):
|
||||
del self.session.cookies["cf_clearance"]
|
||||
self.session.headers.clear()
|
||||
self.session.cookies.set("cf_clearance", cf_clearance)
|
||||
self.session.headers.update({
|
||||
"Accept": "text/event-stream",
|
||||
"Authorization": "Bearer ",
|
||||
"Content-Type": "application/json",
|
||||
"User-Agent": user_agent,
|
||||
"X-Openai-Assistant-App-Id": "",
|
||||
"Connection": "close",
|
||||
"Accept-Language": "en-US,en;q=0.9",
|
||||
"Referer": "https://chat.openai.com/chat",
|
||||
})
|
||||
self.session.headers.update(
|
||||
{
|
||||
"Accept": "text/event-stream",
|
||||
"Authorization": "Bearer ",
|
||||
"Content-Type": "application/json",
|
||||
"User-Agent": user_agent,
|
||||
"X-Openai-Assistant-App-Id": "",
|
||||
"Connection": "close",
|
||||
"Accept-Language": "en-US,en;q=0.9",
|
||||
"Referer": "https://chat.openai.com/chat",
|
||||
}
|
||||
)
|
||||
|
||||
def rollback_conversation(self, num=1) -> None:
|
||||
"""
|
||||
|
|
|
@ -1,148 +1,18 @@
|
|||
# from typing import Any, List, Tuple
|
||||
|
||||
# import os
|
||||
# import sys
|
||||
# from importlib import reload
|
||||
# from pathlib import Path
|
||||
|
||||
# import dotenv
|
||||
# import requests
|
||||
|
||||
# HTTP_USERAGENT: dict[str, str] = {
|
||||
# "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.3"
|
||||
# }
|
||||
|
||||
# sys.path.append(str(Path(__file__).parent.parent.parent.parent) + "/utils/NLP")
|
||||
# sys.path.append(str(Path(__file__).parent.parent.parent.parent) + "/utils")
|
||||
# sys.path.append(str(Path(__file__).parent.parent))
|
||||
|
||||
# import asyncio
|
||||
# import itertools
|
||||
# import re
|
||||
|
||||
# import aiohttp
|
||||
# import config
|
||||
# from bs4 import BeautifulSoup
|
||||
# from normalize import normalizer
|
||||
|
||||
# # from relevancy import filter_irrelevant
|
||||
# from sentencize import sentencizer
|
||||
# from urlextract import URLExtract
|
||||
# from adremover import AdRemover
|
||||
|
||||
|
||||
# class Google:
|
||||
# def __init__(
|
||||
# self: "Google",
|
||||
# query: str,
|
||||
# GOOGLE_SEARCH_API_KEY: str,
|
||||
# GOOGLE_SEARCH_ENGINE_ID: str,
|
||||
# ) -> None:
|
||||
# self.__GOOGLE_SEARCH_API_KEY: str = GOOGLE_SEARCH_API_KEY
|
||||
# self.__GOOGLE_SEARCH_ENGINE_ID: str = GOOGLE_SEARCH_ENGINE_ID
|
||||
|
||||
# # if environment keys are not given, assume it is in env
|
||||
# if GOOGLE_SEARCH_API_KEY == "":
|
||||
# self.__GOOGLE_SEARCH_API_KEY = str(os.environ.get("GOOGLE_SEARCH_API_KEY"))
|
||||
# if GOOGLE_SEARCH_ENGINE_ID == "":
|
||||
# self.__GOOGLE_SEARCH_ENGINE_ID = str(os.environ.get("GOOGLE_SEARCH_ENGINE_ID"))
|
||||
|
||||
# self.__num_res: int = 10
|
||||
# self.__query = query
|
||||
# self.__URL_EXTRACTOR: URLExtract = URLExtract()
|
||||
# self.__urls: list[str] = self.__URL_EXTRACTOR.find_urls(query)
|
||||
# self.__query = str(
|
||||
# re.sub(
|
||||
# r"\w+:\/{2}[\d\w-]+(\.[\d\w-]+)*(?:(?:\/[^\s/]*))*",
|
||||
# "",
|
||||
# str(self.__query),
|
||||
# )
|
||||
# )
|
||||
|
||||
# def __get_urls(self: "Google") -> None:
|
||||
# if self.__GOOGLE_SEARCH_API_KEY == "":
|
||||
# exit("ERROR: Google API Key not found")
|
||||
# if self.__GOOGLE_SEARCH_ENGINE_ID == "":
|
||||
# exit("ERROR: Google Search Engine Id not found")
|
||||
# response = requests.get(
|
||||
# "https://www.googleapis.com/customsearch/v1",
|
||||
# params={
|
||||
# "key": self.__GOOGLE_SEARCH_API_KEY,
|
||||
# "q": self.__query,
|
||||
# "cx": self.__GOOGLE_SEARCH_ENGINE_ID,
|
||||
# },
|
||||
# )
|
||||
# results = response.json()["items"]
|
||||
# for result in results:
|
||||
# self.__urls.append(result["link"])
|
||||
# if len(self.__urls) == self.__num_res:
|
||||
# break
|
||||
|
||||
# async def __fetch_url(self: "Google", session: Any, url: str) -> list[str]:
|
||||
# try:
|
||||
# async with session.get(url, headers=HTTP_USERAGENT) as response:
|
||||
# html = await response.text()
|
||||
# soup = BeautifulSoup(html, "html.parser")
|
||||
# text = soup.get_text()
|
||||
# normalized_text = normalizer(text)
|
||||
# sentences: list[str] = sentencizer(normalized_text)
|
||||
# return sentences
|
||||
# except aiohttp.ClientConnectorError:
|
||||
# return [""]
|
||||
# except Exception:
|
||||
# return [""]
|
||||
|
||||
# async def __fetch_urls(self: "Google", urls: list[str]) -> Any:
|
||||
# async with aiohttp.ClientSession() as session:
|
||||
# tasks = [
|
||||
# asyncio.create_task(self.__fetch_url(session, url)) for url in urls
|
||||
# ]
|
||||
# results = await asyncio.gather(*tasks)
|
||||
# return results
|
||||
|
||||
# def __flatten(self: Any, a: list[list[Any]]) -> list[Any]:
|
||||
# return list(itertools.chain(*a))
|
||||
|
||||
# def __get_urls_contents(self: "Google") -> None:
|
||||
# loop = asyncio.new_event_loop()
|
||||
# asyncio.set_event_loop(loop)
|
||||
# contents = loop.run_until_complete(self.__fetch_urls(self.__urls))
|
||||
# loop.close()
|
||||
# self.__content = self.__flatten(contents)
|
||||
|
||||
# def google(self: "Google") -> tuple[list[str], list[str]]:
|
||||
# self.__get_urls()
|
||||
# self.__get_urls_contents()
|
||||
# return (self.__content, self.__urls)
|
||||
|
||||
|
||||
# """
|
||||
# Timing:
|
||||
# import time
|
||||
# start_time = time.time()
|
||||
# google("Who is Elon Musk")
|
||||
# print("--- %s seconds ---" % (time.time() - start_time))
|
||||
|
||||
# # Results:
|
||||
|
||||
# # --- 2.2230100631713867 seconds ---
|
||||
|
||||
# # ________________________________________________________
|
||||
# # Executed in 4.73 secs fish external
|
||||
# # usr time 3.35 secs 85.00 micros 3.35 secs
|
||||
# # sys time 1.86 secs 956.00 micros 1.86 secs
|
||||
# """
|
||||
|
||||
from typing import Any, Dict, List, Tuple
|
||||
from typing import Any, List, Tuple
|
||||
|
||||
import asyncio
|
||||
import concurrent.futures
|
||||
import itertools
|
||||
import os
|
||||
import pickle
|
||||
import re
|
||||
import sys
|
||||
from importlib import reload
|
||||
from pathlib import Path
|
||||
|
||||
import aiohttp
|
||||
import dotenv
|
||||
import requests
|
||||
from bs4 import BeautifulSoup
|
||||
|
||||
HTTP_USERAGENT: dict[str, str] = {
|
||||
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.3"
|
||||
|
@ -152,15 +22,8 @@ sys.path.append(str(Path(__file__).parent.parent.parent.parent) + "/utils/NLP")
|
|||
sys.path.append(str(Path(__file__).parent.parent.parent.parent) + "/utils")
|
||||
sys.path.append(str(Path(__file__).parent.parent))
|
||||
|
||||
import asyncio
|
||||
import concurrent.futures
|
||||
import itertools
|
||||
import re
|
||||
|
||||
import aiohttp
|
||||
import config
|
||||
from adremover import AdRemover
|
||||
from bs4 import BeautifulSoup
|
||||
from keywords import get_keywords
|
||||
from normalize import normalizer
|
||||
from relevancy import filter_relevant
|
||||
|
@ -201,7 +64,7 @@ class Google:
|
|||
)
|
||||
self.__content: list[str] = []
|
||||
ADBLOCK_RULES = [
|
||||
"https://easylist-downloads.adblockplus.org/ruadlist+easylist.txt",
|
||||
"https://easyList-downloads.adblockplus.org/ruadList+easyList.txt",
|
||||
"https://filters.adtidy.org/extension/chromium/filters/1.txt",
|
||||
]
|
||||
self.__ad_remover = AdRemover(ADBLOCK_RULES)
|
||||
|
@ -226,39 +89,37 @@ class Google:
|
|||
if len(self.__urls) == self.__num_res:
|
||||
break
|
||||
|
||||
async def __fetch_url(self: "Google", session: Any, url: str) -> list[str]:
|
||||
def __flatten(self: Any, a: list[list[Any]]) -> list[Any]:
|
||||
return list(itertools.chain(*a))
|
||||
|
||||
async def __fetch_url(self: "Google", session: Any, url: str) -> str:
|
||||
try:
|
||||
async with session.get(url, headers=HTTP_USERAGENT) as response:
|
||||
html = await response.text()
|
||||
html = self.__ad_remover.remove_ads(html)
|
||||
# html = self.__ad_remover.remove_ads(html)
|
||||
soup = BeautifulSoup(html, "html.parser")
|
||||
text = soup.get_text()
|
||||
normalized_text = normalizer(text)
|
||||
sentences: list[str] = sentencizer(normalized_text)
|
||||
return sentences
|
||||
except aiohttp.ClientConnectorError:
|
||||
return [""]
|
||||
sentence: str = str(" ".join(sentences))
|
||||
return sentence
|
||||
except Exception:
|
||||
return [""]
|
||||
error: str = ""
|
||||
return error
|
||||
|
||||
async def __fetch_urls(self: "Google", urls: list[str]) -> Any:
|
||||
async def __fetch_urls(self: "Google", urls: list[str]) -> list[str]:
|
||||
async with aiohttp.ClientSession() as session:
|
||||
tasks = [
|
||||
asyncio.create_task(self.__fetch_url(session, url)) for url in urls
|
||||
]
|
||||
results = await asyncio.gather(*tasks)
|
||||
results: list[str] = await asyncio.gather(*tasks)
|
||||
return results
|
||||
|
||||
def __flatten(self: Any, a: list[list[Any]]) -> list[Any]:
|
||||
return list(itertools.chain(*a))
|
||||
|
||||
def __get_urls_contents(self: "Google") -> None:
|
||||
loop = asyncio.new_event_loop()
|
||||
asyncio.set_event_loop(loop)
|
||||
contents = loop.run_until_complete(self.__fetch_urls(self.__urls))
|
||||
self.__content = loop.run_until_complete(self.__fetch_urls(self.__urls))
|
||||
loop.close()
|
||||
self.__content = self.__flatten(contents)
|
||||
self.__content = [str(x) for x in self.__content]
|
||||
|
||||
def __filter_irrelevant_processing(self: "Google") -> None:
|
||||
with concurrent.futures.ThreadPoolExecutor(max_workers=500) as executor:
|
||||
|
@ -276,7 +137,7 @@ class Google:
|
|||
self.__get_urls_contents()
|
||||
if filter_irrelevant:
|
||||
self.__filter_irrelevant_processing()
|
||||
results: tuple[list[str], list[str]] = (self.__content, self.__urls)
|
||||
results: tuple[list[str], list[str]] = (self.__content[0], self.__urls) # type: ignore
|
||||
return results
|
||||
|
||||
|
||||
|
|
|
@ -31,127 +31,61 @@ testing = ["datasets", "deepspeed (<0.7.0)", "evaluate", "parameterized", "pytes
|
|||
|
||||
[[package]]
|
||||
name = "aiohttp"
|
||||
version = "3.8.3"
|
||||
version = "3.7.4.post0"
|
||||
description = "Async http client/server framework (asyncio)"
|
||||
category = "main"
|
||||
optional = false
|
||||
python-versions = ">=3.6"
|
||||
files = [
|
||||
{file = "aiohttp-3.8.3-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:ba71c9b4dcbb16212f334126cc3d8beb6af377f6703d9dc2d9fb3874fd667ee9"},
|
||||
{file = "aiohttp-3.8.3-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:d24b8bb40d5c61ef2d9b6a8f4528c2f17f1c5d2d31fed62ec860f6006142e83e"},
|
||||
{file = "aiohttp-3.8.3-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:f88df3a83cf9df566f171adba39d5bd52814ac0b94778d2448652fc77f9eb491"},
|
||||
{file = "aiohttp-3.8.3-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b97decbb3372d4b69e4d4c8117f44632551c692bb1361b356a02b97b69e18a62"},
|
||||
{file = "aiohttp-3.8.3-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:309aa21c1d54b8ef0723181d430347d7452daaff93e8e2363db8e75c72c2fb2d"},
|
||||
{file = "aiohttp-3.8.3-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:ad5383a67514e8e76906a06741febd9126fc7c7ff0f599d6fcce3e82b80d026f"},
|
||||
{file = "aiohttp-3.8.3-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:20acae4f268317bb975671e375493dbdbc67cddb5f6c71eebdb85b34444ac46b"},
|
||||
{file = "aiohttp-3.8.3-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:05a3c31c6d7cd08c149e50dc7aa2568317f5844acd745621983380597f027a18"},
|
||||
{file = "aiohttp-3.8.3-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:d6f76310355e9fae637c3162936e9504b4767d5c52ca268331e2756e54fd4ca5"},
|
||||
{file = "aiohttp-3.8.3-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:256deb4b29fe5e47893fa32e1de2d73c3afe7407738bd3c63829874661d4822d"},
|
||||
{file = "aiohttp-3.8.3-cp310-cp310-musllinux_1_1_ppc64le.whl", hash = "sha256:5c59fcd80b9049b49acd29bd3598cada4afc8d8d69bd4160cd613246912535d7"},
|
||||
{file = "aiohttp-3.8.3-cp310-cp310-musllinux_1_1_s390x.whl", hash = "sha256:059a91e88f2c00fe40aed9031b3606c3f311414f86a90d696dd982e7aec48142"},
|
||||
{file = "aiohttp-3.8.3-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:2feebbb6074cdbd1ac276dbd737b40e890a1361b3cc30b74ac2f5e24aab41f7b"},
|
||||
{file = "aiohttp-3.8.3-cp310-cp310-win32.whl", hash = "sha256:5bf651afd22d5f0c4be16cf39d0482ea494f5c88f03e75e5fef3a85177fecdeb"},
|
||||
{file = "aiohttp-3.8.3-cp310-cp310-win_amd64.whl", hash = "sha256:653acc3880459f82a65e27bd6526e47ddf19e643457d36a2250b85b41a564715"},
|
||||
{file = "aiohttp-3.8.3-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:86fc24e58ecb32aee09f864cb11bb91bc4c1086615001647dbfc4dc8c32f4008"},
|
||||
{file = "aiohttp-3.8.3-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:75e14eac916f024305db517e00a9252714fce0abcb10ad327fb6dcdc0d060f1d"},
|
||||
{file = "aiohttp-3.8.3-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:d1fde0f44029e02d02d3993ad55ce93ead9bb9b15c6b7ccd580f90bd7e3de476"},
|
||||
{file = "aiohttp-3.8.3-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4ab94426ddb1ecc6a0b601d832d5d9d421820989b8caa929114811369673235c"},
|
||||
{file = "aiohttp-3.8.3-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:89d2e02167fa95172c017732ed7725bc8523c598757f08d13c5acca308e1a061"},
|
||||
{file = "aiohttp-3.8.3-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:02f9a2c72fc95d59b881cf38a4b2be9381b9527f9d328771e90f72ac76f31ad8"},
|
||||
{file = "aiohttp-3.8.3-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9c7149272fb5834fc186328e2c1fa01dda3e1fa940ce18fded6d412e8f2cf76d"},
|
||||
{file = "aiohttp-3.8.3-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:512bd5ab136b8dc0ffe3fdf2dfb0c4b4f49c8577f6cae55dca862cd37a4564e2"},
|
||||
{file = "aiohttp-3.8.3-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:7018ecc5fe97027214556afbc7c502fbd718d0740e87eb1217b17efd05b3d276"},
|
||||
{file = "aiohttp-3.8.3-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:88c70ed9da9963d5496d38320160e8eb7e5f1886f9290475a881db12f351ab5d"},
|
||||
{file = "aiohttp-3.8.3-cp311-cp311-musllinux_1_1_ppc64le.whl", hash = "sha256:da22885266bbfb3f78218dc40205fed2671909fbd0720aedba39b4515c038091"},
|
||||
{file = "aiohttp-3.8.3-cp311-cp311-musllinux_1_1_s390x.whl", hash = "sha256:e65bc19919c910127c06759a63747ebe14f386cda573d95bcc62b427ca1afc73"},
|
||||
{file = "aiohttp-3.8.3-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:08c78317e950e0762c2983f4dd58dc5e6c9ff75c8a0efeae299d363d439c8e34"},
|
||||
{file = "aiohttp-3.8.3-cp311-cp311-win32.whl", hash = "sha256:45d88b016c849d74ebc6f2b6e8bc17cabf26e7e40c0661ddd8fae4c00f015697"},
|
||||
{file = "aiohttp-3.8.3-cp311-cp311-win_amd64.whl", hash = "sha256:96372fc29471646b9b106ee918c8eeb4cca423fcbf9a34daa1b93767a88a2290"},
|
||||
{file = "aiohttp-3.8.3-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:c971bf3786b5fad82ce5ad570dc6ee420f5b12527157929e830f51c55dc8af77"},
|
||||
{file = "aiohttp-3.8.3-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ff25f48fc8e623d95eca0670b8cc1469a83783c924a602e0fbd47363bb54aaca"},
|
||||
{file = "aiohttp-3.8.3-cp36-cp36m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:e381581b37db1db7597b62a2e6b8b57c3deec95d93b6d6407c5b61ddc98aca6d"},
|
||||
{file = "aiohttp-3.8.3-cp36-cp36m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:db19d60d846283ee275d0416e2a23493f4e6b6028825b51290ac05afc87a6f97"},
|
||||
{file = "aiohttp-3.8.3-cp36-cp36m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:25892c92bee6d9449ffac82c2fe257f3a6f297792cdb18ad784737d61e7a9a85"},
|
||||
{file = "aiohttp-3.8.3-cp36-cp36m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:398701865e7a9565d49189f6c90868efaca21be65c725fc87fc305906be915da"},
|
||||
{file = "aiohttp-3.8.3-cp36-cp36m-musllinux_1_1_aarch64.whl", hash = "sha256:4a4fbc769ea9b6bd97f4ad0b430a6807f92f0e5eb020f1e42ece59f3ecfc4585"},
|
||||
{file = "aiohttp-3.8.3-cp36-cp36m-musllinux_1_1_i686.whl", hash = "sha256:b29bfd650ed8e148f9c515474a6ef0ba1090b7a8faeee26b74a8ff3b33617502"},
|
||||
{file = "aiohttp-3.8.3-cp36-cp36m-musllinux_1_1_ppc64le.whl", hash = "sha256:1e56b9cafcd6531bab5d9b2e890bb4937f4165109fe98e2b98ef0dcfcb06ee9d"},
|
||||
{file = "aiohttp-3.8.3-cp36-cp36m-musllinux_1_1_s390x.whl", hash = "sha256:ec40170327d4a404b0d91855d41bfe1fe4b699222b2b93e3d833a27330a87a6d"},
|
||||
{file = "aiohttp-3.8.3-cp36-cp36m-musllinux_1_1_x86_64.whl", hash = "sha256:2df5f139233060578d8c2c975128fb231a89ca0a462b35d4b5fcf7c501ebdbe1"},
|
||||
{file = "aiohttp-3.8.3-cp36-cp36m-win32.whl", hash = "sha256:f973157ffeab5459eefe7b97a804987876dd0a55570b8fa56b4e1954bf11329b"},
|
||||
{file = "aiohttp-3.8.3-cp36-cp36m-win_amd64.whl", hash = "sha256:437399385f2abcd634865705bdc180c8314124b98299d54fe1d4c8990f2f9494"},
|
||||
{file = "aiohttp-3.8.3-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:09e28f572b21642128ef31f4e8372adb6888846f32fecb288c8b0457597ba61a"},
|
||||
{file = "aiohttp-3.8.3-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6f3553510abdbec67c043ca85727396ceed1272eef029b050677046d3387be8d"},
|
||||
{file = "aiohttp-3.8.3-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:e168a7560b7c61342ae0412997b069753f27ac4862ec7867eff74f0fe4ea2ad9"},
|
||||
{file = "aiohttp-3.8.3-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:db4c979b0b3e0fa7e9e69ecd11b2b3174c6963cebadeecfb7ad24532ffcdd11a"},
|
||||
{file = "aiohttp-3.8.3-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e164e0a98e92d06da343d17d4e9c4da4654f4a4588a20d6c73548a29f176abe2"},
|
||||
{file = "aiohttp-3.8.3-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:e8a78079d9a39ca9ca99a8b0ac2fdc0c4d25fc80c8a8a82e5c8211509c523363"},
|
||||
{file = "aiohttp-3.8.3-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:21b30885a63c3f4ff5b77a5d6caf008b037cb521a5f33eab445dc566f6d092cc"},
|
||||
{file = "aiohttp-3.8.3-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:4b0f30372cef3fdc262f33d06e7b411cd59058ce9174ef159ad938c4a34a89da"},
|
||||
{file = "aiohttp-3.8.3-cp37-cp37m-musllinux_1_1_ppc64le.whl", hash = "sha256:8135fa153a20d82ffb64f70a1b5c2738684afa197839b34cc3e3c72fa88d302c"},
|
||||
{file = "aiohttp-3.8.3-cp37-cp37m-musllinux_1_1_s390x.whl", hash = "sha256:ad61a9639792fd790523ba072c0555cd6be5a0baf03a49a5dd8cfcf20d56df48"},
|
||||
{file = "aiohttp-3.8.3-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:978b046ca728073070e9abc074b6299ebf3501e8dee5e26efacb13cec2b2dea0"},
|
||||
{file = "aiohttp-3.8.3-cp37-cp37m-win32.whl", hash = "sha256:0d2c6d8c6872df4a6ec37d2ede71eff62395b9e337b4e18efd2177de883a5033"},
|
||||
{file = "aiohttp-3.8.3-cp37-cp37m-win_amd64.whl", hash = "sha256:21d69797eb951f155026651f7e9362877334508d39c2fc37bd04ff55b2007091"},
|
||||
{file = "aiohttp-3.8.3-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:2ca9af5f8f5812d475c5259393f52d712f6d5f0d7fdad9acdb1107dd9e3cb7eb"},
|
||||
{file = "aiohttp-3.8.3-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:1d90043c1882067f1bd26196d5d2db9aa6d268def3293ed5fb317e13c9413ea4"},
|
||||
{file = "aiohttp-3.8.3-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:d737fc67b9a970f3234754974531dc9afeea11c70791dcb7db53b0cf81b79784"},
|
||||
{file = "aiohttp-3.8.3-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ebf909ea0a3fc9596e40d55d8000702a85e27fd578ff41a5500f68f20fd32e6c"},
|
||||
{file = "aiohttp-3.8.3-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:5835f258ca9f7c455493a57ee707b76d2d9634d84d5d7f62e77be984ea80b849"},
|
||||
{file = "aiohttp-3.8.3-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:da37dcfbf4b7f45d80ee386a5f81122501ec75672f475da34784196690762f4b"},
|
||||
{file = "aiohttp-3.8.3-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:87f44875f2804bc0511a69ce44a9595d5944837a62caecc8490bbdb0e18b1342"},
|
||||
{file = "aiohttp-3.8.3-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:527b3b87b24844ea7865284aabfab08eb0faf599b385b03c2aa91fc6edd6e4b6"},
|
||||
{file = "aiohttp-3.8.3-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:d5ba88df9aa5e2f806650fcbeedbe4f6e8736e92fc0e73b0400538fd25a4dd96"},
|
||||
{file = "aiohttp-3.8.3-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:e7b8813be97cab8cb52b1375f41f8e6804f6507fe4660152e8ca5c48f0436017"},
|
||||
{file = "aiohttp-3.8.3-cp38-cp38-musllinux_1_1_ppc64le.whl", hash = "sha256:2dea10edfa1a54098703cb7acaa665c07b4e7568472a47f4e64e6319d3821ccf"},
|
||||
{file = "aiohttp-3.8.3-cp38-cp38-musllinux_1_1_s390x.whl", hash = "sha256:713d22cd9643ba9025d33c4af43943c7a1eb8547729228de18d3e02e278472b6"},
|
||||
{file = "aiohttp-3.8.3-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:2d252771fc85e0cf8da0b823157962d70639e63cb9b578b1dec9868dd1f4f937"},
|
||||
{file = "aiohttp-3.8.3-cp38-cp38-win32.whl", hash = "sha256:66bd5f950344fb2b3dbdd421aaa4e84f4411a1a13fca3aeb2bcbe667f80c9f76"},
|
||||
{file = "aiohttp-3.8.3-cp38-cp38-win_amd64.whl", hash = "sha256:84b14f36e85295fe69c6b9789b51a0903b774046d5f7df538176516c3e422446"},
|
||||
{file = "aiohttp-3.8.3-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:16c121ba0b1ec2b44b73e3a8a171c4f999b33929cd2397124a8c7fcfc8cd9e06"},
|
||||
{file = "aiohttp-3.8.3-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:8d6aaa4e7155afaf994d7924eb290abbe81a6905b303d8cb61310a2aba1c68ba"},
|
||||
{file = "aiohttp-3.8.3-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:43046a319664a04b146f81b40e1545d4c8ac7b7dd04c47e40bf09f65f2437346"},
|
||||
{file = "aiohttp-3.8.3-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:599418aaaf88a6d02a8c515e656f6faf3d10618d3dd95866eb4436520096c84b"},
|
||||
{file = "aiohttp-3.8.3-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:92a2964319d359f494f16011e23434f6f8ef0434acd3cf154a6b7bec511e2fb7"},
|
||||
{file = "aiohttp-3.8.3-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:73a4131962e6d91109bca6536416aa067cf6c4efb871975df734f8d2fd821b37"},
|
||||
{file = "aiohttp-3.8.3-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:598adde339d2cf7d67beaccda3f2ce7c57b3b412702f29c946708f69cf8222aa"},
|
||||
{file = "aiohttp-3.8.3-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:75880ed07be39beff1881d81e4a907cafb802f306efd6d2d15f2b3c69935f6fb"},
|
||||
{file = "aiohttp-3.8.3-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:a0239da9fbafd9ff82fd67c16704a7d1bccf0d107a300e790587ad05547681c8"},
|
||||
{file = "aiohttp-3.8.3-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:4e3a23ec214e95c9fe85a58470b660efe6534b83e6cbe38b3ed52b053d7cb6ad"},
|
||||
{file = "aiohttp-3.8.3-cp39-cp39-musllinux_1_1_ppc64le.whl", hash = "sha256:47841407cc89a4b80b0c52276f3cc8138bbbfba4b179ee3acbd7d77ae33f7ac4"},
|
||||
{file = "aiohttp-3.8.3-cp39-cp39-musllinux_1_1_s390x.whl", hash = "sha256:54d107c89a3ebcd13228278d68f1436d3f33f2dd2af5415e3feaeb1156e1a62c"},
|
||||
{file = "aiohttp-3.8.3-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:c37c5cce780349d4d51739ae682dec63573847a2a8dcb44381b174c3d9c8d403"},
|
||||
{file = "aiohttp-3.8.3-cp39-cp39-win32.whl", hash = "sha256:f178d2aadf0166be4df834c4953da2d7eef24719e8aec9a65289483eeea9d618"},
|
||||
{file = "aiohttp-3.8.3-cp39-cp39-win_amd64.whl", hash = "sha256:88e5be56c231981428f4f506c68b6a46fa25c4123a2e86d156c58a8369d31ab7"},
|
||||
{file = "aiohttp-3.8.3.tar.gz", hash = "sha256:3828fb41b7203176b82fe5d699e0d845435f2374750a44b480ea6b930f6be269"},
|
||||
{file = "aiohttp-3.7.4.post0-cp36-cp36m-macosx_10_14_x86_64.whl", hash = "sha256:3cf75f7cdc2397ed4442594b935a11ed5569961333d49b7539ea741be2cc79d5"},
|
||||
{file = "aiohttp-3.7.4.post0-cp36-cp36m-manylinux1_i686.whl", hash = "sha256:4b302b45040890cea949ad092479e01ba25911a15e648429c7c5aae9650c67a8"},
|
||||
{file = "aiohttp-3.7.4.post0-cp36-cp36m-manylinux2014_aarch64.whl", hash = "sha256:fe60131d21b31fd1a14bd43e6bb88256f69dfc3188b3a89d736d6c71ed43ec95"},
|
||||
{file = "aiohttp-3.7.4.post0-cp36-cp36m-manylinux2014_i686.whl", hash = "sha256:393f389841e8f2dfc86f774ad22f00923fdee66d238af89b70ea314c4aefd290"},
|
||||
{file = "aiohttp-3.7.4.post0-cp36-cp36m-manylinux2014_ppc64le.whl", hash = "sha256:c6e9dcb4cb338d91a73f178d866d051efe7c62a7166653a91e7d9fb18274058f"},
|
||||
{file = "aiohttp-3.7.4.post0-cp36-cp36m-manylinux2014_s390x.whl", hash = "sha256:5df68496d19f849921f05f14f31bd6ef53ad4b00245da3195048c69934521809"},
|
||||
{file = "aiohttp-3.7.4.post0-cp36-cp36m-manylinux2014_x86_64.whl", hash = "sha256:0563c1b3826945eecd62186f3f5c7d31abb7391fedc893b7e2b26303b5a9f3fe"},
|
||||
{file = "aiohttp-3.7.4.post0-cp36-cp36m-win32.whl", hash = "sha256:3d78619672183be860b96ed96f533046ec97ca067fd46ac1f6a09cd9b7484287"},
|
||||
{file = "aiohttp-3.7.4.post0-cp36-cp36m-win_amd64.whl", hash = "sha256:f705e12750171c0ab4ef2a3c76b9a4024a62c4103e3a55dd6f99265b9bc6fcfc"},
|
||||
{file = "aiohttp-3.7.4.post0-cp37-cp37m-macosx_10_14_x86_64.whl", hash = "sha256:230a8f7e24298dea47659251abc0fd8b3c4e38a664c59d4b89cca7f6c09c9e87"},
|
||||
{file = "aiohttp-3.7.4.post0-cp37-cp37m-manylinux1_i686.whl", hash = "sha256:2e19413bf84934d651344783c9f5e22dee452e251cfd220ebadbed2d9931dbf0"},
|
||||
{file = "aiohttp-3.7.4.post0-cp37-cp37m-manylinux2014_aarch64.whl", hash = "sha256:e4b2b334e68b18ac9817d828ba44d8fcb391f6acb398bcc5062b14b2cbeac970"},
|
||||
{file = "aiohttp-3.7.4.post0-cp37-cp37m-manylinux2014_i686.whl", hash = "sha256:d012ad7911653a906425d8473a1465caa9f8dea7fcf07b6d870397b774ea7c0f"},
|
||||
{file = "aiohttp-3.7.4.post0-cp37-cp37m-manylinux2014_ppc64le.whl", hash = "sha256:40eced07f07a9e60e825554a31f923e8d3997cfc7fb31dbc1328c70826e04cde"},
|
||||
{file = "aiohttp-3.7.4.post0-cp37-cp37m-manylinux2014_s390x.whl", hash = "sha256:209b4a8ee987eccc91e2bd3ac36adee0e53a5970b8ac52c273f7f8fd4872c94c"},
|
||||
{file = "aiohttp-3.7.4.post0-cp37-cp37m-manylinux2014_x86_64.whl", hash = "sha256:14762875b22d0055f05d12abc7f7d61d5fd4fe4642ce1a249abdf8c700bf1fd8"},
|
||||
{file = "aiohttp-3.7.4.post0-cp37-cp37m-win32.whl", hash = "sha256:7615dab56bb07bff74bc865307aeb89a8bfd9941d2ef9d817b9436da3a0ea54f"},
|
||||
{file = "aiohttp-3.7.4.post0-cp37-cp37m-win_amd64.whl", hash = "sha256:d9e13b33afd39ddeb377eff2c1c4f00544e191e1d1dee5b6c51ddee8ea6f0cf5"},
|
||||
{file = "aiohttp-3.7.4.post0-cp38-cp38-macosx_10_14_x86_64.whl", hash = "sha256:547da6cacac20666422d4882cfcd51298d45f7ccb60a04ec27424d2f36ba3eaf"},
|
||||
{file = "aiohttp-3.7.4.post0-cp38-cp38-manylinux1_i686.whl", hash = "sha256:af9aa9ef5ba1fd5b8c948bb11f44891968ab30356d65fd0cc6707d989cd521df"},
|
||||
{file = "aiohttp-3.7.4.post0-cp38-cp38-manylinux2014_aarch64.whl", hash = "sha256:64322071e046020e8797117b3658b9c2f80e3267daec409b350b6a7a05041213"},
|
||||
{file = "aiohttp-3.7.4.post0-cp38-cp38-manylinux2014_i686.whl", hash = "sha256:bb437315738aa441251214dad17428cafda9cdc9729499f1d6001748e1d432f4"},
|
||||
{file = "aiohttp-3.7.4.post0-cp38-cp38-manylinux2014_ppc64le.whl", hash = "sha256:e54962802d4b8b18b6207d4a927032826af39395a3bd9196a5af43fc4e60b009"},
|
||||
{file = "aiohttp-3.7.4.post0-cp38-cp38-manylinux2014_s390x.whl", hash = "sha256:a00bb73540af068ca7390e636c01cbc4f644961896fa9363154ff43fd37af2f5"},
|
||||
{file = "aiohttp-3.7.4.post0-cp38-cp38-manylinux2014_x86_64.whl", hash = "sha256:79ebfc238612123a713a457d92afb4096e2148be17df6c50fb9bf7a81c2f8013"},
|
||||
{file = "aiohttp-3.7.4.post0-cp38-cp38-win32.whl", hash = "sha256:515dfef7f869a0feb2afee66b957cc7bbe9ad0cdee45aec7fdc623f4ecd4fb16"},
|
||||
{file = "aiohttp-3.7.4.post0-cp38-cp38-win_amd64.whl", hash = "sha256:114b281e4d68302a324dd33abb04778e8557d88947875cbf4e842c2c01a030c5"},
|
||||
{file = "aiohttp-3.7.4.post0-cp39-cp39-macosx_10_14_x86_64.whl", hash = "sha256:7b18b97cf8ee5452fa5f4e3af95d01d84d86d32c5e2bfa260cf041749d66360b"},
|
||||
{file = "aiohttp-3.7.4.post0-cp39-cp39-manylinux1_i686.whl", hash = "sha256:15492a6368d985b76a2a5fdd2166cddfea5d24e69eefed4630cbaae5c81d89bd"},
|
||||
{file = "aiohttp-3.7.4.post0-cp39-cp39-manylinux2014_aarch64.whl", hash = "sha256:bdb230b4943891321e06fc7def63c7aace16095be7d9cf3b1e01be2f10fba439"},
|
||||
{file = "aiohttp-3.7.4.post0-cp39-cp39-manylinux2014_i686.whl", hash = "sha256:cffe3ab27871bc3ea47df5d8f7013945712c46a3cc5a95b6bee15887f1675c22"},
|
||||
{file = "aiohttp-3.7.4.post0-cp39-cp39-manylinux2014_ppc64le.whl", hash = "sha256:f881853d2643a29e643609da57b96d5f9c9b93f62429dcc1cbb413c7d07f0e1a"},
|
||||
{file = "aiohttp-3.7.4.post0-cp39-cp39-manylinux2014_s390x.whl", hash = "sha256:a5ca29ee66f8343ed336816c553e82d6cade48a3ad702b9ffa6125d187e2dedb"},
|
||||
{file = "aiohttp-3.7.4.post0-cp39-cp39-manylinux2014_x86_64.whl", hash = "sha256:17c073de315745a1510393a96e680d20af8e67e324f70b42accbd4cb3315c9fb"},
|
||||
{file = "aiohttp-3.7.4.post0-cp39-cp39-win32.whl", hash = "sha256:932bb1ea39a54e9ea27fc9232163059a0b8855256f4052e776357ad9add6f1c9"},
|
||||
{file = "aiohttp-3.7.4.post0-cp39-cp39-win_amd64.whl", hash = "sha256:02f46fc0e3c5ac58b80d4d56eb0a7c7d97fcef69ace9326289fb9f1955e65cfe"},
|
||||
{file = "aiohttp-3.7.4.post0.tar.gz", hash = "sha256:493d3299ebe5f5a7c66b9819eacdcfbbaaf1a8e84911ddffcdc48888497afecf"},
|
||||
]
|
||||
|
||||
[package.dependencies]
|
||||
aiosignal = ">=1.1.2"
|
||||
async-timeout = ">=4.0.0a3,<5.0"
|
||||
async-timeout = ">=3.0,<4.0"
|
||||
attrs = ">=17.3.0"
|
||||
charset-normalizer = ">=2.0,<3.0"
|
||||
frozenlist = ">=1.1.1"
|
||||
chardet = ">=2.0,<5.0"
|
||||
multidict = ">=4.5,<7.0"
|
||||
typing-extensions = ">=3.6.5"
|
||||
yarl = ">=1.0,<2.0"
|
||||
|
||||
[package.extras]
|
||||
speedups = ["Brotli", "aiodns", "cchardet"]
|
||||
|
||||
[[package]]
|
||||
name = "aiosignal"
|
||||
version = "1.3.1"
|
||||
description = "aiosignal: a list of registered asynchronous callbacks"
|
||||
category = "main"
|
||||
optional = false
|
||||
python-versions = ">=3.7"
|
||||
files = [
|
||||
{file = "aiosignal-1.3.1-py3-none-any.whl", hash = "sha256:f8376fb07dd1e86a584e4fcdec80b36b7f81aac666ebc724e2c090300dd83b17"},
|
||||
{file = "aiosignal-1.3.1.tar.gz", hash = "sha256:54cd96e15e1649b75d6c87526a6ff0b6c1b0dd3459f43d9ca11d48c339b68cfc"},
|
||||
]
|
||||
|
||||
[package.dependencies]
|
||||
frozenlist = ">=1.1.0"
|
||||
speedups = ["aiodns", "brotlipy", "cchardet"]
|
||||
|
||||
[[package]]
|
||||
name = "anyascii"
|
||||
|
@ -199,14 +133,14 @@ files = [
|
|||
|
||||
[[package]]
|
||||
name = "async-timeout"
|
||||
version = "4.0.2"
|
||||
version = "3.0.1"
|
||||
description = "Timeout context manager for asyncio programs"
|
||||
category = "main"
|
||||
optional = false
|
||||
python-versions = ">=3.6"
|
||||
python-versions = ">=3.5.3"
|
||||
files = [
|
||||
{file = "async-timeout-4.0.2.tar.gz", hash = "sha256:2163e1640ddb52b7a8c80d0a67a08587e5d245cc9c553a74a847056bc2976b15"},
|
||||
{file = "async_timeout-4.0.2-py3-none-any.whl", hash = "sha256:8ca1e4fcf50d07413d66d1a5e416e42cfdf5851c981d679a09851a6853383b3c"},
|
||||
{file = "async-timeout-3.0.1.tar.gz", hash = "sha256:0c3c816a028d47f659d6ff5c745cb2acf1f966da1fe5c19c77a70282b25f4c5f"},
|
||||
{file = "async_timeout-3.0.1-py3-none-any.whl", hash = "sha256:4291ca197d287d274d0b6cb5d6f8f8f82d434ed288f962539ff18cc9012f9ea3"},
|
||||
]
|
||||
|
||||
[[package]]
|
||||
|
@ -460,21 +394,116 @@ files = [
|
|||
{file = "cfgv-3.3.1.tar.gz", hash = "sha256:f5a830efb9ce7a445376bb66ec94c638a9787422f96264c98edc6bdeed8ab736"},
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "chardet"
|
||||
version = "4.0.0"
|
||||
description = "Universal encoding detector for Python 2 and 3"
|
||||
category = "main"
|
||||
optional = false
|
||||
python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*"
|
||||
files = [
|
||||
{file = "chardet-4.0.0-py2.py3-none-any.whl", hash = "sha256:f864054d66fd9118f2e67044ac8981a54775ec5b67aed0441892edb553d21da5"},
|
||||
{file = "chardet-4.0.0.tar.gz", hash = "sha256:0d6f53a15db4120f2b08c94f11e7d93d2c911ee118b6b30a04ec3ee8310179fa"},
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "charset-normalizer"
|
||||
version = "2.1.1"
|
||||
version = "3.0.1"
|
||||
description = "The Real First Universal Charset Detector. Open, modern and actively maintained alternative to Chardet."
|
||||
category = "main"
|
||||
optional = false
|
||||
python-versions = ">=3.6.0"
|
||||
python-versions = "*"
|
||||
files = [
|
||||
{file = "charset-normalizer-2.1.1.tar.gz", hash = "sha256:5a3d016c7c547f69d6f81fb0db9449ce888b418b5b9952cc5e6e66843e9dd845"},
|
||||
{file = "charset_normalizer-2.1.1-py3-none-any.whl", hash = "sha256:83e9a75d1911279afd89352c68b45348559d1fc0506b054b346651b5e7fee29f"},
|
||||
{file = "charset-normalizer-3.0.1.tar.gz", hash = "sha256:ebea339af930f8ca5d7a699b921106c6e29c617fe9606fa7baa043c1cdae326f"},
|
||||
{file = "charset_normalizer-3.0.1-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:88600c72ef7587fe1708fd242b385b6ed4b8904976d5da0893e31df8b3480cb6"},
|
||||
{file = "charset_normalizer-3.0.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:c75ffc45f25324e68ab238cb4b5c0a38cd1c3d7f1fb1f72b5541de469e2247db"},
|
||||
{file = "charset_normalizer-3.0.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:db72b07027db150f468fbada4d85b3b2729a3db39178abf5c543b784c1254539"},
|
||||
{file = "charset_normalizer-3.0.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:62595ab75873d50d57323a91dd03e6966eb79c41fa834b7a1661ed043b2d404d"},
|
||||
{file = "charset_normalizer-3.0.1-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:ff6f3db31555657f3163b15a6b7c6938d08df7adbfc9dd13d9d19edad678f1e8"},
|
||||
{file = "charset_normalizer-3.0.1-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:772b87914ff1152b92a197ef4ea40efe27a378606c39446ded52c8f80f79702e"},
|
||||
{file = "charset_normalizer-3.0.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:70990b9c51340e4044cfc394a81f614f3f90d41397104d226f21e66de668730d"},
|
||||
{file = "charset_normalizer-3.0.1-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:292d5e8ba896bbfd6334b096e34bffb56161c81408d6d036a7dfa6929cff8783"},
|
||||
{file = "charset_normalizer-3.0.1-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:2edb64ee7bf1ed524a1da60cdcd2e1f6e2b4f66ef7c077680739f1641f62f555"},
|
||||
{file = "charset_normalizer-3.0.1-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:31a9ddf4718d10ae04d9b18801bd776693487cbb57d74cc3458a7673f6f34639"},
|
||||
{file = "charset_normalizer-3.0.1-cp310-cp310-musllinux_1_1_ppc64le.whl", hash = "sha256:44ba614de5361b3e5278e1241fda3dc1838deed864b50a10d7ce92983797fa76"},
|
||||
{file = "charset_normalizer-3.0.1-cp310-cp310-musllinux_1_1_s390x.whl", hash = "sha256:12db3b2c533c23ab812c2b25934f60383361f8a376ae272665f8e48b88e8e1c6"},
|
||||
{file = "charset_normalizer-3.0.1-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:c512accbd6ff0270939b9ac214b84fb5ada5f0409c44298361b2f5e13f9aed9e"},
|
||||
{file = "charset_normalizer-3.0.1-cp310-cp310-win32.whl", hash = "sha256:502218f52498a36d6bf5ea77081844017bf7982cdbe521ad85e64cabee1b608b"},
|
||||
{file = "charset_normalizer-3.0.1-cp310-cp310-win_amd64.whl", hash = "sha256:601f36512f9e28f029d9481bdaf8e89e5148ac5d89cffd3b05cd533eeb423b59"},
|
||||
{file = "charset_normalizer-3.0.1-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:0298eafff88c99982a4cf66ba2efa1128e4ddaca0b05eec4c456bbc7db691d8d"},
|
||||
{file = "charset_normalizer-3.0.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:a8d0fc946c784ff7f7c3742310cc8a57c5c6dc31631269876a88b809dbeff3d3"},
|
||||
{file = "charset_normalizer-3.0.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:87701167f2a5c930b403e9756fab1d31d4d4da52856143b609e30a1ce7160f3c"},
|
||||
{file = "charset_normalizer-3.0.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:14e76c0f23218b8f46c4d87018ca2e441535aed3632ca134b10239dfb6dadd6b"},
|
||||
{file = "charset_normalizer-3.0.1-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:0c0a590235ccd933d9892c627dec5bc7511ce6ad6c1011fdf5b11363022746c1"},
|
||||
{file = "charset_normalizer-3.0.1-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:8c7fe7afa480e3e82eed58e0ca89f751cd14d767638e2550c77a92a9e749c317"},
|
||||
{file = "charset_normalizer-3.0.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:79909e27e8e4fcc9db4addea88aa63f6423ebb171db091fb4373e3312cb6d603"},
|
||||
{file = "charset_normalizer-3.0.1-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:8ac7b6a045b814cf0c47f3623d21ebd88b3e8cf216a14790b455ea7ff0135d18"},
|
||||
{file = "charset_normalizer-3.0.1-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:72966d1b297c741541ca8cf1223ff262a6febe52481af742036a0b296e35fa5a"},
|
||||
{file = "charset_normalizer-3.0.1-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:f9d0c5c045a3ca9bedfc35dca8526798eb91a07aa7a2c0fee134c6c6f321cbd7"},
|
||||
{file = "charset_normalizer-3.0.1-cp311-cp311-musllinux_1_1_ppc64le.whl", hash = "sha256:5995f0164fa7df59db4746112fec3f49c461dd6b31b841873443bdb077c13cfc"},
|
||||
{file = "charset_normalizer-3.0.1-cp311-cp311-musllinux_1_1_s390x.whl", hash = "sha256:4a8fcf28c05c1f6d7e177a9a46a1c52798bfe2ad80681d275b10dcf317deaf0b"},
|
||||
{file = "charset_normalizer-3.0.1-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:761e8904c07ad053d285670f36dd94e1b6ab7f16ce62b9805c475b7aa1cffde6"},
|
||||
{file = "charset_normalizer-3.0.1-cp311-cp311-win32.whl", hash = "sha256:71140351489970dfe5e60fc621ada3e0f41104a5eddaca47a7acb3c1b851d6d3"},
|
||||
{file = "charset_normalizer-3.0.1-cp311-cp311-win_amd64.whl", hash = "sha256:9ab77acb98eba3fd2a85cd160851816bfce6871d944d885febf012713f06659c"},
|
||||
{file = "charset_normalizer-3.0.1-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:84c3990934bae40ea69a82034912ffe5a62c60bbf6ec5bc9691419641d7d5c9a"},
|
||||
{file = "charset_normalizer-3.0.1-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:74292fc76c905c0ef095fe11e188a32ebd03bc38f3f3e9bcb85e4e6db177b7ea"},
|
||||
{file = "charset_normalizer-3.0.1-cp36-cp36m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:c95a03c79bbe30eec3ec2b7f076074f4281526724c8685a42872974ef4d36b72"},
|
||||
{file = "charset_normalizer-3.0.1-cp36-cp36m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:f4c39b0e3eac288fedc2b43055cfc2ca7a60362d0e5e87a637beac5d801ef478"},
|
||||
{file = "charset_normalizer-3.0.1-cp36-cp36m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:df2c707231459e8a4028eabcd3cfc827befd635b3ef72eada84ab13b52e1574d"},
|
||||
{file = "charset_normalizer-3.0.1-cp36-cp36m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:93ad6d87ac18e2a90b0fe89df7c65263b9a99a0eb98f0a3d2e079f12a0735837"},
|
||||
{file = "charset_normalizer-3.0.1-cp36-cp36m-musllinux_1_1_aarch64.whl", hash = "sha256:59e5686dd847347e55dffcc191a96622f016bc0ad89105e24c14e0d6305acbc6"},
|
||||
{file = "charset_normalizer-3.0.1-cp36-cp36m-musllinux_1_1_i686.whl", hash = "sha256:cd6056167405314a4dc3c173943f11249fa0f1b204f8b51ed4bde1a9cd1834dc"},
|
||||
{file = "charset_normalizer-3.0.1-cp36-cp36m-musllinux_1_1_ppc64le.whl", hash = "sha256:083c8d17153ecb403e5e1eb76a7ef4babfc2c48d58899c98fcaa04833e7a2f9a"},
|
||||
{file = "charset_normalizer-3.0.1-cp36-cp36m-musllinux_1_1_s390x.whl", hash = "sha256:f5057856d21e7586765171eac8b9fc3f7d44ef39425f85dbcccb13b3ebea806c"},
|
||||
{file = "charset_normalizer-3.0.1-cp36-cp36m-musllinux_1_1_x86_64.whl", hash = "sha256:7eb33a30d75562222b64f569c642ff3dc6689e09adda43a082208397f016c39a"},
|
||||
{file = "charset_normalizer-3.0.1-cp36-cp36m-win32.whl", hash = "sha256:95dea361dd73757c6f1c0a1480ac499952c16ac83f7f5f4f84f0658a01b8ef41"},
|
||||
{file = "charset_normalizer-3.0.1-cp36-cp36m-win_amd64.whl", hash = "sha256:eaa379fcd227ca235d04152ca6704c7cb55564116f8bc52545ff357628e10602"},
|
||||
{file = "charset_normalizer-3.0.1-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:3e45867f1f2ab0711d60c6c71746ac53537f1684baa699f4f668d4c6f6ce8e14"},
|
||||
{file = "charset_normalizer-3.0.1-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:cadaeaba78750d58d3cc6ac4d1fd867da6fc73c88156b7a3212a3cd4819d679d"},
|
||||
{file = "charset_normalizer-3.0.1-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:911d8a40b2bef5b8bbae2e36a0b103f142ac53557ab421dc16ac4aafee6f53dc"},
|
||||
{file = "charset_normalizer-3.0.1-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:503e65837c71b875ecdd733877d852adbc465bd82c768a067badd953bf1bc5a3"},
|
||||
{file = "charset_normalizer-3.0.1-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a60332922359f920193b1d4826953c507a877b523b2395ad7bc716ddd386d866"},
|
||||
{file = "charset_normalizer-3.0.1-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:16a8663d6e281208d78806dbe14ee9903715361cf81f6d4309944e4d1e59ac5b"},
|
||||
{file = "charset_normalizer-3.0.1-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:a16418ecf1329f71df119e8a65f3aa68004a3f9383821edcb20f0702934d8087"},
|
||||
{file = "charset_normalizer-3.0.1-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:9d9153257a3f70d5f69edf2325357251ed20f772b12e593f3b3377b5f78e7ef8"},
|
||||
{file = "charset_normalizer-3.0.1-cp37-cp37m-musllinux_1_1_ppc64le.whl", hash = "sha256:02a51034802cbf38db3f89c66fb5d2ec57e6fe7ef2f4a44d070a593c3688667b"},
|
||||
{file = "charset_normalizer-3.0.1-cp37-cp37m-musllinux_1_1_s390x.whl", hash = "sha256:2e396d70bc4ef5325b72b593a72c8979999aa52fb8bcf03f701c1b03e1166918"},
|
||||
{file = "charset_normalizer-3.0.1-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:11b53acf2411c3b09e6af37e4b9005cba376c872503c8f28218c7243582df45d"},
|
||||
{file = "charset_normalizer-3.0.1-cp37-cp37m-win32.whl", hash = "sha256:0bf2dae5291758b6f84cf923bfaa285632816007db0330002fa1de38bfcb7154"},
|
||||
{file = "charset_normalizer-3.0.1-cp37-cp37m-win_amd64.whl", hash = "sha256:2c03cc56021a4bd59be889c2b9257dae13bf55041a3372d3295416f86b295fb5"},
|
||||
{file = "charset_normalizer-3.0.1-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:024e606be3ed92216e2b6952ed859d86b4cfa52cd5bc5f050e7dc28f9b43ec42"},
|
||||
{file = "charset_normalizer-3.0.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:4b0d02d7102dd0f997580b51edc4cebcf2ab6397a7edf89f1c73b586c614272c"},
|
||||
{file = "charset_normalizer-3.0.1-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:358a7c4cb8ba9b46c453b1dd8d9e431452d5249072e4f56cfda3149f6ab1405e"},
|
||||
{file = "charset_normalizer-3.0.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:81d6741ab457d14fdedc215516665050f3822d3e56508921cc7239f8c8e66a58"},
|
||||
{file = "charset_normalizer-3.0.1-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:8b8af03d2e37866d023ad0ddea594edefc31e827fee64f8de5611a1dbc373174"},
|
||||
{file = "charset_normalizer-3.0.1-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:9cf4e8ad252f7c38dd1f676b46514f92dc0ebeb0db5552f5f403509705e24753"},
|
||||
{file = "charset_normalizer-3.0.1-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e696f0dd336161fca9adbb846875d40752e6eba585843c768935ba5c9960722b"},
|
||||
{file = "charset_normalizer-3.0.1-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:c22d3fe05ce11d3671297dc8973267daa0f938b93ec716e12e0f6dee81591dc1"},
|
||||
{file = "charset_normalizer-3.0.1-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:109487860ef6a328f3eec66f2bf78b0b72400280d8f8ea05f69c51644ba6521a"},
|
||||
{file = "charset_normalizer-3.0.1-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:37f8febc8ec50c14f3ec9637505f28e58d4f66752207ea177c1d67df25da5aed"},
|
||||
{file = "charset_normalizer-3.0.1-cp38-cp38-musllinux_1_1_ppc64le.whl", hash = "sha256:f97e83fa6c25693c7a35de154681fcc257c1c41b38beb0304b9c4d2d9e164479"},
|
||||
{file = "charset_normalizer-3.0.1-cp38-cp38-musllinux_1_1_s390x.whl", hash = "sha256:a152f5f33d64a6be73f1d30c9cc82dfc73cec6477ec268e7c6e4c7d23c2d2291"},
|
||||
{file = "charset_normalizer-3.0.1-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:39049da0ffb96c8cbb65cbf5c5f3ca3168990adf3551bd1dee10c48fce8ae820"},
|
||||
{file = "charset_normalizer-3.0.1-cp38-cp38-win32.whl", hash = "sha256:4457ea6774b5611f4bed5eaa5df55f70abde42364d498c5134b7ef4c6958e20e"},
|
||||
{file = "charset_normalizer-3.0.1-cp38-cp38-win_amd64.whl", hash = "sha256:e62164b50f84e20601c1ff8eb55620d2ad25fb81b59e3cd776a1902527a788af"},
|
||||
{file = "charset_normalizer-3.0.1-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:8eade758719add78ec36dc13201483f8e9b5d940329285edcd5f70c0a9edbd7f"},
|
||||
{file = "charset_normalizer-3.0.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:8499ca8f4502af841f68135133d8258f7b32a53a1d594aa98cc52013fff55678"},
|
||||
{file = "charset_normalizer-3.0.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:3fc1c4a2ffd64890aebdb3f97e1278b0cc72579a08ca4de8cd2c04799a3a22be"},
|
||||
{file = "charset_normalizer-3.0.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:00d3ffdaafe92a5dc603cb9bd5111aaa36dfa187c8285c543be562e61b755f6b"},
|
||||
{file = "charset_normalizer-3.0.1-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:c2ac1b08635a8cd4e0cbeaf6f5e922085908d48eb05d44c5ae9eabab148512ca"},
|
||||
{file = "charset_normalizer-3.0.1-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:f6f45710b4459401609ebebdbcfb34515da4fc2aa886f95107f556ac69a9147e"},
|
||||
{file = "charset_normalizer-3.0.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3ae1de54a77dc0d6d5fcf623290af4266412a7c4be0b1ff7444394f03f5c54e3"},
|
||||
{file = "charset_normalizer-3.0.1-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:3b590df687e3c5ee0deef9fc8c547d81986d9a1b56073d82de008744452d6541"},
|
||||
{file = "charset_normalizer-3.0.1-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:ab5de034a886f616a5668aa5d098af2b5385ed70142090e2a31bcbd0af0fdb3d"},
|
||||
{file = "charset_normalizer-3.0.1-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:9cb3032517f1627cc012dbc80a8ec976ae76d93ea2b5feaa9d2a5b8882597579"},
|
||||
{file = "charset_normalizer-3.0.1-cp39-cp39-musllinux_1_1_ppc64le.whl", hash = "sha256:608862a7bf6957f2333fc54ab4399e405baad0163dc9f8d99cb236816db169d4"},
|
||||
{file = "charset_normalizer-3.0.1-cp39-cp39-musllinux_1_1_s390x.whl", hash = "sha256:0f438ae3532723fb6ead77e7c604be7c8374094ef4ee2c5e03a3a17f1fca256c"},
|
||||
{file = "charset_normalizer-3.0.1-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:356541bf4381fa35856dafa6a965916e54bed415ad8a24ee6de6e37deccf2786"},
|
||||
{file = "charset_normalizer-3.0.1-cp39-cp39-win32.whl", hash = "sha256:39cf9ed17fe3b1bc81f33c9ceb6ce67683ee7526e65fde1447c772afc54a1bb8"},
|
||||
{file = "charset_normalizer-3.0.1-cp39-cp39-win_amd64.whl", hash = "sha256:0a11e971ed097d24c534c037d298ad32c6ce81a45736d31e0ff0ad37ab437d59"},
|
||||
{file = "charset_normalizer-3.0.1-py3-none-any.whl", hash = "sha256:7e189e2e1d3ed2f4aebabd2d5b0f931e883676e51c7624826e0a4e5fe8a0bf24"},
|
||||
]
|
||||
|
||||
[package.extras]
|
||||
unicode-backport = ["unicodedata2"]
|
||||
|
||||
[[package]]
|
||||
name = "click"
|
||||
version = "8.1.3"
|
||||
|
@ -519,14 +548,14 @@ test = ["flake8 (==3.7.8)", "hypothesis (==3.55.3)"]
|
|||
|
||||
[[package]]
|
||||
name = "confection"
|
||||
version = "0.0.3"
|
||||
version = "0.0.4"
|
||||
description = "The sweetest config system for Python"
|
||||
category = "main"
|
||||
optional = false
|
||||
python-versions = ">=3.6"
|
||||
files = [
|
||||
{file = "confection-0.0.3-py3-none-any.whl", hash = "sha256:51af839c1240430421da2b248541ebc95f9d0ee385bcafa768b8acdbd2b0111d"},
|
||||
{file = "confection-0.0.3.tar.gz", hash = "sha256:4fec47190057c43c9acbecb8b1b87a9bf31c469caa0d6888a5b9384432fdba5a"},
|
||||
{file = "confection-0.0.4-py3-none-any.whl", hash = "sha256:aeac5919ba770c7b281aa5863bb6b0efed42568a7ad8ea26b6cb632154503fb2"},
|
||||
{file = "confection-0.0.4.tar.gz", hash = "sha256:b1ddf5885da635f0e260a40b339730806dfb1bd17d30e08764f35af841b04ecf"},
|
||||
]
|
||||
|
||||
[package.dependencies]
|
||||
|
@ -842,90 +871,6 @@ files = [
|
|||
docs = ["furo (>=2022.12.7)", "sphinx (>=5.3)", "sphinx-autodoc-typehints (>=1.19.5)"]
|
||||
testing = ["covdefaults (>=2.2.2)", "coverage (>=7.0.1)", "pytest (>=7.2)", "pytest-cov (>=4)", "pytest-timeout (>=2.1)"]
|
||||
|
||||
[[package]]
|
||||
name = "frozenlist"
|
||||
version = "1.3.3"
|
||||
description = "A list-like structure which implements collections.abc.MutableSequence"
|
||||
category = "main"
|
||||
optional = false
|
||||
python-versions = ">=3.7"
|
||||
files = [
|
||||
{file = "frozenlist-1.3.3-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:ff8bf625fe85e119553b5383ba0fb6aa3d0ec2ae980295aaefa552374926b3f4"},
|
||||
{file = "frozenlist-1.3.3-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:dfbac4c2dfcc082fcf8d942d1e49b6aa0766c19d3358bd86e2000bf0fa4a9cf0"},
|
||||
{file = "frozenlist-1.3.3-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:b1c63e8d377d039ac769cd0926558bb7068a1f7abb0f003e3717ee003ad85530"},
|
||||
{file = "frozenlist-1.3.3-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7fdfc24dcfce5b48109867c13b4cb15e4660e7bd7661741a391f821f23dfdca7"},
|
||||
{file = "frozenlist-1.3.3-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:2c926450857408e42f0bbc295e84395722ce74bae69a3b2aa2a65fe22cb14b99"},
|
||||
{file = "frozenlist-1.3.3-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:1841e200fdafc3d51f974d9d377c079a0694a8f06de2e67b48150328d66d5483"},
|
||||
{file = "frozenlist-1.3.3-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:f470c92737afa7d4c3aacc001e335062d582053d4dbe73cda126f2d7031068dd"},
|
||||
{file = "frozenlist-1.3.3-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:783263a4eaad7c49983fe4b2e7b53fa9770c136c270d2d4bbb6d2192bf4d9caf"},
|
||||
{file = "frozenlist-1.3.3-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:924620eef691990dfb56dc4709f280f40baee568c794b5c1885800c3ecc69816"},
|
||||
{file = "frozenlist-1.3.3-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:ae4dc05c465a08a866b7a1baf360747078b362e6a6dbeb0c57f234db0ef88ae0"},
|
||||