diff --git a/bbot/core/event/base.py b/bbot/core/event/base.py
index 83331b94d2..00a03aeed7 100644
--- a/bbot/core/event/base.py
+++ b/bbot/core/event/base.py
@@ -1247,6 +1247,10 @@ def _words(self):
return set()
+class OPEN_UDP_PORT(OPEN_TCP_PORT):
+ pass
+
+
class URL_UNVERIFIED(BaseEvent):
_status_code_regex = re.compile(r"^status-(\d{1,3})$")
diff --git a/bbot/modules/azure_tenant.py b/bbot/modules/azure_tenant.py
index f17911c86a..4a323fece3 100644
--- a/bbot/modules/azure_tenant.py
+++ b/bbot/modules/azure_tenant.py
@@ -1,6 +1,3 @@
-import regex as re
-from contextlib import suppress
-
from bbot.modules.base import BaseModule
@@ -9,116 +6,90 @@ class azure_tenant(BaseModule):
produced_events = ["DNS_NAME"]
flags = ["affiliates", "subdomain-enum", "cloud-enum", "passive", "safe"]
meta = {
- "description": "Query Azure for tenant sister domains",
+ "description": "Query Azure via azmap.dev for tenant sister domains",
"created_date": "2024-07-04",
"author": "@TheTechromancer",
}
- base_url = "https://autodiscover-s.outlook.com"
+ base_url = "https://azmap.dev/api/tenant"
in_scope_only = True
per_domain_only = True
async def setup(self):
self.processed = set()
- self.d_xml_regex = re.compile(r"([^<>/]*)", re.I)
return True
async def handle_event(self, event):
_, query = self.helpers.split_domain(event.data)
- domains, openid_config = await self.query(query)
-
- tenant_id = None
- authorization_endpoint = openid_config.get("authorization_endpoint", "")
- matches = await self.helpers.re.findall(self.helpers.regexes.uuid_regex, authorization_endpoint)
- if matches:
- tenant_id = matches[0]
-
- tenant_names = set()
- if domains:
- self.verbose(f'Found {len(domains):,} domains under tenant for "{query}": {", ".join(sorted(domains))}')
- for domain in domains:
+ tenant_data = await self.query(query)
+
+ if not tenant_data:
+ return
+
+ tenant_id = tenant_data.get("tenant_id")
+ tenant_name = tenant_data.get("tenant_name")
+ email_domains = tenant_data.get("email_domains", [])
+
+ if email_domains:
+ self.verbose(
+ f'Found {len(email_domains):,} domains under tenant for "{query}": {", ".join(sorted(email_domains))}'
+ )
+ for domain in email_domains:
if domain != query:
await self.emit_event(
domain,
"DNS_NAME",
parent=event,
tags=["affiliate", "azure-tenant"],
- context=f'{{module}} queried Outlook autodiscover for "{query}" and found {{event.type}}: {{event.data}}',
+ context=f'{{module}} queried azmap.dev for "{query}" and found {{event.type}}: {{event.data}}',
)
- # tenant names
- if domain.lower().endswith(".onmicrosoft.com"):
- tenantname = domain.split(".")[0].lower()
- if tenantname:
- tenant_names.add(tenantname)
-
- tenant_names = sorted(tenant_names)
- event_data = {"tenant-names": tenant_names, "domains": sorted(domains)}
+
+ # Build tenant names list (include the tenant name from the API)
+ tenant_names = []
+ if tenant_name:
+ tenant_names.append(tenant_name)
+
+ # Also extract tenant names from .onmicrosoft.com domains
+ for domain in email_domains:
+ if domain.lower().endswith(".onmicrosoft.com"):
+ tenantname = domain.split(".")[0].lower()
+ if tenantname and tenantname not in tenant_names:
+ tenant_names.append(tenantname)
+
+ event_data = {"tenant-names": tenant_names, "domains": sorted(email_domains)}
tenant_names_str = ",".join(tenant_names)
- if tenant_id is not None:
+ if tenant_id:
event_data["tenant-id"] = tenant_id
await self.emit_event(
event_data,
"AZURE_TENANT",
parent=event,
- context=f'{{module}} queried Outlook autodiscover for "{query}" and found {{event.type}}: {tenant_names_str}',
+ context=f'{{module}} queried azmap.dev for "{query}" and found {{event.type}}: {tenant_names_str}',
)
async def query(self, domain):
- url = f"{self.base_url}/autodiscover/autodiscover.svc"
- data = f"""
-
-
- http://schemas.microsoft.com/exchange/2010/Autodiscover/Autodiscover/GetFederationInformation
- https://autodiscover-s.outlook.com/autodiscover/autodiscover.svc
-
- http://www.w3.org/2005/08/addressing/anonymous
-
-
-
-
-
- {domain}
-
-
-
-"""
-
- headers = {
- "Content-Type": "text/xml; charset=utf-8",
- "SOAPAction": '"http://schemas.microsoft.com/exchange/2010/Autodiscover/Autodiscover/GetFederationInformation"',
- "User-Agent": "AutodiscoverClient",
- "Accept-Encoding": "identity",
- }
+ url = f"{self.base_url}?domain={domain}&extract=true"
self.debug(f"Retrieving tenant domains at {url}")
- autodiscover_task = self.helpers.create_task(
- self.helpers.request(url, method="POST", headers=headers, content=data)
- )
- openid_url = f"https://login.windows.net/{domain}/.well-known/openid-configuration"
- openid_task = self.helpers.create_task(self.helpers.request(openid_url))
-
- r = await autodiscover_task
+ r = await self.helpers.request(url)
status_code = getattr(r, "status_code", 0)
- if status_code not in (200, 421):
+ if status_code != 200:
self.verbose(f'Error retrieving azure_tenant domains for "{domain}" (status code: {status_code})')
- return set(), {}
- found_domains = list(set(await self.helpers.re.findall(self.d_xml_regex, r.text)))
- domains = set()
+ return {}
- for d in found_domains:
- # make sure we don't make any unnecessary api calls
+ try:
+ tenant_data = r.json()
+ except Exception as e:
+ self.warning(f'Error parsing JSON response for "{domain}": {e}')
+ return {}
+
+ # Absorb domains into word cloud
+ email_domains = tenant_data.get("email_domains", [])
+ for d in email_domains:
d = str(d).lower()
_, query = self.helpers.split_domain(d)
self.processed.add(hash(query))
- domains.add(d)
- # absorb into word cloud
self.scan.word_cloud.absorb_word(d)
- r = await openid_task
- openid_config = {}
- with suppress(Exception):
- openid_config = r.json()
-
- domains = sorted(domains)
- return domains, openid_config
+ return tenant_data
diff --git a/bbot/modules/censys_dns.py b/bbot/modules/censys_dns.py
new file mode 100644
index 0000000000..f8b9c62753
--- /dev/null
+++ b/bbot/modules/censys_dns.py
@@ -0,0 +1,82 @@
+from bbot.modules.templates.censys import censys
+
+
+class censys_dns(censys):
+ """
+ Query the Censys certificates API for subdomains.
+ Thanks to https://github.com/owasp-amass/amass/blob/master/resources/scripts/cert/censys.ads
+ """
+
+ watched_events = ["DNS_NAME"]
+ produced_events = ["DNS_NAME"]
+ flags = ["subdomain-enum", "passive", "safe"]
+ meta = {
+ "description": "Query the Censys API for subdomains",
+ "created_date": "2022-08-04",
+ "author": "@TheTechromancer",
+ "auth_required": True,
+ }
+ options = {"api_key": "", "max_pages": 5}
+ options_desc = {
+ "api_key": "Censys.io API Key in the format of 'key:secret'",
+ "max_pages": "Maximum number of pages to fetch (100 results per page)",
+ }
+
+ async def setup(self):
+ self.max_pages = self.config.get("max_pages", 5)
+ return await super().setup()
+
+ async def query(self, query):
+ results = set()
+ cursor = ""
+ for i in range(self.max_pages):
+ url = f"{self.base_url}/v2/certificates/search"
+ json_data = {
+ "q": f"names: {query}",
+ "per_page": 100,
+ }
+ if cursor:
+ json_data.update({"cursor": cursor})
+ resp = await self.api_request(
+ url,
+ method="POST",
+ json=json_data,
+ )
+
+ if resp is None:
+ break
+
+ try:
+ d = resp.json()
+ except Exception as e:
+ self.warning(f"Failed to parse JSON from {url} (response: {resp}): {e}")
+
+ if resp.status_code < 200 or resp.status_code >= 400:
+ if isinstance(d, dict):
+ error = d.get("error", "")
+ if error:
+ self.warning(error)
+ self.verbose(f'Non-200 Status code: {resp.status_code} for query "{query}", page #{i + 1}')
+ self.debug(f"Response: {resp.text}")
+ break
+ else:
+ if d is None:
+ break
+ elif not isinstance(d, dict):
+ break
+ status = d.get("status", "").lower()
+ result = d.get("result", {})
+ hits = result.get("hits", [])
+ if status != "ok" or not hits:
+ break
+
+ for h in hits:
+ names = h.get("names", [])
+ for n in names:
+ results.add(n.strip(".*").lower())
+
+ cursor = result.get("links", {}).get("next", "")
+ if not cursor:
+ break
+
+ return results
diff --git a/bbot/modules/censys_ip.py b/bbot/modules/censys_ip.py
new file mode 100644
index 0000000000..fa82dc33c7
--- /dev/null
+++ b/bbot/modules/censys_ip.py
@@ -0,0 +1,177 @@
+from bbot.modules.templates.censys import censys
+
+
+class censys_ip(censys):
+ """
+ Query the Censys /v2/hosts/{ip} endpoint for associated hostnames, IPs, and URLs.
+ """
+
+ watched_events = ["IP_ADDRESS"]
+ produced_events = [
+ "IP_ADDRESS",
+ "DNS_NAME",
+ "URL_UNVERIFIED",
+ "OPEN_TCP_PORT",
+ "OPEN_UDP_PORT",
+ "TECHNOLOGY",
+ "PROTOCOL",
+ ]
+ flags = ["passive", "safe"]
+ meta = {
+ "description": "Query the Censys API for hosts by IP address",
+ "created_date": "2026-01-26",
+ "author": "@TheTechromancer",
+ "auth_required": True,
+ }
+ options = {"api_key": "", "dns_names_limit": 100, "in_scope_only": True}
+ options_desc = {
+ "api_key": "Censys.io API Key in the format of 'key:secret'",
+ "dns_names_limit": "Maximum number of DNS names to extract from dns.names (default 100)",
+ "in_scope_only": "Only query in-scope IPs. If False, will query up to distance 1.",
+ }
+ scope_distance_modifier = 1
+
+ async def setup(self):
+ self.dns_names_limit = self.config.get("dns_names_limit", 100)
+ self.warning(
+ "This module may consume a lot of API queries. Unless you specifically want to query on each individual IP, we recommend using the censys_dns module instead."
+ )
+ return await super().setup()
+
+ async def filter_event(self, event):
+ in_scope_only = self.config.get("in_scope_only", True)
+ max_scope_distance = 0 if in_scope_only else (self.scan.scope_search_distance + 1)
+ if event.scope_distance > max_scope_distance:
+ return False, "event is not in scope"
+ return True
+
+ async def handle_event(self, event):
+ ip = str(event.host)
+ url = f"{self.base_url}/v2/hosts/{ip}"
+
+ resp = await self.api_request(url)
+ if resp is None:
+ self.debug(f"No response for {ip}")
+ return
+
+ if resp.status_code == 404:
+ self.debug(f"No data found for {ip}")
+ return
+
+ if resp.status_code != 200:
+ self.verbose(f"Non-200 status code ({resp.status_code}) for {ip}")
+ return
+
+ try:
+ data = resp.json()
+ except Exception as e:
+ self.warning(f"Failed to parse JSON response for {ip}: {e}")
+ return
+
+ result = data.get("result", {})
+ if not result:
+ return
+
+ # Track what we've already emitted to avoid duplicates
+ seen = set()
+
+ # Extract data from services
+ for service in result.get("services", []):
+ port = service.get("port")
+ transport = service.get("transport_protocol", "TCP").upper()
+
+ # Emit OPEN_TCP_PORT or OPEN_UDP_PORT for services with a port
+ # QUIC uses UDP as transport, so treat it as UDP
+ if port and (port, transport) not in seen:
+ seen.add((port, transport))
+ if transport in ("UDP", "QUIC"):
+ event_type = "OPEN_UDP_PORT"
+ else:
+ event_type = "OPEN_TCP_PORT"
+ await self.emit_event(
+ self.helpers.make_netloc(ip, port),
+ event_type,
+ parent=event,
+ context="{module} found open port on {event.parent.data}",
+ )
+
+ # Emit PROTOCOL for non-HTTP services
+ # Use extended_service_name (more specific) falling back to service_name
+ # Also check transport_protocol for protocols like QUIC
+ service_name = service.get("extended_service_name") or service.get("service_name", "")
+ # If service_name is UNKNOWN but transport_protocol is meaningful, use that
+ if service_name.upper() == "UNKNOWN" and transport and transport not in ("TCP", "UDP"):
+ service_name = transport
+ if service_name and service_name.upper() not in ("HTTP", "HTTPS", "UNKNOWN"):
+ protocol_key = ("protocol", service_name.upper(), port)
+ if protocol_key not in seen:
+ seen.add(protocol_key)
+ protocol_data = {"host": str(event.host), "protocol": service_name}
+ if port:
+ protocol_data["port"] = port
+ await self.emit_event(
+ protocol_data,
+ "PROTOCOL",
+ parent=event,
+ context="{module} found {event.type}: {event.data[protocol]} on {event.parent.data}",
+ )
+
+ # Extract URLs from HTTP services
+ http_data = service.get("http", {})
+ request = http_data.get("request", {})
+ uri = request.get("uri")
+ if uri and uri not in seen:
+ seen.add(uri)
+ await self.emit_event(
+ uri,
+ "URL_UNVERIFIED",
+ parent=event,
+ context="{module} found {event.data} in HTTP service of {event.parent.data}",
+ )
+
+ # Extract TLS certificate data
+ tls_data = service.get("tls", {})
+ certs = tls_data.get("certificates", {})
+ leaf_data = certs.get("leaf_data", {})
+
+ # Extract names from leaf_data.names
+ for name in leaf_data.get("names", []):
+ await self._emit_host(name, event, seen, "TLS certificate")
+
+ # Extract common_name from leaf_data.subject
+ subject = leaf_data.get("subject", {})
+ for cn in subject.get("common_name", []):
+ await self._emit_host(cn, event, seen, "TLS certificate subject")
+
+ # Extract software/technologies
+ for software in service.get("software", []):
+ product = software.get("uniform_resource_identifier", software.get("product", ""))
+ if product:
+ await self.emit_event(
+ {"technology": product, "host": str(event.host)},
+ "TECHNOLOGY",
+ parent=event,
+ context="{module} found {event.type}: {event.data[technology]} on {event.parent.data}",
+ )
+
+ # Extract dns.names (limit to configured max)
+ dns_data = result.get("dns", {})
+ dns_names = dns_data.get("names", [])
+ for name in dns_names[: self.dns_names_limit]:
+ await self._emit_host(name, event, seen, "reverse DNS")
+
+ async def _emit_host(self, host, event, seen, source):
+ """Emit IP_ADDRESS or DNS_NAME for a host value."""
+ # Validate and emit as DNS_NAME
+ try:
+ validated = self.helpers.validators.validate_host(host)
+ except ValueError as e:
+ self.debug(f"Error validating host {host} in {source}: {e}")
+ if validated and validated not in seen:
+ seen.add(validated)
+ await self.emit_event(
+ validated,
+ "DNS_NAME",
+ parent=event,
+ context=f"{{module}} found {{event.data}} in {source} of {{event.parent.data}}",
+ )
diff --git a/bbot/modules/internal/cloudcheck.py b/bbot/modules/internal/cloudcheck.py
index 5167b2c3e2..e2fca8536f 100644
--- a/bbot/modules/internal/cloudcheck.py
+++ b/bbot/modules/internal/cloudcheck.py
@@ -19,6 +19,8 @@ class CloudCheck(BaseInterceptModule):
async def setup(self):
self._cloud_hostname_regexes = None
self._cloud_hostname_regexes_lock = asyncio.Lock()
+ # perform a test lookup during setup to force signature update
+ await self.helpers.cloudcheck.lookup("8.8.8.8")
return True
async def filter_event(self, event):
@@ -38,7 +40,7 @@ async def handle_event(self, event, **kwargs):
try:
cloudcheck_results = await self.helpers.cloudcheck.lookup(host)
except Exception as e:
- self.trace(f"Error running cloudcheck against {event} (host: {host}): {e}")
+ self.warning(f"Error running cloudcheck against {event} (host: {host}): {e}")
continue
for provider in cloudcheck_results:
provider_name = provider["name"].lower()
diff --git a/bbot/modules/templates/censys.py b/bbot/modules/templates/censys.py
new file mode 100644
index 0000000000..5673dd6b5c
--- /dev/null
+++ b/bbot/modules/templates/censys.py
@@ -0,0 +1,54 @@
+import traceback
+
+from bbot.modules.templates.subdomain_enum import subdomain_enum_apikey
+
+
+class censys(subdomain_enum_apikey):
+ """
+ Base template for Censys API modules.
+ Provides common authentication and API request handling.
+ """
+
+ options = {"api_key": ""}
+ options_desc = {"api_key": "Censys.io API Key in the format of 'key:secret'"}
+
+ base_url = "https://search.censys.io/api"
+
+ async def setup(self):
+ await super().setup()
+ api_keys = set()
+ for module_name in ("censys", "censys_dns", "censys_ip"):
+ module_config = self.scan.config.get("modules", {}).get(module_name, {})
+ api_key = module_config.get("api_key", "")
+ if isinstance(api_key, str):
+ api_key = [api_key]
+ for key in api_key:
+ key = key.strip()
+ if key:
+ api_keys.add(key)
+ if not api_keys:
+ if self.auth_required:
+ return None, "No API key set"
+ self.api_key = api_keys.pop() if api_keys else ""
+ try:
+ await self.ping()
+ self.hugesuccess("API is ready")
+ return True
+ except Exception as e:
+ self.trace(traceback.format_exc())
+ return None, f"Error with API ({str(e).strip()})"
+
+ async def ping(self):
+ url = f"{self.base_url}/v1/account"
+ resp = await self.api_request(url, retry_on_http_429=False)
+ d = resp.json()
+ assert isinstance(d, dict), f"Invalid response from {url}: {resp}"
+ quota = d.get("quota", {})
+ used = int(quota.get("used", 0))
+ allowance = int(quota.get("allowance", 0))
+ assert used < allowance, "No quota remaining"
+
+ def prepare_api_request(self, url, kwargs):
+ api_id, api_secret = self.api_key.split(":", 1)
+ kwargs["auth"] = (api_id, api_secret)
+ return url, kwargs
diff --git a/bbot/test/test_step_1/test_helpers.py b/bbot/test/test_step_1/test_helpers.py
index 2c6488cb14..fa54bcbe7f 100644
--- a/bbot/test/test_step_1/test_helpers.py
+++ b/bbot/test/test_step_1/test_helpers.py
@@ -409,6 +409,7 @@ async def test_helpers_misc(helpers, scan, bbot_scanner, bbot_httpserver):
assert helpers.validators.validate_host("LOCALHOST ") == "localhost"
assert helpers.validators.validate_host(" 192.168.1.1") == "192.168.1.1"
assert helpers.validators.validate_host(" Dead::c0dE ") == "dead::c0de"
+ assert helpers.validators.validate_host(".*.wildcard.evilcorp.com") == "wildcard.evilcorp.com"
assert helpers.validators.soft_validate(" evilCorp.COM", "host") is True
assert helpers.validators.soft_validate("!@#$", "host") is False
with pytest.raises(ValueError):
diff --git a/bbot/test/test_step_2/module_tests/test_module_azure_tenant.py b/bbot/test/test_step_2/module_tests/test_module_azure_tenant.py
index b7986d3a11..ee15d1a6dd 100644
--- a/bbot/test/test_step_2/module_tests/test_module_azure_tenant.py
+++ b/bbot/test/test_step_2/module_tests/test_module_azure_tenant.py
@@ -2,93 +2,22 @@
class TestAzure_Tenant(ModuleTestBase):
- tenant_response = """
-
-
-
- http://schemas.microsoft.com/exchange/2010/Autodiscover/Autodiscover/GetFederationInformationResponse
-
- 15
- 20
- 6411
- 14
- Exchange2015
-
-
-
-
-
- NoError
-
- outlook.com
-
- blacklanternsecurity.onmicrosoft.com
-
-
-
- https://login.microsoftonline.com/extSTS.srf
- urn:federation:MicrosoftOnline
-
-
-
-
-
-"""
-
- openid_config_azure = {
- "token_endpoint": "https://login.windows.net/cc74fc12-4142-400e-a653-f98bdeadbeef/oauth2/token",
- "token_endpoint_auth_methods_supported": ["client_secret_post", "private_key_jwt", "client_secret_basic"],
- "jwks_uri": "https://login.windows.net/common/discovery/keys",
- "response_modes_supported": ["query", "fragment", "form_post"],
- "subject_types_supported": ["pairwise"],
- "id_token_signing_alg_values_supported": ["RS256"],
- "response_types_supported": ["code", "id_token", "code id_token", "token id_token", "token"],
- "scopes_supported": ["openid"],
- "issuer": "https://sts.windows.net/cc74fc12-4142-400e-a653-f98bdeadbeef/",
- "microsoft_multi_refresh_token": True,
- "authorization_endpoint": "https://login.windows.net/cc74fc12-4142-400e-a653-f98bdeadbeef/oauth2/authorize",
- "device_authorization_endpoint": "https://login.windows.net/cc74fc12-4142-400e-a653-f98bdeadbeef/oauth2/devicecode",
- "http_logout_supported": True,
- "frontchannel_logout_supported": True,
- "end_session_endpoint": "https://login.windows.net/cc74fc12-4142-400e-a653-f98bdeadbeef/oauth2/logout",
- "claims_supported": [
- "sub",
- "iss",
- "cloud_instance_name",
- "cloud_instance_host_name",
- "cloud_graph_host_name",
- "msgraph_host",
- "aud",
- "exp",
- "iat",
- "auth_time",
- "acr",
- "amr",
- "nonce",
- "email",
- "given_name",
- "family_name",
- "nickname",
+ tenant_response = {
+ "tenant_id": "cc74fc12-4142-400e-a653-f98bdeadbeef",
+ "tenant_name": "blacklanternsecurity",
+ "domain": "blacklanternsecurity.com",
+ "email_domains": [
+ "blacklanternsecurity.com",
+ "blacklanternsecurity.onmicrosoft.com",
+ "blsgvt.com",
+ "o365.blacklanternsecurity.com",
],
- "check_session_iframe": "https://login.windows.net/cc74fc12-4142-400e-a653-f98bdeadbeef/oauth2/checksession",
- "userinfo_endpoint": "https://login.windows.net/cc74fc12-4142-400e-a653-f98bdeadbeef/openid/userinfo",
- "kerberos_endpoint": "https://login.windows.net/cc74fc12-4142-400e-a653-f98bdeadbeef/kerberos",
- "tenant_region_scope": "NA",
- "cloud_instance_name": "microsoftonline.com",
- "cloud_graph_host_name": "graph.windows.net",
- "msgraph_host": "graph.microsoft.com",
- "rbac_url": "https://pas.windows.net",
}
async def setup_after_prep(self, module_test):
module_test.httpx_mock.add_response(
- method="POST",
- url="https://autodiscover-s.outlook.com/autodiscover/autodiscover.svc",
- text=self.tenant_response,
- )
- module_test.httpx_mock.add_response(
- url="https://login.windows.net/blacklanternsecurity.com/.well-known/openid-configuration",
- json=self.openid_config_azure,
+ url="https://azmap.dev/api/tenant?domain=blacklanternsecurity.com&extract=true",
+ json=self.tenant_response,
)
def check(self, module_test, events):
diff --git a/bbot/test/test_step_2/module_tests/test_module_censys_dns.py b/bbot/test/test_step_2/module_tests/test_module_censys_dns.py
new file mode 100644
index 0000000000..bab6f0060a
--- /dev/null
+++ b/bbot/test/test_step_2/module_tests/test_module_censys_dns.py
@@ -0,0 +1,83 @@
+from .base import ModuleTestBase
+
+
+class TestCensys_DNS(ModuleTestBase):
+ config_overrides = {"modules": {"censys_dns": {"api_key": "api_id:api_secret"}}}
+
+ async def setup_before_prep(self, module_test):
+ module_test.httpx_mock.add_response(
+ url="https://search.censys.io/api/v1/account",
+ match_headers={"Authorization": "Basic YXBpX2lkOmFwaV9zZWNyZXQ="},
+ json={
+ "email": "info@blacklanternsecurity.com",
+ "login": "nope",
+ "first_login": "1917-08-03 20:03:55",
+ "last_login": "1918-05-19 01:15:22",
+ "quota": {"used": 26, "allowance": 250, "resets_at": "1919-06-03 16:30:32"},
+ },
+ )
+ module_test.httpx_mock.add_response(
+ url="https://search.censys.io/api/v2/certificates/search",
+ match_headers={"Authorization": "Basic YXBpX2lkOmFwaV9zZWNyZXQ="},
+ method="POST",
+ match_json={"q": "names: blacklanternsecurity.com", "per_page": 100},
+ json={
+ "code": 200,
+ "status": "OK",
+ "result": {
+ "query": "names: blacklanternsecurity.com",
+ "total": 196,
+ "duration_ms": 1046,
+ "hits": [
+ {
+ "parsed": {
+ "validity_period": {
+ "not_before": "2021-11-18T00:09:46Z",
+ "not_after": "2022-11-18T00:09:46Z",
+ },
+ "issuer_dn": "C=US, ST=Arizona, L=Scottsdale, O=GoDaddy.com\\, Inc., OU=http://certs.godaddy.com/repository/, CN=Go Daddy Secure Certificate Authority - G2",
+ "subject_dn": "CN=asdf.blacklanternsecurity.com",
+ },
+ "fingerprint_sha256": "590ad51b8db62925f0fd3f300264c6a36692e20ceec2b5a22e7e4b41c1575cdc",
+ "names": ["asdf.blacklanternsecurity.com", "asdf2.blacklanternsecurity.com"],
+ },
+ ],
+ "links": {"next": "NextToken", "prev": ""},
+ },
+ },
+ )
+ module_test.httpx_mock.add_response(
+ url="https://search.censys.io/api/v2/certificates/search",
+ match_headers={"Authorization": "Basic YXBpX2lkOmFwaV9zZWNyZXQ="},
+ method="POST",
+ match_json={"q": "names: blacklanternsecurity.com", "per_page": 100, "cursor": "NextToken"},
+ json={
+ "code": 200,
+ "status": "OK",
+ "result": {
+ "query": "names: blacklanternsecurity.com",
+ "total": 196,
+ "duration_ms": 1046,
+ "hits": [
+ {
+ "parsed": {
+ "validity_period": {
+ "not_before": "2021-11-18T00:09:46Z",
+ "not_after": "2022-11-18T00:09:46Z",
+ },
+ "issuer_dn": "C=US, ST=Arizona, L=Scottsdale, O=GoDaddy.com\\, Inc., OU=http://certs.godaddy.com/repository/, CN=Go Daddy Secure Certificate Authority - G2",
+ "subject_dn": "CN=zzzz.blacklanternsecurity.com",
+ },
+ "fingerprint_sha256": "590ad51b8db62925f0fd3f300264c6a36692e20ceec2b5a22e7e4b41c1575cdc",
+ "names": ["zzzz.blacklanternsecurity.com"],
+ },
+ ],
+ "links": {"next": "", "prev": ""},
+ },
+ },
+ )
+
+ def check(self, module_test, events):
+ assert any(e.data == "asdf.blacklanternsecurity.com" for e in events), "Failed to detect asdf subdomain"
+ assert any(e.data == "asdf2.blacklanternsecurity.com" for e in events), "Failed to detect asdf2 subdomain"
+ assert any(e.data == "zzzz.blacklanternsecurity.com" for e in events), "Failed to detect zzzz subdomain"
diff --git a/bbot/test/test_step_2/module_tests/test_module_censys_ip.py b/bbot/test/test_step_2/module_tests/test_module_censys_ip.py
new file mode 100644
index 0000000000..4aff673486
--- /dev/null
+++ b/bbot/test/test_step_2/module_tests/test_module_censys_ip.py
@@ -0,0 +1,296 @@
+from .base import ModuleTestBase
+
+
+class TestCensys_IP(ModuleTestBase):
+ targets = ["1.2.3.4"]
+ config_overrides = {"modules": {"censys_ip": {"api_key": "api_id:api_secret"}}}
+
+ async def setup_before_prep(self, module_test):
+ await module_test.mock_dns(
+ {
+ "wildcard.evilcorp.com": {
+ "A": ["1.2.3.4"],
+ },
+ "certname.evilcorp.com": {
+ "A": ["1.2.3.4"],
+ },
+ "certsubject.evilcorp.com": {
+ "A": ["1.2.3.4"],
+ },
+ "reversedns.evilcorp.com": {
+ "A": ["1.2.3.4"],
+ },
+ "ptr.evilcorp.com": {
+ "A": ["1.2.3.4"],
+ },
+ }
+ )
+ module_test.httpx_mock.add_response(
+ url="https://search.censys.io/api/v1/account",
+ match_headers={"Authorization": "Basic YXBpX2lkOmFwaV9zZWNyZXQ="},
+ json={
+ "email": "info@blacklanternsecurity.com",
+ "login": "nope",
+ "first_login": "1917-08-03 20:03:55",
+ "last_login": "1918-05-19 01:15:22",
+ "quota": {"used": 26, "allowance": 250, "resets_at": "1919-06-03 16:30:32"},
+ },
+ )
+ module_test.httpx_mock.add_response(
+ url="https://search.censys.io/api/v2/hosts/1.2.3.4",
+ match_headers={"Authorization": "Basic YXBpX2lkOmFwaV9zZWNyZXQ="},
+ json={
+ "code": 200,
+ "status": "OK",
+ "result": {
+ "ip": "1.2.3.4",
+ "services": [
+ {
+ "port": 53,
+ "service_name": "DNS",
+ "transport_protocol": "UDP",
+ },
+ {
+ "port": 80,
+ "service_name": "HTTP",
+ "extended_service_name": "HTTP",
+ "transport_protocol": "TCP",
+ "http": {
+ "request": {
+ "method": "GET",
+ "uri": "http://1.2.3.4/",
+ },
+ },
+ },
+ {
+ "port": 443,
+ # Real API returns service_name: "HTTP" for HTTPS
+ "service_name": "HTTP",
+ "extended_service_name": "HTTPS",
+ "transport_protocol": "TCP",
+ "http": {
+ "request": {
+ "method": "GET",
+ "uri": "https://1.2.3.4/",
+ },
+ },
+ "tls": {
+ "certificates": {
+ "leaf_data": {
+ "names": [
+ "*.wildcard.evilcorp.com",
+ "certname.evilcorp.com",
+ ],
+ "subject": {
+ "common_name": ["certsubject.evilcorp.com"],
+ },
+ },
+ },
+ },
+ },
+ {
+ "port": 8443,
+ # Real API returns service_name: "HTTP" for HTTPS
+ "service_name": "HTTP",
+ "extended_service_name": "HTTPS",
+ "transport_protocol": "TCP",
+ "http": {
+ "request": {
+ "method": "GET",
+ "uri": "https://1.2.3.4:8443/admin",
+ },
+ },
+ "software": [
+ {
+ "uniform_resource_identifier": "cpe:2.3:a:apache:tomcat:9.0.50:*:*:*:*:*:*:*",
+ "product": "Apache Tomcat",
+ "vendor": "Apache",
+ },
+ {
+ "product": "Java",
+ },
+ ],
+ },
+ {
+ "port": 22,
+ "service_name": "SSH",
+ "extended_service_name": "SSH",
+ "transport_protocol": "TCP",
+ },
+ {
+ "port": 443,
+ # Real API returns service_name: "UNKNOWN" and transport_protocol: "QUIC"
+ "service_name": "UNKNOWN",
+ "extended_service_name": "UNKNOWN",
+ "transport_protocol": "QUIC",
+ },
+ ],
+ "dns": {
+ "names": [
+ "reversedns.evilcorp.com",
+ "ptr.evilcorp.com",
+ ],
+ },
+ },
+ },
+ )
+
+ def check(self, module_test, events):
+ # Check OPEN_UDP_PORT event for DNS
+ assert any(e.type == "OPEN_UDP_PORT" and e.data == "1.2.3.4:53" for e in events), (
+ "Failed to detect UDP port 53"
+ )
+
+ # Check OPEN_TCP_PORT events
+ assert any(e.type == "OPEN_TCP_PORT" and e.data == "1.2.3.4:22" for e in events), (
+ "Failed to detect TCP port 22 (SSH)"
+ )
+ assert any(e.type == "OPEN_TCP_PORT" and e.data == "1.2.3.4:80" for e in events), (
+ "Failed to detect TCP port 80"
+ )
+ assert any(e.type == "OPEN_TCP_PORT" and e.data == "1.2.3.4:443" for e in events), (
+ "Failed to detect TCP port 443"
+ )
+ assert any(e.type == "OPEN_TCP_PORT" and e.data == "1.2.3.4:8443" for e in events), (
+ "Failed to detect TCP port 8443"
+ )
+
+ # Check OPEN_UDP_PORT for QUIC
+ assert any(e.type == "OPEN_UDP_PORT" and e.data == "1.2.3.4:443" for e in events), (
+ "Failed to detect UDP port 443 (QUIC)"
+ )
+
+ # Check URL_UNVERIFIED events
+ assert any(e.type == "URL_UNVERIFIED" and e.data == "http://1.2.3.4/" for e in events), (
+ "Failed to detect HTTP URL"
+ )
+ assert any(e.type == "URL_UNVERIFIED" and e.data == "https://1.2.3.4/" for e in events), (
+ "Failed to detect HTTPS URL"
+ )
+ assert any(e.type == "URL_UNVERIFIED" and e.data == "https://1.2.3.4:8443/admin" for e in events), (
+ "Failed to detect HTTPS URL on port 8443"
+ )
+
+ # Check DNS_NAME events from TLS certificate names
+ assert any(e.type == "DNS_NAME" and e.data == "wildcard.evilcorp.com" for e in events), (
+ "Failed to detect wildcard.evilcorp.com from TLS cert names (wildcard stripped)"
+ )
+ assert any(e.type == "DNS_NAME" and e.data == "certname.evilcorp.com" for e in events), (
+ "Failed to detect certname.evilcorp.com from TLS cert names"
+ )
+
+ # Check DNS_NAME events from TLS certificate subject common_name
+ assert any(
+ e.type == "DNS_NAME" and e.data == "certsubject.evilcorp.com" and e.scope_distance == 0 for e in events
+ ), "Failed to detect certsubject.evilcorp.com from TLS cert subject"
+
+ # Check DNS_NAME events from dns.names (reverse DNS)
+ assert any(e.type == "DNS_NAME" and e.data == "reversedns.evilcorp.com" for e in events), (
+ "Failed to detect reversedns.evilcorp.com from reverse DNS"
+ )
+ assert any(e.type == "DNS_NAME" and e.data == "ptr.evilcorp.com" for e in events), (
+ "Failed to detect ptr.evilcorp.com from reverse DNS"
+ )
+
+ # Check TECHNOLOGY events from software
+ assert any(
+ e.type == "TECHNOLOGY" and e.data["technology"] == "cpe:2.3:a:apache:tomcat:9.0.50:*:*:*:*:*:*:*"
+ for e in events
+ ), "Failed to detect Apache Tomcat technology with CPE"
+ assert any(e.type == "TECHNOLOGY" and e.data["technology"] == "Java" for e in events), (
+ "Failed to detect Java technology without CPE"
+ )
+
+ # Check PROTOCOL events (non-HTTP/DNS services)
+ assert any(
+ e.type == "PROTOCOL" and e.data["protocol"] == "SSH" and e.data.get("port") == 22 for e in events
+ ), "Failed to detect SSH protocol"
+ assert any(
+ e.type == "PROTOCOL" and e.data["protocol"] == "QUIC" and e.data.get("port") == 443 for e in events
+ ), "Failed to detect QUIC protocol"
+
+ # Ensure HTTP/HTTPS services don't emit PROTOCOL events (but DNS does)
+ assert not any(e.type == "PROTOCOL" and e.data["protocol"] in ("HTTP", "HTTPS") for e in events), (
+ "Should not emit PROTOCOL for HTTP/HTTPS services"
+ )
+ assert any(e.type == "PROTOCOL" and e.data["protocol"] == "DNS" for e in events), (
+ "Should emit PROTOCOL for DNS services"
+ )
+
+
+class TestCensys_IP_InScopeOnly(ModuleTestBase):
+ """Test that in_scope_only=True (default) does NOT query out-of-scope IPs."""
+
+ targets = ["evilcorp.com"]
+ module_name = "censys_ip"
+ config_overrides = {"modules": {"censys_ip": {"api_key": "api_id:api_secret", "in_scope_only": True}}}
+
+ async def setup_before_prep(self, module_test):
+ await module_test.mock_dns({"evilcorp.com": {"A": ["1.1.1.1"]}})
+ module_test.httpx_mock.add_response(
+ url="https://search.censys.io/api/v1/account",
+ match_headers={"Authorization": "Basic YXBpX2lkOmFwaV9zZWNyZXQ="},
+ json={
+ "quota": {"used": 26, "allowance": 250, "resets_at": "1919-06-03 16:30:32"},
+ },
+ )
+ # This should NOT be called because in_scope_only=True
+ module_test.httpx_mock.add_response(
+ url="https://search.censys.io/api/v2/hosts/1.1.1.1",
+ match_headers={"Authorization": "Basic YXBpX2lkOmFwaV9zZWNyZXQ="},
+ json={
+ "code": 200,
+ "status": "OK",
+ "result": {
+ "ip": "1.1.1.1",
+ "services": [{"port": 80, "service_name": "HTTP", "transport_protocol": "TCP"}],
+ },
+ },
+ )
+
+ def check(self, module_test, events):
+ # Should NOT have queried the IP since it's out of scope
+ assert not any(e.type == "OPEN_TCP_PORT" and "1.1.1.1" in e.data for e in events), (
+ "Should not have queried out-of-scope IP with in_scope_only=True"
+ )
+
+
+class TestCensys_IP_OutOfScope(ModuleTestBase):
+ """Test that in_scope_only=False DOES query out-of-scope IPs (up to distance 1)."""
+
+ targets = ["evilcorp.com"]
+ module_name = "censys_ip"
+ config_overrides = {
+ "modules": {"censys_ip": {"api_key": "api_id:api_secret", "in_scope_only": False}},
+ "dns": {"minimal": False},
+ "scope": {"report_distance": 1},
+ }
+
+ async def setup_before_prep(self, module_test):
+ await module_test.mock_dns({"evilcorp.com": {"A": ["1.1.1.1"]}})
+ module_test.httpx_mock.add_response(
+ url="https://search.censys.io/api/v1/account",
+ match_headers={"Authorization": "Basic YXBpX2lkOmFwaV9zZWNyZXQ="},
+ json={
+ "quota": {"used": 26, "allowance": 250, "resets_at": "1919-06-03 16:30:32"},
+ },
+ )
+ # This SHOULD be called because in_scope_only=False
+ module_test.httpx_mock.add_response(
+ url="https://search.censys.io/api/v2/hosts/1.1.1.1",
+ match_headers={"Authorization": "Basic YXBpX2lkOmFwaV9zZWNyZXQ="},
+ json={
+ "code": 200,
+ "status": "OK",
+ "result": {
+ "ip": "1.1.1.1",
+ "services": [{"port": 80, "service_name": "HTTP", "transport_protocol": "TCP"}],
+ },
+ },
+ )
+
+ def check(self, module_test, events):
+ # Should have queried the IP since in_scope_only=False
+ assert any(e.type == "OPEN_TCP_PORT" and e.data == "1.1.1.1:80" for e in events), (
+ "Should have queried out-of-scope IP with in_scope_only=False"
+ )
diff --git a/poetry.lock b/poetry.lock
index 36525a2d1f..4a8faa6f02 100644
--- a/poetry.lock
+++ b/poetry.lock
@@ -1,4 +1,4 @@
-# This file is automatically @generated by Poetry 2.3.0 and should not be changed by hand.
+# This file is automatically @generated by Poetry 2.2.1 and should not be changed by hand.
[[package]]
name = "annotated-doc"
@@ -198,7 +198,7 @@ description = "Foreign Function Interface for Python calling C code."
optional = false
python-versions = ">=3.8"
groups = ["main"]
-markers = "implementation_name == \"pypy\" or platform_python_implementation != \"PyPy\""
+markers = "platform_python_implementation != \"PyPy\" or implementation_name == \"pypy\""
files = [
{file = "cffi-1.17.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:df8b1c11f177bc2313ec4b2d46baec87a5f3e71fc8b45dab2ee7cae86d9aba14"},
{file = "cffi-1.17.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:8f2cdc858323644ab277e9bb925ad72ae0e67f69e804f4898c070998d50b1a67"},
@@ -403,105 +403,105 @@ colorama = {version = "*", markers = "platform_system == \"Windows\""}
[[package]]
name = "cloudcheck"
-version = "8.7.2"
+version = "9.2.0"
description = "Detailed database of cloud providers. Instantly look up a domain or IP address"
optional = false
python-versions = ">=3.9"
groups = ["main"]
files = [
- {file = "cloudcheck-8.7.2-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d9c309ae532e9982e3f28b70a2e1ff14c75e32639c260ff2f978ab0575fa794f"},
- {file = "cloudcheck-8.7.2-cp310-cp310-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:cf98383de6a53120e09fa9881aa17e5b6509d738e27e07cda50ffcf38876d1aa"},
- {file = "cloudcheck-8.7.2-cp310-cp310-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:a2abeb44229d3bc799bd68ec2a151120f32868fff26def28abc5460b1a304b28"},
- {file = "cloudcheck-8.7.2-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:f429531696e8262bf8b90150c5f49cc8826433ac425e4ebab9ca1937094606ef"},
- {file = "cloudcheck-8.7.2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a3bf247c6f2adaec2795032b4f98d0dbbabdc77e3300b2fe26b7a4a4d5f1d00b"},
- {file = "cloudcheck-8.7.2-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:7189b3aee5aa7f2368e87be086577ea2fbb37231c2c9c720908d6c8a511db7fa"},
- {file = "cloudcheck-8.7.2-cp310-cp310-musllinux_1_2_armv7l.whl", hash = "sha256:43922e525395923e784663ae38e3f867ea9aa972f84575421880220acc3145e2"},
- {file = "cloudcheck-8.7.2-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:38478c71cb8cc12b91eb605e713ec6f346deec9ea17ecadb91baf6fc824f85eb"},
- {file = "cloudcheck-8.7.2-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:757a45af73fa9b2b190adb015a7c0ce42363187b9a114437fd6ed0c8f13c5d98"},
- {file = "cloudcheck-8.7.2-cp310-cp310-win_amd64.whl", hash = "sha256:dfd4d7035018918a674be6667fb9aa7801f0ef4b6cad9b2415875de25f4ca0aa"},
- {file = "cloudcheck-8.7.2-cp311-cp311-macosx_10_12_x86_64.whl", hash = "sha256:d3704ddc63fbef0bccc08b84c8f306148bf12b1aec198858390e2403a280fa8f"},
- {file = "cloudcheck-8.7.2-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:3e2e503384ae8387ee846a8fe7603ef73b5d953137ca84a57eecfab849205eff"},
- {file = "cloudcheck-8.7.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1e52f0496959b560904a748bb69f0f6d70d814bf2cf652f15fde53a5fd8bda2c"},
- {file = "cloudcheck-8.7.2-cp311-cp311-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:2a715dda59306d361db59d53eb94f05edfa976332b0e538045c1d7920159f021"},
- {file = "cloudcheck-8.7.2-cp311-cp311-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:bae402b6ce298a6c5b9abac39af0ae610c41a8903a1766afd1b09dbc863f4d8f"},
- {file = "cloudcheck-8.7.2-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:62090b71c13455988ae9d125f186afa91397defd58673328828ac0af6838a952"},
- {file = "cloudcheck-8.7.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:16237ea4ed85a606237603fcabaf8d00f51f7dca5d0ce88b703bb6f24ba1039b"},
- {file = "cloudcheck-8.7.2-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:e5b003e611f1a279b31d92afc31cbc470242468be31be707615a784c41bd432f"},
- {file = "cloudcheck-8.7.2-cp311-cp311-musllinux_1_2_armv7l.whl", hash = "sha256:17f837b2f19ea16a8aa07316bdba3772f2758106651c40a906226e76ac756a66"},
- {file = "cloudcheck-8.7.2-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:14e8e9567557297b5c0945d9753fecabe8d04d515b5aa00db0a8890ccb1f9784"},
- {file = "cloudcheck-8.7.2-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:202173431bc105bec18666e80cf8278c9748862b1ae6a51d7e5219cbbaf79237"},
- {file = "cloudcheck-8.7.2-cp311-cp311-win_amd64.whl", hash = "sha256:4a1d4ce87411f6593389ab817d91d71ec6588255d7aedaf620fd2e1e65bf30e5"},
- {file = "cloudcheck-8.7.2-cp312-cp312-macosx_10_12_x86_64.whl", hash = "sha256:5471fce7d336d8b1ee8ac255f1d0f60f984f92563a187e00372d6e129e206907"},
- {file = "cloudcheck-8.7.2-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:492bf44c220454035292aea137c227778ab38241385ba97abfa50e0841aff3c5"},
- {file = "cloudcheck-8.7.2-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:24925952ef06dab869091fa09eda66c5abd428b23fdcedb36365543d087a0663"},
- {file = "cloudcheck-8.7.2-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:866d88c44ae490115e8b55c018c8b36a954c97a91d36da8db381d097b08cc9bc"},
- {file = "cloudcheck-8.7.2-cp312-cp312-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:e5c79b111447a4b8518782e3ceb6606126fc90daa6522c23c3dc9180a84201bc"},
- {file = "cloudcheck-8.7.2-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:8387e9a3e0e9e6fce97331236d8531c2814f38a3f14de59c197075c5cf3ee286"},
- {file = "cloudcheck-8.7.2-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3d0065b602de8b6e7b2d135cbb60fd84d1148db70300d747a359b3ef3250e81b"},
- {file = "cloudcheck-8.7.2-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:e639d905651c58077b53059f4cd1b5730bf24ac09fa5aae08b85bb52dc18bd59"},
- {file = "cloudcheck-8.7.2-cp312-cp312-musllinux_1_2_armv7l.whl", hash = "sha256:9a68859bb08511c384312a3e00efd14411287e479b412825b2a5c73c905f7aef"},
- {file = "cloudcheck-8.7.2-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:f1ead3e8a512181926133640581f106a4706800f29a048be9800ec9ddddbdf1a"},
- {file = "cloudcheck-8.7.2-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:08df79339a0da7bbe25b6b058a03941629fdf1ebe5b2d2fac4752313d8164b86"},
- {file = "cloudcheck-8.7.2-cp312-cp312-win_amd64.whl", hash = "sha256:b150561528499dcc4a42fbc99e059430b4d95b0ec3a523998498141caf8f46d5"},
- {file = "cloudcheck-8.7.2-cp313-cp313-macosx_10_12_x86_64.whl", hash = "sha256:10c32dd167f3969690acc933293ff54435d4ab9267a7882c965d2409ffa50e75"},
- {file = "cloudcheck-8.7.2-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:9d5ae4080a4ef645906ac4cd1e0f92bc871c4bd3ffe12b69ce7209cdcb13e679"},
- {file = "cloudcheck-8.7.2-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:946e409be6b39e7c72becd72cb1ecce65ce5afe1d57bad5692506e6a2001cd0f"},
- {file = "cloudcheck-8.7.2-cp313-cp313-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:ee24c1f05aa01b21637090852d2fecd5c42163a6f249ca49890dd3ce86a021d9"},
- {file = "cloudcheck-8.7.2-cp313-cp313-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:56a4ca67ab92b4303fdabd3b186ac14b648d80a3df7e3eaa4e55ed5690cb1b64"},
- {file = "cloudcheck-8.7.2-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:cb7fd24f92d0a080fee83dfd4d81281c3dc2a07b4f459936522fa8616f77d143"},
- {file = "cloudcheck-8.7.2-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e3d754b59900fe79794dabcd15a9ff771bac2df8f3ac4e755a9eed7136872b07"},
- {file = "cloudcheck-8.7.2-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:8d1e6b559a238659542bfc08e5a3570c0f4916d914f9e496d5964c4e81ab2794"},
- {file = "cloudcheck-8.7.2-cp313-cp313-musllinux_1_2_armv7l.whl", hash = "sha256:52e35b5ead4bf50f563ce24a7102b12ad5a9bd6aaf2d26c46d805d9ece024ef0"},
- {file = "cloudcheck-8.7.2-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:5dba8d71b99247eab88db2d21ce6877741c1be372cb608f9eae0d4baff0eb604"},
- {file = "cloudcheck-8.7.2-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:2b42207a0de4e7686f7d94b61ffb02433e4da124ddde7235ee9a9f84a4fffe38"},
- {file = "cloudcheck-8.7.2-cp313-cp313-win_amd64.whl", hash = "sha256:9e7a7a4bdae8b8264894aacd04cff83a3d418caf618e99a2cb0c36456b3a11f2"},
- {file = "cloudcheck-8.7.2-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:35df9c1cade4b519943793258009af8c9db321baeec031537d900df1684ebbf5"},
- {file = "cloudcheck-8.7.2-cp313-cp313t-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:04d5ebbb3a665b1d0187e9b08c26865b8a66cf617122f3544be0f66c44d97a6e"},
- {file = "cloudcheck-8.7.2-cp313-cp313t-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:6d302e2c96055adf01b456471467139b9f305cef1c0b34a4d7381bb825aae135"},
- {file = "cloudcheck-8.7.2-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:f82d2eedd762ba9656b957356e1c864d2ac92ed55b7e4820064417fab3d95e7b"},
- {file = "cloudcheck-8.7.2-cp313-cp313t-musllinux_1_2_armv7l.whl", hash = "sha256:5d5a1cd9e58fd98936ec56ca4fcd3f750fee72b17ffb8dee1679e5e40d3dcade"},
- {file = "cloudcheck-8.7.2-cp313-cp313t-musllinux_1_2_i686.whl", hash = "sha256:a40ccf33e79983b60b9830b6678d15d32d9faea5487f2dda5555cde61a0742a8"},
- {file = "cloudcheck-8.7.2-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:ac999ba062eaa8d0e9ced19256d1b0a81262bb899161fc7323a462b5dd2513c5"},
- {file = "cloudcheck-8.7.2-cp314-cp314-macosx_10_12_x86_64.whl", hash = "sha256:2ad70470bc39a2681bcf06219139dec69614c60b47ea3cee9b61d0e86c5ddd89"},
- {file = "cloudcheck-8.7.2-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:b87d9efb760d532769d69a6bf065e803f35e61abb9cd8322d34df10830b71070"},
- {file = "cloudcheck-8.7.2-cp314-cp314-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:02f9a56c39b7b32fa93b9d77f2bc9b472a575aa0bb9d7e9b8afc22efcde25627"},
- {file = "cloudcheck-8.7.2-cp314-cp314-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:e65aaeb5d380a91377b05d8ccb8e3d2baa0900ae76b55623d30e52ce371e96b1"},
- {file = "cloudcheck-8.7.2-cp314-cp314-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:c15ea565e3d59120c19a2ba7403d9d577ad5d9dc31e76f38db63ff4160c69845"},
- {file = "cloudcheck-8.7.2-cp314-cp314-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:c3efeba372bcd9df8741cb41fb40f6817d1ead51ec82d2982c14d97b80d518db"},
- {file = "cloudcheck-8.7.2-cp314-cp314-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b9551e25197d849e71917cc320928d7d68757d606c01d090fee80bdbe400a714"},
- {file = "cloudcheck-8.7.2-cp314-cp314-manylinux_2_38_x86_64.whl", hash = "sha256:12c13f06a54aeb67d4b4ff4e7127d478121890cbe82a1162c9defd7bd1a885c4"},
- {file = "cloudcheck-8.7.2-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:cf9343d07a84a34bf6634a4f5c5fc8818296b7eb46d650ddc1739b9cfb7083a2"},
- {file = "cloudcheck-8.7.2-cp314-cp314-musllinux_1_2_armv7l.whl", hash = "sha256:e3392da5f36617b83fc7dc9498503194bee8390a755393bab7ea52402af4690f"},
- {file = "cloudcheck-8.7.2-cp314-cp314-musllinux_1_2_i686.whl", hash = "sha256:d45cf7246ccef85202d4bab708a95216dc98e54f971b63c1b109ee50edac1165"},
- {file = "cloudcheck-8.7.2-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:53f95d5f503187583fad87ffce34063a61d4bcc8686954cc773dbca15667bdc5"},
- {file = "cloudcheck-8.7.2-cp314-cp314-win32.whl", hash = "sha256:3eba06eedb57ddc2b2e301d3cd7e494c4526ab3da1bb0a0dadf9bf568c2fb4d0"},
- {file = "cloudcheck-8.7.2-cp314-cp314-win_amd64.whl", hash = "sha256:0aac717836a5aeaf112a2a8dc3b35f9b6545f5384f6f213468fe0df35ba05fbb"},
- {file = "cloudcheck-8.7.2-cp314-cp314t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:dee86cb7501013e5c716e5c2de9df25c0d49e9a26dea4b24f6e5d558ec22c475"},
- {file = "cloudcheck-8.7.2-cp314-cp314t-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:c01a582be600bf6bc8b2078f9154ea5caad471d4cdb79f040228d156c292b1e9"},
- {file = "cloudcheck-8.7.2-cp314-cp314t-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:119c28eb43033c8742d1e8a38765ef32a3052ca39672af93d969ca0df62b0871"},
- {file = "cloudcheck-8.7.2-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:f6c8775eff15bdbce0e10e688af51a3ead137a11d62caea0bca047f8fab8d69a"},
- {file = "cloudcheck-8.7.2-cp314-cp314t-musllinux_1_2_armv7l.whl", hash = "sha256:853155aa2ac3755f265f571fa795823373e67ed06a707e498296c139d25ade61"},
- {file = "cloudcheck-8.7.2-cp314-cp314t-musllinux_1_2_i686.whl", hash = "sha256:201296d6b818c09a39fe5cb5c1b1f83e8e6869ee5de2a314779e809a06439a1a"},
- {file = "cloudcheck-8.7.2-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:22db503b31ad5a669468185464c65290e0786932d5f97d021bb6ee03e6ae92ea"},
- {file = "cloudcheck-8.7.2-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:058fdc7909f7a15d30ee7cde5638d244bcd1965d64c089bfab0c4514ea0f4b54"},
- {file = "cloudcheck-8.7.2-cp39-cp39-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:b4e2602349a62b392b2989f0456580a5c003c5c6fff8c241f8a1e20863bda301"},
- {file = "cloudcheck-8.7.2-cp39-cp39-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:702a7a3602a266c37965dbd4227ef578cee8543a158bd8aacebf9aef295e6db4"},
- {file = "cloudcheck-8.7.2-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:18b1b558bf738e666add1801a259c1bb3f3486783ab742e20312cec69ead09be"},
- {file = "cloudcheck-8.7.2-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7cf51d14d27902399c7d163fafa9d57f8603a7ee5d33396d19605240c3a39ef8"},
- {file = "cloudcheck-8.7.2-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:f62578a3d7499a967e2792eb082d906d3658304fc0a3910c1d3248651203f926"},
- {file = "cloudcheck-8.7.2-cp39-cp39-musllinux_1_2_armv7l.whl", hash = "sha256:d2f29823ab6bf37d8cd89c5fdcca73bcebd71a2ded7612caa9968e0cab00583a"},
- {file = "cloudcheck-8.7.2-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:c3d7d7ca458b81b643feaeacfd68ad5a6b5c2396d10a82101be461c49bbbde85"},
- {file = "cloudcheck-8.7.2-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:2061abb052231bee431444174ab9e269812fa76f1e3f59d0c83f2837d0b5a48f"},
- {file = "cloudcheck-8.7.2-pp311-pypy311_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:fa70386c95933e1e057be69ba883c3e012c29c45b587bfae9bd943eec212bc8c"},
- {file = "cloudcheck-8.7.2-pp311-pypy311_pp73-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:e9d7235a4ee29e3d9cd97d65beed5e4597a911ef3df0928fdfb4f585cc01d969"},
- {file = "cloudcheck-8.7.2-pp311-pypy311_pp73-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:e6d87aa93a13c95794a6cec5835fe85b8c0ce8114282c3a2a2444043609f009f"},
- {file = "cloudcheck-8.7.2-pp311-pypy311_pp73-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:b8f1a5bcfe83e1e8bd198153461e90042eae8268847cf807d55d1014af548407"},
- {file = "cloudcheck-8.7.2-pp311-pypy311_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:80dd6ce53e9df5f18c4f68a4e2737b885c777efcf7e429aa7cf715d3602b6af9"},
- {file = "cloudcheck-8.7.2-pp311-pypy311_pp73-musllinux_1_2_aarch64.whl", hash = "sha256:1bfd5c265dcf76c755bef9480514aa8ae2f4acbf8130f5ffb272586195fa9d85"},
- {file = "cloudcheck-8.7.2-pp311-pypy311_pp73-musllinux_1_2_armv7l.whl", hash = "sha256:ed2af7eea150b3e079588c90a2acc220d123711eec761e7fd10c7dc14965ea9e"},
- {file = "cloudcheck-8.7.2-pp311-pypy311_pp73-musllinux_1_2_i686.whl", hash = "sha256:e15628b711e38c96e57087cc8e97dfc0546ba5da8dac81b91616f98fb81dd9ec"},
- {file = "cloudcheck-8.7.2-pp311-pypy311_pp73-musllinux_1_2_x86_64.whl", hash = "sha256:291be061f18b4d04c38a301a6d9744320a615f591e9ca284faac9ca8227b36cd"},
- {file = "cloudcheck-8.7.2.tar.gz", hash = "sha256:dc4598e41919e79abffdab3a2763dc4f01fab06cdf6bae37b2332a85bc16c917"},
+ {file = "cloudcheck-9.2.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f82f553f4a527bf834039738f411fbd7f32d2dacab251ae4191fc5c5b704fbc6"},
+ {file = "cloudcheck-9.2.0-cp310-cp310-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:4e908315efb9553a26ec13524915b5ddca5e883f2bedf52d08087cf9c6d6f756"},
+ {file = "cloudcheck-9.2.0-cp310-cp310-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:72fba0ee7811b16b9692adfadd5604e28d658f8b9e66772eccefcabab6101a48"},
+ {file = "cloudcheck-9.2.0-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:3dcfa8410b6b58af36655bea7f6e377411c462ceabd7d536274d286e01efa4df"},
+ {file = "cloudcheck-9.2.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:909c4645588b1f92e4b23e606102bb61824598641843eb45b8b053936a1d86cd"},
+ {file = "cloudcheck-9.2.0-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:1e8351d57dd63fc510aab4915395d2e43ba534cc51b60ee85e85460ef76a19c5"},
+ {file = "cloudcheck-9.2.0-cp310-cp310-musllinux_1_2_armv7l.whl", hash = "sha256:06b804093eca2ed7e8c1ccbfb58f4ca508bc86dcef45a21ab1e63ba3f3a08cc2"},
+ {file = "cloudcheck-9.2.0-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:439fda3bb8e1deb0cc3d73f9d217a8f52a93f22ff4c5969d1ad86e4f1530ab4c"},
+ {file = "cloudcheck-9.2.0-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:30d5a09186dbc38b634291c319b47857e86b4d4b13124ae691ad4a75aadf2ccf"},
+ {file = "cloudcheck-9.2.0-cp310-cp310-win_amd64.whl", hash = "sha256:2796e65a34fa01373cdd278a069df7ad31bbd0d60404c2a39d2ff7d26721e159"},
+ {file = "cloudcheck-9.2.0-cp311-cp311-macosx_10_12_x86_64.whl", hash = "sha256:a5da1b55f4ac380e7b0e49d20e9f24455206489a1c9f7d34043f322052ca576d"},
+ {file = "cloudcheck-9.2.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:d7b5607314198f9cdf521b112b5a3a89700074334c08fa3793b14454f536f11b"},
+ {file = "cloudcheck-9.2.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:773bb786a7a98c20a68fadd69b81ed27acfeccfcd2cb4a35edc6add505092d39"},
+ {file = "cloudcheck-9.2.0-cp311-cp311-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:58fc0f7f3771aef5a358eb751b76ca5e4443ca497364593b711b4d86792ceef6"},
+ {file = "cloudcheck-9.2.0-cp311-cp311-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:217a2a5aaad6376941629c146b3573d9abd1ea6107b3cef3bc294933c243634b"},
+ {file = "cloudcheck-9.2.0-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:8f03a79da2ce1741c7748a1d2577b2f515728ae076bf1ac966546a83873027f0"},
+ {file = "cloudcheck-9.2.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:98fdf86b0ca01e76c237894f9b77560b9fb6793aa9b4f4b26612d86ccae08a9b"},
+ {file = "cloudcheck-9.2.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:e757fe6c7453d95d82980e12780a2f88d33d87dcf3826c0b3f3696fef4145587"},
+ {file = "cloudcheck-9.2.0-cp311-cp311-musllinux_1_2_armv7l.whl", hash = "sha256:450aab71bd8396d51688fd68fd31213b106cf406639700ac36c880464ecb4b17"},
+ {file = "cloudcheck-9.2.0-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:b9e706a036db2092b76ee76df0c89df8055e5282d091e43de386cce94f112b09"},
+ {file = "cloudcheck-9.2.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:4909f9c5a12eca8899991a5f168e9e86658f5743a95af443788ab4564912177d"},
+ {file = "cloudcheck-9.2.0-cp311-cp311-win_amd64.whl", hash = "sha256:6763d1aaeb72e4380b9da3159aacac66c0157cbcd333beb539900be711ce7c1d"},
+ {file = "cloudcheck-9.2.0-cp312-cp312-macosx_10_12_x86_64.whl", hash = "sha256:446c093f5632e1513929ee451539f34031f33bbc00ac56a869e0339f0dad84db"},
+ {file = "cloudcheck-9.2.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:f40d309b3d9ffacbc6d8c99134cadfa63b1b122c0dcd9d58577851afec8ae767"},
+ {file = "cloudcheck-9.2.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:29923a38f54cfdff958d52bbf7f220cf1501ddd9257b26f78074a0d4e0e0d56d"},
+ {file = "cloudcheck-9.2.0-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:577b44f60e4a3290acd095ede0cd714b251c63373d9659c0aeb881f7796bf279"},
+ {file = "cloudcheck-9.2.0-cp312-cp312-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:85ff289b1c6b8c1d9083aa01a100c33ab65039cf8d87adaf33ed1c715f68e3ee"},
+ {file = "cloudcheck-9.2.0-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:5207e591f1158b5bb21a4d5af1cf74d2f7c6c86f014b4f85cd3899d7a6b52b2f"},
+ {file = "cloudcheck-9.2.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9fc6425be8aea470235361f69b8e296110841f934f47ca25747dc7d5f930c3a5"},
+ {file = "cloudcheck-9.2.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:d5cfaab5acf8b5167c7060d59645171b47cf26867c327b467a0fe0af6752808d"},
+ {file = "cloudcheck-9.2.0-cp312-cp312-musllinux_1_2_armv7l.whl", hash = "sha256:2338e95b961007bbbc09beb83991a66b3599b15c9604765ae42b40621690a11d"},
+ {file = "cloudcheck-9.2.0-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:05bd52a20b2b281532c21b957489eb32118f75d7905d49480dcf8eb41367c849"},
+ {file = "cloudcheck-9.2.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:3e30a1fea7e7783487dcb3af661fda89d5e5ae94934074a50204d04edb837d54"},
+ {file = "cloudcheck-9.2.0-cp312-cp312-win_amd64.whl", hash = "sha256:b8497de8acccaa475c7848cd487416ea25417d5fd9e1b633bfc4a3ef24457646"},
+ {file = "cloudcheck-9.2.0-cp313-cp313-macosx_10_12_x86_64.whl", hash = "sha256:1891f6318e7a4d349d12b60ba3323d2063d83b8cb099e162989bb38edcbd82de"},
+ {file = "cloudcheck-9.2.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:71ce9fdb6aaaa0c53889e0a9350d2ce8832fae1fa2b7fa33a9d74a7e88a077dd"},
+ {file = "cloudcheck-9.2.0-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:00dc50a8872add5a74efde46b4d888ead61fadbaa1b73e3a5b397cc0cd8b5574"},
+ {file = "cloudcheck-9.2.0-cp313-cp313-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:96e0d85d6e8e8ed01b7dc592c7f6deec247757e3da2fb9e65c20f35b92a89954"},
+ {file = "cloudcheck-9.2.0-cp313-cp313-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:f770f6625914cf53e52ab8cd8fae2c1fe9a7755daae600673c6bf61d2cfaf9dc"},
+ {file = "cloudcheck-9.2.0-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:8dc2dffa187e5f2aca067955402dad4ad50b950b39c11a63f30528fb7a2d58d1"},
+ {file = "cloudcheck-9.2.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:fa48504be5b6aef0707748ceee5d942dbd0602509e1d4f236e3d6b3878e489ea"},
+ {file = "cloudcheck-9.2.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:272cd7e4122221d5e3dcc314635037f660b3113e59cd18426e82d4dd7d9f9217"},
+ {file = "cloudcheck-9.2.0-cp313-cp313-musllinux_1_2_armv7l.whl", hash = "sha256:aada539ac4ac68fe67fc2c9ce6482ebc3f8af845d7444c5f9081d74e449083b1"},
+ {file = "cloudcheck-9.2.0-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:6a08518b81b6f1df1a0864a8f7d935c25bc7728860cc5e0bf01587be1727b5fb"},
+ {file = "cloudcheck-9.2.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:bc6f6633b1ddf529c18117fc843769ea8d1e3926167a19cc3ecf669f47bdad68"},
+ {file = "cloudcheck-9.2.0-cp313-cp313-win_amd64.whl", hash = "sha256:bf9bd19c930018d163d59e315a72078ade0f704160fde312c9650857e03c5abe"},
+ {file = "cloudcheck-9.2.0-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b5d630c5848e5a5aa87581090cb5ef0eb97218788c053957dc6b8639b8b0bb69"},
+ {file = "cloudcheck-9.2.0-cp313-cp313t-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:fc4e63bde44d8e7b7a597f18472716cf5fe09d6a920e6f8917a1ff92e0004da7"},
+ {file = "cloudcheck-9.2.0-cp313-cp313t-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:92708469c621a50cd78b3f4b1b3b0883529f6ece029f5f71a6eda09b08913da6"},
+ {file = "cloudcheck-9.2.0-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:e30ea7db55e0d213ebd48985addb2cfbb6ac311c93da0b2c3fe19278aa95f88b"},
+ {file = "cloudcheck-9.2.0-cp313-cp313t-musllinux_1_2_armv7l.whl", hash = "sha256:6dcfde62dd7f891203a15f8691a30de7125e7b5eb184d589ec0de4b87d1553a9"},
+ {file = "cloudcheck-9.2.0-cp313-cp313t-musllinux_1_2_i686.whl", hash = "sha256:1525148ff0465438d1053a098b93e234c5102f057f9bc30653d2307d6bcfdeda"},
+ {file = "cloudcheck-9.2.0-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:f49951b74595e6262a252b72334c8a8eddf7ba3dc28c240c2aa3f989d5b1f2a0"},
+ {file = "cloudcheck-9.2.0-cp314-cp314-macosx_10_12_x86_64.whl", hash = "sha256:08a3ae32874cca86b2032f5440715c8aa3d5b2afcb250233c3340f331aead556"},
+ {file = "cloudcheck-9.2.0-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:298d29bf277611fbbb0fa0a93c2f8d22cfbc88c8f24e1c09e20a1e1e5ac50b70"},
+ {file = "cloudcheck-9.2.0-cp314-cp314-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f3796abd1093659f93f200b16a0abb2bb9d14a5207e91e45b2471838ac7ec879"},
+ {file = "cloudcheck-9.2.0-cp314-cp314-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:6b5e64bc3f983eaca02b5e244fcc1b30aa8e795fc9946a27505671d21ded8584"},
+ {file = "cloudcheck-9.2.0-cp314-cp314-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:fae264e5a2c4502badaa9f5958fa95b4612b376ab2d9d44114529a01fa556366"},
+ {file = "cloudcheck-9.2.0-cp314-cp314-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:f085d1d411bfda5e511bd12c7a3f0da41adfac810b8636b5619b85bd37f32c01"},
+ {file = "cloudcheck-9.2.0-cp314-cp314-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ce3f4c66e030e740184e0b86094b4e9754cebb8322ca62a5edc4a272a8c4dd43"},
+ {file = "cloudcheck-9.2.0-cp314-cp314-manylinux_2_38_x86_64.whl", hash = "sha256:43a608d1b6a46d0819b3efb51472168efc72f5bf1c363f60b55cb92ae79b4c0f"},
+ {file = "cloudcheck-9.2.0-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:1476a9dc6d90487a2293d8aa736903e848ddfb93c766ae4f4da14a08f34f3c34"},
+ {file = "cloudcheck-9.2.0-cp314-cp314-musllinux_1_2_armv7l.whl", hash = "sha256:bb18fa35b969d0018c0ce5df49d276c9cd9f0556271418af8b6dd420b60ee16d"},
+ {file = "cloudcheck-9.2.0-cp314-cp314-musllinux_1_2_i686.whl", hash = "sha256:bfb6ecf5041ad02f2baecd39ddd4120a066ee2148e01b3eae0ef952d75d13057"},
+ {file = "cloudcheck-9.2.0-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:07ff5480d8d341de44f22e551a7516a337b6b8c8348f88ce297bb96b13e32656"},
+ {file = "cloudcheck-9.2.0-cp314-cp314-win32.whl", hash = "sha256:b1e80de04b79a8d93cc0de9b308817efbaad1c99fffc63224c4bd45649336880"},
+ {file = "cloudcheck-9.2.0-cp314-cp314-win_amd64.whl", hash = "sha256:20b0d2ee66a243f35f1dd12f644ca6100309282d99ec3048857a5663ba61bb2f"},
+ {file = "cloudcheck-9.2.0-cp314-cp314t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:96094524e590135315ae7e39b540cde1592b0769a6701074c3ca0d630c00e6e5"},
+ {file = "cloudcheck-9.2.0-cp314-cp314t-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:76d1f577d256ddd4dae2c9478d5248ea465f56aad0474c86b9ed737967474aff"},
+ {file = "cloudcheck-9.2.0-cp314-cp314t-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:b51d96d03e1b9b62d293a5d23fccee8c5afaffe0017c67bc01d42f184f6ad79d"},
+ {file = "cloudcheck-9.2.0-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:9002e07ee923d943c243ab57263fb70c32bd53ae81c00c75ef2a7f6cbcec50c4"},
+ {file = "cloudcheck-9.2.0-cp314-cp314t-musllinux_1_2_armv7l.whl", hash = "sha256:e6cdc0b9349ed05ba3dd4abeb4f1746c01674eeffd3a9949d9413d56a082c59a"},
+ {file = "cloudcheck-9.2.0-cp314-cp314t-musllinux_1_2_i686.whl", hash = "sha256:8a20d4db17d2dfba703866b43fbd19fe9901229982472064af06d9c374362aad"},
+ {file = "cloudcheck-9.2.0-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:19ed428b82367f501699479857c748fac083f8dcbe4708bc9507c16eb7081aab"},
+ {file = "cloudcheck-9.2.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ef100062c8e9cebca93bb19632a91c6972fe92a09cd5fe8ffcdda05fe3ecb4e3"},
+ {file = "cloudcheck-9.2.0-cp39-cp39-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:e75971eea64b2cc178279be12a08424178a0a902c9f410c638a8ec6d6831dbe3"},
+ {file = "cloudcheck-9.2.0-cp39-cp39-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:511e4679385729a53b0aa48af8fbfb9bd7e03dd7a49e4630e1235584df302a92"},
+ {file = "cloudcheck-9.2.0-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:b5ed98d17cc35f0acb9ad29b535117b36b8a90c05aa3a759e0299b5f2c94d136"},
+ {file = "cloudcheck-9.2.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a7741addc9d07b7a51936be2074f8ac169b6dc270a93bafb4d45f752ae8c8a04"},
+ {file = "cloudcheck-9.2.0-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:c8401630c89227624ed8e8f154806a735957f2eeae99711f2b28cdffc7bfd2ce"},
+ {file = "cloudcheck-9.2.0-cp39-cp39-musllinux_1_2_armv7l.whl", hash = "sha256:011465559226b8306c484a5c9df7a782f3f1def84b176d7ed2189c7b9496d701"},
+ {file = "cloudcheck-9.2.0-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:27cd2c1bd2feac0077d467fef4b661d56cd99a2d5d2b0c7888c63ce91f013c41"},
+ {file = "cloudcheck-9.2.0-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:dbb7895f716c3ed079aa9a1cb28603ce01e39a1a0f7cca31fc1c841a404f4628"},
+ {file = "cloudcheck-9.2.0-pp311-pypy311_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ecf8be754284074b48ead613908e2f9a4dac3dad32b8a8fc3ff5e8f530469bc6"},
+ {file = "cloudcheck-9.2.0-pp311-pypy311_pp73-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:f2d50892daae3b7ad564e8d9f9d4070089b6ebfd4fcd1dc1e94c04248a16ccd3"},
+ {file = "cloudcheck-9.2.0-pp311-pypy311_pp73-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:9e780df63753c621faf376dee513eaf8933c6a18507b8d7b8770a34b2059ede6"},
+ {file = "cloudcheck-9.2.0-pp311-pypy311_pp73-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:71c5df0d0ba2305ccbc2fe892866b456a0d44cc746fbb0f0c7d38655c8d77042"},
+ {file = "cloudcheck-9.2.0-pp311-pypy311_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8b70749be44991870d5355a06f629028d133efc64442557e6bd0349565bd9598"},
+ {file = "cloudcheck-9.2.0-pp311-pypy311_pp73-musllinux_1_2_aarch64.whl", hash = "sha256:4927bc71562c9666e671932e32c0f1f97533b62c2828bfe3e1956291d1033217"},
+ {file = "cloudcheck-9.2.0-pp311-pypy311_pp73-musllinux_1_2_armv7l.whl", hash = "sha256:98d3bdec378073ceba3e4a3ef082084420102b9d6910e6d9423585246dbe0a8a"},
+ {file = "cloudcheck-9.2.0-pp311-pypy311_pp73-musllinux_1_2_i686.whl", hash = "sha256:b054de2006d8281d2e2382aa9b5fbf7006a541dddf810e44bdf89afd8c5299a5"},
+ {file = "cloudcheck-9.2.0-pp311-pypy311_pp73-musllinux_1_2_x86_64.whl", hash = "sha256:5e4647210fa8fec02b45ea302f067ff1d6dc27555d1a2d0978b7c1df6ce2fd55"},
+ {file = "cloudcheck-9.2.0.tar.gz", hash = "sha256:961bfc102f2944a1f83fd61d3faab96fc8be47e4919089bd5ccad7a47a2738bb"},
]
[[package]]
@@ -1983,7 +1983,7 @@ description = "C parser in Python"
optional = false
python-versions = ">=3.8"
groups = ["main"]
-markers = "implementation_name == \"pypy\" or platform_python_implementation != \"PyPy\""
+markers = "platform_python_implementation != \"PyPy\" or implementation_name == \"pypy\""
files = [
{file = "pycparser-2.22-py3-none-any.whl", hash = "sha256:c3702b6d3dd8c7abc1afa565d7e63d53a1d0bd86cdc24edd75470f4de499cfcc"},
{file = "pycparser-2.22.tar.gz", hash = "sha256:491c8be9c040f5390f5bf44a5b07752bd07f56edf992381b05c701439eec10f6"},
@@ -2667,127 +2667,143 @@ files = [
[[package]]
name = "regex"
-version = "2025.11.3"
+version = "2026.1.15"
description = "Alternative regular expression module, to replace re."
optional = false
python-versions = ">=3.9"
groups = ["main"]
files = [
- {file = "regex-2025.11.3-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:2b441a4ae2c8049106e8b39973bfbddfb25a179dda2bdb99b0eeb60c40a6a3af"},
- {file = "regex-2025.11.3-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:2fa2eed3f76677777345d2f81ee89f5de2f5745910e805f7af7386a920fa7313"},
- {file = "regex-2025.11.3-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:d8b4a27eebd684319bdf473d39f1d79eed36bf2cd34bd4465cdb4618d82b3d56"},
- {file = "regex-2025.11.3-cp310-cp310-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:5cf77eac15bd264986c4a2c63353212c095b40f3affb2bc6b4ef80c4776c1a28"},
- {file = "regex-2025.11.3-cp310-cp310-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:b7f9ee819f94c6abfa56ec7b1dbab586f41ebbdc0a57e6524bd5e7f487a878c7"},
- {file = "regex-2025.11.3-cp310-cp310-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:838441333bc90b829406d4a03cb4b8bf7656231b84358628b0406d803931ef32"},
- {file = "regex-2025.11.3-cp310-cp310-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:cfe6d3f0c9e3b7e8c0c694b24d25e677776f5ca26dce46fd6b0489f9c8339391"},
- {file = "regex-2025.11.3-cp310-cp310-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:2ab815eb8a96379a27c3b6157fcb127c8f59c36f043c1678110cea492868f1d5"},
- {file = "regex-2025.11.3-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:728a9d2d173a65b62bdc380b7932dd8e74ed4295279a8fe1021204ce210803e7"},
- {file = "regex-2025.11.3-cp310-cp310-musllinux_1_2_ppc64le.whl", hash = "sha256:509dc827f89c15c66a0c216331260d777dd6c81e9a4e4f830e662b0bb296c313"},
- {file = "regex-2025.11.3-cp310-cp310-musllinux_1_2_s390x.whl", hash = "sha256:849202cd789e5f3cf5dcc7822c34b502181b4824a65ff20ce82da5524e45e8e9"},
- {file = "regex-2025.11.3-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:b6f78f98741dcc89607c16b1e9426ee46ce4bf31ac5e6b0d40e81c89f3481ea5"},
- {file = "regex-2025.11.3-cp310-cp310-win32.whl", hash = "sha256:149eb0bba95231fb4f6d37c8f760ec9fa6fabf65bab555e128dde5f2475193ec"},
- {file = "regex-2025.11.3-cp310-cp310-win_amd64.whl", hash = "sha256:ee3a83ce492074c35a74cc76cf8235d49e77b757193a5365ff86e3f2f93db9fd"},
- {file = "regex-2025.11.3-cp310-cp310-win_arm64.whl", hash = "sha256:38af559ad934a7b35147716655d4a2f79fcef2d695ddfe06a06ba40ae631fa7e"},
- {file = "regex-2025.11.3-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:eadade04221641516fa25139273505a1c19f9bf97589a05bc4cfcd8b4a618031"},
- {file = "regex-2025.11.3-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:feff9e54ec0dd3833d659257f5c3f5322a12eee58ffa360984b716f8b92983f4"},
- {file = "regex-2025.11.3-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:3b30bc921d50365775c09a7ed446359e5c0179e9e2512beec4a60cbcef6ddd50"},
- {file = "regex-2025.11.3-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:f99be08cfead2020c7ca6e396c13543baea32343b7a9a5780c462e323bd8872f"},
- {file = "regex-2025.11.3-cp311-cp311-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:6dd329a1b61c0ee95ba95385fb0c07ea0d3fe1a21e1349fa2bec272636217118"},
- {file = "regex-2025.11.3-cp311-cp311-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:4c5238d32f3c5269d9e87be0cf096437b7622b6920f5eac4fd202468aaeb34d2"},
- {file = "regex-2025.11.3-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:10483eefbfb0adb18ee9474498c9a32fcf4e594fbca0543bb94c48bac6183e2e"},
- {file = "regex-2025.11.3-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:78c2d02bb6e1da0720eedc0bad578049cad3f71050ef8cd065ecc87691bed2b0"},
- {file = "regex-2025.11.3-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:e6b49cd2aad93a1790ce9cffb18964f6d3a4b0b3dbdbd5de094b65296fce6e58"},
- {file = "regex-2025.11.3-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:885b26aa3ee56433b630502dc3d36ba78d186a00cc535d3806e6bfd9ed3c70ab"},
- {file = "regex-2025.11.3-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:ddd76a9f58e6a00f8772e72cff8ebcff78e022be95edf018766707c730593e1e"},
- {file = "regex-2025.11.3-cp311-cp311-win32.whl", hash = "sha256:3e816cc9aac1cd3cc9a4ec4d860f06d40f994b5c7b4d03b93345f44e08cc68bf"},
- {file = "regex-2025.11.3-cp311-cp311-win_amd64.whl", hash = "sha256:087511f5c8b7dfbe3a03f5d5ad0c2a33861b1fc387f21f6f60825a44865a385a"},
- {file = "regex-2025.11.3-cp311-cp311-win_arm64.whl", hash = "sha256:1ff0d190c7f68ae7769cd0313fe45820ba07ffebfddfaa89cc1eb70827ba0ddc"},
- {file = "regex-2025.11.3-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:bc8ab71e2e31b16e40868a40a69007bc305e1109bd4658eb6cad007e0bf67c41"},
- {file = "regex-2025.11.3-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:22b29dda7e1f7062a52359fca6e58e548e28c6686f205e780b02ad8ef710de36"},
- {file = "regex-2025.11.3-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:3a91e4a29938bc1a082cc28fdea44be420bf2bebe2665343029723892eb073e1"},
- {file = "regex-2025.11.3-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:08b884f4226602ad40c5d55f52bf91a9df30f513864e0054bad40c0e9cf1afb7"},
- {file = "regex-2025.11.3-cp312-cp312-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:3e0b11b2b2433d1c39c7c7a30e3f3d0aeeea44c2a8d0bae28f6b95f639927a69"},
- {file = "regex-2025.11.3-cp312-cp312-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:87eb52a81ef58c7ba4d45c3ca74e12aa4b4e77816f72ca25258a85b3ea96cb48"},
- {file = "regex-2025.11.3-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:a12ab1f5c29b4e93db518f5e3872116b7e9b1646c9f9f426f777b50d44a09e8c"},
- {file = "regex-2025.11.3-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:7521684c8c7c4f6e88e35ec89680ee1aa8358d3f09d27dfbdf62c446f5d4c695"},
- {file = "regex-2025.11.3-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:7fe6e5440584e94cc4b3f5f4d98a25e29ca12dccf8873679a635638349831b98"},
- {file = "regex-2025.11.3-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:8e026094aa12b43f4fd74576714e987803a315c76edb6b098b9809db5de58f74"},
- {file = "regex-2025.11.3-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:435bbad13e57eb5606a68443af62bed3556de2f46deb9f7d4237bc2f1c9fb3a0"},
- {file = "regex-2025.11.3-cp312-cp312-win32.whl", hash = "sha256:3839967cf4dc4b985e1570fd8d91078f0c519f30491c60f9ac42a8db039be204"},
- {file = "regex-2025.11.3-cp312-cp312-win_amd64.whl", hash = "sha256:e721d1b46e25c481dc5ded6f4b3f66c897c58d2e8cfdf77bbced84339108b0b9"},
- {file = "regex-2025.11.3-cp312-cp312-win_arm64.whl", hash = "sha256:64350685ff08b1d3a6fff33f45a9ca183dc1d58bbfe4981604e70ec9801bbc26"},
- {file = "regex-2025.11.3-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:c1e448051717a334891f2b9a620fe36776ebf3dd8ec46a0b877c8ae69575feb4"},
- {file = "regex-2025.11.3-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:9b5aca4d5dfd7fbfbfbdaf44850fcc7709a01146a797536a8f84952e940cca76"},
- {file = "regex-2025.11.3-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:04d2765516395cf7dda331a244a3282c0f5ae96075f728629287dfa6f76ba70a"},
- {file = "regex-2025.11.3-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:5d9903ca42bfeec4cebedba8022a7c97ad2aab22e09573ce9976ba01b65e4361"},
- {file = "regex-2025.11.3-cp313-cp313-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:639431bdc89d6429f6721625e8129413980ccd62e9d3f496be618a41d205f160"},
- {file = "regex-2025.11.3-cp313-cp313-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:f117efad42068f9715677c8523ed2be1518116d1c49b1dd17987716695181efe"},
- {file = "regex-2025.11.3-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:4aecb6f461316adf9f1f0f6a4a1a3d79e045f9b71ec76055a791affa3b285850"},
- {file = "regex-2025.11.3-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:3b3a5f320136873cc5561098dfab677eea139521cb9a9e8db98b7e64aef44cbc"},
- {file = "regex-2025.11.3-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:75fa6f0056e7efb1f42a1c34e58be24072cb9e61a601340cc1196ae92326a4f9"},
- {file = "regex-2025.11.3-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:dbe6095001465294f13f1adcd3311e50dd84e5a71525f20a10bd16689c61ce0b"},
- {file = "regex-2025.11.3-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:454d9b4ae7881afbc25015b8627c16d88a597479b9dea82b8c6e7e2e07240dc7"},
- {file = "regex-2025.11.3-cp313-cp313-win32.whl", hash = "sha256:28ba4d69171fc6e9896337d4fc63a43660002b7da53fc15ac992abcf3410917c"},
- {file = "regex-2025.11.3-cp313-cp313-win_amd64.whl", hash = "sha256:bac4200befe50c670c405dc33af26dad5a3b6b255dd6c000d92fe4629f9ed6a5"},
- {file = "regex-2025.11.3-cp313-cp313-win_arm64.whl", hash = "sha256:2292cd5a90dab247f9abe892ac584cb24f0f54680c73fcb4a7493c66c2bf2467"},
- {file = "regex-2025.11.3-cp313-cp313t-macosx_10_13_universal2.whl", hash = "sha256:1eb1ebf6822b756c723e09f5186473d93236c06c579d2cc0671a722d2ab14281"},
- {file = "regex-2025.11.3-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:1e00ec2970aab10dc5db34af535f21fcf32b4a31d99e34963419636e2f85ae39"},
- {file = "regex-2025.11.3-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:a4cb042b615245d5ff9b3794f56be4138b5adc35a4166014d31d1814744148c7"},
- {file = "regex-2025.11.3-cp313-cp313t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:44f264d4bf02f3176467d90b294d59bf1db9fe53c141ff772f27a8b456b2a9ed"},
- {file = "regex-2025.11.3-cp313-cp313t-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:7be0277469bf3bd7a34a9c57c1b6a724532a0d235cd0dc4e7f4316f982c28b19"},
- {file = "regex-2025.11.3-cp313-cp313t-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:0d31e08426ff4b5b650f68839f5af51a92a5b51abd8554a60c2fbc7c71f25d0b"},
- {file = "regex-2025.11.3-cp313-cp313t-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:e43586ce5bd28f9f285a6e729466841368c4a0353f6fd08d4ce4630843d3648a"},
- {file = "regex-2025.11.3-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:0f9397d561a4c16829d4e6ff75202c1c08b68a3bdbfe29dbfcdb31c9830907c6"},
- {file = "regex-2025.11.3-cp313-cp313t-musllinux_1_2_ppc64le.whl", hash = "sha256:dd16e78eb18ffdb25ee33a0682d17912e8cc8a770e885aeee95020046128f1ce"},
- {file = "regex-2025.11.3-cp313-cp313t-musllinux_1_2_s390x.whl", hash = "sha256:ffcca5b9efe948ba0661e9df0fa50d2bc4b097c70b9810212d6b62f05d83b2dd"},
- {file = "regex-2025.11.3-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:c56b4d162ca2b43318ac671c65bd4d563e841a694ac70e1a976ac38fcf4ca1d2"},
- {file = "regex-2025.11.3-cp313-cp313t-win32.whl", hash = "sha256:9ddc42e68114e161e51e272f667d640f97e84a2b9ef14b7477c53aac20c2d59a"},
- {file = "regex-2025.11.3-cp313-cp313t-win_amd64.whl", hash = "sha256:7a7c7fdf755032ffdd72c77e3d8096bdcb0eb92e89e17571a196f03d88b11b3c"},
- {file = "regex-2025.11.3-cp313-cp313t-win_arm64.whl", hash = "sha256:df9eb838c44f570283712e7cff14c16329a9f0fb19ca492d21d4b7528ee6821e"},
- {file = "regex-2025.11.3-cp314-cp314-macosx_10_13_universal2.whl", hash = "sha256:9697a52e57576c83139d7c6f213d64485d3df5bf84807c35fa409e6c970801c6"},
- {file = "regex-2025.11.3-cp314-cp314-macosx_10_13_x86_64.whl", hash = "sha256:e18bc3f73bd41243c9b38a6d9f2366cd0e0137a9aebe2d8ff76c5b67d4c0a3f4"},
- {file = "regex-2025.11.3-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:61a08bcb0ec14ff4e0ed2044aad948d0659604f824cbd50b55e30b0ec6f09c73"},
- {file = "regex-2025.11.3-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:c9c30003b9347c24bcc210958c5d167b9e4f9be786cb380a7d32f14f9b84674f"},
- {file = "regex-2025.11.3-cp314-cp314-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:4e1e592789704459900728d88d41a46fe3969b82ab62945560a31732ffc19a6d"},
- {file = "regex-2025.11.3-cp314-cp314-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:6538241f45eb5a25aa575dbba1069ad786f68a4f2773a29a2bd3dd1f9de787be"},
- {file = "regex-2025.11.3-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:bce22519c989bb72a7e6b36a199384c53db7722fe669ba891da75907fe3587db"},
- {file = "regex-2025.11.3-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:66d559b21d3640203ab9075797a55165d79017520685fb407b9234d72ab63c62"},
- {file = "regex-2025.11.3-cp314-cp314-musllinux_1_2_ppc64le.whl", hash = "sha256:669dcfb2e38f9e8c69507bace46f4889e3abbfd9b0c29719202883c0a603598f"},
- {file = "regex-2025.11.3-cp314-cp314-musllinux_1_2_s390x.whl", hash = "sha256:32f74f35ff0f25a5021373ac61442edcb150731fbaa28286bbc8bb1582c89d02"},
- {file = "regex-2025.11.3-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:e6c7a21dffba883234baefe91bc3388e629779582038f75d2a5be918e250f0ed"},
- {file = "regex-2025.11.3-cp314-cp314-win32.whl", hash = "sha256:795ea137b1d809eb6836b43748b12634291c0ed55ad50a7d72d21edf1cd565c4"},
- {file = "regex-2025.11.3-cp314-cp314-win_amd64.whl", hash = "sha256:9f95fbaa0ee1610ec0fc6b26668e9917a582ba80c52cc6d9ada15e30aa9ab9ad"},
- {file = "regex-2025.11.3-cp314-cp314-win_arm64.whl", hash = "sha256:dfec44d532be4c07088c3de2876130ff0fbeeacaa89a137decbbb5f665855a0f"},
- {file = "regex-2025.11.3-cp314-cp314t-macosx_10_13_universal2.whl", hash = "sha256:ba0d8a5d7f04f73ee7d01d974d47c5834f8a1b0224390e4fe7c12a3a92a78ecc"},
- {file = "regex-2025.11.3-cp314-cp314t-macosx_10_13_x86_64.whl", hash = "sha256:442d86cf1cfe4faabf97db7d901ef58347efd004934da045c745e7b5bd57ac49"},
- {file = "regex-2025.11.3-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:fd0a5e563c756de210bb964789b5abe4f114dacae9104a47e1a649b910361536"},
- {file = "regex-2025.11.3-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:bf3490bcbb985a1ae97b2ce9ad1c0f06a852d5b19dde9b07bdf25bf224248c95"},
- {file = "regex-2025.11.3-cp314-cp314t-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:3809988f0a8b8c9dcc0f92478d6501fac7200b9ec56aecf0ec21f4a2ec4b6009"},
- {file = "regex-2025.11.3-cp314-cp314t-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:f4ff94e58e84aedb9c9fce66d4ef9f27a190285b451420f297c9a09f2b9abee9"},
- {file = "regex-2025.11.3-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:7eb542fd347ce61e1321b0a6b945d5701528dca0cd9759c2e3bb8bd57e47964d"},
- {file = "regex-2025.11.3-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:d6c2d5919075a1f2e413c00b056ea0c2f065b3f5fe83c3d07d325ab92dce51d6"},
- {file = "regex-2025.11.3-cp314-cp314t-musllinux_1_2_ppc64le.whl", hash = "sha256:3f8bf11a4827cc7ce5a53d4ef6cddd5ad25595d3c1435ef08f76825851343154"},
- {file = "regex-2025.11.3-cp314-cp314t-musllinux_1_2_s390x.whl", hash = "sha256:22c12d837298651e5550ac1d964e4ff57c3f56965fc1812c90c9fb2028eaf267"},
- {file = "regex-2025.11.3-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:62ba394a3dda9ad41c7c780f60f6e4a70988741415ae96f6d1bf6c239cf01379"},
- {file = "regex-2025.11.3-cp314-cp314t-win32.whl", hash = "sha256:4bf146dca15cdd53224a1bf46d628bd7590e4a07fbb69e720d561aea43a32b38"},
- {file = "regex-2025.11.3-cp314-cp314t-win_amd64.whl", hash = "sha256:adad1a1bcf1c9e76346e091d22d23ac54ef28e1365117d99521631078dfec9de"},
- {file = "regex-2025.11.3-cp314-cp314t-win_arm64.whl", hash = "sha256:c54f768482cef41e219720013cd05933b6f971d9562544d691c68699bf2b6801"},
- {file = "regex-2025.11.3-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:81519e25707fc076978c6143b81ea3dc853f176895af05bf7ec51effe818aeec"},
- {file = "regex-2025.11.3-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:3bf28b1873a8af8bbb58c26cc56ea6e534d80053b41fb511a35795b6de507e6a"},
- {file = "regex-2025.11.3-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:856a25c73b697f2ce2a24e7968285579e62577a048526161a2c0f53090bea9f9"},
- {file = "regex-2025.11.3-cp39-cp39-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:8a3d571bd95fade53c86c0517f859477ff3a93c3fde10c9e669086f038e0f207"},
- {file = "regex-2025.11.3-cp39-cp39-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:732aea6de26051af97b94bc98ed86448821f839d058e5d259c72bf6d73ad0fc0"},
- {file = "regex-2025.11.3-cp39-cp39-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:51c1c1847128238f54930edb8805b660305dca164645a9fd29243f5610beea34"},
- {file = "regex-2025.11.3-cp39-cp39-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:22dd622a402aad4558277305350699b2be14bc59f64d64ae1d928ce7d072dced"},
- {file = "regex-2025.11.3-cp39-cp39-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:f3b5a391c7597ffa96b41bd5cbd2ed0305f515fcbb367dfa72735679d5502364"},
- {file = "regex-2025.11.3-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:cc4076a5b4f36d849fd709284b4a3b112326652f3b0466f04002a6c15a0c96c1"},
- {file = "regex-2025.11.3-cp39-cp39-musllinux_1_2_ppc64le.whl", hash = "sha256:a295ca2bba5c1c885826ce3125fa0b9f702a1be547d821c01d65f199e10c01e2"},
- {file = "regex-2025.11.3-cp39-cp39-musllinux_1_2_s390x.whl", hash = "sha256:b4774ff32f18e0504bfc4e59a3e71e18d83bc1e171a3c8ed75013958a03b2f14"},
- {file = "regex-2025.11.3-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:22e7d1cdfa88ef33a2ae6aa0d707f9255eb286ffbd90045f1088246833223aee"},
- {file = "regex-2025.11.3-cp39-cp39-win32.whl", hash = "sha256:74d04244852ff73b32eeede4f76f51c5bcf44bc3c207bc3e6cf1c5c45b890708"},
- {file = "regex-2025.11.3-cp39-cp39-win_amd64.whl", hash = "sha256:7a50cd39f73faa34ec18d6720ee25ef10c4c1839514186fcda658a06c06057a2"},
- {file = "regex-2025.11.3-cp39-cp39-win_arm64.whl", hash = "sha256:43b4fb020e779ca81c1b5255015fe2b82816c76ec982354534ad9ec09ad7c9e3"},
- {file = "regex-2025.11.3.tar.gz", hash = "sha256:1fedc720f9bb2494ce31a58a1631f9c82df6a09b49c19517ea5cc280b4541e01"},
+ {file = "regex-2026.1.15-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:4e3dd93c8f9abe8aa4b6c652016da9a3afa190df5ad822907efe6b206c09896e"},
+ {file = "regex-2026.1.15-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:97499ff7862e868b1977107873dd1a06e151467129159a6ffd07b66706ba3a9f"},
+ {file = "regex-2026.1.15-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:0bda75ebcac38d884240914c6c43d8ab5fb82e74cde6da94b43b17c411aa4c2b"},
+ {file = "regex-2026.1.15-cp310-cp310-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:7dcc02368585334f5bc81fc73a2a6a0bbade60e7d83da21cead622faf408f32c"},
+ {file = "regex-2026.1.15-cp310-cp310-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:693b465171707bbe882a7a05de5e866f33c76aa449750bee94a8d90463533cc9"},
+ {file = "regex-2026.1.15-cp310-cp310-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:b0d190e6f013ea938623a58706d1469a62103fb2a241ce2873a9906e0386582c"},
+ {file = "regex-2026.1.15-cp310-cp310-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:5ff818702440a5878a81886f127b80127f5d50563753a28211482867f8318106"},
+ {file = "regex-2026.1.15-cp310-cp310-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:f052d1be37ef35a54e394de66136e30fa1191fab64f71fc06ac7bc98c9a84618"},
+ {file = "regex-2026.1.15-cp310-cp310-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:6bfc31a37fd1592f0c4fc4bfc674b5c42e52efe45b4b7a6a14f334cca4bcebe4"},
+ {file = "regex-2026.1.15-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:3d6ce5ae80066b319ae3bc62fd55a557c9491baa5efd0d355f0de08c4ba54e79"},
+ {file = "regex-2026.1.15-cp310-cp310-musllinux_1_2_ppc64le.whl", hash = "sha256:1704d204bd42b6bb80167df0e4554f35c255b579ba99616def38f69e14a5ccb9"},
+ {file = "regex-2026.1.15-cp310-cp310-musllinux_1_2_riscv64.whl", hash = "sha256:e3174a5ed4171570dc8318afada56373aa9289eb6dc0d96cceb48e7358b0e220"},
+ {file = "regex-2026.1.15-cp310-cp310-musllinux_1_2_s390x.whl", hash = "sha256:87adf5bd6d72e3e17c9cb59ac4096b1faaf84b7eb3037a5ffa61c4b4370f0f13"},
+ {file = "regex-2026.1.15-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:e85dc94595f4d766bd7d872a9de5ede1ca8d3063f3bdf1e2c725f5eb411159e3"},
+ {file = "regex-2026.1.15-cp310-cp310-win32.whl", hash = "sha256:21ca32c28c30d5d65fc9886ff576fc9b59bbca08933e844fa2363e530f4c8218"},
+ {file = "regex-2026.1.15-cp310-cp310-win_amd64.whl", hash = "sha256:3038a62fc7d6e5547b8915a3d927a0fbeef84cdbe0b1deb8c99bbd4a8961b52a"},
+ {file = "regex-2026.1.15-cp310-cp310-win_arm64.whl", hash = "sha256:505831646c945e3e63552cc1b1b9b514f0e93232972a2d5bedbcc32f15bc82e3"},
+ {file = "regex-2026.1.15-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:1ae6020fb311f68d753b7efa9d4b9a5d47a5d6466ea0d5e3b5a471a960ea6e4a"},
+ {file = "regex-2026.1.15-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:eddf73f41225942c1f994914742afa53dc0d01a6e20fe14b878a1b1edc74151f"},
+ {file = "regex-2026.1.15-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:1e8cd52557603f5c66a548f69421310886b28b7066853089e1a71ee710e1cdc1"},
+ {file = "regex-2026.1.15-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:5170907244b14303edc5978f522f16c974f32d3aa92109fabc2af52411c9433b"},
+ {file = "regex-2026.1.15-cp311-cp311-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:2748c1ec0663580b4510bd89941a31560b4b439a0b428b49472a3d9944d11cd8"},
+ {file = "regex-2026.1.15-cp311-cp311-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:2f2775843ca49360508d080eaa87f94fa248e2c946bbcd963bb3aae14f333413"},
+ {file = "regex-2026.1.15-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:d9ea2604370efc9a174c1b5dcc81784fb040044232150f7f33756049edfc9026"},
+ {file = "regex-2026.1.15-cp311-cp311-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:0dcd31594264029b57bf16f37fd7248a70b3b764ed9e0839a8f271b2d22c0785"},
+ {file = "regex-2026.1.15-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:c08c1f3e34338256732bd6938747daa3c0d5b251e04b6e43b5813e94d503076e"},
+ {file = "regex-2026.1.15-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:e43a55f378df1e7a4fa3547c88d9a5a9b7113f653a66821bcea4718fe6c58763"},
+ {file = "regex-2026.1.15-cp311-cp311-musllinux_1_2_riscv64.whl", hash = "sha256:f82110ab962a541737bd0ce87978d4c658f06e7591ba899192e2712a517badbb"},
+ {file = "regex-2026.1.15-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:27618391db7bdaf87ac6c92b31e8f0dfb83a9de0075855152b720140bda177a2"},
+ {file = "regex-2026.1.15-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:bfb0d6be01fbae8d6655c8ca21b3b72458606c4aec9bbc932db758d47aba6db1"},
+ {file = "regex-2026.1.15-cp311-cp311-win32.whl", hash = "sha256:b10e42a6de0e32559a92f2f8dc908478cc0fa02838d7dbe764c44dca3fa13569"},
+ {file = "regex-2026.1.15-cp311-cp311-win_amd64.whl", hash = "sha256:e9bf3f0bbdb56633c07d7116ae60a576f846efdd86a8848f8d62b749e1209ca7"},
+ {file = "regex-2026.1.15-cp311-cp311-win_arm64.whl", hash = "sha256:41aef6f953283291c4e4e6850607bd71502be67779586a61472beacb315c97ec"},
+ {file = "regex-2026.1.15-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:4c8fcc5793dde01641a35905d6731ee1548f02b956815f8f1cab89e515a5bdf1"},
+ {file = "regex-2026.1.15-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:bfd876041a956e6a90ad7cdb3f6a630c07d491280bfeed4544053cd434901681"},
+ {file = "regex-2026.1.15-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:9250d087bc92b7d4899ccd5539a1b2334e44eee85d848c4c1aef8e221d3f8c8f"},
+ {file = "regex-2026.1.15-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:c8a154cf6537ebbc110e24dabe53095e714245c272da9c1be05734bdad4a61aa"},
+ {file = "regex-2026.1.15-cp312-cp312-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:8050ba2e3ea1d8731a549e83c18d2f0999fbc99a5f6bd06b4c91449f55291804"},
+ {file = "regex-2026.1.15-cp312-cp312-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:0bf065240704cb8951cc04972cf107063917022511273e0969bdb34fc173456c"},
+ {file = "regex-2026.1.15-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:c32bef3e7aeee75746748643667668ef941d28b003bfc89994ecf09a10f7a1b5"},
+ {file = "regex-2026.1.15-cp312-cp312-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:d5eaa4a4c5b1906bd0d2508d68927f15b81821f85092e06f1a34a4254b0e1af3"},
+ {file = "regex-2026.1.15-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:86c1077a3cc60d453d4084d5b9649065f3bf1184e22992bd322e1f081d3117fb"},
+ {file = "regex-2026.1.15-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:2b091aefc05c78d286657cd4db95f2e6313375ff65dcf085e42e4c04d9c8d410"},
+ {file = "regex-2026.1.15-cp312-cp312-musllinux_1_2_riscv64.whl", hash = "sha256:57e7d17f59f9ebfa9667e6e5a1c0127b96b87cb9cede8335482451ed00788ba4"},
+ {file = "regex-2026.1.15-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:c6c4dcdfff2c08509faa15d36ba7e5ef5fcfab25f1e8f85a0c8f45bc3a30725d"},
+ {file = "regex-2026.1.15-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:cf8ff04c642716a7f2048713ddc6278c5fd41faa3b9cab12607c7abecd012c22"},
+ {file = "regex-2026.1.15-cp312-cp312-win32.whl", hash = "sha256:82345326b1d8d56afbe41d881fdf62f1926d7264b2fc1537f99ae5da9aad7913"},
+ {file = "regex-2026.1.15-cp312-cp312-win_amd64.whl", hash = "sha256:4def140aa6156bc64ee9912383d4038f3fdd18fee03a6f222abd4de6357ce42a"},
+ {file = "regex-2026.1.15-cp312-cp312-win_arm64.whl", hash = "sha256:c6c565d9a6e1a8d783c1948937ffc377dd5771e83bd56de8317c450a954d2056"},
+ {file = "regex-2026.1.15-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:e69d0deeb977ffe7ed3d2e4439360089f9c3f217ada608f0f88ebd67afb6385e"},
+ {file = "regex-2026.1.15-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:3601ffb5375de85a16f407854d11cca8fe3f5febbe3ac78fb2866bb220c74d10"},
+ {file = "regex-2026.1.15-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:4c5ef43b5c2d4114eb8ea424bb8c9cec01d5d17f242af88b2448f5ee81caadbc"},
+ {file = "regex-2026.1.15-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:968c14d4f03e10b2fd960f1d5168c1f0ac969381d3c1fcc973bc45fb06346599"},
+ {file = "regex-2026.1.15-cp313-cp313-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:56a5595d0f892f214609c9f76b41b7428bed439d98dc961efafdd1354d42baae"},
+ {file = "regex-2026.1.15-cp313-cp313-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:0bf650f26087363434c4e560011f8e4e738f6f3e029b85d4904c50135b86cfa5"},
+ {file = "regex-2026.1.15-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:18388a62989c72ac24de75f1449d0fb0b04dfccd0a1a7c1c43af5eb503d890f6"},
+ {file = "regex-2026.1.15-cp313-cp313-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:6d220a2517f5893f55daac983bfa9fe998a7dbcaee4f5d27a88500f8b7873788"},
+ {file = "regex-2026.1.15-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:c9c08c2fbc6120e70abff5d7f28ffb4d969e14294fb2143b4b5c7d20e46d1714"},
+ {file = "regex-2026.1.15-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:7ef7d5d4bd49ec7364315167a4134a015f61e8266c6d446fc116a9ac4456e10d"},
+ {file = "regex-2026.1.15-cp313-cp313-musllinux_1_2_riscv64.whl", hash = "sha256:6e42844ad64194fa08d5ccb75fe6a459b9b08e6d7296bd704460168d58a388f3"},
+ {file = "regex-2026.1.15-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:cfecdaa4b19f9ca534746eb3b55a5195d5c95b88cac32a205e981ec0a22b7d31"},
+ {file = "regex-2026.1.15-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:08df9722d9b87834a3d701f3fca570b2be115654dbfd30179f30ab2f39d606d3"},
+ {file = "regex-2026.1.15-cp313-cp313-win32.whl", hash = "sha256:d426616dae0967ca225ab12c22274eb816558f2f99ccb4a1d52ca92e8baf180f"},
+ {file = "regex-2026.1.15-cp313-cp313-win_amd64.whl", hash = "sha256:febd38857b09867d3ed3f4f1af7d241c5c50362e25ef43034995b77a50df494e"},
+ {file = "regex-2026.1.15-cp313-cp313-win_arm64.whl", hash = "sha256:8e32f7896f83774f91499d239e24cebfadbc07639c1494bb7213983842348337"},
+ {file = "regex-2026.1.15-cp313-cp313t-macosx_10_13_universal2.whl", hash = "sha256:ec94c04149b6a7b8120f9f44565722c7ae31b7a6d2275569d2eefa76b83da3be"},
+ {file = "regex-2026.1.15-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:40c86d8046915bb9aeb15d3f3f15b6fd500b8ea4485b30e1bbc799dab3fe29f8"},
+ {file = "regex-2026.1.15-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:726ea4e727aba21643205edad8f2187ec682d3305d790f73b7a51c7587b64bdd"},
+ {file = "regex-2026.1.15-cp313-cp313t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:1cb740d044aff31898804e7bf1181cc72c03d11dfd19932b9911ffc19a79070a"},
+ {file = "regex-2026.1.15-cp313-cp313t-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:05d75a668e9ea16f832390d22131fe1e8acc8389a694c8febc3e340b0f810b93"},
+ {file = "regex-2026.1.15-cp313-cp313t-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:d991483606f3dbec93287b9f35596f41aa2e92b7c2ebbb935b63f409e243c9af"},
+ {file = "regex-2026.1.15-cp313-cp313t-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:194312a14819d3e44628a44ed6fea6898fdbecb0550089d84c403475138d0a09"},
+ {file = "regex-2026.1.15-cp313-cp313t-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:fe2fda4110a3d0bc163c2e0664be44657431440722c5c5315c65155cab92f9e5"},
+ {file = "regex-2026.1.15-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:124dc36c85d34ef2d9164da41a53c1c8c122cfb1f6e1ec377a1f27ee81deb794"},
+ {file = "regex-2026.1.15-cp313-cp313t-musllinux_1_2_ppc64le.whl", hash = "sha256:a1774cd1981cd212506a23a14dba7fdeaee259f5deba2df6229966d9911e767a"},
+ {file = "regex-2026.1.15-cp313-cp313t-musllinux_1_2_riscv64.whl", hash = "sha256:b5f7d8d2867152cdb625e72a530d2ccb48a3d199159144cbdd63870882fb6f80"},
+ {file = "regex-2026.1.15-cp313-cp313t-musllinux_1_2_s390x.whl", hash = "sha256:492534a0ab925d1db998defc3c302dae3616a2fc3fe2e08db1472348f096ddf2"},
+ {file = "regex-2026.1.15-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:c661fc820cfb33e166bf2450d3dadbda47c8d8981898adb9b6fe24e5e582ba60"},
+ {file = "regex-2026.1.15-cp313-cp313t-win32.whl", hash = "sha256:99ad739c3686085e614bf77a508e26954ff1b8f14da0e3765ff7abbf7799f952"},
+ {file = "regex-2026.1.15-cp313-cp313t-win_amd64.whl", hash = "sha256:32655d17905e7ff8ba5c764c43cb124e34a9245e45b83c22e81041e1071aee10"},
+ {file = "regex-2026.1.15-cp313-cp313t-win_arm64.whl", hash = "sha256:b2a13dd6a95e95a489ca242319d18fc02e07ceb28fa9ad146385194d95b3c829"},
+ {file = "regex-2026.1.15-cp314-cp314-macosx_10_13_universal2.whl", hash = "sha256:d920392a6b1f353f4aa54328c867fec3320fa50657e25f64abf17af054fc97ac"},
+ {file = "regex-2026.1.15-cp314-cp314-macosx_10_13_x86_64.whl", hash = "sha256:b5a28980a926fa810dbbed059547b02783952e2efd9c636412345232ddb87ff6"},
+ {file = "regex-2026.1.15-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:621f73a07595d83f28952d7bd1e91e9d1ed7625fb7af0064d3516674ec93a2a2"},
+ {file = "regex-2026.1.15-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:3d7d92495f47567a9b1669c51fc8d6d809821849063d168121ef801bbc213846"},
+ {file = "regex-2026.1.15-cp314-cp314-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:8dd16fba2758db7a3780a051f245539c4451ca20910f5a5e6ea1c08d06d4a76b"},
+ {file = "regex-2026.1.15-cp314-cp314-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:1e1808471fbe44c1a63e5f577a1d5f02fe5d66031dcbdf12f093ffc1305a858e"},
+ {file = "regex-2026.1.15-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:0751a26ad39d4f2ade8fe16c59b2bf5cb19eb3d2cd543e709e583d559bd9efde"},
+ {file = "regex-2026.1.15-cp314-cp314-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:0f0c7684c7f9ca241344ff95a1de964f257a5251968484270e91c25a755532c5"},
+ {file = "regex-2026.1.15-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:74f45d170a21df41508cb67165456538425185baaf686281fa210d7e729abc34"},
+ {file = "regex-2026.1.15-cp314-cp314-musllinux_1_2_ppc64le.whl", hash = "sha256:f1862739a1ffb50615c0fde6bae6569b5efbe08d98e59ce009f68a336f64da75"},
+ {file = "regex-2026.1.15-cp314-cp314-musllinux_1_2_riscv64.whl", hash = "sha256:453078802f1b9e2b7303fb79222c054cb18e76f7bdc220f7530fdc85d319f99e"},
+ {file = "regex-2026.1.15-cp314-cp314-musllinux_1_2_s390x.whl", hash = "sha256:a30a68e89e5a218b8b23a52292924c1f4b245cb0c68d1cce9aec9bbda6e2c160"},
+ {file = "regex-2026.1.15-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:9479cae874c81bf610d72b85bb681a94c95722c127b55445285fb0e2c82db8e1"},
+ {file = "regex-2026.1.15-cp314-cp314-win32.whl", hash = "sha256:d639a750223132afbfb8f429c60d9d318aeba03281a5f1ab49f877456448dcf1"},
+ {file = "regex-2026.1.15-cp314-cp314-win_amd64.whl", hash = "sha256:4161d87f85fa831e31469bfd82c186923070fc970b9de75339b68f0c75b51903"},
+ {file = "regex-2026.1.15-cp314-cp314-win_arm64.whl", hash = "sha256:91c5036ebb62663a6b3999bdd2e559fd8456d17e2b485bf509784cd31a8b1705"},
+ {file = "regex-2026.1.15-cp314-cp314t-macosx_10_13_universal2.whl", hash = "sha256:ee6854c9000a10938c79238de2379bea30c82e4925a371711af45387df35cab8"},
+ {file = "regex-2026.1.15-cp314-cp314t-macosx_10_13_x86_64.whl", hash = "sha256:2c2b80399a422348ce5de4fe40c418d6299a0fa2803dd61dc0b1a2f28e280fcf"},
+ {file = "regex-2026.1.15-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:dca3582bca82596609959ac39e12b7dad98385b4fefccb1151b937383cec547d"},
+ {file = "regex-2026.1.15-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:ef71d476caa6692eea743ae5ea23cde3260677f70122c4d258ca952e5c2d4e84"},
+ {file = "regex-2026.1.15-cp314-cp314t-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:c243da3436354f4af6c3058a3f81a97d47ea52c9bd874b52fd30274853a1d5df"},
+ {file = "regex-2026.1.15-cp314-cp314t-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:8355ad842a7c7e9e5e55653eade3b7d1885ba86f124dd8ab1f722f9be6627434"},
+ {file = "regex-2026.1.15-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:f192a831d9575271a22d804ff1a5355355723f94f31d9eef25f0d45a152fdc1a"},
+ {file = "regex-2026.1.15-cp314-cp314t-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:166551807ec20d47ceaeec380081f843e88c8949780cd42c40f18d16168bed10"},
+ {file = "regex-2026.1.15-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:f9ca1cbdc0fbfe5e6e6f8221ef2309988db5bcede52443aeaee9a4ad555e0dac"},
+ {file = "regex-2026.1.15-cp314-cp314t-musllinux_1_2_ppc64le.whl", hash = "sha256:b30bcbd1e1221783c721483953d9e4f3ab9c5d165aa709693d3f3946747b1aea"},
+ {file = "regex-2026.1.15-cp314-cp314t-musllinux_1_2_riscv64.whl", hash = "sha256:2a8d7b50c34578d0d3bf7ad58cde9652b7d683691876f83aedc002862a35dc5e"},
+ {file = "regex-2026.1.15-cp314-cp314t-musllinux_1_2_s390x.whl", hash = "sha256:9d787e3310c6a6425eb346be4ff2ccf6eece63017916fd77fe8328c57be83521"},
+ {file = "regex-2026.1.15-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:619843841e220adca114118533a574a9cd183ed8a28b85627d2844c500a2b0db"},
+ {file = "regex-2026.1.15-cp314-cp314t-win32.whl", hash = "sha256:e90b8db97f6f2c97eb045b51a6b2c5ed69cedd8392459e0642d4199b94fabd7e"},
+ {file = "regex-2026.1.15-cp314-cp314t-win_amd64.whl", hash = "sha256:5ef19071f4ac9f0834793af85bd04a920b4407715624e40cb7a0631a11137cdf"},
+ {file = "regex-2026.1.15-cp314-cp314t-win_arm64.whl", hash = "sha256:ca89c5e596fc05b015f27561b3793dc2fa0917ea0d7507eebb448efd35274a70"},
+ {file = "regex-2026.1.15-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:55b4ea996a8e4458dd7b584a2f89863b1655dd3d17b88b46cbb9becc495a0ec5"},
+ {file = "regex-2026.1.15-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:7e1e28be779884189cdd57735e997f282b64fd7ccf6e2eef3e16e57d7a34a815"},
+ {file = "regex-2026.1.15-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:0057de9eaef45783ff69fa94ae9f0fd906d629d0bd4c3217048f46d1daa32e9b"},
+ {file = "regex-2026.1.15-cp39-cp39-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:cc7cd0b2be0f0269283a45c0d8b2c35e149d1319dcb4a43c9c3689fa935c1ee6"},
+ {file = "regex-2026.1.15-cp39-cp39-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:8db052bbd981e1666f09e957f3790ed74080c2229007c1dd67afdbf0b469c48b"},
+ {file = "regex-2026.1.15-cp39-cp39-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:343db82cb3712c31ddf720f097ef17c11dab2f67f7a3e7be976c4f82eba4e6df"},
+ {file = "regex-2026.1.15-cp39-cp39-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:55e9d0118d97794367309635df398bdfd7c33b93e2fdfa0b239661cd74b4c14e"},
+ {file = "regex-2026.1.15-cp39-cp39-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:008b185f235acd1e53787333e5690082e4f156c44c87d894f880056089e9bc7c"},
+ {file = "regex-2026.1.15-cp39-cp39-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:fd65af65e2aaf9474e468f9e571bd7b189e1df3a61caa59dcbabd0000e4ea839"},
+ {file = "regex-2026.1.15-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:f42e68301ff4afee63e365a5fc302b81bb8ba31af625a671d7acb19d10168a8c"},
+ {file = "regex-2026.1.15-cp39-cp39-musllinux_1_2_ppc64le.whl", hash = "sha256:f7792f27d3ee6e0244ea4697d92b825f9a329ab5230a78c1a68bd274e64b5077"},
+ {file = "regex-2026.1.15-cp39-cp39-musllinux_1_2_riscv64.whl", hash = "sha256:dbaf3c3c37ef190439981648ccbf0c02ed99ae066087dd117fcb616d80b010a4"},
+ {file = "regex-2026.1.15-cp39-cp39-musllinux_1_2_s390x.whl", hash = "sha256:adc97a9077c2696501443d8ad3fa1b4fc6d131fc8fd7dfefd1a723f89071cf0a"},
+ {file = "regex-2026.1.15-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:069f56a7bf71d286a6ff932a9e6fb878f151c998ebb2519a9f6d1cee4bffdba3"},
+ {file = "regex-2026.1.15-cp39-cp39-win32.whl", hash = "sha256:ea4e6b3566127fda5e007e90a8fd5a4169f0cf0619506ed426db647f19c8454a"},
+ {file = "regex-2026.1.15-cp39-cp39-win_amd64.whl", hash = "sha256:cda1ed70d2b264952e88adaa52eea653a33a1b98ac907ae2f86508eb44f65cdc"},
+ {file = "regex-2026.1.15-cp39-cp39-win_arm64.whl", hash = "sha256:b325d4714c3c48277bfea1accd94e193ad6ed42b4bad79ad64f3b8f8a31260a5"},
+ {file = "regex-2026.1.15.tar.gz", hash = "sha256:164759aa25575cbc0651bef59a0b18353e54300d79ace8084c818ad8ac72b7d5"},
]
[[package]]
@@ -3695,4 +3711,4 @@ type = ["pytest-mypy"]
[metadata]
lock-version = "2.1"
python-versions = "^3.9"
-content-hash = "bea28f4f7e6b82e849eaf109f6555f4503568b3b6891c5cdac6bb751cc8d48df"
+content-hash = "d7c6eb86db7bf42d5de8fcb2a76b7a70c2612d42acf91f52196474a27b8094fc"
diff --git a/pyproject.toml b/pyproject.toml
index e71870910e..c826ae1aa5 100644
--- a/pyproject.toml
+++ b/pyproject.toml
@@ -1,6 +1,6 @@
[tool.poetry]
name = "bbot"
-version = "2.8.0"
+version = "2.8.1"
description = "OSINT automation for hackers."
authors = [
"TheTechromancer",
@@ -43,7 +43,7 @@ dnspython = ">=2.7.0,<2.8.0"
cachetools = ">=5.3.2,<7.0.0"
socksio = "^1.0.0"
jinja2 = "^3.1.3"
-regex = ">=2024.4.16,<2026.0.0"
+regex = ">=2024.4.16,<2027.0.0"
unidecode = "^1.3.8"
mmh3 = ">=4.1,<6.0"
xxhash = "^3.5.0"
@@ -57,7 +57,7 @@ radixtarget = "^3.0.13"
orjson = "^3.10.12"
ansible-core = "^2.15.13"
tldextract = "^5.3.0"
-cloudcheck = "^8.7.2"
+cloudcheck = "^9.2.0"
[tool.poetry.group.dev.dependencies]
poetry-dynamic-versioning = ">=0.21.4,<1.10.0"
@@ -121,7 +121,7 @@ lint.ignore = ["E402", "E711", "E713", "E721", "E741", "F403", "F405", "E501"]
[tool.poetry-dynamic-versioning]
enable = true
metadata = false
-format-jinja = 'v2.8.0{% if branch == "dev" %}.{{ distance }}rc{% endif %}'
+format-jinja = 'v2.8.1{% if branch == "dev" %}.{{ distance }}rc{% endif %}'
[tool.poetry-dynamic-versioning.substitution]
files = ["*/__init__.py"]