Morph into any browser - High-performance HTTP client with dynamic fingerprinting using C, io_uring, and BoringSSL
Reason this release was yanked:
development preview release
Project description
httpmorph
A high-performance HTTP client for Python with advanced browser fingerprinting capabilities. Built with C for speed, designed for compatibility.
Features
- Requests-compatible API - Drop-in replacement for most Python
requestsuse cases - High Performance - Native C implementation with BoringSSL for blazing-fast HTTP/HTTPS
- HTTP/2 Support - Full HTTP/2 with ALPN negotiation via nghttp2
- Browser Fingerprinting - Realistic browser profiles (Chrome, Firefox, Safari, Edge)
- TLS Fingerprinting - JA3 fingerprint generation and customization
- Connection Pooling - Automatic connection reuse for better performance
- Session Management - Persistent cookies and headers across requests
Installation
pip install httpmorph
Requirements
- Python 3.8+
- Windows, macOS, or Linux
- BoringSSL (built automatically from source)
- libnghttp2 (for HTTP/2)
Quick Start
import httpmorph
# Simple GET request
response = httpmorph.get('https://icanhazip.com')
print(response.status_code)
print(response.text)
# POST with JSON
response = httpmorph.post(
'https://httpbin.org/post',
json={'key': 'value'}
)
# Using sessions
session = httpmorph.Session(browser='chrome')
response = session.get('https://example.com')
Browser Profiles
Mimic real browser behavior with pre-configured profiles:
# Use Chrome fingerprint
response = httpmorph.get('https://example.com', browser='chrome')
# Use Firefox fingerprint
session = httpmorph.Session(browser='firefox')
response = session.get('https://example.com')
# Available browsers: chrome, firefox, safari, edge
Advanced Usage
Custom Headers
headers = {
'User-Agent': 'MyApp/1.0',
'Authorization': 'Bearer token123'
}
response = httpmorph.get('https://api.example.com', headers=headers)
File Uploads
files = {'file': ('report.pdf', open('report.pdf', 'rb'))}
response = httpmorph.post('https://httpbin.org/post', files=files)
Timeout Control
# Single timeout value
response = httpmorph.get('https://example.com', timeout=5)
# Separate connect and read timeouts
response = httpmorph.get('https://example.com', timeout=(3, 10))
SSL Verification
# Disable SSL verification (not recommended for production)
response = httpmorph.get('https://example.com', verify_ssl=False)
Authentication
# Basic authentication
response = httpmorph.get(
'https://api.example.com',
auth=('username', 'password')
)
Redirects
# Follow redirects (default behavior)
response = httpmorph.get('https://example.com/redirect')
# Don't follow redirects
response = httpmorph.get(
'https://example.com/redirect',
allow_redirects=False
)
# Check redirect history
print(len(response.history)) # Number of redirects
Sessions with Cookies
session = httpmorph.Session()
# Cookies persist across requests
session.get('https://example.com/login')
session.post('https://example.com/form', data={'key': 'value'})
# Access cookies
print(session.cookies)
API Compatibility
httpmorph aims for high compatibility with Python's requests library:
| Feature | Status |
|---|---|
| GET, POST, PUT, DELETE, HEAD, PATCH, OPTIONS | Supported |
| JSON request/response | Supported |
| Form data & file uploads | Supported |
| Custom headers | Supported |
| Authentication | Supported |
| Cookies & sessions | Supported |
| Redirects with history | Supported |
| Timeout control | Supported |
| SSL verification | Supported |
| Streaming responses | Supported |
| Exception hierarchy | Supported |
Response Object
response = httpmorph.get('https://httpbin.org/get')
# Status and headers
print(response.status_code) # 200
print(response.ok) # True
print(response.reason) # 'OK'
print(response.headers) # {'Content-Type': 'application/json', ...}
# Response body
print(response.text) # Response as string
print(response.body) # Response as bytes
print(response.json()) # Parse JSON response
# Request info
print(response.url) # Final URL after redirects
print(response.history) # List of redirect responses
# Timing
print(response.elapsed) # Response time
print(response.total_time_us) # Total time in microseconds
# TLS info
print(response.tls_version) # TLS version used
print(response.tls_cipher) # Cipher suite
print(response.ja3_fingerprint) # JA3 fingerprint
Exception Handling
import httpmorph
try:
response = httpmorph.get('https://example.com', timeout=5)
response.raise_for_status() # Raise exception for 4xx/5xx
except httpmorph.Timeout:
print("Request timed out")
except httpmorph.ConnectionError:
print("Failed to connect")
except httpmorph.HTTPError as e:
print(f"HTTP error: {e.response.status_code}")
except httpmorph.RequestException as e:
print(f"Request failed: {e}")
Performance
httpmorph is built for speed with a native C implementation and BoringSSL for optimized TLS operations.
Benchmark vs requests library (30-second test, macOS Apple Silicon):
- Throughput: 49.4% faster on average (1,056 vs 707 req/s)
- GET requests: 1,032 req/s vs 709 req/s (1.46x faster)
- POST requests: 1,080 req/s vs 705 req/s (1.53x faster)
- Latency: 33.1% lower on average (0.95ms vs 1.41ms)
See detailed benchmark results for full metrics including performance charts.
Performance Features
- Native C implementation with minimal Python overhead
- BoringSSL for optimized TLS operations
- Connection pooling reduces handshake overhead
- HTTP/2 multiplexing for concurrent requests
- Efficient memory management
Platform Support
| Platform | Status |
|---|---|
| Windows | ✅ Fully supported |
| macOS (Intel & Apple Silicon) | ✅ Fully supported |
| Linux (x86_64, ARM64) | ✅ Fully supported |
All platforms use BoringSSL (Google's fork of OpenSSL) for consistent TLS behavior and advanced fingerprinting capabilities.
Building from Source
httpmorph uses BoringSSL (built from source) on all platforms for consistent TLS fingerprinting.
Prerequisites
Windows:
# Install build tools
choco install cmake golang nasm visualstudio2022buildtools -y
# Or install manually:
# - Visual Studio 2019+ (with C++ tools)
# - CMake 3.15+
# - Go 1.18+
# - NASM (for BoringSSL assembly optimizations)
macOS:
# Install dependencies
brew install cmake ninja libnghttp2
Linux:
# Ubuntu/Debian
sudo apt-get install cmake ninja-build libssl-dev pkg-config autoconf automake libtool
# Fedora/RHEL
sudo dnf install cmake ninja-build openssl-devel pkg-config autoconf automake libtool
Build Steps
# 1. Clone the repository
git clone https://github.com/yourusername/httpmorph.git
cd httpmorph
# 2. Build vendor dependencies (BoringSSL, nghttp2, zlib)
./scripts/setup_vendors.sh # On Windows: bash scripts/setup_vendors.sh
# 3. Build Python extensions
python setup.py build_ext --inplace
# 4. Install in development mode
pip install -e ".[dev]"
Note: The first build takes 5-10 minutes as it compiles BoringSSL from source. Subsequent builds are much faster (~30 seconds) as the vendor libraries are cached.
Development
# Clone and setup (includes building BoringSSL)
git clone https://github.com/yourusername/httpmorph.git
cd httpmorph
./scripts/setup_vendors.sh
# Install development dependencies
pip install -e ".[dev]"
# Run tests
pytest tests/ -v
# Run with coverage
pytest tests/ --cov=httpmorph --cov-report=html
# Run specific test markers
pytest tests/ -m "not slow" # Skip slow tests
pytest tests/ -m integration # Only integration tests
pytest tests/ -m fingerprint # Only fingerprinting tests
Architecture
httpmorph combines the best of both worlds:
- C Core: Low-level HTTP/TLS implementation for maximum performance
- Python Wrapper: Clean, Pythonic API with requests compatibility
- BoringSSL: Google's fork of OpenSSL, optimized and battle-tested
- nghttp2: Standard-compliant HTTP/2 implementation
The library uses Cython to bridge Python and C, providing near-native performance with the ease of Python.
Contributing
Contributions are welcome! Areas where help is especially appreciated:
- Windows compatibility
- Additional browser profiles
- Performance optimizations
- Documentation improvements
- Bug reports and fixes
Please open an issue or pull request on GitHub.
Testing
httpmorph has a comprehensive test suite with 270+ tests covering:
- All HTTP methods and parameters
- Redirect handling and history
- Cookie and session management
- Authentication and SSL
- Error handling and timeouts
- Unicode and encoding edge cases
- Thread safety and memory management
- Real-world integration tests
Run the test suite:
pytest tests/ -v
Acknowledgments
- Built on BoringSSL (Google)
- HTTP/2 support via nghttp2
- Inspired by Python's requests library
- Browser fingerprints based on real browser implementations
FAQ
Q: Why another HTTP client? A: httpmorph combines the performance of native C with browser fingerprinting capabilities, making it ideal for applications that need both speed and realistic browser behavior.
Q: Is it production-ready? A: No, httpmorph is still in active development and not yet recommended for production use.
Q: What about Windows? A: Windows support is in active development. The core functionality works, but some platform-specific features are still being refined.
Q: Can I use this as a drop-in replacement for requests? A: For most common use cases, yes! We've implemented the most widely-used requests API. Some advanced features may have slight differences.
Q: How do I report a bug? A: Please open an issue on GitHub with a minimal reproduction example and your environment details (OS, Python version, httpmorph version).
Support
- GitHub Issues: Report bugs and feature requests
- Documentation: Full API documentation (coming soon)
httpmorph - Fast, compatible, and powerful HTTP for Python.
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distributions
Built Distributions
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file httpmorph-0.1.0-cp313-cp313-win_amd64.whl.
File metadata
- Download URL: httpmorph-0.1.0-cp313-cp313-win_amd64.whl
- Upload date:
- Size: 840.1 kB
- Tags: CPython 3.13, Windows x86-64
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.2.0 CPython/3.12.3
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
13024414cf98efcfa8ada6efa51240d9ca2b0a6e1ac9a928a12af6d2cbb52151
|
|
| MD5 |
a310a98ceb6aecc2d9daf1abf593ac2d
|
|
| BLAKE2b-256 |
bcea255475188e9f495f7617698e3222ad6a97737c83f1f95a63093a6ed6b573
|
File details
Details for the file httpmorph-0.1.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl.
File metadata
- Download URL: httpmorph-0.1.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
- Upload date:
- Size: 20.8 MB
- Tags: CPython 3.13, manylinux: glibc 2.17+ x86-64
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.2.0 CPython/3.12.3
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
30133a8ed8750a0b651f07428a049f941e53643be4e9a16f4c0eb13de5b4fedc
|
|
| MD5 |
5435807dc971ddfe452905aa4fc9418a
|
|
| BLAKE2b-256 |
8e11050a5d74032b9a0954591ca869aea8fb72550b22f0f41396e540ffbc4973
|
File details
Details for the file httpmorph-0.1.0-cp313-cp313-macosx_11_0_arm64.whl.
File metadata
- Download URL: httpmorph-0.1.0-cp313-cp313-macosx_11_0_arm64.whl
- Upload date:
- Size: 1.1 MB
- Tags: CPython 3.13, macOS 11.0+ ARM64
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.2.0 CPython/3.12.3
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
e295d1025abf952c062c1a450acfaa8b2b6fe74857716c0ed3ccba7526b05fd0
|
|
| MD5 |
8c779db4a75c23fc7e3d41a27dcf30eb
|
|
| BLAKE2b-256 |
8f0d0b7ea311f4b2465de479ef5f062a9775dbf0f6160dcaca36fad2930eb37f
|
File details
Details for the file httpmorph-0.1.0-cp312-cp312-win_amd64.whl.
File metadata
- Download URL: httpmorph-0.1.0-cp312-cp312-win_amd64.whl
- Upload date:
- Size: 840.1 kB
- Tags: CPython 3.12, Windows x86-64
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.2.0 CPython/3.12.3
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
bfdf5640185d88e2a5628e250859abaf9eecc414d85d725e9e480465d7c24788
|
|
| MD5 |
b699b79d0090b873700119e4581e5b47
|
|
| BLAKE2b-256 |
87e68e6a72935f9ad0ec3e556561163f924c151345273f8c6868cf62d8aed295
|
File details
Details for the file httpmorph-0.1.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl.
File metadata
- Download URL: httpmorph-0.1.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
- Upload date:
- Size: 20.8 MB
- Tags: CPython 3.12, manylinux: glibc 2.17+ x86-64
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.2.0 CPython/3.12.3
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
ea14cf07641c14cc3761ab32a7af4a2dabb93c1cfed434ce2f7c5ab5fe0958ae
|
|
| MD5 |
405adfc8bd02fce1823fedf279a575da
|
|
| BLAKE2b-256 |
db8ea469f2f1bc16a469ffcc40859e03cb5be73bdd5fe3e0ca5a117616c77816
|
File details
Details for the file httpmorph-0.1.0-cp312-cp312-macosx_11_0_arm64.whl.
File metadata
- Download URL: httpmorph-0.1.0-cp312-cp312-macosx_11_0_arm64.whl
- Upload date:
- Size: 1.1 MB
- Tags: CPython 3.12, macOS 11.0+ ARM64
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.2.0 CPython/3.12.3
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
627872d33a22f737914b5b9b45373668151a6ac9d860034814bc9b0cd646fb64
|
|
| MD5 |
308fb4566297ee6d9bf247edd3d09d5e
|
|
| BLAKE2b-256 |
e79aab8d6996a95acd6f34e4f77d0b133b14a9d26bd232b93951b55b1efee54a
|
File details
Details for the file httpmorph-0.1.0-cp311-cp311-win_amd64.whl.
File metadata
- Download URL: httpmorph-0.1.0-cp311-cp311-win_amd64.whl
- Upload date:
- Size: 839.8 kB
- Tags: CPython 3.11, Windows x86-64
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.2.0 CPython/3.12.3
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
bb15f93a904edbcb4910b3bac3843df1aa082275ad2a7721de19ef9099537143
|
|
| MD5 |
2c8a065eefd0994c9be4686a80a33da9
|
|
| BLAKE2b-256 |
56757ed80732ca38e02eee43bead32c4048a8cf72f4a3b46e4027ced1087f289
|
File details
Details for the file httpmorph-0.1.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl.
File metadata
- Download URL: httpmorph-0.1.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
- Upload date:
- Size: 20.7 MB
- Tags: CPython 3.11, manylinux: glibc 2.17+ x86-64
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.2.0 CPython/3.12.3
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
bea908c465bf59a313f1388c6ffacfec306ce05b57f170b85f8f4afbd700bb10
|
|
| MD5 |
427f4827f49ccebcf7f2ec300f35d1cc
|
|
| BLAKE2b-256 |
edd2fd743c4a01c036e98f564c29372dc4147ba663e8381686249d8498e37c33
|
File details
Details for the file httpmorph-0.1.0-cp311-cp311-macosx_11_0_arm64.whl.
File metadata
- Download URL: httpmorph-0.1.0-cp311-cp311-macosx_11_0_arm64.whl
- Upload date:
- Size: 1.1 MB
- Tags: CPython 3.11, macOS 11.0+ ARM64
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.2.0 CPython/3.12.3
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
f9f18ac1cca4eed7a6f231a50b151000aa341184d5d5ee68fd8dfa39f9d112d0
|
|
| MD5 |
ab76653377caa51c36cdfc2ba1a3aedd
|
|
| BLAKE2b-256 |
4884dda179aee41e3c3af6b95677a62d3aa1cd2ce31dddb0a62f95d857013ffb
|
File details
Details for the file httpmorph-0.1.0-cp310-cp310-win_amd64.whl.
File metadata
- Download URL: httpmorph-0.1.0-cp310-cp310-win_amd64.whl
- Upload date:
- Size: 839.4 kB
- Tags: CPython 3.10, Windows x86-64
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.2.0 CPython/3.12.3
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
7f5c2aa41b16b875aa18e1d4065953f8e334fbd48adfb9e917de3c6886a3affd
|
|
| MD5 |
1c4d4f8c2f4fffe0d360b626ad159a3e
|
|
| BLAKE2b-256 |
6762b798c4512a2975b7b5882e1e9fa56b28945ef0ca40272d4177d7f012df94
|
File details
Details for the file httpmorph-0.1.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl.
File metadata
- Download URL: httpmorph-0.1.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
- Upload date:
- Size: 20.7 MB
- Tags: CPython 3.10, manylinux: glibc 2.17+ x86-64
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.2.0 CPython/3.12.3
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
18f6bc8d0cc861fc51ebc5f5b6bbb6b8864de0fcb850aa10d944e5588cd73d75
|
|
| MD5 |
0370e7fade461f0b84444e5e1ff4fe63
|
|
| BLAKE2b-256 |
9b91745e256ac6a04a373f8db5d5a8ad98d107cd06eb0f2bfd1208ad540b7394
|
File details
Details for the file httpmorph-0.1.0-cp310-cp310-macosx_11_0_arm64.whl.
File metadata
- Download URL: httpmorph-0.1.0-cp310-cp310-macosx_11_0_arm64.whl
- Upload date:
- Size: 1.1 MB
- Tags: CPython 3.10, macOS 11.0+ ARM64
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.2.0 CPython/3.12.3
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
9a27b928ed3d76018526f3315b102f7dc62e27581b2c08f4ac826baf295ccc26
|
|
| MD5 |
f00223033a9da4e44c70de4e9a57e620
|
|
| BLAKE2b-256 |
51148dd75153e968688a78e1a53fa3c2c27ed67a9ed5d9dd6092b7c34a7351b7
|
File details
Details for the file httpmorph-0.1.0-cp39-cp39-win_amd64.whl.
File metadata
- Download URL: httpmorph-0.1.0-cp39-cp39-win_amd64.whl
- Upload date:
- Size: 839.6 kB
- Tags: CPython 3.9, Windows x86-64
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.2.0 CPython/3.12.3
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
fa614d06786c56216c1dcc308ab9ec72146d34ac88070b969837b13371e0aa33
|
|
| MD5 |
35294ae0ed968b8c3b970033abeedb1a
|
|
| BLAKE2b-256 |
a0b574a8e333e1421e1605352a9b5e40b5c118dfa0282e5618e538ecd791dbfe
|
File details
Details for the file httpmorph-0.1.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl.
File metadata
- Download URL: httpmorph-0.1.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
- Upload date:
- Size: 20.7 MB
- Tags: CPython 3.9, manylinux: glibc 2.17+ x86-64
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.2.0 CPython/3.12.3
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
64b24a879a19156dd8bdd2350e08a1e58da4fce982390ef9145e1f9fccf92724
|
|
| MD5 |
39dfd3a13da4a34b5f9664ab98fcb030
|
|
| BLAKE2b-256 |
4cac6686f137048684bee1f11579565555f14908179e2d233a8506ab0812ed15
|
File details
Details for the file httpmorph-0.1.0-cp39-cp39-macosx_11_0_arm64.whl.
File metadata
- Download URL: httpmorph-0.1.0-cp39-cp39-macosx_11_0_arm64.whl
- Upload date:
- Size: 1.1 MB
- Tags: CPython 3.9, macOS 11.0+ ARM64
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.2.0 CPython/3.12.3
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
108887ace55a27ca4dff35cc2fab0cbc8a3adcde82df71d3805f2ef77dcdcc31
|
|
| MD5 |
83087d57f43ac170fdad68d2d1e84320
|
|
| BLAKE2b-256 |
e539de781216d1db3c283a6a3dbd1f80145125e1145ad222ae1ba1a0976e9b58
|
File details
Details for the file httpmorph-0.1.0-cp38-cp38-win_amd64.whl.
File metadata
- Download URL: httpmorph-0.1.0-cp38-cp38-win_amd64.whl
- Upload date:
- Size: 841.1 kB
- Tags: CPython 3.8, Windows x86-64
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.2.0 CPython/3.12.3
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
508d022e1f86fc6eaf957246e10a73497b052581b9e1916002840646eed3f582
|
|
| MD5 |
44a335246280710b050b17e5be7d4733
|
|
| BLAKE2b-256 |
1ab06714fc6bf8c8452fd8d876b4b9f5d551997ec30c4d1f7009ca155dc58e3c
|
File details
Details for the file httpmorph-0.1.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl.
File metadata
- Download URL: httpmorph-0.1.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
- Upload date:
- Size: 20.7 MB
- Tags: CPython 3.8, manylinux: glibc 2.17+ x86-64
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.2.0 CPython/3.12.3
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
2942190c7f9371c8588fdf445237bb4a375522226096763da965bd0b9a57cb49
|
|
| MD5 |
cb376ac6cf69df6c76a507c762064f9e
|
|
| BLAKE2b-256 |
aed78aff3321b3f55b229c9626bfece5bb5db3afb6d2457ef1b022dcf76f2148
|
File details
Details for the file httpmorph-0.1.0-cp38-cp38-macosx_11_0_arm64.whl.
File metadata
- Download URL: httpmorph-0.1.0-cp38-cp38-macosx_11_0_arm64.whl
- Upload date:
- Size: 1.1 MB
- Tags: CPython 3.8, macOS 11.0+ ARM64
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.2.0 CPython/3.12.3
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
bb64f9e56b87e3a405b886d58c7a49c76b41804b5b177c9f2b81b9f272ab357c
|
|
| MD5 |
b2b817d83ce1356ff91d0ae97a5215bf
|
|
| BLAKE2b-256 |
7088ef0a9c8d922e3be44abaa843ccae3975382c7a3ae0db70e2376579672f7a
|