Skip to main content

A robust Python wrapper for high-performance PDF rendering and text extraction using C++ core.

Project description

WinnerZ Python Library Documentation

Overview

The winnerz library is a robust Python wrapper designed for processing, rendering, and manipulating PDF documents. It relies on a high-performance, multi-threaded C++ core extension (winnerz_core) for intensive operations while providing seamless fallback mechanisms and caching strategies in Python.

The architecture emphasizes blistering-fast text extraction, reliability, and fault-tolerance, specifically in handling binary dependencies, dynamic core library loading, and flexible preview rendering via PDFium.

Architecture

The system is divided into several conceptual layers:

  1. Core Loader & Diagnostics: Handles the dynamic importing of the C++ binary (winnerz_core), including binary size verification, truncation repair, and Windows DLL directory management.
  2. Document Object Model: Provides Pythonic abstractions (Document, Page) to interact with PDF files, managing resources and state safely.
  3. Thread-Safe Interpreter Pipeline: A C++ native, thread-safe PDF token interpreter that leverages std::async for parallel multi-page text extraction, eliminating GIL bottlenecks.
  4. Micro-OCR Fallback Engine: A pure C++ built-in OCR engine that activates automatically when encountering corrupted or missing ToUnicode tables. It uses 64-bit bitwise packing and hardware POPCOUNT for blazing fast template matching without external dependencies like Tesseract.
  5. Rendering & Editing Pipeline: A native C++ rendering and editing engine utilizing integrated PDFium capabilities, completely independent of external Python pip packages.
  6. Geometry & Data Structures: Implements domain-specific types (Rect, Matrix, Pixmap) to standardize data flow between the C++ layer and Python runtime.

Core Loading Mechanism

The library initializes the C++ binary through _load_core(). This system provides the following safety guarantees:

  • Thread Safety: Uses threading.Lock() to ensure the core is initialized exactly once.
  • Retry Logic: Implements a retry loop (_CORE_IMPORT_RETRIES = 3) to mitigate transient filesystem or OS-level loading issues.
  • Self-Healing: If a truncated binary is detected (e.g., due to an interrupted build or copy), _try_repair_truncated_core_binary() attempts to restore it from other valid candidate binaries in the directory.
  • Diagnostic Reporting: Generates detailed error messages specifying binary ABI mismatches (e.g., GLIBC mismatches) or binary sizes to accelerate debugging.

Environment Variables

  • WINNERZ_PREVIEW_BACKEND: Controls the backend used for rendering preview data when the C++ core returns placeholder data.
    • Valid values: auto (default), pdfium.
    • Resolution order for auto: Uses PDFium when available.

Advanced Features

Micro-OCR Anti-Obfuscation

WinnerZ includes a built-in, lightweight Micro-OCR engine written entirely in C++. When a PDF intentionally hides its text by removing the ToUnicode table or scrambling encodings, the engine automatically falls back to rendering the vector glyphs and performing Image-over-Union (IoU) template matching.

  • Broad Language Support: Contains 2170+ built-in templates covering English, Vietnamese, Latin Extended, Cyrillic, Greek, and Thai.
  • Hardware Accelerated: Uses 64-bit Bitwise Packing and CPU __popcnt64 instructions to evaluate millions of pixel comparisons in milliseconds.
  • Zero Dependencies: Does not require Tesseract, ONNX, or any heavy AI models.

Concurrency & Multi-threading Architecture

WinnerZ features a sophisticated threading model designed to maximize hardware utilization while complying with Python's Global Interpreter Lock (GIL). Functions are grouped into three categories:

Group 1: Native C++ Multi-threading (Fully Automatic)

These functions automatically spawn C++ threads to utilize all CPU cores. They bypass the Python GIL and run at maximum hardware speeds.

  • doc.get_all_text(): Extracts plain text only from all pages simultaneously. Extremely fast, but strips out all spatial coordinates and font data.
  • doc.get_all_dicts_json(include_chars=False, sort=False): High-performance multi-threaded extraction of rich text structures (bbox, fonts, colors, ascender, descender). Returns a JSON string of the entire document's data in seconds. Parse with json.loads() to bypass GIL object-creation overhead.
  • doc.insert_text_json(): Batch inserts text tasks across hundreds of pages in parallel.
  • doc.redact_pages_bytes(): Performs batch redaction across multiple pages simultaneously.

Group 2: GIL-Released Methods (Python ThreadPool Ready)

These functions process a single page at a time but explicitly release the Python GIL (py::gil_scoped_release) during computation. To achieve multi-threading, you must wrap them in Python's concurrent.futures.ThreadPoolExecutor. This is the optimal architecture for extracting complex Python objects (like dicts) concurrently without lock contention.

  • page.get_text("dict"): Extracts text along with precise spatial coordinates (bbox), fonts, and colors.
  • page.get_text("blocks"), page.get_text("rawdict")
  • page.get_text_plain()

Group 3: Single-threaded (GIL Locked)

These functions execute sequentially.

  • page.get_drawings()
  • page.get_pixmap()

Class Reference

Document

Represents a PDF document instance. It manages the lifecycle of the underlying file, featuring a lazy-loading fallback architecture: it natively opens the PDF via C++ by default and only invokes the native C++ PDFium backend for decryption or file repair if the document is encrypted or structurally corrupted.

Constructor:

  • Document(path_or_bytes): Resolves the file path or raw memory bytes (Zero-Disk mode) and instantly initializes the C++ core. If encryption is detected (e.g. RC4/AES), it falls back to an automatic decryption routine seamlessly in RAM or via a temporary file.

Methods:

  • __getitem__(index): Retrieves a Page object at the specified 0-based index. Supports negative indexing.
  • __len__(): Returns the total number of pages in the document.
  • get_all_text(): A highly optimized utility that utilizes C++ multi-threading to extract plain text only from all pages. It scales automatically with CPU cores and bypasses the Python GIL. Note: This function discards all spatial coordinates (bboxes) and font data.
  • get_all_dicts_json(include_chars=False, sort=False): Extracts rich structural data (similar to get_text("dict")) for all pages simultaneously using native C++ threads. Returns a massive JSON string. Use json.loads() to parse it instantly into a list of Python dictionaries, completely bypassing the single-threaded PyBind11 object creation overhead.
  • tobytes(): (Zero-Disk) Returns the finalized PDF as a raw byte array directly from RAM, avoiding any disk I/O.
  • insert_text_json(json_str, fonts_dir="", progress_cb=None): High-speed native multi-threaded C++ text insertion. Renders a JSON string of tasks directly into the PDF document in RAM in parallel. Bypasses intermediate rendering pipelines and significantly boosts performance. Evaluates fallback fonts in fonts_dir on a per-character basis. Supports "multiline": true in JSON to enable Word-wrap mode within the bounding box.
  • redact_pages_bytes(page_rects_map): (Native C++) Performs parallel Block Redaction across multiple pages and returns the cleaned PDF as bytes directly in RAM. Use with caution on very large files to avoid memory pressure.
  • get_page_font_basenames(page_index=0): Extracts the true BaseFont name (e.g., 'TimesNewRomanPS-BoldMT') from internal PDF resource identifiers (e.g., 'R14') by automatically stripping subset prefixes ('ABCDEF+'). Crucial for accurate font mapping and reconstruction.
  • close(): Cleans up temporary resources, such as decrypted temporary files and in-memory editing buffers.

Page

Represents a single page within a Document.

Methods:

  • get_text(mode="dict", sort=False): Extracts text content.
    • mode: Can be dict, rawdict, blocks, text, json, or rawjson.
  • get_drawings(): Extracts vector drawings and graphics, mapping them to structured dictionaries containing rect, fill, and stroke properties.
  • get_pixmap(matrix=None, clip=None): Renders the page to a bitmap image (Pixmap) using the C++ core engine.
  • redact_text(rects, output_path, min_overlap_ratio=0.0): (Legacy C++ Core) Applies text-only redaction to the specified rectangles and saves the output to a new PDF file.
  • clean_contents(): Completely wipes out the vector graphics and text layer of the current page.
  • insert_image(rect, stream=None): Inserts an image (from bytes) into the specified rectangle. It handles internal PDF matrix transformations automatically.
  • show_pdf_page(rect, doc_src, page_idx, overlay=True, keep_proportion=True): Queues a complex overlay operation. It places a page from another document (doc_src) onto the current page, scaling it to fit rect while optionally keeping aspect ratio via keep_proportion. The actual merge is executed efficiently during doc.save().
  • rect (Property): Retrieves the bounding box of the page as a Rect.

Pixmap

Represents an uncompressed image buffer containing pixel data.

Properties:

  • width, height: Dimensions in pixels.
  • n: Number of channels (e.g., 4 for RGBA).
  • stride: Number of bytes per row.
  • samples: Raw byte array of pixel data.

Methods:

  • pixel(x, y): Returns a tuple representing the pixel color at the specified coordinates.
  • tobytes(fmt="raw"): Encodes the pixmap to the requested format. Supported formats include raw, rgba, png, jpg, and jpeg. Output formats other than raw require the Pillow library.

Geometry Classes

  • Rect(x0, y0, x1, y1): Represents a rectangle. Provides properties for width, height, and is_empty. Overloads the & operator to compute the intersection of two rectangles.
  • Matrix(sx=1.0, sy=1.0): Represents a 2D scaling matrix.

Caching Strategy

The module implements file-based caching for document instances to minimize redundant initialization and file I/O operations.

  • Global Document Cache: Managed via winnerz.open(path). Validates cache hits using file signature metrics (file size and modification time in nanoseconds).

    [!TIP] If you need to open multiple copies of the same file concurrently or bypass this cache (e.g., in background workers), initialize the document directly using winnerz.Document(path) instead of winnerz.open().

  • Preview Document Cache: A separate caching layer for rendering backends to keep the preview document context alive across multiple page renders.
  • C++ Thread-Safe Font Cache: The C++ core utilizes a lock-guarded (std::recursive_mutex) internal cache for Unicode, Width, and CodeSpace maps to prevent data races during parallel text extraction.

Logging

WinnerZ uses standard Python logging under the winnerz logger namespace. Error and debug messages are routed seamlessly to this logger, allowing you to configure professional logging streams similar to pymupdf.

import logging
logging.getLogger("winnerz").setLevel(logging.DEBUG)

Performance Benchmark

Thanks to the native C++ multi-threading pipeline and persistent object caching, WinnerZ outperforms established industry standards like PyMuPDF (fitz) significantly in bulk text extraction tasks.

Tested on a standard 185-page PDF file (Plain Text Extraction):

  • ⏱️ PyMuPDF (fitz): ~0.44s
  • 🚀 WinnerZ (get_all_text()): ~0.18s (2.5x Faster)

Tested on a 22MB Russian Chemistry Book (Structured Dictionary/JSON Extraction):

  • ⏱️ PyMuPDF Single-Thread (get_text("json")): ~24.2s
  • 🚀 WinnerZ Native Multi-Thread (get_all_dicts_json()): ~11.4s (> 2x Faster)

C++ Micro-OCR Benchmark

Tested on a 100% text-obfuscated PDF file (Forcing the system to Micro-OCR all characters):

  • 🐢 Traditional OCR (Tesseract): ~3 - 5 seconds / page
  • ⚡ WinnerZ Micro-OCR (Bitwise Optimized): ~0.33 seconds / page (~15x Faster)

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

winnerz-1.2.17.tar.gz (22.5 MB view details)

Uploaded Source

Built Distributions

If you're not sure about the file name format, learn more about wheel file names.

winnerz-1.2.17-cp312-cp312-win_amd64.whl (11.4 MB view details)

Uploaded CPython 3.12Windows x86-64

winnerz-1.2.17-cp312-cp312-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl (12.1 MB view details)

Uploaded CPython 3.12manylinux: glibc 2.24+ x86-64manylinux: glibc 2.28+ x86-64

winnerz-1.2.17-cp312-cp312-macosx_11_0_arm64.whl (6.4 MB view details)

Uploaded CPython 3.12macOS 11.0+ ARM64

winnerz-1.2.17-cp312-cp312-macosx_10_9_x86_64.whl (6.7 MB view details)

Uploaded CPython 3.12macOS 10.9+ x86-64

winnerz-1.2.17-cp311-cp311-win_amd64.whl (11.4 MB view details)

Uploaded CPython 3.11Windows x86-64

winnerz-1.2.17-cp311-cp311-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl (10.3 MB view details)

Uploaded CPython 3.11manylinux: glibc 2.24+ x86-64manylinux: glibc 2.28+ x86-64

winnerz-1.2.17-cp311-cp311-macosx_11_0_arm64.whl (6.4 MB view details)

Uploaded CPython 3.11macOS 11.0+ ARM64

winnerz-1.2.17-cp311-cp311-macosx_10_9_x86_64.whl (6.7 MB view details)

Uploaded CPython 3.11macOS 10.9+ x86-64

winnerz-1.2.17-cp310-cp310-win_amd64.whl (11.4 MB view details)

Uploaded CPython 3.10Windows x86-64

winnerz-1.2.17-cp310-cp310-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl (8.6 MB view details)

Uploaded CPython 3.10manylinux: glibc 2.24+ x86-64manylinux: glibc 2.28+ x86-64

winnerz-1.2.17-cp310-cp310-macosx_11_0_arm64.whl (6.4 MB view details)

Uploaded CPython 3.10macOS 11.0+ ARM64

winnerz-1.2.17-cp310-cp310-macosx_10_9_x86_64.whl (6.7 MB view details)

Uploaded CPython 3.10macOS 10.9+ x86-64

winnerz-1.2.17-cp39-cp39-win_amd64.whl (11.4 MB view details)

Uploaded CPython 3.9Windows x86-64

winnerz-1.2.17-cp39-cp39-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl (6.9 MB view details)

Uploaded CPython 3.9manylinux: glibc 2.24+ x86-64manylinux: glibc 2.28+ x86-64

winnerz-1.2.17-cp39-cp39-macosx_11_0_arm64.whl (6.4 MB view details)

Uploaded CPython 3.9macOS 11.0+ ARM64

winnerz-1.2.17-cp39-cp39-macosx_10_9_x86_64.whl (6.7 MB view details)

Uploaded CPython 3.9macOS 10.9+ x86-64

File details

Details for the file winnerz-1.2.17.tar.gz.

File metadata

  • Download URL: winnerz-1.2.17.tar.gz
  • Upload date:
  • Size: 22.5 MB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.1.0 CPython/3.13.12

File hashes

Hashes for winnerz-1.2.17.tar.gz
Algorithm Hash digest
SHA256 c40f89ff15c0b9c10ab78e79915ff91c80deae03a9a47413332a3a52d7ec979f
MD5 4f3c2cb1d339ff07be5858ac60e847bc
BLAKE2b-256 968049049a842cfe750806a86bb362bb04d436c019c9e90ee8c400cca7fe3b3e

See more details on using hashes here.

File details

Details for the file winnerz-1.2.17-cp312-cp312-win_amd64.whl.

File metadata

  • Download URL: winnerz-1.2.17-cp312-cp312-win_amd64.whl
  • Upload date:
  • Size: 11.4 MB
  • Tags: CPython 3.12, Windows x86-64
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.1.0 CPython/3.13.12

File hashes

Hashes for winnerz-1.2.17-cp312-cp312-win_amd64.whl
Algorithm Hash digest
SHA256 4398178d6951f0ce651c61eea8cb0e0c7a6a883bb0c2cbc5c7f0999c67995780
MD5 9513f6f18be424451252feb1c10eb404
BLAKE2b-256 17159d80fc4ee6e2a748f8721437a2ddaa5b8fc5a02d175b1178755f9da85a94

See more details on using hashes here.

File details

Details for the file winnerz-1.2.17-cp312-cp312-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl.

File metadata

File hashes

Hashes for winnerz-1.2.17-cp312-cp312-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl
Algorithm Hash digest
SHA256 e54275a3b2cec97259fdb138cd7218417ed81d075d06052c9cb38b8dd990d8f1
MD5 f375b8b62e246e55731a4495dcc8213c
BLAKE2b-256 207137f1d0da94c5ab09976849c1e1e59c1b1b050d8770855544d798818f20b4

See more details on using hashes here.

File details

Details for the file winnerz-1.2.17-cp312-cp312-macosx_11_0_arm64.whl.

File metadata

File hashes

Hashes for winnerz-1.2.17-cp312-cp312-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 2b23682972ca88a3aeb59f390337389f61ea75e1a8db612cddbf44cef48da909
MD5 9efe33f1dcf48d7c13579d01591963bd
BLAKE2b-256 da1c003503d4713407395764ae73bd0ee8a9f59e03bf03272f39c241058bb348

See more details on using hashes here.

File details

Details for the file winnerz-1.2.17-cp312-cp312-macosx_10_9_x86_64.whl.

File metadata

File hashes

Hashes for winnerz-1.2.17-cp312-cp312-macosx_10_9_x86_64.whl
Algorithm Hash digest
SHA256 4cc325d598c6ababb84a7728b673a093d3a42ff4ce12f87f1b4d149746e9affb
MD5 c9f03418af6b6dede3a64b0ef0fdf88b
BLAKE2b-256 5e819f9ed08c4dbd2d8fd42a3dc95f0adc2927756381410611d5819604df5216

See more details on using hashes here.

File details

Details for the file winnerz-1.2.17-cp311-cp311-win_amd64.whl.

File metadata

  • Download URL: winnerz-1.2.17-cp311-cp311-win_amd64.whl
  • Upload date:
  • Size: 11.4 MB
  • Tags: CPython 3.11, Windows x86-64
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.1.0 CPython/3.13.12

File hashes

Hashes for winnerz-1.2.17-cp311-cp311-win_amd64.whl
Algorithm Hash digest
SHA256 5209c08a0c6fef37f1b5f546eaa8b61f5d2dc6088e67734a20cfc9132bf68615
MD5 d8a3f377d629be2286fb0a6978aeb843
BLAKE2b-256 193f68a9465c5a1d56f999fcec82deba73efecb367d434a0276e9e8839d1d799

See more details on using hashes here.

File details

Details for the file winnerz-1.2.17-cp311-cp311-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl.

File metadata

File hashes

Hashes for winnerz-1.2.17-cp311-cp311-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl
Algorithm Hash digest
SHA256 a782a256a2034b670ea7335233ddde068ec39db431697038a8693cc44a12629c
MD5 e84e499e1d07839fd0f00f612a8ea0b6
BLAKE2b-256 b377db5b338681b77bc3435392aa7a8feea7b547bddf1caf65bee348b52bc4f3

See more details on using hashes here.

File details

Details for the file winnerz-1.2.17-cp311-cp311-macosx_11_0_arm64.whl.

File metadata

File hashes

Hashes for winnerz-1.2.17-cp311-cp311-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 ae2cab40cb92b90137597f060e98c60309416369070b4f29ad83026c35c3e630
MD5 953abad05a426180a6803fc152da81ea
BLAKE2b-256 9abe6aa97408bc20b98779de0d34e594bd6e77a6122fee95744db3ad864dcce7

See more details on using hashes here.

File details

Details for the file winnerz-1.2.17-cp311-cp311-macosx_10_9_x86_64.whl.

File metadata

File hashes

Hashes for winnerz-1.2.17-cp311-cp311-macosx_10_9_x86_64.whl
Algorithm Hash digest
SHA256 72d02a5dc4b3db7849ecaab98ee47f6658a29b60098ac623b191308a1b2b829d
MD5 562bd3dc864e08b1a96bb31620014b82
BLAKE2b-256 5212f5a634d93e8c84f23bac5719526cac40d6208288a9c584a393c1740eabcb

See more details on using hashes here.

File details

Details for the file winnerz-1.2.17-cp310-cp310-win_amd64.whl.

File metadata

  • Download URL: winnerz-1.2.17-cp310-cp310-win_amd64.whl
  • Upload date:
  • Size: 11.4 MB
  • Tags: CPython 3.10, Windows x86-64
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.1.0 CPython/3.13.12

File hashes

Hashes for winnerz-1.2.17-cp310-cp310-win_amd64.whl
Algorithm Hash digest
SHA256 3f1feb9b64cee2805c73c20592a66065893b85a7f1fe8e0566936599305c10c1
MD5 45547573e735c6112b86bebe3e68e24a
BLAKE2b-256 b27b668ed185fe58fb7b0ce356eca01199c672325589fd3fff5a532587f7ee5b

See more details on using hashes here.

File details

Details for the file winnerz-1.2.17-cp310-cp310-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl.

File metadata

File hashes

Hashes for winnerz-1.2.17-cp310-cp310-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl
Algorithm Hash digest
SHA256 02be3cf7eee14c5c2c877f2b3fb12937ab5aad50e5049a1269b82655a976bdb9
MD5 9b7aacfe7dc85b83cb0ef533d0c64d8c
BLAKE2b-256 80ba245f8b4aad1e2a344427697e1ad8283d44a8af5b9b9aa3e6d504c9bb7769

See more details on using hashes here.

File details

Details for the file winnerz-1.2.17-cp310-cp310-macosx_11_0_arm64.whl.

File metadata

File hashes

Hashes for winnerz-1.2.17-cp310-cp310-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 a587e568f2a8efed837ad0345b8fe6305f3bf0921756686cad503265c8ffdb67
MD5 ae03aeb1c657e65040e46413d524c605
BLAKE2b-256 4a8d8d0b96b39006c7635a2719d388a7a7075f0d42f05e8f16969e734cc2a245

See more details on using hashes here.

File details

Details for the file winnerz-1.2.17-cp310-cp310-macosx_10_9_x86_64.whl.

File metadata

File hashes

Hashes for winnerz-1.2.17-cp310-cp310-macosx_10_9_x86_64.whl
Algorithm Hash digest
SHA256 ec68883074243b8d1a1bb95840fbc03a4e813ad604f0fd4630c35cf114c29d5c
MD5 d82483ed37a28709c28de8fd4ef67c70
BLAKE2b-256 64583e46682385233f758591801a74ce0b96bb1efc72e6f38da53069a0b3c6cd

See more details on using hashes here.

File details

Details for the file winnerz-1.2.17-cp39-cp39-win_amd64.whl.

File metadata

  • Download URL: winnerz-1.2.17-cp39-cp39-win_amd64.whl
  • Upload date:
  • Size: 11.4 MB
  • Tags: CPython 3.9, Windows x86-64
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.1.0 CPython/3.13.12

File hashes

Hashes for winnerz-1.2.17-cp39-cp39-win_amd64.whl
Algorithm Hash digest
SHA256 6dac61029784b7b673df292d8c9bc829089613d8486e50496805d717832f4e9a
MD5 672cfdd8bbdd5ec16d2edade10109667
BLAKE2b-256 a2abdd0210f4afb72180b3c28704dc694cce6f6a8a753f9c151e3827d130911a

See more details on using hashes here.

File details

Details for the file winnerz-1.2.17-cp39-cp39-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl.

File metadata

File hashes

Hashes for winnerz-1.2.17-cp39-cp39-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl
Algorithm Hash digest
SHA256 a997c34275c1b276deac199dfced4f6ca00ed567f5700d9efa036b184a535207
MD5 72d3bcb2b910ae0882a851142d8f4931
BLAKE2b-256 ac019d41579a9a6b7f915b2a3294f7c9585159498a70997d042445ce5c4da341

See more details on using hashes here.

File details

Details for the file winnerz-1.2.17-cp39-cp39-macosx_11_0_arm64.whl.

File metadata

File hashes

Hashes for winnerz-1.2.17-cp39-cp39-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 e37a96a20476b2167898f38a93d470ae4972d21e00a78f02df6a2821baf7488e
MD5 4c349c120d3b1c15b3f512d2eb635035
BLAKE2b-256 7699ca54d2ec25130b11c794e5847467d97f36838890a429830094c574873fb7

See more details on using hashes here.

File details

Details for the file winnerz-1.2.17-cp39-cp39-macosx_10_9_x86_64.whl.

File metadata

File hashes

Hashes for winnerz-1.2.17-cp39-cp39-macosx_10_9_x86_64.whl
Algorithm Hash digest
SHA256 3f482f06ce6a6b117738cad6ad59ec0d67e8b740dbf93cc2f88e07d3669db7ad
MD5 745c0aa3e5236eb4f400c08d408a2697
BLAKE2b-256 333c82fefb786c312185b26ed8c3bd9a85098f340f026f32663ee41542900204

See more details on using hashes here.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page