A Python interface incorporating a C++ implementation of the Whole History Rating algorithm proposed by Rémi Coulom. The implementation is based on the Ruby code of GoShrine.
Project description
Whole History Rating (WHR)
A Python interface incorporating a highly optimized C++ implementation of the Whole History Rating (WHR) algorithm proposed by Rémi Coulom. WHR computes time-varying Elo ratings for players of games (e.g., Chess, Go) by optimizing the log-likelihood of all game results across history simultaneously.
This C++ implementation is based on the Ruby implementation by GoShrine.
Features
- Blazing Fast: The core algorithm is implemented in C++ (via
pybind11), allowing it to scale to tens of thousands of games. - Tolerant CSV Loading: Built-in support to ingest games from CSV files with smart header alias matching, winner normalization, and graceful handling of missing or malformed fields.
- Robust Evaluation: Standardized validation metrics including average log-likelihood computation.
- Highly Configurable: Custom rating volatility parameter ($w^2$) and virtual game regularization.
Installation
From PyPI
pip install whr
From Source
git clone https://github.com/wind23/whole_history_rating.git
cd whole_history_rating
pip install .
Note: Building from source requires a C++ compiler supporting C++11 (GCC, Clang, MSVC) and the
pybind11package.
Usage
1. Basic API Usage
import whr
import math
# Initialize the rating database with volatility parameter w^2 = 30
base = whr.Base(config={"w2": 30})
# Create game records manually:
# create_game(black_player, white_player, winner, time_step, handicap=0.0)
# Winner options: "B" (black wins), "W" (white wins), "D" (draw)
base.create_game("Alice", "Carol", "D", 0) # Day 0: Draw
base.create_game("Bob", "Dave", "B", 10) # Day 10: Bob won
base.create_game("Dave", "Alice", "W", 30) # Day 30: Alice won (Dave lost)
base.create_game("Bob", "Carol", "W", 60) # Day 60: Carol won (Bob lost)
# Run 50 Newton-Raphson iterations to solve for player ratings
base.iterate(50)
# Retrieve rating history for individual players: returns list of [day, elo, uncertainty]
print("Alice ratings:", base.ratings_for_player("Alice"))
# Output: [[0, 78.51, 185.55], [30, 79.47, 187.12]]
# Get all player ratings sorted by final strength
print("Ordered ratings:", base.get_ordered_ratings())
2. Loading Games from CSV
The load_csv() method enables importing games from a CSV file or file-like buffer. It is designed to be highly tolerant of formatting errors:
import whr
import io
base = whr.Base()
csv_content = """
black_player, white_player, winner, time_step, handicap
Alice, Bob, B, 1, 0.0
Bob, Carol, W, 2, 0.0
Carol, Alice, D, 3, 5.0
"""
# Load from a file path or a StringIO buffer
base.load_csv(io.StringIO(csv_content))
base.iterate(50)
CSV Format & Column Aliases
WHR searches the header row case-insensitively for matches using the following aliases:
| Logical Column | Accepted Header Aliases | Default Fallback / Behavior |
|---|---|---|
| Black Player | black, black_player, player_black, p1, player1, black player |
Row is skipped if missing/empty. |
| White Player | white, white_player, player_white, p2, player2, white player |
Row is skipped if missing/empty. |
| Winner | winner, result, outcome, win, winner_player, victor |
Defaults to a Draw (D) with a warning. |
| Time Step | time_step, time, step, day, date, round |
Defaults to 0 with a warning. |
| Handicap | handicap, advantage, komi |
Defaults to 0.0 (no warning if absent, warning if invalid). |
Winner Normalization Rules
WHR normalizes various winner representations to simplify integration:
- Black Win:
B,black,b,1-0,1,black win - White Win:
W,white,w,0-1,0,white win - Draw:
D,draw,d,1/2-1/2,0.5 - Any unrecognized string defaults to a Draw (
D) with a warning.
Tolerance & Warning Behavior
If the CSV structure contains minor anomalies, the parser emits a UserWarning instead of failing:
- Missing Headers: If headers cannot be detected at all, WHR falls back to treating columns positionally as
[black, white, winner, time_step, handicap]. - Invalid Numbers: If
time_steporhandicapis non-numeric, it is defaulted to0or0.0respectively, and a warning is logged. - Float Time Steps: If the
time_stepcontains decimals, it is safely rounded to the nearest integer. - Empty & Comment Lines: Empty lines and clean space rows are skipped silently.
Handicap & First-Move Advantage (Go vs. Chess)
WHR was originally designed for Go (围棋), where Black plays first and any handicap/komi is applied to Black's rating. Therefore, the library API is designed with [black, white, ...] parameter order.
If you are using this library for games where White plays first (e.g., Chess), you can handle the first-move advantage easily:
- Approach A (Recommended - Negative Handicap): Keep passing the White player as the
whiteargument, the Black player as theblackargument, and pass a negative handicap value to represent White's first-move advantage. E.g.,handicap = -35.0(which mathematically increases White's win probability by adding 35.0 Elo to White). - Approach B (Logical Mapping): Map the first-move player (White) to the
blackparameter, and the second-move player (Black) to thewhiteparameter. If White wins, set the winner to"B".
API Reference
whr.Base
Main interface for calculating ratings.
__init__(config=None, w2=300.0, virtual_games=2)config: Optional dict containingw2andvirtual_games.w2: Rating variance parameter controlling how fast rating changes over time (default: 300.0).virtual_games: Number of virtual draw games assigned to players on their first day for rating regularization.
create_game(black, white, winner, time_step, handicap=0.0): Create and register a single game.create_games(games): Ingest a list of games in the format[black, white, winner, time_step, handicap].load_csv(filepath_or_buffer): Load games from a CSV file path or file-like buffer.iterate(count): Perform a fixed number of Newton-Raphson optimization steps.iterate_until_converge(verbose=True): Iterate until convergence. Returns the total number of iterations.ratings_for_player(name): Get the rating timeline of a player as[[day, rating, uncertainty], ...].get_ordered_ratings(): Get sorted ratings for all active players.log_likelihood(): Returns the overall log-likelihood score of the current model.
whr.Evaluate
Evaluates rating predictability on external test datasets.
__init__(base): Initialize with a trainedwhr.Baserating database.get_rating(name, time_step, ignore_null_players=True): Get the rating of a player on a specific day.evaluate_ave_log_likelihood_games(games, ignore_null_players=True): Compute average log-likelihood across a list of test games.
Running Tests
Test files are modularized and cover base functionality, evaluation metrics, and CSV parsing:
python -m pytest tests/
To run with verbose output:
python -m pytest tests/ -v
References
Rémi Coulom. Whole-history rating: A Bayesian rating system for players of time-varying strength. In International Conference on Computers and Games. 2008.
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 Distribution
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 whr-2.2.0.tar.gz.
File metadata
- Download URL: whr-2.2.0.tar.gz
- Upload date:
- Size: 21.1 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.1.0 CPython/3.13.12
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
78d18ceb0444a360ea122555bd1cf62184a12235082d690143f462a0bee8b5d8
|
|
| MD5 |
662a02f5fc2602c8a0d56fe3feb99356
|
|
| BLAKE2b-256 |
c82bd86f81b1e9c2e363d2f52692bf10d10d06eaf685b70b0d65403f0e03f9fc
|
File details
Details for the file whr-2.2.0-cp314-cp314t-win_amd64.whl.
File metadata
- Download URL: whr-2.2.0-cp314-cp314t-win_amd64.whl
- Upload date:
- Size: 352.9 kB
- Tags: CPython 3.14t, Windows x86-64
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.1.0 CPython/3.13.12
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
dc80efa02c445bfe54313825b502e1232512a9ff9bd8910d150c273e57bcf576
|
|
| MD5 |
22211cbc48e994daceb399029c4b0333
|
|
| BLAKE2b-256 |
76818275c47576dbeaef9465d34cc97b55610da948ec9ec1279273302ee1f5c1
|
File details
Details for the file whr-2.2.0-cp314-cp314t-win32.whl.
File metadata
- Download URL: whr-2.2.0-cp314-cp314t-win32.whl
- Upload date:
- Size: 321.4 kB
- Tags: CPython 3.14t, Windows x86
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.1.0 CPython/3.13.12
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
653724b1cd0b3ddc56592e0a8db67f5ad63619874723152dbca4b720ee9acb9a
|
|
| MD5 |
5c6192829802e1dee437ee664783721b
|
|
| BLAKE2b-256 |
9566d9cf0c1acac752611fe3e9ec17e67ed8fe00098d113bdd40096f61a59290
|
File details
Details for the file whr-2.2.0-cp314-cp314t-musllinux_1_2_x86_64.whl.
File metadata
- Download URL: whr-2.2.0-cp314-cp314t-musllinux_1_2_x86_64.whl
- Upload date:
- Size: 1.2 MB
- Tags: CPython 3.14t, musllinux: musl 1.2+ x86-64
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.1.0 CPython/3.13.12
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
6ea5f81cafc329230c312cb92a5457ae456509a68da2e7b3b1cc2c6d31c45907
|
|
| MD5 |
0f82d4bc3a9513e33dff36e1556cff86
|
|
| BLAKE2b-256 |
621adc2667153e221ca5157e4274f2c3f290792196f87d97c93815163ff02d57
|
File details
Details for the file whr-2.2.0-cp314-cp314t-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl.
File metadata
- Download URL: whr-2.2.0-cp314-cp314t-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl
- Upload date:
- Size: 186.5 kB
- Tags: CPython 3.14t, manylinux: glibc 2.27+ x86-64, manylinux: glibc 2.28+ x86-64
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.1.0 CPython/3.13.12
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
9831e3a874abb9b3109940c6e80ebc5aa0b6459dc1cece24b2e0f04a28891b6a
|
|
| MD5 |
abcb181e8a7d47026ca9eda51bd7df1f
|
|
| BLAKE2b-256 |
0f47e5c1d6d898283baa2a7d32bff5a23a8113aa24642a5a618e4b585557a16e
|
File details
Details for the file whr-2.2.0-cp314-cp314t-macosx_11_0_arm64.whl.
File metadata
- Download URL: whr-2.2.0-cp314-cp314t-macosx_11_0_arm64.whl
- Upload date:
- Size: 170.3 kB
- Tags: CPython 3.14t, macOS 11.0+ ARM64
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.1.0 CPython/3.13.12
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
fd5c31ce03fd6acec0fab19935638792cfe7dbed4f7a844e08c699ef409f5b4e
|
|
| MD5 |
e28b5b0da867c6e502b48ca27dcf7182
|
|
| BLAKE2b-256 |
fb5d0dd47441fc1e225033c6f7a3d856eacf8cf0b3ab733937b138bd82df370d
|
File details
Details for the file whr-2.2.0-cp314-cp314t-macosx_10_15_x86_64.whl.
File metadata
- Download URL: whr-2.2.0-cp314-cp314t-macosx_10_15_x86_64.whl
- Upload date:
- Size: 179.9 kB
- Tags: CPython 3.14t, macOS 10.15+ x86-64
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.1.0 CPython/3.13.12
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
f74aff4b39df8248d426856d900aedfb4e295464ecbab4ee1f94908389351afd
|
|
| MD5 |
29aaed07890e77cb42237aa20d3025e3
|
|
| BLAKE2b-256 |
388b84ad0e7e949061f8ab9d13d74a44c16e2216fa009fdc105477b076d949d3
|
File details
Details for the file whr-2.2.0-cp314-cp314t-macosx_10_15_universal2.whl.
File metadata
- Download URL: whr-2.2.0-cp314-cp314t-macosx_10_15_universal2.whl
- Upload date:
- Size: 339.7 kB
- Tags: CPython 3.14t, macOS 10.15+ universal2 (ARM64, x86-64)
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.1.0 CPython/3.13.12
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
2fc22924132c9bd80ff6b87343eaa0b1b1e071f27d4a5273df203662d8eca40c
|
|
| MD5 |
5d36b3548f93a774bbde321e48d2a5ce
|
|
| BLAKE2b-256 |
1826a04b836f3be385fbc86c384255c3a0338a5aeb9fea58044ad53b5dc3cddd
|
File details
Details for the file whr-2.2.0-cp314-cp314-win_amd64.whl.
File metadata
- Download URL: whr-2.2.0-cp314-cp314-win_amd64.whl
- Upload date:
- Size: 347.0 kB
- Tags: CPython 3.14, Windows x86-64
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.1.0 CPython/3.13.12
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
5e87c4d0326d1d60031d13fd7f6f9a128b1397bf6eea2a8e4eef1c6c719a585b
|
|
| MD5 |
35eb8253ff074c1d7e62e553918ddda3
|
|
| BLAKE2b-256 |
4145cb344471359f58d58fbe395f53a25fdd90f2604ff1fc28a3c110b566768d
|
File details
Details for the file whr-2.2.0-cp314-cp314-win32.whl.
File metadata
- Download URL: whr-2.2.0-cp314-cp314-win32.whl
- Upload date:
- Size: 316.2 kB
- Tags: CPython 3.14, Windows x86
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.1.0 CPython/3.13.12
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
ebc805da8d07ec0ec48625888cad8aea266b0b6d2b315864c6460f9054375cbf
|
|
| MD5 |
b69e3d72f48c449e96420677dc65914a
|
|
| BLAKE2b-256 |
3def2b53d6725506b126d93a8d8e2d88b7560652a543cf4272d2f9443a5d4a5f
|
File details
Details for the file whr-2.2.0-cp314-cp314-musllinux_1_2_x86_64.whl.
File metadata
- Download URL: whr-2.2.0-cp314-cp314-musllinux_1_2_x86_64.whl
- Upload date:
- Size: 1.2 MB
- Tags: CPython 3.14, musllinux: musl 1.2+ x86-64
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.1.0 CPython/3.13.12
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
8af2b0efe472cb58a4f7b3d593db560a19b03f20a7e1dde565461cb88a087af3
|
|
| MD5 |
09b1205a3351c16fc4fb5b073a4c77c7
|
|
| BLAKE2b-256 |
de5545cffc172f3d939647a6ea2d9456453aff6cfffa41552cab066323fda40d
|
File details
Details for the file whr-2.2.0-cp314-cp314-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl.
File metadata
- Download URL: whr-2.2.0-cp314-cp314-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl
- Upload date:
- Size: 190.9 kB
- Tags: CPython 3.14, manylinux: glibc 2.27+ x86-64, manylinux: glibc 2.28+ x86-64
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.1.0 CPython/3.13.12
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
2357f0fabc8e95347390e49a40d8ab7c14ff62fbe27c3443752ad30554dde06d
|
|
| MD5 |
eb6df19eeb952b1e67c3243afd3a767e
|
|
| BLAKE2b-256 |
d9c664175e1372d9e48e9e5769f16fdbde14c17af2277244a95d5996c5c6f08b
|
File details
Details for the file whr-2.2.0-cp314-cp314-macosx_11_0_arm64.whl.
File metadata
- Download URL: whr-2.2.0-cp314-cp314-macosx_11_0_arm64.whl
- Upload date:
- Size: 159.7 kB
- Tags: CPython 3.14, macOS 11.0+ ARM64
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.1.0 CPython/3.13.12
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
b40208022a7be042bb7d6e222839fb80caf34153d72892d0396ba6e4db2fb707
|
|
| MD5 |
3b46cf548edad09660072f3acb1f725a
|
|
| BLAKE2b-256 |
092a427a883eb15be9e4d044ec3265481c622b42d22a2d30359807d111de0439
|
File details
Details for the file whr-2.2.0-cp314-cp314-macosx_10_15_x86_64.whl.
File metadata
- Download URL: whr-2.2.0-cp314-cp314-macosx_10_15_x86_64.whl
- Upload date:
- Size: 171.1 kB
- Tags: CPython 3.14, macOS 10.15+ x86-64
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.1.0 CPython/3.13.12
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
3964f18461710c8ac0a66646e8452514792d6f19b07cb1c1327d62fb9e9b1258
|
|
| MD5 |
63dd6ece1c9eaa3adff2a38c77078e33
|
|
| BLAKE2b-256 |
22056d73ef57d147c5a8eefada3223205a13f065ffaaac4b0320c6fa4eefc5cd
|
File details
Details for the file whr-2.2.0-cp314-cp314-macosx_10_15_universal2.whl.
File metadata
- Download URL: whr-2.2.0-cp314-cp314-macosx_10_15_universal2.whl
- Upload date:
- Size: 320.2 kB
- Tags: CPython 3.14, macOS 10.15+ universal2 (ARM64, x86-64)
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.1.0 CPython/3.13.12
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
fce684394f0c1493a06f33e5a151241aa0a4995fb8ffdeaf84e375f712014675
|
|
| MD5 |
87d5c182309fe85ffe68e2bcaf2b2ee4
|
|
| BLAKE2b-256 |
adf4dde7b74ca99ad7e2fdfbcc9a8fc0452b763f59e8f6ed25c515c54e82c08e
|
File details
Details for the file whr-2.2.0-cp313-cp313-win_amd64.whl.
File metadata
- Download URL: whr-2.2.0-cp313-cp313-win_amd64.whl
- Upload date:
- Size: 336.9 kB
- Tags: CPython 3.13, Windows x86-64
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.1.0 CPython/3.13.12
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
999f8c70f140e6379f61cefaa278065ccd3fe4bffcc7f20d63a4b41e4ae5d090
|
|
| MD5 |
48bc8ba1ab20f26c2b21728c0279a8bb
|
|
| BLAKE2b-256 |
647828def457af58095f2ad383466c963d40f1ac0082c0db7c41ce90beb2d0f5
|
File details
Details for the file whr-2.2.0-cp313-cp313-win32.whl.
File metadata
- Download URL: whr-2.2.0-cp313-cp313-win32.whl
- Upload date:
- Size: 308.3 kB
- Tags: CPython 3.13, Windows x86
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.1.0 CPython/3.13.12
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
1db71b09303b5744eb24fa20a20898ac21337cc1904ba2d1dc687d11ad3dcca0
|
|
| MD5 |
9a28ad066d970e4d415d175d32115d48
|
|
| BLAKE2b-256 |
15e0b615aee7b545875a5b15f55fcc2abde3f3b586a6abc882e34ebf075d1b68
|
File details
Details for the file whr-2.2.0-cp313-cp313-musllinux_1_2_x86_64.whl.
File metadata
- Download URL: whr-2.2.0-cp313-cp313-musllinux_1_2_x86_64.whl
- Upload date:
- Size: 1.2 MB
- Tags: CPython 3.13, musllinux: musl 1.2+ x86-64
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.1.0 CPython/3.13.12
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
52c7497459809c8e07f14e5d997251819e031e6c0b840c008b5188dfb15dd31b
|
|
| MD5 |
ce55232f15bb0f493892d280eddcdfb4
|
|
| BLAKE2b-256 |
1010a80ca13badbed763201fc806b3db1b995207de0b9ddb0a7a2d823309e231
|
File details
Details for the file whr-2.2.0-cp313-cp313-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl.
File metadata
- Download URL: whr-2.2.0-cp313-cp313-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl
- Upload date:
- Size: 190.8 kB
- Tags: CPython 3.13, manylinux: glibc 2.27+ x86-64, manylinux: glibc 2.28+ x86-64
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.1.0 CPython/3.13.12
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
c860d71f8acd958a0f045be7bac0812481bbf408e4bcecc8af22dfa4851d16d4
|
|
| MD5 |
8e8a1c371844bb679ab2707781e75010
|
|
| BLAKE2b-256 |
ab9278b438a231126f2a348c0aa0543f4a200683cb11e2e6614bd71c9e63370b
|
File details
Details for the file whr-2.2.0-cp313-cp313-macosx_11_0_arm64.whl.
File metadata
- Download URL: whr-2.2.0-cp313-cp313-macosx_11_0_arm64.whl
- Upload date:
- Size: 159.5 kB
- Tags: CPython 3.13, macOS 11.0+ ARM64
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.1.0 CPython/3.13.12
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
0188e4506d557dfd23e0acea5930d19f6105344c9ad20d46d77eb47a31877081
|
|
| MD5 |
1766514a196f919eb8ba80db9d6ab11b
|
|
| BLAKE2b-256 |
50ad6cb0f60c0d95e18652f84b89e22b6a4fdb4ef64cee510ec0bb1ec585208d
|
File details
Details for the file whr-2.2.0-cp313-cp313-macosx_10_13_x86_64.whl.
File metadata
- Download URL: whr-2.2.0-cp313-cp313-macosx_10_13_x86_64.whl
- Upload date:
- Size: 171.0 kB
- Tags: CPython 3.13, macOS 10.13+ x86-64
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.1.0 CPython/3.13.12
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
eeeae825093c4f1e3d24070b51017420c860491cf798862bab135e60a9d5d727
|
|
| MD5 |
0cadf8e65226daf6c4fddb5c1d5080b5
|
|
| BLAKE2b-256 |
01309845dee86c3fe9e52bfbc7ac13a5b9586c91a001db27df2baa7e8ce2bcc6
|
File details
Details for the file whr-2.2.0-cp313-cp313-macosx_10_13_universal2.whl.
File metadata
- Download URL: whr-2.2.0-cp313-cp313-macosx_10_13_universal2.whl
- Upload date:
- Size: 319.9 kB
- Tags: CPython 3.13, macOS 10.13+ universal2 (ARM64, x86-64)
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.1.0 CPython/3.13.12
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
6829bbf411ec072255234afb029ad73ff3ce369cf954cc9a538ab8f249454ab6
|
|
| MD5 |
6013c65ff270af2b3e2e8f9c43cc6553
|
|
| BLAKE2b-256 |
10fb919d7e680a6a59b999441e0fd265c7b64befb73e7d17a4c6176851aac4b6
|
File details
Details for the file whr-2.2.0-cp312-cp312-win_amd64.whl.
File metadata
- Download URL: whr-2.2.0-cp312-cp312-win_amd64.whl
- Upload date:
- Size: 336.9 kB
- Tags: CPython 3.12, Windows x86-64
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.1.0 CPython/3.13.12
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
f448e05dfdbcef4c23e54ccad5b76cf46fe3a475fe02c6265e57269cb5e89b12
|
|
| MD5 |
a6a6a299b7285c331984e4d26512f37a
|
|
| BLAKE2b-256 |
9f84589b96284c38e2359c4fc55047f6f7bd044c6571862ccb187d59c36be516
|
File details
Details for the file whr-2.2.0-cp312-cp312-win32.whl.
File metadata
- Download URL: whr-2.2.0-cp312-cp312-win32.whl
- Upload date:
- Size: 308.4 kB
- Tags: CPython 3.12, Windows x86
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.1.0 CPython/3.13.12
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
08eff30dc91a47fca7e10d0cf8ff263fec16d7505dd10f5b4afa7da1c00df53d
|
|
| MD5 |
06087d8a76786954de12e544000436e8
|
|
| BLAKE2b-256 |
136560f1bc7a01cf8a413c7130ce6de6e8f08a39bb22da3f84c0c155c727863d
|
File details
Details for the file whr-2.2.0-cp312-cp312-musllinux_1_2_x86_64.whl.
File metadata
- Download URL: whr-2.2.0-cp312-cp312-musllinux_1_2_x86_64.whl
- Upload date:
- Size: 1.2 MB
- Tags: CPython 3.12, musllinux: musl 1.2+ x86-64
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.1.0 CPython/3.13.12
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
661093f00fb1b4ae76cd07893e28ca2e6ca4e68f7590e24192e1da3e6137f5f8
|
|
| MD5 |
7ea5bbd30a4f61e6a7cd89704261edf4
|
|
| BLAKE2b-256 |
2f286ba201dc79a9f100ce3cfd56ad18145f6ff2a2e9db41407e4c95d42e17a7
|
File details
Details for the file whr-2.2.0-cp312-cp312-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl.
File metadata
- Download URL: whr-2.2.0-cp312-cp312-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl
- Upload date:
- Size: 190.8 kB
- Tags: CPython 3.12, manylinux: glibc 2.27+ x86-64, manylinux: glibc 2.28+ x86-64
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.1.0 CPython/3.13.12
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
4feb1994ce2073f3b06600753c25de891f157d37d921a24bf4b1941da981726f
|
|
| MD5 |
7cbb49e51299929dff0b66b5c0ee2067
|
|
| BLAKE2b-256 |
b624f7af47044c803dcb765e0b20b9a75cbc03602103787e0df24a96846c7228
|
File details
Details for the file whr-2.2.0-cp312-cp312-macosx_11_0_arm64.whl.
File metadata
- Download URL: whr-2.2.0-cp312-cp312-macosx_11_0_arm64.whl
- Upload date:
- Size: 159.4 kB
- Tags: CPython 3.12, macOS 11.0+ ARM64
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.1.0 CPython/3.13.12
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
fe37006da8d35fdbc9346dc304f49d90372e42404d6eb5b72fa81982d5a1e898
|
|
| MD5 |
ba7d160db91c3b65f0456e99e7fffb57
|
|
| BLAKE2b-256 |
6a7cafaa3b87028f50fcefbf6ad8b147841032a5da8204a51888ec15672433b2
|
File details
Details for the file whr-2.2.0-cp312-cp312-macosx_10_13_x86_64.whl.
File metadata
- Download URL: whr-2.2.0-cp312-cp312-macosx_10_13_x86_64.whl
- Upload date:
- Size: 171.0 kB
- Tags: CPython 3.12, macOS 10.13+ x86-64
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.1.0 CPython/3.13.12
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
d1d2649399992334e2cd87d7e33c05f9a2b3788237003152f3264df2d258baee
|
|
| MD5 |
b66871c9e754288646d9d664d66d5c6d
|
|
| BLAKE2b-256 |
fdd918a017fa1a4cc01028613e8653a4f177add761be8a4a31ee27a666c6386e
|
File details
Details for the file whr-2.2.0-cp312-cp312-macosx_10_13_universal2.whl.
File metadata
- Download URL: whr-2.2.0-cp312-cp312-macosx_10_13_universal2.whl
- Upload date:
- Size: 319.7 kB
- Tags: CPython 3.12, macOS 10.13+ universal2 (ARM64, x86-64)
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.1.0 CPython/3.13.12
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
59076c7f137f0df4e676366e1c781c660201cab2ae4f7c02a291582aa791f47f
|
|
| MD5 |
1a1ad029a3ae40dcbe9f7713f148cb46
|
|
| BLAKE2b-256 |
b90482bd6879c1b8feb8ad3531346cd48fbfe8ab38c7bbf3d51ecb07300c4dff
|
File details
Details for the file whr-2.2.0-cp311-cp311-win_amd64.whl.
File metadata
- Download URL: whr-2.2.0-cp311-cp311-win_amd64.whl
- Upload date:
- Size: 335.4 kB
- Tags: CPython 3.11, Windows x86-64
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.1.0 CPython/3.13.12
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
9e2f1a7bf82309e202fc3541ab7bfa00e6d85c3cd47bd46f5cea3cca2467dc2d
|
|
| MD5 |
4463dae3db9da0a9ade598094d0438b7
|
|
| BLAKE2b-256 |
76ecf594ac65aa28db7445eb080f18e93f6a9585cb8379aece3a683e0162b29a
|
File details
Details for the file whr-2.2.0-cp311-cp311-win32.whl.
File metadata
- Download URL: whr-2.2.0-cp311-cp311-win32.whl
- Upload date:
- Size: 308.0 kB
- Tags: CPython 3.11, Windows x86
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.1.0 CPython/3.13.12
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
5bfab7b073bc3833f200c6b6f4638afb041a0cc540189f8ac51d46899b2ff8b3
|
|
| MD5 |
4f16b5473c69e535e938657915bf26ec
|
|
| BLAKE2b-256 |
3f7e5916855589f3f2cc2169192c2d57f709afbeafaed510509b1bbee72b0b02
|
File details
Details for the file whr-2.2.0-cp311-cp311-musllinux_1_2_x86_64.whl.
File metadata
- Download URL: whr-2.2.0-cp311-cp311-musllinux_1_2_x86_64.whl
- Upload date:
- Size: 1.2 MB
- Tags: CPython 3.11, musllinux: musl 1.2+ x86-64
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.1.0 CPython/3.13.12
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
43da9a38674bed396f15eb710a213129d4b18e5367781c2d18eb9afa362fcd3f
|
|
| MD5 |
5ec1daa46b50c4cb0719686805f40fba
|
|
| BLAKE2b-256 |
3bc07aec862e4d58d11e03322e95b3f4e3b71bdc0a58d9490f89a33a910d9d43
|
File details
Details for the file whr-2.2.0-cp311-cp311-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl.
File metadata
- Download URL: whr-2.2.0-cp311-cp311-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl
- Upload date:
- Size: 189.9 kB
- Tags: CPython 3.11, manylinux: glibc 2.27+ x86-64, manylinux: glibc 2.28+ x86-64
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.1.0 CPython/3.13.12
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
c10b9703bd79906ef313f60e58fd6e12d451df9af62f0e8caa88945dd692a7b0
|
|
| MD5 |
9e2d66e2f23e560355bfcae9af224b71
|
|
| BLAKE2b-256 |
ecc53360771ec2456227fcd38e9234cf94619918a0a9bcb8290108c32b66e1d4
|
File details
Details for the file whr-2.2.0-cp311-cp311-macosx_11_0_arm64.whl.
File metadata
- Download URL: whr-2.2.0-cp311-cp311-macosx_11_0_arm64.whl
- Upload date:
- Size: 158.5 kB
- Tags: CPython 3.11, macOS 11.0+ ARM64
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.1.0 CPython/3.13.12
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
3dbb770caba8f280c4e85a191d06f5983c3af8d0c7fe9ce79e4169300e130be1
|
|
| MD5 |
af6872e7c423016811e661f0943204ca
|
|
| BLAKE2b-256 |
b33a24f93e20d7dbd4ebbb3fa7bef4b9f7f3d91607df389e6eeb94b927ca2816
|
File details
Details for the file whr-2.2.0-cp311-cp311-macosx_10_9_x86_64.whl.
File metadata
- Download URL: whr-2.2.0-cp311-cp311-macosx_10_9_x86_64.whl
- Upload date:
- Size: 169.4 kB
- Tags: CPython 3.11, macOS 10.9+ x86-64
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.1.0 CPython/3.13.12
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
5c8cd6996a03e8c6fa7ce3d17bd8541aecaab8f535e9f11be80216d5ad0dccb9
|
|
| MD5 |
61123da7a0699a5a081d3cd7f2270a3d
|
|
| BLAKE2b-256 |
f86bda2d9043ae0ad52e477b0bdb7f7eca461401cc8a1af62d87d9864c54834a
|
File details
Details for the file whr-2.2.0-cp311-cp311-macosx_10_9_universal2.whl.
File metadata
- Download URL: whr-2.2.0-cp311-cp311-macosx_10_9_universal2.whl
- Upload date:
- Size: 317.1 kB
- Tags: CPython 3.11, macOS 10.9+ universal2 (ARM64, x86-64)
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.1.0 CPython/3.13.12
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
01fff58891e6168421dcd95e84d8641205a246ec0b91682806a31c20c14cba36
|
|
| MD5 |
103e57cb80b633028a8a8dc2f552a964
|
|
| BLAKE2b-256 |
7626cb1cc4466afecc4f290e229153e691c5ba2de63f3538c51583755ed14907
|
File details
Details for the file whr-2.2.0-cp310-cp310-win_amd64.whl.
File metadata
- Download URL: whr-2.2.0-cp310-cp310-win_amd64.whl
- Upload date:
- Size: 334.1 kB
- Tags: CPython 3.10, Windows x86-64
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.1.0 CPython/3.13.12
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
74d8095457cdb7dfd5c8f307a722f4bba32942f3c9abb522fdc0121b49f2899d
|
|
| MD5 |
9f0fcfcb8f003792a5f7b96389782e59
|
|
| BLAKE2b-256 |
5b59b4c605454e01151644d08a2a406098f1f2ac4f8e1be0dd9c2e7e0a60a77d
|
File details
Details for the file whr-2.2.0-cp310-cp310-win32.whl.
File metadata
- Download URL: whr-2.2.0-cp310-cp310-win32.whl
- Upload date:
- Size: 307.1 kB
- Tags: CPython 3.10, Windows x86
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.1.0 CPython/3.13.12
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
fd5cfd901d2452b0722b1de0a5643d2c1642e54e91afd68665bb69b1cfbdd612
|
|
| MD5 |
4904d43f6d163f5c9ced0372aa2993a6
|
|
| BLAKE2b-256 |
36213e91e996e23d2a90dd3a5065fb0a74270cd0a2dc6b9776cbd2454c177b48
|
File details
Details for the file whr-2.2.0-cp310-cp310-musllinux_1_2_x86_64.whl.
File metadata
- Download URL: whr-2.2.0-cp310-cp310-musllinux_1_2_x86_64.whl
- Upload date:
- Size: 1.2 MB
- Tags: CPython 3.10, musllinux: musl 1.2+ x86-64
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.1.0 CPython/3.13.12
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
12a53f111638ae18e3cd9d0c93e3d830e5213d2f81e2ad434f7e4326345f25e3
|
|
| MD5 |
fcbd7c83cc227d5d1ddbff7e9b879097
|
|
| BLAKE2b-256 |
788940d678a8d928a972efb0d30d68071d012c2e90df8053731af597b9f87e7c
|
File details
Details for the file whr-2.2.0-cp310-cp310-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl.
File metadata
- Download URL: whr-2.2.0-cp310-cp310-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl
- Upload date:
- Size: 187.3 kB
- Tags: CPython 3.10, manylinux: glibc 2.27+ x86-64, manylinux: glibc 2.28+ x86-64
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.1.0 CPython/3.13.12
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
bbcaa80207e8cf366af663818ecd2596ce276229b79b711f3eea5f87abc9ffb8
|
|
| MD5 |
352e47ea54f7f7f9d134cebd5cfa40ee
|
|
| BLAKE2b-256 |
00028d9ccca5e002290b710c92a3e2f489c7ebe9b8782c1c4479c0d186372e97
|
File details
Details for the file whr-2.2.0-cp310-cp310-macosx_11_0_arm64.whl.
File metadata
- Download URL: whr-2.2.0-cp310-cp310-macosx_11_0_arm64.whl
- Upload date:
- Size: 157.3 kB
- Tags: CPython 3.10, macOS 11.0+ ARM64
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.1.0 CPython/3.13.12
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
9f5bb7c2398ef631df30ea0ae72aca29cd5300728bcd552194b20d5a0b1ab7db
|
|
| MD5 |
e1ce8f79b9b79d3cf54de6daa41f80c1
|
|
| BLAKE2b-256 |
0784c13de18f0cf101adcf6906ff5ef8b4101ed6dc78cbedae860fb843e63799
|
File details
Details for the file whr-2.2.0-cp310-cp310-macosx_10_9_x86_64.whl.
File metadata
- Download URL: whr-2.2.0-cp310-cp310-macosx_10_9_x86_64.whl
- Upload date:
- Size: 168.1 kB
- Tags: CPython 3.10, macOS 10.9+ x86-64
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.1.0 CPython/3.13.12
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
3a936c13296cf9f0871fddcba5f961e2f3253c8039d0a772661b159d6f9c406e
|
|
| MD5 |
68f5bac73ed9d939d803ec8b6ac7662e
|
|
| BLAKE2b-256 |
ed203069ea8a482b1264313e09e41518c34ea8c9d1a924ea5f5022fca2fe92e9
|
File details
Details for the file whr-2.2.0-cp310-cp310-macosx_10_9_universal2.whl.
File metadata
- Download URL: whr-2.2.0-cp310-cp310-macosx_10_9_universal2.whl
- Upload date:
- Size: 315.0 kB
- Tags: CPython 3.10, macOS 10.9+ universal2 (ARM64, x86-64)
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.1.0 CPython/3.13.12
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
dd1a9e1eff915f9a350bb77e2dcc658a2d4fea7a7a42f44c35224dddff5ff9a9
|
|
| MD5 |
a27d1d94d56e1dc60ce37d312cfa0062
|
|
| BLAKE2b-256 |
92346a4252ca9796b1cf7ed9d6825f626bef55639dee471747062bb9093cdd46
|
File details
Details for the file whr-2.2.0-cp39-cp39-win_amd64.whl.
File metadata
- Download URL: whr-2.2.0-cp39-cp39-win_amd64.whl
- Upload date:
- Size: 334.9 kB
- Tags: CPython 3.9, Windows x86-64
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.1.0 CPython/3.13.12
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
c3cd3abcb45da5d9ffa137382c3746de97ea2eb91d50f0d2a04459c4a336fce2
|
|
| MD5 |
e056f24f5be9b32a6bef3d10f6ef2980
|
|
| BLAKE2b-256 |
1b703d30d3ebdfd6d69c2cdbc705ea2195960fbfd81912257392a6ec78e8773c
|
File details
Details for the file whr-2.2.0-cp39-cp39-win32.whl.
File metadata
- Download URL: whr-2.2.0-cp39-cp39-win32.whl
- Upload date:
- Size: 307.7 kB
- Tags: CPython 3.9, Windows x86
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.1.0 CPython/3.13.12
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
d057ee9130f38945c8a24675b4ddfcd7634b5a48e6d7942910a02f677a77f1c3
|
|
| MD5 |
d563be1305b71ce085347ec04e956669
|
|
| BLAKE2b-256 |
8ca540ae13a9ba999ce468c7ed444dfced488906473d0e2e214c875a7cb64fb3
|
File details
Details for the file whr-2.2.0-cp39-cp39-musllinux_1_2_x86_64.whl.
File metadata
- Download URL: whr-2.2.0-cp39-cp39-musllinux_1_2_x86_64.whl
- Upload date:
- Size: 1.2 MB
- Tags: CPython 3.9, musllinux: musl 1.2+ x86-64
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.1.0 CPython/3.13.12
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
7fe85fa07aa7d24d8ea481fa14518656073acbdf1bee3f413059351c825cb69b
|
|
| MD5 |
8b315ec8c0710db92d4f0e8ef47e80f9
|
|
| BLAKE2b-256 |
5e315fa20a882ffad563f3ef0852186bf532dfade604f3f1f666b673156b10b5
|
File details
Details for the file whr-2.2.0-cp39-cp39-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl.
File metadata
- Download URL: whr-2.2.0-cp39-cp39-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl
- Upload date:
- Size: 186.4 kB
- Tags: CPython 3.9, manylinux: glibc 2.27+ x86-64, manylinux: glibc 2.28+ x86-64
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.1.0 CPython/3.13.12
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
8cdb039dcc9fce20776e33e597caf8f2d6ef3853728a7cc739525239f09c3cba
|
|
| MD5 |
a84d2dfea85833eb3c2657ea6c34ea54
|
|
| BLAKE2b-256 |
6f5fff2190c3e7f282570442e1b5c06d69f7003710db65f28ab90885b4a4096b
|
File details
Details for the file whr-2.2.0-cp39-cp39-macosx_11_0_arm64.whl.
File metadata
- Download URL: whr-2.2.0-cp39-cp39-macosx_11_0_arm64.whl
- Upload date:
- Size: 157.5 kB
- Tags: CPython 3.9, macOS 11.0+ ARM64
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.1.0 CPython/3.13.12
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
9868a37381262adfb24418ab9297ac294840db2d3fde0a5a8d4f59e958b81d8b
|
|
| MD5 |
ef29ba080e34659bc6994ea7535a5721
|
|
| BLAKE2b-256 |
6796405aaf43f3bbd07c20e10ea635a058a37c0404563b031835b151fe20ed27
|
File details
Details for the file whr-2.2.0-cp39-cp39-macosx_10_9_x86_64.whl.
File metadata
- Download URL: whr-2.2.0-cp39-cp39-macosx_10_9_x86_64.whl
- Upload date:
- Size: 168.2 kB
- Tags: CPython 3.9, macOS 10.9+ x86-64
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.1.0 CPython/3.13.12
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
1c8d63ef91a8c44707dd113e308880186f04fc4a154da7c413865639ac7c45f7
|
|
| MD5 |
9111643f894f3b93d18953677bea6348
|
|
| BLAKE2b-256 |
4693d60083d3318dfcd830ad0d899507f47176391e6ad5fb7b20ec7098b310ec
|
File details
Details for the file whr-2.2.0-cp39-cp39-macosx_10_9_universal2.whl.
File metadata
- Download URL: whr-2.2.0-cp39-cp39-macosx_10_9_universal2.whl
- Upload date:
- Size: 315.2 kB
- Tags: CPython 3.9, macOS 10.9+ universal2 (ARM64, x86-64)
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.1.0 CPython/3.13.12
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
6b83a9ce82e4f25390e3177e1c1d64fde95e4d4e8fc85b68567726547d596511
|
|
| MD5 |
4f59d8d650ae0a860fa5be1169c62468
|
|
| BLAKE2b-256 |
2d4bfa74fb098be12a06b6cab64e6dc1eae3c86c905de2d4d438c7621c7fa512
|