From 4371b0d8cce8cf59050989c7d63cbc48b5c01565 Mon Sep 17 00:00:00 2001 From: Max Ghenis Date: Fri, 9 Oct 2026 19:49:10 -0400 Subject: [PATCH 1/9] Add input guide, design document, and security and deployment notes Three guides under docs/, asked for at the 2026-10-08 BLS Consumer Expenditure seminar. Their reference tables are generated from the code by scripts/generate_docs_reference.py, and tests fail when they drift. Co-Authored-By: Claude Opus 5.5 --- README.md | 11 +- changelog.d/agency-docs.added.md | 1 + changelog.d/r-example-state-codes.fixed.md | 1 + docs/dependencies/requirements-py3.10.txt | 1938 +++++++++++++++++ docs/dependencies/requirements-py3.11.txt | 1885 ++++++++++++++++ docs/dependencies/requirements-py3.12.txt | 1876 ++++++++++++++++ docs/dependencies/requirements-py3.13.txt | 1875 ++++++++++++++++ docs/dependencies/requirements-py3.14.txt | 1875 ++++++++++++++++ docs/dependencies/snapshot.json | 1400 ++++++++++++ docs/design.md | 254 +++ docs/examples/custom-dataset/crosswalk.R | 69 + docs/examples/custom-dataset/crosswalk.do | 64 + docs/examples/custom-dataset/crosswalk.py | 75 + .../custom-dataset/survey_extract.csv | 7 + docs/input-guide.md | 601 +++++ docs/reference/input_variables.yaml | 239 ++ docs/security-and-deployment.md | 327 +++ .../policyenginetaxsim/R/calculate_taxes.R | 4 +- scripts/generate_docs_reference.py | 1242 +++++++++++ tests/test_docs_reference.py | 119 + tests/test_input_guide_claims.py | 196 ++ tests/test_no_network.py | 80 + tests/test_worked_example.py | 112 + 23 files changed, 14248 insertions(+), 3 deletions(-) create mode 100644 changelog.d/agency-docs.added.md create mode 100644 changelog.d/r-example-state-codes.fixed.md create mode 100644 docs/dependencies/requirements-py3.10.txt create mode 100644 docs/dependencies/requirements-py3.11.txt create mode 100644 docs/dependencies/requirements-py3.12.txt create mode 100644 docs/dependencies/requirements-py3.13.txt create mode 100644 docs/dependencies/requirements-py3.14.txt create mode 100644 docs/dependencies/snapshot.json create mode 100644 docs/design.md create mode 100644 docs/examples/custom-dataset/crosswalk.R create mode 100644 docs/examples/custom-dataset/crosswalk.do create mode 100644 docs/examples/custom-dataset/crosswalk.py create mode 100644 docs/examples/custom-dataset/survey_extract.csv create mode 100644 docs/input-guide.md create mode 100644 docs/reference/input_variables.yaml create mode 100644 docs/security-and-deployment.md create mode 100644 scripts/generate_docs_reference.py create mode 100644 tests/test_docs_reference.py create mode 100644 tests/test_input_guide_claims.py create mode 100644 tests/test_no_network.py create mode 100644 tests/test_worked_example.py diff --git a/README.md b/README.md index 0cd9b01ce..fd8b4f569 100644 --- a/README.md +++ b/README.md @@ -4,6 +4,7 @@ A comprehensive TAXSIM emulator using the PolicyEngine US federal and state tax ## Table of Contents - [Overview](#overview) +- [Documentation](#documentation) - [Future plans and maintenance](#future-plans-and-maintenance) - [Quick Start](#quick-start) - [Installation](#installation) @@ -41,6 +42,14 @@ This project provides a high-fidelity emulator for TAXSIM-35, leveraging PolicyE - **Flexible output options**: Standard, full, and text description output formats matching TAXSIM specifications - **YAML test generation**: Generate PolicyEngine test cases for reproducibility and validation +## Documentation + +- [Input guide](docs/input-guide.md): every input column with its valid values, how blanks and unexpected values are treated, and a worked example that takes a survey file to taxes in Python, Stata and R. +- [Design](docs/design.md): which engine computes each year, how inputs map to PolicyEngine variables, how outputs are assembled, versions and pinning, and known differences from TAXSIM. +- [Security and deployment notes](docs/security-and-deployment.md): what uses the network and what doesn't, the full dependency list, the bundled TAXSIM executables, Python versions, and installing without internet access. + +The reference tables in these guides are generated from the code, and `tests/test_docs_reference.py` fails when they fall out of date. + ## Future plans and maintenance We will keep powering the TAXSIM emulator for as long as people need it. Its backend may move to [Axiom](https://axiom.org), our next-generation rules engine, which encodes rules from the law with tests. If it does, the emulator still runs through PolicyEngine's wrappers, and the surfaces below stay backwards compatible. Using PolicyEngine directly adds capabilities beyond the TAXSIM format: benefit programs, and tax calculations that use variables TAXSIM doesn't support. @@ -262,7 +271,7 @@ The dashboard provides an intuitive interface for researchers and analysts to ex ## Input Variables -The emulator accepts CSV files with the following variables: +The [input guide](docs/input-guide.md) is the complete reference, generated from the code. In brief, the emulator accepts CSV files with the following variables: ### Demographics diff --git a/changelog.d/agency-docs.added.md b/changelog.d/agency-docs.added.md new file mode 100644 index 000000000..497153fc5 --- /dev/null +++ b/changelog.d/agency-docs.added.md @@ -0,0 +1 @@ +Add an input guide (every input column, how blanks and unexpected values are treated, and a worked custom-dataset example in Python, Stata and R), a design document, and security and deployment notes under `docs/`. Their reference tables are generated from the code, and new tests fail when they drift, when a run tries to open a network connection, or when the worked example stops running. diff --git a/changelog.d/r-example-state-codes.fixed.md b/changelog.d/r-example-state-codes.fixed.md new file mode 100644 index 000000000..f8be393be --- /dev/null +++ b/changelog.d/r-example-state-codes.fixed.md @@ -0,0 +1 @@ +The R package's documentation examples now use the SOI codes for the states they name (5 for California, 33 for New York); they showed 6 (Colorado) and 36 (Ohio). diff --git a/docs/dependencies/requirements-py3.10.txt b/docs/dependencies/requirements-py3.10.txt new file mode 100644 index 000000000..be83ccab4 --- /dev/null +++ b/docs/dependencies/requirements-py3.10.txt @@ -0,0 +1,1938 @@ +# This file was autogenerated by uv via the following command: +# uv pip compile pyproject.toml --python-version 3.10 --python-platform x86_64-manylinux_2_28 --exclude-newer 2026-10-09T19:00:00Z --generate-hashes -o docs/dependencies/requirements-py3.10.txt +annotated-types==0.8.0 \ + --hash=sha256:13b2beaad985e05e2d6407ee4c4f35590b11f8d693a258a561055cac8f64cab7 \ + --hash=sha256:f072f4d804ea359e4eaf198b1af7a8b0943881a87f31bb764f8bf219bb9419e0 + # via pydantic +anyio==4.15.1 \ + --hash=sha256:6152fdbbf9a77fdec97731721bebf7c4c44f7c29b424b0065826173efc7ed101 \ + --hash=sha256:9f28306018cbd6d329e64a36d58256edff76dd996fe423bc957326e578b82a94 + # via httpx2 +asttokens==3.0.2 \ + --hash=sha256:3ecdbd8f2cc195f53ccada3a613538bb5f9ef6f6869129f13e03c30a677b8fe2 \ + --hash=sha256:9da13157f5b28becde0bd374fc677dcd3c290614264eff096f167c469cd9f933 + # via stack-data +blosc2==4.3.3 \ + --hash=sha256:0a4aa9fad69b8c125e959d005989991c3230dfa456caf21bb81186be9e2f61a2 \ + --hash=sha256:1552a0257e4c9fc9b9594bbab5d8b908937a7a8d63bf3e33e8720fe59b4d0b03 \ + --hash=sha256:2153d08ba45f4a7bb632fa1eac9a7204b438336d7c7188edf3162f4a4087d719 \ + --hash=sha256:28178658d4c86e024b48526896c1cb91b011a628921ee0498c06bb57b3747c3f \ + --hash=sha256:322afea80b919e48b67b2730ee927449793d2856d65e54b9be67dfdfb610f2df \ + --hash=sha256:36e03791fa1882ef25a5d0e2c3ed92e1b1265f05fb33094aa4c6b15dd5d7bf82 \ + --hash=sha256:4c0f697e19b4ea6a81d29ebd81d7345479236eb63cf7a4758f3f235ec7a28b97 \ + --hash=sha256:4ecfe6ecd4eea32fc1c71aabba2964367fb92d0ade055ac4286a07fe1848fce6 \ + --hash=sha256:5bde415c6c3838959173b4a2a93811c1b63d32eff4ee56f998f6c731eef5bbcb \ + --hash=sha256:5d9d518163f6fe4b260c14ea3b5f5e22da626f13de3653fd5661da4b3d4af892 \ + --hash=sha256:69afc003043df7bc090f096ad84aa952467025beb8b3bc906f77eca2e2728d07 \ + --hash=sha256:6cc102bc384a47373b37593415b57a8e8e547e267c2f652268fd01380d749349 \ + --hash=sha256:7c477482f10506a3b1e8868cb705b45caa64d13f42572878d0e4f26978ada55f \ + --hash=sha256:7f4b5bfb37121e46fc855d273a786cfc0c731802220f254241ac01ee1384fe06 \ + --hash=sha256:80814d4d1ed20abe063476e8281f85ed830c89de72440cb6a65e5fa6a8022de4 \ + --hash=sha256:8813f634d0f5b2021d427e3edefa3146f3fdbe4d2404edf9cba2be79e81bd3b1 \ + --hash=sha256:9100d202024f8be97da0e64843d702ff9b0f14c8c3bd8a84fd9f17c5d816a0f0 \ + --hash=sha256:9546c7a43623c649d14fa28b1df5e4ca991f62054c319128177909bf84217207 \ + --hash=sha256:a3daa919c8d9c186ec065e06a116582d58753b9661f1f9d8b1dee476c4cb34c3 \ + --hash=sha256:a9458facbf4323377cb32b25478d200996b699e20338087291ca35aea32c8da8 \ + --hash=sha256:b1bd93b4c7e8a96afddc17883e56a38e0b799876756371f64f94e639a51aa7e5 \ + --hash=sha256:b21d6d3fb77b53d36f35a315bc4c4437a9f40cf35a76966871f5a8bdfbb07262 \ + --hash=sha256:b5ca83094ce1e2885f4a44eae6e2689959af67aee22b3f69af64447206dde3d9 \ + --hash=sha256:bcb18782210260edd09b3e38433f0140feef8c757cacfff8713171f4fc2592e6 \ + --hash=sha256:c03b207730294e5809e872c5a5bd65f6d3370fdf101f1e6136e83621412d931e \ + --hash=sha256:d0c8dc54155331a439c57a8858250c2af692ddaa39361c043c0544e5a2ea692b \ + --hash=sha256:d1834c6578d45bb50f48a293dd87fcc194cae5b45851ed07bb7e4116373d3f5b \ + --hash=sha256:ee03608640c5e0363dd16f69ee8d5473d4a17d2a7b4a66bd9ac82fcfcaad6afd \ + --hash=sha256:ef89bc8fadf6e586fa38dfa998f8b6091aae653c41ef85232814e59ed6e9db85 \ + --hash=sha256:f1b37cdfc41c1da50b05b674416e495efb64054554d109433e3818310da99737 \ + --hash=sha256:fcd1bbc598542b2530fbd9fe5bf8146d15f01af4c2bcb12d2610160d218535d1 + # via tables +census==0.8.27 \ + --hash=sha256:207aae0f83650004f6b7dab6a730b6a60df96a119f55167260c3153313f15a32 \ + --hash=sha256:6ef36f5d2e7759824e28051bc2c7fa0706d41e153ccb353a6c2d4d9eb354cd7e + # via spm-calculator +certifi==2026.7.22 \ + --hash=sha256:62f22742b58a1a33014a2b6b706588a8d7e2a88ae7bd1a6ebe8c992928483775 \ + --hash=sha256:741e2c3b351ddf169a738da9f2c048608ff7f2c5cc02f1ebc6b118bb090d5d55 + # via requests +charset-normalizer==3.5.2 \ + --hash=sha256:01077390b03f7988f11d700a2194e69b119741a86b1a638b1db88891e3eced8e \ + --hash=sha256:01b0c0d2262a9e28e8484a278c7e1b5d650e3ac8cf2683d2967e25899f208bdf \ + --hash=sha256:04851f73ae72b8413dddadb16a49dfee95263553741fd42d546f7d66907e6be5 \ + --hash=sha256:0521c5665880b33d603717defa76c094048900010897909952397feb3039da56 \ + --hash=sha256:0774bf9bf620249fee3e0b8b9fd3065de213be30f3aa94ce2494b3b638949e26 \ + --hash=sha256:0891b9d3903c5571c03771ca669a4b0ec5618ca722a5c957d3d29cd4e5062848 \ + --hash=sha256:0c951d5e6dd9c2ff60609476752bee49da4206adde960ebc247766937f72e718 \ + --hash=sha256:0fed1d06615f022ee3b13caf5e8b180cfea32bb2c5aded8a9d44277afc040f93 \ + --hash=sha256:114e4d0c92d618409ed82a99e22b5c5e768fe995f2973f78265f4524f49d4640 \ + --hash=sha256:11912e4bb14baae7c5d8791aa55ba0a3a03ec6729073307b0f57270abaa713d3 \ + --hash=sha256:11a4d68a6ecda3292cb1e50239e111543ba5d709bb62a6b4ea1afcfa729d8875 \ + --hash=sha256:124fbf1a8ff966d87ae05bb8bd45a71f966055ed8bba320d0c7cf450bc5f4d0e \ + --hash=sha256:1461ac396c4fdb983a675f20aa555624f0ee18ac83d832b9244ffff3d8055275 \ + --hash=sha256:1503bccbeb36d5527790c3930327704c39af22de3112f1b1666a9f3ce15ee204 \ + --hash=sha256:15bb4005af6320d259dc7593ca84a38d7fe06a421dbcf7b910ae23979101e787 \ + --hash=sha256:15c44f7edfd477b06f517a5cc317fc1707edb9de2c865f43d4b6513907473234 \ + --hash=sha256:16fa0eccf81304b79c5cd87f9271c3b85dd9dd99245e4422ae9c0dd45e0f99d3 \ + --hash=sha256:183b88127acdb4fabe59d951ab424faf1af7b63cdbb5f776186c1ea2ffcaed98 \ + --hash=sha256:195c26fb65950f8fce54e26349852b7bdd7c5f120aeefbcc440b8a20faaed4a3 \ + --hash=sha256:1afb975bd5d68d5ce9f6b6d44fdf2f7e34b895a35e95708a7a91b20a3b51d187 \ + --hash=sha256:1b4cbc7c3491ccb4aa17fcd8165649d01cf39f76de1696da8631b5f71b85401d \ + --hash=sha256:1bc0baf5ef96b6ede57d47f4b8fe4d9d84019c3bfcbeb20a41edc6a6ee341f1f \ + --hash=sha256:1c50fe28bbc2ced33386f298650d91218076c05420e6cbd790b913adc41659e7 \ + --hash=sha256:1db38f4c5496827c1a501846d64d14c3b80c7e6714e406cd7dc36a9899fa1011 \ + --hash=sha256:211d5a3eb6af8f513b8d4ca19a8c1b7accab1b5f0d3175f9826b03c1a920dc1f \ + --hash=sha256:23851fb4e1b85ed3f6c2a27b777cdfe2e19fb5b38429a8faf38c7542b7665869 \ + --hash=sha256:254eb48b9fa5ee9898a3c445825a1f340fe53712a098904b39b0bddba8ea3cb1 \ + --hash=sha256:2625388c6c754520c37abaf3b41eb34d1cc4a373f457898f08606c8e362b891d \ + --hash=sha256:281cb91036248400f4cc957495cccd44c275c2e0c5854f7e45ac5cf7dc193847 \ + --hash=sha256:28a15fdad492a99b6eccfaaed66ef3f74050680545ea61ec8b2f4c538f1f1320 \ + --hash=sha256:28b4f0d66fb834ff90f28209ac7bce77868c45d8c93e26f906709d9b7c2e1af9 \ + --hash=sha256:2a925889534b3748302dae5dead07cc13480de1dac3aea80a941b729b471ef93 \ + --hash=sha256:2b7b3bbfb4fe8ef40600792d762fbaa9057559f9d3fad209525b7a22b99e91fd \ + --hash=sha256:2c9ad19a6cfcd5ea5c0d41161d22f9df1dcc277e9bef2751391334546a314c00 \ + --hash=sha256:2cc961b171b3f3440f410489ab3573e86aea8736134ebbb40ea1338b7f0831bc \ + --hash=sha256:2ce45c6627b22c47e390bc91a41c3d13032192e699fa0bea96e9671b373d69b0 \ + --hash=sha256:2e06a3a98f916dd41d27f3105e02e7a40181c98c94b9158733d03a6f80506c09 \ + --hash=sha256:304d5463e65a35d7bb0850550e0780395395f6fcf452f04db7d5ca7cecc425ac \ + --hash=sha256:304d8e4d493af723536393eee0c689eb7813f4a474c8b479dee63f1fdd98f621 \ + --hash=sha256:30fcd120b732aa79317f08dee04d7de0847822e4cf7ee0e9f445bb958832252c \ + --hash=sha256:31f3930700408d211f13378ccbe1c40845d8da54bd0681fac3a9b5aae81c7aa8 \ + --hash=sha256:34276fd796040bf0993ab33a369aa572e6979c7aab225a88893667ad8eac8f7a \ + --hash=sha256:355ad8011081dec5412240c087a9a0c9d4d5039f3ed11a3f13e18c2b29b56c51 \ + --hash=sha256:38a873987f3be698494da8b2e3085e29da02da7b633dce73e79c699a113d7bf0 \ + --hash=sha256:39de2a259fc954455c57274dc94c79d5842774e1247a016aff30bc0efed0f4ef \ + --hash=sha256:3d14b50de6bf4d0edf857a9386836846f982b8f524e188e2e68b96d702bcf4aa \ + --hash=sha256:3d21b8b13c7592db2ac5e544a6d83187b995257472b0c9e8351b6d507ae37ed6 \ + --hash=sha256:3d31298449090ab8d47b7b1b2a555ff73cac7ed438a08b7ac160980c7ebed649 \ + --hash=sha256:3ddacd27458c45bdacd6bd6db644bfb730efbf9e830310186e3045c9c5be8fb2 \ + --hash=sha256:3df041de8887954562c9b261cba85ca0e9ded74048daf125f45edcfaa4832229 \ + --hash=sha256:40ab6bffa02ae10a0581e6c198be7d2d8ca5c2a0c64e4ed3465d766df457573e \ + --hash=sha256:4275811936e2f06feff5e598fb42a1b7ae852da8e39605211892b56b81a34efd \ + --hash=sha256:443eae2bf318abeaf6f15d785138f71fd6de770e99a92158b8b814265e079115 \ + --hash=sha256:447441e76ec720b15e64418d32e092297340387053047c7c694f579efb0ee1d9 \ + --hash=sha256:4495c5002a7b28557e7e222e77e0b661183e432b7d6d2e788101e3f240e05b8c \ + --hash=sha256:44bd4fbb29dfbeba60e7d2bd000c59e4b21ddb3cc53912b14048d37092706d7c \ + --hash=sha256:4685902cf26edf013ed7a3da0f426ebba7a00ebb9541386d835afbf002c11cab \ + --hash=sha256:498dc3188ca05a68231ac3fdbfc7f57eb67e1343c30e0fea17f8218c1599b253 \ + --hash=sha256:4c2b5031f63e331e3839b40aed2dd6f191e9c07edbde303e7876846ea1946995 \ + --hash=sha256:4d48f2d08b9de5864e2c8744d4461b862fb149a18274abc8b698c45975573438 \ + --hash=sha256:4f87960d57feabfb618e4e0af6e7371645fa26a277860739d6e5d6e0012c92f0 \ + --hash=sha256:50e3adfb96fc189eb27b1cf62d3b598b89b4bb0420d93a3d3e42e137409011be \ + --hash=sha256:51cf45226a9b588d0d2b4880c62d686934b63ab0bd79ca23ab0e9762eb27441b \ + --hash=sha256:52aa6992700996af31f375de0c6bacd402b0097fe40b53c426b9f51a90ebabc7 \ + --hash=sha256:55ea99acb17b9325618de155a0cd6a2e8f5d10be008113e1d433bbb58db543b2 \ + --hash=sha256:56bc200a365efb37383b7852e4cc5898d3b2da5987289b543956cf8cad71018a \ + --hash=sha256:588461c2e8384d309bd63e5826019b6977bc66d629b99ac8737bb795d7b2cb5a \ + --hash=sha256:58ca3755ee7ff7f59b57789ec9833c9de9ea275405cdd240eda1f193112e398a \ + --hash=sha256:58f361dcbab699cf8f42db3f47c8e7fd1036f138c23a5d08de9fde5f425a730c \ + --hash=sha256:598a11a2c7ebaa5334bf698bf29568c9c390abac6a154d8170fedecd1cea38c5 \ + --hash=sha256:59f63901b0031c3136cf64704dcb21de0bbae62ce2c9529bc39d27665463de37 \ + --hash=sha256:5cde776b7cc66e4f6c99612cea4aa7269aa65863f7a15841b2c264f103822f4e \ + --hash=sha256:5e2b6b57e9733d39f0c9fd3185efa6b8e29652c4cd8fe94180272cf6ed9a78c4 \ + --hash=sha256:5fb29fb8cd1a46c27a1bf9613ad5ec2599310d46b4025d9556404a6b6a292800 \ + --hash=sha256:6045373d5a89a5ec71afde535db987ca28e76dfa276c2d4c818265b375d4b055 \ + --hash=sha256:619799369eeef6366ed3e8755a5670f4f2f0fb6b30a0fd7264dc0fdc2357058e \ + --hash=sha256:62588a277bfb59def052abd940703fa35107152bf479781a878617d60faf8fb5 \ + --hash=sha256:62603db9a7caa0802eaa28c1c46fecd7b3a263a774069c24c3c28c302448721c \ + --hash=sha256:65cd72beeeca9d3aaea1201e5923859f308f952f9c71de93f06063c79f0f7a3b \ + --hash=sha256:68eb192d85ab8e5f6ec69c2bc6ac0179fbf04a5ac1569d12fbef74883fe102d0 \ + --hash=sha256:6bd128f206a7752ae1f2ab6c61bf8a24ba28913a10df8b14c2637b973ff97a80 \ + --hash=sha256:6be488a102b8cf28d0391d8c4ba7748938ae28b78ad901f8585520fca33ead1a \ + --hash=sha256:7218e8f32b0956cfcd048fd42d9d5779809745ca1d86113ca56f66e7ae1549c4 \ + --hash=sha256:7441d755b7ab94f8d4eb3e43ec05482d760842fd263d003a99102d742cd835e2 \ + --hash=sha256:749e97e1b32313717a565abbe321bc2190bc8b35f1a67e4cdbc7c56c8d8ffe58 \ + --hash=sha256:75a3ceed0724d625d64b86ca20aba182e4df462e04c2414fc941c0f523f06aac \ + --hash=sha256:780fbe7cab297b81dad9fb8dc5eb003c0468ffb0d9e5f65068c53a34661a96bc \ + --hash=sha256:78456a747de8dc58360ffa581f30a002baf5aa28cb262536545e91f113ed7639 \ + --hash=sha256:7967d08cf06dee78443b874f98c98036f624f3a4e73e11f9f64f5be4d25393cf \ + --hash=sha256:7a881931aa470808df94a8c380eed2bbbc76cd9dc622310f99665658c821eb6d \ + --hash=sha256:7dcd882da75ef9adf94903b1e3b9419e8aa8fb4c7396822b834b9ef7fb96954f \ + --hash=sha256:7e841fb9010836c992c9f12fcbd43a831de93a5f726fc1ccd8ca1d0268c5014c \ + --hash=sha256:7fdde2c9fd9e3eca40631e024664cf2584272cc8f96308cbe5fdfc930f51d8bc \ + --hash=sha256:8024d00c3faf3fc0c16e07a69f4405e8eac7cc0ab15f65fe6cf43827c4cf72b4 \ + --hash=sha256:80d02b6f04e92601a081dd97b23d3128033098bff5d35d392ddcc0476ea11253 \ + --hash=sha256:838dcc90063569a0448120554591a1d6c4a4ffe11babf048908793154ab86ade \ + --hash=sha256:849df64e889b2e17230d58410a03dba311a65b163508fd33679b2b737d4b7858 \ + --hash=sha256:87475fabc8d9996fd9c27debb395e642e8c838d78a00b6e932227a0e06b81e26 \ + --hash=sha256:87e50a3e7cb90af586b6c5faf23e302a970415ac73bd7bd90a515a04b427ef96 \ + --hash=sha256:89b53f3cda69831909888e0494f4fa0bcd3537e3e138dabeb620bd6ad946bae8 \ + --hash=sha256:8a893cc101149f80a653f82062ebc95b34525a2614382e1da5458fe7c6997249 \ + --hash=sha256:8b2bfab86aa71ae13aa41a6a26aab338e0db2b8bc75434b05aea89e011ff35a4 \ + --hash=sha256:8d86d6fc60743dc916eb79e2eb1ec4818e21e427731543af40a3021851174a13 \ + --hash=sha256:915563965d418f986e7e145accc592eae9e1a1be3566ff98a05d7a9ec42a76e1 \ + --hash=sha256:92888bb3187c5ba50500b00b3b310c9f2c651709d28036077680cb5255450a03 \ + --hash=sha256:93223adc95033dd47133a46ccfc316a0139176fd79085762e27202ec56018f03 \ + --hash=sha256:9373ad13ef0d2c0fb761e04e55bfdee5a08b52cef2c882c8fbe9935b1517152e \ + --hash=sha256:9409a8bf35cf78353942504b24a57de3d75b708997a1e4bd8db71ac8633ce364 \ + --hash=sha256:9b7f416ff0978e2f2249330527f0ad6fa02f4932e6199692d3b52da2048c19e4 \ + --hash=sha256:9bde855991b7e362c146535e3136a50bfaffc0487d38b33ca7e5edefc6e23849 \ + --hash=sha256:9cae88599c7219005d879f98e5ed53341e9a122af585e1091200358a3003d2a0 \ + --hash=sha256:9cf9b1a857e25c4baceeb3624e92a56df3668f398c4acba74e174d81fb4d1d3a \ + --hash=sha256:9f56f72050826f63dcee7a7f55b0a77168cb3bfc553fd405e7f8f9ece75a4036 \ + --hash=sha256:a090bb2c68df85450502e3e20d665e3a5af9c65a84d6508ed477badd49166fd3 \ + --hash=sha256:a192e2c40070d92c3ccf777e3a5c4ff515573cd2bb7ed0c537fdadbbec5bbf21 \ + --hash=sha256:a19a731138fc27d5682277d3b9df22855cea1239bce7fcec5f78f42ef2d1f3c3 \ + --hash=sha256:a66c3bc5ab1f0ff2164fc9965ddd611ff0802173f4b9d24554c563f6ab7e1d6e \ + --hash=sha256:a815775b6c38d4e0ff7bcffbeba67feded90202bb6a226b8dd35f1c855217413 \ + --hash=sha256:a89012d6d5476ee112d20d998570ed58df2260a852afb1758809cd6900411d21 \ + --hash=sha256:ae4f5fea5b8b8ccff88238cc8569303e5ee95efae67fa62922a311397a71f346 \ + --hash=sha256:b6856554c4f44d79fc2307d5768854310a8f0096e501c75637542c82292b0429 \ + --hash=sha256:b6b751274acb69d77b3323d6b7dbaa3c7fdfc1eb829b7eb61d262f32e1af9685 \ + --hash=sha256:b736353c0a625bbd5fcec108576e2385db3496f4f771f785ff32e108d3c3bc45 \ + --hash=sha256:b7fd005a73d9e657273b7a10dc71a9e03c8fb9ee6999798d6918ce095b81ac7f \ + --hash=sha256:b91363207bd9dc966a691e959bb47f64b30f7ac4b072be9968b366982f7db77c \ + --hash=sha256:ba0b1d2620edf869789c3879223f52bf2afc5d31b3cb47cc57b3a12c05e2aa9d \ + --hash=sha256:bbbfc8e28816f19d7c0f1816664980c0a9875d01b27cdf8eedddb639d9e108ad \ + --hash=sha256:bd16aabe4a02a297c23417aa17ac6299dbd8c49f673bcd645b4929b11f5a4400 \ + --hash=sha256:c0afc6800ba57ccc350374c5bd6150419915d95ce93cdbab2d783d75eaf30ecb \ + --hash=sha256:c6708715abcf3c73b99508253e961a9967f02fe536532834149574eda6de0d1c \ + --hash=sha256:c7c9ab723cde841fefb34efbad91e87f00a674b1fe1cd0784fde742bf2c154dc \ + --hash=sha256:c8f3d67aeaf55f017982b73683f0e7342ba2f6635a78f69ce89ebb26aa411e5c \ + --hash=sha256:c9790464842f85f437dbbb54417eda1e0e6bfc52dd8d22d6fd1c994b73b2dc74 \ + --hash=sha256:ca403d7e4798f525fdfc78e258820419cbbd0f0ecbab9de7840e3c017cf6b8cf \ + --hash=sha256:d008d90a7f2471519aef0c90dfbe73b3e6e4d5e66ac48e19154c17e89e98b604 \ + --hash=sha256:d19fbd981a488e22cd04883659ca6b08f50b5974f9fd7c95655ef6a043e5893f \ + --hash=sha256:d1befeed746d247c81127bb14de9dc3d30edb6e5976d34f83f86ed262b1d9105 \ + --hash=sha256:d2374b62878abb00cd8309b32af6c0b715cd02dec0ca74ef12e5069bdc64144a \ + --hash=sha256:d376bbd28b3a8999db1a103b3b388aee6f1ddeb3e51bc2172993efdcd86e064d \ + --hash=sha256:d4a7319f304a774bed22115bc891618e45f85065ab44ea6acd07d274e750519a \ + --hash=sha256:d6734d2ef8a50fbf8445c139477da401f50d62a0606bf00e20ec6d87773fefb1 \ + --hash=sha256:d760fe2a4d7c3b226cb9026d6a842868d52a7901bd98420e1baf14e80da85cf5 \ + --hash=sha256:d913de495d90407cd859d263bee2e5d1a4ed3eb6573c04e70d9ec619a7cbed7f \ + --hash=sha256:db19d07e2e0129e974a0e65d0064fc222a446cd5122c2fd4184d2af9fc734a9e \ + --hash=sha256:dca9ab98072a5a54ebacebdc45f53e645336b320c667410b061be1ca588ae709 \ + --hash=sha256:ddc7dacc8ece3a182e7f15cb862d1fd616b46d076cb1ae9dd232b2c38b655874 \ + --hash=sha256:ddf19c062bea7a0cc80f519243d2c01dd091be0cf952a0750d4ad576709559f5 \ + --hash=sha256:def79fa35ef0cef8d2accec024f4fdc7ead3012ff02f5215c783f39f03ef8cfc \ + --hash=sha256:df29a0a7107f7011e77f4eebdddec4c7331e24d787a0b21a46d63bdf7445da95 \ + --hash=sha256:e09a3942ecbdee5cce73ea9d42da82b81b72ac1bf031ce069b93b5adf4eac8cd \ + --hash=sha256:e242bb1c5e76e97dfa9e7f209a71e93a01d7f19ffdd5cfbb2e2d55b4f08f8ab0 \ + --hash=sha256:e243bd13217235fc7290c621941c3f5cc8b66e4872495be821d7436ba2fb838d \ + --hash=sha256:e2af3aad578aa6bd1384bcf4750fc285e5a9de53f40b7d41e5a0bf748edeb2b3 \ + --hash=sha256:e4e81e09c1578b8df602e3db08b0b3ea0a6947ad612f52bf8dc5ea8d47691f0c \ + --hash=sha256:e54da4baf05720032d527874d40b65fa4d7e5c6c6a43d0c3adbeffcaf275a2b3 \ + --hash=sha256:e80e6c2f55656b4824d72065abb4ddd6a525c74bd78a0aab5d9fc2cf4fb5af50 \ + --hash=sha256:ed2a239c0ea213acc1908150a3037257083c7c083128f1a4cec2ec4b97dca491 \ + --hash=sha256:ed905975ab14056a2e5eb1c376cb2e1ebc5396baf84163939c518556fccde9f5 \ + --hash=sha256:ee21e28f0430bd6dc9086c6e525d5e818a44a5ad19720c8a0ef766792f3eb5e5 \ + --hash=sha256:ee43c17b173d46a3212baa6ead3ae258eeabdae48c263a01ccf0218c366dd655 \ + --hash=sha256:ef4fcbf3327382cd4c9f540babd61248208af7b93eec4de397b4d5f58a09e288 \ + --hash=sha256:eff0ac9dbe711a4aee69bf04a83896aa9b85f19641264053a9f6d48573abb7dd \ + --hash=sha256:f0aa869112ef88429ae17820d99c3dd9504c9e9c671d3c246f3d7442cb051084 \ + --hash=sha256:f3c96f633825733f735c5a9cf21d21a257d8e1edf0b1cee0a064b9c424ca0f7d \ + --hash=sha256:f5833ad231be5eb6553de524a70f48d71b2c8563101750531e0b80184e175cd4 \ + --hash=sha256:f5ec61164adcec446f8969a3358ec3f9b26bbda3b9213e5586d219afa8df2915 \ + --hash=sha256:f7d486c83842422badd511868fd8a9a20e9407ace71564b6af47ce7e60a336c1 \ + --hash=sha256:fb9e68df06293761f9fe66ade60a9bc6d0f5e42b8acf2939a9158af86ab0e5bd \ + --hash=sha256:fc14a032f813bf5fe624d991960ea83e9715adc27e4c1830a2361eb1d02ac341 \ + --hash=sha256:fcff63213e8e6e47770541a4607175404f47cbb3ebea7b6058cc82d524a0e424 \ + --hash=sha256:fd1fbe0f116b6e55da77aca2c6ddcddcfac2186cbf78bdebf40fc156efca389d \ + --hash=sha256:fe9753dfee015c570d73df76f899f18444d41388bffcde097deba51c4fadbb9f + # via requests +click==8.5.0 \ + --hash=sha256:255bc9599cf7748b4b1a446ccc735421bd08a2ae529a8b88597d3de5664ee360 \ + --hash=sha256:ba0d2089de75ea0310e2dde03160e6ca10009947fb95a182f9b54021bb272e34 + # via + # policyengine-taxsim (pyproject.toml) + # huggingface-hub +contourpy==1.3.2 \ + --hash=sha256:0475b1f6604896bc7c53bb070e355e9321e1bc0d381735421a2d2068ec56531f \ + --hash=sha256:106fab697af11456fcba3e352ad50effe493a90f893fca6c2ca5c033820cea92 \ + --hash=sha256:107ba8a6a7eec58bb475329e6d3b95deba9440667c4d62b9b6063942b61d7f16 \ + --hash=sha256:15ce6ab60957ca74cff444fe66d9045c1fd3e92c8936894ebd1f3eef2fff075f \ + --hash=sha256:1c48188778d4d2f3d48e4643fb15d8608b1d01e4b4d6b0548d9b336c28fc9b6f \ + --hash=sha256:3859783aefa2b8355697f16642695a5b9792e7a46ab86da1118a4a23a51a33d7 \ + --hash=sha256:3d80b2c0300583228ac98d0a927a1ba6a2ba6b8a742463c564f1d419ee5b211e \ + --hash=sha256:3f9e896f447c5c8618f1edb2bafa9a4030f22a575ec418ad70611450720b5b08 \ + --hash=sha256:434f0adf84911c924519d2b08fc10491dd282b20bdd3fa8f60fd816ea0b48841 \ + --hash=sha256:49b65a95d642d4efa8f64ba12558fcb83407e58a2dfba9d796d77b63ccfcaff5 \ + --hash=sha256:4caf2bcd2969402bf77edc4cb6034c7dd7c0803213b3523f111eb7460a51b8d2 \ + --hash=sha256:532fd26e715560721bb0d5fc7610fce279b3699b018600ab999d1be895b09415 \ + --hash=sha256:5ebac872ba09cb8f2131c46b8739a7ff71de28a24c869bcad554477eb089a878 \ + --hash=sha256:5f5964cdad279256c084b69c3f412b7801e15356b16efa9d78aa974041903da0 \ + --hash=sha256:65a887a6e8c4cd0897507d814b14c54a8c2e2aa4ac9f7686292f9769fcf9a6ab \ + --hash=sha256:6a37a2fb93d4df3fc4c0e363ea4d16f83195fc09c891bc8ce072b9d084853445 \ + --hash=sha256:70771a461aaeb335df14deb6c97439973d253ae70660ca085eec25241137ef43 \ + --hash=sha256:71e2bd4a1c4188f5c2b8d274da78faab884b59df20df63c34f74aa1813c4427c \ + --hash=sha256:745b57db7758f3ffc05a10254edd3182a2a83402a89c00957a8e8a22f5582823 \ + --hash=sha256:78e9253c3de756b3f6a5174d024c4835acd59eb3f8e2ca13e775dbffe1558f69 \ + --hash=sha256:82199cb78276249796419fe36b7386bd8d2cc3f28b3bc19fe2454fe2e26c4c15 \ + --hash=sha256:8b7fc0cd78ba2f4695fd0a6ad81a19e7e3ab825c31b577f384aa9d7817dc3bef \ + --hash=sha256:8c5acb8dddb0752bf252e01a3035b21443158910ac16a3b0d20e7fed7d534ce5 \ + --hash=sha256:8c942a01d9163e2e5cfb05cb66110121b8d07ad438a17f9e766317bcb62abf73 \ + --hash=sha256:8d2e74acbcba3bfdb6d9d8384cdc4f9260cae86ed9beee8bd5f54fee49a430b9 \ + --hash=sha256:90df94c89a91b7362e1142cbee7568f86514412ab8a2c0d0fca72d7e91b62912 \ + --hash=sha256:970e9173dbd7eba9b4e01aab19215a48ee5dd3f43cef736eebde064a171f89a5 \ + --hash=sha256:977e98a0e0480d3fe292246417239d2d45435904afd6d7332d8455981c408b85 \ + --hash=sha256:9be002b31c558d1ddf1b9b415b162c603405414bacd6932d031c5b5a8b757f0d \ + --hash=sha256:ad687a04bc802cbe8b9c399c07162a3c35e227e2daccf1668eb1f278cb698631 \ + --hash=sha256:b4f54d6a2defe9f257327b0f243612dd051cc43825587520b1bf74a31e2f6ef2 \ + --hash=sha256:b6945942715a034c671b7fc54f9588126b0b8bf23db2696e3ca8328f3ff0ab54 \ + --hash=sha256:b7cd50c38f500bbcc9b6a46643a40e0913673f869315d8e70de0438817cb7773 \ + --hash=sha256:ba38e3f9f330af820c4b27ceb4b9c7feee5fe0493ea53a8720f4792667465934 \ + --hash=sha256:c440093bbc8fc21c637c03bafcbef95ccd963bc6e0514ad887932c18ca2a759a \ + --hash=sha256:c49f73e61f1f774650a55d221803b101d966ca0c5a2d6d5e4320ec3997489441 \ + --hash=sha256:c66c4906cdbc50e9cba65978823e6e00b45682eb09adbb78c9775b74eb222422 \ + --hash=sha256:c6c4639a9c22230276b7bffb6a850dfc8258a2521305e1faefe804d006b2e532 \ + --hash=sha256:c85bb486e9be652314bb5b9e2e3b0d1b2e643d5eec4992c0fbe8ac71775da739 \ + --hash=sha256:cc829960f34ba36aad4302e78eabf3ef16a3a100863f0d4eeddf30e8a485a03b \ + --hash=sha256:cdd22595308f53ef2f891040ab2b93d79192513ffccbd7fe19be7aa773a5e09f \ + --hash=sha256:d0e589ae0d55204991450bb5c23f571c64fe43adaa53f93fc902a84c96f52fe1 \ + --hash=sha256:d14f12932a8d620e307f715857107b1d1845cc44fdb5da2bc8e850f5ceba9f87 \ + --hash=sha256:d32530b534e986374fc19eaa77fcb87e8a99e5431499949b828312bdcd20ac52 \ + --hash=sha256:d6658ccc7251a4433eebd89ed2672c2ed96fba367fd25ca9512aa92a4b46c4f1 \ + --hash=sha256:d91a3ccc7fea94ca0acab82ceb77f396d50a1f67412efe4c526f5d20264e6ecd \ + --hash=sha256:dc41ba0714aa2968d1f8674ec97504a8f7e334f48eeacebcaa6256213acb0989 \ + --hash=sha256:de39db2604ae755316cb5967728f4bea92685884b1e767b7c24e983ef5f771cb \ + --hash=sha256:de425af81b6cea33101ae95ece1f696af39446db9682a0b56daaa48cfc29f38f \ + --hash=sha256:ded1706ed0c1049224531b81128efbd5084598f18d8a2d9efae833edbd2b40ad \ + --hash=sha256:e1578f7eafce927b168752ed7e22646dad6cd9bca673c60bff55889fa236ebf9 \ + --hash=sha256:e259bced5549ac64410162adc973c5e2fb77f04df4a439d00b478e57a0e65512 \ + --hash=sha256:e298e7e70cf4eb179cc1077be1c725b5fd131ebc81181bf0c03525c8abc297fd \ + --hash=sha256:eab0f6db315fa4d70f1d8ab514e527f0366ec021ff853d7ed6a2d33605cf4b83 \ + --hash=sha256:f26b383144cf2d2c29f01a1e8170f50dacf0eac02d64139dcd709a8ac4eb3cfe \ + --hash=sha256:f939a054192ddc596e031e50bb13b657ce318cf13d264f095ce9db7dc6ae81c0 \ + --hash=sha256:fd93cc7f3139b6dd7aab2f26a90dde0aa9fc264dbf70f6740d498a70b860b82c + # via matplotlib +cycler==0.12.1 \ + --hash=sha256:85cef7cff222d8644161529808465972e51340599459b8ac3ccbac5a854e0d30 \ + --hash=sha256:88bb128f02ba341da8ef447245a9e138fae777f6a23943da4540077d3601eb1c + # via matplotlib +decorator==5.3.1 \ + --hash=sha256:4cbcdd55a6efadb9dbea26b858f4fb3264567b52d69ca0d25b721b553f60ea82 \ + --hash=sha256:f47fe6fdbd2edd623ecfe36875d37aba411624e2670dd395dddae1358689bb3c + # via ipython +dpath==2.2.0 \ + --hash=sha256:34f7e630dc55ea3f219e555726f5da4b4b25f2200319c8e6902c394258dd6a3e \ + --hash=sha256:b330a375ded0a0d2ed404440f6c6a715deae5313af40bbb01c8a41d891900576 + # via policyengine-core +et-xmlfile==2.0.0 \ + --hash=sha256:7a91720bc756843502c3b7504c77b8fe44217c85c537d85037f0f536151b2caa \ + --hash=sha256:dab3f4764309081ce75662649be815c4c9081e88f0837825f90fd28317d4da54 + # via openpyxl +exceptiongroup==1.3.1 \ + --hash=sha256:8b412432c6055b0b7d14c310000ae93352ed6754f70fa8f7c34141f91c4e3219 \ + --hash=sha256:a7a39a3bd276781e98394987d3a5701d0c4edffb633bb7a5144577f82c773598 + # via + # anyio + # ipython + # pytest +executing==2.2.1 \ + --hash=sha256:3632cc370565f6648cc328b32435bd120a1e4ebb20c77e3fdde9a13cd1e533c4 \ + --hash=sha256:760643d3452b4d777d295bb167ccc74c64a81df23fb5e08eff250c425a4b2017 + # via stack-data +filelock==4.0.12 \ + --hash=sha256:5f17ee83ecee8a6f3e389c75822fb70a1c2f0506b99438a6dffa1d56793588c8 \ + --hash=sha256:cf42711a7ac791818b299fab0332a088c65aeeefa36290de98db92c434303b0c + # via huggingface-hub +fonttools==4.65.0 \ + --hash=sha256:04f73dd01005752a6e75cf4a8dc6b70dc724d1d4bc34cc89522153f4a2f07680 \ + --hash=sha256:05595385ae99f4b9626cebb973bf171b8fe38a8f40708e6e42abba0ed7537778 \ + --hash=sha256:06273c71e692caf5989c0437ca50875a5e49e216ddf653228fe9bb35bdc82c0f \ + --hash=sha256:09c34bdeed8915bfb53bee0c8ed2254dbd8ec69c0014b7f3702f347c049bf358 \ + --hash=sha256:0aa8901db22875c831d6a91796549590d7e747da37438f38b69d771b668be445 \ + --hash=sha256:0d2a9892fdb3b7e2d0f4174e3b907d226ff83698249762eeefce08ec5b2de1dd \ + --hash=sha256:22cb846d35d278235ef3b7e947c6040b2057d72e8305a314f21d5342eca49040 \ + --hash=sha256:2e4a380ca40d3a5372e31b340f0da0d53b4583aadbb8e41f6a516afa69c509a4 \ + --hash=sha256:3060b8c1fc2329fa20265b7c138614143ea7c1624e26c5c180c76aeb74deae6f \ + --hash=sha256:36fca8efc46b5adfca327c666e739fc05b7a7a6ef17840230f81b22f53230f61 \ + --hash=sha256:3b5d9ba89edf778b376e669b879ae33a198bf45cf5a23c3f6514f935cf9d0d9d \ + --hash=sha256:41f684ee6212e411196ab054f8308faf6605f154950e6f4686fb8f2103d624b0 \ + --hash=sha256:4a5db8442453da4b6f43ad325879381b726bf2238a2253efd9584be21a2cefc2 \ + --hash=sha256:52ea9d2a8385075770db74d5e5718fa80b2222bb4fc62856a377dd2865ca8848 \ + --hash=sha256:580eb68ff7bd6954a7a76afddd864bfc66eaaf5f5c20dd6ead9186d0055a4ffe \ + --hash=sha256:5a977e3645dbffaee924209828aa702a215f7ff68bc08010740c10c723787e62 \ + --hash=sha256:5c1700a60e4ff23a0425d5a64abf43d092e6b55071354825781faf255904dcb4 \ + --hash=sha256:6031e77b3fb8c765055ba2b8bd8dcb17030f3bf2484c448b472fdedf4460ba80 \ + --hash=sha256:6275863dad195ee34b6e0ca3fc61c74096bc37e5d6fb8e049f4d68d65865a2b7 \ + --hash=sha256:62c5e42c79449def957adf8a9a65a43018efa7e2a6bc6baa3afe955e0d5fb2ab \ + --hash=sha256:64c9b26816415b5e3d899e9077109d327b22140fe3c4066644d8cdbad5bb1569 \ + --hash=sha256:661bd91c4be13721408b2d4b67a9b3fa7736713adc9a6c9780c9c60fc7959f90 \ + --hash=sha256:673e2b3ac4ac8e4f3607d390ecc5a606e5db5c4e88fb4cb2999593efb65afea2 \ + --hash=sha256:6813cc1e2e883bd6c15b3e04f72c78dc65fdc4ca861063adf5f341fbaec2ca62 \ + --hash=sha256:6d815734e7fede0ad1f233f23f0f191cbe8fc64762ff041e589bc0f78e0b2397 \ + --hash=sha256:6dd6243f60e2d6160c2966e1e14020dc261ffd741b69a2e4ca8bfd051592e4b7 \ + --hash=sha256:71e4c67b6196a2f447f46476fd2302604721617f5e0a21b0988bdd87b6bb9687 \ + --hash=sha256:762ba5431358d0dbd4a01982484a1d494fb267e91f974cdcf20b80eab8560f6f \ + --hash=sha256:7830e9fa3bebc44dbc27ff44d8201def30ea5c48a773696d58e69e6bcd9cd5d4 \ + --hash=sha256:7a03cff943b204a90bf3d1c04c97b9509a8aa0ee99e2e544084ca43ad995975b \ + --hash=sha256:7a18b2ffd44249fe84289253197aa65ad4f2de554c0d381f18b1f5939bc6bc60 \ + --hash=sha256:7aa0518b45ff5286ad56f063938db3add3816e899aab58d782b3f9a252523caa \ + --hash=sha256:830f91327ca83bfc1278e7060068a498938f84d05dc4869675486f84f55d4fe1 \ + --hash=sha256:834962fd7cf21c58e81ac50a59e6ed2306f9df5e3dd481dad1cd7d2c4c60b773 \ + --hash=sha256:8aa1291e4c767abf1b0b79ca2d6895f7c0b661d9d95d03b5791c883a9d1e1f08 \ + --hash=sha256:8ae1846b0f192fd485d26a455af19b8f5cf05aff08f9836f533913d8fcea133c \ + --hash=sha256:8b7bb52817a24731d2e4f4df0e71fdde05e6c806c8f8f1517b015d142fdacfa5 \ + --hash=sha256:8e44a34d91b3c793879767eb115867ced74d2eb94974e64e72fe9e2eea71cf1a \ + --hash=sha256:924d06e6130429168318db71c40174a765ad016fc4b56ca811287e3d7373b3a6 \ + --hash=sha256:93a73af2075036d36d7fbf856779c56a1b3b86ffcdae6abede7596604c42c156 \ + --hash=sha256:9db2cb95847c18eef74a4ef0fe257a893ae3f4b0395f4866e2f426ab07f3d804 \ + --hash=sha256:9f201796c8e24e657be77c16fa664e798a46122144217f90838982937a964f0a \ + --hash=sha256:a3991732c87b3f054a2a8cf86dd0d602833fa8cb37c911503173771646e1013d \ + --hash=sha256:a6c8d184e523580a7c55d21cde37176a3c91cb539cf06c2aa36ffc634fd75296 \ + --hash=sha256:aa50dd7b9baf75e2bbd43401fc0d237f7a94a8ad2e0c57ea97160fc631af5eb0 \ + --hash=sha256:aecc899fdbf9ecbf728f8977977e2e1043ee4d70c257124c8fa4cbcf796fcd83 \ + --hash=sha256:aff640a4fcb021fa83f9879d5bfa115b6931522dae991a24faa75888bd6aeff6 \ + --hash=sha256:b11d8a4a0c3ca74bbd4c105b7ef82501945c939e6096d9934ec7d288cdf5aaa9 \ + --hash=sha256:b30e953de049bf43fc0a63c7d0c44d205c923e4bbf24716aae1518c0e65f977c \ + --hash=sha256:bbd9faf777a9deb6790df4f2b0be611857c45fe86605e840d7154a028d828af7 \ + --hash=sha256:be9b9a95ed0af03375e99020e921c4bc6b41fad10e053dea7acad370521a3c46 \ + --hash=sha256:c130be2232e3caf8d2b476854ea78421ec1642917ff5ab695284bac31bbb072b \ + --hash=sha256:c779d838815b91889c95ed64c9be5950ad5a683279f91aeb23384cb757ddc6a3 \ + --hash=sha256:ca2b02d74e9ad7e21a1d11e4701425800a4b0c63cf90486e60258262feccbcbf \ + --hash=sha256:d0d25027ade65ec46b13c0436e51bcb7c5171a4ea255a5e7a8d0d1d3ab4cffd7 \ + --hash=sha256:d8ffd2f62b402180b0edae8f86a071f583970e2177143117db5cf4c52da60079 \ + --hash=sha256:d9484b7ee1b49b6b8a0231c849f3983723dec29e3a7366d9b1b02f4036f71944 \ + --hash=sha256:d95b34dd68fbfc0e4a1740c421597656117f979ed8dc85de66e08f9f9981806e \ + --hash=sha256:dc87a9f846bec83c3795804f62b4632716d46e3522869a3dd9cd44a5d245b006 \ + --hash=sha256:e2c21772fcf70325189707b19f346812690bb1b0bd7e207e6ac205244806b303 \ + --hash=sha256:e3944e0bdba42effb71959e43d91b599326b02b59c78310d5675e8a75525e7d8 \ + --hash=sha256:e5ceccaf2e57d83b753a2b5db5d94aa0a8071886d4afebd2d520c9683e6bef0e \ + --hash=sha256:e844a45c9e5ced6536f184cf1a65b5d65e8f7e711993b413e10500a8223622e5 \ + --hash=sha256:fb53892b570f7f1f0055e75fc4de32673e32f749c4c8a606b63d5c436650e634 \ + --hash=sha256:fcf39949f56911348514b466714efa9118bec3d2be249e1c487263f7cda6edab \ + --hash=sha256:ffc918702661f1d74d2fbb2f5551036b64f6d2d743139e105289b694bcd16f54 + # via matplotlib +fsspec==2026.9.0 \ + --hash=sha256:0f08147951c8cb31d844c3547d631053b127863b60be04cf06e121333ee0e2fe \ + --hash=sha256:8dd6e646e99ea382bd85f97a45e6b526a442d79423a7dc673f1e2756d05fcb5f + # via huggingface-hub +h11==0.16.0 \ + --hash=sha256:4e35b956cf45792e4caa5885e69fba00bdbc6ffafbfa020300e549b208ee5ff1 \ + --hash=sha256:63cf8bbe7522de3bf65932fda1d9c2772064ffb3dae62d55932da54b31cb6c86 + # via httpcore2 +h5py==3.16.0 \ + --hash=sha256:099f2525c9dcf28de366970a5fb34879aab20491589fa89ce2863a84218bb524 \ + --hash=sha256:0f456f556e4e2cebeebd9d66adf8dc321770a42593494a0b6f0af54a7567b242 \ + --hash=sha256:15922e485844f77c0b9d275396d435db3baa58292a9c2176a386e072e0cf2491 \ + --hash=sha256:1677ad48b703f44efc9ea0c3ab284527f81bc4f318386aaaebc5fede6bbae56f \ + --hash=sha256:171038f23bccddfc23f344cadabdfc9917ff554db6a0d417180d2747fe4c75a7 \ + --hash=sha256:17d1f1630f92ad74494a9a7392ab25982ce2b469fc62da6074c0ce48366a2999 \ + --hash=sha256:1897a771a7f40d05c262fc8f37376ec37873218544b70216872876c627640f63 \ + --hash=sha256:18f2bbcd545e6991412253b98727374c356d67caa920e68dc79eab36bf5fedad \ + --hash=sha256:2b2c02b0a160faed5fb33f1ba8a264a37ee240b22e049ecc827345d0d9043074 \ + --hash=sha256:314b6054fe0b1051c2b0cb2df5cbdab15622fb05e80f202e3b6a5eee0d6fe365 \ + --hash=sha256:346df559a0f7dcb31cf8e44805319e2ab24b8957c45e7708ce503b2ec79ba725 \ + --hash=sha256:370a845f432c2c9619db8eed334d1e610c6015796122b0e57aa46312c22617d9 \ + --hash=sha256:39c2838fb1e8d97bcf1755e60ad1f3dd76a7b2a475928dc321672752678b96db \ + --hash=sha256:3e6cb3387c756de6a9492d601553dffea3fe11b5f22b443aac708c69f3f55e16 \ + --hash=sha256:3fae9197390c325e62e0a1aa977f2f62d994aa87aab182abbea85479b791197c \ + --hash=sha256:42108e93326c50c2810025aade9eac9d6827524cdccc7d4b75a546e5ab308edb \ + --hash=sha256:42b012933a83e1a558c673176676a10ce2fd3759976a0fedee1e672d1e04fc9d \ + --hash=sha256:43259303989ac8adacc9986695b31e35dba6fd1e297ff9c6a04b7da5542139cc \ + --hash=sha256:4c6ab014ab704b4feaa719ae783b86522ed0bf1f82184704ed3c9e4e3228796e \ + --hash=sha256:656f00e4d903199a1d58df06b711cf3ca632b874b4207b7dbec86185b5c8c7d4 \ + --hash=sha256:698dd69291272642ffda44a0ecd6cd3bda5faf9621452d255f57ce91487b9794 \ + --hash=sha256:719439d14b83f74eeb080e9650a6c7aa6d0d9ea0ca7f804347b05fac6fbf18af \ + --hash=sha256:7c4dd4cf5f0a4e36083f73172f6cfc25a5710789269547f132a20975bfe2434c \ + --hash=sha256:7e420b539fb6023a259a1b14d4c9f6df8cf50d7268f48e161169987a57b737ff \ + --hash=sha256:8389e13a1fd745ad2856873e8187fd10268b2d9677877bb667b41aebd771d8b7 \ + --hash=sha256:85b9c49dd58dc44cf70af944784e2c2038b6f799665d0dcbbc812a26e0faa859 \ + --hash=sha256:86385ea895508220b8a7e45efa428aeafaa586bd737c7af9ee04661d8d84a10d \ + --hash=sha256:8975273c2c5921c25700193b408e28d6bdd0111c37468b2d4e25dcec4cd1d84d \ + --hash=sha256:8c1eff849cdd53cbc73c214c30ebdb6f1bb8b64790b4b4fc36acdb5e43570210 \ + --hash=sha256:9300ad32dea9dfc5171f94d5f6948e159ed93e4701280b0f508773b3f582f402 \ + --hash=sha256:96b422019a1c8975c2d5dadcf61d4ba6f01c31f92bbde6e4649607885fe502d6 \ + --hash=sha256:9c9d307c0ef862d1cd5714f72ecfafe0a5d7529c44845afa8de9f46e5ba8bd65 \ + --hash=sha256:a0dbaad796840ccaa67a4c144a0d0c8080073c34c76d5a6941d6818678ef2738 \ + --hash=sha256:a6fbc5367d4046801f9b7db9191b31895f22f1c6df1f9987d667854cac493538 \ + --hash=sha256:bdef06507725b455fccba9c16529121a5e1fbf56aa375f7d9713d9e8ff42454d \ + --hash=sha256:c3f0a0e136f2e95dd0b67146abb6668af4f1a69c81ef8651a2d316e8e01de447 \ + --hash=sha256:c5313566f4643121a78503a473f0fb1e6dcc541d5115c44f05e037609c565c4d \ + --hash=sha256:df02dd29bd247f98674634dfe41f89fd7c16ba3d7de8695ec958f58404a4e618 \ + --hash=sha256:dfc21898ff025f1e8e67e194965a95a8d4754f452f83454538f98f8a3fcb207e \ + --hash=sha256:e06f864bedb2c8e7c1358e6c73af48519e317457c444d6f3d332bb4e8fa6d7d9 \ + --hash=sha256:e2c04d129f180019e216ee5f9c40b78a418634091c8782e1f723a6ca3658b965 \ + --hash=sha256:e4360f15875a532bc7b98196c7592ed4fc92672a57c0a621355961cafb17a6dd \ + --hash=sha256:ec86d4fffd87a0f4cb3d5796ceb5a50123a2a6d99b43e616e5504e66a953eca3 \ + --hash=sha256:fa48993a0b799737ba7fd21e2350fa0a60701e58180fae9f2de834bc39a147ab \ + --hash=sha256:faca8fb4e4319c09d83337adc80b2ca7d5c5a343c2d6f1b6388f32cfecca13c1 \ + --hash=sha256:fb1720028d99040792bb2fb31facb8da44a6f29df7697e0b84f0d79aff2e9bd3 \ + --hash=sha256:ff24039e2573297787c3063df64b60aab0591980ac898329a08b0320e0cf2527 \ + --hash=sha256:ffbab2fedd6581f6aa31cf1639ca2cb86e02779de525667892ebf4cc9fd26434 + # via policyengine-core +hf-xet==1.7.0 \ + --hash=sha256:0a9e802f33bf50c851abe45fc5380e61f959e2d369647d6742b79ad9d6c27cab \ + --hash=sha256:19c0e64f14175ccb6a1aff69e0d2ab9ec5269a560e6687abaf2b3fa4f73de7cd \ + --hash=sha256:2814a6e999d13464c4d679b788cc5d784eb5a4edfc638a31f10e9a11ab531ef8 \ + --hash=sha256:2b7bb5727889b0f2436dbaaad8fc4c3e66b8240d992716989e0c086b4278b1bc \ + --hash=sha256:4ee5e05a627f5ab5bad7a86582277d645556ea1e199903aae19e033a392aa13a \ + --hash=sha256:57bc157b8b7fe3bee9dcb9af7f3da8de41801c3b31a9ef68a77a33c6a6be382f \ + --hash=sha256:59fba37039233c7fcbe196817d6cdcf1b40dfb17b410f229d85b0cf0a1848da4 \ + --hash=sha256:757168feb5679647c0bb13ee5d0faebe799c4dff9051419885a566ebd79f949d \ + --hash=sha256:80f79dae613ce9e0ea1fd1ae15616ca9ac74aed4c770aabc199c4f03ebecc863 \ + --hash=sha256:87dab080f8f7d32781c2586904e3603f4e60d09bfc727706c3ae419e0829beeb \ + --hash=sha256:acc3851cf2576a8fb2ae926da863f4efabe21303cf292e9a44332802ab0dcc6a \ + --hash=sha256:b01fe18dbbd151a2403d2c64ed30dc6547b00d6babab9a617d77c7acdb81ee66 \ + --hash=sha256:b91569d5f1b61c34b043687da02c05dd3604f3d329e7868510bf3f7971599006 \ + --hash=sha256:d406ec79053c0871817f700c2ac8c36ba0d87f9c34b7458b0f0063bb218b0466 \ + --hash=sha256:e3e88a7a75d7d95cbee1f37dc31341d6201124cf21c6c4b1dfab8ccba9b09e0f \ + --hash=sha256:fa029678be1ba7f953c409b0b27bf15cc69cd1c9b3a674fbd78856ebefca1052 \ + --hash=sha256:fcfd6c22418e57dd5b3aea649e813b2e2cfb2aebf317b210d90f1fe4b3018b52 + # via huggingface-hub +httpcore2==2.13.1 \ + --hash=sha256:e0aa977abe17e69a3b820a24542a6fa88702676d83880b8d194dcd18408e5103 \ + --hash=sha256:e1e05d4f25f7d7d496bfb96748f6f4b67657b03da069b3a68c36069f3db73d0a + # via httpx2 +httpx2==2.13.1 \ + --hash=sha256:6dff50fabc270ee5fd25d845d0b078ed20564579744d6d962850975996d2f9a4 \ + --hash=sha256:e48744a19e3af5ee48313d0ce5fe941d5422fae5705ea922a4aabf94d7800dfa + # via huggingface-hub +huggingface-hub==2.2.0 \ + --hash=sha256:1667f145dc56dc210d60966069397df9ecfca9607a5d43db88b308c89dae56b3 \ + --hash=sha256:5d1b47537394e4215cb858aa12fd493d0f7ef7f58990f5dcd24bc173107b2871 + # via policyengine-core +idna==3.20 \ + --hash=sha256:a7db850025b95ded1eae8a46181a1a6c56c92c96f0e2b005d9ff8dc0210cab44 \ + --hash=sha256:ab7ae7122974553370f0bdb919e1a960b2cd1bc1ef0276416d896db81c14582c + # via + # anyio + # httpx2 + # requests +iniconfig==2.3.1 \ + --hash=sha256:67f4b9c50da0dedf52af349e7749a80a9057a5031199791b906c3bb3ae878960 \ + --hash=sha256:9121e2c1fdb355232495be3194c8dfe87ccc2d5dee45947b78e68f499790d7a7 + # via pytest +ipython==8.39.0 \ + --hash=sha256:4110ae96012c379b8b6db898a07e186c40a2a1ef5d57a7fa83166047d9da7624 \ + --hash=sha256:bb3c51c4fa8148ab1dea07a79584d1c854e234ea44aa1283bcb37bc75054651f + # via + # policyengine-core + # pyvis +jedi==0.20.0 \ + --hash=sha256:7bdd9c2634f56713299976f4cbd59cb3fa92165cc5e05ea811fb253480728b67 \ + --hash=sha256:c3f4ccbd276696f4b19c54618d4fb18f9fc24b0aef02acf704b23f487daa1011 + # via ipython +jellyfish==1.2.1 \ + --hash=sha256:0028857c5381c9d55e21cc6cb0d7f9545c3a9a7bb7dbca3960fe0a898c691ac2 \ + --hash=sha256:01647c12261bc1f7b102e918e7665497176d87f6fc96271439c8855872bc2606 \ + --hash=sha256:0368596e176bf548b3be2979ff33e274fb6d5e13b2cebe85137b8b698b002a85 \ + --hash=sha256:05be396aebe3dce7a8cb2f97727ecdf99e86457c48e97190775dce33f8b7e39d \ + --hash=sha256:07b022412ebece96759006cb015d46b8218d7f896d8b327c6bbee784ddf38ed9 \ + --hash=sha256:0b21c1596ce283fd7ee954eb0eeb007d59e480364324bcd91ad55146e91f3936 \ + --hash=sha256:1098ce1f84ae3f147f0a18a6803ffb09b9c8cd5fedce42465643ca0b5c9d0224 \ + --hash=sha256:10da696747e2de0336180fd5ba77ef769a7c80f9743123545f7fc0251efbbcec \ + --hash=sha256:1354b558a0a16597b6032dd0af64bebd24994f7e7484cf14993320eb764b06cb \ + --hash=sha256:137cfcc26396d0f2e1265ac61f800bb921921ea722a43dd897e58190f767c474 \ + --hash=sha256:13f1ac9caba22af10bfe42f674822643c0266009f882e0fe652079706dc5d13a \ + --hash=sha256:14bbb30d988dec1d12183cf5d4621c908f98add2009c72a185e8c3e8d00b804f \ + --hash=sha256:15318c13070fe6d9caeb7e10f9cdf89ff47c9d20f05a9a2c0d3b5cb8062a7033 \ + --hash=sha256:1a3ccff843822e7f3ad6f91662488a3630724c8587976bce114f3c7238e8ffa1 \ + --hash=sha256:1ffeeb6c78c45fbb6d2a22b0173fb8a6af849001d6c26fab49c525136dbd9734 \ + --hash=sha256:212aaf177236192a735bbbf5938717aa8518d14a25b08b015e47e783e70be060 \ + --hash=sha256:21baa92d4a5112167721156f6d061c2ae105f2995b3a5e19cec6662928f0c439 \ + --hash=sha256:2348f698f9c1d72023afc8d39939045421a01da9b7e3078e3029227e35f28419 \ + --hash=sha256:29cfa8bfb72aacf2d611a3313b358ed4d4140fa3d3efcffea750c8e7f8acb1aa \ + --hash=sha256:2c28a4ae3e201e1c1b7bacacd40e2e76c4068b90c9ae3a0d525e0ac98206f1cc \ + --hash=sha256:32581c50b34a09889b2d96796170e53da313a1e7fde32be63c82e50e7e791e3c \ + --hash=sha256:32a85b752cb51463face13e2b1797cfa617cd7fb7073f15feaa4020a86a346ce \ + --hash=sha256:393f609fd6139ce782e747e22c399483ffc58341009e6a97e39ffe5f5b2c674c \ + --hash=sha256:4072e21ad4036af41bd57b447b1dda64fe60aa679cfa8854ba0a0338152439f1 \ + --hash=sha256:451ddf4094e108e33d3b86d7817a7e20a2c5e6812d08c34ee22f6a595f38dcca \ + --hash=sha256:4a21d7eda5e6996772055f798e3fe1de1b33b3edad7f6cf0567097a21585a812 \ + --hash=sha256:4b013876109d91fa6fc871ffa4e0dbfda11820c33dc4ad0e2967b3fc1187f804 \ + --hash=sha256:4b28fcefc0c3534277ff0306e6c10672fb050f4784b5f3be7037e80801569fb5 \ + --hash=sha256:4b3e3223aaad74e18aacc74775e01815e68af810258ceea6fa6a81b19f384312 \ + --hash=sha256:4c5acb213aa75a61bcfc176566e20f2503069667e760d83d403b59e115fef0dd \ + --hash=sha256:4e36d9000d4f7e1a35689a74ec7749d27a216dfa6c47cac2e5ad3de8a523bd69 \ + --hash=sha256:509355ebedec69a8bf0cc113a6bf9c01820d12fe2eea44f47dfa809faf2d5463 \ + --hash=sha256:5335f622458aa105289a8e358bc32ecd1b9634b6ffec3e77ea3577e49c297171 \ + --hash=sha256:536c80d8d4ec7f39cbb10b85d926ff96cef3cde4a83ca0991c07cd9835d5dc13 \ + --hash=sha256:56da7632e029912af25e25422fae3b6df318400297d552791f4b21da6d815ed6 \ + --hash=sha256:5bda2275f31a64adf3483e39f7a4e2107f7dfe3a3f85f0d2c0cb6ae5fbe4a443 \ + --hash=sha256:5fa0ba0946f3c274f6a87aaa3c631dc70a363bd46cceea828ce777e8db653b6f \ + --hash=sha256:63770120cc3386dcc13bcc4df508ab281a6b14c3b2c0e33586439a6c40ee122f \ + --hash=sha256:675ab43840488944899ca87f02d4813c1e32107e56afaba7489705a70214e8aa \ + --hash=sha256:68080af234256ef943f0add6fc79816b0c643d8df291c17a85c1b6e45bdfbb96 \ + --hash=sha256:68ea3ddd4dae1152a7f7155ef02a7bfad919611158d71b301f9aa167685819af \ + --hash=sha256:6a49ce2a580edd3b16b69421137deef464e2f8907f9ef906d49950b1a52908c1 \ + --hash=sha256:6c51e565f85ce38cf9388c4f916d53888b0fa34788fcebe3aff3db24948e0960 \ + --hash=sha256:6d2bac5982d7a08759ea487bfa00149e6aa8a3be7cd43c4ed1be1e3505425c69 \ + --hash=sha256:6e76b23431a667cd485fb562428d1ad29bae9fdd0fcdfb5a51cc8087bae0e88c \ + --hash=sha256:72d2fda61b23babe862018729be73c8b0dc12e3e6601f36f6e65d905e249f4db \ + --hash=sha256:748dc45a0394fbe9120b8b3b9a39fab0967c7e2d6ecdd5304af018e774f80f96 \ + --hash=sha256:7853d2ed7d6929c029312ec849410f1ea7ae76ce72ad1140fb73f6e8a1e6aa4f \ + --hash=sha256:80a49eb817eaa6591f43a31e5c93d79904de62537f029907ef88c050d781a638 \ + --hash=sha256:91cad49a4fb731b726afc5ae385a3217a7016ed88a04da40c131cff8136a5db5 \ + --hash=sha256:98a133b40dc00cfda6609e1b0cb0ab0b77796fc2719aae886a12009514f73499 \ + --hash=sha256:9913789a98ccf49213fbb1dabc597847a0ec33d3b0e151689498f4b38ba9be0f \ + --hash=sha256:9930e20f0e9f65ad1d57d98290c2be3abd75812d058815605f44a56056fb9a66 \ + --hash=sha256:9a73b5c6425a70ebd440579a677eb4f03b327b2f59090db34e6c937aeea5aabd \ + --hash=sha256:9c747ae5c0fb4bd519f6abbfe4bd704b2f1c63fd4dd3dbb8d8864478974e1571 \ + --hash=sha256:9d4448c874959ae012cda0f6d570ac0bd7f0fcf12007714eaebf86b86919b66f \ + --hash=sha256:a058f4c6a591d5e5a47569f5648a26303ba19c76a960fef7e0beba2aa959e52e \ + --hash=sha256:a0ef6f0ecc085c1f8fddb048f538c8bb89989e5d470eab45d4e9bd48ee73a40d \ + --hash=sha256:a3cab91020e3ff7565e55a611ec3e3257c093ac950d55778a48bfc8c57562b6e \ + --hash=sha256:ab1bfea271ce4bda09d975080d5465cf5a8b127e7c0ea61ea3f972417a7a2193 \ + --hash=sha256:b35d4b5b688f759ffd075190a9850b04671bad14c5b37124eb43e99306ec16ea \ + --hash=sha256:b37b76ea338c4a473c34a9b9e1e033a78aafb9040a8c0eea579fc5805d8e4b46 \ + --hash=sha256:b8986d9768daddd5e87abf513ae168ea0afe690a444d4c82d5b1b14b0d045820 \ + --hash=sha256:baa30c7b59bd1c5e105693108a6d7a98f3e7a1a59e23e15bc5897b91fd5849f5 \ + --hash=sha256:bcdcd603a7737cd3f5a2ab10ce9b49844329deb81c2daafcd8131e54fc730205 \ + --hash=sha256:bd186c041d9be86c4fa5e2490943ce5d7f05b472f45d7f49426f259f3dd20bc4 \ + --hash=sha256:bebccd0652ac1c7e438ae1f451edefde63d14b3af6f6daa30c599919dcb92886 \ + --hash=sha256:c3c18f13175a9c90f3abd8805720b0eb3e10eca1d5d4e0cf57722b2a62d62016 \ + --hash=sha256:c499ea3a134130797c50e367687a6a46a12653c59af381bee92c41a5ab0bd55d \ + --hash=sha256:c85aa2bc76a36d92a3197f406f86636664d5b323727dfec4fa2842a8a24a06ae \ + --hash=sha256:c888f624d03e55e501bc438906505c79fb307d8da37a6dda18dd1ac2e6d5ea9c \ + --hash=sha256:cf6cd68921f2bacc547ba1cf64ad0e76bc1727f3bab13bba2e5f5869aba038b1 \ + --hash=sha256:d2b56a1fd2c5126c4a3362ec4470291cdd3c7daa22f583da67e75e30dc425ce6 \ + --hash=sha256:d7be8021658b46b22500a77f1707901bd98fc210f185c229b81c74efd3c1baf2 \ + --hash=sha256:db97d873f23b0c15b4ed911ece10e5cc0bb96cdc53666d5c3788bd0af81807f1 \ + --hash=sha256:dd895cf63fac0a9f11b524fff810d9a6081dcf3c518b34172ac8684eb504dd43 \ + --hash=sha256:ddf05ea471da2808d77ecfa425d8884124b4754f4d483afa7703b6655530cf5c \ + --hash=sha256:e1b990fb15985571616f7f40a12d6fa062897b19fb5359b6dec3cd811d802c24 \ + --hash=sha256:e4a210a960f3917da757b0581750b6e0a8db9acef68dafbc1b6e2ae39e847ba8 \ + --hash=sha256:e5977810972c6f0b2e61252c4758fd5aee21abf663ff309881195a99d37daa94 \ + --hash=sha256:e967e67058b78189d2b20a9586c7720a05ec4a580d6a98c796cd5cd2b7b11303 \ + --hash=sha256:ecf62d4aad0baa8832ab60f96e7baedbe6558bd292597503d927e9c5bce745d8 \ + --hash=sha256:f121218dc33fb318c34ddd889dc7362606ce1316af2bb63b73cc1df81523ca34 \ + --hash=sha256:f69aeb08659a6c81d559bbe319075e3417434ae5b3a5e4a758d1c4055a03497a \ + --hash=sha256:fb3c6e537cb4605c22895a8d4a10cdb26611ba2bbfc7f0b4c1d06bb9d8aad648 + # via us +jinja2==3.1.6 \ + --hash=sha256:0137fb05990d35f1275a587e9aee6d56da821fc83491a0fb838183be43f66d6d \ + --hash=sha256:85ece4451f492d0c13c5dd7c13a64681a86afae63a5f347908daf103ce6d2f67 + # via pyvis +jsonpickle==4.1.3 \ + --hash=sha256:99822e77b593462c1f67361b0571e54323db43f1285706a63da5b5759714c9df \ + --hash=sha256:de234c1d1ed2c5313833e608e2a2467202f48ae24ea7a2afa2d238d8999aa4b5 + # via pyvis +kiwisolver==1.5.1 \ + --hash=sha256:007a5553dfc4f4e8d184f588a0200e2cd4b63a59cc8796df3c39909e679dc7a0 \ + --hash=sha256:0324cd2567259b7a095f6cf18a52b0ffc6f3de9e69528ff1bc0e7a37bd43ff1a \ + --hash=sha256:0627b9bceb9c3cdcf12b8a18655eedfed2692b038df27423383c120d0b7dc2d6 \ + --hash=sha256:06a6917674de9e0fe3f66f5430787f59a9f2ddb64af9b714eaec547e29ef5c19 \ + --hash=sha256:072bdb15a3c19a5b5dbc8f8fb1f4e1884bf4f3507eeb4cc6334401274d37a5c0 \ + --hash=sha256:0a4faea5c6db201c6a21391d2ac926ea97acf7dacdbc3c417189e1adb1a00837 \ + --hash=sha256:0ba9527afc80ae3d7814ed98b6572d02bf85eaf48065678342c5f0c6dab7a8c7 \ + --hash=sha256:0d8924877ce22e17326a99a418c3c82037da078df3c6a260b13eca677444e6e7 \ + --hash=sha256:0ebdef3eae5336568147c39a55be6a2036ffde53faa9ca2d978989ae7c2da12c \ + --hash=sha256:1209042a623ddfda5497e4066c7b77651dde8e1d3a9dd97599dc7e97f3b9b78c \ + --hash=sha256:16895f553ee6620a827d2da56b871f835fb70b9216cca5d188e885caf6e3bd23 \ + --hash=sha256:17851e5dad4484be0cbccbde3b15331deae036de9aebd45eed964487802b172f \ + --hash=sha256:1798e83840c3f627246104c4d8a9639c60fa068adf9ce92b61791781fa8a68c1 \ + --hash=sha256:18170a77ddfecf40ec60d0928268dc95880c881864e015a8f34094ed18b9b9ad \ + --hash=sha256:186884a58486651e3c217b6acea0a53eaa9498fdd472057c46f2f0fb5c25aad5 \ + --hash=sha256:18a0cfb124546a4c2e6087c5f3029c7f44b37c85b142e0ced71f73a7599ac208 \ + --hash=sha256:1983f0974a750a6f6556f368ba11105d1d8369c735b944747c9f12ae5aea7aae \ + --hash=sha256:1a7587dc335f2c0f5bd577fd0540bd16c66006bdb60f759a1059f025e6c4f071 \ + --hash=sha256:1acc7e5b7ef05e9da8bb70cd6c7c4513090213d2e1ad9720f599f0bf6c52aec5 \ + --hash=sha256:1d852545c4d0e35a72728d072cbaa59e2fa7dd84bdf01e068d670dd0ceb58eb6 \ + --hash=sha256:1ed0f5e49d0ceff8b72190824d9e59c062fbbc02c231b853112c78474b3f5ec2 \ + --hash=sha256:1fff05e239575b1481b6ed1a782f6fad616efbf1f0b1f44e6e85c4dfe426e483 \ + --hash=sha256:21e46b23a2da695c364124817bc01d970effd5483147f8d66a6a7167e3f6b851 \ + --hash=sha256:22d5e5aaad6be121f2515765e3b1c444352cb8eb4c86510801db8f2e50757316 \ + --hash=sha256:2551cf9917af48ee7c4b29cc82320489508cf96fd26a51f6fc124de661cd44c7 \ + --hash=sha256:255605693a483db7bd5c79f60437f7bf658f7f520d61aa42722e32257c941951 \ + --hash=sha256:26e8268480be5061d509e29669d59103c067a26377a56491630ece11762e3858 \ + --hash=sha256:27add358abe374ebaa3b8763ef380bc99051b5a4b18d94878366a9e4f59efef0 \ + --hash=sha256:2ae70bc59790d2af72a3f76f24b272403e135070340281108b447cb77ea70819 \ + --hash=sha256:2e10ae1bba1899188b33557c10d73affcc12033edd18adddb57d209039976a4c \ + --hash=sha256:3221f78211074f561c44ca42eac0619828171bec15a2c4cf6f7747d07df76e8e \ + --hash=sha256:34633ecf50d16187ab8e5528b7a2530f2feb4e23f300db4672538b51cfc5cd38 \ + --hash=sha256:34ec467940442c9943016fb2d4c81d1ba84351eeca2f1a78f8bc87f1ba0d414c \ + --hash=sha256:37f801b5d7cc0e5a548921308e059fd2b057bb42972b591cfa3049f95423c4ed \ + --hash=sha256:38f6e0deb4d0a4615efe0c4efc5990b06ae450ab50a0b321c0b078b6d238c083 \ + --hash=sha256:3c24cd69455e1b00ddf770c13b6e2c33e07d6dc3f2d34add0bf9277c5c6bbd46 \ + --hash=sha256:3cc210010fd2f438a3ed430b45f1b501fd13a8618bf984dc2c5ce5b69b78752e \ + --hash=sha256:3fa5855898f6d3d01b72ccd48a2d65cbdee301251603fefe34e2025bddba219c \ + --hash=sha256:416ba7ff9f233b7036689bb5a3783537e838ad483f63558d2a800f75afe738b1 \ + --hash=sha256:431dc224a1a92a5c8f582d96e505196a3b5997a7271076678da2dfde67b77e9a \ + --hash=sha256:43844c1a7ad6d723d5b5b4c4fc7f5bd399c40e288120d16257c7c9e8765c6e85 \ + --hash=sha256:44b8faef94f1857e77fa0238f3390ff1ac51d2ea20a487e2e452a59fd2b5f5ca \ + --hash=sha256:470d420f98d368d6f010633a20659b544c5fdfa5329e6b70219f2ef08fd4a7ef \ + --hash=sha256:482676e5bd48d70ac99d9fc78863469845421e01184fa83f1f9366dc49f7e974 \ + --hash=sha256:4d4ca09bf13cff792b1884f64b98ee6c2467930d632233be25c56b442d99f10e \ + --hash=sha256:5025e36fb4fb275cef0a4e30dbb11cb4ae61d1c83deb90189cb5d7e4cafd6b55 \ + --hash=sha256:509735237ae0d849e8a843551d423d2500d2e0a9ac1611a145658b29c0fb9f85 \ + --hash=sha256:534f02c1abb31ed6dbd3515545285c330b2f12d00fdb1fdb71658b9ca5a13a6a \ + --hash=sha256:5978c3340f16a35c30f8ab2fa7bcf559973c55f1a5ef6970e1f621acf3c4db13 \ + --hash=sha256:5b973887ff782cfd6b67c9904ad8ca542e0bc5e4961503408b423b5a688b4d38 \ + --hash=sha256:5c490db2168a508088f59140dd392556a54b8bd1048fc6383c8baff13c359673 \ + --hash=sha256:5d142e352eb13facc7dd047489aebdff6ba78576c239f1ea04931979caaf0567 \ + --hash=sha256:5daa1f19e097050b9c4d9a78fcc9263cb96c9dfae08037ddc1b7c4ad1889f2a2 \ + --hash=sha256:61e9a64c7635095a6bfe483e2ff055d437c59bd45f3617a228b37277f0185d62 \ + --hash=sha256:63fb7294b768f444eb4b068965f2662f28c2fd4161e23bd60fcf3ff27b74c046 \ + --hash=sha256:685929988b208a911f1285e2f8ed54210b0d681a3dc0f03e00d599d291986e7e \ + --hash=sha256:6a797a1cefc8b9c93170db580337e1fe3d011ad18b1299943231279406342048 \ + --hash=sha256:6b92f60017dda7d877fdc546438b5e28f31c523264f49cf5a48c1d0ce1a0dfbc \ + --hash=sha256:70ed9a45c7484d2b30cdacf60d220f494a1763b9fec1ad03285c6553fa0889f2 \ + --hash=sha256:719a35fa1156db3640555f95ebb94f60a444e64d1c69626b0edef5df78eba225 \ + --hash=sha256:74ad5c3dad54a4641b4c28cd15ded70899d04459c6c7aeacafea716be97cce6d \ + --hash=sha256:74ea337e0ec3f6f342a36a4f1b5cd94dd9affddcd28ba9aae2905af932ee8c6b \ + --hash=sha256:75d9b1cf8258462dbdc1eeda718c96ea7f079324c09067f6daabfcf37712b7fe \ + --hash=sha256:77a4c8187a5948d7f8795adb765a3c7b553d07d86d88e43038fc32fc1fb9a3f3 \ + --hash=sha256:7824b5e8bdbf0bccb4ccd37bbb115849a1dc45437fb4de8351385ed07c437ee0 \ + --hash=sha256:7d38b0c279c3032e8c9cc013b405c6df8e1668dbf15465779aa7f15f61201812 \ + --hash=sha256:7e9c01d3dd7ceba4d1d436cc021d40d592466e40b9bc7f5d83dc4e98a5c9cd8c \ + --hash=sha256:7fd82debf43c6acd0a94359d232f6bb516ee13f269a7993736a9ac9f988bb5d9 \ + --hash=sha256:824c3d763a05ea9e9003610145186b0e9848c7584a5575c79bac5a8e7cd80bad \ + --hash=sha256:828f75af2b0080c8a972e75f649ab46af008e92c6104a57a759157200b835b75 \ + --hash=sha256:83f78128fa28705fa85d01c59771c72fe81c11bd0e6155edbb9f818983a7d761 \ + --hash=sha256:876bbfd276473d3daffe30e8c975df4ed9429967b41a6cb362dbb5155b6f13ad \ + --hash=sha256:886fc26012f0e8b5f69d1cfe6d711f6b11f194621539bf8e6bb1c25c5dc82724 \ + --hash=sha256:8a34616dc2521cc8dc1d7d081734da63539f021ac0450ce950908340c6e7aa2f \ + --hash=sha256:8a708a47ade1fe19e8371d5da076bac0dd4b0a5a7985ad6c637f7f7e361b6baa \ + --hash=sha256:8af9b142ad719ae3a911ebf616bc4b78b32bbab84d6a40d3ad2f129670509957 \ + --hash=sha256:8bf4df63592c2a66b4f8edc5df2544998c288aa02f96ce0acd880cd1de8c8127 \ + --hash=sha256:8de6f2a4ce7e7bd27d23dd94abf0ccafe0e0e5cc9c764b0577191f2c25f08f26 \ + --hash=sha256:8f8fddb8e323bd6eee4e54e69a39243beab22689070f4c66b472c4cc88bb89d8 \ + --hash=sha256:8fca690b00c4c48f6c2a547b0160ed511357093a4e4c9b47e0fadf3128066d89 \ + --hash=sha256:9506e892bcc3b409831d363c6f53e5985e1c8d1f6f6b0256d00358684ff85378 \ + --hash=sha256:958254518717542d02d0688d0d20cbf771da5e415e6f49543f92481c850a4540 \ + --hash=sha256:95a02752aa032eef4aed01cda6d9b687c669bd0396bf4519eef8bba22a286720 \ + --hash=sha256:96c30002424670b5e1e46495c2b8cbffef39cf77c1d79e76462029d50339785b \ + --hash=sha256:98b208a7cc42c803445ef551d6753cc42a5ea13e9cab1ee66cd8b9cb70195330 \ + --hash=sha256:9b3092d8992a1d69b7a59c3e39f35e1b9be327a17f68a7c35fc17329e337d6f2 \ + --hash=sha256:9e51c119992ea8820706871c30a4642ec76de20ae82f9b50b9a45517d8e9f810 \ + --hash=sha256:a5716a33bfabb2c6ce27b6cf03253467b3804f83e215f4d202685cf93c6c9874 \ + --hash=sha256:a5a00665d1a0e26763a7338d7e911d4598fbc1d50dd0d6b7919b7dc6c5d6569f \ + --hash=sha256:a5ca5aebae78a0bc13c1943af4af615d4966c5b650b05d5aa83b50e427196fee \ + --hash=sha256:a7b85b2cc6ea45e5f7e8c9a30bc9fabd47cda09106cbb4b967335c3e6c43b69d \ + --hash=sha256:a83ee7107df13abe42a54a6654670eef9bb39425cf2e27f65e0007465e1286ab \ + --hash=sha256:aa7d00b1700966d2917e54d278aba86897890ca9276dd8b76cf6446b6c181b92 \ + --hash=sha256:ab620eb663952455271ac37f9aaad86b73c969c02f11f53cea405b38e96a4300 \ + --hash=sha256:ad8b9671348d7c8716715652ae11f85ed0eb99e265a2df2ca490577d69860b2c \ + --hash=sha256:aefe930d113798330e9462f7874542977869c0613cba3262e2de3a8d5dee8f3a \ + --hash=sha256:b03af77d77e50edba2030fd5f7c352ff209314b09030a3cba7c14edf9a09a444 \ + --hash=sha256:b390aec180a7c054919c04898835e1c77bced23ea8383eb2c570213bf25d1a86 \ + --hash=sha256:b3d78f7bb2b9d9a30345be1474b9aaa8685430b54afb51ba3639b5c6c11e9ed6 \ + --hash=sha256:b5664603a253efd3a75716d793d1d3a6a82723b61dc6db767b2460bbbeec4c0f \ + --hash=sha256:b69602970994a2ed8bbfa78c2f0394a7435226c6040489702d9f0a0ad0c07052 \ + --hash=sha256:b6ae6a0328f0bc035741820fdeecdcd67bf4694eee03972e843663107122f450 \ + --hash=sha256:bad20d4c69c851c982a1e3606f4c293edfd5a87885786c50082412240c4b1ffd \ + --hash=sha256:bb7c99f0673c03017a3ee01e54a5c2617a05468b11eabe513b0080e063ed95b1 \ + --hash=sha256:bebb89489b279b2f5661bbbb2abcc87bcd4a46607bb4a5c966f04f1db6b8df9a \ + --hash=sha256:bfd1de989b3330420e29de39352f5c049905c9e3ee67233a50d550e3d652c148 \ + --hash=sha256:c2306e8bb53601979fcb3fa09cc65e031876d9ae01eff2fcbcd7a84ef94d5bc1 \ + --hash=sha256:c3a4e41e3096bf1f0f1b76e2ffd6d828d6547f574f702d59bdbef7acfa59db9c \ + --hash=sha256:c6834b92dd2428e2dd85ef3d85f723d3c12f20aaf43a2ddd4f944ca25d833408 \ + --hash=sha256:c90d3022d8a94778939cda8638c6c8da8fa757b8958dad7ec868ce29c87681b8 \ + --hash=sha256:ca307d6c259e5c98d3cb9ade55342b47a6839762caf2536f3d7b46ee660cc82e \ + --hash=sha256:ca7f6fe0f37ca978a1e5eb7a3a68e6413f417e78e838324947ffd420202b198b \ + --hash=sha256:cb6fae641357ed2f6e533c0d3c6504a4a5703621a50c89459e46051d56b61140 \ + --hash=sha256:cdaeeb6c350106df6bf9d873395973e5f066a9713200b72cd64f55d0a3eafab6 \ + --hash=sha256:cea20da04494e662b83c872683bf4ff2345206043d036315ed0e924b652e7294 \ + --hash=sha256:cea90547bfd93807e0013a004dc76552be44fad3bc1cc2b38610a9e889ed098f \ + --hash=sha256:d09037ca068d784ebc4aec290ef952ca27ac15dd9c0b5801a88c6e1096b83e6b \ + --hash=sha256:d27c2123977cb9269c30a49ba45f03a4323017ef693e19db4ec9dbe1299a3002 \ + --hash=sha256:d50de98e8d807dc31822fff96f50293163a62418eb65487a21b42713d72ed0b7 \ + --hash=sha256:d66a64dd5dec136040ec2ae94aa026a912ee60fdd45bc28d3db30037fd809e88 \ + --hash=sha256:d79308fa689fac89cbcfbd4dbfc80b5f95c54c5a7fd4d194be221f9d33d026e6 \ + --hash=sha256:da3275833be0edbaf4830fae08bae3dc7219f40ce0c37eaa6c25825957e06612 \ + --hash=sha256:dc1a26b8e53395a01c2c611e58602fa47461f136fba7cd5542e6db6d64be1839 \ + --hash=sha256:dc23390afe9f4ef9ac3bcc72a03a56eebbde03f4c571a32cb38f859cff9a6524 \ + --hash=sha256:e05c2f7925f1d88778e53cb44f14e0223204a3bdd09a41664750363acfb1f2ef \ + --hash=sha256:e12dfea7f5fc2a34a9080efbf79c4c44eb380ec5b9c6fea09407e08f0d1e941d \ + --hash=sha256:e4e4523d6f336708d732516e6cfca7796cf3d96c9474eb5aecf6165f2f1fefc3 \ + --hash=sha256:e4e49f7e1a4e7191bdf9dc67a974db714501b1fc52c24324103d06a86abd5c08 \ + --hash=sha256:e68e151428b5384f766cd25739bf77c7e4a3dc93b5ded7a12118d9fbfdf78ab6 \ + --hash=sha256:e8e4d953faaded9ec7ede36824e9814082d22d4c7b1eafbfa079ecba8cd0d076 \ + --hash=sha256:ee9df1f0d77b9c6e94f4ac0fec533fbddd5ea3a327807f18d7b069ae019ded80 \ + --hash=sha256:f0a887b6565bbfe80efde2b7f6e8890d7d9bbdb11bdb17028a3690c32fe0621f \ + --hash=sha256:f0f4a42db92d6ec7677ab9d12830a2a8ec145a9c6d15db2b593466bc875c78d7 \ + --hash=sha256:f1303ef2eec81262a4b708c3e858afe58d7c75ad91c1c05266eda7673369859a \ + --hash=sha256:f1d56ec54d257d05e0b50f5780d967540cd07beeaf9e5f645b26d50cce79f4d8 \ + --hash=sha256:f4167e87b397f273dc2356fcf1eaf50a6bac51e6105f45103ef7129c8efb0255 \ + --hash=sha256:f76fc85bd054c806960f917ec0f329e24e436f1712267d90588e4c39890caa63 \ + --hash=sha256:f942903fde7363d1d879057ec5de01310efda2597161784d752fa9953a01a71a \ + --hash=sha256:f9b1c4900736e489a812c529100de4b8fb617d4db075e931e213c57424b83d9b \ + --hash=sha256:fc271a6f0a2126958f4090e5507b9da5848927dae331f8f763bd4aa642b3d2cd \ + --hash=sha256:febcce10f2bcdbb80b4ea919238a6a4ac13dbc4c7cadbe8d5d75c3682f8b5404 + # via matplotlib +markupsafe==3.0.4 \ + --hash=sha256:007e1ffd9bf65bb6ee96df7b258fc632a4868dd5566037986c64781f35a36e98 \ + --hash=sha256:02fa4acbc6a3fc5c693c34d4dd8c1130b7fe99cc915181b0ddd6f72aeb296002 \ + --hash=sha256:03470d1a8268e692ecf79ecd565593e59d44219377a7ead61f1f1b94c1f7ff6b \ + --hash=sha256:04e7902ba80ee4bac1d50a549606527a1dcf0476cd81403db41099d3b60ec653 \ + --hash=sha256:051417f74bcaaefa316276e0ff723f541616ca51043d070da00249d9bddd3e3c \ + --hash=sha256:05295589e619b9bed252a86b532b8e27350abc372d18ba89b59375325e91ec1e \ + --hash=sha256:06de8ef6331f6e822c28d577dc8bf43fe398800477c49498f38fc38b67ff33fc \ + --hash=sha256:0764a13d34cae40db7bbf3a09b7e9b491bf4603e20b263a7a9d6b8e324975d0a \ + --hash=sha256:077293e425f28ec737dbcad442a71752e28f8ae27cde3d68acd1fb212091cd92 \ + --hash=sha256:0930db9bdc62d22944e10b066448bb65dc9abe9112880c7cab8da54db4284d5f \ + --hash=sha256:0cee7cb0f9a1b6892ea482237d9403b3d1b4603aee057d0ff01f0fac2d019a97 \ + --hash=sha256:0d9c47709875fdb321452056622e930c52afbc07a7d780762fbb8b4d91ce6fa4 \ + --hash=sha256:11935df9bf455ed0c04eb87bcd720f02b1fe5e02128a9430f23aed6f93336fc7 \ + --hash=sha256:12a606a492de952afcb43b59a14aaaaad120e708d3663dd0fdf2d738d427a691 \ + --hash=sha256:14bd2d845d62ab678eaf81da89d7b621b51756c72346745c1a594c09d49207a2 \ + --hash=sha256:15ba9e28640feef770374b116a6f019c21f52404aeabe516aa7f800587b98cfc \ + --hash=sha256:18a801868a884f216e784d7d14db2a4077143ce7610440aee2ce8f734e7cfcde \ + --hash=sha256:1c0df495a977d10460a94941799c72d5b5ab03d3858d949b55b5a66c8f371c99 \ + --hash=sha256:1caa2fa5a6184fb233153b35f654e6687bd555476f6170f29d8ee9be1a8b0af9 \ + --hash=sha256:1e1451fab512d1bcc3dc26988ec1edb0b82c2db909132872cd9356070a6b63df \ + --hash=sha256:1f1f9477e174582b0a1b583d60b66e1f2cf5d3fe12cee985e4aedf44766600e5 \ + --hash=sha256:2628d3a8cb648ecebb3c5d6b0a1052d400e4d8b7ac0fb786be8d285b50040d17 \ + --hash=sha256:26e9867520db70d37f7fb421a7f0d8adb40171011fb84ce869afa1a83370dfa8 \ + --hash=sha256:2a6ef68ae94aed8721934072b27a3b654ea2100b97e4ab864cf1489c90926fbc \ + --hash=sha256:2b2b1e18af909b448bb3cf9e3433366f7a8726271fc214e8b10e0f62a78c724b \ + --hash=sha256:2cb3dd71fc6be918ad4264346a8ed69485f9b7ed7bf35495d8e22807cd6b8bea \ + --hash=sha256:2d1b7d9308288661f56672b1b157d75fc536714d3638487bbea17b6318a78248 \ + --hash=sha256:2dad610540cb2e6272855c178f08ae9a1c7ac258a7fb71660553a5f104b42741 \ + --hash=sha256:2e5a7cd7fdd14fcb1ae5d7d8bf23d24fbd1daefd1fbca2580132e1ea75f098b5 \ + --hash=sha256:2e9ad7dd851bf45fab9f75cbff4cb493fee9979e8d8c7c9c3ee119022518edd6 \ + --hash=sha256:340cbb1957ba99929cbf19a75626d36ba1ae21d1730b287d1cf7f824a20c4fc7 \ + --hash=sha256:34bdde374c5932765d7dc685c4a1d191a3207852d67e8e0a9eb6ea85156181f1 \ + --hash=sha256:353bd63081912ab8cfa6a0c7d185934cdf8426f04c618bba6bc4b394f2069b67 \ + --hash=sha256:387d8cd30e69b3f0a72877b9ae717033396404e19095b17fe89753a981fda44f \ + --hash=sha256:3882fb412298575bae3b9c46868251f15cc69307359f87bb1b382e53d6e5a2c9 \ + --hash=sha256:38fc55594dab834470b6733dead2ee9e3f657fb0608c769dcafa0ba5ab52f45c \ + --hash=sha256:396ec4e65cc889f69786b3b89478b471cee5a3bcf468b9d9bb03e1a30fb291fc \ + --hash=sha256:39dbacefc411633db5b4378b066a9aca70a3d7e2922c9e578d825f844026eeba \ + --hash=sha256:3a93d9616ddecfb393727a0041a562cf0b15a244e20f2bd25efc7949be4c4f17 \ + --hash=sha256:3d23795802fc8bd72534836d64489bbf0f67c088959091bdb22e10735a5107bf \ + --hash=sha256:434139499bb20b502ed3baa1f169e618f924a97e7a777fea1a49446d80106cf6 \ + --hash=sha256:436e3ffc6310d3c41878c601db29098102fe5d8a467c49da4a4125254e0980f2 \ + --hash=sha256:489505b03f692c3f376394e49194fa7a7f9e8558d6e293a7056a0032b0c38163 \ + --hash=sha256:4a540e2d3192792fc84eced57bef37851ccb2b41f73291bb17408eea77bcd278 \ + --hash=sha256:4a7cdc2a420ca01058182da4253329764d4bfa055564d1eced90e6ba1e8b1d3d \ + --hash=sha256:4bced6e2a6dba6a28f7dd3c6ce14df1b2dd495923f16ea484cad03decd463b2b \ + --hash=sha256:4cf3468d5ec187ffffcaca8e61929a37448f215dafc1386a12c750a72fe53634 \ + --hash=sha256:4e2c4809c14559aa7ef426f27fb35afbb38104c349a903bf8f3600456764bb38 \ + --hash=sha256:4ed644d75aa94a2baf7ec3a96eaa160ea58c742eb9d27c6506053c5c40fc84ed \ + --hash=sha256:4f6e0852a0283b1b1fd776eeb7b766a5f440b3e2bd31ab51af3b400585f3965c \ + --hash=sha256:5066b244f576f91afc8ee3ba029a89f99d39c79b1853fe9d39bea9f0afbec148 \ + --hash=sha256:5086f9975abb1ab531ee6afca1761e4b59a19b446f3f6522ed776963228cfe5a \ + --hash=sha256:50b5bedc9ed8a94fc8857a42ef4f84a81ea88f8d4f05dc8705fb23ee6d8dcca7 \ + --hash=sha256:52704c5d36eb6dda8866493decd61111fff86244c9b1ad225ca01b9e91e5970f \ + --hash=sha256:55ffd6ce583d97dc71dc92e930324c8c0d25aea7e3ade6ae54ef77cedb096811 \ + --hash=sha256:569d65055d367e3dcdf30c3f41119467b73d9ee9faf332bdf40402644f5ac08e \ + --hash=sha256:57f9947a7e57a081c1e3e0a2dd0d2dcf290a4531450e6f611e30084c222a7295 \ + --hash=sha256:5989cb26b2e1efc6a42216a9f6b5ee495ce5ace2e5b352a9af489976b32d1ee2 \ + --hash=sha256:5c22873ad1f0532ba40fa1727f3c0fc1bbbaab6d373d4cbe3f0dc74b2e2521c7 \ + --hash=sha256:5e8b3d0b18fd623afa12ecb2ce8d8becef69f9b5440c6330c7972200e0bb84b0 \ + --hash=sha256:61631e08084be9e21a8967ec3139c7616ed7c5e9368e05c86d1b39562c8a57b6 \ + --hash=sha256:64511c54db4e4987aef4c41923235927428729e8174c5dba488429be70a998ed \ + --hash=sha256:6669c1bf34080161ce49c589cc512ef24d4c704ac9d2b2d3667f519c60418378 \ + --hash=sha256:672d207103e6b16ca098611b0f9efad6bc00afd47c03d6ef62186495ca677dc0 \ + --hash=sha256:6768d67d1bce64270e0fdc2e69309d68b9b18ae56ddf6c711d168e9d051c2cac \ + --hash=sha256:6a45c3d514f2436064db00d7fc8778d888f0236ebfed649b53d13a59e69ad51b \ + --hash=sha256:6bd9e1788e15bfcf6a9082de42e30387e7b85d211ab21e57a939bb8cfaaf8d96 \ + --hash=sha256:6d2a9efe686f9de00d0d1ea32a4a5a86d558a2277501bd78d964214eab625e59 \ + --hash=sha256:6da83a088f8ef93b2d483a8232a4dbf4d69d3d8496b568a03c56becac43e1808 \ + --hash=sha256:7018d4af1cd272e847aa5917983ab5e83e4f6579f9dbfecd4a79c0ca80b144c2 \ + --hash=sha256:71f88e749ea29f67f21f3b36433c1dc54c7729ed2a6d9e2da2e0d9e0d7b224eb \ + --hash=sha256:737c9c3981998eba27f11786f84fddcbabc74068b72a4a1f454ea02094b57b65 \ + --hash=sha256:73e77980c7207854f00fc4e71fb1626868d5740ab4012623d55c7a99ad122a72 \ + --hash=sha256:799c39bdf5e2f1292fedd3009f7b3c9e760f10b2420cb9638d56920840ff6db8 \ + --hash=sha256:7a83aa6e4805df46fed18e989d3d16f86ef60cb50bbc8d9ce3a6be89165fbf6e \ + --hash=sha256:7d3391b2188d18737cb2fa147028b1096236eaa7e156446c650a489fa2cadc91 \ + --hash=sha256:7e1636da3d8dfc220b6dd10264db5f2b165e4888c4518594898fbe381049af8a \ + --hash=sha256:805c8b84534fa10891890f0e4be39f3a99e94615d93e8836bf9fa1fdca2feeb2 \ + --hash=sha256:811d02d5122171c1941357efd8f9bf4ffe907b7f0a1a4e729a880e4be3f46e3e \ + --hash=sha256:8138eb83940ec7299024d92d4dee45f601b9e6c5ffde9d25f4e35e326203c707 \ + --hash=sha256:83b3944fea42a8400edf92fd1770fb8d0d4f7de651353bd2d8525a92dba69a21 \ + --hash=sha256:849dd2bb0e5e4ab2b71c7191726a4a8d5aa8a610daa584728cbee0b710ddc4ef \ + --hash=sha256:8698d70a8081ee8c090dbb394768b5789a1da8b131b5499f89d071dd3cfaf6be \ + --hash=sha256:8781a792a070cf2bd1b86d3aa943894115faaba6e88122a7bf32d62072742453 \ + --hash=sha256:88d59b473bfb03259722600839af9bbd7fa13a2eb514beefeedb95997882f69a \ + --hash=sha256:8909c2f1c6dd65e054ac4b573a91c8384d1492281e55d82d159d653f7a13adf6 \ + --hash=sha256:8965520ac587c94a4ac48b729be3d8b8de00af39699b17585dfb599babe77977 \ + --hash=sha256:8b5d563170ff8ba3181caa967c99a3c804d1dedb702c7cb93a6a7c32247da978 \ + --hash=sha256:8e124f974786f831d6043728e38296969d3579db8896fe004682f5758e613581 \ + --hash=sha256:8f0fac8b13d14bb06c68195f849371924ae53dd7b1c00fed24650f704383b692 \ + --hash=sha256:9240187afb63d2f9ddc3e032c670356fe941f6e20662ea168a5dc3f1f317e1b3 \ + --hash=sha256:925f929d6b59a8b3f8b8c6ac363cd0af7eecc81efb3071770b3c6717c450a369 \ + --hash=sha256:9348cbb300d224fe3b89793262cb093504d4ae927004468463f745188a193e4a \ + --hash=sha256:9388003072b95f2f1e3fd908604194d653ba21330d811961a78b7da1a77e9e36 \ + --hash=sha256:9438a2648b2195980cb2dd8e53ed7b8df91319e2d0b70ae61a9e1d1bc8d3bec9 \ + --hash=sha256:94e4c421742086aeee4c32a506eec8859d7634aad943f7e6aacf70f813478768 \ + --hash=sha256:94f5407f7bc64fa6463906b896f9904beeeb7dd8dc116ee8e9056c8714ff9916 \ + --hash=sha256:971a3bbb75d97ae4e2e8f7d4834236f86f85f0c85e04ab2e191db1123b04f80b \ + --hash=sha256:9e227f3dbe6bde7491cf0a9965d00b88c6b1a4a95d11480ddf88bb96d397c19f \ + --hash=sha256:9e25feb9e330b63edb0278a0acdf85e50d0cb0fbf49c3084abbe4e24ae195346 \ + --hash=sha256:9f098115c247e11d138ab83a28fa0323c77015007ea2df73ba5fd714dfefd67c \ + --hash=sha256:a18f38cafc329bac5e3c2b96c765b4c96d3d103421ed22ab7988c1e3fce27464 \ + --hash=sha256:a4bbd2d87dd233b9fc5812160c3d0ffbe42edc22a26ce0469f58479ede633fe9 \ + --hash=sha256:a5fcffb37e602b0b3c1638a97746b9b96125caa9bcf6fa41d337a9261de231ee \ + --hash=sha256:a8e9f292fcda89b324f2f5c91d13f1424a153e40fc2756f38ee23b15835ff300 \ + --hash=sha256:a9f54054101545a9a9cccefddf54316aa6e4491611fcbef9e91b3b6bebec04f6 \ + --hash=sha256:aa2c838cc024642cc04c6854232f32b43e5e22833dd11119c1766c7873b8370d \ + --hash=sha256:ac0c7c9f1609b0c4c114feb1d7a3409564c7fb77e360bed9e97e5d25dfeaf868 \ + --hash=sha256:add96447a86d205ab616665d53b2950ee81083757f56e6ea833c8b2917646b46 \ + --hash=sha256:ae9dcb8fbe244cb82f8a6458b455b927a03685e383d9bacf1ea5ce180b96dc97 \ + --hash=sha256:b4a635a0487774f841cb1fb62e907e7195cc95bc761e053184b8acc3ceb20733 \ + --hash=sha256:b4d12837e0203bbace818ff4a7461afdcd78bcd782351cea148139180d7bcffe \ + --hash=sha256:b61687d0828e72bf5cda24a2690188f37170bd31c9359ac97e4e66569f120a16 \ + --hash=sha256:b807e598953730f82e4eae3bd30f6a122cf6b31c398c6b504c0e04c13c170429 \ + --hash=sha256:b8cd1f918b26fd7b1832ece557cc18f2d8747309ff8b3f0ef9d4250c5ad67a39 \ + --hash=sha256:b91cc9d336957239ff200f30097e6fea2dc6d6fb3c81e853eaa09eac904fd894 \ + --hash=sha256:bd3ce56ae2cbae3ba82b683bc425cd7e48d2ed8b10f3e818186b6f5646d9271c \ + --hash=sha256:be6cb0c799abb0e2ba3e618e6d28ddddf7e485f6c2ce938dfa237daf3905072c \ + --hash=sha256:befb4158af32106b9a93db8d6d1d1cbbd418c0d5aca0cabb7b1780abf0c89169 \ + --hash=sha256:bf053da3c97a4bc5ecfbb218cdd2983febd91c617be8367d139882aa11e490aa \ + --hash=sha256:c02e8f18bdedba082cef725942ac823b9b60656db07f7e265cb31618dfd00d77 \ + --hash=sha256:c1bc67752d5f21013cfe430df4062441714eab79f65a6a05e01505957e9c35fe \ + --hash=sha256:c61750fadcd119d0825bcb7d7d675dd264dcc89cc05292aab5be68ebdbb374ad \ + --hash=sha256:c90d5b3d4e944e065a301d741b3c1d784f6bd1f503aa68b4967e32b2ba313d85 \ + --hash=sha256:c9a7f43c0b202b334cc9184af09bb8f21d3a209e038efaf106936fb69e6b026e \ + --hash=sha256:cb96e6e088d6cf71c1ea977510948320234824cf226e32f6f6e044f7a9c82b34 \ + --hash=sha256:cf63c214fe879a65e69a386f915e36104fc84254ab141240f8854602d8e0be2a \ + --hash=sha256:d1aca03ede943eb80ab3d63bb082c84b7aab85ea83bd0fd0c200260945fb49d9 \ + --hash=sha256:d2e56fd3b00222722abfb3f5f0759ddbae4b90811b5ad4343c64030ad1bde70c \ + --hash=sha256:d5f93ebbeb8032d47e349328ec8662d973d9b05a70b3c35df1f91fe419b84749 \ + --hash=sha256:d882a373d8093c2941e01291b7ced96e9cbe4781da9a7751ca7e6c70385e5214 \ + --hash=sha256:d920abdfa61279ba1a2ef9484aab07bf03331f8c08a10120fa332353d06e6932 \ + --hash=sha256:da2af0d7aebfc2074080d72efa6ab8317c62481ef1f896f65d9999c1c01f4494 \ + --hash=sha256:dd8ea6ebee7aedbf7c749fa80521d9ccf1ba473e0d1e14805caafbaad281c889 \ + --hash=sha256:de8b364c423ef0a4bad9069657d617f9a5d2b2062457a89b1fa16ee199c399c1 \ + --hash=sha256:df1ae86ff54725a01fa1a0510b914ca53a161b7050be74f6204e24aded5971d0 \ + --hash=sha256:dff05cb7016dff1e9fd68f4122c127b65dfc59de5306cfb7ad92f956f230bee2 \ + --hash=sha256:e1a622f13970d81f95d0c72f9dc090dce9085fccfa4c9f2174377ee32bd15786 \ + --hash=sha256:e49fb0d1ce92cfa0cb198cc5b1b11cdf9d0638658e2a2db2687e39db7c87fc78 \ + --hash=sha256:e5c802729725bd07e2bc3ab7b76dc7e0bbfc53129d8f1eb1c002c24cf774717e \ + --hash=sha256:e841068dc0be4cb6dfb5c890eb88cbdcff2f4a332393c7ec94e8e618bd32c1a8 \ + --hash=sha256:e916035e3e9930cbdfdd10abf48861340221857f45509565898e012263f7b289 \ + --hash=sha256:eba154571c16e032112afac0dc2dfe9e63c2ceb7aedd07bb7eecf2ce26d4dd4c \ + --hash=sha256:f03460ff076f70ab595bb45a0205ccea1971443575b6920c52e755dec2b3fbfe \ + --hash=sha256:f0ec3b750b59375eab5b0fb2b9254810c00a3375be6d789899f1055a1d556237 \ + --hash=sha256:f291bcf42ae98eb5107edb162c3c998b4a89648fd8e99ed4cbd12705292788cd \ + --hash=sha256:f61efe1d2fe0de16158a5fe1d1cf3c14bdb6aecd54d8938fd26512c525c1f624 \ + --hash=sha256:f68edfc67aabac33708941f26f22a7b8e9f81429bc0cf249fcf7d66b23af8d19 \ + --hash=sha256:fa95848c929b6a75f6848d3c9793e59db365ee436776e57db835cdbfa79ba977 \ + --hash=sha256:fd9f8797427910198f95bced71ddfed61130d7e349213bfb8466c9c99e2c46a8 \ + --hash=sha256:fdb4ca07ab75ffadab4a8b135ad59cdbb3156b99310f3d565370da74a15d6bd3 + # via jinja2 +matplotlib==3.10.9 \ + --hash=sha256:09218df8a93712bd6ea133e83a153c755448cf7868316c531cffcc43f69d1cc9 \ + --hash=sha256:10cc5ce06d10231c36f40e875f3c7e8050362a4ee8f0ee5d29a6b3277d57bb42 \ + --hash=sha256:172db52c9e683f5d12eaf57f0f54834190e12581fe1cc2a19595a8f5acb4e77d \ + --hash=sha256:1872fb212a05b729e649754a72d5da61d03e0554d76e80303b6f83d1d2c0552b \ + --hash=sha256:1aa972116abb4c9d201bf245620b433726cb6856f3bef6a78f776a00f5c92d37 \ + --hash=sha256:1e7698ac9868428e84d2c967424803b2472ff7167d9d6590d4204ed775343c3b \ + --hash=sha256:2dc9477819ffd78ad12a20df1d9d6a6bd4fec6aaa9072681465fddca052f1456 \ + --hash=sha256:3225f4e1edcb8c86c884ddf79ebe20ecd0a67d30188f279897554ccd8fded4dc \ + --hash=sha256:336b9acc64d309063126edcdaca00db9373af3c476bb94388fe9c5a53ad13e6f \ + --hash=sha256:345f6f68ecc8da0ca56fad2ea08fde1a115eda530079eca185d50a7bc3e146c6 \ + --hash=sha256:34cf8167e023ad956c15f36302911d5406bd99a9862c1a8499ea6f7c0e015dc2 \ + --hash=sha256:3fc0364dfbe1d07f6d15c5ebd0c5bf89e126916e5a8667dd4a7a6e84c36653d4 \ + --hash=sha256:41cb28c2bd769aa3e98322c6ab09854cbcc52ab69d2759d681bba3e327b2b320 \ + --hash=sha256:42fb814efabe95c06c1994d8ab5a8385f43a249e23badd3ba931d4308e5bca20 \ + --hash=sha256:4e42042d54db34fda4e95a7bd3e5789c2a995d2dad3eb8850232ee534092fbbf \ + --hash=sha256:4edcfbd8565339aa62f1cd4012f7180926fdbe71850f7b0d3c379c175cd6b66c \ + --hash=sha256:51bf0ddbdc598e060d46c16b5590708f81a1624cefbaaf62f6a81bf9285b8c80 \ + --hash=sha256:56fc0bd271b00025c6edfdc7c2dcd247372c8e1544971d62e1dc7c17367e8bf9 \ + --hash=sha256:59476c6d29d612b8e9bb6ce8c5b631be6ba8f9e3a2421f22a02b192c7dd28716 \ + --hash=sha256:6640f75af2c6148293caa0a2b39dd806a492dd66c8a8b04035813e33d0fd2585 \ + --hash=sha256:68cfdcede415f7c8f5577b03303dd94526cdb6d11036cecdc205e08733b2d2bb \ + --hash=sha256:6b63d9c7c769b88ab81e10dc86e4e0607cf56817b9f9e6cf24b2a5f1693b8e38 \ + --hash=sha256:6be157fe17fc37cb95ac1d7374cf717ce9259616edec911a78d9d26dae8522d4 \ + --hash=sha256:6c63ebcd8b4b169eb2f5c200552ae6b8be8999a005b6b507ed76fb8d7d674fe2 \ + --hash=sha256:77210dce9cb8153dffc967efaae990543392563d5a376d4dd8539bebcb0ed217 \ + --hash=sha256:7a8d66a55def891c33147ba3ba9bfcabf0b526a43764c818acbb4525e5ed0838 \ + --hash=sha256:82368699727bfb7b0182e1aa13082e3c08e092fa1a25d3e1fd92405bff96f6d4 \ + --hash=sha256:82834c3c292d24d3a8aae77cd2d20019de69d692a34a970e4fdb8d33e2ea3dda \ + --hash=sha256:8e436d155fa8a3399dc62683f8f5d0e2e50d25d0144a73edd73f82eec8f4abfb \ + --hash=sha256:8f3bcac1ca5ed000a6f4337d47ba67dfddf37ed6a46c15fd7f014997f7bf865f \ + --hash=sha256:97e35e8d39ccc85859095e01a53847432ba9a53ddf7986f7a54a11b73d0e143f \ + --hash=sha256:985f2238880e2e69093f588f5fe2e46771747febf0649f3cf7f7b7480875317f \ + --hash=sha256:a49f1eadc84ca85fd72fa4e89e70e61bf86452df6f971af04b12c60761a0772c \ + --hash=sha256:a5a6104ed666402ba5106d7f36e0e0cdca4e8d7fa4d39708ca88019e2835a2eb \ + --hash=sha256:aba1615dabe83188e19d4f75a253c6a08423e04c1425e64039f800050a69de6b \ + --hash=sha256:ae20801130378b82d647ff5047c07316295b68dc054ca6b3c13519d0ea624285 \ + --hash=sha256:ae2f11957b27ce53497dd4d7b235c4d4f1faf383dfb39d0c5beb833bff883294 \ + --hash=sha256:b049278ddce116aaa1c1377ebf58adea909132dfce0281cf7e3a1ea9fc2e2c65 \ + --hash=sha256:b1b745c489cd1a77a0dc1120a05dc87af9798faebc913601feb8c73d89bf2d1e \ + --hash=sha256:b2b9516251cb89ff618d757daec0e2ed1bf21248013844a853d87ef85ab3081d \ + --hash=sha256:b580440f1ff81a0e34122051a3dfabb7e4b7f9e380629929bde0eff9af72165f \ + --hash=sha256:ba7b3b8ef09eab7df0e86e9ae086faa433efbfbdb46afcb3aa16aabf779469a8 \ + --hash=sha256:c27df8b3848f32a83d1767566595e43cfaa4460380974da06f4279a7ec143c39 \ + --hash=sha256:d091f9d758b34aaaaa6331d13574bf01891d903b3dec59bfff458ef7551de5d6 \ + --hash=sha256:d730e984eddf56974c3e72b6129c7ca462ac38dc624338f4b0b23eb23ecba00f \ + --hash=sha256:d75d11c949914165976c621b2324f9ef162af7ebf4b057ddf95dd1dba7e5edcf \ + --hash=sha256:d843374407c4017a6403b59c6c81606773d136f3259d5b6da3131bc814542cc2 \ + --hash=sha256:da4e09638420548f31c354032a6250e473c68e5a4e96899b4844cf39ddea23fe \ + --hash=sha256:de2445a0c6690d21b7eb6ce071cebad6d40a2e9bdf10d039074a96ba19797b99 \ + --hash=sha256:dfca0129678bd56379db26c52b5d77ed7de314c047492fbdc763aa7501710cfb \ + --hash=sha256:e9fae004b941b23ff2edcf1567a857ed77bafc8086ffa258190462328434faf8 \ + --hash=sha256:f0c3c28d9fbcc1fe7a03be236d73430cf6409c41fb2383a7ac52fe932b072cb1 \ + --hash=sha256:f4399f64b3e94cd500195490972ae1ee81170df1636fa15364d157d5bdd7b921 \ + --hash=sha256:f76e640a5268850bfda54b5131b1b1941cc685e42c5fa98ed9f2d64038308cba \ + --hash=sha256:fd66508e8c6877d98e586654b608a0456db8d7e8a546eb1e2600efd957302358 + # via policyengine-taxsim (pyproject.toml) +matplotlib-inline==0.2.2 \ + --hash=sha256:3c821cf1c209f59fb2d2d64abbf5b23b67bcb2210d663f9918dd851c6da1fcf6 \ + --hash=sha256:72f3fe8fce36b70d4a5b612f899090cd0401deddc4ea90e1572b9f4bfb058c79 + # via ipython +microdf-python==1.5.11 \ + --hash=sha256:0f9af347bcc4d036e1290c07cc28d33bacfc84a54704a3aee52c8be61a387a29 \ + --hash=sha256:700b0125bab3e4f1af0c3257e0d06b57655259be7fac3eaa8a058ccff8616e96 + # via + # policyengine-core + # policyengine-us +msgpack==1.2.3 \ + --hash=sha256:07c9733089d1b176c3dd2f7fa268452f9d5d784d076473499d754a58e8d1fbbb \ + --hash=sha256:0955b9000725573d1457c1676944b370dd9643c8d18f25bda5ac72913f850949 \ + --hash=sha256:0c91762c48cd686dc9cf2b142c0bc544083952de32f5853d6624c956e54b85e5 \ + --hash=sha256:0ed5823c4efc20fe87d3530665f40ec18a002be003114814c21235cc8d256207 \ + --hash=sha256:13221a6c81ebb8e43ea63a7251c35d54e4175cea37ebf3a62e911bdf42562a3c \ + --hash=sha256:186e6c602b8a9968b8e864c67d622a69279f7d1e55ae25f40e3bff7e815b2b62 \ + --hash=sha256:18a6ed513023001b28dcd3ba54966f6bb90a38274ba8d2640464bcab3a1b81d4 \ + --hash=sha256:1d6bcec3dbbdb89ca385d3a73e63ceae7b841fa0d7ca7c676f1a7bfe7fb2cdb8 \ + --hash=sha256:1f4ae8bd4ad9ba085fde95e95d055a896d19210238a4199a771a3cf36dceed49 \ + --hash=sha256:1f585407f740a9eac04a3bb82c61d68a0ea78f90e29e670bfb086b9ce3a518dd \ + --hash=sha256:21bfa4d2aa0b04c1806ef778a1199e9e53ea2441bcbf284420a32083896320b8 \ + --hash=sha256:2487453ca1b6104442c6442f9a1a8fee1fe8f428a70d99d4cba799108b304150 \ + --hash=sha256:2574ef81c1c8c38b10e330f3f9406fd09198a776b002030fafcf8e7647e9e06e \ + --hash=sha256:30e1522e4173230dca4d9ad896f038f73c0da6c1edd42f4dbad88ac583cf5d46 \ + --hash=sha256:32edb81a2b5eb7cd7c9d941b2bfbbb082fd2cd09e0e725930316af6b708db186 \ + --hash=sha256:3372475211a9ce1a23acefe512cb3e121d18c95dc74ed56cb1819ef40836ebf4 \ + --hash=sha256:382b219de3d436de3baba0f4b0c6d4336e8f5858d0eb047918b13b69a71c6c55 \ + --hash=sha256:382bc88fe90f29f5ac8a0b65c7046ff255356f2f2f3186c30e370215736fa1dc \ + --hash=sha256:39b6986c19e1f2dfa549d185dba6ccf1de2e4c0ba10d8cfc0048935b1c5f9109 \ + --hash=sha256:3a31905206722103a84c1f72633fe30692cff6732c9d262e09a27dbc468797c8 \ + --hash=sha256:3d4c807ed050fe3ddbea5ba7e9f63d7136871ce42861be1f50ff739f0e91047a \ + --hash=sha256:3ec409b0d6aa8e9eec6eaf881b893caa215dbe68c5319ca96e8a271d81bb111d \ + --hash=sha256:471e12a6a42498a31490c206e0069e343b6a7c35db540be73a879eb06f5be047 \ + --hash=sha256:4c0780095871ecc49a58b2ff6b1b43b25214704da67646557ca287a3f49fb2dd \ + --hash=sha256:59612b4ed48a04cf024584218e813562f3b30a3bafa5f55abe300b15da314751 \ + --hash=sha256:5bd5f91ea75c45cafcc5433ba8fae59b708b736ec178d2441c40c499e9e079db \ + --hash=sha256:5bf390259cb25a6a1cd197c65810999b811f64cd38683251538bcc5a1e41f7d3 \ + --hash=sha256:5c1efdd9181cb1b719ee46865f368a927f1c0c65d577798340b1194545b7515a \ + --hash=sha256:5e0d7950ca3c1bbae291d0552dd3bb2792fc680629c4c0d44e47e5bab969f3ca \ + --hash=sha256:5f304123b90e8b2e49867981b7f6061612c39f50cca51ee88de007c084cf68d3 \ + --hash=sha256:62cc1a4ef0e553bac32c8342e1f04834aca7de276b92744eb7307db77759b890 \ + --hash=sha256:63bb7448a1e9111319ae2430c09a5596140c160422830d6271bc75730ff2ff9a \ + --hash=sha256:6576f348ed6cc4f31db6fd915a8e94245f042f50eae08d48732425e70638ea37 \ + --hash=sha256:666ef5601ab0e6e345e47febc96aa81143cc932201543480cbb9499164f05ffb \ + --hash=sha256:6707d2fa2aa1bb5424ea0b05f44ffc989b15ab41a73ff5855bff4944fec7c8ac \ + --hash=sha256:69ad12cedb674c73527bed869cddb42b742cac79a207a614202a4abaa24ea173 \ + --hash=sha256:6a834097144aabe948b8ca9020a833e8026f7d0abbd0ec54bc7e50f45a8ce012 \ + --hash=sha256:6df430419f2338cb71e4a34d6e64f83c88ccd321f91f40ba4513400b36d864ec \ + --hash=sha256:700bc0fc9e968a292b9137ee70e7a012f7e115bf0107ce45e3a88202788dfc1e \ + --hash=sha256:7013534a7163aa4f213c4d9864f1a8a7555daac6fcd48f699a198e29b436bfab \ + --hash=sha256:7995a7c6a62a1d6e7df211b4a16de513bd99fd053525050a319f80f44fb8015e \ + --hash=sha256:79dfa38faf92f804aa61beec140d70b18418e1dde1778dbb77a87a4cce85aa8a \ + --hash=sha256:7a003b02c6ee2eea6dfe0bb08818631e3597e69f0131f2a8250488a1cc553290 \ + --hash=sha256:7c047250096f9fc19dba26e3d1639b5e7a84114003605c94def667149a70ced1 \ + --hash=sha256:84a6616d396ec1bc18a1e83e67c96a393ec35dfe5e17434a5be7b9aa0fe988ab \ + --hash=sha256:87cf2ef05ff2f2493ba29fcdaef27e960ca64dacfd13460ae29e6f92e0ed05bb \ + --hash=sha256:89c930aece4e972b208ba589c8410b4167b05e411a5ea2cb25fd96f8bc47ee43 \ + --hash=sha256:8ca67f77938ea6a3663aa9bd22b3e031f6da84d665be850abab910ee90728dfd \ + --hash=sha256:8e51eca14fbb65c4e0a5a9657346962bd3dca78c08e04e3d4dee70ef48687d30 \ + --hash=sha256:8ec7a1d49ca6c2569d722ab5ec86e90089b0713900aa31905b47b4c4d9e78ce0 \ + --hash=sha256:902f3490db0e07a7d40b48536a85c9b28fbf1397e7e1658a45a55f958e303620 \ + --hash=sha256:905a189853d6bdb204c7ae5f4ab77fb857448abfff574d3d93c62e2815b24b4f \ + --hash=sha256:9276ba88891338f2617044429dfd080ae008c9868a25f6f1a7d004a35dc9ac0a \ + --hash=sha256:9324c54995641c3d1f92a9d55093c8cde0ffa2fbc87a467a688ef60428393220 \ + --hash=sha256:968583e956d0427878050b371308c5f8647088732ef3e66a117dbe1192ec91e0 \ + --hash=sha256:9d7e9cbb0998bbfd363fd9a09c330520d5e9cb323c05b5a1a05865d23ccf2226 \ + --hash=sha256:a393e428f6ffb0dcb73308c1fff5593041c16ff42da66e5bac8a83a6107a54b0 \ + --hash=sha256:a6b63917d60d6df451f328bd6afba8565e33c4afe1f62ec4ad758b78731c827b \ + --hash=sha256:b1631e12fe572e181cd77e831f69335d6cd5278eac22e3db3f33cf264ac2ac18 \ + --hash=sha256:b774ff994d844e541439ac5d2d49a14def4104830c3465e9394c153f86200ffb \ + --hash=sha256:b949cc25e4a09252cbcc54e66e507de914d0e94a3a7039bd54c299bf7037c098 \ + --hash=sha256:bb89b5dc30469c84bbf8684826eb851d82412ca95690e111b9ac5e8fb343961a \ + --hash=sha256:bfe7d5b62cbe7aa664f0b3e2c49077f10fcdd06183d3014f8271ff3c5edbfbf9 \ + --hash=sha256:c309a7abae1d14ba29a8bd0ddbd704a5e469d8e9bd9c3dee0e4ff53d7ae01d56 \ + --hash=sha256:c77e27790ad72989db783d5303825fba0b71550f00a490efba35cde7dc4b719f \ + --hash=sha256:c942c21a93f36b3a69e828c8945bb72c94dc2ffe488a2086950c812f3edf046c \ + --hash=sha256:ccea05b5542f6d283fef3f0a8e93a7f0be90af0ddeeef84c25c0216ba76dcae1 \ + --hash=sha256:cd5a9f9f86a52c24713679aa2631956835f3842512964ff93f736ff76f1f530d \ + --hash=sha256:d0238cd05dec9ffbe0de1071df685ba63e30a36ac155285b1a094e727c38cbe9 \ + --hash=sha256:d1c1e8989a855b7f1f2a64ec4a80b23a631822903952770813857b2e4f460471 \ + --hash=sha256:d2f9c4f85e47a44d26d5baf3b041eef23436e224d44eed273f01bd8a12048d9f \ + --hash=sha256:d31864ba3933a589b6a00249f89c0eb422197f49128fc10da550e57e9cb0f377 \ + --hash=sha256:d8ef3a66e4b52d2d7fdd90df2984670124b2ff7546d76bb25dcf68ef47f7df58 \ + --hash=sha256:db84203b13aecc222f465061397fdd5b53b7ae73d2c95ffc1c8dc5be0153a709 \ + --hash=sha256:db9fb67a3a2e75247bae569d34ebb5ff61c0448a4f0d6dbf991dae68af39b007 \ + --hash=sha256:e0bd394e999949c814f7912284243298de1b5a17b6a3dcb6cc8a79b156ffc4fa \ + --hash=sha256:e15f70588f4db8cd10df0930145b186de70feb9db51710cd378b1399009655bd \ + --hash=sha256:e54394b7dbe2e12ab032d9d21feef7bb61a90a150a2623633ba3781ba69dcb1f \ + --hash=sha256:eaf7e82249837e3aa97297b34a0bb9ff562027381631e057cea6e1367f10b438 \ + --hash=sha256:ec0030361cc861ac699b2ef1c695b741fa145c88f8667fa3d7e3f73deeb648a3 \ + --hash=sha256:ec90a9ae3e1169fa1171147340f0e97d941aa19fcd3b34e8339a55933ed042af \ + --hash=sha256:ed899d73a22f286a72bd9528d63f2ab3030dbad8bf1527fc249319a50d61fb9d \ + --hash=sha256:ede33b2892ceb976283e009ad12fa1834cfdf1f9c43ee9c97849fc588d00a618 \ + --hash=sha256:f24a43b3560e20f825b807fe1e874bd73d53abaf8bbdcf258a6eb152cddbc1f5 \ + --hash=sha256:f3d7b3d0018746b5997dd6b14a1870b07cc4c327d9101145d94a1fc264a51a06 \ + --hash=sha256:f41ca154b7737b11893cdce3c78c61d703398a1cd54d4297bdad908392338a8e \ + --hash=sha256:f42f146752eedb6765f07dcc04d72dab0a25779ec8d4a88c0085263ce114f22c \ + --hash=sha256:f56fba61b2516be7917cb00151f0d060b5b21184e3499bb57f0f7d9259bea124 \ + --hash=sha256:f9ddd28d3e9bbc602a9dced1591882c7fb9ab776eef8837da2c326fde19e2853 \ + --hash=sha256:fafc3b8898b432b841d30a61082c599fa7f4d06885f9dc58ad72259e12059fa6 \ + --hash=sha256:fcc6800daac4922960f6eeb7a0dda3dd4105e0bf7bce0e83ebc465a78cb7bdba + # via blosc2 +ndindex==1.10.1 \ + --hash=sha256:03cf1e6cdac876bd8fc92d3b65bb223496b1581d10eab3ba113f7c195121a959 \ + --hash=sha256:046c1e88d46b2bd2fd3483e06d27b4e85132b55bc693f2fca2db0bb56eea1e78 \ + --hash=sha256:08bfdc1f7a0b408d15b3ce61d141ebbebdb47a25341967e425e104c5bd512a5c \ + --hash=sha256:092b92c07690292ec7c6b266c38d7e63d254ec8d913ed06f2a8e16103eb7861a \ + --hash=sha256:0ad8e060b26568c4e67c7b1dc2bc64e28597afdaabd7d63f98f655bfe2daa644 \ + --hash=sha256:0f6113c1f031248f8818cbee1aa92aa3c9472b7701debcce9fddebcd2f610f11 \ + --hash=sha256:157b5c34a1b779f5d27b790d9bd7e7b156d284e76be83c591a3ba003984f4956 \ + --hash=sha256:1827a40301405b44ad709e388c5b48cf35cd90a67f77e63f0f17d87f6000fa81 \ + --hash=sha256:1ae21b06235cb0884e97cf672780c170449baa0314085595cfe751705fa352de \ + --hash=sha256:23d35696f802548143b5cc199bf2f171efb0061aa7934959251dd3bae56d038c \ + --hash=sha256:27385939f317b55773ea53f6bf9334810cf1d66206034c0a6a6f2a88f2001c3c \ + --hash=sha256:27a7729a4d33df6b96f7d5edff281d2b987bbe6545031c5eb606b95c47694f54 \ + --hash=sha256:28741daca5926adff402247cd406f453ed5bb6042e82d6855938f805190e5ce9 \ + --hash=sha256:2d6442ecce9b395aade5e9f2431e169e01393953a069f6d2d53a63b6c94d1d06 \ + --hash=sha256:3307817bdc92846b18f309fae3582856f567dd6e0742fb0b41ac68682bfc4e2a \ + --hash=sha256:346a4bf09f5771548665c8206e81daadb6b9925d409746e709894bdd98adc701 \ + --hash=sha256:37f87f0e7690ae0324334740e0661d6297f2e62c9bf925127d249fb7eddd0ad8 \ + --hash=sha256:3b0d9ce2c8488444499ab6d40e92e09867bf4413f5cf04c01635de923f44aa67 \ + --hash=sha256:3ce3bd0882572269ca09285112cf38ce84baa2aaa5891551af968ca7c18f84bb \ + --hash=sha256:4cea15cff221e76abd12e3e940c26124184735cf421c229307f5db6742e14dd7 \ + --hash=sha256:588e8875d836a93b3cd9af482c8074bb02288ae1aff92cf277e1f02d9ae0f992 \ + --hash=sha256:59a3222befc0f7cdc85fb9b90a567ae890f70a864bdeb660517e9ebcb36bf1bc \ + --hash=sha256:5c026dbbf2455d97ce6456d8a50b349aee8fefa11027d020638c89e9be2c9c4c \ + --hash=sha256:5c3634a8df43e7928122225a3d64d850c8957bd1edf2e403907deacb478af27b \ + --hash=sha256:6928e47fb008903f2e41309b7ff1e59b16abbcd59e2e945454571c28b2433c9e \ + --hash=sha256:72af787dcee3661f36fff9d144d989aacefe32e2c8b51ceef9babd46afb93a18 \ + --hash=sha256:752e78a5e87911ded117c57a7246596f26c9c6da066de3c2b533b3db694949bb \ + --hash=sha256:777bb6fa1dc72527fb43744b8c1499ca86e8e110b238d7aad6a686489c23d3bd \ + --hash=sha256:78bfe25941d2dac406391ddd9baf0b0fce163807b98ecc2c47a3030ee8466319 \ + --hash=sha256:78ce45106ebf67aeba99714818c721d8fd5fb9534daebd2565665a2d64b50fc9 \ + --hash=sha256:7da34a78410c14341d5fff73be5ce924bd36500bf7f640fc59b8607d3a0df95e \ + --hash=sha256:8644c76e74c0fbbdaa54752de30b7c6b98b1e8f6c05f0c6228632a29c862d83f \ + --hash=sha256:87f83e8c35a7f49a68cd3a3054c406e6c22f8c1315f3905f7a778c657669187e \ + --hash=sha256:890bb92f0a779e6f16bdbcc8bd2e06c32bcc0239e5893ba246114eb924aecaaa \ + --hash=sha256:8ff1558ddbfedcecd1f6ed7777530917ad08f9c253fcaa8b7152a7aa4ca0264f \ + --hash=sha256:9599fcb7411ffe601c367f0a5d4bc0ed588e3e7d9dc7604bdb32c8f669456b9e \ + --hash=sha256:967b87b88dadb62555ec1039695c347254eccb8ca3d124c0e5dbe084c525fa93 \ + --hash=sha256:9b5297f207ebc068c7cdf9e3cd7b95aa5c9ec04295d0a7e56b529f66787d4685 \ + --hash=sha256:9d581f931e61f182478f18bdf5edd3955899df5da4892ed0d5de547a4cfd5b6f \ + --hash=sha256:9fdf3ca16efcdfbb8800aa88fbab1bc6528e6a0504bcb9cf7af4cb9d50e9f5d9 \ + --hash=sha256:a91e1a0398120233d5c3b23ccb2d4b78e970d66136f1a7221fa9a53873c3d5c5 \ + --hash=sha256:a9a211ec2198994cb3600cd46adb335a740f27e4d406b40d48ed7b98d2d2a89b \ + --hash=sha256:ae73cd2d66b09ef2f2a7d7f93bad396d6abf168d1ee825e403c6c5fb8ae1341c \ + --hash=sha256:bada24abee6bc6ca438b2e6b68a752fc9b58b67bdcb54008e2bc6330ecb0a777 \ + --hash=sha256:bc236d1612714cbd80610cf25a6ef92584ff1402e9d5a5c50e926195716f7d22 \ + --hash=sha256:c5e9762452b163e33cfb6e821f86e45ba0b53bdfcd23ab5d57b48a8f566898cb \ + --hash=sha256:c65ca639a7abf72d79f22424f4abd18dece1f289a2b7b028a0ca455edd2168d4 \ + --hash=sha256:c67dde588c0fb89d872931a4ed5f9b4d21c1c70a3d92fdf0812a1de154239816 \ + --hash=sha256:c9dd58d91220b1c1fe516324bfcf4114566c98e84b1cbbe416abe345c75bd557 \ + --hash=sha256:cb76e0f3f235d8b1c768b17e771de48775d281713795c3aa045e8114ad61bdda \ + --hash=sha256:cdb86a4176f2ae23bd4bcd0401ca35d5dad2d1ed0d0dca1ff64480ebe41b75d9 \ + --hash=sha256:cf5855881884b8467dfcf45764ccf2e4279075be14b155b89c96994bb08d2e6f \ + --hash=sha256:cf80241b40adffdc3276b2c9fb63a96c6c98b4a9d941892738de8add65083962 \ + --hash=sha256:cf9e05986b2eb8c5993bce0f911d6cedd15bda30b5e35dd354b1ad1f4cc3599d \ + --hash=sha256:d0ebdba2fade3f6916fe21fd49e2a0935af4f58c56100a60f3f2eb26e20baee7 \ + --hash=sha256:dc7ebdbd465d25f29a9cd7ba31c304172351fc85626835385bcb72807d309a9a \ + --hash=sha256:e2ad917bcdf8dc5ba1e21f01054c991d26862d4d01c3c203a50e907096d558ac \ + --hash=sha256:e69a2cb1ac7be955c3c77f1def83f410775a81525c9ce2d4c0a3f2a61589ed47 \ + --hash=sha256:e81a9bd36fe054b6c9fcc53d26bc9a28cf15d1ab52a0f5b854f894116f3a54e1 \ + --hash=sha256:e851990a68937db5f485cd9f3e760c1fd47fa0f2a99f63a5e2cc880908faf3bb \ + --hash=sha256:ef3ef22390a892d16286505083ee5b326317b21c255a0c7f744b1290a0b964a6 \ + --hash=sha256:f77c4fd3f34c53037678020ab4e060da4bbdcae3a428797c7cbec69a6785dc93 \ + --hash=sha256:f99b3e89220da3244d03c9c5473669c7107d361c129fd9b064622744dee1ce15 \ + --hash=sha256:fa60637dfae1ee3fc057e420a52cc4ace38cf2c0d1a0451af2a3cba84d281842 \ + --hash=sha256:fe5341e24dc992b09c258456ac90a09a6d25efdc2cb86dcc91d32c8891e1df9a + # via blosc2 +networkx==3.4.2 \ + --hash=sha256:307c3669428c5362aab27c8a1260aa8f47c4e91d3891f48be0141738d8d053e1 \ + --hash=sha256:df5d4365b724cf81b8c6a7312509d0c22386097011ad1abe274afd5e9d3bbc5f + # via pyvis +numexpr==2.14.1 \ + --hash=sha256:03130afa04edf83a7b590d207444f05a00363c9b9ea5d81c0f53b1ea13fad55a \ + --hash=sha256:05f9366d23a2e991fd5a8b5e61a17558f028ba86158a4552f8f239b005cdf83c \ + --hash=sha256:06855053de7a3a8425429bd996e8ae3c50b57637ad3e757e0fa0602a7874be30 \ + --hash=sha256:09078ba73cffe94745abfbcc2d81ab8b4b4e9d7bfbbde6cac2ee5dbf38eee222 \ + --hash=sha256:0d1dcbdc4d0374c0d523cee2f94f06b001623cbc1fd163612841017a3495427c \ + --hash=sha256:15015d47d3d1487072d58c0e7682ef2eb608321e14099c39d52e2dd689483611 \ + --hash=sha256:1f1a5e817c534539351aa75d26088e9e1e0ef1b3a6ab484047618a652ccc4fc3 \ + --hash=sha256:2773ee1133f77009a1fc2f34fe236f3d9823779f5f75450e183137d49f00499f \ + --hash=sha256:2a381e5e919a745c9503bcefffc1c7f98c972c04ec58fc8e999ed1a929e01ba6 \ + --hash=sha256:2d03fcb4644a12f70a14d74006f72662824da5b6128bf1bcd10cc3ed80e64c34 \ + --hash=sha256:2eac7a5a2f70b3768c67056445d1ceb4ecd9b853c8eda9563823b551aeaa5082 \ + --hash=sha256:33265294376e7e2ae4d264d75b798a915d2acf37b9dd2b9405e8b04f84d05cfc \ + --hash=sha256:36f8d5c1bd1355df93b43d766790f9046cccfc1e32b7c6163f75bcde682cda07 \ + --hash=sha256:3a2839efa25f3c8d4133252ea7342d8f81226c7c4dda81f97a57e090b9d87a48 \ + --hash=sha256:439ec4d57b853792ebe5456e3160312281c3a7071ecac5532ded3278ede614de \ + --hash=sha256:44f84e0e5af219dbb62a081606156420815890e041b87252fbcea5df55214c4c \ + --hash=sha256:47041f2f7b9e69498fb311af672ba914a60e6e6d804011caacb17d66f639e659 \ + --hash=sha256:4be00b1086c7b7a5c32e31558122b7b80243fe098579b170967da83f3152b48b \ + --hash=sha256:538961096c2300ea44240209181e31fae82759d26b51713b589332b9f2a4117e \ + --hash=sha256:557887ad7f5d3c2a40fd7310e50597045a68e66b20a77b3f44d7bc7608523b4b \ + --hash=sha256:587c41509bc373dfb1fe6086ba55a73147297247bedb6d588cda69169fc412f2 \ + --hash=sha256:5aedf38d4c0c19d3cecfe0334c3f4099fb496f54c146223d30fa930084bc8574 \ + --hash=sha256:638dce8320f4a1483d5ca4fda69f60a70ed7e66be6e68bc23fb9f1a6b78a9e3b \ + --hash=sha256:64ae5dfd62d74a3ef82fe0b37f80527247f3626171ad82025900f46ffca4b39a \ + --hash=sha256:67ea4771029ce818573b1998f5ca416bd255156feea017841b86176a938f7d19 \ + --hash=sha256:6e575fd3ad41ddf3355d0c7ef6bd0168619dc1779a98fe46693cad5e95d25e6e \ + --hash=sha256:70d80fcb418a54ca208e9a38e58ddc425c07f66485176b261d9a67c7f2864f73 \ + --hash=sha256:75440c54fc01e130396650fdf307aa9d41a67dc06ddbfb288971b591c13a395b \ + --hash=sha256:76db0bc6267e591ab9c4df405ffb533598e4c88239db7338d11ae9e4b368a85a \ + --hash=sha256:790447be6879a6c51b9545f79612d24c9ea0a41d537a84e15e6a8ddef0b6268e \ + --hash=sha256:7e87f6d203ac57239de32261c941e9748f9309cbc0da6295eabd0c438b920d3a \ + --hash=sha256:823cd82c8e7937981339f634e7a9c6a92cb2d0b9d0a5cf627a5e394fffc05377 \ + --hash=sha256:83647d846d3eeeb9a9255311236135286728b398d0d41d35dedb532dca807fe9 \ + --hash=sha256:91ebae0ab18c799b0e6b8c5a8d11e1fa3848eb4011271d99848b297468a39430 \ + --hash=sha256:94c711f6d8f17dfb4606842b403699603aa591ab9f6bf23038b488ea9cfb0f09 \ + --hash=sha256:955c92b064f9074d2970cf3138f5e3b965be673b82024962ed526f39bc25a920 \ + --hash=sha256:9f9137f1351b310436662b5dc6f4082a245efa8950c3b0d9008028df92fefb9b \ + --hash=sha256:9fdcd4735121658a313f878fd31136d1bfc6a5b913219e7274e9fca9f8dac3bb \ + --hash=sha256:a40b350cd45b4446076fa11843fa32bbe07024747aeddf6d467290bf9011b392 \ + --hash=sha256:a4ba71db47ea99c659d88ee6233fa77b6dc83392f1d324e0c90ddf617ae3f421 \ + --hash=sha256:af111c8fe6fc55d15e4c7cab11920fc50740d913636d486545b080192cd0ad73 \ + --hash=sha256:c5f1b1605695778896534dfc6e130d54a65cd52be7ed2cd0cfee3981fd676bf5 \ + --hash=sha256:d08856cfc1b440eb1caaa60515235369654321995dd68eb9377577392020f6cb \ + --hash=sha256:d0fab3fd06a04f6b86102552b26aa5d85e20ac7d8296c15764c726eeabae6cc8 \ + --hash=sha256:d686dfb2c1382d9e6e0ee0b7647f943c1886dba3adbf606c625479f35f1956c1 \ + --hash=sha256:db78fa0c9fcbaded3ae7453faf060bd7a18b0dc10299d7fcd02d9362be1213ed \ + --hash=sha256:dce0b5a0447baa7b44bc218ec2d7dcd175b8eee6083605293349c0c1d9b82fb6 \ + --hash=sha256:dd72d8c2a165fe45ea7650b16eb8cc1792a94a722022006bb97c86fe51fd2091 \ + --hash=sha256:dde9fa47ed319e1e1728940a539df3cb78326b7754bc7c6ab3152afc91808f9b \ + --hash=sha256:e23b87f744e04e302d82ac5e2189ae20a533566aec76a46885376e20b0645bf8 \ + --hash=sha256:e9b2f957798c67a2428be96b04bce85439bed05efe78eb78e4c2ca43737578e7 \ + --hash=sha256:ebe4980f9494b9f94d10d2e526edc29e72516698d3bf95670ba79415492212a4 \ + --hash=sha256:ec368819502b64f190c3f71be14a304780b5935c42aae5bf22c27cc2cbba70b5 \ + --hash=sha256:ede79f7ff06629f599081de644546ce7324f1581c09b0ac174da88a470d39c21 \ + --hash=sha256:edea2f20c2040df8b54ee8ca8ebda63de9545b2112872466118e9df4d0ae99f3 \ + --hash=sha256:eee6d4fbbbc368e6cdd0772734d6249128d957b3b8ad47a100789009f4de7083 \ + --hash=sha256:fdd886f4b7dbaf167633ee396478f0d0aa58ea2f9e7ccc3c6431019623e8d68f + # via + # blosc2 + # policyengine-core + # tables +numpy==2.2.6 \ + --hash=sha256:038613e9fb8c72b0a41f025a7e4c3f0b7a1b5d768ece4796b674c8f3fe13efff \ + --hash=sha256:0678000bb9ac1475cd454c6b8c799206af8107e310843532b04d49649c717a47 \ + --hash=sha256:0811bb762109d9708cca4d0b13c4f67146e3c3b7cf8d34018c722adb2d957c84 \ + --hash=sha256:0b605b275d7bd0c640cad4e5d30fa701a8d59302e127e5f79138ad62762c3e3d \ + --hash=sha256:0bca768cd85ae743b2affdc762d617eddf3bcf8724435498a1e80132d04879e6 \ + --hash=sha256:1bc23a79bfabc5d056d106f9befb8d50c31ced2fbc70eedb8155aec74a45798f \ + --hash=sha256:287cc3162b6f01463ccd86be154f284d0893d2b3ed7292439ea97eafa8170e0b \ + --hash=sha256:37c0ca431f82cd5fa716eca9506aefcabc247fb27ba69c5062a6d3ade8cf8f49 \ + --hash=sha256:37e990a01ae6ec7fe7fa1c26c55ecb672dd98b19c3d0e1d1f326fa13cb38d163 \ + --hash=sha256:389d771b1623ec92636b0786bc4ae56abafad4a4c513d36a55dce14bd9ce8571 \ + --hash=sha256:3d70692235e759f260c3d837193090014aebdf026dfd167834bcba43e30c2a42 \ + --hash=sha256:41c5a21f4a04fa86436124d388f6ed60a9343a6f767fced1a8a71c3fbca038ff \ + --hash=sha256:481b49095335f8eed42e39e8041327c05b0f6f4780488f61286ed3c01368d491 \ + --hash=sha256:4eeaae00d789f66c7a25ac5f34b71a7035bb474e679f410e5e1a94deb24cf2d4 \ + --hash=sha256:55a4d33fa519660d69614a9fad433be87e5252f4b03850642f88993f7b2ca566 \ + --hash=sha256:5a6429d4be8ca66d889b7cf70f536a397dc45ba6faeb5f8c5427935d9592e9cf \ + --hash=sha256:5bd4fc3ac8926b3819797a7c0e2631eb889b4118a9898c84f585a54d475b7e40 \ + --hash=sha256:5beb72339d9d4fa36522fc63802f469b13cdbe4fdab4a288f0c441b74272ebfd \ + --hash=sha256:6031dd6dfecc0cf9f668681a37648373bddd6421fff6c66ec1624eed0180ee06 \ + --hash=sha256:71594f7c51a18e728451bb50cc60a3ce4e6538822731b2933209a1f3614e9282 \ + --hash=sha256:74d4531beb257d2c3f4b261bfb0fc09e0f9ebb8842d82a7b4209415896adc680 \ + --hash=sha256:7befc596a7dc9da8a337f79802ee8adb30a552a94f792b9c9d18c840055907db \ + --hash=sha256:894b3a42502226a1cac872f840030665f33326fc3dac8e57c607905773cdcde3 \ + --hash=sha256:8e41fd67c52b86603a91c1a505ebaef50b3314de0213461c7a6e99c9a3beff90 \ + --hash=sha256:8e9ace4a37db23421249ed236fdcdd457d671e25146786dfc96835cd951aa7c1 \ + --hash=sha256:8fc377d995680230e83241d8a96def29f204b5782f371c532579b4f20607a289 \ + --hash=sha256:9551a499bf125c1d4f9e250377c1ee2eddd02e01eac6644c080162c0c51778ab \ + --hash=sha256:b0544343a702fa80c95ad5d3d608ea3599dd54d4632df855e4c8d24eb6ecfa1c \ + --hash=sha256:b093dd74e50a8cba3e873868d9e93a85b78e0daf2e98c6797566ad8044e8363d \ + --hash=sha256:b412caa66f72040e6d268491a59f2c43bf03eb6c96dd8f0307829feb7fa2b6fb \ + --hash=sha256:b4f13750ce79751586ae2eb824ba7e1e8dba64784086c98cdbbcc6a42112ce0d \ + --hash=sha256:b64d8d4d17135e00c8e346e0a738deb17e754230d7e0810ac5012750bbd85a5a \ + --hash=sha256:ba10f8411898fc418a521833e014a77d3ca01c15b0c6cdcce6a0d2897e6dbbdf \ + --hash=sha256:bd48227a919f1bafbdda0583705e547892342c26fb127219d60a5c36882609d1 \ + --hash=sha256:c1f9540be57940698ed329904db803cf7a402f3fc200bfe599334c9bd84a40b2 \ + --hash=sha256:c820a93b0255bc360f53eca31a0e676fd1101f673dda8da93454a12e23fc5f7a \ + --hash=sha256:ce47521a4754c8f4593837384bd3424880629f718d87c5d44f8ed763edd63543 \ + --hash=sha256:d042d24c90c41b54fd506da306759e06e568864df8ec17ccc17e9e884634fd00 \ + --hash=sha256:de749064336d37e340f640b05f24e9e3dd678c57318c7289d222a8a2f543e90c \ + --hash=sha256:e1dda9c7e08dc141e0247a5b8f49cf05984955246a327d4c48bda16821947b2f \ + --hash=sha256:e29554e2bef54a90aa5cc07da6ce955accb83f21ab5de01a62c8478897b264fd \ + --hash=sha256:e3143e4451880bed956e706a3220b4e5cf6172ef05fcc397f6f36a550b1dd868 \ + --hash=sha256:e8213002e427c69c45a52bbd94163084025f533a55a59d6f9c5b820774ef3303 \ + --hash=sha256:efd28d4e9cd7d7a8d39074a4d44c63eda73401580c5c76acda2ce969e0a38e83 \ + --hash=sha256:f0fd6321b839904e15c46e0d257fdd101dd7f530fe03fd6359c1ea63738703f3 \ + --hash=sha256:f1372f041402e37e5e633e586f62aa53de2eac8d98cbfb822806ce4bbefcb74d \ + --hash=sha256:f2618db89be1b4e05f7a1a847a9c1c0abd63e63a1607d892dd54668dd92faf87 \ + --hash=sha256:f447e6acb680fd307f40d3da4852208af94afdfab89cf850986c3ca00562f4fa \ + --hash=sha256:f92729c95468a2f4f15e9bb94c432a9229d0d50de67304399627a943201baa2f \ + --hash=sha256:f9f1adb22318e121c5c69a09142811a201ef17ab257a1e66ca3025065b7f53ae \ + --hash=sha256:fc0c5673685c508a142ca65209b4e79ed6740a4ed6b2267dbba90f34b0b3cfda \ + --hash=sha256:fc7b73d02efb0e18c000e9ad8b83480dfcd5dfd11065997ed4c6747470ae8915 \ + --hash=sha256:fd83c01228a688733f1ded5201c678f0c53ecc1006ffbc404db9f7a899ac6249 \ + --hash=sha256:fe27749d33bb772c80dcd84ae7e8df2adc920ae8297400dabec45f0dedb3f6de \ + --hash=sha256:fee4236c876c4e8369388054d02d0e9bb84821feb1a64dd59e137e6511a551f8 + # via + # policyengine-taxsim (pyproject.toml) + # blosc2 + # contourpy + # h5py + # matplotlib + # microdf-python + # numexpr + # pandas + # policyengine-core + # spm-calculator + # tables +openpyxl==3.1.5 \ + --hash=sha256:5282c12b107bffeef825f4617dc029afaf41d0ea60823bbb665ef3079dc79de2 \ + --hash=sha256:cf0e3cf56142039133628b5acffe8ef0c12bc902d2aadd3e0fe5878dc08d1050 + # via spm-calculator +packaging==26.3 \ + --hash=sha256:94edc256424af38762eb31306eed28beb9f0efc50a8837492c9d6fd6004aed79 \ + --hash=sha256:d7193f7c8e4e93f444fde0262bf90af30e16fa0ad0ad44cb553c87339b23cd1c + # via + # huggingface-hub + # matplotlib + # plotly + # pytest + # tables + # wheel +pandas==2.3.3 \ + --hash=sha256:0242fe9a49aa8b4d78a4fa03acb397a58833ef6199e9aa40a95f027bb3a1b6e7 \ + --hash=sha256:1611aedd912e1ff81ff41c745822980c49ce4a7907537be8692c8dbc31924593 \ + --hash=sha256:1b07204a219b3b7350abaae088f451860223a52cfb8a6c53358e7948735158e5 \ + --hash=sha256:1d37b5848ba49824e5c30bedb9c830ab9b7751fd049bc7914533e01c65f79791 \ + --hash=sha256:23ebd657a4d38268c7dfbdf089fbc31ea709d82e4923c5ffd4fbd5747133ce73 \ + --hash=sha256:2462b1a365b6109d275250baaae7b760fd25c726aaca0054649286bcfbb3e8ec \ + --hash=sha256:28083c648d9a99a5dd035ec125d42439c6c1c525098c58af0fc38dd1a7a1b3d4 \ + --hash=sha256:2e3ebdb170b5ef78f19bfb71b0dc5dc58775032361fa188e814959b74d726dd5 \ + --hash=sha256:318d77e0e42a628c04dc56bcef4b40de67918f7041c2b061af1da41dcff670ac \ + --hash=sha256:371a4ab48e950033bcf52b6527eccb564f52dc826c02afd9a1bc0ab731bba084 \ + --hash=sha256:376c6446ae31770764215a6c937f72d917f214b43560603cd60da6408f183b6c \ + --hash=sha256:3869faf4bd07b3b66a9f462417d0ca3a9df29a9f6abd5d0d0dbab15dac7abe87 \ + --hash=sha256:3fd2f887589c7aa868e02632612ba39acb0b8948faf5cc58f0850e165bd46f35 \ + --hash=sha256:4793891684806ae50d1288c9bae9330293ab4e083ccd1c5e383c34549c6e4250 \ + --hash=sha256:4e0a175408804d566144e170d0476b15d78458795bb18f1304fb94160cabf40c \ + --hash=sha256:503cf027cf9940d2ceaa1a93cfb5f8c8c7e6e90720a2850378f0b3f3b1e06826 \ + --hash=sha256:5554c929ccc317d41a5e3d1234f3be588248e61f08a74dd17c9eabb535777dc9 \ + --hash=sha256:56851a737e3470de7fa88e6131f41281ed440d29a9268dcbf0002da5ac366713 \ + --hash=sha256:5caf26f64126b6c7aec964f74266f435afef1c1b13da3b0636c7518a1fa3e2b1 \ + --hash=sha256:602b8615ebcc4a0c1751e71840428ddebeb142ec02c786e8ad6b1ce3c8dec523 \ + --hash=sha256:6253c72c6a1d990a410bc7de641d34053364ef8bcd3126f7e7450125887dffe3 \ + --hash=sha256:6435cb949cb34ec11cc9860246ccb2fdc9ecd742c12d3304989017d53f039a78 \ + --hash=sha256:6d21f6d74eb1725c2efaa71a2bfc661a0689579b58e9c0ca58a739ff0b002b53 \ + --hash=sha256:6d2cefc361461662ac48810cb14365a365ce864afe85ef1f447ff5a1e99ea81c \ + --hash=sha256:74ecdf1d301e812db96a465a525952f4dde225fdb6d8e5a521d47e1f42041e21 \ + --hash=sha256:75ea25f9529fdec2d2e93a42c523962261e567d250b0013b16210e1d40d7c2e5 \ + --hash=sha256:854d00d556406bffe66a4c0802f334c9ad5a96b4f1f868adf036a21b11ef13ff \ + --hash=sha256:8fe25fc7b623b0ef6b5009149627e34d2a4657e880948ec3c840e9402e5c1b45 \ + --hash=sha256:900f47d8f20860de523a1ac881c4c36d65efcb2eb850e6948140fa781736e110 \ + --hash=sha256:93c2d9ab0fc11822b5eece72ec9587e172f63cff87c00b062f6e37448ced4493 \ + --hash=sha256:a16dcec078a01eeef8ee61bf64074b4e524a2a3f4b3be9326420cabe59c4778b \ + --hash=sha256:a21d830e78df0a515db2b3d2f5570610f5e6bd2e27749770e8bb7b524b89b450 \ + --hash=sha256:a45c765238e2ed7d7c608fc5bc4a6f88b642f2f01e70c0c23d2224dd21829d86 \ + --hash=sha256:a637c5cdfa04b6d6e2ecedcb81fc52ffb0fd78ce2ebccc9ea964df9f658de8c8 \ + --hash=sha256:a68e15f780eddf2b07d242e17a04aa187a7ee12b40b930bfdd78070556550e98 \ + --hash=sha256:b3d11d2fda7eb164ef27ffc14b4fcab16a80e1ce67e9f57e19ec0afaf715ba89 \ + --hash=sha256:b468d3dad6ff947df92dcb32ede5b7bd41a9b3cceef0a30ed925f6d01fb8fa66 \ + --hash=sha256:b98560e98cb334799c0b07ca7967ac361a47326e9b4e5a7dfb5ab2b1c9d35a1b \ + --hash=sha256:bdcd9d1167f4885211e401b3036c0c8d9e274eee67ea8d0758a256d60704cfe8 \ + --hash=sha256:bf1f8a81d04ca90e32a0aceb819d34dbd378a98bf923b6398b9a3ec0bf44de29 \ + --hash=sha256:c46467899aaa4da076d5abc11084634e2d197e9460643dd455ac3db5856b24d6 \ + --hash=sha256:c4fc4c21971a1a9f4bdb4c73978c7f7256caa3e62b323f70d6cb80db583350bc \ + --hash=sha256:c503ba5216814e295f40711470446bc3fd00f0faea8a086cbc688808e26f92a2 \ + --hash=sha256:d051c0e065b94b7a3cea50eb1ec32e912cd96dba41647eb24104b6c6c14c5788 \ + --hash=sha256:d3e28b3e83862ccf4d85ff19cf8c20b2ae7e503881711ff2d534dc8f761131aa \ + --hash=sha256:db4301b2d1f926ae677a751eb2bd0e8c5f5319c9cb3f88b0becbbb0b07b34151 \ + --hash=sha256:dd7478f1463441ae4ca7308a70e90b33470fa593429f9d4c578dd00d1fa78838 \ + --hash=sha256:e05e1af93b977f7eafa636d043f9f94c7ee3ac81af99c13508215942e64c993b \ + --hash=sha256:e19d192383eab2f4ceb30b412b22ea30690c9e618f78870357ae1d682912015a \ + --hash=sha256:e32e7cc9af0f1cc15548288a51a3b681cc2a219faa838e995f7dc53dbab1062d \ + --hash=sha256:ecaf1e12bdc03c86ad4a7ea848d66c685cb6851d807a26aa245ca3d2017a1908 \ + --hash=sha256:ee15f284898e7b246df8087fc82b87b01686f98ee67d85a17b7ab44143a3a9a0 \ + --hash=sha256:ee67acbbf05014ea6c763beb097e03cd629961c8a632075eeb34247120abcb4b \ + --hash=sha256:f086f6fe114e19d92014a1966f43a3e62285109afe874f067f5abbdcbb10e59c \ + --hash=sha256:f8bfc0e12dc78f777f323f55c58649591b2cd0c43534e8355c51d3fede5f4dee + # via + # policyengine-taxsim (pyproject.toml) + # microdf-python + # policyengine-core + # policyengine-us + # spm-calculator +parso==0.8.7 \ + --hash=sha256:a8926eb2a1b915486941fdbd31e86a4baf88fe8c210f25f2f35ecec5b574ca1c \ + --hash=sha256:eaaac4c9fdd5e9e8852dc778d2d7405897ec510f2a298071453e5e3a07914bb1 + # via jedi +pexpect==4.9.0 \ + --hash=sha256:7236d1e080e4936be2dc3e326cec0af72acf9212a7e1d060210e70a47e253523 \ + --hash=sha256:ee7d41123f3c9911050ea2c2dac107568dc43b2d3b0c7557a33212c398ead30f + # via ipython +pillow==12.3.0 \ + --hash=sha256:00808c5e14ef63ac5161091d242999076604ff74b883423a11e5d7bbb38bf756 \ + --hash=sha256:04f01d28a6aaff387bf842a13be313df23ba0597a44f1a976c9feb3c6ff4711a \ + --hash=sha256:06ff022112bc9cbf83b60f8e028d94ad87b60621706487e65f673de61610ab59 \ + --hash=sha256:0740a512dc522224c77d9aa5a8d70d8b7d73fb91f2c21125d8d025d3b8990e45 \ + --hash=sha256:0847a763afefb695bc912d7c131e7e0632d4edc1d8698f58ddabec8e46b8b6d3 \ + --hash=sha256:0dd2064cbc55aaec028ef5fbb60fa47bb6c3e7918e07ff17935284b227a9d2df \ + --hash=sha256:0feb2e9d6ad6c9e3c06effe9d00f3f1e618a6643273576b016f591e9315a7139 \ + --hash=sha256:10e41f0fbf1eec8cfd234b8fe17a4caac7c9d0db4c204d3c173a8f9f6ef3232b \ + --hash=sha256:1182d52bc2d5e5d7d0949503aa7e36d12f42205dc287e4883f407b1988820d39 \ + --hash=sha256:164b31cd1a0490ab6efae01aa5df49da7061be0af1b30e035b6e9a1bfe34ee6e \ + --hash=sha256:1657923d2d45afb66526e5b933e5b3052e6bdea196c90d3abb2424e18c77dae8 \ + --hash=sha256:186941b6aef820ad110fb01fb06eb925374dc3a21b17e37ec9a53b250c6fe2d1 \ + --hash=sha256:1cca606cd25738df4ed873d5ad46bbdb3d83b5cbca291f6b4ff13a4df6b0bbe8 \ + --hash=sha256:21900ce7ba264168cd50defae43cd75d25c833ad4ad6e73ffc5596d12e25ac89 \ + --hash=sha256:236ff70b9312fb68943c703aa842ca6a758abfa45ac187a5e7c1452e96ef72b5 \ + --hash=sha256:23aceaa007d6172b02c277f0cd359c79492bbb14f7072b4ede9fbcaf20648130 \ + --hash=sha256:23d27a3e0307ec2244cc51e7287b919aa68d097504ebe19df4e76a98a3eea5bd \ + --hash=sha256:24870b09b224f7ae3c39ed07d10e819d06f8720bc551847b1d623832b5b0e28d \ + --hash=sha256:251bf95b67017e27b13d82f5b326234ca62d70f9cf4c2b9032de2358a3b12c7b \ + --hash=sha256:25b9b82bb22e6e2b3cd07b39c68b7b862001226cb3dff7130d1cb914121b39ed \ + --hash=sha256:28ce87c5ab450a9dd970b52e5aca5fe63ed432d18a2eaddd1979a00a1ba24ace \ + --hash=sha256:300557495eb45ebb8aec96c2da9c4be642fbf7cd937278b4013ba894ea8eb0eb \ + --hash=sha256:30f2aa603c41533cc25c05acd0da21636e84a315768feb631c937177db558931 \ + --hash=sha256:331b624368d4f1d069149002f25f44bc61c8919ce8ddb3c45bdad8f6e2d89510 \ + --hash=sha256:37d6d0a00072fd2948eb22bce7e1475f34569d90c87c59f7a2ec59541b77f7a6 \ + --hash=sha256:37dc8f7bbb66efe481bb60defacef820c950c24713fb44962ed6aa2a50966de1 \ + --hash=sha256:3b8182a766685eaa002637e28b4ec8d6b18819a0c71f579bf0dbaa5830297cce \ + --hash=sha256:3edce1d53195db527e0191f84b71d02022de0540bf43a16ed734ed7537b07385 \ + --hash=sha256:446c34dcc4324b084a53b705127dc15717b22c5e140ae0a3c38349d4efec071e \ + --hash=sha256:4998562bf62a445225f22e07c896bb04b35b1b1f2eb6d760584c9c51d7a5f78c \ + --hash=sha256:4b0a7fe987b14c31ebda6083f74f22b561fd3739bc0ac51e019622e3d72668c7 \ + --hash=sha256:4e8c2a84d977f50b9daed6eeaf3baef67d00d5d74d932288f02cb94518ee3ace \ + --hash=sha256:4f883547d4b7f0495ebe7056b0cc2aea76094e7a4abc8e933540f3271df27d9c \ + --hash=sha256:514435a37670e3e5e08f3945b68718b6ed329bb84367777e16f9f4dfe1e61a0f \ + --hash=sha256:53aa02d20d10c3d814d536aa4e5ac9b84ca0ff5a88377963b085ad6822f93e64 \ + --hash=sha256:5594fc43d548a7ed94949d139aa1341b270f1863f11cfd37f5a6c8b778a6b67f \ + --hash=sha256:571b9fcb07b97ef3a492028fb3d2dc0993ca23a06138b0315286566d29ef718a \ + --hash=sha256:57b3d78c95ba9059768b10e28b813002261d3f3dfc55cc48b0c988f625175827 \ + --hash=sha256:5afb51d599ea772b8365ae807ae557f18bccfe46ab261fd1c2a9ed700fc6eb17 \ + --hash=sha256:6b02afb9b97f65fbca5f31db6a2a3ba21aa93030225f150fa3f249717e938fb4 \ + --hash=sha256:6c0016e7b354317c4e9e525b937ac8596c38d2d232b419529b9cd7a1cd46e39a \ + --hash=sha256:71d6097b330eea8fd15097780c8e89cb1a8ce7838669f48c5bacd6f663dd4701 \ + --hash=sha256:756c768d0c9c2955feb7a56c37ea24aea2e369f8d36a88da270b6a9f19e62b5e \ + --hash=sha256:78cb2c6865a35ab8ff8b75fd122f6033b92a62c82801110e48ddd6c936a45d91 \ + --hash=sha256:7a743ff716f746fc19a9557f60dab1600d4613255f8a7aeb3cdde4db7eb15a66 \ + --hash=sha256:85f998ea1848bc6757289e739cfbdda3a04adfd58b02fc018ce54d754a5ce468 \ + --hash=sha256:8728f216dcdb6e6d555cf971cb34076139ad74b31fc2c14da4fafc741c5f6217 \ + --hash=sha256:877c3f311ff35410f690861c4409e7ccbf0cd2f878e50628a28e5a0bb689e658 \ + --hash=sha256:8cd2f7bdda092d99c9fc2fb7391354f306d01443d22785d0cbfafa2e2c8bb418 \ + --hash=sha256:8e95e1385e4998ae9694eeaa4730ba5457ff61185b3a55e2e7bea0880aef452a \ + --hash=sha256:962864dc93511324d51ddbb5b9f8731bf71675b93ca612a07441896f4688fb8c \ + --hash=sha256:9cf95fe4d0f84c82d282745d9bb08ad9f926efa00be4697e767b814ce40d4330 \ + --hash=sha256:9e881fca225083806662a5c43d627d215f258ff43c890f831966c7d7ba9c7402 \ + --hash=sha256:a2b55dd6b2a4c4b7d87ffa56bdb33fdc5fdb9a462173861a7bc097f17d91cb09 \ + --hash=sha256:a45650e8ce7fafffd731db8550230db6b0d306d181a90b67d3e6bca2f1990930 \ + --hash=sha256:a876864214e136f0eb367788dbd7df045f4806801518e2cfe9e13229cfe06d8f \ + --hash=sha256:ae26d61dfa7a47befdc7572b521024e8745f3d809bd95ca9505a7bba9ef849ec \ + --hash=sha256:af8d94b0db561cf68b88a267c5c44b49e134f525d0dc2cb7ed413a66bc23559a \ + --hash=sha256:b343699e8308bdc51978310e1c959c584e7869cc8c40780058c87da7781a1e94 \ + --hash=sha256:b3c777e849237620b022f7f297dd67705f9f5cf1685f09f02e46f93e92725468 \ + --hash=sha256:b629de27fda84b42cde7edef0d85f13b958b47f6e9bbcbba9b673c562a89bd8b \ + --hash=sha256:ba09209fbe443b4acccebe845d8a138b89a8f4fbaeedd44953490b5315d5e965 \ + --hash=sha256:ba54cfebe86920a559a7c4d6b9050791c20513650a1952ebe3368c7dc70306f8 \ + --hash=sha256:bcb46e2f9feff8d06323983bd83ed00c201fdcab3d74973e7072a889b3979fcd \ + --hash=sha256:bcc33feacfaefce60c12fd500a277533bdc02b10a19f7f6d348763d8140bbba7 \ + --hash=sha256:bf16ba1b4d0b6b7c8e534936632270cf70eb00dbe09005bc345b2677b726855c \ + --hash=sha256:cf1845d02ad822a369a49f2bb9345b1614744267682e7a03527dc3bf6eea1777 \ + --hash=sha256:d69141514cc30b774ceea5e3ed3a6635c8d8a96edf664689b890f4089111fb35 \ + --hash=sha256:d9c7f76c0673154f044e9d78c8655fb4213f6ca31a836df48b40fe5d187717b9 \ + --hash=sha256:dbce0b29841537a2fa4a214c2bbf14de3587c9680caa9b4e217568472490b28f \ + --hash=sha256:dc624f6bc473dacdf7ef7eb8678d0d08edf15cd94fad6ae5c7d6cc67a4e4902f \ + --hash=sha256:e158cb00350dc278f3b91551101aa7d12415a66ebf2c91d8d5ac14e56ddd3ad0 \ + --hash=sha256:e491916b378fba47242221bb9ead245211b70d504f495d105d17b14a24b4907c \ + --hash=sha256:e795b7eb908249c4e43c7c99fac7c2c75dab0c43566e37db472a355f63693d71 \ + --hash=sha256:e7e480451b9fa137494bccd3a7d69adbe8ac65a87d97be61e11f1b1050a5bac3 \ + --hash=sha256:e91206ee562682b51b98ef4b26a6ef48fd84e15fd4c4bc5ec768eb641d206838 \ + --hash=sha256:e9871b1ffbfa9656b60aeee92ed5136a5742696006fa322b29ea3d8da0ecc9cf \ + --hash=sha256:e9aeb04d6aef139de265b29683e119b638208f88cf73cdd1658aa07221165321 \ + --hash=sha256:ebaea975e03d3141d9d3a507df75c9b3ec90fa9d2ffd07567b3a978d9d790b26 \ + --hash=sha256:f0606c8bf2cdefea14a43530f7657cbbb7ecf1c4222512492ef4a4434a9501ec \ + --hash=sha256:f13c32a3abd6079a66d9526e18dad9b6d280384d49d7c54040cd57b6424041d9 \ + --hash=sha256:f7401aebd7f581d7f83a439d87d474999317ee099218e5ad25d125290990ba65 \ + --hash=sha256:fa4ecea169a355be7a3ade2c783e2ed12f0e40d2c5621cda8b3297faf7fbb9f5 \ + --hash=sha256:fbd139c8447d25dd750ab79ee274cc5e1fe80fc56340ab10b18a195e1b6eca3e \ + --hash=sha256:fdafc9cce40277e0f7a0feabce0ee50dd2fa1800f3b38015e51296b5e814048d \ + --hash=sha256:fe3cca2e4e8a592be0f269a1ca4835c25199d9f3ce815c8491048f785b0a0198 \ + --hash=sha256:ffd0c5368496f41b0944be820fcb7a838aa6e623d250b01acf2643939c3f99d7 + # via matplotlib +plotly==5.24.1 \ + --hash=sha256:dbc8ac8339d248a4bcc36e08a5659bacfe1b079390b8953533f4eb22169b4bae \ + --hash=sha256:f67073a1e637eb0dc3e46324d9d51e2fe76e9727c892dde64ddf1e1b51f29089 + # via policyengine-core +pluggy==1.6.0 \ + --hash=sha256:7dcc130b76258d33b90f61b658791dede3486c3e6bfb003ee5c9bfb396dd22f3 \ + --hash=sha256:e920276dd6813095e9377c0bc5566d94c932c33b27a3e3945d8389c374dd4746 + # via pytest +policyengine-core==3.31.1 \ + --hash=sha256:308200b28aa26bb79d7f0badebac391c0a81704d45ba4ef48ac79e88f0b21e6b \ + --hash=sha256:3ca8f666c3e67b0c0ce992fa3dc9d1ff2c095a3860f3d719883588b2f9e44ec3 + # via policyengine-us +policyengine-us==1.783.0 \ + --hash=sha256:88de56ecb5afb231ea1bff7f14074b6bb92eb53c9b16cedc68b40b2296b8c87a \ + --hash=sha256:b2f364936e20e128120ba5b13f47842f0cedb9b0c87105b495a701b98222275a + # via policyengine-taxsim (pyproject.toml) +prompt-toolkit==3.0.53 \ + --hash=sha256:01c0891d7f9237d5e339f7d3e42cdae80b7534abb1c7c0e3352efba6231492f2 \ + --hash=sha256:9ec8a0ad96d5c56148b3f914aa79c1564c3fde5d2e6b876e7bc327e353cf8fa6 + # via ipython +psutil==6.1.1 \ + --hash=sha256:018aeae2af92d943fdf1da6b58665124897cfc94faa2ca92098838f83e1b1bca \ + --hash=sha256:0bdd4eab935276290ad3cb718e9809412895ca6b5b334f5a9111ee6d9aff9377 \ + --hash=sha256:1924e659d6c19c647e763e78670a05dbb7feaf44a0e9c94bf9e14dfc6ba50468 \ + --hash=sha256:33431e84fee02bc84ea36d9e2c4a6d395d479c9dd9bba2376c1f6ee8f3a4e0b3 \ + --hash=sha256:384636b1a64b47814437d1173be1427a7c83681b17a450bfc309a1953e329603 \ + --hash=sha256:6d4281f5bbca041e2292be3380ec56a9413b790579b8e593b1784499d0005dac \ + --hash=sha256:8be07491f6ebe1a693f17d4f11e69d0dc1811fa082736500f649f79df7735303 \ + --hash=sha256:8df0178ba8a9e5bc84fed9cfa61d54601b371fbec5c8eebad27575f1e105c0d4 \ + --hash=sha256:97f7cb9921fbec4904f522d972f0c0e1f4fabbdd4e0287813b21215074a0f160 \ + --hash=sha256:9ccc4316f24409159897799b83004cb1e24f9819b0dcf9c0b68bdcb6cefee6a8 \ + --hash=sha256:b6e06c20c05fe95a3d7302d74e7097756d4ba1247975ad6905441ae1b5b66003 \ + --hash=sha256:c777eb75bb33c47377c9af68f30e9f11bc78e0f07fbf907be4a5d70b2fe5f030 \ + --hash=sha256:ca9609c77ea3b8481ab005da74ed894035936223422dc591d6772b147421f777 \ + --hash=sha256:cf8496728c18f2d0b45198f06895be52f36611711746b7f30c464b422b50e2f5 \ + --hash=sha256:eaa912e0b11848c4d9279a93d7e2783df352b082f40111e078388701fd479e53 \ + --hash=sha256:f35cfccb065fff93529d2afb4a2e89e363fe63ca1e4a5da22b603a85833c2649 \ + --hash=sha256:fc0ed7fe2231a444fc219b9c42d0376e0a9a1a72f16c5cfa0f68d19f1a0663e8 + # via policyengine-core +ptyprocess==0.7.0 \ + --hash=sha256:4b41f3967fce3af57cc7e94b888626c18bf37a083e3651ca8feeb66d492fef35 \ + --hash=sha256:5c5d0a3b48ceee0b48485e0c26037c0acd7d29765ca3fbb5cb3831d347423220 + # via pexpect +pure-eval==0.2.4 \ + --hash=sha256:260c2774686e651b79f8b8e7fc9d80b3599ea6a66334b47d5f4abb69fc2c0ea1 \ + --hash=sha256:96cae060a313cfaad51bb761278bfb0e62dc0248d9315a81173752dc546cd37a + # via stack-data +py-cpuinfo==9.0.0 \ + --hash=sha256:3cdbbf3fac90dc6f118bfd64384f309edeadd902d7c8fb17f02ffa1fc3f49690 \ + --hash=sha256:859625bc251f64e21f077d099d4162689c762b5d6a4c3c97553d56241c9674d5 + # via tables +pydantic==2.14.0 \ + --hash=sha256:15fab1bea6f1dc5003b54fc2ecab230c1fd1dbade2acd4addc52d81e32416d4b \ + --hash=sha256:8a51a7aaddd60f55566d1f07bdd87b92b463903f39a8f26b71a06314cd1548ae + # via blosc2 +pydantic-core==2.50.0 \ + --hash=sha256:00963fde61cf8880d9e7b5635a9830e0591edfa45168447fdc5b47635c0f6437 \ + --hash=sha256:01340f4fbb4f854b1f36a6fe9dcd2b26c8936aead4e4ad1205624ac025c875fc \ + --hash=sha256:02ec3675d606a355523e1c52bf5aa4116776f8d273dba03d8336a5a3ae984e15 \ + --hash=sha256:031867348c98ab49c6d3a16ad39738369ea48da59900d76d71c1e64de71fe79b \ + --hash=sha256:0393763d66f6f61715488d074a2cefac04aeb3ee281e36fb4925dd44deaf9e17 \ + --hash=sha256:049b0404792dcb942f1092bfdae5f819ef30445b0d174782e1909fbdd91bb48b \ + --hash=sha256:0abe1b44d361b948404b6b2ed80be2583e0077340572e071afa6e0eda4e1de30 \ + --hash=sha256:0def1dc09802a790e4a1b3cbc4401f0b53c58f273ce3671df9867f7bdf1fbe20 \ + --hash=sha256:0fdeda6272d60b1f6fb63f6a3dade55e274af62e1514d24a6549a12150c385cc \ + --hash=sha256:1541c334af5d42cb9eb03862a9b4d2cfbfc670fd05172ec51f3ce02d704550f1 \ + --hash=sha256:158749408ee19682b8a2a7e7135cced7f41d6f2f9de96088b1b1609858a6a158 \ + --hash=sha256:1751e92d56fbb623b937d73985e500b1a2b1053e56f718a6c564660d99bb9cb0 \ + --hash=sha256:1773001198030e16f946a7ff7760fc3ebd45b12150f66fd0f433780043dc13d8 \ + --hash=sha256:17a5ca9c197788a6424749a09a3dce824cb2c17b72f835f8a5e330935b973609 \ + --hash=sha256:1bbd7da16d8b2912cc56c9d0b85c4998a6cbf39b220f81c0d8c397c64672ae0e \ + --hash=sha256:2092ce156f92aff17e3345baba2b7c0c1701f32ba922c5de71bd6248fbe164e3 \ + --hash=sha256:21b62d45f327eb0802f842c132fda6d01a8376a8077922dc4dda69011c64d34a \ + --hash=sha256:21e38a011783d8afc8b9d79928e273d06f349b52ae84edf63ec18ad07f077484 \ + --hash=sha256:23e0940b7d73f405d92e98b2a05b93b16db163be13b7478bb19e1db2e486ade6 \ + --hash=sha256:24302bf47319a64e5c5c7c29e971d2b7a20a190c64e59035a3df9582dec636fa \ + --hash=sha256:243088c95e23b12db9f2cd7661d584a3f00814e087489f40cde7f9feac56b694 \ + --hash=sha256:2568b190075acd058513dca34f7fddc7252fc958c1591cb67a554338fc9a81b2 \ + --hash=sha256:2918547195ffb20118b829fdb8938e9dc92c9527fe6cbe58572594c96362880e \ + --hash=sha256:2f28a5a299d4cefd1066a6883d22600b9ae3606f881c3015d255784634647580 \ + --hash=sha256:34a4a0938eb30931baca56e55786c5a6871ac7aa891a38c8cabcdb7e49dab91b \ + --hash=sha256:350001f5573451150d919722ee095aa28bec037d6e23b86d7f04581a910fe924 \ + --hash=sha256:364f62d8024997536e57865cb1c8b36effad3249bf392a29a2379ea69db28238 \ + --hash=sha256:36c49d4e1769127461b609f110d91963790091ffcc2de401ac1d3b2f6a63bd54 \ + --hash=sha256:36f9ed6ae1069913e4f6e86d8233e119e83e00a20c54f88faf9c81292f2fecc0 \ + --hash=sha256:38b03c5439c6a7a952f56e3e6596dae44bc78c3fb6a69df46cabfb2f888e5f0c \ + --hash=sha256:3b2f3e44af4c6512dd73557621385a71b18094c8be81d60e5a8e73a8ce96b7f4 \ + --hash=sha256:3fce74add1099da1ea09473268950270071fd56773e2968604efb3ab1d240e02 \ + --hash=sha256:41b9f2821f0a105f88cd54ad03fe1392ec600618ffa8610f7c5e466ecd98c531 \ + --hash=sha256:42a56b0052ac11d9d0d87b1c94a1ce52e31914fd133f269585e0f63a4ed988f2 \ + --hash=sha256:42fff617cb0b08505d8123d71e6e7a8e54210d9007498f564855bd843ce984b1 \ + --hash=sha256:468f7e67cfbd8231f442af6726449efe46f2be0e5a57b44fba7ccd92c6f121c4 \ + --hash=sha256:4b1bae96f41806b14dd8bb1568d39b5e33b5af7fb27f7be36c78b8fa84708917 \ + --hash=sha256:4f31af62efd1fd0257735b72e6716b32d4f207654adeabfe524d44baf1bb6bed \ + --hash=sha256:4f96ccd9368ecbf6685d8f6981584ab72b4f0ffd20685e747737e7e340277b8d \ + --hash=sha256:4faa766450ef44d9eabed5b65a280f63f903d1e1ed6d2e278961eb22345ec49f \ + --hash=sha256:50920d66aaab60dbc6023c3035d55fbabfa58b6d205d0b39d47d820c4a7a13a8 \ + --hash=sha256:5307a8bd49158b57a0ca4e10950d31085aa35d9007e934047043ccc6d28eea97 \ + --hash=sha256:55684bc850059fc85ff8dc21a3e342b722d3178993c49ebdfdee8b698a432720 \ + --hash=sha256:56178c4116fc0c859786875ff4acc1c8d52678f095c312b0eff2a2dd9d6f8d5f \ + --hash=sha256:57c0e5b26d82bf31ab2b044781527b1b1a36e9ed400856b6aca5097eb1abb909 \ + --hash=sha256:586699b43066ca6038f96bd71d0eff0b6c292929e3d66ff63d5dc79d0f06d589 \ + --hash=sha256:588d309ce5c85448379556d72011b191c0414ee2e80d7c3f1ebe2ceb2d9027b1 \ + --hash=sha256:593dd4f24abeb3ed90222f98bc6eefcac68cd5aa96fc7745f93862a802952bce \ + --hash=sha256:59f816dc04e99627a5a6352ae51dfb30e603f2cb0b7009c91dc640c533def014 \ + --hash=sha256:5a07c644047f5abc268b4c39f8cb5a30e08a3c349228cb70142c7d3ed87587c0 \ + --hash=sha256:5a8403eef4a66743e339102fb3cdd8c8b9016b8bd67924685893d062c88896f9 \ + --hash=sha256:5d0b210c871486f5acb56d87bf00e3c5d83aab6a1ef3042629fa6ae0172fcf47 \ + --hash=sha256:5dbf9f18c8af11db719e67633be0af556d7d765bee0ca9419bd706fe4b7ed9fe \ + --hash=sha256:610e9f483ac53c5cc59c2d3687224029b54eb494feec2d40a2bcfdd187635192 \ + --hash=sha256:62a93a9d206a3580c975c3c1f65a869cd063844d016c004f8d786a9309b3c591 \ + --hash=sha256:62ec6568896e0abf258cbcd22c406c1c8bf27d16224b21bec8f75c4ae88a8173 \ + --hash=sha256:63263d64884688554fb025a3906c7b00573980cfee75f9afeb86239d577384bc \ + --hash=sha256:68421ba548f6d86c7dededd70bfe530b4faf67eb811c53c70a1be69438d3ce99 \ + --hash=sha256:6e1ec4176c3b56017745937dfd4a3ec6df55f7f0e66991124499f3f79f8f8d1f \ + --hash=sha256:70df7ff903aea05383298715ea53551c8f27c8f70cbe54ba7f05606cd822e7e4 \ + --hash=sha256:71061800a3c225e730f7997f8a7fad6e0d0dcbe36609cdc7e60576a099a2832b \ + --hash=sha256:718d05d4e078c7828f40ad3e310870fe4b837d93a32e7e8497a080c1f1040490 \ + --hash=sha256:732efbb50977ab7cf18f01d4c255834aeb14cb2425459f7bff681a1ba3a4ffa1 \ + --hash=sha256:74cbb6cbd74445ca279668790e0c10eccac0428fd79fe061fce6c9e3982ad3fe \ + --hash=sha256:753863dd4317ec8cc9eb3e6d9d01a8ef1a1726a8003b4354658d68a1ae05f9db \ + --hash=sha256:75b451ec5e64a1d4b803317f34710131742ff2e42f4bf5403f597d0af857d7d8 \ + --hash=sha256:779b6c74526596a86d38248dedaecfb7851bbaf319c234be042c57acddd2c8c4 \ + --hash=sha256:7987866a2569396e6765c54d643fd6a7b3b234e89ee8d45a3729a7b4b2726145 \ + --hash=sha256:79e8fc9c135ef628c45cb8aa5deef8d21de13d33bb4c59a859fa73d335ceb40a \ + --hash=sha256:7eee44c3f1f8acc220a743a5ed5588949a4f18b33df4cfbef2b1277470285401 \ + --hash=sha256:8447678b49412294801c9ea15ae31ea3bae7da65425268c92d40e032c38eac6f \ + --hash=sha256:84d2d38f7d163c4dec292f379e9de1960c661795442aca6c90d706436cb3749e \ + --hash=sha256:8ab9e74878172948e0426e3d27fba333fd6a1c3f9456d8e75643e8e6868ac1a1 \ + --hash=sha256:8ad8dad549cd1645be591a50b4573995ee7e018f6619ddc2bc6ea44b2ad9f694 \ + --hash=sha256:8b16e164205a90b1050d2f5469f8a7829db7698ad198c69e6aab6cbfb5648b87 \ + --hash=sha256:8f16bc5bb12f4c581b0f40facc28dbf286db32d1bf4e7e4f4c4e0f7f4e34ecf9 \ + --hash=sha256:8facaf0a16121ac82cc403a71399a061b74624c1ae2034eec9ed6169c5d16ecb \ + --hash=sha256:90874428bc6678b26434336c77931c9734ecebedf50132c179205e5a9908761d \ + --hash=sha256:92016718bcf3e6f35a6bd986880191a8da7a35aa1f5b1e97544582ef938464cf \ + --hash=sha256:9279f4be22bc3765dd9f61f5b4d38d9cb219d167bbd6f2e0ffa3368b1b71b4d1 \ + --hash=sha256:933f2d639eb81a3e1f145aec415453cc00983236629933f028d9507222583a2e \ + --hash=sha256:93502b3c762149a5904316ef52f0ed1ea721e0f4c8431f964f140ed15fa61926 \ + --hash=sha256:955d7878130dfc124d6a5343e1b87d2933244fe14a4a0a3e98787e8e660a8eb4 \ + --hash=sha256:980c81c2ec53ea9eb2227c14b3e6de35670b2de163b638f2a803e90a3bd5bbb0 \ + --hash=sha256:99e203d5c2a814facef78dcd993b0fb7a933124a3475a38979fc09cceae210b7 \ + --hash=sha256:a2b88f9f9fa52e1c34938ff1a18ee7fbffe482df0bb43c087a9a60578d273d68 \ + --hash=sha256:a3e8ee6386f6b68e2f818ccf422ccfafc59bcff10862b52c7819db3aa0352dfc \ + --hash=sha256:a7080928078ff56c07da393392f772054e93a39c8033dc9c04547bd949f9b614 \ + --hash=sha256:a8ee3965e01f10e4ff92ba1727626328ab7ba93bcd5674ff2b78ea1048ee0cea \ + --hash=sha256:ab3f95f737fc1b258b8210308fc02ce1442cf5950cf6d30b09ad89ab9e8afebd \ + --hash=sha256:ac223ea031905319a64d0df116979ae438b42d6265862a3d63c9f9808c2905a7 \ + --hash=sha256:ad3532291deedfdfcad3cf5d351d0076d646c68a0c63869a1bebf87c22159600 \ + --hash=sha256:ad9185366893714cd4514ae5e1a098227704fa395cb41a7855d75968ecedc826 \ + --hash=sha256:ae45853d25a23fba56681d2f9ed41f3e3f12f0a3b2393fefa08ff6406320a1f5 \ + --hash=sha256:af2b808a79bb04075e87c81a5b6179365b93f9a851f29dafd67abff72085d0c8 \ + --hash=sha256:b123f9d8702106f39dc3af63a031ca8b5279862a3747ec6c03ca49dbe78b71b9 \ + --hash=sha256:b1399f918aea8fb76ffa99b474c9b768accea1f079fde407ee538bec89f20fa7 \ + --hash=sha256:b916ff828d604d4311a5639b7b3da51eaea3923833ec3e300a5ee35eade99691 \ + --hash=sha256:b9be297ffe1015bfb2db4a23b6e1fec7e48361cf7c7b4f4f6bbdd008451b0a7b \ + --hash=sha256:bc87bd34239835c8d73171acd039e591cea0a2ca8615e6188044ad170a40fca1 \ + --hash=sha256:bd841dcf394ff261c26763a9d7be754176d4f1e6d26cb2a5d5331e91b6b56a5f \ + --hash=sha256:bdd70c2d9e73bca09fad54605dfeaae2b4e770b2800c65f5f5342901ed567b9f \ + --hash=sha256:c05b75ef3574c9ee4e05bbcf8513f7ccb155d426514be9efef5f6f53152d5f5c \ + --hash=sha256:c05d035e72530f6b00297941b0162218601542b76870c3bf2756bd87f16fc538 \ + --hash=sha256:c19500343957f254ecf3e60174f4a4cdd21690e0e1677740a8017d28ab2a2a4b \ + --hash=sha256:c21e6a6e4e6d32fb6acbc4f0fa69e8319cac0d65eeaa8298d757371cc2a9c687 \ + --hash=sha256:c2b246fa7cbdf9918488d1542a82bbb928cf71bcba66905c24131981e759ff0b \ + --hash=sha256:c2e97985641fe53ad7824d1b5bfeb7990a5ff788c4559ee44d7522642560ddc2 \ + --hash=sha256:c3ae59461625518449f800acc4f874753ae96fcf993c47a27be07beb651371fd \ + --hash=sha256:c4abc425789f8540e86ca4cfdbc8dc650433cc2ac7c6136fee9bcb29d5665a02 \ + --hash=sha256:cb4fcaabb28cabf21396a9b816b9afe091f8c776805fdf03e2cbc606b64dfa7c \ + --hash=sha256:cbce1b5a2a88a465d7865df61b7e4f8829ddc49b4fa841e9b241815c9d67c3b2 \ + --hash=sha256:cf150693a51ca21e8288cd08a9de05e5ab331776dfcfd0537b14523338f0502a \ + --hash=sha256:cf81432281af66ba3285b26b09c2d478d84730dc50ff90926c1bdcef54048a33 \ + --hash=sha256:d01029d54ff1f45c195b1f7e6fbf6e58fb7e7e12cda9a6e639570d9c581decb2 \ + --hash=sha256:d06dbbfe8da01a0574de27afc19915bb3e7dddfbd184bb97e958f94051d8531b \ + --hash=sha256:d14d04058923d526a552fc3ebe8b0b0353c19516431cee196502b53119278fd9 \ + --hash=sha256:d187f43d1c5b844adc871c5b8c22b4aa12a116aaca4e9bd1521bc9ce479aae1f \ + --hash=sha256:d1d084e92d0f4a096a5155b23d1ac603db8073ef98a3d1384badf1455e5ae742 \ + --hash=sha256:d8354fbbe2abf0fb724b9303bef43bfd9b7a2779332813fa6d6559983954e7d8 \ + --hash=sha256:dcbd1fe5083315243447c13f7252ae9fe9d128b1ae2857e3a916c609235dd863 \ + --hash=sha256:dec0dafc116ac29a84d143fdbc3b83fdb5d4ed339276be2251154537ab30e14d \ + --hash=sha256:e15bb1535f68a27f28e579ba3a8f74e7b05d350c45f5622b76a311d5a19ae48a \ + --hash=sha256:e41f9d1d9240e8e0d8a670ad3e66c0c00f0b1f7150a31bc6c445a4f87c1cb3ba \ + --hash=sha256:e58acd43ac8d3905659c1d5309318dd576243e723dd7c3b5dd4f555479b77d4b \ + --hash=sha256:eadf95aab7301ac651628f097e521d742d0fb5f732155ebfd00d07933045d81c \ + --hash=sha256:ec786cb9d597dd75d993f8c1273e31bb2114c9bc22f67fba611e654e8347701b \ + --hash=sha256:ed557fa2744617eac3e34dd39b85037efbf23cd33f06851c00fdb8f18ad8f4c2 \ + --hash=sha256:ee9913fa2b5bfa6111c11158cf481bb13544f8bd5d10382fb6ee2612b16fcf28 \ + --hash=sha256:f0af2d2f745ec00a6616c4dfba4477f9156ccfb45690f6ffa5fd34f42e871ed4 \ + --hash=sha256:f12d9690634414fc04b1a7072fdc35c34a9242232c1851fe4518383578bb09d4 \ + --hash=sha256:f187030fc3d62c668feb0f09e92852e0eb414d7fcefc4748f2e67d245aade37e \ + --hash=sha256:f3abcabb04503023e1053add24472e78878de0bfd5c8a93686be01f4032c363c \ + --hash=sha256:f44107b5fdfecc03438feb165431652c8006650471326e53dd86d4c19124f5c5 \ + --hash=sha256:f517a417cd02aa8fb05b603a0ac6d87b7b004c3ba4fcd279cad25cab7229043b \ + --hash=sha256:f8cc61ad94215ab98e5cbcdea2cfde45e11bb0136ee980e1240b721635e55790 \ + --hash=sha256:f8df36f964c21168e345f914855e3b428e2cb6e1f739c8ef5963b77d86dd84ae + # via pydantic +pygments==2.21.0 \ + --hash=sha256:2363c69b61c4a97c838da3b130dcd6468f4848992b21a82f2a63ec34377137d9 \ + --hash=sha256:610ca751c9bc2492b38eb9a38a7fbc93edbbb2d7182edaf34e66ae493dee5c8c + # via + # ipython + # pytest +pyparsing==3.3.3 \ + --hash=sha256:928ae7e20211f3b6f3915a72f06a0cfd29ab9d24279dd6346b6b1a7146397d36 \ + --hash=sha256:ece8c00a69cf01b45d0b1dedabb469c90d8caf996d4fda40f147627a122849a4 + # via matplotlib +pytest==8.4.2 \ + --hash=sha256:86c0d0b93306b961d58d62a4db4879f27fe25513d4b969df351abdddb3c30e01 \ + --hash=sha256:872f880de3fc3a5bdc88a11b39c9710c3497a547cfa9320bc3c5e62fbf272e79 + # via policyengine-core +python-dateutil==2.9.0.post0 \ + --hash=sha256:37dd54208da7e1cd875388217d5e00ebd4179249f90fb72437e91a35459a0ad3 \ + --hash=sha256:a8b2bc7bffae282281c8140a97d3aa9c14da0b136dfe83f850eea9a5f7470427 + # via + # matplotlib + # pandas +pytz==2026.5 \ + --hash=sha256:e658af3757f9e26a9d25dd2aff38335acd92bc9104f890a894b2c1ba28311b03 \ + --hash=sha256:fa23724b9c486543b9ff54a327ee7569ac83ade54bb9afd0fc18676620401c86 + # via pandas +pyvis==0.3.2 \ + --hash=sha256:5720c4ca8161dc5d9ab352015723abb7a8bb8fb443edeb07f7a322db34a97555 + # via policyengine-core +pyyaml==6.0.3 \ + --hash=sha256:00c4bdeba853cc34e7dd471f16b4114f4162dc03e6b7afcc2128711f0eca823c \ + --hash=sha256:0150219816b6a1fa26fb4699fb7daa9caf09eb1999f3b70fb6e786805e80375a \ + --hash=sha256:02893d100e99e03eda1c8fd5c441d8c60103fd175728e23e431db1b589cf5ab3 \ + --hash=sha256:02ea2dfa234451bbb8772601d7b8e426c2bfa197136796224e50e35a78777956 \ + --hash=sha256:0f29edc409a6392443abf94b9cf89ce99889a1dd5376d94316ae5145dfedd5d6 \ + --hash=sha256:10892704fc220243f5305762e276552a0395f7beb4dbf9b14ec8fd43b57f126c \ + --hash=sha256:16249ee61e95f858e83976573de0f5b2893b3677ba71c9dd36b9cf8be9ac6d65 \ + --hash=sha256:1d37d57ad971609cf3c53ba6a7e365e40660e3be0e5175fa9f2365a379d6095a \ + --hash=sha256:1ebe39cb5fc479422b83de611d14e2c0d3bb2a18bbcb01f229ab3cfbd8fee7a0 \ + --hash=sha256:214ed4befebe12df36bcc8bc2b64b396ca31be9304b8f59e25c11cf94a4c033b \ + --hash=sha256:2283a07e2c21a2aa78d9c4442724ec1eb15f5e42a723b99cb3d822d48f5f7ad1 \ + --hash=sha256:22ba7cfcad58ef3ecddc7ed1db3409af68d023b7f940da23c6c2a1890976eda6 \ + --hash=sha256:27c0abcb4a5dac13684a37f76e701e054692a9b2d3064b70f5e4eb54810553d7 \ + --hash=sha256:28c8d926f98f432f88adc23edf2e6d4921ac26fb084b028c733d01868d19007e \ + --hash=sha256:2e71d11abed7344e42a8849600193d15b6def118602c4c176f748e4583246007 \ + --hash=sha256:34d5fcd24b8445fadc33f9cf348c1047101756fd760b4dacb5c3e99755703310 \ + --hash=sha256:37503bfbfc9d2c40b344d06b2199cf0e96e97957ab1c1b546fd4f87e53e5d3e4 \ + --hash=sha256:3c5677e12444c15717b902a5798264fa7909e41153cdf9ef7ad571b704a63dd9 \ + --hash=sha256:3ff07ec89bae51176c0549bc4c63aa6202991da2d9a6129d7aef7f1407d3f295 \ + --hash=sha256:41715c910c881bc081f1e8872880d3c650acf13dfa8214bad49ed4cede7c34ea \ + --hash=sha256:418cf3f2111bc80e0933b2cd8cd04f286338bb88bdc7bc8e6dd775ebde60b5e0 \ + --hash=sha256:44edc647873928551a01e7a563d7452ccdebee747728c1080d881d68af7b997e \ + --hash=sha256:4a2e8cebe2ff6ab7d1050ecd59c25d4c8bd7e6f400f5f82b96557ac0abafd0ac \ + --hash=sha256:4ad1906908f2f5ae4e5a8ddfce73c320c2a1429ec52eafd27138b7f1cbe341c9 \ + --hash=sha256:501a031947e3a9025ed4405a168e6ef5ae3126c59f90ce0cd6f2bfc477be31b7 \ + --hash=sha256:5190d403f121660ce8d1d2c1bb2ef1bd05b5f68533fc5c2ea899bd15f4399b35 \ + --hash=sha256:5498cd1645aa724a7c71c8f378eb29ebe23da2fc0d7a08071d89469bf1d2defb \ + --hash=sha256:5cf4e27da7e3fbed4d6c3d8e797387aaad68102272f8f9752883bc32d61cb87b \ + --hash=sha256:5e0b74767e5f8c593e8c9b5912019159ed0533c70051e9cce3e8b6aa699fcd69 \ + --hash=sha256:5ed875a24292240029e4483f9d4a4b8a1ae08843b9c54f43fcc11e404532a8a5 \ + --hash=sha256:5fcd34e47f6e0b794d17de1b4ff496c00986e1c83f7ab2fb8fcfe9616ff7477b \ + --hash=sha256:5fdec68f91a0c6739b380c83b951e2c72ac0197ace422360e6d5a959d8d97b2c \ + --hash=sha256:6344df0d5755a2c9a276d4473ae6b90647e216ab4757f8426893b5dd2ac3f369 \ + --hash=sha256:64386e5e707d03a7e172c0701abfb7e10f0fb753ee1d773128192742712a98fd \ + --hash=sha256:652cb6edd41e718550aad172851962662ff2681490a8a711af6a4d288dd96824 \ + --hash=sha256:66291b10affd76d76f54fad28e22e51719ef9ba22b29e1d7d03d6777a9174198 \ + --hash=sha256:66e1674c3ef6f541c35191caae2d429b967b99e02040f5ba928632d9a7f0f065 \ + --hash=sha256:6adc77889b628398debc7b65c073bcb99c4a0237b248cacaf3fe8a557563ef6c \ + --hash=sha256:79005a0d97d5ddabfeeea4cf676af11e647e41d81c9a7722a193022accdb6b7c \ + --hash=sha256:7c6610def4f163542a622a73fb39f534f8c101d690126992300bf3207eab9764 \ + --hash=sha256:7f047e29dcae44602496db43be01ad42fc6f1cc0d8cd6c83d342306c32270196 \ + --hash=sha256:8098f252adfa6c80ab48096053f512f2321f0b998f98150cea9bd23d83e1467b \ + --hash=sha256:850774a7879607d3a6f50d36d04f00ee69e7fc816450e5f7e58d7f17f1ae5c00 \ + --hash=sha256:8d1fab6bb153a416f9aeb4b8763bc0f22a5586065f86f7664fc23339fc1c1fac \ + --hash=sha256:8da9669d359f02c0b91ccc01cac4a67f16afec0dac22c2ad09f46bee0697eba8 \ + --hash=sha256:8dc52c23056b9ddd46818a57b78404882310fb473d63f17b07d5c40421e47f8e \ + --hash=sha256:9149cad251584d5fb4981be1ecde53a1ca46c891a79788c0df828d2f166bda28 \ + --hash=sha256:93dda82c9c22deb0a405ea4dc5f2d0cda384168e466364dec6255b293923b2f3 \ + --hash=sha256:96b533f0e99f6579b3d4d4995707cf36df9100d67e0c8303a0c55b27b5f99bc5 \ + --hash=sha256:9c57bb8c96f6d1808c030b1687b9b5fb476abaa47f0db9c0101f5e9f394e97f4 \ + --hash=sha256:9c7708761fccb9397fe64bbc0395abcae8c4bf7b0eac081e12b809bf47700d0b \ + --hash=sha256:9f3bfb4965eb874431221a3ff3fdcddc7e74e3b07799e0e84ca4a0f867d449bf \ + --hash=sha256:a33284e20b78bd4a18c8c2282d549d10bc8408a2a7ff57653c0cf0b9be0afce5 \ + --hash=sha256:a80cb027f6b349846a3bf6d73b5e95e782175e52f22108cfa17876aaeff93702 \ + --hash=sha256:b30236e45cf30d2b8e7b3e85881719e98507abed1011bf463a8fa23e9c3e98a8 \ + --hash=sha256:b3bc83488de33889877a0f2543ade9f70c67d66d9ebb4ac959502e12de895788 \ + --hash=sha256:b865addae83924361678b652338317d1bd7e79b1f4596f96b96c77a5a34b34da \ + --hash=sha256:b8bb0864c5a28024fac8a632c443c87c5aa6f215c0b126c449ae1a150412f31d \ + --hash=sha256:ba1cc08a7ccde2d2ec775841541641e4548226580ab850948cbfda66a1befcdc \ + --hash=sha256:bdb2c67c6c1390b63c6ff89f210c8fd09d9a1217a465701eac7316313c915e4c \ + --hash=sha256:c1ff362665ae507275af2853520967820d9124984e0f7466736aea23d8611fba \ + --hash=sha256:c2514fceb77bc5e7a2f7adfaa1feb2fb311607c9cb518dbc378688ec73d8292f \ + --hash=sha256:c3355370a2c156cffb25e876646f149d5d68f5e0a3ce86a5084dd0b64a994917 \ + --hash=sha256:c458b6d084f9b935061bc36216e8a69a7e293a2f1e68bf956dcd9e6cbcd143f5 \ + --hash=sha256:d0eae10f8159e8fdad514efdc92d74fd8d682c933a6dd088030f3834bc8e6b26 \ + --hash=sha256:d76623373421df22fb4cf8817020cbb7ef15c725b9d5e45f17e189bfc384190f \ + --hash=sha256:ebc55a14a21cb14062aa4162f906cd962b28e2e9ea38f9b4391244cd8de4ae0b \ + --hash=sha256:eda16858a3cab07b80edaf74336ece1f986ba330fdb8ee0d6c0d68fe82bc96be \ + --hash=sha256:ee2922902c45ae8ccada2c5b501ab86c36525b883eff4255313a253a3160861c \ + --hash=sha256:efd7b85f94a6f21e4932043973a7ba2613b059c4a000551892ac9f1d11f5baf3 \ + --hash=sha256:f7057c9a337546edc7973c0d3ba84ddcdf0daa14533c2065749c9075001090e6 \ + --hash=sha256:fa160448684b4e94d80416c0fa4aac48967a969efe22931448d853ada8baf926 \ + --hash=sha256:fc09d0aa354569bc501d4e787133afc08552722d3ab34836a80547331bb5d4a0 + # via + # policyengine-taxsim (pyproject.toml) + # huggingface-hub +requests==2.34.2 \ + --hash=sha256:2a0d60c172f83ac6ab31e4554906c0f3b3588d37b5cb939b1c061f4907e278e0 \ + --hash=sha256:f288924cae4e29463698d6d60bc6a4da69c89185ad1e0bcc4104f584e960b9ed + # via + # blosc2 + # census + # policyengine-core + # spm-calculator +six==1.17.0 \ + --hash=sha256:4721f391ed90541fddacab5acf947aa0d3dc7d27b2e1e8eda2be8970586c3274 \ + --hash=sha256:ff70335d468e7eb6ec65b95b99d3a2836546063f63acc5171de367e834932a81 + # via python-dateutil +sortedcontainers==2.4.0 \ + --hash=sha256:25caa5a06cc30b6b83d11423433f65d1f9d76c4c6a0c90e3379eaa43b9bfdb88 \ + --hash=sha256:a163dcaede0f1c021485e957a39245190e74249897e2ae4b2aa38595db237ee0 + # via policyengine-core +spm-calculator==0.3.1 \ + --hash=sha256:41f2f4d00d8c03422a7d57b800052e7760b88e463a5884802f83ed58d35c18c1 \ + --hash=sha256:52c57ecc5a240ec941b0f2b0d93bc4fa437ef6250e233baed8e11916fa9c1150 + # via + # policyengine-taxsim (pyproject.toml) + # policyengine-us +stack-data==0.6.3 \ + --hash=sha256:836a778de4fec4dcd1dcd89ed8abff8a221f58308462e1c4aa2a3cf30148f0b9 \ + --hash=sha256:d5558e0c25a4cb0853cddad3d77da9891a08cb85dd9f9f91b9f8cd66e511e695 + # via ipython +standard-imghdr==3.13.0 \ + --hash=sha256:30a1bff5465605bb496f842a6ac3cc1f2131bf3025b0da28d4877d6d4b7cc8e9 \ + --hash=sha256:8d9c68058d882f6fc3542a8d39ef9ff94d2187dc90bd0c851e0902776b7b7a42 + # via policyengine-core +tables==3.10.1 \ + --hash=sha256:01ca51624bca1a87e703d6d6b796368bc3460ff007ea8b1341be03bedd863833 \ + --hash=sha256:09190fb504888aeacafb7739c13d5c5a3e87af3d261f4d2f832b1f8407be133a \ + --hash=sha256:203ed50c0c5f30f007df7633089b2a567b99856cd25d68f19d91624a8db2e7ad \ + --hash=sha256:2ecabd7f459d40b7f9f5256850dd5f43773fda7b789f827de92c3d26df1e320f \ + --hash=sha256:34357d2f2f75843a44e6fe54d1f11fc2e35a8fd3cb134df3d3362cff78010adb \ + --hash=sha256:40a4ee18f3c9339d9dd8fd3777c75cda5768f2ff347064a2796f59161a190af8 \ + --hash=sha256:4aa07ac734b9c037baeaf44aec64ec902ad247f57811b59f30c4e31d31f126cf \ + --hash=sha256:6fc5b46a4f359249c3ab9a0a0a2448d7e680e68cffd63fdf3fb7171781edd46e \ + --hash=sha256:757c6ea257c174af8036cf8f273ede756bbcd6db5ac7e2a4d64e788b0f371152 \ + --hash=sha256:77f0e6dd45b91d99bf3976c8655c48fe3816baf390b9098e4fb2f0fdf9da7078 \ + --hash=sha256:9372516c76be3a05a573df63a69ce38315d03b5816d2a1e89c48129ec8b161b0 \ + --hash=sha256:a7090af37909e3bf229d5599fa442633e5a93b6082960b01038dc0106e07a8da \ + --hash=sha256:b62881cb682438d1e92b9178db42b160638aef3ca23341f7d98e9b27821b1eb4 \ + --hash=sha256:bca9d11a570ca1bc57f0845e54e55c3093d5a1ace376faee639e09503a73745b \ + --hash=sha256:d90542ec172d1d60df0b796c48ad446f2b69a5d5cd3077bd6450891b854d1ffb \ + --hash=sha256:e36ce9f10471c69c1f0b06c6966de762558a35d62592c55df7994a8019adaf0c \ + --hash=sha256:f233e78cc9fa4157ec4c3ef2abf01a731fe7969bc6ed73539e5f4cd3b94c98b2 \ + --hash=sha256:f8917262a2bb3cd79d37e108557e34ec4b365fdcc806e01dd10765a84c65dab6 \ + --hash=sha256:f93f6db623b484bb6606537c2a71e95ee34fae19b0d891867642dd8c7be05af6 \ + --hash=sha256:f9cf1bfd8b0e0195196205fc8a134628219cff85d20da537facd67a291e6b347 + # via policyengine-us +tenacity==9.2.1 \ + --hash=sha256:9e56f17539296baab7beabb08b92f6ee3d7be92d8be72d763360677c2ad6580e \ + --hash=sha256:a606b5c808d0cded4a359d5b9932d867ff2a6a6b64d37350260fd01bbdf83839 + # via plotly +threadpoolctl==3.7.0 \ + --hash=sha256:61348cfb77d53b9242e0017029244b559b810c142ced65b4e21eeca1843959a7 \ + --hash=sha256:cd8b60b5641b45c67bbf73c64c843235fc2d8a480c87389f52f5dbee893b86be + # via blosc2 +tomli==2.5.0 \ + --hash=sha256:069435bd5480429b98c5e5afb02ab21c219b6f0064680671c6dc0d46817346ea \ + --hash=sha256:0dc598040da8d42cf20f0be588ed7004f46db12a0ac6c32e03a59dccedaaadcd \ + --hash=sha256:1245a6638fc4bb0a60af38a7d45413db34a13842027c77597c712c998c62fdf0 \ + --hash=sha256:19b0dd8749f4ea2f112c5fcfb3c5248390c899d7e2e173f1d91abee1fa0ff391 \ + --hash=sha256:1f4a40d03fb9f63424f0979855bdeaf44dd7696b8d59501822c10ed30ba532df \ + --hash=sha256:20aa36de8f2cf87237143bc1fa1aae8d6612c09118f4da21c6a684db5dd1f6f9 \ + --hash=sha256:21e4cae4114aba25aa0d4f85cdf486d290fb35c0954d7bba536248da64d43066 \ + --hash=sha256:22185fad8a1e622f064e78008018a0dd3323550dcb479cb7a1d296888d74024f \ + --hash=sha256:2419c2a189551987b59d80e63ec355671283336f41c6b9b89462df679c7d0c57 \ + --hash=sha256:264507556cd8b8c8e7c6ee037cdf443a463f03f4c958e57195e3d369711b8ff6 \ + --hash=sha256:32a7b79ac57a2e83670ce329ccf675798bc5a2094783a63676866b70503f2e2b \ + --hash=sha256:3f89d10c1ff6a38d992c27fc8a4816af71a909e08a40ec66934240b1e74347c3 \ + --hash=sha256:463b16086865b97facd8d0b3fb4cb7c544e3f58d2a69dc3113d6db9653fdb043 \ + --hash=sha256:49096930c8d886c9bbdab62d2d0d17ce823ddeea522309a190b36245d5b49e01 \ + --hash=sha256:521345fd1f19d45b8df87657aaa38b6f2ca3800059fadf428e7ebf479a383646 \ + --hash=sha256:57b1c3b01fab802e2899bc3d168dca320e14165e2fd9fd584760fb4ca5826859 \ + --hash=sha256:5d8bac3d603c97e6854424e5b2b5b741bdbde387e09f162fb0446812b4a8362b \ + --hash=sha256:610b27d99f28ec5f191c7064a48f3ddb179a1fe6ca73d571483ae859f57b605e \ + --hash=sha256:61ea1ebe1e55a34ea8199cc8dbff398d35027b82271c8ac4802fd3a1fd5b1bcc \ + --hash=sha256:62fc1bc8eb03e3a9cadfca713d65614ed8e09d974a283295ffe3a831976b4dc5 \ + --hash=sha256:6664b7ae7af7294256c53960a6103077f4914cec8ff98479c352f622c6f6b2f0 \ + --hash=sha256:667e521b37a6c5ccaa044202c235b530f90177ffe2cd4a64ecc213c7dd535feb \ + --hash=sha256:69491c143d2fe063046e0301e62a810bed338fa4d1ce0fd870c27dc1e09b0d84 \ + --hash=sha256:6cf74416bdc94ae458b14e37286c1073081850ac8459a00d0c5efef5d44294c6 \ + --hash=sha256:6e95c7614e705bfe2b04b27aa124adec59752d15813df37e2156747cab3a006b \ + --hash=sha256:6f041843c4d3a37245c0c056fd955b186bf8b1fb85690cbe40b81230891dc34b \ + --hash=sha256:752e8b1aa6a4367ef8bf6a1a1e005540f7ed055ba36d7193796812ca5404eb52 \ + --hash=sha256:75dbcde8751b0a960aa3de173aa5e894d590755c6d7758b7e774c06f1dc3cbdd \ + --hash=sha256:7ac2027d37c3afbdf4bdd377f2676f6f1d2122a5be1f1137b49dced590b37e75 \ + --hash=sha256:7ad1ea345759240d6463efa0ed1c704402752e49aa21476620738d74d72d8aa1 \ + --hash=sha256:86665cee9c4835b7a7f1e8ec2c719b5258d4dc782887aded5a8ae7352a96843b \ + --hash=sha256:8ff3a2ca028c7eee0c777f9a092038d0a594a9fa04e215f929a22c329e2cb142 \ + --hash=sha256:91294a9fb94a75542f6e46e4a2ae709bd8d9b51134098cae5cf3bea5478b6d03 \ + --hash=sha256:943276cf269e0071948d9ff697159c1735e623c1151d88abb09b74659ef0cbea \ + --hash=sha256:96243987194634bd411066ce40c952e108f86af04db533ecd8ac3ff2a85b1885 \ + --hash=sha256:984012f71908165449a951de2050d52f276bfe3aa5d5f570f63ddad814370374 \ + --hash=sha256:9b03d7dc168353b4132965bde20feceabaa470e570c6f59660dfae59b1f9eeb3 \ + --hash=sha256:9dbb18c1cfb2f6517942fc9314437f66aa06d94436ffb1f06102ef3572f35276 \ + --hash=sha256:9ebf8d19b17bd0daeb7b7dec81a946a439b753942fd0210d6e96c532249eea6b \ + --hash=sha256:a525685c2f97da40762b8695eb7aa0af4c8344ca1905c73e4e29cb04d34607dc \ + --hash=sha256:abdbf6313b8d9efe157edeb7ab6eae4de064b1300ad31abf73755154b30abe68 \ + --hash=sha256:b69564772b5c8f22ea5f498dff08cfa825045b4d4c4400529000bdf818aa3b2a \ + --hash=sha256:b8ade5023067f99fe72b88accd30d0ea05a158e9e32a11f124e731ea9695313f \ + --hash=sha256:bbaefc84548d754be821bba7c4141c4787dda182f9e77f2f87b71213529efa7b \ + --hash=sha256:bd05de8c1698f8413dd7d869492693a0bf2211543b787ac78cd5e7536af1a6d7 \ + --hash=sha256:bf0b5e8e0f68ebb494356e577c06c139161efd8d3b9050f93b39b7c26cc54ff0 \ + --hash=sha256:c414be4ed9d3cac80c42e348fa5a956117d1a48227f48026e31f59cb4a7671eb \ + --hash=sha256:c47300f9bf791808f77d82747691c4bb09cb14bdf3060cca99b42cdc4361d5a7 \ + --hash=sha256:c4dc1c1781f2f716de763d1e9a7b34c6a894e167e291c7c5d16c72f7a9538545 \ + --hash=sha256:c804ae44fe7b4bab5da295e4f980a1ff04670bca9d23fe0a4e887e08ebd741a8 \ + --hash=sha256:cfac177ebd6236003846ea339981f71457cb6eb748f23381eb257e45092e3980 \ + --hash=sha256:d2ba24db8a9376921b5e87b4762b9adb0f3f1deaea68f2b8b0bb2c11efb9c3e7 \ + --hash=sha256:d3182ee2d887e507bd67319a0a61105d1dd33facc111329559a233b772c1a105 \ + --hash=sha256:d747252933c8a65ef6bd8da0fbb7ce28a90eb6119d8cd00772cd528aa07b68d5 \ + --hash=sha256:d7e369fd63331746182360977b1892bfc215476a30d61612d732425311639f56 \ + --hash=sha256:e12bbcd32897272fb05929110362ae9ff4c1b9bb26bd9e971e71dcd3275b4c3d \ + --hash=sha256:e7ad033e27a516a233bea839cdb77b80146facb3b4f40bf02cd0cac165cdd5c2 \ + --hash=sha256:e9e15b4a6c7dd6b85b5fbab29488a73f1f70de516942308daa266bf0e0aeb0d4 \ + --hash=sha256:ed53f7e89bb04f6d9e8e7799112360b0c4d5cbff067de0814c98c37c39b920f7 \ + --hash=sha256:eff8babca5a7999bc137acbc7482a8b7e17ffca5075ab41f5d770ab408c7bfef \ + --hash=sha256:f15e3e0b835a6d68b10c86bf80a3149780498d6911c93c3ffd1861d19f9200f1 \ + --hash=sha256:f3fcbc57b1791fa6cbe5d8434179d51de12be1a4811469529f47f6e7487a2571 \ + --hash=sha256:f4b653094e18f9031102d3a1da5c729c8f222d85225b18037dac621695e46e1a \ + --hash=sha256:f79203b3965b4000e91808aaa7c040206093f2b8bf86f455982f2274c9ccf442 \ + --hash=sha256:fd4dc129784e0c5335bd4e61dfcc4487499a013419e655cf2da1d091b7e0efdc + # via + # huggingface-hub + # pytest +tqdm==4.70.1 \ + --hash=sha256:c293e525e6fef9c20e8728fd4612df02a0aa31bb5fe91ecd93e123b1b7bffa73 \ + --hash=sha256:cefd0eca11b2a37a3aee776544d4f4ae913f02688135b5556b8788dfa474afc4 + # via + # policyengine-taxsim (pyproject.toml) + # huggingface-hub + # policyengine-us +traitlets==5.16.1 \ + --hash=sha256:ed900c2b631aa3a112811139fa97b8d2c3bad5e989656bba4b7e52c7852c18c1 \ + --hash=sha256:f775618166caa0396c8e337099240f2bd3e5e917d203b2e6fbe21a58d3cb1f6b + # via + # ipython + # matplotlib-inline +truststore==0.10.4 \ + --hash=sha256:9d91bd436463ad5e4ee4aba766628dd6cd7010cf3e2461756b3303710eebc301 \ + --hash=sha256:adaeaecf1cbb5f4de3b1959b42d41f6fab57b2b1666adb59e89cb0b53361d981 + # via + # httpcore2 + # httpx2 +typing-extensions==4.16.0 \ + --hash=sha256:481caa481374e813c1b176ada14e97f1f67a4539ce9cfeb3f350d78d6370c2e8 \ + --hash=sha256:dc983d19a509c94dba722ee6abd33940f7c05a89e243c47e907eb4db6f1a43e5 + # via + # anyio + # exceptiongroup + # httpx2 + # huggingface-hub + # ipython + # pydantic + # pydantic-core + # tables + # typing-inspection +typing-inspection==0.4.4 \ + --hash=sha256:547274fa6b0a561ccf549cc9524b999a578e737d015d8709d021f9d0d13bea47 \ + --hash=sha256:65b8397ba37ccbce054456aaccddfc91e6e3083c92824df348d96ca832f3f147 + # via pydantic +tzdata==2026.5 \ + --hash=sha256:8cc73c0a0bfca7dbfa59235d60b2eff82231dee33f53d206db1acd9173cfc0a7 \ + --hash=sha256:b683bd1b6659ddcd810ff02ad09ba821d4bf1065072805063eb35c49617905ac + # via pandas +urllib3==2.8.0 \ + --hash=sha256:0cf3cae568d36aa9576b28dfb35f11328f1cb974ca7647d9475ebb86c75ac6e3 \ + --hash=sha256:63bf2ead4c879426ebf22ef2a781eeb4aa3b4ae798a0435506f8687fd5bb9b63 + # via requests +us==4.0.0 \ + --hash=sha256:3e7dd072efc65ecc6f765ced861f49fe7635067e760bbe2a527f16e5477011c0 \ + --hash=sha256:7dd4c4e603c9427b72d7e07be700d8f643bdcd7f5195a12bc639f1b7e38e7496 + # via spm-calculator +wcwidth==0.9.2 \ + --hash=sha256:0a47e03d8293590ecce66c45dc20ff7b4b885e3c78093722239585eca0d77ab2 \ + --hash=sha256:0cd4f7f2e53905dcb110d213a4c8529b6733fa3d232d8c717f946cc69a10349b \ + --hash=sha256:138e1f8898e431b2f2d7881f8ca8d75591c1d3c21aa53f54e989bd6b39811da2 \ + --hash=sha256:196b47cf32f9df27ccda6dc513237f3c2429c4c659db428d60a5bc443d10f270 \ + --hash=sha256:1bf361c8705576760623b4724ae564666d73b016f9a778bcfd1c7345378ef4ec \ + --hash=sha256:2a9746de704242bd4fdaabb31dd46b82f694a56a8d21081ad89b679a89da9fec \ + --hash=sha256:33df042f96c61ed3cd5fb3742fba427553a635bc578799857a48aa79f774a0b9 \ + --hash=sha256:42dbcb76ce8af39e2c9db410ac3f9bdf4e47eb41d6f44525952f172d3d98f724 \ + --hash=sha256:48719a9bc76c2f84238693fe5013571fa5beffa3621cf228f1f3a9e30dae84b8 \ + --hash=sha256:5175609bf8cc7398a5f48aa35207bd64ebf9f45e4c70df65f7fdc7a988041a3c \ + --hash=sha256:59dab4049cbd982b478bca098528df2c79a9160636a3a163ffebffcbd7d1b892 \ + --hash=sha256:674b518af28d38ee645ff97b74f5760abee5fad4bac74413bfc4b881ef2ce724 \ + --hash=sha256:67d901a4ad99249eb775b4ee4769ca97fa405d35a75f46e83166910a47003f04 \ + --hash=sha256:734aa9405b321d1042301aa19c943c4731ee9e3460e4f8feea3299c064c97a14 \ + --hash=sha256:751bef0ab404b6a1dc028b56b4b85d46486be1c55833f80da533e42dc691f389 \ + --hash=sha256:7ef5a940bd5e30bac6e721f1a48fce0cd7bb3ece19e9c5d139e72c76c35cfd07 \ + --hash=sha256:89ca642c5bf0101157a09366be69fad0379db1f700ae39a920e103234573670e \ + --hash=sha256:8b4e381590b9b7390e07e22b2c0c1bb96ce50e1d2243c866d9387600362d51ed \ + --hash=sha256:97b878d1e158da5ed9ac5aac53fa3a55e282103af6a09ec353865613d1a31a76 \ + --hash=sha256:9e542f1f8475b78452a295495d7a5bc3ead565112e9446a64dc93462a41c2a79 \ + --hash=sha256:ae0800c5339423cc53d33a266ad264b42ba8aaa16d4464f6e6b1bee607f50b17 \ + --hash=sha256:ae0ef90b90f6af38b54f1fe6d58662ec33b3cb4b8391958a62416d654231727b \ + --hash=sha256:b9c6ab615e03723b7f8760ea2f27758d656e7e13b51515c9dca5c3e8b04612fa \ + --hash=sha256:bb08ceb501d6aaf94066c3ee122dd825b152df40ff0bd0df4dc27126233b948e \ + --hash=sha256:c3d80f39ba4653a595edae9aa46a509d14883790a8fc23c5db221ceb207f64b7 \ + --hash=sha256:e5f669ae8c3d969c72032f9cdee019674b666e522d45e1e2099a2e9dda4a341d \ + --hash=sha256:eda88ffdc97c0fbf193d407114f2c7a54b379f67f6e52a7531ee3b9fe749eca7 \ + --hash=sha256:ee1fd0db9d9fd711a70f3e7765e0e04c05d26982fa05361456163062549d7da4 \ + --hash=sha256:f2f7b3bba5a5d5f31fc350fd36ce5b84b693c83b7eb95ee630b720da5a5ce06f + # via prompt-toolkit +wheel==0.48.0 \ + --hash=sha256:3217dcc807155e45db462d7ef2431f5ddda0d7273b700d05a67b271ceb1287ab \ + --hash=sha256:94800765601e9171bf5d58d066e640662842bcedcbab982b2c90787a2c987322 + # via policyengine-core diff --git a/docs/dependencies/requirements-py3.11.txt b/docs/dependencies/requirements-py3.11.txt new file mode 100644 index 000000000..5060bb7c9 --- /dev/null +++ b/docs/dependencies/requirements-py3.11.txt @@ -0,0 +1,1885 @@ +# This file was autogenerated by uv via the following command: +# uv pip compile pyproject.toml --python-version 3.11 --python-platform x86_64-manylinux_2_28 --exclude-newer 2026-10-09T19:00:00Z --generate-hashes -o docs/dependencies/requirements-py3.11.txt +annotated-types==0.8.0 \ + --hash=sha256:13b2beaad985e05e2d6407ee4c4f35590b11f8d693a258a561055cac8f64cab7 \ + --hash=sha256:f072f4d804ea359e4eaf198b1af7a8b0943881a87f31bb764f8bf219bb9419e0 + # via pydantic +anyio==4.15.1 \ + --hash=sha256:6152fdbbf9a77fdec97731721bebf7c4c44f7c29b424b0065826173efc7ed101 \ + --hash=sha256:9f28306018cbd6d329e64a36d58256edff76dd996fe423bc957326e578b82a94 + # via + # httpx + # httpx2 +asttokens==3.0.2 \ + --hash=sha256:3ecdbd8f2cc195f53ccada3a613538bb5f9ef6f6869129f13e03c30a677b8fe2 \ + --hash=sha256:9da13157f5b28becde0bd374fc677dcd3c290614264eff096f167c469cd9f933 + # via stack-data +blosc2==4.14.1 \ + --hash=sha256:033e62c56e2815f34900739bd505c750377743657e76cea6ea438c30273767e7 \ + --hash=sha256:08e09c372b3aae159c012c96940694574793b5a00abe3a5bac966c11c88e641e \ + --hash=sha256:3458922f59b6a4b6f5be50192e455647ed3145bd3078c3c77e091b6ac8b64bd2 \ + --hash=sha256:411d9fa31c559f0b016c16611101ccd0e03d38dc89ab1bc94178aa3757ce756a \ + --hash=sha256:439720cca5191a820bba415d076f9440f64b2af84983d3916d7d795dfa27d662 \ + --hash=sha256:575977165dd49b9492d506585e5a2e67a2c6e0f0d450f5a29a9ea3df9a2a53fe \ + --hash=sha256:5d37f2c76272fb6d0ffee3afbbaa4cd73438abd7e2c119d6152bcdf1d47434b3 \ + --hash=sha256:61fcbbdd8b9b8b73e80f0cb363b544ac1ccce0ca7d93087bbf3fa786120455b0 \ + --hash=sha256:696fdfc471191679e6c1b3b2d5db4ae7cc40675e10997d0b5eb6caf7d470253e \ + --hash=sha256:6a2208f001580d497a050aba1a4083d5ba54adbe1e166cee4faf4731f0e96c9a \ + --hash=sha256:7555f3785ff05be952b9cd5f2474764457f1568fcea2bd221d0254f199b61e58 \ + --hash=sha256:783be978d3abd03299922e33a595aa0cca706152aa6fddc95b42472671d495cf \ + --hash=sha256:79b7c096401f75bea1a0f24b28aa8e783cf6c10178cf077f9260a022abb7b245 \ + --hash=sha256:8e0ad358a9fb38d41b0bd1dd08b00f1384774940abd053a74f7e8a80af095a07 \ + --hash=sha256:8e402a0b1caa407e87dc4fc230ccce0f89abe86b3f54c74feff025008327f627 \ + --hash=sha256:94c1e518ee23f4423be80dc7fa16e405364afaefe074472d05785eccd17c56bd \ + --hash=sha256:aec524576f3241f1e411d47e586421e1947c274cd7c715da83b65a81e2c52ead \ + --hash=sha256:b5adb408854260acf64aca5c351ab1307bcb7c71d112e3049d8541c1e2f9b222 \ + --hash=sha256:d2748625f152b66ddfce2f6fe079e22e12179dfe960dff7898838d3ef25776ca \ + --hash=sha256:d5e65efe80740651c3b39a9fd98478f073c57bed51f7eebe1fdfe248dc259e37 \ + --hash=sha256:fb2960ff411e2c1cffa6209932b5ee344fb46208906c3de79e8f23531df82e8a + # via tables +census==0.8.27 \ + --hash=sha256:207aae0f83650004f6b7dab6a730b6a60df96a119f55167260c3153313f15a32 \ + --hash=sha256:6ef36f5d2e7759824e28051bc2c7fa0706d41e153ccb353a6c2d4d9eb354cd7e + # via spm-calculator +certifi==2026.7.22 \ + --hash=sha256:62f22742b58a1a33014a2b6b706588a8d7e2a88ae7bd1a6ebe8c992928483775 \ + --hash=sha256:741e2c3b351ddf169a738da9f2c048608ff7f2c5cc02f1ebc6b118bb090d5d55 + # via + # httpcore + # httpx + # requests +charset-normalizer==3.5.2 \ + --hash=sha256:01077390b03f7988f11d700a2194e69b119741a86b1a638b1db88891e3eced8e \ + --hash=sha256:01b0c0d2262a9e28e8484a278c7e1b5d650e3ac8cf2683d2967e25899f208bdf \ + --hash=sha256:04851f73ae72b8413dddadb16a49dfee95263553741fd42d546f7d66907e6be5 \ + --hash=sha256:0521c5665880b33d603717defa76c094048900010897909952397feb3039da56 \ + --hash=sha256:0774bf9bf620249fee3e0b8b9fd3065de213be30f3aa94ce2494b3b638949e26 \ + --hash=sha256:0891b9d3903c5571c03771ca669a4b0ec5618ca722a5c957d3d29cd4e5062848 \ + --hash=sha256:0c951d5e6dd9c2ff60609476752bee49da4206adde960ebc247766937f72e718 \ + --hash=sha256:0fed1d06615f022ee3b13caf5e8b180cfea32bb2c5aded8a9d44277afc040f93 \ + --hash=sha256:114e4d0c92d618409ed82a99e22b5c5e768fe995f2973f78265f4524f49d4640 \ + --hash=sha256:11912e4bb14baae7c5d8791aa55ba0a3a03ec6729073307b0f57270abaa713d3 \ + --hash=sha256:11a4d68a6ecda3292cb1e50239e111543ba5d709bb62a6b4ea1afcfa729d8875 \ + --hash=sha256:124fbf1a8ff966d87ae05bb8bd45a71f966055ed8bba320d0c7cf450bc5f4d0e \ + --hash=sha256:1461ac396c4fdb983a675f20aa555624f0ee18ac83d832b9244ffff3d8055275 \ + --hash=sha256:1503bccbeb36d5527790c3930327704c39af22de3112f1b1666a9f3ce15ee204 \ + --hash=sha256:15bb4005af6320d259dc7593ca84a38d7fe06a421dbcf7b910ae23979101e787 \ + --hash=sha256:15c44f7edfd477b06f517a5cc317fc1707edb9de2c865f43d4b6513907473234 \ + --hash=sha256:16fa0eccf81304b79c5cd87f9271c3b85dd9dd99245e4422ae9c0dd45e0f99d3 \ + --hash=sha256:183b88127acdb4fabe59d951ab424faf1af7b63cdbb5f776186c1ea2ffcaed98 \ + --hash=sha256:195c26fb65950f8fce54e26349852b7bdd7c5f120aeefbcc440b8a20faaed4a3 \ + --hash=sha256:1afb975bd5d68d5ce9f6b6d44fdf2f7e34b895a35e95708a7a91b20a3b51d187 \ + --hash=sha256:1b4cbc7c3491ccb4aa17fcd8165649d01cf39f76de1696da8631b5f71b85401d \ + --hash=sha256:1bc0baf5ef96b6ede57d47f4b8fe4d9d84019c3bfcbeb20a41edc6a6ee341f1f \ + --hash=sha256:1c50fe28bbc2ced33386f298650d91218076c05420e6cbd790b913adc41659e7 \ + --hash=sha256:1db38f4c5496827c1a501846d64d14c3b80c7e6714e406cd7dc36a9899fa1011 \ + --hash=sha256:211d5a3eb6af8f513b8d4ca19a8c1b7accab1b5f0d3175f9826b03c1a920dc1f \ + --hash=sha256:23851fb4e1b85ed3f6c2a27b777cdfe2e19fb5b38429a8faf38c7542b7665869 \ + --hash=sha256:254eb48b9fa5ee9898a3c445825a1f340fe53712a098904b39b0bddba8ea3cb1 \ + --hash=sha256:2625388c6c754520c37abaf3b41eb34d1cc4a373f457898f08606c8e362b891d \ + --hash=sha256:281cb91036248400f4cc957495cccd44c275c2e0c5854f7e45ac5cf7dc193847 \ + --hash=sha256:28a15fdad492a99b6eccfaaed66ef3f74050680545ea61ec8b2f4c538f1f1320 \ + --hash=sha256:28b4f0d66fb834ff90f28209ac7bce77868c45d8c93e26f906709d9b7c2e1af9 \ + --hash=sha256:2a925889534b3748302dae5dead07cc13480de1dac3aea80a941b729b471ef93 \ + --hash=sha256:2b7b3bbfb4fe8ef40600792d762fbaa9057559f9d3fad209525b7a22b99e91fd \ + --hash=sha256:2c9ad19a6cfcd5ea5c0d41161d22f9df1dcc277e9bef2751391334546a314c00 \ + --hash=sha256:2cc961b171b3f3440f410489ab3573e86aea8736134ebbb40ea1338b7f0831bc \ + --hash=sha256:2ce45c6627b22c47e390bc91a41c3d13032192e699fa0bea96e9671b373d69b0 \ + --hash=sha256:2e06a3a98f916dd41d27f3105e02e7a40181c98c94b9158733d03a6f80506c09 \ + --hash=sha256:304d5463e65a35d7bb0850550e0780395395f6fcf452f04db7d5ca7cecc425ac \ + --hash=sha256:304d8e4d493af723536393eee0c689eb7813f4a474c8b479dee63f1fdd98f621 \ + --hash=sha256:30fcd120b732aa79317f08dee04d7de0847822e4cf7ee0e9f445bb958832252c \ + --hash=sha256:31f3930700408d211f13378ccbe1c40845d8da54bd0681fac3a9b5aae81c7aa8 \ + --hash=sha256:34276fd796040bf0993ab33a369aa572e6979c7aab225a88893667ad8eac8f7a \ + --hash=sha256:355ad8011081dec5412240c087a9a0c9d4d5039f3ed11a3f13e18c2b29b56c51 \ + --hash=sha256:38a873987f3be698494da8b2e3085e29da02da7b633dce73e79c699a113d7bf0 \ + --hash=sha256:39de2a259fc954455c57274dc94c79d5842774e1247a016aff30bc0efed0f4ef \ + --hash=sha256:3d14b50de6bf4d0edf857a9386836846f982b8f524e188e2e68b96d702bcf4aa \ + --hash=sha256:3d21b8b13c7592db2ac5e544a6d83187b995257472b0c9e8351b6d507ae37ed6 \ + --hash=sha256:3d31298449090ab8d47b7b1b2a555ff73cac7ed438a08b7ac160980c7ebed649 \ + --hash=sha256:3ddacd27458c45bdacd6bd6db644bfb730efbf9e830310186e3045c9c5be8fb2 \ + --hash=sha256:3df041de8887954562c9b261cba85ca0e9ded74048daf125f45edcfaa4832229 \ + --hash=sha256:40ab6bffa02ae10a0581e6c198be7d2d8ca5c2a0c64e4ed3465d766df457573e \ + --hash=sha256:4275811936e2f06feff5e598fb42a1b7ae852da8e39605211892b56b81a34efd \ + --hash=sha256:443eae2bf318abeaf6f15d785138f71fd6de770e99a92158b8b814265e079115 \ + --hash=sha256:447441e76ec720b15e64418d32e092297340387053047c7c694f579efb0ee1d9 \ + --hash=sha256:4495c5002a7b28557e7e222e77e0b661183e432b7d6d2e788101e3f240e05b8c \ + --hash=sha256:44bd4fbb29dfbeba60e7d2bd000c59e4b21ddb3cc53912b14048d37092706d7c \ + --hash=sha256:4685902cf26edf013ed7a3da0f426ebba7a00ebb9541386d835afbf002c11cab \ + --hash=sha256:498dc3188ca05a68231ac3fdbfc7f57eb67e1343c30e0fea17f8218c1599b253 \ + --hash=sha256:4c2b5031f63e331e3839b40aed2dd6f191e9c07edbde303e7876846ea1946995 \ + --hash=sha256:4d48f2d08b9de5864e2c8744d4461b862fb149a18274abc8b698c45975573438 \ + --hash=sha256:4f87960d57feabfb618e4e0af6e7371645fa26a277860739d6e5d6e0012c92f0 \ + --hash=sha256:50e3adfb96fc189eb27b1cf62d3b598b89b4bb0420d93a3d3e42e137409011be \ + --hash=sha256:51cf45226a9b588d0d2b4880c62d686934b63ab0bd79ca23ab0e9762eb27441b \ + --hash=sha256:52aa6992700996af31f375de0c6bacd402b0097fe40b53c426b9f51a90ebabc7 \ + --hash=sha256:55ea99acb17b9325618de155a0cd6a2e8f5d10be008113e1d433bbb58db543b2 \ + --hash=sha256:56bc200a365efb37383b7852e4cc5898d3b2da5987289b543956cf8cad71018a \ + --hash=sha256:588461c2e8384d309bd63e5826019b6977bc66d629b99ac8737bb795d7b2cb5a \ + --hash=sha256:58ca3755ee7ff7f59b57789ec9833c9de9ea275405cdd240eda1f193112e398a \ + --hash=sha256:58f361dcbab699cf8f42db3f47c8e7fd1036f138c23a5d08de9fde5f425a730c \ + --hash=sha256:598a11a2c7ebaa5334bf698bf29568c9c390abac6a154d8170fedecd1cea38c5 \ + --hash=sha256:59f63901b0031c3136cf64704dcb21de0bbae62ce2c9529bc39d27665463de37 \ + --hash=sha256:5cde776b7cc66e4f6c99612cea4aa7269aa65863f7a15841b2c264f103822f4e \ + --hash=sha256:5e2b6b57e9733d39f0c9fd3185efa6b8e29652c4cd8fe94180272cf6ed9a78c4 \ + --hash=sha256:5fb29fb8cd1a46c27a1bf9613ad5ec2599310d46b4025d9556404a6b6a292800 \ + --hash=sha256:6045373d5a89a5ec71afde535db987ca28e76dfa276c2d4c818265b375d4b055 \ + --hash=sha256:619799369eeef6366ed3e8755a5670f4f2f0fb6b30a0fd7264dc0fdc2357058e \ + --hash=sha256:62588a277bfb59def052abd940703fa35107152bf479781a878617d60faf8fb5 \ + --hash=sha256:62603db9a7caa0802eaa28c1c46fecd7b3a263a774069c24c3c28c302448721c \ + --hash=sha256:65cd72beeeca9d3aaea1201e5923859f308f952f9c71de93f06063c79f0f7a3b \ + --hash=sha256:68eb192d85ab8e5f6ec69c2bc6ac0179fbf04a5ac1569d12fbef74883fe102d0 \ + --hash=sha256:6bd128f206a7752ae1f2ab6c61bf8a24ba28913a10df8b14c2637b973ff97a80 \ + --hash=sha256:6be488a102b8cf28d0391d8c4ba7748938ae28b78ad901f8585520fca33ead1a \ + --hash=sha256:7218e8f32b0956cfcd048fd42d9d5779809745ca1d86113ca56f66e7ae1549c4 \ + --hash=sha256:7441d755b7ab94f8d4eb3e43ec05482d760842fd263d003a99102d742cd835e2 \ + --hash=sha256:749e97e1b32313717a565abbe321bc2190bc8b35f1a67e4cdbc7c56c8d8ffe58 \ + --hash=sha256:75a3ceed0724d625d64b86ca20aba182e4df462e04c2414fc941c0f523f06aac \ + --hash=sha256:780fbe7cab297b81dad9fb8dc5eb003c0468ffb0d9e5f65068c53a34661a96bc \ + --hash=sha256:78456a747de8dc58360ffa581f30a002baf5aa28cb262536545e91f113ed7639 \ + --hash=sha256:7967d08cf06dee78443b874f98c98036f624f3a4e73e11f9f64f5be4d25393cf \ + --hash=sha256:7a881931aa470808df94a8c380eed2bbbc76cd9dc622310f99665658c821eb6d \ + --hash=sha256:7dcd882da75ef9adf94903b1e3b9419e8aa8fb4c7396822b834b9ef7fb96954f \ + --hash=sha256:7e841fb9010836c992c9f12fcbd43a831de93a5f726fc1ccd8ca1d0268c5014c \ + --hash=sha256:7fdde2c9fd9e3eca40631e024664cf2584272cc8f96308cbe5fdfc930f51d8bc \ + --hash=sha256:8024d00c3faf3fc0c16e07a69f4405e8eac7cc0ab15f65fe6cf43827c4cf72b4 \ + --hash=sha256:80d02b6f04e92601a081dd97b23d3128033098bff5d35d392ddcc0476ea11253 \ + --hash=sha256:838dcc90063569a0448120554591a1d6c4a4ffe11babf048908793154ab86ade \ + --hash=sha256:849df64e889b2e17230d58410a03dba311a65b163508fd33679b2b737d4b7858 \ + --hash=sha256:87475fabc8d9996fd9c27debb395e642e8c838d78a00b6e932227a0e06b81e26 \ + --hash=sha256:87e50a3e7cb90af586b6c5faf23e302a970415ac73bd7bd90a515a04b427ef96 \ + --hash=sha256:89b53f3cda69831909888e0494f4fa0bcd3537e3e138dabeb620bd6ad946bae8 \ + --hash=sha256:8a893cc101149f80a653f82062ebc95b34525a2614382e1da5458fe7c6997249 \ + --hash=sha256:8b2bfab86aa71ae13aa41a6a26aab338e0db2b8bc75434b05aea89e011ff35a4 \ + --hash=sha256:8d86d6fc60743dc916eb79e2eb1ec4818e21e427731543af40a3021851174a13 \ + --hash=sha256:915563965d418f986e7e145accc592eae9e1a1be3566ff98a05d7a9ec42a76e1 \ + --hash=sha256:92888bb3187c5ba50500b00b3b310c9f2c651709d28036077680cb5255450a03 \ + --hash=sha256:93223adc95033dd47133a46ccfc316a0139176fd79085762e27202ec56018f03 \ + --hash=sha256:9373ad13ef0d2c0fb761e04e55bfdee5a08b52cef2c882c8fbe9935b1517152e \ + --hash=sha256:9409a8bf35cf78353942504b24a57de3d75b708997a1e4bd8db71ac8633ce364 \ + --hash=sha256:9b7f416ff0978e2f2249330527f0ad6fa02f4932e6199692d3b52da2048c19e4 \ + --hash=sha256:9bde855991b7e362c146535e3136a50bfaffc0487d38b33ca7e5edefc6e23849 \ + --hash=sha256:9cae88599c7219005d879f98e5ed53341e9a122af585e1091200358a3003d2a0 \ + --hash=sha256:9cf9b1a857e25c4baceeb3624e92a56df3668f398c4acba74e174d81fb4d1d3a \ + --hash=sha256:9f56f72050826f63dcee7a7f55b0a77168cb3bfc553fd405e7f8f9ece75a4036 \ + --hash=sha256:a090bb2c68df85450502e3e20d665e3a5af9c65a84d6508ed477badd49166fd3 \ + --hash=sha256:a192e2c40070d92c3ccf777e3a5c4ff515573cd2bb7ed0c537fdadbbec5bbf21 \ + --hash=sha256:a19a731138fc27d5682277d3b9df22855cea1239bce7fcec5f78f42ef2d1f3c3 \ + --hash=sha256:a66c3bc5ab1f0ff2164fc9965ddd611ff0802173f4b9d24554c563f6ab7e1d6e \ + --hash=sha256:a815775b6c38d4e0ff7bcffbeba67feded90202bb6a226b8dd35f1c855217413 \ + --hash=sha256:a89012d6d5476ee112d20d998570ed58df2260a852afb1758809cd6900411d21 \ + --hash=sha256:ae4f5fea5b8b8ccff88238cc8569303e5ee95efae67fa62922a311397a71f346 \ + --hash=sha256:b6856554c4f44d79fc2307d5768854310a8f0096e501c75637542c82292b0429 \ + --hash=sha256:b6b751274acb69d77b3323d6b7dbaa3c7fdfc1eb829b7eb61d262f32e1af9685 \ + --hash=sha256:b736353c0a625bbd5fcec108576e2385db3496f4f771f785ff32e108d3c3bc45 \ + --hash=sha256:b7fd005a73d9e657273b7a10dc71a9e03c8fb9ee6999798d6918ce095b81ac7f \ + --hash=sha256:b91363207bd9dc966a691e959bb47f64b30f7ac4b072be9968b366982f7db77c \ + --hash=sha256:ba0b1d2620edf869789c3879223f52bf2afc5d31b3cb47cc57b3a12c05e2aa9d \ + --hash=sha256:bbbfc8e28816f19d7c0f1816664980c0a9875d01b27cdf8eedddb639d9e108ad \ + --hash=sha256:bd16aabe4a02a297c23417aa17ac6299dbd8c49f673bcd645b4929b11f5a4400 \ + --hash=sha256:c0afc6800ba57ccc350374c5bd6150419915d95ce93cdbab2d783d75eaf30ecb \ + --hash=sha256:c6708715abcf3c73b99508253e961a9967f02fe536532834149574eda6de0d1c \ + --hash=sha256:c7c9ab723cde841fefb34efbad91e87f00a674b1fe1cd0784fde742bf2c154dc \ + --hash=sha256:c8f3d67aeaf55f017982b73683f0e7342ba2f6635a78f69ce89ebb26aa411e5c \ + --hash=sha256:c9790464842f85f437dbbb54417eda1e0e6bfc52dd8d22d6fd1c994b73b2dc74 \ + --hash=sha256:ca403d7e4798f525fdfc78e258820419cbbd0f0ecbab9de7840e3c017cf6b8cf \ + --hash=sha256:d008d90a7f2471519aef0c90dfbe73b3e6e4d5e66ac48e19154c17e89e98b604 \ + --hash=sha256:d19fbd981a488e22cd04883659ca6b08f50b5974f9fd7c95655ef6a043e5893f \ + --hash=sha256:d1befeed746d247c81127bb14de9dc3d30edb6e5976d34f83f86ed262b1d9105 \ + --hash=sha256:d2374b62878abb00cd8309b32af6c0b715cd02dec0ca74ef12e5069bdc64144a \ + --hash=sha256:d376bbd28b3a8999db1a103b3b388aee6f1ddeb3e51bc2172993efdcd86e064d \ + --hash=sha256:d4a7319f304a774bed22115bc891618e45f85065ab44ea6acd07d274e750519a \ + --hash=sha256:d6734d2ef8a50fbf8445c139477da401f50d62a0606bf00e20ec6d87773fefb1 \ + --hash=sha256:d760fe2a4d7c3b226cb9026d6a842868d52a7901bd98420e1baf14e80da85cf5 \ + --hash=sha256:d913de495d90407cd859d263bee2e5d1a4ed3eb6573c04e70d9ec619a7cbed7f \ + --hash=sha256:db19d07e2e0129e974a0e65d0064fc222a446cd5122c2fd4184d2af9fc734a9e \ + --hash=sha256:dca9ab98072a5a54ebacebdc45f53e645336b320c667410b061be1ca588ae709 \ + --hash=sha256:ddc7dacc8ece3a182e7f15cb862d1fd616b46d076cb1ae9dd232b2c38b655874 \ + --hash=sha256:ddf19c062bea7a0cc80f519243d2c01dd091be0cf952a0750d4ad576709559f5 \ + --hash=sha256:def79fa35ef0cef8d2accec024f4fdc7ead3012ff02f5215c783f39f03ef8cfc \ + --hash=sha256:df29a0a7107f7011e77f4eebdddec4c7331e24d787a0b21a46d63bdf7445da95 \ + --hash=sha256:e09a3942ecbdee5cce73ea9d42da82b81b72ac1bf031ce069b93b5adf4eac8cd \ + --hash=sha256:e242bb1c5e76e97dfa9e7f209a71e93a01d7f19ffdd5cfbb2e2d55b4f08f8ab0 \ + --hash=sha256:e243bd13217235fc7290c621941c3f5cc8b66e4872495be821d7436ba2fb838d \ + --hash=sha256:e2af3aad578aa6bd1384bcf4750fc285e5a9de53f40b7d41e5a0bf748edeb2b3 \ + --hash=sha256:e4e81e09c1578b8df602e3db08b0b3ea0a6947ad612f52bf8dc5ea8d47691f0c \ + --hash=sha256:e54da4baf05720032d527874d40b65fa4d7e5c6c6a43d0c3adbeffcaf275a2b3 \ + --hash=sha256:e80e6c2f55656b4824d72065abb4ddd6a525c74bd78a0aab5d9fc2cf4fb5af50 \ + --hash=sha256:ed2a239c0ea213acc1908150a3037257083c7c083128f1a4cec2ec4b97dca491 \ + --hash=sha256:ed905975ab14056a2e5eb1c376cb2e1ebc5396baf84163939c518556fccde9f5 \ + --hash=sha256:ee21e28f0430bd6dc9086c6e525d5e818a44a5ad19720c8a0ef766792f3eb5e5 \ + --hash=sha256:ee43c17b173d46a3212baa6ead3ae258eeabdae48c263a01ccf0218c366dd655 \ + --hash=sha256:ef4fcbf3327382cd4c9f540babd61248208af7b93eec4de397b4d5f58a09e288 \ + --hash=sha256:eff0ac9dbe711a4aee69bf04a83896aa9b85f19641264053a9f6d48573abb7dd \ + --hash=sha256:f0aa869112ef88429ae17820d99c3dd9504c9e9c671d3c246f3d7442cb051084 \ + --hash=sha256:f3c96f633825733f735c5a9cf21d21a257d8e1edf0b1cee0a064b9c424ca0f7d \ + --hash=sha256:f5833ad231be5eb6553de524a70f48d71b2c8563101750531e0b80184e175cd4 \ + --hash=sha256:f5ec61164adcec446f8969a3358ec3f9b26bbda3b9213e5586d219afa8df2915 \ + --hash=sha256:f7d486c83842422badd511868fd8a9a20e9407ace71564b6af47ce7e60a336c1 \ + --hash=sha256:fb9e68df06293761f9fe66ade60a9bc6d0f5e42b8acf2939a9158af86ab0e5bd \ + --hash=sha256:fc14a032f813bf5fe624d991960ea83e9715adc27e4c1830a2361eb1d02ac341 \ + --hash=sha256:fcff63213e8e6e47770541a4607175404f47cbb3ebea7b6058cc82d524a0e424 \ + --hash=sha256:fd1fbe0f116b6e55da77aca2c6ddcddcfac2186cbf78bdebf40fc156efca389d \ + --hash=sha256:fe9753dfee015c570d73df76f899f18444d41388bffcde097deba51c4fadbb9f + # via requests +click==8.5.0 \ + --hash=sha256:255bc9599cf7748b4b1a446ccc735421bd08a2ae529a8b88597d3de5664ee360 \ + --hash=sha256:ba0d2089de75ea0310e2dde03160e6ca10009947fb95a182f9b54021bb272e34 + # via + # policyengine-taxsim (pyproject.toml) + # huggingface-hub +contourpy==1.3.3 \ + --hash=sha256:023b44101dfe49d7d53932be418477dba359649246075c996866106da069af69 \ + --hash=sha256:07ce5ed73ecdc4a03ffe3e1b3e3c1166db35ae7584be76f65dbbe28a7791b0cc \ + --hash=sha256:083e12155b210502d0bca491432bb04d56dc3432f95a979b429f2848c3dbe880 \ + --hash=sha256:0bf67e0e3f482cb69779dd3061b534eb35ac9b17f163d851e2a547d56dba0a3a \ + --hash=sha256:0c1fc238306b35f246d61a1d416a627348b5cf0648648a031e14bb8705fcdfe8 \ + --hash=sha256:13b68d6a62db8eafaebb8039218921399baf6e47bf85006fd8529f2a08ef33fc \ + --hash=sha256:15ff10bfada4bf92ec8b31c62bf7c1834c244019b4a33095a68000d7075df470 \ + --hash=sha256:177fb367556747a686509d6fef71d221a4b198a3905fe824430e5ea0fda54eb5 \ + --hash=sha256:1cadd8b8969f060ba45ed7c1b714fe69185812ab43bd6b86a9123fe8f99c3263 \ + --hash=sha256:1fd43c3be4c8e5fd6e4f2baeae35ae18176cf2e5cced681cca908addf1cdd53b \ + --hash=sha256:22e9b1bd7a9b1d652cd77388465dc358dafcd2e217d35552424aa4f996f524f5 \ + --hash=sha256:23416f38bfd74d5d28ab8429cc4d63fa67d5068bd711a85edb1c3fb0c3e2f381 \ + --hash=sha256:283edd842a01e3dcd435b1c5116798d661378d83d36d337b8dde1d16a5fc9ba3 \ + --hash=sha256:2a2a8b627d5cc6b7c41a4beff6c5ad5eb848c88255fda4a8745f7e901b32d8e4 \ + --hash=sha256:2b7e9480ffe2b0cd2e787e4df64270e3a0440d9db8dc823312e2c940c167df7e \ + --hash=sha256:322ab1c99b008dad206d406bb61d014cf0174df491ae9d9d0fac6a6fda4f977f \ + --hash=sha256:33c82d0138c0a062380332c861387650c82e4cf1747aaa6938b9b6516762e772 \ + --hash=sha256:348ac1f5d4f1d66d3322420f01d42e43122f43616e0f194fc1c9f5d830c5b286 \ + --hash=sha256:3519428f6be58431c56581f1694ba8e50626f2dd550af225f82fb5f5814d2a42 \ + --hash=sha256:3c30273eb2a55024ff31ba7d052dde990d7d8e5450f4bbb6e913558b3d6c2301 \ + --hash=sha256:3d1a3799d62d45c18bafd41c5fa05120b96a28079f2393af559b843d1a966a77 \ + --hash=sha256:451e71b5a7d597379ef572de31eeb909a87246974d960049a9848c3bc6c41bf7 \ + --hash=sha256:459c1f020cd59fcfe6650180678a9993932d80d44ccde1fa1868977438f0b411 \ + --hash=sha256:4d00e655fcef08aba35ec9610536bfe90267d7ab5ba944f7032549c55a146da1 \ + --hash=sha256:4debd64f124ca62069f313a9cb86656ff087786016d76927ae2cf37846b006c9 \ + --hash=sha256:4feffb6537d64b84877da813a5c30f1422ea5739566abf0bd18065ac040e120a \ + --hash=sha256:50ed930df7289ff2a8d7afeb9603f8289e5704755c7e5c3bbd929c90c817164b \ + --hash=sha256:51e79c1f7470158e838808d4a996fa9bac72c498e93d8ebe5119bc1e6becb0db \ + --hash=sha256:556dba8fb6f5d8742f2923fe9457dbdd51e1049c4a43fd3986a0b14a1d815fc6 \ + --hash=sha256:598c3aaece21c503615fd59c92a3598b428b2f01bfb4b8ca9c4edeecc2438620 \ + --hash=sha256:5ed3657edf08512fc3fe81b510e35c2012fbd3081d2e26160f27ca28affec989 \ + --hash=sha256:626d60935cf668e70a5ce6ff184fd713e9683fb458898e4249b63be9e28286ea \ + --hash=sha256:644a6853d15b2512d67881586bd03f462c7ab755db95f16f14d7e238f2852c67 \ + --hash=sha256:655456777ff65c2c548b7c454af9c6f33f16c8884f11083244b5819cc214f1b5 \ + --hash=sha256:66c8a43a4f7b8df8b71ee1840e4211a3c8d93b214b213f590e18a1beca458f7d \ + --hash=sha256:6afc576f7b33cf00996e5c1102dc2a8f7cc89e39c0b55df93a0b78c1bd992b36 \ + --hash=sha256:6c3d53c796f8647d6deb1abe867daeb66dcc8a97e8455efa729516b997b8ed99 \ + --hash=sha256:709a48ef9a690e1343202916450bc48b9e51c049b089c7f79a267b46cffcdaa1 \ + --hash=sha256:70f9aad7de812d6541d29d2bbf8feb22ff7e1c299523db288004e3157ff4674e \ + --hash=sha256:8153b8bfc11e1e4d75bcb0bff1db232f9e10b274e0929de9d608027e0d34ff8b \ + --hash=sha256:87acf5963fc2b34825e5b6b048f40e3635dd547f590b04d2ab317c2619ef7ae8 \ + --hash=sha256:88df9880d507169449d434c293467418b9f6cbe82edd19284aa0409e7fdb933d \ + --hash=sha256:929ddf8c4c7f348e4c0a5a3a714b5c8542ffaa8c22954862a46ca1813b667ee7 \ + --hash=sha256:92d9abc807cf7d0e047b95ca5d957cf4792fcd04e920ca70d48add15c1a90ea7 \ + --hash=sha256:95b181891b4c71de4bb404c6621e7e2390745f887f2a026b2d99e92c17892339 \ + --hash=sha256:9e999574eddae35f1312c2b4b717b7885d4edd6cb46700e04f7f02db454e67c1 \ + --hash=sha256:a15459b0f4615b00bbd1e91f1b9e19b7e63aea7483d03d804186f278c0af2659 \ + --hash=sha256:a22738912262aa3e254e4f3cb079a95a67132fc5a063890e224393596902f5a4 \ + --hash=sha256:ab2fd90904c503739a75b7c8c5c01160130ba67944a7b77bbf36ef8054576e7f \ + --hash=sha256:ab3074b48c4e2cf1a960e6bbeb7f04566bf36b1861d5c9d4d8ac04b82e38ba20 \ + --hash=sha256:afe5a512f31ee6bd7d0dda52ec9864c984ca3d66664444f2d72e0dc4eb832e36 \ + --hash=sha256:b08a32ea2f8e42cf1d4be3169a98dd4be32bafe4f22b6c4cb4ba810fa9e5d2cb \ + --hash=sha256:b20c7c9a3bf701366556e1b1984ed2d0cedf999903c51311417cf5f591d8c78d \ + --hash=sha256:b2e8faa0ed68cb29af51edd8e24798bb661eac3bd9f65420c1887b6ca89987c8 \ + --hash=sha256:b7301b89040075c30e5768810bc96a8e8d78085b47d8be6e4c3f5a0b4ed478a0 \ + --hash=sha256:b7448cb5a725bb1e35ce88771b86fba35ef418952474492cf7c764059933ff8b \ + --hash=sha256:ca0fdcd73925568ca027e0b17ab07aad764be4706d0a925b89227e447d9737b7 \ + --hash=sha256:ca658cd1a680a5c9ea96dc61cdbae1e85c8f25849843aa799dfd3cb370ad4fbe \ + --hash=sha256:cbedb772ed74ff5be440fa8eee9bd49f64f6e3fc09436d9c7d8f1c287b121d77 \ + --hash=sha256:cd5dfcaeb10f7b7f9dc8941717c6c2ade08f587be2226222c12b25f0483ed497 \ + --hash=sha256:cf9022ef053f2694e31d630feaacb21ea24224be1c3ad0520b13d844274614fd \ + --hash=sha256:d002b6f00d73d69333dac9d0b8d5e84d9724ff9ef044fd63c5986e62b7c9e1b1 \ + --hash=sha256:d06bb1f751ba5d417047db62bca3c8fde202b8c11fb50742ab3ab962c81e8216 \ + --hash=sha256:d304906ecc71672e9c89e87c4675dc5c2645e1f4269a5063b99b0bb29f232d13 \ + --hash=sha256:e4e6b05a45525357e382909a4c1600444e2a45b4795163d3b22669285591c1ae \ + --hash=sha256:e74a9a0f5e3fff48fb5a7f2fd2b9b70a3fe014a67522f79b7cca4c0c7e43c9ae \ + --hash=sha256:ea37e7b45949df430fe649e5de8351c423430046a2af20b1c1961cae3afcda77 \ + --hash=sha256:f64836de09927cba6f79dcd00fdd7d5329f3fccc633468507079c829ca4db4e3 \ + --hash=sha256:fd6ec6be509c787f1caf6b247f0b1ca598bef13f4ddeaa126b7658215529ba0f \ + --hash=sha256:fd907ae12cd483cd83e414b12941c632a969171bf90fc937d0c9f268a31cafff \ + --hash=sha256:fd914713266421b7536de2bfa8181aa8c699432b6763a0ea64195ebe28bff6a9 \ + --hash=sha256:fde6c716d51c04b1c25d0b90364d0be954624a0ee9d60e23e850e8d48353d07a + # via matplotlib +cycler==0.12.1 \ + --hash=sha256:85cef7cff222d8644161529808465972e51340599459b8ac3ccbac5a854e0d30 \ + --hash=sha256:88bb128f02ba341da8ef447245a9e138fae777f6a23943da4540077d3601eb1c + # via matplotlib +decorator==5.3.1 \ + --hash=sha256:4cbcdd55a6efadb9dbea26b858f4fb3264567b52d69ca0d25b721b553f60ea82 \ + --hash=sha256:f47fe6fdbd2edd623ecfe36875d37aba411624e2670dd395dddae1358689bb3c + # via ipython +dpath==2.2.0 \ + --hash=sha256:34f7e630dc55ea3f219e555726f5da4b4b25f2200319c8e6902c394258dd6a3e \ + --hash=sha256:b330a375ded0a0d2ed404440f6c6a715deae5313af40bbb01c8a41d891900576 + # via policyengine-core +et-xmlfile==2.0.0 \ + --hash=sha256:7a91720bc756843502c3b7504c77b8fe44217c85c537d85037f0f536151b2caa \ + --hash=sha256:dab3f4764309081ce75662649be815c4c9081e88f0837825f90fd28317d4da54 + # via openpyxl +executing==2.2.1 \ + --hash=sha256:3632cc370565f6648cc328b32435bd120a1e4ebb20c77e3fdde9a13cd1e533c4 \ + --hash=sha256:760643d3452b4d777d295bb167ccc74c64a81df23fb5e08eff250c425a4b2017 + # via stack-data +filelock==4.0.12 \ + --hash=sha256:5f17ee83ecee8a6f3e389c75822fb70a1c2f0506b99438a6dffa1d56793588c8 \ + --hash=sha256:cf42711a7ac791818b299fab0332a088c65aeeefa36290de98db92c434303b0c + # via huggingface-hub +fonttools==4.66.1 \ + --hash=sha256:058cd823b80bac59e64dfad9e3b6fcd677852f9a3804971bbf6b48cc611e785c \ + --hash=sha256:05aeb146451f37289f782c3c861f3d0f4b86c2dd2e4620b46683544c7406640e \ + --hash=sha256:05c0fff6b4a5d872ed89cab2c4f81060b86ace263903eb4e8d0edcac47a60dfa \ + --hash=sha256:08d8956e3ec990c75230d92f1630b215e8f3738c83a003421c22b31ebfd0ce15 \ + --hash=sha256:09ae73bd219e1245debd8376077a0fa6e03175e255c4f51bae5f6a271bfe384a \ + --hash=sha256:0dc6fd99cb8c30941036308b148da9432640442a6f26f36d71dad9be24cbd0e9 \ + --hash=sha256:1801fdad5600118327171e0e8aa79f7cc48831dd55ab36998c9de03bd5ffe6cd \ + --hash=sha256:261d8dc95845e751f975fe8d6075600593ee253470d46d1b84801688051b09f6 \ + --hash=sha256:2aeb745f2664eb811026997c95628071137a777ea2ad296deec9cb393f0b23cf \ + --hash=sha256:2c7340497cf53490293e0c2b61011e0191633022ede0a0a964a68157a98b0fb4 \ + --hash=sha256:2ce4c93160535761f22c80b2afbc96cabc09855363a5d1a5554265b8a4c85901 \ + --hash=sha256:2d320483928c7831f0139ecb361954a26b2e2a8995681200155835dd8cd4a7d5 \ + --hash=sha256:2d637468dac23aac0e223bd52e66f8faa3b0dfcef57435460fa2107e830226cd \ + --hash=sha256:3087a430722aba8de429c2539fd2a58a9cf05238cdfefd8626460001052ca878 \ + --hash=sha256:34378db9a398b59de18cc79d942f0a907c6fc6301945e065ec888202f607aa3f \ + --hash=sha256:36bb24d4b98faacaff04af1d5e0a4285feba6ed1da6728cd34b6b6deb6bbb934 \ + --hash=sha256:38ce8f5fbd5c17dd2153d47d7c8d4108f3deda3f2b4a79b60ddc470a58faded3 \ + --hash=sha256:43d1284c1964666ee833f2badd3017dc138f53d4889043ffca66c5ce4188f188 \ + --hash=sha256:53e5854ea8003efec34adc0863c18ce91da923018354d27366f7fee7db928d7a \ + --hash=sha256:56d41d650cb8fc6cfe1d85ed7c62a0a56cbeed07bc65ca795475b914d401312a \ + --hash=sha256:5de5d80fbc0e50ff794c244e8fb7afd3eadfe0fa232ba8b162b8c551df22fcb4 \ + --hash=sha256:60f5ea17aed4262630afa43f26997ceabd6417fa05dcedf54c665f5a29193e18 \ + --hash=sha256:64967c6ddb0d4c610dfd8cb1485981b2d27972ddfb7d4bbbd9e199d2a089c450 \ + --hash=sha256:668f092bc0de8902167df6a0d5c5aedc3b4f9e43cf88eea92e9b46a2bd3968f5 \ + --hash=sha256:66fad3b7874062c2a2692f0ae6dea56d24f01b778c7f191950ca3ff997e25a88 \ + --hash=sha256:6946fe7bfb28590a1fd4061a17609c9a843952deb65dcf30d1fe725070c3e7a4 \ + --hash=sha256:71c7ca1b5f46f5dd549f56b47d47c0b709217675c23d3a7bc6aa1a69b6d9bbae \ + --hash=sha256:72299346b96b9244dabcc051b24e4653da4edfda6105544cfb10ce856a1afaac \ + --hash=sha256:7234ae9e28db64273fbbfa72caebd0a97e3bdba6b05064114741b9539ef339d0 \ + --hash=sha256:7b8ff9e0edbcee2fbf7dff0c41b9041c1901c26acf64e23adb67495012df11de \ + --hash=sha256:7cf4f996f9b1cb549bff9ea4c50813988a26ec922c95cfa85c7e4f1270447e06 \ + --hash=sha256:7f49f2834f5d006fe0f3bb10fec73b261806c50941f0cfbc08294074ffc32210 \ + --hash=sha256:83572afe48733bad7a4a9c11721d3a726c2e976d82b063fc9bdd049d76955abd \ + --hash=sha256:8526b2b7ec4db6b81efb83438be52b1264eda9a4994d867163cfe8c65581ce8d \ + --hash=sha256:8aed2bbcd6216253ef1b015763593365ee8084f621dfa53bb957c19d5e05f7cd \ + --hash=sha256:90de3477394c73481d27d2b86091c1c736053ee13ff52c42f0e151948e8578c6 \ + --hash=sha256:9261ef507f2dd74203443a472b65b5a26429eb378f975016dec7dc7305b24898 \ + --hash=sha256:9ea6c93091cbf83161a544388746a0911550bd98cb911faca3591cf5ead166ac \ + --hash=sha256:b13c8c541ce0b794add3211b3641cc0e113d707f73e06235e6fe9731bd7c45a9 \ + --hash=sha256:b18803cbdef248e7ee1be59cb277fbbe1da1faaa6f726fa5d3557904e6a3d967 \ + --hash=sha256:b878c78b2af11b879bd4f26bb0d8bda2a4c64543fdd3f28efe2c80f97f043885 \ + --hash=sha256:b8b71db96d605784e2c5ebf0788a406018ea8fdd80338491f4c83613d5cd1fec \ + --hash=sha256:b913b8e9f7ca9bec44d1eb919f591c596c61041aa357c96be55ff93169859e91 \ + --hash=sha256:c258eba62260beb33c110b03a6912cefa3635239c4ab5615b7225fb6f7b85238 \ + --hash=sha256:c47299bca4b5acaaeb32100f77b944feea151de9ef1773365a410dc3d49b945b \ + --hash=sha256:c666fefdd5613a0e99aa4516e6ff4ef87aa86cf1c7ba12a73550f4770e46b750 \ + --hash=sha256:c724e56213494c6695335577822b2d1628d102e71614de8b7eb8e30886d6a314 \ + --hash=sha256:d3b5403e82d0c7659ff1d9f956e29a3a68d094f043e9f5bc0442796fc3a4fb58 \ + --hash=sha256:d4f76868aea9cc4ce47fdbeaa904c02ee7d85dd0ad095071ae77f0bda6e62cf5 \ + --hash=sha256:d84ac0bf776b68396185bd919dd29e633d94300660335efc40b55b294b886903 \ + --hash=sha256:d8f0a8f16c4f3a5a87ca971de2631792d8cb4d570951f2000acf712f157d40db \ + --hash=sha256:dbb7b950f8c02deaffb6968994691e8589d671b7ef8396bc9d5b5c0dfbb7292f \ + --hash=sha256:dfba62cc93199ba62c376f90f2a9147d92730d301e44f88e013e50ff5edf6193 \ + --hash=sha256:e1cde50b3ec84ca6fe63ca815de183dbecb88e8adf8ada82d8ea130ef12b2b43 \ + --hash=sha256:e7ea7a08547a453fa000db96ed5714a3dc7e2b4255b9243f897921f8c10c169a \ + --hash=sha256:eef76d5796e604f9d6753fa6d323c4eb9f4e0e43f1dcca553f3e6914f1667b64 \ + --hash=sha256:f08ab7f8461c37ecfdd29ad97fb0c0780b50501bd664bb0f46b6e83ed2b9d2a7 \ + --hash=sha256:fdf4afd75c643e60ef4a96fe64fc8a9def27d2a542112332371a9e5066885f9a + # via matplotlib +fsspec==2026.9.0 \ + --hash=sha256:0f08147951c8cb31d844c3547d631053b127863b60be04cf06e121333ee0e2fe \ + --hash=sha256:8dd6e646e99ea382bd85f97a45e6b526a442d79423a7dc673f1e2756d05fcb5f + # via huggingface-hub +h11==0.16.0 \ + --hash=sha256:4e35b956cf45792e4caa5885e69fba00bdbc6ffafbfa020300e549b208ee5ff1 \ + --hash=sha256:63cf8bbe7522de3bf65932fda1d9c2772064ffb3dae62d55932da54b31cb6c86 + # via + # httpcore + # httpcore2 +h2==4.4.1 \ + --hash=sha256:0e25f1462b23c9cb82d9eb02e28bc706dac2a68cb457c6a0d74d63c8a2a5d0e6 \ + --hash=sha256:4e866ffb1a869ae14dd9b5e6beb5c24a13da0495ad72b65925ded182521c1516 + # via httpx +h5py==3.16.0 \ + --hash=sha256:099f2525c9dcf28de366970a5fb34879aab20491589fa89ce2863a84218bb524 \ + --hash=sha256:0f456f556e4e2cebeebd9d66adf8dc321770a42593494a0b6f0af54a7567b242 \ + --hash=sha256:15922e485844f77c0b9d275396d435db3baa58292a9c2176a386e072e0cf2491 \ + --hash=sha256:1677ad48b703f44efc9ea0c3ab284527f81bc4f318386aaaebc5fede6bbae56f \ + --hash=sha256:171038f23bccddfc23f344cadabdfc9917ff554db6a0d417180d2747fe4c75a7 \ + --hash=sha256:17d1f1630f92ad74494a9a7392ab25982ce2b469fc62da6074c0ce48366a2999 \ + --hash=sha256:1897a771a7f40d05c262fc8f37376ec37873218544b70216872876c627640f63 \ + --hash=sha256:18f2bbcd545e6991412253b98727374c356d67caa920e68dc79eab36bf5fedad \ + --hash=sha256:2b2c02b0a160faed5fb33f1ba8a264a37ee240b22e049ecc827345d0d9043074 \ + --hash=sha256:314b6054fe0b1051c2b0cb2df5cbdab15622fb05e80f202e3b6a5eee0d6fe365 \ + --hash=sha256:346df559a0f7dcb31cf8e44805319e2ab24b8957c45e7708ce503b2ec79ba725 \ + --hash=sha256:370a845f432c2c9619db8eed334d1e610c6015796122b0e57aa46312c22617d9 \ + --hash=sha256:39c2838fb1e8d97bcf1755e60ad1f3dd76a7b2a475928dc321672752678b96db \ + --hash=sha256:3e6cb3387c756de6a9492d601553dffea3fe11b5f22b443aac708c69f3f55e16 \ + --hash=sha256:3fae9197390c325e62e0a1aa977f2f62d994aa87aab182abbea85479b791197c \ + --hash=sha256:42108e93326c50c2810025aade9eac9d6827524cdccc7d4b75a546e5ab308edb \ + --hash=sha256:42b012933a83e1a558c673176676a10ce2fd3759976a0fedee1e672d1e04fc9d \ + --hash=sha256:43259303989ac8adacc9986695b31e35dba6fd1e297ff9c6a04b7da5542139cc \ + --hash=sha256:4c6ab014ab704b4feaa719ae783b86522ed0bf1f82184704ed3c9e4e3228796e \ + --hash=sha256:656f00e4d903199a1d58df06b711cf3ca632b874b4207b7dbec86185b5c8c7d4 \ + --hash=sha256:698dd69291272642ffda44a0ecd6cd3bda5faf9621452d255f57ce91487b9794 \ + --hash=sha256:719439d14b83f74eeb080e9650a6c7aa6d0d9ea0ca7f804347b05fac6fbf18af \ + --hash=sha256:7c4dd4cf5f0a4e36083f73172f6cfc25a5710789269547f132a20975bfe2434c \ + --hash=sha256:7e420b539fb6023a259a1b14d4c9f6df8cf50d7268f48e161169987a57b737ff \ + --hash=sha256:8389e13a1fd745ad2856873e8187fd10268b2d9677877bb667b41aebd771d8b7 \ + --hash=sha256:85b9c49dd58dc44cf70af944784e2c2038b6f799665d0dcbbc812a26e0faa859 \ + --hash=sha256:86385ea895508220b8a7e45efa428aeafaa586bd737c7af9ee04661d8d84a10d \ + --hash=sha256:8975273c2c5921c25700193b408e28d6bdd0111c37468b2d4e25dcec4cd1d84d \ + --hash=sha256:8c1eff849cdd53cbc73c214c30ebdb6f1bb8b64790b4b4fc36acdb5e43570210 \ + --hash=sha256:9300ad32dea9dfc5171f94d5f6948e159ed93e4701280b0f508773b3f582f402 \ + --hash=sha256:96b422019a1c8975c2d5dadcf61d4ba6f01c31f92bbde6e4649607885fe502d6 \ + --hash=sha256:9c9d307c0ef862d1cd5714f72ecfafe0a5d7529c44845afa8de9f46e5ba8bd65 \ + --hash=sha256:a0dbaad796840ccaa67a4c144a0d0c8080073c34c76d5a6941d6818678ef2738 \ + --hash=sha256:a6fbc5367d4046801f9b7db9191b31895f22f1c6df1f9987d667854cac493538 \ + --hash=sha256:bdef06507725b455fccba9c16529121a5e1fbf56aa375f7d9713d9e8ff42454d \ + --hash=sha256:c3f0a0e136f2e95dd0b67146abb6668af4f1a69c81ef8651a2d316e8e01de447 \ + --hash=sha256:c5313566f4643121a78503a473f0fb1e6dcc541d5115c44f05e037609c565c4d \ + --hash=sha256:df02dd29bd247f98674634dfe41f89fd7c16ba3d7de8695ec958f58404a4e618 \ + --hash=sha256:dfc21898ff025f1e8e67e194965a95a8d4754f452f83454538f98f8a3fcb207e \ + --hash=sha256:e06f864bedb2c8e7c1358e6c73af48519e317457c444d6f3d332bb4e8fa6d7d9 \ + --hash=sha256:e2c04d129f180019e216ee5f9c40b78a418634091c8782e1f723a6ca3658b965 \ + --hash=sha256:e4360f15875a532bc7b98196c7592ed4fc92672a57c0a621355961cafb17a6dd \ + --hash=sha256:ec86d4fffd87a0f4cb3d5796ceb5a50123a2a6d99b43e616e5504e66a953eca3 \ + --hash=sha256:fa48993a0b799737ba7fd21e2350fa0a60701e58180fae9f2de834bc39a147ab \ + --hash=sha256:faca8fb4e4319c09d83337adc80b2ca7d5c5a343c2d6f1b6388f32cfecca13c1 \ + --hash=sha256:fb1720028d99040792bb2fb31facb8da44a6f29df7697e0b84f0d79aff2e9bd3 \ + --hash=sha256:ff24039e2573297787c3063df64b60aab0591980ac898329a08b0320e0cf2527 \ + --hash=sha256:ffbab2fedd6581f6aa31cf1639ca2cb86e02779de525667892ebf4cc9fd26434 + # via policyengine-core +hf-xet==1.7.0 \ + --hash=sha256:0a9e802f33bf50c851abe45fc5380e61f959e2d369647d6742b79ad9d6c27cab \ + --hash=sha256:19c0e64f14175ccb6a1aff69e0d2ab9ec5269a560e6687abaf2b3fa4f73de7cd \ + --hash=sha256:2814a6e999d13464c4d679b788cc5d784eb5a4edfc638a31f10e9a11ab531ef8 \ + --hash=sha256:2b7bb5727889b0f2436dbaaad8fc4c3e66b8240d992716989e0c086b4278b1bc \ + --hash=sha256:4ee5e05a627f5ab5bad7a86582277d645556ea1e199903aae19e033a392aa13a \ + --hash=sha256:57bc157b8b7fe3bee9dcb9af7f3da8de41801c3b31a9ef68a77a33c6a6be382f \ + --hash=sha256:59fba37039233c7fcbe196817d6cdcf1b40dfb17b410f229d85b0cf0a1848da4 \ + --hash=sha256:757168feb5679647c0bb13ee5d0faebe799c4dff9051419885a566ebd79f949d \ + --hash=sha256:80f79dae613ce9e0ea1fd1ae15616ca9ac74aed4c770aabc199c4f03ebecc863 \ + --hash=sha256:87dab080f8f7d32781c2586904e3603f4e60d09bfc727706c3ae419e0829beeb \ + --hash=sha256:acc3851cf2576a8fb2ae926da863f4efabe21303cf292e9a44332802ab0dcc6a \ + --hash=sha256:b01fe18dbbd151a2403d2c64ed30dc6547b00d6babab9a617d77c7acdb81ee66 \ + --hash=sha256:b91569d5f1b61c34b043687da02c05dd3604f3d329e7868510bf3f7971599006 \ + --hash=sha256:d406ec79053c0871817f700c2ac8c36ba0d87f9c34b7458b0f0063bb218b0466 \ + --hash=sha256:e3e88a7a75d7d95cbee1f37dc31341d6201124cf21c6c4b1dfab8ccba9b09e0f \ + --hash=sha256:fa029678be1ba7f953c409b0b27bf15cc69cd1c9b3a674fbd78856ebefca1052 \ + --hash=sha256:fcfd6c22418e57dd5b3aea649e813b2e2cfb2aebf317b210d90f1fe4b3018b52 + # via huggingface-hub +hpack==4.2.0 \ + --hash=sha256:0895cfa3b5531fc65fe439c05eb65144f123bf7a394fcaa56aa423548d8e45c0 \ + --hash=sha256:858ac0b02280fa582b5080d68db0899c62a80375e0e5413a74970c5e518b6986 + # via h2 +httpcore==1.0.9 \ + --hash=sha256:2d400746a40668fc9dec9810239072b40b4484b640a8c38fd654a024c7a1bf55 \ + --hash=sha256:6e34463af53fd2ab5d807f399a9b45ea31c3dfa2276f15a2c3f00afff6e176e8 + # via httpx +httpcore2==2.13.1 \ + --hash=sha256:e0aa977abe17e69a3b820a24542a6fa88702676d83880b8d194dcd18408e5103 \ + --hash=sha256:e1e05d4f25f7d7d496bfb96748f6f4b67657b03da069b3a68c36069f3db73d0a + # via httpx2 +httpx==0.28.1 \ + --hash=sha256:75e98c5f16b0f35b567856f597f06ff2270a374470a5c2392242528e3e3e42fc \ + --hash=sha256:d909fcccc110f8c7faf814ca82a9a4d816bc5a6dbfea25d6591d6985b8ba59ad + # via blosc2 +httpx2==2.13.1 \ + --hash=sha256:6dff50fabc270ee5fd25d845d0b078ed20564579744d6d962850975996d2f9a4 \ + --hash=sha256:e48744a19e3af5ee48313d0ce5fe941d5422fae5705ea922a4aabf94d7800dfa + # via huggingface-hub +huggingface-hub==2.2.0 \ + --hash=sha256:1667f145dc56dc210d60966069397df9ecfca9607a5d43db88b308c89dae56b3 \ + --hash=sha256:5d1b47537394e4215cb858aa12fd493d0f7ef7f58990f5dcd24bc173107b2871 + # via policyengine-core +hyperframe==6.1.0 \ + --hash=sha256:b03380493a519fce58ea5af42e4a42317bf9bd425596f7a0835ffce80f1a42e5 \ + --hash=sha256:f630908a00854a7adeabd6382b43923a4c4cd4b821fcb527e6ab9e15382a3b08 + # via h2 +idna==3.20 \ + --hash=sha256:a7db850025b95ded1eae8a46181a1a6c56c92c96f0e2b005d9ff8dc0210cab44 \ + --hash=sha256:ab7ae7122974553370f0bdb919e1a960b2cd1bc1ef0276416d896db81c14582c + # via + # anyio + # httpx + # httpx2 + # requests +iniconfig==2.3.1 \ + --hash=sha256:67f4b9c50da0dedf52af349e7749a80a9057a5031199791b906c3bb3ae878960 \ + --hash=sha256:9121e2c1fdb355232495be3194c8dfe87ccc2d5dee45947b78e68f499790d7a7 + # via pytest +ipython==8.39.0 \ + --hash=sha256:4110ae96012c379b8b6db898a07e186c40a2a1ef5d57a7fa83166047d9da7624 \ + --hash=sha256:bb3c51c4fa8148ab1dea07a79584d1c854e234ea44aa1283bcb37bc75054651f + # via + # policyengine-core + # pyvis +jedi==0.20.0 \ + --hash=sha256:7bdd9c2634f56713299976f4cbd59cb3fa92165cc5e05ea811fb253480728b67 \ + --hash=sha256:c3f4ccbd276696f4b19c54618d4fb18f9fc24b0aef02acf704b23f487daa1011 + # via ipython +jellyfish==1.2.1 \ + --hash=sha256:0028857c5381c9d55e21cc6cb0d7f9545c3a9a7bb7dbca3960fe0a898c691ac2 \ + --hash=sha256:01647c12261bc1f7b102e918e7665497176d87f6fc96271439c8855872bc2606 \ + --hash=sha256:0368596e176bf548b3be2979ff33e274fb6d5e13b2cebe85137b8b698b002a85 \ + --hash=sha256:05be396aebe3dce7a8cb2f97727ecdf99e86457c48e97190775dce33f8b7e39d \ + --hash=sha256:07b022412ebece96759006cb015d46b8218d7f896d8b327c6bbee784ddf38ed9 \ + --hash=sha256:0b21c1596ce283fd7ee954eb0eeb007d59e480364324bcd91ad55146e91f3936 \ + --hash=sha256:1098ce1f84ae3f147f0a18a6803ffb09b9c8cd5fedce42465643ca0b5c9d0224 \ + --hash=sha256:10da696747e2de0336180fd5ba77ef769a7c80f9743123545f7fc0251efbbcec \ + --hash=sha256:1354b558a0a16597b6032dd0af64bebd24994f7e7484cf14993320eb764b06cb \ + --hash=sha256:137cfcc26396d0f2e1265ac61f800bb921921ea722a43dd897e58190f767c474 \ + --hash=sha256:13f1ac9caba22af10bfe42f674822643c0266009f882e0fe652079706dc5d13a \ + --hash=sha256:14bbb30d988dec1d12183cf5d4621c908f98add2009c72a185e8c3e8d00b804f \ + --hash=sha256:15318c13070fe6d9caeb7e10f9cdf89ff47c9d20f05a9a2c0d3b5cb8062a7033 \ + --hash=sha256:1a3ccff843822e7f3ad6f91662488a3630724c8587976bce114f3c7238e8ffa1 \ + --hash=sha256:1ffeeb6c78c45fbb6d2a22b0173fb8a6af849001d6c26fab49c525136dbd9734 \ + --hash=sha256:212aaf177236192a735bbbf5938717aa8518d14a25b08b015e47e783e70be060 \ + --hash=sha256:21baa92d4a5112167721156f6d061c2ae105f2995b3a5e19cec6662928f0c439 \ + --hash=sha256:2348f698f9c1d72023afc8d39939045421a01da9b7e3078e3029227e35f28419 \ + --hash=sha256:29cfa8bfb72aacf2d611a3313b358ed4d4140fa3d3efcffea750c8e7f8acb1aa \ + --hash=sha256:2c28a4ae3e201e1c1b7bacacd40e2e76c4068b90c9ae3a0d525e0ac98206f1cc \ + --hash=sha256:32581c50b34a09889b2d96796170e53da313a1e7fde32be63c82e50e7e791e3c \ + --hash=sha256:32a85b752cb51463face13e2b1797cfa617cd7fb7073f15feaa4020a86a346ce \ + --hash=sha256:393f609fd6139ce782e747e22c399483ffc58341009e6a97e39ffe5f5b2c674c \ + --hash=sha256:4072e21ad4036af41bd57b447b1dda64fe60aa679cfa8854ba0a0338152439f1 \ + --hash=sha256:451ddf4094e108e33d3b86d7817a7e20a2c5e6812d08c34ee22f6a595f38dcca \ + --hash=sha256:4a21d7eda5e6996772055f798e3fe1de1b33b3edad7f6cf0567097a21585a812 \ + --hash=sha256:4b013876109d91fa6fc871ffa4e0dbfda11820c33dc4ad0e2967b3fc1187f804 \ + --hash=sha256:4b28fcefc0c3534277ff0306e6c10672fb050f4784b5f3be7037e80801569fb5 \ + --hash=sha256:4b3e3223aaad74e18aacc74775e01815e68af810258ceea6fa6a81b19f384312 \ + --hash=sha256:4c5acb213aa75a61bcfc176566e20f2503069667e760d83d403b59e115fef0dd \ + --hash=sha256:4e36d9000d4f7e1a35689a74ec7749d27a216dfa6c47cac2e5ad3de8a523bd69 \ + --hash=sha256:509355ebedec69a8bf0cc113a6bf9c01820d12fe2eea44f47dfa809faf2d5463 \ + --hash=sha256:5335f622458aa105289a8e358bc32ecd1b9634b6ffec3e77ea3577e49c297171 \ + --hash=sha256:536c80d8d4ec7f39cbb10b85d926ff96cef3cde4a83ca0991c07cd9835d5dc13 \ + --hash=sha256:56da7632e029912af25e25422fae3b6df318400297d552791f4b21da6d815ed6 \ + --hash=sha256:5bda2275f31a64adf3483e39f7a4e2107f7dfe3a3f85f0d2c0cb6ae5fbe4a443 \ + --hash=sha256:5fa0ba0946f3c274f6a87aaa3c631dc70a363bd46cceea828ce777e8db653b6f \ + --hash=sha256:63770120cc3386dcc13bcc4df508ab281a6b14c3b2c0e33586439a6c40ee122f \ + --hash=sha256:675ab43840488944899ca87f02d4813c1e32107e56afaba7489705a70214e8aa \ + --hash=sha256:68080af234256ef943f0add6fc79816b0c643d8df291c17a85c1b6e45bdfbb96 \ + --hash=sha256:68ea3ddd4dae1152a7f7155ef02a7bfad919611158d71b301f9aa167685819af \ + --hash=sha256:6a49ce2a580edd3b16b69421137deef464e2f8907f9ef906d49950b1a52908c1 \ + --hash=sha256:6c51e565f85ce38cf9388c4f916d53888b0fa34788fcebe3aff3db24948e0960 \ + --hash=sha256:6d2bac5982d7a08759ea487bfa00149e6aa8a3be7cd43c4ed1be1e3505425c69 \ + --hash=sha256:6e76b23431a667cd485fb562428d1ad29bae9fdd0fcdfb5a51cc8087bae0e88c \ + --hash=sha256:72d2fda61b23babe862018729be73c8b0dc12e3e6601f36f6e65d905e249f4db \ + --hash=sha256:748dc45a0394fbe9120b8b3b9a39fab0967c7e2d6ecdd5304af018e774f80f96 \ + --hash=sha256:7853d2ed7d6929c029312ec849410f1ea7ae76ce72ad1140fb73f6e8a1e6aa4f \ + --hash=sha256:80a49eb817eaa6591f43a31e5c93d79904de62537f029907ef88c050d781a638 \ + --hash=sha256:91cad49a4fb731b726afc5ae385a3217a7016ed88a04da40c131cff8136a5db5 \ + --hash=sha256:98a133b40dc00cfda6609e1b0cb0ab0b77796fc2719aae886a12009514f73499 \ + --hash=sha256:9913789a98ccf49213fbb1dabc597847a0ec33d3b0e151689498f4b38ba9be0f \ + --hash=sha256:9930e20f0e9f65ad1d57d98290c2be3abd75812d058815605f44a56056fb9a66 \ + --hash=sha256:9a73b5c6425a70ebd440579a677eb4f03b327b2f59090db34e6c937aeea5aabd \ + --hash=sha256:9c747ae5c0fb4bd519f6abbfe4bd704b2f1c63fd4dd3dbb8d8864478974e1571 \ + --hash=sha256:9d4448c874959ae012cda0f6d570ac0bd7f0fcf12007714eaebf86b86919b66f \ + --hash=sha256:a058f4c6a591d5e5a47569f5648a26303ba19c76a960fef7e0beba2aa959e52e \ + --hash=sha256:a0ef6f0ecc085c1f8fddb048f538c8bb89989e5d470eab45d4e9bd48ee73a40d \ + --hash=sha256:a3cab91020e3ff7565e55a611ec3e3257c093ac950d55778a48bfc8c57562b6e \ + --hash=sha256:ab1bfea271ce4bda09d975080d5465cf5a8b127e7c0ea61ea3f972417a7a2193 \ + --hash=sha256:b35d4b5b688f759ffd075190a9850b04671bad14c5b37124eb43e99306ec16ea \ + --hash=sha256:b37b76ea338c4a473c34a9b9e1e033a78aafb9040a8c0eea579fc5805d8e4b46 \ + --hash=sha256:b8986d9768daddd5e87abf513ae168ea0afe690a444d4c82d5b1b14b0d045820 \ + --hash=sha256:baa30c7b59bd1c5e105693108a6d7a98f3e7a1a59e23e15bc5897b91fd5849f5 \ + --hash=sha256:bcdcd603a7737cd3f5a2ab10ce9b49844329deb81c2daafcd8131e54fc730205 \ + --hash=sha256:bd186c041d9be86c4fa5e2490943ce5d7f05b472f45d7f49426f259f3dd20bc4 \ + --hash=sha256:bebccd0652ac1c7e438ae1f451edefde63d14b3af6f6daa30c599919dcb92886 \ + --hash=sha256:c3c18f13175a9c90f3abd8805720b0eb3e10eca1d5d4e0cf57722b2a62d62016 \ + --hash=sha256:c499ea3a134130797c50e367687a6a46a12653c59af381bee92c41a5ab0bd55d \ + --hash=sha256:c85aa2bc76a36d92a3197f406f86636664d5b323727dfec4fa2842a8a24a06ae \ + --hash=sha256:c888f624d03e55e501bc438906505c79fb307d8da37a6dda18dd1ac2e6d5ea9c \ + --hash=sha256:cf6cd68921f2bacc547ba1cf64ad0e76bc1727f3bab13bba2e5f5869aba038b1 \ + --hash=sha256:d2b56a1fd2c5126c4a3362ec4470291cdd3c7daa22f583da67e75e30dc425ce6 \ + --hash=sha256:d7be8021658b46b22500a77f1707901bd98fc210f185c229b81c74efd3c1baf2 \ + --hash=sha256:db97d873f23b0c15b4ed911ece10e5cc0bb96cdc53666d5c3788bd0af81807f1 \ + --hash=sha256:dd895cf63fac0a9f11b524fff810d9a6081dcf3c518b34172ac8684eb504dd43 \ + --hash=sha256:ddf05ea471da2808d77ecfa425d8884124b4754f4d483afa7703b6655530cf5c \ + --hash=sha256:e1b990fb15985571616f7f40a12d6fa062897b19fb5359b6dec3cd811d802c24 \ + --hash=sha256:e4a210a960f3917da757b0581750b6e0a8db9acef68dafbc1b6e2ae39e847ba8 \ + --hash=sha256:e5977810972c6f0b2e61252c4758fd5aee21abf663ff309881195a99d37daa94 \ + --hash=sha256:e967e67058b78189d2b20a9586c7720a05ec4a580d6a98c796cd5cd2b7b11303 \ + --hash=sha256:ecf62d4aad0baa8832ab60f96e7baedbe6558bd292597503d927e9c5bce745d8 \ + --hash=sha256:f121218dc33fb318c34ddd889dc7362606ce1316af2bb63b73cc1df81523ca34 \ + --hash=sha256:f69aeb08659a6c81d559bbe319075e3417434ae5b3a5e4a758d1c4055a03497a \ + --hash=sha256:fb3c6e537cb4605c22895a8d4a10cdb26611ba2bbfc7f0b4c1d06bb9d8aad648 + # via us +jinja2==3.1.6 \ + --hash=sha256:0137fb05990d35f1275a587e9aee6d56da821fc83491a0fb838183be43f66d6d \ + --hash=sha256:85ece4451f492d0c13c5dd7c13a64681a86afae63a5f347908daf103ce6d2f67 + # via pyvis +jsonpickle==4.1.3 \ + --hash=sha256:99822e77b593462c1f67361b0571e54323db43f1285706a63da5b5759714c9df \ + --hash=sha256:de234c1d1ed2c5313833e608e2a2467202f48ae24ea7a2afa2d238d8999aa4b5 + # via pyvis +kiwisolver==1.5.1 \ + --hash=sha256:007a5553dfc4f4e8d184f588a0200e2cd4b63a59cc8796df3c39909e679dc7a0 \ + --hash=sha256:0324cd2567259b7a095f6cf18a52b0ffc6f3de9e69528ff1bc0e7a37bd43ff1a \ + --hash=sha256:0627b9bceb9c3cdcf12b8a18655eedfed2692b038df27423383c120d0b7dc2d6 \ + --hash=sha256:06a6917674de9e0fe3f66f5430787f59a9f2ddb64af9b714eaec547e29ef5c19 \ + --hash=sha256:072bdb15a3c19a5b5dbc8f8fb1f4e1884bf4f3507eeb4cc6334401274d37a5c0 \ + --hash=sha256:0a4faea5c6db201c6a21391d2ac926ea97acf7dacdbc3c417189e1adb1a00837 \ + --hash=sha256:0ba9527afc80ae3d7814ed98b6572d02bf85eaf48065678342c5f0c6dab7a8c7 \ + --hash=sha256:0d8924877ce22e17326a99a418c3c82037da078df3c6a260b13eca677444e6e7 \ + --hash=sha256:0ebdef3eae5336568147c39a55be6a2036ffde53faa9ca2d978989ae7c2da12c \ + --hash=sha256:1209042a623ddfda5497e4066c7b77651dde8e1d3a9dd97599dc7e97f3b9b78c \ + --hash=sha256:16895f553ee6620a827d2da56b871f835fb70b9216cca5d188e885caf6e3bd23 \ + --hash=sha256:17851e5dad4484be0cbccbde3b15331deae036de9aebd45eed964487802b172f \ + --hash=sha256:1798e83840c3f627246104c4d8a9639c60fa068adf9ce92b61791781fa8a68c1 \ + --hash=sha256:18170a77ddfecf40ec60d0928268dc95880c881864e015a8f34094ed18b9b9ad \ + --hash=sha256:186884a58486651e3c217b6acea0a53eaa9498fdd472057c46f2f0fb5c25aad5 \ + --hash=sha256:18a0cfb124546a4c2e6087c5f3029c7f44b37c85b142e0ced71f73a7599ac208 \ + --hash=sha256:1983f0974a750a6f6556f368ba11105d1d8369c735b944747c9f12ae5aea7aae \ + --hash=sha256:1a7587dc335f2c0f5bd577fd0540bd16c66006bdb60f759a1059f025e6c4f071 \ + --hash=sha256:1acc7e5b7ef05e9da8bb70cd6c7c4513090213d2e1ad9720f599f0bf6c52aec5 \ + --hash=sha256:1d852545c4d0e35a72728d072cbaa59e2fa7dd84bdf01e068d670dd0ceb58eb6 \ + --hash=sha256:1ed0f5e49d0ceff8b72190824d9e59c062fbbc02c231b853112c78474b3f5ec2 \ + --hash=sha256:1fff05e239575b1481b6ed1a782f6fad616efbf1f0b1f44e6e85c4dfe426e483 \ + --hash=sha256:21e46b23a2da695c364124817bc01d970effd5483147f8d66a6a7167e3f6b851 \ + --hash=sha256:22d5e5aaad6be121f2515765e3b1c444352cb8eb4c86510801db8f2e50757316 \ + --hash=sha256:2551cf9917af48ee7c4b29cc82320489508cf96fd26a51f6fc124de661cd44c7 \ + --hash=sha256:255605693a483db7bd5c79f60437f7bf658f7f520d61aa42722e32257c941951 \ + --hash=sha256:26e8268480be5061d509e29669d59103c067a26377a56491630ece11762e3858 \ + --hash=sha256:27add358abe374ebaa3b8763ef380bc99051b5a4b18d94878366a9e4f59efef0 \ + --hash=sha256:2ae70bc59790d2af72a3f76f24b272403e135070340281108b447cb77ea70819 \ + --hash=sha256:2e10ae1bba1899188b33557c10d73affcc12033edd18adddb57d209039976a4c \ + --hash=sha256:3221f78211074f561c44ca42eac0619828171bec15a2c4cf6f7747d07df76e8e \ + --hash=sha256:34633ecf50d16187ab8e5528b7a2530f2feb4e23f300db4672538b51cfc5cd38 \ + --hash=sha256:34ec467940442c9943016fb2d4c81d1ba84351eeca2f1a78f8bc87f1ba0d414c \ + --hash=sha256:37f801b5d7cc0e5a548921308e059fd2b057bb42972b591cfa3049f95423c4ed \ + --hash=sha256:38f6e0deb4d0a4615efe0c4efc5990b06ae450ab50a0b321c0b078b6d238c083 \ + --hash=sha256:3c24cd69455e1b00ddf770c13b6e2c33e07d6dc3f2d34add0bf9277c5c6bbd46 \ + --hash=sha256:3cc210010fd2f438a3ed430b45f1b501fd13a8618bf984dc2c5ce5b69b78752e \ + --hash=sha256:3fa5855898f6d3d01b72ccd48a2d65cbdee301251603fefe34e2025bddba219c \ + --hash=sha256:416ba7ff9f233b7036689bb5a3783537e838ad483f63558d2a800f75afe738b1 \ + --hash=sha256:431dc224a1a92a5c8f582d96e505196a3b5997a7271076678da2dfde67b77e9a \ + --hash=sha256:43844c1a7ad6d723d5b5b4c4fc7f5bd399c40e288120d16257c7c9e8765c6e85 \ + --hash=sha256:44b8faef94f1857e77fa0238f3390ff1ac51d2ea20a487e2e452a59fd2b5f5ca \ + --hash=sha256:470d420f98d368d6f010633a20659b544c5fdfa5329e6b70219f2ef08fd4a7ef \ + --hash=sha256:482676e5bd48d70ac99d9fc78863469845421e01184fa83f1f9366dc49f7e974 \ + --hash=sha256:4d4ca09bf13cff792b1884f64b98ee6c2467930d632233be25c56b442d99f10e \ + --hash=sha256:5025e36fb4fb275cef0a4e30dbb11cb4ae61d1c83deb90189cb5d7e4cafd6b55 \ + --hash=sha256:509735237ae0d849e8a843551d423d2500d2e0a9ac1611a145658b29c0fb9f85 \ + --hash=sha256:534f02c1abb31ed6dbd3515545285c330b2f12d00fdb1fdb71658b9ca5a13a6a \ + --hash=sha256:5978c3340f16a35c30f8ab2fa7bcf559973c55f1a5ef6970e1f621acf3c4db13 \ + --hash=sha256:5b973887ff782cfd6b67c9904ad8ca542e0bc5e4961503408b423b5a688b4d38 \ + --hash=sha256:5c490db2168a508088f59140dd392556a54b8bd1048fc6383c8baff13c359673 \ + --hash=sha256:5d142e352eb13facc7dd047489aebdff6ba78576c239f1ea04931979caaf0567 \ + --hash=sha256:5daa1f19e097050b9c4d9a78fcc9263cb96c9dfae08037ddc1b7c4ad1889f2a2 \ + --hash=sha256:61e9a64c7635095a6bfe483e2ff055d437c59bd45f3617a228b37277f0185d62 \ + --hash=sha256:63fb7294b768f444eb4b068965f2662f28c2fd4161e23bd60fcf3ff27b74c046 \ + --hash=sha256:685929988b208a911f1285e2f8ed54210b0d681a3dc0f03e00d599d291986e7e \ + --hash=sha256:6a797a1cefc8b9c93170db580337e1fe3d011ad18b1299943231279406342048 \ + --hash=sha256:6b92f60017dda7d877fdc546438b5e28f31c523264f49cf5a48c1d0ce1a0dfbc \ + --hash=sha256:70ed9a45c7484d2b30cdacf60d220f494a1763b9fec1ad03285c6553fa0889f2 \ + --hash=sha256:719a35fa1156db3640555f95ebb94f60a444e64d1c69626b0edef5df78eba225 \ + --hash=sha256:74ad5c3dad54a4641b4c28cd15ded70899d04459c6c7aeacafea716be97cce6d \ + --hash=sha256:74ea337e0ec3f6f342a36a4f1b5cd94dd9affddcd28ba9aae2905af932ee8c6b \ + --hash=sha256:75d9b1cf8258462dbdc1eeda718c96ea7f079324c09067f6daabfcf37712b7fe \ + --hash=sha256:77a4c8187a5948d7f8795adb765a3c7b553d07d86d88e43038fc32fc1fb9a3f3 \ + --hash=sha256:7824b5e8bdbf0bccb4ccd37bbb115849a1dc45437fb4de8351385ed07c437ee0 \ + --hash=sha256:7d38b0c279c3032e8c9cc013b405c6df8e1668dbf15465779aa7f15f61201812 \ + --hash=sha256:7e9c01d3dd7ceba4d1d436cc021d40d592466e40b9bc7f5d83dc4e98a5c9cd8c \ + --hash=sha256:7fd82debf43c6acd0a94359d232f6bb516ee13f269a7993736a9ac9f988bb5d9 \ + --hash=sha256:824c3d763a05ea9e9003610145186b0e9848c7584a5575c79bac5a8e7cd80bad \ + --hash=sha256:828f75af2b0080c8a972e75f649ab46af008e92c6104a57a759157200b835b75 \ + --hash=sha256:83f78128fa28705fa85d01c59771c72fe81c11bd0e6155edbb9f818983a7d761 \ + --hash=sha256:876bbfd276473d3daffe30e8c975df4ed9429967b41a6cb362dbb5155b6f13ad \ + --hash=sha256:886fc26012f0e8b5f69d1cfe6d711f6b11f194621539bf8e6bb1c25c5dc82724 \ + --hash=sha256:8a34616dc2521cc8dc1d7d081734da63539f021ac0450ce950908340c6e7aa2f \ + --hash=sha256:8a708a47ade1fe19e8371d5da076bac0dd4b0a5a7985ad6c637f7f7e361b6baa \ + --hash=sha256:8af9b142ad719ae3a911ebf616bc4b78b32bbab84d6a40d3ad2f129670509957 \ + --hash=sha256:8bf4df63592c2a66b4f8edc5df2544998c288aa02f96ce0acd880cd1de8c8127 \ + --hash=sha256:8de6f2a4ce7e7bd27d23dd94abf0ccafe0e0e5cc9c764b0577191f2c25f08f26 \ + --hash=sha256:8f8fddb8e323bd6eee4e54e69a39243beab22689070f4c66b472c4cc88bb89d8 \ + --hash=sha256:8fca690b00c4c48f6c2a547b0160ed511357093a4e4c9b47e0fadf3128066d89 \ + --hash=sha256:9506e892bcc3b409831d363c6f53e5985e1c8d1f6f6b0256d00358684ff85378 \ + --hash=sha256:958254518717542d02d0688d0d20cbf771da5e415e6f49543f92481c850a4540 \ + --hash=sha256:95a02752aa032eef4aed01cda6d9b687c669bd0396bf4519eef8bba22a286720 \ + --hash=sha256:96c30002424670b5e1e46495c2b8cbffef39cf77c1d79e76462029d50339785b \ + --hash=sha256:98b208a7cc42c803445ef551d6753cc42a5ea13e9cab1ee66cd8b9cb70195330 \ + --hash=sha256:9b3092d8992a1d69b7a59c3e39f35e1b9be327a17f68a7c35fc17329e337d6f2 \ + --hash=sha256:9e51c119992ea8820706871c30a4642ec76de20ae82f9b50b9a45517d8e9f810 \ + --hash=sha256:a5716a33bfabb2c6ce27b6cf03253467b3804f83e215f4d202685cf93c6c9874 \ + --hash=sha256:a5a00665d1a0e26763a7338d7e911d4598fbc1d50dd0d6b7919b7dc6c5d6569f \ + --hash=sha256:a5ca5aebae78a0bc13c1943af4af615d4966c5b650b05d5aa83b50e427196fee \ + --hash=sha256:a7b85b2cc6ea45e5f7e8c9a30bc9fabd47cda09106cbb4b967335c3e6c43b69d \ + --hash=sha256:a83ee7107df13abe42a54a6654670eef9bb39425cf2e27f65e0007465e1286ab \ + --hash=sha256:aa7d00b1700966d2917e54d278aba86897890ca9276dd8b76cf6446b6c181b92 \ + --hash=sha256:ab620eb663952455271ac37f9aaad86b73c969c02f11f53cea405b38e96a4300 \ + --hash=sha256:ad8b9671348d7c8716715652ae11f85ed0eb99e265a2df2ca490577d69860b2c \ + --hash=sha256:aefe930d113798330e9462f7874542977869c0613cba3262e2de3a8d5dee8f3a \ + --hash=sha256:b03af77d77e50edba2030fd5f7c352ff209314b09030a3cba7c14edf9a09a444 \ + --hash=sha256:b390aec180a7c054919c04898835e1c77bced23ea8383eb2c570213bf25d1a86 \ + --hash=sha256:b3d78f7bb2b9d9a30345be1474b9aaa8685430b54afb51ba3639b5c6c11e9ed6 \ + --hash=sha256:b5664603a253efd3a75716d793d1d3a6a82723b61dc6db767b2460bbbeec4c0f \ + --hash=sha256:b69602970994a2ed8bbfa78c2f0394a7435226c6040489702d9f0a0ad0c07052 \ + --hash=sha256:b6ae6a0328f0bc035741820fdeecdcd67bf4694eee03972e843663107122f450 \ + --hash=sha256:bad20d4c69c851c982a1e3606f4c293edfd5a87885786c50082412240c4b1ffd \ + --hash=sha256:bb7c99f0673c03017a3ee01e54a5c2617a05468b11eabe513b0080e063ed95b1 \ + --hash=sha256:bebb89489b279b2f5661bbbb2abcc87bcd4a46607bb4a5c966f04f1db6b8df9a \ + --hash=sha256:bfd1de989b3330420e29de39352f5c049905c9e3ee67233a50d550e3d652c148 \ + --hash=sha256:c2306e8bb53601979fcb3fa09cc65e031876d9ae01eff2fcbcd7a84ef94d5bc1 \ + --hash=sha256:c3a4e41e3096bf1f0f1b76e2ffd6d828d6547f574f702d59bdbef7acfa59db9c \ + --hash=sha256:c6834b92dd2428e2dd85ef3d85f723d3c12f20aaf43a2ddd4f944ca25d833408 \ + --hash=sha256:c90d3022d8a94778939cda8638c6c8da8fa757b8958dad7ec868ce29c87681b8 \ + --hash=sha256:ca307d6c259e5c98d3cb9ade55342b47a6839762caf2536f3d7b46ee660cc82e \ + --hash=sha256:ca7f6fe0f37ca978a1e5eb7a3a68e6413f417e78e838324947ffd420202b198b \ + --hash=sha256:cb6fae641357ed2f6e533c0d3c6504a4a5703621a50c89459e46051d56b61140 \ + --hash=sha256:cdaeeb6c350106df6bf9d873395973e5f066a9713200b72cd64f55d0a3eafab6 \ + --hash=sha256:cea20da04494e662b83c872683bf4ff2345206043d036315ed0e924b652e7294 \ + --hash=sha256:cea90547bfd93807e0013a004dc76552be44fad3bc1cc2b38610a9e889ed098f \ + --hash=sha256:d09037ca068d784ebc4aec290ef952ca27ac15dd9c0b5801a88c6e1096b83e6b \ + --hash=sha256:d27c2123977cb9269c30a49ba45f03a4323017ef693e19db4ec9dbe1299a3002 \ + --hash=sha256:d50de98e8d807dc31822fff96f50293163a62418eb65487a21b42713d72ed0b7 \ + --hash=sha256:d66a64dd5dec136040ec2ae94aa026a912ee60fdd45bc28d3db30037fd809e88 \ + --hash=sha256:d79308fa689fac89cbcfbd4dbfc80b5f95c54c5a7fd4d194be221f9d33d026e6 \ + --hash=sha256:da3275833be0edbaf4830fae08bae3dc7219f40ce0c37eaa6c25825957e06612 \ + --hash=sha256:dc1a26b8e53395a01c2c611e58602fa47461f136fba7cd5542e6db6d64be1839 \ + --hash=sha256:dc23390afe9f4ef9ac3bcc72a03a56eebbde03f4c571a32cb38f859cff9a6524 \ + --hash=sha256:e05c2f7925f1d88778e53cb44f14e0223204a3bdd09a41664750363acfb1f2ef \ + --hash=sha256:e12dfea7f5fc2a34a9080efbf79c4c44eb380ec5b9c6fea09407e08f0d1e941d \ + --hash=sha256:e4e4523d6f336708d732516e6cfca7796cf3d96c9474eb5aecf6165f2f1fefc3 \ + --hash=sha256:e4e49f7e1a4e7191bdf9dc67a974db714501b1fc52c24324103d06a86abd5c08 \ + --hash=sha256:e68e151428b5384f766cd25739bf77c7e4a3dc93b5ded7a12118d9fbfdf78ab6 \ + --hash=sha256:e8e4d953faaded9ec7ede36824e9814082d22d4c7b1eafbfa079ecba8cd0d076 \ + --hash=sha256:ee9df1f0d77b9c6e94f4ac0fec533fbddd5ea3a327807f18d7b069ae019ded80 \ + --hash=sha256:f0a887b6565bbfe80efde2b7f6e8890d7d9bbdb11bdb17028a3690c32fe0621f \ + --hash=sha256:f0f4a42db92d6ec7677ab9d12830a2a8ec145a9c6d15db2b593466bc875c78d7 \ + --hash=sha256:f1303ef2eec81262a4b708c3e858afe58d7c75ad91c1c05266eda7673369859a \ + --hash=sha256:f1d56ec54d257d05e0b50f5780d967540cd07beeaf9e5f645b26d50cce79f4d8 \ + --hash=sha256:f4167e87b397f273dc2356fcf1eaf50a6bac51e6105f45103ef7129c8efb0255 \ + --hash=sha256:f76fc85bd054c806960f917ec0f329e24e436f1712267d90588e4c39890caa63 \ + --hash=sha256:f942903fde7363d1d879057ec5de01310efda2597161784d752fa9953a01a71a \ + --hash=sha256:f9b1c4900736e489a812c529100de4b8fb617d4db075e931e213c57424b83d9b \ + --hash=sha256:fc271a6f0a2126958f4090e5507b9da5848927dae331f8f763bd4aa642b3d2cd \ + --hash=sha256:febcce10f2bcdbb80b4ea919238a6a4ac13dbc4c7cadbe8d5d75c3682f8b5404 + # via matplotlib +markdown-it-py==4.2.0 \ + --hash=sha256:04a21681d6fbb623de53f6f364d352309d4094dd4194040a10fd51833e418d49 \ + --hash=sha256:9f7ebbcd14fe59494226453aed97c1070d83f8d24b6fc3a3bcf9a38092641c4a + # via rich +markupsafe==3.0.4 \ + --hash=sha256:007e1ffd9bf65bb6ee96df7b258fc632a4868dd5566037986c64781f35a36e98 \ + --hash=sha256:02fa4acbc6a3fc5c693c34d4dd8c1130b7fe99cc915181b0ddd6f72aeb296002 \ + --hash=sha256:03470d1a8268e692ecf79ecd565593e59d44219377a7ead61f1f1b94c1f7ff6b \ + --hash=sha256:04e7902ba80ee4bac1d50a549606527a1dcf0476cd81403db41099d3b60ec653 \ + --hash=sha256:051417f74bcaaefa316276e0ff723f541616ca51043d070da00249d9bddd3e3c \ + --hash=sha256:05295589e619b9bed252a86b532b8e27350abc372d18ba89b59375325e91ec1e \ + --hash=sha256:06de8ef6331f6e822c28d577dc8bf43fe398800477c49498f38fc38b67ff33fc \ + --hash=sha256:0764a13d34cae40db7bbf3a09b7e9b491bf4603e20b263a7a9d6b8e324975d0a \ + --hash=sha256:077293e425f28ec737dbcad442a71752e28f8ae27cde3d68acd1fb212091cd92 \ + --hash=sha256:0930db9bdc62d22944e10b066448bb65dc9abe9112880c7cab8da54db4284d5f \ + --hash=sha256:0cee7cb0f9a1b6892ea482237d9403b3d1b4603aee057d0ff01f0fac2d019a97 \ + --hash=sha256:0d9c47709875fdb321452056622e930c52afbc07a7d780762fbb8b4d91ce6fa4 \ + --hash=sha256:11935df9bf455ed0c04eb87bcd720f02b1fe5e02128a9430f23aed6f93336fc7 \ + --hash=sha256:12a606a492de952afcb43b59a14aaaaad120e708d3663dd0fdf2d738d427a691 \ + --hash=sha256:14bd2d845d62ab678eaf81da89d7b621b51756c72346745c1a594c09d49207a2 \ + --hash=sha256:15ba9e28640feef770374b116a6f019c21f52404aeabe516aa7f800587b98cfc \ + --hash=sha256:18a801868a884f216e784d7d14db2a4077143ce7610440aee2ce8f734e7cfcde \ + --hash=sha256:1c0df495a977d10460a94941799c72d5b5ab03d3858d949b55b5a66c8f371c99 \ + --hash=sha256:1caa2fa5a6184fb233153b35f654e6687bd555476f6170f29d8ee9be1a8b0af9 \ + --hash=sha256:1e1451fab512d1bcc3dc26988ec1edb0b82c2db909132872cd9356070a6b63df \ + --hash=sha256:1f1f9477e174582b0a1b583d60b66e1f2cf5d3fe12cee985e4aedf44766600e5 \ + --hash=sha256:2628d3a8cb648ecebb3c5d6b0a1052d400e4d8b7ac0fb786be8d285b50040d17 \ + --hash=sha256:26e9867520db70d37f7fb421a7f0d8adb40171011fb84ce869afa1a83370dfa8 \ + --hash=sha256:2a6ef68ae94aed8721934072b27a3b654ea2100b97e4ab864cf1489c90926fbc \ + --hash=sha256:2b2b1e18af909b448bb3cf9e3433366f7a8726271fc214e8b10e0f62a78c724b \ + --hash=sha256:2cb3dd71fc6be918ad4264346a8ed69485f9b7ed7bf35495d8e22807cd6b8bea \ + --hash=sha256:2d1b7d9308288661f56672b1b157d75fc536714d3638487bbea17b6318a78248 \ + --hash=sha256:2dad610540cb2e6272855c178f08ae9a1c7ac258a7fb71660553a5f104b42741 \ + --hash=sha256:2e5a7cd7fdd14fcb1ae5d7d8bf23d24fbd1daefd1fbca2580132e1ea75f098b5 \ + --hash=sha256:2e9ad7dd851bf45fab9f75cbff4cb493fee9979e8d8c7c9c3ee119022518edd6 \ + --hash=sha256:340cbb1957ba99929cbf19a75626d36ba1ae21d1730b287d1cf7f824a20c4fc7 \ + --hash=sha256:34bdde374c5932765d7dc685c4a1d191a3207852d67e8e0a9eb6ea85156181f1 \ + --hash=sha256:353bd63081912ab8cfa6a0c7d185934cdf8426f04c618bba6bc4b394f2069b67 \ + --hash=sha256:387d8cd30e69b3f0a72877b9ae717033396404e19095b17fe89753a981fda44f \ + --hash=sha256:3882fb412298575bae3b9c46868251f15cc69307359f87bb1b382e53d6e5a2c9 \ + --hash=sha256:38fc55594dab834470b6733dead2ee9e3f657fb0608c769dcafa0ba5ab52f45c \ + --hash=sha256:396ec4e65cc889f69786b3b89478b471cee5a3bcf468b9d9bb03e1a30fb291fc \ + --hash=sha256:39dbacefc411633db5b4378b066a9aca70a3d7e2922c9e578d825f844026eeba \ + --hash=sha256:3a93d9616ddecfb393727a0041a562cf0b15a244e20f2bd25efc7949be4c4f17 \ + --hash=sha256:3d23795802fc8bd72534836d64489bbf0f67c088959091bdb22e10735a5107bf \ + --hash=sha256:434139499bb20b502ed3baa1f169e618f924a97e7a777fea1a49446d80106cf6 \ + --hash=sha256:436e3ffc6310d3c41878c601db29098102fe5d8a467c49da4a4125254e0980f2 \ + --hash=sha256:489505b03f692c3f376394e49194fa7a7f9e8558d6e293a7056a0032b0c38163 \ + --hash=sha256:4a540e2d3192792fc84eced57bef37851ccb2b41f73291bb17408eea77bcd278 \ + --hash=sha256:4a7cdc2a420ca01058182da4253329764d4bfa055564d1eced90e6ba1e8b1d3d \ + --hash=sha256:4bced6e2a6dba6a28f7dd3c6ce14df1b2dd495923f16ea484cad03decd463b2b \ + --hash=sha256:4cf3468d5ec187ffffcaca8e61929a37448f215dafc1386a12c750a72fe53634 \ + --hash=sha256:4e2c4809c14559aa7ef426f27fb35afbb38104c349a903bf8f3600456764bb38 \ + --hash=sha256:4ed644d75aa94a2baf7ec3a96eaa160ea58c742eb9d27c6506053c5c40fc84ed \ + --hash=sha256:4f6e0852a0283b1b1fd776eeb7b766a5f440b3e2bd31ab51af3b400585f3965c \ + --hash=sha256:5066b244f576f91afc8ee3ba029a89f99d39c79b1853fe9d39bea9f0afbec148 \ + --hash=sha256:5086f9975abb1ab531ee6afca1761e4b59a19b446f3f6522ed776963228cfe5a \ + --hash=sha256:50b5bedc9ed8a94fc8857a42ef4f84a81ea88f8d4f05dc8705fb23ee6d8dcca7 \ + --hash=sha256:52704c5d36eb6dda8866493decd61111fff86244c9b1ad225ca01b9e91e5970f \ + --hash=sha256:55ffd6ce583d97dc71dc92e930324c8c0d25aea7e3ade6ae54ef77cedb096811 \ + --hash=sha256:569d65055d367e3dcdf30c3f41119467b73d9ee9faf332bdf40402644f5ac08e \ + --hash=sha256:57f9947a7e57a081c1e3e0a2dd0d2dcf290a4531450e6f611e30084c222a7295 \ + --hash=sha256:5989cb26b2e1efc6a42216a9f6b5ee495ce5ace2e5b352a9af489976b32d1ee2 \ + --hash=sha256:5c22873ad1f0532ba40fa1727f3c0fc1bbbaab6d373d4cbe3f0dc74b2e2521c7 \ + --hash=sha256:5e8b3d0b18fd623afa12ecb2ce8d8becef69f9b5440c6330c7972200e0bb84b0 \ + --hash=sha256:61631e08084be9e21a8967ec3139c7616ed7c5e9368e05c86d1b39562c8a57b6 \ + --hash=sha256:64511c54db4e4987aef4c41923235927428729e8174c5dba488429be70a998ed \ + --hash=sha256:6669c1bf34080161ce49c589cc512ef24d4c704ac9d2b2d3667f519c60418378 \ + --hash=sha256:672d207103e6b16ca098611b0f9efad6bc00afd47c03d6ef62186495ca677dc0 \ + --hash=sha256:6768d67d1bce64270e0fdc2e69309d68b9b18ae56ddf6c711d168e9d051c2cac \ + --hash=sha256:6a45c3d514f2436064db00d7fc8778d888f0236ebfed649b53d13a59e69ad51b \ + --hash=sha256:6bd9e1788e15bfcf6a9082de42e30387e7b85d211ab21e57a939bb8cfaaf8d96 \ + --hash=sha256:6d2a9efe686f9de00d0d1ea32a4a5a86d558a2277501bd78d964214eab625e59 \ + --hash=sha256:6da83a088f8ef93b2d483a8232a4dbf4d69d3d8496b568a03c56becac43e1808 \ + --hash=sha256:7018d4af1cd272e847aa5917983ab5e83e4f6579f9dbfecd4a79c0ca80b144c2 \ + --hash=sha256:71f88e749ea29f67f21f3b36433c1dc54c7729ed2a6d9e2da2e0d9e0d7b224eb \ + --hash=sha256:737c9c3981998eba27f11786f84fddcbabc74068b72a4a1f454ea02094b57b65 \ + --hash=sha256:73e77980c7207854f00fc4e71fb1626868d5740ab4012623d55c7a99ad122a72 \ + --hash=sha256:799c39bdf5e2f1292fedd3009f7b3c9e760f10b2420cb9638d56920840ff6db8 \ + --hash=sha256:7a83aa6e4805df46fed18e989d3d16f86ef60cb50bbc8d9ce3a6be89165fbf6e \ + --hash=sha256:7d3391b2188d18737cb2fa147028b1096236eaa7e156446c650a489fa2cadc91 \ + --hash=sha256:7e1636da3d8dfc220b6dd10264db5f2b165e4888c4518594898fbe381049af8a \ + --hash=sha256:805c8b84534fa10891890f0e4be39f3a99e94615d93e8836bf9fa1fdca2feeb2 \ + --hash=sha256:811d02d5122171c1941357efd8f9bf4ffe907b7f0a1a4e729a880e4be3f46e3e \ + --hash=sha256:8138eb83940ec7299024d92d4dee45f601b9e6c5ffde9d25f4e35e326203c707 \ + --hash=sha256:83b3944fea42a8400edf92fd1770fb8d0d4f7de651353bd2d8525a92dba69a21 \ + --hash=sha256:849dd2bb0e5e4ab2b71c7191726a4a8d5aa8a610daa584728cbee0b710ddc4ef \ + --hash=sha256:8698d70a8081ee8c090dbb394768b5789a1da8b131b5499f89d071dd3cfaf6be \ + --hash=sha256:8781a792a070cf2bd1b86d3aa943894115faaba6e88122a7bf32d62072742453 \ + --hash=sha256:88d59b473bfb03259722600839af9bbd7fa13a2eb514beefeedb95997882f69a \ + --hash=sha256:8909c2f1c6dd65e054ac4b573a91c8384d1492281e55d82d159d653f7a13adf6 \ + --hash=sha256:8965520ac587c94a4ac48b729be3d8b8de00af39699b17585dfb599babe77977 \ + --hash=sha256:8b5d563170ff8ba3181caa967c99a3c804d1dedb702c7cb93a6a7c32247da978 \ + --hash=sha256:8e124f974786f831d6043728e38296969d3579db8896fe004682f5758e613581 \ + --hash=sha256:8f0fac8b13d14bb06c68195f849371924ae53dd7b1c00fed24650f704383b692 \ + --hash=sha256:9240187afb63d2f9ddc3e032c670356fe941f6e20662ea168a5dc3f1f317e1b3 \ + --hash=sha256:925f929d6b59a8b3f8b8c6ac363cd0af7eecc81efb3071770b3c6717c450a369 \ + --hash=sha256:9348cbb300d224fe3b89793262cb093504d4ae927004468463f745188a193e4a \ + --hash=sha256:9388003072b95f2f1e3fd908604194d653ba21330d811961a78b7da1a77e9e36 \ + --hash=sha256:9438a2648b2195980cb2dd8e53ed7b8df91319e2d0b70ae61a9e1d1bc8d3bec9 \ + --hash=sha256:94e4c421742086aeee4c32a506eec8859d7634aad943f7e6aacf70f813478768 \ + --hash=sha256:94f5407f7bc64fa6463906b896f9904beeeb7dd8dc116ee8e9056c8714ff9916 \ + --hash=sha256:971a3bbb75d97ae4e2e8f7d4834236f86f85f0c85e04ab2e191db1123b04f80b \ + --hash=sha256:9e227f3dbe6bde7491cf0a9965d00b88c6b1a4a95d11480ddf88bb96d397c19f \ + --hash=sha256:9e25feb9e330b63edb0278a0acdf85e50d0cb0fbf49c3084abbe4e24ae195346 \ + --hash=sha256:9f098115c247e11d138ab83a28fa0323c77015007ea2df73ba5fd714dfefd67c \ + --hash=sha256:a18f38cafc329bac5e3c2b96c765b4c96d3d103421ed22ab7988c1e3fce27464 \ + --hash=sha256:a4bbd2d87dd233b9fc5812160c3d0ffbe42edc22a26ce0469f58479ede633fe9 \ + --hash=sha256:a5fcffb37e602b0b3c1638a97746b9b96125caa9bcf6fa41d337a9261de231ee \ + --hash=sha256:a8e9f292fcda89b324f2f5c91d13f1424a153e40fc2756f38ee23b15835ff300 \ + --hash=sha256:a9f54054101545a9a9cccefddf54316aa6e4491611fcbef9e91b3b6bebec04f6 \ + --hash=sha256:aa2c838cc024642cc04c6854232f32b43e5e22833dd11119c1766c7873b8370d \ + --hash=sha256:ac0c7c9f1609b0c4c114feb1d7a3409564c7fb77e360bed9e97e5d25dfeaf868 \ + --hash=sha256:add96447a86d205ab616665d53b2950ee81083757f56e6ea833c8b2917646b46 \ + --hash=sha256:ae9dcb8fbe244cb82f8a6458b455b927a03685e383d9bacf1ea5ce180b96dc97 \ + --hash=sha256:b4a635a0487774f841cb1fb62e907e7195cc95bc761e053184b8acc3ceb20733 \ + --hash=sha256:b4d12837e0203bbace818ff4a7461afdcd78bcd782351cea148139180d7bcffe \ + --hash=sha256:b61687d0828e72bf5cda24a2690188f37170bd31c9359ac97e4e66569f120a16 \ + --hash=sha256:b807e598953730f82e4eae3bd30f6a122cf6b31c398c6b504c0e04c13c170429 \ + --hash=sha256:b8cd1f918b26fd7b1832ece557cc18f2d8747309ff8b3f0ef9d4250c5ad67a39 \ + --hash=sha256:b91cc9d336957239ff200f30097e6fea2dc6d6fb3c81e853eaa09eac904fd894 \ + --hash=sha256:bd3ce56ae2cbae3ba82b683bc425cd7e48d2ed8b10f3e818186b6f5646d9271c \ + --hash=sha256:be6cb0c799abb0e2ba3e618e6d28ddddf7e485f6c2ce938dfa237daf3905072c \ + --hash=sha256:befb4158af32106b9a93db8d6d1d1cbbd418c0d5aca0cabb7b1780abf0c89169 \ + --hash=sha256:bf053da3c97a4bc5ecfbb218cdd2983febd91c617be8367d139882aa11e490aa \ + --hash=sha256:c02e8f18bdedba082cef725942ac823b9b60656db07f7e265cb31618dfd00d77 \ + --hash=sha256:c1bc67752d5f21013cfe430df4062441714eab79f65a6a05e01505957e9c35fe \ + --hash=sha256:c61750fadcd119d0825bcb7d7d675dd264dcc89cc05292aab5be68ebdbb374ad \ + --hash=sha256:c90d5b3d4e944e065a301d741b3c1d784f6bd1f503aa68b4967e32b2ba313d85 \ + --hash=sha256:c9a7f43c0b202b334cc9184af09bb8f21d3a209e038efaf106936fb69e6b026e \ + --hash=sha256:cb96e6e088d6cf71c1ea977510948320234824cf226e32f6f6e044f7a9c82b34 \ + --hash=sha256:cf63c214fe879a65e69a386f915e36104fc84254ab141240f8854602d8e0be2a \ + --hash=sha256:d1aca03ede943eb80ab3d63bb082c84b7aab85ea83bd0fd0c200260945fb49d9 \ + --hash=sha256:d2e56fd3b00222722abfb3f5f0759ddbae4b90811b5ad4343c64030ad1bde70c \ + --hash=sha256:d5f93ebbeb8032d47e349328ec8662d973d9b05a70b3c35df1f91fe419b84749 \ + --hash=sha256:d882a373d8093c2941e01291b7ced96e9cbe4781da9a7751ca7e6c70385e5214 \ + --hash=sha256:d920abdfa61279ba1a2ef9484aab07bf03331f8c08a10120fa332353d06e6932 \ + --hash=sha256:da2af0d7aebfc2074080d72efa6ab8317c62481ef1f896f65d9999c1c01f4494 \ + --hash=sha256:dd8ea6ebee7aedbf7c749fa80521d9ccf1ba473e0d1e14805caafbaad281c889 \ + --hash=sha256:de8b364c423ef0a4bad9069657d617f9a5d2b2062457a89b1fa16ee199c399c1 \ + --hash=sha256:df1ae86ff54725a01fa1a0510b914ca53a161b7050be74f6204e24aded5971d0 \ + --hash=sha256:dff05cb7016dff1e9fd68f4122c127b65dfc59de5306cfb7ad92f956f230bee2 \ + --hash=sha256:e1a622f13970d81f95d0c72f9dc090dce9085fccfa4c9f2174377ee32bd15786 \ + --hash=sha256:e49fb0d1ce92cfa0cb198cc5b1b11cdf9d0638658e2a2db2687e39db7c87fc78 \ + --hash=sha256:e5c802729725bd07e2bc3ab7b76dc7e0bbfc53129d8f1eb1c002c24cf774717e \ + --hash=sha256:e841068dc0be4cb6dfb5c890eb88cbdcff2f4a332393c7ec94e8e618bd32c1a8 \ + --hash=sha256:e916035e3e9930cbdfdd10abf48861340221857f45509565898e012263f7b289 \ + --hash=sha256:eba154571c16e032112afac0dc2dfe9e63c2ceb7aedd07bb7eecf2ce26d4dd4c \ + --hash=sha256:f03460ff076f70ab595bb45a0205ccea1971443575b6920c52e755dec2b3fbfe \ + --hash=sha256:f0ec3b750b59375eab5b0fb2b9254810c00a3375be6d789899f1055a1d556237 \ + --hash=sha256:f291bcf42ae98eb5107edb162c3c998b4a89648fd8e99ed4cbd12705292788cd \ + --hash=sha256:f61efe1d2fe0de16158a5fe1d1cf3c14bdb6aecd54d8938fd26512c525c1f624 \ + --hash=sha256:f68edfc67aabac33708941f26f22a7b8e9f81429bc0cf249fcf7d66b23af8d19 \ + --hash=sha256:fa95848c929b6a75f6848d3c9793e59db365ee436776e57db835cdbfa79ba977 \ + --hash=sha256:fd9f8797427910198f95bced71ddfed61130d7e349213bfb8466c9c99e2c46a8 \ + --hash=sha256:fdb4ca07ab75ffadab4a8b135ad59cdbb3156b99310f3d565370da74a15d6bd3 + # via jinja2 +matplotlib==3.11.2 \ + --hash=sha256:01dc8eaaab5a9fce9ff615eca82345728f289e4715b186ee10c6d85272fc26bb \ + --hash=sha256:02329432ae5c6af87cf208ee575b701d698bdf0b1a3bb28cc6d53c36e967e575 \ + --hash=sha256:07d9b9fa60cd4c393692f50d0bb03123242ddf61c99bb0e95e75feb354e7c1a8 \ + --hash=sha256:116cdb0eb0eb5644fc98eb2975d4b4dd4ad35e5c8e6b851c22e6976f371f7ab5 \ + --hash=sha256:1944895967f87c84c9b4bad29a707b31f5b36df4a3a2339ea1f8ea3ce5105539 \ + --hash=sha256:1a3040b209f3968b4e84161df7b174f07a9fad33b0f2d7e48ea3bbd3075e2863 \ + --hash=sha256:1b9a7ad579856284135e401ecc918c5f8a017ee30539298862a109f51b971710 \ + --hash=sha256:254d4ddb2fa8df3b4c689c0c306063aee10521df82cfb438185e499c75fe37c1 \ + --hash=sha256:2a8285cea8ef4d92aa041d1c33788bcae82248503300f93f1ca2136b9049452f \ + --hash=sha256:30ec15d7eefee71de16b7c689b42ba49715a4644650b76a6c7c70d79daf24e91 \ + --hash=sha256:399fef672f7046ef7d6a57572b2a6f9845f3f5afcff04e7b2df7a363a9f42190 \ + --hash=sha256:3aa4b8516fd26659e4363abbf317c703d9116496c5db2e9d0609a2866dd39dd2 \ + --hash=sha256:3da3bc0cbf7245e7db72cc6d29d12c5abef72cb73059c73b945f14e3545f3eb2 \ + --hash=sha256:3e8576f7c47e02fd4f21f44171302d2d1d58d4471d46da3d71fe8899d19539d9 \ + --hash=sha256:57b9ea60a835937c2012861923cbb91f47db8565775d326d1c42fc926aa10351 \ + --hash=sha256:5e1e923a3fc3326b99ec0a6ff1ab1338ac6c6cc62ad9d8a9c944197c7f8c6221 \ + --hash=sha256:643ff850d8e0f5b8319337f87ed3cb59506afb3df3cc48de777d85871233be7b \ + --hash=sha256:75b6d88402770e181b5d06a67dda4129c31da7d05004d63a21c310ec78d1b83c \ + --hash=sha256:79a258f58253dfa025af80a9e9bb228d75fced007f0e93ae7423fefbde81a74d \ + --hash=sha256:7d43ff8cebb50840648cb6429b2228621dbd709010f3117b3740abb20abf21c0 \ + --hash=sha256:7e5a90f8a707ebb6004a713b1cff091a40cc5df4c7c1cb165e5a505ebc11c292 \ + --hash=sha256:7ef7a53b66780e5d942923724f08577fbc5be1f7322da0f0f3f9dcaa45dd803d \ + --hash=sha256:854df8d7dfe9fdffcbaa6f39e44a6c24b409cb4d7561fbc09213b157d833f6a6 \ + --hash=sha256:894a9cbbecbe30ae6787d464df2e8fc7a8d475cfc68f87c3029f7c11152899b3 \ + --hash=sha256:8c8255de28f986d935a64c9ca71c0ec2d2f41d355691f5ea684725dc91413f71 \ + --hash=sha256:930efb28f59fda124e39265d177bab302625297bb147d2910de725a2fc2aef54 \ + --hash=sha256:a24d5fd36e4f0e742c3851dcd20810e56a95633a342e4bf6cb591c678e8fe61f \ + --hash=sha256:a6939df7567114b6bac7f4c5e06c84a67f197c1b2f2e4b234d4eecb3bfec9482 \ + --hash=sha256:a8756cc73d9af9a7fe0deb54ea2e75ef73b01d9e575877e72acad5458e660943 \ + --hash=sha256:af2661f6ac6bbd1d081996f54fdd9385715c625ace8cec0869055c0cfbf38981 \ + --hash=sha256:bbf1062991d826ed27e2144f3afa4461afbb8ff56e8f703043e191a8163b1ee9 \ + --hash=sha256:bc067c462a86f0e57bf52fc6e058d90171a5420007dac00c46e90153050c69a7 \ + --hash=sha256:bf3fe71fbfb8ec0e310e0bc8537c3405a01f38f25f9394ed2135e6202fed542b \ + --hash=sha256:c0b83f044ce10a98027b105b3931548719a6e8c7ef986b4362651e0b5367c8dc \ + --hash=sha256:c27e577ece613ea12a0790e00b4eb80d901c59a3e16cad474f31d8b1529690b9 \ + --hash=sha256:c5c1c68ee401fc98271263410f0e5ce88285abacf7627132914e8adf3d70ff43 \ + --hash=sha256:c9721f81275499da1feeb36a2cf8192ea086283b3bd16b7dc4c9d7aedb7396d6 \ + --hash=sha256:cc82dde2a0d3e3ad472edce04897ad7146b8d8bfd1df8a32992eebb81af18fdc \ + --hash=sha256:cec596316640f2b394b8f0daa0ea61a8eae82d017b620b9f202befb972a59ea4 \ + --hash=sha256:cf41ecd1b0c0b6f7177ed965a54c2afbe888715c7cf6054dc12d53bc1494002c \ + --hash=sha256:d3304eb5a59442a8867f6920d484591c0fa09ffc29e9260be2feec3351e25869 \ + --hash=sha256:d480038c83691532ed52ff3147db51fa902fc78cb2d8349993a1cdb684435bff \ + --hash=sha256:df4f7784aca81a94f254c0a2767d592ee25f407e488f5fa7203e51093fb6ca27 \ + --hash=sha256:e43b188f0a5b75447bcc197728258166aa64365770ed1caa36595a5e1ca4bbba \ + --hash=sha256:e60cf3047a51edecdc4535a9196bbd6a732936b8e9f8184aabf4d16165884aaf \ + --hash=sha256:eac4b07d4e3743b172451e122ea964f72f152879d4f9adcf3f3d33e518f12ead \ + --hash=sha256:eb3712dc9b464793de0a4e42a7313d50293c751f94bddaf7332a1bc71bccdda9 \ + --hash=sha256:ecea603dd2fbf8242fd31a305a8b12a4ece2de28096870c65fdd0d1e35b8d9a6 \ + --hash=sha256:ef31985c4dedb5f1424e1aec6849a47dd37689cb7fa3c20b1b82187f26806261 \ + --hash=sha256:ef752769cd962f39ea0b6ffc82d1ea43a0012c5a6157c7a075212fa509cfcff2 \ + --hash=sha256:f25446b2981717dca9786bac841cb3fd7efb568e3e3c755dd980481c5cb9228d \ + --hash=sha256:f2ac30cf5eb5dff1b584627ae0b0e1186551a4f69ae3c75073911da497a29170 \ + --hash=sha256:fea03cf56568cc1cba08b470be6a0559e71c3a5b688d54b7179bb35ba23d0821 + # via policyengine-taxsim (pyproject.toml) +matplotlib-inline==0.2.2 \ + --hash=sha256:3c821cf1c209f59fb2d2d64abbf5b23b67bcb2210d663f9918dd851c6da1fcf6 \ + --hash=sha256:72f3fe8fce36b70d4a5b612f899090cd0401deddc4ea90e1572b9f4bfb058c79 + # via ipython +mdurl==0.1.2 \ + --hash=sha256:84008a41e51615a49fc9966191ff91509e3c40b939176e643fd50a5c2196b8f8 \ + --hash=sha256:bb413d29f5eea38f31dd4754dd7377d4465116fb207585f97bf925588687c1ba + # via markdown-it-py +microdf-python==1.5.11 \ + --hash=sha256:0f9af347bcc4d036e1290c07cc28d33bacfc84a54704a3aee52c8be61a387a29 \ + --hash=sha256:700b0125bab3e4f1af0c3257e0d06b57655259be7fac3eaa8a058ccff8616e96 + # via + # policyengine-core + # policyengine-us +msgpack==1.2.3 \ + --hash=sha256:07c9733089d1b176c3dd2f7fa268452f9d5d784d076473499d754a58e8d1fbbb \ + --hash=sha256:0955b9000725573d1457c1676944b370dd9643c8d18f25bda5ac72913f850949 \ + --hash=sha256:0c91762c48cd686dc9cf2b142c0bc544083952de32f5853d6624c956e54b85e5 \ + --hash=sha256:0ed5823c4efc20fe87d3530665f40ec18a002be003114814c21235cc8d256207 \ + --hash=sha256:13221a6c81ebb8e43ea63a7251c35d54e4175cea37ebf3a62e911bdf42562a3c \ + --hash=sha256:186e6c602b8a9968b8e864c67d622a69279f7d1e55ae25f40e3bff7e815b2b62 \ + --hash=sha256:18a6ed513023001b28dcd3ba54966f6bb90a38274ba8d2640464bcab3a1b81d4 \ + --hash=sha256:1d6bcec3dbbdb89ca385d3a73e63ceae7b841fa0d7ca7c676f1a7bfe7fb2cdb8 \ + --hash=sha256:1f4ae8bd4ad9ba085fde95e95d055a896d19210238a4199a771a3cf36dceed49 \ + --hash=sha256:1f585407f740a9eac04a3bb82c61d68a0ea78f90e29e670bfb086b9ce3a518dd \ + --hash=sha256:21bfa4d2aa0b04c1806ef778a1199e9e53ea2441bcbf284420a32083896320b8 \ + --hash=sha256:2487453ca1b6104442c6442f9a1a8fee1fe8f428a70d99d4cba799108b304150 \ + --hash=sha256:2574ef81c1c8c38b10e330f3f9406fd09198a776b002030fafcf8e7647e9e06e \ + --hash=sha256:30e1522e4173230dca4d9ad896f038f73c0da6c1edd42f4dbad88ac583cf5d46 \ + --hash=sha256:32edb81a2b5eb7cd7c9d941b2bfbbb082fd2cd09e0e725930316af6b708db186 \ + --hash=sha256:3372475211a9ce1a23acefe512cb3e121d18c95dc74ed56cb1819ef40836ebf4 \ + --hash=sha256:382b219de3d436de3baba0f4b0c6d4336e8f5858d0eb047918b13b69a71c6c55 \ + --hash=sha256:382bc88fe90f29f5ac8a0b65c7046ff255356f2f2f3186c30e370215736fa1dc \ + --hash=sha256:39b6986c19e1f2dfa549d185dba6ccf1de2e4c0ba10d8cfc0048935b1c5f9109 \ + --hash=sha256:3a31905206722103a84c1f72633fe30692cff6732c9d262e09a27dbc468797c8 \ + --hash=sha256:3d4c807ed050fe3ddbea5ba7e9f63d7136871ce42861be1f50ff739f0e91047a \ + --hash=sha256:3ec409b0d6aa8e9eec6eaf881b893caa215dbe68c5319ca96e8a271d81bb111d \ + --hash=sha256:471e12a6a42498a31490c206e0069e343b6a7c35db540be73a879eb06f5be047 \ + --hash=sha256:4c0780095871ecc49a58b2ff6b1b43b25214704da67646557ca287a3f49fb2dd \ + --hash=sha256:59612b4ed48a04cf024584218e813562f3b30a3bafa5f55abe300b15da314751 \ + --hash=sha256:5bd5f91ea75c45cafcc5433ba8fae59b708b736ec178d2441c40c499e9e079db \ + --hash=sha256:5bf390259cb25a6a1cd197c65810999b811f64cd38683251538bcc5a1e41f7d3 \ + --hash=sha256:5c1efdd9181cb1b719ee46865f368a927f1c0c65d577798340b1194545b7515a \ + --hash=sha256:5e0d7950ca3c1bbae291d0552dd3bb2792fc680629c4c0d44e47e5bab969f3ca \ + --hash=sha256:5f304123b90e8b2e49867981b7f6061612c39f50cca51ee88de007c084cf68d3 \ + --hash=sha256:62cc1a4ef0e553bac32c8342e1f04834aca7de276b92744eb7307db77759b890 \ + --hash=sha256:63bb7448a1e9111319ae2430c09a5596140c160422830d6271bc75730ff2ff9a \ + --hash=sha256:6576f348ed6cc4f31db6fd915a8e94245f042f50eae08d48732425e70638ea37 \ + --hash=sha256:666ef5601ab0e6e345e47febc96aa81143cc932201543480cbb9499164f05ffb \ + --hash=sha256:6707d2fa2aa1bb5424ea0b05f44ffc989b15ab41a73ff5855bff4944fec7c8ac \ + --hash=sha256:69ad12cedb674c73527bed869cddb42b742cac79a207a614202a4abaa24ea173 \ + --hash=sha256:6a834097144aabe948b8ca9020a833e8026f7d0abbd0ec54bc7e50f45a8ce012 \ + --hash=sha256:6df430419f2338cb71e4a34d6e64f83c88ccd321f91f40ba4513400b36d864ec \ + --hash=sha256:700bc0fc9e968a292b9137ee70e7a012f7e115bf0107ce45e3a88202788dfc1e \ + --hash=sha256:7013534a7163aa4f213c4d9864f1a8a7555daac6fcd48f699a198e29b436bfab \ + --hash=sha256:7995a7c6a62a1d6e7df211b4a16de513bd99fd053525050a319f80f44fb8015e \ + --hash=sha256:79dfa38faf92f804aa61beec140d70b18418e1dde1778dbb77a87a4cce85aa8a \ + --hash=sha256:7a003b02c6ee2eea6dfe0bb08818631e3597e69f0131f2a8250488a1cc553290 \ + --hash=sha256:7c047250096f9fc19dba26e3d1639b5e7a84114003605c94def667149a70ced1 \ + --hash=sha256:84a6616d396ec1bc18a1e83e67c96a393ec35dfe5e17434a5be7b9aa0fe988ab \ + --hash=sha256:87cf2ef05ff2f2493ba29fcdaef27e960ca64dacfd13460ae29e6f92e0ed05bb \ + --hash=sha256:89c930aece4e972b208ba589c8410b4167b05e411a5ea2cb25fd96f8bc47ee43 \ + --hash=sha256:8ca67f77938ea6a3663aa9bd22b3e031f6da84d665be850abab910ee90728dfd \ + --hash=sha256:8e51eca14fbb65c4e0a5a9657346962bd3dca78c08e04e3d4dee70ef48687d30 \ + --hash=sha256:8ec7a1d49ca6c2569d722ab5ec86e90089b0713900aa31905b47b4c4d9e78ce0 \ + --hash=sha256:902f3490db0e07a7d40b48536a85c9b28fbf1397e7e1658a45a55f958e303620 \ + --hash=sha256:905a189853d6bdb204c7ae5f4ab77fb857448abfff574d3d93c62e2815b24b4f \ + --hash=sha256:9276ba88891338f2617044429dfd080ae008c9868a25f6f1a7d004a35dc9ac0a \ + --hash=sha256:9324c54995641c3d1f92a9d55093c8cde0ffa2fbc87a467a688ef60428393220 \ + --hash=sha256:968583e956d0427878050b371308c5f8647088732ef3e66a117dbe1192ec91e0 \ + --hash=sha256:9d7e9cbb0998bbfd363fd9a09c330520d5e9cb323c05b5a1a05865d23ccf2226 \ + --hash=sha256:a393e428f6ffb0dcb73308c1fff5593041c16ff42da66e5bac8a83a6107a54b0 \ + --hash=sha256:a6b63917d60d6df451f328bd6afba8565e33c4afe1f62ec4ad758b78731c827b \ + --hash=sha256:b1631e12fe572e181cd77e831f69335d6cd5278eac22e3db3f33cf264ac2ac18 \ + --hash=sha256:b774ff994d844e541439ac5d2d49a14def4104830c3465e9394c153f86200ffb \ + --hash=sha256:b949cc25e4a09252cbcc54e66e507de914d0e94a3a7039bd54c299bf7037c098 \ + --hash=sha256:bb89b5dc30469c84bbf8684826eb851d82412ca95690e111b9ac5e8fb343961a \ + --hash=sha256:bfe7d5b62cbe7aa664f0b3e2c49077f10fcdd06183d3014f8271ff3c5edbfbf9 \ + --hash=sha256:c309a7abae1d14ba29a8bd0ddbd704a5e469d8e9bd9c3dee0e4ff53d7ae01d56 \ + --hash=sha256:c77e27790ad72989db783d5303825fba0b71550f00a490efba35cde7dc4b719f \ + --hash=sha256:c942c21a93f36b3a69e828c8945bb72c94dc2ffe488a2086950c812f3edf046c \ + --hash=sha256:ccea05b5542f6d283fef3f0a8e93a7f0be90af0ddeeef84c25c0216ba76dcae1 \ + --hash=sha256:cd5a9f9f86a52c24713679aa2631956835f3842512964ff93f736ff76f1f530d \ + --hash=sha256:d0238cd05dec9ffbe0de1071df685ba63e30a36ac155285b1a094e727c38cbe9 \ + --hash=sha256:d1c1e8989a855b7f1f2a64ec4a80b23a631822903952770813857b2e4f460471 \ + --hash=sha256:d2f9c4f85e47a44d26d5baf3b041eef23436e224d44eed273f01bd8a12048d9f \ + --hash=sha256:d31864ba3933a589b6a00249f89c0eb422197f49128fc10da550e57e9cb0f377 \ + --hash=sha256:d8ef3a66e4b52d2d7fdd90df2984670124b2ff7546d76bb25dcf68ef47f7df58 \ + --hash=sha256:db84203b13aecc222f465061397fdd5b53b7ae73d2c95ffc1c8dc5be0153a709 \ + --hash=sha256:db9fb67a3a2e75247bae569d34ebb5ff61c0448a4f0d6dbf991dae68af39b007 \ + --hash=sha256:e0bd394e999949c814f7912284243298de1b5a17b6a3dcb6cc8a79b156ffc4fa \ + --hash=sha256:e15f70588f4db8cd10df0930145b186de70feb9db51710cd378b1399009655bd \ + --hash=sha256:e54394b7dbe2e12ab032d9d21feef7bb61a90a150a2623633ba3781ba69dcb1f \ + --hash=sha256:eaf7e82249837e3aa97297b34a0bb9ff562027381631e057cea6e1367f10b438 \ + --hash=sha256:ec0030361cc861ac699b2ef1c695b741fa145c88f8667fa3d7e3f73deeb648a3 \ + --hash=sha256:ec90a9ae3e1169fa1171147340f0e97d941aa19fcd3b34e8339a55933ed042af \ + --hash=sha256:ed899d73a22f286a72bd9528d63f2ab3030dbad8bf1527fc249319a50d61fb9d \ + --hash=sha256:ede33b2892ceb976283e009ad12fa1834cfdf1f9c43ee9c97849fc588d00a618 \ + --hash=sha256:f24a43b3560e20f825b807fe1e874bd73d53abaf8bbdcf258a6eb152cddbc1f5 \ + --hash=sha256:f3d7b3d0018746b5997dd6b14a1870b07cc4c327d9101145d94a1fc264a51a06 \ + --hash=sha256:f41ca154b7737b11893cdce3c78c61d703398a1cd54d4297bdad908392338a8e \ + --hash=sha256:f42f146752eedb6765f07dcc04d72dab0a25779ec8d4a88c0085263ce114f22c \ + --hash=sha256:f56fba61b2516be7917cb00151f0d060b5b21184e3499bb57f0f7d9259bea124 \ + --hash=sha256:f9ddd28d3e9bbc602a9dced1591882c7fb9ab776eef8837da2c326fde19e2853 \ + --hash=sha256:fafc3b8898b432b841d30a61082c599fa7f4d06885f9dc58ad72259e12059fa6 \ + --hash=sha256:fcc6800daac4922960f6eeb7a0dda3dd4105e0bf7bce0e83ebc465a78cb7bdba + # via blosc2 +ndindex==1.10.1 \ + --hash=sha256:03cf1e6cdac876bd8fc92d3b65bb223496b1581d10eab3ba113f7c195121a959 \ + --hash=sha256:046c1e88d46b2bd2fd3483e06d27b4e85132b55bc693f2fca2db0bb56eea1e78 \ + --hash=sha256:08bfdc1f7a0b408d15b3ce61d141ebbebdb47a25341967e425e104c5bd512a5c \ + --hash=sha256:092b92c07690292ec7c6b266c38d7e63d254ec8d913ed06f2a8e16103eb7861a \ + --hash=sha256:0ad8e060b26568c4e67c7b1dc2bc64e28597afdaabd7d63f98f655bfe2daa644 \ + --hash=sha256:0f6113c1f031248f8818cbee1aa92aa3c9472b7701debcce9fddebcd2f610f11 \ + --hash=sha256:157b5c34a1b779f5d27b790d9bd7e7b156d284e76be83c591a3ba003984f4956 \ + --hash=sha256:1827a40301405b44ad709e388c5b48cf35cd90a67f77e63f0f17d87f6000fa81 \ + --hash=sha256:1ae21b06235cb0884e97cf672780c170449baa0314085595cfe751705fa352de \ + --hash=sha256:23d35696f802548143b5cc199bf2f171efb0061aa7934959251dd3bae56d038c \ + --hash=sha256:27385939f317b55773ea53f6bf9334810cf1d66206034c0a6a6f2a88f2001c3c \ + --hash=sha256:27a7729a4d33df6b96f7d5edff281d2b987bbe6545031c5eb606b95c47694f54 \ + --hash=sha256:28741daca5926adff402247cd406f453ed5bb6042e82d6855938f805190e5ce9 \ + --hash=sha256:2d6442ecce9b395aade5e9f2431e169e01393953a069f6d2d53a63b6c94d1d06 \ + --hash=sha256:3307817bdc92846b18f309fae3582856f567dd6e0742fb0b41ac68682bfc4e2a \ + --hash=sha256:346a4bf09f5771548665c8206e81daadb6b9925d409746e709894bdd98adc701 \ + --hash=sha256:37f87f0e7690ae0324334740e0661d6297f2e62c9bf925127d249fb7eddd0ad8 \ + --hash=sha256:3b0d9ce2c8488444499ab6d40e92e09867bf4413f5cf04c01635de923f44aa67 \ + --hash=sha256:3ce3bd0882572269ca09285112cf38ce84baa2aaa5891551af968ca7c18f84bb \ + --hash=sha256:4cea15cff221e76abd12e3e940c26124184735cf421c229307f5db6742e14dd7 \ + --hash=sha256:588e8875d836a93b3cd9af482c8074bb02288ae1aff92cf277e1f02d9ae0f992 \ + --hash=sha256:59a3222befc0f7cdc85fb9b90a567ae890f70a864bdeb660517e9ebcb36bf1bc \ + --hash=sha256:5c026dbbf2455d97ce6456d8a50b349aee8fefa11027d020638c89e9be2c9c4c \ + --hash=sha256:5c3634a8df43e7928122225a3d64d850c8957bd1edf2e403907deacb478af27b \ + --hash=sha256:6928e47fb008903f2e41309b7ff1e59b16abbcd59e2e945454571c28b2433c9e \ + --hash=sha256:72af787dcee3661f36fff9d144d989aacefe32e2c8b51ceef9babd46afb93a18 \ + --hash=sha256:752e78a5e87911ded117c57a7246596f26c9c6da066de3c2b533b3db694949bb \ + --hash=sha256:777bb6fa1dc72527fb43744b8c1499ca86e8e110b238d7aad6a686489c23d3bd \ + --hash=sha256:78bfe25941d2dac406391ddd9baf0b0fce163807b98ecc2c47a3030ee8466319 \ + --hash=sha256:78ce45106ebf67aeba99714818c721d8fd5fb9534daebd2565665a2d64b50fc9 \ + --hash=sha256:7da34a78410c14341d5fff73be5ce924bd36500bf7f640fc59b8607d3a0df95e \ + --hash=sha256:8644c76e74c0fbbdaa54752de30b7c6b98b1e8f6c05f0c6228632a29c862d83f \ + --hash=sha256:87f83e8c35a7f49a68cd3a3054c406e6c22f8c1315f3905f7a778c657669187e \ + --hash=sha256:890bb92f0a779e6f16bdbcc8bd2e06c32bcc0239e5893ba246114eb924aecaaa \ + --hash=sha256:8ff1558ddbfedcecd1f6ed7777530917ad08f9c253fcaa8b7152a7aa4ca0264f \ + --hash=sha256:9599fcb7411ffe601c367f0a5d4bc0ed588e3e7d9dc7604bdb32c8f669456b9e \ + --hash=sha256:967b87b88dadb62555ec1039695c347254eccb8ca3d124c0e5dbe084c525fa93 \ + --hash=sha256:9b5297f207ebc068c7cdf9e3cd7b95aa5c9ec04295d0a7e56b529f66787d4685 \ + --hash=sha256:9d581f931e61f182478f18bdf5edd3955899df5da4892ed0d5de547a4cfd5b6f \ + --hash=sha256:9fdf3ca16efcdfbb8800aa88fbab1bc6528e6a0504bcb9cf7af4cb9d50e9f5d9 \ + --hash=sha256:a91e1a0398120233d5c3b23ccb2d4b78e970d66136f1a7221fa9a53873c3d5c5 \ + --hash=sha256:a9a211ec2198994cb3600cd46adb335a740f27e4d406b40d48ed7b98d2d2a89b \ + --hash=sha256:ae73cd2d66b09ef2f2a7d7f93bad396d6abf168d1ee825e403c6c5fb8ae1341c \ + --hash=sha256:bada24abee6bc6ca438b2e6b68a752fc9b58b67bdcb54008e2bc6330ecb0a777 \ + --hash=sha256:bc236d1612714cbd80610cf25a6ef92584ff1402e9d5a5c50e926195716f7d22 \ + --hash=sha256:c5e9762452b163e33cfb6e821f86e45ba0b53bdfcd23ab5d57b48a8f566898cb \ + --hash=sha256:c65ca639a7abf72d79f22424f4abd18dece1f289a2b7b028a0ca455edd2168d4 \ + --hash=sha256:c67dde588c0fb89d872931a4ed5f9b4d21c1c70a3d92fdf0812a1de154239816 \ + --hash=sha256:c9dd58d91220b1c1fe516324bfcf4114566c98e84b1cbbe416abe345c75bd557 \ + --hash=sha256:cb76e0f3f235d8b1c768b17e771de48775d281713795c3aa045e8114ad61bdda \ + --hash=sha256:cdb86a4176f2ae23bd4bcd0401ca35d5dad2d1ed0d0dca1ff64480ebe41b75d9 \ + --hash=sha256:cf5855881884b8467dfcf45764ccf2e4279075be14b155b89c96994bb08d2e6f \ + --hash=sha256:cf80241b40adffdc3276b2c9fb63a96c6c98b4a9d941892738de8add65083962 \ + --hash=sha256:cf9e05986b2eb8c5993bce0f911d6cedd15bda30b5e35dd354b1ad1f4cc3599d \ + --hash=sha256:d0ebdba2fade3f6916fe21fd49e2a0935af4f58c56100a60f3f2eb26e20baee7 \ + --hash=sha256:dc7ebdbd465d25f29a9cd7ba31c304172351fc85626835385bcb72807d309a9a \ + --hash=sha256:e2ad917bcdf8dc5ba1e21f01054c991d26862d4d01c3c203a50e907096d558ac \ + --hash=sha256:e69a2cb1ac7be955c3c77f1def83f410775a81525c9ce2d4c0a3f2a61589ed47 \ + --hash=sha256:e81a9bd36fe054b6c9fcc53d26bc9a28cf15d1ab52a0f5b854f894116f3a54e1 \ + --hash=sha256:e851990a68937db5f485cd9f3e760c1fd47fa0f2a99f63a5e2cc880908faf3bb \ + --hash=sha256:ef3ef22390a892d16286505083ee5b326317b21c255a0c7f744b1290a0b964a6 \ + --hash=sha256:f77c4fd3f34c53037678020ab4e060da4bbdcae3a428797c7cbec69a6785dc93 \ + --hash=sha256:f99b3e89220da3244d03c9c5473669c7107d361c129fd9b064622744dee1ce15 \ + --hash=sha256:fa60637dfae1ee3fc057e420a52cc4ace38cf2c0d1a0451af2a3cba84d281842 \ + --hash=sha256:fe5341e24dc992b09c258456ac90a09a6d25efdc2cb86dcc91d32c8891e1df9a + # via blosc2 +networkx==3.6.1 \ + --hash=sha256:26b7c357accc0c8cde558ad486283728b65b6a95d85ee1cd66bafab4c8168509 \ + --hash=sha256:d47fbf302e7d9cbbb9e2555a0d267983d2aa476bac30e90dfbe5669bd57f3762 + # via pyvis +numexpr==2.14.2 \ + --hash=sha256:022e61a3d5dbf5807746264b62126d1c2c24057ad90052478a4d4482ab2555c2 \ + --hash=sha256:0741efbd75c284e709b0fd430c85c31982b44c9962922ba8a9cbbea1bf413321 \ + --hash=sha256:149ab5744a5222f07b1d60455c4021c754d395e44938944ac7c7c2495f7feb54 \ + --hash=sha256:1d4593e2c6fa060cd7441e8b6ef25c16321a6be2144b3c82d1e00885f1fb6e94 \ + --hash=sha256:2aa65ddc2243f19c6915f34ee0978b4a2df20f297230a793c4ee6d55f3472599 \ + --hash=sha256:2aceefa08f8f86317fa6e8fe9f6dc20d24ab8365d715be4a26306acf406d2dbe \ + --hash=sha256:2ef72de3d3dd466cb0c435cae7141c99b0f8091b1eae9d03dcb38690f56c3f79 \ + --hash=sha256:2f132777d7d425471c458af5617e023402f13f5006301eacf8a1a6e7118ea70c \ + --hash=sha256:327be9ee62251c173236dc620147ff2d0e732a32f5bad918d78a10082f502f63 \ + --hash=sha256:375d8bee15be42dab22100a0a3de05fe6689a2de853eca012858768a9a7e02ab \ + --hash=sha256:41cdeacf1b4e51c1143983ea61fcee68139ca47222b55a9265b4fa73826c4260 \ + --hash=sha256:449a57fb9d38de136e742b1fc429572b42f29778f1d695c3fe50ffec9d3c9a71 \ + --hash=sha256:44dc6b1dfa9abcbfc9917297f0d2af7c87c16b6ecd45747a8e70f54399a3a2f9 \ + --hash=sha256:4b1ff261c3e69c4c59578d3a9ca6132603619d38ae1abe73325563bed3b9bbaf \ + --hash=sha256:606ceaf5722e295ef965ca591736fc26d9e5f13ad950a479e64cead1947f8a3d \ + --hash=sha256:66f3b125b1104241322811de87918724d6709bf082dc0703722d0cecb7b29e82 \ + --hash=sha256:6acafb2fdbeaaa6681a8f1a1d8b3f7dcd33704baace7057b950754b258be7c43 \ + --hash=sha256:76e87c7bd70d721ce4d418e81f4fb7ecf9e7e67d7cea8102527b07fd3d3facf9 \ + --hash=sha256:779129d50974e7d6d6581d322f75b8f8375e96215b6861a2d5460347997ef649 \ + --hash=sha256:790da022539fe7c37dc893acf530a91c2ca6964d7ba11f464131383729d058f3 \ + --hash=sha256:7ca9e71195b36cc7aeafe97347549e1e1c1e889ff700238782ef6447651ec26d \ + --hash=sha256:806a4471310fe20aa7cb1b2816a6f5e508073a1ad1c2e18041b83e57066fad6a \ + --hash=sha256:8274c51ae1842948f3ae7fe6951a23dcf4ddcbeeaff3737e978e7740b754662d \ + --hash=sha256:8b8384592c49cb15a91caa54e2cd84d1ce18edb7af030bb76cd29b52e5dc155d \ + --hash=sha256:8fc55d14bcf17b3fe69213bea14f999451892b4690717008c66f2edfd6a085ce \ + --hash=sha256:91e7928435f14fcb351c0157000bce65122b897cc8b0df6bcc48251f25850a6d \ + --hash=sha256:92b00c78664070e3af155c6be713a0a5d75d598647ce32a5609adb79a8f961d3 \ + --hash=sha256:93233040f4bed3bce5abb0c2d20aeb1074511f29cbaa9c14828f86bcfa44d321 \ + --hash=sha256:939c89f613b814e64bb568859397dc9f99b219c3ef681a72fb99a86e435262f9 \ + --hash=sha256:a404c9a55902572eec810068d06b79a7c99e96f0400f5a7d73f39dff5ec5e371 \ + --hash=sha256:b02738853b9b5b8a995f6c680f8f6ef33e8f419395b8fa380e38690495fdb911 \ + --hash=sha256:b20c1c55aba7812ff2f2c6a50006425d02282fabb1eaf8d75fe638ffcf6deb02 \ + --hash=sha256:bac00898930f962f360c3d763a8e2273fc931f65a1759ff1bf64b3cf13d65aee \ + --hash=sha256:bf959e6df6cb603611c034b6cba7b03a361be0ad0b80b73f163fab95f5ccbb7f \ + --hash=sha256:c1ffaf805d8636c3f95d0996517ecf9684c9ac62d768030ca78d1d00af2b3504 \ + --hash=sha256:c66925deb968f0b5280f723e2bb5918c11e6be2ca60e9e1530006286ab44031d \ + --hash=sha256:cd684ac9daa539fcdac3437678834797b29d7780cfaad71111745132d466d51f \ + --hash=sha256:d534ecb456a4ae3995f99c8a5deb469bfff05d4ec610a7885c175c881d12f710 \ + --hash=sha256:d6a5d8fc7016bf6f6e1808b011510aa7c3bd75ec1407f7650874ec591db59f5e \ + --hash=sha256:dd905922d7dce457947d54b84c7ac345cef37332b724445e159a5a1a2080ce2b \ + --hash=sha256:e7144e83ea9e581f2273e0304f15836736c4e470e2bd2e378ce617662a1ca278 \ + --hash=sha256:ef576a1cded27ba2f3129bc3c42df452a1c498072680d560793f98b0024cd7e6 \ + --hash=sha256:f1de5c88515ed9fbcad42699a0e2b5821b4d0f0adb0da6fb7e009e5cb19d8493 \ + --hash=sha256:f3526699350f94c6277fb16863773a1af9defd95a6f78bbd69b1f0338fd94756 \ + --hash=sha256:f41170e9d0dbba76851e35d80cfa9f4ca5fe78628c5bf24d941cf3364940ab7a \ + --hash=sha256:fd2f5882a66a7792aa6614c68831aa20085b499d41422aedd001080624ebb14c + # via + # blosc2 + # policyengine-core + # tables +numpy==2.4.6 \ + --hash=sha256:001fbb8e08d942dd57599e781f2472269ee7f2755fae407b4f67b2f0b17da3f1 \ + --hash=sha256:0280e0356c0829a18d9de1cb7eee50ec22ca639878d7240307ca0943d73cd2c4 \ + --hash=sha256:043191bfa8eab18c776647b62723ac9dddece59743b13f49b2016094129c2b3f \ + --hash=sha256:06ca2f61ec4385a07a6977c55ba998a4466c123642b4a32694d3128fce18c079 \ + --hash=sha256:0a041d3d761dc3c35cc56ce0351506a02bcbc25f7b169f652435141a17db9096 \ + --hash=sha256:0ab0a9c4ffb1a6d95ef519fe4247dba8eb6b18ad93999f76b7f657039acabd47 \ + --hash=sha256:0c9136e14ed34a9e343a31c533d78a9813a69a3148332bce5e9821cb2f996e66 \ + --hash=sha256:110f8b71aacb688ec69062bb7f6938a0f8acb01b7c1c4beb453c65b6d234584d \ + --hash=sha256:112b06a867b235ef466ed3508ddf0238050df9c727cafb5301ac385b899189a1 \ + --hash=sha256:17f9ade344e7d9b464a084d69bcf18fc691cb1db67c62ed80820bf4926d78f0e \ + --hash=sha256:1e254a00cdf42b1e4d5b3d68d33af63268d41340d8885df2ab6470f2e1500147 \ + --hash=sha256:1e978ec1e8bd0e0e4de6bb75de9d30cbb74db6b6a2bb727618613703ca0167dd \ + --hash=sha256:25c692919ac5a01f170a3bfcd62d745b24fd095c353d50812637d6fcab442e75 \ + --hash=sha256:260a5d70215b61ab4fadf5c7baacd64821842975eea312125ed3c39a6391b063 \ + --hash=sha256:2803abfebfc990042cd494d8ce2d5f82e9d847af6d35ec486923aa19dbad5e73 \ + --hash=sha256:29a287e0cf63ff528da061de6b9f64a4618da591ca1046aafc54062e40ca7eab \ + --hash=sha256:29cb7f67d10b479ff07c17d33e39f78c07f71c40ef30d63c153d340e96cd3fb4 \ + --hash=sha256:3213d622a0283a39a93d188f3cf72b26862df52fbb4ca3697f51705016523d41 \ + --hash=sha256:33111801a01c12a8a1e3721f0a9232f8cfc8ae2c6b7098167e6f623c6073f402 \ + --hash=sha256:357cc07a6d7b0b182ff02249616a03742827ebb1277546b5c7cd7f7620a45698 \ + --hash=sha256:38efbc8de75c7a0fc1ac190162d892787f3f47b57cc291231aafee36b80982b7 \ + --hash=sha256:4081eb135ac24158bd51cdfbef16f1c64df7063b1143f24731387137c092bec8 \ + --hash=sha256:40fdc1ae7125e518ea98e53e69a4ebc27e1fd50510c47b7ea130cf21e5e1d42b \ + --hash=sha256:4cfe66903cc32a9921a6733d96b19bb6abf310397581bbad89c228f5abaf0ee8 \ + --hash=sha256:511dbaf848decaaaf4b4ca48032619fb3138710c4bf7da7617765edad1ef96b0 \ + --hash=sha256:55cced7c52e981362f708ad635198e97a752dfba412cc03c23bbf3bd8d5cd662 \ + --hash=sha256:56b39e5e0622a09a25bf5baf62f4bcf0cb8a41ae6e2819cf49bbc5a74c083f91 \ + --hash=sha256:5dbbdb29840ca3d91ee0fece42fc29278886d908280bfec0a5846c6f901a3eb0 \ + --hash=sha256:5f9fb9157b4ce2971008323afe46053787b526ef624fea915b261468a8421a0f \ + --hash=sha256:6180d8b35af935aed8ece3a85e0a43f87393ae0ac87c8d2c8bd2c993f7270ef3 \ + --hash=sha256:68a5124b13fa6cc2086764a20005d30bc0548146f7f5322f02fce212ca14317f \ + --hash=sha256:68bb27509ac1b9a3443094260f6326150663b06abe40b73a2f81160623da5b67 \ + --hash=sha256:6f41ae150c4e32db4f3310cdaf64b1593a03dbabe29eec77fc9b50fe64061df6 \ + --hash=sha256:7265a2f3d436e54ef9f2b52b5c937e6be778781bd97a590319d7348f1c1ca997 \ + --hash=sha256:72fbe16c6fac95aedf5937fa873445cec2110be35d8a4e9433d7501fd98dae6b \ + --hash=sha256:7d92c3819208a60205a12a245c91ad70cb0a85336659b19b834205573ac8456e \ + --hash=sha256:8155154c7c691289fe18f510b5d4657c68c67989f293f0535a91360392ff6538 \ + --hash=sha256:81a1cca95ed5bb92aa8b10dd2cdc9a0d3853a50fad926c28b5d7e8ea54389627 \ + --hash=sha256:89cd468399cfd2504718f0ba50e410dca55a170b61a02ad92bb18c8a65186e93 \ + --hash=sha256:8ad03c0965fb3c692200e74d458ca28c1dbb4ce96f9a479a8aa041ad5fabca02 \ + --hash=sha256:90f9849678c75fe7afa2d348ac842c168b0a4d3d61919687216dfc547976d853 \ + --hash=sha256:948424b06129ce883307e8cff868c31396d8dc7630a59c61d70d98dbe70f222c \ + --hash=sha256:9cd5ffd25db4e7ba6a375693b3fc0fc1791ec636c17db3720da19bde7180ec43 \ + --hash=sha256:a0df0043bdb289bde1f62da130d20df23d58b45429f752bc7a8fc5325a225ecd \ + --hash=sha256:a2c306dea656c12c68f51f4cea133cbe78ca7435eb28c735eac1d3ebe73be6e8 \ + --hash=sha256:a7830bab239b79cda9c08c2da014761cafb48da6150e1da17ac06283f43b6089 \ + --hash=sha256:a7c711e21628b52034bb5ab8d1bce291f752fcc5e92accc615778acee1ff4778 \ + --hash=sha256:aaf159caa35993cb1f56fb9b8e4610d35758e7ca005412eb1daa856a78c9c4b1 \ + --hash=sha256:ae506e6902902557576a26ff33eda8695e7ecb3cb36c3b573a0765dee114ebdb \ + --hash=sha256:b507f5c4c1d508876d1819b6bf9a49d365b96320b5d4993426b33a23ca4b8261 \ + --hash=sha256:bf162abab1c1a736333192707cef898e735a5ca00f38f27eeedf44b39d9e85eb \ + --hash=sha256:c1a2af6c6ef86344a6b0db6b97834208bf598db514f2b155042439b62605601a \ + --hash=sha256:c2d37ab77531417474168eb79d6d80b14f821a966818505d03013d0833edb7a8 \ + --hash=sha256:c4fc99836233ea196540b17ab0983aff60ed07941751930f5f4d05bc3b3b7359 \ + --hash=sha256:d581b735e177fdcdce6fed8e7e8880a3fb6ee4e3653a3ac6af01c6f4c03effc5 \ + --hash=sha256:d6da64deb6b8ed903e7560180a92f2d804ee1ba5eeb849ac2748b8c1aba1f6d7 \ + --hash=sha256:d8e8286dd7cea7895157318d1b91cdacac64c479f3cbc8dce548331728484751 \ + --hash=sha256:ddea102b48f9e339f3948bf22040944184627a30fdf7f858667673b9c5f033c8 \ + --hash=sha256:dfa20cc6ca228e6b155b11da03825975ce66aea520985dbbddf0f2a5a495c605 \ + --hash=sha256:e3e5193ef5a3dc73bceee50f7fdc2c90dbb76c42df8d8fae3d1067a583df579e \ + --hash=sha256:e3eeb0aabd6bd5ce64faae67e9935203a6991b4bc2a485a767fbafb2c5125f45 \ + --hash=sha256:e5805d5a22fd19c8ccff10a9561f9df94436b0545619ea579db2d3c35294bce2 \ + --hash=sha256:e85b752a1e912b70eaad4fafbd4d1238007ab221de2009b9a2f5ae7461239895 \ + --hash=sha256:eaf7fa2de5c0be8ae6ff8e9bea2ccd725e980541244521d8d4b5f3354a27babe \ + --hash=sha256:ebfb099f8dcf083deef3ac1ca4c1503f387cf76296fcb3816b66f5ecb5f54fdb \ + --hash=sha256:ece3d2cfe132e7d51f44a832b303895e6f2d499c5e74dfbdb06ee246147a304a \ + --hash=sha256:ed9749eef4cbd126da3dc1d6bcb3a57f5eb7ac6a6484146bdbf743f552dfc577 \ + --hash=sha256:ede83e07a75dd06bc501566c1eca2afc0d61677c1472ac9ad93fdee6e638a48d \ + --hash=sha256:ef4aea96ce4d3b074422cb4f2f64e216bf9e213004bb58ecfdf50ea02ea8eb9a \ + --hash=sha256:f3a3570c4a2a16746ac2c31a7c7c7b0c186b95ce902e33db6f28094ed7387dda \ + --hash=sha256:f407cb6b8e9d6d8c626bc73c945db1706035af8fd632295547bf1c9e46d092d6 \ + --hash=sha256:f74a575920ab21fe304421a3fc28793d82e299cae9eccb37084e9fc7f3617c20 + # via + # policyengine-taxsim (pyproject.toml) + # blosc2 + # contourpy + # h5py + # matplotlib + # microdf-python + # numexpr + # pandas + # policyengine-core + # spm-calculator + # tables +openpyxl==3.1.5 \ + --hash=sha256:5282c12b107bffeef825f4617dc029afaf41d0ea60823bbb665ef3079dc79de2 \ + --hash=sha256:cf0e3cf56142039133628b5acffe8ef0c12bc902d2aadd3e0fe5878dc08d1050 + # via spm-calculator +packaging==26.3 \ + --hash=sha256:94edc256424af38762eb31306eed28beb9f0efc50a8837492c9d6fd6004aed79 \ + --hash=sha256:d7193f7c8e4e93f444fde0262bf90af30e16fa0ad0ad44cb553c87339b23cd1c + # via + # huggingface-hub + # matplotlib + # plotly + # pytest + # tables + # wheel +pandas==3.0.6 \ + --hash=sha256:0704044b676496b8350e023b09f174a26772456c974a2b11c36bebb558c9490d \ + --hash=sha256:085e3786ae6b2e82b406266bce36690f72b9dc1421903ba9296b2981a9fcf586 \ + --hash=sha256:097090508a1dd335013d39106fc10b20f4fd4a171638e47b77d55798ed9dab6c \ + --hash=sha256:1bcb3e9ed29e74a7439cedff9e2aefd3ea65de84d7de9ccb6c194192541bd60e \ + --hash=sha256:1e7c0afdcaf6661d795fcefc2f647ddd1136f62cdc153fba177c685d97a87808 \ + --hash=sha256:1e92d9fa834c7d877130027cddc0cad8dcff97c1f6cca26bd6310f847228b658 \ + --hash=sha256:22172a92e7ee678ec0140c7af4fc9366b55413834a1cd86af78b3caa0b0574de \ + --hash=sha256:253e12cb9081b0afbac607920f6142975966bc315135e09de275fdbaa415d2de \ + --hash=sha256:265f562fdd1079f69f3de96dd425c3405224038c0af4f920c54bd240ee2c4640 \ + --hash=sha256:2a8fc94be2ee5f1d86f97aacd8cc566f81680b6498e76f3007421bb5d98151bf \ + --hash=sha256:2e5fa32ff162dfdbc280157d664f44d23049ae414725af9676df339c501d82cd \ + --hash=sha256:3ef908d28590b3f42d7070e7ad8f9b34b442b260b7f3c1afb57e0040c58cdb1b \ + --hash=sha256:429d9df32731ab01383ed98f2baa7a60368090d1a94fc06019a12062510e8630 \ + --hash=sha256:47121f9571503f724c9b93e297ab6254ac99c77adf5e9ed085ea419fd585c258 \ + --hash=sha256:4e25e2e1adee99ddfada6f7206a79ae8e9c8a8861b0e3eaaba165006d3eef18e \ + --hash=sha256:4ff44b2cb51cbd691c91f92c4ea6c71e34003f239ebd67c2e857dc898466b49c \ + --hash=sha256:50c44cbf5820b6b91a5f74aae04972472aefadd3cd9fbd1010409d85528bd570 \ + --hash=sha256:569e114072b24fc4970c12e2b4bab252671668a40b324318903380cab0254c0c \ + --hash=sha256:583be68728a31d0d750d5b8d9e00f02b153df0d4655f858bde93cb84cfc4227c \ + --hash=sha256:5e75072773c1b2f7cb63faa3a6f562aede11f3976f68ed34cb538bc091a28171 \ + --hash=sha256:5edd0a7abb0986ecce1ac81f56d99b6763f86aa6946dceb6c661224f90af5a19 \ + --hash=sha256:60d81f9e1799b36f3739e7fff44d1fbb2e8fd5a271b3863e03de9715fccda0fa \ + --hash=sha256:62f51d7f651c8054c5e82a69265c98082e795d1442df7ca6edc3a545d61214b1 \ + --hash=sha256:654aae059295dbba6ecd2328ca12712a2cf1676214c8699f1c29213f7ccf9c34 \ + --hash=sha256:66b07ef7315a31bfe1089cd3d71a7de781c9dca986762d0b4fe7c0ef17465d10 \ + --hash=sha256:6ff482fa91fa2bafd92e8fe66ce3645c851824310f295c1f0a2f96e928fc4541 \ + --hash=sha256:77ccbe5057aece6fc172b9b77f19c04335af6882bc2e10c8f3ee4e6bfb3da553 \ + --hash=sha256:7dac2d65e9087e8e7b5a45fe15c4920911a221df061ab629943ce016489145c7 \ + --hash=sha256:83e91d15738d7783c050197cef2f2cf82fc6353dae9865aa87ed1fa16aa4d55a \ + --hash=sha256:86fa853a12e0b70927e2b1ee00d56d2224ec9cbb4b9d58348b5ad52d2f21150e \ + --hash=sha256:8fe77b408d82e2615674dfed62533b95e18a03610573877422aada4f625d4947 \ + --hash=sha256:963ca21199097a84c7827c4678b04e30833084fbf8ef44fde3fa7180a29f8fa0 \ + --hash=sha256:97274c9adf6255bb48c620cd6959805efa7f09ea2167f0e0ae006a448cd2fca7 \ + --hash=sha256:994a79608263fe1c14cc48ffa7300e2b834b7d1cb406ffe96a08828cb0cdd79b \ + --hash=sha256:9ae8073aed8e21d1a7fe263dcdc6840743549722a6738198a0a46000fa9476f2 \ + --hash=sha256:9dab635a549e58a053c7b0fa054dc0bd7be22f0ed9a720f4a85d5fb993276172 \ + --hash=sha256:9e492cd4bdba6778de4fe0df7f4590c012161ebcf9902dce01b01dc683105514 \ + --hash=sha256:a3a22e07fe75347eaacc75b0e85297947af4fba6b4aae23916bd8b6828d0bba3 \ + --hash=sha256:a4dbd4dc65cbe645b92b8785d0f96dd7311010dc6606cf620e51b07b8788a12a \ + --hash=sha256:a77a1a44e4d88f1c6a2a64d3eb12efec8420875722e14279800b173a7c7c2804 \ + --hash=sha256:b27c8d890e4aa2171437ae2a39de1d215e674158e4865c4023a8b31c932513b2 \ + --hash=sha256:bd75ed0c840f709fc2ae26ddd9534ac77ca1a48ac0cce521a74acaa85f3340a7 \ + --hash=sha256:c6e4aae3e9bea26c6c9a20d88d96c86ec4a99b4db5fd516bcb4e829ab2c0ee36 \ + --hash=sha256:c826e9babb7790142c399f58599d8de679bea059d7b39c5b6efa2096fac37266 \ + --hash=sha256:cc39303913e2ea129915670de5d1c9fbd647f543bb72e5543bac8baa94e9e42f \ + --hash=sha256:d7564d86a94c2eb8ab290b07f63ddaae5c032fa53897c29a2ff2197d43aee8af \ + --hash=sha256:d7dcd21238cbb4828ff148481ba01cac8946dc5121457b5aeba28636f8f99a60 \ + --hash=sha256:db7ec631f26223beee8e5c9e0b8f23c24d8197bbd1d982421d4e3188bea51965 \ + --hash=sha256:e3dccb584123b399c07562ac4d62543e90ede49ddf8ce3c13ffc64cbe828c281 \ + --hash=sha256:e7c1905ef02c3d6d43d9dbd5b6ccb4da4870a0b0c821bbc103fbdb6f3ad2707b \ + --hash=sha256:eb6900de08ac85f93ac4948aa6b80842eba555875337b8359035ac9c43e92d34 \ + --hash=sha256:ee913a91669056c1de1a6b733fbfeab711de9e54e3bee2dfa5fe79d9457247d1 \ + --hash=sha256:ef738d71d1059245b6bb03e312be06d8b3821326a83486c1ad03b9aba3710e44 \ + --hash=sha256:f3ce8a6968045481e91a3990e797e348ce13db45ee164a7095bbc824e26c09dd \ + --hash=sha256:f4e7c52eb108d752e7592268108fd3e98efd76d83a3125cdd06c621c2e44359b \ + --hash=sha256:f8029ec0f1f89e4f985929ce1f6626dabf3140d61a4e9c1215afdab34eaf9a5d \ + --hash=sha256:fb625f426b375bcc96e3a04c5d5d266cd7be6ae5d6866e0e703382ab5164068c \ + --hash=sha256:ff51a4459ed036e93d1eb1bb5e6e7b28685d3cb6b7c12b91c05b31024e234729 + # via + # policyengine-taxsim (pyproject.toml) + # microdf-python + # policyengine-core + # policyengine-us + # spm-calculator +parso==0.8.7 \ + --hash=sha256:a8926eb2a1b915486941fdbd31e86a4baf88fe8c210f25f2f35ecec5b574ca1c \ + --hash=sha256:eaaac4c9fdd5e9e8852dc778d2d7405897ec510f2a298071453e5e3a07914bb1 + # via jedi +pexpect==4.9.0 \ + --hash=sha256:7236d1e080e4936be2dc3e326cec0af72acf9212a7e1d060210e70a47e253523 \ + --hash=sha256:ee7d41123f3c9911050ea2c2dac107568dc43b2d3b0c7557a33212c398ead30f + # via ipython +pillow==12.3.0 \ + --hash=sha256:00808c5e14ef63ac5161091d242999076604ff74b883423a11e5d7bbb38bf756 \ + --hash=sha256:04f01d28a6aaff387bf842a13be313df23ba0597a44f1a976c9feb3c6ff4711a \ + --hash=sha256:06ff022112bc9cbf83b60f8e028d94ad87b60621706487e65f673de61610ab59 \ + --hash=sha256:0740a512dc522224c77d9aa5a8d70d8b7d73fb91f2c21125d8d025d3b8990e45 \ + --hash=sha256:0847a763afefb695bc912d7c131e7e0632d4edc1d8698f58ddabec8e46b8b6d3 \ + --hash=sha256:0dd2064cbc55aaec028ef5fbb60fa47bb6c3e7918e07ff17935284b227a9d2df \ + --hash=sha256:0feb2e9d6ad6c9e3c06effe9d00f3f1e618a6643273576b016f591e9315a7139 \ + --hash=sha256:10e41f0fbf1eec8cfd234b8fe17a4caac7c9d0db4c204d3c173a8f9f6ef3232b \ + --hash=sha256:1182d52bc2d5e5d7d0949503aa7e36d12f42205dc287e4883f407b1988820d39 \ + --hash=sha256:164b31cd1a0490ab6efae01aa5df49da7061be0af1b30e035b6e9a1bfe34ee6e \ + --hash=sha256:1657923d2d45afb66526e5b933e5b3052e6bdea196c90d3abb2424e18c77dae8 \ + --hash=sha256:186941b6aef820ad110fb01fb06eb925374dc3a21b17e37ec9a53b250c6fe2d1 \ + --hash=sha256:1cca606cd25738df4ed873d5ad46bbdb3d83b5cbca291f6b4ff13a4df6b0bbe8 \ + --hash=sha256:21900ce7ba264168cd50defae43cd75d25c833ad4ad6e73ffc5596d12e25ac89 \ + --hash=sha256:236ff70b9312fb68943c703aa842ca6a758abfa45ac187a5e7c1452e96ef72b5 \ + --hash=sha256:23aceaa007d6172b02c277f0cd359c79492bbb14f7072b4ede9fbcaf20648130 \ + --hash=sha256:23d27a3e0307ec2244cc51e7287b919aa68d097504ebe19df4e76a98a3eea5bd \ + --hash=sha256:24870b09b224f7ae3c39ed07d10e819d06f8720bc551847b1d623832b5b0e28d \ + --hash=sha256:251bf95b67017e27b13d82f5b326234ca62d70f9cf4c2b9032de2358a3b12c7b \ + --hash=sha256:25b9b82bb22e6e2b3cd07b39c68b7b862001226cb3dff7130d1cb914121b39ed \ + --hash=sha256:28ce87c5ab450a9dd970b52e5aca5fe63ed432d18a2eaddd1979a00a1ba24ace \ + --hash=sha256:300557495eb45ebb8aec96c2da9c4be642fbf7cd937278b4013ba894ea8eb0eb \ + --hash=sha256:30f2aa603c41533cc25c05acd0da21636e84a315768feb631c937177db558931 \ + --hash=sha256:331b624368d4f1d069149002f25f44bc61c8919ce8ddb3c45bdad8f6e2d89510 \ + --hash=sha256:37d6d0a00072fd2948eb22bce7e1475f34569d90c87c59f7a2ec59541b77f7a6 \ + --hash=sha256:37dc8f7bbb66efe481bb60defacef820c950c24713fb44962ed6aa2a50966de1 \ + --hash=sha256:3b8182a766685eaa002637e28b4ec8d6b18819a0c71f579bf0dbaa5830297cce \ + --hash=sha256:3edce1d53195db527e0191f84b71d02022de0540bf43a16ed734ed7537b07385 \ + --hash=sha256:446c34dcc4324b084a53b705127dc15717b22c5e140ae0a3c38349d4efec071e \ + --hash=sha256:4998562bf62a445225f22e07c896bb04b35b1b1f2eb6d760584c9c51d7a5f78c \ + --hash=sha256:4b0a7fe987b14c31ebda6083f74f22b561fd3739bc0ac51e019622e3d72668c7 \ + --hash=sha256:4e8c2a84d977f50b9daed6eeaf3baef67d00d5d74d932288f02cb94518ee3ace \ + --hash=sha256:4f883547d4b7f0495ebe7056b0cc2aea76094e7a4abc8e933540f3271df27d9c \ + --hash=sha256:514435a37670e3e5e08f3945b68718b6ed329bb84367777e16f9f4dfe1e61a0f \ + --hash=sha256:53aa02d20d10c3d814d536aa4e5ac9b84ca0ff5a88377963b085ad6822f93e64 \ + --hash=sha256:5594fc43d548a7ed94949d139aa1341b270f1863f11cfd37f5a6c8b778a6b67f \ + --hash=sha256:571b9fcb07b97ef3a492028fb3d2dc0993ca23a06138b0315286566d29ef718a \ + --hash=sha256:57b3d78c95ba9059768b10e28b813002261d3f3dfc55cc48b0c988f625175827 \ + --hash=sha256:5afb51d599ea772b8365ae807ae557f18bccfe46ab261fd1c2a9ed700fc6eb17 \ + --hash=sha256:6b02afb9b97f65fbca5f31db6a2a3ba21aa93030225f150fa3f249717e938fb4 \ + --hash=sha256:6c0016e7b354317c4e9e525b937ac8596c38d2d232b419529b9cd7a1cd46e39a \ + --hash=sha256:71d6097b330eea8fd15097780c8e89cb1a8ce7838669f48c5bacd6f663dd4701 \ + --hash=sha256:756c768d0c9c2955feb7a56c37ea24aea2e369f8d36a88da270b6a9f19e62b5e \ + --hash=sha256:78cb2c6865a35ab8ff8b75fd122f6033b92a62c82801110e48ddd6c936a45d91 \ + --hash=sha256:7a743ff716f746fc19a9557f60dab1600d4613255f8a7aeb3cdde4db7eb15a66 \ + --hash=sha256:85f998ea1848bc6757289e739cfbdda3a04adfd58b02fc018ce54d754a5ce468 \ + --hash=sha256:8728f216dcdb6e6d555cf971cb34076139ad74b31fc2c14da4fafc741c5f6217 \ + --hash=sha256:877c3f311ff35410f690861c4409e7ccbf0cd2f878e50628a28e5a0bb689e658 \ + --hash=sha256:8cd2f7bdda092d99c9fc2fb7391354f306d01443d22785d0cbfafa2e2c8bb418 \ + --hash=sha256:8e95e1385e4998ae9694eeaa4730ba5457ff61185b3a55e2e7bea0880aef452a \ + --hash=sha256:962864dc93511324d51ddbb5b9f8731bf71675b93ca612a07441896f4688fb8c \ + --hash=sha256:9cf95fe4d0f84c82d282745d9bb08ad9f926efa00be4697e767b814ce40d4330 \ + --hash=sha256:9e881fca225083806662a5c43d627d215f258ff43c890f831966c7d7ba9c7402 \ + --hash=sha256:a2b55dd6b2a4c4b7d87ffa56bdb33fdc5fdb9a462173861a7bc097f17d91cb09 \ + --hash=sha256:a45650e8ce7fafffd731db8550230db6b0d306d181a90b67d3e6bca2f1990930 \ + --hash=sha256:a876864214e136f0eb367788dbd7df045f4806801518e2cfe9e13229cfe06d8f \ + --hash=sha256:ae26d61dfa7a47befdc7572b521024e8745f3d809bd95ca9505a7bba9ef849ec \ + --hash=sha256:af8d94b0db561cf68b88a267c5c44b49e134f525d0dc2cb7ed413a66bc23559a \ + --hash=sha256:b343699e8308bdc51978310e1c959c584e7869cc8c40780058c87da7781a1e94 \ + --hash=sha256:b3c777e849237620b022f7f297dd67705f9f5cf1685f09f02e46f93e92725468 \ + --hash=sha256:b629de27fda84b42cde7edef0d85f13b958b47f6e9bbcbba9b673c562a89bd8b \ + --hash=sha256:ba09209fbe443b4acccebe845d8a138b89a8f4fbaeedd44953490b5315d5e965 \ + --hash=sha256:ba54cfebe86920a559a7c4d6b9050791c20513650a1952ebe3368c7dc70306f8 \ + --hash=sha256:bcb46e2f9feff8d06323983bd83ed00c201fdcab3d74973e7072a889b3979fcd \ + --hash=sha256:bcc33feacfaefce60c12fd500a277533bdc02b10a19f7f6d348763d8140bbba7 \ + --hash=sha256:bf16ba1b4d0b6b7c8e534936632270cf70eb00dbe09005bc345b2677b726855c \ + --hash=sha256:cf1845d02ad822a369a49f2bb9345b1614744267682e7a03527dc3bf6eea1777 \ + --hash=sha256:d69141514cc30b774ceea5e3ed3a6635c8d8a96edf664689b890f4089111fb35 \ + --hash=sha256:d9c7f76c0673154f044e9d78c8655fb4213f6ca31a836df48b40fe5d187717b9 \ + --hash=sha256:dbce0b29841537a2fa4a214c2bbf14de3587c9680caa9b4e217568472490b28f \ + --hash=sha256:dc624f6bc473dacdf7ef7eb8678d0d08edf15cd94fad6ae5c7d6cc67a4e4902f \ + --hash=sha256:e158cb00350dc278f3b91551101aa7d12415a66ebf2c91d8d5ac14e56ddd3ad0 \ + --hash=sha256:e491916b378fba47242221bb9ead245211b70d504f495d105d17b14a24b4907c \ + --hash=sha256:e795b7eb908249c4e43c7c99fac7c2c75dab0c43566e37db472a355f63693d71 \ + --hash=sha256:e7e480451b9fa137494bccd3a7d69adbe8ac65a87d97be61e11f1b1050a5bac3 \ + --hash=sha256:e91206ee562682b51b98ef4b26a6ef48fd84e15fd4c4bc5ec768eb641d206838 \ + --hash=sha256:e9871b1ffbfa9656b60aeee92ed5136a5742696006fa322b29ea3d8da0ecc9cf \ + --hash=sha256:e9aeb04d6aef139de265b29683e119b638208f88cf73cdd1658aa07221165321 \ + --hash=sha256:ebaea975e03d3141d9d3a507df75c9b3ec90fa9d2ffd07567b3a978d9d790b26 \ + --hash=sha256:f0606c8bf2cdefea14a43530f7657cbbb7ecf1c4222512492ef4a4434a9501ec \ + --hash=sha256:f13c32a3abd6079a66d9526e18dad9b6d280384d49d7c54040cd57b6424041d9 \ + --hash=sha256:f7401aebd7f581d7f83a439d87d474999317ee099218e5ad25d125290990ba65 \ + --hash=sha256:fa4ecea169a355be7a3ade2c783e2ed12f0e40d2c5621cda8b3297faf7fbb9f5 \ + --hash=sha256:fbd139c8447d25dd750ab79ee274cc5e1fe80fc56340ab10b18a195e1b6eca3e \ + --hash=sha256:fdafc9cce40277e0f7a0feabce0ee50dd2fa1800f3b38015e51296b5e814048d \ + --hash=sha256:fe3cca2e4e8a592be0f269a1ca4835c25199d9f3ce815c8491048f785b0a0198 \ + --hash=sha256:ffd0c5368496f41b0944be820fcb7a838aa6e623d250b01acf2643939c3f99d7 + # via matplotlib +plotly==5.24.1 \ + --hash=sha256:dbc8ac8339d248a4bcc36e08a5659bacfe1b079390b8953533f4eb22169b4bae \ + --hash=sha256:f67073a1e637eb0dc3e46324d9d51e2fe76e9727c892dde64ddf1e1b51f29089 + # via policyengine-core +pluggy==1.6.0 \ + --hash=sha256:7dcc130b76258d33b90f61b658791dede3486c3e6bfb003ee5c9bfb396dd22f3 \ + --hash=sha256:e920276dd6813095e9377c0bc5566d94c932c33b27a3e3945d8389c374dd4746 + # via pytest +policyengine-core==3.32.29 \ + --hash=sha256:30591ab05d676ef89aabf4ae4ca4544b0fe97dde4ab82233d487d88ded05fffc \ + --hash=sha256:526fbf4bc1592b4afd4b60df3d5572cfef3e00afb93fbc733940233d8a0310c4 + # via policyengine-us +policyengine-us==2.38.1 \ + --hash=sha256:1734d447d0fb7819aa9c0746e224baa6108ab6c44a20cf71e61f9e81470b7d2d \ + --hash=sha256:965baadc7e66fe5e5eca7b81e96128049c341ac49ac9f0bbeede8e19fdc7dc01 + # via policyengine-taxsim (pyproject.toml) +prompt-toolkit==3.0.53 \ + --hash=sha256:01c0891d7f9237d5e339f7d3e42cdae80b7534abb1c7c0e3352efba6231492f2 \ + --hash=sha256:9ec8a0ad96d5c56148b3f914aa79c1564c3fde5d2e6b876e7bc327e353cf8fa6 + # via ipython +psutil==6.1.1 \ + --hash=sha256:018aeae2af92d943fdf1da6b58665124897cfc94faa2ca92098838f83e1b1bca \ + --hash=sha256:0bdd4eab935276290ad3cb718e9809412895ca6b5b334f5a9111ee6d9aff9377 \ + --hash=sha256:1924e659d6c19c647e763e78670a05dbb7feaf44a0e9c94bf9e14dfc6ba50468 \ + --hash=sha256:33431e84fee02bc84ea36d9e2c4a6d395d479c9dd9bba2376c1f6ee8f3a4e0b3 \ + --hash=sha256:384636b1a64b47814437d1173be1427a7c83681b17a450bfc309a1953e329603 \ + --hash=sha256:6d4281f5bbca041e2292be3380ec56a9413b790579b8e593b1784499d0005dac \ + --hash=sha256:8be07491f6ebe1a693f17d4f11e69d0dc1811fa082736500f649f79df7735303 \ + --hash=sha256:8df0178ba8a9e5bc84fed9cfa61d54601b371fbec5c8eebad27575f1e105c0d4 \ + --hash=sha256:97f7cb9921fbec4904f522d972f0c0e1f4fabbdd4e0287813b21215074a0f160 \ + --hash=sha256:9ccc4316f24409159897799b83004cb1e24f9819b0dcf9c0b68bdcb6cefee6a8 \ + --hash=sha256:b6e06c20c05fe95a3d7302d74e7097756d4ba1247975ad6905441ae1b5b66003 \ + --hash=sha256:c777eb75bb33c47377c9af68f30e9f11bc78e0f07fbf907be4a5d70b2fe5f030 \ + --hash=sha256:ca9609c77ea3b8481ab005da74ed894035936223422dc591d6772b147421f777 \ + --hash=sha256:cf8496728c18f2d0b45198f06895be52f36611711746b7f30c464b422b50e2f5 \ + --hash=sha256:eaa912e0b11848c4d9279a93d7e2783df352b082f40111e078388701fd479e53 \ + --hash=sha256:f35cfccb065fff93529d2afb4a2e89e363fe63ca1e4a5da22b603a85833c2649 \ + --hash=sha256:fc0ed7fe2231a444fc219b9c42d0376e0a9a1a72f16c5cfa0f68d19f1a0663e8 + # via policyengine-core +ptyprocess==0.7.0 \ + --hash=sha256:4b41f3967fce3af57cc7e94b888626c18bf37a083e3651ca8feeb66d492fef35 \ + --hash=sha256:5c5d0a3b48ceee0b48485e0c26037c0acd7d29765ca3fbb5cb3831d347423220 + # via pexpect +pure-eval==0.2.4 \ + --hash=sha256:260c2774686e651b79f8b8e7fc9d80b3599ea6a66334b47d5f4abb69fc2c0ea1 \ + --hash=sha256:96cae060a313cfaad51bb761278bfb0e62dc0248d9315a81173752dc546cd37a + # via stack-data +py-cpuinfo==9.0.0 \ + --hash=sha256:3cdbbf3fac90dc6f118bfd64384f309edeadd902d7c8fb17f02ffa1fc3f49690 \ + --hash=sha256:859625bc251f64e21f077d099d4162689c762b5d6a4c3c97553d56241c9674d5 + # via tables +pydantic==2.14.0 \ + --hash=sha256:15fab1bea6f1dc5003b54fc2ecab230c1fd1dbade2acd4addc52d81e32416d4b \ + --hash=sha256:8a51a7aaddd60f55566d1f07bdd87b92b463903f39a8f26b71a06314cd1548ae + # via blosc2 +pydantic-core==2.50.0 \ + --hash=sha256:00963fde61cf8880d9e7b5635a9830e0591edfa45168447fdc5b47635c0f6437 \ + --hash=sha256:01340f4fbb4f854b1f36a6fe9dcd2b26c8936aead4e4ad1205624ac025c875fc \ + --hash=sha256:02ec3675d606a355523e1c52bf5aa4116776f8d273dba03d8336a5a3ae984e15 \ + --hash=sha256:031867348c98ab49c6d3a16ad39738369ea48da59900d76d71c1e64de71fe79b \ + --hash=sha256:0393763d66f6f61715488d074a2cefac04aeb3ee281e36fb4925dd44deaf9e17 \ + --hash=sha256:049b0404792dcb942f1092bfdae5f819ef30445b0d174782e1909fbdd91bb48b \ + --hash=sha256:0abe1b44d361b948404b6b2ed80be2583e0077340572e071afa6e0eda4e1de30 \ + --hash=sha256:0def1dc09802a790e4a1b3cbc4401f0b53c58f273ce3671df9867f7bdf1fbe20 \ + --hash=sha256:0fdeda6272d60b1f6fb63f6a3dade55e274af62e1514d24a6549a12150c385cc \ + --hash=sha256:1541c334af5d42cb9eb03862a9b4d2cfbfc670fd05172ec51f3ce02d704550f1 \ + --hash=sha256:158749408ee19682b8a2a7e7135cced7f41d6f2f9de96088b1b1609858a6a158 \ + --hash=sha256:1751e92d56fbb623b937d73985e500b1a2b1053e56f718a6c564660d99bb9cb0 \ + --hash=sha256:1773001198030e16f946a7ff7760fc3ebd45b12150f66fd0f433780043dc13d8 \ + --hash=sha256:17a5ca9c197788a6424749a09a3dce824cb2c17b72f835f8a5e330935b973609 \ + --hash=sha256:1bbd7da16d8b2912cc56c9d0b85c4998a6cbf39b220f81c0d8c397c64672ae0e \ + --hash=sha256:2092ce156f92aff17e3345baba2b7c0c1701f32ba922c5de71bd6248fbe164e3 \ + --hash=sha256:21b62d45f327eb0802f842c132fda6d01a8376a8077922dc4dda69011c64d34a \ + --hash=sha256:21e38a011783d8afc8b9d79928e273d06f349b52ae84edf63ec18ad07f077484 \ + --hash=sha256:23e0940b7d73f405d92e98b2a05b93b16db163be13b7478bb19e1db2e486ade6 \ + --hash=sha256:24302bf47319a64e5c5c7c29e971d2b7a20a190c64e59035a3df9582dec636fa \ + --hash=sha256:243088c95e23b12db9f2cd7661d584a3f00814e087489f40cde7f9feac56b694 \ + --hash=sha256:2568b190075acd058513dca34f7fddc7252fc958c1591cb67a554338fc9a81b2 \ + --hash=sha256:2918547195ffb20118b829fdb8938e9dc92c9527fe6cbe58572594c96362880e \ + --hash=sha256:2f28a5a299d4cefd1066a6883d22600b9ae3606f881c3015d255784634647580 \ + --hash=sha256:34a4a0938eb30931baca56e55786c5a6871ac7aa891a38c8cabcdb7e49dab91b \ + --hash=sha256:350001f5573451150d919722ee095aa28bec037d6e23b86d7f04581a910fe924 \ + --hash=sha256:364f62d8024997536e57865cb1c8b36effad3249bf392a29a2379ea69db28238 \ + --hash=sha256:36c49d4e1769127461b609f110d91963790091ffcc2de401ac1d3b2f6a63bd54 \ + --hash=sha256:36f9ed6ae1069913e4f6e86d8233e119e83e00a20c54f88faf9c81292f2fecc0 \ + --hash=sha256:38b03c5439c6a7a952f56e3e6596dae44bc78c3fb6a69df46cabfb2f888e5f0c \ + --hash=sha256:3b2f3e44af4c6512dd73557621385a71b18094c8be81d60e5a8e73a8ce96b7f4 \ + --hash=sha256:3fce74add1099da1ea09473268950270071fd56773e2968604efb3ab1d240e02 \ + --hash=sha256:41b9f2821f0a105f88cd54ad03fe1392ec600618ffa8610f7c5e466ecd98c531 \ + --hash=sha256:42a56b0052ac11d9d0d87b1c94a1ce52e31914fd133f269585e0f63a4ed988f2 \ + --hash=sha256:42fff617cb0b08505d8123d71e6e7a8e54210d9007498f564855bd843ce984b1 \ + --hash=sha256:468f7e67cfbd8231f442af6726449efe46f2be0e5a57b44fba7ccd92c6f121c4 \ + --hash=sha256:4b1bae96f41806b14dd8bb1568d39b5e33b5af7fb27f7be36c78b8fa84708917 \ + --hash=sha256:4f31af62efd1fd0257735b72e6716b32d4f207654adeabfe524d44baf1bb6bed \ + --hash=sha256:4f96ccd9368ecbf6685d8f6981584ab72b4f0ffd20685e747737e7e340277b8d \ + --hash=sha256:4faa766450ef44d9eabed5b65a280f63f903d1e1ed6d2e278961eb22345ec49f \ + --hash=sha256:50920d66aaab60dbc6023c3035d55fbabfa58b6d205d0b39d47d820c4a7a13a8 \ + --hash=sha256:5307a8bd49158b57a0ca4e10950d31085aa35d9007e934047043ccc6d28eea97 \ + --hash=sha256:55684bc850059fc85ff8dc21a3e342b722d3178993c49ebdfdee8b698a432720 \ + --hash=sha256:56178c4116fc0c859786875ff4acc1c8d52678f095c312b0eff2a2dd9d6f8d5f \ + --hash=sha256:57c0e5b26d82bf31ab2b044781527b1b1a36e9ed400856b6aca5097eb1abb909 \ + --hash=sha256:586699b43066ca6038f96bd71d0eff0b6c292929e3d66ff63d5dc79d0f06d589 \ + --hash=sha256:588d309ce5c85448379556d72011b191c0414ee2e80d7c3f1ebe2ceb2d9027b1 \ + --hash=sha256:593dd4f24abeb3ed90222f98bc6eefcac68cd5aa96fc7745f93862a802952bce \ + --hash=sha256:59f816dc04e99627a5a6352ae51dfb30e603f2cb0b7009c91dc640c533def014 \ + --hash=sha256:5a07c644047f5abc268b4c39f8cb5a30e08a3c349228cb70142c7d3ed87587c0 \ + --hash=sha256:5a8403eef4a66743e339102fb3cdd8c8b9016b8bd67924685893d062c88896f9 \ + --hash=sha256:5d0b210c871486f5acb56d87bf00e3c5d83aab6a1ef3042629fa6ae0172fcf47 \ + --hash=sha256:5dbf9f18c8af11db719e67633be0af556d7d765bee0ca9419bd706fe4b7ed9fe \ + --hash=sha256:610e9f483ac53c5cc59c2d3687224029b54eb494feec2d40a2bcfdd187635192 \ + --hash=sha256:62a93a9d206a3580c975c3c1f65a869cd063844d016c004f8d786a9309b3c591 \ + --hash=sha256:62ec6568896e0abf258cbcd22c406c1c8bf27d16224b21bec8f75c4ae88a8173 \ + --hash=sha256:63263d64884688554fb025a3906c7b00573980cfee75f9afeb86239d577384bc \ + --hash=sha256:68421ba548f6d86c7dededd70bfe530b4faf67eb811c53c70a1be69438d3ce99 \ + --hash=sha256:6e1ec4176c3b56017745937dfd4a3ec6df55f7f0e66991124499f3f79f8f8d1f \ + --hash=sha256:70df7ff903aea05383298715ea53551c8f27c8f70cbe54ba7f05606cd822e7e4 \ + --hash=sha256:71061800a3c225e730f7997f8a7fad6e0d0dcbe36609cdc7e60576a099a2832b \ + --hash=sha256:718d05d4e078c7828f40ad3e310870fe4b837d93a32e7e8497a080c1f1040490 \ + --hash=sha256:732efbb50977ab7cf18f01d4c255834aeb14cb2425459f7bff681a1ba3a4ffa1 \ + --hash=sha256:74cbb6cbd74445ca279668790e0c10eccac0428fd79fe061fce6c9e3982ad3fe \ + --hash=sha256:753863dd4317ec8cc9eb3e6d9d01a8ef1a1726a8003b4354658d68a1ae05f9db \ + --hash=sha256:75b451ec5e64a1d4b803317f34710131742ff2e42f4bf5403f597d0af857d7d8 \ + --hash=sha256:779b6c74526596a86d38248dedaecfb7851bbaf319c234be042c57acddd2c8c4 \ + --hash=sha256:7987866a2569396e6765c54d643fd6a7b3b234e89ee8d45a3729a7b4b2726145 \ + --hash=sha256:79e8fc9c135ef628c45cb8aa5deef8d21de13d33bb4c59a859fa73d335ceb40a \ + --hash=sha256:7eee44c3f1f8acc220a743a5ed5588949a4f18b33df4cfbef2b1277470285401 \ + --hash=sha256:8447678b49412294801c9ea15ae31ea3bae7da65425268c92d40e032c38eac6f \ + --hash=sha256:84d2d38f7d163c4dec292f379e9de1960c661795442aca6c90d706436cb3749e \ + --hash=sha256:8ab9e74878172948e0426e3d27fba333fd6a1c3f9456d8e75643e8e6868ac1a1 \ + --hash=sha256:8ad8dad549cd1645be591a50b4573995ee7e018f6619ddc2bc6ea44b2ad9f694 \ + --hash=sha256:8b16e164205a90b1050d2f5469f8a7829db7698ad198c69e6aab6cbfb5648b87 \ + --hash=sha256:8f16bc5bb12f4c581b0f40facc28dbf286db32d1bf4e7e4f4c4e0f7f4e34ecf9 \ + --hash=sha256:8facaf0a16121ac82cc403a71399a061b74624c1ae2034eec9ed6169c5d16ecb \ + --hash=sha256:90874428bc6678b26434336c77931c9734ecebedf50132c179205e5a9908761d \ + --hash=sha256:92016718bcf3e6f35a6bd986880191a8da7a35aa1f5b1e97544582ef938464cf \ + --hash=sha256:9279f4be22bc3765dd9f61f5b4d38d9cb219d167bbd6f2e0ffa3368b1b71b4d1 \ + --hash=sha256:933f2d639eb81a3e1f145aec415453cc00983236629933f028d9507222583a2e \ + --hash=sha256:93502b3c762149a5904316ef52f0ed1ea721e0f4c8431f964f140ed15fa61926 \ + --hash=sha256:955d7878130dfc124d6a5343e1b87d2933244fe14a4a0a3e98787e8e660a8eb4 \ + --hash=sha256:980c81c2ec53ea9eb2227c14b3e6de35670b2de163b638f2a803e90a3bd5bbb0 \ + --hash=sha256:99e203d5c2a814facef78dcd993b0fb7a933124a3475a38979fc09cceae210b7 \ + --hash=sha256:a2b88f9f9fa52e1c34938ff1a18ee7fbffe482df0bb43c087a9a60578d273d68 \ + --hash=sha256:a3e8ee6386f6b68e2f818ccf422ccfafc59bcff10862b52c7819db3aa0352dfc \ + --hash=sha256:a7080928078ff56c07da393392f772054e93a39c8033dc9c04547bd949f9b614 \ + --hash=sha256:a8ee3965e01f10e4ff92ba1727626328ab7ba93bcd5674ff2b78ea1048ee0cea \ + --hash=sha256:ab3f95f737fc1b258b8210308fc02ce1442cf5950cf6d30b09ad89ab9e8afebd \ + --hash=sha256:ac223ea031905319a64d0df116979ae438b42d6265862a3d63c9f9808c2905a7 \ + --hash=sha256:ad3532291deedfdfcad3cf5d351d0076d646c68a0c63869a1bebf87c22159600 \ + --hash=sha256:ad9185366893714cd4514ae5e1a098227704fa395cb41a7855d75968ecedc826 \ + --hash=sha256:ae45853d25a23fba56681d2f9ed41f3e3f12f0a3b2393fefa08ff6406320a1f5 \ + --hash=sha256:af2b808a79bb04075e87c81a5b6179365b93f9a851f29dafd67abff72085d0c8 \ + --hash=sha256:b123f9d8702106f39dc3af63a031ca8b5279862a3747ec6c03ca49dbe78b71b9 \ + --hash=sha256:b1399f918aea8fb76ffa99b474c9b768accea1f079fde407ee538bec89f20fa7 \ + --hash=sha256:b916ff828d604d4311a5639b7b3da51eaea3923833ec3e300a5ee35eade99691 \ + --hash=sha256:b9be297ffe1015bfb2db4a23b6e1fec7e48361cf7c7b4f4f6bbdd008451b0a7b \ + --hash=sha256:bc87bd34239835c8d73171acd039e591cea0a2ca8615e6188044ad170a40fca1 \ + --hash=sha256:bd841dcf394ff261c26763a9d7be754176d4f1e6d26cb2a5d5331e91b6b56a5f \ + --hash=sha256:bdd70c2d9e73bca09fad54605dfeaae2b4e770b2800c65f5f5342901ed567b9f \ + --hash=sha256:c05b75ef3574c9ee4e05bbcf8513f7ccb155d426514be9efef5f6f53152d5f5c \ + --hash=sha256:c05d035e72530f6b00297941b0162218601542b76870c3bf2756bd87f16fc538 \ + --hash=sha256:c19500343957f254ecf3e60174f4a4cdd21690e0e1677740a8017d28ab2a2a4b \ + --hash=sha256:c21e6a6e4e6d32fb6acbc4f0fa69e8319cac0d65eeaa8298d757371cc2a9c687 \ + --hash=sha256:c2b246fa7cbdf9918488d1542a82bbb928cf71bcba66905c24131981e759ff0b \ + --hash=sha256:c2e97985641fe53ad7824d1b5bfeb7990a5ff788c4559ee44d7522642560ddc2 \ + --hash=sha256:c3ae59461625518449f800acc4f874753ae96fcf993c47a27be07beb651371fd \ + --hash=sha256:c4abc425789f8540e86ca4cfdbc8dc650433cc2ac7c6136fee9bcb29d5665a02 \ + --hash=sha256:cb4fcaabb28cabf21396a9b816b9afe091f8c776805fdf03e2cbc606b64dfa7c \ + --hash=sha256:cbce1b5a2a88a465d7865df61b7e4f8829ddc49b4fa841e9b241815c9d67c3b2 \ + --hash=sha256:cf150693a51ca21e8288cd08a9de05e5ab331776dfcfd0537b14523338f0502a \ + --hash=sha256:cf81432281af66ba3285b26b09c2d478d84730dc50ff90926c1bdcef54048a33 \ + --hash=sha256:d01029d54ff1f45c195b1f7e6fbf6e58fb7e7e12cda9a6e639570d9c581decb2 \ + --hash=sha256:d06dbbfe8da01a0574de27afc19915bb3e7dddfbd184bb97e958f94051d8531b \ + --hash=sha256:d14d04058923d526a552fc3ebe8b0b0353c19516431cee196502b53119278fd9 \ + --hash=sha256:d187f43d1c5b844adc871c5b8c22b4aa12a116aaca4e9bd1521bc9ce479aae1f \ + --hash=sha256:d1d084e92d0f4a096a5155b23d1ac603db8073ef98a3d1384badf1455e5ae742 \ + --hash=sha256:d8354fbbe2abf0fb724b9303bef43bfd9b7a2779332813fa6d6559983954e7d8 \ + --hash=sha256:dcbd1fe5083315243447c13f7252ae9fe9d128b1ae2857e3a916c609235dd863 \ + --hash=sha256:dec0dafc116ac29a84d143fdbc3b83fdb5d4ed339276be2251154537ab30e14d \ + --hash=sha256:e15bb1535f68a27f28e579ba3a8f74e7b05d350c45f5622b76a311d5a19ae48a \ + --hash=sha256:e41f9d1d9240e8e0d8a670ad3e66c0c00f0b1f7150a31bc6c445a4f87c1cb3ba \ + --hash=sha256:e58acd43ac8d3905659c1d5309318dd576243e723dd7c3b5dd4f555479b77d4b \ + --hash=sha256:eadf95aab7301ac651628f097e521d742d0fb5f732155ebfd00d07933045d81c \ + --hash=sha256:ec786cb9d597dd75d993f8c1273e31bb2114c9bc22f67fba611e654e8347701b \ + --hash=sha256:ed557fa2744617eac3e34dd39b85037efbf23cd33f06851c00fdb8f18ad8f4c2 \ + --hash=sha256:ee9913fa2b5bfa6111c11158cf481bb13544f8bd5d10382fb6ee2612b16fcf28 \ + --hash=sha256:f0af2d2f745ec00a6616c4dfba4477f9156ccfb45690f6ffa5fd34f42e871ed4 \ + --hash=sha256:f12d9690634414fc04b1a7072fdc35c34a9242232c1851fe4518383578bb09d4 \ + --hash=sha256:f187030fc3d62c668feb0f09e92852e0eb414d7fcefc4748f2e67d245aade37e \ + --hash=sha256:f3abcabb04503023e1053add24472e78878de0bfd5c8a93686be01f4032c363c \ + --hash=sha256:f44107b5fdfecc03438feb165431652c8006650471326e53dd86d4c19124f5c5 \ + --hash=sha256:f517a417cd02aa8fb05b603a0ac6d87b7b004c3ba4fcd279cad25cab7229043b \ + --hash=sha256:f8cc61ad94215ab98e5cbcdea2cfde45e11bb0136ee980e1240b721635e55790 \ + --hash=sha256:f8df36f964c21168e345f914855e3b428e2cb6e1f739c8ef5963b77d86dd84ae + # via pydantic +pygments==2.21.0 \ + --hash=sha256:2363c69b61c4a97c838da3b130dcd6468f4848992b21a82f2a63ec34377137d9 \ + --hash=sha256:610ca751c9bc2492b38eb9a38a7fbc93edbbb2d7182edaf34e66ae493dee5c8c + # via + # ipython + # pytest + # rich +pyparsing==3.3.3 \ + --hash=sha256:928ae7e20211f3b6f3915a72f06a0cfd29ab9d24279dd6346b6b1a7146397d36 \ + --hash=sha256:ece8c00a69cf01b45d0b1dedabb469c90d8caf996d4fda40f147627a122849a4 + # via matplotlib +pytest==9.1.1 \ + --hash=sha256:1088fbde8f2b49d95a549a195707afa7a76a3ce9bcadc26b6d71f0ffda5fe313 \ + --hash=sha256:37a86b45efb9a47a61a36449063e8e18d0cab3161329fc099eb21783169c4f0c + # via policyengine-core +python-dateutil==2.9.0.post0 \ + --hash=sha256:37dd54208da7e1cd875388217d5e00ebd4179249f90fb72437e91a35459a0ad3 \ + --hash=sha256:a8b2bc7bffae282281c8140a97d3aa9c14da0b136dfe83f850eea9a5f7470427 + # via + # matplotlib + # pandas +pyvis==0.3.2 \ + --hash=sha256:5720c4ca8161dc5d9ab352015723abb7a8bb8fb443edeb07f7a322db34a97555 + # via policyengine-core +pyyaml==6.0.3 \ + --hash=sha256:00c4bdeba853cc34e7dd471f16b4114f4162dc03e6b7afcc2128711f0eca823c \ + --hash=sha256:0150219816b6a1fa26fb4699fb7daa9caf09eb1999f3b70fb6e786805e80375a \ + --hash=sha256:02893d100e99e03eda1c8fd5c441d8c60103fd175728e23e431db1b589cf5ab3 \ + --hash=sha256:02ea2dfa234451bbb8772601d7b8e426c2bfa197136796224e50e35a78777956 \ + --hash=sha256:0f29edc409a6392443abf94b9cf89ce99889a1dd5376d94316ae5145dfedd5d6 \ + --hash=sha256:10892704fc220243f5305762e276552a0395f7beb4dbf9b14ec8fd43b57f126c \ + --hash=sha256:16249ee61e95f858e83976573de0f5b2893b3677ba71c9dd36b9cf8be9ac6d65 \ + --hash=sha256:1d37d57ad971609cf3c53ba6a7e365e40660e3be0e5175fa9f2365a379d6095a \ + --hash=sha256:1ebe39cb5fc479422b83de611d14e2c0d3bb2a18bbcb01f229ab3cfbd8fee7a0 \ + --hash=sha256:214ed4befebe12df36bcc8bc2b64b396ca31be9304b8f59e25c11cf94a4c033b \ + --hash=sha256:2283a07e2c21a2aa78d9c4442724ec1eb15f5e42a723b99cb3d822d48f5f7ad1 \ + --hash=sha256:22ba7cfcad58ef3ecddc7ed1db3409af68d023b7f940da23c6c2a1890976eda6 \ + --hash=sha256:27c0abcb4a5dac13684a37f76e701e054692a9b2d3064b70f5e4eb54810553d7 \ + --hash=sha256:28c8d926f98f432f88adc23edf2e6d4921ac26fb084b028c733d01868d19007e \ + --hash=sha256:2e71d11abed7344e42a8849600193d15b6def118602c4c176f748e4583246007 \ + --hash=sha256:34d5fcd24b8445fadc33f9cf348c1047101756fd760b4dacb5c3e99755703310 \ + --hash=sha256:37503bfbfc9d2c40b344d06b2199cf0e96e97957ab1c1b546fd4f87e53e5d3e4 \ + --hash=sha256:3c5677e12444c15717b902a5798264fa7909e41153cdf9ef7ad571b704a63dd9 \ + --hash=sha256:3ff07ec89bae51176c0549bc4c63aa6202991da2d9a6129d7aef7f1407d3f295 \ + --hash=sha256:41715c910c881bc081f1e8872880d3c650acf13dfa8214bad49ed4cede7c34ea \ + --hash=sha256:418cf3f2111bc80e0933b2cd8cd04f286338bb88bdc7bc8e6dd775ebde60b5e0 \ + --hash=sha256:44edc647873928551a01e7a563d7452ccdebee747728c1080d881d68af7b997e \ + --hash=sha256:4a2e8cebe2ff6ab7d1050ecd59c25d4c8bd7e6f400f5f82b96557ac0abafd0ac \ + --hash=sha256:4ad1906908f2f5ae4e5a8ddfce73c320c2a1429ec52eafd27138b7f1cbe341c9 \ + --hash=sha256:501a031947e3a9025ed4405a168e6ef5ae3126c59f90ce0cd6f2bfc477be31b7 \ + --hash=sha256:5190d403f121660ce8d1d2c1bb2ef1bd05b5f68533fc5c2ea899bd15f4399b35 \ + --hash=sha256:5498cd1645aa724a7c71c8f378eb29ebe23da2fc0d7a08071d89469bf1d2defb \ + --hash=sha256:5cf4e27da7e3fbed4d6c3d8e797387aaad68102272f8f9752883bc32d61cb87b \ + --hash=sha256:5e0b74767e5f8c593e8c9b5912019159ed0533c70051e9cce3e8b6aa699fcd69 \ + --hash=sha256:5ed875a24292240029e4483f9d4a4b8a1ae08843b9c54f43fcc11e404532a8a5 \ + --hash=sha256:5fcd34e47f6e0b794d17de1b4ff496c00986e1c83f7ab2fb8fcfe9616ff7477b \ + --hash=sha256:5fdec68f91a0c6739b380c83b951e2c72ac0197ace422360e6d5a959d8d97b2c \ + --hash=sha256:6344df0d5755a2c9a276d4473ae6b90647e216ab4757f8426893b5dd2ac3f369 \ + --hash=sha256:64386e5e707d03a7e172c0701abfb7e10f0fb753ee1d773128192742712a98fd \ + --hash=sha256:652cb6edd41e718550aad172851962662ff2681490a8a711af6a4d288dd96824 \ + --hash=sha256:66291b10affd76d76f54fad28e22e51719ef9ba22b29e1d7d03d6777a9174198 \ + --hash=sha256:66e1674c3ef6f541c35191caae2d429b967b99e02040f5ba928632d9a7f0f065 \ + --hash=sha256:6adc77889b628398debc7b65c073bcb99c4a0237b248cacaf3fe8a557563ef6c \ + --hash=sha256:79005a0d97d5ddabfeeea4cf676af11e647e41d81c9a7722a193022accdb6b7c \ + --hash=sha256:7c6610def4f163542a622a73fb39f534f8c101d690126992300bf3207eab9764 \ + --hash=sha256:7f047e29dcae44602496db43be01ad42fc6f1cc0d8cd6c83d342306c32270196 \ + --hash=sha256:8098f252adfa6c80ab48096053f512f2321f0b998f98150cea9bd23d83e1467b \ + --hash=sha256:850774a7879607d3a6f50d36d04f00ee69e7fc816450e5f7e58d7f17f1ae5c00 \ + --hash=sha256:8d1fab6bb153a416f9aeb4b8763bc0f22a5586065f86f7664fc23339fc1c1fac \ + --hash=sha256:8da9669d359f02c0b91ccc01cac4a67f16afec0dac22c2ad09f46bee0697eba8 \ + --hash=sha256:8dc52c23056b9ddd46818a57b78404882310fb473d63f17b07d5c40421e47f8e \ + --hash=sha256:9149cad251584d5fb4981be1ecde53a1ca46c891a79788c0df828d2f166bda28 \ + --hash=sha256:93dda82c9c22deb0a405ea4dc5f2d0cda384168e466364dec6255b293923b2f3 \ + --hash=sha256:96b533f0e99f6579b3d4d4995707cf36df9100d67e0c8303a0c55b27b5f99bc5 \ + --hash=sha256:9c57bb8c96f6d1808c030b1687b9b5fb476abaa47f0db9c0101f5e9f394e97f4 \ + --hash=sha256:9c7708761fccb9397fe64bbc0395abcae8c4bf7b0eac081e12b809bf47700d0b \ + --hash=sha256:9f3bfb4965eb874431221a3ff3fdcddc7e74e3b07799e0e84ca4a0f867d449bf \ + --hash=sha256:a33284e20b78bd4a18c8c2282d549d10bc8408a2a7ff57653c0cf0b9be0afce5 \ + --hash=sha256:a80cb027f6b349846a3bf6d73b5e95e782175e52f22108cfa17876aaeff93702 \ + --hash=sha256:b30236e45cf30d2b8e7b3e85881719e98507abed1011bf463a8fa23e9c3e98a8 \ + --hash=sha256:b3bc83488de33889877a0f2543ade9f70c67d66d9ebb4ac959502e12de895788 \ + --hash=sha256:b865addae83924361678b652338317d1bd7e79b1f4596f96b96c77a5a34b34da \ + --hash=sha256:b8bb0864c5a28024fac8a632c443c87c5aa6f215c0b126c449ae1a150412f31d \ + --hash=sha256:ba1cc08a7ccde2d2ec775841541641e4548226580ab850948cbfda66a1befcdc \ + --hash=sha256:bdb2c67c6c1390b63c6ff89f210c8fd09d9a1217a465701eac7316313c915e4c \ + --hash=sha256:c1ff362665ae507275af2853520967820d9124984e0f7466736aea23d8611fba \ + --hash=sha256:c2514fceb77bc5e7a2f7adfaa1feb2fb311607c9cb518dbc378688ec73d8292f \ + --hash=sha256:c3355370a2c156cffb25e876646f149d5d68f5e0a3ce86a5084dd0b64a994917 \ + --hash=sha256:c458b6d084f9b935061bc36216e8a69a7e293a2f1e68bf956dcd9e6cbcd143f5 \ + --hash=sha256:d0eae10f8159e8fdad514efdc92d74fd8d682c933a6dd088030f3834bc8e6b26 \ + --hash=sha256:d76623373421df22fb4cf8817020cbb7ef15c725b9d5e45f17e189bfc384190f \ + --hash=sha256:ebc55a14a21cb14062aa4162f906cd962b28e2e9ea38f9b4391244cd8de4ae0b \ + --hash=sha256:eda16858a3cab07b80edaf74336ece1f986ba330fdb8ee0d6c0d68fe82bc96be \ + --hash=sha256:ee2922902c45ae8ccada2c5b501ab86c36525b883eff4255313a253a3160861c \ + --hash=sha256:efd7b85f94a6f21e4932043973a7ba2613b059c4a000551892ac9f1d11f5baf3 \ + --hash=sha256:f7057c9a337546edc7973c0d3ba84ddcdf0daa14533c2065749c9075001090e6 \ + --hash=sha256:fa160448684b4e94d80416c0fa4aac48967a969efe22931448d853ada8baf926 \ + --hash=sha256:fc09d0aa354569bc501d4e787133afc08552722d3ab34836a80547331bb5d4a0 + # via + # policyengine-taxsim (pyproject.toml) + # huggingface-hub +requests==2.34.2 \ + --hash=sha256:2a0d60c172f83ac6ab31e4554906c0f3b3588d37b5cb939b1c061f4907e278e0 \ + --hash=sha256:f288924cae4e29463698d6d60bc6a4da69c89185ad1e0bcc4104f584e960b9ed + # via + # census + # policyengine-core + # spm-calculator +rich==15.0.0 \ + --hash=sha256:33bd4ef74232fb73fe9279a257718407f169c09b78a87ad3d296f548e27de0bb \ + --hash=sha256:edd07a4824c6b40189fb7ac9bc4c52536e9780fbbfbddf6f1e2502c31b068c36 + # via blosc2 +six==1.17.0 \ + --hash=sha256:4721f391ed90541fddacab5acf947aa0d3dc7d27b2e1e8eda2be8970586c3274 \ + --hash=sha256:ff70335d468e7eb6ec65b95b99d3a2836546063f63acc5171de367e834932a81 + # via python-dateutil +sortedcontainers==2.4.0 \ + --hash=sha256:25caa5a06cc30b6b83d11423433f65d1f9d76c4c6a0c90e3379eaa43b9bfdb88 \ + --hash=sha256:a163dcaede0f1c021485e957a39245190e74249897e2ae4b2aa38595db237ee0 + # via policyengine-core +spm-calculator==1.0.0.post1 \ + --hash=sha256:a9f99ce9a490989c40fa9a7d1bcd16dd544036e4788a0b3af4d170156ef9a168 \ + --hash=sha256:c9834a761891ba12de1edd585688c8b477be58e9a9c9fa92d9cfdf41e5396a41 + # via policyengine-us +stack-data==0.6.3 \ + --hash=sha256:836a778de4fec4dcd1dcd89ed8abff8a221f58308462e1c4aa2a3cf30148f0b9 \ + --hash=sha256:d5558e0c25a4cb0853cddad3d77da9891a08cb85dd9f9f91b9f8cd66e511e695 + # via ipython +standard-imghdr==3.13.0 \ + --hash=sha256:30a1bff5465605bb496f842a6ac3cc1f2131bf3025b0da28d4877d6d4b7cc8e9 \ + --hash=sha256:8d9c68058d882f6fc3542a8d39ef9ff94d2187dc90bd0c851e0902776b7b7a42 + # via policyengine-core +tables==3.11.1 \ + --hash=sha256:1e78fe190fdeb4afe430b79651bae2a4f341904eb85aa8dbafe5f1caee1c7f67 \ + --hash=sha256:3a9c35f87fcb6a48c79fbc4e3ab15ca8f6053c4ce13063d6ca2ec36cbb58f40f \ + --hash=sha256:4cf3218b76ba78d156d6ee75c19fb757d50682f6c7b4905370441afbfc9d77f3 \ + --hash=sha256:56bf6fb9132ead989b7e76695d7613d6d08f071a8019038d6565ba90c66b9f3e \ + --hash=sha256:78abcf413091bc7c1e4e8c10fbbb438d1ac0b5a87436c5b972c3e8253871b6fb \ + --hash=sha256:7fa6cb03f6fe55ae4f85e89ec5450e5c40cc4c52d8c3b60eb157a445c2219e89 \ + --hash=sha256:a4bbd95036a4d0cc5c86c1f87fbb490b4c53cd70982f1c01b3ed6dcb3085cbb9 \ + --hash=sha256:a6f7a3b82dbf0ae0f30de635ca88bb42dd87938b0950369d0ee4289c52ae6de2 \ + --hash=sha256:e3cfe79484351f7216eb8f3767bfa1217bfd271b04428f79cfa7ef6d7491919d \ + --hash=sha256:eb30684c42a77bbecdef2b9c763c4372b0ddc9cc5bd8b2a2055f2042eee67217 \ + --hash=sha256:f0367d2e3df0f10ea63ccf4279f3fe58e32ec481767320301a483e2b3cd83efc + # via policyengine-us +tenacity==9.2.1 \ + --hash=sha256:9e56f17539296baab7beabb08b92f6ee3d7be92d8be72d763360677c2ad6580e \ + --hash=sha256:a606b5c808d0cded4a359d5b9932d867ff2a6a6b64d37350260fd01bbdf83839 + # via plotly +threadpoolctl==3.7.0 \ + --hash=sha256:61348cfb77d53b9242e0017029244b559b810c142ced65b4e21eeca1843959a7 \ + --hash=sha256:cd8b60b5641b45c67bbf73c64c843235fc2d8a480c87389f52f5dbee893b86be + # via blosc2 +tqdm==4.70.1 \ + --hash=sha256:c293e525e6fef9c20e8728fd4612df02a0aa31bb5fe91ecd93e123b1b7bffa73 \ + --hash=sha256:cefd0eca11b2a37a3aee776544d4f4ae913f02688135b5556b8788dfa474afc4 + # via + # policyengine-taxsim (pyproject.toml) + # huggingface-hub + # policyengine-us +traitlets==5.16.1 \ + --hash=sha256:ed900c2b631aa3a112811139fa97b8d2c3bad5e989656bba4b7e52c7852c18c1 \ + --hash=sha256:f775618166caa0396c8e337099240f2bd3e5e917d203b2e6fbe21a58d3cb1f6b + # via + # ipython + # matplotlib-inline +truststore==0.10.4 \ + --hash=sha256:9d91bd436463ad5e4ee4aba766628dd6cd7010cf3e2461756b3303710eebc301 \ + --hash=sha256:adaeaecf1cbb5f4de3b1959b42d41f6fab57b2b1666adb59e89cb0b53361d981 + # via + # httpcore2 + # httpx2 +typing-extensions==4.16.0 \ + --hash=sha256:481caa481374e813c1b176ada14e97f1f67a4539ce9cfeb3f350d78d6370c2e8 \ + --hash=sha256:dc983d19a509c94dba722ee6abd33940f7c05a89e243c47e907eb4db6f1a43e5 + # via + # anyio + # httpx2 + # huggingface-hub + # ipython + # pydantic + # pydantic-core + # typing-inspection +typing-inspection==0.4.4 \ + --hash=sha256:547274fa6b0a561ccf549cc9524b999a578e737d015d8709d021f9d0d13bea47 \ + --hash=sha256:65b8397ba37ccbce054456aaccddfc91e6e3083c92824df348d96ca832f3f147 + # via pydantic +urllib3==2.8.0 \ + --hash=sha256:0cf3cae568d36aa9576b28dfb35f11328f1cb974ca7647d9475ebb86c75ac6e3 \ + --hash=sha256:63bf2ead4c879426ebf22ef2a781eeb4aa3b4ae798a0435506f8687fd5bb9b63 + # via requests +us==4.0.0 \ + --hash=sha256:3e7dd072efc65ecc6f765ced861f49fe7635067e760bbe2a527f16e5477011c0 \ + --hash=sha256:7dd4c4e603c9427b72d7e07be700d8f643bdcd7f5195a12bc639f1b7e38e7496 + # via spm-calculator +wcwidth==0.9.2 \ + --hash=sha256:0a47e03d8293590ecce66c45dc20ff7b4b885e3c78093722239585eca0d77ab2 \ + --hash=sha256:0cd4f7f2e53905dcb110d213a4c8529b6733fa3d232d8c717f946cc69a10349b \ + --hash=sha256:138e1f8898e431b2f2d7881f8ca8d75591c1d3c21aa53f54e989bd6b39811da2 \ + --hash=sha256:196b47cf32f9df27ccda6dc513237f3c2429c4c659db428d60a5bc443d10f270 \ + --hash=sha256:1bf361c8705576760623b4724ae564666d73b016f9a778bcfd1c7345378ef4ec \ + --hash=sha256:2a9746de704242bd4fdaabb31dd46b82f694a56a8d21081ad89b679a89da9fec \ + --hash=sha256:33df042f96c61ed3cd5fb3742fba427553a635bc578799857a48aa79f774a0b9 \ + --hash=sha256:42dbcb76ce8af39e2c9db410ac3f9bdf4e47eb41d6f44525952f172d3d98f724 \ + --hash=sha256:48719a9bc76c2f84238693fe5013571fa5beffa3621cf228f1f3a9e30dae84b8 \ + --hash=sha256:5175609bf8cc7398a5f48aa35207bd64ebf9f45e4c70df65f7fdc7a988041a3c \ + --hash=sha256:59dab4049cbd982b478bca098528df2c79a9160636a3a163ffebffcbd7d1b892 \ + --hash=sha256:674b518af28d38ee645ff97b74f5760abee5fad4bac74413bfc4b881ef2ce724 \ + --hash=sha256:67d901a4ad99249eb775b4ee4769ca97fa405d35a75f46e83166910a47003f04 \ + --hash=sha256:734aa9405b321d1042301aa19c943c4731ee9e3460e4f8feea3299c064c97a14 \ + --hash=sha256:751bef0ab404b6a1dc028b56b4b85d46486be1c55833f80da533e42dc691f389 \ + --hash=sha256:7ef5a940bd5e30bac6e721f1a48fce0cd7bb3ece19e9c5d139e72c76c35cfd07 \ + --hash=sha256:89ca642c5bf0101157a09366be69fad0379db1f700ae39a920e103234573670e \ + --hash=sha256:8b4e381590b9b7390e07e22b2c0c1bb96ce50e1d2243c866d9387600362d51ed \ + --hash=sha256:97b878d1e158da5ed9ac5aac53fa3a55e282103af6a09ec353865613d1a31a76 \ + --hash=sha256:9e542f1f8475b78452a295495d7a5bc3ead565112e9446a64dc93462a41c2a79 \ + --hash=sha256:ae0800c5339423cc53d33a266ad264b42ba8aaa16d4464f6e6b1bee607f50b17 \ + --hash=sha256:ae0ef90b90f6af38b54f1fe6d58662ec33b3cb4b8391958a62416d654231727b \ + --hash=sha256:b9c6ab615e03723b7f8760ea2f27758d656e7e13b51515c9dca5c3e8b04612fa \ + --hash=sha256:bb08ceb501d6aaf94066c3ee122dd825b152df40ff0bd0df4dc27126233b948e \ + --hash=sha256:c3d80f39ba4653a595edae9aa46a509d14883790a8fc23c5db221ceb207f64b7 \ + --hash=sha256:e5f669ae8c3d969c72032f9cdee019674b666e522d45e1e2099a2e9dda4a341d \ + --hash=sha256:eda88ffdc97c0fbf193d407114f2c7a54b379f67f6e52a7531ee3b9fe749eca7 \ + --hash=sha256:ee1fd0db9d9fd711a70f3e7765e0e04c05d26982fa05361456163062549d7da4 \ + --hash=sha256:f2f7b3bba5a5d5f31fc350fd36ce5b84b693c83b7eb95ee630b720da5a5ce06f + # via prompt-toolkit +wheel==0.48.0 \ + --hash=sha256:3217dcc807155e45db462d7ef2431f5ddda0d7273b700d05a67b271ceb1287ab \ + --hash=sha256:94800765601e9171bf5d58d066e640662842bcedcbab982b2c90787a2c987322 + # via policyengine-core diff --git a/docs/dependencies/requirements-py3.12.txt b/docs/dependencies/requirements-py3.12.txt new file mode 100644 index 000000000..7e5d62039 --- /dev/null +++ b/docs/dependencies/requirements-py3.12.txt @@ -0,0 +1,1876 @@ +# This file was autogenerated by uv via the following command: +# uv pip compile pyproject.toml --python-version 3.12 --python-platform x86_64-manylinux_2_28 --exclude-newer 2026-10-09T19:00:00Z --generate-hashes -o docs/dependencies/requirements-py3.12.txt +annotated-types==0.8.0 \ + --hash=sha256:13b2beaad985e05e2d6407ee4c4f35590b11f8d693a258a561055cac8f64cab7 \ + --hash=sha256:f072f4d804ea359e4eaf198b1af7a8b0943881a87f31bb764f8bf219bb9419e0 + # via pydantic +anyio==4.15.1 \ + --hash=sha256:6152fdbbf9a77fdec97731721bebf7c4c44f7c29b424b0065826173efc7ed101 \ + --hash=sha256:9f28306018cbd6d329e64a36d58256edff76dd996fe423bc957326e578b82a94 + # via + # httpx + # httpx2 +asttokens==3.0.2 \ + --hash=sha256:3ecdbd8f2cc195f53ccada3a613538bb5f9ef6f6869129f13e03c30a677b8fe2 \ + --hash=sha256:9da13157f5b28becde0bd374fc677dcd3c290614264eff096f167c469cd9f933 + # via stack-data +blosc2==4.14.1 \ + --hash=sha256:033e62c56e2815f34900739bd505c750377743657e76cea6ea438c30273767e7 \ + --hash=sha256:08e09c372b3aae159c012c96940694574793b5a00abe3a5bac966c11c88e641e \ + --hash=sha256:3458922f59b6a4b6f5be50192e455647ed3145bd3078c3c77e091b6ac8b64bd2 \ + --hash=sha256:411d9fa31c559f0b016c16611101ccd0e03d38dc89ab1bc94178aa3757ce756a \ + --hash=sha256:439720cca5191a820bba415d076f9440f64b2af84983d3916d7d795dfa27d662 \ + --hash=sha256:575977165dd49b9492d506585e5a2e67a2c6e0f0d450f5a29a9ea3df9a2a53fe \ + --hash=sha256:5d37f2c76272fb6d0ffee3afbbaa4cd73438abd7e2c119d6152bcdf1d47434b3 \ + --hash=sha256:61fcbbdd8b9b8b73e80f0cb363b544ac1ccce0ca7d93087bbf3fa786120455b0 \ + --hash=sha256:696fdfc471191679e6c1b3b2d5db4ae7cc40675e10997d0b5eb6caf7d470253e \ + --hash=sha256:6a2208f001580d497a050aba1a4083d5ba54adbe1e166cee4faf4731f0e96c9a \ + --hash=sha256:7555f3785ff05be952b9cd5f2474764457f1568fcea2bd221d0254f199b61e58 \ + --hash=sha256:783be978d3abd03299922e33a595aa0cca706152aa6fddc95b42472671d495cf \ + --hash=sha256:79b7c096401f75bea1a0f24b28aa8e783cf6c10178cf077f9260a022abb7b245 \ + --hash=sha256:8e0ad358a9fb38d41b0bd1dd08b00f1384774940abd053a74f7e8a80af095a07 \ + --hash=sha256:8e402a0b1caa407e87dc4fc230ccce0f89abe86b3f54c74feff025008327f627 \ + --hash=sha256:94c1e518ee23f4423be80dc7fa16e405364afaefe074472d05785eccd17c56bd \ + --hash=sha256:aec524576f3241f1e411d47e586421e1947c274cd7c715da83b65a81e2c52ead \ + --hash=sha256:b5adb408854260acf64aca5c351ab1307bcb7c71d112e3049d8541c1e2f9b222 \ + --hash=sha256:d2748625f152b66ddfce2f6fe079e22e12179dfe960dff7898838d3ef25776ca \ + --hash=sha256:d5e65efe80740651c3b39a9fd98478f073c57bed51f7eebe1fdfe248dc259e37 \ + --hash=sha256:fb2960ff411e2c1cffa6209932b5ee344fb46208906c3de79e8f23531df82e8a + # via tables +census==0.8.27 \ + --hash=sha256:207aae0f83650004f6b7dab6a730b6a60df96a119f55167260c3153313f15a32 \ + --hash=sha256:6ef36f5d2e7759824e28051bc2c7fa0706d41e153ccb353a6c2d4d9eb354cd7e + # via spm-calculator +certifi==2026.7.22 \ + --hash=sha256:62f22742b58a1a33014a2b6b706588a8d7e2a88ae7bd1a6ebe8c992928483775 \ + --hash=sha256:741e2c3b351ddf169a738da9f2c048608ff7f2c5cc02f1ebc6b118bb090d5d55 + # via + # httpcore + # httpx + # requests +charset-normalizer==3.5.2 \ + --hash=sha256:01077390b03f7988f11d700a2194e69b119741a86b1a638b1db88891e3eced8e \ + --hash=sha256:01b0c0d2262a9e28e8484a278c7e1b5d650e3ac8cf2683d2967e25899f208bdf \ + --hash=sha256:04851f73ae72b8413dddadb16a49dfee95263553741fd42d546f7d66907e6be5 \ + --hash=sha256:0521c5665880b33d603717defa76c094048900010897909952397feb3039da56 \ + --hash=sha256:0774bf9bf620249fee3e0b8b9fd3065de213be30f3aa94ce2494b3b638949e26 \ + --hash=sha256:0891b9d3903c5571c03771ca669a4b0ec5618ca722a5c957d3d29cd4e5062848 \ + --hash=sha256:0c951d5e6dd9c2ff60609476752bee49da4206adde960ebc247766937f72e718 \ + --hash=sha256:0fed1d06615f022ee3b13caf5e8b180cfea32bb2c5aded8a9d44277afc040f93 \ + --hash=sha256:114e4d0c92d618409ed82a99e22b5c5e768fe995f2973f78265f4524f49d4640 \ + --hash=sha256:11912e4bb14baae7c5d8791aa55ba0a3a03ec6729073307b0f57270abaa713d3 \ + --hash=sha256:11a4d68a6ecda3292cb1e50239e111543ba5d709bb62a6b4ea1afcfa729d8875 \ + --hash=sha256:124fbf1a8ff966d87ae05bb8bd45a71f966055ed8bba320d0c7cf450bc5f4d0e \ + --hash=sha256:1461ac396c4fdb983a675f20aa555624f0ee18ac83d832b9244ffff3d8055275 \ + --hash=sha256:1503bccbeb36d5527790c3930327704c39af22de3112f1b1666a9f3ce15ee204 \ + --hash=sha256:15bb4005af6320d259dc7593ca84a38d7fe06a421dbcf7b910ae23979101e787 \ + --hash=sha256:15c44f7edfd477b06f517a5cc317fc1707edb9de2c865f43d4b6513907473234 \ + --hash=sha256:16fa0eccf81304b79c5cd87f9271c3b85dd9dd99245e4422ae9c0dd45e0f99d3 \ + --hash=sha256:183b88127acdb4fabe59d951ab424faf1af7b63cdbb5f776186c1ea2ffcaed98 \ + --hash=sha256:195c26fb65950f8fce54e26349852b7bdd7c5f120aeefbcc440b8a20faaed4a3 \ + --hash=sha256:1afb975bd5d68d5ce9f6b6d44fdf2f7e34b895a35e95708a7a91b20a3b51d187 \ + --hash=sha256:1b4cbc7c3491ccb4aa17fcd8165649d01cf39f76de1696da8631b5f71b85401d \ + --hash=sha256:1bc0baf5ef96b6ede57d47f4b8fe4d9d84019c3bfcbeb20a41edc6a6ee341f1f \ + --hash=sha256:1c50fe28bbc2ced33386f298650d91218076c05420e6cbd790b913adc41659e7 \ + --hash=sha256:1db38f4c5496827c1a501846d64d14c3b80c7e6714e406cd7dc36a9899fa1011 \ + --hash=sha256:211d5a3eb6af8f513b8d4ca19a8c1b7accab1b5f0d3175f9826b03c1a920dc1f \ + --hash=sha256:23851fb4e1b85ed3f6c2a27b777cdfe2e19fb5b38429a8faf38c7542b7665869 \ + --hash=sha256:254eb48b9fa5ee9898a3c445825a1f340fe53712a098904b39b0bddba8ea3cb1 \ + --hash=sha256:2625388c6c754520c37abaf3b41eb34d1cc4a373f457898f08606c8e362b891d \ + --hash=sha256:281cb91036248400f4cc957495cccd44c275c2e0c5854f7e45ac5cf7dc193847 \ + --hash=sha256:28a15fdad492a99b6eccfaaed66ef3f74050680545ea61ec8b2f4c538f1f1320 \ + --hash=sha256:28b4f0d66fb834ff90f28209ac7bce77868c45d8c93e26f906709d9b7c2e1af9 \ + --hash=sha256:2a925889534b3748302dae5dead07cc13480de1dac3aea80a941b729b471ef93 \ + --hash=sha256:2b7b3bbfb4fe8ef40600792d762fbaa9057559f9d3fad209525b7a22b99e91fd \ + --hash=sha256:2c9ad19a6cfcd5ea5c0d41161d22f9df1dcc277e9bef2751391334546a314c00 \ + --hash=sha256:2cc961b171b3f3440f410489ab3573e86aea8736134ebbb40ea1338b7f0831bc \ + --hash=sha256:2ce45c6627b22c47e390bc91a41c3d13032192e699fa0bea96e9671b373d69b0 \ + --hash=sha256:2e06a3a98f916dd41d27f3105e02e7a40181c98c94b9158733d03a6f80506c09 \ + --hash=sha256:304d5463e65a35d7bb0850550e0780395395f6fcf452f04db7d5ca7cecc425ac \ + --hash=sha256:304d8e4d493af723536393eee0c689eb7813f4a474c8b479dee63f1fdd98f621 \ + --hash=sha256:30fcd120b732aa79317f08dee04d7de0847822e4cf7ee0e9f445bb958832252c \ + --hash=sha256:31f3930700408d211f13378ccbe1c40845d8da54bd0681fac3a9b5aae81c7aa8 \ + --hash=sha256:34276fd796040bf0993ab33a369aa572e6979c7aab225a88893667ad8eac8f7a \ + --hash=sha256:355ad8011081dec5412240c087a9a0c9d4d5039f3ed11a3f13e18c2b29b56c51 \ + --hash=sha256:38a873987f3be698494da8b2e3085e29da02da7b633dce73e79c699a113d7bf0 \ + --hash=sha256:39de2a259fc954455c57274dc94c79d5842774e1247a016aff30bc0efed0f4ef \ + --hash=sha256:3d14b50de6bf4d0edf857a9386836846f982b8f524e188e2e68b96d702bcf4aa \ + --hash=sha256:3d21b8b13c7592db2ac5e544a6d83187b995257472b0c9e8351b6d507ae37ed6 \ + --hash=sha256:3d31298449090ab8d47b7b1b2a555ff73cac7ed438a08b7ac160980c7ebed649 \ + --hash=sha256:3ddacd27458c45bdacd6bd6db644bfb730efbf9e830310186e3045c9c5be8fb2 \ + --hash=sha256:3df041de8887954562c9b261cba85ca0e9ded74048daf125f45edcfaa4832229 \ + --hash=sha256:40ab6bffa02ae10a0581e6c198be7d2d8ca5c2a0c64e4ed3465d766df457573e \ + --hash=sha256:4275811936e2f06feff5e598fb42a1b7ae852da8e39605211892b56b81a34efd \ + --hash=sha256:443eae2bf318abeaf6f15d785138f71fd6de770e99a92158b8b814265e079115 \ + --hash=sha256:447441e76ec720b15e64418d32e092297340387053047c7c694f579efb0ee1d9 \ + --hash=sha256:4495c5002a7b28557e7e222e77e0b661183e432b7d6d2e788101e3f240e05b8c \ + --hash=sha256:44bd4fbb29dfbeba60e7d2bd000c59e4b21ddb3cc53912b14048d37092706d7c \ + --hash=sha256:4685902cf26edf013ed7a3da0f426ebba7a00ebb9541386d835afbf002c11cab \ + --hash=sha256:498dc3188ca05a68231ac3fdbfc7f57eb67e1343c30e0fea17f8218c1599b253 \ + --hash=sha256:4c2b5031f63e331e3839b40aed2dd6f191e9c07edbde303e7876846ea1946995 \ + --hash=sha256:4d48f2d08b9de5864e2c8744d4461b862fb149a18274abc8b698c45975573438 \ + --hash=sha256:4f87960d57feabfb618e4e0af6e7371645fa26a277860739d6e5d6e0012c92f0 \ + --hash=sha256:50e3adfb96fc189eb27b1cf62d3b598b89b4bb0420d93a3d3e42e137409011be \ + --hash=sha256:51cf45226a9b588d0d2b4880c62d686934b63ab0bd79ca23ab0e9762eb27441b \ + --hash=sha256:52aa6992700996af31f375de0c6bacd402b0097fe40b53c426b9f51a90ebabc7 \ + --hash=sha256:55ea99acb17b9325618de155a0cd6a2e8f5d10be008113e1d433bbb58db543b2 \ + --hash=sha256:56bc200a365efb37383b7852e4cc5898d3b2da5987289b543956cf8cad71018a \ + --hash=sha256:588461c2e8384d309bd63e5826019b6977bc66d629b99ac8737bb795d7b2cb5a \ + --hash=sha256:58ca3755ee7ff7f59b57789ec9833c9de9ea275405cdd240eda1f193112e398a \ + --hash=sha256:58f361dcbab699cf8f42db3f47c8e7fd1036f138c23a5d08de9fde5f425a730c \ + --hash=sha256:598a11a2c7ebaa5334bf698bf29568c9c390abac6a154d8170fedecd1cea38c5 \ + --hash=sha256:59f63901b0031c3136cf64704dcb21de0bbae62ce2c9529bc39d27665463de37 \ + --hash=sha256:5cde776b7cc66e4f6c99612cea4aa7269aa65863f7a15841b2c264f103822f4e \ + --hash=sha256:5e2b6b57e9733d39f0c9fd3185efa6b8e29652c4cd8fe94180272cf6ed9a78c4 \ + --hash=sha256:5fb29fb8cd1a46c27a1bf9613ad5ec2599310d46b4025d9556404a6b6a292800 \ + --hash=sha256:6045373d5a89a5ec71afde535db987ca28e76dfa276c2d4c818265b375d4b055 \ + --hash=sha256:619799369eeef6366ed3e8755a5670f4f2f0fb6b30a0fd7264dc0fdc2357058e \ + --hash=sha256:62588a277bfb59def052abd940703fa35107152bf479781a878617d60faf8fb5 \ + --hash=sha256:62603db9a7caa0802eaa28c1c46fecd7b3a263a774069c24c3c28c302448721c \ + --hash=sha256:65cd72beeeca9d3aaea1201e5923859f308f952f9c71de93f06063c79f0f7a3b \ + --hash=sha256:68eb192d85ab8e5f6ec69c2bc6ac0179fbf04a5ac1569d12fbef74883fe102d0 \ + --hash=sha256:6bd128f206a7752ae1f2ab6c61bf8a24ba28913a10df8b14c2637b973ff97a80 \ + --hash=sha256:6be488a102b8cf28d0391d8c4ba7748938ae28b78ad901f8585520fca33ead1a \ + --hash=sha256:7218e8f32b0956cfcd048fd42d9d5779809745ca1d86113ca56f66e7ae1549c4 \ + --hash=sha256:7441d755b7ab94f8d4eb3e43ec05482d760842fd263d003a99102d742cd835e2 \ + --hash=sha256:749e97e1b32313717a565abbe321bc2190bc8b35f1a67e4cdbc7c56c8d8ffe58 \ + --hash=sha256:75a3ceed0724d625d64b86ca20aba182e4df462e04c2414fc941c0f523f06aac \ + --hash=sha256:780fbe7cab297b81dad9fb8dc5eb003c0468ffb0d9e5f65068c53a34661a96bc \ + --hash=sha256:78456a747de8dc58360ffa581f30a002baf5aa28cb262536545e91f113ed7639 \ + --hash=sha256:7967d08cf06dee78443b874f98c98036f624f3a4e73e11f9f64f5be4d25393cf \ + --hash=sha256:7a881931aa470808df94a8c380eed2bbbc76cd9dc622310f99665658c821eb6d \ + --hash=sha256:7dcd882da75ef9adf94903b1e3b9419e8aa8fb4c7396822b834b9ef7fb96954f \ + --hash=sha256:7e841fb9010836c992c9f12fcbd43a831de93a5f726fc1ccd8ca1d0268c5014c \ + --hash=sha256:7fdde2c9fd9e3eca40631e024664cf2584272cc8f96308cbe5fdfc930f51d8bc \ + --hash=sha256:8024d00c3faf3fc0c16e07a69f4405e8eac7cc0ab15f65fe6cf43827c4cf72b4 \ + --hash=sha256:80d02b6f04e92601a081dd97b23d3128033098bff5d35d392ddcc0476ea11253 \ + --hash=sha256:838dcc90063569a0448120554591a1d6c4a4ffe11babf048908793154ab86ade \ + --hash=sha256:849df64e889b2e17230d58410a03dba311a65b163508fd33679b2b737d4b7858 \ + --hash=sha256:87475fabc8d9996fd9c27debb395e642e8c838d78a00b6e932227a0e06b81e26 \ + --hash=sha256:87e50a3e7cb90af586b6c5faf23e302a970415ac73bd7bd90a515a04b427ef96 \ + --hash=sha256:89b53f3cda69831909888e0494f4fa0bcd3537e3e138dabeb620bd6ad946bae8 \ + --hash=sha256:8a893cc101149f80a653f82062ebc95b34525a2614382e1da5458fe7c6997249 \ + --hash=sha256:8b2bfab86aa71ae13aa41a6a26aab338e0db2b8bc75434b05aea89e011ff35a4 \ + --hash=sha256:8d86d6fc60743dc916eb79e2eb1ec4818e21e427731543af40a3021851174a13 \ + --hash=sha256:915563965d418f986e7e145accc592eae9e1a1be3566ff98a05d7a9ec42a76e1 \ + --hash=sha256:92888bb3187c5ba50500b00b3b310c9f2c651709d28036077680cb5255450a03 \ + --hash=sha256:93223adc95033dd47133a46ccfc316a0139176fd79085762e27202ec56018f03 \ + --hash=sha256:9373ad13ef0d2c0fb761e04e55bfdee5a08b52cef2c882c8fbe9935b1517152e \ + --hash=sha256:9409a8bf35cf78353942504b24a57de3d75b708997a1e4bd8db71ac8633ce364 \ + --hash=sha256:9b7f416ff0978e2f2249330527f0ad6fa02f4932e6199692d3b52da2048c19e4 \ + --hash=sha256:9bde855991b7e362c146535e3136a50bfaffc0487d38b33ca7e5edefc6e23849 \ + --hash=sha256:9cae88599c7219005d879f98e5ed53341e9a122af585e1091200358a3003d2a0 \ + --hash=sha256:9cf9b1a857e25c4baceeb3624e92a56df3668f398c4acba74e174d81fb4d1d3a \ + --hash=sha256:9f56f72050826f63dcee7a7f55b0a77168cb3bfc553fd405e7f8f9ece75a4036 \ + --hash=sha256:a090bb2c68df85450502e3e20d665e3a5af9c65a84d6508ed477badd49166fd3 \ + --hash=sha256:a192e2c40070d92c3ccf777e3a5c4ff515573cd2bb7ed0c537fdadbbec5bbf21 \ + --hash=sha256:a19a731138fc27d5682277d3b9df22855cea1239bce7fcec5f78f42ef2d1f3c3 \ + --hash=sha256:a66c3bc5ab1f0ff2164fc9965ddd611ff0802173f4b9d24554c563f6ab7e1d6e \ + --hash=sha256:a815775b6c38d4e0ff7bcffbeba67feded90202bb6a226b8dd35f1c855217413 \ + --hash=sha256:a89012d6d5476ee112d20d998570ed58df2260a852afb1758809cd6900411d21 \ + --hash=sha256:ae4f5fea5b8b8ccff88238cc8569303e5ee95efae67fa62922a311397a71f346 \ + --hash=sha256:b6856554c4f44d79fc2307d5768854310a8f0096e501c75637542c82292b0429 \ + --hash=sha256:b6b751274acb69d77b3323d6b7dbaa3c7fdfc1eb829b7eb61d262f32e1af9685 \ + --hash=sha256:b736353c0a625bbd5fcec108576e2385db3496f4f771f785ff32e108d3c3bc45 \ + --hash=sha256:b7fd005a73d9e657273b7a10dc71a9e03c8fb9ee6999798d6918ce095b81ac7f \ + --hash=sha256:b91363207bd9dc966a691e959bb47f64b30f7ac4b072be9968b366982f7db77c \ + --hash=sha256:ba0b1d2620edf869789c3879223f52bf2afc5d31b3cb47cc57b3a12c05e2aa9d \ + --hash=sha256:bbbfc8e28816f19d7c0f1816664980c0a9875d01b27cdf8eedddb639d9e108ad \ + --hash=sha256:bd16aabe4a02a297c23417aa17ac6299dbd8c49f673bcd645b4929b11f5a4400 \ + --hash=sha256:c0afc6800ba57ccc350374c5bd6150419915d95ce93cdbab2d783d75eaf30ecb \ + --hash=sha256:c6708715abcf3c73b99508253e961a9967f02fe536532834149574eda6de0d1c \ + --hash=sha256:c7c9ab723cde841fefb34efbad91e87f00a674b1fe1cd0784fde742bf2c154dc \ + --hash=sha256:c8f3d67aeaf55f017982b73683f0e7342ba2f6635a78f69ce89ebb26aa411e5c \ + --hash=sha256:c9790464842f85f437dbbb54417eda1e0e6bfc52dd8d22d6fd1c994b73b2dc74 \ + --hash=sha256:ca403d7e4798f525fdfc78e258820419cbbd0f0ecbab9de7840e3c017cf6b8cf \ + --hash=sha256:d008d90a7f2471519aef0c90dfbe73b3e6e4d5e66ac48e19154c17e89e98b604 \ + --hash=sha256:d19fbd981a488e22cd04883659ca6b08f50b5974f9fd7c95655ef6a043e5893f \ + --hash=sha256:d1befeed746d247c81127bb14de9dc3d30edb6e5976d34f83f86ed262b1d9105 \ + --hash=sha256:d2374b62878abb00cd8309b32af6c0b715cd02dec0ca74ef12e5069bdc64144a \ + --hash=sha256:d376bbd28b3a8999db1a103b3b388aee6f1ddeb3e51bc2172993efdcd86e064d \ + --hash=sha256:d4a7319f304a774bed22115bc891618e45f85065ab44ea6acd07d274e750519a \ + --hash=sha256:d6734d2ef8a50fbf8445c139477da401f50d62a0606bf00e20ec6d87773fefb1 \ + --hash=sha256:d760fe2a4d7c3b226cb9026d6a842868d52a7901bd98420e1baf14e80da85cf5 \ + --hash=sha256:d913de495d90407cd859d263bee2e5d1a4ed3eb6573c04e70d9ec619a7cbed7f \ + --hash=sha256:db19d07e2e0129e974a0e65d0064fc222a446cd5122c2fd4184d2af9fc734a9e \ + --hash=sha256:dca9ab98072a5a54ebacebdc45f53e645336b320c667410b061be1ca588ae709 \ + --hash=sha256:ddc7dacc8ece3a182e7f15cb862d1fd616b46d076cb1ae9dd232b2c38b655874 \ + --hash=sha256:ddf19c062bea7a0cc80f519243d2c01dd091be0cf952a0750d4ad576709559f5 \ + --hash=sha256:def79fa35ef0cef8d2accec024f4fdc7ead3012ff02f5215c783f39f03ef8cfc \ + --hash=sha256:df29a0a7107f7011e77f4eebdddec4c7331e24d787a0b21a46d63bdf7445da95 \ + --hash=sha256:e09a3942ecbdee5cce73ea9d42da82b81b72ac1bf031ce069b93b5adf4eac8cd \ + --hash=sha256:e242bb1c5e76e97dfa9e7f209a71e93a01d7f19ffdd5cfbb2e2d55b4f08f8ab0 \ + --hash=sha256:e243bd13217235fc7290c621941c3f5cc8b66e4872495be821d7436ba2fb838d \ + --hash=sha256:e2af3aad578aa6bd1384bcf4750fc285e5a9de53f40b7d41e5a0bf748edeb2b3 \ + --hash=sha256:e4e81e09c1578b8df602e3db08b0b3ea0a6947ad612f52bf8dc5ea8d47691f0c \ + --hash=sha256:e54da4baf05720032d527874d40b65fa4d7e5c6c6a43d0c3adbeffcaf275a2b3 \ + --hash=sha256:e80e6c2f55656b4824d72065abb4ddd6a525c74bd78a0aab5d9fc2cf4fb5af50 \ + --hash=sha256:ed2a239c0ea213acc1908150a3037257083c7c083128f1a4cec2ec4b97dca491 \ + --hash=sha256:ed905975ab14056a2e5eb1c376cb2e1ebc5396baf84163939c518556fccde9f5 \ + --hash=sha256:ee21e28f0430bd6dc9086c6e525d5e818a44a5ad19720c8a0ef766792f3eb5e5 \ + --hash=sha256:ee43c17b173d46a3212baa6ead3ae258eeabdae48c263a01ccf0218c366dd655 \ + --hash=sha256:ef4fcbf3327382cd4c9f540babd61248208af7b93eec4de397b4d5f58a09e288 \ + --hash=sha256:eff0ac9dbe711a4aee69bf04a83896aa9b85f19641264053a9f6d48573abb7dd \ + --hash=sha256:f0aa869112ef88429ae17820d99c3dd9504c9e9c671d3c246f3d7442cb051084 \ + --hash=sha256:f3c96f633825733f735c5a9cf21d21a257d8e1edf0b1cee0a064b9c424ca0f7d \ + --hash=sha256:f5833ad231be5eb6553de524a70f48d71b2c8563101750531e0b80184e175cd4 \ + --hash=sha256:f5ec61164adcec446f8969a3358ec3f9b26bbda3b9213e5586d219afa8df2915 \ + --hash=sha256:f7d486c83842422badd511868fd8a9a20e9407ace71564b6af47ce7e60a336c1 \ + --hash=sha256:fb9e68df06293761f9fe66ade60a9bc6d0f5e42b8acf2939a9158af86ab0e5bd \ + --hash=sha256:fc14a032f813bf5fe624d991960ea83e9715adc27e4c1830a2361eb1d02ac341 \ + --hash=sha256:fcff63213e8e6e47770541a4607175404f47cbb3ebea7b6058cc82d524a0e424 \ + --hash=sha256:fd1fbe0f116b6e55da77aca2c6ddcddcfac2186cbf78bdebf40fc156efca389d \ + --hash=sha256:fe9753dfee015c570d73df76f899f18444d41388bffcde097deba51c4fadbb9f + # via requests +click==8.5.0 \ + --hash=sha256:255bc9599cf7748b4b1a446ccc735421bd08a2ae529a8b88597d3de5664ee360 \ + --hash=sha256:ba0d2089de75ea0310e2dde03160e6ca10009947fb95a182f9b54021bb272e34 + # via + # policyengine-taxsim (pyproject.toml) + # huggingface-hub +contourpy==1.4.0 \ + --hash=sha256:018227e134b73090b06f911e773a526c77c9af426be29065500ce096a5accd4c \ + --hash=sha256:072a702e2e178f4fcf96f04775d0c059e4c917925abf0d3208ebb6865df3c23d \ + --hash=sha256:0c7a4c2716a4e98342221954416a836cca77c996c14ddbf22b5f01d5d93ca09c \ + --hash=sha256:107ec46f7aa1664266d69b1181aadc953d58d39f7d8d648fa5b795d4a060b0de \ + --hash=sha256:181bea01bc742734ae672fa00c717d855dd35e1f029536406538c52e7b0cd73d \ + --hash=sha256:186ba929df36d61b6127da2e89cd1357e4cb79aca647381ab1a6feb0b152877b \ + --hash=sha256:196759a3e4db60e1546167e361090ebb6d199aa3aafc9e34ea17a5ac3b23e814 \ + --hash=sha256:20156f5a1ac4f8ce02656e39a61e82164a3d359796dc8026f75b062783d500e1 \ + --hash=sha256:20da2f86bfaed60dbba729fe738c8241b1dd22b6cf7e8cbbf30df290bd04ba28 \ + --hash=sha256:2deb580178ca19437a84bd77e4bc2cd91a8ccad212413a83c273900868b5978c \ + --hash=sha256:2e741a39dfc96babe1722561e81351aeec104526c57dbe91c167c1db606c2d55 \ + --hash=sha256:3863ef2e2b13fe93f8c0ebb08ee400cb07153b8b0e91c5acb26e4537f283634f \ + --hash=sha256:3e0a2392533e5e2abdf277c951047516acc8d2f3c42b2dd9dc34c907c9ebabf2 \ + --hash=sha256:404dbcd9233513dfd1323b66ea593fef90e899f658f6b8a9ed8e93bd0ca669db \ + --hash=sha256:417be048f7e122cefbe2a34c51a1f2b0410f8eb35796f794d45475ddb7872d9d \ + --hash=sha256:423bd5f4b3f11d54a8c597234e513382e3454bb106b8ec7ae32ba4ed63f8d99b \ + --hash=sha256:432e89f835cf01f8d2123a130a3126b17ee6e0348e4d62c0973872b30aa873bf \ + --hash=sha256:43c3ccbb32c6294b183dcc8e8c46dacf5ecef809497e3d48a5be298eef185ad0 \ + --hash=sha256:43d80072a32299bf945de0a6dd4e034ea0162e832261de2e07a274a5adbba9c9 \ + --hash=sha256:4bffcb2e8cc5c0e837631acab59dd04265fdac376550e7c3e310523877c68cb7 \ + --hash=sha256:510f7d93d94cf6ebf4e2cd0640bea16ab8affac7547230175b6745b596ce0599 \ + --hash=sha256:5450f091ac1be0be3ad3a2a3b3f23b5e443e78c670ced4fd347d626f92a28fd2 \ + --hash=sha256:5545ff38229c15d11d822fc6f7415b932da9f4975f53e305b7b96ebfb01f889c \ + --hash=sha256:5a4c89c7f38a0d7a94356d74e3391073c4325c4d47ad2fd065c3fe7dbae16c0c \ + --hash=sha256:61624f6722480aa7e168fd746164e7bfdf48f8ccb6542f1613741200dc37e2b1 \ + --hash=sha256:618137ec5778fb76d494c9ec854b104a377fddba0d128bef7136cce2c3bf0df8 \ + --hash=sha256:630d32f06cedf37b7f1dd2b6a12e4492826bd477a4c9c7b2e2fee6ce3a2cea76 \ + --hash=sha256:64039341e2d8804f1a13bda8c69083eab935167bbd7e856cf096241f17d5bd45 \ + --hash=sha256:6507a016976a75a15aee47809a34605de6244ccc056e6164bf9fb14b27eecad4 \ + --hash=sha256:6ced1670fafee703b8277ab1645072a226e74f167166eae146fb743916119b67 \ + --hash=sha256:6e697d94e69f499ff6bebb899cae97a58d5d14f0e1fe9568b43a0248d2f9af8c \ + --hash=sha256:6f963ea9f0d68d2b6a02d861e3c0aae09ae25ba21f243fcf281e9fed468b078d \ + --hash=sha256:738c44fa71735a617f36da58e32810512407d283d5d1bb5b1cecb00d7eeba7cf \ + --hash=sha256:758e7496cec3195fc28a28945eab3ceef348c47fb95c7afc2eca2f3901209c8c \ + --hash=sha256:78ed5c5f962b3e156109f0531b174a65ba80d13cc681a70227b12524c162e184 \ + --hash=sha256:79b06c60d5e569ce12c5da8f0c51217cdc484386e2349fa717c30fafb56d2871 \ + --hash=sha256:7f861af508fca2384eef392bc1d8377cfa349b2b854cb11b45d89c75780e2561 \ + --hash=sha256:80c7fc8e7ac217777ce7ba2db3cf8478652b5a4b335283111012ff9eaac9d842 \ + --hash=sha256:86d05cec773c9507a3950122e0e40ce77c23c75ceeb2fc189514e71893cbb34b \ + --hash=sha256:875f42444c9cf48d56f724f2637e60d0f73b3b12c9041e1484580a233edf9591 \ + --hash=sha256:90feb8da006803a95ba573fddc9536357d0c3faddc3a4c9e22816ca49af52878 \ + --hash=sha256:912c6afaa106e2f74ba22b30416b77ef7eb94e3bdc5a4df51ab147845dba9b6d \ + --hash=sha256:96019f059bcb3774acc0104be3360a57b36d33eaaa2e1d7f77c800ca8e07618b \ + --hash=sha256:9c0e07c691f3b3321913ed9b8161c50ea5f77fadd006f52f5e755359b0dcbfc5 \ + --hash=sha256:a03b32c2e7eda8b17757c022162c13c86f5c3d6f937dddf9ba3c3ff7b513953b \ + --hash=sha256:a1c8a74744fa746eeaa12f0f9ed7f8b4add9d8f1b14d95e3b5e133675eac888f \ + --hash=sha256:a3e67bc1a6a4618a1dac7c3053a9ffece5ddfa2046b2670b342cf430bb0b87d1 \ + --hash=sha256:a58b5f130afec61a093d743cdda435cc4047748b6791627e34a68f41ec3a9b07 \ + --hash=sha256:a5e2bb871b90cd7a52bdee63bf80ef7acb46398d27efc66d7679240016efc5aa \ + --hash=sha256:abd0f7e51ecc52bf8c95713bd80b1c17c516a71fa391c54475308a4377903c2b \ + --hash=sha256:b7794ea07cab575633daad8d6e963b662053391022294d3aacc1d9ba9ef54114 \ + --hash=sha256:b9dc493e7924e5aa32d89d0b8e50986280f3d4b284968a792787bd7bcffd3cad \ + --hash=sha256:be85d160e7c795113c2a93254dde2fc7e86b375322570eee78b420969426973c \ + --hash=sha256:bee6ff96653e0807cd0f8eaef00174a031e3a2effa5c20f49a5a8d574b05af23 \ + --hash=sha256:c76f3a5318164db7d9401132fc1b5364b784c613c93fa506e3b5e6d1bf353ec8 \ + --hash=sha256:c8be3392b84cf43373a488874dc1ebf46f60784a70977f92586e18019d71c7ed \ + --hash=sha256:c927ec747633e68c9920bcaad48b0bcefe648812b822f18c34e2d0e2270a3d2a \ + --hash=sha256:cc87f2ffa84a49a77d76cb792f28a48ff3b05a222aa0b2bddbd839ba78e1d5ca \ + --hash=sha256:dd59df9e2fb0aff8bd7fd1adb9f349b7c835245a9d0f18c2f2deeb537190f2b1 \ + --hash=sha256:ddf5a2596d716fd3793434844caf31abc7a40b1e8718431420c89858268fb909 \ + --hash=sha256:de503609fdb71f597634ca64fb4bd2f13d27c97f140e912b1e8ed93544840df0 \ + --hash=sha256:e21d1d4a9db5b3a793649c7ab0ddb4697f2818929eec871a7b9c45fce7b2a1ea \ + --hash=sha256:e439ab450c93455feb0218532ded3e946ec7a9b5f459069f122cfa44b89229f6 \ + --hash=sha256:ea09dc704029930cbd097f75cb0cc1db9852adbcf1a151fac7e9559f7bcbfd19 \ + --hash=sha256:ef47fef9a912c77e3d84b014f701e5a9340f25703e9ed3bcebe37f91fb69dc49 \ + --hash=sha256:ef9440f6f8506246269a82734f5ff9e2e4c5e775b3996fc883cc491c5257eca6 \ + --hash=sha256:f1219a8898523cba821085f2da8a1b962cc696325763f09d7f93538ba43b2d70 \ + --hash=sha256:f863c6100bf926cf47d13f3cd75f9bb8ebd98aaab230eeb4468b91f98f39a6b3 \ + --hash=sha256:fa1b787362a3856e63dd2b89449f6c384d55ee1beb8f94f4bcc871b40f02462c \ + --hash=sha256:fc9feef8f1f001c5b87decadc67c4a5d1eebb62ca39c4763d1237ff62cf2b707 + # via matplotlib +cycler==0.12.1 \ + --hash=sha256:85cef7cff222d8644161529808465972e51340599459b8ac3ccbac5a854e0d30 \ + --hash=sha256:88bb128f02ba341da8ef447245a9e138fae777f6a23943da4540077d3601eb1c + # via matplotlib +decorator==5.3.1 \ + --hash=sha256:4cbcdd55a6efadb9dbea26b858f4fb3264567b52d69ca0d25b721b553f60ea82 \ + --hash=sha256:f47fe6fdbd2edd623ecfe36875d37aba411624e2670dd395dddae1358689bb3c + # via ipython +dpath==2.2.0 \ + --hash=sha256:34f7e630dc55ea3f219e555726f5da4b4b25f2200319c8e6902c394258dd6a3e \ + --hash=sha256:b330a375ded0a0d2ed404440f6c6a715deae5313af40bbb01c8a41d891900576 + # via policyengine-core +et-xmlfile==2.0.0 \ + --hash=sha256:7a91720bc756843502c3b7504c77b8fe44217c85c537d85037f0f536151b2caa \ + --hash=sha256:dab3f4764309081ce75662649be815c4c9081e88f0837825f90fd28317d4da54 + # via openpyxl +executing==2.2.1 \ + --hash=sha256:3632cc370565f6648cc328b32435bd120a1e4ebb20c77e3fdde9a13cd1e533c4 \ + --hash=sha256:760643d3452b4d777d295bb167ccc74c64a81df23fb5e08eff250c425a4b2017 + # via stack-data +filelock==4.0.12 \ + --hash=sha256:5f17ee83ecee8a6f3e389c75822fb70a1c2f0506b99438a6dffa1d56793588c8 \ + --hash=sha256:cf42711a7ac791818b299fab0332a088c65aeeefa36290de98db92c434303b0c + # via huggingface-hub +fonttools==4.66.1 \ + --hash=sha256:058cd823b80bac59e64dfad9e3b6fcd677852f9a3804971bbf6b48cc611e785c \ + --hash=sha256:05aeb146451f37289f782c3c861f3d0f4b86c2dd2e4620b46683544c7406640e \ + --hash=sha256:05c0fff6b4a5d872ed89cab2c4f81060b86ace263903eb4e8d0edcac47a60dfa \ + --hash=sha256:08d8956e3ec990c75230d92f1630b215e8f3738c83a003421c22b31ebfd0ce15 \ + --hash=sha256:09ae73bd219e1245debd8376077a0fa6e03175e255c4f51bae5f6a271bfe384a \ + --hash=sha256:0dc6fd99cb8c30941036308b148da9432640442a6f26f36d71dad9be24cbd0e9 \ + --hash=sha256:1801fdad5600118327171e0e8aa79f7cc48831dd55ab36998c9de03bd5ffe6cd \ + --hash=sha256:261d8dc95845e751f975fe8d6075600593ee253470d46d1b84801688051b09f6 \ + --hash=sha256:2aeb745f2664eb811026997c95628071137a777ea2ad296deec9cb393f0b23cf \ + --hash=sha256:2c7340497cf53490293e0c2b61011e0191633022ede0a0a964a68157a98b0fb4 \ + --hash=sha256:2ce4c93160535761f22c80b2afbc96cabc09855363a5d1a5554265b8a4c85901 \ + --hash=sha256:2d320483928c7831f0139ecb361954a26b2e2a8995681200155835dd8cd4a7d5 \ + --hash=sha256:2d637468dac23aac0e223bd52e66f8faa3b0dfcef57435460fa2107e830226cd \ + --hash=sha256:3087a430722aba8de429c2539fd2a58a9cf05238cdfefd8626460001052ca878 \ + --hash=sha256:34378db9a398b59de18cc79d942f0a907c6fc6301945e065ec888202f607aa3f \ + --hash=sha256:36bb24d4b98faacaff04af1d5e0a4285feba6ed1da6728cd34b6b6deb6bbb934 \ + --hash=sha256:38ce8f5fbd5c17dd2153d47d7c8d4108f3deda3f2b4a79b60ddc470a58faded3 \ + --hash=sha256:43d1284c1964666ee833f2badd3017dc138f53d4889043ffca66c5ce4188f188 \ + --hash=sha256:53e5854ea8003efec34adc0863c18ce91da923018354d27366f7fee7db928d7a \ + --hash=sha256:56d41d650cb8fc6cfe1d85ed7c62a0a56cbeed07bc65ca795475b914d401312a \ + --hash=sha256:5de5d80fbc0e50ff794c244e8fb7afd3eadfe0fa232ba8b162b8c551df22fcb4 \ + --hash=sha256:60f5ea17aed4262630afa43f26997ceabd6417fa05dcedf54c665f5a29193e18 \ + --hash=sha256:64967c6ddb0d4c610dfd8cb1485981b2d27972ddfb7d4bbbd9e199d2a089c450 \ + --hash=sha256:668f092bc0de8902167df6a0d5c5aedc3b4f9e43cf88eea92e9b46a2bd3968f5 \ + --hash=sha256:66fad3b7874062c2a2692f0ae6dea56d24f01b778c7f191950ca3ff997e25a88 \ + --hash=sha256:6946fe7bfb28590a1fd4061a17609c9a843952deb65dcf30d1fe725070c3e7a4 \ + --hash=sha256:71c7ca1b5f46f5dd549f56b47d47c0b709217675c23d3a7bc6aa1a69b6d9bbae \ + --hash=sha256:72299346b96b9244dabcc051b24e4653da4edfda6105544cfb10ce856a1afaac \ + --hash=sha256:7234ae9e28db64273fbbfa72caebd0a97e3bdba6b05064114741b9539ef339d0 \ + --hash=sha256:7b8ff9e0edbcee2fbf7dff0c41b9041c1901c26acf64e23adb67495012df11de \ + --hash=sha256:7cf4f996f9b1cb549bff9ea4c50813988a26ec922c95cfa85c7e4f1270447e06 \ + --hash=sha256:7f49f2834f5d006fe0f3bb10fec73b261806c50941f0cfbc08294074ffc32210 \ + --hash=sha256:83572afe48733bad7a4a9c11721d3a726c2e976d82b063fc9bdd049d76955abd \ + --hash=sha256:8526b2b7ec4db6b81efb83438be52b1264eda9a4994d867163cfe8c65581ce8d \ + --hash=sha256:8aed2bbcd6216253ef1b015763593365ee8084f621dfa53bb957c19d5e05f7cd \ + --hash=sha256:90de3477394c73481d27d2b86091c1c736053ee13ff52c42f0e151948e8578c6 \ + --hash=sha256:9261ef507f2dd74203443a472b65b5a26429eb378f975016dec7dc7305b24898 \ + --hash=sha256:9ea6c93091cbf83161a544388746a0911550bd98cb911faca3591cf5ead166ac \ + --hash=sha256:b13c8c541ce0b794add3211b3641cc0e113d707f73e06235e6fe9731bd7c45a9 \ + --hash=sha256:b18803cbdef248e7ee1be59cb277fbbe1da1faaa6f726fa5d3557904e6a3d967 \ + --hash=sha256:b878c78b2af11b879bd4f26bb0d8bda2a4c64543fdd3f28efe2c80f97f043885 \ + --hash=sha256:b8b71db96d605784e2c5ebf0788a406018ea8fdd80338491f4c83613d5cd1fec \ + --hash=sha256:b913b8e9f7ca9bec44d1eb919f591c596c61041aa357c96be55ff93169859e91 \ + --hash=sha256:c258eba62260beb33c110b03a6912cefa3635239c4ab5615b7225fb6f7b85238 \ + --hash=sha256:c47299bca4b5acaaeb32100f77b944feea151de9ef1773365a410dc3d49b945b \ + --hash=sha256:c666fefdd5613a0e99aa4516e6ff4ef87aa86cf1c7ba12a73550f4770e46b750 \ + --hash=sha256:c724e56213494c6695335577822b2d1628d102e71614de8b7eb8e30886d6a314 \ + --hash=sha256:d3b5403e82d0c7659ff1d9f956e29a3a68d094f043e9f5bc0442796fc3a4fb58 \ + --hash=sha256:d4f76868aea9cc4ce47fdbeaa904c02ee7d85dd0ad095071ae77f0bda6e62cf5 \ + --hash=sha256:d84ac0bf776b68396185bd919dd29e633d94300660335efc40b55b294b886903 \ + --hash=sha256:d8f0a8f16c4f3a5a87ca971de2631792d8cb4d570951f2000acf712f157d40db \ + --hash=sha256:dbb7b950f8c02deaffb6968994691e8589d671b7ef8396bc9d5b5c0dfbb7292f \ + --hash=sha256:dfba62cc93199ba62c376f90f2a9147d92730d301e44f88e013e50ff5edf6193 \ + --hash=sha256:e1cde50b3ec84ca6fe63ca815de183dbecb88e8adf8ada82d8ea130ef12b2b43 \ + --hash=sha256:e7ea7a08547a453fa000db96ed5714a3dc7e2b4255b9243f897921f8c10c169a \ + --hash=sha256:eef76d5796e604f9d6753fa6d323c4eb9f4e0e43f1dcca553f3e6914f1667b64 \ + --hash=sha256:f08ab7f8461c37ecfdd29ad97fb0c0780b50501bd664bb0f46b6e83ed2b9d2a7 \ + --hash=sha256:fdf4afd75c643e60ef4a96fe64fc8a9def27d2a542112332371a9e5066885f9a + # via matplotlib +fsspec==2026.9.0 \ + --hash=sha256:0f08147951c8cb31d844c3547d631053b127863b60be04cf06e121333ee0e2fe \ + --hash=sha256:8dd6e646e99ea382bd85f97a45e6b526a442d79423a7dc673f1e2756d05fcb5f + # via huggingface-hub +h11==0.16.0 \ + --hash=sha256:4e35b956cf45792e4caa5885e69fba00bdbc6ffafbfa020300e549b208ee5ff1 \ + --hash=sha256:63cf8bbe7522de3bf65932fda1d9c2772064ffb3dae62d55932da54b31cb6c86 + # via + # httpcore + # httpcore2 +h2==4.4.1 \ + --hash=sha256:0e25f1462b23c9cb82d9eb02e28bc706dac2a68cb457c6a0d74d63c8a2a5d0e6 \ + --hash=sha256:4e866ffb1a869ae14dd9b5e6beb5c24a13da0495ad72b65925ded182521c1516 + # via httpx +h5py==3.16.0 \ + --hash=sha256:099f2525c9dcf28de366970a5fb34879aab20491589fa89ce2863a84218bb524 \ + --hash=sha256:0f456f556e4e2cebeebd9d66adf8dc321770a42593494a0b6f0af54a7567b242 \ + --hash=sha256:15922e485844f77c0b9d275396d435db3baa58292a9c2176a386e072e0cf2491 \ + --hash=sha256:1677ad48b703f44efc9ea0c3ab284527f81bc4f318386aaaebc5fede6bbae56f \ + --hash=sha256:171038f23bccddfc23f344cadabdfc9917ff554db6a0d417180d2747fe4c75a7 \ + --hash=sha256:17d1f1630f92ad74494a9a7392ab25982ce2b469fc62da6074c0ce48366a2999 \ + --hash=sha256:1897a771a7f40d05c262fc8f37376ec37873218544b70216872876c627640f63 \ + --hash=sha256:18f2bbcd545e6991412253b98727374c356d67caa920e68dc79eab36bf5fedad \ + --hash=sha256:2b2c02b0a160faed5fb33f1ba8a264a37ee240b22e049ecc827345d0d9043074 \ + --hash=sha256:314b6054fe0b1051c2b0cb2df5cbdab15622fb05e80f202e3b6a5eee0d6fe365 \ + --hash=sha256:346df559a0f7dcb31cf8e44805319e2ab24b8957c45e7708ce503b2ec79ba725 \ + --hash=sha256:370a845f432c2c9619db8eed334d1e610c6015796122b0e57aa46312c22617d9 \ + --hash=sha256:39c2838fb1e8d97bcf1755e60ad1f3dd76a7b2a475928dc321672752678b96db \ + --hash=sha256:3e6cb3387c756de6a9492d601553dffea3fe11b5f22b443aac708c69f3f55e16 \ + --hash=sha256:3fae9197390c325e62e0a1aa977f2f62d994aa87aab182abbea85479b791197c \ + --hash=sha256:42108e93326c50c2810025aade9eac9d6827524cdccc7d4b75a546e5ab308edb \ + --hash=sha256:42b012933a83e1a558c673176676a10ce2fd3759976a0fedee1e672d1e04fc9d \ + --hash=sha256:43259303989ac8adacc9986695b31e35dba6fd1e297ff9c6a04b7da5542139cc \ + --hash=sha256:4c6ab014ab704b4feaa719ae783b86522ed0bf1f82184704ed3c9e4e3228796e \ + --hash=sha256:656f00e4d903199a1d58df06b711cf3ca632b874b4207b7dbec86185b5c8c7d4 \ + --hash=sha256:698dd69291272642ffda44a0ecd6cd3bda5faf9621452d255f57ce91487b9794 \ + --hash=sha256:719439d14b83f74eeb080e9650a6c7aa6d0d9ea0ca7f804347b05fac6fbf18af \ + --hash=sha256:7c4dd4cf5f0a4e36083f73172f6cfc25a5710789269547f132a20975bfe2434c \ + --hash=sha256:7e420b539fb6023a259a1b14d4c9f6df8cf50d7268f48e161169987a57b737ff \ + --hash=sha256:8389e13a1fd745ad2856873e8187fd10268b2d9677877bb667b41aebd771d8b7 \ + --hash=sha256:85b9c49dd58dc44cf70af944784e2c2038b6f799665d0dcbbc812a26e0faa859 \ + --hash=sha256:86385ea895508220b8a7e45efa428aeafaa586bd737c7af9ee04661d8d84a10d \ + --hash=sha256:8975273c2c5921c25700193b408e28d6bdd0111c37468b2d4e25dcec4cd1d84d \ + --hash=sha256:8c1eff849cdd53cbc73c214c30ebdb6f1bb8b64790b4b4fc36acdb5e43570210 \ + --hash=sha256:9300ad32dea9dfc5171f94d5f6948e159ed93e4701280b0f508773b3f582f402 \ + --hash=sha256:96b422019a1c8975c2d5dadcf61d4ba6f01c31f92bbde6e4649607885fe502d6 \ + --hash=sha256:9c9d307c0ef862d1cd5714f72ecfafe0a5d7529c44845afa8de9f46e5ba8bd65 \ + --hash=sha256:a0dbaad796840ccaa67a4c144a0d0c8080073c34c76d5a6941d6818678ef2738 \ + --hash=sha256:a6fbc5367d4046801f9b7db9191b31895f22f1c6df1f9987d667854cac493538 \ + --hash=sha256:bdef06507725b455fccba9c16529121a5e1fbf56aa375f7d9713d9e8ff42454d \ + --hash=sha256:c3f0a0e136f2e95dd0b67146abb6668af4f1a69c81ef8651a2d316e8e01de447 \ + --hash=sha256:c5313566f4643121a78503a473f0fb1e6dcc541d5115c44f05e037609c565c4d \ + --hash=sha256:df02dd29bd247f98674634dfe41f89fd7c16ba3d7de8695ec958f58404a4e618 \ + --hash=sha256:dfc21898ff025f1e8e67e194965a95a8d4754f452f83454538f98f8a3fcb207e \ + --hash=sha256:e06f864bedb2c8e7c1358e6c73af48519e317457c444d6f3d332bb4e8fa6d7d9 \ + --hash=sha256:e2c04d129f180019e216ee5f9c40b78a418634091c8782e1f723a6ca3658b965 \ + --hash=sha256:e4360f15875a532bc7b98196c7592ed4fc92672a57c0a621355961cafb17a6dd \ + --hash=sha256:ec86d4fffd87a0f4cb3d5796ceb5a50123a2a6d99b43e616e5504e66a953eca3 \ + --hash=sha256:fa48993a0b799737ba7fd21e2350fa0a60701e58180fae9f2de834bc39a147ab \ + --hash=sha256:faca8fb4e4319c09d83337adc80b2ca7d5c5a343c2d6f1b6388f32cfecca13c1 \ + --hash=sha256:fb1720028d99040792bb2fb31facb8da44a6f29df7697e0b84f0d79aff2e9bd3 \ + --hash=sha256:ff24039e2573297787c3063df64b60aab0591980ac898329a08b0320e0cf2527 \ + --hash=sha256:ffbab2fedd6581f6aa31cf1639ca2cb86e02779de525667892ebf4cc9fd26434 + # via policyengine-core +hf-xet==1.7.0 \ + --hash=sha256:0a9e802f33bf50c851abe45fc5380e61f959e2d369647d6742b79ad9d6c27cab \ + --hash=sha256:19c0e64f14175ccb6a1aff69e0d2ab9ec5269a560e6687abaf2b3fa4f73de7cd \ + --hash=sha256:2814a6e999d13464c4d679b788cc5d784eb5a4edfc638a31f10e9a11ab531ef8 \ + --hash=sha256:2b7bb5727889b0f2436dbaaad8fc4c3e66b8240d992716989e0c086b4278b1bc \ + --hash=sha256:4ee5e05a627f5ab5bad7a86582277d645556ea1e199903aae19e033a392aa13a \ + --hash=sha256:57bc157b8b7fe3bee9dcb9af7f3da8de41801c3b31a9ef68a77a33c6a6be382f \ + --hash=sha256:59fba37039233c7fcbe196817d6cdcf1b40dfb17b410f229d85b0cf0a1848da4 \ + --hash=sha256:757168feb5679647c0bb13ee5d0faebe799c4dff9051419885a566ebd79f949d \ + --hash=sha256:80f79dae613ce9e0ea1fd1ae15616ca9ac74aed4c770aabc199c4f03ebecc863 \ + --hash=sha256:87dab080f8f7d32781c2586904e3603f4e60d09bfc727706c3ae419e0829beeb \ + --hash=sha256:acc3851cf2576a8fb2ae926da863f4efabe21303cf292e9a44332802ab0dcc6a \ + --hash=sha256:b01fe18dbbd151a2403d2c64ed30dc6547b00d6babab9a617d77c7acdb81ee66 \ + --hash=sha256:b91569d5f1b61c34b043687da02c05dd3604f3d329e7868510bf3f7971599006 \ + --hash=sha256:d406ec79053c0871817f700c2ac8c36ba0d87f9c34b7458b0f0063bb218b0466 \ + --hash=sha256:e3e88a7a75d7d95cbee1f37dc31341d6201124cf21c6c4b1dfab8ccba9b09e0f \ + --hash=sha256:fa029678be1ba7f953c409b0b27bf15cc69cd1c9b3a674fbd78856ebefca1052 \ + --hash=sha256:fcfd6c22418e57dd5b3aea649e813b2e2cfb2aebf317b210d90f1fe4b3018b52 + # via huggingface-hub +hpack==4.2.0 \ + --hash=sha256:0895cfa3b5531fc65fe439c05eb65144f123bf7a394fcaa56aa423548d8e45c0 \ + --hash=sha256:858ac0b02280fa582b5080d68db0899c62a80375e0e5413a74970c5e518b6986 + # via h2 +httpcore==1.0.9 \ + --hash=sha256:2d400746a40668fc9dec9810239072b40b4484b640a8c38fd654a024c7a1bf55 \ + --hash=sha256:6e34463af53fd2ab5d807f399a9b45ea31c3dfa2276f15a2c3f00afff6e176e8 + # via httpx +httpcore2==2.13.1 \ + --hash=sha256:e0aa977abe17e69a3b820a24542a6fa88702676d83880b8d194dcd18408e5103 \ + --hash=sha256:e1e05d4f25f7d7d496bfb96748f6f4b67657b03da069b3a68c36069f3db73d0a + # via httpx2 +httpx==0.28.1 \ + --hash=sha256:75e98c5f16b0f35b567856f597f06ff2270a374470a5c2392242528e3e3e42fc \ + --hash=sha256:d909fcccc110f8c7faf814ca82a9a4d816bc5a6dbfea25d6591d6985b8ba59ad + # via blosc2 +httpx2==2.13.1 \ + --hash=sha256:6dff50fabc270ee5fd25d845d0b078ed20564579744d6d962850975996d2f9a4 \ + --hash=sha256:e48744a19e3af5ee48313d0ce5fe941d5422fae5705ea922a4aabf94d7800dfa + # via huggingface-hub +huggingface-hub==2.2.0 \ + --hash=sha256:1667f145dc56dc210d60966069397df9ecfca9607a5d43db88b308c89dae56b3 \ + --hash=sha256:5d1b47537394e4215cb858aa12fd493d0f7ef7f58990f5dcd24bc173107b2871 + # via policyengine-core +hyperframe==6.1.0 \ + --hash=sha256:b03380493a519fce58ea5af42e4a42317bf9bd425596f7a0835ffce80f1a42e5 \ + --hash=sha256:f630908a00854a7adeabd6382b43923a4c4cd4b821fcb527e6ab9e15382a3b08 + # via h2 +idna==3.20 \ + --hash=sha256:a7db850025b95ded1eae8a46181a1a6c56c92c96f0e2b005d9ff8dc0210cab44 \ + --hash=sha256:ab7ae7122974553370f0bdb919e1a960b2cd1bc1ef0276416d896db81c14582c + # via + # anyio + # httpx + # httpx2 + # requests +iniconfig==2.3.1 \ + --hash=sha256:67f4b9c50da0dedf52af349e7749a80a9057a5031199791b906c3bb3ae878960 \ + --hash=sha256:9121e2c1fdb355232495be3194c8dfe87ccc2d5dee45947b78e68f499790d7a7 + # via pytest +ipython==8.39.0 \ + --hash=sha256:4110ae96012c379b8b6db898a07e186c40a2a1ef5d57a7fa83166047d9da7624 \ + --hash=sha256:bb3c51c4fa8148ab1dea07a79584d1c854e234ea44aa1283bcb37bc75054651f + # via + # policyengine-core + # pyvis +jedi==0.20.0 \ + --hash=sha256:7bdd9c2634f56713299976f4cbd59cb3fa92165cc5e05ea811fb253480728b67 \ + --hash=sha256:c3f4ccbd276696f4b19c54618d4fb18f9fc24b0aef02acf704b23f487daa1011 + # via ipython +jellyfish==1.2.1 \ + --hash=sha256:0028857c5381c9d55e21cc6cb0d7f9545c3a9a7bb7dbca3960fe0a898c691ac2 \ + --hash=sha256:01647c12261bc1f7b102e918e7665497176d87f6fc96271439c8855872bc2606 \ + --hash=sha256:0368596e176bf548b3be2979ff33e274fb6d5e13b2cebe85137b8b698b002a85 \ + --hash=sha256:05be396aebe3dce7a8cb2f97727ecdf99e86457c48e97190775dce33f8b7e39d \ + --hash=sha256:07b022412ebece96759006cb015d46b8218d7f896d8b327c6bbee784ddf38ed9 \ + --hash=sha256:0b21c1596ce283fd7ee954eb0eeb007d59e480364324bcd91ad55146e91f3936 \ + --hash=sha256:1098ce1f84ae3f147f0a18a6803ffb09b9c8cd5fedce42465643ca0b5c9d0224 \ + --hash=sha256:10da696747e2de0336180fd5ba77ef769a7c80f9743123545f7fc0251efbbcec \ + --hash=sha256:1354b558a0a16597b6032dd0af64bebd24994f7e7484cf14993320eb764b06cb \ + --hash=sha256:137cfcc26396d0f2e1265ac61f800bb921921ea722a43dd897e58190f767c474 \ + --hash=sha256:13f1ac9caba22af10bfe42f674822643c0266009f882e0fe652079706dc5d13a \ + --hash=sha256:14bbb30d988dec1d12183cf5d4621c908f98add2009c72a185e8c3e8d00b804f \ + --hash=sha256:15318c13070fe6d9caeb7e10f9cdf89ff47c9d20f05a9a2c0d3b5cb8062a7033 \ + --hash=sha256:1a3ccff843822e7f3ad6f91662488a3630724c8587976bce114f3c7238e8ffa1 \ + --hash=sha256:1ffeeb6c78c45fbb6d2a22b0173fb8a6af849001d6c26fab49c525136dbd9734 \ + --hash=sha256:212aaf177236192a735bbbf5938717aa8518d14a25b08b015e47e783e70be060 \ + --hash=sha256:21baa92d4a5112167721156f6d061c2ae105f2995b3a5e19cec6662928f0c439 \ + --hash=sha256:2348f698f9c1d72023afc8d39939045421a01da9b7e3078e3029227e35f28419 \ + --hash=sha256:29cfa8bfb72aacf2d611a3313b358ed4d4140fa3d3efcffea750c8e7f8acb1aa \ + --hash=sha256:2c28a4ae3e201e1c1b7bacacd40e2e76c4068b90c9ae3a0d525e0ac98206f1cc \ + --hash=sha256:32581c50b34a09889b2d96796170e53da313a1e7fde32be63c82e50e7e791e3c \ + --hash=sha256:32a85b752cb51463face13e2b1797cfa617cd7fb7073f15feaa4020a86a346ce \ + --hash=sha256:393f609fd6139ce782e747e22c399483ffc58341009e6a97e39ffe5f5b2c674c \ + --hash=sha256:4072e21ad4036af41bd57b447b1dda64fe60aa679cfa8854ba0a0338152439f1 \ + --hash=sha256:451ddf4094e108e33d3b86d7817a7e20a2c5e6812d08c34ee22f6a595f38dcca \ + --hash=sha256:4a21d7eda5e6996772055f798e3fe1de1b33b3edad7f6cf0567097a21585a812 \ + --hash=sha256:4b013876109d91fa6fc871ffa4e0dbfda11820c33dc4ad0e2967b3fc1187f804 \ + --hash=sha256:4b28fcefc0c3534277ff0306e6c10672fb050f4784b5f3be7037e80801569fb5 \ + --hash=sha256:4b3e3223aaad74e18aacc74775e01815e68af810258ceea6fa6a81b19f384312 \ + --hash=sha256:4c5acb213aa75a61bcfc176566e20f2503069667e760d83d403b59e115fef0dd \ + --hash=sha256:4e36d9000d4f7e1a35689a74ec7749d27a216dfa6c47cac2e5ad3de8a523bd69 \ + --hash=sha256:509355ebedec69a8bf0cc113a6bf9c01820d12fe2eea44f47dfa809faf2d5463 \ + --hash=sha256:5335f622458aa105289a8e358bc32ecd1b9634b6ffec3e77ea3577e49c297171 \ + --hash=sha256:536c80d8d4ec7f39cbb10b85d926ff96cef3cde4a83ca0991c07cd9835d5dc13 \ + --hash=sha256:56da7632e029912af25e25422fae3b6df318400297d552791f4b21da6d815ed6 \ + --hash=sha256:5bda2275f31a64adf3483e39f7a4e2107f7dfe3a3f85f0d2c0cb6ae5fbe4a443 \ + --hash=sha256:5fa0ba0946f3c274f6a87aaa3c631dc70a363bd46cceea828ce777e8db653b6f \ + --hash=sha256:63770120cc3386dcc13bcc4df508ab281a6b14c3b2c0e33586439a6c40ee122f \ + --hash=sha256:675ab43840488944899ca87f02d4813c1e32107e56afaba7489705a70214e8aa \ + --hash=sha256:68080af234256ef943f0add6fc79816b0c643d8df291c17a85c1b6e45bdfbb96 \ + --hash=sha256:68ea3ddd4dae1152a7f7155ef02a7bfad919611158d71b301f9aa167685819af \ + --hash=sha256:6a49ce2a580edd3b16b69421137deef464e2f8907f9ef906d49950b1a52908c1 \ + --hash=sha256:6c51e565f85ce38cf9388c4f916d53888b0fa34788fcebe3aff3db24948e0960 \ + --hash=sha256:6d2bac5982d7a08759ea487bfa00149e6aa8a3be7cd43c4ed1be1e3505425c69 \ + --hash=sha256:6e76b23431a667cd485fb562428d1ad29bae9fdd0fcdfb5a51cc8087bae0e88c \ + --hash=sha256:72d2fda61b23babe862018729be73c8b0dc12e3e6601f36f6e65d905e249f4db \ + --hash=sha256:748dc45a0394fbe9120b8b3b9a39fab0967c7e2d6ecdd5304af018e774f80f96 \ + --hash=sha256:7853d2ed7d6929c029312ec849410f1ea7ae76ce72ad1140fb73f6e8a1e6aa4f \ + --hash=sha256:80a49eb817eaa6591f43a31e5c93d79904de62537f029907ef88c050d781a638 \ + --hash=sha256:91cad49a4fb731b726afc5ae385a3217a7016ed88a04da40c131cff8136a5db5 \ + --hash=sha256:98a133b40dc00cfda6609e1b0cb0ab0b77796fc2719aae886a12009514f73499 \ + --hash=sha256:9913789a98ccf49213fbb1dabc597847a0ec33d3b0e151689498f4b38ba9be0f \ + --hash=sha256:9930e20f0e9f65ad1d57d98290c2be3abd75812d058815605f44a56056fb9a66 \ + --hash=sha256:9a73b5c6425a70ebd440579a677eb4f03b327b2f59090db34e6c937aeea5aabd \ + --hash=sha256:9c747ae5c0fb4bd519f6abbfe4bd704b2f1c63fd4dd3dbb8d8864478974e1571 \ + --hash=sha256:9d4448c874959ae012cda0f6d570ac0bd7f0fcf12007714eaebf86b86919b66f \ + --hash=sha256:a058f4c6a591d5e5a47569f5648a26303ba19c76a960fef7e0beba2aa959e52e \ + --hash=sha256:a0ef6f0ecc085c1f8fddb048f538c8bb89989e5d470eab45d4e9bd48ee73a40d \ + --hash=sha256:a3cab91020e3ff7565e55a611ec3e3257c093ac950d55778a48bfc8c57562b6e \ + --hash=sha256:ab1bfea271ce4bda09d975080d5465cf5a8b127e7c0ea61ea3f972417a7a2193 \ + --hash=sha256:b35d4b5b688f759ffd075190a9850b04671bad14c5b37124eb43e99306ec16ea \ + --hash=sha256:b37b76ea338c4a473c34a9b9e1e033a78aafb9040a8c0eea579fc5805d8e4b46 \ + --hash=sha256:b8986d9768daddd5e87abf513ae168ea0afe690a444d4c82d5b1b14b0d045820 \ + --hash=sha256:baa30c7b59bd1c5e105693108a6d7a98f3e7a1a59e23e15bc5897b91fd5849f5 \ + --hash=sha256:bcdcd603a7737cd3f5a2ab10ce9b49844329deb81c2daafcd8131e54fc730205 \ + --hash=sha256:bd186c041d9be86c4fa5e2490943ce5d7f05b472f45d7f49426f259f3dd20bc4 \ + --hash=sha256:bebccd0652ac1c7e438ae1f451edefde63d14b3af6f6daa30c599919dcb92886 \ + --hash=sha256:c3c18f13175a9c90f3abd8805720b0eb3e10eca1d5d4e0cf57722b2a62d62016 \ + --hash=sha256:c499ea3a134130797c50e367687a6a46a12653c59af381bee92c41a5ab0bd55d \ + --hash=sha256:c85aa2bc76a36d92a3197f406f86636664d5b323727dfec4fa2842a8a24a06ae \ + --hash=sha256:c888f624d03e55e501bc438906505c79fb307d8da37a6dda18dd1ac2e6d5ea9c \ + --hash=sha256:cf6cd68921f2bacc547ba1cf64ad0e76bc1727f3bab13bba2e5f5869aba038b1 \ + --hash=sha256:d2b56a1fd2c5126c4a3362ec4470291cdd3c7daa22f583da67e75e30dc425ce6 \ + --hash=sha256:d7be8021658b46b22500a77f1707901bd98fc210f185c229b81c74efd3c1baf2 \ + --hash=sha256:db97d873f23b0c15b4ed911ece10e5cc0bb96cdc53666d5c3788bd0af81807f1 \ + --hash=sha256:dd895cf63fac0a9f11b524fff810d9a6081dcf3c518b34172ac8684eb504dd43 \ + --hash=sha256:ddf05ea471da2808d77ecfa425d8884124b4754f4d483afa7703b6655530cf5c \ + --hash=sha256:e1b990fb15985571616f7f40a12d6fa062897b19fb5359b6dec3cd811d802c24 \ + --hash=sha256:e4a210a960f3917da757b0581750b6e0a8db9acef68dafbc1b6e2ae39e847ba8 \ + --hash=sha256:e5977810972c6f0b2e61252c4758fd5aee21abf663ff309881195a99d37daa94 \ + --hash=sha256:e967e67058b78189d2b20a9586c7720a05ec4a580d6a98c796cd5cd2b7b11303 \ + --hash=sha256:ecf62d4aad0baa8832ab60f96e7baedbe6558bd292597503d927e9c5bce745d8 \ + --hash=sha256:f121218dc33fb318c34ddd889dc7362606ce1316af2bb63b73cc1df81523ca34 \ + --hash=sha256:f69aeb08659a6c81d559bbe319075e3417434ae5b3a5e4a758d1c4055a03497a \ + --hash=sha256:fb3c6e537cb4605c22895a8d4a10cdb26611ba2bbfc7f0b4c1d06bb9d8aad648 + # via us +jinja2==3.1.6 \ + --hash=sha256:0137fb05990d35f1275a587e9aee6d56da821fc83491a0fb838183be43f66d6d \ + --hash=sha256:85ece4451f492d0c13c5dd7c13a64681a86afae63a5f347908daf103ce6d2f67 + # via pyvis +jsonpickle==4.1.3 \ + --hash=sha256:99822e77b593462c1f67361b0571e54323db43f1285706a63da5b5759714c9df \ + --hash=sha256:de234c1d1ed2c5313833e608e2a2467202f48ae24ea7a2afa2d238d8999aa4b5 + # via pyvis +kiwisolver==1.5.1 \ + --hash=sha256:007a5553dfc4f4e8d184f588a0200e2cd4b63a59cc8796df3c39909e679dc7a0 \ + --hash=sha256:0324cd2567259b7a095f6cf18a52b0ffc6f3de9e69528ff1bc0e7a37bd43ff1a \ + --hash=sha256:0627b9bceb9c3cdcf12b8a18655eedfed2692b038df27423383c120d0b7dc2d6 \ + --hash=sha256:06a6917674de9e0fe3f66f5430787f59a9f2ddb64af9b714eaec547e29ef5c19 \ + --hash=sha256:072bdb15a3c19a5b5dbc8f8fb1f4e1884bf4f3507eeb4cc6334401274d37a5c0 \ + --hash=sha256:0a4faea5c6db201c6a21391d2ac926ea97acf7dacdbc3c417189e1adb1a00837 \ + --hash=sha256:0ba9527afc80ae3d7814ed98b6572d02bf85eaf48065678342c5f0c6dab7a8c7 \ + --hash=sha256:0d8924877ce22e17326a99a418c3c82037da078df3c6a260b13eca677444e6e7 \ + --hash=sha256:0ebdef3eae5336568147c39a55be6a2036ffde53faa9ca2d978989ae7c2da12c \ + --hash=sha256:1209042a623ddfda5497e4066c7b77651dde8e1d3a9dd97599dc7e97f3b9b78c \ + --hash=sha256:16895f553ee6620a827d2da56b871f835fb70b9216cca5d188e885caf6e3bd23 \ + --hash=sha256:17851e5dad4484be0cbccbde3b15331deae036de9aebd45eed964487802b172f \ + --hash=sha256:1798e83840c3f627246104c4d8a9639c60fa068adf9ce92b61791781fa8a68c1 \ + --hash=sha256:18170a77ddfecf40ec60d0928268dc95880c881864e015a8f34094ed18b9b9ad \ + --hash=sha256:186884a58486651e3c217b6acea0a53eaa9498fdd472057c46f2f0fb5c25aad5 \ + --hash=sha256:18a0cfb124546a4c2e6087c5f3029c7f44b37c85b142e0ced71f73a7599ac208 \ + --hash=sha256:1983f0974a750a6f6556f368ba11105d1d8369c735b944747c9f12ae5aea7aae \ + --hash=sha256:1a7587dc335f2c0f5bd577fd0540bd16c66006bdb60f759a1059f025e6c4f071 \ + --hash=sha256:1acc7e5b7ef05e9da8bb70cd6c7c4513090213d2e1ad9720f599f0bf6c52aec5 \ + --hash=sha256:1d852545c4d0e35a72728d072cbaa59e2fa7dd84bdf01e068d670dd0ceb58eb6 \ + --hash=sha256:1ed0f5e49d0ceff8b72190824d9e59c062fbbc02c231b853112c78474b3f5ec2 \ + --hash=sha256:1fff05e239575b1481b6ed1a782f6fad616efbf1f0b1f44e6e85c4dfe426e483 \ + --hash=sha256:21e46b23a2da695c364124817bc01d970effd5483147f8d66a6a7167e3f6b851 \ + --hash=sha256:22d5e5aaad6be121f2515765e3b1c444352cb8eb4c86510801db8f2e50757316 \ + --hash=sha256:2551cf9917af48ee7c4b29cc82320489508cf96fd26a51f6fc124de661cd44c7 \ + --hash=sha256:255605693a483db7bd5c79f60437f7bf658f7f520d61aa42722e32257c941951 \ + --hash=sha256:26e8268480be5061d509e29669d59103c067a26377a56491630ece11762e3858 \ + --hash=sha256:27add358abe374ebaa3b8763ef380bc99051b5a4b18d94878366a9e4f59efef0 \ + --hash=sha256:2ae70bc59790d2af72a3f76f24b272403e135070340281108b447cb77ea70819 \ + --hash=sha256:2e10ae1bba1899188b33557c10d73affcc12033edd18adddb57d209039976a4c \ + --hash=sha256:3221f78211074f561c44ca42eac0619828171bec15a2c4cf6f7747d07df76e8e \ + --hash=sha256:34633ecf50d16187ab8e5528b7a2530f2feb4e23f300db4672538b51cfc5cd38 \ + --hash=sha256:34ec467940442c9943016fb2d4c81d1ba84351eeca2f1a78f8bc87f1ba0d414c \ + --hash=sha256:37f801b5d7cc0e5a548921308e059fd2b057bb42972b591cfa3049f95423c4ed \ + --hash=sha256:38f6e0deb4d0a4615efe0c4efc5990b06ae450ab50a0b321c0b078b6d238c083 \ + --hash=sha256:3c24cd69455e1b00ddf770c13b6e2c33e07d6dc3f2d34add0bf9277c5c6bbd46 \ + --hash=sha256:3cc210010fd2f438a3ed430b45f1b501fd13a8618bf984dc2c5ce5b69b78752e \ + --hash=sha256:3fa5855898f6d3d01b72ccd48a2d65cbdee301251603fefe34e2025bddba219c \ + --hash=sha256:416ba7ff9f233b7036689bb5a3783537e838ad483f63558d2a800f75afe738b1 \ + --hash=sha256:431dc224a1a92a5c8f582d96e505196a3b5997a7271076678da2dfde67b77e9a \ + --hash=sha256:43844c1a7ad6d723d5b5b4c4fc7f5bd399c40e288120d16257c7c9e8765c6e85 \ + --hash=sha256:44b8faef94f1857e77fa0238f3390ff1ac51d2ea20a487e2e452a59fd2b5f5ca \ + --hash=sha256:470d420f98d368d6f010633a20659b544c5fdfa5329e6b70219f2ef08fd4a7ef \ + --hash=sha256:482676e5bd48d70ac99d9fc78863469845421e01184fa83f1f9366dc49f7e974 \ + --hash=sha256:4d4ca09bf13cff792b1884f64b98ee6c2467930d632233be25c56b442d99f10e \ + --hash=sha256:5025e36fb4fb275cef0a4e30dbb11cb4ae61d1c83deb90189cb5d7e4cafd6b55 \ + --hash=sha256:509735237ae0d849e8a843551d423d2500d2e0a9ac1611a145658b29c0fb9f85 \ + --hash=sha256:534f02c1abb31ed6dbd3515545285c330b2f12d00fdb1fdb71658b9ca5a13a6a \ + --hash=sha256:5978c3340f16a35c30f8ab2fa7bcf559973c55f1a5ef6970e1f621acf3c4db13 \ + --hash=sha256:5b973887ff782cfd6b67c9904ad8ca542e0bc5e4961503408b423b5a688b4d38 \ + --hash=sha256:5c490db2168a508088f59140dd392556a54b8bd1048fc6383c8baff13c359673 \ + --hash=sha256:5d142e352eb13facc7dd047489aebdff6ba78576c239f1ea04931979caaf0567 \ + --hash=sha256:5daa1f19e097050b9c4d9a78fcc9263cb96c9dfae08037ddc1b7c4ad1889f2a2 \ + --hash=sha256:61e9a64c7635095a6bfe483e2ff055d437c59bd45f3617a228b37277f0185d62 \ + --hash=sha256:63fb7294b768f444eb4b068965f2662f28c2fd4161e23bd60fcf3ff27b74c046 \ + --hash=sha256:685929988b208a911f1285e2f8ed54210b0d681a3dc0f03e00d599d291986e7e \ + --hash=sha256:6a797a1cefc8b9c93170db580337e1fe3d011ad18b1299943231279406342048 \ + --hash=sha256:6b92f60017dda7d877fdc546438b5e28f31c523264f49cf5a48c1d0ce1a0dfbc \ + --hash=sha256:70ed9a45c7484d2b30cdacf60d220f494a1763b9fec1ad03285c6553fa0889f2 \ + --hash=sha256:719a35fa1156db3640555f95ebb94f60a444e64d1c69626b0edef5df78eba225 \ + --hash=sha256:74ad5c3dad54a4641b4c28cd15ded70899d04459c6c7aeacafea716be97cce6d \ + --hash=sha256:74ea337e0ec3f6f342a36a4f1b5cd94dd9affddcd28ba9aae2905af932ee8c6b \ + --hash=sha256:75d9b1cf8258462dbdc1eeda718c96ea7f079324c09067f6daabfcf37712b7fe \ + --hash=sha256:77a4c8187a5948d7f8795adb765a3c7b553d07d86d88e43038fc32fc1fb9a3f3 \ + --hash=sha256:7824b5e8bdbf0bccb4ccd37bbb115849a1dc45437fb4de8351385ed07c437ee0 \ + --hash=sha256:7d38b0c279c3032e8c9cc013b405c6df8e1668dbf15465779aa7f15f61201812 \ + --hash=sha256:7e9c01d3dd7ceba4d1d436cc021d40d592466e40b9bc7f5d83dc4e98a5c9cd8c \ + --hash=sha256:7fd82debf43c6acd0a94359d232f6bb516ee13f269a7993736a9ac9f988bb5d9 \ + --hash=sha256:824c3d763a05ea9e9003610145186b0e9848c7584a5575c79bac5a8e7cd80bad \ + --hash=sha256:828f75af2b0080c8a972e75f649ab46af008e92c6104a57a759157200b835b75 \ + --hash=sha256:83f78128fa28705fa85d01c59771c72fe81c11bd0e6155edbb9f818983a7d761 \ + --hash=sha256:876bbfd276473d3daffe30e8c975df4ed9429967b41a6cb362dbb5155b6f13ad \ + --hash=sha256:886fc26012f0e8b5f69d1cfe6d711f6b11f194621539bf8e6bb1c25c5dc82724 \ + --hash=sha256:8a34616dc2521cc8dc1d7d081734da63539f021ac0450ce950908340c6e7aa2f \ + --hash=sha256:8a708a47ade1fe19e8371d5da076bac0dd4b0a5a7985ad6c637f7f7e361b6baa \ + --hash=sha256:8af9b142ad719ae3a911ebf616bc4b78b32bbab84d6a40d3ad2f129670509957 \ + --hash=sha256:8bf4df63592c2a66b4f8edc5df2544998c288aa02f96ce0acd880cd1de8c8127 \ + --hash=sha256:8de6f2a4ce7e7bd27d23dd94abf0ccafe0e0e5cc9c764b0577191f2c25f08f26 \ + --hash=sha256:8f8fddb8e323bd6eee4e54e69a39243beab22689070f4c66b472c4cc88bb89d8 \ + --hash=sha256:8fca690b00c4c48f6c2a547b0160ed511357093a4e4c9b47e0fadf3128066d89 \ + --hash=sha256:9506e892bcc3b409831d363c6f53e5985e1c8d1f6f6b0256d00358684ff85378 \ + --hash=sha256:958254518717542d02d0688d0d20cbf771da5e415e6f49543f92481c850a4540 \ + --hash=sha256:95a02752aa032eef4aed01cda6d9b687c669bd0396bf4519eef8bba22a286720 \ + --hash=sha256:96c30002424670b5e1e46495c2b8cbffef39cf77c1d79e76462029d50339785b \ + --hash=sha256:98b208a7cc42c803445ef551d6753cc42a5ea13e9cab1ee66cd8b9cb70195330 \ + --hash=sha256:9b3092d8992a1d69b7a59c3e39f35e1b9be327a17f68a7c35fc17329e337d6f2 \ + --hash=sha256:9e51c119992ea8820706871c30a4642ec76de20ae82f9b50b9a45517d8e9f810 \ + --hash=sha256:a5716a33bfabb2c6ce27b6cf03253467b3804f83e215f4d202685cf93c6c9874 \ + --hash=sha256:a5a00665d1a0e26763a7338d7e911d4598fbc1d50dd0d6b7919b7dc6c5d6569f \ + --hash=sha256:a5ca5aebae78a0bc13c1943af4af615d4966c5b650b05d5aa83b50e427196fee \ + --hash=sha256:a7b85b2cc6ea45e5f7e8c9a30bc9fabd47cda09106cbb4b967335c3e6c43b69d \ + --hash=sha256:a83ee7107df13abe42a54a6654670eef9bb39425cf2e27f65e0007465e1286ab \ + --hash=sha256:aa7d00b1700966d2917e54d278aba86897890ca9276dd8b76cf6446b6c181b92 \ + --hash=sha256:ab620eb663952455271ac37f9aaad86b73c969c02f11f53cea405b38e96a4300 \ + --hash=sha256:ad8b9671348d7c8716715652ae11f85ed0eb99e265a2df2ca490577d69860b2c \ + --hash=sha256:aefe930d113798330e9462f7874542977869c0613cba3262e2de3a8d5dee8f3a \ + --hash=sha256:b03af77d77e50edba2030fd5f7c352ff209314b09030a3cba7c14edf9a09a444 \ + --hash=sha256:b390aec180a7c054919c04898835e1c77bced23ea8383eb2c570213bf25d1a86 \ + --hash=sha256:b3d78f7bb2b9d9a30345be1474b9aaa8685430b54afb51ba3639b5c6c11e9ed6 \ + --hash=sha256:b5664603a253efd3a75716d793d1d3a6a82723b61dc6db767b2460bbbeec4c0f \ + --hash=sha256:b69602970994a2ed8bbfa78c2f0394a7435226c6040489702d9f0a0ad0c07052 \ + --hash=sha256:b6ae6a0328f0bc035741820fdeecdcd67bf4694eee03972e843663107122f450 \ + --hash=sha256:bad20d4c69c851c982a1e3606f4c293edfd5a87885786c50082412240c4b1ffd \ + --hash=sha256:bb7c99f0673c03017a3ee01e54a5c2617a05468b11eabe513b0080e063ed95b1 \ + --hash=sha256:bebb89489b279b2f5661bbbb2abcc87bcd4a46607bb4a5c966f04f1db6b8df9a \ + --hash=sha256:bfd1de989b3330420e29de39352f5c049905c9e3ee67233a50d550e3d652c148 \ + --hash=sha256:c2306e8bb53601979fcb3fa09cc65e031876d9ae01eff2fcbcd7a84ef94d5bc1 \ + --hash=sha256:c3a4e41e3096bf1f0f1b76e2ffd6d828d6547f574f702d59bdbef7acfa59db9c \ + --hash=sha256:c6834b92dd2428e2dd85ef3d85f723d3c12f20aaf43a2ddd4f944ca25d833408 \ + --hash=sha256:c90d3022d8a94778939cda8638c6c8da8fa757b8958dad7ec868ce29c87681b8 \ + --hash=sha256:ca307d6c259e5c98d3cb9ade55342b47a6839762caf2536f3d7b46ee660cc82e \ + --hash=sha256:ca7f6fe0f37ca978a1e5eb7a3a68e6413f417e78e838324947ffd420202b198b \ + --hash=sha256:cb6fae641357ed2f6e533c0d3c6504a4a5703621a50c89459e46051d56b61140 \ + --hash=sha256:cdaeeb6c350106df6bf9d873395973e5f066a9713200b72cd64f55d0a3eafab6 \ + --hash=sha256:cea20da04494e662b83c872683bf4ff2345206043d036315ed0e924b652e7294 \ + --hash=sha256:cea90547bfd93807e0013a004dc76552be44fad3bc1cc2b38610a9e889ed098f \ + --hash=sha256:d09037ca068d784ebc4aec290ef952ca27ac15dd9c0b5801a88c6e1096b83e6b \ + --hash=sha256:d27c2123977cb9269c30a49ba45f03a4323017ef693e19db4ec9dbe1299a3002 \ + --hash=sha256:d50de98e8d807dc31822fff96f50293163a62418eb65487a21b42713d72ed0b7 \ + --hash=sha256:d66a64dd5dec136040ec2ae94aa026a912ee60fdd45bc28d3db30037fd809e88 \ + --hash=sha256:d79308fa689fac89cbcfbd4dbfc80b5f95c54c5a7fd4d194be221f9d33d026e6 \ + --hash=sha256:da3275833be0edbaf4830fae08bae3dc7219f40ce0c37eaa6c25825957e06612 \ + --hash=sha256:dc1a26b8e53395a01c2c611e58602fa47461f136fba7cd5542e6db6d64be1839 \ + --hash=sha256:dc23390afe9f4ef9ac3bcc72a03a56eebbde03f4c571a32cb38f859cff9a6524 \ + --hash=sha256:e05c2f7925f1d88778e53cb44f14e0223204a3bdd09a41664750363acfb1f2ef \ + --hash=sha256:e12dfea7f5fc2a34a9080efbf79c4c44eb380ec5b9c6fea09407e08f0d1e941d \ + --hash=sha256:e4e4523d6f336708d732516e6cfca7796cf3d96c9474eb5aecf6165f2f1fefc3 \ + --hash=sha256:e4e49f7e1a4e7191bdf9dc67a974db714501b1fc52c24324103d06a86abd5c08 \ + --hash=sha256:e68e151428b5384f766cd25739bf77c7e4a3dc93b5ded7a12118d9fbfdf78ab6 \ + --hash=sha256:e8e4d953faaded9ec7ede36824e9814082d22d4c7b1eafbfa079ecba8cd0d076 \ + --hash=sha256:ee9df1f0d77b9c6e94f4ac0fec533fbddd5ea3a327807f18d7b069ae019ded80 \ + --hash=sha256:f0a887b6565bbfe80efde2b7f6e8890d7d9bbdb11bdb17028a3690c32fe0621f \ + --hash=sha256:f0f4a42db92d6ec7677ab9d12830a2a8ec145a9c6d15db2b593466bc875c78d7 \ + --hash=sha256:f1303ef2eec81262a4b708c3e858afe58d7c75ad91c1c05266eda7673369859a \ + --hash=sha256:f1d56ec54d257d05e0b50f5780d967540cd07beeaf9e5f645b26d50cce79f4d8 \ + --hash=sha256:f4167e87b397f273dc2356fcf1eaf50a6bac51e6105f45103ef7129c8efb0255 \ + --hash=sha256:f76fc85bd054c806960f917ec0f329e24e436f1712267d90588e4c39890caa63 \ + --hash=sha256:f942903fde7363d1d879057ec5de01310efda2597161784d752fa9953a01a71a \ + --hash=sha256:f9b1c4900736e489a812c529100de4b8fb617d4db075e931e213c57424b83d9b \ + --hash=sha256:fc271a6f0a2126958f4090e5507b9da5848927dae331f8f763bd4aa642b3d2cd \ + --hash=sha256:febcce10f2bcdbb80b4ea919238a6a4ac13dbc4c7cadbe8d5d75c3682f8b5404 + # via matplotlib +markdown-it-py==4.2.0 \ + --hash=sha256:04a21681d6fbb623de53f6f364d352309d4094dd4194040a10fd51833e418d49 \ + --hash=sha256:9f7ebbcd14fe59494226453aed97c1070d83f8d24b6fc3a3bcf9a38092641c4a + # via rich +markupsafe==3.0.4 \ + --hash=sha256:007e1ffd9bf65bb6ee96df7b258fc632a4868dd5566037986c64781f35a36e98 \ + --hash=sha256:02fa4acbc6a3fc5c693c34d4dd8c1130b7fe99cc915181b0ddd6f72aeb296002 \ + --hash=sha256:03470d1a8268e692ecf79ecd565593e59d44219377a7ead61f1f1b94c1f7ff6b \ + --hash=sha256:04e7902ba80ee4bac1d50a549606527a1dcf0476cd81403db41099d3b60ec653 \ + --hash=sha256:051417f74bcaaefa316276e0ff723f541616ca51043d070da00249d9bddd3e3c \ + --hash=sha256:05295589e619b9bed252a86b532b8e27350abc372d18ba89b59375325e91ec1e \ + --hash=sha256:06de8ef6331f6e822c28d577dc8bf43fe398800477c49498f38fc38b67ff33fc \ + --hash=sha256:0764a13d34cae40db7bbf3a09b7e9b491bf4603e20b263a7a9d6b8e324975d0a \ + --hash=sha256:077293e425f28ec737dbcad442a71752e28f8ae27cde3d68acd1fb212091cd92 \ + --hash=sha256:0930db9bdc62d22944e10b066448bb65dc9abe9112880c7cab8da54db4284d5f \ + --hash=sha256:0cee7cb0f9a1b6892ea482237d9403b3d1b4603aee057d0ff01f0fac2d019a97 \ + --hash=sha256:0d9c47709875fdb321452056622e930c52afbc07a7d780762fbb8b4d91ce6fa4 \ + --hash=sha256:11935df9bf455ed0c04eb87bcd720f02b1fe5e02128a9430f23aed6f93336fc7 \ + --hash=sha256:12a606a492de952afcb43b59a14aaaaad120e708d3663dd0fdf2d738d427a691 \ + --hash=sha256:14bd2d845d62ab678eaf81da89d7b621b51756c72346745c1a594c09d49207a2 \ + --hash=sha256:15ba9e28640feef770374b116a6f019c21f52404aeabe516aa7f800587b98cfc \ + --hash=sha256:18a801868a884f216e784d7d14db2a4077143ce7610440aee2ce8f734e7cfcde \ + --hash=sha256:1c0df495a977d10460a94941799c72d5b5ab03d3858d949b55b5a66c8f371c99 \ + --hash=sha256:1caa2fa5a6184fb233153b35f654e6687bd555476f6170f29d8ee9be1a8b0af9 \ + --hash=sha256:1e1451fab512d1bcc3dc26988ec1edb0b82c2db909132872cd9356070a6b63df \ + --hash=sha256:1f1f9477e174582b0a1b583d60b66e1f2cf5d3fe12cee985e4aedf44766600e5 \ + --hash=sha256:2628d3a8cb648ecebb3c5d6b0a1052d400e4d8b7ac0fb786be8d285b50040d17 \ + --hash=sha256:26e9867520db70d37f7fb421a7f0d8adb40171011fb84ce869afa1a83370dfa8 \ + --hash=sha256:2a6ef68ae94aed8721934072b27a3b654ea2100b97e4ab864cf1489c90926fbc \ + --hash=sha256:2b2b1e18af909b448bb3cf9e3433366f7a8726271fc214e8b10e0f62a78c724b \ + --hash=sha256:2cb3dd71fc6be918ad4264346a8ed69485f9b7ed7bf35495d8e22807cd6b8bea \ + --hash=sha256:2d1b7d9308288661f56672b1b157d75fc536714d3638487bbea17b6318a78248 \ + --hash=sha256:2dad610540cb2e6272855c178f08ae9a1c7ac258a7fb71660553a5f104b42741 \ + --hash=sha256:2e5a7cd7fdd14fcb1ae5d7d8bf23d24fbd1daefd1fbca2580132e1ea75f098b5 \ + --hash=sha256:2e9ad7dd851bf45fab9f75cbff4cb493fee9979e8d8c7c9c3ee119022518edd6 \ + --hash=sha256:340cbb1957ba99929cbf19a75626d36ba1ae21d1730b287d1cf7f824a20c4fc7 \ + --hash=sha256:34bdde374c5932765d7dc685c4a1d191a3207852d67e8e0a9eb6ea85156181f1 \ + --hash=sha256:353bd63081912ab8cfa6a0c7d185934cdf8426f04c618bba6bc4b394f2069b67 \ + --hash=sha256:387d8cd30e69b3f0a72877b9ae717033396404e19095b17fe89753a981fda44f \ + --hash=sha256:3882fb412298575bae3b9c46868251f15cc69307359f87bb1b382e53d6e5a2c9 \ + --hash=sha256:38fc55594dab834470b6733dead2ee9e3f657fb0608c769dcafa0ba5ab52f45c \ + --hash=sha256:396ec4e65cc889f69786b3b89478b471cee5a3bcf468b9d9bb03e1a30fb291fc \ + --hash=sha256:39dbacefc411633db5b4378b066a9aca70a3d7e2922c9e578d825f844026eeba \ + --hash=sha256:3a93d9616ddecfb393727a0041a562cf0b15a244e20f2bd25efc7949be4c4f17 \ + --hash=sha256:3d23795802fc8bd72534836d64489bbf0f67c088959091bdb22e10735a5107bf \ + --hash=sha256:434139499bb20b502ed3baa1f169e618f924a97e7a777fea1a49446d80106cf6 \ + --hash=sha256:436e3ffc6310d3c41878c601db29098102fe5d8a467c49da4a4125254e0980f2 \ + --hash=sha256:489505b03f692c3f376394e49194fa7a7f9e8558d6e293a7056a0032b0c38163 \ + --hash=sha256:4a540e2d3192792fc84eced57bef37851ccb2b41f73291bb17408eea77bcd278 \ + --hash=sha256:4a7cdc2a420ca01058182da4253329764d4bfa055564d1eced90e6ba1e8b1d3d \ + --hash=sha256:4bced6e2a6dba6a28f7dd3c6ce14df1b2dd495923f16ea484cad03decd463b2b \ + --hash=sha256:4cf3468d5ec187ffffcaca8e61929a37448f215dafc1386a12c750a72fe53634 \ + --hash=sha256:4e2c4809c14559aa7ef426f27fb35afbb38104c349a903bf8f3600456764bb38 \ + --hash=sha256:4ed644d75aa94a2baf7ec3a96eaa160ea58c742eb9d27c6506053c5c40fc84ed \ + --hash=sha256:4f6e0852a0283b1b1fd776eeb7b766a5f440b3e2bd31ab51af3b400585f3965c \ + --hash=sha256:5066b244f576f91afc8ee3ba029a89f99d39c79b1853fe9d39bea9f0afbec148 \ + --hash=sha256:5086f9975abb1ab531ee6afca1761e4b59a19b446f3f6522ed776963228cfe5a \ + --hash=sha256:50b5bedc9ed8a94fc8857a42ef4f84a81ea88f8d4f05dc8705fb23ee6d8dcca7 \ + --hash=sha256:52704c5d36eb6dda8866493decd61111fff86244c9b1ad225ca01b9e91e5970f \ + --hash=sha256:55ffd6ce583d97dc71dc92e930324c8c0d25aea7e3ade6ae54ef77cedb096811 \ + --hash=sha256:569d65055d367e3dcdf30c3f41119467b73d9ee9faf332bdf40402644f5ac08e \ + --hash=sha256:57f9947a7e57a081c1e3e0a2dd0d2dcf290a4531450e6f611e30084c222a7295 \ + --hash=sha256:5989cb26b2e1efc6a42216a9f6b5ee495ce5ace2e5b352a9af489976b32d1ee2 \ + --hash=sha256:5c22873ad1f0532ba40fa1727f3c0fc1bbbaab6d373d4cbe3f0dc74b2e2521c7 \ + --hash=sha256:5e8b3d0b18fd623afa12ecb2ce8d8becef69f9b5440c6330c7972200e0bb84b0 \ + --hash=sha256:61631e08084be9e21a8967ec3139c7616ed7c5e9368e05c86d1b39562c8a57b6 \ + --hash=sha256:64511c54db4e4987aef4c41923235927428729e8174c5dba488429be70a998ed \ + --hash=sha256:6669c1bf34080161ce49c589cc512ef24d4c704ac9d2b2d3667f519c60418378 \ + --hash=sha256:672d207103e6b16ca098611b0f9efad6bc00afd47c03d6ef62186495ca677dc0 \ + --hash=sha256:6768d67d1bce64270e0fdc2e69309d68b9b18ae56ddf6c711d168e9d051c2cac \ + --hash=sha256:6a45c3d514f2436064db00d7fc8778d888f0236ebfed649b53d13a59e69ad51b \ + --hash=sha256:6bd9e1788e15bfcf6a9082de42e30387e7b85d211ab21e57a939bb8cfaaf8d96 \ + --hash=sha256:6d2a9efe686f9de00d0d1ea32a4a5a86d558a2277501bd78d964214eab625e59 \ + --hash=sha256:6da83a088f8ef93b2d483a8232a4dbf4d69d3d8496b568a03c56becac43e1808 \ + --hash=sha256:7018d4af1cd272e847aa5917983ab5e83e4f6579f9dbfecd4a79c0ca80b144c2 \ + --hash=sha256:71f88e749ea29f67f21f3b36433c1dc54c7729ed2a6d9e2da2e0d9e0d7b224eb \ + --hash=sha256:737c9c3981998eba27f11786f84fddcbabc74068b72a4a1f454ea02094b57b65 \ + --hash=sha256:73e77980c7207854f00fc4e71fb1626868d5740ab4012623d55c7a99ad122a72 \ + --hash=sha256:799c39bdf5e2f1292fedd3009f7b3c9e760f10b2420cb9638d56920840ff6db8 \ + --hash=sha256:7a83aa6e4805df46fed18e989d3d16f86ef60cb50bbc8d9ce3a6be89165fbf6e \ + --hash=sha256:7d3391b2188d18737cb2fa147028b1096236eaa7e156446c650a489fa2cadc91 \ + --hash=sha256:7e1636da3d8dfc220b6dd10264db5f2b165e4888c4518594898fbe381049af8a \ + --hash=sha256:805c8b84534fa10891890f0e4be39f3a99e94615d93e8836bf9fa1fdca2feeb2 \ + --hash=sha256:811d02d5122171c1941357efd8f9bf4ffe907b7f0a1a4e729a880e4be3f46e3e \ + --hash=sha256:8138eb83940ec7299024d92d4dee45f601b9e6c5ffde9d25f4e35e326203c707 \ + --hash=sha256:83b3944fea42a8400edf92fd1770fb8d0d4f7de651353bd2d8525a92dba69a21 \ + --hash=sha256:849dd2bb0e5e4ab2b71c7191726a4a8d5aa8a610daa584728cbee0b710ddc4ef \ + --hash=sha256:8698d70a8081ee8c090dbb394768b5789a1da8b131b5499f89d071dd3cfaf6be \ + --hash=sha256:8781a792a070cf2bd1b86d3aa943894115faaba6e88122a7bf32d62072742453 \ + --hash=sha256:88d59b473bfb03259722600839af9bbd7fa13a2eb514beefeedb95997882f69a \ + --hash=sha256:8909c2f1c6dd65e054ac4b573a91c8384d1492281e55d82d159d653f7a13adf6 \ + --hash=sha256:8965520ac587c94a4ac48b729be3d8b8de00af39699b17585dfb599babe77977 \ + --hash=sha256:8b5d563170ff8ba3181caa967c99a3c804d1dedb702c7cb93a6a7c32247da978 \ + --hash=sha256:8e124f974786f831d6043728e38296969d3579db8896fe004682f5758e613581 \ + --hash=sha256:8f0fac8b13d14bb06c68195f849371924ae53dd7b1c00fed24650f704383b692 \ + --hash=sha256:9240187afb63d2f9ddc3e032c670356fe941f6e20662ea168a5dc3f1f317e1b3 \ + --hash=sha256:925f929d6b59a8b3f8b8c6ac363cd0af7eecc81efb3071770b3c6717c450a369 \ + --hash=sha256:9348cbb300d224fe3b89793262cb093504d4ae927004468463f745188a193e4a \ + --hash=sha256:9388003072b95f2f1e3fd908604194d653ba21330d811961a78b7da1a77e9e36 \ + --hash=sha256:9438a2648b2195980cb2dd8e53ed7b8df91319e2d0b70ae61a9e1d1bc8d3bec9 \ + --hash=sha256:94e4c421742086aeee4c32a506eec8859d7634aad943f7e6aacf70f813478768 \ + --hash=sha256:94f5407f7bc64fa6463906b896f9904beeeb7dd8dc116ee8e9056c8714ff9916 \ + --hash=sha256:971a3bbb75d97ae4e2e8f7d4834236f86f85f0c85e04ab2e191db1123b04f80b \ + --hash=sha256:9e227f3dbe6bde7491cf0a9965d00b88c6b1a4a95d11480ddf88bb96d397c19f \ + --hash=sha256:9e25feb9e330b63edb0278a0acdf85e50d0cb0fbf49c3084abbe4e24ae195346 \ + --hash=sha256:9f098115c247e11d138ab83a28fa0323c77015007ea2df73ba5fd714dfefd67c \ + --hash=sha256:a18f38cafc329bac5e3c2b96c765b4c96d3d103421ed22ab7988c1e3fce27464 \ + --hash=sha256:a4bbd2d87dd233b9fc5812160c3d0ffbe42edc22a26ce0469f58479ede633fe9 \ + --hash=sha256:a5fcffb37e602b0b3c1638a97746b9b96125caa9bcf6fa41d337a9261de231ee \ + --hash=sha256:a8e9f292fcda89b324f2f5c91d13f1424a153e40fc2756f38ee23b15835ff300 \ + --hash=sha256:a9f54054101545a9a9cccefddf54316aa6e4491611fcbef9e91b3b6bebec04f6 \ + --hash=sha256:aa2c838cc024642cc04c6854232f32b43e5e22833dd11119c1766c7873b8370d \ + --hash=sha256:ac0c7c9f1609b0c4c114feb1d7a3409564c7fb77e360bed9e97e5d25dfeaf868 \ + --hash=sha256:add96447a86d205ab616665d53b2950ee81083757f56e6ea833c8b2917646b46 \ + --hash=sha256:ae9dcb8fbe244cb82f8a6458b455b927a03685e383d9bacf1ea5ce180b96dc97 \ + --hash=sha256:b4a635a0487774f841cb1fb62e907e7195cc95bc761e053184b8acc3ceb20733 \ + --hash=sha256:b4d12837e0203bbace818ff4a7461afdcd78bcd782351cea148139180d7bcffe \ + --hash=sha256:b61687d0828e72bf5cda24a2690188f37170bd31c9359ac97e4e66569f120a16 \ + --hash=sha256:b807e598953730f82e4eae3bd30f6a122cf6b31c398c6b504c0e04c13c170429 \ + --hash=sha256:b8cd1f918b26fd7b1832ece557cc18f2d8747309ff8b3f0ef9d4250c5ad67a39 \ + --hash=sha256:b91cc9d336957239ff200f30097e6fea2dc6d6fb3c81e853eaa09eac904fd894 \ + --hash=sha256:bd3ce56ae2cbae3ba82b683bc425cd7e48d2ed8b10f3e818186b6f5646d9271c \ + --hash=sha256:be6cb0c799abb0e2ba3e618e6d28ddddf7e485f6c2ce938dfa237daf3905072c \ + --hash=sha256:befb4158af32106b9a93db8d6d1d1cbbd418c0d5aca0cabb7b1780abf0c89169 \ + --hash=sha256:bf053da3c97a4bc5ecfbb218cdd2983febd91c617be8367d139882aa11e490aa \ + --hash=sha256:c02e8f18bdedba082cef725942ac823b9b60656db07f7e265cb31618dfd00d77 \ + --hash=sha256:c1bc67752d5f21013cfe430df4062441714eab79f65a6a05e01505957e9c35fe \ + --hash=sha256:c61750fadcd119d0825bcb7d7d675dd264dcc89cc05292aab5be68ebdbb374ad \ + --hash=sha256:c90d5b3d4e944e065a301d741b3c1d784f6bd1f503aa68b4967e32b2ba313d85 \ + --hash=sha256:c9a7f43c0b202b334cc9184af09bb8f21d3a209e038efaf106936fb69e6b026e \ + --hash=sha256:cb96e6e088d6cf71c1ea977510948320234824cf226e32f6f6e044f7a9c82b34 \ + --hash=sha256:cf63c214fe879a65e69a386f915e36104fc84254ab141240f8854602d8e0be2a \ + --hash=sha256:d1aca03ede943eb80ab3d63bb082c84b7aab85ea83bd0fd0c200260945fb49d9 \ + --hash=sha256:d2e56fd3b00222722abfb3f5f0759ddbae4b90811b5ad4343c64030ad1bde70c \ + --hash=sha256:d5f93ebbeb8032d47e349328ec8662d973d9b05a70b3c35df1f91fe419b84749 \ + --hash=sha256:d882a373d8093c2941e01291b7ced96e9cbe4781da9a7751ca7e6c70385e5214 \ + --hash=sha256:d920abdfa61279ba1a2ef9484aab07bf03331f8c08a10120fa332353d06e6932 \ + --hash=sha256:da2af0d7aebfc2074080d72efa6ab8317c62481ef1f896f65d9999c1c01f4494 \ + --hash=sha256:dd8ea6ebee7aedbf7c749fa80521d9ccf1ba473e0d1e14805caafbaad281c889 \ + --hash=sha256:de8b364c423ef0a4bad9069657d617f9a5d2b2062457a89b1fa16ee199c399c1 \ + --hash=sha256:df1ae86ff54725a01fa1a0510b914ca53a161b7050be74f6204e24aded5971d0 \ + --hash=sha256:dff05cb7016dff1e9fd68f4122c127b65dfc59de5306cfb7ad92f956f230bee2 \ + --hash=sha256:e1a622f13970d81f95d0c72f9dc090dce9085fccfa4c9f2174377ee32bd15786 \ + --hash=sha256:e49fb0d1ce92cfa0cb198cc5b1b11cdf9d0638658e2a2db2687e39db7c87fc78 \ + --hash=sha256:e5c802729725bd07e2bc3ab7b76dc7e0bbfc53129d8f1eb1c002c24cf774717e \ + --hash=sha256:e841068dc0be4cb6dfb5c890eb88cbdcff2f4a332393c7ec94e8e618bd32c1a8 \ + --hash=sha256:e916035e3e9930cbdfdd10abf48861340221857f45509565898e012263f7b289 \ + --hash=sha256:eba154571c16e032112afac0dc2dfe9e63c2ceb7aedd07bb7eecf2ce26d4dd4c \ + --hash=sha256:f03460ff076f70ab595bb45a0205ccea1971443575b6920c52e755dec2b3fbfe \ + --hash=sha256:f0ec3b750b59375eab5b0fb2b9254810c00a3375be6d789899f1055a1d556237 \ + --hash=sha256:f291bcf42ae98eb5107edb162c3c998b4a89648fd8e99ed4cbd12705292788cd \ + --hash=sha256:f61efe1d2fe0de16158a5fe1d1cf3c14bdb6aecd54d8938fd26512c525c1f624 \ + --hash=sha256:f68edfc67aabac33708941f26f22a7b8e9f81429bc0cf249fcf7d66b23af8d19 \ + --hash=sha256:fa95848c929b6a75f6848d3c9793e59db365ee436776e57db835cdbfa79ba977 \ + --hash=sha256:fd9f8797427910198f95bced71ddfed61130d7e349213bfb8466c9c99e2c46a8 \ + --hash=sha256:fdb4ca07ab75ffadab4a8b135ad59cdbb3156b99310f3d565370da74a15d6bd3 + # via jinja2 +matplotlib==3.11.2 \ + --hash=sha256:01dc8eaaab5a9fce9ff615eca82345728f289e4715b186ee10c6d85272fc26bb \ + --hash=sha256:02329432ae5c6af87cf208ee575b701d698bdf0b1a3bb28cc6d53c36e967e575 \ + --hash=sha256:07d9b9fa60cd4c393692f50d0bb03123242ddf61c99bb0e95e75feb354e7c1a8 \ + --hash=sha256:116cdb0eb0eb5644fc98eb2975d4b4dd4ad35e5c8e6b851c22e6976f371f7ab5 \ + --hash=sha256:1944895967f87c84c9b4bad29a707b31f5b36df4a3a2339ea1f8ea3ce5105539 \ + --hash=sha256:1a3040b209f3968b4e84161df7b174f07a9fad33b0f2d7e48ea3bbd3075e2863 \ + --hash=sha256:1b9a7ad579856284135e401ecc918c5f8a017ee30539298862a109f51b971710 \ + --hash=sha256:254d4ddb2fa8df3b4c689c0c306063aee10521df82cfb438185e499c75fe37c1 \ + --hash=sha256:2a8285cea8ef4d92aa041d1c33788bcae82248503300f93f1ca2136b9049452f \ + --hash=sha256:30ec15d7eefee71de16b7c689b42ba49715a4644650b76a6c7c70d79daf24e91 \ + --hash=sha256:399fef672f7046ef7d6a57572b2a6f9845f3f5afcff04e7b2df7a363a9f42190 \ + --hash=sha256:3aa4b8516fd26659e4363abbf317c703d9116496c5db2e9d0609a2866dd39dd2 \ + --hash=sha256:3da3bc0cbf7245e7db72cc6d29d12c5abef72cb73059c73b945f14e3545f3eb2 \ + --hash=sha256:3e8576f7c47e02fd4f21f44171302d2d1d58d4471d46da3d71fe8899d19539d9 \ + --hash=sha256:57b9ea60a835937c2012861923cbb91f47db8565775d326d1c42fc926aa10351 \ + --hash=sha256:5e1e923a3fc3326b99ec0a6ff1ab1338ac6c6cc62ad9d8a9c944197c7f8c6221 \ + --hash=sha256:643ff850d8e0f5b8319337f87ed3cb59506afb3df3cc48de777d85871233be7b \ + --hash=sha256:75b6d88402770e181b5d06a67dda4129c31da7d05004d63a21c310ec78d1b83c \ + --hash=sha256:79a258f58253dfa025af80a9e9bb228d75fced007f0e93ae7423fefbde81a74d \ + --hash=sha256:7d43ff8cebb50840648cb6429b2228621dbd709010f3117b3740abb20abf21c0 \ + --hash=sha256:7e5a90f8a707ebb6004a713b1cff091a40cc5df4c7c1cb165e5a505ebc11c292 \ + --hash=sha256:7ef7a53b66780e5d942923724f08577fbc5be1f7322da0f0f3f9dcaa45dd803d \ + --hash=sha256:854df8d7dfe9fdffcbaa6f39e44a6c24b409cb4d7561fbc09213b157d833f6a6 \ + --hash=sha256:894a9cbbecbe30ae6787d464df2e8fc7a8d475cfc68f87c3029f7c11152899b3 \ + --hash=sha256:8c8255de28f986d935a64c9ca71c0ec2d2f41d355691f5ea684725dc91413f71 \ + --hash=sha256:930efb28f59fda124e39265d177bab302625297bb147d2910de725a2fc2aef54 \ + --hash=sha256:a24d5fd36e4f0e742c3851dcd20810e56a95633a342e4bf6cb591c678e8fe61f \ + --hash=sha256:a6939df7567114b6bac7f4c5e06c84a67f197c1b2f2e4b234d4eecb3bfec9482 \ + --hash=sha256:a8756cc73d9af9a7fe0deb54ea2e75ef73b01d9e575877e72acad5458e660943 \ + --hash=sha256:af2661f6ac6bbd1d081996f54fdd9385715c625ace8cec0869055c0cfbf38981 \ + --hash=sha256:bbf1062991d826ed27e2144f3afa4461afbb8ff56e8f703043e191a8163b1ee9 \ + --hash=sha256:bc067c462a86f0e57bf52fc6e058d90171a5420007dac00c46e90153050c69a7 \ + --hash=sha256:bf3fe71fbfb8ec0e310e0bc8537c3405a01f38f25f9394ed2135e6202fed542b \ + --hash=sha256:c0b83f044ce10a98027b105b3931548719a6e8c7ef986b4362651e0b5367c8dc \ + --hash=sha256:c27e577ece613ea12a0790e00b4eb80d901c59a3e16cad474f31d8b1529690b9 \ + --hash=sha256:c5c1c68ee401fc98271263410f0e5ce88285abacf7627132914e8adf3d70ff43 \ + --hash=sha256:c9721f81275499da1feeb36a2cf8192ea086283b3bd16b7dc4c9d7aedb7396d6 \ + --hash=sha256:cc82dde2a0d3e3ad472edce04897ad7146b8d8bfd1df8a32992eebb81af18fdc \ + --hash=sha256:cec596316640f2b394b8f0daa0ea61a8eae82d017b620b9f202befb972a59ea4 \ + --hash=sha256:cf41ecd1b0c0b6f7177ed965a54c2afbe888715c7cf6054dc12d53bc1494002c \ + --hash=sha256:d3304eb5a59442a8867f6920d484591c0fa09ffc29e9260be2feec3351e25869 \ + --hash=sha256:d480038c83691532ed52ff3147db51fa902fc78cb2d8349993a1cdb684435bff \ + --hash=sha256:df4f7784aca81a94f254c0a2767d592ee25f407e488f5fa7203e51093fb6ca27 \ + --hash=sha256:e43b188f0a5b75447bcc197728258166aa64365770ed1caa36595a5e1ca4bbba \ + --hash=sha256:e60cf3047a51edecdc4535a9196bbd6a732936b8e9f8184aabf4d16165884aaf \ + --hash=sha256:eac4b07d4e3743b172451e122ea964f72f152879d4f9adcf3f3d33e518f12ead \ + --hash=sha256:eb3712dc9b464793de0a4e42a7313d50293c751f94bddaf7332a1bc71bccdda9 \ + --hash=sha256:ecea603dd2fbf8242fd31a305a8b12a4ece2de28096870c65fdd0d1e35b8d9a6 \ + --hash=sha256:ef31985c4dedb5f1424e1aec6849a47dd37689cb7fa3c20b1b82187f26806261 \ + --hash=sha256:ef752769cd962f39ea0b6ffc82d1ea43a0012c5a6157c7a075212fa509cfcff2 \ + --hash=sha256:f25446b2981717dca9786bac841cb3fd7efb568e3e3c755dd980481c5cb9228d \ + --hash=sha256:f2ac30cf5eb5dff1b584627ae0b0e1186551a4f69ae3c75073911da497a29170 \ + --hash=sha256:fea03cf56568cc1cba08b470be6a0559e71c3a5b688d54b7179bb35ba23d0821 + # via policyengine-taxsim (pyproject.toml) +matplotlib-inline==0.2.2 \ + --hash=sha256:3c821cf1c209f59fb2d2d64abbf5b23b67bcb2210d663f9918dd851c6da1fcf6 \ + --hash=sha256:72f3fe8fce36b70d4a5b612f899090cd0401deddc4ea90e1572b9f4bfb058c79 + # via ipython +mdurl==0.1.2 \ + --hash=sha256:84008a41e51615a49fc9966191ff91509e3c40b939176e643fd50a5c2196b8f8 \ + --hash=sha256:bb413d29f5eea38f31dd4754dd7377d4465116fb207585f97bf925588687c1ba + # via markdown-it-py +microdf-python==1.5.11 \ + --hash=sha256:0f9af347bcc4d036e1290c07cc28d33bacfc84a54704a3aee52c8be61a387a29 \ + --hash=sha256:700b0125bab3e4f1af0c3257e0d06b57655259be7fac3eaa8a058ccff8616e96 + # via + # policyengine-core + # policyengine-us +msgpack==1.2.3 \ + --hash=sha256:07c9733089d1b176c3dd2f7fa268452f9d5d784d076473499d754a58e8d1fbbb \ + --hash=sha256:0955b9000725573d1457c1676944b370dd9643c8d18f25bda5ac72913f850949 \ + --hash=sha256:0c91762c48cd686dc9cf2b142c0bc544083952de32f5853d6624c956e54b85e5 \ + --hash=sha256:0ed5823c4efc20fe87d3530665f40ec18a002be003114814c21235cc8d256207 \ + --hash=sha256:13221a6c81ebb8e43ea63a7251c35d54e4175cea37ebf3a62e911bdf42562a3c \ + --hash=sha256:186e6c602b8a9968b8e864c67d622a69279f7d1e55ae25f40e3bff7e815b2b62 \ + --hash=sha256:18a6ed513023001b28dcd3ba54966f6bb90a38274ba8d2640464bcab3a1b81d4 \ + --hash=sha256:1d6bcec3dbbdb89ca385d3a73e63ceae7b841fa0d7ca7c676f1a7bfe7fb2cdb8 \ + --hash=sha256:1f4ae8bd4ad9ba085fde95e95d055a896d19210238a4199a771a3cf36dceed49 \ + --hash=sha256:1f585407f740a9eac04a3bb82c61d68a0ea78f90e29e670bfb086b9ce3a518dd \ + --hash=sha256:21bfa4d2aa0b04c1806ef778a1199e9e53ea2441bcbf284420a32083896320b8 \ + --hash=sha256:2487453ca1b6104442c6442f9a1a8fee1fe8f428a70d99d4cba799108b304150 \ + --hash=sha256:2574ef81c1c8c38b10e330f3f9406fd09198a776b002030fafcf8e7647e9e06e \ + --hash=sha256:30e1522e4173230dca4d9ad896f038f73c0da6c1edd42f4dbad88ac583cf5d46 \ + --hash=sha256:32edb81a2b5eb7cd7c9d941b2bfbbb082fd2cd09e0e725930316af6b708db186 \ + --hash=sha256:3372475211a9ce1a23acefe512cb3e121d18c95dc74ed56cb1819ef40836ebf4 \ + --hash=sha256:382b219de3d436de3baba0f4b0c6d4336e8f5858d0eb047918b13b69a71c6c55 \ + --hash=sha256:382bc88fe90f29f5ac8a0b65c7046ff255356f2f2f3186c30e370215736fa1dc \ + --hash=sha256:39b6986c19e1f2dfa549d185dba6ccf1de2e4c0ba10d8cfc0048935b1c5f9109 \ + --hash=sha256:3a31905206722103a84c1f72633fe30692cff6732c9d262e09a27dbc468797c8 \ + --hash=sha256:3d4c807ed050fe3ddbea5ba7e9f63d7136871ce42861be1f50ff739f0e91047a \ + --hash=sha256:3ec409b0d6aa8e9eec6eaf881b893caa215dbe68c5319ca96e8a271d81bb111d \ + --hash=sha256:471e12a6a42498a31490c206e0069e343b6a7c35db540be73a879eb06f5be047 \ + --hash=sha256:4c0780095871ecc49a58b2ff6b1b43b25214704da67646557ca287a3f49fb2dd \ + --hash=sha256:59612b4ed48a04cf024584218e813562f3b30a3bafa5f55abe300b15da314751 \ + --hash=sha256:5bd5f91ea75c45cafcc5433ba8fae59b708b736ec178d2441c40c499e9e079db \ + --hash=sha256:5bf390259cb25a6a1cd197c65810999b811f64cd38683251538bcc5a1e41f7d3 \ + --hash=sha256:5c1efdd9181cb1b719ee46865f368a927f1c0c65d577798340b1194545b7515a \ + --hash=sha256:5e0d7950ca3c1bbae291d0552dd3bb2792fc680629c4c0d44e47e5bab969f3ca \ + --hash=sha256:5f304123b90e8b2e49867981b7f6061612c39f50cca51ee88de007c084cf68d3 \ + --hash=sha256:62cc1a4ef0e553bac32c8342e1f04834aca7de276b92744eb7307db77759b890 \ + --hash=sha256:63bb7448a1e9111319ae2430c09a5596140c160422830d6271bc75730ff2ff9a \ + --hash=sha256:6576f348ed6cc4f31db6fd915a8e94245f042f50eae08d48732425e70638ea37 \ + --hash=sha256:666ef5601ab0e6e345e47febc96aa81143cc932201543480cbb9499164f05ffb \ + --hash=sha256:6707d2fa2aa1bb5424ea0b05f44ffc989b15ab41a73ff5855bff4944fec7c8ac \ + --hash=sha256:69ad12cedb674c73527bed869cddb42b742cac79a207a614202a4abaa24ea173 \ + --hash=sha256:6a834097144aabe948b8ca9020a833e8026f7d0abbd0ec54bc7e50f45a8ce012 \ + --hash=sha256:6df430419f2338cb71e4a34d6e64f83c88ccd321f91f40ba4513400b36d864ec \ + --hash=sha256:700bc0fc9e968a292b9137ee70e7a012f7e115bf0107ce45e3a88202788dfc1e \ + --hash=sha256:7013534a7163aa4f213c4d9864f1a8a7555daac6fcd48f699a198e29b436bfab \ + --hash=sha256:7995a7c6a62a1d6e7df211b4a16de513bd99fd053525050a319f80f44fb8015e \ + --hash=sha256:79dfa38faf92f804aa61beec140d70b18418e1dde1778dbb77a87a4cce85aa8a \ + --hash=sha256:7a003b02c6ee2eea6dfe0bb08818631e3597e69f0131f2a8250488a1cc553290 \ + --hash=sha256:7c047250096f9fc19dba26e3d1639b5e7a84114003605c94def667149a70ced1 \ + --hash=sha256:84a6616d396ec1bc18a1e83e67c96a393ec35dfe5e17434a5be7b9aa0fe988ab \ + --hash=sha256:87cf2ef05ff2f2493ba29fcdaef27e960ca64dacfd13460ae29e6f92e0ed05bb \ + --hash=sha256:89c930aece4e972b208ba589c8410b4167b05e411a5ea2cb25fd96f8bc47ee43 \ + --hash=sha256:8ca67f77938ea6a3663aa9bd22b3e031f6da84d665be850abab910ee90728dfd \ + --hash=sha256:8e51eca14fbb65c4e0a5a9657346962bd3dca78c08e04e3d4dee70ef48687d30 \ + --hash=sha256:8ec7a1d49ca6c2569d722ab5ec86e90089b0713900aa31905b47b4c4d9e78ce0 \ + --hash=sha256:902f3490db0e07a7d40b48536a85c9b28fbf1397e7e1658a45a55f958e303620 \ + --hash=sha256:905a189853d6bdb204c7ae5f4ab77fb857448abfff574d3d93c62e2815b24b4f \ + --hash=sha256:9276ba88891338f2617044429dfd080ae008c9868a25f6f1a7d004a35dc9ac0a \ + --hash=sha256:9324c54995641c3d1f92a9d55093c8cde0ffa2fbc87a467a688ef60428393220 \ + --hash=sha256:968583e956d0427878050b371308c5f8647088732ef3e66a117dbe1192ec91e0 \ + --hash=sha256:9d7e9cbb0998bbfd363fd9a09c330520d5e9cb323c05b5a1a05865d23ccf2226 \ + --hash=sha256:a393e428f6ffb0dcb73308c1fff5593041c16ff42da66e5bac8a83a6107a54b0 \ + --hash=sha256:a6b63917d60d6df451f328bd6afba8565e33c4afe1f62ec4ad758b78731c827b \ + --hash=sha256:b1631e12fe572e181cd77e831f69335d6cd5278eac22e3db3f33cf264ac2ac18 \ + --hash=sha256:b774ff994d844e541439ac5d2d49a14def4104830c3465e9394c153f86200ffb \ + --hash=sha256:b949cc25e4a09252cbcc54e66e507de914d0e94a3a7039bd54c299bf7037c098 \ + --hash=sha256:bb89b5dc30469c84bbf8684826eb851d82412ca95690e111b9ac5e8fb343961a \ + --hash=sha256:bfe7d5b62cbe7aa664f0b3e2c49077f10fcdd06183d3014f8271ff3c5edbfbf9 \ + --hash=sha256:c309a7abae1d14ba29a8bd0ddbd704a5e469d8e9bd9c3dee0e4ff53d7ae01d56 \ + --hash=sha256:c77e27790ad72989db783d5303825fba0b71550f00a490efba35cde7dc4b719f \ + --hash=sha256:c942c21a93f36b3a69e828c8945bb72c94dc2ffe488a2086950c812f3edf046c \ + --hash=sha256:ccea05b5542f6d283fef3f0a8e93a7f0be90af0ddeeef84c25c0216ba76dcae1 \ + --hash=sha256:cd5a9f9f86a52c24713679aa2631956835f3842512964ff93f736ff76f1f530d \ + --hash=sha256:d0238cd05dec9ffbe0de1071df685ba63e30a36ac155285b1a094e727c38cbe9 \ + --hash=sha256:d1c1e8989a855b7f1f2a64ec4a80b23a631822903952770813857b2e4f460471 \ + --hash=sha256:d2f9c4f85e47a44d26d5baf3b041eef23436e224d44eed273f01bd8a12048d9f \ + --hash=sha256:d31864ba3933a589b6a00249f89c0eb422197f49128fc10da550e57e9cb0f377 \ + --hash=sha256:d8ef3a66e4b52d2d7fdd90df2984670124b2ff7546d76bb25dcf68ef47f7df58 \ + --hash=sha256:db84203b13aecc222f465061397fdd5b53b7ae73d2c95ffc1c8dc5be0153a709 \ + --hash=sha256:db9fb67a3a2e75247bae569d34ebb5ff61c0448a4f0d6dbf991dae68af39b007 \ + --hash=sha256:e0bd394e999949c814f7912284243298de1b5a17b6a3dcb6cc8a79b156ffc4fa \ + --hash=sha256:e15f70588f4db8cd10df0930145b186de70feb9db51710cd378b1399009655bd \ + --hash=sha256:e54394b7dbe2e12ab032d9d21feef7bb61a90a150a2623633ba3781ba69dcb1f \ + --hash=sha256:eaf7e82249837e3aa97297b34a0bb9ff562027381631e057cea6e1367f10b438 \ + --hash=sha256:ec0030361cc861ac699b2ef1c695b741fa145c88f8667fa3d7e3f73deeb648a3 \ + --hash=sha256:ec90a9ae3e1169fa1171147340f0e97d941aa19fcd3b34e8339a55933ed042af \ + --hash=sha256:ed899d73a22f286a72bd9528d63f2ab3030dbad8bf1527fc249319a50d61fb9d \ + --hash=sha256:ede33b2892ceb976283e009ad12fa1834cfdf1f9c43ee9c97849fc588d00a618 \ + --hash=sha256:f24a43b3560e20f825b807fe1e874bd73d53abaf8bbdcf258a6eb152cddbc1f5 \ + --hash=sha256:f3d7b3d0018746b5997dd6b14a1870b07cc4c327d9101145d94a1fc264a51a06 \ + --hash=sha256:f41ca154b7737b11893cdce3c78c61d703398a1cd54d4297bdad908392338a8e \ + --hash=sha256:f42f146752eedb6765f07dcc04d72dab0a25779ec8d4a88c0085263ce114f22c \ + --hash=sha256:f56fba61b2516be7917cb00151f0d060b5b21184e3499bb57f0f7d9259bea124 \ + --hash=sha256:f9ddd28d3e9bbc602a9dced1591882c7fb9ab776eef8837da2c326fde19e2853 \ + --hash=sha256:fafc3b8898b432b841d30a61082c599fa7f4d06885f9dc58ad72259e12059fa6 \ + --hash=sha256:fcc6800daac4922960f6eeb7a0dda3dd4105e0bf7bce0e83ebc465a78cb7bdba + # via blosc2 +ndindex==1.10.1 \ + --hash=sha256:03cf1e6cdac876bd8fc92d3b65bb223496b1581d10eab3ba113f7c195121a959 \ + --hash=sha256:046c1e88d46b2bd2fd3483e06d27b4e85132b55bc693f2fca2db0bb56eea1e78 \ + --hash=sha256:08bfdc1f7a0b408d15b3ce61d141ebbebdb47a25341967e425e104c5bd512a5c \ + --hash=sha256:092b92c07690292ec7c6b266c38d7e63d254ec8d913ed06f2a8e16103eb7861a \ + --hash=sha256:0ad8e060b26568c4e67c7b1dc2bc64e28597afdaabd7d63f98f655bfe2daa644 \ + --hash=sha256:0f6113c1f031248f8818cbee1aa92aa3c9472b7701debcce9fddebcd2f610f11 \ + --hash=sha256:157b5c34a1b779f5d27b790d9bd7e7b156d284e76be83c591a3ba003984f4956 \ + --hash=sha256:1827a40301405b44ad709e388c5b48cf35cd90a67f77e63f0f17d87f6000fa81 \ + --hash=sha256:1ae21b06235cb0884e97cf672780c170449baa0314085595cfe751705fa352de \ + --hash=sha256:23d35696f802548143b5cc199bf2f171efb0061aa7934959251dd3bae56d038c \ + --hash=sha256:27385939f317b55773ea53f6bf9334810cf1d66206034c0a6a6f2a88f2001c3c \ + --hash=sha256:27a7729a4d33df6b96f7d5edff281d2b987bbe6545031c5eb606b95c47694f54 \ + --hash=sha256:28741daca5926adff402247cd406f453ed5bb6042e82d6855938f805190e5ce9 \ + --hash=sha256:2d6442ecce9b395aade5e9f2431e169e01393953a069f6d2d53a63b6c94d1d06 \ + --hash=sha256:3307817bdc92846b18f309fae3582856f567dd6e0742fb0b41ac68682bfc4e2a \ + --hash=sha256:346a4bf09f5771548665c8206e81daadb6b9925d409746e709894bdd98adc701 \ + --hash=sha256:37f87f0e7690ae0324334740e0661d6297f2e62c9bf925127d249fb7eddd0ad8 \ + --hash=sha256:3b0d9ce2c8488444499ab6d40e92e09867bf4413f5cf04c01635de923f44aa67 \ + --hash=sha256:3ce3bd0882572269ca09285112cf38ce84baa2aaa5891551af968ca7c18f84bb \ + --hash=sha256:4cea15cff221e76abd12e3e940c26124184735cf421c229307f5db6742e14dd7 \ + --hash=sha256:588e8875d836a93b3cd9af482c8074bb02288ae1aff92cf277e1f02d9ae0f992 \ + --hash=sha256:59a3222befc0f7cdc85fb9b90a567ae890f70a864bdeb660517e9ebcb36bf1bc \ + --hash=sha256:5c026dbbf2455d97ce6456d8a50b349aee8fefa11027d020638c89e9be2c9c4c \ + --hash=sha256:5c3634a8df43e7928122225a3d64d850c8957bd1edf2e403907deacb478af27b \ + --hash=sha256:6928e47fb008903f2e41309b7ff1e59b16abbcd59e2e945454571c28b2433c9e \ + --hash=sha256:72af787dcee3661f36fff9d144d989aacefe32e2c8b51ceef9babd46afb93a18 \ + --hash=sha256:752e78a5e87911ded117c57a7246596f26c9c6da066de3c2b533b3db694949bb \ + --hash=sha256:777bb6fa1dc72527fb43744b8c1499ca86e8e110b238d7aad6a686489c23d3bd \ + --hash=sha256:78bfe25941d2dac406391ddd9baf0b0fce163807b98ecc2c47a3030ee8466319 \ + --hash=sha256:78ce45106ebf67aeba99714818c721d8fd5fb9534daebd2565665a2d64b50fc9 \ + --hash=sha256:7da34a78410c14341d5fff73be5ce924bd36500bf7f640fc59b8607d3a0df95e \ + --hash=sha256:8644c76e74c0fbbdaa54752de30b7c6b98b1e8f6c05f0c6228632a29c862d83f \ + --hash=sha256:87f83e8c35a7f49a68cd3a3054c406e6c22f8c1315f3905f7a778c657669187e \ + --hash=sha256:890bb92f0a779e6f16bdbcc8bd2e06c32bcc0239e5893ba246114eb924aecaaa \ + --hash=sha256:8ff1558ddbfedcecd1f6ed7777530917ad08f9c253fcaa8b7152a7aa4ca0264f \ + --hash=sha256:9599fcb7411ffe601c367f0a5d4bc0ed588e3e7d9dc7604bdb32c8f669456b9e \ + --hash=sha256:967b87b88dadb62555ec1039695c347254eccb8ca3d124c0e5dbe084c525fa93 \ + --hash=sha256:9b5297f207ebc068c7cdf9e3cd7b95aa5c9ec04295d0a7e56b529f66787d4685 \ + --hash=sha256:9d581f931e61f182478f18bdf5edd3955899df5da4892ed0d5de547a4cfd5b6f \ + --hash=sha256:9fdf3ca16efcdfbb8800aa88fbab1bc6528e6a0504bcb9cf7af4cb9d50e9f5d9 \ + --hash=sha256:a91e1a0398120233d5c3b23ccb2d4b78e970d66136f1a7221fa9a53873c3d5c5 \ + --hash=sha256:a9a211ec2198994cb3600cd46adb335a740f27e4d406b40d48ed7b98d2d2a89b \ + --hash=sha256:ae73cd2d66b09ef2f2a7d7f93bad396d6abf168d1ee825e403c6c5fb8ae1341c \ + --hash=sha256:bada24abee6bc6ca438b2e6b68a752fc9b58b67bdcb54008e2bc6330ecb0a777 \ + --hash=sha256:bc236d1612714cbd80610cf25a6ef92584ff1402e9d5a5c50e926195716f7d22 \ + --hash=sha256:c5e9762452b163e33cfb6e821f86e45ba0b53bdfcd23ab5d57b48a8f566898cb \ + --hash=sha256:c65ca639a7abf72d79f22424f4abd18dece1f289a2b7b028a0ca455edd2168d4 \ + --hash=sha256:c67dde588c0fb89d872931a4ed5f9b4d21c1c70a3d92fdf0812a1de154239816 \ + --hash=sha256:c9dd58d91220b1c1fe516324bfcf4114566c98e84b1cbbe416abe345c75bd557 \ + --hash=sha256:cb76e0f3f235d8b1c768b17e771de48775d281713795c3aa045e8114ad61bdda \ + --hash=sha256:cdb86a4176f2ae23bd4bcd0401ca35d5dad2d1ed0d0dca1ff64480ebe41b75d9 \ + --hash=sha256:cf5855881884b8467dfcf45764ccf2e4279075be14b155b89c96994bb08d2e6f \ + --hash=sha256:cf80241b40adffdc3276b2c9fb63a96c6c98b4a9d941892738de8add65083962 \ + --hash=sha256:cf9e05986b2eb8c5993bce0f911d6cedd15bda30b5e35dd354b1ad1f4cc3599d \ + --hash=sha256:d0ebdba2fade3f6916fe21fd49e2a0935af4f58c56100a60f3f2eb26e20baee7 \ + --hash=sha256:dc7ebdbd465d25f29a9cd7ba31c304172351fc85626835385bcb72807d309a9a \ + --hash=sha256:e2ad917bcdf8dc5ba1e21f01054c991d26862d4d01c3c203a50e907096d558ac \ + --hash=sha256:e69a2cb1ac7be955c3c77f1def83f410775a81525c9ce2d4c0a3f2a61589ed47 \ + --hash=sha256:e81a9bd36fe054b6c9fcc53d26bc9a28cf15d1ab52a0f5b854f894116f3a54e1 \ + --hash=sha256:e851990a68937db5f485cd9f3e760c1fd47fa0f2a99f63a5e2cc880908faf3bb \ + --hash=sha256:ef3ef22390a892d16286505083ee5b326317b21c255a0c7f744b1290a0b964a6 \ + --hash=sha256:f77c4fd3f34c53037678020ab4e060da4bbdcae3a428797c7cbec69a6785dc93 \ + --hash=sha256:f99b3e89220da3244d03c9c5473669c7107d361c129fd9b064622744dee1ce15 \ + --hash=sha256:fa60637dfae1ee3fc057e420a52cc4ace38cf2c0d1a0451af2a3cba84d281842 \ + --hash=sha256:fe5341e24dc992b09c258456ac90a09a6d25efdc2cb86dcc91d32c8891e1df9a + # via blosc2 +networkx==3.7 \ + --hash=sha256:e3fd2c13a7814cee3746340d8d7f8598a67f16a58bf47fb7f8793fab6efca1b0 \ + --hash=sha256:fd77a511bd90f39f3d016351345b52cf5319b813bdca01de3f755d3cca62e96a + # via pyvis +numexpr==2.14.2 \ + --hash=sha256:022e61a3d5dbf5807746264b62126d1c2c24057ad90052478a4d4482ab2555c2 \ + --hash=sha256:0741efbd75c284e709b0fd430c85c31982b44c9962922ba8a9cbbea1bf413321 \ + --hash=sha256:149ab5744a5222f07b1d60455c4021c754d395e44938944ac7c7c2495f7feb54 \ + --hash=sha256:1d4593e2c6fa060cd7441e8b6ef25c16321a6be2144b3c82d1e00885f1fb6e94 \ + --hash=sha256:2aa65ddc2243f19c6915f34ee0978b4a2df20f297230a793c4ee6d55f3472599 \ + --hash=sha256:2aceefa08f8f86317fa6e8fe9f6dc20d24ab8365d715be4a26306acf406d2dbe \ + --hash=sha256:2ef72de3d3dd466cb0c435cae7141c99b0f8091b1eae9d03dcb38690f56c3f79 \ + --hash=sha256:2f132777d7d425471c458af5617e023402f13f5006301eacf8a1a6e7118ea70c \ + --hash=sha256:327be9ee62251c173236dc620147ff2d0e732a32f5bad918d78a10082f502f63 \ + --hash=sha256:375d8bee15be42dab22100a0a3de05fe6689a2de853eca012858768a9a7e02ab \ + --hash=sha256:41cdeacf1b4e51c1143983ea61fcee68139ca47222b55a9265b4fa73826c4260 \ + --hash=sha256:449a57fb9d38de136e742b1fc429572b42f29778f1d695c3fe50ffec9d3c9a71 \ + --hash=sha256:44dc6b1dfa9abcbfc9917297f0d2af7c87c16b6ecd45747a8e70f54399a3a2f9 \ + --hash=sha256:4b1ff261c3e69c4c59578d3a9ca6132603619d38ae1abe73325563bed3b9bbaf \ + --hash=sha256:606ceaf5722e295ef965ca591736fc26d9e5f13ad950a479e64cead1947f8a3d \ + --hash=sha256:66f3b125b1104241322811de87918724d6709bf082dc0703722d0cecb7b29e82 \ + --hash=sha256:6acafb2fdbeaaa6681a8f1a1d8b3f7dcd33704baace7057b950754b258be7c43 \ + --hash=sha256:76e87c7bd70d721ce4d418e81f4fb7ecf9e7e67d7cea8102527b07fd3d3facf9 \ + --hash=sha256:779129d50974e7d6d6581d322f75b8f8375e96215b6861a2d5460347997ef649 \ + --hash=sha256:790da022539fe7c37dc893acf530a91c2ca6964d7ba11f464131383729d058f3 \ + --hash=sha256:7ca9e71195b36cc7aeafe97347549e1e1c1e889ff700238782ef6447651ec26d \ + --hash=sha256:806a4471310fe20aa7cb1b2816a6f5e508073a1ad1c2e18041b83e57066fad6a \ + --hash=sha256:8274c51ae1842948f3ae7fe6951a23dcf4ddcbeeaff3737e978e7740b754662d \ + --hash=sha256:8b8384592c49cb15a91caa54e2cd84d1ce18edb7af030bb76cd29b52e5dc155d \ + --hash=sha256:8fc55d14bcf17b3fe69213bea14f999451892b4690717008c66f2edfd6a085ce \ + --hash=sha256:91e7928435f14fcb351c0157000bce65122b897cc8b0df6bcc48251f25850a6d \ + --hash=sha256:92b00c78664070e3af155c6be713a0a5d75d598647ce32a5609adb79a8f961d3 \ + --hash=sha256:93233040f4bed3bce5abb0c2d20aeb1074511f29cbaa9c14828f86bcfa44d321 \ + --hash=sha256:939c89f613b814e64bb568859397dc9f99b219c3ef681a72fb99a86e435262f9 \ + --hash=sha256:a404c9a55902572eec810068d06b79a7c99e96f0400f5a7d73f39dff5ec5e371 \ + --hash=sha256:b02738853b9b5b8a995f6c680f8f6ef33e8f419395b8fa380e38690495fdb911 \ + --hash=sha256:b20c1c55aba7812ff2f2c6a50006425d02282fabb1eaf8d75fe638ffcf6deb02 \ + --hash=sha256:bac00898930f962f360c3d763a8e2273fc931f65a1759ff1bf64b3cf13d65aee \ + --hash=sha256:bf959e6df6cb603611c034b6cba7b03a361be0ad0b80b73f163fab95f5ccbb7f \ + --hash=sha256:c1ffaf805d8636c3f95d0996517ecf9684c9ac62d768030ca78d1d00af2b3504 \ + --hash=sha256:c66925deb968f0b5280f723e2bb5918c11e6be2ca60e9e1530006286ab44031d \ + --hash=sha256:cd684ac9daa539fcdac3437678834797b29d7780cfaad71111745132d466d51f \ + --hash=sha256:d534ecb456a4ae3995f99c8a5deb469bfff05d4ec610a7885c175c881d12f710 \ + --hash=sha256:d6a5d8fc7016bf6f6e1808b011510aa7c3bd75ec1407f7650874ec591db59f5e \ + --hash=sha256:dd905922d7dce457947d54b84c7ac345cef37332b724445e159a5a1a2080ce2b \ + --hash=sha256:e7144e83ea9e581f2273e0304f15836736c4e470e2bd2e378ce617662a1ca278 \ + --hash=sha256:ef576a1cded27ba2f3129bc3c42df452a1c498072680d560793f98b0024cd7e6 \ + --hash=sha256:f1de5c88515ed9fbcad42699a0e2b5821b4d0f0adb0da6fb7e009e5cb19d8493 \ + --hash=sha256:f3526699350f94c6277fb16863773a1af9defd95a6f78bbd69b1f0338fd94756 \ + --hash=sha256:f41170e9d0dbba76851e35d80cfa9f4ca5fe78628c5bf24d941cf3364940ab7a \ + --hash=sha256:fd2f5882a66a7792aa6614c68831aa20085b499d41422aedd001080624ebb14c + # via + # blosc2 + # policyengine-core + # tables +numpy==2.5.3 \ + --hash=sha256:012e66aca395d795496446e52aeeb5866312a5d4d3f27da270e5a0b43f70dc5c \ + --hash=sha256:09d5a423c71ad5feb5625844ad58050e35df43871004b52ac9c0ad44a56775be \ + --hash=sha256:09ffa5d903faeaa5c4dd05009cf81c8bab9f2cb37c548b8d39b65b4cfa7c97f7 \ + --hash=sha256:0a59a421a32580a009e8a1751345bf829631b990dc1794b80514ab722b435def \ + --hash=sha256:116f96cadd935c6122e9228d676fe7ede19e741f5c8bb1c3cddbe0c51ccebea2 \ + --hash=sha256:1302b90c0e52281681b2975adfe8a860cb7b12216a27b4b0b4207c44bf7bccf0 \ + --hash=sha256:15aa985ac73a8db02db7663381aa109510449d3819d37206caed27b33a65a8a6 \ + --hash=sha256:1aad64d99730d013cfc6debafed22783b4fc5a7f4b8bc744d2d8cf7dcc880551 \ + --hash=sha256:1c80eabb4035ecf4ca9cd49cde8a9fdd69a729e63e6474887d1523ade7aa277f \ + --hash=sha256:1f3ed25271581281f2fccb1adcedfcde4c07362eec69189b50baf6f90e3ae159 \ + --hash=sha256:1fb6f8fb9ff0b3a69f52c66ce397b0246583e9f28616231b0e32ca49259a5fa6 \ + --hash=sha256:214045a5bf00113a146ab9ee9730c44501af6723cdf1f6830932f7b5ef2e7af0 \ + --hash=sha256:26e15e4aecd8617dfbaecb37d223e365d7b39411fba20454be2670a96aa74cb5 \ + --hash=sha256:2c25dfa72943e4336ddb6b0ee4277b47a0c85bede0807530ec68103bf58e2c10 \ + --hash=sha256:2d8240cb4c16fd831074aa2b2cf9fc54664d826341d61c372245b96a74a49a9a \ + --hash=sha256:350ba9783ce969cf9f7ce6e6a9a58e1a6e2a19ca025b7ee448c4db727706212a \ + --hash=sha256:4c8a6d2ebce6305fd82fbefca827775437147052a976ee7c94b36a0c1b52ac6c \ + --hash=sha256:4f8929ee6c96bfbd7b4ed2032e0c03af86fe1826740ab61ddabf9072d06e57ff \ + --hash=sha256:536f963710a4e63934d80ac0dc4f478804a83e9a84b6828018f25d09953ada33 \ + --hash=sha256:54a115e5a73b8fc44f0cebef486365a1894b5c9760685d4558b72b7c3eb846e0 \ + --hash=sha256:595d020938c84e320bcf40ad71089e108eac0d377cd018e14a8c094f39e98d85 \ + --hash=sha256:66a78fe4556c60aceda5916f9eacd638b18e9e681016ec302dcb4682d6d4d034 \ + --hash=sha256:6b05c171afb3aa07adbd20abc00aea86fe375beb0fdb9ef780ec5b7f63bab1c0 \ + --hash=sha256:6cef4bb1706dfec49243c05d921eefb4e190d41e2528b30d8035ea1f36b4c24a \ + --hash=sha256:6f24021b9f22bc6301c37b196974a92c1c18dccedb6fef3dd252e95f2d6adbe4 \ + --hash=sha256:71b39d9f935b6ec0f8753e3e2afb51e3efba6f2e05b68b32a40754d24bcd4a3c \ + --hash=sha256:71cad2b2a7451ab79d8f5e71b453485b6775963d5cf794179144a7463fe6e8ec \ + --hash=sha256:76c2c1e6bfa5c84adc6434dfbf013aa92096a7985221762c8f11fedfd20fff58 \ + --hash=sha256:8617bbfae4486cf99c9f899966699428d19da931d06ca94ad3da986c76e15997 \ + --hash=sha256:86bff898a431c0fb71f7610b75726e75a54d47b37edc9d537f48de63bb3c0b90 \ + --hash=sha256:8e4dd766076855b5ff7ea52fa5f07ce26286726e0f8bff446b7739d02e6ea204 \ + --hash=sha256:92f30e89b8ee0ecf363033576c422b2f58fed6a80bed0aa48dff6d14c654663e \ + --hash=sha256:93e1f5447e2b1e479d7bd74701e84746b86450cff1fc368b132d195e2b8f8211 \ + --hash=sha256:9a37475425b431b4d060f23b4f52cd2f3aef6bc7c654bd760adf0040eec9d435 \ + --hash=sha256:9deb49575e5b0b94ed72c8a64ec4d033381adc27e9060ae842971f697ba96104 \ + --hash=sha256:a5fa86b80fd24bcd1aff83ad23be44ea323de3f787be8f8b15d4a65621e25321 \ + --hash=sha256:a6391fafaba97500887132cd582abc6e19452b1ac775a47caa7b24490e152058 \ + --hash=sha256:a72f874bc9e10e4b8f80426fb49716d5141f64442a0c8418065093ec8017fbb0 \ + --hash=sha256:ac7bb1c52d445bd4f8f7f97fefe6abc3a084dc4d63df50d79b17fa2b78e89297 \ + --hash=sha256:adc1ada2662f8a5f960b8a10d9986897e7499ef07e06d4cfe7197f8cce923c07 \ + --hash=sha256:b00eefbcf0f292945c4b4dec2ae845389ef5bcdcd596e6e4328051db5b5ba694 \ + --hash=sha256:b0521d0f4aebb6e06189451025fa17a913287b13c03d5fe05c017333b654ea5b \ + --hash=sha256:b5d93cf48f687479941d12b69c873ad2cc76bbd487f0091c2200636497f34034 \ + --hash=sha256:b7e18c623bb5c95acb3b3328861272816ba199fb531921c5d6d0b675f1fde9e3 \ + --hash=sha256:bd4cb9ad3c7889b9b3fe0a9a9fb5d2ed26f9879bff2608d9f01aed147a20d231 \ + --hash=sha256:be5a8381859b6da607c84f4f7d6847725f1cf1853ef8a2c9e115b7d58bef47dc \ + --hash=sha256:befa1ae5bd6030b3f512b43ff3fa5290bbed6b84411a44244b14adf835f5b89d \ + --hash=sha256:bf63afbe037eb5d2fe87fbcc7778e61da53ebaf21d938a4515aa73b62532a5d4 \ + --hash=sha256:c00abe94c1a69d75d827dcf1c025b25c8a45d230b3bcd77a9020883a1b047653 \ + --hash=sha256:c2381f82999704f818e2c987a865050e285ec3621262c66d40f5a96c8f899f8e \ + --hash=sha256:c76d5dde9f445058f83d0c02af00557a4db91de9a9a57c0df87d1535001d654b \ + --hash=sha256:cb189f09db39283b26bfd061ec16189e14f71c6755207f72a0f7540867afe5b9 \ + --hash=sha256:ccb32e0525d29e8b0572eb84c9a57af0e7a4e615726927506f55063c62414034 \ + --hash=sha256:ccbc4665079665c3cf3bab4db9f6b095370cd6437d66be549b6c2a1fd19e1958 \ + --hash=sha256:d1c89973648c85069c5046ad460f7b8a00218b29a2e42359ac8cc63e9ab94832 \ + --hash=sha256:df2d5874ff183595a4ba404edd04f6bd9b5505c1d7708573f6a6c17489a67563 \ + --hash=sha256:e01c918ac3d48e18a927cf7b14a26a3e29ff2bdf2eacb976da0aecd6a43ed034 \ + --hash=sha256:e6ab667ba76450084eb64013762c438ea76d9d29cc676dcd6c2e9892ba37f841 \ + --hash=sha256:e931e4f499e0dc7ef29d269a8e5b35dd722e5d14be07df6240166ea7c6532fae \ + --hash=sha256:f54660b0eb6b0b9f36e7fe1cdfdff472028dd0d14acd9b9b65098efbad059469 \ + --hash=sha256:f59a878c33d6b88122d80d239bb3b845d58708750b0cb06a09aebb9b18ec696c \ + --hash=sha256:f7fabeb6cea87d65f3b926de33d03fb016cfdc29314c90974383b5582ae72891 \ + --hash=sha256:f9579f383d1bf9df80081e72760e84960a7fd4f88cf0c9e535a8597c9bb646f5 \ + --hash=sha256:f9a2353b37a1a9e78fd82b27ad7e2a32a2d036604d18f02b05e3136c62ca3b09 \ + --hash=sha256:fc36dc566135b5eceec4cf89758fcb719266a019ef07dae1754ae7c9f617ef3e \ + --hash=sha256:ffdc76bfcae6b255dff75202c5e7feaf95b40246bc0a17944facc1fecf9f79ab + # via + # policyengine-taxsim (pyproject.toml) + # blosc2 + # contourpy + # h5py + # matplotlib + # microdf-python + # numexpr + # pandas + # policyengine-core + # spm-calculator + # tables +openpyxl==3.1.5 \ + --hash=sha256:5282c12b107bffeef825f4617dc029afaf41d0ea60823bbb665ef3079dc79de2 \ + --hash=sha256:cf0e3cf56142039133628b5acffe8ef0c12bc902d2aadd3e0fe5878dc08d1050 + # via spm-calculator +packaging==26.3 \ + --hash=sha256:94edc256424af38762eb31306eed28beb9f0efc50a8837492c9d6fd6004aed79 \ + --hash=sha256:d7193f7c8e4e93f444fde0262bf90af30e16fa0ad0ad44cb553c87339b23cd1c + # via + # huggingface-hub + # matplotlib + # plotly + # pytest + # tables + # wheel +pandas==3.0.6 \ + --hash=sha256:0704044b676496b8350e023b09f174a26772456c974a2b11c36bebb558c9490d \ + --hash=sha256:085e3786ae6b2e82b406266bce36690f72b9dc1421903ba9296b2981a9fcf586 \ + --hash=sha256:097090508a1dd335013d39106fc10b20f4fd4a171638e47b77d55798ed9dab6c \ + --hash=sha256:1bcb3e9ed29e74a7439cedff9e2aefd3ea65de84d7de9ccb6c194192541bd60e \ + --hash=sha256:1e7c0afdcaf6661d795fcefc2f647ddd1136f62cdc153fba177c685d97a87808 \ + --hash=sha256:1e92d9fa834c7d877130027cddc0cad8dcff97c1f6cca26bd6310f847228b658 \ + --hash=sha256:22172a92e7ee678ec0140c7af4fc9366b55413834a1cd86af78b3caa0b0574de \ + --hash=sha256:253e12cb9081b0afbac607920f6142975966bc315135e09de275fdbaa415d2de \ + --hash=sha256:265f562fdd1079f69f3de96dd425c3405224038c0af4f920c54bd240ee2c4640 \ + --hash=sha256:2a8fc94be2ee5f1d86f97aacd8cc566f81680b6498e76f3007421bb5d98151bf \ + --hash=sha256:2e5fa32ff162dfdbc280157d664f44d23049ae414725af9676df339c501d82cd \ + --hash=sha256:3ef908d28590b3f42d7070e7ad8f9b34b442b260b7f3c1afb57e0040c58cdb1b \ + --hash=sha256:429d9df32731ab01383ed98f2baa7a60368090d1a94fc06019a12062510e8630 \ + --hash=sha256:47121f9571503f724c9b93e297ab6254ac99c77adf5e9ed085ea419fd585c258 \ + --hash=sha256:4e25e2e1adee99ddfada6f7206a79ae8e9c8a8861b0e3eaaba165006d3eef18e \ + --hash=sha256:4ff44b2cb51cbd691c91f92c4ea6c71e34003f239ebd67c2e857dc898466b49c \ + --hash=sha256:50c44cbf5820b6b91a5f74aae04972472aefadd3cd9fbd1010409d85528bd570 \ + --hash=sha256:569e114072b24fc4970c12e2b4bab252671668a40b324318903380cab0254c0c \ + --hash=sha256:583be68728a31d0d750d5b8d9e00f02b153df0d4655f858bde93cb84cfc4227c \ + --hash=sha256:5e75072773c1b2f7cb63faa3a6f562aede11f3976f68ed34cb538bc091a28171 \ + --hash=sha256:5edd0a7abb0986ecce1ac81f56d99b6763f86aa6946dceb6c661224f90af5a19 \ + --hash=sha256:60d81f9e1799b36f3739e7fff44d1fbb2e8fd5a271b3863e03de9715fccda0fa \ + --hash=sha256:62f51d7f651c8054c5e82a69265c98082e795d1442df7ca6edc3a545d61214b1 \ + --hash=sha256:654aae059295dbba6ecd2328ca12712a2cf1676214c8699f1c29213f7ccf9c34 \ + --hash=sha256:66b07ef7315a31bfe1089cd3d71a7de781c9dca986762d0b4fe7c0ef17465d10 \ + --hash=sha256:6ff482fa91fa2bafd92e8fe66ce3645c851824310f295c1f0a2f96e928fc4541 \ + --hash=sha256:77ccbe5057aece6fc172b9b77f19c04335af6882bc2e10c8f3ee4e6bfb3da553 \ + --hash=sha256:7dac2d65e9087e8e7b5a45fe15c4920911a221df061ab629943ce016489145c7 \ + --hash=sha256:83e91d15738d7783c050197cef2f2cf82fc6353dae9865aa87ed1fa16aa4d55a \ + --hash=sha256:86fa853a12e0b70927e2b1ee00d56d2224ec9cbb4b9d58348b5ad52d2f21150e \ + --hash=sha256:8fe77b408d82e2615674dfed62533b95e18a03610573877422aada4f625d4947 \ + --hash=sha256:963ca21199097a84c7827c4678b04e30833084fbf8ef44fde3fa7180a29f8fa0 \ + --hash=sha256:97274c9adf6255bb48c620cd6959805efa7f09ea2167f0e0ae006a448cd2fca7 \ + --hash=sha256:994a79608263fe1c14cc48ffa7300e2b834b7d1cb406ffe96a08828cb0cdd79b \ + --hash=sha256:9ae8073aed8e21d1a7fe263dcdc6840743549722a6738198a0a46000fa9476f2 \ + --hash=sha256:9dab635a549e58a053c7b0fa054dc0bd7be22f0ed9a720f4a85d5fb993276172 \ + --hash=sha256:9e492cd4bdba6778de4fe0df7f4590c012161ebcf9902dce01b01dc683105514 \ + --hash=sha256:a3a22e07fe75347eaacc75b0e85297947af4fba6b4aae23916bd8b6828d0bba3 \ + --hash=sha256:a4dbd4dc65cbe645b92b8785d0f96dd7311010dc6606cf620e51b07b8788a12a \ + --hash=sha256:a77a1a44e4d88f1c6a2a64d3eb12efec8420875722e14279800b173a7c7c2804 \ + --hash=sha256:b27c8d890e4aa2171437ae2a39de1d215e674158e4865c4023a8b31c932513b2 \ + --hash=sha256:bd75ed0c840f709fc2ae26ddd9534ac77ca1a48ac0cce521a74acaa85f3340a7 \ + --hash=sha256:c6e4aae3e9bea26c6c9a20d88d96c86ec4a99b4db5fd516bcb4e829ab2c0ee36 \ + --hash=sha256:c826e9babb7790142c399f58599d8de679bea059d7b39c5b6efa2096fac37266 \ + --hash=sha256:cc39303913e2ea129915670de5d1c9fbd647f543bb72e5543bac8baa94e9e42f \ + --hash=sha256:d7564d86a94c2eb8ab290b07f63ddaae5c032fa53897c29a2ff2197d43aee8af \ + --hash=sha256:d7dcd21238cbb4828ff148481ba01cac8946dc5121457b5aeba28636f8f99a60 \ + --hash=sha256:db7ec631f26223beee8e5c9e0b8f23c24d8197bbd1d982421d4e3188bea51965 \ + --hash=sha256:e3dccb584123b399c07562ac4d62543e90ede49ddf8ce3c13ffc64cbe828c281 \ + --hash=sha256:e7c1905ef02c3d6d43d9dbd5b6ccb4da4870a0b0c821bbc103fbdb6f3ad2707b \ + --hash=sha256:eb6900de08ac85f93ac4948aa6b80842eba555875337b8359035ac9c43e92d34 \ + --hash=sha256:ee913a91669056c1de1a6b733fbfeab711de9e54e3bee2dfa5fe79d9457247d1 \ + --hash=sha256:ef738d71d1059245b6bb03e312be06d8b3821326a83486c1ad03b9aba3710e44 \ + --hash=sha256:f3ce8a6968045481e91a3990e797e348ce13db45ee164a7095bbc824e26c09dd \ + --hash=sha256:f4e7c52eb108d752e7592268108fd3e98efd76d83a3125cdd06c621c2e44359b \ + --hash=sha256:f8029ec0f1f89e4f985929ce1f6626dabf3140d61a4e9c1215afdab34eaf9a5d \ + --hash=sha256:fb625f426b375bcc96e3a04c5d5d266cd7be6ae5d6866e0e703382ab5164068c \ + --hash=sha256:ff51a4459ed036e93d1eb1bb5e6e7b28685d3cb6b7c12b91c05b31024e234729 + # via + # policyengine-taxsim (pyproject.toml) + # microdf-python + # policyengine-core + # policyengine-us + # spm-calculator +parso==0.8.7 \ + --hash=sha256:a8926eb2a1b915486941fdbd31e86a4baf88fe8c210f25f2f35ecec5b574ca1c \ + --hash=sha256:eaaac4c9fdd5e9e8852dc778d2d7405897ec510f2a298071453e5e3a07914bb1 + # via jedi +pexpect==4.9.0 \ + --hash=sha256:7236d1e080e4936be2dc3e326cec0af72acf9212a7e1d060210e70a47e253523 \ + --hash=sha256:ee7d41123f3c9911050ea2c2dac107568dc43b2d3b0c7557a33212c398ead30f + # via ipython +pillow==12.3.0 \ + --hash=sha256:00808c5e14ef63ac5161091d242999076604ff74b883423a11e5d7bbb38bf756 \ + --hash=sha256:04f01d28a6aaff387bf842a13be313df23ba0597a44f1a976c9feb3c6ff4711a \ + --hash=sha256:06ff022112bc9cbf83b60f8e028d94ad87b60621706487e65f673de61610ab59 \ + --hash=sha256:0740a512dc522224c77d9aa5a8d70d8b7d73fb91f2c21125d8d025d3b8990e45 \ + --hash=sha256:0847a763afefb695bc912d7c131e7e0632d4edc1d8698f58ddabec8e46b8b6d3 \ + --hash=sha256:0dd2064cbc55aaec028ef5fbb60fa47bb6c3e7918e07ff17935284b227a9d2df \ + --hash=sha256:0feb2e9d6ad6c9e3c06effe9d00f3f1e618a6643273576b016f591e9315a7139 \ + --hash=sha256:10e41f0fbf1eec8cfd234b8fe17a4caac7c9d0db4c204d3c173a8f9f6ef3232b \ + --hash=sha256:1182d52bc2d5e5d7d0949503aa7e36d12f42205dc287e4883f407b1988820d39 \ + --hash=sha256:164b31cd1a0490ab6efae01aa5df49da7061be0af1b30e035b6e9a1bfe34ee6e \ + --hash=sha256:1657923d2d45afb66526e5b933e5b3052e6bdea196c90d3abb2424e18c77dae8 \ + --hash=sha256:186941b6aef820ad110fb01fb06eb925374dc3a21b17e37ec9a53b250c6fe2d1 \ + --hash=sha256:1cca606cd25738df4ed873d5ad46bbdb3d83b5cbca291f6b4ff13a4df6b0bbe8 \ + --hash=sha256:21900ce7ba264168cd50defae43cd75d25c833ad4ad6e73ffc5596d12e25ac89 \ + --hash=sha256:236ff70b9312fb68943c703aa842ca6a758abfa45ac187a5e7c1452e96ef72b5 \ + --hash=sha256:23aceaa007d6172b02c277f0cd359c79492bbb14f7072b4ede9fbcaf20648130 \ + --hash=sha256:23d27a3e0307ec2244cc51e7287b919aa68d097504ebe19df4e76a98a3eea5bd \ + --hash=sha256:24870b09b224f7ae3c39ed07d10e819d06f8720bc551847b1d623832b5b0e28d \ + --hash=sha256:251bf95b67017e27b13d82f5b326234ca62d70f9cf4c2b9032de2358a3b12c7b \ + --hash=sha256:25b9b82bb22e6e2b3cd07b39c68b7b862001226cb3dff7130d1cb914121b39ed \ + --hash=sha256:28ce87c5ab450a9dd970b52e5aca5fe63ed432d18a2eaddd1979a00a1ba24ace \ + --hash=sha256:300557495eb45ebb8aec96c2da9c4be642fbf7cd937278b4013ba894ea8eb0eb \ + --hash=sha256:30f2aa603c41533cc25c05acd0da21636e84a315768feb631c937177db558931 \ + --hash=sha256:331b624368d4f1d069149002f25f44bc61c8919ce8ddb3c45bdad8f6e2d89510 \ + --hash=sha256:37d6d0a00072fd2948eb22bce7e1475f34569d90c87c59f7a2ec59541b77f7a6 \ + --hash=sha256:37dc8f7bbb66efe481bb60defacef820c950c24713fb44962ed6aa2a50966de1 \ + --hash=sha256:3b8182a766685eaa002637e28b4ec8d6b18819a0c71f579bf0dbaa5830297cce \ + --hash=sha256:3edce1d53195db527e0191f84b71d02022de0540bf43a16ed734ed7537b07385 \ + --hash=sha256:446c34dcc4324b084a53b705127dc15717b22c5e140ae0a3c38349d4efec071e \ + --hash=sha256:4998562bf62a445225f22e07c896bb04b35b1b1f2eb6d760584c9c51d7a5f78c \ + --hash=sha256:4b0a7fe987b14c31ebda6083f74f22b561fd3739bc0ac51e019622e3d72668c7 \ + --hash=sha256:4e8c2a84d977f50b9daed6eeaf3baef67d00d5d74d932288f02cb94518ee3ace \ + --hash=sha256:4f883547d4b7f0495ebe7056b0cc2aea76094e7a4abc8e933540f3271df27d9c \ + --hash=sha256:514435a37670e3e5e08f3945b68718b6ed329bb84367777e16f9f4dfe1e61a0f \ + --hash=sha256:53aa02d20d10c3d814d536aa4e5ac9b84ca0ff5a88377963b085ad6822f93e64 \ + --hash=sha256:5594fc43d548a7ed94949d139aa1341b270f1863f11cfd37f5a6c8b778a6b67f \ + --hash=sha256:571b9fcb07b97ef3a492028fb3d2dc0993ca23a06138b0315286566d29ef718a \ + --hash=sha256:57b3d78c95ba9059768b10e28b813002261d3f3dfc55cc48b0c988f625175827 \ + --hash=sha256:5afb51d599ea772b8365ae807ae557f18bccfe46ab261fd1c2a9ed700fc6eb17 \ + --hash=sha256:6b02afb9b97f65fbca5f31db6a2a3ba21aa93030225f150fa3f249717e938fb4 \ + --hash=sha256:6c0016e7b354317c4e9e525b937ac8596c38d2d232b419529b9cd7a1cd46e39a \ + --hash=sha256:71d6097b330eea8fd15097780c8e89cb1a8ce7838669f48c5bacd6f663dd4701 \ + --hash=sha256:756c768d0c9c2955feb7a56c37ea24aea2e369f8d36a88da270b6a9f19e62b5e \ + --hash=sha256:78cb2c6865a35ab8ff8b75fd122f6033b92a62c82801110e48ddd6c936a45d91 \ + --hash=sha256:7a743ff716f746fc19a9557f60dab1600d4613255f8a7aeb3cdde4db7eb15a66 \ + --hash=sha256:85f998ea1848bc6757289e739cfbdda3a04adfd58b02fc018ce54d754a5ce468 \ + --hash=sha256:8728f216dcdb6e6d555cf971cb34076139ad74b31fc2c14da4fafc741c5f6217 \ + --hash=sha256:877c3f311ff35410f690861c4409e7ccbf0cd2f878e50628a28e5a0bb689e658 \ + --hash=sha256:8cd2f7bdda092d99c9fc2fb7391354f306d01443d22785d0cbfafa2e2c8bb418 \ + --hash=sha256:8e95e1385e4998ae9694eeaa4730ba5457ff61185b3a55e2e7bea0880aef452a \ + --hash=sha256:962864dc93511324d51ddbb5b9f8731bf71675b93ca612a07441896f4688fb8c \ + --hash=sha256:9cf95fe4d0f84c82d282745d9bb08ad9f926efa00be4697e767b814ce40d4330 \ + --hash=sha256:9e881fca225083806662a5c43d627d215f258ff43c890f831966c7d7ba9c7402 \ + --hash=sha256:a2b55dd6b2a4c4b7d87ffa56bdb33fdc5fdb9a462173861a7bc097f17d91cb09 \ + --hash=sha256:a45650e8ce7fafffd731db8550230db6b0d306d181a90b67d3e6bca2f1990930 \ + --hash=sha256:a876864214e136f0eb367788dbd7df045f4806801518e2cfe9e13229cfe06d8f \ + --hash=sha256:ae26d61dfa7a47befdc7572b521024e8745f3d809bd95ca9505a7bba9ef849ec \ + --hash=sha256:af8d94b0db561cf68b88a267c5c44b49e134f525d0dc2cb7ed413a66bc23559a \ + --hash=sha256:b343699e8308bdc51978310e1c959c584e7869cc8c40780058c87da7781a1e94 \ + --hash=sha256:b3c777e849237620b022f7f297dd67705f9f5cf1685f09f02e46f93e92725468 \ + --hash=sha256:b629de27fda84b42cde7edef0d85f13b958b47f6e9bbcbba9b673c562a89bd8b \ + --hash=sha256:ba09209fbe443b4acccebe845d8a138b89a8f4fbaeedd44953490b5315d5e965 \ + --hash=sha256:ba54cfebe86920a559a7c4d6b9050791c20513650a1952ebe3368c7dc70306f8 \ + --hash=sha256:bcb46e2f9feff8d06323983bd83ed00c201fdcab3d74973e7072a889b3979fcd \ + --hash=sha256:bcc33feacfaefce60c12fd500a277533bdc02b10a19f7f6d348763d8140bbba7 \ + --hash=sha256:bf16ba1b4d0b6b7c8e534936632270cf70eb00dbe09005bc345b2677b726855c \ + --hash=sha256:cf1845d02ad822a369a49f2bb9345b1614744267682e7a03527dc3bf6eea1777 \ + --hash=sha256:d69141514cc30b774ceea5e3ed3a6635c8d8a96edf664689b890f4089111fb35 \ + --hash=sha256:d9c7f76c0673154f044e9d78c8655fb4213f6ca31a836df48b40fe5d187717b9 \ + --hash=sha256:dbce0b29841537a2fa4a214c2bbf14de3587c9680caa9b4e217568472490b28f \ + --hash=sha256:dc624f6bc473dacdf7ef7eb8678d0d08edf15cd94fad6ae5c7d6cc67a4e4902f \ + --hash=sha256:e158cb00350dc278f3b91551101aa7d12415a66ebf2c91d8d5ac14e56ddd3ad0 \ + --hash=sha256:e491916b378fba47242221bb9ead245211b70d504f495d105d17b14a24b4907c \ + --hash=sha256:e795b7eb908249c4e43c7c99fac7c2c75dab0c43566e37db472a355f63693d71 \ + --hash=sha256:e7e480451b9fa137494bccd3a7d69adbe8ac65a87d97be61e11f1b1050a5bac3 \ + --hash=sha256:e91206ee562682b51b98ef4b26a6ef48fd84e15fd4c4bc5ec768eb641d206838 \ + --hash=sha256:e9871b1ffbfa9656b60aeee92ed5136a5742696006fa322b29ea3d8da0ecc9cf \ + --hash=sha256:e9aeb04d6aef139de265b29683e119b638208f88cf73cdd1658aa07221165321 \ + --hash=sha256:ebaea975e03d3141d9d3a507df75c9b3ec90fa9d2ffd07567b3a978d9d790b26 \ + --hash=sha256:f0606c8bf2cdefea14a43530f7657cbbb7ecf1c4222512492ef4a4434a9501ec \ + --hash=sha256:f13c32a3abd6079a66d9526e18dad9b6d280384d49d7c54040cd57b6424041d9 \ + --hash=sha256:f7401aebd7f581d7f83a439d87d474999317ee099218e5ad25d125290990ba65 \ + --hash=sha256:fa4ecea169a355be7a3ade2c783e2ed12f0e40d2c5621cda8b3297faf7fbb9f5 \ + --hash=sha256:fbd139c8447d25dd750ab79ee274cc5e1fe80fc56340ab10b18a195e1b6eca3e \ + --hash=sha256:fdafc9cce40277e0f7a0feabce0ee50dd2fa1800f3b38015e51296b5e814048d \ + --hash=sha256:fe3cca2e4e8a592be0f269a1ca4835c25199d9f3ce815c8491048f785b0a0198 \ + --hash=sha256:ffd0c5368496f41b0944be820fcb7a838aa6e623d250b01acf2643939c3f99d7 + # via matplotlib +plotly==5.24.1 \ + --hash=sha256:dbc8ac8339d248a4bcc36e08a5659bacfe1b079390b8953533f4eb22169b4bae \ + --hash=sha256:f67073a1e637eb0dc3e46324d9d51e2fe76e9727c892dde64ddf1e1b51f29089 + # via policyengine-core +pluggy==1.6.0 \ + --hash=sha256:7dcc130b76258d33b90f61b658791dede3486c3e6bfb003ee5c9bfb396dd22f3 \ + --hash=sha256:e920276dd6813095e9377c0bc5566d94c932c33b27a3e3945d8389c374dd4746 + # via pytest +policyengine-core==3.32.29 \ + --hash=sha256:30591ab05d676ef89aabf4ae4ca4544b0fe97dde4ab82233d487d88ded05fffc \ + --hash=sha256:526fbf4bc1592b4afd4b60df3d5572cfef3e00afb93fbc733940233d8a0310c4 + # via policyengine-us +policyengine-us==2.38.1 \ + --hash=sha256:1734d447d0fb7819aa9c0746e224baa6108ab6c44a20cf71e61f9e81470b7d2d \ + --hash=sha256:965baadc7e66fe5e5eca7b81e96128049c341ac49ac9f0bbeede8e19fdc7dc01 + # via policyengine-taxsim (pyproject.toml) +prompt-toolkit==3.0.53 \ + --hash=sha256:01c0891d7f9237d5e339f7d3e42cdae80b7534abb1c7c0e3352efba6231492f2 \ + --hash=sha256:9ec8a0ad96d5c56148b3f914aa79c1564c3fde5d2e6b876e7bc327e353cf8fa6 + # via ipython +psutil==6.1.1 \ + --hash=sha256:018aeae2af92d943fdf1da6b58665124897cfc94faa2ca92098838f83e1b1bca \ + --hash=sha256:0bdd4eab935276290ad3cb718e9809412895ca6b5b334f5a9111ee6d9aff9377 \ + --hash=sha256:1924e659d6c19c647e763e78670a05dbb7feaf44a0e9c94bf9e14dfc6ba50468 \ + --hash=sha256:33431e84fee02bc84ea36d9e2c4a6d395d479c9dd9bba2376c1f6ee8f3a4e0b3 \ + --hash=sha256:384636b1a64b47814437d1173be1427a7c83681b17a450bfc309a1953e329603 \ + --hash=sha256:6d4281f5bbca041e2292be3380ec56a9413b790579b8e593b1784499d0005dac \ + --hash=sha256:8be07491f6ebe1a693f17d4f11e69d0dc1811fa082736500f649f79df7735303 \ + --hash=sha256:8df0178ba8a9e5bc84fed9cfa61d54601b371fbec5c8eebad27575f1e105c0d4 \ + --hash=sha256:97f7cb9921fbec4904f522d972f0c0e1f4fabbdd4e0287813b21215074a0f160 \ + --hash=sha256:9ccc4316f24409159897799b83004cb1e24f9819b0dcf9c0b68bdcb6cefee6a8 \ + --hash=sha256:b6e06c20c05fe95a3d7302d74e7097756d4ba1247975ad6905441ae1b5b66003 \ + --hash=sha256:c777eb75bb33c47377c9af68f30e9f11bc78e0f07fbf907be4a5d70b2fe5f030 \ + --hash=sha256:ca9609c77ea3b8481ab005da74ed894035936223422dc591d6772b147421f777 \ + --hash=sha256:cf8496728c18f2d0b45198f06895be52f36611711746b7f30c464b422b50e2f5 \ + --hash=sha256:eaa912e0b11848c4d9279a93d7e2783df352b082f40111e078388701fd479e53 \ + --hash=sha256:f35cfccb065fff93529d2afb4a2e89e363fe63ca1e4a5da22b603a85833c2649 \ + --hash=sha256:fc0ed7fe2231a444fc219b9c42d0376e0a9a1a72f16c5cfa0f68d19f1a0663e8 + # via policyengine-core +ptyprocess==0.7.0 \ + --hash=sha256:4b41f3967fce3af57cc7e94b888626c18bf37a083e3651ca8feeb66d492fef35 \ + --hash=sha256:5c5d0a3b48ceee0b48485e0c26037c0acd7d29765ca3fbb5cb3831d347423220 + # via pexpect +pure-eval==0.2.4 \ + --hash=sha256:260c2774686e651b79f8b8e7fc9d80b3599ea6a66334b47d5f4abb69fc2c0ea1 \ + --hash=sha256:96cae060a313cfaad51bb761278bfb0e62dc0248d9315a81173752dc546cd37a + # via stack-data +py-cpuinfo==9.0.0 \ + --hash=sha256:3cdbbf3fac90dc6f118bfd64384f309edeadd902d7c8fb17f02ffa1fc3f49690 \ + --hash=sha256:859625bc251f64e21f077d099d4162689c762b5d6a4c3c97553d56241c9674d5 + # via tables +pydantic==2.14.0 \ + --hash=sha256:15fab1bea6f1dc5003b54fc2ecab230c1fd1dbade2acd4addc52d81e32416d4b \ + --hash=sha256:8a51a7aaddd60f55566d1f07bdd87b92b463903f39a8f26b71a06314cd1548ae + # via blosc2 +pydantic-core==2.50.0 \ + --hash=sha256:00963fde61cf8880d9e7b5635a9830e0591edfa45168447fdc5b47635c0f6437 \ + --hash=sha256:01340f4fbb4f854b1f36a6fe9dcd2b26c8936aead4e4ad1205624ac025c875fc \ + --hash=sha256:02ec3675d606a355523e1c52bf5aa4116776f8d273dba03d8336a5a3ae984e15 \ + --hash=sha256:031867348c98ab49c6d3a16ad39738369ea48da59900d76d71c1e64de71fe79b \ + --hash=sha256:0393763d66f6f61715488d074a2cefac04aeb3ee281e36fb4925dd44deaf9e17 \ + --hash=sha256:049b0404792dcb942f1092bfdae5f819ef30445b0d174782e1909fbdd91bb48b \ + --hash=sha256:0abe1b44d361b948404b6b2ed80be2583e0077340572e071afa6e0eda4e1de30 \ + --hash=sha256:0def1dc09802a790e4a1b3cbc4401f0b53c58f273ce3671df9867f7bdf1fbe20 \ + --hash=sha256:0fdeda6272d60b1f6fb63f6a3dade55e274af62e1514d24a6549a12150c385cc \ + --hash=sha256:1541c334af5d42cb9eb03862a9b4d2cfbfc670fd05172ec51f3ce02d704550f1 \ + --hash=sha256:158749408ee19682b8a2a7e7135cced7f41d6f2f9de96088b1b1609858a6a158 \ + --hash=sha256:1751e92d56fbb623b937d73985e500b1a2b1053e56f718a6c564660d99bb9cb0 \ + --hash=sha256:1773001198030e16f946a7ff7760fc3ebd45b12150f66fd0f433780043dc13d8 \ + --hash=sha256:17a5ca9c197788a6424749a09a3dce824cb2c17b72f835f8a5e330935b973609 \ + --hash=sha256:1bbd7da16d8b2912cc56c9d0b85c4998a6cbf39b220f81c0d8c397c64672ae0e \ + --hash=sha256:2092ce156f92aff17e3345baba2b7c0c1701f32ba922c5de71bd6248fbe164e3 \ + --hash=sha256:21b62d45f327eb0802f842c132fda6d01a8376a8077922dc4dda69011c64d34a \ + --hash=sha256:21e38a011783d8afc8b9d79928e273d06f349b52ae84edf63ec18ad07f077484 \ + --hash=sha256:23e0940b7d73f405d92e98b2a05b93b16db163be13b7478bb19e1db2e486ade6 \ + --hash=sha256:24302bf47319a64e5c5c7c29e971d2b7a20a190c64e59035a3df9582dec636fa \ + --hash=sha256:243088c95e23b12db9f2cd7661d584a3f00814e087489f40cde7f9feac56b694 \ + --hash=sha256:2568b190075acd058513dca34f7fddc7252fc958c1591cb67a554338fc9a81b2 \ + --hash=sha256:2918547195ffb20118b829fdb8938e9dc92c9527fe6cbe58572594c96362880e \ + --hash=sha256:2f28a5a299d4cefd1066a6883d22600b9ae3606f881c3015d255784634647580 \ + --hash=sha256:34a4a0938eb30931baca56e55786c5a6871ac7aa891a38c8cabcdb7e49dab91b \ + --hash=sha256:350001f5573451150d919722ee095aa28bec037d6e23b86d7f04581a910fe924 \ + --hash=sha256:364f62d8024997536e57865cb1c8b36effad3249bf392a29a2379ea69db28238 \ + --hash=sha256:36c49d4e1769127461b609f110d91963790091ffcc2de401ac1d3b2f6a63bd54 \ + --hash=sha256:36f9ed6ae1069913e4f6e86d8233e119e83e00a20c54f88faf9c81292f2fecc0 \ + --hash=sha256:38b03c5439c6a7a952f56e3e6596dae44bc78c3fb6a69df46cabfb2f888e5f0c \ + --hash=sha256:3b2f3e44af4c6512dd73557621385a71b18094c8be81d60e5a8e73a8ce96b7f4 \ + --hash=sha256:3fce74add1099da1ea09473268950270071fd56773e2968604efb3ab1d240e02 \ + --hash=sha256:41b9f2821f0a105f88cd54ad03fe1392ec600618ffa8610f7c5e466ecd98c531 \ + --hash=sha256:42a56b0052ac11d9d0d87b1c94a1ce52e31914fd133f269585e0f63a4ed988f2 \ + --hash=sha256:42fff617cb0b08505d8123d71e6e7a8e54210d9007498f564855bd843ce984b1 \ + --hash=sha256:468f7e67cfbd8231f442af6726449efe46f2be0e5a57b44fba7ccd92c6f121c4 \ + --hash=sha256:4b1bae96f41806b14dd8bb1568d39b5e33b5af7fb27f7be36c78b8fa84708917 \ + --hash=sha256:4f31af62efd1fd0257735b72e6716b32d4f207654adeabfe524d44baf1bb6bed \ + --hash=sha256:4f96ccd9368ecbf6685d8f6981584ab72b4f0ffd20685e747737e7e340277b8d \ + --hash=sha256:4faa766450ef44d9eabed5b65a280f63f903d1e1ed6d2e278961eb22345ec49f \ + --hash=sha256:50920d66aaab60dbc6023c3035d55fbabfa58b6d205d0b39d47d820c4a7a13a8 \ + --hash=sha256:5307a8bd49158b57a0ca4e10950d31085aa35d9007e934047043ccc6d28eea97 \ + --hash=sha256:55684bc850059fc85ff8dc21a3e342b722d3178993c49ebdfdee8b698a432720 \ + --hash=sha256:56178c4116fc0c859786875ff4acc1c8d52678f095c312b0eff2a2dd9d6f8d5f \ + --hash=sha256:57c0e5b26d82bf31ab2b044781527b1b1a36e9ed400856b6aca5097eb1abb909 \ + --hash=sha256:586699b43066ca6038f96bd71d0eff0b6c292929e3d66ff63d5dc79d0f06d589 \ + --hash=sha256:588d309ce5c85448379556d72011b191c0414ee2e80d7c3f1ebe2ceb2d9027b1 \ + --hash=sha256:593dd4f24abeb3ed90222f98bc6eefcac68cd5aa96fc7745f93862a802952bce \ + --hash=sha256:59f816dc04e99627a5a6352ae51dfb30e603f2cb0b7009c91dc640c533def014 \ + --hash=sha256:5a07c644047f5abc268b4c39f8cb5a30e08a3c349228cb70142c7d3ed87587c0 \ + --hash=sha256:5a8403eef4a66743e339102fb3cdd8c8b9016b8bd67924685893d062c88896f9 \ + --hash=sha256:5d0b210c871486f5acb56d87bf00e3c5d83aab6a1ef3042629fa6ae0172fcf47 \ + --hash=sha256:5dbf9f18c8af11db719e67633be0af556d7d765bee0ca9419bd706fe4b7ed9fe \ + --hash=sha256:610e9f483ac53c5cc59c2d3687224029b54eb494feec2d40a2bcfdd187635192 \ + --hash=sha256:62a93a9d206a3580c975c3c1f65a869cd063844d016c004f8d786a9309b3c591 \ + --hash=sha256:62ec6568896e0abf258cbcd22c406c1c8bf27d16224b21bec8f75c4ae88a8173 \ + --hash=sha256:63263d64884688554fb025a3906c7b00573980cfee75f9afeb86239d577384bc \ + --hash=sha256:68421ba548f6d86c7dededd70bfe530b4faf67eb811c53c70a1be69438d3ce99 \ + --hash=sha256:6e1ec4176c3b56017745937dfd4a3ec6df55f7f0e66991124499f3f79f8f8d1f \ + --hash=sha256:70df7ff903aea05383298715ea53551c8f27c8f70cbe54ba7f05606cd822e7e4 \ + --hash=sha256:71061800a3c225e730f7997f8a7fad6e0d0dcbe36609cdc7e60576a099a2832b \ + --hash=sha256:718d05d4e078c7828f40ad3e310870fe4b837d93a32e7e8497a080c1f1040490 \ + --hash=sha256:732efbb50977ab7cf18f01d4c255834aeb14cb2425459f7bff681a1ba3a4ffa1 \ + --hash=sha256:74cbb6cbd74445ca279668790e0c10eccac0428fd79fe061fce6c9e3982ad3fe \ + --hash=sha256:753863dd4317ec8cc9eb3e6d9d01a8ef1a1726a8003b4354658d68a1ae05f9db \ + --hash=sha256:75b451ec5e64a1d4b803317f34710131742ff2e42f4bf5403f597d0af857d7d8 \ + --hash=sha256:779b6c74526596a86d38248dedaecfb7851bbaf319c234be042c57acddd2c8c4 \ + --hash=sha256:7987866a2569396e6765c54d643fd6a7b3b234e89ee8d45a3729a7b4b2726145 \ + --hash=sha256:79e8fc9c135ef628c45cb8aa5deef8d21de13d33bb4c59a859fa73d335ceb40a \ + --hash=sha256:7eee44c3f1f8acc220a743a5ed5588949a4f18b33df4cfbef2b1277470285401 \ + --hash=sha256:8447678b49412294801c9ea15ae31ea3bae7da65425268c92d40e032c38eac6f \ + --hash=sha256:84d2d38f7d163c4dec292f379e9de1960c661795442aca6c90d706436cb3749e \ + --hash=sha256:8ab9e74878172948e0426e3d27fba333fd6a1c3f9456d8e75643e8e6868ac1a1 \ + --hash=sha256:8ad8dad549cd1645be591a50b4573995ee7e018f6619ddc2bc6ea44b2ad9f694 \ + --hash=sha256:8b16e164205a90b1050d2f5469f8a7829db7698ad198c69e6aab6cbfb5648b87 \ + --hash=sha256:8f16bc5bb12f4c581b0f40facc28dbf286db32d1bf4e7e4f4c4e0f7f4e34ecf9 \ + --hash=sha256:8facaf0a16121ac82cc403a71399a061b74624c1ae2034eec9ed6169c5d16ecb \ + --hash=sha256:90874428bc6678b26434336c77931c9734ecebedf50132c179205e5a9908761d \ + --hash=sha256:92016718bcf3e6f35a6bd986880191a8da7a35aa1f5b1e97544582ef938464cf \ + --hash=sha256:9279f4be22bc3765dd9f61f5b4d38d9cb219d167bbd6f2e0ffa3368b1b71b4d1 \ + --hash=sha256:933f2d639eb81a3e1f145aec415453cc00983236629933f028d9507222583a2e \ + --hash=sha256:93502b3c762149a5904316ef52f0ed1ea721e0f4c8431f964f140ed15fa61926 \ + --hash=sha256:955d7878130dfc124d6a5343e1b87d2933244fe14a4a0a3e98787e8e660a8eb4 \ + --hash=sha256:980c81c2ec53ea9eb2227c14b3e6de35670b2de163b638f2a803e90a3bd5bbb0 \ + --hash=sha256:99e203d5c2a814facef78dcd993b0fb7a933124a3475a38979fc09cceae210b7 \ + --hash=sha256:a2b88f9f9fa52e1c34938ff1a18ee7fbffe482df0bb43c087a9a60578d273d68 \ + --hash=sha256:a3e8ee6386f6b68e2f818ccf422ccfafc59bcff10862b52c7819db3aa0352dfc \ + --hash=sha256:a7080928078ff56c07da393392f772054e93a39c8033dc9c04547bd949f9b614 \ + --hash=sha256:a8ee3965e01f10e4ff92ba1727626328ab7ba93bcd5674ff2b78ea1048ee0cea \ + --hash=sha256:ab3f95f737fc1b258b8210308fc02ce1442cf5950cf6d30b09ad89ab9e8afebd \ + --hash=sha256:ac223ea031905319a64d0df116979ae438b42d6265862a3d63c9f9808c2905a7 \ + --hash=sha256:ad3532291deedfdfcad3cf5d351d0076d646c68a0c63869a1bebf87c22159600 \ + --hash=sha256:ad9185366893714cd4514ae5e1a098227704fa395cb41a7855d75968ecedc826 \ + --hash=sha256:ae45853d25a23fba56681d2f9ed41f3e3f12f0a3b2393fefa08ff6406320a1f5 \ + --hash=sha256:af2b808a79bb04075e87c81a5b6179365b93f9a851f29dafd67abff72085d0c8 \ + --hash=sha256:b123f9d8702106f39dc3af63a031ca8b5279862a3747ec6c03ca49dbe78b71b9 \ + --hash=sha256:b1399f918aea8fb76ffa99b474c9b768accea1f079fde407ee538bec89f20fa7 \ + --hash=sha256:b916ff828d604d4311a5639b7b3da51eaea3923833ec3e300a5ee35eade99691 \ + --hash=sha256:b9be297ffe1015bfb2db4a23b6e1fec7e48361cf7c7b4f4f6bbdd008451b0a7b \ + --hash=sha256:bc87bd34239835c8d73171acd039e591cea0a2ca8615e6188044ad170a40fca1 \ + --hash=sha256:bd841dcf394ff261c26763a9d7be754176d4f1e6d26cb2a5d5331e91b6b56a5f \ + --hash=sha256:bdd70c2d9e73bca09fad54605dfeaae2b4e770b2800c65f5f5342901ed567b9f \ + --hash=sha256:c05b75ef3574c9ee4e05bbcf8513f7ccb155d426514be9efef5f6f53152d5f5c \ + --hash=sha256:c05d035e72530f6b00297941b0162218601542b76870c3bf2756bd87f16fc538 \ + --hash=sha256:c19500343957f254ecf3e60174f4a4cdd21690e0e1677740a8017d28ab2a2a4b \ + --hash=sha256:c21e6a6e4e6d32fb6acbc4f0fa69e8319cac0d65eeaa8298d757371cc2a9c687 \ + --hash=sha256:c2b246fa7cbdf9918488d1542a82bbb928cf71bcba66905c24131981e759ff0b \ + --hash=sha256:c2e97985641fe53ad7824d1b5bfeb7990a5ff788c4559ee44d7522642560ddc2 \ + --hash=sha256:c3ae59461625518449f800acc4f874753ae96fcf993c47a27be07beb651371fd \ + --hash=sha256:c4abc425789f8540e86ca4cfdbc8dc650433cc2ac7c6136fee9bcb29d5665a02 \ + --hash=sha256:cb4fcaabb28cabf21396a9b816b9afe091f8c776805fdf03e2cbc606b64dfa7c \ + --hash=sha256:cbce1b5a2a88a465d7865df61b7e4f8829ddc49b4fa841e9b241815c9d67c3b2 \ + --hash=sha256:cf150693a51ca21e8288cd08a9de05e5ab331776dfcfd0537b14523338f0502a \ + --hash=sha256:cf81432281af66ba3285b26b09c2d478d84730dc50ff90926c1bdcef54048a33 \ + --hash=sha256:d01029d54ff1f45c195b1f7e6fbf6e58fb7e7e12cda9a6e639570d9c581decb2 \ + --hash=sha256:d06dbbfe8da01a0574de27afc19915bb3e7dddfbd184bb97e958f94051d8531b \ + --hash=sha256:d14d04058923d526a552fc3ebe8b0b0353c19516431cee196502b53119278fd9 \ + --hash=sha256:d187f43d1c5b844adc871c5b8c22b4aa12a116aaca4e9bd1521bc9ce479aae1f \ + --hash=sha256:d1d084e92d0f4a096a5155b23d1ac603db8073ef98a3d1384badf1455e5ae742 \ + --hash=sha256:d8354fbbe2abf0fb724b9303bef43bfd9b7a2779332813fa6d6559983954e7d8 \ + --hash=sha256:dcbd1fe5083315243447c13f7252ae9fe9d128b1ae2857e3a916c609235dd863 \ + --hash=sha256:dec0dafc116ac29a84d143fdbc3b83fdb5d4ed339276be2251154537ab30e14d \ + --hash=sha256:e15bb1535f68a27f28e579ba3a8f74e7b05d350c45f5622b76a311d5a19ae48a \ + --hash=sha256:e41f9d1d9240e8e0d8a670ad3e66c0c00f0b1f7150a31bc6c445a4f87c1cb3ba \ + --hash=sha256:e58acd43ac8d3905659c1d5309318dd576243e723dd7c3b5dd4f555479b77d4b \ + --hash=sha256:eadf95aab7301ac651628f097e521d742d0fb5f732155ebfd00d07933045d81c \ + --hash=sha256:ec786cb9d597dd75d993f8c1273e31bb2114c9bc22f67fba611e654e8347701b \ + --hash=sha256:ed557fa2744617eac3e34dd39b85037efbf23cd33f06851c00fdb8f18ad8f4c2 \ + --hash=sha256:ee9913fa2b5bfa6111c11158cf481bb13544f8bd5d10382fb6ee2612b16fcf28 \ + --hash=sha256:f0af2d2f745ec00a6616c4dfba4477f9156ccfb45690f6ffa5fd34f42e871ed4 \ + --hash=sha256:f12d9690634414fc04b1a7072fdc35c34a9242232c1851fe4518383578bb09d4 \ + --hash=sha256:f187030fc3d62c668feb0f09e92852e0eb414d7fcefc4748f2e67d245aade37e \ + --hash=sha256:f3abcabb04503023e1053add24472e78878de0bfd5c8a93686be01f4032c363c \ + --hash=sha256:f44107b5fdfecc03438feb165431652c8006650471326e53dd86d4c19124f5c5 \ + --hash=sha256:f517a417cd02aa8fb05b603a0ac6d87b7b004c3ba4fcd279cad25cab7229043b \ + --hash=sha256:f8cc61ad94215ab98e5cbcdea2cfde45e11bb0136ee980e1240b721635e55790 \ + --hash=sha256:f8df36f964c21168e345f914855e3b428e2cb6e1f739c8ef5963b77d86dd84ae + # via pydantic +pygments==2.21.0 \ + --hash=sha256:2363c69b61c4a97c838da3b130dcd6468f4848992b21a82f2a63ec34377137d9 \ + --hash=sha256:610ca751c9bc2492b38eb9a38a7fbc93edbbb2d7182edaf34e66ae493dee5c8c + # via + # ipython + # pytest + # rich +pyparsing==3.3.3 \ + --hash=sha256:928ae7e20211f3b6f3915a72f06a0cfd29ab9d24279dd6346b6b1a7146397d36 \ + --hash=sha256:ece8c00a69cf01b45d0b1dedabb469c90d8caf996d4fda40f147627a122849a4 + # via matplotlib +pytest==9.1.1 \ + --hash=sha256:1088fbde8f2b49d95a549a195707afa7a76a3ce9bcadc26b6d71f0ffda5fe313 \ + --hash=sha256:37a86b45efb9a47a61a36449063e8e18d0cab3161329fc099eb21783169c4f0c + # via policyengine-core +python-dateutil==2.9.0.post0 \ + --hash=sha256:37dd54208da7e1cd875388217d5e00ebd4179249f90fb72437e91a35459a0ad3 \ + --hash=sha256:a8b2bc7bffae282281c8140a97d3aa9c14da0b136dfe83f850eea9a5f7470427 + # via + # matplotlib + # pandas +pyvis==0.3.2 \ + --hash=sha256:5720c4ca8161dc5d9ab352015723abb7a8bb8fb443edeb07f7a322db34a97555 + # via policyengine-core +pyyaml==6.0.3 \ + --hash=sha256:00c4bdeba853cc34e7dd471f16b4114f4162dc03e6b7afcc2128711f0eca823c \ + --hash=sha256:0150219816b6a1fa26fb4699fb7daa9caf09eb1999f3b70fb6e786805e80375a \ + --hash=sha256:02893d100e99e03eda1c8fd5c441d8c60103fd175728e23e431db1b589cf5ab3 \ + --hash=sha256:02ea2dfa234451bbb8772601d7b8e426c2bfa197136796224e50e35a78777956 \ + --hash=sha256:0f29edc409a6392443abf94b9cf89ce99889a1dd5376d94316ae5145dfedd5d6 \ + --hash=sha256:10892704fc220243f5305762e276552a0395f7beb4dbf9b14ec8fd43b57f126c \ + --hash=sha256:16249ee61e95f858e83976573de0f5b2893b3677ba71c9dd36b9cf8be9ac6d65 \ + --hash=sha256:1d37d57ad971609cf3c53ba6a7e365e40660e3be0e5175fa9f2365a379d6095a \ + --hash=sha256:1ebe39cb5fc479422b83de611d14e2c0d3bb2a18bbcb01f229ab3cfbd8fee7a0 \ + --hash=sha256:214ed4befebe12df36bcc8bc2b64b396ca31be9304b8f59e25c11cf94a4c033b \ + --hash=sha256:2283a07e2c21a2aa78d9c4442724ec1eb15f5e42a723b99cb3d822d48f5f7ad1 \ + --hash=sha256:22ba7cfcad58ef3ecddc7ed1db3409af68d023b7f940da23c6c2a1890976eda6 \ + --hash=sha256:27c0abcb4a5dac13684a37f76e701e054692a9b2d3064b70f5e4eb54810553d7 \ + --hash=sha256:28c8d926f98f432f88adc23edf2e6d4921ac26fb084b028c733d01868d19007e \ + --hash=sha256:2e71d11abed7344e42a8849600193d15b6def118602c4c176f748e4583246007 \ + --hash=sha256:34d5fcd24b8445fadc33f9cf348c1047101756fd760b4dacb5c3e99755703310 \ + --hash=sha256:37503bfbfc9d2c40b344d06b2199cf0e96e97957ab1c1b546fd4f87e53e5d3e4 \ + --hash=sha256:3c5677e12444c15717b902a5798264fa7909e41153cdf9ef7ad571b704a63dd9 \ + --hash=sha256:3ff07ec89bae51176c0549bc4c63aa6202991da2d9a6129d7aef7f1407d3f295 \ + --hash=sha256:41715c910c881bc081f1e8872880d3c650acf13dfa8214bad49ed4cede7c34ea \ + --hash=sha256:418cf3f2111bc80e0933b2cd8cd04f286338bb88bdc7bc8e6dd775ebde60b5e0 \ + --hash=sha256:44edc647873928551a01e7a563d7452ccdebee747728c1080d881d68af7b997e \ + --hash=sha256:4a2e8cebe2ff6ab7d1050ecd59c25d4c8bd7e6f400f5f82b96557ac0abafd0ac \ + --hash=sha256:4ad1906908f2f5ae4e5a8ddfce73c320c2a1429ec52eafd27138b7f1cbe341c9 \ + --hash=sha256:501a031947e3a9025ed4405a168e6ef5ae3126c59f90ce0cd6f2bfc477be31b7 \ + --hash=sha256:5190d403f121660ce8d1d2c1bb2ef1bd05b5f68533fc5c2ea899bd15f4399b35 \ + --hash=sha256:5498cd1645aa724a7c71c8f378eb29ebe23da2fc0d7a08071d89469bf1d2defb \ + --hash=sha256:5cf4e27da7e3fbed4d6c3d8e797387aaad68102272f8f9752883bc32d61cb87b \ + --hash=sha256:5e0b74767e5f8c593e8c9b5912019159ed0533c70051e9cce3e8b6aa699fcd69 \ + --hash=sha256:5ed875a24292240029e4483f9d4a4b8a1ae08843b9c54f43fcc11e404532a8a5 \ + --hash=sha256:5fcd34e47f6e0b794d17de1b4ff496c00986e1c83f7ab2fb8fcfe9616ff7477b \ + --hash=sha256:5fdec68f91a0c6739b380c83b951e2c72ac0197ace422360e6d5a959d8d97b2c \ + --hash=sha256:6344df0d5755a2c9a276d4473ae6b90647e216ab4757f8426893b5dd2ac3f369 \ + --hash=sha256:64386e5e707d03a7e172c0701abfb7e10f0fb753ee1d773128192742712a98fd \ + --hash=sha256:652cb6edd41e718550aad172851962662ff2681490a8a711af6a4d288dd96824 \ + --hash=sha256:66291b10affd76d76f54fad28e22e51719ef9ba22b29e1d7d03d6777a9174198 \ + --hash=sha256:66e1674c3ef6f541c35191caae2d429b967b99e02040f5ba928632d9a7f0f065 \ + --hash=sha256:6adc77889b628398debc7b65c073bcb99c4a0237b248cacaf3fe8a557563ef6c \ + --hash=sha256:79005a0d97d5ddabfeeea4cf676af11e647e41d81c9a7722a193022accdb6b7c \ + --hash=sha256:7c6610def4f163542a622a73fb39f534f8c101d690126992300bf3207eab9764 \ + --hash=sha256:7f047e29dcae44602496db43be01ad42fc6f1cc0d8cd6c83d342306c32270196 \ + --hash=sha256:8098f252adfa6c80ab48096053f512f2321f0b998f98150cea9bd23d83e1467b \ + --hash=sha256:850774a7879607d3a6f50d36d04f00ee69e7fc816450e5f7e58d7f17f1ae5c00 \ + --hash=sha256:8d1fab6bb153a416f9aeb4b8763bc0f22a5586065f86f7664fc23339fc1c1fac \ + --hash=sha256:8da9669d359f02c0b91ccc01cac4a67f16afec0dac22c2ad09f46bee0697eba8 \ + --hash=sha256:8dc52c23056b9ddd46818a57b78404882310fb473d63f17b07d5c40421e47f8e \ + --hash=sha256:9149cad251584d5fb4981be1ecde53a1ca46c891a79788c0df828d2f166bda28 \ + --hash=sha256:93dda82c9c22deb0a405ea4dc5f2d0cda384168e466364dec6255b293923b2f3 \ + --hash=sha256:96b533f0e99f6579b3d4d4995707cf36df9100d67e0c8303a0c55b27b5f99bc5 \ + --hash=sha256:9c57bb8c96f6d1808c030b1687b9b5fb476abaa47f0db9c0101f5e9f394e97f4 \ + --hash=sha256:9c7708761fccb9397fe64bbc0395abcae8c4bf7b0eac081e12b809bf47700d0b \ + --hash=sha256:9f3bfb4965eb874431221a3ff3fdcddc7e74e3b07799e0e84ca4a0f867d449bf \ + --hash=sha256:a33284e20b78bd4a18c8c2282d549d10bc8408a2a7ff57653c0cf0b9be0afce5 \ + --hash=sha256:a80cb027f6b349846a3bf6d73b5e95e782175e52f22108cfa17876aaeff93702 \ + --hash=sha256:b30236e45cf30d2b8e7b3e85881719e98507abed1011bf463a8fa23e9c3e98a8 \ + --hash=sha256:b3bc83488de33889877a0f2543ade9f70c67d66d9ebb4ac959502e12de895788 \ + --hash=sha256:b865addae83924361678b652338317d1bd7e79b1f4596f96b96c77a5a34b34da \ + --hash=sha256:b8bb0864c5a28024fac8a632c443c87c5aa6f215c0b126c449ae1a150412f31d \ + --hash=sha256:ba1cc08a7ccde2d2ec775841541641e4548226580ab850948cbfda66a1befcdc \ + --hash=sha256:bdb2c67c6c1390b63c6ff89f210c8fd09d9a1217a465701eac7316313c915e4c \ + --hash=sha256:c1ff362665ae507275af2853520967820d9124984e0f7466736aea23d8611fba \ + --hash=sha256:c2514fceb77bc5e7a2f7adfaa1feb2fb311607c9cb518dbc378688ec73d8292f \ + --hash=sha256:c3355370a2c156cffb25e876646f149d5d68f5e0a3ce86a5084dd0b64a994917 \ + --hash=sha256:c458b6d084f9b935061bc36216e8a69a7e293a2f1e68bf956dcd9e6cbcd143f5 \ + --hash=sha256:d0eae10f8159e8fdad514efdc92d74fd8d682c933a6dd088030f3834bc8e6b26 \ + --hash=sha256:d76623373421df22fb4cf8817020cbb7ef15c725b9d5e45f17e189bfc384190f \ + --hash=sha256:ebc55a14a21cb14062aa4162f906cd962b28e2e9ea38f9b4391244cd8de4ae0b \ + --hash=sha256:eda16858a3cab07b80edaf74336ece1f986ba330fdb8ee0d6c0d68fe82bc96be \ + --hash=sha256:ee2922902c45ae8ccada2c5b501ab86c36525b883eff4255313a253a3160861c \ + --hash=sha256:efd7b85f94a6f21e4932043973a7ba2613b059c4a000551892ac9f1d11f5baf3 \ + --hash=sha256:f7057c9a337546edc7973c0d3ba84ddcdf0daa14533c2065749c9075001090e6 \ + --hash=sha256:fa160448684b4e94d80416c0fa4aac48967a969efe22931448d853ada8baf926 \ + --hash=sha256:fc09d0aa354569bc501d4e787133afc08552722d3ab34836a80547331bb5d4a0 + # via + # policyengine-taxsim (pyproject.toml) + # huggingface-hub +requests==2.34.2 \ + --hash=sha256:2a0d60c172f83ac6ab31e4554906c0f3b3588d37b5cb939b1c061f4907e278e0 \ + --hash=sha256:f288924cae4e29463698d6d60bc6a4da69c89185ad1e0bcc4104f584e960b9ed + # via + # census + # policyengine-core + # spm-calculator +rich==15.0.0 \ + --hash=sha256:33bd4ef74232fb73fe9279a257718407f169c09b78a87ad3d296f548e27de0bb \ + --hash=sha256:edd07a4824c6b40189fb7ac9bc4c52536e9780fbbfbddf6f1e2502c31b068c36 + # via blosc2 +six==1.17.0 \ + --hash=sha256:4721f391ed90541fddacab5acf947aa0d3dc7d27b2e1e8eda2be8970586c3274 \ + --hash=sha256:ff70335d468e7eb6ec65b95b99d3a2836546063f63acc5171de367e834932a81 + # via python-dateutil +sortedcontainers==2.4.0 \ + --hash=sha256:25caa5a06cc30b6b83d11423433f65d1f9d76c4c6a0c90e3379eaa43b9bfdb88 \ + --hash=sha256:a163dcaede0f1c021485e957a39245190e74249897e2ae4b2aa38595db237ee0 + # via policyengine-core +spm-calculator==1.0.0.post1 \ + --hash=sha256:a9f99ce9a490989c40fa9a7d1bcd16dd544036e4788a0b3af4d170156ef9a168 \ + --hash=sha256:c9834a761891ba12de1edd585688c8b477be58e9a9c9fa92d9cfdf41e5396a41 + # via policyengine-us +stack-data==0.6.3 \ + --hash=sha256:836a778de4fec4dcd1dcd89ed8abff8a221f58308462e1c4aa2a3cf30148f0b9 \ + --hash=sha256:d5558e0c25a4cb0853cddad3d77da9891a08cb85dd9f9f91b9f8cd66e511e695 + # via ipython +standard-imghdr==3.13.0 \ + --hash=sha256:30a1bff5465605bb496f842a6ac3cc1f2131bf3025b0da28d4877d6d4b7cc8e9 \ + --hash=sha256:8d9c68058d882f6fc3542a8d39ef9ff94d2187dc90bd0c851e0902776b7b7a42 + # via policyengine-core +tables==3.11.1 \ + --hash=sha256:1e78fe190fdeb4afe430b79651bae2a4f341904eb85aa8dbafe5f1caee1c7f67 \ + --hash=sha256:3a9c35f87fcb6a48c79fbc4e3ab15ca8f6053c4ce13063d6ca2ec36cbb58f40f \ + --hash=sha256:4cf3218b76ba78d156d6ee75c19fb757d50682f6c7b4905370441afbfc9d77f3 \ + --hash=sha256:56bf6fb9132ead989b7e76695d7613d6d08f071a8019038d6565ba90c66b9f3e \ + --hash=sha256:78abcf413091bc7c1e4e8c10fbbb438d1ac0b5a87436c5b972c3e8253871b6fb \ + --hash=sha256:7fa6cb03f6fe55ae4f85e89ec5450e5c40cc4c52d8c3b60eb157a445c2219e89 \ + --hash=sha256:a4bbd95036a4d0cc5c86c1f87fbb490b4c53cd70982f1c01b3ed6dcb3085cbb9 \ + --hash=sha256:a6f7a3b82dbf0ae0f30de635ca88bb42dd87938b0950369d0ee4289c52ae6de2 \ + --hash=sha256:e3cfe79484351f7216eb8f3767bfa1217bfd271b04428f79cfa7ef6d7491919d \ + --hash=sha256:eb30684c42a77bbecdef2b9c763c4372b0ddc9cc5bd8b2a2055f2042eee67217 \ + --hash=sha256:f0367d2e3df0f10ea63ccf4279f3fe58e32ec481767320301a483e2b3cd83efc + # via policyengine-us +tenacity==9.2.1 \ + --hash=sha256:9e56f17539296baab7beabb08b92f6ee3d7be92d8be72d763360677c2ad6580e \ + --hash=sha256:a606b5c808d0cded4a359d5b9932d867ff2a6a6b64d37350260fd01bbdf83839 + # via plotly +threadpoolctl==3.7.0 \ + --hash=sha256:61348cfb77d53b9242e0017029244b559b810c142ced65b4e21eeca1843959a7 \ + --hash=sha256:cd8b60b5641b45c67bbf73c64c843235fc2d8a480c87389f52f5dbee893b86be + # via blosc2 +tqdm==4.70.1 \ + --hash=sha256:c293e525e6fef9c20e8728fd4612df02a0aa31bb5fe91ecd93e123b1b7bffa73 \ + --hash=sha256:cefd0eca11b2a37a3aee776544d4f4ae913f02688135b5556b8788dfa474afc4 + # via + # policyengine-taxsim (pyproject.toml) + # huggingface-hub + # policyengine-us +traitlets==5.16.1 \ + --hash=sha256:ed900c2b631aa3a112811139fa97b8d2c3bad5e989656bba4b7e52c7852c18c1 \ + --hash=sha256:f775618166caa0396c8e337099240f2bd3e5e917d203b2e6fbe21a58d3cb1f6b + # via + # ipython + # matplotlib-inline +truststore==0.10.4 \ + --hash=sha256:9d91bd436463ad5e4ee4aba766628dd6cd7010cf3e2461756b3303710eebc301 \ + --hash=sha256:adaeaecf1cbb5f4de3b1959b42d41f6fab57b2b1666adb59e89cb0b53361d981 + # via + # httpcore2 + # httpx2 +typing-extensions==4.16.0 \ + --hash=sha256:481caa481374e813c1b176ada14e97f1f67a4539ce9cfeb3f350d78d6370c2e8 \ + --hash=sha256:dc983d19a509c94dba722ee6abd33940f7c05a89e243c47e907eb4db6f1a43e5 + # via + # anyio + # httpx2 + # huggingface-hub + # pydantic + # pydantic-core + # typing-inspection +typing-inspection==0.4.4 \ + --hash=sha256:547274fa6b0a561ccf549cc9524b999a578e737d015d8709d021f9d0d13bea47 \ + --hash=sha256:65b8397ba37ccbce054456aaccddfc91e6e3083c92824df348d96ca832f3f147 + # via pydantic +urllib3==2.8.0 \ + --hash=sha256:0cf3cae568d36aa9576b28dfb35f11328f1cb974ca7647d9475ebb86c75ac6e3 \ + --hash=sha256:63bf2ead4c879426ebf22ef2a781eeb4aa3b4ae798a0435506f8687fd5bb9b63 + # via requests +us==4.0.0 \ + --hash=sha256:3e7dd072efc65ecc6f765ced861f49fe7635067e760bbe2a527f16e5477011c0 \ + --hash=sha256:7dd4c4e603c9427b72d7e07be700d8f643bdcd7f5195a12bc639f1b7e38e7496 + # via spm-calculator +wcwidth==0.9.2 \ + --hash=sha256:0a47e03d8293590ecce66c45dc20ff7b4b885e3c78093722239585eca0d77ab2 \ + --hash=sha256:0cd4f7f2e53905dcb110d213a4c8529b6733fa3d232d8c717f946cc69a10349b \ + --hash=sha256:138e1f8898e431b2f2d7881f8ca8d75591c1d3c21aa53f54e989bd6b39811da2 \ + --hash=sha256:196b47cf32f9df27ccda6dc513237f3c2429c4c659db428d60a5bc443d10f270 \ + --hash=sha256:1bf361c8705576760623b4724ae564666d73b016f9a778bcfd1c7345378ef4ec \ + --hash=sha256:2a9746de704242bd4fdaabb31dd46b82f694a56a8d21081ad89b679a89da9fec \ + --hash=sha256:33df042f96c61ed3cd5fb3742fba427553a635bc578799857a48aa79f774a0b9 \ + --hash=sha256:42dbcb76ce8af39e2c9db410ac3f9bdf4e47eb41d6f44525952f172d3d98f724 \ + --hash=sha256:48719a9bc76c2f84238693fe5013571fa5beffa3621cf228f1f3a9e30dae84b8 \ + --hash=sha256:5175609bf8cc7398a5f48aa35207bd64ebf9f45e4c70df65f7fdc7a988041a3c \ + --hash=sha256:59dab4049cbd982b478bca098528df2c79a9160636a3a163ffebffcbd7d1b892 \ + --hash=sha256:674b518af28d38ee645ff97b74f5760abee5fad4bac74413bfc4b881ef2ce724 \ + --hash=sha256:67d901a4ad99249eb775b4ee4769ca97fa405d35a75f46e83166910a47003f04 \ + --hash=sha256:734aa9405b321d1042301aa19c943c4731ee9e3460e4f8feea3299c064c97a14 \ + --hash=sha256:751bef0ab404b6a1dc028b56b4b85d46486be1c55833f80da533e42dc691f389 \ + --hash=sha256:7ef5a940bd5e30bac6e721f1a48fce0cd7bb3ece19e9c5d139e72c76c35cfd07 \ + --hash=sha256:89ca642c5bf0101157a09366be69fad0379db1f700ae39a920e103234573670e \ + --hash=sha256:8b4e381590b9b7390e07e22b2c0c1bb96ce50e1d2243c866d9387600362d51ed \ + --hash=sha256:97b878d1e158da5ed9ac5aac53fa3a55e282103af6a09ec353865613d1a31a76 \ + --hash=sha256:9e542f1f8475b78452a295495d7a5bc3ead565112e9446a64dc93462a41c2a79 \ + --hash=sha256:ae0800c5339423cc53d33a266ad264b42ba8aaa16d4464f6e6b1bee607f50b17 \ + --hash=sha256:ae0ef90b90f6af38b54f1fe6d58662ec33b3cb4b8391958a62416d654231727b \ + --hash=sha256:b9c6ab615e03723b7f8760ea2f27758d656e7e13b51515c9dca5c3e8b04612fa \ + --hash=sha256:bb08ceb501d6aaf94066c3ee122dd825b152df40ff0bd0df4dc27126233b948e \ + --hash=sha256:c3d80f39ba4653a595edae9aa46a509d14883790a8fc23c5db221ceb207f64b7 \ + --hash=sha256:e5f669ae8c3d969c72032f9cdee019674b666e522d45e1e2099a2e9dda4a341d \ + --hash=sha256:eda88ffdc97c0fbf193d407114f2c7a54b379f67f6e52a7531ee3b9fe749eca7 \ + --hash=sha256:ee1fd0db9d9fd711a70f3e7765e0e04c05d26982fa05361456163062549d7da4 \ + --hash=sha256:f2f7b3bba5a5d5f31fc350fd36ce5b84b693c83b7eb95ee630b720da5a5ce06f + # via prompt-toolkit +wheel==0.48.0 \ + --hash=sha256:3217dcc807155e45db462d7ef2431f5ddda0d7273b700d05a67b271ceb1287ab \ + --hash=sha256:94800765601e9171bf5d58d066e640662842bcedcbab982b2c90787a2c987322 + # via policyengine-core diff --git a/docs/dependencies/requirements-py3.13.txt b/docs/dependencies/requirements-py3.13.txt new file mode 100644 index 000000000..ba4d5147f --- /dev/null +++ b/docs/dependencies/requirements-py3.13.txt @@ -0,0 +1,1875 @@ +# This file was autogenerated by uv via the following command: +# uv pip compile pyproject.toml --python-version 3.13 --python-platform x86_64-manylinux_2_28 --exclude-newer 2026-10-09T19:00:00Z --generate-hashes -o docs/dependencies/requirements-py3.13.txt +annotated-types==0.8.0 \ + --hash=sha256:13b2beaad985e05e2d6407ee4c4f35590b11f8d693a258a561055cac8f64cab7 \ + --hash=sha256:f072f4d804ea359e4eaf198b1af7a8b0943881a87f31bb764f8bf219bb9419e0 + # via pydantic +anyio==4.15.1 \ + --hash=sha256:6152fdbbf9a77fdec97731721bebf7c4c44f7c29b424b0065826173efc7ed101 \ + --hash=sha256:9f28306018cbd6d329e64a36d58256edff76dd996fe423bc957326e578b82a94 + # via + # httpx + # httpx2 +asttokens==3.0.2 \ + --hash=sha256:3ecdbd8f2cc195f53ccada3a613538bb5f9ef6f6869129f13e03c30a677b8fe2 \ + --hash=sha256:9da13157f5b28becde0bd374fc677dcd3c290614264eff096f167c469cd9f933 + # via stack-data +blosc2==4.14.1 \ + --hash=sha256:033e62c56e2815f34900739bd505c750377743657e76cea6ea438c30273767e7 \ + --hash=sha256:08e09c372b3aae159c012c96940694574793b5a00abe3a5bac966c11c88e641e \ + --hash=sha256:3458922f59b6a4b6f5be50192e455647ed3145bd3078c3c77e091b6ac8b64bd2 \ + --hash=sha256:411d9fa31c559f0b016c16611101ccd0e03d38dc89ab1bc94178aa3757ce756a \ + --hash=sha256:439720cca5191a820bba415d076f9440f64b2af84983d3916d7d795dfa27d662 \ + --hash=sha256:575977165dd49b9492d506585e5a2e67a2c6e0f0d450f5a29a9ea3df9a2a53fe \ + --hash=sha256:5d37f2c76272fb6d0ffee3afbbaa4cd73438abd7e2c119d6152bcdf1d47434b3 \ + --hash=sha256:61fcbbdd8b9b8b73e80f0cb363b544ac1ccce0ca7d93087bbf3fa786120455b0 \ + --hash=sha256:696fdfc471191679e6c1b3b2d5db4ae7cc40675e10997d0b5eb6caf7d470253e \ + --hash=sha256:6a2208f001580d497a050aba1a4083d5ba54adbe1e166cee4faf4731f0e96c9a \ + --hash=sha256:7555f3785ff05be952b9cd5f2474764457f1568fcea2bd221d0254f199b61e58 \ + --hash=sha256:783be978d3abd03299922e33a595aa0cca706152aa6fddc95b42472671d495cf \ + --hash=sha256:79b7c096401f75bea1a0f24b28aa8e783cf6c10178cf077f9260a022abb7b245 \ + --hash=sha256:8e0ad358a9fb38d41b0bd1dd08b00f1384774940abd053a74f7e8a80af095a07 \ + --hash=sha256:8e402a0b1caa407e87dc4fc230ccce0f89abe86b3f54c74feff025008327f627 \ + --hash=sha256:94c1e518ee23f4423be80dc7fa16e405364afaefe074472d05785eccd17c56bd \ + --hash=sha256:aec524576f3241f1e411d47e586421e1947c274cd7c715da83b65a81e2c52ead \ + --hash=sha256:b5adb408854260acf64aca5c351ab1307bcb7c71d112e3049d8541c1e2f9b222 \ + --hash=sha256:d2748625f152b66ddfce2f6fe079e22e12179dfe960dff7898838d3ef25776ca \ + --hash=sha256:d5e65efe80740651c3b39a9fd98478f073c57bed51f7eebe1fdfe248dc259e37 \ + --hash=sha256:fb2960ff411e2c1cffa6209932b5ee344fb46208906c3de79e8f23531df82e8a + # via tables +census==0.8.27 \ + --hash=sha256:207aae0f83650004f6b7dab6a730b6a60df96a119f55167260c3153313f15a32 \ + --hash=sha256:6ef36f5d2e7759824e28051bc2c7fa0706d41e153ccb353a6c2d4d9eb354cd7e + # via spm-calculator +certifi==2026.7.22 \ + --hash=sha256:62f22742b58a1a33014a2b6b706588a8d7e2a88ae7bd1a6ebe8c992928483775 \ + --hash=sha256:741e2c3b351ddf169a738da9f2c048608ff7f2c5cc02f1ebc6b118bb090d5d55 + # via + # httpcore + # httpx + # requests +charset-normalizer==3.5.2 \ + --hash=sha256:01077390b03f7988f11d700a2194e69b119741a86b1a638b1db88891e3eced8e \ + --hash=sha256:01b0c0d2262a9e28e8484a278c7e1b5d650e3ac8cf2683d2967e25899f208bdf \ + --hash=sha256:04851f73ae72b8413dddadb16a49dfee95263553741fd42d546f7d66907e6be5 \ + --hash=sha256:0521c5665880b33d603717defa76c094048900010897909952397feb3039da56 \ + --hash=sha256:0774bf9bf620249fee3e0b8b9fd3065de213be30f3aa94ce2494b3b638949e26 \ + --hash=sha256:0891b9d3903c5571c03771ca669a4b0ec5618ca722a5c957d3d29cd4e5062848 \ + --hash=sha256:0c951d5e6dd9c2ff60609476752bee49da4206adde960ebc247766937f72e718 \ + --hash=sha256:0fed1d06615f022ee3b13caf5e8b180cfea32bb2c5aded8a9d44277afc040f93 \ + --hash=sha256:114e4d0c92d618409ed82a99e22b5c5e768fe995f2973f78265f4524f49d4640 \ + --hash=sha256:11912e4bb14baae7c5d8791aa55ba0a3a03ec6729073307b0f57270abaa713d3 \ + --hash=sha256:11a4d68a6ecda3292cb1e50239e111543ba5d709bb62a6b4ea1afcfa729d8875 \ + --hash=sha256:124fbf1a8ff966d87ae05bb8bd45a71f966055ed8bba320d0c7cf450bc5f4d0e \ + --hash=sha256:1461ac396c4fdb983a675f20aa555624f0ee18ac83d832b9244ffff3d8055275 \ + --hash=sha256:1503bccbeb36d5527790c3930327704c39af22de3112f1b1666a9f3ce15ee204 \ + --hash=sha256:15bb4005af6320d259dc7593ca84a38d7fe06a421dbcf7b910ae23979101e787 \ + --hash=sha256:15c44f7edfd477b06f517a5cc317fc1707edb9de2c865f43d4b6513907473234 \ + --hash=sha256:16fa0eccf81304b79c5cd87f9271c3b85dd9dd99245e4422ae9c0dd45e0f99d3 \ + --hash=sha256:183b88127acdb4fabe59d951ab424faf1af7b63cdbb5f776186c1ea2ffcaed98 \ + --hash=sha256:195c26fb65950f8fce54e26349852b7bdd7c5f120aeefbcc440b8a20faaed4a3 \ + --hash=sha256:1afb975bd5d68d5ce9f6b6d44fdf2f7e34b895a35e95708a7a91b20a3b51d187 \ + --hash=sha256:1b4cbc7c3491ccb4aa17fcd8165649d01cf39f76de1696da8631b5f71b85401d \ + --hash=sha256:1bc0baf5ef96b6ede57d47f4b8fe4d9d84019c3bfcbeb20a41edc6a6ee341f1f \ + --hash=sha256:1c50fe28bbc2ced33386f298650d91218076c05420e6cbd790b913adc41659e7 \ + --hash=sha256:1db38f4c5496827c1a501846d64d14c3b80c7e6714e406cd7dc36a9899fa1011 \ + --hash=sha256:211d5a3eb6af8f513b8d4ca19a8c1b7accab1b5f0d3175f9826b03c1a920dc1f \ + --hash=sha256:23851fb4e1b85ed3f6c2a27b777cdfe2e19fb5b38429a8faf38c7542b7665869 \ + --hash=sha256:254eb48b9fa5ee9898a3c445825a1f340fe53712a098904b39b0bddba8ea3cb1 \ + --hash=sha256:2625388c6c754520c37abaf3b41eb34d1cc4a373f457898f08606c8e362b891d \ + --hash=sha256:281cb91036248400f4cc957495cccd44c275c2e0c5854f7e45ac5cf7dc193847 \ + --hash=sha256:28a15fdad492a99b6eccfaaed66ef3f74050680545ea61ec8b2f4c538f1f1320 \ + --hash=sha256:28b4f0d66fb834ff90f28209ac7bce77868c45d8c93e26f906709d9b7c2e1af9 \ + --hash=sha256:2a925889534b3748302dae5dead07cc13480de1dac3aea80a941b729b471ef93 \ + --hash=sha256:2b7b3bbfb4fe8ef40600792d762fbaa9057559f9d3fad209525b7a22b99e91fd \ + --hash=sha256:2c9ad19a6cfcd5ea5c0d41161d22f9df1dcc277e9bef2751391334546a314c00 \ + --hash=sha256:2cc961b171b3f3440f410489ab3573e86aea8736134ebbb40ea1338b7f0831bc \ + --hash=sha256:2ce45c6627b22c47e390bc91a41c3d13032192e699fa0bea96e9671b373d69b0 \ + --hash=sha256:2e06a3a98f916dd41d27f3105e02e7a40181c98c94b9158733d03a6f80506c09 \ + --hash=sha256:304d5463e65a35d7bb0850550e0780395395f6fcf452f04db7d5ca7cecc425ac \ + --hash=sha256:304d8e4d493af723536393eee0c689eb7813f4a474c8b479dee63f1fdd98f621 \ + --hash=sha256:30fcd120b732aa79317f08dee04d7de0847822e4cf7ee0e9f445bb958832252c \ + --hash=sha256:31f3930700408d211f13378ccbe1c40845d8da54bd0681fac3a9b5aae81c7aa8 \ + --hash=sha256:34276fd796040bf0993ab33a369aa572e6979c7aab225a88893667ad8eac8f7a \ + --hash=sha256:355ad8011081dec5412240c087a9a0c9d4d5039f3ed11a3f13e18c2b29b56c51 \ + --hash=sha256:38a873987f3be698494da8b2e3085e29da02da7b633dce73e79c699a113d7bf0 \ + --hash=sha256:39de2a259fc954455c57274dc94c79d5842774e1247a016aff30bc0efed0f4ef \ + --hash=sha256:3d14b50de6bf4d0edf857a9386836846f982b8f524e188e2e68b96d702bcf4aa \ + --hash=sha256:3d21b8b13c7592db2ac5e544a6d83187b995257472b0c9e8351b6d507ae37ed6 \ + --hash=sha256:3d31298449090ab8d47b7b1b2a555ff73cac7ed438a08b7ac160980c7ebed649 \ + --hash=sha256:3ddacd27458c45bdacd6bd6db644bfb730efbf9e830310186e3045c9c5be8fb2 \ + --hash=sha256:3df041de8887954562c9b261cba85ca0e9ded74048daf125f45edcfaa4832229 \ + --hash=sha256:40ab6bffa02ae10a0581e6c198be7d2d8ca5c2a0c64e4ed3465d766df457573e \ + --hash=sha256:4275811936e2f06feff5e598fb42a1b7ae852da8e39605211892b56b81a34efd \ + --hash=sha256:443eae2bf318abeaf6f15d785138f71fd6de770e99a92158b8b814265e079115 \ + --hash=sha256:447441e76ec720b15e64418d32e092297340387053047c7c694f579efb0ee1d9 \ + --hash=sha256:4495c5002a7b28557e7e222e77e0b661183e432b7d6d2e788101e3f240e05b8c \ + --hash=sha256:44bd4fbb29dfbeba60e7d2bd000c59e4b21ddb3cc53912b14048d37092706d7c \ + --hash=sha256:4685902cf26edf013ed7a3da0f426ebba7a00ebb9541386d835afbf002c11cab \ + --hash=sha256:498dc3188ca05a68231ac3fdbfc7f57eb67e1343c30e0fea17f8218c1599b253 \ + --hash=sha256:4c2b5031f63e331e3839b40aed2dd6f191e9c07edbde303e7876846ea1946995 \ + --hash=sha256:4d48f2d08b9de5864e2c8744d4461b862fb149a18274abc8b698c45975573438 \ + --hash=sha256:4f87960d57feabfb618e4e0af6e7371645fa26a277860739d6e5d6e0012c92f0 \ + --hash=sha256:50e3adfb96fc189eb27b1cf62d3b598b89b4bb0420d93a3d3e42e137409011be \ + --hash=sha256:51cf45226a9b588d0d2b4880c62d686934b63ab0bd79ca23ab0e9762eb27441b \ + --hash=sha256:52aa6992700996af31f375de0c6bacd402b0097fe40b53c426b9f51a90ebabc7 \ + --hash=sha256:55ea99acb17b9325618de155a0cd6a2e8f5d10be008113e1d433bbb58db543b2 \ + --hash=sha256:56bc200a365efb37383b7852e4cc5898d3b2da5987289b543956cf8cad71018a \ + --hash=sha256:588461c2e8384d309bd63e5826019b6977bc66d629b99ac8737bb795d7b2cb5a \ + --hash=sha256:58ca3755ee7ff7f59b57789ec9833c9de9ea275405cdd240eda1f193112e398a \ + --hash=sha256:58f361dcbab699cf8f42db3f47c8e7fd1036f138c23a5d08de9fde5f425a730c \ + --hash=sha256:598a11a2c7ebaa5334bf698bf29568c9c390abac6a154d8170fedecd1cea38c5 \ + --hash=sha256:59f63901b0031c3136cf64704dcb21de0bbae62ce2c9529bc39d27665463de37 \ + --hash=sha256:5cde776b7cc66e4f6c99612cea4aa7269aa65863f7a15841b2c264f103822f4e \ + --hash=sha256:5e2b6b57e9733d39f0c9fd3185efa6b8e29652c4cd8fe94180272cf6ed9a78c4 \ + --hash=sha256:5fb29fb8cd1a46c27a1bf9613ad5ec2599310d46b4025d9556404a6b6a292800 \ + --hash=sha256:6045373d5a89a5ec71afde535db987ca28e76dfa276c2d4c818265b375d4b055 \ + --hash=sha256:619799369eeef6366ed3e8755a5670f4f2f0fb6b30a0fd7264dc0fdc2357058e \ + --hash=sha256:62588a277bfb59def052abd940703fa35107152bf479781a878617d60faf8fb5 \ + --hash=sha256:62603db9a7caa0802eaa28c1c46fecd7b3a263a774069c24c3c28c302448721c \ + --hash=sha256:65cd72beeeca9d3aaea1201e5923859f308f952f9c71de93f06063c79f0f7a3b \ + --hash=sha256:68eb192d85ab8e5f6ec69c2bc6ac0179fbf04a5ac1569d12fbef74883fe102d0 \ + --hash=sha256:6bd128f206a7752ae1f2ab6c61bf8a24ba28913a10df8b14c2637b973ff97a80 \ + --hash=sha256:6be488a102b8cf28d0391d8c4ba7748938ae28b78ad901f8585520fca33ead1a \ + --hash=sha256:7218e8f32b0956cfcd048fd42d9d5779809745ca1d86113ca56f66e7ae1549c4 \ + --hash=sha256:7441d755b7ab94f8d4eb3e43ec05482d760842fd263d003a99102d742cd835e2 \ + --hash=sha256:749e97e1b32313717a565abbe321bc2190bc8b35f1a67e4cdbc7c56c8d8ffe58 \ + --hash=sha256:75a3ceed0724d625d64b86ca20aba182e4df462e04c2414fc941c0f523f06aac \ + --hash=sha256:780fbe7cab297b81dad9fb8dc5eb003c0468ffb0d9e5f65068c53a34661a96bc \ + --hash=sha256:78456a747de8dc58360ffa581f30a002baf5aa28cb262536545e91f113ed7639 \ + --hash=sha256:7967d08cf06dee78443b874f98c98036f624f3a4e73e11f9f64f5be4d25393cf \ + --hash=sha256:7a881931aa470808df94a8c380eed2bbbc76cd9dc622310f99665658c821eb6d \ + --hash=sha256:7dcd882da75ef9adf94903b1e3b9419e8aa8fb4c7396822b834b9ef7fb96954f \ + --hash=sha256:7e841fb9010836c992c9f12fcbd43a831de93a5f726fc1ccd8ca1d0268c5014c \ + --hash=sha256:7fdde2c9fd9e3eca40631e024664cf2584272cc8f96308cbe5fdfc930f51d8bc \ + --hash=sha256:8024d00c3faf3fc0c16e07a69f4405e8eac7cc0ab15f65fe6cf43827c4cf72b4 \ + --hash=sha256:80d02b6f04e92601a081dd97b23d3128033098bff5d35d392ddcc0476ea11253 \ + --hash=sha256:838dcc90063569a0448120554591a1d6c4a4ffe11babf048908793154ab86ade \ + --hash=sha256:849df64e889b2e17230d58410a03dba311a65b163508fd33679b2b737d4b7858 \ + --hash=sha256:87475fabc8d9996fd9c27debb395e642e8c838d78a00b6e932227a0e06b81e26 \ + --hash=sha256:87e50a3e7cb90af586b6c5faf23e302a970415ac73bd7bd90a515a04b427ef96 \ + --hash=sha256:89b53f3cda69831909888e0494f4fa0bcd3537e3e138dabeb620bd6ad946bae8 \ + --hash=sha256:8a893cc101149f80a653f82062ebc95b34525a2614382e1da5458fe7c6997249 \ + --hash=sha256:8b2bfab86aa71ae13aa41a6a26aab338e0db2b8bc75434b05aea89e011ff35a4 \ + --hash=sha256:8d86d6fc60743dc916eb79e2eb1ec4818e21e427731543af40a3021851174a13 \ + --hash=sha256:915563965d418f986e7e145accc592eae9e1a1be3566ff98a05d7a9ec42a76e1 \ + --hash=sha256:92888bb3187c5ba50500b00b3b310c9f2c651709d28036077680cb5255450a03 \ + --hash=sha256:93223adc95033dd47133a46ccfc316a0139176fd79085762e27202ec56018f03 \ + --hash=sha256:9373ad13ef0d2c0fb761e04e55bfdee5a08b52cef2c882c8fbe9935b1517152e \ + --hash=sha256:9409a8bf35cf78353942504b24a57de3d75b708997a1e4bd8db71ac8633ce364 \ + --hash=sha256:9b7f416ff0978e2f2249330527f0ad6fa02f4932e6199692d3b52da2048c19e4 \ + --hash=sha256:9bde855991b7e362c146535e3136a50bfaffc0487d38b33ca7e5edefc6e23849 \ + --hash=sha256:9cae88599c7219005d879f98e5ed53341e9a122af585e1091200358a3003d2a0 \ + --hash=sha256:9cf9b1a857e25c4baceeb3624e92a56df3668f398c4acba74e174d81fb4d1d3a \ + --hash=sha256:9f56f72050826f63dcee7a7f55b0a77168cb3bfc553fd405e7f8f9ece75a4036 \ + --hash=sha256:a090bb2c68df85450502e3e20d665e3a5af9c65a84d6508ed477badd49166fd3 \ + --hash=sha256:a192e2c40070d92c3ccf777e3a5c4ff515573cd2bb7ed0c537fdadbbec5bbf21 \ + --hash=sha256:a19a731138fc27d5682277d3b9df22855cea1239bce7fcec5f78f42ef2d1f3c3 \ + --hash=sha256:a66c3bc5ab1f0ff2164fc9965ddd611ff0802173f4b9d24554c563f6ab7e1d6e \ + --hash=sha256:a815775b6c38d4e0ff7bcffbeba67feded90202bb6a226b8dd35f1c855217413 \ + --hash=sha256:a89012d6d5476ee112d20d998570ed58df2260a852afb1758809cd6900411d21 \ + --hash=sha256:ae4f5fea5b8b8ccff88238cc8569303e5ee95efae67fa62922a311397a71f346 \ + --hash=sha256:b6856554c4f44d79fc2307d5768854310a8f0096e501c75637542c82292b0429 \ + --hash=sha256:b6b751274acb69d77b3323d6b7dbaa3c7fdfc1eb829b7eb61d262f32e1af9685 \ + --hash=sha256:b736353c0a625bbd5fcec108576e2385db3496f4f771f785ff32e108d3c3bc45 \ + --hash=sha256:b7fd005a73d9e657273b7a10dc71a9e03c8fb9ee6999798d6918ce095b81ac7f \ + --hash=sha256:b91363207bd9dc966a691e959bb47f64b30f7ac4b072be9968b366982f7db77c \ + --hash=sha256:ba0b1d2620edf869789c3879223f52bf2afc5d31b3cb47cc57b3a12c05e2aa9d \ + --hash=sha256:bbbfc8e28816f19d7c0f1816664980c0a9875d01b27cdf8eedddb639d9e108ad \ + --hash=sha256:bd16aabe4a02a297c23417aa17ac6299dbd8c49f673bcd645b4929b11f5a4400 \ + --hash=sha256:c0afc6800ba57ccc350374c5bd6150419915d95ce93cdbab2d783d75eaf30ecb \ + --hash=sha256:c6708715abcf3c73b99508253e961a9967f02fe536532834149574eda6de0d1c \ + --hash=sha256:c7c9ab723cde841fefb34efbad91e87f00a674b1fe1cd0784fde742bf2c154dc \ + --hash=sha256:c8f3d67aeaf55f017982b73683f0e7342ba2f6635a78f69ce89ebb26aa411e5c \ + --hash=sha256:c9790464842f85f437dbbb54417eda1e0e6bfc52dd8d22d6fd1c994b73b2dc74 \ + --hash=sha256:ca403d7e4798f525fdfc78e258820419cbbd0f0ecbab9de7840e3c017cf6b8cf \ + --hash=sha256:d008d90a7f2471519aef0c90dfbe73b3e6e4d5e66ac48e19154c17e89e98b604 \ + --hash=sha256:d19fbd981a488e22cd04883659ca6b08f50b5974f9fd7c95655ef6a043e5893f \ + --hash=sha256:d1befeed746d247c81127bb14de9dc3d30edb6e5976d34f83f86ed262b1d9105 \ + --hash=sha256:d2374b62878abb00cd8309b32af6c0b715cd02dec0ca74ef12e5069bdc64144a \ + --hash=sha256:d376bbd28b3a8999db1a103b3b388aee6f1ddeb3e51bc2172993efdcd86e064d \ + --hash=sha256:d4a7319f304a774bed22115bc891618e45f85065ab44ea6acd07d274e750519a \ + --hash=sha256:d6734d2ef8a50fbf8445c139477da401f50d62a0606bf00e20ec6d87773fefb1 \ + --hash=sha256:d760fe2a4d7c3b226cb9026d6a842868d52a7901bd98420e1baf14e80da85cf5 \ + --hash=sha256:d913de495d90407cd859d263bee2e5d1a4ed3eb6573c04e70d9ec619a7cbed7f \ + --hash=sha256:db19d07e2e0129e974a0e65d0064fc222a446cd5122c2fd4184d2af9fc734a9e \ + --hash=sha256:dca9ab98072a5a54ebacebdc45f53e645336b320c667410b061be1ca588ae709 \ + --hash=sha256:ddc7dacc8ece3a182e7f15cb862d1fd616b46d076cb1ae9dd232b2c38b655874 \ + --hash=sha256:ddf19c062bea7a0cc80f519243d2c01dd091be0cf952a0750d4ad576709559f5 \ + --hash=sha256:def79fa35ef0cef8d2accec024f4fdc7ead3012ff02f5215c783f39f03ef8cfc \ + --hash=sha256:df29a0a7107f7011e77f4eebdddec4c7331e24d787a0b21a46d63bdf7445da95 \ + --hash=sha256:e09a3942ecbdee5cce73ea9d42da82b81b72ac1bf031ce069b93b5adf4eac8cd \ + --hash=sha256:e242bb1c5e76e97dfa9e7f209a71e93a01d7f19ffdd5cfbb2e2d55b4f08f8ab0 \ + --hash=sha256:e243bd13217235fc7290c621941c3f5cc8b66e4872495be821d7436ba2fb838d \ + --hash=sha256:e2af3aad578aa6bd1384bcf4750fc285e5a9de53f40b7d41e5a0bf748edeb2b3 \ + --hash=sha256:e4e81e09c1578b8df602e3db08b0b3ea0a6947ad612f52bf8dc5ea8d47691f0c \ + --hash=sha256:e54da4baf05720032d527874d40b65fa4d7e5c6c6a43d0c3adbeffcaf275a2b3 \ + --hash=sha256:e80e6c2f55656b4824d72065abb4ddd6a525c74bd78a0aab5d9fc2cf4fb5af50 \ + --hash=sha256:ed2a239c0ea213acc1908150a3037257083c7c083128f1a4cec2ec4b97dca491 \ + --hash=sha256:ed905975ab14056a2e5eb1c376cb2e1ebc5396baf84163939c518556fccde9f5 \ + --hash=sha256:ee21e28f0430bd6dc9086c6e525d5e818a44a5ad19720c8a0ef766792f3eb5e5 \ + --hash=sha256:ee43c17b173d46a3212baa6ead3ae258eeabdae48c263a01ccf0218c366dd655 \ + --hash=sha256:ef4fcbf3327382cd4c9f540babd61248208af7b93eec4de397b4d5f58a09e288 \ + --hash=sha256:eff0ac9dbe711a4aee69bf04a83896aa9b85f19641264053a9f6d48573abb7dd \ + --hash=sha256:f0aa869112ef88429ae17820d99c3dd9504c9e9c671d3c246f3d7442cb051084 \ + --hash=sha256:f3c96f633825733f735c5a9cf21d21a257d8e1edf0b1cee0a064b9c424ca0f7d \ + --hash=sha256:f5833ad231be5eb6553de524a70f48d71b2c8563101750531e0b80184e175cd4 \ + --hash=sha256:f5ec61164adcec446f8969a3358ec3f9b26bbda3b9213e5586d219afa8df2915 \ + --hash=sha256:f7d486c83842422badd511868fd8a9a20e9407ace71564b6af47ce7e60a336c1 \ + --hash=sha256:fb9e68df06293761f9fe66ade60a9bc6d0f5e42b8acf2939a9158af86ab0e5bd \ + --hash=sha256:fc14a032f813bf5fe624d991960ea83e9715adc27e4c1830a2361eb1d02ac341 \ + --hash=sha256:fcff63213e8e6e47770541a4607175404f47cbb3ebea7b6058cc82d524a0e424 \ + --hash=sha256:fd1fbe0f116b6e55da77aca2c6ddcddcfac2186cbf78bdebf40fc156efca389d \ + --hash=sha256:fe9753dfee015c570d73df76f899f18444d41388bffcde097deba51c4fadbb9f + # via requests +click==8.5.0 \ + --hash=sha256:255bc9599cf7748b4b1a446ccc735421bd08a2ae529a8b88597d3de5664ee360 \ + --hash=sha256:ba0d2089de75ea0310e2dde03160e6ca10009947fb95a182f9b54021bb272e34 + # via + # policyengine-taxsim (pyproject.toml) + # huggingface-hub +contourpy==1.4.0 \ + --hash=sha256:018227e134b73090b06f911e773a526c77c9af426be29065500ce096a5accd4c \ + --hash=sha256:072a702e2e178f4fcf96f04775d0c059e4c917925abf0d3208ebb6865df3c23d \ + --hash=sha256:0c7a4c2716a4e98342221954416a836cca77c996c14ddbf22b5f01d5d93ca09c \ + --hash=sha256:107ec46f7aa1664266d69b1181aadc953d58d39f7d8d648fa5b795d4a060b0de \ + --hash=sha256:181bea01bc742734ae672fa00c717d855dd35e1f029536406538c52e7b0cd73d \ + --hash=sha256:186ba929df36d61b6127da2e89cd1357e4cb79aca647381ab1a6feb0b152877b \ + --hash=sha256:196759a3e4db60e1546167e361090ebb6d199aa3aafc9e34ea17a5ac3b23e814 \ + --hash=sha256:20156f5a1ac4f8ce02656e39a61e82164a3d359796dc8026f75b062783d500e1 \ + --hash=sha256:20da2f86bfaed60dbba729fe738c8241b1dd22b6cf7e8cbbf30df290bd04ba28 \ + --hash=sha256:2deb580178ca19437a84bd77e4bc2cd91a8ccad212413a83c273900868b5978c \ + --hash=sha256:2e741a39dfc96babe1722561e81351aeec104526c57dbe91c167c1db606c2d55 \ + --hash=sha256:3863ef2e2b13fe93f8c0ebb08ee400cb07153b8b0e91c5acb26e4537f283634f \ + --hash=sha256:3e0a2392533e5e2abdf277c951047516acc8d2f3c42b2dd9dc34c907c9ebabf2 \ + --hash=sha256:404dbcd9233513dfd1323b66ea593fef90e899f658f6b8a9ed8e93bd0ca669db \ + --hash=sha256:417be048f7e122cefbe2a34c51a1f2b0410f8eb35796f794d45475ddb7872d9d \ + --hash=sha256:423bd5f4b3f11d54a8c597234e513382e3454bb106b8ec7ae32ba4ed63f8d99b \ + --hash=sha256:432e89f835cf01f8d2123a130a3126b17ee6e0348e4d62c0973872b30aa873bf \ + --hash=sha256:43c3ccbb32c6294b183dcc8e8c46dacf5ecef809497e3d48a5be298eef185ad0 \ + --hash=sha256:43d80072a32299bf945de0a6dd4e034ea0162e832261de2e07a274a5adbba9c9 \ + --hash=sha256:4bffcb2e8cc5c0e837631acab59dd04265fdac376550e7c3e310523877c68cb7 \ + --hash=sha256:510f7d93d94cf6ebf4e2cd0640bea16ab8affac7547230175b6745b596ce0599 \ + --hash=sha256:5450f091ac1be0be3ad3a2a3b3f23b5e443e78c670ced4fd347d626f92a28fd2 \ + --hash=sha256:5545ff38229c15d11d822fc6f7415b932da9f4975f53e305b7b96ebfb01f889c \ + --hash=sha256:5a4c89c7f38a0d7a94356d74e3391073c4325c4d47ad2fd065c3fe7dbae16c0c \ + --hash=sha256:61624f6722480aa7e168fd746164e7bfdf48f8ccb6542f1613741200dc37e2b1 \ + --hash=sha256:618137ec5778fb76d494c9ec854b104a377fddba0d128bef7136cce2c3bf0df8 \ + --hash=sha256:630d32f06cedf37b7f1dd2b6a12e4492826bd477a4c9c7b2e2fee6ce3a2cea76 \ + --hash=sha256:64039341e2d8804f1a13bda8c69083eab935167bbd7e856cf096241f17d5bd45 \ + --hash=sha256:6507a016976a75a15aee47809a34605de6244ccc056e6164bf9fb14b27eecad4 \ + --hash=sha256:6ced1670fafee703b8277ab1645072a226e74f167166eae146fb743916119b67 \ + --hash=sha256:6e697d94e69f499ff6bebb899cae97a58d5d14f0e1fe9568b43a0248d2f9af8c \ + --hash=sha256:6f963ea9f0d68d2b6a02d861e3c0aae09ae25ba21f243fcf281e9fed468b078d \ + --hash=sha256:738c44fa71735a617f36da58e32810512407d283d5d1bb5b1cecb00d7eeba7cf \ + --hash=sha256:758e7496cec3195fc28a28945eab3ceef348c47fb95c7afc2eca2f3901209c8c \ + --hash=sha256:78ed5c5f962b3e156109f0531b174a65ba80d13cc681a70227b12524c162e184 \ + --hash=sha256:79b06c60d5e569ce12c5da8f0c51217cdc484386e2349fa717c30fafb56d2871 \ + --hash=sha256:7f861af508fca2384eef392bc1d8377cfa349b2b854cb11b45d89c75780e2561 \ + --hash=sha256:80c7fc8e7ac217777ce7ba2db3cf8478652b5a4b335283111012ff9eaac9d842 \ + --hash=sha256:86d05cec773c9507a3950122e0e40ce77c23c75ceeb2fc189514e71893cbb34b \ + --hash=sha256:875f42444c9cf48d56f724f2637e60d0f73b3b12c9041e1484580a233edf9591 \ + --hash=sha256:90feb8da006803a95ba573fddc9536357d0c3faddc3a4c9e22816ca49af52878 \ + --hash=sha256:912c6afaa106e2f74ba22b30416b77ef7eb94e3bdc5a4df51ab147845dba9b6d \ + --hash=sha256:96019f059bcb3774acc0104be3360a57b36d33eaaa2e1d7f77c800ca8e07618b \ + --hash=sha256:9c0e07c691f3b3321913ed9b8161c50ea5f77fadd006f52f5e755359b0dcbfc5 \ + --hash=sha256:a03b32c2e7eda8b17757c022162c13c86f5c3d6f937dddf9ba3c3ff7b513953b \ + --hash=sha256:a1c8a74744fa746eeaa12f0f9ed7f8b4add9d8f1b14d95e3b5e133675eac888f \ + --hash=sha256:a3e67bc1a6a4618a1dac7c3053a9ffece5ddfa2046b2670b342cf430bb0b87d1 \ + --hash=sha256:a58b5f130afec61a093d743cdda435cc4047748b6791627e34a68f41ec3a9b07 \ + --hash=sha256:a5e2bb871b90cd7a52bdee63bf80ef7acb46398d27efc66d7679240016efc5aa \ + --hash=sha256:abd0f7e51ecc52bf8c95713bd80b1c17c516a71fa391c54475308a4377903c2b \ + --hash=sha256:b7794ea07cab575633daad8d6e963b662053391022294d3aacc1d9ba9ef54114 \ + --hash=sha256:b9dc493e7924e5aa32d89d0b8e50986280f3d4b284968a792787bd7bcffd3cad \ + --hash=sha256:be85d160e7c795113c2a93254dde2fc7e86b375322570eee78b420969426973c \ + --hash=sha256:bee6ff96653e0807cd0f8eaef00174a031e3a2effa5c20f49a5a8d574b05af23 \ + --hash=sha256:c76f3a5318164db7d9401132fc1b5364b784c613c93fa506e3b5e6d1bf353ec8 \ + --hash=sha256:c8be3392b84cf43373a488874dc1ebf46f60784a70977f92586e18019d71c7ed \ + --hash=sha256:c927ec747633e68c9920bcaad48b0bcefe648812b822f18c34e2d0e2270a3d2a \ + --hash=sha256:cc87f2ffa84a49a77d76cb792f28a48ff3b05a222aa0b2bddbd839ba78e1d5ca \ + --hash=sha256:dd59df9e2fb0aff8bd7fd1adb9f349b7c835245a9d0f18c2f2deeb537190f2b1 \ + --hash=sha256:ddf5a2596d716fd3793434844caf31abc7a40b1e8718431420c89858268fb909 \ + --hash=sha256:de503609fdb71f597634ca64fb4bd2f13d27c97f140e912b1e8ed93544840df0 \ + --hash=sha256:e21d1d4a9db5b3a793649c7ab0ddb4697f2818929eec871a7b9c45fce7b2a1ea \ + --hash=sha256:e439ab450c93455feb0218532ded3e946ec7a9b5f459069f122cfa44b89229f6 \ + --hash=sha256:ea09dc704029930cbd097f75cb0cc1db9852adbcf1a151fac7e9559f7bcbfd19 \ + --hash=sha256:ef47fef9a912c77e3d84b014f701e5a9340f25703e9ed3bcebe37f91fb69dc49 \ + --hash=sha256:ef9440f6f8506246269a82734f5ff9e2e4c5e775b3996fc883cc491c5257eca6 \ + --hash=sha256:f1219a8898523cba821085f2da8a1b962cc696325763f09d7f93538ba43b2d70 \ + --hash=sha256:f863c6100bf926cf47d13f3cd75f9bb8ebd98aaab230eeb4468b91f98f39a6b3 \ + --hash=sha256:fa1b787362a3856e63dd2b89449f6c384d55ee1beb8f94f4bcc871b40f02462c \ + --hash=sha256:fc9feef8f1f001c5b87decadc67c4a5d1eebb62ca39c4763d1237ff62cf2b707 + # via matplotlib +cycler==0.12.1 \ + --hash=sha256:85cef7cff222d8644161529808465972e51340599459b8ac3ccbac5a854e0d30 \ + --hash=sha256:88bb128f02ba341da8ef447245a9e138fae777f6a23943da4540077d3601eb1c + # via matplotlib +decorator==5.3.1 \ + --hash=sha256:4cbcdd55a6efadb9dbea26b858f4fb3264567b52d69ca0d25b721b553f60ea82 \ + --hash=sha256:f47fe6fdbd2edd623ecfe36875d37aba411624e2670dd395dddae1358689bb3c + # via ipython +dpath==2.2.0 \ + --hash=sha256:34f7e630dc55ea3f219e555726f5da4b4b25f2200319c8e6902c394258dd6a3e \ + --hash=sha256:b330a375ded0a0d2ed404440f6c6a715deae5313af40bbb01c8a41d891900576 + # via policyengine-core +et-xmlfile==2.0.0 \ + --hash=sha256:7a91720bc756843502c3b7504c77b8fe44217c85c537d85037f0f536151b2caa \ + --hash=sha256:dab3f4764309081ce75662649be815c4c9081e88f0837825f90fd28317d4da54 + # via openpyxl +executing==2.2.1 \ + --hash=sha256:3632cc370565f6648cc328b32435bd120a1e4ebb20c77e3fdde9a13cd1e533c4 \ + --hash=sha256:760643d3452b4d777d295bb167ccc74c64a81df23fb5e08eff250c425a4b2017 + # via stack-data +filelock==4.0.12 \ + --hash=sha256:5f17ee83ecee8a6f3e389c75822fb70a1c2f0506b99438a6dffa1d56793588c8 \ + --hash=sha256:cf42711a7ac791818b299fab0332a088c65aeeefa36290de98db92c434303b0c + # via huggingface-hub +fonttools==4.66.1 \ + --hash=sha256:058cd823b80bac59e64dfad9e3b6fcd677852f9a3804971bbf6b48cc611e785c \ + --hash=sha256:05aeb146451f37289f782c3c861f3d0f4b86c2dd2e4620b46683544c7406640e \ + --hash=sha256:05c0fff6b4a5d872ed89cab2c4f81060b86ace263903eb4e8d0edcac47a60dfa \ + --hash=sha256:08d8956e3ec990c75230d92f1630b215e8f3738c83a003421c22b31ebfd0ce15 \ + --hash=sha256:09ae73bd219e1245debd8376077a0fa6e03175e255c4f51bae5f6a271bfe384a \ + --hash=sha256:0dc6fd99cb8c30941036308b148da9432640442a6f26f36d71dad9be24cbd0e9 \ + --hash=sha256:1801fdad5600118327171e0e8aa79f7cc48831dd55ab36998c9de03bd5ffe6cd \ + --hash=sha256:261d8dc95845e751f975fe8d6075600593ee253470d46d1b84801688051b09f6 \ + --hash=sha256:2aeb745f2664eb811026997c95628071137a777ea2ad296deec9cb393f0b23cf \ + --hash=sha256:2c7340497cf53490293e0c2b61011e0191633022ede0a0a964a68157a98b0fb4 \ + --hash=sha256:2ce4c93160535761f22c80b2afbc96cabc09855363a5d1a5554265b8a4c85901 \ + --hash=sha256:2d320483928c7831f0139ecb361954a26b2e2a8995681200155835dd8cd4a7d5 \ + --hash=sha256:2d637468dac23aac0e223bd52e66f8faa3b0dfcef57435460fa2107e830226cd \ + --hash=sha256:3087a430722aba8de429c2539fd2a58a9cf05238cdfefd8626460001052ca878 \ + --hash=sha256:34378db9a398b59de18cc79d942f0a907c6fc6301945e065ec888202f607aa3f \ + --hash=sha256:36bb24d4b98faacaff04af1d5e0a4285feba6ed1da6728cd34b6b6deb6bbb934 \ + --hash=sha256:38ce8f5fbd5c17dd2153d47d7c8d4108f3deda3f2b4a79b60ddc470a58faded3 \ + --hash=sha256:43d1284c1964666ee833f2badd3017dc138f53d4889043ffca66c5ce4188f188 \ + --hash=sha256:53e5854ea8003efec34adc0863c18ce91da923018354d27366f7fee7db928d7a \ + --hash=sha256:56d41d650cb8fc6cfe1d85ed7c62a0a56cbeed07bc65ca795475b914d401312a \ + --hash=sha256:5de5d80fbc0e50ff794c244e8fb7afd3eadfe0fa232ba8b162b8c551df22fcb4 \ + --hash=sha256:60f5ea17aed4262630afa43f26997ceabd6417fa05dcedf54c665f5a29193e18 \ + --hash=sha256:64967c6ddb0d4c610dfd8cb1485981b2d27972ddfb7d4bbbd9e199d2a089c450 \ + --hash=sha256:668f092bc0de8902167df6a0d5c5aedc3b4f9e43cf88eea92e9b46a2bd3968f5 \ + --hash=sha256:66fad3b7874062c2a2692f0ae6dea56d24f01b778c7f191950ca3ff997e25a88 \ + --hash=sha256:6946fe7bfb28590a1fd4061a17609c9a843952deb65dcf30d1fe725070c3e7a4 \ + --hash=sha256:71c7ca1b5f46f5dd549f56b47d47c0b709217675c23d3a7bc6aa1a69b6d9bbae \ + --hash=sha256:72299346b96b9244dabcc051b24e4653da4edfda6105544cfb10ce856a1afaac \ + --hash=sha256:7234ae9e28db64273fbbfa72caebd0a97e3bdba6b05064114741b9539ef339d0 \ + --hash=sha256:7b8ff9e0edbcee2fbf7dff0c41b9041c1901c26acf64e23adb67495012df11de \ + --hash=sha256:7cf4f996f9b1cb549bff9ea4c50813988a26ec922c95cfa85c7e4f1270447e06 \ + --hash=sha256:7f49f2834f5d006fe0f3bb10fec73b261806c50941f0cfbc08294074ffc32210 \ + --hash=sha256:83572afe48733bad7a4a9c11721d3a726c2e976d82b063fc9bdd049d76955abd \ + --hash=sha256:8526b2b7ec4db6b81efb83438be52b1264eda9a4994d867163cfe8c65581ce8d \ + --hash=sha256:8aed2bbcd6216253ef1b015763593365ee8084f621dfa53bb957c19d5e05f7cd \ + --hash=sha256:90de3477394c73481d27d2b86091c1c736053ee13ff52c42f0e151948e8578c6 \ + --hash=sha256:9261ef507f2dd74203443a472b65b5a26429eb378f975016dec7dc7305b24898 \ + --hash=sha256:9ea6c93091cbf83161a544388746a0911550bd98cb911faca3591cf5ead166ac \ + --hash=sha256:b13c8c541ce0b794add3211b3641cc0e113d707f73e06235e6fe9731bd7c45a9 \ + --hash=sha256:b18803cbdef248e7ee1be59cb277fbbe1da1faaa6f726fa5d3557904e6a3d967 \ + --hash=sha256:b878c78b2af11b879bd4f26bb0d8bda2a4c64543fdd3f28efe2c80f97f043885 \ + --hash=sha256:b8b71db96d605784e2c5ebf0788a406018ea8fdd80338491f4c83613d5cd1fec \ + --hash=sha256:b913b8e9f7ca9bec44d1eb919f591c596c61041aa357c96be55ff93169859e91 \ + --hash=sha256:c258eba62260beb33c110b03a6912cefa3635239c4ab5615b7225fb6f7b85238 \ + --hash=sha256:c47299bca4b5acaaeb32100f77b944feea151de9ef1773365a410dc3d49b945b \ + --hash=sha256:c666fefdd5613a0e99aa4516e6ff4ef87aa86cf1c7ba12a73550f4770e46b750 \ + --hash=sha256:c724e56213494c6695335577822b2d1628d102e71614de8b7eb8e30886d6a314 \ + --hash=sha256:d3b5403e82d0c7659ff1d9f956e29a3a68d094f043e9f5bc0442796fc3a4fb58 \ + --hash=sha256:d4f76868aea9cc4ce47fdbeaa904c02ee7d85dd0ad095071ae77f0bda6e62cf5 \ + --hash=sha256:d84ac0bf776b68396185bd919dd29e633d94300660335efc40b55b294b886903 \ + --hash=sha256:d8f0a8f16c4f3a5a87ca971de2631792d8cb4d570951f2000acf712f157d40db \ + --hash=sha256:dbb7b950f8c02deaffb6968994691e8589d671b7ef8396bc9d5b5c0dfbb7292f \ + --hash=sha256:dfba62cc93199ba62c376f90f2a9147d92730d301e44f88e013e50ff5edf6193 \ + --hash=sha256:e1cde50b3ec84ca6fe63ca815de183dbecb88e8adf8ada82d8ea130ef12b2b43 \ + --hash=sha256:e7ea7a08547a453fa000db96ed5714a3dc7e2b4255b9243f897921f8c10c169a \ + --hash=sha256:eef76d5796e604f9d6753fa6d323c4eb9f4e0e43f1dcca553f3e6914f1667b64 \ + --hash=sha256:f08ab7f8461c37ecfdd29ad97fb0c0780b50501bd664bb0f46b6e83ed2b9d2a7 \ + --hash=sha256:fdf4afd75c643e60ef4a96fe64fc8a9def27d2a542112332371a9e5066885f9a + # via matplotlib +fsspec==2026.9.0 \ + --hash=sha256:0f08147951c8cb31d844c3547d631053b127863b60be04cf06e121333ee0e2fe \ + --hash=sha256:8dd6e646e99ea382bd85f97a45e6b526a442d79423a7dc673f1e2756d05fcb5f + # via huggingface-hub +h11==0.16.0 \ + --hash=sha256:4e35b956cf45792e4caa5885e69fba00bdbc6ffafbfa020300e549b208ee5ff1 \ + --hash=sha256:63cf8bbe7522de3bf65932fda1d9c2772064ffb3dae62d55932da54b31cb6c86 + # via + # httpcore + # httpcore2 +h2==4.4.1 \ + --hash=sha256:0e25f1462b23c9cb82d9eb02e28bc706dac2a68cb457c6a0d74d63c8a2a5d0e6 \ + --hash=sha256:4e866ffb1a869ae14dd9b5e6beb5c24a13da0495ad72b65925ded182521c1516 + # via httpx +h5py==3.16.0 \ + --hash=sha256:099f2525c9dcf28de366970a5fb34879aab20491589fa89ce2863a84218bb524 \ + --hash=sha256:0f456f556e4e2cebeebd9d66adf8dc321770a42593494a0b6f0af54a7567b242 \ + --hash=sha256:15922e485844f77c0b9d275396d435db3baa58292a9c2176a386e072e0cf2491 \ + --hash=sha256:1677ad48b703f44efc9ea0c3ab284527f81bc4f318386aaaebc5fede6bbae56f \ + --hash=sha256:171038f23bccddfc23f344cadabdfc9917ff554db6a0d417180d2747fe4c75a7 \ + --hash=sha256:17d1f1630f92ad74494a9a7392ab25982ce2b469fc62da6074c0ce48366a2999 \ + --hash=sha256:1897a771a7f40d05c262fc8f37376ec37873218544b70216872876c627640f63 \ + --hash=sha256:18f2bbcd545e6991412253b98727374c356d67caa920e68dc79eab36bf5fedad \ + --hash=sha256:2b2c02b0a160faed5fb33f1ba8a264a37ee240b22e049ecc827345d0d9043074 \ + --hash=sha256:314b6054fe0b1051c2b0cb2df5cbdab15622fb05e80f202e3b6a5eee0d6fe365 \ + --hash=sha256:346df559a0f7dcb31cf8e44805319e2ab24b8957c45e7708ce503b2ec79ba725 \ + --hash=sha256:370a845f432c2c9619db8eed334d1e610c6015796122b0e57aa46312c22617d9 \ + --hash=sha256:39c2838fb1e8d97bcf1755e60ad1f3dd76a7b2a475928dc321672752678b96db \ + --hash=sha256:3e6cb3387c756de6a9492d601553dffea3fe11b5f22b443aac708c69f3f55e16 \ + --hash=sha256:3fae9197390c325e62e0a1aa977f2f62d994aa87aab182abbea85479b791197c \ + --hash=sha256:42108e93326c50c2810025aade9eac9d6827524cdccc7d4b75a546e5ab308edb \ + --hash=sha256:42b012933a83e1a558c673176676a10ce2fd3759976a0fedee1e672d1e04fc9d \ + --hash=sha256:43259303989ac8adacc9986695b31e35dba6fd1e297ff9c6a04b7da5542139cc \ + --hash=sha256:4c6ab014ab704b4feaa719ae783b86522ed0bf1f82184704ed3c9e4e3228796e \ + --hash=sha256:656f00e4d903199a1d58df06b711cf3ca632b874b4207b7dbec86185b5c8c7d4 \ + --hash=sha256:698dd69291272642ffda44a0ecd6cd3bda5faf9621452d255f57ce91487b9794 \ + --hash=sha256:719439d14b83f74eeb080e9650a6c7aa6d0d9ea0ca7f804347b05fac6fbf18af \ + --hash=sha256:7c4dd4cf5f0a4e36083f73172f6cfc25a5710789269547f132a20975bfe2434c \ + --hash=sha256:7e420b539fb6023a259a1b14d4c9f6df8cf50d7268f48e161169987a57b737ff \ + --hash=sha256:8389e13a1fd745ad2856873e8187fd10268b2d9677877bb667b41aebd771d8b7 \ + --hash=sha256:85b9c49dd58dc44cf70af944784e2c2038b6f799665d0dcbbc812a26e0faa859 \ + --hash=sha256:86385ea895508220b8a7e45efa428aeafaa586bd737c7af9ee04661d8d84a10d \ + --hash=sha256:8975273c2c5921c25700193b408e28d6bdd0111c37468b2d4e25dcec4cd1d84d \ + --hash=sha256:8c1eff849cdd53cbc73c214c30ebdb6f1bb8b64790b4b4fc36acdb5e43570210 \ + --hash=sha256:9300ad32dea9dfc5171f94d5f6948e159ed93e4701280b0f508773b3f582f402 \ + --hash=sha256:96b422019a1c8975c2d5dadcf61d4ba6f01c31f92bbde6e4649607885fe502d6 \ + --hash=sha256:9c9d307c0ef862d1cd5714f72ecfafe0a5d7529c44845afa8de9f46e5ba8bd65 \ + --hash=sha256:a0dbaad796840ccaa67a4c144a0d0c8080073c34c76d5a6941d6818678ef2738 \ + --hash=sha256:a6fbc5367d4046801f9b7db9191b31895f22f1c6df1f9987d667854cac493538 \ + --hash=sha256:bdef06507725b455fccba9c16529121a5e1fbf56aa375f7d9713d9e8ff42454d \ + --hash=sha256:c3f0a0e136f2e95dd0b67146abb6668af4f1a69c81ef8651a2d316e8e01de447 \ + --hash=sha256:c5313566f4643121a78503a473f0fb1e6dcc541d5115c44f05e037609c565c4d \ + --hash=sha256:df02dd29bd247f98674634dfe41f89fd7c16ba3d7de8695ec958f58404a4e618 \ + --hash=sha256:dfc21898ff025f1e8e67e194965a95a8d4754f452f83454538f98f8a3fcb207e \ + --hash=sha256:e06f864bedb2c8e7c1358e6c73af48519e317457c444d6f3d332bb4e8fa6d7d9 \ + --hash=sha256:e2c04d129f180019e216ee5f9c40b78a418634091c8782e1f723a6ca3658b965 \ + --hash=sha256:e4360f15875a532bc7b98196c7592ed4fc92672a57c0a621355961cafb17a6dd \ + --hash=sha256:ec86d4fffd87a0f4cb3d5796ceb5a50123a2a6d99b43e616e5504e66a953eca3 \ + --hash=sha256:fa48993a0b799737ba7fd21e2350fa0a60701e58180fae9f2de834bc39a147ab \ + --hash=sha256:faca8fb4e4319c09d83337adc80b2ca7d5c5a343c2d6f1b6388f32cfecca13c1 \ + --hash=sha256:fb1720028d99040792bb2fb31facb8da44a6f29df7697e0b84f0d79aff2e9bd3 \ + --hash=sha256:ff24039e2573297787c3063df64b60aab0591980ac898329a08b0320e0cf2527 \ + --hash=sha256:ffbab2fedd6581f6aa31cf1639ca2cb86e02779de525667892ebf4cc9fd26434 + # via policyengine-core +hf-xet==1.7.0 \ + --hash=sha256:0a9e802f33bf50c851abe45fc5380e61f959e2d369647d6742b79ad9d6c27cab \ + --hash=sha256:19c0e64f14175ccb6a1aff69e0d2ab9ec5269a560e6687abaf2b3fa4f73de7cd \ + --hash=sha256:2814a6e999d13464c4d679b788cc5d784eb5a4edfc638a31f10e9a11ab531ef8 \ + --hash=sha256:2b7bb5727889b0f2436dbaaad8fc4c3e66b8240d992716989e0c086b4278b1bc \ + --hash=sha256:4ee5e05a627f5ab5bad7a86582277d645556ea1e199903aae19e033a392aa13a \ + --hash=sha256:57bc157b8b7fe3bee9dcb9af7f3da8de41801c3b31a9ef68a77a33c6a6be382f \ + --hash=sha256:59fba37039233c7fcbe196817d6cdcf1b40dfb17b410f229d85b0cf0a1848da4 \ + --hash=sha256:757168feb5679647c0bb13ee5d0faebe799c4dff9051419885a566ebd79f949d \ + --hash=sha256:80f79dae613ce9e0ea1fd1ae15616ca9ac74aed4c770aabc199c4f03ebecc863 \ + --hash=sha256:87dab080f8f7d32781c2586904e3603f4e60d09bfc727706c3ae419e0829beeb \ + --hash=sha256:acc3851cf2576a8fb2ae926da863f4efabe21303cf292e9a44332802ab0dcc6a \ + --hash=sha256:b01fe18dbbd151a2403d2c64ed30dc6547b00d6babab9a617d77c7acdb81ee66 \ + --hash=sha256:b91569d5f1b61c34b043687da02c05dd3604f3d329e7868510bf3f7971599006 \ + --hash=sha256:d406ec79053c0871817f700c2ac8c36ba0d87f9c34b7458b0f0063bb218b0466 \ + --hash=sha256:e3e88a7a75d7d95cbee1f37dc31341d6201124cf21c6c4b1dfab8ccba9b09e0f \ + --hash=sha256:fa029678be1ba7f953c409b0b27bf15cc69cd1c9b3a674fbd78856ebefca1052 \ + --hash=sha256:fcfd6c22418e57dd5b3aea649e813b2e2cfb2aebf317b210d90f1fe4b3018b52 + # via huggingface-hub +hpack==4.2.0 \ + --hash=sha256:0895cfa3b5531fc65fe439c05eb65144f123bf7a394fcaa56aa423548d8e45c0 \ + --hash=sha256:858ac0b02280fa582b5080d68db0899c62a80375e0e5413a74970c5e518b6986 + # via h2 +httpcore==1.0.9 \ + --hash=sha256:2d400746a40668fc9dec9810239072b40b4484b640a8c38fd654a024c7a1bf55 \ + --hash=sha256:6e34463af53fd2ab5d807f399a9b45ea31c3dfa2276f15a2c3f00afff6e176e8 + # via httpx +httpcore2==2.13.1 \ + --hash=sha256:e0aa977abe17e69a3b820a24542a6fa88702676d83880b8d194dcd18408e5103 \ + --hash=sha256:e1e05d4f25f7d7d496bfb96748f6f4b67657b03da069b3a68c36069f3db73d0a + # via httpx2 +httpx==0.28.1 \ + --hash=sha256:75e98c5f16b0f35b567856f597f06ff2270a374470a5c2392242528e3e3e42fc \ + --hash=sha256:d909fcccc110f8c7faf814ca82a9a4d816bc5a6dbfea25d6591d6985b8ba59ad + # via blosc2 +httpx2==2.13.1 \ + --hash=sha256:6dff50fabc270ee5fd25d845d0b078ed20564579744d6d962850975996d2f9a4 \ + --hash=sha256:e48744a19e3af5ee48313d0ce5fe941d5422fae5705ea922a4aabf94d7800dfa + # via huggingface-hub +huggingface-hub==2.2.0 \ + --hash=sha256:1667f145dc56dc210d60966069397df9ecfca9607a5d43db88b308c89dae56b3 \ + --hash=sha256:5d1b47537394e4215cb858aa12fd493d0f7ef7f58990f5dcd24bc173107b2871 + # via policyengine-core +hyperframe==6.1.0 \ + --hash=sha256:b03380493a519fce58ea5af42e4a42317bf9bd425596f7a0835ffce80f1a42e5 \ + --hash=sha256:f630908a00854a7adeabd6382b43923a4c4cd4b821fcb527e6ab9e15382a3b08 + # via h2 +idna==3.20 \ + --hash=sha256:a7db850025b95ded1eae8a46181a1a6c56c92c96f0e2b005d9ff8dc0210cab44 \ + --hash=sha256:ab7ae7122974553370f0bdb919e1a960b2cd1bc1ef0276416d896db81c14582c + # via + # anyio + # httpx + # httpx2 + # requests +iniconfig==2.3.1 \ + --hash=sha256:67f4b9c50da0dedf52af349e7749a80a9057a5031199791b906c3bb3ae878960 \ + --hash=sha256:9121e2c1fdb355232495be3194c8dfe87ccc2d5dee45947b78e68f499790d7a7 + # via pytest +ipython==8.39.0 \ + --hash=sha256:4110ae96012c379b8b6db898a07e186c40a2a1ef5d57a7fa83166047d9da7624 \ + --hash=sha256:bb3c51c4fa8148ab1dea07a79584d1c854e234ea44aa1283bcb37bc75054651f + # via + # policyengine-core + # pyvis +jedi==0.20.0 \ + --hash=sha256:7bdd9c2634f56713299976f4cbd59cb3fa92165cc5e05ea811fb253480728b67 \ + --hash=sha256:c3f4ccbd276696f4b19c54618d4fb18f9fc24b0aef02acf704b23f487daa1011 + # via ipython +jellyfish==1.2.1 \ + --hash=sha256:0028857c5381c9d55e21cc6cb0d7f9545c3a9a7bb7dbca3960fe0a898c691ac2 \ + --hash=sha256:01647c12261bc1f7b102e918e7665497176d87f6fc96271439c8855872bc2606 \ + --hash=sha256:0368596e176bf548b3be2979ff33e274fb6d5e13b2cebe85137b8b698b002a85 \ + --hash=sha256:05be396aebe3dce7a8cb2f97727ecdf99e86457c48e97190775dce33f8b7e39d \ + --hash=sha256:07b022412ebece96759006cb015d46b8218d7f896d8b327c6bbee784ddf38ed9 \ + --hash=sha256:0b21c1596ce283fd7ee954eb0eeb007d59e480364324bcd91ad55146e91f3936 \ + --hash=sha256:1098ce1f84ae3f147f0a18a6803ffb09b9c8cd5fedce42465643ca0b5c9d0224 \ + --hash=sha256:10da696747e2de0336180fd5ba77ef769a7c80f9743123545f7fc0251efbbcec \ + --hash=sha256:1354b558a0a16597b6032dd0af64bebd24994f7e7484cf14993320eb764b06cb \ + --hash=sha256:137cfcc26396d0f2e1265ac61f800bb921921ea722a43dd897e58190f767c474 \ + --hash=sha256:13f1ac9caba22af10bfe42f674822643c0266009f882e0fe652079706dc5d13a \ + --hash=sha256:14bbb30d988dec1d12183cf5d4621c908f98add2009c72a185e8c3e8d00b804f \ + --hash=sha256:15318c13070fe6d9caeb7e10f9cdf89ff47c9d20f05a9a2c0d3b5cb8062a7033 \ + --hash=sha256:1a3ccff843822e7f3ad6f91662488a3630724c8587976bce114f3c7238e8ffa1 \ + --hash=sha256:1ffeeb6c78c45fbb6d2a22b0173fb8a6af849001d6c26fab49c525136dbd9734 \ + --hash=sha256:212aaf177236192a735bbbf5938717aa8518d14a25b08b015e47e783e70be060 \ + --hash=sha256:21baa92d4a5112167721156f6d061c2ae105f2995b3a5e19cec6662928f0c439 \ + --hash=sha256:2348f698f9c1d72023afc8d39939045421a01da9b7e3078e3029227e35f28419 \ + --hash=sha256:29cfa8bfb72aacf2d611a3313b358ed4d4140fa3d3efcffea750c8e7f8acb1aa \ + --hash=sha256:2c28a4ae3e201e1c1b7bacacd40e2e76c4068b90c9ae3a0d525e0ac98206f1cc \ + --hash=sha256:32581c50b34a09889b2d96796170e53da313a1e7fde32be63c82e50e7e791e3c \ + --hash=sha256:32a85b752cb51463face13e2b1797cfa617cd7fb7073f15feaa4020a86a346ce \ + --hash=sha256:393f609fd6139ce782e747e22c399483ffc58341009e6a97e39ffe5f5b2c674c \ + --hash=sha256:4072e21ad4036af41bd57b447b1dda64fe60aa679cfa8854ba0a0338152439f1 \ + --hash=sha256:451ddf4094e108e33d3b86d7817a7e20a2c5e6812d08c34ee22f6a595f38dcca \ + --hash=sha256:4a21d7eda5e6996772055f798e3fe1de1b33b3edad7f6cf0567097a21585a812 \ + --hash=sha256:4b013876109d91fa6fc871ffa4e0dbfda11820c33dc4ad0e2967b3fc1187f804 \ + --hash=sha256:4b28fcefc0c3534277ff0306e6c10672fb050f4784b5f3be7037e80801569fb5 \ + --hash=sha256:4b3e3223aaad74e18aacc74775e01815e68af810258ceea6fa6a81b19f384312 \ + --hash=sha256:4c5acb213aa75a61bcfc176566e20f2503069667e760d83d403b59e115fef0dd \ + --hash=sha256:4e36d9000d4f7e1a35689a74ec7749d27a216dfa6c47cac2e5ad3de8a523bd69 \ + --hash=sha256:509355ebedec69a8bf0cc113a6bf9c01820d12fe2eea44f47dfa809faf2d5463 \ + --hash=sha256:5335f622458aa105289a8e358bc32ecd1b9634b6ffec3e77ea3577e49c297171 \ + --hash=sha256:536c80d8d4ec7f39cbb10b85d926ff96cef3cde4a83ca0991c07cd9835d5dc13 \ + --hash=sha256:56da7632e029912af25e25422fae3b6df318400297d552791f4b21da6d815ed6 \ + --hash=sha256:5bda2275f31a64adf3483e39f7a4e2107f7dfe3a3f85f0d2c0cb6ae5fbe4a443 \ + --hash=sha256:5fa0ba0946f3c274f6a87aaa3c631dc70a363bd46cceea828ce777e8db653b6f \ + --hash=sha256:63770120cc3386dcc13bcc4df508ab281a6b14c3b2c0e33586439a6c40ee122f \ + --hash=sha256:675ab43840488944899ca87f02d4813c1e32107e56afaba7489705a70214e8aa \ + --hash=sha256:68080af234256ef943f0add6fc79816b0c643d8df291c17a85c1b6e45bdfbb96 \ + --hash=sha256:68ea3ddd4dae1152a7f7155ef02a7bfad919611158d71b301f9aa167685819af \ + --hash=sha256:6a49ce2a580edd3b16b69421137deef464e2f8907f9ef906d49950b1a52908c1 \ + --hash=sha256:6c51e565f85ce38cf9388c4f916d53888b0fa34788fcebe3aff3db24948e0960 \ + --hash=sha256:6d2bac5982d7a08759ea487bfa00149e6aa8a3be7cd43c4ed1be1e3505425c69 \ + --hash=sha256:6e76b23431a667cd485fb562428d1ad29bae9fdd0fcdfb5a51cc8087bae0e88c \ + --hash=sha256:72d2fda61b23babe862018729be73c8b0dc12e3e6601f36f6e65d905e249f4db \ + --hash=sha256:748dc45a0394fbe9120b8b3b9a39fab0967c7e2d6ecdd5304af018e774f80f96 \ + --hash=sha256:7853d2ed7d6929c029312ec849410f1ea7ae76ce72ad1140fb73f6e8a1e6aa4f \ + --hash=sha256:80a49eb817eaa6591f43a31e5c93d79904de62537f029907ef88c050d781a638 \ + --hash=sha256:91cad49a4fb731b726afc5ae385a3217a7016ed88a04da40c131cff8136a5db5 \ + --hash=sha256:98a133b40dc00cfda6609e1b0cb0ab0b77796fc2719aae886a12009514f73499 \ + --hash=sha256:9913789a98ccf49213fbb1dabc597847a0ec33d3b0e151689498f4b38ba9be0f \ + --hash=sha256:9930e20f0e9f65ad1d57d98290c2be3abd75812d058815605f44a56056fb9a66 \ + --hash=sha256:9a73b5c6425a70ebd440579a677eb4f03b327b2f59090db34e6c937aeea5aabd \ + --hash=sha256:9c747ae5c0fb4bd519f6abbfe4bd704b2f1c63fd4dd3dbb8d8864478974e1571 \ + --hash=sha256:9d4448c874959ae012cda0f6d570ac0bd7f0fcf12007714eaebf86b86919b66f \ + --hash=sha256:a058f4c6a591d5e5a47569f5648a26303ba19c76a960fef7e0beba2aa959e52e \ + --hash=sha256:a0ef6f0ecc085c1f8fddb048f538c8bb89989e5d470eab45d4e9bd48ee73a40d \ + --hash=sha256:a3cab91020e3ff7565e55a611ec3e3257c093ac950d55778a48bfc8c57562b6e \ + --hash=sha256:ab1bfea271ce4bda09d975080d5465cf5a8b127e7c0ea61ea3f972417a7a2193 \ + --hash=sha256:b35d4b5b688f759ffd075190a9850b04671bad14c5b37124eb43e99306ec16ea \ + --hash=sha256:b37b76ea338c4a473c34a9b9e1e033a78aafb9040a8c0eea579fc5805d8e4b46 \ + --hash=sha256:b8986d9768daddd5e87abf513ae168ea0afe690a444d4c82d5b1b14b0d045820 \ + --hash=sha256:baa30c7b59bd1c5e105693108a6d7a98f3e7a1a59e23e15bc5897b91fd5849f5 \ + --hash=sha256:bcdcd603a7737cd3f5a2ab10ce9b49844329deb81c2daafcd8131e54fc730205 \ + --hash=sha256:bd186c041d9be86c4fa5e2490943ce5d7f05b472f45d7f49426f259f3dd20bc4 \ + --hash=sha256:bebccd0652ac1c7e438ae1f451edefde63d14b3af6f6daa30c599919dcb92886 \ + --hash=sha256:c3c18f13175a9c90f3abd8805720b0eb3e10eca1d5d4e0cf57722b2a62d62016 \ + --hash=sha256:c499ea3a134130797c50e367687a6a46a12653c59af381bee92c41a5ab0bd55d \ + --hash=sha256:c85aa2bc76a36d92a3197f406f86636664d5b323727dfec4fa2842a8a24a06ae \ + --hash=sha256:c888f624d03e55e501bc438906505c79fb307d8da37a6dda18dd1ac2e6d5ea9c \ + --hash=sha256:cf6cd68921f2bacc547ba1cf64ad0e76bc1727f3bab13bba2e5f5869aba038b1 \ + --hash=sha256:d2b56a1fd2c5126c4a3362ec4470291cdd3c7daa22f583da67e75e30dc425ce6 \ + --hash=sha256:d7be8021658b46b22500a77f1707901bd98fc210f185c229b81c74efd3c1baf2 \ + --hash=sha256:db97d873f23b0c15b4ed911ece10e5cc0bb96cdc53666d5c3788bd0af81807f1 \ + --hash=sha256:dd895cf63fac0a9f11b524fff810d9a6081dcf3c518b34172ac8684eb504dd43 \ + --hash=sha256:ddf05ea471da2808d77ecfa425d8884124b4754f4d483afa7703b6655530cf5c \ + --hash=sha256:e1b990fb15985571616f7f40a12d6fa062897b19fb5359b6dec3cd811d802c24 \ + --hash=sha256:e4a210a960f3917da757b0581750b6e0a8db9acef68dafbc1b6e2ae39e847ba8 \ + --hash=sha256:e5977810972c6f0b2e61252c4758fd5aee21abf663ff309881195a99d37daa94 \ + --hash=sha256:e967e67058b78189d2b20a9586c7720a05ec4a580d6a98c796cd5cd2b7b11303 \ + --hash=sha256:ecf62d4aad0baa8832ab60f96e7baedbe6558bd292597503d927e9c5bce745d8 \ + --hash=sha256:f121218dc33fb318c34ddd889dc7362606ce1316af2bb63b73cc1df81523ca34 \ + --hash=sha256:f69aeb08659a6c81d559bbe319075e3417434ae5b3a5e4a758d1c4055a03497a \ + --hash=sha256:fb3c6e537cb4605c22895a8d4a10cdb26611ba2bbfc7f0b4c1d06bb9d8aad648 + # via us +jinja2==3.1.6 \ + --hash=sha256:0137fb05990d35f1275a587e9aee6d56da821fc83491a0fb838183be43f66d6d \ + --hash=sha256:85ece4451f492d0c13c5dd7c13a64681a86afae63a5f347908daf103ce6d2f67 + # via pyvis +jsonpickle==4.1.3 \ + --hash=sha256:99822e77b593462c1f67361b0571e54323db43f1285706a63da5b5759714c9df \ + --hash=sha256:de234c1d1ed2c5313833e608e2a2467202f48ae24ea7a2afa2d238d8999aa4b5 + # via pyvis +kiwisolver==1.5.1 \ + --hash=sha256:007a5553dfc4f4e8d184f588a0200e2cd4b63a59cc8796df3c39909e679dc7a0 \ + --hash=sha256:0324cd2567259b7a095f6cf18a52b0ffc6f3de9e69528ff1bc0e7a37bd43ff1a \ + --hash=sha256:0627b9bceb9c3cdcf12b8a18655eedfed2692b038df27423383c120d0b7dc2d6 \ + --hash=sha256:06a6917674de9e0fe3f66f5430787f59a9f2ddb64af9b714eaec547e29ef5c19 \ + --hash=sha256:072bdb15a3c19a5b5dbc8f8fb1f4e1884bf4f3507eeb4cc6334401274d37a5c0 \ + --hash=sha256:0a4faea5c6db201c6a21391d2ac926ea97acf7dacdbc3c417189e1adb1a00837 \ + --hash=sha256:0ba9527afc80ae3d7814ed98b6572d02bf85eaf48065678342c5f0c6dab7a8c7 \ + --hash=sha256:0d8924877ce22e17326a99a418c3c82037da078df3c6a260b13eca677444e6e7 \ + --hash=sha256:0ebdef3eae5336568147c39a55be6a2036ffde53faa9ca2d978989ae7c2da12c \ + --hash=sha256:1209042a623ddfda5497e4066c7b77651dde8e1d3a9dd97599dc7e97f3b9b78c \ + --hash=sha256:16895f553ee6620a827d2da56b871f835fb70b9216cca5d188e885caf6e3bd23 \ + --hash=sha256:17851e5dad4484be0cbccbde3b15331deae036de9aebd45eed964487802b172f \ + --hash=sha256:1798e83840c3f627246104c4d8a9639c60fa068adf9ce92b61791781fa8a68c1 \ + --hash=sha256:18170a77ddfecf40ec60d0928268dc95880c881864e015a8f34094ed18b9b9ad \ + --hash=sha256:186884a58486651e3c217b6acea0a53eaa9498fdd472057c46f2f0fb5c25aad5 \ + --hash=sha256:18a0cfb124546a4c2e6087c5f3029c7f44b37c85b142e0ced71f73a7599ac208 \ + --hash=sha256:1983f0974a750a6f6556f368ba11105d1d8369c735b944747c9f12ae5aea7aae \ + --hash=sha256:1a7587dc335f2c0f5bd577fd0540bd16c66006bdb60f759a1059f025e6c4f071 \ + --hash=sha256:1acc7e5b7ef05e9da8bb70cd6c7c4513090213d2e1ad9720f599f0bf6c52aec5 \ + --hash=sha256:1d852545c4d0e35a72728d072cbaa59e2fa7dd84bdf01e068d670dd0ceb58eb6 \ + --hash=sha256:1ed0f5e49d0ceff8b72190824d9e59c062fbbc02c231b853112c78474b3f5ec2 \ + --hash=sha256:1fff05e239575b1481b6ed1a782f6fad616efbf1f0b1f44e6e85c4dfe426e483 \ + --hash=sha256:21e46b23a2da695c364124817bc01d970effd5483147f8d66a6a7167e3f6b851 \ + --hash=sha256:22d5e5aaad6be121f2515765e3b1c444352cb8eb4c86510801db8f2e50757316 \ + --hash=sha256:2551cf9917af48ee7c4b29cc82320489508cf96fd26a51f6fc124de661cd44c7 \ + --hash=sha256:255605693a483db7bd5c79f60437f7bf658f7f520d61aa42722e32257c941951 \ + --hash=sha256:26e8268480be5061d509e29669d59103c067a26377a56491630ece11762e3858 \ + --hash=sha256:27add358abe374ebaa3b8763ef380bc99051b5a4b18d94878366a9e4f59efef0 \ + --hash=sha256:2ae70bc59790d2af72a3f76f24b272403e135070340281108b447cb77ea70819 \ + --hash=sha256:2e10ae1bba1899188b33557c10d73affcc12033edd18adddb57d209039976a4c \ + --hash=sha256:3221f78211074f561c44ca42eac0619828171bec15a2c4cf6f7747d07df76e8e \ + --hash=sha256:34633ecf50d16187ab8e5528b7a2530f2feb4e23f300db4672538b51cfc5cd38 \ + --hash=sha256:34ec467940442c9943016fb2d4c81d1ba84351eeca2f1a78f8bc87f1ba0d414c \ + --hash=sha256:37f801b5d7cc0e5a548921308e059fd2b057bb42972b591cfa3049f95423c4ed \ + --hash=sha256:38f6e0deb4d0a4615efe0c4efc5990b06ae450ab50a0b321c0b078b6d238c083 \ + --hash=sha256:3c24cd69455e1b00ddf770c13b6e2c33e07d6dc3f2d34add0bf9277c5c6bbd46 \ + --hash=sha256:3cc210010fd2f438a3ed430b45f1b501fd13a8618bf984dc2c5ce5b69b78752e \ + --hash=sha256:3fa5855898f6d3d01b72ccd48a2d65cbdee301251603fefe34e2025bddba219c \ + --hash=sha256:416ba7ff9f233b7036689bb5a3783537e838ad483f63558d2a800f75afe738b1 \ + --hash=sha256:431dc224a1a92a5c8f582d96e505196a3b5997a7271076678da2dfde67b77e9a \ + --hash=sha256:43844c1a7ad6d723d5b5b4c4fc7f5bd399c40e288120d16257c7c9e8765c6e85 \ + --hash=sha256:44b8faef94f1857e77fa0238f3390ff1ac51d2ea20a487e2e452a59fd2b5f5ca \ + --hash=sha256:470d420f98d368d6f010633a20659b544c5fdfa5329e6b70219f2ef08fd4a7ef \ + --hash=sha256:482676e5bd48d70ac99d9fc78863469845421e01184fa83f1f9366dc49f7e974 \ + --hash=sha256:4d4ca09bf13cff792b1884f64b98ee6c2467930d632233be25c56b442d99f10e \ + --hash=sha256:5025e36fb4fb275cef0a4e30dbb11cb4ae61d1c83deb90189cb5d7e4cafd6b55 \ + --hash=sha256:509735237ae0d849e8a843551d423d2500d2e0a9ac1611a145658b29c0fb9f85 \ + --hash=sha256:534f02c1abb31ed6dbd3515545285c330b2f12d00fdb1fdb71658b9ca5a13a6a \ + --hash=sha256:5978c3340f16a35c30f8ab2fa7bcf559973c55f1a5ef6970e1f621acf3c4db13 \ + --hash=sha256:5b973887ff782cfd6b67c9904ad8ca542e0bc5e4961503408b423b5a688b4d38 \ + --hash=sha256:5c490db2168a508088f59140dd392556a54b8bd1048fc6383c8baff13c359673 \ + --hash=sha256:5d142e352eb13facc7dd047489aebdff6ba78576c239f1ea04931979caaf0567 \ + --hash=sha256:5daa1f19e097050b9c4d9a78fcc9263cb96c9dfae08037ddc1b7c4ad1889f2a2 \ + --hash=sha256:61e9a64c7635095a6bfe483e2ff055d437c59bd45f3617a228b37277f0185d62 \ + --hash=sha256:63fb7294b768f444eb4b068965f2662f28c2fd4161e23bd60fcf3ff27b74c046 \ + --hash=sha256:685929988b208a911f1285e2f8ed54210b0d681a3dc0f03e00d599d291986e7e \ + --hash=sha256:6a797a1cefc8b9c93170db580337e1fe3d011ad18b1299943231279406342048 \ + --hash=sha256:6b92f60017dda7d877fdc546438b5e28f31c523264f49cf5a48c1d0ce1a0dfbc \ + --hash=sha256:70ed9a45c7484d2b30cdacf60d220f494a1763b9fec1ad03285c6553fa0889f2 \ + --hash=sha256:719a35fa1156db3640555f95ebb94f60a444e64d1c69626b0edef5df78eba225 \ + --hash=sha256:74ad5c3dad54a4641b4c28cd15ded70899d04459c6c7aeacafea716be97cce6d \ + --hash=sha256:74ea337e0ec3f6f342a36a4f1b5cd94dd9affddcd28ba9aae2905af932ee8c6b \ + --hash=sha256:75d9b1cf8258462dbdc1eeda718c96ea7f079324c09067f6daabfcf37712b7fe \ + --hash=sha256:77a4c8187a5948d7f8795adb765a3c7b553d07d86d88e43038fc32fc1fb9a3f3 \ + --hash=sha256:7824b5e8bdbf0bccb4ccd37bbb115849a1dc45437fb4de8351385ed07c437ee0 \ + --hash=sha256:7d38b0c279c3032e8c9cc013b405c6df8e1668dbf15465779aa7f15f61201812 \ + --hash=sha256:7e9c01d3dd7ceba4d1d436cc021d40d592466e40b9bc7f5d83dc4e98a5c9cd8c \ + --hash=sha256:7fd82debf43c6acd0a94359d232f6bb516ee13f269a7993736a9ac9f988bb5d9 \ + --hash=sha256:824c3d763a05ea9e9003610145186b0e9848c7584a5575c79bac5a8e7cd80bad \ + --hash=sha256:828f75af2b0080c8a972e75f649ab46af008e92c6104a57a759157200b835b75 \ + --hash=sha256:83f78128fa28705fa85d01c59771c72fe81c11bd0e6155edbb9f818983a7d761 \ + --hash=sha256:876bbfd276473d3daffe30e8c975df4ed9429967b41a6cb362dbb5155b6f13ad \ + --hash=sha256:886fc26012f0e8b5f69d1cfe6d711f6b11f194621539bf8e6bb1c25c5dc82724 \ + --hash=sha256:8a34616dc2521cc8dc1d7d081734da63539f021ac0450ce950908340c6e7aa2f \ + --hash=sha256:8a708a47ade1fe19e8371d5da076bac0dd4b0a5a7985ad6c637f7f7e361b6baa \ + --hash=sha256:8af9b142ad719ae3a911ebf616bc4b78b32bbab84d6a40d3ad2f129670509957 \ + --hash=sha256:8bf4df63592c2a66b4f8edc5df2544998c288aa02f96ce0acd880cd1de8c8127 \ + --hash=sha256:8de6f2a4ce7e7bd27d23dd94abf0ccafe0e0e5cc9c764b0577191f2c25f08f26 \ + --hash=sha256:8f8fddb8e323bd6eee4e54e69a39243beab22689070f4c66b472c4cc88bb89d8 \ + --hash=sha256:8fca690b00c4c48f6c2a547b0160ed511357093a4e4c9b47e0fadf3128066d89 \ + --hash=sha256:9506e892bcc3b409831d363c6f53e5985e1c8d1f6f6b0256d00358684ff85378 \ + --hash=sha256:958254518717542d02d0688d0d20cbf771da5e415e6f49543f92481c850a4540 \ + --hash=sha256:95a02752aa032eef4aed01cda6d9b687c669bd0396bf4519eef8bba22a286720 \ + --hash=sha256:96c30002424670b5e1e46495c2b8cbffef39cf77c1d79e76462029d50339785b \ + --hash=sha256:98b208a7cc42c803445ef551d6753cc42a5ea13e9cab1ee66cd8b9cb70195330 \ + --hash=sha256:9b3092d8992a1d69b7a59c3e39f35e1b9be327a17f68a7c35fc17329e337d6f2 \ + --hash=sha256:9e51c119992ea8820706871c30a4642ec76de20ae82f9b50b9a45517d8e9f810 \ + --hash=sha256:a5716a33bfabb2c6ce27b6cf03253467b3804f83e215f4d202685cf93c6c9874 \ + --hash=sha256:a5a00665d1a0e26763a7338d7e911d4598fbc1d50dd0d6b7919b7dc6c5d6569f \ + --hash=sha256:a5ca5aebae78a0bc13c1943af4af615d4966c5b650b05d5aa83b50e427196fee \ + --hash=sha256:a7b85b2cc6ea45e5f7e8c9a30bc9fabd47cda09106cbb4b967335c3e6c43b69d \ + --hash=sha256:a83ee7107df13abe42a54a6654670eef9bb39425cf2e27f65e0007465e1286ab \ + --hash=sha256:aa7d00b1700966d2917e54d278aba86897890ca9276dd8b76cf6446b6c181b92 \ + --hash=sha256:ab620eb663952455271ac37f9aaad86b73c969c02f11f53cea405b38e96a4300 \ + --hash=sha256:ad8b9671348d7c8716715652ae11f85ed0eb99e265a2df2ca490577d69860b2c \ + --hash=sha256:aefe930d113798330e9462f7874542977869c0613cba3262e2de3a8d5dee8f3a \ + --hash=sha256:b03af77d77e50edba2030fd5f7c352ff209314b09030a3cba7c14edf9a09a444 \ + --hash=sha256:b390aec180a7c054919c04898835e1c77bced23ea8383eb2c570213bf25d1a86 \ + --hash=sha256:b3d78f7bb2b9d9a30345be1474b9aaa8685430b54afb51ba3639b5c6c11e9ed6 \ + --hash=sha256:b5664603a253efd3a75716d793d1d3a6a82723b61dc6db767b2460bbbeec4c0f \ + --hash=sha256:b69602970994a2ed8bbfa78c2f0394a7435226c6040489702d9f0a0ad0c07052 \ + --hash=sha256:b6ae6a0328f0bc035741820fdeecdcd67bf4694eee03972e843663107122f450 \ + --hash=sha256:bad20d4c69c851c982a1e3606f4c293edfd5a87885786c50082412240c4b1ffd \ + --hash=sha256:bb7c99f0673c03017a3ee01e54a5c2617a05468b11eabe513b0080e063ed95b1 \ + --hash=sha256:bebb89489b279b2f5661bbbb2abcc87bcd4a46607bb4a5c966f04f1db6b8df9a \ + --hash=sha256:bfd1de989b3330420e29de39352f5c049905c9e3ee67233a50d550e3d652c148 \ + --hash=sha256:c2306e8bb53601979fcb3fa09cc65e031876d9ae01eff2fcbcd7a84ef94d5bc1 \ + --hash=sha256:c3a4e41e3096bf1f0f1b76e2ffd6d828d6547f574f702d59bdbef7acfa59db9c \ + --hash=sha256:c6834b92dd2428e2dd85ef3d85f723d3c12f20aaf43a2ddd4f944ca25d833408 \ + --hash=sha256:c90d3022d8a94778939cda8638c6c8da8fa757b8958dad7ec868ce29c87681b8 \ + --hash=sha256:ca307d6c259e5c98d3cb9ade55342b47a6839762caf2536f3d7b46ee660cc82e \ + --hash=sha256:ca7f6fe0f37ca978a1e5eb7a3a68e6413f417e78e838324947ffd420202b198b \ + --hash=sha256:cb6fae641357ed2f6e533c0d3c6504a4a5703621a50c89459e46051d56b61140 \ + --hash=sha256:cdaeeb6c350106df6bf9d873395973e5f066a9713200b72cd64f55d0a3eafab6 \ + --hash=sha256:cea20da04494e662b83c872683bf4ff2345206043d036315ed0e924b652e7294 \ + --hash=sha256:cea90547bfd93807e0013a004dc76552be44fad3bc1cc2b38610a9e889ed098f \ + --hash=sha256:d09037ca068d784ebc4aec290ef952ca27ac15dd9c0b5801a88c6e1096b83e6b \ + --hash=sha256:d27c2123977cb9269c30a49ba45f03a4323017ef693e19db4ec9dbe1299a3002 \ + --hash=sha256:d50de98e8d807dc31822fff96f50293163a62418eb65487a21b42713d72ed0b7 \ + --hash=sha256:d66a64dd5dec136040ec2ae94aa026a912ee60fdd45bc28d3db30037fd809e88 \ + --hash=sha256:d79308fa689fac89cbcfbd4dbfc80b5f95c54c5a7fd4d194be221f9d33d026e6 \ + --hash=sha256:da3275833be0edbaf4830fae08bae3dc7219f40ce0c37eaa6c25825957e06612 \ + --hash=sha256:dc1a26b8e53395a01c2c611e58602fa47461f136fba7cd5542e6db6d64be1839 \ + --hash=sha256:dc23390afe9f4ef9ac3bcc72a03a56eebbde03f4c571a32cb38f859cff9a6524 \ + --hash=sha256:e05c2f7925f1d88778e53cb44f14e0223204a3bdd09a41664750363acfb1f2ef \ + --hash=sha256:e12dfea7f5fc2a34a9080efbf79c4c44eb380ec5b9c6fea09407e08f0d1e941d \ + --hash=sha256:e4e4523d6f336708d732516e6cfca7796cf3d96c9474eb5aecf6165f2f1fefc3 \ + --hash=sha256:e4e49f7e1a4e7191bdf9dc67a974db714501b1fc52c24324103d06a86abd5c08 \ + --hash=sha256:e68e151428b5384f766cd25739bf77c7e4a3dc93b5ded7a12118d9fbfdf78ab6 \ + --hash=sha256:e8e4d953faaded9ec7ede36824e9814082d22d4c7b1eafbfa079ecba8cd0d076 \ + --hash=sha256:ee9df1f0d77b9c6e94f4ac0fec533fbddd5ea3a327807f18d7b069ae019ded80 \ + --hash=sha256:f0a887b6565bbfe80efde2b7f6e8890d7d9bbdb11bdb17028a3690c32fe0621f \ + --hash=sha256:f0f4a42db92d6ec7677ab9d12830a2a8ec145a9c6d15db2b593466bc875c78d7 \ + --hash=sha256:f1303ef2eec81262a4b708c3e858afe58d7c75ad91c1c05266eda7673369859a \ + --hash=sha256:f1d56ec54d257d05e0b50f5780d967540cd07beeaf9e5f645b26d50cce79f4d8 \ + --hash=sha256:f4167e87b397f273dc2356fcf1eaf50a6bac51e6105f45103ef7129c8efb0255 \ + --hash=sha256:f76fc85bd054c806960f917ec0f329e24e436f1712267d90588e4c39890caa63 \ + --hash=sha256:f942903fde7363d1d879057ec5de01310efda2597161784d752fa9953a01a71a \ + --hash=sha256:f9b1c4900736e489a812c529100de4b8fb617d4db075e931e213c57424b83d9b \ + --hash=sha256:fc271a6f0a2126958f4090e5507b9da5848927dae331f8f763bd4aa642b3d2cd \ + --hash=sha256:febcce10f2bcdbb80b4ea919238a6a4ac13dbc4c7cadbe8d5d75c3682f8b5404 + # via matplotlib +markdown-it-py==4.2.0 \ + --hash=sha256:04a21681d6fbb623de53f6f364d352309d4094dd4194040a10fd51833e418d49 \ + --hash=sha256:9f7ebbcd14fe59494226453aed97c1070d83f8d24b6fc3a3bcf9a38092641c4a + # via rich +markupsafe==3.0.4 \ + --hash=sha256:007e1ffd9bf65bb6ee96df7b258fc632a4868dd5566037986c64781f35a36e98 \ + --hash=sha256:02fa4acbc6a3fc5c693c34d4dd8c1130b7fe99cc915181b0ddd6f72aeb296002 \ + --hash=sha256:03470d1a8268e692ecf79ecd565593e59d44219377a7ead61f1f1b94c1f7ff6b \ + --hash=sha256:04e7902ba80ee4bac1d50a549606527a1dcf0476cd81403db41099d3b60ec653 \ + --hash=sha256:051417f74bcaaefa316276e0ff723f541616ca51043d070da00249d9bddd3e3c \ + --hash=sha256:05295589e619b9bed252a86b532b8e27350abc372d18ba89b59375325e91ec1e \ + --hash=sha256:06de8ef6331f6e822c28d577dc8bf43fe398800477c49498f38fc38b67ff33fc \ + --hash=sha256:0764a13d34cae40db7bbf3a09b7e9b491bf4603e20b263a7a9d6b8e324975d0a \ + --hash=sha256:077293e425f28ec737dbcad442a71752e28f8ae27cde3d68acd1fb212091cd92 \ + --hash=sha256:0930db9bdc62d22944e10b066448bb65dc9abe9112880c7cab8da54db4284d5f \ + --hash=sha256:0cee7cb0f9a1b6892ea482237d9403b3d1b4603aee057d0ff01f0fac2d019a97 \ + --hash=sha256:0d9c47709875fdb321452056622e930c52afbc07a7d780762fbb8b4d91ce6fa4 \ + --hash=sha256:11935df9bf455ed0c04eb87bcd720f02b1fe5e02128a9430f23aed6f93336fc7 \ + --hash=sha256:12a606a492de952afcb43b59a14aaaaad120e708d3663dd0fdf2d738d427a691 \ + --hash=sha256:14bd2d845d62ab678eaf81da89d7b621b51756c72346745c1a594c09d49207a2 \ + --hash=sha256:15ba9e28640feef770374b116a6f019c21f52404aeabe516aa7f800587b98cfc \ + --hash=sha256:18a801868a884f216e784d7d14db2a4077143ce7610440aee2ce8f734e7cfcde \ + --hash=sha256:1c0df495a977d10460a94941799c72d5b5ab03d3858d949b55b5a66c8f371c99 \ + --hash=sha256:1caa2fa5a6184fb233153b35f654e6687bd555476f6170f29d8ee9be1a8b0af9 \ + --hash=sha256:1e1451fab512d1bcc3dc26988ec1edb0b82c2db909132872cd9356070a6b63df \ + --hash=sha256:1f1f9477e174582b0a1b583d60b66e1f2cf5d3fe12cee985e4aedf44766600e5 \ + --hash=sha256:2628d3a8cb648ecebb3c5d6b0a1052d400e4d8b7ac0fb786be8d285b50040d17 \ + --hash=sha256:26e9867520db70d37f7fb421a7f0d8adb40171011fb84ce869afa1a83370dfa8 \ + --hash=sha256:2a6ef68ae94aed8721934072b27a3b654ea2100b97e4ab864cf1489c90926fbc \ + --hash=sha256:2b2b1e18af909b448bb3cf9e3433366f7a8726271fc214e8b10e0f62a78c724b \ + --hash=sha256:2cb3dd71fc6be918ad4264346a8ed69485f9b7ed7bf35495d8e22807cd6b8bea \ + --hash=sha256:2d1b7d9308288661f56672b1b157d75fc536714d3638487bbea17b6318a78248 \ + --hash=sha256:2dad610540cb2e6272855c178f08ae9a1c7ac258a7fb71660553a5f104b42741 \ + --hash=sha256:2e5a7cd7fdd14fcb1ae5d7d8bf23d24fbd1daefd1fbca2580132e1ea75f098b5 \ + --hash=sha256:2e9ad7dd851bf45fab9f75cbff4cb493fee9979e8d8c7c9c3ee119022518edd6 \ + --hash=sha256:340cbb1957ba99929cbf19a75626d36ba1ae21d1730b287d1cf7f824a20c4fc7 \ + --hash=sha256:34bdde374c5932765d7dc685c4a1d191a3207852d67e8e0a9eb6ea85156181f1 \ + --hash=sha256:353bd63081912ab8cfa6a0c7d185934cdf8426f04c618bba6bc4b394f2069b67 \ + --hash=sha256:387d8cd30e69b3f0a72877b9ae717033396404e19095b17fe89753a981fda44f \ + --hash=sha256:3882fb412298575bae3b9c46868251f15cc69307359f87bb1b382e53d6e5a2c9 \ + --hash=sha256:38fc55594dab834470b6733dead2ee9e3f657fb0608c769dcafa0ba5ab52f45c \ + --hash=sha256:396ec4e65cc889f69786b3b89478b471cee5a3bcf468b9d9bb03e1a30fb291fc \ + --hash=sha256:39dbacefc411633db5b4378b066a9aca70a3d7e2922c9e578d825f844026eeba \ + --hash=sha256:3a93d9616ddecfb393727a0041a562cf0b15a244e20f2bd25efc7949be4c4f17 \ + --hash=sha256:3d23795802fc8bd72534836d64489bbf0f67c088959091bdb22e10735a5107bf \ + --hash=sha256:434139499bb20b502ed3baa1f169e618f924a97e7a777fea1a49446d80106cf6 \ + --hash=sha256:436e3ffc6310d3c41878c601db29098102fe5d8a467c49da4a4125254e0980f2 \ + --hash=sha256:489505b03f692c3f376394e49194fa7a7f9e8558d6e293a7056a0032b0c38163 \ + --hash=sha256:4a540e2d3192792fc84eced57bef37851ccb2b41f73291bb17408eea77bcd278 \ + --hash=sha256:4a7cdc2a420ca01058182da4253329764d4bfa055564d1eced90e6ba1e8b1d3d \ + --hash=sha256:4bced6e2a6dba6a28f7dd3c6ce14df1b2dd495923f16ea484cad03decd463b2b \ + --hash=sha256:4cf3468d5ec187ffffcaca8e61929a37448f215dafc1386a12c750a72fe53634 \ + --hash=sha256:4e2c4809c14559aa7ef426f27fb35afbb38104c349a903bf8f3600456764bb38 \ + --hash=sha256:4ed644d75aa94a2baf7ec3a96eaa160ea58c742eb9d27c6506053c5c40fc84ed \ + --hash=sha256:4f6e0852a0283b1b1fd776eeb7b766a5f440b3e2bd31ab51af3b400585f3965c \ + --hash=sha256:5066b244f576f91afc8ee3ba029a89f99d39c79b1853fe9d39bea9f0afbec148 \ + --hash=sha256:5086f9975abb1ab531ee6afca1761e4b59a19b446f3f6522ed776963228cfe5a \ + --hash=sha256:50b5bedc9ed8a94fc8857a42ef4f84a81ea88f8d4f05dc8705fb23ee6d8dcca7 \ + --hash=sha256:52704c5d36eb6dda8866493decd61111fff86244c9b1ad225ca01b9e91e5970f \ + --hash=sha256:55ffd6ce583d97dc71dc92e930324c8c0d25aea7e3ade6ae54ef77cedb096811 \ + --hash=sha256:569d65055d367e3dcdf30c3f41119467b73d9ee9faf332bdf40402644f5ac08e \ + --hash=sha256:57f9947a7e57a081c1e3e0a2dd0d2dcf290a4531450e6f611e30084c222a7295 \ + --hash=sha256:5989cb26b2e1efc6a42216a9f6b5ee495ce5ace2e5b352a9af489976b32d1ee2 \ + --hash=sha256:5c22873ad1f0532ba40fa1727f3c0fc1bbbaab6d373d4cbe3f0dc74b2e2521c7 \ + --hash=sha256:5e8b3d0b18fd623afa12ecb2ce8d8becef69f9b5440c6330c7972200e0bb84b0 \ + --hash=sha256:61631e08084be9e21a8967ec3139c7616ed7c5e9368e05c86d1b39562c8a57b6 \ + --hash=sha256:64511c54db4e4987aef4c41923235927428729e8174c5dba488429be70a998ed \ + --hash=sha256:6669c1bf34080161ce49c589cc512ef24d4c704ac9d2b2d3667f519c60418378 \ + --hash=sha256:672d207103e6b16ca098611b0f9efad6bc00afd47c03d6ef62186495ca677dc0 \ + --hash=sha256:6768d67d1bce64270e0fdc2e69309d68b9b18ae56ddf6c711d168e9d051c2cac \ + --hash=sha256:6a45c3d514f2436064db00d7fc8778d888f0236ebfed649b53d13a59e69ad51b \ + --hash=sha256:6bd9e1788e15bfcf6a9082de42e30387e7b85d211ab21e57a939bb8cfaaf8d96 \ + --hash=sha256:6d2a9efe686f9de00d0d1ea32a4a5a86d558a2277501bd78d964214eab625e59 \ + --hash=sha256:6da83a088f8ef93b2d483a8232a4dbf4d69d3d8496b568a03c56becac43e1808 \ + --hash=sha256:7018d4af1cd272e847aa5917983ab5e83e4f6579f9dbfecd4a79c0ca80b144c2 \ + --hash=sha256:71f88e749ea29f67f21f3b36433c1dc54c7729ed2a6d9e2da2e0d9e0d7b224eb \ + --hash=sha256:737c9c3981998eba27f11786f84fddcbabc74068b72a4a1f454ea02094b57b65 \ + --hash=sha256:73e77980c7207854f00fc4e71fb1626868d5740ab4012623d55c7a99ad122a72 \ + --hash=sha256:799c39bdf5e2f1292fedd3009f7b3c9e760f10b2420cb9638d56920840ff6db8 \ + --hash=sha256:7a83aa6e4805df46fed18e989d3d16f86ef60cb50bbc8d9ce3a6be89165fbf6e \ + --hash=sha256:7d3391b2188d18737cb2fa147028b1096236eaa7e156446c650a489fa2cadc91 \ + --hash=sha256:7e1636da3d8dfc220b6dd10264db5f2b165e4888c4518594898fbe381049af8a \ + --hash=sha256:805c8b84534fa10891890f0e4be39f3a99e94615d93e8836bf9fa1fdca2feeb2 \ + --hash=sha256:811d02d5122171c1941357efd8f9bf4ffe907b7f0a1a4e729a880e4be3f46e3e \ + --hash=sha256:8138eb83940ec7299024d92d4dee45f601b9e6c5ffde9d25f4e35e326203c707 \ + --hash=sha256:83b3944fea42a8400edf92fd1770fb8d0d4f7de651353bd2d8525a92dba69a21 \ + --hash=sha256:849dd2bb0e5e4ab2b71c7191726a4a8d5aa8a610daa584728cbee0b710ddc4ef \ + --hash=sha256:8698d70a8081ee8c090dbb394768b5789a1da8b131b5499f89d071dd3cfaf6be \ + --hash=sha256:8781a792a070cf2bd1b86d3aa943894115faaba6e88122a7bf32d62072742453 \ + --hash=sha256:88d59b473bfb03259722600839af9bbd7fa13a2eb514beefeedb95997882f69a \ + --hash=sha256:8909c2f1c6dd65e054ac4b573a91c8384d1492281e55d82d159d653f7a13adf6 \ + --hash=sha256:8965520ac587c94a4ac48b729be3d8b8de00af39699b17585dfb599babe77977 \ + --hash=sha256:8b5d563170ff8ba3181caa967c99a3c804d1dedb702c7cb93a6a7c32247da978 \ + --hash=sha256:8e124f974786f831d6043728e38296969d3579db8896fe004682f5758e613581 \ + --hash=sha256:8f0fac8b13d14bb06c68195f849371924ae53dd7b1c00fed24650f704383b692 \ + --hash=sha256:9240187afb63d2f9ddc3e032c670356fe941f6e20662ea168a5dc3f1f317e1b3 \ + --hash=sha256:925f929d6b59a8b3f8b8c6ac363cd0af7eecc81efb3071770b3c6717c450a369 \ + --hash=sha256:9348cbb300d224fe3b89793262cb093504d4ae927004468463f745188a193e4a \ + --hash=sha256:9388003072b95f2f1e3fd908604194d653ba21330d811961a78b7da1a77e9e36 \ + --hash=sha256:9438a2648b2195980cb2dd8e53ed7b8df91319e2d0b70ae61a9e1d1bc8d3bec9 \ + --hash=sha256:94e4c421742086aeee4c32a506eec8859d7634aad943f7e6aacf70f813478768 \ + --hash=sha256:94f5407f7bc64fa6463906b896f9904beeeb7dd8dc116ee8e9056c8714ff9916 \ + --hash=sha256:971a3bbb75d97ae4e2e8f7d4834236f86f85f0c85e04ab2e191db1123b04f80b \ + --hash=sha256:9e227f3dbe6bde7491cf0a9965d00b88c6b1a4a95d11480ddf88bb96d397c19f \ + --hash=sha256:9e25feb9e330b63edb0278a0acdf85e50d0cb0fbf49c3084abbe4e24ae195346 \ + --hash=sha256:9f098115c247e11d138ab83a28fa0323c77015007ea2df73ba5fd714dfefd67c \ + --hash=sha256:a18f38cafc329bac5e3c2b96c765b4c96d3d103421ed22ab7988c1e3fce27464 \ + --hash=sha256:a4bbd2d87dd233b9fc5812160c3d0ffbe42edc22a26ce0469f58479ede633fe9 \ + --hash=sha256:a5fcffb37e602b0b3c1638a97746b9b96125caa9bcf6fa41d337a9261de231ee \ + --hash=sha256:a8e9f292fcda89b324f2f5c91d13f1424a153e40fc2756f38ee23b15835ff300 \ + --hash=sha256:a9f54054101545a9a9cccefddf54316aa6e4491611fcbef9e91b3b6bebec04f6 \ + --hash=sha256:aa2c838cc024642cc04c6854232f32b43e5e22833dd11119c1766c7873b8370d \ + --hash=sha256:ac0c7c9f1609b0c4c114feb1d7a3409564c7fb77e360bed9e97e5d25dfeaf868 \ + --hash=sha256:add96447a86d205ab616665d53b2950ee81083757f56e6ea833c8b2917646b46 \ + --hash=sha256:ae9dcb8fbe244cb82f8a6458b455b927a03685e383d9bacf1ea5ce180b96dc97 \ + --hash=sha256:b4a635a0487774f841cb1fb62e907e7195cc95bc761e053184b8acc3ceb20733 \ + --hash=sha256:b4d12837e0203bbace818ff4a7461afdcd78bcd782351cea148139180d7bcffe \ + --hash=sha256:b61687d0828e72bf5cda24a2690188f37170bd31c9359ac97e4e66569f120a16 \ + --hash=sha256:b807e598953730f82e4eae3bd30f6a122cf6b31c398c6b504c0e04c13c170429 \ + --hash=sha256:b8cd1f918b26fd7b1832ece557cc18f2d8747309ff8b3f0ef9d4250c5ad67a39 \ + --hash=sha256:b91cc9d336957239ff200f30097e6fea2dc6d6fb3c81e853eaa09eac904fd894 \ + --hash=sha256:bd3ce56ae2cbae3ba82b683bc425cd7e48d2ed8b10f3e818186b6f5646d9271c \ + --hash=sha256:be6cb0c799abb0e2ba3e618e6d28ddddf7e485f6c2ce938dfa237daf3905072c \ + --hash=sha256:befb4158af32106b9a93db8d6d1d1cbbd418c0d5aca0cabb7b1780abf0c89169 \ + --hash=sha256:bf053da3c97a4bc5ecfbb218cdd2983febd91c617be8367d139882aa11e490aa \ + --hash=sha256:c02e8f18bdedba082cef725942ac823b9b60656db07f7e265cb31618dfd00d77 \ + --hash=sha256:c1bc67752d5f21013cfe430df4062441714eab79f65a6a05e01505957e9c35fe \ + --hash=sha256:c61750fadcd119d0825bcb7d7d675dd264dcc89cc05292aab5be68ebdbb374ad \ + --hash=sha256:c90d5b3d4e944e065a301d741b3c1d784f6bd1f503aa68b4967e32b2ba313d85 \ + --hash=sha256:c9a7f43c0b202b334cc9184af09bb8f21d3a209e038efaf106936fb69e6b026e \ + --hash=sha256:cb96e6e088d6cf71c1ea977510948320234824cf226e32f6f6e044f7a9c82b34 \ + --hash=sha256:cf63c214fe879a65e69a386f915e36104fc84254ab141240f8854602d8e0be2a \ + --hash=sha256:d1aca03ede943eb80ab3d63bb082c84b7aab85ea83bd0fd0c200260945fb49d9 \ + --hash=sha256:d2e56fd3b00222722abfb3f5f0759ddbae4b90811b5ad4343c64030ad1bde70c \ + --hash=sha256:d5f93ebbeb8032d47e349328ec8662d973d9b05a70b3c35df1f91fe419b84749 \ + --hash=sha256:d882a373d8093c2941e01291b7ced96e9cbe4781da9a7751ca7e6c70385e5214 \ + --hash=sha256:d920abdfa61279ba1a2ef9484aab07bf03331f8c08a10120fa332353d06e6932 \ + --hash=sha256:da2af0d7aebfc2074080d72efa6ab8317c62481ef1f896f65d9999c1c01f4494 \ + --hash=sha256:dd8ea6ebee7aedbf7c749fa80521d9ccf1ba473e0d1e14805caafbaad281c889 \ + --hash=sha256:de8b364c423ef0a4bad9069657d617f9a5d2b2062457a89b1fa16ee199c399c1 \ + --hash=sha256:df1ae86ff54725a01fa1a0510b914ca53a161b7050be74f6204e24aded5971d0 \ + --hash=sha256:dff05cb7016dff1e9fd68f4122c127b65dfc59de5306cfb7ad92f956f230bee2 \ + --hash=sha256:e1a622f13970d81f95d0c72f9dc090dce9085fccfa4c9f2174377ee32bd15786 \ + --hash=sha256:e49fb0d1ce92cfa0cb198cc5b1b11cdf9d0638658e2a2db2687e39db7c87fc78 \ + --hash=sha256:e5c802729725bd07e2bc3ab7b76dc7e0bbfc53129d8f1eb1c002c24cf774717e \ + --hash=sha256:e841068dc0be4cb6dfb5c890eb88cbdcff2f4a332393c7ec94e8e618bd32c1a8 \ + --hash=sha256:e916035e3e9930cbdfdd10abf48861340221857f45509565898e012263f7b289 \ + --hash=sha256:eba154571c16e032112afac0dc2dfe9e63c2ceb7aedd07bb7eecf2ce26d4dd4c \ + --hash=sha256:f03460ff076f70ab595bb45a0205ccea1971443575b6920c52e755dec2b3fbfe \ + --hash=sha256:f0ec3b750b59375eab5b0fb2b9254810c00a3375be6d789899f1055a1d556237 \ + --hash=sha256:f291bcf42ae98eb5107edb162c3c998b4a89648fd8e99ed4cbd12705292788cd \ + --hash=sha256:f61efe1d2fe0de16158a5fe1d1cf3c14bdb6aecd54d8938fd26512c525c1f624 \ + --hash=sha256:f68edfc67aabac33708941f26f22a7b8e9f81429bc0cf249fcf7d66b23af8d19 \ + --hash=sha256:fa95848c929b6a75f6848d3c9793e59db365ee436776e57db835cdbfa79ba977 \ + --hash=sha256:fd9f8797427910198f95bced71ddfed61130d7e349213bfb8466c9c99e2c46a8 \ + --hash=sha256:fdb4ca07ab75ffadab4a8b135ad59cdbb3156b99310f3d565370da74a15d6bd3 + # via jinja2 +matplotlib==3.11.2 \ + --hash=sha256:01dc8eaaab5a9fce9ff615eca82345728f289e4715b186ee10c6d85272fc26bb \ + --hash=sha256:02329432ae5c6af87cf208ee575b701d698bdf0b1a3bb28cc6d53c36e967e575 \ + --hash=sha256:07d9b9fa60cd4c393692f50d0bb03123242ddf61c99bb0e95e75feb354e7c1a8 \ + --hash=sha256:116cdb0eb0eb5644fc98eb2975d4b4dd4ad35e5c8e6b851c22e6976f371f7ab5 \ + --hash=sha256:1944895967f87c84c9b4bad29a707b31f5b36df4a3a2339ea1f8ea3ce5105539 \ + --hash=sha256:1a3040b209f3968b4e84161df7b174f07a9fad33b0f2d7e48ea3bbd3075e2863 \ + --hash=sha256:1b9a7ad579856284135e401ecc918c5f8a017ee30539298862a109f51b971710 \ + --hash=sha256:254d4ddb2fa8df3b4c689c0c306063aee10521df82cfb438185e499c75fe37c1 \ + --hash=sha256:2a8285cea8ef4d92aa041d1c33788bcae82248503300f93f1ca2136b9049452f \ + --hash=sha256:30ec15d7eefee71de16b7c689b42ba49715a4644650b76a6c7c70d79daf24e91 \ + --hash=sha256:399fef672f7046ef7d6a57572b2a6f9845f3f5afcff04e7b2df7a363a9f42190 \ + --hash=sha256:3aa4b8516fd26659e4363abbf317c703d9116496c5db2e9d0609a2866dd39dd2 \ + --hash=sha256:3da3bc0cbf7245e7db72cc6d29d12c5abef72cb73059c73b945f14e3545f3eb2 \ + --hash=sha256:3e8576f7c47e02fd4f21f44171302d2d1d58d4471d46da3d71fe8899d19539d9 \ + --hash=sha256:57b9ea60a835937c2012861923cbb91f47db8565775d326d1c42fc926aa10351 \ + --hash=sha256:5e1e923a3fc3326b99ec0a6ff1ab1338ac6c6cc62ad9d8a9c944197c7f8c6221 \ + --hash=sha256:643ff850d8e0f5b8319337f87ed3cb59506afb3df3cc48de777d85871233be7b \ + --hash=sha256:75b6d88402770e181b5d06a67dda4129c31da7d05004d63a21c310ec78d1b83c \ + --hash=sha256:79a258f58253dfa025af80a9e9bb228d75fced007f0e93ae7423fefbde81a74d \ + --hash=sha256:7d43ff8cebb50840648cb6429b2228621dbd709010f3117b3740abb20abf21c0 \ + --hash=sha256:7e5a90f8a707ebb6004a713b1cff091a40cc5df4c7c1cb165e5a505ebc11c292 \ + --hash=sha256:7ef7a53b66780e5d942923724f08577fbc5be1f7322da0f0f3f9dcaa45dd803d \ + --hash=sha256:854df8d7dfe9fdffcbaa6f39e44a6c24b409cb4d7561fbc09213b157d833f6a6 \ + --hash=sha256:894a9cbbecbe30ae6787d464df2e8fc7a8d475cfc68f87c3029f7c11152899b3 \ + --hash=sha256:8c8255de28f986d935a64c9ca71c0ec2d2f41d355691f5ea684725dc91413f71 \ + --hash=sha256:930efb28f59fda124e39265d177bab302625297bb147d2910de725a2fc2aef54 \ + --hash=sha256:a24d5fd36e4f0e742c3851dcd20810e56a95633a342e4bf6cb591c678e8fe61f \ + --hash=sha256:a6939df7567114b6bac7f4c5e06c84a67f197c1b2f2e4b234d4eecb3bfec9482 \ + --hash=sha256:a8756cc73d9af9a7fe0deb54ea2e75ef73b01d9e575877e72acad5458e660943 \ + --hash=sha256:af2661f6ac6bbd1d081996f54fdd9385715c625ace8cec0869055c0cfbf38981 \ + --hash=sha256:bbf1062991d826ed27e2144f3afa4461afbb8ff56e8f703043e191a8163b1ee9 \ + --hash=sha256:bc067c462a86f0e57bf52fc6e058d90171a5420007dac00c46e90153050c69a7 \ + --hash=sha256:bf3fe71fbfb8ec0e310e0bc8537c3405a01f38f25f9394ed2135e6202fed542b \ + --hash=sha256:c0b83f044ce10a98027b105b3931548719a6e8c7ef986b4362651e0b5367c8dc \ + --hash=sha256:c27e577ece613ea12a0790e00b4eb80d901c59a3e16cad474f31d8b1529690b9 \ + --hash=sha256:c5c1c68ee401fc98271263410f0e5ce88285abacf7627132914e8adf3d70ff43 \ + --hash=sha256:c9721f81275499da1feeb36a2cf8192ea086283b3bd16b7dc4c9d7aedb7396d6 \ + --hash=sha256:cc82dde2a0d3e3ad472edce04897ad7146b8d8bfd1df8a32992eebb81af18fdc \ + --hash=sha256:cec596316640f2b394b8f0daa0ea61a8eae82d017b620b9f202befb972a59ea4 \ + --hash=sha256:cf41ecd1b0c0b6f7177ed965a54c2afbe888715c7cf6054dc12d53bc1494002c \ + --hash=sha256:d3304eb5a59442a8867f6920d484591c0fa09ffc29e9260be2feec3351e25869 \ + --hash=sha256:d480038c83691532ed52ff3147db51fa902fc78cb2d8349993a1cdb684435bff \ + --hash=sha256:df4f7784aca81a94f254c0a2767d592ee25f407e488f5fa7203e51093fb6ca27 \ + --hash=sha256:e43b188f0a5b75447bcc197728258166aa64365770ed1caa36595a5e1ca4bbba \ + --hash=sha256:e60cf3047a51edecdc4535a9196bbd6a732936b8e9f8184aabf4d16165884aaf \ + --hash=sha256:eac4b07d4e3743b172451e122ea964f72f152879d4f9adcf3f3d33e518f12ead \ + --hash=sha256:eb3712dc9b464793de0a4e42a7313d50293c751f94bddaf7332a1bc71bccdda9 \ + --hash=sha256:ecea603dd2fbf8242fd31a305a8b12a4ece2de28096870c65fdd0d1e35b8d9a6 \ + --hash=sha256:ef31985c4dedb5f1424e1aec6849a47dd37689cb7fa3c20b1b82187f26806261 \ + --hash=sha256:ef752769cd962f39ea0b6ffc82d1ea43a0012c5a6157c7a075212fa509cfcff2 \ + --hash=sha256:f25446b2981717dca9786bac841cb3fd7efb568e3e3c755dd980481c5cb9228d \ + --hash=sha256:f2ac30cf5eb5dff1b584627ae0b0e1186551a4f69ae3c75073911da497a29170 \ + --hash=sha256:fea03cf56568cc1cba08b470be6a0559e71c3a5b688d54b7179bb35ba23d0821 + # via policyengine-taxsim (pyproject.toml) +matplotlib-inline==0.2.2 \ + --hash=sha256:3c821cf1c209f59fb2d2d64abbf5b23b67bcb2210d663f9918dd851c6da1fcf6 \ + --hash=sha256:72f3fe8fce36b70d4a5b612f899090cd0401deddc4ea90e1572b9f4bfb058c79 + # via ipython +mdurl==0.1.2 \ + --hash=sha256:84008a41e51615a49fc9966191ff91509e3c40b939176e643fd50a5c2196b8f8 \ + --hash=sha256:bb413d29f5eea38f31dd4754dd7377d4465116fb207585f97bf925588687c1ba + # via markdown-it-py +microdf-python==1.5.11 \ + --hash=sha256:0f9af347bcc4d036e1290c07cc28d33bacfc84a54704a3aee52c8be61a387a29 \ + --hash=sha256:700b0125bab3e4f1af0c3257e0d06b57655259be7fac3eaa8a058ccff8616e96 + # via + # policyengine-core + # policyengine-us +msgpack==1.2.3 \ + --hash=sha256:07c9733089d1b176c3dd2f7fa268452f9d5d784d076473499d754a58e8d1fbbb \ + --hash=sha256:0955b9000725573d1457c1676944b370dd9643c8d18f25bda5ac72913f850949 \ + --hash=sha256:0c91762c48cd686dc9cf2b142c0bc544083952de32f5853d6624c956e54b85e5 \ + --hash=sha256:0ed5823c4efc20fe87d3530665f40ec18a002be003114814c21235cc8d256207 \ + --hash=sha256:13221a6c81ebb8e43ea63a7251c35d54e4175cea37ebf3a62e911bdf42562a3c \ + --hash=sha256:186e6c602b8a9968b8e864c67d622a69279f7d1e55ae25f40e3bff7e815b2b62 \ + --hash=sha256:18a6ed513023001b28dcd3ba54966f6bb90a38274ba8d2640464bcab3a1b81d4 \ + --hash=sha256:1d6bcec3dbbdb89ca385d3a73e63ceae7b841fa0d7ca7c676f1a7bfe7fb2cdb8 \ + --hash=sha256:1f4ae8bd4ad9ba085fde95e95d055a896d19210238a4199a771a3cf36dceed49 \ + --hash=sha256:1f585407f740a9eac04a3bb82c61d68a0ea78f90e29e670bfb086b9ce3a518dd \ + --hash=sha256:21bfa4d2aa0b04c1806ef778a1199e9e53ea2441bcbf284420a32083896320b8 \ + --hash=sha256:2487453ca1b6104442c6442f9a1a8fee1fe8f428a70d99d4cba799108b304150 \ + --hash=sha256:2574ef81c1c8c38b10e330f3f9406fd09198a776b002030fafcf8e7647e9e06e \ + --hash=sha256:30e1522e4173230dca4d9ad896f038f73c0da6c1edd42f4dbad88ac583cf5d46 \ + --hash=sha256:32edb81a2b5eb7cd7c9d941b2bfbbb082fd2cd09e0e725930316af6b708db186 \ + --hash=sha256:3372475211a9ce1a23acefe512cb3e121d18c95dc74ed56cb1819ef40836ebf4 \ + --hash=sha256:382b219de3d436de3baba0f4b0c6d4336e8f5858d0eb047918b13b69a71c6c55 \ + --hash=sha256:382bc88fe90f29f5ac8a0b65c7046ff255356f2f2f3186c30e370215736fa1dc \ + --hash=sha256:39b6986c19e1f2dfa549d185dba6ccf1de2e4c0ba10d8cfc0048935b1c5f9109 \ + --hash=sha256:3a31905206722103a84c1f72633fe30692cff6732c9d262e09a27dbc468797c8 \ + --hash=sha256:3d4c807ed050fe3ddbea5ba7e9f63d7136871ce42861be1f50ff739f0e91047a \ + --hash=sha256:3ec409b0d6aa8e9eec6eaf881b893caa215dbe68c5319ca96e8a271d81bb111d \ + --hash=sha256:471e12a6a42498a31490c206e0069e343b6a7c35db540be73a879eb06f5be047 \ + --hash=sha256:4c0780095871ecc49a58b2ff6b1b43b25214704da67646557ca287a3f49fb2dd \ + --hash=sha256:59612b4ed48a04cf024584218e813562f3b30a3bafa5f55abe300b15da314751 \ + --hash=sha256:5bd5f91ea75c45cafcc5433ba8fae59b708b736ec178d2441c40c499e9e079db \ + --hash=sha256:5bf390259cb25a6a1cd197c65810999b811f64cd38683251538bcc5a1e41f7d3 \ + --hash=sha256:5c1efdd9181cb1b719ee46865f368a927f1c0c65d577798340b1194545b7515a \ + --hash=sha256:5e0d7950ca3c1bbae291d0552dd3bb2792fc680629c4c0d44e47e5bab969f3ca \ + --hash=sha256:5f304123b90e8b2e49867981b7f6061612c39f50cca51ee88de007c084cf68d3 \ + --hash=sha256:62cc1a4ef0e553bac32c8342e1f04834aca7de276b92744eb7307db77759b890 \ + --hash=sha256:63bb7448a1e9111319ae2430c09a5596140c160422830d6271bc75730ff2ff9a \ + --hash=sha256:6576f348ed6cc4f31db6fd915a8e94245f042f50eae08d48732425e70638ea37 \ + --hash=sha256:666ef5601ab0e6e345e47febc96aa81143cc932201543480cbb9499164f05ffb \ + --hash=sha256:6707d2fa2aa1bb5424ea0b05f44ffc989b15ab41a73ff5855bff4944fec7c8ac \ + --hash=sha256:69ad12cedb674c73527bed869cddb42b742cac79a207a614202a4abaa24ea173 \ + --hash=sha256:6a834097144aabe948b8ca9020a833e8026f7d0abbd0ec54bc7e50f45a8ce012 \ + --hash=sha256:6df430419f2338cb71e4a34d6e64f83c88ccd321f91f40ba4513400b36d864ec \ + --hash=sha256:700bc0fc9e968a292b9137ee70e7a012f7e115bf0107ce45e3a88202788dfc1e \ + --hash=sha256:7013534a7163aa4f213c4d9864f1a8a7555daac6fcd48f699a198e29b436bfab \ + --hash=sha256:7995a7c6a62a1d6e7df211b4a16de513bd99fd053525050a319f80f44fb8015e \ + --hash=sha256:79dfa38faf92f804aa61beec140d70b18418e1dde1778dbb77a87a4cce85aa8a \ + --hash=sha256:7a003b02c6ee2eea6dfe0bb08818631e3597e69f0131f2a8250488a1cc553290 \ + --hash=sha256:7c047250096f9fc19dba26e3d1639b5e7a84114003605c94def667149a70ced1 \ + --hash=sha256:84a6616d396ec1bc18a1e83e67c96a393ec35dfe5e17434a5be7b9aa0fe988ab \ + --hash=sha256:87cf2ef05ff2f2493ba29fcdaef27e960ca64dacfd13460ae29e6f92e0ed05bb \ + --hash=sha256:89c930aece4e972b208ba589c8410b4167b05e411a5ea2cb25fd96f8bc47ee43 \ + --hash=sha256:8ca67f77938ea6a3663aa9bd22b3e031f6da84d665be850abab910ee90728dfd \ + --hash=sha256:8e51eca14fbb65c4e0a5a9657346962bd3dca78c08e04e3d4dee70ef48687d30 \ + --hash=sha256:8ec7a1d49ca6c2569d722ab5ec86e90089b0713900aa31905b47b4c4d9e78ce0 \ + --hash=sha256:902f3490db0e07a7d40b48536a85c9b28fbf1397e7e1658a45a55f958e303620 \ + --hash=sha256:905a189853d6bdb204c7ae5f4ab77fb857448abfff574d3d93c62e2815b24b4f \ + --hash=sha256:9276ba88891338f2617044429dfd080ae008c9868a25f6f1a7d004a35dc9ac0a \ + --hash=sha256:9324c54995641c3d1f92a9d55093c8cde0ffa2fbc87a467a688ef60428393220 \ + --hash=sha256:968583e956d0427878050b371308c5f8647088732ef3e66a117dbe1192ec91e0 \ + --hash=sha256:9d7e9cbb0998bbfd363fd9a09c330520d5e9cb323c05b5a1a05865d23ccf2226 \ + --hash=sha256:a393e428f6ffb0dcb73308c1fff5593041c16ff42da66e5bac8a83a6107a54b0 \ + --hash=sha256:a6b63917d60d6df451f328bd6afba8565e33c4afe1f62ec4ad758b78731c827b \ + --hash=sha256:b1631e12fe572e181cd77e831f69335d6cd5278eac22e3db3f33cf264ac2ac18 \ + --hash=sha256:b774ff994d844e541439ac5d2d49a14def4104830c3465e9394c153f86200ffb \ + --hash=sha256:b949cc25e4a09252cbcc54e66e507de914d0e94a3a7039bd54c299bf7037c098 \ + --hash=sha256:bb89b5dc30469c84bbf8684826eb851d82412ca95690e111b9ac5e8fb343961a \ + --hash=sha256:bfe7d5b62cbe7aa664f0b3e2c49077f10fcdd06183d3014f8271ff3c5edbfbf9 \ + --hash=sha256:c309a7abae1d14ba29a8bd0ddbd704a5e469d8e9bd9c3dee0e4ff53d7ae01d56 \ + --hash=sha256:c77e27790ad72989db783d5303825fba0b71550f00a490efba35cde7dc4b719f \ + --hash=sha256:c942c21a93f36b3a69e828c8945bb72c94dc2ffe488a2086950c812f3edf046c \ + --hash=sha256:ccea05b5542f6d283fef3f0a8e93a7f0be90af0ddeeef84c25c0216ba76dcae1 \ + --hash=sha256:cd5a9f9f86a52c24713679aa2631956835f3842512964ff93f736ff76f1f530d \ + --hash=sha256:d0238cd05dec9ffbe0de1071df685ba63e30a36ac155285b1a094e727c38cbe9 \ + --hash=sha256:d1c1e8989a855b7f1f2a64ec4a80b23a631822903952770813857b2e4f460471 \ + --hash=sha256:d2f9c4f85e47a44d26d5baf3b041eef23436e224d44eed273f01bd8a12048d9f \ + --hash=sha256:d31864ba3933a589b6a00249f89c0eb422197f49128fc10da550e57e9cb0f377 \ + --hash=sha256:d8ef3a66e4b52d2d7fdd90df2984670124b2ff7546d76bb25dcf68ef47f7df58 \ + --hash=sha256:db84203b13aecc222f465061397fdd5b53b7ae73d2c95ffc1c8dc5be0153a709 \ + --hash=sha256:db9fb67a3a2e75247bae569d34ebb5ff61c0448a4f0d6dbf991dae68af39b007 \ + --hash=sha256:e0bd394e999949c814f7912284243298de1b5a17b6a3dcb6cc8a79b156ffc4fa \ + --hash=sha256:e15f70588f4db8cd10df0930145b186de70feb9db51710cd378b1399009655bd \ + --hash=sha256:e54394b7dbe2e12ab032d9d21feef7bb61a90a150a2623633ba3781ba69dcb1f \ + --hash=sha256:eaf7e82249837e3aa97297b34a0bb9ff562027381631e057cea6e1367f10b438 \ + --hash=sha256:ec0030361cc861ac699b2ef1c695b741fa145c88f8667fa3d7e3f73deeb648a3 \ + --hash=sha256:ec90a9ae3e1169fa1171147340f0e97d941aa19fcd3b34e8339a55933ed042af \ + --hash=sha256:ed899d73a22f286a72bd9528d63f2ab3030dbad8bf1527fc249319a50d61fb9d \ + --hash=sha256:ede33b2892ceb976283e009ad12fa1834cfdf1f9c43ee9c97849fc588d00a618 \ + --hash=sha256:f24a43b3560e20f825b807fe1e874bd73d53abaf8bbdcf258a6eb152cddbc1f5 \ + --hash=sha256:f3d7b3d0018746b5997dd6b14a1870b07cc4c327d9101145d94a1fc264a51a06 \ + --hash=sha256:f41ca154b7737b11893cdce3c78c61d703398a1cd54d4297bdad908392338a8e \ + --hash=sha256:f42f146752eedb6765f07dcc04d72dab0a25779ec8d4a88c0085263ce114f22c \ + --hash=sha256:f56fba61b2516be7917cb00151f0d060b5b21184e3499bb57f0f7d9259bea124 \ + --hash=sha256:f9ddd28d3e9bbc602a9dced1591882c7fb9ab776eef8837da2c326fde19e2853 \ + --hash=sha256:fafc3b8898b432b841d30a61082c599fa7f4d06885f9dc58ad72259e12059fa6 \ + --hash=sha256:fcc6800daac4922960f6eeb7a0dda3dd4105e0bf7bce0e83ebc465a78cb7bdba + # via blosc2 +ndindex==1.10.1 \ + --hash=sha256:03cf1e6cdac876bd8fc92d3b65bb223496b1581d10eab3ba113f7c195121a959 \ + --hash=sha256:046c1e88d46b2bd2fd3483e06d27b4e85132b55bc693f2fca2db0bb56eea1e78 \ + --hash=sha256:08bfdc1f7a0b408d15b3ce61d141ebbebdb47a25341967e425e104c5bd512a5c \ + --hash=sha256:092b92c07690292ec7c6b266c38d7e63d254ec8d913ed06f2a8e16103eb7861a \ + --hash=sha256:0ad8e060b26568c4e67c7b1dc2bc64e28597afdaabd7d63f98f655bfe2daa644 \ + --hash=sha256:0f6113c1f031248f8818cbee1aa92aa3c9472b7701debcce9fddebcd2f610f11 \ + --hash=sha256:157b5c34a1b779f5d27b790d9bd7e7b156d284e76be83c591a3ba003984f4956 \ + --hash=sha256:1827a40301405b44ad709e388c5b48cf35cd90a67f77e63f0f17d87f6000fa81 \ + --hash=sha256:1ae21b06235cb0884e97cf672780c170449baa0314085595cfe751705fa352de \ + --hash=sha256:23d35696f802548143b5cc199bf2f171efb0061aa7934959251dd3bae56d038c \ + --hash=sha256:27385939f317b55773ea53f6bf9334810cf1d66206034c0a6a6f2a88f2001c3c \ + --hash=sha256:27a7729a4d33df6b96f7d5edff281d2b987bbe6545031c5eb606b95c47694f54 \ + --hash=sha256:28741daca5926adff402247cd406f453ed5bb6042e82d6855938f805190e5ce9 \ + --hash=sha256:2d6442ecce9b395aade5e9f2431e169e01393953a069f6d2d53a63b6c94d1d06 \ + --hash=sha256:3307817bdc92846b18f309fae3582856f567dd6e0742fb0b41ac68682bfc4e2a \ + --hash=sha256:346a4bf09f5771548665c8206e81daadb6b9925d409746e709894bdd98adc701 \ + --hash=sha256:37f87f0e7690ae0324334740e0661d6297f2e62c9bf925127d249fb7eddd0ad8 \ + --hash=sha256:3b0d9ce2c8488444499ab6d40e92e09867bf4413f5cf04c01635de923f44aa67 \ + --hash=sha256:3ce3bd0882572269ca09285112cf38ce84baa2aaa5891551af968ca7c18f84bb \ + --hash=sha256:4cea15cff221e76abd12e3e940c26124184735cf421c229307f5db6742e14dd7 \ + --hash=sha256:588e8875d836a93b3cd9af482c8074bb02288ae1aff92cf277e1f02d9ae0f992 \ + --hash=sha256:59a3222befc0f7cdc85fb9b90a567ae890f70a864bdeb660517e9ebcb36bf1bc \ + --hash=sha256:5c026dbbf2455d97ce6456d8a50b349aee8fefa11027d020638c89e9be2c9c4c \ + --hash=sha256:5c3634a8df43e7928122225a3d64d850c8957bd1edf2e403907deacb478af27b \ + --hash=sha256:6928e47fb008903f2e41309b7ff1e59b16abbcd59e2e945454571c28b2433c9e \ + --hash=sha256:72af787dcee3661f36fff9d144d989aacefe32e2c8b51ceef9babd46afb93a18 \ + --hash=sha256:752e78a5e87911ded117c57a7246596f26c9c6da066de3c2b533b3db694949bb \ + --hash=sha256:777bb6fa1dc72527fb43744b8c1499ca86e8e110b238d7aad6a686489c23d3bd \ + --hash=sha256:78bfe25941d2dac406391ddd9baf0b0fce163807b98ecc2c47a3030ee8466319 \ + --hash=sha256:78ce45106ebf67aeba99714818c721d8fd5fb9534daebd2565665a2d64b50fc9 \ + --hash=sha256:7da34a78410c14341d5fff73be5ce924bd36500bf7f640fc59b8607d3a0df95e \ + --hash=sha256:8644c76e74c0fbbdaa54752de30b7c6b98b1e8f6c05f0c6228632a29c862d83f \ + --hash=sha256:87f83e8c35a7f49a68cd3a3054c406e6c22f8c1315f3905f7a778c657669187e \ + --hash=sha256:890bb92f0a779e6f16bdbcc8bd2e06c32bcc0239e5893ba246114eb924aecaaa \ + --hash=sha256:8ff1558ddbfedcecd1f6ed7777530917ad08f9c253fcaa8b7152a7aa4ca0264f \ + --hash=sha256:9599fcb7411ffe601c367f0a5d4bc0ed588e3e7d9dc7604bdb32c8f669456b9e \ + --hash=sha256:967b87b88dadb62555ec1039695c347254eccb8ca3d124c0e5dbe084c525fa93 \ + --hash=sha256:9b5297f207ebc068c7cdf9e3cd7b95aa5c9ec04295d0a7e56b529f66787d4685 \ + --hash=sha256:9d581f931e61f182478f18bdf5edd3955899df5da4892ed0d5de547a4cfd5b6f \ + --hash=sha256:9fdf3ca16efcdfbb8800aa88fbab1bc6528e6a0504bcb9cf7af4cb9d50e9f5d9 \ + --hash=sha256:a91e1a0398120233d5c3b23ccb2d4b78e970d66136f1a7221fa9a53873c3d5c5 \ + --hash=sha256:a9a211ec2198994cb3600cd46adb335a740f27e4d406b40d48ed7b98d2d2a89b \ + --hash=sha256:ae73cd2d66b09ef2f2a7d7f93bad396d6abf168d1ee825e403c6c5fb8ae1341c \ + --hash=sha256:bada24abee6bc6ca438b2e6b68a752fc9b58b67bdcb54008e2bc6330ecb0a777 \ + --hash=sha256:bc236d1612714cbd80610cf25a6ef92584ff1402e9d5a5c50e926195716f7d22 \ + --hash=sha256:c5e9762452b163e33cfb6e821f86e45ba0b53bdfcd23ab5d57b48a8f566898cb \ + --hash=sha256:c65ca639a7abf72d79f22424f4abd18dece1f289a2b7b028a0ca455edd2168d4 \ + --hash=sha256:c67dde588c0fb89d872931a4ed5f9b4d21c1c70a3d92fdf0812a1de154239816 \ + --hash=sha256:c9dd58d91220b1c1fe516324bfcf4114566c98e84b1cbbe416abe345c75bd557 \ + --hash=sha256:cb76e0f3f235d8b1c768b17e771de48775d281713795c3aa045e8114ad61bdda \ + --hash=sha256:cdb86a4176f2ae23bd4bcd0401ca35d5dad2d1ed0d0dca1ff64480ebe41b75d9 \ + --hash=sha256:cf5855881884b8467dfcf45764ccf2e4279075be14b155b89c96994bb08d2e6f \ + --hash=sha256:cf80241b40adffdc3276b2c9fb63a96c6c98b4a9d941892738de8add65083962 \ + --hash=sha256:cf9e05986b2eb8c5993bce0f911d6cedd15bda30b5e35dd354b1ad1f4cc3599d \ + --hash=sha256:d0ebdba2fade3f6916fe21fd49e2a0935af4f58c56100a60f3f2eb26e20baee7 \ + --hash=sha256:dc7ebdbd465d25f29a9cd7ba31c304172351fc85626835385bcb72807d309a9a \ + --hash=sha256:e2ad917bcdf8dc5ba1e21f01054c991d26862d4d01c3c203a50e907096d558ac \ + --hash=sha256:e69a2cb1ac7be955c3c77f1def83f410775a81525c9ce2d4c0a3f2a61589ed47 \ + --hash=sha256:e81a9bd36fe054b6c9fcc53d26bc9a28cf15d1ab52a0f5b854f894116f3a54e1 \ + --hash=sha256:e851990a68937db5f485cd9f3e760c1fd47fa0f2a99f63a5e2cc880908faf3bb \ + --hash=sha256:ef3ef22390a892d16286505083ee5b326317b21c255a0c7f744b1290a0b964a6 \ + --hash=sha256:f77c4fd3f34c53037678020ab4e060da4bbdcae3a428797c7cbec69a6785dc93 \ + --hash=sha256:f99b3e89220da3244d03c9c5473669c7107d361c129fd9b064622744dee1ce15 \ + --hash=sha256:fa60637dfae1ee3fc057e420a52cc4ace38cf2c0d1a0451af2a3cba84d281842 \ + --hash=sha256:fe5341e24dc992b09c258456ac90a09a6d25efdc2cb86dcc91d32c8891e1df9a + # via blosc2 +networkx==3.7 \ + --hash=sha256:e3fd2c13a7814cee3746340d8d7f8598a67f16a58bf47fb7f8793fab6efca1b0 \ + --hash=sha256:fd77a511bd90f39f3d016351345b52cf5319b813bdca01de3f755d3cca62e96a + # via pyvis +numexpr==2.14.2 \ + --hash=sha256:022e61a3d5dbf5807746264b62126d1c2c24057ad90052478a4d4482ab2555c2 \ + --hash=sha256:0741efbd75c284e709b0fd430c85c31982b44c9962922ba8a9cbbea1bf413321 \ + --hash=sha256:149ab5744a5222f07b1d60455c4021c754d395e44938944ac7c7c2495f7feb54 \ + --hash=sha256:1d4593e2c6fa060cd7441e8b6ef25c16321a6be2144b3c82d1e00885f1fb6e94 \ + --hash=sha256:2aa65ddc2243f19c6915f34ee0978b4a2df20f297230a793c4ee6d55f3472599 \ + --hash=sha256:2aceefa08f8f86317fa6e8fe9f6dc20d24ab8365d715be4a26306acf406d2dbe \ + --hash=sha256:2ef72de3d3dd466cb0c435cae7141c99b0f8091b1eae9d03dcb38690f56c3f79 \ + --hash=sha256:2f132777d7d425471c458af5617e023402f13f5006301eacf8a1a6e7118ea70c \ + --hash=sha256:327be9ee62251c173236dc620147ff2d0e732a32f5bad918d78a10082f502f63 \ + --hash=sha256:375d8bee15be42dab22100a0a3de05fe6689a2de853eca012858768a9a7e02ab \ + --hash=sha256:41cdeacf1b4e51c1143983ea61fcee68139ca47222b55a9265b4fa73826c4260 \ + --hash=sha256:449a57fb9d38de136e742b1fc429572b42f29778f1d695c3fe50ffec9d3c9a71 \ + --hash=sha256:44dc6b1dfa9abcbfc9917297f0d2af7c87c16b6ecd45747a8e70f54399a3a2f9 \ + --hash=sha256:4b1ff261c3e69c4c59578d3a9ca6132603619d38ae1abe73325563bed3b9bbaf \ + --hash=sha256:606ceaf5722e295ef965ca591736fc26d9e5f13ad950a479e64cead1947f8a3d \ + --hash=sha256:66f3b125b1104241322811de87918724d6709bf082dc0703722d0cecb7b29e82 \ + --hash=sha256:6acafb2fdbeaaa6681a8f1a1d8b3f7dcd33704baace7057b950754b258be7c43 \ + --hash=sha256:76e87c7bd70d721ce4d418e81f4fb7ecf9e7e67d7cea8102527b07fd3d3facf9 \ + --hash=sha256:779129d50974e7d6d6581d322f75b8f8375e96215b6861a2d5460347997ef649 \ + --hash=sha256:790da022539fe7c37dc893acf530a91c2ca6964d7ba11f464131383729d058f3 \ + --hash=sha256:7ca9e71195b36cc7aeafe97347549e1e1c1e889ff700238782ef6447651ec26d \ + --hash=sha256:806a4471310fe20aa7cb1b2816a6f5e508073a1ad1c2e18041b83e57066fad6a \ + --hash=sha256:8274c51ae1842948f3ae7fe6951a23dcf4ddcbeeaff3737e978e7740b754662d \ + --hash=sha256:8b8384592c49cb15a91caa54e2cd84d1ce18edb7af030bb76cd29b52e5dc155d \ + --hash=sha256:8fc55d14bcf17b3fe69213bea14f999451892b4690717008c66f2edfd6a085ce \ + --hash=sha256:91e7928435f14fcb351c0157000bce65122b897cc8b0df6bcc48251f25850a6d \ + --hash=sha256:92b00c78664070e3af155c6be713a0a5d75d598647ce32a5609adb79a8f961d3 \ + --hash=sha256:93233040f4bed3bce5abb0c2d20aeb1074511f29cbaa9c14828f86bcfa44d321 \ + --hash=sha256:939c89f613b814e64bb568859397dc9f99b219c3ef681a72fb99a86e435262f9 \ + --hash=sha256:a404c9a55902572eec810068d06b79a7c99e96f0400f5a7d73f39dff5ec5e371 \ + --hash=sha256:b02738853b9b5b8a995f6c680f8f6ef33e8f419395b8fa380e38690495fdb911 \ + --hash=sha256:b20c1c55aba7812ff2f2c6a50006425d02282fabb1eaf8d75fe638ffcf6deb02 \ + --hash=sha256:bac00898930f962f360c3d763a8e2273fc931f65a1759ff1bf64b3cf13d65aee \ + --hash=sha256:bf959e6df6cb603611c034b6cba7b03a361be0ad0b80b73f163fab95f5ccbb7f \ + --hash=sha256:c1ffaf805d8636c3f95d0996517ecf9684c9ac62d768030ca78d1d00af2b3504 \ + --hash=sha256:c66925deb968f0b5280f723e2bb5918c11e6be2ca60e9e1530006286ab44031d \ + --hash=sha256:cd684ac9daa539fcdac3437678834797b29d7780cfaad71111745132d466d51f \ + --hash=sha256:d534ecb456a4ae3995f99c8a5deb469bfff05d4ec610a7885c175c881d12f710 \ + --hash=sha256:d6a5d8fc7016bf6f6e1808b011510aa7c3bd75ec1407f7650874ec591db59f5e \ + --hash=sha256:dd905922d7dce457947d54b84c7ac345cef37332b724445e159a5a1a2080ce2b \ + --hash=sha256:e7144e83ea9e581f2273e0304f15836736c4e470e2bd2e378ce617662a1ca278 \ + --hash=sha256:ef576a1cded27ba2f3129bc3c42df452a1c498072680d560793f98b0024cd7e6 \ + --hash=sha256:f1de5c88515ed9fbcad42699a0e2b5821b4d0f0adb0da6fb7e009e5cb19d8493 \ + --hash=sha256:f3526699350f94c6277fb16863773a1af9defd95a6f78bbd69b1f0338fd94756 \ + --hash=sha256:f41170e9d0dbba76851e35d80cfa9f4ca5fe78628c5bf24d941cf3364940ab7a \ + --hash=sha256:fd2f5882a66a7792aa6614c68831aa20085b499d41422aedd001080624ebb14c + # via + # blosc2 + # policyengine-core + # tables +numpy==2.5.3 \ + --hash=sha256:012e66aca395d795496446e52aeeb5866312a5d4d3f27da270e5a0b43f70dc5c \ + --hash=sha256:09d5a423c71ad5feb5625844ad58050e35df43871004b52ac9c0ad44a56775be \ + --hash=sha256:09ffa5d903faeaa5c4dd05009cf81c8bab9f2cb37c548b8d39b65b4cfa7c97f7 \ + --hash=sha256:0a59a421a32580a009e8a1751345bf829631b990dc1794b80514ab722b435def \ + --hash=sha256:116f96cadd935c6122e9228d676fe7ede19e741f5c8bb1c3cddbe0c51ccebea2 \ + --hash=sha256:1302b90c0e52281681b2975adfe8a860cb7b12216a27b4b0b4207c44bf7bccf0 \ + --hash=sha256:15aa985ac73a8db02db7663381aa109510449d3819d37206caed27b33a65a8a6 \ + --hash=sha256:1aad64d99730d013cfc6debafed22783b4fc5a7f4b8bc744d2d8cf7dcc880551 \ + --hash=sha256:1c80eabb4035ecf4ca9cd49cde8a9fdd69a729e63e6474887d1523ade7aa277f \ + --hash=sha256:1f3ed25271581281f2fccb1adcedfcde4c07362eec69189b50baf6f90e3ae159 \ + --hash=sha256:1fb6f8fb9ff0b3a69f52c66ce397b0246583e9f28616231b0e32ca49259a5fa6 \ + --hash=sha256:214045a5bf00113a146ab9ee9730c44501af6723cdf1f6830932f7b5ef2e7af0 \ + --hash=sha256:26e15e4aecd8617dfbaecb37d223e365d7b39411fba20454be2670a96aa74cb5 \ + --hash=sha256:2c25dfa72943e4336ddb6b0ee4277b47a0c85bede0807530ec68103bf58e2c10 \ + --hash=sha256:2d8240cb4c16fd831074aa2b2cf9fc54664d826341d61c372245b96a74a49a9a \ + --hash=sha256:350ba9783ce969cf9f7ce6e6a9a58e1a6e2a19ca025b7ee448c4db727706212a \ + --hash=sha256:4c8a6d2ebce6305fd82fbefca827775437147052a976ee7c94b36a0c1b52ac6c \ + --hash=sha256:4f8929ee6c96bfbd7b4ed2032e0c03af86fe1826740ab61ddabf9072d06e57ff \ + --hash=sha256:536f963710a4e63934d80ac0dc4f478804a83e9a84b6828018f25d09953ada33 \ + --hash=sha256:54a115e5a73b8fc44f0cebef486365a1894b5c9760685d4558b72b7c3eb846e0 \ + --hash=sha256:595d020938c84e320bcf40ad71089e108eac0d377cd018e14a8c094f39e98d85 \ + --hash=sha256:66a78fe4556c60aceda5916f9eacd638b18e9e681016ec302dcb4682d6d4d034 \ + --hash=sha256:6b05c171afb3aa07adbd20abc00aea86fe375beb0fdb9ef780ec5b7f63bab1c0 \ + --hash=sha256:6cef4bb1706dfec49243c05d921eefb4e190d41e2528b30d8035ea1f36b4c24a \ + --hash=sha256:6f24021b9f22bc6301c37b196974a92c1c18dccedb6fef3dd252e95f2d6adbe4 \ + --hash=sha256:71b39d9f935b6ec0f8753e3e2afb51e3efba6f2e05b68b32a40754d24bcd4a3c \ + --hash=sha256:71cad2b2a7451ab79d8f5e71b453485b6775963d5cf794179144a7463fe6e8ec \ + --hash=sha256:76c2c1e6bfa5c84adc6434dfbf013aa92096a7985221762c8f11fedfd20fff58 \ + --hash=sha256:8617bbfae4486cf99c9f899966699428d19da931d06ca94ad3da986c76e15997 \ + --hash=sha256:86bff898a431c0fb71f7610b75726e75a54d47b37edc9d537f48de63bb3c0b90 \ + --hash=sha256:8e4dd766076855b5ff7ea52fa5f07ce26286726e0f8bff446b7739d02e6ea204 \ + --hash=sha256:92f30e89b8ee0ecf363033576c422b2f58fed6a80bed0aa48dff6d14c654663e \ + --hash=sha256:93e1f5447e2b1e479d7bd74701e84746b86450cff1fc368b132d195e2b8f8211 \ + --hash=sha256:9a37475425b431b4d060f23b4f52cd2f3aef6bc7c654bd760adf0040eec9d435 \ + --hash=sha256:9deb49575e5b0b94ed72c8a64ec4d033381adc27e9060ae842971f697ba96104 \ + --hash=sha256:a5fa86b80fd24bcd1aff83ad23be44ea323de3f787be8f8b15d4a65621e25321 \ + --hash=sha256:a6391fafaba97500887132cd582abc6e19452b1ac775a47caa7b24490e152058 \ + --hash=sha256:a72f874bc9e10e4b8f80426fb49716d5141f64442a0c8418065093ec8017fbb0 \ + --hash=sha256:ac7bb1c52d445bd4f8f7f97fefe6abc3a084dc4d63df50d79b17fa2b78e89297 \ + --hash=sha256:adc1ada2662f8a5f960b8a10d9986897e7499ef07e06d4cfe7197f8cce923c07 \ + --hash=sha256:b00eefbcf0f292945c4b4dec2ae845389ef5bcdcd596e6e4328051db5b5ba694 \ + --hash=sha256:b0521d0f4aebb6e06189451025fa17a913287b13c03d5fe05c017333b654ea5b \ + --hash=sha256:b5d93cf48f687479941d12b69c873ad2cc76bbd487f0091c2200636497f34034 \ + --hash=sha256:b7e18c623bb5c95acb3b3328861272816ba199fb531921c5d6d0b675f1fde9e3 \ + --hash=sha256:bd4cb9ad3c7889b9b3fe0a9a9fb5d2ed26f9879bff2608d9f01aed147a20d231 \ + --hash=sha256:be5a8381859b6da607c84f4f7d6847725f1cf1853ef8a2c9e115b7d58bef47dc \ + --hash=sha256:befa1ae5bd6030b3f512b43ff3fa5290bbed6b84411a44244b14adf835f5b89d \ + --hash=sha256:bf63afbe037eb5d2fe87fbcc7778e61da53ebaf21d938a4515aa73b62532a5d4 \ + --hash=sha256:c00abe94c1a69d75d827dcf1c025b25c8a45d230b3bcd77a9020883a1b047653 \ + --hash=sha256:c2381f82999704f818e2c987a865050e285ec3621262c66d40f5a96c8f899f8e \ + --hash=sha256:c76d5dde9f445058f83d0c02af00557a4db91de9a9a57c0df87d1535001d654b \ + --hash=sha256:cb189f09db39283b26bfd061ec16189e14f71c6755207f72a0f7540867afe5b9 \ + --hash=sha256:ccb32e0525d29e8b0572eb84c9a57af0e7a4e615726927506f55063c62414034 \ + --hash=sha256:ccbc4665079665c3cf3bab4db9f6b095370cd6437d66be549b6c2a1fd19e1958 \ + --hash=sha256:d1c89973648c85069c5046ad460f7b8a00218b29a2e42359ac8cc63e9ab94832 \ + --hash=sha256:df2d5874ff183595a4ba404edd04f6bd9b5505c1d7708573f6a6c17489a67563 \ + --hash=sha256:e01c918ac3d48e18a927cf7b14a26a3e29ff2bdf2eacb976da0aecd6a43ed034 \ + --hash=sha256:e6ab667ba76450084eb64013762c438ea76d9d29cc676dcd6c2e9892ba37f841 \ + --hash=sha256:e931e4f499e0dc7ef29d269a8e5b35dd722e5d14be07df6240166ea7c6532fae \ + --hash=sha256:f54660b0eb6b0b9f36e7fe1cdfdff472028dd0d14acd9b9b65098efbad059469 \ + --hash=sha256:f59a878c33d6b88122d80d239bb3b845d58708750b0cb06a09aebb9b18ec696c \ + --hash=sha256:f7fabeb6cea87d65f3b926de33d03fb016cfdc29314c90974383b5582ae72891 \ + --hash=sha256:f9579f383d1bf9df80081e72760e84960a7fd4f88cf0c9e535a8597c9bb646f5 \ + --hash=sha256:f9a2353b37a1a9e78fd82b27ad7e2a32a2d036604d18f02b05e3136c62ca3b09 \ + --hash=sha256:fc36dc566135b5eceec4cf89758fcb719266a019ef07dae1754ae7c9f617ef3e \ + --hash=sha256:ffdc76bfcae6b255dff75202c5e7feaf95b40246bc0a17944facc1fecf9f79ab + # via + # policyengine-taxsim (pyproject.toml) + # blosc2 + # contourpy + # h5py + # matplotlib + # microdf-python + # numexpr + # pandas + # policyengine-core + # spm-calculator + # tables +openpyxl==3.1.5 \ + --hash=sha256:5282c12b107bffeef825f4617dc029afaf41d0ea60823bbb665ef3079dc79de2 \ + --hash=sha256:cf0e3cf56142039133628b5acffe8ef0c12bc902d2aadd3e0fe5878dc08d1050 + # via spm-calculator +packaging==26.3 \ + --hash=sha256:94edc256424af38762eb31306eed28beb9f0efc50a8837492c9d6fd6004aed79 \ + --hash=sha256:d7193f7c8e4e93f444fde0262bf90af30e16fa0ad0ad44cb553c87339b23cd1c + # via + # huggingface-hub + # matplotlib + # plotly + # pytest + # tables + # wheel +pandas==3.0.6 \ + --hash=sha256:0704044b676496b8350e023b09f174a26772456c974a2b11c36bebb558c9490d \ + --hash=sha256:085e3786ae6b2e82b406266bce36690f72b9dc1421903ba9296b2981a9fcf586 \ + --hash=sha256:097090508a1dd335013d39106fc10b20f4fd4a171638e47b77d55798ed9dab6c \ + --hash=sha256:1bcb3e9ed29e74a7439cedff9e2aefd3ea65de84d7de9ccb6c194192541bd60e \ + --hash=sha256:1e7c0afdcaf6661d795fcefc2f647ddd1136f62cdc153fba177c685d97a87808 \ + --hash=sha256:1e92d9fa834c7d877130027cddc0cad8dcff97c1f6cca26bd6310f847228b658 \ + --hash=sha256:22172a92e7ee678ec0140c7af4fc9366b55413834a1cd86af78b3caa0b0574de \ + --hash=sha256:253e12cb9081b0afbac607920f6142975966bc315135e09de275fdbaa415d2de \ + --hash=sha256:265f562fdd1079f69f3de96dd425c3405224038c0af4f920c54bd240ee2c4640 \ + --hash=sha256:2a8fc94be2ee5f1d86f97aacd8cc566f81680b6498e76f3007421bb5d98151bf \ + --hash=sha256:2e5fa32ff162dfdbc280157d664f44d23049ae414725af9676df339c501d82cd \ + --hash=sha256:3ef908d28590b3f42d7070e7ad8f9b34b442b260b7f3c1afb57e0040c58cdb1b \ + --hash=sha256:429d9df32731ab01383ed98f2baa7a60368090d1a94fc06019a12062510e8630 \ + --hash=sha256:47121f9571503f724c9b93e297ab6254ac99c77adf5e9ed085ea419fd585c258 \ + --hash=sha256:4e25e2e1adee99ddfada6f7206a79ae8e9c8a8861b0e3eaaba165006d3eef18e \ + --hash=sha256:4ff44b2cb51cbd691c91f92c4ea6c71e34003f239ebd67c2e857dc898466b49c \ + --hash=sha256:50c44cbf5820b6b91a5f74aae04972472aefadd3cd9fbd1010409d85528bd570 \ + --hash=sha256:569e114072b24fc4970c12e2b4bab252671668a40b324318903380cab0254c0c \ + --hash=sha256:583be68728a31d0d750d5b8d9e00f02b153df0d4655f858bde93cb84cfc4227c \ + --hash=sha256:5e75072773c1b2f7cb63faa3a6f562aede11f3976f68ed34cb538bc091a28171 \ + --hash=sha256:5edd0a7abb0986ecce1ac81f56d99b6763f86aa6946dceb6c661224f90af5a19 \ + --hash=sha256:60d81f9e1799b36f3739e7fff44d1fbb2e8fd5a271b3863e03de9715fccda0fa \ + --hash=sha256:62f51d7f651c8054c5e82a69265c98082e795d1442df7ca6edc3a545d61214b1 \ + --hash=sha256:654aae059295dbba6ecd2328ca12712a2cf1676214c8699f1c29213f7ccf9c34 \ + --hash=sha256:66b07ef7315a31bfe1089cd3d71a7de781c9dca986762d0b4fe7c0ef17465d10 \ + --hash=sha256:6ff482fa91fa2bafd92e8fe66ce3645c851824310f295c1f0a2f96e928fc4541 \ + --hash=sha256:77ccbe5057aece6fc172b9b77f19c04335af6882bc2e10c8f3ee4e6bfb3da553 \ + --hash=sha256:7dac2d65e9087e8e7b5a45fe15c4920911a221df061ab629943ce016489145c7 \ + --hash=sha256:83e91d15738d7783c050197cef2f2cf82fc6353dae9865aa87ed1fa16aa4d55a \ + --hash=sha256:86fa853a12e0b70927e2b1ee00d56d2224ec9cbb4b9d58348b5ad52d2f21150e \ + --hash=sha256:8fe77b408d82e2615674dfed62533b95e18a03610573877422aada4f625d4947 \ + --hash=sha256:963ca21199097a84c7827c4678b04e30833084fbf8ef44fde3fa7180a29f8fa0 \ + --hash=sha256:97274c9adf6255bb48c620cd6959805efa7f09ea2167f0e0ae006a448cd2fca7 \ + --hash=sha256:994a79608263fe1c14cc48ffa7300e2b834b7d1cb406ffe96a08828cb0cdd79b \ + --hash=sha256:9ae8073aed8e21d1a7fe263dcdc6840743549722a6738198a0a46000fa9476f2 \ + --hash=sha256:9dab635a549e58a053c7b0fa054dc0bd7be22f0ed9a720f4a85d5fb993276172 \ + --hash=sha256:9e492cd4bdba6778de4fe0df7f4590c012161ebcf9902dce01b01dc683105514 \ + --hash=sha256:a3a22e07fe75347eaacc75b0e85297947af4fba6b4aae23916bd8b6828d0bba3 \ + --hash=sha256:a4dbd4dc65cbe645b92b8785d0f96dd7311010dc6606cf620e51b07b8788a12a \ + --hash=sha256:a77a1a44e4d88f1c6a2a64d3eb12efec8420875722e14279800b173a7c7c2804 \ + --hash=sha256:b27c8d890e4aa2171437ae2a39de1d215e674158e4865c4023a8b31c932513b2 \ + --hash=sha256:bd75ed0c840f709fc2ae26ddd9534ac77ca1a48ac0cce521a74acaa85f3340a7 \ + --hash=sha256:c6e4aae3e9bea26c6c9a20d88d96c86ec4a99b4db5fd516bcb4e829ab2c0ee36 \ + --hash=sha256:c826e9babb7790142c399f58599d8de679bea059d7b39c5b6efa2096fac37266 \ + --hash=sha256:cc39303913e2ea129915670de5d1c9fbd647f543bb72e5543bac8baa94e9e42f \ + --hash=sha256:d7564d86a94c2eb8ab290b07f63ddaae5c032fa53897c29a2ff2197d43aee8af \ + --hash=sha256:d7dcd21238cbb4828ff148481ba01cac8946dc5121457b5aeba28636f8f99a60 \ + --hash=sha256:db7ec631f26223beee8e5c9e0b8f23c24d8197bbd1d982421d4e3188bea51965 \ + --hash=sha256:e3dccb584123b399c07562ac4d62543e90ede49ddf8ce3c13ffc64cbe828c281 \ + --hash=sha256:e7c1905ef02c3d6d43d9dbd5b6ccb4da4870a0b0c821bbc103fbdb6f3ad2707b \ + --hash=sha256:eb6900de08ac85f93ac4948aa6b80842eba555875337b8359035ac9c43e92d34 \ + --hash=sha256:ee913a91669056c1de1a6b733fbfeab711de9e54e3bee2dfa5fe79d9457247d1 \ + --hash=sha256:ef738d71d1059245b6bb03e312be06d8b3821326a83486c1ad03b9aba3710e44 \ + --hash=sha256:f3ce8a6968045481e91a3990e797e348ce13db45ee164a7095bbc824e26c09dd \ + --hash=sha256:f4e7c52eb108d752e7592268108fd3e98efd76d83a3125cdd06c621c2e44359b \ + --hash=sha256:f8029ec0f1f89e4f985929ce1f6626dabf3140d61a4e9c1215afdab34eaf9a5d \ + --hash=sha256:fb625f426b375bcc96e3a04c5d5d266cd7be6ae5d6866e0e703382ab5164068c \ + --hash=sha256:ff51a4459ed036e93d1eb1bb5e6e7b28685d3cb6b7c12b91c05b31024e234729 + # via + # policyengine-taxsim (pyproject.toml) + # microdf-python + # policyengine-core + # policyengine-us + # spm-calculator +parso==0.8.7 \ + --hash=sha256:a8926eb2a1b915486941fdbd31e86a4baf88fe8c210f25f2f35ecec5b574ca1c \ + --hash=sha256:eaaac4c9fdd5e9e8852dc778d2d7405897ec510f2a298071453e5e3a07914bb1 + # via jedi +pexpect==4.9.0 \ + --hash=sha256:7236d1e080e4936be2dc3e326cec0af72acf9212a7e1d060210e70a47e253523 \ + --hash=sha256:ee7d41123f3c9911050ea2c2dac107568dc43b2d3b0c7557a33212c398ead30f + # via ipython +pillow==12.3.0 \ + --hash=sha256:00808c5e14ef63ac5161091d242999076604ff74b883423a11e5d7bbb38bf756 \ + --hash=sha256:04f01d28a6aaff387bf842a13be313df23ba0597a44f1a976c9feb3c6ff4711a \ + --hash=sha256:06ff022112bc9cbf83b60f8e028d94ad87b60621706487e65f673de61610ab59 \ + --hash=sha256:0740a512dc522224c77d9aa5a8d70d8b7d73fb91f2c21125d8d025d3b8990e45 \ + --hash=sha256:0847a763afefb695bc912d7c131e7e0632d4edc1d8698f58ddabec8e46b8b6d3 \ + --hash=sha256:0dd2064cbc55aaec028ef5fbb60fa47bb6c3e7918e07ff17935284b227a9d2df \ + --hash=sha256:0feb2e9d6ad6c9e3c06effe9d00f3f1e618a6643273576b016f591e9315a7139 \ + --hash=sha256:10e41f0fbf1eec8cfd234b8fe17a4caac7c9d0db4c204d3c173a8f9f6ef3232b \ + --hash=sha256:1182d52bc2d5e5d7d0949503aa7e36d12f42205dc287e4883f407b1988820d39 \ + --hash=sha256:164b31cd1a0490ab6efae01aa5df49da7061be0af1b30e035b6e9a1bfe34ee6e \ + --hash=sha256:1657923d2d45afb66526e5b933e5b3052e6bdea196c90d3abb2424e18c77dae8 \ + --hash=sha256:186941b6aef820ad110fb01fb06eb925374dc3a21b17e37ec9a53b250c6fe2d1 \ + --hash=sha256:1cca606cd25738df4ed873d5ad46bbdb3d83b5cbca291f6b4ff13a4df6b0bbe8 \ + --hash=sha256:21900ce7ba264168cd50defae43cd75d25c833ad4ad6e73ffc5596d12e25ac89 \ + --hash=sha256:236ff70b9312fb68943c703aa842ca6a758abfa45ac187a5e7c1452e96ef72b5 \ + --hash=sha256:23aceaa007d6172b02c277f0cd359c79492bbb14f7072b4ede9fbcaf20648130 \ + --hash=sha256:23d27a3e0307ec2244cc51e7287b919aa68d097504ebe19df4e76a98a3eea5bd \ + --hash=sha256:24870b09b224f7ae3c39ed07d10e819d06f8720bc551847b1d623832b5b0e28d \ + --hash=sha256:251bf95b67017e27b13d82f5b326234ca62d70f9cf4c2b9032de2358a3b12c7b \ + --hash=sha256:25b9b82bb22e6e2b3cd07b39c68b7b862001226cb3dff7130d1cb914121b39ed \ + --hash=sha256:28ce87c5ab450a9dd970b52e5aca5fe63ed432d18a2eaddd1979a00a1ba24ace \ + --hash=sha256:300557495eb45ebb8aec96c2da9c4be642fbf7cd937278b4013ba894ea8eb0eb \ + --hash=sha256:30f2aa603c41533cc25c05acd0da21636e84a315768feb631c937177db558931 \ + --hash=sha256:331b624368d4f1d069149002f25f44bc61c8919ce8ddb3c45bdad8f6e2d89510 \ + --hash=sha256:37d6d0a00072fd2948eb22bce7e1475f34569d90c87c59f7a2ec59541b77f7a6 \ + --hash=sha256:37dc8f7bbb66efe481bb60defacef820c950c24713fb44962ed6aa2a50966de1 \ + --hash=sha256:3b8182a766685eaa002637e28b4ec8d6b18819a0c71f579bf0dbaa5830297cce \ + --hash=sha256:3edce1d53195db527e0191f84b71d02022de0540bf43a16ed734ed7537b07385 \ + --hash=sha256:446c34dcc4324b084a53b705127dc15717b22c5e140ae0a3c38349d4efec071e \ + --hash=sha256:4998562bf62a445225f22e07c896bb04b35b1b1f2eb6d760584c9c51d7a5f78c \ + --hash=sha256:4b0a7fe987b14c31ebda6083f74f22b561fd3739bc0ac51e019622e3d72668c7 \ + --hash=sha256:4e8c2a84d977f50b9daed6eeaf3baef67d00d5d74d932288f02cb94518ee3ace \ + --hash=sha256:4f883547d4b7f0495ebe7056b0cc2aea76094e7a4abc8e933540f3271df27d9c \ + --hash=sha256:514435a37670e3e5e08f3945b68718b6ed329bb84367777e16f9f4dfe1e61a0f \ + --hash=sha256:53aa02d20d10c3d814d536aa4e5ac9b84ca0ff5a88377963b085ad6822f93e64 \ + --hash=sha256:5594fc43d548a7ed94949d139aa1341b270f1863f11cfd37f5a6c8b778a6b67f \ + --hash=sha256:571b9fcb07b97ef3a492028fb3d2dc0993ca23a06138b0315286566d29ef718a \ + --hash=sha256:57b3d78c95ba9059768b10e28b813002261d3f3dfc55cc48b0c988f625175827 \ + --hash=sha256:5afb51d599ea772b8365ae807ae557f18bccfe46ab261fd1c2a9ed700fc6eb17 \ + --hash=sha256:6b02afb9b97f65fbca5f31db6a2a3ba21aa93030225f150fa3f249717e938fb4 \ + --hash=sha256:6c0016e7b354317c4e9e525b937ac8596c38d2d232b419529b9cd7a1cd46e39a \ + --hash=sha256:71d6097b330eea8fd15097780c8e89cb1a8ce7838669f48c5bacd6f663dd4701 \ + --hash=sha256:756c768d0c9c2955feb7a56c37ea24aea2e369f8d36a88da270b6a9f19e62b5e \ + --hash=sha256:78cb2c6865a35ab8ff8b75fd122f6033b92a62c82801110e48ddd6c936a45d91 \ + --hash=sha256:7a743ff716f746fc19a9557f60dab1600d4613255f8a7aeb3cdde4db7eb15a66 \ + --hash=sha256:85f998ea1848bc6757289e739cfbdda3a04adfd58b02fc018ce54d754a5ce468 \ + --hash=sha256:8728f216dcdb6e6d555cf971cb34076139ad74b31fc2c14da4fafc741c5f6217 \ + --hash=sha256:877c3f311ff35410f690861c4409e7ccbf0cd2f878e50628a28e5a0bb689e658 \ + --hash=sha256:8cd2f7bdda092d99c9fc2fb7391354f306d01443d22785d0cbfafa2e2c8bb418 \ + --hash=sha256:8e95e1385e4998ae9694eeaa4730ba5457ff61185b3a55e2e7bea0880aef452a \ + --hash=sha256:962864dc93511324d51ddbb5b9f8731bf71675b93ca612a07441896f4688fb8c \ + --hash=sha256:9cf95fe4d0f84c82d282745d9bb08ad9f926efa00be4697e767b814ce40d4330 \ + --hash=sha256:9e881fca225083806662a5c43d627d215f258ff43c890f831966c7d7ba9c7402 \ + --hash=sha256:a2b55dd6b2a4c4b7d87ffa56bdb33fdc5fdb9a462173861a7bc097f17d91cb09 \ + --hash=sha256:a45650e8ce7fafffd731db8550230db6b0d306d181a90b67d3e6bca2f1990930 \ + --hash=sha256:a876864214e136f0eb367788dbd7df045f4806801518e2cfe9e13229cfe06d8f \ + --hash=sha256:ae26d61dfa7a47befdc7572b521024e8745f3d809bd95ca9505a7bba9ef849ec \ + --hash=sha256:af8d94b0db561cf68b88a267c5c44b49e134f525d0dc2cb7ed413a66bc23559a \ + --hash=sha256:b343699e8308bdc51978310e1c959c584e7869cc8c40780058c87da7781a1e94 \ + --hash=sha256:b3c777e849237620b022f7f297dd67705f9f5cf1685f09f02e46f93e92725468 \ + --hash=sha256:b629de27fda84b42cde7edef0d85f13b958b47f6e9bbcbba9b673c562a89bd8b \ + --hash=sha256:ba09209fbe443b4acccebe845d8a138b89a8f4fbaeedd44953490b5315d5e965 \ + --hash=sha256:ba54cfebe86920a559a7c4d6b9050791c20513650a1952ebe3368c7dc70306f8 \ + --hash=sha256:bcb46e2f9feff8d06323983bd83ed00c201fdcab3d74973e7072a889b3979fcd \ + --hash=sha256:bcc33feacfaefce60c12fd500a277533bdc02b10a19f7f6d348763d8140bbba7 \ + --hash=sha256:bf16ba1b4d0b6b7c8e534936632270cf70eb00dbe09005bc345b2677b726855c \ + --hash=sha256:cf1845d02ad822a369a49f2bb9345b1614744267682e7a03527dc3bf6eea1777 \ + --hash=sha256:d69141514cc30b774ceea5e3ed3a6635c8d8a96edf664689b890f4089111fb35 \ + --hash=sha256:d9c7f76c0673154f044e9d78c8655fb4213f6ca31a836df48b40fe5d187717b9 \ + --hash=sha256:dbce0b29841537a2fa4a214c2bbf14de3587c9680caa9b4e217568472490b28f \ + --hash=sha256:dc624f6bc473dacdf7ef7eb8678d0d08edf15cd94fad6ae5c7d6cc67a4e4902f \ + --hash=sha256:e158cb00350dc278f3b91551101aa7d12415a66ebf2c91d8d5ac14e56ddd3ad0 \ + --hash=sha256:e491916b378fba47242221bb9ead245211b70d504f495d105d17b14a24b4907c \ + --hash=sha256:e795b7eb908249c4e43c7c99fac7c2c75dab0c43566e37db472a355f63693d71 \ + --hash=sha256:e7e480451b9fa137494bccd3a7d69adbe8ac65a87d97be61e11f1b1050a5bac3 \ + --hash=sha256:e91206ee562682b51b98ef4b26a6ef48fd84e15fd4c4bc5ec768eb641d206838 \ + --hash=sha256:e9871b1ffbfa9656b60aeee92ed5136a5742696006fa322b29ea3d8da0ecc9cf \ + --hash=sha256:e9aeb04d6aef139de265b29683e119b638208f88cf73cdd1658aa07221165321 \ + --hash=sha256:ebaea975e03d3141d9d3a507df75c9b3ec90fa9d2ffd07567b3a978d9d790b26 \ + --hash=sha256:f0606c8bf2cdefea14a43530f7657cbbb7ecf1c4222512492ef4a4434a9501ec \ + --hash=sha256:f13c32a3abd6079a66d9526e18dad9b6d280384d49d7c54040cd57b6424041d9 \ + --hash=sha256:f7401aebd7f581d7f83a439d87d474999317ee099218e5ad25d125290990ba65 \ + --hash=sha256:fa4ecea169a355be7a3ade2c783e2ed12f0e40d2c5621cda8b3297faf7fbb9f5 \ + --hash=sha256:fbd139c8447d25dd750ab79ee274cc5e1fe80fc56340ab10b18a195e1b6eca3e \ + --hash=sha256:fdafc9cce40277e0f7a0feabce0ee50dd2fa1800f3b38015e51296b5e814048d \ + --hash=sha256:fe3cca2e4e8a592be0f269a1ca4835c25199d9f3ce815c8491048f785b0a0198 \ + --hash=sha256:ffd0c5368496f41b0944be820fcb7a838aa6e623d250b01acf2643939c3f99d7 + # via matplotlib +plotly==5.24.1 \ + --hash=sha256:dbc8ac8339d248a4bcc36e08a5659bacfe1b079390b8953533f4eb22169b4bae \ + --hash=sha256:f67073a1e637eb0dc3e46324d9d51e2fe76e9727c892dde64ddf1e1b51f29089 + # via policyengine-core +pluggy==1.6.0 \ + --hash=sha256:7dcc130b76258d33b90f61b658791dede3486c3e6bfb003ee5c9bfb396dd22f3 \ + --hash=sha256:e920276dd6813095e9377c0bc5566d94c932c33b27a3e3945d8389c374dd4746 + # via pytest +policyengine-core==3.32.29 \ + --hash=sha256:30591ab05d676ef89aabf4ae4ca4544b0fe97dde4ab82233d487d88ded05fffc \ + --hash=sha256:526fbf4bc1592b4afd4b60df3d5572cfef3e00afb93fbc733940233d8a0310c4 + # via policyengine-us +policyengine-us==2.38.1 \ + --hash=sha256:1734d447d0fb7819aa9c0746e224baa6108ab6c44a20cf71e61f9e81470b7d2d \ + --hash=sha256:965baadc7e66fe5e5eca7b81e96128049c341ac49ac9f0bbeede8e19fdc7dc01 + # via policyengine-taxsim (pyproject.toml) +prompt-toolkit==3.0.53 \ + --hash=sha256:01c0891d7f9237d5e339f7d3e42cdae80b7534abb1c7c0e3352efba6231492f2 \ + --hash=sha256:9ec8a0ad96d5c56148b3f914aa79c1564c3fde5d2e6b876e7bc327e353cf8fa6 + # via ipython +psutil==6.1.1 \ + --hash=sha256:018aeae2af92d943fdf1da6b58665124897cfc94faa2ca92098838f83e1b1bca \ + --hash=sha256:0bdd4eab935276290ad3cb718e9809412895ca6b5b334f5a9111ee6d9aff9377 \ + --hash=sha256:1924e659d6c19c647e763e78670a05dbb7feaf44a0e9c94bf9e14dfc6ba50468 \ + --hash=sha256:33431e84fee02bc84ea36d9e2c4a6d395d479c9dd9bba2376c1f6ee8f3a4e0b3 \ + --hash=sha256:384636b1a64b47814437d1173be1427a7c83681b17a450bfc309a1953e329603 \ + --hash=sha256:6d4281f5bbca041e2292be3380ec56a9413b790579b8e593b1784499d0005dac \ + --hash=sha256:8be07491f6ebe1a693f17d4f11e69d0dc1811fa082736500f649f79df7735303 \ + --hash=sha256:8df0178ba8a9e5bc84fed9cfa61d54601b371fbec5c8eebad27575f1e105c0d4 \ + --hash=sha256:97f7cb9921fbec4904f522d972f0c0e1f4fabbdd4e0287813b21215074a0f160 \ + --hash=sha256:9ccc4316f24409159897799b83004cb1e24f9819b0dcf9c0b68bdcb6cefee6a8 \ + --hash=sha256:b6e06c20c05fe95a3d7302d74e7097756d4ba1247975ad6905441ae1b5b66003 \ + --hash=sha256:c777eb75bb33c47377c9af68f30e9f11bc78e0f07fbf907be4a5d70b2fe5f030 \ + --hash=sha256:ca9609c77ea3b8481ab005da74ed894035936223422dc591d6772b147421f777 \ + --hash=sha256:cf8496728c18f2d0b45198f06895be52f36611711746b7f30c464b422b50e2f5 \ + --hash=sha256:eaa912e0b11848c4d9279a93d7e2783df352b082f40111e078388701fd479e53 \ + --hash=sha256:f35cfccb065fff93529d2afb4a2e89e363fe63ca1e4a5da22b603a85833c2649 \ + --hash=sha256:fc0ed7fe2231a444fc219b9c42d0376e0a9a1a72f16c5cfa0f68d19f1a0663e8 + # via policyengine-core +ptyprocess==0.7.0 \ + --hash=sha256:4b41f3967fce3af57cc7e94b888626c18bf37a083e3651ca8feeb66d492fef35 \ + --hash=sha256:5c5d0a3b48ceee0b48485e0c26037c0acd7d29765ca3fbb5cb3831d347423220 + # via pexpect +pure-eval==0.2.4 \ + --hash=sha256:260c2774686e651b79f8b8e7fc9d80b3599ea6a66334b47d5f4abb69fc2c0ea1 \ + --hash=sha256:96cae060a313cfaad51bb761278bfb0e62dc0248d9315a81173752dc546cd37a + # via stack-data +py-cpuinfo==9.0.0 \ + --hash=sha256:3cdbbf3fac90dc6f118bfd64384f309edeadd902d7c8fb17f02ffa1fc3f49690 \ + --hash=sha256:859625bc251f64e21f077d099d4162689c762b5d6a4c3c97553d56241c9674d5 + # via tables +pydantic==2.14.0 \ + --hash=sha256:15fab1bea6f1dc5003b54fc2ecab230c1fd1dbade2acd4addc52d81e32416d4b \ + --hash=sha256:8a51a7aaddd60f55566d1f07bdd87b92b463903f39a8f26b71a06314cd1548ae + # via blosc2 +pydantic-core==2.50.0 \ + --hash=sha256:00963fde61cf8880d9e7b5635a9830e0591edfa45168447fdc5b47635c0f6437 \ + --hash=sha256:01340f4fbb4f854b1f36a6fe9dcd2b26c8936aead4e4ad1205624ac025c875fc \ + --hash=sha256:02ec3675d606a355523e1c52bf5aa4116776f8d273dba03d8336a5a3ae984e15 \ + --hash=sha256:031867348c98ab49c6d3a16ad39738369ea48da59900d76d71c1e64de71fe79b \ + --hash=sha256:0393763d66f6f61715488d074a2cefac04aeb3ee281e36fb4925dd44deaf9e17 \ + --hash=sha256:049b0404792dcb942f1092bfdae5f819ef30445b0d174782e1909fbdd91bb48b \ + --hash=sha256:0abe1b44d361b948404b6b2ed80be2583e0077340572e071afa6e0eda4e1de30 \ + --hash=sha256:0def1dc09802a790e4a1b3cbc4401f0b53c58f273ce3671df9867f7bdf1fbe20 \ + --hash=sha256:0fdeda6272d60b1f6fb63f6a3dade55e274af62e1514d24a6549a12150c385cc \ + --hash=sha256:1541c334af5d42cb9eb03862a9b4d2cfbfc670fd05172ec51f3ce02d704550f1 \ + --hash=sha256:158749408ee19682b8a2a7e7135cced7f41d6f2f9de96088b1b1609858a6a158 \ + --hash=sha256:1751e92d56fbb623b937d73985e500b1a2b1053e56f718a6c564660d99bb9cb0 \ + --hash=sha256:1773001198030e16f946a7ff7760fc3ebd45b12150f66fd0f433780043dc13d8 \ + --hash=sha256:17a5ca9c197788a6424749a09a3dce824cb2c17b72f835f8a5e330935b973609 \ + --hash=sha256:1bbd7da16d8b2912cc56c9d0b85c4998a6cbf39b220f81c0d8c397c64672ae0e \ + --hash=sha256:2092ce156f92aff17e3345baba2b7c0c1701f32ba922c5de71bd6248fbe164e3 \ + --hash=sha256:21b62d45f327eb0802f842c132fda6d01a8376a8077922dc4dda69011c64d34a \ + --hash=sha256:21e38a011783d8afc8b9d79928e273d06f349b52ae84edf63ec18ad07f077484 \ + --hash=sha256:23e0940b7d73f405d92e98b2a05b93b16db163be13b7478bb19e1db2e486ade6 \ + --hash=sha256:24302bf47319a64e5c5c7c29e971d2b7a20a190c64e59035a3df9582dec636fa \ + --hash=sha256:243088c95e23b12db9f2cd7661d584a3f00814e087489f40cde7f9feac56b694 \ + --hash=sha256:2568b190075acd058513dca34f7fddc7252fc958c1591cb67a554338fc9a81b2 \ + --hash=sha256:2918547195ffb20118b829fdb8938e9dc92c9527fe6cbe58572594c96362880e \ + --hash=sha256:2f28a5a299d4cefd1066a6883d22600b9ae3606f881c3015d255784634647580 \ + --hash=sha256:34a4a0938eb30931baca56e55786c5a6871ac7aa891a38c8cabcdb7e49dab91b \ + --hash=sha256:350001f5573451150d919722ee095aa28bec037d6e23b86d7f04581a910fe924 \ + --hash=sha256:364f62d8024997536e57865cb1c8b36effad3249bf392a29a2379ea69db28238 \ + --hash=sha256:36c49d4e1769127461b609f110d91963790091ffcc2de401ac1d3b2f6a63bd54 \ + --hash=sha256:36f9ed6ae1069913e4f6e86d8233e119e83e00a20c54f88faf9c81292f2fecc0 \ + --hash=sha256:38b03c5439c6a7a952f56e3e6596dae44bc78c3fb6a69df46cabfb2f888e5f0c \ + --hash=sha256:3b2f3e44af4c6512dd73557621385a71b18094c8be81d60e5a8e73a8ce96b7f4 \ + --hash=sha256:3fce74add1099da1ea09473268950270071fd56773e2968604efb3ab1d240e02 \ + --hash=sha256:41b9f2821f0a105f88cd54ad03fe1392ec600618ffa8610f7c5e466ecd98c531 \ + --hash=sha256:42a56b0052ac11d9d0d87b1c94a1ce52e31914fd133f269585e0f63a4ed988f2 \ + --hash=sha256:42fff617cb0b08505d8123d71e6e7a8e54210d9007498f564855bd843ce984b1 \ + --hash=sha256:468f7e67cfbd8231f442af6726449efe46f2be0e5a57b44fba7ccd92c6f121c4 \ + --hash=sha256:4b1bae96f41806b14dd8bb1568d39b5e33b5af7fb27f7be36c78b8fa84708917 \ + --hash=sha256:4f31af62efd1fd0257735b72e6716b32d4f207654adeabfe524d44baf1bb6bed \ + --hash=sha256:4f96ccd9368ecbf6685d8f6981584ab72b4f0ffd20685e747737e7e340277b8d \ + --hash=sha256:4faa766450ef44d9eabed5b65a280f63f903d1e1ed6d2e278961eb22345ec49f \ + --hash=sha256:50920d66aaab60dbc6023c3035d55fbabfa58b6d205d0b39d47d820c4a7a13a8 \ + --hash=sha256:5307a8bd49158b57a0ca4e10950d31085aa35d9007e934047043ccc6d28eea97 \ + --hash=sha256:55684bc850059fc85ff8dc21a3e342b722d3178993c49ebdfdee8b698a432720 \ + --hash=sha256:56178c4116fc0c859786875ff4acc1c8d52678f095c312b0eff2a2dd9d6f8d5f \ + --hash=sha256:57c0e5b26d82bf31ab2b044781527b1b1a36e9ed400856b6aca5097eb1abb909 \ + --hash=sha256:586699b43066ca6038f96bd71d0eff0b6c292929e3d66ff63d5dc79d0f06d589 \ + --hash=sha256:588d309ce5c85448379556d72011b191c0414ee2e80d7c3f1ebe2ceb2d9027b1 \ + --hash=sha256:593dd4f24abeb3ed90222f98bc6eefcac68cd5aa96fc7745f93862a802952bce \ + --hash=sha256:59f816dc04e99627a5a6352ae51dfb30e603f2cb0b7009c91dc640c533def014 \ + --hash=sha256:5a07c644047f5abc268b4c39f8cb5a30e08a3c349228cb70142c7d3ed87587c0 \ + --hash=sha256:5a8403eef4a66743e339102fb3cdd8c8b9016b8bd67924685893d062c88896f9 \ + --hash=sha256:5d0b210c871486f5acb56d87bf00e3c5d83aab6a1ef3042629fa6ae0172fcf47 \ + --hash=sha256:5dbf9f18c8af11db719e67633be0af556d7d765bee0ca9419bd706fe4b7ed9fe \ + --hash=sha256:610e9f483ac53c5cc59c2d3687224029b54eb494feec2d40a2bcfdd187635192 \ + --hash=sha256:62a93a9d206a3580c975c3c1f65a869cd063844d016c004f8d786a9309b3c591 \ + --hash=sha256:62ec6568896e0abf258cbcd22c406c1c8bf27d16224b21bec8f75c4ae88a8173 \ + --hash=sha256:63263d64884688554fb025a3906c7b00573980cfee75f9afeb86239d577384bc \ + --hash=sha256:68421ba548f6d86c7dededd70bfe530b4faf67eb811c53c70a1be69438d3ce99 \ + --hash=sha256:6e1ec4176c3b56017745937dfd4a3ec6df55f7f0e66991124499f3f79f8f8d1f \ + --hash=sha256:70df7ff903aea05383298715ea53551c8f27c8f70cbe54ba7f05606cd822e7e4 \ + --hash=sha256:71061800a3c225e730f7997f8a7fad6e0d0dcbe36609cdc7e60576a099a2832b \ + --hash=sha256:718d05d4e078c7828f40ad3e310870fe4b837d93a32e7e8497a080c1f1040490 \ + --hash=sha256:732efbb50977ab7cf18f01d4c255834aeb14cb2425459f7bff681a1ba3a4ffa1 \ + --hash=sha256:74cbb6cbd74445ca279668790e0c10eccac0428fd79fe061fce6c9e3982ad3fe \ + --hash=sha256:753863dd4317ec8cc9eb3e6d9d01a8ef1a1726a8003b4354658d68a1ae05f9db \ + --hash=sha256:75b451ec5e64a1d4b803317f34710131742ff2e42f4bf5403f597d0af857d7d8 \ + --hash=sha256:779b6c74526596a86d38248dedaecfb7851bbaf319c234be042c57acddd2c8c4 \ + --hash=sha256:7987866a2569396e6765c54d643fd6a7b3b234e89ee8d45a3729a7b4b2726145 \ + --hash=sha256:79e8fc9c135ef628c45cb8aa5deef8d21de13d33bb4c59a859fa73d335ceb40a \ + --hash=sha256:7eee44c3f1f8acc220a743a5ed5588949a4f18b33df4cfbef2b1277470285401 \ + --hash=sha256:8447678b49412294801c9ea15ae31ea3bae7da65425268c92d40e032c38eac6f \ + --hash=sha256:84d2d38f7d163c4dec292f379e9de1960c661795442aca6c90d706436cb3749e \ + --hash=sha256:8ab9e74878172948e0426e3d27fba333fd6a1c3f9456d8e75643e8e6868ac1a1 \ + --hash=sha256:8ad8dad549cd1645be591a50b4573995ee7e018f6619ddc2bc6ea44b2ad9f694 \ + --hash=sha256:8b16e164205a90b1050d2f5469f8a7829db7698ad198c69e6aab6cbfb5648b87 \ + --hash=sha256:8f16bc5bb12f4c581b0f40facc28dbf286db32d1bf4e7e4f4c4e0f7f4e34ecf9 \ + --hash=sha256:8facaf0a16121ac82cc403a71399a061b74624c1ae2034eec9ed6169c5d16ecb \ + --hash=sha256:90874428bc6678b26434336c77931c9734ecebedf50132c179205e5a9908761d \ + --hash=sha256:92016718bcf3e6f35a6bd986880191a8da7a35aa1f5b1e97544582ef938464cf \ + --hash=sha256:9279f4be22bc3765dd9f61f5b4d38d9cb219d167bbd6f2e0ffa3368b1b71b4d1 \ + --hash=sha256:933f2d639eb81a3e1f145aec415453cc00983236629933f028d9507222583a2e \ + --hash=sha256:93502b3c762149a5904316ef52f0ed1ea721e0f4c8431f964f140ed15fa61926 \ + --hash=sha256:955d7878130dfc124d6a5343e1b87d2933244fe14a4a0a3e98787e8e660a8eb4 \ + --hash=sha256:980c81c2ec53ea9eb2227c14b3e6de35670b2de163b638f2a803e90a3bd5bbb0 \ + --hash=sha256:99e203d5c2a814facef78dcd993b0fb7a933124a3475a38979fc09cceae210b7 \ + --hash=sha256:a2b88f9f9fa52e1c34938ff1a18ee7fbffe482df0bb43c087a9a60578d273d68 \ + --hash=sha256:a3e8ee6386f6b68e2f818ccf422ccfafc59bcff10862b52c7819db3aa0352dfc \ + --hash=sha256:a7080928078ff56c07da393392f772054e93a39c8033dc9c04547bd949f9b614 \ + --hash=sha256:a8ee3965e01f10e4ff92ba1727626328ab7ba93bcd5674ff2b78ea1048ee0cea \ + --hash=sha256:ab3f95f737fc1b258b8210308fc02ce1442cf5950cf6d30b09ad89ab9e8afebd \ + --hash=sha256:ac223ea031905319a64d0df116979ae438b42d6265862a3d63c9f9808c2905a7 \ + --hash=sha256:ad3532291deedfdfcad3cf5d351d0076d646c68a0c63869a1bebf87c22159600 \ + --hash=sha256:ad9185366893714cd4514ae5e1a098227704fa395cb41a7855d75968ecedc826 \ + --hash=sha256:ae45853d25a23fba56681d2f9ed41f3e3f12f0a3b2393fefa08ff6406320a1f5 \ + --hash=sha256:af2b808a79bb04075e87c81a5b6179365b93f9a851f29dafd67abff72085d0c8 \ + --hash=sha256:b123f9d8702106f39dc3af63a031ca8b5279862a3747ec6c03ca49dbe78b71b9 \ + --hash=sha256:b1399f918aea8fb76ffa99b474c9b768accea1f079fde407ee538bec89f20fa7 \ + --hash=sha256:b916ff828d604d4311a5639b7b3da51eaea3923833ec3e300a5ee35eade99691 \ + --hash=sha256:b9be297ffe1015bfb2db4a23b6e1fec7e48361cf7c7b4f4f6bbdd008451b0a7b \ + --hash=sha256:bc87bd34239835c8d73171acd039e591cea0a2ca8615e6188044ad170a40fca1 \ + --hash=sha256:bd841dcf394ff261c26763a9d7be754176d4f1e6d26cb2a5d5331e91b6b56a5f \ + --hash=sha256:bdd70c2d9e73bca09fad54605dfeaae2b4e770b2800c65f5f5342901ed567b9f \ + --hash=sha256:c05b75ef3574c9ee4e05bbcf8513f7ccb155d426514be9efef5f6f53152d5f5c \ + --hash=sha256:c05d035e72530f6b00297941b0162218601542b76870c3bf2756bd87f16fc538 \ + --hash=sha256:c19500343957f254ecf3e60174f4a4cdd21690e0e1677740a8017d28ab2a2a4b \ + --hash=sha256:c21e6a6e4e6d32fb6acbc4f0fa69e8319cac0d65eeaa8298d757371cc2a9c687 \ + --hash=sha256:c2b246fa7cbdf9918488d1542a82bbb928cf71bcba66905c24131981e759ff0b \ + --hash=sha256:c2e97985641fe53ad7824d1b5bfeb7990a5ff788c4559ee44d7522642560ddc2 \ + --hash=sha256:c3ae59461625518449f800acc4f874753ae96fcf993c47a27be07beb651371fd \ + --hash=sha256:c4abc425789f8540e86ca4cfdbc8dc650433cc2ac7c6136fee9bcb29d5665a02 \ + --hash=sha256:cb4fcaabb28cabf21396a9b816b9afe091f8c776805fdf03e2cbc606b64dfa7c \ + --hash=sha256:cbce1b5a2a88a465d7865df61b7e4f8829ddc49b4fa841e9b241815c9d67c3b2 \ + --hash=sha256:cf150693a51ca21e8288cd08a9de05e5ab331776dfcfd0537b14523338f0502a \ + --hash=sha256:cf81432281af66ba3285b26b09c2d478d84730dc50ff90926c1bdcef54048a33 \ + --hash=sha256:d01029d54ff1f45c195b1f7e6fbf6e58fb7e7e12cda9a6e639570d9c581decb2 \ + --hash=sha256:d06dbbfe8da01a0574de27afc19915bb3e7dddfbd184bb97e958f94051d8531b \ + --hash=sha256:d14d04058923d526a552fc3ebe8b0b0353c19516431cee196502b53119278fd9 \ + --hash=sha256:d187f43d1c5b844adc871c5b8c22b4aa12a116aaca4e9bd1521bc9ce479aae1f \ + --hash=sha256:d1d084e92d0f4a096a5155b23d1ac603db8073ef98a3d1384badf1455e5ae742 \ + --hash=sha256:d8354fbbe2abf0fb724b9303bef43bfd9b7a2779332813fa6d6559983954e7d8 \ + --hash=sha256:dcbd1fe5083315243447c13f7252ae9fe9d128b1ae2857e3a916c609235dd863 \ + --hash=sha256:dec0dafc116ac29a84d143fdbc3b83fdb5d4ed339276be2251154537ab30e14d \ + --hash=sha256:e15bb1535f68a27f28e579ba3a8f74e7b05d350c45f5622b76a311d5a19ae48a \ + --hash=sha256:e41f9d1d9240e8e0d8a670ad3e66c0c00f0b1f7150a31bc6c445a4f87c1cb3ba \ + --hash=sha256:e58acd43ac8d3905659c1d5309318dd576243e723dd7c3b5dd4f555479b77d4b \ + --hash=sha256:eadf95aab7301ac651628f097e521d742d0fb5f732155ebfd00d07933045d81c \ + --hash=sha256:ec786cb9d597dd75d993f8c1273e31bb2114c9bc22f67fba611e654e8347701b \ + --hash=sha256:ed557fa2744617eac3e34dd39b85037efbf23cd33f06851c00fdb8f18ad8f4c2 \ + --hash=sha256:ee9913fa2b5bfa6111c11158cf481bb13544f8bd5d10382fb6ee2612b16fcf28 \ + --hash=sha256:f0af2d2f745ec00a6616c4dfba4477f9156ccfb45690f6ffa5fd34f42e871ed4 \ + --hash=sha256:f12d9690634414fc04b1a7072fdc35c34a9242232c1851fe4518383578bb09d4 \ + --hash=sha256:f187030fc3d62c668feb0f09e92852e0eb414d7fcefc4748f2e67d245aade37e \ + --hash=sha256:f3abcabb04503023e1053add24472e78878de0bfd5c8a93686be01f4032c363c \ + --hash=sha256:f44107b5fdfecc03438feb165431652c8006650471326e53dd86d4c19124f5c5 \ + --hash=sha256:f517a417cd02aa8fb05b603a0ac6d87b7b004c3ba4fcd279cad25cab7229043b \ + --hash=sha256:f8cc61ad94215ab98e5cbcdea2cfde45e11bb0136ee980e1240b721635e55790 \ + --hash=sha256:f8df36f964c21168e345f914855e3b428e2cb6e1f739c8ef5963b77d86dd84ae + # via pydantic +pygments==2.21.0 \ + --hash=sha256:2363c69b61c4a97c838da3b130dcd6468f4848992b21a82f2a63ec34377137d9 \ + --hash=sha256:610ca751c9bc2492b38eb9a38a7fbc93edbbb2d7182edaf34e66ae493dee5c8c + # via + # ipython + # pytest + # rich +pyparsing==3.3.3 \ + --hash=sha256:928ae7e20211f3b6f3915a72f06a0cfd29ab9d24279dd6346b6b1a7146397d36 \ + --hash=sha256:ece8c00a69cf01b45d0b1dedabb469c90d8caf996d4fda40f147627a122849a4 + # via matplotlib +pytest==9.1.1 \ + --hash=sha256:1088fbde8f2b49d95a549a195707afa7a76a3ce9bcadc26b6d71f0ffda5fe313 \ + --hash=sha256:37a86b45efb9a47a61a36449063e8e18d0cab3161329fc099eb21783169c4f0c + # via policyengine-core +python-dateutil==2.9.0.post0 \ + --hash=sha256:37dd54208da7e1cd875388217d5e00ebd4179249f90fb72437e91a35459a0ad3 \ + --hash=sha256:a8b2bc7bffae282281c8140a97d3aa9c14da0b136dfe83f850eea9a5f7470427 + # via + # matplotlib + # pandas +pyvis==0.3.2 \ + --hash=sha256:5720c4ca8161dc5d9ab352015723abb7a8bb8fb443edeb07f7a322db34a97555 + # via policyengine-core +pyyaml==6.0.3 \ + --hash=sha256:00c4bdeba853cc34e7dd471f16b4114f4162dc03e6b7afcc2128711f0eca823c \ + --hash=sha256:0150219816b6a1fa26fb4699fb7daa9caf09eb1999f3b70fb6e786805e80375a \ + --hash=sha256:02893d100e99e03eda1c8fd5c441d8c60103fd175728e23e431db1b589cf5ab3 \ + --hash=sha256:02ea2dfa234451bbb8772601d7b8e426c2bfa197136796224e50e35a78777956 \ + --hash=sha256:0f29edc409a6392443abf94b9cf89ce99889a1dd5376d94316ae5145dfedd5d6 \ + --hash=sha256:10892704fc220243f5305762e276552a0395f7beb4dbf9b14ec8fd43b57f126c \ + --hash=sha256:16249ee61e95f858e83976573de0f5b2893b3677ba71c9dd36b9cf8be9ac6d65 \ + --hash=sha256:1d37d57ad971609cf3c53ba6a7e365e40660e3be0e5175fa9f2365a379d6095a \ + --hash=sha256:1ebe39cb5fc479422b83de611d14e2c0d3bb2a18bbcb01f229ab3cfbd8fee7a0 \ + --hash=sha256:214ed4befebe12df36bcc8bc2b64b396ca31be9304b8f59e25c11cf94a4c033b \ + --hash=sha256:2283a07e2c21a2aa78d9c4442724ec1eb15f5e42a723b99cb3d822d48f5f7ad1 \ + --hash=sha256:22ba7cfcad58ef3ecddc7ed1db3409af68d023b7f940da23c6c2a1890976eda6 \ + --hash=sha256:27c0abcb4a5dac13684a37f76e701e054692a9b2d3064b70f5e4eb54810553d7 \ + --hash=sha256:28c8d926f98f432f88adc23edf2e6d4921ac26fb084b028c733d01868d19007e \ + --hash=sha256:2e71d11abed7344e42a8849600193d15b6def118602c4c176f748e4583246007 \ + --hash=sha256:34d5fcd24b8445fadc33f9cf348c1047101756fd760b4dacb5c3e99755703310 \ + --hash=sha256:37503bfbfc9d2c40b344d06b2199cf0e96e97957ab1c1b546fd4f87e53e5d3e4 \ + --hash=sha256:3c5677e12444c15717b902a5798264fa7909e41153cdf9ef7ad571b704a63dd9 \ + --hash=sha256:3ff07ec89bae51176c0549bc4c63aa6202991da2d9a6129d7aef7f1407d3f295 \ + --hash=sha256:41715c910c881bc081f1e8872880d3c650acf13dfa8214bad49ed4cede7c34ea \ + --hash=sha256:418cf3f2111bc80e0933b2cd8cd04f286338bb88bdc7bc8e6dd775ebde60b5e0 \ + --hash=sha256:44edc647873928551a01e7a563d7452ccdebee747728c1080d881d68af7b997e \ + --hash=sha256:4a2e8cebe2ff6ab7d1050ecd59c25d4c8bd7e6f400f5f82b96557ac0abafd0ac \ + --hash=sha256:4ad1906908f2f5ae4e5a8ddfce73c320c2a1429ec52eafd27138b7f1cbe341c9 \ + --hash=sha256:501a031947e3a9025ed4405a168e6ef5ae3126c59f90ce0cd6f2bfc477be31b7 \ + --hash=sha256:5190d403f121660ce8d1d2c1bb2ef1bd05b5f68533fc5c2ea899bd15f4399b35 \ + --hash=sha256:5498cd1645aa724a7c71c8f378eb29ebe23da2fc0d7a08071d89469bf1d2defb \ + --hash=sha256:5cf4e27da7e3fbed4d6c3d8e797387aaad68102272f8f9752883bc32d61cb87b \ + --hash=sha256:5e0b74767e5f8c593e8c9b5912019159ed0533c70051e9cce3e8b6aa699fcd69 \ + --hash=sha256:5ed875a24292240029e4483f9d4a4b8a1ae08843b9c54f43fcc11e404532a8a5 \ + --hash=sha256:5fcd34e47f6e0b794d17de1b4ff496c00986e1c83f7ab2fb8fcfe9616ff7477b \ + --hash=sha256:5fdec68f91a0c6739b380c83b951e2c72ac0197ace422360e6d5a959d8d97b2c \ + --hash=sha256:6344df0d5755a2c9a276d4473ae6b90647e216ab4757f8426893b5dd2ac3f369 \ + --hash=sha256:64386e5e707d03a7e172c0701abfb7e10f0fb753ee1d773128192742712a98fd \ + --hash=sha256:652cb6edd41e718550aad172851962662ff2681490a8a711af6a4d288dd96824 \ + --hash=sha256:66291b10affd76d76f54fad28e22e51719ef9ba22b29e1d7d03d6777a9174198 \ + --hash=sha256:66e1674c3ef6f541c35191caae2d429b967b99e02040f5ba928632d9a7f0f065 \ + --hash=sha256:6adc77889b628398debc7b65c073bcb99c4a0237b248cacaf3fe8a557563ef6c \ + --hash=sha256:79005a0d97d5ddabfeeea4cf676af11e647e41d81c9a7722a193022accdb6b7c \ + --hash=sha256:7c6610def4f163542a622a73fb39f534f8c101d690126992300bf3207eab9764 \ + --hash=sha256:7f047e29dcae44602496db43be01ad42fc6f1cc0d8cd6c83d342306c32270196 \ + --hash=sha256:8098f252adfa6c80ab48096053f512f2321f0b998f98150cea9bd23d83e1467b \ + --hash=sha256:850774a7879607d3a6f50d36d04f00ee69e7fc816450e5f7e58d7f17f1ae5c00 \ + --hash=sha256:8d1fab6bb153a416f9aeb4b8763bc0f22a5586065f86f7664fc23339fc1c1fac \ + --hash=sha256:8da9669d359f02c0b91ccc01cac4a67f16afec0dac22c2ad09f46bee0697eba8 \ + --hash=sha256:8dc52c23056b9ddd46818a57b78404882310fb473d63f17b07d5c40421e47f8e \ + --hash=sha256:9149cad251584d5fb4981be1ecde53a1ca46c891a79788c0df828d2f166bda28 \ + --hash=sha256:93dda82c9c22deb0a405ea4dc5f2d0cda384168e466364dec6255b293923b2f3 \ + --hash=sha256:96b533f0e99f6579b3d4d4995707cf36df9100d67e0c8303a0c55b27b5f99bc5 \ + --hash=sha256:9c57bb8c96f6d1808c030b1687b9b5fb476abaa47f0db9c0101f5e9f394e97f4 \ + --hash=sha256:9c7708761fccb9397fe64bbc0395abcae8c4bf7b0eac081e12b809bf47700d0b \ + --hash=sha256:9f3bfb4965eb874431221a3ff3fdcddc7e74e3b07799e0e84ca4a0f867d449bf \ + --hash=sha256:a33284e20b78bd4a18c8c2282d549d10bc8408a2a7ff57653c0cf0b9be0afce5 \ + --hash=sha256:a80cb027f6b349846a3bf6d73b5e95e782175e52f22108cfa17876aaeff93702 \ + --hash=sha256:b30236e45cf30d2b8e7b3e85881719e98507abed1011bf463a8fa23e9c3e98a8 \ + --hash=sha256:b3bc83488de33889877a0f2543ade9f70c67d66d9ebb4ac959502e12de895788 \ + --hash=sha256:b865addae83924361678b652338317d1bd7e79b1f4596f96b96c77a5a34b34da \ + --hash=sha256:b8bb0864c5a28024fac8a632c443c87c5aa6f215c0b126c449ae1a150412f31d \ + --hash=sha256:ba1cc08a7ccde2d2ec775841541641e4548226580ab850948cbfda66a1befcdc \ + --hash=sha256:bdb2c67c6c1390b63c6ff89f210c8fd09d9a1217a465701eac7316313c915e4c \ + --hash=sha256:c1ff362665ae507275af2853520967820d9124984e0f7466736aea23d8611fba \ + --hash=sha256:c2514fceb77bc5e7a2f7adfaa1feb2fb311607c9cb518dbc378688ec73d8292f \ + --hash=sha256:c3355370a2c156cffb25e876646f149d5d68f5e0a3ce86a5084dd0b64a994917 \ + --hash=sha256:c458b6d084f9b935061bc36216e8a69a7e293a2f1e68bf956dcd9e6cbcd143f5 \ + --hash=sha256:d0eae10f8159e8fdad514efdc92d74fd8d682c933a6dd088030f3834bc8e6b26 \ + --hash=sha256:d76623373421df22fb4cf8817020cbb7ef15c725b9d5e45f17e189bfc384190f \ + --hash=sha256:ebc55a14a21cb14062aa4162f906cd962b28e2e9ea38f9b4391244cd8de4ae0b \ + --hash=sha256:eda16858a3cab07b80edaf74336ece1f986ba330fdb8ee0d6c0d68fe82bc96be \ + --hash=sha256:ee2922902c45ae8ccada2c5b501ab86c36525b883eff4255313a253a3160861c \ + --hash=sha256:efd7b85f94a6f21e4932043973a7ba2613b059c4a000551892ac9f1d11f5baf3 \ + --hash=sha256:f7057c9a337546edc7973c0d3ba84ddcdf0daa14533c2065749c9075001090e6 \ + --hash=sha256:fa160448684b4e94d80416c0fa4aac48967a969efe22931448d853ada8baf926 \ + --hash=sha256:fc09d0aa354569bc501d4e787133afc08552722d3ab34836a80547331bb5d4a0 + # via + # policyengine-taxsim (pyproject.toml) + # huggingface-hub +requests==2.34.2 \ + --hash=sha256:2a0d60c172f83ac6ab31e4554906c0f3b3588d37b5cb939b1c061f4907e278e0 \ + --hash=sha256:f288924cae4e29463698d6d60bc6a4da69c89185ad1e0bcc4104f584e960b9ed + # via + # census + # policyengine-core + # spm-calculator +rich==15.0.0 \ + --hash=sha256:33bd4ef74232fb73fe9279a257718407f169c09b78a87ad3d296f548e27de0bb \ + --hash=sha256:edd07a4824c6b40189fb7ac9bc4c52536e9780fbbfbddf6f1e2502c31b068c36 + # via blosc2 +six==1.17.0 \ + --hash=sha256:4721f391ed90541fddacab5acf947aa0d3dc7d27b2e1e8eda2be8970586c3274 \ + --hash=sha256:ff70335d468e7eb6ec65b95b99d3a2836546063f63acc5171de367e834932a81 + # via python-dateutil +sortedcontainers==2.4.0 \ + --hash=sha256:25caa5a06cc30b6b83d11423433f65d1f9d76c4c6a0c90e3379eaa43b9bfdb88 \ + --hash=sha256:a163dcaede0f1c021485e957a39245190e74249897e2ae4b2aa38595db237ee0 + # via policyengine-core +spm-calculator==1.0.0.post1 \ + --hash=sha256:a9f99ce9a490989c40fa9a7d1bcd16dd544036e4788a0b3af4d170156ef9a168 \ + --hash=sha256:c9834a761891ba12de1edd585688c8b477be58e9a9c9fa92d9cfdf41e5396a41 + # via policyengine-us +stack-data==0.6.3 \ + --hash=sha256:836a778de4fec4dcd1dcd89ed8abff8a221f58308462e1c4aa2a3cf30148f0b9 \ + --hash=sha256:d5558e0c25a4cb0853cddad3d77da9891a08cb85dd9f9f91b9f8cd66e511e695 + # via ipython +standard-imghdr==3.13.0 \ + --hash=sha256:30a1bff5465605bb496f842a6ac3cc1f2131bf3025b0da28d4877d6d4b7cc8e9 \ + --hash=sha256:8d9c68058d882f6fc3542a8d39ef9ff94d2187dc90bd0c851e0902776b7b7a42 + # via policyengine-core +tables==3.11.1 \ + --hash=sha256:1e78fe190fdeb4afe430b79651bae2a4f341904eb85aa8dbafe5f1caee1c7f67 \ + --hash=sha256:3a9c35f87fcb6a48c79fbc4e3ab15ca8f6053c4ce13063d6ca2ec36cbb58f40f \ + --hash=sha256:4cf3218b76ba78d156d6ee75c19fb757d50682f6c7b4905370441afbfc9d77f3 \ + --hash=sha256:56bf6fb9132ead989b7e76695d7613d6d08f071a8019038d6565ba90c66b9f3e \ + --hash=sha256:78abcf413091bc7c1e4e8c10fbbb438d1ac0b5a87436c5b972c3e8253871b6fb \ + --hash=sha256:7fa6cb03f6fe55ae4f85e89ec5450e5c40cc4c52d8c3b60eb157a445c2219e89 \ + --hash=sha256:a4bbd95036a4d0cc5c86c1f87fbb490b4c53cd70982f1c01b3ed6dcb3085cbb9 \ + --hash=sha256:a6f7a3b82dbf0ae0f30de635ca88bb42dd87938b0950369d0ee4289c52ae6de2 \ + --hash=sha256:e3cfe79484351f7216eb8f3767bfa1217bfd271b04428f79cfa7ef6d7491919d \ + --hash=sha256:eb30684c42a77bbecdef2b9c763c4372b0ddc9cc5bd8b2a2055f2042eee67217 \ + --hash=sha256:f0367d2e3df0f10ea63ccf4279f3fe58e32ec481767320301a483e2b3cd83efc + # via policyengine-us +tenacity==9.2.1 \ + --hash=sha256:9e56f17539296baab7beabb08b92f6ee3d7be92d8be72d763360677c2ad6580e \ + --hash=sha256:a606b5c808d0cded4a359d5b9932d867ff2a6a6b64d37350260fd01bbdf83839 + # via plotly +threadpoolctl==3.7.0 \ + --hash=sha256:61348cfb77d53b9242e0017029244b559b810c142ced65b4e21eeca1843959a7 \ + --hash=sha256:cd8b60b5641b45c67bbf73c64c843235fc2d8a480c87389f52f5dbee893b86be + # via blosc2 +tqdm==4.70.1 \ + --hash=sha256:c293e525e6fef9c20e8728fd4612df02a0aa31bb5fe91ecd93e123b1b7bffa73 \ + --hash=sha256:cefd0eca11b2a37a3aee776544d4f4ae913f02688135b5556b8788dfa474afc4 + # via + # policyengine-taxsim (pyproject.toml) + # huggingface-hub + # policyengine-us +traitlets==5.16.1 \ + --hash=sha256:ed900c2b631aa3a112811139fa97b8d2c3bad5e989656bba4b7e52c7852c18c1 \ + --hash=sha256:f775618166caa0396c8e337099240f2bd3e5e917d203b2e6fbe21a58d3cb1f6b + # via + # ipython + # matplotlib-inline +truststore==0.10.4 \ + --hash=sha256:9d91bd436463ad5e4ee4aba766628dd6cd7010cf3e2461756b3303710eebc301 \ + --hash=sha256:adaeaecf1cbb5f4de3b1959b42d41f6fab57b2b1666adb59e89cb0b53361d981 + # via + # httpcore2 + # httpx2 +typing-extensions==4.16.0 \ + --hash=sha256:481caa481374e813c1b176ada14e97f1f67a4539ce9cfeb3f350d78d6370c2e8 \ + --hash=sha256:dc983d19a509c94dba722ee6abd33940f7c05a89e243c47e907eb4db6f1a43e5 + # via + # anyio + # huggingface-hub + # pydantic + # pydantic-core + # typing-inspection +typing-inspection==0.4.4 \ + --hash=sha256:547274fa6b0a561ccf549cc9524b999a578e737d015d8709d021f9d0d13bea47 \ + --hash=sha256:65b8397ba37ccbce054456aaccddfc91e6e3083c92824df348d96ca832f3f147 + # via pydantic +urllib3==2.8.0 \ + --hash=sha256:0cf3cae568d36aa9576b28dfb35f11328f1cb974ca7647d9475ebb86c75ac6e3 \ + --hash=sha256:63bf2ead4c879426ebf22ef2a781eeb4aa3b4ae798a0435506f8687fd5bb9b63 + # via requests +us==4.0.0 \ + --hash=sha256:3e7dd072efc65ecc6f765ced861f49fe7635067e760bbe2a527f16e5477011c0 \ + --hash=sha256:7dd4c4e603c9427b72d7e07be700d8f643bdcd7f5195a12bc639f1b7e38e7496 + # via spm-calculator +wcwidth==0.9.2 \ + --hash=sha256:0a47e03d8293590ecce66c45dc20ff7b4b885e3c78093722239585eca0d77ab2 \ + --hash=sha256:0cd4f7f2e53905dcb110d213a4c8529b6733fa3d232d8c717f946cc69a10349b \ + --hash=sha256:138e1f8898e431b2f2d7881f8ca8d75591c1d3c21aa53f54e989bd6b39811da2 \ + --hash=sha256:196b47cf32f9df27ccda6dc513237f3c2429c4c659db428d60a5bc443d10f270 \ + --hash=sha256:1bf361c8705576760623b4724ae564666d73b016f9a778bcfd1c7345378ef4ec \ + --hash=sha256:2a9746de704242bd4fdaabb31dd46b82f694a56a8d21081ad89b679a89da9fec \ + --hash=sha256:33df042f96c61ed3cd5fb3742fba427553a635bc578799857a48aa79f774a0b9 \ + --hash=sha256:42dbcb76ce8af39e2c9db410ac3f9bdf4e47eb41d6f44525952f172d3d98f724 \ + --hash=sha256:48719a9bc76c2f84238693fe5013571fa5beffa3621cf228f1f3a9e30dae84b8 \ + --hash=sha256:5175609bf8cc7398a5f48aa35207bd64ebf9f45e4c70df65f7fdc7a988041a3c \ + --hash=sha256:59dab4049cbd982b478bca098528df2c79a9160636a3a163ffebffcbd7d1b892 \ + --hash=sha256:674b518af28d38ee645ff97b74f5760abee5fad4bac74413bfc4b881ef2ce724 \ + --hash=sha256:67d901a4ad99249eb775b4ee4769ca97fa405d35a75f46e83166910a47003f04 \ + --hash=sha256:734aa9405b321d1042301aa19c943c4731ee9e3460e4f8feea3299c064c97a14 \ + --hash=sha256:751bef0ab404b6a1dc028b56b4b85d46486be1c55833f80da533e42dc691f389 \ + --hash=sha256:7ef5a940bd5e30bac6e721f1a48fce0cd7bb3ece19e9c5d139e72c76c35cfd07 \ + --hash=sha256:89ca642c5bf0101157a09366be69fad0379db1f700ae39a920e103234573670e \ + --hash=sha256:8b4e381590b9b7390e07e22b2c0c1bb96ce50e1d2243c866d9387600362d51ed \ + --hash=sha256:97b878d1e158da5ed9ac5aac53fa3a55e282103af6a09ec353865613d1a31a76 \ + --hash=sha256:9e542f1f8475b78452a295495d7a5bc3ead565112e9446a64dc93462a41c2a79 \ + --hash=sha256:ae0800c5339423cc53d33a266ad264b42ba8aaa16d4464f6e6b1bee607f50b17 \ + --hash=sha256:ae0ef90b90f6af38b54f1fe6d58662ec33b3cb4b8391958a62416d654231727b \ + --hash=sha256:b9c6ab615e03723b7f8760ea2f27758d656e7e13b51515c9dca5c3e8b04612fa \ + --hash=sha256:bb08ceb501d6aaf94066c3ee122dd825b152df40ff0bd0df4dc27126233b948e \ + --hash=sha256:c3d80f39ba4653a595edae9aa46a509d14883790a8fc23c5db221ceb207f64b7 \ + --hash=sha256:e5f669ae8c3d969c72032f9cdee019674b666e522d45e1e2099a2e9dda4a341d \ + --hash=sha256:eda88ffdc97c0fbf193d407114f2c7a54b379f67f6e52a7531ee3b9fe749eca7 \ + --hash=sha256:ee1fd0db9d9fd711a70f3e7765e0e04c05d26982fa05361456163062549d7da4 \ + --hash=sha256:f2f7b3bba5a5d5f31fc350fd36ce5b84b693c83b7eb95ee630b720da5a5ce06f + # via prompt-toolkit +wheel==0.48.0 \ + --hash=sha256:3217dcc807155e45db462d7ef2431f5ddda0d7273b700d05a67b271ceb1287ab \ + --hash=sha256:94800765601e9171bf5d58d066e640662842bcedcbab982b2c90787a2c987322 + # via policyengine-core diff --git a/docs/dependencies/requirements-py3.14.txt b/docs/dependencies/requirements-py3.14.txt new file mode 100644 index 000000000..9fb80c47f --- /dev/null +++ b/docs/dependencies/requirements-py3.14.txt @@ -0,0 +1,1875 @@ +# This file was autogenerated by uv via the following command: +# uv pip compile pyproject.toml --python-version 3.14 --python-platform x86_64-manylinux_2_28 --exclude-newer 2026-10-09T19:00:00Z --generate-hashes -o docs/dependencies/requirements-py3.14.txt +annotated-types==0.8.0 \ + --hash=sha256:13b2beaad985e05e2d6407ee4c4f35590b11f8d693a258a561055cac8f64cab7 \ + --hash=sha256:f072f4d804ea359e4eaf198b1af7a8b0943881a87f31bb764f8bf219bb9419e0 + # via pydantic +anyio==4.15.1 \ + --hash=sha256:6152fdbbf9a77fdec97731721bebf7c4c44f7c29b424b0065826173efc7ed101 \ + --hash=sha256:9f28306018cbd6d329e64a36d58256edff76dd996fe423bc957326e578b82a94 + # via + # httpx + # httpx2 +asttokens==3.0.2 \ + --hash=sha256:3ecdbd8f2cc195f53ccada3a613538bb5f9ef6f6869129f13e03c30a677b8fe2 \ + --hash=sha256:9da13157f5b28becde0bd374fc677dcd3c290614264eff096f167c469cd9f933 + # via stack-data +blosc2==4.14.1 \ + --hash=sha256:033e62c56e2815f34900739bd505c750377743657e76cea6ea438c30273767e7 \ + --hash=sha256:08e09c372b3aae159c012c96940694574793b5a00abe3a5bac966c11c88e641e \ + --hash=sha256:3458922f59b6a4b6f5be50192e455647ed3145bd3078c3c77e091b6ac8b64bd2 \ + --hash=sha256:411d9fa31c559f0b016c16611101ccd0e03d38dc89ab1bc94178aa3757ce756a \ + --hash=sha256:439720cca5191a820bba415d076f9440f64b2af84983d3916d7d795dfa27d662 \ + --hash=sha256:575977165dd49b9492d506585e5a2e67a2c6e0f0d450f5a29a9ea3df9a2a53fe \ + --hash=sha256:5d37f2c76272fb6d0ffee3afbbaa4cd73438abd7e2c119d6152bcdf1d47434b3 \ + --hash=sha256:61fcbbdd8b9b8b73e80f0cb363b544ac1ccce0ca7d93087bbf3fa786120455b0 \ + --hash=sha256:696fdfc471191679e6c1b3b2d5db4ae7cc40675e10997d0b5eb6caf7d470253e \ + --hash=sha256:6a2208f001580d497a050aba1a4083d5ba54adbe1e166cee4faf4731f0e96c9a \ + --hash=sha256:7555f3785ff05be952b9cd5f2474764457f1568fcea2bd221d0254f199b61e58 \ + --hash=sha256:783be978d3abd03299922e33a595aa0cca706152aa6fddc95b42472671d495cf \ + --hash=sha256:79b7c096401f75bea1a0f24b28aa8e783cf6c10178cf077f9260a022abb7b245 \ + --hash=sha256:8e0ad358a9fb38d41b0bd1dd08b00f1384774940abd053a74f7e8a80af095a07 \ + --hash=sha256:8e402a0b1caa407e87dc4fc230ccce0f89abe86b3f54c74feff025008327f627 \ + --hash=sha256:94c1e518ee23f4423be80dc7fa16e405364afaefe074472d05785eccd17c56bd \ + --hash=sha256:aec524576f3241f1e411d47e586421e1947c274cd7c715da83b65a81e2c52ead \ + --hash=sha256:b5adb408854260acf64aca5c351ab1307bcb7c71d112e3049d8541c1e2f9b222 \ + --hash=sha256:d2748625f152b66ddfce2f6fe079e22e12179dfe960dff7898838d3ef25776ca \ + --hash=sha256:d5e65efe80740651c3b39a9fd98478f073c57bed51f7eebe1fdfe248dc259e37 \ + --hash=sha256:fb2960ff411e2c1cffa6209932b5ee344fb46208906c3de79e8f23531df82e8a + # via tables +census==0.8.27 \ + --hash=sha256:207aae0f83650004f6b7dab6a730b6a60df96a119f55167260c3153313f15a32 \ + --hash=sha256:6ef36f5d2e7759824e28051bc2c7fa0706d41e153ccb353a6c2d4d9eb354cd7e + # via spm-calculator +certifi==2026.7.22 \ + --hash=sha256:62f22742b58a1a33014a2b6b706588a8d7e2a88ae7bd1a6ebe8c992928483775 \ + --hash=sha256:741e2c3b351ddf169a738da9f2c048608ff7f2c5cc02f1ebc6b118bb090d5d55 + # via + # httpcore + # httpx + # requests +charset-normalizer==3.5.2 \ + --hash=sha256:01077390b03f7988f11d700a2194e69b119741a86b1a638b1db88891e3eced8e \ + --hash=sha256:01b0c0d2262a9e28e8484a278c7e1b5d650e3ac8cf2683d2967e25899f208bdf \ + --hash=sha256:04851f73ae72b8413dddadb16a49dfee95263553741fd42d546f7d66907e6be5 \ + --hash=sha256:0521c5665880b33d603717defa76c094048900010897909952397feb3039da56 \ + --hash=sha256:0774bf9bf620249fee3e0b8b9fd3065de213be30f3aa94ce2494b3b638949e26 \ + --hash=sha256:0891b9d3903c5571c03771ca669a4b0ec5618ca722a5c957d3d29cd4e5062848 \ + --hash=sha256:0c951d5e6dd9c2ff60609476752bee49da4206adde960ebc247766937f72e718 \ + --hash=sha256:0fed1d06615f022ee3b13caf5e8b180cfea32bb2c5aded8a9d44277afc040f93 \ + --hash=sha256:114e4d0c92d618409ed82a99e22b5c5e768fe995f2973f78265f4524f49d4640 \ + --hash=sha256:11912e4bb14baae7c5d8791aa55ba0a3a03ec6729073307b0f57270abaa713d3 \ + --hash=sha256:11a4d68a6ecda3292cb1e50239e111543ba5d709bb62a6b4ea1afcfa729d8875 \ + --hash=sha256:124fbf1a8ff966d87ae05bb8bd45a71f966055ed8bba320d0c7cf450bc5f4d0e \ + --hash=sha256:1461ac396c4fdb983a675f20aa555624f0ee18ac83d832b9244ffff3d8055275 \ + --hash=sha256:1503bccbeb36d5527790c3930327704c39af22de3112f1b1666a9f3ce15ee204 \ + --hash=sha256:15bb4005af6320d259dc7593ca84a38d7fe06a421dbcf7b910ae23979101e787 \ + --hash=sha256:15c44f7edfd477b06f517a5cc317fc1707edb9de2c865f43d4b6513907473234 \ + --hash=sha256:16fa0eccf81304b79c5cd87f9271c3b85dd9dd99245e4422ae9c0dd45e0f99d3 \ + --hash=sha256:183b88127acdb4fabe59d951ab424faf1af7b63cdbb5f776186c1ea2ffcaed98 \ + --hash=sha256:195c26fb65950f8fce54e26349852b7bdd7c5f120aeefbcc440b8a20faaed4a3 \ + --hash=sha256:1afb975bd5d68d5ce9f6b6d44fdf2f7e34b895a35e95708a7a91b20a3b51d187 \ + --hash=sha256:1b4cbc7c3491ccb4aa17fcd8165649d01cf39f76de1696da8631b5f71b85401d \ + --hash=sha256:1bc0baf5ef96b6ede57d47f4b8fe4d9d84019c3bfcbeb20a41edc6a6ee341f1f \ + --hash=sha256:1c50fe28bbc2ced33386f298650d91218076c05420e6cbd790b913adc41659e7 \ + --hash=sha256:1db38f4c5496827c1a501846d64d14c3b80c7e6714e406cd7dc36a9899fa1011 \ + --hash=sha256:211d5a3eb6af8f513b8d4ca19a8c1b7accab1b5f0d3175f9826b03c1a920dc1f \ + --hash=sha256:23851fb4e1b85ed3f6c2a27b777cdfe2e19fb5b38429a8faf38c7542b7665869 \ + --hash=sha256:254eb48b9fa5ee9898a3c445825a1f340fe53712a098904b39b0bddba8ea3cb1 \ + --hash=sha256:2625388c6c754520c37abaf3b41eb34d1cc4a373f457898f08606c8e362b891d \ + --hash=sha256:281cb91036248400f4cc957495cccd44c275c2e0c5854f7e45ac5cf7dc193847 \ + --hash=sha256:28a15fdad492a99b6eccfaaed66ef3f74050680545ea61ec8b2f4c538f1f1320 \ + --hash=sha256:28b4f0d66fb834ff90f28209ac7bce77868c45d8c93e26f906709d9b7c2e1af9 \ + --hash=sha256:2a925889534b3748302dae5dead07cc13480de1dac3aea80a941b729b471ef93 \ + --hash=sha256:2b7b3bbfb4fe8ef40600792d762fbaa9057559f9d3fad209525b7a22b99e91fd \ + --hash=sha256:2c9ad19a6cfcd5ea5c0d41161d22f9df1dcc277e9bef2751391334546a314c00 \ + --hash=sha256:2cc961b171b3f3440f410489ab3573e86aea8736134ebbb40ea1338b7f0831bc \ + --hash=sha256:2ce45c6627b22c47e390bc91a41c3d13032192e699fa0bea96e9671b373d69b0 \ + --hash=sha256:2e06a3a98f916dd41d27f3105e02e7a40181c98c94b9158733d03a6f80506c09 \ + --hash=sha256:304d5463e65a35d7bb0850550e0780395395f6fcf452f04db7d5ca7cecc425ac \ + --hash=sha256:304d8e4d493af723536393eee0c689eb7813f4a474c8b479dee63f1fdd98f621 \ + --hash=sha256:30fcd120b732aa79317f08dee04d7de0847822e4cf7ee0e9f445bb958832252c \ + --hash=sha256:31f3930700408d211f13378ccbe1c40845d8da54bd0681fac3a9b5aae81c7aa8 \ + --hash=sha256:34276fd796040bf0993ab33a369aa572e6979c7aab225a88893667ad8eac8f7a \ + --hash=sha256:355ad8011081dec5412240c087a9a0c9d4d5039f3ed11a3f13e18c2b29b56c51 \ + --hash=sha256:38a873987f3be698494da8b2e3085e29da02da7b633dce73e79c699a113d7bf0 \ + --hash=sha256:39de2a259fc954455c57274dc94c79d5842774e1247a016aff30bc0efed0f4ef \ + --hash=sha256:3d14b50de6bf4d0edf857a9386836846f982b8f524e188e2e68b96d702bcf4aa \ + --hash=sha256:3d21b8b13c7592db2ac5e544a6d83187b995257472b0c9e8351b6d507ae37ed6 \ + --hash=sha256:3d31298449090ab8d47b7b1b2a555ff73cac7ed438a08b7ac160980c7ebed649 \ + --hash=sha256:3ddacd27458c45bdacd6bd6db644bfb730efbf9e830310186e3045c9c5be8fb2 \ + --hash=sha256:3df041de8887954562c9b261cba85ca0e9ded74048daf125f45edcfaa4832229 \ + --hash=sha256:40ab6bffa02ae10a0581e6c198be7d2d8ca5c2a0c64e4ed3465d766df457573e \ + --hash=sha256:4275811936e2f06feff5e598fb42a1b7ae852da8e39605211892b56b81a34efd \ + --hash=sha256:443eae2bf318abeaf6f15d785138f71fd6de770e99a92158b8b814265e079115 \ + --hash=sha256:447441e76ec720b15e64418d32e092297340387053047c7c694f579efb0ee1d9 \ + --hash=sha256:4495c5002a7b28557e7e222e77e0b661183e432b7d6d2e788101e3f240e05b8c \ + --hash=sha256:44bd4fbb29dfbeba60e7d2bd000c59e4b21ddb3cc53912b14048d37092706d7c \ + --hash=sha256:4685902cf26edf013ed7a3da0f426ebba7a00ebb9541386d835afbf002c11cab \ + --hash=sha256:498dc3188ca05a68231ac3fdbfc7f57eb67e1343c30e0fea17f8218c1599b253 \ + --hash=sha256:4c2b5031f63e331e3839b40aed2dd6f191e9c07edbde303e7876846ea1946995 \ + --hash=sha256:4d48f2d08b9de5864e2c8744d4461b862fb149a18274abc8b698c45975573438 \ + --hash=sha256:4f87960d57feabfb618e4e0af6e7371645fa26a277860739d6e5d6e0012c92f0 \ + --hash=sha256:50e3adfb96fc189eb27b1cf62d3b598b89b4bb0420d93a3d3e42e137409011be \ + --hash=sha256:51cf45226a9b588d0d2b4880c62d686934b63ab0bd79ca23ab0e9762eb27441b \ + --hash=sha256:52aa6992700996af31f375de0c6bacd402b0097fe40b53c426b9f51a90ebabc7 \ + --hash=sha256:55ea99acb17b9325618de155a0cd6a2e8f5d10be008113e1d433bbb58db543b2 \ + --hash=sha256:56bc200a365efb37383b7852e4cc5898d3b2da5987289b543956cf8cad71018a \ + --hash=sha256:588461c2e8384d309bd63e5826019b6977bc66d629b99ac8737bb795d7b2cb5a \ + --hash=sha256:58ca3755ee7ff7f59b57789ec9833c9de9ea275405cdd240eda1f193112e398a \ + --hash=sha256:58f361dcbab699cf8f42db3f47c8e7fd1036f138c23a5d08de9fde5f425a730c \ + --hash=sha256:598a11a2c7ebaa5334bf698bf29568c9c390abac6a154d8170fedecd1cea38c5 \ + --hash=sha256:59f63901b0031c3136cf64704dcb21de0bbae62ce2c9529bc39d27665463de37 \ + --hash=sha256:5cde776b7cc66e4f6c99612cea4aa7269aa65863f7a15841b2c264f103822f4e \ + --hash=sha256:5e2b6b57e9733d39f0c9fd3185efa6b8e29652c4cd8fe94180272cf6ed9a78c4 \ + --hash=sha256:5fb29fb8cd1a46c27a1bf9613ad5ec2599310d46b4025d9556404a6b6a292800 \ + --hash=sha256:6045373d5a89a5ec71afde535db987ca28e76dfa276c2d4c818265b375d4b055 \ + --hash=sha256:619799369eeef6366ed3e8755a5670f4f2f0fb6b30a0fd7264dc0fdc2357058e \ + --hash=sha256:62588a277bfb59def052abd940703fa35107152bf479781a878617d60faf8fb5 \ + --hash=sha256:62603db9a7caa0802eaa28c1c46fecd7b3a263a774069c24c3c28c302448721c \ + --hash=sha256:65cd72beeeca9d3aaea1201e5923859f308f952f9c71de93f06063c79f0f7a3b \ + --hash=sha256:68eb192d85ab8e5f6ec69c2bc6ac0179fbf04a5ac1569d12fbef74883fe102d0 \ + --hash=sha256:6bd128f206a7752ae1f2ab6c61bf8a24ba28913a10df8b14c2637b973ff97a80 \ + --hash=sha256:6be488a102b8cf28d0391d8c4ba7748938ae28b78ad901f8585520fca33ead1a \ + --hash=sha256:7218e8f32b0956cfcd048fd42d9d5779809745ca1d86113ca56f66e7ae1549c4 \ + --hash=sha256:7441d755b7ab94f8d4eb3e43ec05482d760842fd263d003a99102d742cd835e2 \ + --hash=sha256:749e97e1b32313717a565abbe321bc2190bc8b35f1a67e4cdbc7c56c8d8ffe58 \ + --hash=sha256:75a3ceed0724d625d64b86ca20aba182e4df462e04c2414fc941c0f523f06aac \ + --hash=sha256:780fbe7cab297b81dad9fb8dc5eb003c0468ffb0d9e5f65068c53a34661a96bc \ + --hash=sha256:78456a747de8dc58360ffa581f30a002baf5aa28cb262536545e91f113ed7639 \ + --hash=sha256:7967d08cf06dee78443b874f98c98036f624f3a4e73e11f9f64f5be4d25393cf \ + --hash=sha256:7a881931aa470808df94a8c380eed2bbbc76cd9dc622310f99665658c821eb6d \ + --hash=sha256:7dcd882da75ef9adf94903b1e3b9419e8aa8fb4c7396822b834b9ef7fb96954f \ + --hash=sha256:7e841fb9010836c992c9f12fcbd43a831de93a5f726fc1ccd8ca1d0268c5014c \ + --hash=sha256:7fdde2c9fd9e3eca40631e024664cf2584272cc8f96308cbe5fdfc930f51d8bc \ + --hash=sha256:8024d00c3faf3fc0c16e07a69f4405e8eac7cc0ab15f65fe6cf43827c4cf72b4 \ + --hash=sha256:80d02b6f04e92601a081dd97b23d3128033098bff5d35d392ddcc0476ea11253 \ + --hash=sha256:838dcc90063569a0448120554591a1d6c4a4ffe11babf048908793154ab86ade \ + --hash=sha256:849df64e889b2e17230d58410a03dba311a65b163508fd33679b2b737d4b7858 \ + --hash=sha256:87475fabc8d9996fd9c27debb395e642e8c838d78a00b6e932227a0e06b81e26 \ + --hash=sha256:87e50a3e7cb90af586b6c5faf23e302a970415ac73bd7bd90a515a04b427ef96 \ + --hash=sha256:89b53f3cda69831909888e0494f4fa0bcd3537e3e138dabeb620bd6ad946bae8 \ + --hash=sha256:8a893cc101149f80a653f82062ebc95b34525a2614382e1da5458fe7c6997249 \ + --hash=sha256:8b2bfab86aa71ae13aa41a6a26aab338e0db2b8bc75434b05aea89e011ff35a4 \ + --hash=sha256:8d86d6fc60743dc916eb79e2eb1ec4818e21e427731543af40a3021851174a13 \ + --hash=sha256:915563965d418f986e7e145accc592eae9e1a1be3566ff98a05d7a9ec42a76e1 \ + --hash=sha256:92888bb3187c5ba50500b00b3b310c9f2c651709d28036077680cb5255450a03 \ + --hash=sha256:93223adc95033dd47133a46ccfc316a0139176fd79085762e27202ec56018f03 \ + --hash=sha256:9373ad13ef0d2c0fb761e04e55bfdee5a08b52cef2c882c8fbe9935b1517152e \ + --hash=sha256:9409a8bf35cf78353942504b24a57de3d75b708997a1e4bd8db71ac8633ce364 \ + --hash=sha256:9b7f416ff0978e2f2249330527f0ad6fa02f4932e6199692d3b52da2048c19e4 \ + --hash=sha256:9bde855991b7e362c146535e3136a50bfaffc0487d38b33ca7e5edefc6e23849 \ + --hash=sha256:9cae88599c7219005d879f98e5ed53341e9a122af585e1091200358a3003d2a0 \ + --hash=sha256:9cf9b1a857e25c4baceeb3624e92a56df3668f398c4acba74e174d81fb4d1d3a \ + --hash=sha256:9f56f72050826f63dcee7a7f55b0a77168cb3bfc553fd405e7f8f9ece75a4036 \ + --hash=sha256:a090bb2c68df85450502e3e20d665e3a5af9c65a84d6508ed477badd49166fd3 \ + --hash=sha256:a192e2c40070d92c3ccf777e3a5c4ff515573cd2bb7ed0c537fdadbbec5bbf21 \ + --hash=sha256:a19a731138fc27d5682277d3b9df22855cea1239bce7fcec5f78f42ef2d1f3c3 \ + --hash=sha256:a66c3bc5ab1f0ff2164fc9965ddd611ff0802173f4b9d24554c563f6ab7e1d6e \ + --hash=sha256:a815775b6c38d4e0ff7bcffbeba67feded90202bb6a226b8dd35f1c855217413 \ + --hash=sha256:a89012d6d5476ee112d20d998570ed58df2260a852afb1758809cd6900411d21 \ + --hash=sha256:ae4f5fea5b8b8ccff88238cc8569303e5ee95efae67fa62922a311397a71f346 \ + --hash=sha256:b6856554c4f44d79fc2307d5768854310a8f0096e501c75637542c82292b0429 \ + --hash=sha256:b6b751274acb69d77b3323d6b7dbaa3c7fdfc1eb829b7eb61d262f32e1af9685 \ + --hash=sha256:b736353c0a625bbd5fcec108576e2385db3496f4f771f785ff32e108d3c3bc45 \ + --hash=sha256:b7fd005a73d9e657273b7a10dc71a9e03c8fb9ee6999798d6918ce095b81ac7f \ + --hash=sha256:b91363207bd9dc966a691e959bb47f64b30f7ac4b072be9968b366982f7db77c \ + --hash=sha256:ba0b1d2620edf869789c3879223f52bf2afc5d31b3cb47cc57b3a12c05e2aa9d \ + --hash=sha256:bbbfc8e28816f19d7c0f1816664980c0a9875d01b27cdf8eedddb639d9e108ad \ + --hash=sha256:bd16aabe4a02a297c23417aa17ac6299dbd8c49f673bcd645b4929b11f5a4400 \ + --hash=sha256:c0afc6800ba57ccc350374c5bd6150419915d95ce93cdbab2d783d75eaf30ecb \ + --hash=sha256:c6708715abcf3c73b99508253e961a9967f02fe536532834149574eda6de0d1c \ + --hash=sha256:c7c9ab723cde841fefb34efbad91e87f00a674b1fe1cd0784fde742bf2c154dc \ + --hash=sha256:c8f3d67aeaf55f017982b73683f0e7342ba2f6635a78f69ce89ebb26aa411e5c \ + --hash=sha256:c9790464842f85f437dbbb54417eda1e0e6bfc52dd8d22d6fd1c994b73b2dc74 \ + --hash=sha256:ca403d7e4798f525fdfc78e258820419cbbd0f0ecbab9de7840e3c017cf6b8cf \ + --hash=sha256:d008d90a7f2471519aef0c90dfbe73b3e6e4d5e66ac48e19154c17e89e98b604 \ + --hash=sha256:d19fbd981a488e22cd04883659ca6b08f50b5974f9fd7c95655ef6a043e5893f \ + --hash=sha256:d1befeed746d247c81127bb14de9dc3d30edb6e5976d34f83f86ed262b1d9105 \ + --hash=sha256:d2374b62878abb00cd8309b32af6c0b715cd02dec0ca74ef12e5069bdc64144a \ + --hash=sha256:d376bbd28b3a8999db1a103b3b388aee6f1ddeb3e51bc2172993efdcd86e064d \ + --hash=sha256:d4a7319f304a774bed22115bc891618e45f85065ab44ea6acd07d274e750519a \ + --hash=sha256:d6734d2ef8a50fbf8445c139477da401f50d62a0606bf00e20ec6d87773fefb1 \ + --hash=sha256:d760fe2a4d7c3b226cb9026d6a842868d52a7901bd98420e1baf14e80da85cf5 \ + --hash=sha256:d913de495d90407cd859d263bee2e5d1a4ed3eb6573c04e70d9ec619a7cbed7f \ + --hash=sha256:db19d07e2e0129e974a0e65d0064fc222a446cd5122c2fd4184d2af9fc734a9e \ + --hash=sha256:dca9ab98072a5a54ebacebdc45f53e645336b320c667410b061be1ca588ae709 \ + --hash=sha256:ddc7dacc8ece3a182e7f15cb862d1fd616b46d076cb1ae9dd232b2c38b655874 \ + --hash=sha256:ddf19c062bea7a0cc80f519243d2c01dd091be0cf952a0750d4ad576709559f5 \ + --hash=sha256:def79fa35ef0cef8d2accec024f4fdc7ead3012ff02f5215c783f39f03ef8cfc \ + --hash=sha256:df29a0a7107f7011e77f4eebdddec4c7331e24d787a0b21a46d63bdf7445da95 \ + --hash=sha256:e09a3942ecbdee5cce73ea9d42da82b81b72ac1bf031ce069b93b5adf4eac8cd \ + --hash=sha256:e242bb1c5e76e97dfa9e7f209a71e93a01d7f19ffdd5cfbb2e2d55b4f08f8ab0 \ + --hash=sha256:e243bd13217235fc7290c621941c3f5cc8b66e4872495be821d7436ba2fb838d \ + --hash=sha256:e2af3aad578aa6bd1384bcf4750fc285e5a9de53f40b7d41e5a0bf748edeb2b3 \ + --hash=sha256:e4e81e09c1578b8df602e3db08b0b3ea0a6947ad612f52bf8dc5ea8d47691f0c \ + --hash=sha256:e54da4baf05720032d527874d40b65fa4d7e5c6c6a43d0c3adbeffcaf275a2b3 \ + --hash=sha256:e80e6c2f55656b4824d72065abb4ddd6a525c74bd78a0aab5d9fc2cf4fb5af50 \ + --hash=sha256:ed2a239c0ea213acc1908150a3037257083c7c083128f1a4cec2ec4b97dca491 \ + --hash=sha256:ed905975ab14056a2e5eb1c376cb2e1ebc5396baf84163939c518556fccde9f5 \ + --hash=sha256:ee21e28f0430bd6dc9086c6e525d5e818a44a5ad19720c8a0ef766792f3eb5e5 \ + --hash=sha256:ee43c17b173d46a3212baa6ead3ae258eeabdae48c263a01ccf0218c366dd655 \ + --hash=sha256:ef4fcbf3327382cd4c9f540babd61248208af7b93eec4de397b4d5f58a09e288 \ + --hash=sha256:eff0ac9dbe711a4aee69bf04a83896aa9b85f19641264053a9f6d48573abb7dd \ + --hash=sha256:f0aa869112ef88429ae17820d99c3dd9504c9e9c671d3c246f3d7442cb051084 \ + --hash=sha256:f3c96f633825733f735c5a9cf21d21a257d8e1edf0b1cee0a064b9c424ca0f7d \ + --hash=sha256:f5833ad231be5eb6553de524a70f48d71b2c8563101750531e0b80184e175cd4 \ + --hash=sha256:f5ec61164adcec446f8969a3358ec3f9b26bbda3b9213e5586d219afa8df2915 \ + --hash=sha256:f7d486c83842422badd511868fd8a9a20e9407ace71564b6af47ce7e60a336c1 \ + --hash=sha256:fb9e68df06293761f9fe66ade60a9bc6d0f5e42b8acf2939a9158af86ab0e5bd \ + --hash=sha256:fc14a032f813bf5fe624d991960ea83e9715adc27e4c1830a2361eb1d02ac341 \ + --hash=sha256:fcff63213e8e6e47770541a4607175404f47cbb3ebea7b6058cc82d524a0e424 \ + --hash=sha256:fd1fbe0f116b6e55da77aca2c6ddcddcfac2186cbf78bdebf40fc156efca389d \ + --hash=sha256:fe9753dfee015c570d73df76f899f18444d41388bffcde097deba51c4fadbb9f + # via requests +click==8.5.0 \ + --hash=sha256:255bc9599cf7748b4b1a446ccc735421bd08a2ae529a8b88597d3de5664ee360 \ + --hash=sha256:ba0d2089de75ea0310e2dde03160e6ca10009947fb95a182f9b54021bb272e34 + # via + # policyengine-taxsim (pyproject.toml) + # huggingface-hub +contourpy==1.4.0 \ + --hash=sha256:018227e134b73090b06f911e773a526c77c9af426be29065500ce096a5accd4c \ + --hash=sha256:072a702e2e178f4fcf96f04775d0c059e4c917925abf0d3208ebb6865df3c23d \ + --hash=sha256:0c7a4c2716a4e98342221954416a836cca77c996c14ddbf22b5f01d5d93ca09c \ + --hash=sha256:107ec46f7aa1664266d69b1181aadc953d58d39f7d8d648fa5b795d4a060b0de \ + --hash=sha256:181bea01bc742734ae672fa00c717d855dd35e1f029536406538c52e7b0cd73d \ + --hash=sha256:186ba929df36d61b6127da2e89cd1357e4cb79aca647381ab1a6feb0b152877b \ + --hash=sha256:196759a3e4db60e1546167e361090ebb6d199aa3aafc9e34ea17a5ac3b23e814 \ + --hash=sha256:20156f5a1ac4f8ce02656e39a61e82164a3d359796dc8026f75b062783d500e1 \ + --hash=sha256:20da2f86bfaed60dbba729fe738c8241b1dd22b6cf7e8cbbf30df290bd04ba28 \ + --hash=sha256:2deb580178ca19437a84bd77e4bc2cd91a8ccad212413a83c273900868b5978c \ + --hash=sha256:2e741a39dfc96babe1722561e81351aeec104526c57dbe91c167c1db606c2d55 \ + --hash=sha256:3863ef2e2b13fe93f8c0ebb08ee400cb07153b8b0e91c5acb26e4537f283634f \ + --hash=sha256:3e0a2392533e5e2abdf277c951047516acc8d2f3c42b2dd9dc34c907c9ebabf2 \ + --hash=sha256:404dbcd9233513dfd1323b66ea593fef90e899f658f6b8a9ed8e93bd0ca669db \ + --hash=sha256:417be048f7e122cefbe2a34c51a1f2b0410f8eb35796f794d45475ddb7872d9d \ + --hash=sha256:423bd5f4b3f11d54a8c597234e513382e3454bb106b8ec7ae32ba4ed63f8d99b \ + --hash=sha256:432e89f835cf01f8d2123a130a3126b17ee6e0348e4d62c0973872b30aa873bf \ + --hash=sha256:43c3ccbb32c6294b183dcc8e8c46dacf5ecef809497e3d48a5be298eef185ad0 \ + --hash=sha256:43d80072a32299bf945de0a6dd4e034ea0162e832261de2e07a274a5adbba9c9 \ + --hash=sha256:4bffcb2e8cc5c0e837631acab59dd04265fdac376550e7c3e310523877c68cb7 \ + --hash=sha256:510f7d93d94cf6ebf4e2cd0640bea16ab8affac7547230175b6745b596ce0599 \ + --hash=sha256:5450f091ac1be0be3ad3a2a3b3f23b5e443e78c670ced4fd347d626f92a28fd2 \ + --hash=sha256:5545ff38229c15d11d822fc6f7415b932da9f4975f53e305b7b96ebfb01f889c \ + --hash=sha256:5a4c89c7f38a0d7a94356d74e3391073c4325c4d47ad2fd065c3fe7dbae16c0c \ + --hash=sha256:61624f6722480aa7e168fd746164e7bfdf48f8ccb6542f1613741200dc37e2b1 \ + --hash=sha256:618137ec5778fb76d494c9ec854b104a377fddba0d128bef7136cce2c3bf0df8 \ + --hash=sha256:630d32f06cedf37b7f1dd2b6a12e4492826bd477a4c9c7b2e2fee6ce3a2cea76 \ + --hash=sha256:64039341e2d8804f1a13bda8c69083eab935167bbd7e856cf096241f17d5bd45 \ + --hash=sha256:6507a016976a75a15aee47809a34605de6244ccc056e6164bf9fb14b27eecad4 \ + --hash=sha256:6ced1670fafee703b8277ab1645072a226e74f167166eae146fb743916119b67 \ + --hash=sha256:6e697d94e69f499ff6bebb899cae97a58d5d14f0e1fe9568b43a0248d2f9af8c \ + --hash=sha256:6f963ea9f0d68d2b6a02d861e3c0aae09ae25ba21f243fcf281e9fed468b078d \ + --hash=sha256:738c44fa71735a617f36da58e32810512407d283d5d1bb5b1cecb00d7eeba7cf \ + --hash=sha256:758e7496cec3195fc28a28945eab3ceef348c47fb95c7afc2eca2f3901209c8c \ + --hash=sha256:78ed5c5f962b3e156109f0531b174a65ba80d13cc681a70227b12524c162e184 \ + --hash=sha256:79b06c60d5e569ce12c5da8f0c51217cdc484386e2349fa717c30fafb56d2871 \ + --hash=sha256:7f861af508fca2384eef392bc1d8377cfa349b2b854cb11b45d89c75780e2561 \ + --hash=sha256:80c7fc8e7ac217777ce7ba2db3cf8478652b5a4b335283111012ff9eaac9d842 \ + --hash=sha256:86d05cec773c9507a3950122e0e40ce77c23c75ceeb2fc189514e71893cbb34b \ + --hash=sha256:875f42444c9cf48d56f724f2637e60d0f73b3b12c9041e1484580a233edf9591 \ + --hash=sha256:90feb8da006803a95ba573fddc9536357d0c3faddc3a4c9e22816ca49af52878 \ + --hash=sha256:912c6afaa106e2f74ba22b30416b77ef7eb94e3bdc5a4df51ab147845dba9b6d \ + --hash=sha256:96019f059bcb3774acc0104be3360a57b36d33eaaa2e1d7f77c800ca8e07618b \ + --hash=sha256:9c0e07c691f3b3321913ed9b8161c50ea5f77fadd006f52f5e755359b0dcbfc5 \ + --hash=sha256:a03b32c2e7eda8b17757c022162c13c86f5c3d6f937dddf9ba3c3ff7b513953b \ + --hash=sha256:a1c8a74744fa746eeaa12f0f9ed7f8b4add9d8f1b14d95e3b5e133675eac888f \ + --hash=sha256:a3e67bc1a6a4618a1dac7c3053a9ffece5ddfa2046b2670b342cf430bb0b87d1 \ + --hash=sha256:a58b5f130afec61a093d743cdda435cc4047748b6791627e34a68f41ec3a9b07 \ + --hash=sha256:a5e2bb871b90cd7a52bdee63bf80ef7acb46398d27efc66d7679240016efc5aa \ + --hash=sha256:abd0f7e51ecc52bf8c95713bd80b1c17c516a71fa391c54475308a4377903c2b \ + --hash=sha256:b7794ea07cab575633daad8d6e963b662053391022294d3aacc1d9ba9ef54114 \ + --hash=sha256:b9dc493e7924e5aa32d89d0b8e50986280f3d4b284968a792787bd7bcffd3cad \ + --hash=sha256:be85d160e7c795113c2a93254dde2fc7e86b375322570eee78b420969426973c \ + --hash=sha256:bee6ff96653e0807cd0f8eaef00174a031e3a2effa5c20f49a5a8d574b05af23 \ + --hash=sha256:c76f3a5318164db7d9401132fc1b5364b784c613c93fa506e3b5e6d1bf353ec8 \ + --hash=sha256:c8be3392b84cf43373a488874dc1ebf46f60784a70977f92586e18019d71c7ed \ + --hash=sha256:c927ec747633e68c9920bcaad48b0bcefe648812b822f18c34e2d0e2270a3d2a \ + --hash=sha256:cc87f2ffa84a49a77d76cb792f28a48ff3b05a222aa0b2bddbd839ba78e1d5ca \ + --hash=sha256:dd59df9e2fb0aff8bd7fd1adb9f349b7c835245a9d0f18c2f2deeb537190f2b1 \ + --hash=sha256:ddf5a2596d716fd3793434844caf31abc7a40b1e8718431420c89858268fb909 \ + --hash=sha256:de503609fdb71f597634ca64fb4bd2f13d27c97f140e912b1e8ed93544840df0 \ + --hash=sha256:e21d1d4a9db5b3a793649c7ab0ddb4697f2818929eec871a7b9c45fce7b2a1ea \ + --hash=sha256:e439ab450c93455feb0218532ded3e946ec7a9b5f459069f122cfa44b89229f6 \ + --hash=sha256:ea09dc704029930cbd097f75cb0cc1db9852adbcf1a151fac7e9559f7bcbfd19 \ + --hash=sha256:ef47fef9a912c77e3d84b014f701e5a9340f25703e9ed3bcebe37f91fb69dc49 \ + --hash=sha256:ef9440f6f8506246269a82734f5ff9e2e4c5e775b3996fc883cc491c5257eca6 \ + --hash=sha256:f1219a8898523cba821085f2da8a1b962cc696325763f09d7f93538ba43b2d70 \ + --hash=sha256:f863c6100bf926cf47d13f3cd75f9bb8ebd98aaab230eeb4468b91f98f39a6b3 \ + --hash=sha256:fa1b787362a3856e63dd2b89449f6c384d55ee1beb8f94f4bcc871b40f02462c \ + --hash=sha256:fc9feef8f1f001c5b87decadc67c4a5d1eebb62ca39c4763d1237ff62cf2b707 + # via matplotlib +cycler==0.12.1 \ + --hash=sha256:85cef7cff222d8644161529808465972e51340599459b8ac3ccbac5a854e0d30 \ + --hash=sha256:88bb128f02ba341da8ef447245a9e138fae777f6a23943da4540077d3601eb1c + # via matplotlib +decorator==5.3.1 \ + --hash=sha256:4cbcdd55a6efadb9dbea26b858f4fb3264567b52d69ca0d25b721b553f60ea82 \ + --hash=sha256:f47fe6fdbd2edd623ecfe36875d37aba411624e2670dd395dddae1358689bb3c + # via ipython +dpath==2.2.0 \ + --hash=sha256:34f7e630dc55ea3f219e555726f5da4b4b25f2200319c8e6902c394258dd6a3e \ + --hash=sha256:b330a375ded0a0d2ed404440f6c6a715deae5313af40bbb01c8a41d891900576 + # via policyengine-core +et-xmlfile==2.0.0 \ + --hash=sha256:7a91720bc756843502c3b7504c77b8fe44217c85c537d85037f0f536151b2caa \ + --hash=sha256:dab3f4764309081ce75662649be815c4c9081e88f0837825f90fd28317d4da54 + # via openpyxl +executing==2.2.1 \ + --hash=sha256:3632cc370565f6648cc328b32435bd120a1e4ebb20c77e3fdde9a13cd1e533c4 \ + --hash=sha256:760643d3452b4d777d295bb167ccc74c64a81df23fb5e08eff250c425a4b2017 + # via stack-data +filelock==4.0.12 \ + --hash=sha256:5f17ee83ecee8a6f3e389c75822fb70a1c2f0506b99438a6dffa1d56793588c8 \ + --hash=sha256:cf42711a7ac791818b299fab0332a088c65aeeefa36290de98db92c434303b0c + # via huggingface-hub +fonttools==4.66.1 \ + --hash=sha256:058cd823b80bac59e64dfad9e3b6fcd677852f9a3804971bbf6b48cc611e785c \ + --hash=sha256:05aeb146451f37289f782c3c861f3d0f4b86c2dd2e4620b46683544c7406640e \ + --hash=sha256:05c0fff6b4a5d872ed89cab2c4f81060b86ace263903eb4e8d0edcac47a60dfa \ + --hash=sha256:08d8956e3ec990c75230d92f1630b215e8f3738c83a003421c22b31ebfd0ce15 \ + --hash=sha256:09ae73bd219e1245debd8376077a0fa6e03175e255c4f51bae5f6a271bfe384a \ + --hash=sha256:0dc6fd99cb8c30941036308b148da9432640442a6f26f36d71dad9be24cbd0e9 \ + --hash=sha256:1801fdad5600118327171e0e8aa79f7cc48831dd55ab36998c9de03bd5ffe6cd \ + --hash=sha256:261d8dc95845e751f975fe8d6075600593ee253470d46d1b84801688051b09f6 \ + --hash=sha256:2aeb745f2664eb811026997c95628071137a777ea2ad296deec9cb393f0b23cf \ + --hash=sha256:2c7340497cf53490293e0c2b61011e0191633022ede0a0a964a68157a98b0fb4 \ + --hash=sha256:2ce4c93160535761f22c80b2afbc96cabc09855363a5d1a5554265b8a4c85901 \ + --hash=sha256:2d320483928c7831f0139ecb361954a26b2e2a8995681200155835dd8cd4a7d5 \ + --hash=sha256:2d637468dac23aac0e223bd52e66f8faa3b0dfcef57435460fa2107e830226cd \ + --hash=sha256:3087a430722aba8de429c2539fd2a58a9cf05238cdfefd8626460001052ca878 \ + --hash=sha256:34378db9a398b59de18cc79d942f0a907c6fc6301945e065ec888202f607aa3f \ + --hash=sha256:36bb24d4b98faacaff04af1d5e0a4285feba6ed1da6728cd34b6b6deb6bbb934 \ + --hash=sha256:38ce8f5fbd5c17dd2153d47d7c8d4108f3deda3f2b4a79b60ddc470a58faded3 \ + --hash=sha256:43d1284c1964666ee833f2badd3017dc138f53d4889043ffca66c5ce4188f188 \ + --hash=sha256:53e5854ea8003efec34adc0863c18ce91da923018354d27366f7fee7db928d7a \ + --hash=sha256:56d41d650cb8fc6cfe1d85ed7c62a0a56cbeed07bc65ca795475b914d401312a \ + --hash=sha256:5de5d80fbc0e50ff794c244e8fb7afd3eadfe0fa232ba8b162b8c551df22fcb4 \ + --hash=sha256:60f5ea17aed4262630afa43f26997ceabd6417fa05dcedf54c665f5a29193e18 \ + --hash=sha256:64967c6ddb0d4c610dfd8cb1485981b2d27972ddfb7d4bbbd9e199d2a089c450 \ + --hash=sha256:668f092bc0de8902167df6a0d5c5aedc3b4f9e43cf88eea92e9b46a2bd3968f5 \ + --hash=sha256:66fad3b7874062c2a2692f0ae6dea56d24f01b778c7f191950ca3ff997e25a88 \ + --hash=sha256:6946fe7bfb28590a1fd4061a17609c9a843952deb65dcf30d1fe725070c3e7a4 \ + --hash=sha256:71c7ca1b5f46f5dd549f56b47d47c0b709217675c23d3a7bc6aa1a69b6d9bbae \ + --hash=sha256:72299346b96b9244dabcc051b24e4653da4edfda6105544cfb10ce856a1afaac \ + --hash=sha256:7234ae9e28db64273fbbfa72caebd0a97e3bdba6b05064114741b9539ef339d0 \ + --hash=sha256:7b8ff9e0edbcee2fbf7dff0c41b9041c1901c26acf64e23adb67495012df11de \ + --hash=sha256:7cf4f996f9b1cb549bff9ea4c50813988a26ec922c95cfa85c7e4f1270447e06 \ + --hash=sha256:7f49f2834f5d006fe0f3bb10fec73b261806c50941f0cfbc08294074ffc32210 \ + --hash=sha256:83572afe48733bad7a4a9c11721d3a726c2e976d82b063fc9bdd049d76955abd \ + --hash=sha256:8526b2b7ec4db6b81efb83438be52b1264eda9a4994d867163cfe8c65581ce8d \ + --hash=sha256:8aed2bbcd6216253ef1b015763593365ee8084f621dfa53bb957c19d5e05f7cd \ + --hash=sha256:90de3477394c73481d27d2b86091c1c736053ee13ff52c42f0e151948e8578c6 \ + --hash=sha256:9261ef507f2dd74203443a472b65b5a26429eb378f975016dec7dc7305b24898 \ + --hash=sha256:9ea6c93091cbf83161a544388746a0911550bd98cb911faca3591cf5ead166ac \ + --hash=sha256:b13c8c541ce0b794add3211b3641cc0e113d707f73e06235e6fe9731bd7c45a9 \ + --hash=sha256:b18803cbdef248e7ee1be59cb277fbbe1da1faaa6f726fa5d3557904e6a3d967 \ + --hash=sha256:b878c78b2af11b879bd4f26bb0d8bda2a4c64543fdd3f28efe2c80f97f043885 \ + --hash=sha256:b8b71db96d605784e2c5ebf0788a406018ea8fdd80338491f4c83613d5cd1fec \ + --hash=sha256:b913b8e9f7ca9bec44d1eb919f591c596c61041aa357c96be55ff93169859e91 \ + --hash=sha256:c258eba62260beb33c110b03a6912cefa3635239c4ab5615b7225fb6f7b85238 \ + --hash=sha256:c47299bca4b5acaaeb32100f77b944feea151de9ef1773365a410dc3d49b945b \ + --hash=sha256:c666fefdd5613a0e99aa4516e6ff4ef87aa86cf1c7ba12a73550f4770e46b750 \ + --hash=sha256:c724e56213494c6695335577822b2d1628d102e71614de8b7eb8e30886d6a314 \ + --hash=sha256:d3b5403e82d0c7659ff1d9f956e29a3a68d094f043e9f5bc0442796fc3a4fb58 \ + --hash=sha256:d4f76868aea9cc4ce47fdbeaa904c02ee7d85dd0ad095071ae77f0bda6e62cf5 \ + --hash=sha256:d84ac0bf776b68396185bd919dd29e633d94300660335efc40b55b294b886903 \ + --hash=sha256:d8f0a8f16c4f3a5a87ca971de2631792d8cb4d570951f2000acf712f157d40db \ + --hash=sha256:dbb7b950f8c02deaffb6968994691e8589d671b7ef8396bc9d5b5c0dfbb7292f \ + --hash=sha256:dfba62cc93199ba62c376f90f2a9147d92730d301e44f88e013e50ff5edf6193 \ + --hash=sha256:e1cde50b3ec84ca6fe63ca815de183dbecb88e8adf8ada82d8ea130ef12b2b43 \ + --hash=sha256:e7ea7a08547a453fa000db96ed5714a3dc7e2b4255b9243f897921f8c10c169a \ + --hash=sha256:eef76d5796e604f9d6753fa6d323c4eb9f4e0e43f1dcca553f3e6914f1667b64 \ + --hash=sha256:f08ab7f8461c37ecfdd29ad97fb0c0780b50501bd664bb0f46b6e83ed2b9d2a7 \ + --hash=sha256:fdf4afd75c643e60ef4a96fe64fc8a9def27d2a542112332371a9e5066885f9a + # via matplotlib +fsspec==2026.9.0 \ + --hash=sha256:0f08147951c8cb31d844c3547d631053b127863b60be04cf06e121333ee0e2fe \ + --hash=sha256:8dd6e646e99ea382bd85f97a45e6b526a442d79423a7dc673f1e2756d05fcb5f + # via huggingface-hub +h11==0.16.0 \ + --hash=sha256:4e35b956cf45792e4caa5885e69fba00bdbc6ffafbfa020300e549b208ee5ff1 \ + --hash=sha256:63cf8bbe7522de3bf65932fda1d9c2772064ffb3dae62d55932da54b31cb6c86 + # via + # httpcore + # httpcore2 +h2==4.4.1 \ + --hash=sha256:0e25f1462b23c9cb82d9eb02e28bc706dac2a68cb457c6a0d74d63c8a2a5d0e6 \ + --hash=sha256:4e866ffb1a869ae14dd9b5e6beb5c24a13da0495ad72b65925ded182521c1516 + # via httpx +h5py==3.16.0 \ + --hash=sha256:099f2525c9dcf28de366970a5fb34879aab20491589fa89ce2863a84218bb524 \ + --hash=sha256:0f456f556e4e2cebeebd9d66adf8dc321770a42593494a0b6f0af54a7567b242 \ + --hash=sha256:15922e485844f77c0b9d275396d435db3baa58292a9c2176a386e072e0cf2491 \ + --hash=sha256:1677ad48b703f44efc9ea0c3ab284527f81bc4f318386aaaebc5fede6bbae56f \ + --hash=sha256:171038f23bccddfc23f344cadabdfc9917ff554db6a0d417180d2747fe4c75a7 \ + --hash=sha256:17d1f1630f92ad74494a9a7392ab25982ce2b469fc62da6074c0ce48366a2999 \ + --hash=sha256:1897a771a7f40d05c262fc8f37376ec37873218544b70216872876c627640f63 \ + --hash=sha256:18f2bbcd545e6991412253b98727374c356d67caa920e68dc79eab36bf5fedad \ + --hash=sha256:2b2c02b0a160faed5fb33f1ba8a264a37ee240b22e049ecc827345d0d9043074 \ + --hash=sha256:314b6054fe0b1051c2b0cb2df5cbdab15622fb05e80f202e3b6a5eee0d6fe365 \ + --hash=sha256:346df559a0f7dcb31cf8e44805319e2ab24b8957c45e7708ce503b2ec79ba725 \ + --hash=sha256:370a845f432c2c9619db8eed334d1e610c6015796122b0e57aa46312c22617d9 \ + --hash=sha256:39c2838fb1e8d97bcf1755e60ad1f3dd76a7b2a475928dc321672752678b96db \ + --hash=sha256:3e6cb3387c756de6a9492d601553dffea3fe11b5f22b443aac708c69f3f55e16 \ + --hash=sha256:3fae9197390c325e62e0a1aa977f2f62d994aa87aab182abbea85479b791197c \ + --hash=sha256:42108e93326c50c2810025aade9eac9d6827524cdccc7d4b75a546e5ab308edb \ + --hash=sha256:42b012933a83e1a558c673176676a10ce2fd3759976a0fedee1e672d1e04fc9d \ + --hash=sha256:43259303989ac8adacc9986695b31e35dba6fd1e297ff9c6a04b7da5542139cc \ + --hash=sha256:4c6ab014ab704b4feaa719ae783b86522ed0bf1f82184704ed3c9e4e3228796e \ + --hash=sha256:656f00e4d903199a1d58df06b711cf3ca632b874b4207b7dbec86185b5c8c7d4 \ + --hash=sha256:698dd69291272642ffda44a0ecd6cd3bda5faf9621452d255f57ce91487b9794 \ + --hash=sha256:719439d14b83f74eeb080e9650a6c7aa6d0d9ea0ca7f804347b05fac6fbf18af \ + --hash=sha256:7c4dd4cf5f0a4e36083f73172f6cfc25a5710789269547f132a20975bfe2434c \ + --hash=sha256:7e420b539fb6023a259a1b14d4c9f6df8cf50d7268f48e161169987a57b737ff \ + --hash=sha256:8389e13a1fd745ad2856873e8187fd10268b2d9677877bb667b41aebd771d8b7 \ + --hash=sha256:85b9c49dd58dc44cf70af944784e2c2038b6f799665d0dcbbc812a26e0faa859 \ + --hash=sha256:86385ea895508220b8a7e45efa428aeafaa586bd737c7af9ee04661d8d84a10d \ + --hash=sha256:8975273c2c5921c25700193b408e28d6bdd0111c37468b2d4e25dcec4cd1d84d \ + --hash=sha256:8c1eff849cdd53cbc73c214c30ebdb6f1bb8b64790b4b4fc36acdb5e43570210 \ + --hash=sha256:9300ad32dea9dfc5171f94d5f6948e159ed93e4701280b0f508773b3f582f402 \ + --hash=sha256:96b422019a1c8975c2d5dadcf61d4ba6f01c31f92bbde6e4649607885fe502d6 \ + --hash=sha256:9c9d307c0ef862d1cd5714f72ecfafe0a5d7529c44845afa8de9f46e5ba8bd65 \ + --hash=sha256:a0dbaad796840ccaa67a4c144a0d0c8080073c34c76d5a6941d6818678ef2738 \ + --hash=sha256:a6fbc5367d4046801f9b7db9191b31895f22f1c6df1f9987d667854cac493538 \ + --hash=sha256:bdef06507725b455fccba9c16529121a5e1fbf56aa375f7d9713d9e8ff42454d \ + --hash=sha256:c3f0a0e136f2e95dd0b67146abb6668af4f1a69c81ef8651a2d316e8e01de447 \ + --hash=sha256:c5313566f4643121a78503a473f0fb1e6dcc541d5115c44f05e037609c565c4d \ + --hash=sha256:df02dd29bd247f98674634dfe41f89fd7c16ba3d7de8695ec958f58404a4e618 \ + --hash=sha256:dfc21898ff025f1e8e67e194965a95a8d4754f452f83454538f98f8a3fcb207e \ + --hash=sha256:e06f864bedb2c8e7c1358e6c73af48519e317457c444d6f3d332bb4e8fa6d7d9 \ + --hash=sha256:e2c04d129f180019e216ee5f9c40b78a418634091c8782e1f723a6ca3658b965 \ + --hash=sha256:e4360f15875a532bc7b98196c7592ed4fc92672a57c0a621355961cafb17a6dd \ + --hash=sha256:ec86d4fffd87a0f4cb3d5796ceb5a50123a2a6d99b43e616e5504e66a953eca3 \ + --hash=sha256:fa48993a0b799737ba7fd21e2350fa0a60701e58180fae9f2de834bc39a147ab \ + --hash=sha256:faca8fb4e4319c09d83337adc80b2ca7d5c5a343c2d6f1b6388f32cfecca13c1 \ + --hash=sha256:fb1720028d99040792bb2fb31facb8da44a6f29df7697e0b84f0d79aff2e9bd3 \ + --hash=sha256:ff24039e2573297787c3063df64b60aab0591980ac898329a08b0320e0cf2527 \ + --hash=sha256:ffbab2fedd6581f6aa31cf1639ca2cb86e02779de525667892ebf4cc9fd26434 + # via policyengine-core +hf-xet==1.7.0 \ + --hash=sha256:0a9e802f33bf50c851abe45fc5380e61f959e2d369647d6742b79ad9d6c27cab \ + --hash=sha256:19c0e64f14175ccb6a1aff69e0d2ab9ec5269a560e6687abaf2b3fa4f73de7cd \ + --hash=sha256:2814a6e999d13464c4d679b788cc5d784eb5a4edfc638a31f10e9a11ab531ef8 \ + --hash=sha256:2b7bb5727889b0f2436dbaaad8fc4c3e66b8240d992716989e0c086b4278b1bc \ + --hash=sha256:4ee5e05a627f5ab5bad7a86582277d645556ea1e199903aae19e033a392aa13a \ + --hash=sha256:57bc157b8b7fe3bee9dcb9af7f3da8de41801c3b31a9ef68a77a33c6a6be382f \ + --hash=sha256:59fba37039233c7fcbe196817d6cdcf1b40dfb17b410f229d85b0cf0a1848da4 \ + --hash=sha256:757168feb5679647c0bb13ee5d0faebe799c4dff9051419885a566ebd79f949d \ + --hash=sha256:80f79dae613ce9e0ea1fd1ae15616ca9ac74aed4c770aabc199c4f03ebecc863 \ + --hash=sha256:87dab080f8f7d32781c2586904e3603f4e60d09bfc727706c3ae419e0829beeb \ + --hash=sha256:acc3851cf2576a8fb2ae926da863f4efabe21303cf292e9a44332802ab0dcc6a \ + --hash=sha256:b01fe18dbbd151a2403d2c64ed30dc6547b00d6babab9a617d77c7acdb81ee66 \ + --hash=sha256:b91569d5f1b61c34b043687da02c05dd3604f3d329e7868510bf3f7971599006 \ + --hash=sha256:d406ec79053c0871817f700c2ac8c36ba0d87f9c34b7458b0f0063bb218b0466 \ + --hash=sha256:e3e88a7a75d7d95cbee1f37dc31341d6201124cf21c6c4b1dfab8ccba9b09e0f \ + --hash=sha256:fa029678be1ba7f953c409b0b27bf15cc69cd1c9b3a674fbd78856ebefca1052 \ + --hash=sha256:fcfd6c22418e57dd5b3aea649e813b2e2cfb2aebf317b210d90f1fe4b3018b52 + # via huggingface-hub +hpack==4.2.0 \ + --hash=sha256:0895cfa3b5531fc65fe439c05eb65144f123bf7a394fcaa56aa423548d8e45c0 \ + --hash=sha256:858ac0b02280fa582b5080d68db0899c62a80375e0e5413a74970c5e518b6986 + # via h2 +httpcore==1.0.9 \ + --hash=sha256:2d400746a40668fc9dec9810239072b40b4484b640a8c38fd654a024c7a1bf55 \ + --hash=sha256:6e34463af53fd2ab5d807f399a9b45ea31c3dfa2276f15a2c3f00afff6e176e8 + # via httpx +httpcore2==2.13.1 \ + --hash=sha256:e0aa977abe17e69a3b820a24542a6fa88702676d83880b8d194dcd18408e5103 \ + --hash=sha256:e1e05d4f25f7d7d496bfb96748f6f4b67657b03da069b3a68c36069f3db73d0a + # via httpx2 +httpx==0.28.1 \ + --hash=sha256:75e98c5f16b0f35b567856f597f06ff2270a374470a5c2392242528e3e3e42fc \ + --hash=sha256:d909fcccc110f8c7faf814ca82a9a4d816bc5a6dbfea25d6591d6985b8ba59ad + # via blosc2 +httpx2==2.13.1 \ + --hash=sha256:6dff50fabc270ee5fd25d845d0b078ed20564579744d6d962850975996d2f9a4 \ + --hash=sha256:e48744a19e3af5ee48313d0ce5fe941d5422fae5705ea922a4aabf94d7800dfa + # via huggingface-hub +huggingface-hub==2.2.0 \ + --hash=sha256:1667f145dc56dc210d60966069397df9ecfca9607a5d43db88b308c89dae56b3 \ + --hash=sha256:5d1b47537394e4215cb858aa12fd493d0f7ef7f58990f5dcd24bc173107b2871 + # via policyengine-core +hyperframe==6.1.0 \ + --hash=sha256:b03380493a519fce58ea5af42e4a42317bf9bd425596f7a0835ffce80f1a42e5 \ + --hash=sha256:f630908a00854a7adeabd6382b43923a4c4cd4b821fcb527e6ab9e15382a3b08 + # via h2 +idna==3.20 \ + --hash=sha256:a7db850025b95ded1eae8a46181a1a6c56c92c96f0e2b005d9ff8dc0210cab44 \ + --hash=sha256:ab7ae7122974553370f0bdb919e1a960b2cd1bc1ef0276416d896db81c14582c + # via + # anyio + # httpx + # httpx2 + # requests +iniconfig==2.3.1 \ + --hash=sha256:67f4b9c50da0dedf52af349e7749a80a9057a5031199791b906c3bb3ae878960 \ + --hash=sha256:9121e2c1fdb355232495be3194c8dfe87ccc2d5dee45947b78e68f499790d7a7 + # via pytest +ipython==8.39.0 \ + --hash=sha256:4110ae96012c379b8b6db898a07e186c40a2a1ef5d57a7fa83166047d9da7624 \ + --hash=sha256:bb3c51c4fa8148ab1dea07a79584d1c854e234ea44aa1283bcb37bc75054651f + # via + # policyengine-core + # pyvis +jedi==0.20.0 \ + --hash=sha256:7bdd9c2634f56713299976f4cbd59cb3fa92165cc5e05ea811fb253480728b67 \ + --hash=sha256:c3f4ccbd276696f4b19c54618d4fb18f9fc24b0aef02acf704b23f487daa1011 + # via ipython +jellyfish==1.2.1 \ + --hash=sha256:0028857c5381c9d55e21cc6cb0d7f9545c3a9a7bb7dbca3960fe0a898c691ac2 \ + --hash=sha256:01647c12261bc1f7b102e918e7665497176d87f6fc96271439c8855872bc2606 \ + --hash=sha256:0368596e176bf548b3be2979ff33e274fb6d5e13b2cebe85137b8b698b002a85 \ + --hash=sha256:05be396aebe3dce7a8cb2f97727ecdf99e86457c48e97190775dce33f8b7e39d \ + --hash=sha256:07b022412ebece96759006cb015d46b8218d7f896d8b327c6bbee784ddf38ed9 \ + --hash=sha256:0b21c1596ce283fd7ee954eb0eeb007d59e480364324bcd91ad55146e91f3936 \ + --hash=sha256:1098ce1f84ae3f147f0a18a6803ffb09b9c8cd5fedce42465643ca0b5c9d0224 \ + --hash=sha256:10da696747e2de0336180fd5ba77ef769a7c80f9743123545f7fc0251efbbcec \ + --hash=sha256:1354b558a0a16597b6032dd0af64bebd24994f7e7484cf14993320eb764b06cb \ + --hash=sha256:137cfcc26396d0f2e1265ac61f800bb921921ea722a43dd897e58190f767c474 \ + --hash=sha256:13f1ac9caba22af10bfe42f674822643c0266009f882e0fe652079706dc5d13a \ + --hash=sha256:14bbb30d988dec1d12183cf5d4621c908f98add2009c72a185e8c3e8d00b804f \ + --hash=sha256:15318c13070fe6d9caeb7e10f9cdf89ff47c9d20f05a9a2c0d3b5cb8062a7033 \ + --hash=sha256:1a3ccff843822e7f3ad6f91662488a3630724c8587976bce114f3c7238e8ffa1 \ + --hash=sha256:1ffeeb6c78c45fbb6d2a22b0173fb8a6af849001d6c26fab49c525136dbd9734 \ + --hash=sha256:212aaf177236192a735bbbf5938717aa8518d14a25b08b015e47e783e70be060 \ + --hash=sha256:21baa92d4a5112167721156f6d061c2ae105f2995b3a5e19cec6662928f0c439 \ + --hash=sha256:2348f698f9c1d72023afc8d39939045421a01da9b7e3078e3029227e35f28419 \ + --hash=sha256:29cfa8bfb72aacf2d611a3313b358ed4d4140fa3d3efcffea750c8e7f8acb1aa \ + --hash=sha256:2c28a4ae3e201e1c1b7bacacd40e2e76c4068b90c9ae3a0d525e0ac98206f1cc \ + --hash=sha256:32581c50b34a09889b2d96796170e53da313a1e7fde32be63c82e50e7e791e3c \ + --hash=sha256:32a85b752cb51463face13e2b1797cfa617cd7fb7073f15feaa4020a86a346ce \ + --hash=sha256:393f609fd6139ce782e747e22c399483ffc58341009e6a97e39ffe5f5b2c674c \ + --hash=sha256:4072e21ad4036af41bd57b447b1dda64fe60aa679cfa8854ba0a0338152439f1 \ + --hash=sha256:451ddf4094e108e33d3b86d7817a7e20a2c5e6812d08c34ee22f6a595f38dcca \ + --hash=sha256:4a21d7eda5e6996772055f798e3fe1de1b33b3edad7f6cf0567097a21585a812 \ + --hash=sha256:4b013876109d91fa6fc871ffa4e0dbfda11820c33dc4ad0e2967b3fc1187f804 \ + --hash=sha256:4b28fcefc0c3534277ff0306e6c10672fb050f4784b5f3be7037e80801569fb5 \ + --hash=sha256:4b3e3223aaad74e18aacc74775e01815e68af810258ceea6fa6a81b19f384312 \ + --hash=sha256:4c5acb213aa75a61bcfc176566e20f2503069667e760d83d403b59e115fef0dd \ + --hash=sha256:4e36d9000d4f7e1a35689a74ec7749d27a216dfa6c47cac2e5ad3de8a523bd69 \ + --hash=sha256:509355ebedec69a8bf0cc113a6bf9c01820d12fe2eea44f47dfa809faf2d5463 \ + --hash=sha256:5335f622458aa105289a8e358bc32ecd1b9634b6ffec3e77ea3577e49c297171 \ + --hash=sha256:536c80d8d4ec7f39cbb10b85d926ff96cef3cde4a83ca0991c07cd9835d5dc13 \ + --hash=sha256:56da7632e029912af25e25422fae3b6df318400297d552791f4b21da6d815ed6 \ + --hash=sha256:5bda2275f31a64adf3483e39f7a4e2107f7dfe3a3f85f0d2c0cb6ae5fbe4a443 \ + --hash=sha256:5fa0ba0946f3c274f6a87aaa3c631dc70a363bd46cceea828ce777e8db653b6f \ + --hash=sha256:63770120cc3386dcc13bcc4df508ab281a6b14c3b2c0e33586439a6c40ee122f \ + --hash=sha256:675ab43840488944899ca87f02d4813c1e32107e56afaba7489705a70214e8aa \ + --hash=sha256:68080af234256ef943f0add6fc79816b0c643d8df291c17a85c1b6e45bdfbb96 \ + --hash=sha256:68ea3ddd4dae1152a7f7155ef02a7bfad919611158d71b301f9aa167685819af \ + --hash=sha256:6a49ce2a580edd3b16b69421137deef464e2f8907f9ef906d49950b1a52908c1 \ + --hash=sha256:6c51e565f85ce38cf9388c4f916d53888b0fa34788fcebe3aff3db24948e0960 \ + --hash=sha256:6d2bac5982d7a08759ea487bfa00149e6aa8a3be7cd43c4ed1be1e3505425c69 \ + --hash=sha256:6e76b23431a667cd485fb562428d1ad29bae9fdd0fcdfb5a51cc8087bae0e88c \ + --hash=sha256:72d2fda61b23babe862018729be73c8b0dc12e3e6601f36f6e65d905e249f4db \ + --hash=sha256:748dc45a0394fbe9120b8b3b9a39fab0967c7e2d6ecdd5304af018e774f80f96 \ + --hash=sha256:7853d2ed7d6929c029312ec849410f1ea7ae76ce72ad1140fb73f6e8a1e6aa4f \ + --hash=sha256:80a49eb817eaa6591f43a31e5c93d79904de62537f029907ef88c050d781a638 \ + --hash=sha256:91cad49a4fb731b726afc5ae385a3217a7016ed88a04da40c131cff8136a5db5 \ + --hash=sha256:98a133b40dc00cfda6609e1b0cb0ab0b77796fc2719aae886a12009514f73499 \ + --hash=sha256:9913789a98ccf49213fbb1dabc597847a0ec33d3b0e151689498f4b38ba9be0f \ + --hash=sha256:9930e20f0e9f65ad1d57d98290c2be3abd75812d058815605f44a56056fb9a66 \ + --hash=sha256:9a73b5c6425a70ebd440579a677eb4f03b327b2f59090db34e6c937aeea5aabd \ + --hash=sha256:9c747ae5c0fb4bd519f6abbfe4bd704b2f1c63fd4dd3dbb8d8864478974e1571 \ + --hash=sha256:9d4448c874959ae012cda0f6d570ac0bd7f0fcf12007714eaebf86b86919b66f \ + --hash=sha256:a058f4c6a591d5e5a47569f5648a26303ba19c76a960fef7e0beba2aa959e52e \ + --hash=sha256:a0ef6f0ecc085c1f8fddb048f538c8bb89989e5d470eab45d4e9bd48ee73a40d \ + --hash=sha256:a3cab91020e3ff7565e55a611ec3e3257c093ac950d55778a48bfc8c57562b6e \ + --hash=sha256:ab1bfea271ce4bda09d975080d5465cf5a8b127e7c0ea61ea3f972417a7a2193 \ + --hash=sha256:b35d4b5b688f759ffd075190a9850b04671bad14c5b37124eb43e99306ec16ea \ + --hash=sha256:b37b76ea338c4a473c34a9b9e1e033a78aafb9040a8c0eea579fc5805d8e4b46 \ + --hash=sha256:b8986d9768daddd5e87abf513ae168ea0afe690a444d4c82d5b1b14b0d045820 \ + --hash=sha256:baa30c7b59bd1c5e105693108a6d7a98f3e7a1a59e23e15bc5897b91fd5849f5 \ + --hash=sha256:bcdcd603a7737cd3f5a2ab10ce9b49844329deb81c2daafcd8131e54fc730205 \ + --hash=sha256:bd186c041d9be86c4fa5e2490943ce5d7f05b472f45d7f49426f259f3dd20bc4 \ + --hash=sha256:bebccd0652ac1c7e438ae1f451edefde63d14b3af6f6daa30c599919dcb92886 \ + --hash=sha256:c3c18f13175a9c90f3abd8805720b0eb3e10eca1d5d4e0cf57722b2a62d62016 \ + --hash=sha256:c499ea3a134130797c50e367687a6a46a12653c59af381bee92c41a5ab0bd55d \ + --hash=sha256:c85aa2bc76a36d92a3197f406f86636664d5b323727dfec4fa2842a8a24a06ae \ + --hash=sha256:c888f624d03e55e501bc438906505c79fb307d8da37a6dda18dd1ac2e6d5ea9c \ + --hash=sha256:cf6cd68921f2bacc547ba1cf64ad0e76bc1727f3bab13bba2e5f5869aba038b1 \ + --hash=sha256:d2b56a1fd2c5126c4a3362ec4470291cdd3c7daa22f583da67e75e30dc425ce6 \ + --hash=sha256:d7be8021658b46b22500a77f1707901bd98fc210f185c229b81c74efd3c1baf2 \ + --hash=sha256:db97d873f23b0c15b4ed911ece10e5cc0bb96cdc53666d5c3788bd0af81807f1 \ + --hash=sha256:dd895cf63fac0a9f11b524fff810d9a6081dcf3c518b34172ac8684eb504dd43 \ + --hash=sha256:ddf05ea471da2808d77ecfa425d8884124b4754f4d483afa7703b6655530cf5c \ + --hash=sha256:e1b990fb15985571616f7f40a12d6fa062897b19fb5359b6dec3cd811d802c24 \ + --hash=sha256:e4a210a960f3917da757b0581750b6e0a8db9acef68dafbc1b6e2ae39e847ba8 \ + --hash=sha256:e5977810972c6f0b2e61252c4758fd5aee21abf663ff309881195a99d37daa94 \ + --hash=sha256:e967e67058b78189d2b20a9586c7720a05ec4a580d6a98c796cd5cd2b7b11303 \ + --hash=sha256:ecf62d4aad0baa8832ab60f96e7baedbe6558bd292597503d927e9c5bce745d8 \ + --hash=sha256:f121218dc33fb318c34ddd889dc7362606ce1316af2bb63b73cc1df81523ca34 \ + --hash=sha256:f69aeb08659a6c81d559bbe319075e3417434ae5b3a5e4a758d1c4055a03497a \ + --hash=sha256:fb3c6e537cb4605c22895a8d4a10cdb26611ba2bbfc7f0b4c1d06bb9d8aad648 + # via us +jinja2==3.1.6 \ + --hash=sha256:0137fb05990d35f1275a587e9aee6d56da821fc83491a0fb838183be43f66d6d \ + --hash=sha256:85ece4451f492d0c13c5dd7c13a64681a86afae63a5f347908daf103ce6d2f67 + # via pyvis +jsonpickle==4.1.3 \ + --hash=sha256:99822e77b593462c1f67361b0571e54323db43f1285706a63da5b5759714c9df \ + --hash=sha256:de234c1d1ed2c5313833e608e2a2467202f48ae24ea7a2afa2d238d8999aa4b5 + # via pyvis +kiwisolver==1.5.1 \ + --hash=sha256:007a5553dfc4f4e8d184f588a0200e2cd4b63a59cc8796df3c39909e679dc7a0 \ + --hash=sha256:0324cd2567259b7a095f6cf18a52b0ffc6f3de9e69528ff1bc0e7a37bd43ff1a \ + --hash=sha256:0627b9bceb9c3cdcf12b8a18655eedfed2692b038df27423383c120d0b7dc2d6 \ + --hash=sha256:06a6917674de9e0fe3f66f5430787f59a9f2ddb64af9b714eaec547e29ef5c19 \ + --hash=sha256:072bdb15a3c19a5b5dbc8f8fb1f4e1884bf4f3507eeb4cc6334401274d37a5c0 \ + --hash=sha256:0a4faea5c6db201c6a21391d2ac926ea97acf7dacdbc3c417189e1adb1a00837 \ + --hash=sha256:0ba9527afc80ae3d7814ed98b6572d02bf85eaf48065678342c5f0c6dab7a8c7 \ + --hash=sha256:0d8924877ce22e17326a99a418c3c82037da078df3c6a260b13eca677444e6e7 \ + --hash=sha256:0ebdef3eae5336568147c39a55be6a2036ffde53faa9ca2d978989ae7c2da12c \ + --hash=sha256:1209042a623ddfda5497e4066c7b77651dde8e1d3a9dd97599dc7e97f3b9b78c \ + --hash=sha256:16895f553ee6620a827d2da56b871f835fb70b9216cca5d188e885caf6e3bd23 \ + --hash=sha256:17851e5dad4484be0cbccbde3b15331deae036de9aebd45eed964487802b172f \ + --hash=sha256:1798e83840c3f627246104c4d8a9639c60fa068adf9ce92b61791781fa8a68c1 \ + --hash=sha256:18170a77ddfecf40ec60d0928268dc95880c881864e015a8f34094ed18b9b9ad \ + --hash=sha256:186884a58486651e3c217b6acea0a53eaa9498fdd472057c46f2f0fb5c25aad5 \ + --hash=sha256:18a0cfb124546a4c2e6087c5f3029c7f44b37c85b142e0ced71f73a7599ac208 \ + --hash=sha256:1983f0974a750a6f6556f368ba11105d1d8369c735b944747c9f12ae5aea7aae \ + --hash=sha256:1a7587dc335f2c0f5bd577fd0540bd16c66006bdb60f759a1059f025e6c4f071 \ + --hash=sha256:1acc7e5b7ef05e9da8bb70cd6c7c4513090213d2e1ad9720f599f0bf6c52aec5 \ + --hash=sha256:1d852545c4d0e35a72728d072cbaa59e2fa7dd84bdf01e068d670dd0ceb58eb6 \ + --hash=sha256:1ed0f5e49d0ceff8b72190824d9e59c062fbbc02c231b853112c78474b3f5ec2 \ + --hash=sha256:1fff05e239575b1481b6ed1a782f6fad616efbf1f0b1f44e6e85c4dfe426e483 \ + --hash=sha256:21e46b23a2da695c364124817bc01d970effd5483147f8d66a6a7167e3f6b851 \ + --hash=sha256:22d5e5aaad6be121f2515765e3b1c444352cb8eb4c86510801db8f2e50757316 \ + --hash=sha256:2551cf9917af48ee7c4b29cc82320489508cf96fd26a51f6fc124de661cd44c7 \ + --hash=sha256:255605693a483db7bd5c79f60437f7bf658f7f520d61aa42722e32257c941951 \ + --hash=sha256:26e8268480be5061d509e29669d59103c067a26377a56491630ece11762e3858 \ + --hash=sha256:27add358abe374ebaa3b8763ef380bc99051b5a4b18d94878366a9e4f59efef0 \ + --hash=sha256:2ae70bc59790d2af72a3f76f24b272403e135070340281108b447cb77ea70819 \ + --hash=sha256:2e10ae1bba1899188b33557c10d73affcc12033edd18adddb57d209039976a4c \ + --hash=sha256:3221f78211074f561c44ca42eac0619828171bec15a2c4cf6f7747d07df76e8e \ + --hash=sha256:34633ecf50d16187ab8e5528b7a2530f2feb4e23f300db4672538b51cfc5cd38 \ + --hash=sha256:34ec467940442c9943016fb2d4c81d1ba84351eeca2f1a78f8bc87f1ba0d414c \ + --hash=sha256:37f801b5d7cc0e5a548921308e059fd2b057bb42972b591cfa3049f95423c4ed \ + --hash=sha256:38f6e0deb4d0a4615efe0c4efc5990b06ae450ab50a0b321c0b078b6d238c083 \ + --hash=sha256:3c24cd69455e1b00ddf770c13b6e2c33e07d6dc3f2d34add0bf9277c5c6bbd46 \ + --hash=sha256:3cc210010fd2f438a3ed430b45f1b501fd13a8618bf984dc2c5ce5b69b78752e \ + --hash=sha256:3fa5855898f6d3d01b72ccd48a2d65cbdee301251603fefe34e2025bddba219c \ + --hash=sha256:416ba7ff9f233b7036689bb5a3783537e838ad483f63558d2a800f75afe738b1 \ + --hash=sha256:431dc224a1a92a5c8f582d96e505196a3b5997a7271076678da2dfde67b77e9a \ + --hash=sha256:43844c1a7ad6d723d5b5b4c4fc7f5bd399c40e288120d16257c7c9e8765c6e85 \ + --hash=sha256:44b8faef94f1857e77fa0238f3390ff1ac51d2ea20a487e2e452a59fd2b5f5ca \ + --hash=sha256:470d420f98d368d6f010633a20659b544c5fdfa5329e6b70219f2ef08fd4a7ef \ + --hash=sha256:482676e5bd48d70ac99d9fc78863469845421e01184fa83f1f9366dc49f7e974 \ + --hash=sha256:4d4ca09bf13cff792b1884f64b98ee6c2467930d632233be25c56b442d99f10e \ + --hash=sha256:5025e36fb4fb275cef0a4e30dbb11cb4ae61d1c83deb90189cb5d7e4cafd6b55 \ + --hash=sha256:509735237ae0d849e8a843551d423d2500d2e0a9ac1611a145658b29c0fb9f85 \ + --hash=sha256:534f02c1abb31ed6dbd3515545285c330b2f12d00fdb1fdb71658b9ca5a13a6a \ + --hash=sha256:5978c3340f16a35c30f8ab2fa7bcf559973c55f1a5ef6970e1f621acf3c4db13 \ + --hash=sha256:5b973887ff782cfd6b67c9904ad8ca542e0bc5e4961503408b423b5a688b4d38 \ + --hash=sha256:5c490db2168a508088f59140dd392556a54b8bd1048fc6383c8baff13c359673 \ + --hash=sha256:5d142e352eb13facc7dd047489aebdff6ba78576c239f1ea04931979caaf0567 \ + --hash=sha256:5daa1f19e097050b9c4d9a78fcc9263cb96c9dfae08037ddc1b7c4ad1889f2a2 \ + --hash=sha256:61e9a64c7635095a6bfe483e2ff055d437c59bd45f3617a228b37277f0185d62 \ + --hash=sha256:63fb7294b768f444eb4b068965f2662f28c2fd4161e23bd60fcf3ff27b74c046 \ + --hash=sha256:685929988b208a911f1285e2f8ed54210b0d681a3dc0f03e00d599d291986e7e \ + --hash=sha256:6a797a1cefc8b9c93170db580337e1fe3d011ad18b1299943231279406342048 \ + --hash=sha256:6b92f60017dda7d877fdc546438b5e28f31c523264f49cf5a48c1d0ce1a0dfbc \ + --hash=sha256:70ed9a45c7484d2b30cdacf60d220f494a1763b9fec1ad03285c6553fa0889f2 \ + --hash=sha256:719a35fa1156db3640555f95ebb94f60a444e64d1c69626b0edef5df78eba225 \ + --hash=sha256:74ad5c3dad54a4641b4c28cd15ded70899d04459c6c7aeacafea716be97cce6d \ + --hash=sha256:74ea337e0ec3f6f342a36a4f1b5cd94dd9affddcd28ba9aae2905af932ee8c6b \ + --hash=sha256:75d9b1cf8258462dbdc1eeda718c96ea7f079324c09067f6daabfcf37712b7fe \ + --hash=sha256:77a4c8187a5948d7f8795adb765a3c7b553d07d86d88e43038fc32fc1fb9a3f3 \ + --hash=sha256:7824b5e8bdbf0bccb4ccd37bbb115849a1dc45437fb4de8351385ed07c437ee0 \ + --hash=sha256:7d38b0c279c3032e8c9cc013b405c6df8e1668dbf15465779aa7f15f61201812 \ + --hash=sha256:7e9c01d3dd7ceba4d1d436cc021d40d592466e40b9bc7f5d83dc4e98a5c9cd8c \ + --hash=sha256:7fd82debf43c6acd0a94359d232f6bb516ee13f269a7993736a9ac9f988bb5d9 \ + --hash=sha256:824c3d763a05ea9e9003610145186b0e9848c7584a5575c79bac5a8e7cd80bad \ + --hash=sha256:828f75af2b0080c8a972e75f649ab46af008e92c6104a57a759157200b835b75 \ + --hash=sha256:83f78128fa28705fa85d01c59771c72fe81c11bd0e6155edbb9f818983a7d761 \ + --hash=sha256:876bbfd276473d3daffe30e8c975df4ed9429967b41a6cb362dbb5155b6f13ad \ + --hash=sha256:886fc26012f0e8b5f69d1cfe6d711f6b11f194621539bf8e6bb1c25c5dc82724 \ + --hash=sha256:8a34616dc2521cc8dc1d7d081734da63539f021ac0450ce950908340c6e7aa2f \ + --hash=sha256:8a708a47ade1fe19e8371d5da076bac0dd4b0a5a7985ad6c637f7f7e361b6baa \ + --hash=sha256:8af9b142ad719ae3a911ebf616bc4b78b32bbab84d6a40d3ad2f129670509957 \ + --hash=sha256:8bf4df63592c2a66b4f8edc5df2544998c288aa02f96ce0acd880cd1de8c8127 \ + --hash=sha256:8de6f2a4ce7e7bd27d23dd94abf0ccafe0e0e5cc9c764b0577191f2c25f08f26 \ + --hash=sha256:8f8fddb8e323bd6eee4e54e69a39243beab22689070f4c66b472c4cc88bb89d8 \ + --hash=sha256:8fca690b00c4c48f6c2a547b0160ed511357093a4e4c9b47e0fadf3128066d89 \ + --hash=sha256:9506e892bcc3b409831d363c6f53e5985e1c8d1f6f6b0256d00358684ff85378 \ + --hash=sha256:958254518717542d02d0688d0d20cbf771da5e415e6f49543f92481c850a4540 \ + --hash=sha256:95a02752aa032eef4aed01cda6d9b687c669bd0396bf4519eef8bba22a286720 \ + --hash=sha256:96c30002424670b5e1e46495c2b8cbffef39cf77c1d79e76462029d50339785b \ + --hash=sha256:98b208a7cc42c803445ef551d6753cc42a5ea13e9cab1ee66cd8b9cb70195330 \ + --hash=sha256:9b3092d8992a1d69b7a59c3e39f35e1b9be327a17f68a7c35fc17329e337d6f2 \ + --hash=sha256:9e51c119992ea8820706871c30a4642ec76de20ae82f9b50b9a45517d8e9f810 \ + --hash=sha256:a5716a33bfabb2c6ce27b6cf03253467b3804f83e215f4d202685cf93c6c9874 \ + --hash=sha256:a5a00665d1a0e26763a7338d7e911d4598fbc1d50dd0d6b7919b7dc6c5d6569f \ + --hash=sha256:a5ca5aebae78a0bc13c1943af4af615d4966c5b650b05d5aa83b50e427196fee \ + --hash=sha256:a7b85b2cc6ea45e5f7e8c9a30bc9fabd47cda09106cbb4b967335c3e6c43b69d \ + --hash=sha256:a83ee7107df13abe42a54a6654670eef9bb39425cf2e27f65e0007465e1286ab \ + --hash=sha256:aa7d00b1700966d2917e54d278aba86897890ca9276dd8b76cf6446b6c181b92 \ + --hash=sha256:ab620eb663952455271ac37f9aaad86b73c969c02f11f53cea405b38e96a4300 \ + --hash=sha256:ad8b9671348d7c8716715652ae11f85ed0eb99e265a2df2ca490577d69860b2c \ + --hash=sha256:aefe930d113798330e9462f7874542977869c0613cba3262e2de3a8d5dee8f3a \ + --hash=sha256:b03af77d77e50edba2030fd5f7c352ff209314b09030a3cba7c14edf9a09a444 \ + --hash=sha256:b390aec180a7c054919c04898835e1c77bced23ea8383eb2c570213bf25d1a86 \ + --hash=sha256:b3d78f7bb2b9d9a30345be1474b9aaa8685430b54afb51ba3639b5c6c11e9ed6 \ + --hash=sha256:b5664603a253efd3a75716d793d1d3a6a82723b61dc6db767b2460bbbeec4c0f \ + --hash=sha256:b69602970994a2ed8bbfa78c2f0394a7435226c6040489702d9f0a0ad0c07052 \ + --hash=sha256:b6ae6a0328f0bc035741820fdeecdcd67bf4694eee03972e843663107122f450 \ + --hash=sha256:bad20d4c69c851c982a1e3606f4c293edfd5a87885786c50082412240c4b1ffd \ + --hash=sha256:bb7c99f0673c03017a3ee01e54a5c2617a05468b11eabe513b0080e063ed95b1 \ + --hash=sha256:bebb89489b279b2f5661bbbb2abcc87bcd4a46607bb4a5c966f04f1db6b8df9a \ + --hash=sha256:bfd1de989b3330420e29de39352f5c049905c9e3ee67233a50d550e3d652c148 \ + --hash=sha256:c2306e8bb53601979fcb3fa09cc65e031876d9ae01eff2fcbcd7a84ef94d5bc1 \ + --hash=sha256:c3a4e41e3096bf1f0f1b76e2ffd6d828d6547f574f702d59bdbef7acfa59db9c \ + --hash=sha256:c6834b92dd2428e2dd85ef3d85f723d3c12f20aaf43a2ddd4f944ca25d833408 \ + --hash=sha256:c90d3022d8a94778939cda8638c6c8da8fa757b8958dad7ec868ce29c87681b8 \ + --hash=sha256:ca307d6c259e5c98d3cb9ade55342b47a6839762caf2536f3d7b46ee660cc82e \ + --hash=sha256:ca7f6fe0f37ca978a1e5eb7a3a68e6413f417e78e838324947ffd420202b198b \ + --hash=sha256:cb6fae641357ed2f6e533c0d3c6504a4a5703621a50c89459e46051d56b61140 \ + --hash=sha256:cdaeeb6c350106df6bf9d873395973e5f066a9713200b72cd64f55d0a3eafab6 \ + --hash=sha256:cea20da04494e662b83c872683bf4ff2345206043d036315ed0e924b652e7294 \ + --hash=sha256:cea90547bfd93807e0013a004dc76552be44fad3bc1cc2b38610a9e889ed098f \ + --hash=sha256:d09037ca068d784ebc4aec290ef952ca27ac15dd9c0b5801a88c6e1096b83e6b \ + --hash=sha256:d27c2123977cb9269c30a49ba45f03a4323017ef693e19db4ec9dbe1299a3002 \ + --hash=sha256:d50de98e8d807dc31822fff96f50293163a62418eb65487a21b42713d72ed0b7 \ + --hash=sha256:d66a64dd5dec136040ec2ae94aa026a912ee60fdd45bc28d3db30037fd809e88 \ + --hash=sha256:d79308fa689fac89cbcfbd4dbfc80b5f95c54c5a7fd4d194be221f9d33d026e6 \ + --hash=sha256:da3275833be0edbaf4830fae08bae3dc7219f40ce0c37eaa6c25825957e06612 \ + --hash=sha256:dc1a26b8e53395a01c2c611e58602fa47461f136fba7cd5542e6db6d64be1839 \ + --hash=sha256:dc23390afe9f4ef9ac3bcc72a03a56eebbde03f4c571a32cb38f859cff9a6524 \ + --hash=sha256:e05c2f7925f1d88778e53cb44f14e0223204a3bdd09a41664750363acfb1f2ef \ + --hash=sha256:e12dfea7f5fc2a34a9080efbf79c4c44eb380ec5b9c6fea09407e08f0d1e941d \ + --hash=sha256:e4e4523d6f336708d732516e6cfca7796cf3d96c9474eb5aecf6165f2f1fefc3 \ + --hash=sha256:e4e49f7e1a4e7191bdf9dc67a974db714501b1fc52c24324103d06a86abd5c08 \ + --hash=sha256:e68e151428b5384f766cd25739bf77c7e4a3dc93b5ded7a12118d9fbfdf78ab6 \ + --hash=sha256:e8e4d953faaded9ec7ede36824e9814082d22d4c7b1eafbfa079ecba8cd0d076 \ + --hash=sha256:ee9df1f0d77b9c6e94f4ac0fec533fbddd5ea3a327807f18d7b069ae019ded80 \ + --hash=sha256:f0a887b6565bbfe80efde2b7f6e8890d7d9bbdb11bdb17028a3690c32fe0621f \ + --hash=sha256:f0f4a42db92d6ec7677ab9d12830a2a8ec145a9c6d15db2b593466bc875c78d7 \ + --hash=sha256:f1303ef2eec81262a4b708c3e858afe58d7c75ad91c1c05266eda7673369859a \ + --hash=sha256:f1d56ec54d257d05e0b50f5780d967540cd07beeaf9e5f645b26d50cce79f4d8 \ + --hash=sha256:f4167e87b397f273dc2356fcf1eaf50a6bac51e6105f45103ef7129c8efb0255 \ + --hash=sha256:f76fc85bd054c806960f917ec0f329e24e436f1712267d90588e4c39890caa63 \ + --hash=sha256:f942903fde7363d1d879057ec5de01310efda2597161784d752fa9953a01a71a \ + --hash=sha256:f9b1c4900736e489a812c529100de4b8fb617d4db075e931e213c57424b83d9b \ + --hash=sha256:fc271a6f0a2126958f4090e5507b9da5848927dae331f8f763bd4aa642b3d2cd \ + --hash=sha256:febcce10f2bcdbb80b4ea919238a6a4ac13dbc4c7cadbe8d5d75c3682f8b5404 + # via matplotlib +markdown-it-py==4.2.0 \ + --hash=sha256:04a21681d6fbb623de53f6f364d352309d4094dd4194040a10fd51833e418d49 \ + --hash=sha256:9f7ebbcd14fe59494226453aed97c1070d83f8d24b6fc3a3bcf9a38092641c4a + # via rich +markupsafe==3.0.4 \ + --hash=sha256:007e1ffd9bf65bb6ee96df7b258fc632a4868dd5566037986c64781f35a36e98 \ + --hash=sha256:02fa4acbc6a3fc5c693c34d4dd8c1130b7fe99cc915181b0ddd6f72aeb296002 \ + --hash=sha256:03470d1a8268e692ecf79ecd565593e59d44219377a7ead61f1f1b94c1f7ff6b \ + --hash=sha256:04e7902ba80ee4bac1d50a549606527a1dcf0476cd81403db41099d3b60ec653 \ + --hash=sha256:051417f74bcaaefa316276e0ff723f541616ca51043d070da00249d9bddd3e3c \ + --hash=sha256:05295589e619b9bed252a86b532b8e27350abc372d18ba89b59375325e91ec1e \ + --hash=sha256:06de8ef6331f6e822c28d577dc8bf43fe398800477c49498f38fc38b67ff33fc \ + --hash=sha256:0764a13d34cae40db7bbf3a09b7e9b491bf4603e20b263a7a9d6b8e324975d0a \ + --hash=sha256:077293e425f28ec737dbcad442a71752e28f8ae27cde3d68acd1fb212091cd92 \ + --hash=sha256:0930db9bdc62d22944e10b066448bb65dc9abe9112880c7cab8da54db4284d5f \ + --hash=sha256:0cee7cb0f9a1b6892ea482237d9403b3d1b4603aee057d0ff01f0fac2d019a97 \ + --hash=sha256:0d9c47709875fdb321452056622e930c52afbc07a7d780762fbb8b4d91ce6fa4 \ + --hash=sha256:11935df9bf455ed0c04eb87bcd720f02b1fe5e02128a9430f23aed6f93336fc7 \ + --hash=sha256:12a606a492de952afcb43b59a14aaaaad120e708d3663dd0fdf2d738d427a691 \ + --hash=sha256:14bd2d845d62ab678eaf81da89d7b621b51756c72346745c1a594c09d49207a2 \ + --hash=sha256:15ba9e28640feef770374b116a6f019c21f52404aeabe516aa7f800587b98cfc \ + --hash=sha256:18a801868a884f216e784d7d14db2a4077143ce7610440aee2ce8f734e7cfcde \ + --hash=sha256:1c0df495a977d10460a94941799c72d5b5ab03d3858d949b55b5a66c8f371c99 \ + --hash=sha256:1caa2fa5a6184fb233153b35f654e6687bd555476f6170f29d8ee9be1a8b0af9 \ + --hash=sha256:1e1451fab512d1bcc3dc26988ec1edb0b82c2db909132872cd9356070a6b63df \ + --hash=sha256:1f1f9477e174582b0a1b583d60b66e1f2cf5d3fe12cee985e4aedf44766600e5 \ + --hash=sha256:2628d3a8cb648ecebb3c5d6b0a1052d400e4d8b7ac0fb786be8d285b50040d17 \ + --hash=sha256:26e9867520db70d37f7fb421a7f0d8adb40171011fb84ce869afa1a83370dfa8 \ + --hash=sha256:2a6ef68ae94aed8721934072b27a3b654ea2100b97e4ab864cf1489c90926fbc \ + --hash=sha256:2b2b1e18af909b448bb3cf9e3433366f7a8726271fc214e8b10e0f62a78c724b \ + --hash=sha256:2cb3dd71fc6be918ad4264346a8ed69485f9b7ed7bf35495d8e22807cd6b8bea \ + --hash=sha256:2d1b7d9308288661f56672b1b157d75fc536714d3638487bbea17b6318a78248 \ + --hash=sha256:2dad610540cb2e6272855c178f08ae9a1c7ac258a7fb71660553a5f104b42741 \ + --hash=sha256:2e5a7cd7fdd14fcb1ae5d7d8bf23d24fbd1daefd1fbca2580132e1ea75f098b5 \ + --hash=sha256:2e9ad7dd851bf45fab9f75cbff4cb493fee9979e8d8c7c9c3ee119022518edd6 \ + --hash=sha256:340cbb1957ba99929cbf19a75626d36ba1ae21d1730b287d1cf7f824a20c4fc7 \ + --hash=sha256:34bdde374c5932765d7dc685c4a1d191a3207852d67e8e0a9eb6ea85156181f1 \ + --hash=sha256:353bd63081912ab8cfa6a0c7d185934cdf8426f04c618bba6bc4b394f2069b67 \ + --hash=sha256:387d8cd30e69b3f0a72877b9ae717033396404e19095b17fe89753a981fda44f \ + --hash=sha256:3882fb412298575bae3b9c46868251f15cc69307359f87bb1b382e53d6e5a2c9 \ + --hash=sha256:38fc55594dab834470b6733dead2ee9e3f657fb0608c769dcafa0ba5ab52f45c \ + --hash=sha256:396ec4e65cc889f69786b3b89478b471cee5a3bcf468b9d9bb03e1a30fb291fc \ + --hash=sha256:39dbacefc411633db5b4378b066a9aca70a3d7e2922c9e578d825f844026eeba \ + --hash=sha256:3a93d9616ddecfb393727a0041a562cf0b15a244e20f2bd25efc7949be4c4f17 \ + --hash=sha256:3d23795802fc8bd72534836d64489bbf0f67c088959091bdb22e10735a5107bf \ + --hash=sha256:434139499bb20b502ed3baa1f169e618f924a97e7a777fea1a49446d80106cf6 \ + --hash=sha256:436e3ffc6310d3c41878c601db29098102fe5d8a467c49da4a4125254e0980f2 \ + --hash=sha256:489505b03f692c3f376394e49194fa7a7f9e8558d6e293a7056a0032b0c38163 \ + --hash=sha256:4a540e2d3192792fc84eced57bef37851ccb2b41f73291bb17408eea77bcd278 \ + --hash=sha256:4a7cdc2a420ca01058182da4253329764d4bfa055564d1eced90e6ba1e8b1d3d \ + --hash=sha256:4bced6e2a6dba6a28f7dd3c6ce14df1b2dd495923f16ea484cad03decd463b2b \ + --hash=sha256:4cf3468d5ec187ffffcaca8e61929a37448f215dafc1386a12c750a72fe53634 \ + --hash=sha256:4e2c4809c14559aa7ef426f27fb35afbb38104c349a903bf8f3600456764bb38 \ + --hash=sha256:4ed644d75aa94a2baf7ec3a96eaa160ea58c742eb9d27c6506053c5c40fc84ed \ + --hash=sha256:4f6e0852a0283b1b1fd776eeb7b766a5f440b3e2bd31ab51af3b400585f3965c \ + --hash=sha256:5066b244f576f91afc8ee3ba029a89f99d39c79b1853fe9d39bea9f0afbec148 \ + --hash=sha256:5086f9975abb1ab531ee6afca1761e4b59a19b446f3f6522ed776963228cfe5a \ + --hash=sha256:50b5bedc9ed8a94fc8857a42ef4f84a81ea88f8d4f05dc8705fb23ee6d8dcca7 \ + --hash=sha256:52704c5d36eb6dda8866493decd61111fff86244c9b1ad225ca01b9e91e5970f \ + --hash=sha256:55ffd6ce583d97dc71dc92e930324c8c0d25aea7e3ade6ae54ef77cedb096811 \ + --hash=sha256:569d65055d367e3dcdf30c3f41119467b73d9ee9faf332bdf40402644f5ac08e \ + --hash=sha256:57f9947a7e57a081c1e3e0a2dd0d2dcf290a4531450e6f611e30084c222a7295 \ + --hash=sha256:5989cb26b2e1efc6a42216a9f6b5ee495ce5ace2e5b352a9af489976b32d1ee2 \ + --hash=sha256:5c22873ad1f0532ba40fa1727f3c0fc1bbbaab6d373d4cbe3f0dc74b2e2521c7 \ + --hash=sha256:5e8b3d0b18fd623afa12ecb2ce8d8becef69f9b5440c6330c7972200e0bb84b0 \ + --hash=sha256:61631e08084be9e21a8967ec3139c7616ed7c5e9368e05c86d1b39562c8a57b6 \ + --hash=sha256:64511c54db4e4987aef4c41923235927428729e8174c5dba488429be70a998ed \ + --hash=sha256:6669c1bf34080161ce49c589cc512ef24d4c704ac9d2b2d3667f519c60418378 \ + --hash=sha256:672d207103e6b16ca098611b0f9efad6bc00afd47c03d6ef62186495ca677dc0 \ + --hash=sha256:6768d67d1bce64270e0fdc2e69309d68b9b18ae56ddf6c711d168e9d051c2cac \ + --hash=sha256:6a45c3d514f2436064db00d7fc8778d888f0236ebfed649b53d13a59e69ad51b \ + --hash=sha256:6bd9e1788e15bfcf6a9082de42e30387e7b85d211ab21e57a939bb8cfaaf8d96 \ + --hash=sha256:6d2a9efe686f9de00d0d1ea32a4a5a86d558a2277501bd78d964214eab625e59 \ + --hash=sha256:6da83a088f8ef93b2d483a8232a4dbf4d69d3d8496b568a03c56becac43e1808 \ + --hash=sha256:7018d4af1cd272e847aa5917983ab5e83e4f6579f9dbfecd4a79c0ca80b144c2 \ + --hash=sha256:71f88e749ea29f67f21f3b36433c1dc54c7729ed2a6d9e2da2e0d9e0d7b224eb \ + --hash=sha256:737c9c3981998eba27f11786f84fddcbabc74068b72a4a1f454ea02094b57b65 \ + --hash=sha256:73e77980c7207854f00fc4e71fb1626868d5740ab4012623d55c7a99ad122a72 \ + --hash=sha256:799c39bdf5e2f1292fedd3009f7b3c9e760f10b2420cb9638d56920840ff6db8 \ + --hash=sha256:7a83aa6e4805df46fed18e989d3d16f86ef60cb50bbc8d9ce3a6be89165fbf6e \ + --hash=sha256:7d3391b2188d18737cb2fa147028b1096236eaa7e156446c650a489fa2cadc91 \ + --hash=sha256:7e1636da3d8dfc220b6dd10264db5f2b165e4888c4518594898fbe381049af8a \ + --hash=sha256:805c8b84534fa10891890f0e4be39f3a99e94615d93e8836bf9fa1fdca2feeb2 \ + --hash=sha256:811d02d5122171c1941357efd8f9bf4ffe907b7f0a1a4e729a880e4be3f46e3e \ + --hash=sha256:8138eb83940ec7299024d92d4dee45f601b9e6c5ffde9d25f4e35e326203c707 \ + --hash=sha256:83b3944fea42a8400edf92fd1770fb8d0d4f7de651353bd2d8525a92dba69a21 \ + --hash=sha256:849dd2bb0e5e4ab2b71c7191726a4a8d5aa8a610daa584728cbee0b710ddc4ef \ + --hash=sha256:8698d70a8081ee8c090dbb394768b5789a1da8b131b5499f89d071dd3cfaf6be \ + --hash=sha256:8781a792a070cf2bd1b86d3aa943894115faaba6e88122a7bf32d62072742453 \ + --hash=sha256:88d59b473bfb03259722600839af9bbd7fa13a2eb514beefeedb95997882f69a \ + --hash=sha256:8909c2f1c6dd65e054ac4b573a91c8384d1492281e55d82d159d653f7a13adf6 \ + --hash=sha256:8965520ac587c94a4ac48b729be3d8b8de00af39699b17585dfb599babe77977 \ + --hash=sha256:8b5d563170ff8ba3181caa967c99a3c804d1dedb702c7cb93a6a7c32247da978 \ + --hash=sha256:8e124f974786f831d6043728e38296969d3579db8896fe004682f5758e613581 \ + --hash=sha256:8f0fac8b13d14bb06c68195f849371924ae53dd7b1c00fed24650f704383b692 \ + --hash=sha256:9240187afb63d2f9ddc3e032c670356fe941f6e20662ea168a5dc3f1f317e1b3 \ + --hash=sha256:925f929d6b59a8b3f8b8c6ac363cd0af7eecc81efb3071770b3c6717c450a369 \ + --hash=sha256:9348cbb300d224fe3b89793262cb093504d4ae927004468463f745188a193e4a \ + --hash=sha256:9388003072b95f2f1e3fd908604194d653ba21330d811961a78b7da1a77e9e36 \ + --hash=sha256:9438a2648b2195980cb2dd8e53ed7b8df91319e2d0b70ae61a9e1d1bc8d3bec9 \ + --hash=sha256:94e4c421742086aeee4c32a506eec8859d7634aad943f7e6aacf70f813478768 \ + --hash=sha256:94f5407f7bc64fa6463906b896f9904beeeb7dd8dc116ee8e9056c8714ff9916 \ + --hash=sha256:971a3bbb75d97ae4e2e8f7d4834236f86f85f0c85e04ab2e191db1123b04f80b \ + --hash=sha256:9e227f3dbe6bde7491cf0a9965d00b88c6b1a4a95d11480ddf88bb96d397c19f \ + --hash=sha256:9e25feb9e330b63edb0278a0acdf85e50d0cb0fbf49c3084abbe4e24ae195346 \ + --hash=sha256:9f098115c247e11d138ab83a28fa0323c77015007ea2df73ba5fd714dfefd67c \ + --hash=sha256:a18f38cafc329bac5e3c2b96c765b4c96d3d103421ed22ab7988c1e3fce27464 \ + --hash=sha256:a4bbd2d87dd233b9fc5812160c3d0ffbe42edc22a26ce0469f58479ede633fe9 \ + --hash=sha256:a5fcffb37e602b0b3c1638a97746b9b96125caa9bcf6fa41d337a9261de231ee \ + --hash=sha256:a8e9f292fcda89b324f2f5c91d13f1424a153e40fc2756f38ee23b15835ff300 \ + --hash=sha256:a9f54054101545a9a9cccefddf54316aa6e4491611fcbef9e91b3b6bebec04f6 \ + --hash=sha256:aa2c838cc024642cc04c6854232f32b43e5e22833dd11119c1766c7873b8370d \ + --hash=sha256:ac0c7c9f1609b0c4c114feb1d7a3409564c7fb77e360bed9e97e5d25dfeaf868 \ + --hash=sha256:add96447a86d205ab616665d53b2950ee81083757f56e6ea833c8b2917646b46 \ + --hash=sha256:ae9dcb8fbe244cb82f8a6458b455b927a03685e383d9bacf1ea5ce180b96dc97 \ + --hash=sha256:b4a635a0487774f841cb1fb62e907e7195cc95bc761e053184b8acc3ceb20733 \ + --hash=sha256:b4d12837e0203bbace818ff4a7461afdcd78bcd782351cea148139180d7bcffe \ + --hash=sha256:b61687d0828e72bf5cda24a2690188f37170bd31c9359ac97e4e66569f120a16 \ + --hash=sha256:b807e598953730f82e4eae3bd30f6a122cf6b31c398c6b504c0e04c13c170429 \ + --hash=sha256:b8cd1f918b26fd7b1832ece557cc18f2d8747309ff8b3f0ef9d4250c5ad67a39 \ + --hash=sha256:b91cc9d336957239ff200f30097e6fea2dc6d6fb3c81e853eaa09eac904fd894 \ + --hash=sha256:bd3ce56ae2cbae3ba82b683bc425cd7e48d2ed8b10f3e818186b6f5646d9271c \ + --hash=sha256:be6cb0c799abb0e2ba3e618e6d28ddddf7e485f6c2ce938dfa237daf3905072c \ + --hash=sha256:befb4158af32106b9a93db8d6d1d1cbbd418c0d5aca0cabb7b1780abf0c89169 \ + --hash=sha256:bf053da3c97a4bc5ecfbb218cdd2983febd91c617be8367d139882aa11e490aa \ + --hash=sha256:c02e8f18bdedba082cef725942ac823b9b60656db07f7e265cb31618dfd00d77 \ + --hash=sha256:c1bc67752d5f21013cfe430df4062441714eab79f65a6a05e01505957e9c35fe \ + --hash=sha256:c61750fadcd119d0825bcb7d7d675dd264dcc89cc05292aab5be68ebdbb374ad \ + --hash=sha256:c90d5b3d4e944e065a301d741b3c1d784f6bd1f503aa68b4967e32b2ba313d85 \ + --hash=sha256:c9a7f43c0b202b334cc9184af09bb8f21d3a209e038efaf106936fb69e6b026e \ + --hash=sha256:cb96e6e088d6cf71c1ea977510948320234824cf226e32f6f6e044f7a9c82b34 \ + --hash=sha256:cf63c214fe879a65e69a386f915e36104fc84254ab141240f8854602d8e0be2a \ + --hash=sha256:d1aca03ede943eb80ab3d63bb082c84b7aab85ea83bd0fd0c200260945fb49d9 \ + --hash=sha256:d2e56fd3b00222722abfb3f5f0759ddbae4b90811b5ad4343c64030ad1bde70c \ + --hash=sha256:d5f93ebbeb8032d47e349328ec8662d973d9b05a70b3c35df1f91fe419b84749 \ + --hash=sha256:d882a373d8093c2941e01291b7ced96e9cbe4781da9a7751ca7e6c70385e5214 \ + --hash=sha256:d920abdfa61279ba1a2ef9484aab07bf03331f8c08a10120fa332353d06e6932 \ + --hash=sha256:da2af0d7aebfc2074080d72efa6ab8317c62481ef1f896f65d9999c1c01f4494 \ + --hash=sha256:dd8ea6ebee7aedbf7c749fa80521d9ccf1ba473e0d1e14805caafbaad281c889 \ + --hash=sha256:de8b364c423ef0a4bad9069657d617f9a5d2b2062457a89b1fa16ee199c399c1 \ + --hash=sha256:df1ae86ff54725a01fa1a0510b914ca53a161b7050be74f6204e24aded5971d0 \ + --hash=sha256:dff05cb7016dff1e9fd68f4122c127b65dfc59de5306cfb7ad92f956f230bee2 \ + --hash=sha256:e1a622f13970d81f95d0c72f9dc090dce9085fccfa4c9f2174377ee32bd15786 \ + --hash=sha256:e49fb0d1ce92cfa0cb198cc5b1b11cdf9d0638658e2a2db2687e39db7c87fc78 \ + --hash=sha256:e5c802729725bd07e2bc3ab7b76dc7e0bbfc53129d8f1eb1c002c24cf774717e \ + --hash=sha256:e841068dc0be4cb6dfb5c890eb88cbdcff2f4a332393c7ec94e8e618bd32c1a8 \ + --hash=sha256:e916035e3e9930cbdfdd10abf48861340221857f45509565898e012263f7b289 \ + --hash=sha256:eba154571c16e032112afac0dc2dfe9e63c2ceb7aedd07bb7eecf2ce26d4dd4c \ + --hash=sha256:f03460ff076f70ab595bb45a0205ccea1971443575b6920c52e755dec2b3fbfe \ + --hash=sha256:f0ec3b750b59375eab5b0fb2b9254810c00a3375be6d789899f1055a1d556237 \ + --hash=sha256:f291bcf42ae98eb5107edb162c3c998b4a89648fd8e99ed4cbd12705292788cd \ + --hash=sha256:f61efe1d2fe0de16158a5fe1d1cf3c14bdb6aecd54d8938fd26512c525c1f624 \ + --hash=sha256:f68edfc67aabac33708941f26f22a7b8e9f81429bc0cf249fcf7d66b23af8d19 \ + --hash=sha256:fa95848c929b6a75f6848d3c9793e59db365ee436776e57db835cdbfa79ba977 \ + --hash=sha256:fd9f8797427910198f95bced71ddfed61130d7e349213bfb8466c9c99e2c46a8 \ + --hash=sha256:fdb4ca07ab75ffadab4a8b135ad59cdbb3156b99310f3d565370da74a15d6bd3 + # via jinja2 +matplotlib==3.11.2 \ + --hash=sha256:01dc8eaaab5a9fce9ff615eca82345728f289e4715b186ee10c6d85272fc26bb \ + --hash=sha256:02329432ae5c6af87cf208ee575b701d698bdf0b1a3bb28cc6d53c36e967e575 \ + --hash=sha256:07d9b9fa60cd4c393692f50d0bb03123242ddf61c99bb0e95e75feb354e7c1a8 \ + --hash=sha256:116cdb0eb0eb5644fc98eb2975d4b4dd4ad35e5c8e6b851c22e6976f371f7ab5 \ + --hash=sha256:1944895967f87c84c9b4bad29a707b31f5b36df4a3a2339ea1f8ea3ce5105539 \ + --hash=sha256:1a3040b209f3968b4e84161df7b174f07a9fad33b0f2d7e48ea3bbd3075e2863 \ + --hash=sha256:1b9a7ad579856284135e401ecc918c5f8a017ee30539298862a109f51b971710 \ + --hash=sha256:254d4ddb2fa8df3b4c689c0c306063aee10521df82cfb438185e499c75fe37c1 \ + --hash=sha256:2a8285cea8ef4d92aa041d1c33788bcae82248503300f93f1ca2136b9049452f \ + --hash=sha256:30ec15d7eefee71de16b7c689b42ba49715a4644650b76a6c7c70d79daf24e91 \ + --hash=sha256:399fef672f7046ef7d6a57572b2a6f9845f3f5afcff04e7b2df7a363a9f42190 \ + --hash=sha256:3aa4b8516fd26659e4363abbf317c703d9116496c5db2e9d0609a2866dd39dd2 \ + --hash=sha256:3da3bc0cbf7245e7db72cc6d29d12c5abef72cb73059c73b945f14e3545f3eb2 \ + --hash=sha256:3e8576f7c47e02fd4f21f44171302d2d1d58d4471d46da3d71fe8899d19539d9 \ + --hash=sha256:57b9ea60a835937c2012861923cbb91f47db8565775d326d1c42fc926aa10351 \ + --hash=sha256:5e1e923a3fc3326b99ec0a6ff1ab1338ac6c6cc62ad9d8a9c944197c7f8c6221 \ + --hash=sha256:643ff850d8e0f5b8319337f87ed3cb59506afb3df3cc48de777d85871233be7b \ + --hash=sha256:75b6d88402770e181b5d06a67dda4129c31da7d05004d63a21c310ec78d1b83c \ + --hash=sha256:79a258f58253dfa025af80a9e9bb228d75fced007f0e93ae7423fefbde81a74d \ + --hash=sha256:7d43ff8cebb50840648cb6429b2228621dbd709010f3117b3740abb20abf21c0 \ + --hash=sha256:7e5a90f8a707ebb6004a713b1cff091a40cc5df4c7c1cb165e5a505ebc11c292 \ + --hash=sha256:7ef7a53b66780e5d942923724f08577fbc5be1f7322da0f0f3f9dcaa45dd803d \ + --hash=sha256:854df8d7dfe9fdffcbaa6f39e44a6c24b409cb4d7561fbc09213b157d833f6a6 \ + --hash=sha256:894a9cbbecbe30ae6787d464df2e8fc7a8d475cfc68f87c3029f7c11152899b3 \ + --hash=sha256:8c8255de28f986d935a64c9ca71c0ec2d2f41d355691f5ea684725dc91413f71 \ + --hash=sha256:930efb28f59fda124e39265d177bab302625297bb147d2910de725a2fc2aef54 \ + --hash=sha256:a24d5fd36e4f0e742c3851dcd20810e56a95633a342e4bf6cb591c678e8fe61f \ + --hash=sha256:a6939df7567114b6bac7f4c5e06c84a67f197c1b2f2e4b234d4eecb3bfec9482 \ + --hash=sha256:a8756cc73d9af9a7fe0deb54ea2e75ef73b01d9e575877e72acad5458e660943 \ + --hash=sha256:af2661f6ac6bbd1d081996f54fdd9385715c625ace8cec0869055c0cfbf38981 \ + --hash=sha256:bbf1062991d826ed27e2144f3afa4461afbb8ff56e8f703043e191a8163b1ee9 \ + --hash=sha256:bc067c462a86f0e57bf52fc6e058d90171a5420007dac00c46e90153050c69a7 \ + --hash=sha256:bf3fe71fbfb8ec0e310e0bc8537c3405a01f38f25f9394ed2135e6202fed542b \ + --hash=sha256:c0b83f044ce10a98027b105b3931548719a6e8c7ef986b4362651e0b5367c8dc \ + --hash=sha256:c27e577ece613ea12a0790e00b4eb80d901c59a3e16cad474f31d8b1529690b9 \ + --hash=sha256:c5c1c68ee401fc98271263410f0e5ce88285abacf7627132914e8adf3d70ff43 \ + --hash=sha256:c9721f81275499da1feeb36a2cf8192ea086283b3bd16b7dc4c9d7aedb7396d6 \ + --hash=sha256:cc82dde2a0d3e3ad472edce04897ad7146b8d8bfd1df8a32992eebb81af18fdc \ + --hash=sha256:cec596316640f2b394b8f0daa0ea61a8eae82d017b620b9f202befb972a59ea4 \ + --hash=sha256:cf41ecd1b0c0b6f7177ed965a54c2afbe888715c7cf6054dc12d53bc1494002c \ + --hash=sha256:d3304eb5a59442a8867f6920d484591c0fa09ffc29e9260be2feec3351e25869 \ + --hash=sha256:d480038c83691532ed52ff3147db51fa902fc78cb2d8349993a1cdb684435bff \ + --hash=sha256:df4f7784aca81a94f254c0a2767d592ee25f407e488f5fa7203e51093fb6ca27 \ + --hash=sha256:e43b188f0a5b75447bcc197728258166aa64365770ed1caa36595a5e1ca4bbba \ + --hash=sha256:e60cf3047a51edecdc4535a9196bbd6a732936b8e9f8184aabf4d16165884aaf \ + --hash=sha256:eac4b07d4e3743b172451e122ea964f72f152879d4f9adcf3f3d33e518f12ead \ + --hash=sha256:eb3712dc9b464793de0a4e42a7313d50293c751f94bddaf7332a1bc71bccdda9 \ + --hash=sha256:ecea603dd2fbf8242fd31a305a8b12a4ece2de28096870c65fdd0d1e35b8d9a6 \ + --hash=sha256:ef31985c4dedb5f1424e1aec6849a47dd37689cb7fa3c20b1b82187f26806261 \ + --hash=sha256:ef752769cd962f39ea0b6ffc82d1ea43a0012c5a6157c7a075212fa509cfcff2 \ + --hash=sha256:f25446b2981717dca9786bac841cb3fd7efb568e3e3c755dd980481c5cb9228d \ + --hash=sha256:f2ac30cf5eb5dff1b584627ae0b0e1186551a4f69ae3c75073911da497a29170 \ + --hash=sha256:fea03cf56568cc1cba08b470be6a0559e71c3a5b688d54b7179bb35ba23d0821 + # via policyengine-taxsim (pyproject.toml) +matplotlib-inline==0.2.2 \ + --hash=sha256:3c821cf1c209f59fb2d2d64abbf5b23b67bcb2210d663f9918dd851c6da1fcf6 \ + --hash=sha256:72f3fe8fce36b70d4a5b612f899090cd0401deddc4ea90e1572b9f4bfb058c79 + # via ipython +mdurl==0.1.2 \ + --hash=sha256:84008a41e51615a49fc9966191ff91509e3c40b939176e643fd50a5c2196b8f8 \ + --hash=sha256:bb413d29f5eea38f31dd4754dd7377d4465116fb207585f97bf925588687c1ba + # via markdown-it-py +microdf-python==1.5.11 \ + --hash=sha256:0f9af347bcc4d036e1290c07cc28d33bacfc84a54704a3aee52c8be61a387a29 \ + --hash=sha256:700b0125bab3e4f1af0c3257e0d06b57655259be7fac3eaa8a058ccff8616e96 + # via + # policyengine-core + # policyengine-us +msgpack==1.2.3 \ + --hash=sha256:07c9733089d1b176c3dd2f7fa268452f9d5d784d076473499d754a58e8d1fbbb \ + --hash=sha256:0955b9000725573d1457c1676944b370dd9643c8d18f25bda5ac72913f850949 \ + --hash=sha256:0c91762c48cd686dc9cf2b142c0bc544083952de32f5853d6624c956e54b85e5 \ + --hash=sha256:0ed5823c4efc20fe87d3530665f40ec18a002be003114814c21235cc8d256207 \ + --hash=sha256:13221a6c81ebb8e43ea63a7251c35d54e4175cea37ebf3a62e911bdf42562a3c \ + --hash=sha256:186e6c602b8a9968b8e864c67d622a69279f7d1e55ae25f40e3bff7e815b2b62 \ + --hash=sha256:18a6ed513023001b28dcd3ba54966f6bb90a38274ba8d2640464bcab3a1b81d4 \ + --hash=sha256:1d6bcec3dbbdb89ca385d3a73e63ceae7b841fa0d7ca7c676f1a7bfe7fb2cdb8 \ + --hash=sha256:1f4ae8bd4ad9ba085fde95e95d055a896d19210238a4199a771a3cf36dceed49 \ + --hash=sha256:1f585407f740a9eac04a3bb82c61d68a0ea78f90e29e670bfb086b9ce3a518dd \ + --hash=sha256:21bfa4d2aa0b04c1806ef778a1199e9e53ea2441bcbf284420a32083896320b8 \ + --hash=sha256:2487453ca1b6104442c6442f9a1a8fee1fe8f428a70d99d4cba799108b304150 \ + --hash=sha256:2574ef81c1c8c38b10e330f3f9406fd09198a776b002030fafcf8e7647e9e06e \ + --hash=sha256:30e1522e4173230dca4d9ad896f038f73c0da6c1edd42f4dbad88ac583cf5d46 \ + --hash=sha256:32edb81a2b5eb7cd7c9d941b2bfbbb082fd2cd09e0e725930316af6b708db186 \ + --hash=sha256:3372475211a9ce1a23acefe512cb3e121d18c95dc74ed56cb1819ef40836ebf4 \ + --hash=sha256:382b219de3d436de3baba0f4b0c6d4336e8f5858d0eb047918b13b69a71c6c55 \ + --hash=sha256:382bc88fe90f29f5ac8a0b65c7046ff255356f2f2f3186c30e370215736fa1dc \ + --hash=sha256:39b6986c19e1f2dfa549d185dba6ccf1de2e4c0ba10d8cfc0048935b1c5f9109 \ + --hash=sha256:3a31905206722103a84c1f72633fe30692cff6732c9d262e09a27dbc468797c8 \ + --hash=sha256:3d4c807ed050fe3ddbea5ba7e9f63d7136871ce42861be1f50ff739f0e91047a \ + --hash=sha256:3ec409b0d6aa8e9eec6eaf881b893caa215dbe68c5319ca96e8a271d81bb111d \ + --hash=sha256:471e12a6a42498a31490c206e0069e343b6a7c35db540be73a879eb06f5be047 \ + --hash=sha256:4c0780095871ecc49a58b2ff6b1b43b25214704da67646557ca287a3f49fb2dd \ + --hash=sha256:59612b4ed48a04cf024584218e813562f3b30a3bafa5f55abe300b15da314751 \ + --hash=sha256:5bd5f91ea75c45cafcc5433ba8fae59b708b736ec178d2441c40c499e9e079db \ + --hash=sha256:5bf390259cb25a6a1cd197c65810999b811f64cd38683251538bcc5a1e41f7d3 \ + --hash=sha256:5c1efdd9181cb1b719ee46865f368a927f1c0c65d577798340b1194545b7515a \ + --hash=sha256:5e0d7950ca3c1bbae291d0552dd3bb2792fc680629c4c0d44e47e5bab969f3ca \ + --hash=sha256:5f304123b90e8b2e49867981b7f6061612c39f50cca51ee88de007c084cf68d3 \ + --hash=sha256:62cc1a4ef0e553bac32c8342e1f04834aca7de276b92744eb7307db77759b890 \ + --hash=sha256:63bb7448a1e9111319ae2430c09a5596140c160422830d6271bc75730ff2ff9a \ + --hash=sha256:6576f348ed6cc4f31db6fd915a8e94245f042f50eae08d48732425e70638ea37 \ + --hash=sha256:666ef5601ab0e6e345e47febc96aa81143cc932201543480cbb9499164f05ffb \ + --hash=sha256:6707d2fa2aa1bb5424ea0b05f44ffc989b15ab41a73ff5855bff4944fec7c8ac \ + --hash=sha256:69ad12cedb674c73527bed869cddb42b742cac79a207a614202a4abaa24ea173 \ + --hash=sha256:6a834097144aabe948b8ca9020a833e8026f7d0abbd0ec54bc7e50f45a8ce012 \ + --hash=sha256:6df430419f2338cb71e4a34d6e64f83c88ccd321f91f40ba4513400b36d864ec \ + --hash=sha256:700bc0fc9e968a292b9137ee70e7a012f7e115bf0107ce45e3a88202788dfc1e \ + --hash=sha256:7013534a7163aa4f213c4d9864f1a8a7555daac6fcd48f699a198e29b436bfab \ + --hash=sha256:7995a7c6a62a1d6e7df211b4a16de513bd99fd053525050a319f80f44fb8015e \ + --hash=sha256:79dfa38faf92f804aa61beec140d70b18418e1dde1778dbb77a87a4cce85aa8a \ + --hash=sha256:7a003b02c6ee2eea6dfe0bb08818631e3597e69f0131f2a8250488a1cc553290 \ + --hash=sha256:7c047250096f9fc19dba26e3d1639b5e7a84114003605c94def667149a70ced1 \ + --hash=sha256:84a6616d396ec1bc18a1e83e67c96a393ec35dfe5e17434a5be7b9aa0fe988ab \ + --hash=sha256:87cf2ef05ff2f2493ba29fcdaef27e960ca64dacfd13460ae29e6f92e0ed05bb \ + --hash=sha256:89c930aece4e972b208ba589c8410b4167b05e411a5ea2cb25fd96f8bc47ee43 \ + --hash=sha256:8ca67f77938ea6a3663aa9bd22b3e031f6da84d665be850abab910ee90728dfd \ + --hash=sha256:8e51eca14fbb65c4e0a5a9657346962bd3dca78c08e04e3d4dee70ef48687d30 \ + --hash=sha256:8ec7a1d49ca6c2569d722ab5ec86e90089b0713900aa31905b47b4c4d9e78ce0 \ + --hash=sha256:902f3490db0e07a7d40b48536a85c9b28fbf1397e7e1658a45a55f958e303620 \ + --hash=sha256:905a189853d6bdb204c7ae5f4ab77fb857448abfff574d3d93c62e2815b24b4f \ + --hash=sha256:9276ba88891338f2617044429dfd080ae008c9868a25f6f1a7d004a35dc9ac0a \ + --hash=sha256:9324c54995641c3d1f92a9d55093c8cde0ffa2fbc87a467a688ef60428393220 \ + --hash=sha256:968583e956d0427878050b371308c5f8647088732ef3e66a117dbe1192ec91e0 \ + --hash=sha256:9d7e9cbb0998bbfd363fd9a09c330520d5e9cb323c05b5a1a05865d23ccf2226 \ + --hash=sha256:a393e428f6ffb0dcb73308c1fff5593041c16ff42da66e5bac8a83a6107a54b0 \ + --hash=sha256:a6b63917d60d6df451f328bd6afba8565e33c4afe1f62ec4ad758b78731c827b \ + --hash=sha256:b1631e12fe572e181cd77e831f69335d6cd5278eac22e3db3f33cf264ac2ac18 \ + --hash=sha256:b774ff994d844e541439ac5d2d49a14def4104830c3465e9394c153f86200ffb \ + --hash=sha256:b949cc25e4a09252cbcc54e66e507de914d0e94a3a7039bd54c299bf7037c098 \ + --hash=sha256:bb89b5dc30469c84bbf8684826eb851d82412ca95690e111b9ac5e8fb343961a \ + --hash=sha256:bfe7d5b62cbe7aa664f0b3e2c49077f10fcdd06183d3014f8271ff3c5edbfbf9 \ + --hash=sha256:c309a7abae1d14ba29a8bd0ddbd704a5e469d8e9bd9c3dee0e4ff53d7ae01d56 \ + --hash=sha256:c77e27790ad72989db783d5303825fba0b71550f00a490efba35cde7dc4b719f \ + --hash=sha256:c942c21a93f36b3a69e828c8945bb72c94dc2ffe488a2086950c812f3edf046c \ + --hash=sha256:ccea05b5542f6d283fef3f0a8e93a7f0be90af0ddeeef84c25c0216ba76dcae1 \ + --hash=sha256:cd5a9f9f86a52c24713679aa2631956835f3842512964ff93f736ff76f1f530d \ + --hash=sha256:d0238cd05dec9ffbe0de1071df685ba63e30a36ac155285b1a094e727c38cbe9 \ + --hash=sha256:d1c1e8989a855b7f1f2a64ec4a80b23a631822903952770813857b2e4f460471 \ + --hash=sha256:d2f9c4f85e47a44d26d5baf3b041eef23436e224d44eed273f01bd8a12048d9f \ + --hash=sha256:d31864ba3933a589b6a00249f89c0eb422197f49128fc10da550e57e9cb0f377 \ + --hash=sha256:d8ef3a66e4b52d2d7fdd90df2984670124b2ff7546d76bb25dcf68ef47f7df58 \ + --hash=sha256:db84203b13aecc222f465061397fdd5b53b7ae73d2c95ffc1c8dc5be0153a709 \ + --hash=sha256:db9fb67a3a2e75247bae569d34ebb5ff61c0448a4f0d6dbf991dae68af39b007 \ + --hash=sha256:e0bd394e999949c814f7912284243298de1b5a17b6a3dcb6cc8a79b156ffc4fa \ + --hash=sha256:e15f70588f4db8cd10df0930145b186de70feb9db51710cd378b1399009655bd \ + --hash=sha256:e54394b7dbe2e12ab032d9d21feef7bb61a90a150a2623633ba3781ba69dcb1f \ + --hash=sha256:eaf7e82249837e3aa97297b34a0bb9ff562027381631e057cea6e1367f10b438 \ + --hash=sha256:ec0030361cc861ac699b2ef1c695b741fa145c88f8667fa3d7e3f73deeb648a3 \ + --hash=sha256:ec90a9ae3e1169fa1171147340f0e97d941aa19fcd3b34e8339a55933ed042af \ + --hash=sha256:ed899d73a22f286a72bd9528d63f2ab3030dbad8bf1527fc249319a50d61fb9d \ + --hash=sha256:ede33b2892ceb976283e009ad12fa1834cfdf1f9c43ee9c97849fc588d00a618 \ + --hash=sha256:f24a43b3560e20f825b807fe1e874bd73d53abaf8bbdcf258a6eb152cddbc1f5 \ + --hash=sha256:f3d7b3d0018746b5997dd6b14a1870b07cc4c327d9101145d94a1fc264a51a06 \ + --hash=sha256:f41ca154b7737b11893cdce3c78c61d703398a1cd54d4297bdad908392338a8e \ + --hash=sha256:f42f146752eedb6765f07dcc04d72dab0a25779ec8d4a88c0085263ce114f22c \ + --hash=sha256:f56fba61b2516be7917cb00151f0d060b5b21184e3499bb57f0f7d9259bea124 \ + --hash=sha256:f9ddd28d3e9bbc602a9dced1591882c7fb9ab776eef8837da2c326fde19e2853 \ + --hash=sha256:fafc3b8898b432b841d30a61082c599fa7f4d06885f9dc58ad72259e12059fa6 \ + --hash=sha256:fcc6800daac4922960f6eeb7a0dda3dd4105e0bf7bce0e83ebc465a78cb7bdba + # via blosc2 +ndindex==1.10.1 \ + --hash=sha256:03cf1e6cdac876bd8fc92d3b65bb223496b1581d10eab3ba113f7c195121a959 \ + --hash=sha256:046c1e88d46b2bd2fd3483e06d27b4e85132b55bc693f2fca2db0bb56eea1e78 \ + --hash=sha256:08bfdc1f7a0b408d15b3ce61d141ebbebdb47a25341967e425e104c5bd512a5c \ + --hash=sha256:092b92c07690292ec7c6b266c38d7e63d254ec8d913ed06f2a8e16103eb7861a \ + --hash=sha256:0ad8e060b26568c4e67c7b1dc2bc64e28597afdaabd7d63f98f655bfe2daa644 \ + --hash=sha256:0f6113c1f031248f8818cbee1aa92aa3c9472b7701debcce9fddebcd2f610f11 \ + --hash=sha256:157b5c34a1b779f5d27b790d9bd7e7b156d284e76be83c591a3ba003984f4956 \ + --hash=sha256:1827a40301405b44ad709e388c5b48cf35cd90a67f77e63f0f17d87f6000fa81 \ + --hash=sha256:1ae21b06235cb0884e97cf672780c170449baa0314085595cfe751705fa352de \ + --hash=sha256:23d35696f802548143b5cc199bf2f171efb0061aa7934959251dd3bae56d038c \ + --hash=sha256:27385939f317b55773ea53f6bf9334810cf1d66206034c0a6a6f2a88f2001c3c \ + --hash=sha256:27a7729a4d33df6b96f7d5edff281d2b987bbe6545031c5eb606b95c47694f54 \ + --hash=sha256:28741daca5926adff402247cd406f453ed5bb6042e82d6855938f805190e5ce9 \ + --hash=sha256:2d6442ecce9b395aade5e9f2431e169e01393953a069f6d2d53a63b6c94d1d06 \ + --hash=sha256:3307817bdc92846b18f309fae3582856f567dd6e0742fb0b41ac68682bfc4e2a \ + --hash=sha256:346a4bf09f5771548665c8206e81daadb6b9925d409746e709894bdd98adc701 \ + --hash=sha256:37f87f0e7690ae0324334740e0661d6297f2e62c9bf925127d249fb7eddd0ad8 \ + --hash=sha256:3b0d9ce2c8488444499ab6d40e92e09867bf4413f5cf04c01635de923f44aa67 \ + --hash=sha256:3ce3bd0882572269ca09285112cf38ce84baa2aaa5891551af968ca7c18f84bb \ + --hash=sha256:4cea15cff221e76abd12e3e940c26124184735cf421c229307f5db6742e14dd7 \ + --hash=sha256:588e8875d836a93b3cd9af482c8074bb02288ae1aff92cf277e1f02d9ae0f992 \ + --hash=sha256:59a3222befc0f7cdc85fb9b90a567ae890f70a864bdeb660517e9ebcb36bf1bc \ + --hash=sha256:5c026dbbf2455d97ce6456d8a50b349aee8fefa11027d020638c89e9be2c9c4c \ + --hash=sha256:5c3634a8df43e7928122225a3d64d850c8957bd1edf2e403907deacb478af27b \ + --hash=sha256:6928e47fb008903f2e41309b7ff1e59b16abbcd59e2e945454571c28b2433c9e \ + --hash=sha256:72af787dcee3661f36fff9d144d989aacefe32e2c8b51ceef9babd46afb93a18 \ + --hash=sha256:752e78a5e87911ded117c57a7246596f26c9c6da066de3c2b533b3db694949bb \ + --hash=sha256:777bb6fa1dc72527fb43744b8c1499ca86e8e110b238d7aad6a686489c23d3bd \ + --hash=sha256:78bfe25941d2dac406391ddd9baf0b0fce163807b98ecc2c47a3030ee8466319 \ + --hash=sha256:78ce45106ebf67aeba99714818c721d8fd5fb9534daebd2565665a2d64b50fc9 \ + --hash=sha256:7da34a78410c14341d5fff73be5ce924bd36500bf7f640fc59b8607d3a0df95e \ + --hash=sha256:8644c76e74c0fbbdaa54752de30b7c6b98b1e8f6c05f0c6228632a29c862d83f \ + --hash=sha256:87f83e8c35a7f49a68cd3a3054c406e6c22f8c1315f3905f7a778c657669187e \ + --hash=sha256:890bb92f0a779e6f16bdbcc8bd2e06c32bcc0239e5893ba246114eb924aecaaa \ + --hash=sha256:8ff1558ddbfedcecd1f6ed7777530917ad08f9c253fcaa8b7152a7aa4ca0264f \ + --hash=sha256:9599fcb7411ffe601c367f0a5d4bc0ed588e3e7d9dc7604bdb32c8f669456b9e \ + --hash=sha256:967b87b88dadb62555ec1039695c347254eccb8ca3d124c0e5dbe084c525fa93 \ + --hash=sha256:9b5297f207ebc068c7cdf9e3cd7b95aa5c9ec04295d0a7e56b529f66787d4685 \ + --hash=sha256:9d581f931e61f182478f18bdf5edd3955899df5da4892ed0d5de547a4cfd5b6f \ + --hash=sha256:9fdf3ca16efcdfbb8800aa88fbab1bc6528e6a0504bcb9cf7af4cb9d50e9f5d9 \ + --hash=sha256:a91e1a0398120233d5c3b23ccb2d4b78e970d66136f1a7221fa9a53873c3d5c5 \ + --hash=sha256:a9a211ec2198994cb3600cd46adb335a740f27e4d406b40d48ed7b98d2d2a89b \ + --hash=sha256:ae73cd2d66b09ef2f2a7d7f93bad396d6abf168d1ee825e403c6c5fb8ae1341c \ + --hash=sha256:bada24abee6bc6ca438b2e6b68a752fc9b58b67bdcb54008e2bc6330ecb0a777 \ + --hash=sha256:bc236d1612714cbd80610cf25a6ef92584ff1402e9d5a5c50e926195716f7d22 \ + --hash=sha256:c5e9762452b163e33cfb6e821f86e45ba0b53bdfcd23ab5d57b48a8f566898cb \ + --hash=sha256:c65ca639a7abf72d79f22424f4abd18dece1f289a2b7b028a0ca455edd2168d4 \ + --hash=sha256:c67dde588c0fb89d872931a4ed5f9b4d21c1c70a3d92fdf0812a1de154239816 \ + --hash=sha256:c9dd58d91220b1c1fe516324bfcf4114566c98e84b1cbbe416abe345c75bd557 \ + --hash=sha256:cb76e0f3f235d8b1c768b17e771de48775d281713795c3aa045e8114ad61bdda \ + --hash=sha256:cdb86a4176f2ae23bd4bcd0401ca35d5dad2d1ed0d0dca1ff64480ebe41b75d9 \ + --hash=sha256:cf5855881884b8467dfcf45764ccf2e4279075be14b155b89c96994bb08d2e6f \ + --hash=sha256:cf80241b40adffdc3276b2c9fb63a96c6c98b4a9d941892738de8add65083962 \ + --hash=sha256:cf9e05986b2eb8c5993bce0f911d6cedd15bda30b5e35dd354b1ad1f4cc3599d \ + --hash=sha256:d0ebdba2fade3f6916fe21fd49e2a0935af4f58c56100a60f3f2eb26e20baee7 \ + --hash=sha256:dc7ebdbd465d25f29a9cd7ba31c304172351fc85626835385bcb72807d309a9a \ + --hash=sha256:e2ad917bcdf8dc5ba1e21f01054c991d26862d4d01c3c203a50e907096d558ac \ + --hash=sha256:e69a2cb1ac7be955c3c77f1def83f410775a81525c9ce2d4c0a3f2a61589ed47 \ + --hash=sha256:e81a9bd36fe054b6c9fcc53d26bc9a28cf15d1ab52a0f5b854f894116f3a54e1 \ + --hash=sha256:e851990a68937db5f485cd9f3e760c1fd47fa0f2a99f63a5e2cc880908faf3bb \ + --hash=sha256:ef3ef22390a892d16286505083ee5b326317b21c255a0c7f744b1290a0b964a6 \ + --hash=sha256:f77c4fd3f34c53037678020ab4e060da4bbdcae3a428797c7cbec69a6785dc93 \ + --hash=sha256:f99b3e89220da3244d03c9c5473669c7107d361c129fd9b064622744dee1ce15 \ + --hash=sha256:fa60637dfae1ee3fc057e420a52cc4ace38cf2c0d1a0451af2a3cba84d281842 \ + --hash=sha256:fe5341e24dc992b09c258456ac90a09a6d25efdc2cb86dcc91d32c8891e1df9a + # via blosc2 +networkx==3.7 \ + --hash=sha256:e3fd2c13a7814cee3746340d8d7f8598a67f16a58bf47fb7f8793fab6efca1b0 \ + --hash=sha256:fd77a511bd90f39f3d016351345b52cf5319b813bdca01de3f755d3cca62e96a + # via pyvis +numexpr==2.14.2 \ + --hash=sha256:022e61a3d5dbf5807746264b62126d1c2c24057ad90052478a4d4482ab2555c2 \ + --hash=sha256:0741efbd75c284e709b0fd430c85c31982b44c9962922ba8a9cbbea1bf413321 \ + --hash=sha256:149ab5744a5222f07b1d60455c4021c754d395e44938944ac7c7c2495f7feb54 \ + --hash=sha256:1d4593e2c6fa060cd7441e8b6ef25c16321a6be2144b3c82d1e00885f1fb6e94 \ + --hash=sha256:2aa65ddc2243f19c6915f34ee0978b4a2df20f297230a793c4ee6d55f3472599 \ + --hash=sha256:2aceefa08f8f86317fa6e8fe9f6dc20d24ab8365d715be4a26306acf406d2dbe \ + --hash=sha256:2ef72de3d3dd466cb0c435cae7141c99b0f8091b1eae9d03dcb38690f56c3f79 \ + --hash=sha256:2f132777d7d425471c458af5617e023402f13f5006301eacf8a1a6e7118ea70c \ + --hash=sha256:327be9ee62251c173236dc620147ff2d0e732a32f5bad918d78a10082f502f63 \ + --hash=sha256:375d8bee15be42dab22100a0a3de05fe6689a2de853eca012858768a9a7e02ab \ + --hash=sha256:41cdeacf1b4e51c1143983ea61fcee68139ca47222b55a9265b4fa73826c4260 \ + --hash=sha256:449a57fb9d38de136e742b1fc429572b42f29778f1d695c3fe50ffec9d3c9a71 \ + --hash=sha256:44dc6b1dfa9abcbfc9917297f0d2af7c87c16b6ecd45747a8e70f54399a3a2f9 \ + --hash=sha256:4b1ff261c3e69c4c59578d3a9ca6132603619d38ae1abe73325563bed3b9bbaf \ + --hash=sha256:606ceaf5722e295ef965ca591736fc26d9e5f13ad950a479e64cead1947f8a3d \ + --hash=sha256:66f3b125b1104241322811de87918724d6709bf082dc0703722d0cecb7b29e82 \ + --hash=sha256:6acafb2fdbeaaa6681a8f1a1d8b3f7dcd33704baace7057b950754b258be7c43 \ + --hash=sha256:76e87c7bd70d721ce4d418e81f4fb7ecf9e7e67d7cea8102527b07fd3d3facf9 \ + --hash=sha256:779129d50974e7d6d6581d322f75b8f8375e96215b6861a2d5460347997ef649 \ + --hash=sha256:790da022539fe7c37dc893acf530a91c2ca6964d7ba11f464131383729d058f3 \ + --hash=sha256:7ca9e71195b36cc7aeafe97347549e1e1c1e889ff700238782ef6447651ec26d \ + --hash=sha256:806a4471310fe20aa7cb1b2816a6f5e508073a1ad1c2e18041b83e57066fad6a \ + --hash=sha256:8274c51ae1842948f3ae7fe6951a23dcf4ddcbeeaff3737e978e7740b754662d \ + --hash=sha256:8b8384592c49cb15a91caa54e2cd84d1ce18edb7af030bb76cd29b52e5dc155d \ + --hash=sha256:8fc55d14bcf17b3fe69213bea14f999451892b4690717008c66f2edfd6a085ce \ + --hash=sha256:91e7928435f14fcb351c0157000bce65122b897cc8b0df6bcc48251f25850a6d \ + --hash=sha256:92b00c78664070e3af155c6be713a0a5d75d598647ce32a5609adb79a8f961d3 \ + --hash=sha256:93233040f4bed3bce5abb0c2d20aeb1074511f29cbaa9c14828f86bcfa44d321 \ + --hash=sha256:939c89f613b814e64bb568859397dc9f99b219c3ef681a72fb99a86e435262f9 \ + --hash=sha256:a404c9a55902572eec810068d06b79a7c99e96f0400f5a7d73f39dff5ec5e371 \ + --hash=sha256:b02738853b9b5b8a995f6c680f8f6ef33e8f419395b8fa380e38690495fdb911 \ + --hash=sha256:b20c1c55aba7812ff2f2c6a50006425d02282fabb1eaf8d75fe638ffcf6deb02 \ + --hash=sha256:bac00898930f962f360c3d763a8e2273fc931f65a1759ff1bf64b3cf13d65aee \ + --hash=sha256:bf959e6df6cb603611c034b6cba7b03a361be0ad0b80b73f163fab95f5ccbb7f \ + --hash=sha256:c1ffaf805d8636c3f95d0996517ecf9684c9ac62d768030ca78d1d00af2b3504 \ + --hash=sha256:c66925deb968f0b5280f723e2bb5918c11e6be2ca60e9e1530006286ab44031d \ + --hash=sha256:cd684ac9daa539fcdac3437678834797b29d7780cfaad71111745132d466d51f \ + --hash=sha256:d534ecb456a4ae3995f99c8a5deb469bfff05d4ec610a7885c175c881d12f710 \ + --hash=sha256:d6a5d8fc7016bf6f6e1808b011510aa7c3bd75ec1407f7650874ec591db59f5e \ + --hash=sha256:dd905922d7dce457947d54b84c7ac345cef37332b724445e159a5a1a2080ce2b \ + --hash=sha256:e7144e83ea9e581f2273e0304f15836736c4e470e2bd2e378ce617662a1ca278 \ + --hash=sha256:ef576a1cded27ba2f3129bc3c42df452a1c498072680d560793f98b0024cd7e6 \ + --hash=sha256:f1de5c88515ed9fbcad42699a0e2b5821b4d0f0adb0da6fb7e009e5cb19d8493 \ + --hash=sha256:f3526699350f94c6277fb16863773a1af9defd95a6f78bbd69b1f0338fd94756 \ + --hash=sha256:f41170e9d0dbba76851e35d80cfa9f4ca5fe78628c5bf24d941cf3364940ab7a \ + --hash=sha256:fd2f5882a66a7792aa6614c68831aa20085b499d41422aedd001080624ebb14c + # via + # blosc2 + # policyengine-core + # tables +numpy==2.5.3 \ + --hash=sha256:012e66aca395d795496446e52aeeb5866312a5d4d3f27da270e5a0b43f70dc5c \ + --hash=sha256:09d5a423c71ad5feb5625844ad58050e35df43871004b52ac9c0ad44a56775be \ + --hash=sha256:09ffa5d903faeaa5c4dd05009cf81c8bab9f2cb37c548b8d39b65b4cfa7c97f7 \ + --hash=sha256:0a59a421a32580a009e8a1751345bf829631b990dc1794b80514ab722b435def \ + --hash=sha256:116f96cadd935c6122e9228d676fe7ede19e741f5c8bb1c3cddbe0c51ccebea2 \ + --hash=sha256:1302b90c0e52281681b2975adfe8a860cb7b12216a27b4b0b4207c44bf7bccf0 \ + --hash=sha256:15aa985ac73a8db02db7663381aa109510449d3819d37206caed27b33a65a8a6 \ + --hash=sha256:1aad64d99730d013cfc6debafed22783b4fc5a7f4b8bc744d2d8cf7dcc880551 \ + --hash=sha256:1c80eabb4035ecf4ca9cd49cde8a9fdd69a729e63e6474887d1523ade7aa277f \ + --hash=sha256:1f3ed25271581281f2fccb1adcedfcde4c07362eec69189b50baf6f90e3ae159 \ + --hash=sha256:1fb6f8fb9ff0b3a69f52c66ce397b0246583e9f28616231b0e32ca49259a5fa6 \ + --hash=sha256:214045a5bf00113a146ab9ee9730c44501af6723cdf1f6830932f7b5ef2e7af0 \ + --hash=sha256:26e15e4aecd8617dfbaecb37d223e365d7b39411fba20454be2670a96aa74cb5 \ + --hash=sha256:2c25dfa72943e4336ddb6b0ee4277b47a0c85bede0807530ec68103bf58e2c10 \ + --hash=sha256:2d8240cb4c16fd831074aa2b2cf9fc54664d826341d61c372245b96a74a49a9a \ + --hash=sha256:350ba9783ce969cf9f7ce6e6a9a58e1a6e2a19ca025b7ee448c4db727706212a \ + --hash=sha256:4c8a6d2ebce6305fd82fbefca827775437147052a976ee7c94b36a0c1b52ac6c \ + --hash=sha256:4f8929ee6c96bfbd7b4ed2032e0c03af86fe1826740ab61ddabf9072d06e57ff \ + --hash=sha256:536f963710a4e63934d80ac0dc4f478804a83e9a84b6828018f25d09953ada33 \ + --hash=sha256:54a115e5a73b8fc44f0cebef486365a1894b5c9760685d4558b72b7c3eb846e0 \ + --hash=sha256:595d020938c84e320bcf40ad71089e108eac0d377cd018e14a8c094f39e98d85 \ + --hash=sha256:66a78fe4556c60aceda5916f9eacd638b18e9e681016ec302dcb4682d6d4d034 \ + --hash=sha256:6b05c171afb3aa07adbd20abc00aea86fe375beb0fdb9ef780ec5b7f63bab1c0 \ + --hash=sha256:6cef4bb1706dfec49243c05d921eefb4e190d41e2528b30d8035ea1f36b4c24a \ + --hash=sha256:6f24021b9f22bc6301c37b196974a92c1c18dccedb6fef3dd252e95f2d6adbe4 \ + --hash=sha256:71b39d9f935b6ec0f8753e3e2afb51e3efba6f2e05b68b32a40754d24bcd4a3c \ + --hash=sha256:71cad2b2a7451ab79d8f5e71b453485b6775963d5cf794179144a7463fe6e8ec \ + --hash=sha256:76c2c1e6bfa5c84adc6434dfbf013aa92096a7985221762c8f11fedfd20fff58 \ + --hash=sha256:8617bbfae4486cf99c9f899966699428d19da931d06ca94ad3da986c76e15997 \ + --hash=sha256:86bff898a431c0fb71f7610b75726e75a54d47b37edc9d537f48de63bb3c0b90 \ + --hash=sha256:8e4dd766076855b5ff7ea52fa5f07ce26286726e0f8bff446b7739d02e6ea204 \ + --hash=sha256:92f30e89b8ee0ecf363033576c422b2f58fed6a80bed0aa48dff6d14c654663e \ + --hash=sha256:93e1f5447e2b1e479d7bd74701e84746b86450cff1fc368b132d195e2b8f8211 \ + --hash=sha256:9a37475425b431b4d060f23b4f52cd2f3aef6bc7c654bd760adf0040eec9d435 \ + --hash=sha256:9deb49575e5b0b94ed72c8a64ec4d033381adc27e9060ae842971f697ba96104 \ + --hash=sha256:a5fa86b80fd24bcd1aff83ad23be44ea323de3f787be8f8b15d4a65621e25321 \ + --hash=sha256:a6391fafaba97500887132cd582abc6e19452b1ac775a47caa7b24490e152058 \ + --hash=sha256:a72f874bc9e10e4b8f80426fb49716d5141f64442a0c8418065093ec8017fbb0 \ + --hash=sha256:ac7bb1c52d445bd4f8f7f97fefe6abc3a084dc4d63df50d79b17fa2b78e89297 \ + --hash=sha256:adc1ada2662f8a5f960b8a10d9986897e7499ef07e06d4cfe7197f8cce923c07 \ + --hash=sha256:b00eefbcf0f292945c4b4dec2ae845389ef5bcdcd596e6e4328051db5b5ba694 \ + --hash=sha256:b0521d0f4aebb6e06189451025fa17a913287b13c03d5fe05c017333b654ea5b \ + --hash=sha256:b5d93cf48f687479941d12b69c873ad2cc76bbd487f0091c2200636497f34034 \ + --hash=sha256:b7e18c623bb5c95acb3b3328861272816ba199fb531921c5d6d0b675f1fde9e3 \ + --hash=sha256:bd4cb9ad3c7889b9b3fe0a9a9fb5d2ed26f9879bff2608d9f01aed147a20d231 \ + --hash=sha256:be5a8381859b6da607c84f4f7d6847725f1cf1853ef8a2c9e115b7d58bef47dc \ + --hash=sha256:befa1ae5bd6030b3f512b43ff3fa5290bbed6b84411a44244b14adf835f5b89d \ + --hash=sha256:bf63afbe037eb5d2fe87fbcc7778e61da53ebaf21d938a4515aa73b62532a5d4 \ + --hash=sha256:c00abe94c1a69d75d827dcf1c025b25c8a45d230b3bcd77a9020883a1b047653 \ + --hash=sha256:c2381f82999704f818e2c987a865050e285ec3621262c66d40f5a96c8f899f8e \ + --hash=sha256:c76d5dde9f445058f83d0c02af00557a4db91de9a9a57c0df87d1535001d654b \ + --hash=sha256:cb189f09db39283b26bfd061ec16189e14f71c6755207f72a0f7540867afe5b9 \ + --hash=sha256:ccb32e0525d29e8b0572eb84c9a57af0e7a4e615726927506f55063c62414034 \ + --hash=sha256:ccbc4665079665c3cf3bab4db9f6b095370cd6437d66be549b6c2a1fd19e1958 \ + --hash=sha256:d1c89973648c85069c5046ad460f7b8a00218b29a2e42359ac8cc63e9ab94832 \ + --hash=sha256:df2d5874ff183595a4ba404edd04f6bd9b5505c1d7708573f6a6c17489a67563 \ + --hash=sha256:e01c918ac3d48e18a927cf7b14a26a3e29ff2bdf2eacb976da0aecd6a43ed034 \ + --hash=sha256:e6ab667ba76450084eb64013762c438ea76d9d29cc676dcd6c2e9892ba37f841 \ + --hash=sha256:e931e4f499e0dc7ef29d269a8e5b35dd722e5d14be07df6240166ea7c6532fae \ + --hash=sha256:f54660b0eb6b0b9f36e7fe1cdfdff472028dd0d14acd9b9b65098efbad059469 \ + --hash=sha256:f59a878c33d6b88122d80d239bb3b845d58708750b0cb06a09aebb9b18ec696c \ + --hash=sha256:f7fabeb6cea87d65f3b926de33d03fb016cfdc29314c90974383b5582ae72891 \ + --hash=sha256:f9579f383d1bf9df80081e72760e84960a7fd4f88cf0c9e535a8597c9bb646f5 \ + --hash=sha256:f9a2353b37a1a9e78fd82b27ad7e2a32a2d036604d18f02b05e3136c62ca3b09 \ + --hash=sha256:fc36dc566135b5eceec4cf89758fcb719266a019ef07dae1754ae7c9f617ef3e \ + --hash=sha256:ffdc76bfcae6b255dff75202c5e7feaf95b40246bc0a17944facc1fecf9f79ab + # via + # policyengine-taxsim (pyproject.toml) + # blosc2 + # contourpy + # h5py + # matplotlib + # microdf-python + # numexpr + # pandas + # policyengine-core + # spm-calculator + # tables +openpyxl==3.1.5 \ + --hash=sha256:5282c12b107bffeef825f4617dc029afaf41d0ea60823bbb665ef3079dc79de2 \ + --hash=sha256:cf0e3cf56142039133628b5acffe8ef0c12bc902d2aadd3e0fe5878dc08d1050 + # via spm-calculator +packaging==26.3 \ + --hash=sha256:94edc256424af38762eb31306eed28beb9f0efc50a8837492c9d6fd6004aed79 \ + --hash=sha256:d7193f7c8e4e93f444fde0262bf90af30e16fa0ad0ad44cb553c87339b23cd1c + # via + # huggingface-hub + # matplotlib + # plotly + # pytest + # tables + # wheel +pandas==3.0.6 \ + --hash=sha256:0704044b676496b8350e023b09f174a26772456c974a2b11c36bebb558c9490d \ + --hash=sha256:085e3786ae6b2e82b406266bce36690f72b9dc1421903ba9296b2981a9fcf586 \ + --hash=sha256:097090508a1dd335013d39106fc10b20f4fd4a171638e47b77d55798ed9dab6c \ + --hash=sha256:1bcb3e9ed29e74a7439cedff9e2aefd3ea65de84d7de9ccb6c194192541bd60e \ + --hash=sha256:1e7c0afdcaf6661d795fcefc2f647ddd1136f62cdc153fba177c685d97a87808 \ + --hash=sha256:1e92d9fa834c7d877130027cddc0cad8dcff97c1f6cca26bd6310f847228b658 \ + --hash=sha256:22172a92e7ee678ec0140c7af4fc9366b55413834a1cd86af78b3caa0b0574de \ + --hash=sha256:253e12cb9081b0afbac607920f6142975966bc315135e09de275fdbaa415d2de \ + --hash=sha256:265f562fdd1079f69f3de96dd425c3405224038c0af4f920c54bd240ee2c4640 \ + --hash=sha256:2a8fc94be2ee5f1d86f97aacd8cc566f81680b6498e76f3007421bb5d98151bf \ + --hash=sha256:2e5fa32ff162dfdbc280157d664f44d23049ae414725af9676df339c501d82cd \ + --hash=sha256:3ef908d28590b3f42d7070e7ad8f9b34b442b260b7f3c1afb57e0040c58cdb1b \ + --hash=sha256:429d9df32731ab01383ed98f2baa7a60368090d1a94fc06019a12062510e8630 \ + --hash=sha256:47121f9571503f724c9b93e297ab6254ac99c77adf5e9ed085ea419fd585c258 \ + --hash=sha256:4e25e2e1adee99ddfada6f7206a79ae8e9c8a8861b0e3eaaba165006d3eef18e \ + --hash=sha256:4ff44b2cb51cbd691c91f92c4ea6c71e34003f239ebd67c2e857dc898466b49c \ + --hash=sha256:50c44cbf5820b6b91a5f74aae04972472aefadd3cd9fbd1010409d85528bd570 \ + --hash=sha256:569e114072b24fc4970c12e2b4bab252671668a40b324318903380cab0254c0c \ + --hash=sha256:583be68728a31d0d750d5b8d9e00f02b153df0d4655f858bde93cb84cfc4227c \ + --hash=sha256:5e75072773c1b2f7cb63faa3a6f562aede11f3976f68ed34cb538bc091a28171 \ + --hash=sha256:5edd0a7abb0986ecce1ac81f56d99b6763f86aa6946dceb6c661224f90af5a19 \ + --hash=sha256:60d81f9e1799b36f3739e7fff44d1fbb2e8fd5a271b3863e03de9715fccda0fa \ + --hash=sha256:62f51d7f651c8054c5e82a69265c98082e795d1442df7ca6edc3a545d61214b1 \ + --hash=sha256:654aae059295dbba6ecd2328ca12712a2cf1676214c8699f1c29213f7ccf9c34 \ + --hash=sha256:66b07ef7315a31bfe1089cd3d71a7de781c9dca986762d0b4fe7c0ef17465d10 \ + --hash=sha256:6ff482fa91fa2bafd92e8fe66ce3645c851824310f295c1f0a2f96e928fc4541 \ + --hash=sha256:77ccbe5057aece6fc172b9b77f19c04335af6882bc2e10c8f3ee4e6bfb3da553 \ + --hash=sha256:7dac2d65e9087e8e7b5a45fe15c4920911a221df061ab629943ce016489145c7 \ + --hash=sha256:83e91d15738d7783c050197cef2f2cf82fc6353dae9865aa87ed1fa16aa4d55a \ + --hash=sha256:86fa853a12e0b70927e2b1ee00d56d2224ec9cbb4b9d58348b5ad52d2f21150e \ + --hash=sha256:8fe77b408d82e2615674dfed62533b95e18a03610573877422aada4f625d4947 \ + --hash=sha256:963ca21199097a84c7827c4678b04e30833084fbf8ef44fde3fa7180a29f8fa0 \ + --hash=sha256:97274c9adf6255bb48c620cd6959805efa7f09ea2167f0e0ae006a448cd2fca7 \ + --hash=sha256:994a79608263fe1c14cc48ffa7300e2b834b7d1cb406ffe96a08828cb0cdd79b \ + --hash=sha256:9ae8073aed8e21d1a7fe263dcdc6840743549722a6738198a0a46000fa9476f2 \ + --hash=sha256:9dab635a549e58a053c7b0fa054dc0bd7be22f0ed9a720f4a85d5fb993276172 \ + --hash=sha256:9e492cd4bdba6778de4fe0df7f4590c012161ebcf9902dce01b01dc683105514 \ + --hash=sha256:a3a22e07fe75347eaacc75b0e85297947af4fba6b4aae23916bd8b6828d0bba3 \ + --hash=sha256:a4dbd4dc65cbe645b92b8785d0f96dd7311010dc6606cf620e51b07b8788a12a \ + --hash=sha256:a77a1a44e4d88f1c6a2a64d3eb12efec8420875722e14279800b173a7c7c2804 \ + --hash=sha256:b27c8d890e4aa2171437ae2a39de1d215e674158e4865c4023a8b31c932513b2 \ + --hash=sha256:bd75ed0c840f709fc2ae26ddd9534ac77ca1a48ac0cce521a74acaa85f3340a7 \ + --hash=sha256:c6e4aae3e9bea26c6c9a20d88d96c86ec4a99b4db5fd516bcb4e829ab2c0ee36 \ + --hash=sha256:c826e9babb7790142c399f58599d8de679bea059d7b39c5b6efa2096fac37266 \ + --hash=sha256:cc39303913e2ea129915670de5d1c9fbd647f543bb72e5543bac8baa94e9e42f \ + --hash=sha256:d7564d86a94c2eb8ab290b07f63ddaae5c032fa53897c29a2ff2197d43aee8af \ + --hash=sha256:d7dcd21238cbb4828ff148481ba01cac8946dc5121457b5aeba28636f8f99a60 \ + --hash=sha256:db7ec631f26223beee8e5c9e0b8f23c24d8197bbd1d982421d4e3188bea51965 \ + --hash=sha256:e3dccb584123b399c07562ac4d62543e90ede49ddf8ce3c13ffc64cbe828c281 \ + --hash=sha256:e7c1905ef02c3d6d43d9dbd5b6ccb4da4870a0b0c821bbc103fbdb6f3ad2707b \ + --hash=sha256:eb6900de08ac85f93ac4948aa6b80842eba555875337b8359035ac9c43e92d34 \ + --hash=sha256:ee913a91669056c1de1a6b733fbfeab711de9e54e3bee2dfa5fe79d9457247d1 \ + --hash=sha256:ef738d71d1059245b6bb03e312be06d8b3821326a83486c1ad03b9aba3710e44 \ + --hash=sha256:f3ce8a6968045481e91a3990e797e348ce13db45ee164a7095bbc824e26c09dd \ + --hash=sha256:f4e7c52eb108d752e7592268108fd3e98efd76d83a3125cdd06c621c2e44359b \ + --hash=sha256:f8029ec0f1f89e4f985929ce1f6626dabf3140d61a4e9c1215afdab34eaf9a5d \ + --hash=sha256:fb625f426b375bcc96e3a04c5d5d266cd7be6ae5d6866e0e703382ab5164068c \ + --hash=sha256:ff51a4459ed036e93d1eb1bb5e6e7b28685d3cb6b7c12b91c05b31024e234729 + # via + # policyengine-taxsim (pyproject.toml) + # microdf-python + # policyengine-core + # policyengine-us + # spm-calculator +parso==0.8.7 \ + --hash=sha256:a8926eb2a1b915486941fdbd31e86a4baf88fe8c210f25f2f35ecec5b574ca1c \ + --hash=sha256:eaaac4c9fdd5e9e8852dc778d2d7405897ec510f2a298071453e5e3a07914bb1 + # via jedi +pexpect==4.9.0 \ + --hash=sha256:7236d1e080e4936be2dc3e326cec0af72acf9212a7e1d060210e70a47e253523 \ + --hash=sha256:ee7d41123f3c9911050ea2c2dac107568dc43b2d3b0c7557a33212c398ead30f + # via ipython +pillow==12.3.0 \ + --hash=sha256:00808c5e14ef63ac5161091d242999076604ff74b883423a11e5d7bbb38bf756 \ + --hash=sha256:04f01d28a6aaff387bf842a13be313df23ba0597a44f1a976c9feb3c6ff4711a \ + --hash=sha256:06ff022112bc9cbf83b60f8e028d94ad87b60621706487e65f673de61610ab59 \ + --hash=sha256:0740a512dc522224c77d9aa5a8d70d8b7d73fb91f2c21125d8d025d3b8990e45 \ + --hash=sha256:0847a763afefb695bc912d7c131e7e0632d4edc1d8698f58ddabec8e46b8b6d3 \ + --hash=sha256:0dd2064cbc55aaec028ef5fbb60fa47bb6c3e7918e07ff17935284b227a9d2df \ + --hash=sha256:0feb2e9d6ad6c9e3c06effe9d00f3f1e618a6643273576b016f591e9315a7139 \ + --hash=sha256:10e41f0fbf1eec8cfd234b8fe17a4caac7c9d0db4c204d3c173a8f9f6ef3232b \ + --hash=sha256:1182d52bc2d5e5d7d0949503aa7e36d12f42205dc287e4883f407b1988820d39 \ + --hash=sha256:164b31cd1a0490ab6efae01aa5df49da7061be0af1b30e035b6e9a1bfe34ee6e \ + --hash=sha256:1657923d2d45afb66526e5b933e5b3052e6bdea196c90d3abb2424e18c77dae8 \ + --hash=sha256:186941b6aef820ad110fb01fb06eb925374dc3a21b17e37ec9a53b250c6fe2d1 \ + --hash=sha256:1cca606cd25738df4ed873d5ad46bbdb3d83b5cbca291f6b4ff13a4df6b0bbe8 \ + --hash=sha256:21900ce7ba264168cd50defae43cd75d25c833ad4ad6e73ffc5596d12e25ac89 \ + --hash=sha256:236ff70b9312fb68943c703aa842ca6a758abfa45ac187a5e7c1452e96ef72b5 \ + --hash=sha256:23aceaa007d6172b02c277f0cd359c79492bbb14f7072b4ede9fbcaf20648130 \ + --hash=sha256:23d27a3e0307ec2244cc51e7287b919aa68d097504ebe19df4e76a98a3eea5bd \ + --hash=sha256:24870b09b224f7ae3c39ed07d10e819d06f8720bc551847b1d623832b5b0e28d \ + --hash=sha256:251bf95b67017e27b13d82f5b326234ca62d70f9cf4c2b9032de2358a3b12c7b \ + --hash=sha256:25b9b82bb22e6e2b3cd07b39c68b7b862001226cb3dff7130d1cb914121b39ed \ + --hash=sha256:28ce87c5ab450a9dd970b52e5aca5fe63ed432d18a2eaddd1979a00a1ba24ace \ + --hash=sha256:300557495eb45ebb8aec96c2da9c4be642fbf7cd937278b4013ba894ea8eb0eb \ + --hash=sha256:30f2aa603c41533cc25c05acd0da21636e84a315768feb631c937177db558931 \ + --hash=sha256:331b624368d4f1d069149002f25f44bc61c8919ce8ddb3c45bdad8f6e2d89510 \ + --hash=sha256:37d6d0a00072fd2948eb22bce7e1475f34569d90c87c59f7a2ec59541b77f7a6 \ + --hash=sha256:37dc8f7bbb66efe481bb60defacef820c950c24713fb44962ed6aa2a50966de1 \ + --hash=sha256:3b8182a766685eaa002637e28b4ec8d6b18819a0c71f579bf0dbaa5830297cce \ + --hash=sha256:3edce1d53195db527e0191f84b71d02022de0540bf43a16ed734ed7537b07385 \ + --hash=sha256:446c34dcc4324b084a53b705127dc15717b22c5e140ae0a3c38349d4efec071e \ + --hash=sha256:4998562bf62a445225f22e07c896bb04b35b1b1f2eb6d760584c9c51d7a5f78c \ + --hash=sha256:4b0a7fe987b14c31ebda6083f74f22b561fd3739bc0ac51e019622e3d72668c7 \ + --hash=sha256:4e8c2a84d977f50b9daed6eeaf3baef67d00d5d74d932288f02cb94518ee3ace \ + --hash=sha256:4f883547d4b7f0495ebe7056b0cc2aea76094e7a4abc8e933540f3271df27d9c \ + --hash=sha256:514435a37670e3e5e08f3945b68718b6ed329bb84367777e16f9f4dfe1e61a0f \ + --hash=sha256:53aa02d20d10c3d814d536aa4e5ac9b84ca0ff5a88377963b085ad6822f93e64 \ + --hash=sha256:5594fc43d548a7ed94949d139aa1341b270f1863f11cfd37f5a6c8b778a6b67f \ + --hash=sha256:571b9fcb07b97ef3a492028fb3d2dc0993ca23a06138b0315286566d29ef718a \ + --hash=sha256:57b3d78c95ba9059768b10e28b813002261d3f3dfc55cc48b0c988f625175827 \ + --hash=sha256:5afb51d599ea772b8365ae807ae557f18bccfe46ab261fd1c2a9ed700fc6eb17 \ + --hash=sha256:6b02afb9b97f65fbca5f31db6a2a3ba21aa93030225f150fa3f249717e938fb4 \ + --hash=sha256:6c0016e7b354317c4e9e525b937ac8596c38d2d232b419529b9cd7a1cd46e39a \ + --hash=sha256:71d6097b330eea8fd15097780c8e89cb1a8ce7838669f48c5bacd6f663dd4701 \ + --hash=sha256:756c768d0c9c2955feb7a56c37ea24aea2e369f8d36a88da270b6a9f19e62b5e \ + --hash=sha256:78cb2c6865a35ab8ff8b75fd122f6033b92a62c82801110e48ddd6c936a45d91 \ + --hash=sha256:7a743ff716f746fc19a9557f60dab1600d4613255f8a7aeb3cdde4db7eb15a66 \ + --hash=sha256:85f998ea1848bc6757289e739cfbdda3a04adfd58b02fc018ce54d754a5ce468 \ + --hash=sha256:8728f216dcdb6e6d555cf971cb34076139ad74b31fc2c14da4fafc741c5f6217 \ + --hash=sha256:877c3f311ff35410f690861c4409e7ccbf0cd2f878e50628a28e5a0bb689e658 \ + --hash=sha256:8cd2f7bdda092d99c9fc2fb7391354f306d01443d22785d0cbfafa2e2c8bb418 \ + --hash=sha256:8e95e1385e4998ae9694eeaa4730ba5457ff61185b3a55e2e7bea0880aef452a \ + --hash=sha256:962864dc93511324d51ddbb5b9f8731bf71675b93ca612a07441896f4688fb8c \ + --hash=sha256:9cf95fe4d0f84c82d282745d9bb08ad9f926efa00be4697e767b814ce40d4330 \ + --hash=sha256:9e881fca225083806662a5c43d627d215f258ff43c890f831966c7d7ba9c7402 \ + --hash=sha256:a2b55dd6b2a4c4b7d87ffa56bdb33fdc5fdb9a462173861a7bc097f17d91cb09 \ + --hash=sha256:a45650e8ce7fafffd731db8550230db6b0d306d181a90b67d3e6bca2f1990930 \ + --hash=sha256:a876864214e136f0eb367788dbd7df045f4806801518e2cfe9e13229cfe06d8f \ + --hash=sha256:ae26d61dfa7a47befdc7572b521024e8745f3d809bd95ca9505a7bba9ef849ec \ + --hash=sha256:af8d94b0db561cf68b88a267c5c44b49e134f525d0dc2cb7ed413a66bc23559a \ + --hash=sha256:b343699e8308bdc51978310e1c959c584e7869cc8c40780058c87da7781a1e94 \ + --hash=sha256:b3c777e849237620b022f7f297dd67705f9f5cf1685f09f02e46f93e92725468 \ + --hash=sha256:b629de27fda84b42cde7edef0d85f13b958b47f6e9bbcbba9b673c562a89bd8b \ + --hash=sha256:ba09209fbe443b4acccebe845d8a138b89a8f4fbaeedd44953490b5315d5e965 \ + --hash=sha256:ba54cfebe86920a559a7c4d6b9050791c20513650a1952ebe3368c7dc70306f8 \ + --hash=sha256:bcb46e2f9feff8d06323983bd83ed00c201fdcab3d74973e7072a889b3979fcd \ + --hash=sha256:bcc33feacfaefce60c12fd500a277533bdc02b10a19f7f6d348763d8140bbba7 \ + --hash=sha256:bf16ba1b4d0b6b7c8e534936632270cf70eb00dbe09005bc345b2677b726855c \ + --hash=sha256:cf1845d02ad822a369a49f2bb9345b1614744267682e7a03527dc3bf6eea1777 \ + --hash=sha256:d69141514cc30b774ceea5e3ed3a6635c8d8a96edf664689b890f4089111fb35 \ + --hash=sha256:d9c7f76c0673154f044e9d78c8655fb4213f6ca31a836df48b40fe5d187717b9 \ + --hash=sha256:dbce0b29841537a2fa4a214c2bbf14de3587c9680caa9b4e217568472490b28f \ + --hash=sha256:dc624f6bc473dacdf7ef7eb8678d0d08edf15cd94fad6ae5c7d6cc67a4e4902f \ + --hash=sha256:e158cb00350dc278f3b91551101aa7d12415a66ebf2c91d8d5ac14e56ddd3ad0 \ + --hash=sha256:e491916b378fba47242221bb9ead245211b70d504f495d105d17b14a24b4907c \ + --hash=sha256:e795b7eb908249c4e43c7c99fac7c2c75dab0c43566e37db472a355f63693d71 \ + --hash=sha256:e7e480451b9fa137494bccd3a7d69adbe8ac65a87d97be61e11f1b1050a5bac3 \ + --hash=sha256:e91206ee562682b51b98ef4b26a6ef48fd84e15fd4c4bc5ec768eb641d206838 \ + --hash=sha256:e9871b1ffbfa9656b60aeee92ed5136a5742696006fa322b29ea3d8da0ecc9cf \ + --hash=sha256:e9aeb04d6aef139de265b29683e119b638208f88cf73cdd1658aa07221165321 \ + --hash=sha256:ebaea975e03d3141d9d3a507df75c9b3ec90fa9d2ffd07567b3a978d9d790b26 \ + --hash=sha256:f0606c8bf2cdefea14a43530f7657cbbb7ecf1c4222512492ef4a4434a9501ec \ + --hash=sha256:f13c32a3abd6079a66d9526e18dad9b6d280384d49d7c54040cd57b6424041d9 \ + --hash=sha256:f7401aebd7f581d7f83a439d87d474999317ee099218e5ad25d125290990ba65 \ + --hash=sha256:fa4ecea169a355be7a3ade2c783e2ed12f0e40d2c5621cda8b3297faf7fbb9f5 \ + --hash=sha256:fbd139c8447d25dd750ab79ee274cc5e1fe80fc56340ab10b18a195e1b6eca3e \ + --hash=sha256:fdafc9cce40277e0f7a0feabce0ee50dd2fa1800f3b38015e51296b5e814048d \ + --hash=sha256:fe3cca2e4e8a592be0f269a1ca4835c25199d9f3ce815c8491048f785b0a0198 \ + --hash=sha256:ffd0c5368496f41b0944be820fcb7a838aa6e623d250b01acf2643939c3f99d7 + # via matplotlib +plotly==5.24.1 \ + --hash=sha256:dbc8ac8339d248a4bcc36e08a5659bacfe1b079390b8953533f4eb22169b4bae \ + --hash=sha256:f67073a1e637eb0dc3e46324d9d51e2fe76e9727c892dde64ddf1e1b51f29089 + # via policyengine-core +pluggy==1.6.0 \ + --hash=sha256:7dcc130b76258d33b90f61b658791dede3486c3e6bfb003ee5c9bfb396dd22f3 \ + --hash=sha256:e920276dd6813095e9377c0bc5566d94c932c33b27a3e3945d8389c374dd4746 + # via pytest +policyengine-core==3.32.29 \ + --hash=sha256:30591ab05d676ef89aabf4ae4ca4544b0fe97dde4ab82233d487d88ded05fffc \ + --hash=sha256:526fbf4bc1592b4afd4b60df3d5572cfef3e00afb93fbc733940233d8a0310c4 + # via policyengine-us +policyengine-us==2.38.1 \ + --hash=sha256:1734d447d0fb7819aa9c0746e224baa6108ab6c44a20cf71e61f9e81470b7d2d \ + --hash=sha256:965baadc7e66fe5e5eca7b81e96128049c341ac49ac9f0bbeede8e19fdc7dc01 + # via policyengine-taxsim (pyproject.toml) +prompt-toolkit==3.0.53 \ + --hash=sha256:01c0891d7f9237d5e339f7d3e42cdae80b7534abb1c7c0e3352efba6231492f2 \ + --hash=sha256:9ec8a0ad96d5c56148b3f914aa79c1564c3fde5d2e6b876e7bc327e353cf8fa6 + # via ipython +psutil==6.1.1 \ + --hash=sha256:018aeae2af92d943fdf1da6b58665124897cfc94faa2ca92098838f83e1b1bca \ + --hash=sha256:0bdd4eab935276290ad3cb718e9809412895ca6b5b334f5a9111ee6d9aff9377 \ + --hash=sha256:1924e659d6c19c647e763e78670a05dbb7feaf44a0e9c94bf9e14dfc6ba50468 \ + --hash=sha256:33431e84fee02bc84ea36d9e2c4a6d395d479c9dd9bba2376c1f6ee8f3a4e0b3 \ + --hash=sha256:384636b1a64b47814437d1173be1427a7c83681b17a450bfc309a1953e329603 \ + --hash=sha256:6d4281f5bbca041e2292be3380ec56a9413b790579b8e593b1784499d0005dac \ + --hash=sha256:8be07491f6ebe1a693f17d4f11e69d0dc1811fa082736500f649f79df7735303 \ + --hash=sha256:8df0178ba8a9e5bc84fed9cfa61d54601b371fbec5c8eebad27575f1e105c0d4 \ + --hash=sha256:97f7cb9921fbec4904f522d972f0c0e1f4fabbdd4e0287813b21215074a0f160 \ + --hash=sha256:9ccc4316f24409159897799b83004cb1e24f9819b0dcf9c0b68bdcb6cefee6a8 \ + --hash=sha256:b6e06c20c05fe95a3d7302d74e7097756d4ba1247975ad6905441ae1b5b66003 \ + --hash=sha256:c777eb75bb33c47377c9af68f30e9f11bc78e0f07fbf907be4a5d70b2fe5f030 \ + --hash=sha256:ca9609c77ea3b8481ab005da74ed894035936223422dc591d6772b147421f777 \ + --hash=sha256:cf8496728c18f2d0b45198f06895be52f36611711746b7f30c464b422b50e2f5 \ + --hash=sha256:eaa912e0b11848c4d9279a93d7e2783df352b082f40111e078388701fd479e53 \ + --hash=sha256:f35cfccb065fff93529d2afb4a2e89e363fe63ca1e4a5da22b603a85833c2649 \ + --hash=sha256:fc0ed7fe2231a444fc219b9c42d0376e0a9a1a72f16c5cfa0f68d19f1a0663e8 + # via policyengine-core +ptyprocess==0.7.0 \ + --hash=sha256:4b41f3967fce3af57cc7e94b888626c18bf37a083e3651ca8feeb66d492fef35 \ + --hash=sha256:5c5d0a3b48ceee0b48485e0c26037c0acd7d29765ca3fbb5cb3831d347423220 + # via pexpect +pure-eval==0.2.4 \ + --hash=sha256:260c2774686e651b79f8b8e7fc9d80b3599ea6a66334b47d5f4abb69fc2c0ea1 \ + --hash=sha256:96cae060a313cfaad51bb761278bfb0e62dc0248d9315a81173752dc546cd37a + # via stack-data +py-cpuinfo==9.0.0 \ + --hash=sha256:3cdbbf3fac90dc6f118bfd64384f309edeadd902d7c8fb17f02ffa1fc3f49690 \ + --hash=sha256:859625bc251f64e21f077d099d4162689c762b5d6a4c3c97553d56241c9674d5 + # via tables +pydantic==2.14.0 \ + --hash=sha256:15fab1bea6f1dc5003b54fc2ecab230c1fd1dbade2acd4addc52d81e32416d4b \ + --hash=sha256:8a51a7aaddd60f55566d1f07bdd87b92b463903f39a8f26b71a06314cd1548ae + # via blosc2 +pydantic-core==2.50.0 \ + --hash=sha256:00963fde61cf8880d9e7b5635a9830e0591edfa45168447fdc5b47635c0f6437 \ + --hash=sha256:01340f4fbb4f854b1f36a6fe9dcd2b26c8936aead4e4ad1205624ac025c875fc \ + --hash=sha256:02ec3675d606a355523e1c52bf5aa4116776f8d273dba03d8336a5a3ae984e15 \ + --hash=sha256:031867348c98ab49c6d3a16ad39738369ea48da59900d76d71c1e64de71fe79b \ + --hash=sha256:0393763d66f6f61715488d074a2cefac04aeb3ee281e36fb4925dd44deaf9e17 \ + --hash=sha256:049b0404792dcb942f1092bfdae5f819ef30445b0d174782e1909fbdd91bb48b \ + --hash=sha256:0abe1b44d361b948404b6b2ed80be2583e0077340572e071afa6e0eda4e1de30 \ + --hash=sha256:0def1dc09802a790e4a1b3cbc4401f0b53c58f273ce3671df9867f7bdf1fbe20 \ + --hash=sha256:0fdeda6272d60b1f6fb63f6a3dade55e274af62e1514d24a6549a12150c385cc \ + --hash=sha256:1541c334af5d42cb9eb03862a9b4d2cfbfc670fd05172ec51f3ce02d704550f1 \ + --hash=sha256:158749408ee19682b8a2a7e7135cced7f41d6f2f9de96088b1b1609858a6a158 \ + --hash=sha256:1751e92d56fbb623b937d73985e500b1a2b1053e56f718a6c564660d99bb9cb0 \ + --hash=sha256:1773001198030e16f946a7ff7760fc3ebd45b12150f66fd0f433780043dc13d8 \ + --hash=sha256:17a5ca9c197788a6424749a09a3dce824cb2c17b72f835f8a5e330935b973609 \ + --hash=sha256:1bbd7da16d8b2912cc56c9d0b85c4998a6cbf39b220f81c0d8c397c64672ae0e \ + --hash=sha256:2092ce156f92aff17e3345baba2b7c0c1701f32ba922c5de71bd6248fbe164e3 \ + --hash=sha256:21b62d45f327eb0802f842c132fda6d01a8376a8077922dc4dda69011c64d34a \ + --hash=sha256:21e38a011783d8afc8b9d79928e273d06f349b52ae84edf63ec18ad07f077484 \ + --hash=sha256:23e0940b7d73f405d92e98b2a05b93b16db163be13b7478bb19e1db2e486ade6 \ + --hash=sha256:24302bf47319a64e5c5c7c29e971d2b7a20a190c64e59035a3df9582dec636fa \ + --hash=sha256:243088c95e23b12db9f2cd7661d584a3f00814e087489f40cde7f9feac56b694 \ + --hash=sha256:2568b190075acd058513dca34f7fddc7252fc958c1591cb67a554338fc9a81b2 \ + --hash=sha256:2918547195ffb20118b829fdb8938e9dc92c9527fe6cbe58572594c96362880e \ + --hash=sha256:2f28a5a299d4cefd1066a6883d22600b9ae3606f881c3015d255784634647580 \ + --hash=sha256:34a4a0938eb30931baca56e55786c5a6871ac7aa891a38c8cabcdb7e49dab91b \ + --hash=sha256:350001f5573451150d919722ee095aa28bec037d6e23b86d7f04581a910fe924 \ + --hash=sha256:364f62d8024997536e57865cb1c8b36effad3249bf392a29a2379ea69db28238 \ + --hash=sha256:36c49d4e1769127461b609f110d91963790091ffcc2de401ac1d3b2f6a63bd54 \ + --hash=sha256:36f9ed6ae1069913e4f6e86d8233e119e83e00a20c54f88faf9c81292f2fecc0 \ + --hash=sha256:38b03c5439c6a7a952f56e3e6596dae44bc78c3fb6a69df46cabfb2f888e5f0c \ + --hash=sha256:3b2f3e44af4c6512dd73557621385a71b18094c8be81d60e5a8e73a8ce96b7f4 \ + --hash=sha256:3fce74add1099da1ea09473268950270071fd56773e2968604efb3ab1d240e02 \ + --hash=sha256:41b9f2821f0a105f88cd54ad03fe1392ec600618ffa8610f7c5e466ecd98c531 \ + --hash=sha256:42a56b0052ac11d9d0d87b1c94a1ce52e31914fd133f269585e0f63a4ed988f2 \ + --hash=sha256:42fff617cb0b08505d8123d71e6e7a8e54210d9007498f564855bd843ce984b1 \ + --hash=sha256:468f7e67cfbd8231f442af6726449efe46f2be0e5a57b44fba7ccd92c6f121c4 \ + --hash=sha256:4b1bae96f41806b14dd8bb1568d39b5e33b5af7fb27f7be36c78b8fa84708917 \ + --hash=sha256:4f31af62efd1fd0257735b72e6716b32d4f207654adeabfe524d44baf1bb6bed \ + --hash=sha256:4f96ccd9368ecbf6685d8f6981584ab72b4f0ffd20685e747737e7e340277b8d \ + --hash=sha256:4faa766450ef44d9eabed5b65a280f63f903d1e1ed6d2e278961eb22345ec49f \ + --hash=sha256:50920d66aaab60dbc6023c3035d55fbabfa58b6d205d0b39d47d820c4a7a13a8 \ + --hash=sha256:5307a8bd49158b57a0ca4e10950d31085aa35d9007e934047043ccc6d28eea97 \ + --hash=sha256:55684bc850059fc85ff8dc21a3e342b722d3178993c49ebdfdee8b698a432720 \ + --hash=sha256:56178c4116fc0c859786875ff4acc1c8d52678f095c312b0eff2a2dd9d6f8d5f \ + --hash=sha256:57c0e5b26d82bf31ab2b044781527b1b1a36e9ed400856b6aca5097eb1abb909 \ + --hash=sha256:586699b43066ca6038f96bd71d0eff0b6c292929e3d66ff63d5dc79d0f06d589 \ + --hash=sha256:588d309ce5c85448379556d72011b191c0414ee2e80d7c3f1ebe2ceb2d9027b1 \ + --hash=sha256:593dd4f24abeb3ed90222f98bc6eefcac68cd5aa96fc7745f93862a802952bce \ + --hash=sha256:59f816dc04e99627a5a6352ae51dfb30e603f2cb0b7009c91dc640c533def014 \ + --hash=sha256:5a07c644047f5abc268b4c39f8cb5a30e08a3c349228cb70142c7d3ed87587c0 \ + --hash=sha256:5a8403eef4a66743e339102fb3cdd8c8b9016b8bd67924685893d062c88896f9 \ + --hash=sha256:5d0b210c871486f5acb56d87bf00e3c5d83aab6a1ef3042629fa6ae0172fcf47 \ + --hash=sha256:5dbf9f18c8af11db719e67633be0af556d7d765bee0ca9419bd706fe4b7ed9fe \ + --hash=sha256:610e9f483ac53c5cc59c2d3687224029b54eb494feec2d40a2bcfdd187635192 \ + --hash=sha256:62a93a9d206a3580c975c3c1f65a869cd063844d016c004f8d786a9309b3c591 \ + --hash=sha256:62ec6568896e0abf258cbcd22c406c1c8bf27d16224b21bec8f75c4ae88a8173 \ + --hash=sha256:63263d64884688554fb025a3906c7b00573980cfee75f9afeb86239d577384bc \ + --hash=sha256:68421ba548f6d86c7dededd70bfe530b4faf67eb811c53c70a1be69438d3ce99 \ + --hash=sha256:6e1ec4176c3b56017745937dfd4a3ec6df55f7f0e66991124499f3f79f8f8d1f \ + --hash=sha256:70df7ff903aea05383298715ea53551c8f27c8f70cbe54ba7f05606cd822e7e4 \ + --hash=sha256:71061800a3c225e730f7997f8a7fad6e0d0dcbe36609cdc7e60576a099a2832b \ + --hash=sha256:718d05d4e078c7828f40ad3e310870fe4b837d93a32e7e8497a080c1f1040490 \ + --hash=sha256:732efbb50977ab7cf18f01d4c255834aeb14cb2425459f7bff681a1ba3a4ffa1 \ + --hash=sha256:74cbb6cbd74445ca279668790e0c10eccac0428fd79fe061fce6c9e3982ad3fe \ + --hash=sha256:753863dd4317ec8cc9eb3e6d9d01a8ef1a1726a8003b4354658d68a1ae05f9db \ + --hash=sha256:75b451ec5e64a1d4b803317f34710131742ff2e42f4bf5403f597d0af857d7d8 \ + --hash=sha256:779b6c74526596a86d38248dedaecfb7851bbaf319c234be042c57acddd2c8c4 \ + --hash=sha256:7987866a2569396e6765c54d643fd6a7b3b234e89ee8d45a3729a7b4b2726145 \ + --hash=sha256:79e8fc9c135ef628c45cb8aa5deef8d21de13d33bb4c59a859fa73d335ceb40a \ + --hash=sha256:7eee44c3f1f8acc220a743a5ed5588949a4f18b33df4cfbef2b1277470285401 \ + --hash=sha256:8447678b49412294801c9ea15ae31ea3bae7da65425268c92d40e032c38eac6f \ + --hash=sha256:84d2d38f7d163c4dec292f379e9de1960c661795442aca6c90d706436cb3749e \ + --hash=sha256:8ab9e74878172948e0426e3d27fba333fd6a1c3f9456d8e75643e8e6868ac1a1 \ + --hash=sha256:8ad8dad549cd1645be591a50b4573995ee7e018f6619ddc2bc6ea44b2ad9f694 \ + --hash=sha256:8b16e164205a90b1050d2f5469f8a7829db7698ad198c69e6aab6cbfb5648b87 \ + --hash=sha256:8f16bc5bb12f4c581b0f40facc28dbf286db32d1bf4e7e4f4c4e0f7f4e34ecf9 \ + --hash=sha256:8facaf0a16121ac82cc403a71399a061b74624c1ae2034eec9ed6169c5d16ecb \ + --hash=sha256:90874428bc6678b26434336c77931c9734ecebedf50132c179205e5a9908761d \ + --hash=sha256:92016718bcf3e6f35a6bd986880191a8da7a35aa1f5b1e97544582ef938464cf \ + --hash=sha256:9279f4be22bc3765dd9f61f5b4d38d9cb219d167bbd6f2e0ffa3368b1b71b4d1 \ + --hash=sha256:933f2d639eb81a3e1f145aec415453cc00983236629933f028d9507222583a2e \ + --hash=sha256:93502b3c762149a5904316ef52f0ed1ea721e0f4c8431f964f140ed15fa61926 \ + --hash=sha256:955d7878130dfc124d6a5343e1b87d2933244fe14a4a0a3e98787e8e660a8eb4 \ + --hash=sha256:980c81c2ec53ea9eb2227c14b3e6de35670b2de163b638f2a803e90a3bd5bbb0 \ + --hash=sha256:99e203d5c2a814facef78dcd993b0fb7a933124a3475a38979fc09cceae210b7 \ + --hash=sha256:a2b88f9f9fa52e1c34938ff1a18ee7fbffe482df0bb43c087a9a60578d273d68 \ + --hash=sha256:a3e8ee6386f6b68e2f818ccf422ccfafc59bcff10862b52c7819db3aa0352dfc \ + --hash=sha256:a7080928078ff56c07da393392f772054e93a39c8033dc9c04547bd949f9b614 \ + --hash=sha256:a8ee3965e01f10e4ff92ba1727626328ab7ba93bcd5674ff2b78ea1048ee0cea \ + --hash=sha256:ab3f95f737fc1b258b8210308fc02ce1442cf5950cf6d30b09ad89ab9e8afebd \ + --hash=sha256:ac223ea031905319a64d0df116979ae438b42d6265862a3d63c9f9808c2905a7 \ + --hash=sha256:ad3532291deedfdfcad3cf5d351d0076d646c68a0c63869a1bebf87c22159600 \ + --hash=sha256:ad9185366893714cd4514ae5e1a098227704fa395cb41a7855d75968ecedc826 \ + --hash=sha256:ae45853d25a23fba56681d2f9ed41f3e3f12f0a3b2393fefa08ff6406320a1f5 \ + --hash=sha256:af2b808a79bb04075e87c81a5b6179365b93f9a851f29dafd67abff72085d0c8 \ + --hash=sha256:b123f9d8702106f39dc3af63a031ca8b5279862a3747ec6c03ca49dbe78b71b9 \ + --hash=sha256:b1399f918aea8fb76ffa99b474c9b768accea1f079fde407ee538bec89f20fa7 \ + --hash=sha256:b916ff828d604d4311a5639b7b3da51eaea3923833ec3e300a5ee35eade99691 \ + --hash=sha256:b9be297ffe1015bfb2db4a23b6e1fec7e48361cf7c7b4f4f6bbdd008451b0a7b \ + --hash=sha256:bc87bd34239835c8d73171acd039e591cea0a2ca8615e6188044ad170a40fca1 \ + --hash=sha256:bd841dcf394ff261c26763a9d7be754176d4f1e6d26cb2a5d5331e91b6b56a5f \ + --hash=sha256:bdd70c2d9e73bca09fad54605dfeaae2b4e770b2800c65f5f5342901ed567b9f \ + --hash=sha256:c05b75ef3574c9ee4e05bbcf8513f7ccb155d426514be9efef5f6f53152d5f5c \ + --hash=sha256:c05d035e72530f6b00297941b0162218601542b76870c3bf2756bd87f16fc538 \ + --hash=sha256:c19500343957f254ecf3e60174f4a4cdd21690e0e1677740a8017d28ab2a2a4b \ + --hash=sha256:c21e6a6e4e6d32fb6acbc4f0fa69e8319cac0d65eeaa8298d757371cc2a9c687 \ + --hash=sha256:c2b246fa7cbdf9918488d1542a82bbb928cf71bcba66905c24131981e759ff0b \ + --hash=sha256:c2e97985641fe53ad7824d1b5bfeb7990a5ff788c4559ee44d7522642560ddc2 \ + --hash=sha256:c3ae59461625518449f800acc4f874753ae96fcf993c47a27be07beb651371fd \ + --hash=sha256:c4abc425789f8540e86ca4cfdbc8dc650433cc2ac7c6136fee9bcb29d5665a02 \ + --hash=sha256:cb4fcaabb28cabf21396a9b816b9afe091f8c776805fdf03e2cbc606b64dfa7c \ + --hash=sha256:cbce1b5a2a88a465d7865df61b7e4f8829ddc49b4fa841e9b241815c9d67c3b2 \ + --hash=sha256:cf150693a51ca21e8288cd08a9de05e5ab331776dfcfd0537b14523338f0502a \ + --hash=sha256:cf81432281af66ba3285b26b09c2d478d84730dc50ff90926c1bdcef54048a33 \ + --hash=sha256:d01029d54ff1f45c195b1f7e6fbf6e58fb7e7e12cda9a6e639570d9c581decb2 \ + --hash=sha256:d06dbbfe8da01a0574de27afc19915bb3e7dddfbd184bb97e958f94051d8531b \ + --hash=sha256:d14d04058923d526a552fc3ebe8b0b0353c19516431cee196502b53119278fd9 \ + --hash=sha256:d187f43d1c5b844adc871c5b8c22b4aa12a116aaca4e9bd1521bc9ce479aae1f \ + --hash=sha256:d1d084e92d0f4a096a5155b23d1ac603db8073ef98a3d1384badf1455e5ae742 \ + --hash=sha256:d8354fbbe2abf0fb724b9303bef43bfd9b7a2779332813fa6d6559983954e7d8 \ + --hash=sha256:dcbd1fe5083315243447c13f7252ae9fe9d128b1ae2857e3a916c609235dd863 \ + --hash=sha256:dec0dafc116ac29a84d143fdbc3b83fdb5d4ed339276be2251154537ab30e14d \ + --hash=sha256:e15bb1535f68a27f28e579ba3a8f74e7b05d350c45f5622b76a311d5a19ae48a \ + --hash=sha256:e41f9d1d9240e8e0d8a670ad3e66c0c00f0b1f7150a31bc6c445a4f87c1cb3ba \ + --hash=sha256:e58acd43ac8d3905659c1d5309318dd576243e723dd7c3b5dd4f555479b77d4b \ + --hash=sha256:eadf95aab7301ac651628f097e521d742d0fb5f732155ebfd00d07933045d81c \ + --hash=sha256:ec786cb9d597dd75d993f8c1273e31bb2114c9bc22f67fba611e654e8347701b \ + --hash=sha256:ed557fa2744617eac3e34dd39b85037efbf23cd33f06851c00fdb8f18ad8f4c2 \ + --hash=sha256:ee9913fa2b5bfa6111c11158cf481bb13544f8bd5d10382fb6ee2612b16fcf28 \ + --hash=sha256:f0af2d2f745ec00a6616c4dfba4477f9156ccfb45690f6ffa5fd34f42e871ed4 \ + --hash=sha256:f12d9690634414fc04b1a7072fdc35c34a9242232c1851fe4518383578bb09d4 \ + --hash=sha256:f187030fc3d62c668feb0f09e92852e0eb414d7fcefc4748f2e67d245aade37e \ + --hash=sha256:f3abcabb04503023e1053add24472e78878de0bfd5c8a93686be01f4032c363c \ + --hash=sha256:f44107b5fdfecc03438feb165431652c8006650471326e53dd86d4c19124f5c5 \ + --hash=sha256:f517a417cd02aa8fb05b603a0ac6d87b7b004c3ba4fcd279cad25cab7229043b \ + --hash=sha256:f8cc61ad94215ab98e5cbcdea2cfde45e11bb0136ee980e1240b721635e55790 \ + --hash=sha256:f8df36f964c21168e345f914855e3b428e2cb6e1f739c8ef5963b77d86dd84ae + # via pydantic +pygments==2.21.0 \ + --hash=sha256:2363c69b61c4a97c838da3b130dcd6468f4848992b21a82f2a63ec34377137d9 \ + --hash=sha256:610ca751c9bc2492b38eb9a38a7fbc93edbbb2d7182edaf34e66ae493dee5c8c + # via + # ipython + # pytest + # rich +pyparsing==3.3.3 \ + --hash=sha256:928ae7e20211f3b6f3915a72f06a0cfd29ab9d24279dd6346b6b1a7146397d36 \ + --hash=sha256:ece8c00a69cf01b45d0b1dedabb469c90d8caf996d4fda40f147627a122849a4 + # via matplotlib +pytest==9.1.1 \ + --hash=sha256:1088fbde8f2b49d95a549a195707afa7a76a3ce9bcadc26b6d71f0ffda5fe313 \ + --hash=sha256:37a86b45efb9a47a61a36449063e8e18d0cab3161329fc099eb21783169c4f0c + # via policyengine-core +python-dateutil==2.9.0.post0 \ + --hash=sha256:37dd54208da7e1cd875388217d5e00ebd4179249f90fb72437e91a35459a0ad3 \ + --hash=sha256:a8b2bc7bffae282281c8140a97d3aa9c14da0b136dfe83f850eea9a5f7470427 + # via + # matplotlib + # pandas +pyvis==0.3.2 \ + --hash=sha256:5720c4ca8161dc5d9ab352015723abb7a8bb8fb443edeb07f7a322db34a97555 + # via policyengine-core +pyyaml==6.0.3 \ + --hash=sha256:00c4bdeba853cc34e7dd471f16b4114f4162dc03e6b7afcc2128711f0eca823c \ + --hash=sha256:0150219816b6a1fa26fb4699fb7daa9caf09eb1999f3b70fb6e786805e80375a \ + --hash=sha256:02893d100e99e03eda1c8fd5c441d8c60103fd175728e23e431db1b589cf5ab3 \ + --hash=sha256:02ea2dfa234451bbb8772601d7b8e426c2bfa197136796224e50e35a78777956 \ + --hash=sha256:0f29edc409a6392443abf94b9cf89ce99889a1dd5376d94316ae5145dfedd5d6 \ + --hash=sha256:10892704fc220243f5305762e276552a0395f7beb4dbf9b14ec8fd43b57f126c \ + --hash=sha256:16249ee61e95f858e83976573de0f5b2893b3677ba71c9dd36b9cf8be9ac6d65 \ + --hash=sha256:1d37d57ad971609cf3c53ba6a7e365e40660e3be0e5175fa9f2365a379d6095a \ + --hash=sha256:1ebe39cb5fc479422b83de611d14e2c0d3bb2a18bbcb01f229ab3cfbd8fee7a0 \ + --hash=sha256:214ed4befebe12df36bcc8bc2b64b396ca31be9304b8f59e25c11cf94a4c033b \ + --hash=sha256:2283a07e2c21a2aa78d9c4442724ec1eb15f5e42a723b99cb3d822d48f5f7ad1 \ + --hash=sha256:22ba7cfcad58ef3ecddc7ed1db3409af68d023b7f940da23c6c2a1890976eda6 \ + --hash=sha256:27c0abcb4a5dac13684a37f76e701e054692a9b2d3064b70f5e4eb54810553d7 \ + --hash=sha256:28c8d926f98f432f88adc23edf2e6d4921ac26fb084b028c733d01868d19007e \ + --hash=sha256:2e71d11abed7344e42a8849600193d15b6def118602c4c176f748e4583246007 \ + --hash=sha256:34d5fcd24b8445fadc33f9cf348c1047101756fd760b4dacb5c3e99755703310 \ + --hash=sha256:37503bfbfc9d2c40b344d06b2199cf0e96e97957ab1c1b546fd4f87e53e5d3e4 \ + --hash=sha256:3c5677e12444c15717b902a5798264fa7909e41153cdf9ef7ad571b704a63dd9 \ + --hash=sha256:3ff07ec89bae51176c0549bc4c63aa6202991da2d9a6129d7aef7f1407d3f295 \ + --hash=sha256:41715c910c881bc081f1e8872880d3c650acf13dfa8214bad49ed4cede7c34ea \ + --hash=sha256:418cf3f2111bc80e0933b2cd8cd04f286338bb88bdc7bc8e6dd775ebde60b5e0 \ + --hash=sha256:44edc647873928551a01e7a563d7452ccdebee747728c1080d881d68af7b997e \ + --hash=sha256:4a2e8cebe2ff6ab7d1050ecd59c25d4c8bd7e6f400f5f82b96557ac0abafd0ac \ + --hash=sha256:4ad1906908f2f5ae4e5a8ddfce73c320c2a1429ec52eafd27138b7f1cbe341c9 \ + --hash=sha256:501a031947e3a9025ed4405a168e6ef5ae3126c59f90ce0cd6f2bfc477be31b7 \ + --hash=sha256:5190d403f121660ce8d1d2c1bb2ef1bd05b5f68533fc5c2ea899bd15f4399b35 \ + --hash=sha256:5498cd1645aa724a7c71c8f378eb29ebe23da2fc0d7a08071d89469bf1d2defb \ + --hash=sha256:5cf4e27da7e3fbed4d6c3d8e797387aaad68102272f8f9752883bc32d61cb87b \ + --hash=sha256:5e0b74767e5f8c593e8c9b5912019159ed0533c70051e9cce3e8b6aa699fcd69 \ + --hash=sha256:5ed875a24292240029e4483f9d4a4b8a1ae08843b9c54f43fcc11e404532a8a5 \ + --hash=sha256:5fcd34e47f6e0b794d17de1b4ff496c00986e1c83f7ab2fb8fcfe9616ff7477b \ + --hash=sha256:5fdec68f91a0c6739b380c83b951e2c72ac0197ace422360e6d5a959d8d97b2c \ + --hash=sha256:6344df0d5755a2c9a276d4473ae6b90647e216ab4757f8426893b5dd2ac3f369 \ + --hash=sha256:64386e5e707d03a7e172c0701abfb7e10f0fb753ee1d773128192742712a98fd \ + --hash=sha256:652cb6edd41e718550aad172851962662ff2681490a8a711af6a4d288dd96824 \ + --hash=sha256:66291b10affd76d76f54fad28e22e51719ef9ba22b29e1d7d03d6777a9174198 \ + --hash=sha256:66e1674c3ef6f541c35191caae2d429b967b99e02040f5ba928632d9a7f0f065 \ + --hash=sha256:6adc77889b628398debc7b65c073bcb99c4a0237b248cacaf3fe8a557563ef6c \ + --hash=sha256:79005a0d97d5ddabfeeea4cf676af11e647e41d81c9a7722a193022accdb6b7c \ + --hash=sha256:7c6610def4f163542a622a73fb39f534f8c101d690126992300bf3207eab9764 \ + --hash=sha256:7f047e29dcae44602496db43be01ad42fc6f1cc0d8cd6c83d342306c32270196 \ + --hash=sha256:8098f252adfa6c80ab48096053f512f2321f0b998f98150cea9bd23d83e1467b \ + --hash=sha256:850774a7879607d3a6f50d36d04f00ee69e7fc816450e5f7e58d7f17f1ae5c00 \ + --hash=sha256:8d1fab6bb153a416f9aeb4b8763bc0f22a5586065f86f7664fc23339fc1c1fac \ + --hash=sha256:8da9669d359f02c0b91ccc01cac4a67f16afec0dac22c2ad09f46bee0697eba8 \ + --hash=sha256:8dc52c23056b9ddd46818a57b78404882310fb473d63f17b07d5c40421e47f8e \ + --hash=sha256:9149cad251584d5fb4981be1ecde53a1ca46c891a79788c0df828d2f166bda28 \ + --hash=sha256:93dda82c9c22deb0a405ea4dc5f2d0cda384168e466364dec6255b293923b2f3 \ + --hash=sha256:96b533f0e99f6579b3d4d4995707cf36df9100d67e0c8303a0c55b27b5f99bc5 \ + --hash=sha256:9c57bb8c96f6d1808c030b1687b9b5fb476abaa47f0db9c0101f5e9f394e97f4 \ + --hash=sha256:9c7708761fccb9397fe64bbc0395abcae8c4bf7b0eac081e12b809bf47700d0b \ + --hash=sha256:9f3bfb4965eb874431221a3ff3fdcddc7e74e3b07799e0e84ca4a0f867d449bf \ + --hash=sha256:a33284e20b78bd4a18c8c2282d549d10bc8408a2a7ff57653c0cf0b9be0afce5 \ + --hash=sha256:a80cb027f6b349846a3bf6d73b5e95e782175e52f22108cfa17876aaeff93702 \ + --hash=sha256:b30236e45cf30d2b8e7b3e85881719e98507abed1011bf463a8fa23e9c3e98a8 \ + --hash=sha256:b3bc83488de33889877a0f2543ade9f70c67d66d9ebb4ac959502e12de895788 \ + --hash=sha256:b865addae83924361678b652338317d1bd7e79b1f4596f96b96c77a5a34b34da \ + --hash=sha256:b8bb0864c5a28024fac8a632c443c87c5aa6f215c0b126c449ae1a150412f31d \ + --hash=sha256:ba1cc08a7ccde2d2ec775841541641e4548226580ab850948cbfda66a1befcdc \ + --hash=sha256:bdb2c67c6c1390b63c6ff89f210c8fd09d9a1217a465701eac7316313c915e4c \ + --hash=sha256:c1ff362665ae507275af2853520967820d9124984e0f7466736aea23d8611fba \ + --hash=sha256:c2514fceb77bc5e7a2f7adfaa1feb2fb311607c9cb518dbc378688ec73d8292f \ + --hash=sha256:c3355370a2c156cffb25e876646f149d5d68f5e0a3ce86a5084dd0b64a994917 \ + --hash=sha256:c458b6d084f9b935061bc36216e8a69a7e293a2f1e68bf956dcd9e6cbcd143f5 \ + --hash=sha256:d0eae10f8159e8fdad514efdc92d74fd8d682c933a6dd088030f3834bc8e6b26 \ + --hash=sha256:d76623373421df22fb4cf8817020cbb7ef15c725b9d5e45f17e189bfc384190f \ + --hash=sha256:ebc55a14a21cb14062aa4162f906cd962b28e2e9ea38f9b4391244cd8de4ae0b \ + --hash=sha256:eda16858a3cab07b80edaf74336ece1f986ba330fdb8ee0d6c0d68fe82bc96be \ + --hash=sha256:ee2922902c45ae8ccada2c5b501ab86c36525b883eff4255313a253a3160861c \ + --hash=sha256:efd7b85f94a6f21e4932043973a7ba2613b059c4a000551892ac9f1d11f5baf3 \ + --hash=sha256:f7057c9a337546edc7973c0d3ba84ddcdf0daa14533c2065749c9075001090e6 \ + --hash=sha256:fa160448684b4e94d80416c0fa4aac48967a969efe22931448d853ada8baf926 \ + --hash=sha256:fc09d0aa354569bc501d4e787133afc08552722d3ab34836a80547331bb5d4a0 + # via + # policyengine-taxsim (pyproject.toml) + # huggingface-hub +requests==2.34.2 \ + --hash=sha256:2a0d60c172f83ac6ab31e4554906c0f3b3588d37b5cb939b1c061f4907e278e0 \ + --hash=sha256:f288924cae4e29463698d6d60bc6a4da69c89185ad1e0bcc4104f584e960b9ed + # via + # census + # policyengine-core + # spm-calculator +rich==15.0.0 \ + --hash=sha256:33bd4ef74232fb73fe9279a257718407f169c09b78a87ad3d296f548e27de0bb \ + --hash=sha256:edd07a4824c6b40189fb7ac9bc4c52536e9780fbbfbddf6f1e2502c31b068c36 + # via blosc2 +six==1.17.0 \ + --hash=sha256:4721f391ed90541fddacab5acf947aa0d3dc7d27b2e1e8eda2be8970586c3274 \ + --hash=sha256:ff70335d468e7eb6ec65b95b99d3a2836546063f63acc5171de367e834932a81 + # via python-dateutil +sortedcontainers==2.4.0 \ + --hash=sha256:25caa5a06cc30b6b83d11423433f65d1f9d76c4c6a0c90e3379eaa43b9bfdb88 \ + --hash=sha256:a163dcaede0f1c021485e957a39245190e74249897e2ae4b2aa38595db237ee0 + # via policyengine-core +spm-calculator==1.0.0.post1 \ + --hash=sha256:a9f99ce9a490989c40fa9a7d1bcd16dd544036e4788a0b3af4d170156ef9a168 \ + --hash=sha256:c9834a761891ba12de1edd585688c8b477be58e9a9c9fa92d9cfdf41e5396a41 + # via policyengine-us +stack-data==0.6.3 \ + --hash=sha256:836a778de4fec4dcd1dcd89ed8abff8a221f58308462e1c4aa2a3cf30148f0b9 \ + --hash=sha256:d5558e0c25a4cb0853cddad3d77da9891a08cb85dd9f9f91b9f8cd66e511e695 + # via ipython +standard-imghdr==3.13.0 \ + --hash=sha256:30a1bff5465605bb496f842a6ac3cc1f2131bf3025b0da28d4877d6d4b7cc8e9 \ + --hash=sha256:8d9c68058d882f6fc3542a8d39ef9ff94d2187dc90bd0c851e0902776b7b7a42 + # via policyengine-core +tables==3.11.1 \ + --hash=sha256:1e78fe190fdeb4afe430b79651bae2a4f341904eb85aa8dbafe5f1caee1c7f67 \ + --hash=sha256:3a9c35f87fcb6a48c79fbc4e3ab15ca8f6053c4ce13063d6ca2ec36cbb58f40f \ + --hash=sha256:4cf3218b76ba78d156d6ee75c19fb757d50682f6c7b4905370441afbfc9d77f3 \ + --hash=sha256:56bf6fb9132ead989b7e76695d7613d6d08f071a8019038d6565ba90c66b9f3e \ + --hash=sha256:78abcf413091bc7c1e4e8c10fbbb438d1ac0b5a87436c5b972c3e8253871b6fb \ + --hash=sha256:7fa6cb03f6fe55ae4f85e89ec5450e5c40cc4c52d8c3b60eb157a445c2219e89 \ + --hash=sha256:a4bbd95036a4d0cc5c86c1f87fbb490b4c53cd70982f1c01b3ed6dcb3085cbb9 \ + --hash=sha256:a6f7a3b82dbf0ae0f30de635ca88bb42dd87938b0950369d0ee4289c52ae6de2 \ + --hash=sha256:e3cfe79484351f7216eb8f3767bfa1217bfd271b04428f79cfa7ef6d7491919d \ + --hash=sha256:eb30684c42a77bbecdef2b9c763c4372b0ddc9cc5bd8b2a2055f2042eee67217 \ + --hash=sha256:f0367d2e3df0f10ea63ccf4279f3fe58e32ec481767320301a483e2b3cd83efc + # via policyengine-us +tenacity==9.2.1 \ + --hash=sha256:9e56f17539296baab7beabb08b92f6ee3d7be92d8be72d763360677c2ad6580e \ + --hash=sha256:a606b5c808d0cded4a359d5b9932d867ff2a6a6b64d37350260fd01bbdf83839 + # via plotly +threadpoolctl==3.7.0 \ + --hash=sha256:61348cfb77d53b9242e0017029244b559b810c142ced65b4e21eeca1843959a7 \ + --hash=sha256:cd8b60b5641b45c67bbf73c64c843235fc2d8a480c87389f52f5dbee893b86be + # via blosc2 +tqdm==4.70.1 \ + --hash=sha256:c293e525e6fef9c20e8728fd4612df02a0aa31bb5fe91ecd93e123b1b7bffa73 \ + --hash=sha256:cefd0eca11b2a37a3aee776544d4f4ae913f02688135b5556b8788dfa474afc4 + # via + # policyengine-taxsim (pyproject.toml) + # huggingface-hub + # policyengine-us +traitlets==5.16.1 \ + --hash=sha256:ed900c2b631aa3a112811139fa97b8d2c3bad5e989656bba4b7e52c7852c18c1 \ + --hash=sha256:f775618166caa0396c8e337099240f2bd3e5e917d203b2e6fbe21a58d3cb1f6b + # via + # ipython + # matplotlib-inline +truststore==0.10.4 \ + --hash=sha256:9d91bd436463ad5e4ee4aba766628dd6cd7010cf3e2461756b3303710eebc301 \ + --hash=sha256:adaeaecf1cbb5f4de3b1959b42d41f6fab57b2b1666adb59e89cb0b53361d981 + # via + # httpcore2 + # httpx2 +typing-extensions==4.16.0 \ + --hash=sha256:481caa481374e813c1b176ada14e97f1f67a4539ce9cfeb3f350d78d6370c2e8 \ + --hash=sha256:dc983d19a509c94dba722ee6abd33940f7c05a89e243c47e907eb4db6f1a43e5 + # via + # anyio + # huggingface-hub + # pydantic + # pydantic-core + # typing-inspection +typing-inspection==0.4.4 \ + --hash=sha256:547274fa6b0a561ccf549cc9524b999a578e737d015d8709d021f9d0d13bea47 \ + --hash=sha256:65b8397ba37ccbce054456aaccddfc91e6e3083c92824df348d96ca832f3f147 + # via pydantic +urllib3==2.8.0 \ + --hash=sha256:0cf3cae568d36aa9576b28dfb35f11328f1cb974ca7647d9475ebb86c75ac6e3 \ + --hash=sha256:63bf2ead4c879426ebf22ef2a781eeb4aa3b4ae798a0435506f8687fd5bb9b63 + # via requests +us==4.0.0 \ + --hash=sha256:3e7dd072efc65ecc6f765ced861f49fe7635067e760bbe2a527f16e5477011c0 \ + --hash=sha256:7dd4c4e603c9427b72d7e07be700d8f643bdcd7f5195a12bc639f1b7e38e7496 + # via spm-calculator +wcwidth==0.9.2 \ + --hash=sha256:0a47e03d8293590ecce66c45dc20ff7b4b885e3c78093722239585eca0d77ab2 \ + --hash=sha256:0cd4f7f2e53905dcb110d213a4c8529b6733fa3d232d8c717f946cc69a10349b \ + --hash=sha256:138e1f8898e431b2f2d7881f8ca8d75591c1d3c21aa53f54e989bd6b39811da2 \ + --hash=sha256:196b47cf32f9df27ccda6dc513237f3c2429c4c659db428d60a5bc443d10f270 \ + --hash=sha256:1bf361c8705576760623b4724ae564666d73b016f9a778bcfd1c7345378ef4ec \ + --hash=sha256:2a9746de704242bd4fdaabb31dd46b82f694a56a8d21081ad89b679a89da9fec \ + --hash=sha256:33df042f96c61ed3cd5fb3742fba427553a635bc578799857a48aa79f774a0b9 \ + --hash=sha256:42dbcb76ce8af39e2c9db410ac3f9bdf4e47eb41d6f44525952f172d3d98f724 \ + --hash=sha256:48719a9bc76c2f84238693fe5013571fa5beffa3621cf228f1f3a9e30dae84b8 \ + --hash=sha256:5175609bf8cc7398a5f48aa35207bd64ebf9f45e4c70df65f7fdc7a988041a3c \ + --hash=sha256:59dab4049cbd982b478bca098528df2c79a9160636a3a163ffebffcbd7d1b892 \ + --hash=sha256:674b518af28d38ee645ff97b74f5760abee5fad4bac74413bfc4b881ef2ce724 \ + --hash=sha256:67d901a4ad99249eb775b4ee4769ca97fa405d35a75f46e83166910a47003f04 \ + --hash=sha256:734aa9405b321d1042301aa19c943c4731ee9e3460e4f8feea3299c064c97a14 \ + --hash=sha256:751bef0ab404b6a1dc028b56b4b85d46486be1c55833f80da533e42dc691f389 \ + --hash=sha256:7ef5a940bd5e30bac6e721f1a48fce0cd7bb3ece19e9c5d139e72c76c35cfd07 \ + --hash=sha256:89ca642c5bf0101157a09366be69fad0379db1f700ae39a920e103234573670e \ + --hash=sha256:8b4e381590b9b7390e07e22b2c0c1bb96ce50e1d2243c866d9387600362d51ed \ + --hash=sha256:97b878d1e158da5ed9ac5aac53fa3a55e282103af6a09ec353865613d1a31a76 \ + --hash=sha256:9e542f1f8475b78452a295495d7a5bc3ead565112e9446a64dc93462a41c2a79 \ + --hash=sha256:ae0800c5339423cc53d33a266ad264b42ba8aaa16d4464f6e6b1bee607f50b17 \ + --hash=sha256:ae0ef90b90f6af38b54f1fe6d58662ec33b3cb4b8391958a62416d654231727b \ + --hash=sha256:b9c6ab615e03723b7f8760ea2f27758d656e7e13b51515c9dca5c3e8b04612fa \ + --hash=sha256:bb08ceb501d6aaf94066c3ee122dd825b152df40ff0bd0df4dc27126233b948e \ + --hash=sha256:c3d80f39ba4653a595edae9aa46a509d14883790a8fc23c5db221ceb207f64b7 \ + --hash=sha256:e5f669ae8c3d969c72032f9cdee019674b666e522d45e1e2099a2e9dda4a341d \ + --hash=sha256:eda88ffdc97c0fbf193d407114f2c7a54b379f67f6e52a7531ee3b9fe749eca7 \ + --hash=sha256:ee1fd0db9d9fd711a70f3e7765e0e04c05d26982fa05361456163062549d7da4 \ + --hash=sha256:f2f7b3bba5a5d5f31fc350fd36ce5b84b693c83b7eb95ee630b720da5a5ce06f + # via prompt-toolkit +wheel==0.48.0 \ + --hash=sha256:3217dcc807155e45db462d7ef2431f5ddda0d7273b700d05a67b271ceb1287ab \ + --hash=sha256:94800765601e9171bf5d58d066e640662842bcedcbab982b2c90787a2c987322 + # via policyengine-core diff --git a/docs/dependencies/snapshot.json b/docs/dependencies/snapshot.json new file mode 100644 index 000000000..3f4c61927 --- /dev/null +++ b/docs/dependencies/snapshot.json @@ -0,0 +1,1400 @@ +{ + "exclude_newer": "2026-10-09T19:00:00Z", + "licenses": { + "annotated-types": "MIT", + "anyio": "MIT", + "asttokens": "Apache 2.0", + "blosc2": "BSD-3-Clause", + "census": "BSD", + "certifi": "MPL-2.0", + "charset-normalizer": "MIT", + "click": "BSD-3-Clause", + "colorama": "BSD License", + "contourpy": "BSD-style (full text in metadata)", + "cycler": "BSD-style (full text in metadata)", + "decorator": "BSD-2-Clause", + "dpath": "MIT", + "et-xmlfile": "MIT", + "exceptiongroup": "MIT License", + "executing": "MIT", + "filelock": "MIT", + "fonttools": "MIT", + "fsspec": "BSD-3-Clause", + "h11": "MIT", + "h2": "MIT", + "h5py": "BSD-3-Clause", + "hf-xet": "Apache-2.0", + "hpack": "MIT", + "httpcore": "BSD-3-Clause", + "httpcore2": "BSD-3-Clause", + "httpx": "BSD-3-Clause", + "httpx2": "BSD-3-Clause", + "huggingface-hub": "Apache-2.0", + "hyperframe": "MIT-style (full text in metadata)", + "idna": "BSD-3-Clause", + "iniconfig": "MIT", + "ipython": "BSD-3-Clause", + "jedi": "MIT", + "jellyfish": "MIT License", + "jinja2": "BSD License", + "jsonpickle": "BSD-3-Clause", + "kiwisolver": "BSD-style (full text in metadata)", + "markdown-it-py": "MIT License", + "markupsafe": "BSD-3-Clause", + "matplotlib": "MIT-style (full text in metadata)", + "matplotlib-inline": "BSD-3-Clause", + "mdurl": "MIT License", + "microdf-python": "MIT", + "msgpack": "Apache-2.0", + "ndindex": "MIT", + "networkx": "BSD License", + "numexpr": "MIT", + "numpy": "BSD-style (full text in metadata)", + "openpyxl": "MIT", + "packaging": "Apache-2.0 OR BSD-2-Clause", + "pandas": "BSD-style (full text in metadata)", + "parso": "MIT", + "pexpect": "ISC license", + "pillow": "MIT-CMU", + "plotly": "MIT", + "pluggy": "MIT", + "policyengine-core": "GNU Affero General Public License v3", + "policyengine-us": "GNU Affero General Public License v3", + "prompt-toolkit": "BSD License", + "psutil": "BSD-3-Clause", + "ptyprocess": "ISC License (ISCL)", + "pure-eval": "MIT", + "py-cpuinfo": "MIT", + "pydantic": "MIT", + "pydantic-core": "MIT", + "pygments": "BSD-2-Clause", + "pyparsing": "MIT", + "pytest": "MIT", + "python-dateutil": "Dual License", + "pytz": "MIT", + "pyvis": "BSD", + "pyyaml": "MIT", + "requests": "Apache-2.0", + "rich": "MIT", + "six": "MIT", + "sortedcontainers": "Apache 2.0", + "spm-calculator": "MIT", + "stack-data": "MIT", + "standard-imghdr": "PSF-2.0", + "tables": "BSD 3-Clause License", + "tenacity": "Apache-2.0", + "threadpoolctl": "BSD-3-Clause", + "tomli": "MIT", + "tqdm": "MPL-2.0 AND MIT", + "traitlets": "BSD-style (full text in metadata)", + "truststore": "MIT", + "typing-extensions": "PSF-2.0", + "typing-inspection": "MIT", + "tzdata": "Apache-2.0", + "urllib3": "MIT", + "us": "BSD-style (full text in metadata)", + "wcwidth": "MIT License", + "wheel": "MIT" + }, + "linux": { + "3.10": { + "annotated-types": "0.8.0", + "anyio": "4.15.1", + "asttokens": "3.0.2", + "blosc2": "4.3.3", + "census": "0.8.27", + "certifi": "2026.7.22", + "charset-normalizer": "3.5.2", + "click": "8.5.0", + "contourpy": "1.3.2", + "cycler": "0.12.1", + "decorator": "5.3.1", + "dpath": "2.2.0", + "et-xmlfile": "2.0.0", + "exceptiongroup": "1.3.1", + "executing": "2.2.1", + "filelock": "4.0.12", + "fonttools": "4.65.0", + "fsspec": "2026.9.0", + "h11": "0.16.0", + "h5py": "3.16.0", + "hf-xet": "1.7.0", + "httpcore2": "2.13.1", + "httpx2": "2.13.1", + "huggingface-hub": "2.2.0", + "idna": "3.20", + "iniconfig": "2.3.1", + "ipython": "8.39.0", + "jedi": "0.20.0", + "jellyfish": "1.2.1", + "jinja2": "3.1.6", + "jsonpickle": "4.1.3", + "kiwisolver": "1.5.1", + "markupsafe": "3.0.4", + "matplotlib": "3.10.9", + "matplotlib-inline": "0.2.2", + "microdf-python": "1.5.11", + "msgpack": "1.2.3", + "ndindex": "1.10.1", + "networkx": "3.4.2", + "numexpr": "2.14.1", + "numpy": "2.2.6", + "openpyxl": "3.1.5", + "packaging": "26.3", + "pandas": "2.3.3", + "parso": "0.8.7", + "pexpect": "4.9.0", + "pillow": "12.3.0", + "plotly": "5.24.1", + "pluggy": "1.6.0", + "policyengine-core": "3.31.1", + "policyengine-us": "1.783.0", + "prompt-toolkit": "3.0.53", + "psutil": "6.1.1", + "ptyprocess": "0.7.0", + "pure-eval": "0.2.4", + "py-cpuinfo": "9.0.0", + "pydantic": "2.14.0", + "pydantic-core": "2.50.0", + "pygments": "2.21.0", + "pyparsing": "3.3.3", + "pytest": "8.4.2", + "python-dateutil": "2.9.0.post0", + "pytz": "2026.5", + "pyvis": "0.3.2", + "pyyaml": "6.0.3", + "requests": "2.34.2", + "six": "1.17.0", + "sortedcontainers": "2.4.0", + "spm-calculator": "0.3.1", + "stack-data": "0.6.3", + "standard-imghdr": "3.13.0", + "tables": "3.10.1", + "tenacity": "9.2.1", + "threadpoolctl": "3.7.0", + "tomli": "2.5.0", + "tqdm": "4.70.1", + "traitlets": "5.16.1", + "truststore": "0.10.4", + "typing-extensions": "4.16.0", + "typing-inspection": "0.4.4", + "tzdata": "2026.5", + "urllib3": "2.8.0", + "us": "4.0.0", + "wcwidth": "0.9.2", + "wheel": "0.48.0" + }, + "3.11": { + "annotated-types": "0.8.0", + "anyio": "4.15.1", + "asttokens": "3.0.2", + "blosc2": "4.14.1", + "census": "0.8.27", + "certifi": "2026.7.22", + "charset-normalizer": "3.5.2", + "click": "8.5.0", + "contourpy": "1.3.3", + "cycler": "0.12.1", + "decorator": "5.3.1", + "dpath": "2.2.0", + "et-xmlfile": "2.0.0", + "executing": "2.2.1", + "filelock": "4.0.12", + "fonttools": "4.66.1", + "fsspec": "2026.9.0", + "h11": "0.16.0", + "h2": "4.4.1", + "h5py": "3.16.0", + "hf-xet": "1.7.0", + "hpack": "4.2.0", + "httpcore": "1.0.9", + "httpcore2": "2.13.1", + "httpx": "0.28.1", + "httpx2": "2.13.1", + "huggingface-hub": "2.2.0", + "hyperframe": "6.1.0", + "idna": "3.20", + "iniconfig": "2.3.1", + "ipython": "8.39.0", + "jedi": "0.20.0", + "jellyfish": "1.2.1", + "jinja2": "3.1.6", + "jsonpickle": "4.1.3", + "kiwisolver": "1.5.1", + "markdown-it-py": "4.2.0", + "markupsafe": "3.0.4", + "matplotlib": "3.11.2", + "matplotlib-inline": "0.2.2", + "mdurl": "0.1.2", + "microdf-python": "1.5.11", + "msgpack": "1.2.3", + "ndindex": "1.10.1", + "networkx": "3.6.1", + "numexpr": "2.14.2", + "numpy": "2.4.6", + "openpyxl": "3.1.5", + "packaging": "26.3", + "pandas": "3.0.6", + "parso": "0.8.7", + "pexpect": "4.9.0", + "pillow": "12.3.0", + "plotly": "5.24.1", + "pluggy": "1.6.0", + "policyengine-core": "3.32.29", + "policyengine-us": "2.38.1", + "prompt-toolkit": "3.0.53", + "psutil": "6.1.1", + "ptyprocess": "0.7.0", + "pure-eval": "0.2.4", + "py-cpuinfo": "9.0.0", + "pydantic": "2.14.0", + "pydantic-core": "2.50.0", + "pygments": "2.21.0", + "pyparsing": "3.3.3", + "pytest": "9.1.1", + "python-dateutil": "2.9.0.post0", + "pyvis": "0.3.2", + "pyyaml": "6.0.3", + "requests": "2.34.2", + "rich": "15.0.0", + "six": "1.17.0", + "sortedcontainers": "2.4.0", + "spm-calculator": "1.0.0.post1", + "stack-data": "0.6.3", + "standard-imghdr": "3.13.0", + "tables": "3.11.1", + "tenacity": "9.2.1", + "threadpoolctl": "3.7.0", + "tqdm": "4.70.1", + "traitlets": "5.16.1", + "truststore": "0.10.4", + "typing-extensions": "4.16.0", + "typing-inspection": "0.4.4", + "urllib3": "2.8.0", + "us": "4.0.0", + "wcwidth": "0.9.2", + "wheel": "0.48.0" + }, + "3.12": { + "annotated-types": "0.8.0", + "anyio": "4.15.1", + "asttokens": "3.0.2", + "blosc2": "4.14.1", + "census": "0.8.27", + "certifi": "2026.7.22", + "charset-normalizer": "3.5.2", + "click": "8.5.0", + "contourpy": "1.4.0", + "cycler": "0.12.1", + "decorator": "5.3.1", + "dpath": "2.2.0", + "et-xmlfile": "2.0.0", + "executing": "2.2.1", + "filelock": "4.0.12", + "fonttools": "4.66.1", + "fsspec": "2026.9.0", + "h11": "0.16.0", + "h2": "4.4.1", + "h5py": "3.16.0", + "hf-xet": "1.7.0", + "hpack": "4.2.0", + "httpcore": "1.0.9", + "httpcore2": "2.13.1", + "httpx": "0.28.1", + "httpx2": "2.13.1", + "huggingface-hub": "2.2.0", + "hyperframe": "6.1.0", + "idna": "3.20", + "iniconfig": "2.3.1", + "ipython": "8.39.0", + "jedi": "0.20.0", + "jellyfish": "1.2.1", + "jinja2": "3.1.6", + "jsonpickle": "4.1.3", + "kiwisolver": "1.5.1", + "markdown-it-py": "4.2.0", + "markupsafe": "3.0.4", + "matplotlib": "3.11.2", + "matplotlib-inline": "0.2.2", + "mdurl": "0.1.2", + "microdf-python": "1.5.11", + "msgpack": "1.2.3", + "ndindex": "1.10.1", + "networkx": "3.7", + "numexpr": "2.14.2", + "numpy": "2.5.3", + "openpyxl": "3.1.5", + "packaging": "26.3", + "pandas": "3.0.6", + "parso": "0.8.7", + "pexpect": "4.9.0", + "pillow": "12.3.0", + "plotly": "5.24.1", + "pluggy": "1.6.0", + "policyengine-core": "3.32.29", + "policyengine-us": "2.38.1", + "prompt-toolkit": "3.0.53", + "psutil": "6.1.1", + "ptyprocess": "0.7.0", + "pure-eval": "0.2.4", + "py-cpuinfo": "9.0.0", + "pydantic": "2.14.0", + "pydantic-core": "2.50.0", + "pygments": "2.21.0", + "pyparsing": "3.3.3", + "pytest": "9.1.1", + "python-dateutil": "2.9.0.post0", + "pyvis": "0.3.2", + "pyyaml": "6.0.3", + "requests": "2.34.2", + "rich": "15.0.0", + "six": "1.17.0", + "sortedcontainers": "2.4.0", + "spm-calculator": "1.0.0.post1", + "stack-data": "0.6.3", + "standard-imghdr": "3.13.0", + "tables": "3.11.1", + "tenacity": "9.2.1", + "threadpoolctl": "3.7.0", + "tqdm": "4.70.1", + "traitlets": "5.16.1", + "truststore": "0.10.4", + "typing-extensions": "4.16.0", + "typing-inspection": "0.4.4", + "urllib3": "2.8.0", + "us": "4.0.0", + "wcwidth": "0.9.2", + "wheel": "0.48.0" + }, + "3.13": { + "annotated-types": "0.8.0", + "anyio": "4.15.1", + "asttokens": "3.0.2", + "blosc2": "4.14.1", + "census": "0.8.27", + "certifi": "2026.7.22", + "charset-normalizer": "3.5.2", + "click": "8.5.0", + "contourpy": "1.4.0", + "cycler": "0.12.1", + "decorator": "5.3.1", + "dpath": "2.2.0", + "et-xmlfile": "2.0.0", + "executing": "2.2.1", + "filelock": "4.0.12", + "fonttools": "4.66.1", + "fsspec": "2026.9.0", + "h11": "0.16.0", + "h2": "4.4.1", + "h5py": "3.16.0", + "hf-xet": "1.7.0", + "hpack": "4.2.0", + "httpcore": "1.0.9", + "httpcore2": "2.13.1", + "httpx": "0.28.1", + "httpx2": "2.13.1", + "huggingface-hub": "2.2.0", + "hyperframe": "6.1.0", + "idna": "3.20", + "iniconfig": "2.3.1", + "ipython": "8.39.0", + "jedi": "0.20.0", + "jellyfish": "1.2.1", + "jinja2": "3.1.6", + "jsonpickle": "4.1.3", + "kiwisolver": "1.5.1", + "markdown-it-py": "4.2.0", + "markupsafe": "3.0.4", + "matplotlib": "3.11.2", + "matplotlib-inline": "0.2.2", + "mdurl": "0.1.2", + "microdf-python": "1.5.11", + "msgpack": "1.2.3", + "ndindex": "1.10.1", + "networkx": "3.7", + "numexpr": "2.14.2", + "numpy": "2.5.3", + "openpyxl": "3.1.5", + "packaging": "26.3", + "pandas": "3.0.6", + "parso": "0.8.7", + "pexpect": "4.9.0", + "pillow": "12.3.0", + "plotly": "5.24.1", + "pluggy": "1.6.0", + "policyengine-core": "3.32.29", + "policyengine-us": "2.38.1", + "prompt-toolkit": "3.0.53", + "psutil": "6.1.1", + "ptyprocess": "0.7.0", + "pure-eval": "0.2.4", + "py-cpuinfo": "9.0.0", + "pydantic": "2.14.0", + "pydantic-core": "2.50.0", + "pygments": "2.21.0", + "pyparsing": "3.3.3", + "pytest": "9.1.1", + "python-dateutil": "2.9.0.post0", + "pyvis": "0.3.2", + "pyyaml": "6.0.3", + "requests": "2.34.2", + "rich": "15.0.0", + "six": "1.17.0", + "sortedcontainers": "2.4.0", + "spm-calculator": "1.0.0.post1", + "stack-data": "0.6.3", + "standard-imghdr": "3.13.0", + "tables": "3.11.1", + "tenacity": "9.2.1", + "threadpoolctl": "3.7.0", + "tqdm": "4.70.1", + "traitlets": "5.16.1", + "truststore": "0.10.4", + "typing-extensions": "4.16.0", + "typing-inspection": "0.4.4", + "urllib3": "2.8.0", + "us": "4.0.0", + "wcwidth": "0.9.2", + "wheel": "0.48.0" + }, + "3.14": { + "annotated-types": "0.8.0", + "anyio": "4.15.1", + "asttokens": "3.0.2", + "blosc2": "4.14.1", + "census": "0.8.27", + "certifi": "2026.7.22", + "charset-normalizer": "3.5.2", + "click": "8.5.0", + "contourpy": "1.4.0", + "cycler": "0.12.1", + "decorator": "5.3.1", + "dpath": "2.2.0", + "et-xmlfile": "2.0.0", + "executing": "2.2.1", + "filelock": "4.0.12", + "fonttools": "4.66.1", + "fsspec": "2026.9.0", + "h11": "0.16.0", + "h2": "4.4.1", + "h5py": "3.16.0", + "hf-xet": "1.7.0", + "hpack": "4.2.0", + "httpcore": "1.0.9", + "httpcore2": "2.13.1", + "httpx": "0.28.1", + "httpx2": "2.13.1", + "huggingface-hub": "2.2.0", + "hyperframe": "6.1.0", + "idna": "3.20", + "iniconfig": "2.3.1", + "ipython": "8.39.0", + "jedi": "0.20.0", + "jellyfish": "1.2.1", + "jinja2": "3.1.6", + "jsonpickle": "4.1.3", + "kiwisolver": "1.5.1", + "markdown-it-py": "4.2.0", + "markupsafe": "3.0.4", + "matplotlib": "3.11.2", + "matplotlib-inline": "0.2.2", + "mdurl": "0.1.2", + "microdf-python": "1.5.11", + "msgpack": "1.2.3", + "ndindex": "1.10.1", + "networkx": "3.7", + "numexpr": "2.14.2", + "numpy": "2.5.3", + "openpyxl": "3.1.5", + "packaging": "26.3", + "pandas": "3.0.6", + "parso": "0.8.7", + "pexpect": "4.9.0", + "pillow": "12.3.0", + "plotly": "5.24.1", + "pluggy": "1.6.0", + "policyengine-core": "3.32.29", + "policyengine-us": "2.38.1", + "prompt-toolkit": "3.0.53", + "psutil": "6.1.1", + "ptyprocess": "0.7.0", + "pure-eval": "0.2.4", + "py-cpuinfo": "9.0.0", + "pydantic": "2.14.0", + "pydantic-core": "2.50.0", + "pygments": "2.21.0", + "pyparsing": "3.3.3", + "pytest": "9.1.1", + "python-dateutil": "2.9.0.post0", + "pyvis": "0.3.2", + "pyyaml": "6.0.3", + "requests": "2.34.2", + "rich": "15.0.0", + "six": "1.17.0", + "sortedcontainers": "2.4.0", + "spm-calculator": "1.0.0.post1", + "stack-data": "0.6.3", + "standard-imghdr": "3.13.0", + "tables": "3.11.1", + "tenacity": "9.2.1", + "threadpoolctl": "3.7.0", + "tqdm": "4.70.1", + "traitlets": "5.16.1", + "truststore": "0.10.4", + "typing-extensions": "4.16.0", + "typing-inspection": "0.4.4", + "urllib3": "2.8.0", + "us": "4.0.0", + "wcwidth": "0.9.2", + "wheel": "0.48.0" + } + }, + "platforms": { + "aarch64-apple-darwin": { + "3.10": { + "annotated-types": "0.8.0", + "anyio": "4.15.1", + "asttokens": "3.0.2", + "blosc2": "4.3.3", + "census": "0.8.27", + "certifi": "2026.7.22", + "charset-normalizer": "3.5.2", + "click": "8.5.0", + "contourpy": "1.3.2", + "cycler": "0.12.1", + "decorator": "5.3.1", + "dpath": "2.2.0", + "et-xmlfile": "2.0.0", + "exceptiongroup": "1.3.1", + "executing": "2.2.1", + "filelock": "4.0.12", + "fonttools": "4.65.0", + "fsspec": "2026.9.0", + "h11": "0.16.0", + "h5py": "3.16.0", + "hf-xet": "1.7.0", + "httpcore2": "2.13.1", + "httpx2": "2.13.1", + "huggingface-hub": "2.2.0", + "idna": "3.20", + "iniconfig": "2.3.1", + "ipython": "8.39.0", + "jedi": "0.20.0", + "jellyfish": "1.2.1", + "jinja2": "3.1.6", + "jsonpickle": "4.1.3", + "kiwisolver": "1.5.1", + "markupsafe": "3.0.4", + "matplotlib": "3.10.9", + "matplotlib-inline": "0.2.2", + "microdf-python": "1.5.11", + "msgpack": "1.2.3", + "ndindex": "1.10.1", + "networkx": "3.4.2", + "numexpr": "2.14.1", + "numpy": "2.2.6", + "openpyxl": "3.1.5", + "packaging": "26.3", + "pandas": "2.3.3", + "parso": "0.8.7", + "pexpect": "4.9.0", + "pillow": "12.3.0", + "plotly": "5.24.1", + "pluggy": "1.6.0", + "policyengine-core": "3.31.1", + "policyengine-us": "1.783.0", + "prompt-toolkit": "3.0.53", + "psutil": "6.1.1", + "ptyprocess": "0.7.0", + "pure-eval": "0.2.4", + "py-cpuinfo": "9.0.0", + "pydantic": "2.14.0", + "pydantic-core": "2.50.0", + "pygments": "2.21.0", + "pyparsing": "3.3.3", + "pytest": "8.4.2", + "python-dateutil": "2.9.0.post0", + "pytz": "2026.5", + "pyvis": "0.3.2", + "pyyaml": "6.0.3", + "requests": "2.34.2", + "six": "1.17.0", + "sortedcontainers": "2.4.0", + "spm-calculator": "0.3.1", + "stack-data": "0.6.3", + "standard-imghdr": "3.13.0", + "tables": "3.10.1", + "tenacity": "9.2.1", + "threadpoolctl": "3.7.0", + "tomli": "2.5.0", + "tqdm": "4.70.1", + "traitlets": "5.16.1", + "truststore": "0.10.4", + "typing-extensions": "4.16.0", + "typing-inspection": "0.4.4", + "tzdata": "2026.5", + "urllib3": "2.8.0", + "us": "4.0.0", + "wcwidth": "0.9.2", + "wheel": "0.48.0" + }, + "3.11": { + "annotated-types": "0.8.0", + "anyio": "4.15.1", + "asttokens": "3.0.2", + "blosc2": "4.3.3", + "census": "0.8.27", + "certifi": "2026.7.22", + "charset-normalizer": "3.5.2", + "click": "8.5.0", + "contourpy": "1.3.2", + "cycler": "0.12.1", + "decorator": "5.3.1", + "dpath": "2.2.0", + "et-xmlfile": "2.0.0", + "executing": "2.2.1", + "filelock": "4.0.12", + "fonttools": "4.65.0", + "fsspec": "2026.9.0", + "h11": "0.16.0", + "h5py": "3.16.0", + "hf-xet": "1.7.0", + "httpcore2": "2.13.1", + "httpx2": "2.13.1", + "huggingface-hub": "2.2.0", + "idna": "3.20", + "iniconfig": "2.3.1", + "ipython": "8.39.0", + "jedi": "0.20.0", + "jellyfish": "1.2.1", + "jinja2": "3.1.6", + "jsonpickle": "4.1.3", + "kiwisolver": "1.5.1", + "markupsafe": "3.0.4", + "matplotlib": "3.10.9", + "matplotlib-inline": "0.2.2", + "microdf-python": "1.5.11", + "msgpack": "1.2.3", + "ndindex": "1.10.1", + "networkx": "3.4.2", + "numexpr": "2.14.1", + "numpy": "2.2.6", + "openpyxl": "3.1.5", + "packaging": "26.3", + "pandas": "3.0.6", + "parso": "0.8.7", + "pexpect": "4.9.0", + "pillow": "12.3.0", + "plotly": "5.24.1", + "pluggy": "1.6.0", + "policyengine-core": "3.31.1", + "policyengine-us": "1.783.0", + "prompt-toolkit": "3.0.53", + "psutil": "6.1.1", + "ptyprocess": "0.7.0", + "pure-eval": "0.2.4", + "py-cpuinfo": "9.0.0", + "pydantic": "2.14.0", + "pydantic-core": "2.50.0", + "pygments": "2.21.0", + "pyparsing": "3.3.3", + "pytest": "8.4.2", + "python-dateutil": "2.9.0.post0", + "pyvis": "0.3.2", + "pyyaml": "6.0.3", + "requests": "2.34.2", + "six": "1.17.0", + "sortedcontainers": "2.4.0", + "spm-calculator": "0.3.1", + "stack-data": "0.6.3", + "standard-imghdr": "3.13.0", + "tables": "3.10.1", + "tenacity": "9.2.1", + "threadpoolctl": "3.7.0", + "tqdm": "4.70.1", + "traitlets": "5.16.1", + "truststore": "0.10.4", + "typing-extensions": "4.16.0", + "typing-inspection": "0.4.4", + "urllib3": "2.8.0", + "us": "4.0.0", + "wcwidth": "0.9.2", + "wheel": "0.48.0" + }, + "3.12": { + "annotated-types": "0.8.0", + "anyio": "4.15.1", + "asttokens": "3.0.2", + "blosc2": "4.3.3", + "census": "0.8.27", + "certifi": "2026.7.22", + "charset-normalizer": "3.5.2", + "click": "8.5.0", + "contourpy": "1.3.2", + "cycler": "0.12.1", + "decorator": "5.3.1", + "dpath": "2.2.0", + "et-xmlfile": "2.0.0", + "executing": "2.2.1", + "filelock": "4.0.12", + "fonttools": "4.65.0", + "fsspec": "2026.9.0", + "h11": "0.16.0", + "h5py": "3.16.0", + "hf-xet": "1.7.0", + "httpcore2": "2.13.1", + "httpx2": "2.13.1", + "huggingface-hub": "2.2.0", + "idna": "3.20", + "iniconfig": "2.3.1", + "ipython": "8.39.0", + "jedi": "0.20.0", + "jellyfish": "1.2.1", + "jinja2": "3.1.6", + "jsonpickle": "4.1.3", + "kiwisolver": "1.5.1", + "markupsafe": "3.0.4", + "matplotlib": "3.10.9", + "matplotlib-inline": "0.2.2", + "microdf-python": "1.5.11", + "msgpack": "1.2.3", + "ndindex": "1.10.1", + "networkx": "3.4.2", + "numexpr": "2.14.1", + "numpy": "2.2.6", + "openpyxl": "3.1.5", + "packaging": "26.3", + "pandas": "3.0.6", + "parso": "0.8.7", + "pexpect": "4.9.0", + "pillow": "12.3.0", + "plotly": "5.24.1", + "pluggy": "1.6.0", + "policyengine-core": "3.31.1", + "policyengine-us": "1.783.0", + "prompt-toolkit": "3.0.53", + "psutil": "6.1.1", + "ptyprocess": "0.7.0", + "pure-eval": "0.2.4", + "py-cpuinfo": "9.0.0", + "pydantic": "2.14.0", + "pydantic-core": "2.50.0", + "pygments": "2.21.0", + "pyparsing": "3.3.3", + "pytest": "8.4.2", + "python-dateutil": "2.9.0.post0", + "pyvis": "0.3.2", + "pyyaml": "6.0.3", + "requests": "2.34.2", + "six": "1.17.0", + "sortedcontainers": "2.4.0", + "spm-calculator": "0.3.1", + "stack-data": "0.6.3", + "standard-imghdr": "3.13.0", + "tables": "3.10.1", + "tenacity": "9.2.1", + "threadpoolctl": "3.7.0", + "tqdm": "4.70.1", + "traitlets": "5.16.1", + "truststore": "0.10.4", + "typing-extensions": "4.16.0", + "typing-inspection": "0.4.4", + "urllib3": "2.8.0", + "us": "4.0.0", + "wcwidth": "0.9.2", + "wheel": "0.48.0" + }, + "3.13": { + "annotated-types": "0.8.0", + "anyio": "4.15.1", + "asttokens": "3.0.2", + "blosc2": "4.3.3", + "census": "0.8.27", + "certifi": "2026.7.22", + "charset-normalizer": "3.5.2", + "click": "8.5.0", + "contourpy": "1.3.2", + "cycler": "0.12.1", + "decorator": "5.3.1", + "dpath": "2.2.0", + "et-xmlfile": "2.0.0", + "executing": "2.2.1", + "filelock": "4.0.12", + "fonttools": "4.65.0", + "fsspec": "2026.9.0", + "h11": "0.16.0", + "h5py": "3.16.0", + "hf-xet": "1.7.0", + "httpcore2": "2.13.1", + "httpx2": "2.13.1", + "huggingface-hub": "2.2.0", + "idna": "3.20", + "iniconfig": "2.3.1", + "ipython": "8.39.0", + "jedi": "0.20.0", + "jellyfish": "1.2.1", + "jinja2": "3.1.6", + "jsonpickle": "4.1.3", + "kiwisolver": "1.5.1", + "markupsafe": "3.0.4", + "matplotlib": "3.10.9", + "matplotlib-inline": "0.2.2", + "microdf-python": "1.5.11", + "msgpack": "1.2.3", + "ndindex": "1.10.1", + "networkx": "3.4.2", + "numexpr": "2.14.1", + "numpy": "2.2.6", + "openpyxl": "3.1.5", + "packaging": "26.3", + "pandas": "3.0.6", + "parso": "0.8.7", + "pexpect": "4.9.0", + "pillow": "12.3.0", + "plotly": "5.24.1", + "pluggy": "1.6.0", + "policyengine-core": "3.31.1", + "policyengine-us": "1.783.0", + "prompt-toolkit": "3.0.53", + "psutil": "6.1.1", + "ptyprocess": "0.7.0", + "pure-eval": "0.2.4", + "py-cpuinfo": "9.0.0", + "pydantic": "2.14.0", + "pydantic-core": "2.50.0", + "pygments": "2.21.0", + "pyparsing": "3.3.3", + "pytest": "8.4.2", + "python-dateutil": "2.9.0.post0", + "pyvis": "0.3.2", + "pyyaml": "6.0.3", + "requests": "2.34.2", + "six": "1.17.0", + "sortedcontainers": "2.4.0", + "spm-calculator": "0.3.1", + "stack-data": "0.6.3", + "standard-imghdr": "3.13.0", + "tables": "3.10.1", + "tenacity": "9.2.1", + "threadpoolctl": "3.7.0", + "tqdm": "4.70.1", + "traitlets": "5.16.1", + "truststore": "0.10.4", + "typing-extensions": "4.16.0", + "typing-inspection": "0.4.4", + "urllib3": "2.8.0", + "us": "4.0.0", + "wcwidth": "0.9.2", + "wheel": "0.48.0" + }, + "3.14": { + "annotated-types": "0.8.0", + "anyio": "4.15.1", + "asttokens": "3.0.2", + "blosc2": "4.3.3", + "census": "0.8.27", + "certifi": "2026.7.22", + "charset-normalizer": "3.5.2", + "click": "8.5.0", + "contourpy": "1.3.2", + "cycler": "0.12.1", + "decorator": "5.3.1", + "dpath": "2.2.0", + "et-xmlfile": "2.0.0", + "executing": "2.2.1", + "filelock": "4.0.12", + "fonttools": "4.65.0", + "fsspec": "2026.9.0", + "h11": "0.16.0", + "h5py": "3.16.0", + "hf-xet": "1.7.0", + "httpcore2": "2.13.1", + "httpx2": "2.13.1", + "huggingface-hub": "2.2.0", + "idna": "3.20", + "iniconfig": "2.3.1", + "ipython": "8.39.0", + "jedi": "0.20.0", + "jellyfish": "1.2.1", + "jinja2": "3.1.6", + "jsonpickle": "4.1.3", + "kiwisolver": "1.5.1", + "markupsafe": "3.0.4", + "matplotlib": "3.10.9", + "matplotlib-inline": "0.2.2", + "microdf-python": "1.5.11", + "msgpack": "1.2.3", + "ndindex": "1.10.1", + "networkx": "3.4.2", + "numexpr": "2.14.1", + "numpy": "2.5.3", + "openpyxl": "3.1.5", + "packaging": "26.3", + "pandas": "3.0.6", + "parso": "0.8.7", + "pexpect": "4.9.0", + "pillow": "12.3.0", + "plotly": "5.24.1", + "pluggy": "1.6.0", + "policyengine-core": "3.31.1", + "policyengine-us": "1.783.0", + "prompt-toolkit": "3.0.53", + "psutil": "6.1.1", + "ptyprocess": "0.7.0", + "pure-eval": "0.2.4", + "py-cpuinfo": "9.0.0", + "pydantic": "2.14.0", + "pydantic-core": "2.50.0", + "pygments": "2.21.0", + "pyparsing": "3.3.3", + "pytest": "8.4.2", + "python-dateutil": "2.9.0.post0", + "pyvis": "0.3.2", + "pyyaml": "6.0.3", + "requests": "2.34.2", + "six": "1.17.0", + "sortedcontainers": "2.4.0", + "spm-calculator": "0.3.1", + "stack-data": "0.6.3", + "standard-imghdr": "3.13.0", + "tables": "3.10.1", + "tenacity": "9.2.1", + "threadpoolctl": "3.7.0", + "tqdm": "4.70.1", + "traitlets": "5.16.1", + "truststore": "0.10.4", + "typing-extensions": "4.16.0", + "typing-inspection": "0.4.4", + "urllib3": "2.8.0", + "us": "4.0.0", + "wcwidth": "0.9.2", + "wheel": "0.48.0" + } + }, + "x86_64-pc-windows-msvc": { + "3.10": { + "annotated-types": "0.8.0", + "anyio": "4.15.1", + "asttokens": "3.0.2", + "blosc2": "4.3.3", + "census": "0.8.27", + "certifi": "2026.7.22", + "charset-normalizer": "3.5.2", + "click": "8.5.0", + "colorama": "0.4.6", + "contourpy": "1.3.2", + "cycler": "0.12.1", + "decorator": "5.3.1", + "dpath": "2.2.0", + "et-xmlfile": "2.0.0", + "exceptiongroup": "1.3.1", + "executing": "2.2.1", + "filelock": "4.0.12", + "fonttools": "4.65.0", + "fsspec": "2026.9.0", + "h11": "0.16.0", + "h5py": "3.16.0", + "hf-xet": "1.7.0", + "httpcore2": "2.13.1", + "httpx2": "2.13.1", + "huggingface-hub": "2.2.0", + "idna": "3.20", + "iniconfig": "2.3.1", + "ipython": "8.39.0", + "jedi": "0.20.0", + "jellyfish": "1.2.1", + "jinja2": "3.1.6", + "jsonpickle": "4.1.3", + "kiwisolver": "1.5.1", + "markupsafe": "3.0.4", + "matplotlib": "3.10.9", + "matplotlib-inline": "0.2.2", + "microdf-python": "1.5.11", + "msgpack": "1.2.3", + "ndindex": "1.10.1", + "networkx": "3.4.2", + "numexpr": "2.14.1", + "numpy": "2.2.6", + "openpyxl": "3.1.5", + "packaging": "26.3", + "pandas": "2.3.3", + "parso": "0.8.7", + "pillow": "12.3.0", + "plotly": "5.24.1", + "pluggy": "1.6.0", + "policyengine-core": "3.31.1", + "policyengine-us": "1.783.0", + "prompt-toolkit": "3.0.53", + "psutil": "6.1.1", + "pure-eval": "0.2.4", + "py-cpuinfo": "9.0.0", + "pydantic": "2.14.0", + "pydantic-core": "2.50.0", + "pygments": "2.21.0", + "pyparsing": "3.3.3", + "pytest": "8.4.2", + "python-dateutil": "2.9.0.post0", + "pytz": "2026.5", + "pyvis": "0.3.2", + "pyyaml": "6.0.3", + "requests": "2.34.2", + "six": "1.17.0", + "sortedcontainers": "2.4.0", + "spm-calculator": "0.3.1", + "stack-data": "0.6.3", + "standard-imghdr": "3.13.0", + "tables": "3.10.1", + "tenacity": "9.2.1", + "threadpoolctl": "3.7.0", + "tomli": "2.5.0", + "tqdm": "4.70.1", + "traitlets": "5.16.1", + "truststore": "0.10.4", + "typing-extensions": "4.16.0", + "typing-inspection": "0.4.4", + "tzdata": "2026.5", + "urllib3": "2.8.0", + "us": "4.0.0", + "wcwidth": "0.9.2", + "wheel": "0.48.0" + }, + "3.11": { + "annotated-types": "0.8.0", + "anyio": "4.15.1", + "asttokens": "3.0.2", + "blosc2": "4.3.3", + "census": "0.8.27", + "certifi": "2026.7.22", + "charset-normalizer": "3.5.2", + "click": "8.5.0", + "colorama": "0.4.6", + "contourpy": "1.3.2", + "cycler": "0.12.1", + "decorator": "5.3.1", + "dpath": "2.2.0", + "et-xmlfile": "2.0.0", + "executing": "2.2.1", + "filelock": "4.0.12", + "fonttools": "4.65.0", + "fsspec": "2026.9.0", + "h11": "0.16.0", + "h5py": "3.16.0", + "hf-xet": "1.7.0", + "httpcore2": "2.13.1", + "httpx2": "2.13.1", + "huggingface-hub": "2.2.0", + "idna": "3.20", + "iniconfig": "2.3.1", + "ipython": "8.39.0", + "jedi": "0.20.0", + "jellyfish": "1.2.1", + "jinja2": "3.1.6", + "jsonpickle": "4.1.3", + "kiwisolver": "1.5.1", + "markupsafe": "3.0.4", + "matplotlib": "3.10.9", + "matplotlib-inline": "0.2.2", + "microdf-python": "1.5.11", + "msgpack": "1.2.3", + "ndindex": "1.10.1", + "networkx": "3.4.2", + "numexpr": "2.14.1", + "numpy": "2.2.6", + "openpyxl": "3.1.5", + "packaging": "26.3", + "pandas": "3.0.6", + "parso": "0.8.7", + "pillow": "12.3.0", + "plotly": "5.24.1", + "pluggy": "1.6.0", + "policyengine-core": "3.31.1", + "policyengine-us": "1.783.0", + "prompt-toolkit": "3.0.53", + "psutil": "6.1.1", + "pure-eval": "0.2.4", + "py-cpuinfo": "9.0.0", + "pydantic": "2.14.0", + "pydantic-core": "2.50.0", + "pygments": "2.21.0", + "pyparsing": "3.3.3", + "pytest": "8.4.2", + "python-dateutil": "2.9.0.post0", + "pyvis": "0.3.2", + "pyyaml": "6.0.3", + "requests": "2.34.2", + "six": "1.17.0", + "sortedcontainers": "2.4.0", + "spm-calculator": "0.3.1", + "stack-data": "0.6.3", + "standard-imghdr": "3.13.0", + "tables": "3.10.1", + "tenacity": "9.2.1", + "threadpoolctl": "3.7.0", + "tqdm": "4.70.1", + "traitlets": "5.16.1", + "truststore": "0.10.4", + "typing-extensions": "4.16.0", + "typing-inspection": "0.4.4", + "tzdata": "2026.5", + "urllib3": "2.8.0", + "us": "4.0.0", + "wcwidth": "0.9.2", + "wheel": "0.48.0" + }, + "3.12": { + "annotated-types": "0.8.0", + "anyio": "4.15.1", + "asttokens": "3.0.2", + "blosc2": "4.3.3", + "census": "0.8.27", + "certifi": "2026.7.22", + "charset-normalizer": "3.5.2", + "click": "8.5.0", + "colorama": "0.4.6", + "contourpy": "1.3.2", + "cycler": "0.12.1", + "decorator": "5.3.1", + "dpath": "2.2.0", + "et-xmlfile": "2.0.0", + "executing": "2.2.1", + "filelock": "4.0.12", + "fonttools": "4.65.0", + "fsspec": "2026.9.0", + "h11": "0.16.0", + "h5py": "3.16.0", + "hf-xet": "1.7.0", + "httpcore2": "2.13.1", + "httpx2": "2.13.1", + "huggingface-hub": "2.2.0", + "idna": "3.20", + "iniconfig": "2.3.1", + "ipython": "8.39.0", + "jedi": "0.20.0", + "jellyfish": "1.2.1", + "jinja2": "3.1.6", + "jsonpickle": "4.1.3", + "kiwisolver": "1.5.1", + "markupsafe": "3.0.4", + "matplotlib": "3.10.9", + "matplotlib-inline": "0.2.2", + "microdf-python": "1.5.11", + "msgpack": "1.2.3", + "ndindex": "1.10.1", + "networkx": "3.4.2", + "numexpr": "2.14.1", + "numpy": "2.2.6", + "openpyxl": "3.1.5", + "packaging": "26.3", + "pandas": "3.0.6", + "parso": "0.8.7", + "pillow": "12.3.0", + "plotly": "5.24.1", + "pluggy": "1.6.0", + "policyengine-core": "3.31.1", + "policyengine-us": "1.783.0", + "prompt-toolkit": "3.0.53", + "psutil": "6.1.1", + "pure-eval": "0.2.4", + "py-cpuinfo": "9.0.0", + "pydantic": "2.14.0", + "pydantic-core": "2.50.0", + "pygments": "2.21.0", + "pyparsing": "3.3.3", + "pytest": "8.4.2", + "python-dateutil": "2.9.0.post0", + "pyvis": "0.3.2", + "pyyaml": "6.0.3", + "requests": "2.34.2", + "six": "1.17.0", + "sortedcontainers": "2.4.0", + "spm-calculator": "0.3.1", + "stack-data": "0.6.3", + "standard-imghdr": "3.13.0", + "tables": "3.10.1", + "tenacity": "9.2.1", + "threadpoolctl": "3.7.0", + "tqdm": "4.70.1", + "traitlets": "5.16.1", + "truststore": "0.10.4", + "typing-extensions": "4.16.0", + "typing-inspection": "0.4.4", + "tzdata": "2026.5", + "urllib3": "2.8.0", + "us": "4.0.0", + "wcwidth": "0.9.2", + "wheel": "0.48.0" + }, + "3.13": { + "annotated-types": "0.8.0", + "anyio": "4.15.1", + "asttokens": "3.0.2", + "blosc2": "4.3.3", + "census": "0.8.27", + "certifi": "2026.7.22", + "charset-normalizer": "3.5.2", + "click": "8.5.0", + "colorama": "0.4.6", + "contourpy": "1.3.2", + "cycler": "0.12.1", + "decorator": "5.3.1", + "dpath": "2.2.0", + "et-xmlfile": "2.0.0", + "executing": "2.2.1", + "filelock": "4.0.12", + "fonttools": "4.65.0", + "fsspec": "2026.9.0", + "h11": "0.16.0", + "h5py": "3.16.0", + "hf-xet": "1.7.0", + "httpcore2": "2.13.1", + "httpx2": "2.13.1", + "huggingface-hub": "2.2.0", + "idna": "3.20", + "iniconfig": "2.3.1", + "ipython": "8.39.0", + "jedi": "0.20.0", + "jellyfish": "1.2.1", + "jinja2": "3.1.6", + "jsonpickle": "4.1.3", + "kiwisolver": "1.5.1", + "markupsafe": "3.0.4", + "matplotlib": "3.10.9", + "matplotlib-inline": "0.2.2", + "microdf-python": "1.5.11", + "msgpack": "1.2.3", + "ndindex": "1.10.1", + "networkx": "3.4.2", + "numexpr": "2.14.1", + "numpy": "2.2.6", + "openpyxl": "3.1.5", + "packaging": "26.3", + "pandas": "3.0.6", + "parso": "0.8.7", + "pillow": "12.3.0", + "plotly": "5.24.1", + "pluggy": "1.6.0", + "policyengine-core": "3.31.1", + "policyengine-us": "1.783.0", + "prompt-toolkit": "3.0.53", + "psutil": "6.1.1", + "pure-eval": "0.2.4", + "py-cpuinfo": "9.0.0", + "pydantic": "2.14.0", + "pydantic-core": "2.50.0", + "pygments": "2.21.0", + "pyparsing": "3.3.3", + "pytest": "8.4.2", + "python-dateutil": "2.9.0.post0", + "pyvis": "0.3.2", + "pyyaml": "6.0.3", + "requests": "2.34.2", + "six": "1.17.0", + "sortedcontainers": "2.4.0", + "spm-calculator": "0.3.1", + "stack-data": "0.6.3", + "standard-imghdr": "3.13.0", + "tables": "3.10.1", + "tenacity": "9.2.1", + "threadpoolctl": "3.7.0", + "tqdm": "4.70.1", + "traitlets": "5.16.1", + "truststore": "0.10.4", + "typing-extensions": "4.16.0", + "typing-inspection": "0.4.4", + "tzdata": "2026.5", + "urllib3": "2.8.0", + "us": "4.0.0", + "wcwidth": "0.9.2", + "wheel": "0.48.0" + }, + "3.14": { + "annotated-types": "0.8.0", + "anyio": "4.15.1", + "asttokens": "3.0.2", + "blosc2": "4.3.3", + "census": "0.8.27", + "certifi": "2026.7.22", + "charset-normalizer": "3.5.2", + "click": "8.5.0", + "colorama": "0.4.6", + "contourpy": "1.3.2", + "cycler": "0.12.1", + "decorator": "5.3.1", + "dpath": "2.2.0", + "et-xmlfile": "2.0.0", + "executing": "2.2.1", + "filelock": "4.0.12", + "fonttools": "4.65.0", + "fsspec": "2026.9.0", + "h11": "0.16.0", + "h5py": "3.16.0", + "hf-xet": "1.7.0", + "httpcore2": "2.13.1", + "httpx2": "2.13.1", + "huggingface-hub": "2.2.0", + "idna": "3.20", + "iniconfig": "2.3.1", + "ipython": "8.39.0", + "jedi": "0.20.0", + "jellyfish": "1.2.1", + "jinja2": "3.1.6", + "jsonpickle": "4.1.3", + "kiwisolver": "1.5.1", + "markupsafe": "3.0.4", + "matplotlib": "3.10.9", + "matplotlib-inline": "0.2.2", + "microdf-python": "1.5.11", + "msgpack": "1.2.3", + "ndindex": "1.10.1", + "networkx": "3.4.2", + "numexpr": "2.14.1", + "numpy": "2.5.3", + "openpyxl": "3.1.5", + "packaging": "26.3", + "pandas": "3.0.6", + "parso": "0.8.7", + "pillow": "12.3.0", + "plotly": "5.24.1", + "pluggy": "1.6.0", + "policyengine-core": "3.31.1", + "policyengine-us": "1.783.0", + "prompt-toolkit": "3.0.53", + "psutil": "6.1.1", + "pure-eval": "0.2.4", + "py-cpuinfo": "9.0.0", + "pydantic": "2.14.0", + "pydantic-core": "2.50.0", + "pygments": "2.21.0", + "pyparsing": "3.3.3", + "pytest": "8.4.2", + "python-dateutil": "2.9.0.post0", + "pyvis": "0.3.2", + "pyyaml": "6.0.3", + "requests": "2.34.2", + "six": "1.17.0", + "sortedcontainers": "2.4.0", + "spm-calculator": "0.3.1", + "stack-data": "0.6.3", + "standard-imghdr": "3.13.0", + "tables": "3.10.1", + "tenacity": "9.2.1", + "threadpoolctl": "3.7.0", + "tqdm": "4.70.1", + "traitlets": "5.16.1", + "truststore": "0.10.4", + "typing-extensions": "4.16.0", + "typing-inspection": "0.4.4", + "tzdata": "2026.5", + "urllib3": "2.8.0", + "us": "4.0.0", + "wcwidth": "0.9.2", + "wheel": "0.48.0" + } + } + }, + "policyengine_us_latest": { + "requires_python": "<3.15,>=3.11", + "version": "2.38.1" + }, + "resolver": "uv 0.12.13 (Homebrew 2026-09-10 aarch64-apple-darwin)" +} diff --git a/docs/design.md b/docs/design.md new file mode 100644 index 000000000..e2d2a76ec --- /dev/null +++ b/docs/design.md @@ -0,0 +1,254 @@ +# Design: how the emulator works + +This document describes how policyengine-taxsim turns a TAXSIM-35 input file into TAXSIM-35 output: which engine computes each record, how inputs become PolicyEngine US variables, how outputs are assembled, how versions are managed, and where results differ from TAXSIM. It is written for methodologists and reviewers; the [input guide](input-guide.md) covers preparing data, and the [security and deployment notes](security-and-deployment.md) cover installation, dependencies and network use. + +Blocks marked as generated are produced from the code by `scripts/generate_docs_reference.py`, and `tests/test_docs_reference.py` fails when they no longer match it. File references are to this repository unless they name another package. + +Contents: + +- [Components](#components) +- [Routing by year](#routing-by-year) +- [From inputs to PolicyEngine variables](#from-inputs-to-policyengine-variables) +- [Adjustments at run time](#adjustments-at-run-time) +- [Where each output comes from](#where-each-output-comes-from) +- [Records computed by TAXSIM-35](#records-computed-by-taxsim-35) +- [Versions and pinning](#versions-and-pinning) +- [Known differences from TAXSIM-35](#known-differences-from-taxsim-35) +- [Testing](#testing) + +## Components + +```mermaid +flowchart LR + input["TAXSIM-35 input
(CSV, .dta or DataFrame)"] --> validate["BaseTaxRunner
checks year, numbers records,
resolves statefip"] + validate --> stitched["StitchedRunner
splits by year"] + stitched -- "2021 and later" --> pe["PolicyEngineRunner
builds a dataset, runs a
PolicyEngine US Microsimulation"] + stitched -- "before 2021" --> taxsim["TaxsimRunner
runs the bundled
TAXSIM-35 executable"] + pe --> merge["Results in input order"] + taxsim --> merge + merge --> output["TAXSIM-35 output
(CSV, .dta, text report)"] +``` + +| Part | Code | Role | +|---|---|---| +| Command line | `policyengine_taxsim/cli.py` | The `policyengine-taxsim` command: stdin to stdout like `taxsim35`, plus the `policyengine`, `taxsim`, `compare` and `sample-data` subcommands | +| Runners | `policyengine_taxsim/runners/` | `BaseTaxRunner` (shared checks), `StitchedRunner` (routing), `PolicyEngineRunner`, `TaxsimRunner` (bundled executable), `RemoteTaxsimRunner` (NBER's web service, opt-in) | +| Input and output mapping | `policyengine_taxsim/config/variable_mappings.yaml`, `policyengine_taxsim/core/` | Which PolicyEngine variable each TAXSIM column feeds and each output comes from; state-specific outputs (`state_output_resolver.py`); the text report (`text_formatter.py`) | +| Bundled TAXSIM-35 | `resources/taxsimtest/`, `resources/taxsim35/` | NBER executables, installed with the package | +| Comparison | `policyengine_taxsim/comparison/`, `dashboard/` | Record-by-record comparison of the two engines, and the validation dashboard at policyengine.org/us/taxsim | +| Hosted API | `policyengine_taxsim/api.py` | The service behind the web runner, deployed on Modal; not used by a local install | +| R package | `r-package/policyenginetaxsim/` | Calls `PolicyEngineRunner` through reticulate | + +The tax rules themselves live in [policyengine-us](https://github.com/PolicyEngine/policyengine-us), which this package installs as a dependency. The emulator chooses inputs and reads outputs; it does not compute taxes itself. + +## Routing by year + +`StitchedRunner` (`policyengine_taxsim/runners/stitched_runner.py`) sends each record by its `year`: + +- `year` of 2021 or later: `PolicyEngineRunner`. The cutoff is the class constant `PE_MIN_YEAR = 2021`, which callers can change with the `pe_min_year` argument. +- Earlier years: `TaxsimRunner`, which runs the bundled TAXSIM-35 executable on this machine. With `use_remote_taxsim=True` (Python only; no command-line flag sets it), they go instead to `RemoteTaxsimRunner`, which posts them to NBER's TAXSIM-35 web service. + +Each engine gets its records in one batch. The results are concatenated and put back in input order by original position, so repeated `taxsimid` values (panels, multi-state runs) keep their order. Options that only PolicyEngine understands (`--disable-salt`, `--assume-w2-wages`, `--logs`, an active S-corporation treatment) are applied to PolicyEngine rows only, with a warning when some records go to TAXSIM-35. + +The stdin command and the `policyengine` subcommand use `StitchedRunner`, as does the hosted web runner. `PolicyEngineRunner` used directly (the documented Python entry point) and the R package do not route: they compute every year with PolicyEngine. The `taxsim` subcommand computes every year with TAXSIM-35. The [input guide](input-guide.md#which-engine-computes-each-record) has the full table. + +NBER's `taxsim35` Stata command is not part of this package. It sends every record to TAXSIM-35, and the copy NBER served on 2026-10-09 makes no reference to PolicyEngine. No interface switches engines except the ones built on `StitchedRunner`. + +## From inputs to PolicyEngine variables + +`PolicyEngineRunner` (`policyengine_taxsim/runners/policyengine_runner.py`) computes records with a PolicyEngine US `Microsimulation`. Rather than build one household at a time, it turns a batch of records into a dataset and simulates them together: + +1. **Checks.** `BaseTaxRunner` requires a `year` column, numbers the records 1, 2, 3, ... when there is no `taxsimid` column, and converts `statefip` to an SOI `state`. `PolicyEngineRunner` then rejects state codes outside 0 to 51. The [input guide](input-guide.md#what-the-emulator-rejects) lists every check. +2. **Chunks.** Records are grouped by year and split into chunks of at most 10,000 (`CHUNK_SIZE`). Each chunk is simulated separately. +3. **Defaults.** `TaxsimMicrosimDataset._apply_defaults_vectorized` fills missing columns and blank cells (ages 40 for adults and 10 for dependents, `mstat` 1, and so on) and converts TAXSIM-32 dependent counts to ages. +4. **People and units.** Each record becomes one household containing one tax unit, family, SPM unit and marital unit. The household has a primary taxpayer, a spouse when `mstat` is 2, and `depx` dependents. `mstat` 6 sets `is_separated` on the primary taxpayer and `cohabitating_spouses` on the unit, and PolicyEngine US then derives the filing status (separate, or head of household when a qualifying child allows it). +5. **Amounts.** Each TAXSIM column sets one PolicyEngine variable for a particular person. Per-person columns (`pwages`, `swages`, ...) go to that person. Household columns (interest, dividends, capital gains, S corporation income) are split evenly on joint returns. Pensions and Social Security follow an age rule that keeps state retirement exclusions from being lost on a younger spouse. The [input guide](input-guide.md#how-the-emulator-reads-each-column) has the generated table for every column; the mapping itself is `taxsim_to_policyengine` in `variable_mappings.yaml`, with the per-person rules in `TaxsimMicrosimDataset`. +6. **Fixed inputs.** TAXSIM-35 has no inputs for public benefits, use taxes and some state payments, so the dataset sets these on every record regardless of the input file (generated from the dataset built for a minimal record): + + +- `ak_energy_relief` = 0 +- `ak_permanent_fund_dividend` = 0 +- `ca_use_tax` = 0 +- `co_child_care_subsidies` = 0 +- `commodity_supplemental_food_program` = 0 +- `early_head_start` = 0 +- `free_school_meals` = 0 +- `head_start` = 0 +- `id_grocery_credit_qualified_months` = 12 +- `il_use_tax` = 0 +- `ma_covid_19_essential_employee_premium_pay_program` = 0 +- `me_affordability_payment` = 0 +- `medical_expense_health_insurance_premiums` = 0 +- `nc_use_tax` = 0 +- `ok_use_tax` = 0 +- `pa_use_tax` = 0 +- `reduced_price_school_meals` = 0 +- `snap` = 0 +- `ssi` = 0 +- `tanf` = 0 +- `wic` = 0 + + + The comments in `TaxsimMicrosimDataset._initialize_dataset_structure` and `generate` give each one's reason. For example, `medical_expense_health_insurance_premiums` is zeroed so that PolicyEngine's imputed Medicare premiums don't reach state medical deductions TAXSIM-35 never sees. +7. **Temporary file.** The dataset is written to a temporary HDF5 file, read by the `Microsimulation`, and deleted when the chunk finishes. + +States: PolicyEngine always simulates a household in some state. A record with `state` 0 (no state tax) is simulated in Texas, which has no income tax, and reported as state 0. Because TAXSIM-35 files no state return for state 0, it also deducts no state or local income or sales tax, so the emulator zeroes that deduction for state-0 records. A chunk that mixes state-0 and other records is simulated twice, with and without the deduction, and each record takes the matching result. + +## Adjustments at run time + +After building the `Microsimulation`, `PolicyEngineRunner._build_configured_sim` holds some variables fixed to match TAXSIM-35's assumptions. It uses `_pin_input`, which keeps each value fixed in the marginal-rate calculation too. `tests/test_docs_reference.py` builds a simulation for records that meet every condition and checks that each variable it holds fixed is in this table. + +| Variables | When | Why | +|---|---|---| +| `passive_partnership_s_corp_income` | Always | Classifies `scorp` income for the net investment income tax: passive by default (TAXSIM-35's convention) when policyengine-us is 2.10.1 or later, active otherwise or with `--scorp-treatment active` | +| `state_and_local_sales_or_income_tax` | `state` 0, or `--disable-salt` | TAXSIM-35 deducts no state income or sales tax without a state return. `--disable-salt` removes it for every record, to match TAXSIM-35's federal treatment of state tax | +| `w2_wages_from_qualified_business` | `--assume-w2-wages` | Assumes enough W-2 wages that the QBI deduction's wage limit never binds, as TAXSIM-35 does for `pbusinc` | +| `rental_income_would_be_qualified` | Any `otherprop` | TAXSIM-35 gives no QBI deduction on `otherprop`; PolicyEngine would otherwise treat rental income as qualified | +| `mn_renters_credit_qualifying_crp` | Minnesota renters | Assumes the Certificate of Rent Paid that Minnesota's renter's credit requires and TAXSIM-35 inputs can't record | +| `ssi`, `snap`, `tanf`, `wic`, and the state SSI supplements `ca_state_supplement`, `co_state_supplement`, `ma_state_supplement`, `nm_ssi_state_supplement`, `sc_ssi_state_supplement` and `tx_ssi_state_supplement` | Always | Benefits PolicyEngine would otherwise compute; TAXSIM-35 has none, and some count as income in state credits | +| `md_local_income_tax_before_refundable_credits` | Maryland | TAXSIM-35's Maryland `siitax` excludes county income tax | +| `utilities_included_in_rent` | Maine renters | Maine's property tax fairness credit excludes utilities from rent; TAXSIM-35's `rentpaid` is gross rent | +| `ny_additional_ctc`, `ny_inflation_refund_credit`, `ny_supplemental_eitc` | New York | Payments made outside Form IT-201, which TAXSIM-35's `siitax` excludes | + +## Where each output comes from + +`PolicyEngineRunner._extract_vectorized_results` computes the outputs listed in `policyengine_to_taxsim` in `variable_mappings.yaml`: + +- Each record's `idtl` selects its columns: 0 the standard set, 2 and 5 the full set. Cells a record didn't ask for are left blank, and columns no record asked for are dropped. +- Each output is one PolicyEngine US variable, a sum of several, or for state outputs a state-specific variable chosen by the record's state (`policyengine_taxsim/core/state_output_resolver.py`). +- `srebate` is the state tax with one-time state rebates set to 0, minus the actual state tax, computed on a second simulation with those rebates forced to 0. The rebates: + + +`az_families_tax_rebate`, `co_tabor_cash_back`, `ct_child_tax_rebate`, `de_relief_rebate`, `ga_surplus_tax_rebate`, `hi_act_115_rebate`, `id_2022_rebate`, `id_special_season_rebate`, `il_income_tax_rebate`, `il_property_tax_rebate`, `in_automatic_refund_rebate`, `ma_taxpayer_refund_rebate`, `me_relief_rebate`, `mt_income_tax_rebate`, `nm_2021_income_rebate`, `nm_additional_2021_income_rebate`, `nm_supplemental_2021_income_rebate`, `or_kicker`, `ri_child_tax_rebate`, `sc_2022_rebate`, `va_rebate` + + +- `frate` and `srate` raise wages by $100, split between spouses in proportion to their wages, and report the change in federal or state income tax as a percentage. TAXSIM-35 uses a one-cent change in batch mode; PolicyEngine computes in 32-bit floating point, where one cent is too small. +- Amounts are rounded to cents but stored as 32-bit floats, so they can print with extra digits (4009.199951171875 for 4009.20). +- With `idtl` 5, the stdin command writes the full text report (`policyengine_taxsim/core/text_formatter.py`) instead of CSV. + +Every output (generated from `variable_mappings.yaml`): + + +| Output | TAXSIM-35 description | Computed from | idtl | +|---|---|---|---| +| `taxsimid` | Record ID | The input value | 0, 2, 5 | +| `year` | Year | The input value | 0, 2, 5 | +| `state` | State (SOI code) | The input value | 0, 2, 5 | +| `fiitax` | Federal IIT Liability | `income_tax`. Includes the net investment income tax but not the Additional Medicare Tax, which is in `fica`, `tfica` and `addmed` | 0, 2, 5 | +| `siitax` | State IIT Liability | `state_income_tax` | 0, 2, 5 | +| `fica` | FICA (OADSI and HI, sum of employee AND employer including Additional Medicare Tax) | `taxsim_fica` | 0, 2, 5 | +| `frate` | Federal Marginal Rate | Change in `income_tax` when wages rise by $100, as a percentage | 0, 2, 5 | +| `srate` | State Marginal Rate | Change in `state_income_tax` when wages rise by $100, as a percentage | 0, 2, 5 | +| `ficar` | FICA rate | Not produced on PolicyEngine rows | 0, 2 | +| `tfica` | Taxpayer liability for FICA | `taxsim_tfica` | 0, 2, 5 | +| `v10` | Federal AGI | `adjusted_gross_income` | 2, 5 | +| `v11` | UI in AGI | `tax_unit_taxable_unemployment_compensation` | 2, 5 | +| `v12` | Social Security in AGI | `tax_unit_taxable_social_security` | 2, 5 | +| `v13` | Zero Bracket Amount / Standard Deduction | `standard_deduction` | 2, 5 | +| `v14` | Personal Exemptions | `exemptions` | 2, 5 | +| `v15` | Exemption Phaseout | Not produced on PolicyEngine rows | 2, 5 | +| `v16` | Deduction Phaseout | Not produced on PolicyEngine rows | 2, 5 | +| `v17` | Itemized Deductions in taxable income | `itemized_taxable_income_deductions` | 2, 5 | +| `qbid` | QBI deduction | `qualified_business_income_deduction` | 2, 5 | +| `niit` | Net Investment Income Tax | `net_investment_income_tax` | 2, 5 | +| `addmed` | | `additional_medicare_tax` | 2 | +| `v18` | Federal Taxable Income | `taxable_income` | 2, 5 | +| `v19` | Federal Regular Tax | `income_tax_main_rates` | 2, 5 | +| `v20` | Exemption Surtax | Not produced on PolicyEngine rows | 2, 5 | +| `v21` | General Tax Credit | Not produced on PolicyEngine rows | 2, 5 | +| `v22` | Child Tax Credit | `ctc_value`. In years when the credit is not fully refundable, capped at `ctc_limiting_tax_liability`, so it reports the non-refundable part | 2, 5 | +| `v23` | Reserved | Not produced on PolicyEngine rows | 2, 5 | +| `v24` | Child Care Credit | `cdcc` | 2, 5 | +| `v25` | Earned Income Credit | `eitc` | 2, 5 | +| `v26` | Income for the Alternative Minimum Tax | `amt_income` | 2, 5 | +| `v27` | AMT Liability after credit for regular tax and other allowed credits | `alternative_minimum_tax` | 2, 5 | +| `v28` | Federal Income Tax Before Credits | `income_tax_main_rates` + `capital_gains_tax` | 2, 5 | +| `v29` | FICA | `taxsim_tfica` | 2, 5 | +| `v30` | State Household Income | Not produced on PolicyEngine rows | 2, 5 | +| `v31` | State Rent Expense (imputation for property tax credit) | Not produced on PolicyEngine rows | 2, 5 | +| `v32` | 32. AGI | A state-specific variable (41 states mapped) | 2, 5 | +| `v33` | 33. Exemptions | Not produced on PolicyEngine rows | 2, 5 | +| `v34` | 34. Standard Deduction | `state_standard_deduction` | 2, 5 | +| `v35` | 35. Itemized Deductions | `state_itemized_deductions` | 2, 5 | +| `v36` | 36. Taxable Income | A state-specific variable (42 states mapped) | 2, 5 | +| `staxbc` | Tax before credits | A state-specific variable (44 states mapped). For Delaware couples who elect to file separately on a combined return, the sum of the two separate taxes | 5 | +| `srebate` | State One-Time Rebate | `state_income_tax` with one-time state rebates set to 0, minus `state_income_tax` | 2, 5 | +| `v41` | State Bracket Rate | Not produced on PolicyEngine rows | 5 | +| `v37` | 37. Property Tax Credit | A state-specific variable (15 states mapped) | 2, 5 | +| `v38` | 38. Child Care Credit | A state-specific variable (27 states mapped) | 2, 5 | +| `v39` | 39. EIC | A state-specific variable (31 states mapped) | 2, 5 | +| `sctc` | Child Tax Credit | `taxsim_sctc` adapter (state-specific rules) | 5 | +| `v40` | 40. Total Credits | `state_non_refundable_credits` + `state_refundable_credits`. Summed with one-time state rebates set to 0; they are reported in `srebate` instead | 2, 5 | +| `v42` | 42. Earned Self-Employment Income for FICA | Always 0 on PolicyEngine rows | 2, 5 | +| `v43` | Medicare Tax on Unearned Income | Always 0 on PolicyEngine rows | 2, 5 | +| `v44` | 44. Medicare Tax on Earnings | `employee_medicare_tax` + `additional_medicare_tax` | 2 | +| `actc` | Refundable Part of CTC | `refundable_ctc` | 2, 5 | +| `cares` | Cares Recovery Rebates | `recovery_rebate_credit` | 2, 5 | + + +## Records computed by TAXSIM-35 + +`TaxsimRunner` (`policyengine_taxsim/runners/taxsim_runner.py`) handles records before 2021: + +1. Picks the bundled executable for the operating system: `taxsimtest-osx.exe`, `taxsimtest-linux.exe` or `taxsimtest-windows.exe`. It looks in `resources/taxsimtest/` under the working directory, then in `share/policyengine_taxsim/taxsimtest/` under the Python environment, where the wheel installs it. +2. Writes the records to a temporary CSV file, converting TAXSIM-32 dependent counts to ages, writing blanks as 0, writing a dependent age of 0 as 10, and keeping only the columns TAXSIM-35 accepts (ages up to `age10`). +3. Runs the executable through the shell (`cat input | executable > output` on macOS and Linux, `type` under `cmd.exe` on Windows) and reads its CSV output. It records the build stamp from the output header (for example `cd2026081819`) and prints it with the progress messages. +4. Deletes both temporary files. + +The executables are NBER's `taxsimtest` builds of TAXSIM-35. `resources/taxsimtest/README.md` describes how they are updated and checked; the [security notes](security-and-deployment.md#bundled-taxsim-35-executables) list their hashes and platforms. + +## Versions and pinning + +Three things determine a result: the policyengine-taxsim version (input and output mapping), the policyengine-us version (tax rules), and, for years before 2021, the bundled TAXSIM-35 build. + +**policyengine-taxsim.** Versioned in `pyproject.toml`. Each pull request adds a changelog fragment in `changelog.d/`; on merge to `main`, CI raises the version (major, minor or patch, from the fragment type), writes `CHANGELOG.md`, and publishes the release to PyPI. + +**policyengine-us.** `pyproject.toml` sets a minimum (`policyengine-us>=1.711.0`) and no maximum, so an install takes the newest release that fits the Python version. policyengine-us releases often (three times on 2026-10-09) and policyengine-us 2.x requires Python 3.11 or later; on Python 3.10 an install stops at 1.783.0, the last release that supports it (July 2026). The [security notes](security-and-deployment.md#python-versions) show which release each Python version gets. + +A new policyengine-us release can change results for any year, including past years, because fixes apply to every year a rule covers. To reproduce results: + +1. **Pin both packages**, for example `pip install policyengine-taxsim==3.1.1 policyengine-us==2.38.0`. +2. **Record the versions** with every set of results: + ```python + from importlib.metadata import version + + for package in ("policyengine-taxsim", "policyengine-us", "policyengine-core"): + print(package, version(package)) + ``` + In R, `policyengine_versions()` prints the same. For pre-2021 records, the progress message names the TAXSIM-35 build. [#1412](https://github.com/PolicyEngine/policyengine-taxsim/pull/1412) proposes a `--version` flag and a provenance file written with each run. +3. **Keep a copy of the packages.** PyPI does not keep every release. On 2026-10-09 the oldest policyengine-us release still on PyPI was 1.691.1, uploaded 2026-05-12, and the oldest policyengine-taxsim release was 2.10.0, uploaded 2026-02-26. Earlier releases can no longer be installed by version number, and policyengine-us has no git tags for most releases either. Download the exact files you run (`pip download`) and keep them with your results; the [security notes](security-and-deployment.md#installing-without-internet-access) show how. + +**TAXSIM-35 build.** The executables ship inside the policyengine-taxsim package, so pinning policyengine-taxsim pins them too. + +## Known differences from TAXSIM-35 + +Where the emulator knowingly differs from TAXSIM-35, as documented in this repository. The validation dashboard at [policyengine.org/us/taxsim](https://policyengine.org/us/taxsim) measures agreement record by record, and the [issue tracker](https://github.com/PolicyEngine/policyengine-taxsim/issues) records each investigated difference, many of which turned out to be TAXSIM errors. + +Inputs: + +- `nonprop` is ignored on PolicyEngine rows ([#1245](https://github.com/PolicyEngine/policyengine-taxsim/pull/1245) proposes mapping it). +- `mstat` 8, a dependent filing their own return, is computed as an ordinary unmarried filer ([#1218](https://github.com/PolicyEngine/policyengine-taxsim/pull/1218) proposes support). +- Spouse columns on a non-joint return are ignored; TAXSIM-35 rejects them. +- `state` -1 (compute every state) is not supported. +- PolicyEngine rows accept an 11th dependent age (`age11`); TAXSIM-35 accepts 10. +- Benefits, use taxes and the other fixed inputs above are zero, as TAXSIM-35 has no inputs for them. + +Calculations: + +- **Additional Medicare Tax.** `fiitax` excludes it and `tfica`, `fica` and `addmed` include it, following TAXSIM's author on [#416](https://github.com/PolicyEngine/policyengine-taxsim/issues/416) and [#1225](https://github.com/PolicyEngine/policyengine-taxsim/issues/1225). The bundled TAXSIM-35 build (cd2026081819) still adds it to `fiitax` for 2013 to 2023, so pre-2021 rows owing it carry it in `fiitax`. See the README. +- **State income tax as a federal deduction.** By default PolicyEngine deducts the state income tax it computes, as the law allows. The `PolicyEngineRunner.run` docstring records that the bundled TAXSIM-35 build deducted mortgage interest and property tax but not state income tax in the states and years checked; `--disable-salt` removes the state income tax deduction to match. +- **One-time state rebates.** PolicyEngine counts them in the tax year they are based on. TAXSIM-35 by default counts them in the year they are paid; its option 30 (`--taxsim-opt30` in `compare`) uses PolicyEngine's convention. `srebate` reports the amount either way. +- **Maryland.** `siitax` excludes county income tax, as TAXSIM-35's does. +- **New York.** `siitax` excludes the payments made outside Form IT-201. +- **Itemized deductions.** `mortgage` and `otheritem` are treated alike; in some states and years TAXSIM-35 leaves `otheritem` out of the state itemized deduction. See the README. +- **S corporation income and the net investment income tax.** Passive by default with policyengine-us 2.10.1 or later; see `--scorp-treatment` in the README. +- **Married filing separately.** `tests/test_married_filing_separately.py` documents the separate-return cases where the bundled TAXSIM-35 build and the emulator differ and the emulator deliberately does not copy TAXSIM-35. +- **Marginal rates.** A $100 wage change instead of one cent; see above. +- **Outputs not produced.** Outputs marked "Not produced" in the table above are absent on PolicyEngine rows, and `v42` and `v43` are always 0. + +## Testing + +- `tests/` runs on every pull request on Linux, macOS and Windows with Python 3.10 and 3.11 (`.github/workflows/ci.yml`). +- `tests/test_public_contract.py` and `tests/test_cli_entry_point.py` pin the public surfaces: the `policyengine-taxsim` command, the `policyengine_taxsim.runners` import path, and `PolicyEngineRunner(df).run()`. +- `tests/test_docs_reference.py` regenerates every generated block in these documents and fails if one is out of date. `tests/test_input_guide_claims.py` checks the input guide's lists of rejected and unchecked values. `tests/test_worked_example.py` runs the worked example. `tests/test_no_network.py` runs the emulator with every network connection refused. +- Many tests check the emulator against output from the bundled TAXSIM-35 executable; the [comparison dashboard](https://policyengine.org/us/taxsim) runs the full comparison for each year from 2021. diff --git a/docs/examples/custom-dataset/crosswalk.R b/docs/examples/custom-dataset/crosswalk.R new file mode 100644 index 000000000..94b92ab94 --- /dev/null +++ b/docs/examples/custom-dataset/crosswalk.R @@ -0,0 +1,69 @@ +# Turn a survey extract into TAXSIM input, compute taxes, and merge them back. +# Run from this directory: Rscript crosswalk.R +# survey_extract.csv is made up; swap in your own file and column names. +# Needs only base R and the policyengine-taxsim command on the PATH. + +survey <- read.csv("survey_extract.csv") + +# 1. Blank amounts mean "none". TAXSIM input has no missing values. +amounts <- c( + "wages_head", "wages_spouse", "self_emp_head", "interest", "dividends", + "pension", "social_security", "unemployment", "rent_paid", + "property_tax", "mortgage_interest", "charity", "childcare_cost" +) +survey[amounts][is.na(survey[amounts])] <- 0 + +# 2. Map each survey concept to a TAXSIM column. This survey codes married +# as 1; everyone else files as unmarried. +married <- survey$marital_status == 1 +taxsim <- data.frame( + taxsimid = survey$hh_id, + year = survey$tax_year, + statefip = survey$state_fips, # FIPS codes; SOI codes go in `state` + mstat = ifelse(married, 2, 1), + page = survey$age_head, + sage = ifelse(married & !is.na(survey$age_spouse), survey$age_spouse, 0), + depx = ifelse(is.na(survey$num_children), 0, survey$num_children), + pwages = survey$wages_head, + swages = ifelse(married, survey$wages_spouse, 0), + psemp = survey$self_emp_head, + intrec = survey$interest, + dividends = survey$dividends, + pensions = survey$pension, + gssi = survey$social_security, + pui = survey$unemployment, + rentpaid = survey$rent_paid, + proptax = survey$property_tax, + # Mortgage interest and charity are both non-AMT-preference itemized + # deductions, so both go in `mortgage`. + mortgage = survey$mortgage_interest + survey$charity, + childcare = survey$childcare_cost, + idtl = 2 +) + +# 3. Dependent ages: 0 reads as "not given" (age 10), so code infants as 1. +for (slot in 1:3) { + age <- survey[[paste0("child_age_", slot)]] + age[!is.na(age) & age == 0] <- 1 + age[is.na(age)] <- 0 + taxsim[[paste0("age", slot)]] <- age +} + +# 4. Check before running: the emulator does not reject most bad values. +stopifnot(!anyNA(taxsim), all(taxsim$mstat %in% c(1, 2, 6))) +stopifnot(!anyDuplicated(taxsim$taxsimid)) + +# 5. Write the TAXSIM input, run the emulator, and read the results. +write.csv(taxsim, "taxsim_input.csv", row.names = FALSE) +status <- system2( + "policyengine-taxsim", + c("policyengine", "taxsim_input.csv", "-o", "taxsim_results.csv") +) +stopifnot(status == 0) +results <- read.csv("taxsim_results.csv") + +# 6. Merge back on taxsimid and round amounts to cents. +taxes <- round(results[c("taxsimid", "fiitax", "siitax", "fica", "v10")], 2) +merged <- merge(survey, taxes, by.x = "hh_id", by.y = "taxsimid", all.x = TRUE) +write.csv(merged, "survey_with_taxes.csv", row.names = FALSE) +print(merged[c("hh_id", "tax_year", "fiitax", "siitax", "fica", "v10")]) diff --git a/docs/examples/custom-dataset/crosswalk.do b/docs/examples/custom-dataset/crosswalk.do new file mode 100644 index 000000000..84f8e5318 --- /dev/null +++ b/docs/examples/custom-dataset/crosswalk.do @@ -0,0 +1,64 @@ +* Turn a survey extract into TAXSIM input, compute taxes, and merge them back. +* Run from this directory: do crosswalk.do +* survey_extract.csv is made up; swap in your own file and variable names. +* Stata's shell must find the policyengine-taxsim command (see the guide). + +import delimited using "survey_extract.csv", clear asdouble + +* 1. Blank amounts mean "none". TAXSIM input has no missing values. +foreach v of varlist wages_head wages_spouse self_emp_head interest dividends /// + pension social_security unemployment rent_paid property_tax /// + mortgage_interest charity childcare_cost { + replace `v' = 0 if missing(`v') +} + +* 2. Map each survey concept to a TAXSIM variable. This survey codes married +* as 1; everyone else files as unmarried. (dividends already has its +* TAXSIM name.) +generate taxsimid = hh_id +generate year = tax_year +generate statefip = state_fips +generate mstat = cond(marital_status == 1, 2, 1) +generate page = age_head +generate sage = cond(mstat == 2, age_spouse, 0) +replace sage = 0 if missing(sage) +generate depx = cond(missing(num_children), 0, num_children) +generate pwages = wages_head +generate swages = cond(mstat == 2, wages_spouse, 0) +generate psemp = self_emp_head +generate intrec = interest +generate pensions = pension +generate gssi = social_security +generate pui = unemployment +generate rentpaid = rent_paid +generate proptax = property_tax +* Mortgage interest and charity are both non-AMT-preference itemized deductions. +generate mortgage = mortgage_interest + charity +generate childcare = childcare_cost +generate idtl = 2 + +* 3. Dependent ages: 0 reads as "not given" (age 10), so code infants as 1. +forvalues i = 1/3 { + generate age`i' = child_age_`i' + replace age`i' = 1 if age`i' == 0 + replace age`i' = 0 if missing(age`i') +} + +* 4. Write the TAXSIM input and run the emulator on it. The policyengine +* subcommand reads and writes Stata files directly. +preserve +keep taxsimid year statefip mstat page sage depx age1 age2 age3 pwages /// + swages psemp intrec dividends pensions gssi pui rentpaid proptax /// + mortgage childcare idtl +save "taxsim_input.dta", replace +! policyengine-taxsim policyengine taxsim_input.dta -o taxsim_results.dta +restore + +* 5. Merge the results back on taxsimid and round amounts to cents. +merge 1:1 taxsimid using "taxsim_results.dta", /// + keepusing(fiitax siitax fica v10) nogenerate +foreach v of varlist fiitax siitax fica v10 { + replace `v' = round(`v', 0.01) +} +save "survey_with_taxes.dta", replace +list hh_id tax_year fiitax siitax fica v10 diff --git a/docs/examples/custom-dataset/crosswalk.py b/docs/examples/custom-dataset/crosswalk.py new file mode 100644 index 000000000..af04ce2e3 --- /dev/null +++ b/docs/examples/custom-dataset/crosswalk.py @@ -0,0 +1,75 @@ +"""Turn a survey extract into TAXSIM input, compute taxes, and merge them back. + +Run from this directory: python crosswalk.py +survey_extract.csv is made up; swap in your own file and column names. +""" + +import pandas as pd + +from policyengine_taxsim.runners import StitchedRunner + +survey = pd.read_csv("survey_extract.csv") + +# 1. Blank amounts mean "none". TAXSIM input has no missing values, so make +# them zeros. +amounts = [ + "wages_head", "wages_spouse", "self_emp_head", "interest", "dividends", + "pension", "social_security", "unemployment", "rent_paid", + "property_tax", "mortgage_interest", "charity", "childcare_cost", +] # fmt: skip +survey[amounts] = survey[amounts].fillna(0) + +# 2. Map each survey concept to a TAXSIM column. This survey codes married +# as 1; everyone else files as unmarried (head of household with a child). +married = survey["marital_status"] == 1 +taxsim = pd.DataFrame( + { + "taxsimid": survey["hh_id"], + "year": survey["tax_year"], + "statefip": survey["state_fips"], # FIPS codes; SOI codes go in `state` + "mstat": married.map({True: 2, False: 1}), + "page": survey["age_head"], + "sage": survey["age_spouse"].where(married, 0).fillna(0), + "depx": survey["num_children"].fillna(0), + "pwages": survey["wages_head"], + "swages": survey["wages_spouse"].where(married, 0), + "psemp": survey["self_emp_head"], + "intrec": survey["interest"], + "dividends": survey["dividends"], + "pensions": survey["pension"], + "gssi": survey["social_security"], + "pui": survey["unemployment"], + "rentpaid": survey["rent_paid"], + "proptax": survey["property_tax"], + # Mortgage interest and charity are both itemized deductions that + # are not AMT preferences, so both go in `mortgage`. + "mortgage": survey["mortgage_interest"] + survey["charity"], + "childcare": survey["childcare_cost"], + "idtl": 2, # full output + } +) + +# 3. Dependent ages. The emulator reads an age of 0 as "not given" (and uses +# 10), so code infants as 1, as TAXSIM-35 instructs. +for slot in (1, 2, 3): + age = survey[f"child_age_{slot}"] + taxsim[f"age{slot}"] = age.mask(age == 0, 1).fillna(0) + +# 4. Check before running: the emulator does not reject most bad values. +assert taxsim.notna().all().all(), "recode every missing value first" +assert taxsim["mstat"].isin([1, 2, 6]).all(), "mstat must be 1, 2 or 6" +assert taxsim["taxsimid"].is_unique, "taxsimid must identify each record" + +# 5. Keep the TAXSIM input for the record, then compute. StitchedRunner is +# what the policyengine-taxsim command uses: 2021 and later go to +# PolicyEngine, earlier years to TAXSIM-35. +taxsim.to_csv("taxsim_input.csv", index=False) +results = StitchedRunner(taxsim).run() + +# 6. Merge back on taxsimid. Amounts are computed in 32-bit floating point, +# so round them to cents. +keep = ["taxsimid", "fiitax", "siitax", "fica", "v10"] +taxes = results[keep].astype(float).round(2) +merged = survey.merge(taxes, left_on="hh_id", right_on="taxsimid", how="left") +merged.drop(columns="taxsimid").to_csv("survey_with_taxes.csv", index=False) +print(merged[["hh_id", "tax_year", "fiitax", "siitax", "fica", "v10"]]) diff --git a/docs/examples/custom-dataset/survey_extract.csv b/docs/examples/custom-dataset/survey_extract.csv new file mode 100644 index 000000000..0ce5a34e1 --- /dev/null +++ b/docs/examples/custom-dataset/survey_extract.csv @@ -0,0 +1,7 @@ +hh_id,tax_year,state_fips,marital_status,age_head,age_spouse,num_children,child_age_1,child_age_2,child_age_3,wages_head,wages_spouse,self_emp_head,interest,dividends,pension,social_security,unemployment,rent_paid,property_tax,mortgage_interest,charity,childcare_cost +101,2023,6,1,38,36,2,4,9,,85000,42000,,300,,,,,,5500,12000,1500,6000 +102,2023,36,5,27,,1,0,,,38000,,,,,,,,16800,,,,4200 +103,2024,12,1,68,66,0,,,,,,,2500,1800,30000,34000,,,3200,,800, +104,2024,48,5,29,,0,,,,52000,,8000,120,,,,,13200,,,, +105,2022,39,1,44,41,3,2,6,15,60000,,,,,,,4000,14400,,,,3000 +106,2019,42,3,51,,0,,,,47000,,,900,400,,,,,2100,6000,, diff --git a/docs/input-guide.md b/docs/input-guide.md new file mode 100644 index 000000000..5751aaec0 --- /dev/null +++ b/docs/input-guide.md @@ -0,0 +1,601 @@ +# Input guide: running the emulator on your own data + +This guide is for analysts who want to compute taxes for their own records, such as a survey extract, with policyengine-taxsim. It covers every input column the emulator reads, what it does with blanks and unexpected values, and a complete example that goes from a survey file to taxes merged back onto it, in Python, Stata and R. + +The tables marked as generated are produced from the emulator's code by `scripts/generate_docs_reference.py`. `tests/test_docs_reference.py` fails whenever the code and these tables disagree, so they describe the code in this commit. + +Contents: + +- [The input file](#the-input-file) +- [Which engine computes each record](#which-engine-computes-each-record) +- [Input columns](#input-columns) +- [How the emulator reads each column](#how-the-emulator-reads-each-column) +- [Blank cells, text and unknown columns](#blank-cells-text-and-unknown-columns) +- [What the emulator rejects](#what-the-emulator-rejects) +- [Values the emulator does not check](#values-the-emulator-does-not-check) +- [Dependents](#dependents) +- [Married couples](#married-couples) +- [Reading the output](#reading-the-output) +- [Worked example: from a survey file to taxes](#worked-example-from-a-survey-file-to-taxes) +- [State codes](#state-codes) + +## The input file + +Each row is one tax unit: a filer, a spouse if they file jointly, and their dependents. The emulator takes the same columns as NBER's TAXSIM-35: + +- A CSV file with a header row, or a Stata `.dta` file with the `policyengine` subcommand. +- Column names in lowercase, exactly as listed below. They can be in any order. +- Only `year` is required. Every other column can be left out, and then takes the value shown in [How the emulator reads each column](#how-the-emulator-reads-each-column). +- Amounts are annual dollars for the tax year, as plain numbers: `52000`, not `$52,000`. + +The smallest useful file: + +```csv +taxsimid,year,state,mstat,page,pwages +1,2024,5,1,35,52000 +``` + +Run it with any of these: + +```bash +policyengine-taxsim < input.csv > output.csv # like taxsim35: stdin to stdout +policyengine-taxsim policyengine input.csv -o output.csv # file to file; also reads and writes .dta +``` + +The file-to-file form is the safer choice for now. Until [#1412](https://github.com/PolicyEngine/policyengine-taxsim/pull/1412) is merged, a stdin run whose input has any record before 2021 prints three TAXSIM progress lines to stdout ahead of the CSV header, so the output file does not parse as CSV. + + +## Which engine computes each record + +The emulator has two engines. PolicyEngine US computes 2021 and later. A TAXSIM-35 executable from NBER, bundled with the package, computes earlier years. Not every interface switches between them: + +| Interface | 2021 and later | Before 2021 | +|---|---|---| +| `policyengine-taxsim < in.csv > out.csv` | PolicyEngine | Bundled TAXSIM-35 | +| `policyengine-taxsim policyengine in.csv -o out.csv` | PolicyEngine | Bundled TAXSIM-35 | +| Python `StitchedRunner(df).run()` | PolicyEngine | Bundled TAXSIM-35 | +| Python `PolicyEngineRunner(df).run()` | PolicyEngine | PolicyEngine | +| R `policyengine_calculate_taxes()` | PolicyEngine | PolicyEngine | +| `policyengine-taxsim taxsim in.csv` | Bundled TAXSIM-35 | Bundled TAXSIM-35 | +| Web runner at policyengine.org/us/taxsim/run | PolicyEngine | TAXSIM-35, both on PolicyEngine's server | + +`PolicyEngineRunner` and the R package compute years before 2021 with PolicyEngine, which this project validates against TAXSIM only from 2021 on. Use the command line or `StitchedRunner` when your data include earlier years. + +NBER's own `taxsim35` command for Stata is separate software. It sends every record to TAXSIM-35, either a local `taxsim35.exe` or NBER's servers. The copy NBER served on 2026-10-09 contains no reference to PolicyEngine, so it does not switch engines by year. The year switch exists only in this package, in the interfaces marked above. See the [design document](design.md#routing-by-year) for how the switch works. + +## Input columns + +What each column means. The descriptions come from [`docs/reference/input_variables.yaml`](reference/input_variables.yaml), which the tests check against the columns the code reads. Where a note cites TAXSIM-35, it follows [NBER's input documentation](https://taxsim.nber.org/taxsimtest/). + + +#### Record and filing unit + +| Column | Meaning | Type | Valid values | +|---|---|---|---| +| `taxsimid` | Record identifier, returned unchanged in the output so you can merge results back onto your data. | Number | Any non-negative number. Give every record its own value; if the column is left out, records are numbered 1, 2, 3, ... in file order. | +| `year` | Tax year. Required. | Four-digit year | A whole number. 2021 and later are computed by PolicyEngine; earlier years by the bundled TAXSIM-35 executable, which covers 1960 onward (state must be 0 before 1977, per TAXSIM-35). | +| `state` | State of residence, as a TAXSIM SOI code. | Code | 1 (Alabama) to 51 (Wyoming), in alphabetical order with DC as 9; 0 for no state tax. -1 (TAXSIM's every-state option) is rejected. Use `state` or `statefip`, not both. | +| `statefip` | State of residence, as a FIPS code. An alternative to `state`. | Code | 1 (Alabama) to 56 (Wyoming), including 11 for DC; 0 or blank to use `state` instead. Codes that are not a state or DC (3, 7, 14, 43, 52) are rejected, as is a record with both `state` and `statefip` nonzero. | +| `mstat` | Filing status. | Code | 1 unmarried (filed as head of household when a dependent qualifies), 2 married filing jointly, 6 married filing separately. TAXSIM-35 also defines 8 (dependent taxpayer); see "Values the emulator does not check". | +| `page` | Age of the primary taxpayer on December 31 of the tax year. | Years | A whole number of years. | +| `sage` | Age of the spouse on December 31 of the tax year. Read only on joint returns (`mstat` 2). | Years | A whole number of years. TAXSIM-35 treats a nonzero `sage` on an unmarried return as an error. | +| `dependent_exemption` | Listed in the emulator's TAXSIM input definition, but neither engine reads it. Use `depx` and the dependent ages. | Number | Ignored. | + +#### Dependents + +| Column | Meaning | Type | Valid values | +|---|---|---|---| +| `depx` | Number of dependents. | Count | 0 to 11 on PolicyEngine rows. Pre-2021 TAXSIM rows receive ages for at most 10 dependents. | +| `age1` to `age11` | Age of dependent 1 on December 31 of the tax year. `age2` to `age11` hold the ages of dependents 2 to 11. | Years | A whole number of years. Ages are read only for the first `depx` dependents. Code an infant as 1, as TAXSIM-35 instructs. `age11` reaches PolicyEngine rows only; the TAXSIM-35 executable rejects it, so pre-2021 rows drop it. | +| `dep13` | TAXSIM-32 style count of dependents under 13. An alternative to the dependent ages. | Count | Counts are cumulative, so dep13 is at most dep17, which is at most dep18. Converted to ages 10 (under 13), 15 (13 to 16), 17 (17) and 21 (any of `depx` beyond `dep18`). PolicyEngine rows use the counts when the record gives no positive dependent age; pre-2021 rows use them only when the file has no age columns at all. | +| `dep17` | TAXSIM-32 style count of dependents under 17, including those under 13. | Count | See `dep13`. | +| `dep18` | TAXSIM-32 style count of dependents under 18, including those under 17. | Count | See `dep13`. | + +#### Wages and self-employment + +| Column | Meaning | Type | Valid values | +|---|---|---|---| +| `pwages` | Wage and salary income of the primary taxpayer. | Dollars per year | Any amount. | +| `swages` | Wage and salary income of the spouse. Read only on joint returns. | Dollars per year | Any amount. TAXSIM-35 requires zero on non-joint returns. | +| `psemp` | Self-employment income of the primary taxpayer that is not qualified business income, before self-employment tax. | Dollars per year | Any amount. | +| `ssemp` | Self-employment income of the spouse; see `psemp`. Read only on joint returns. | Dollars per year | Any amount. | + +#### Business income (QBI) + +| Column | Meaning | Type | Valid values | +|---|---|---|---| +| `pbusinc` | Primary taxpayer's active business income eligible for the qualified business income deduction without the specified-service phase-out. | Dollars per year | Any amount. | +| `sbusinc` | Spouse's active business income; see `pbusinc`. Read only on joint returns. | Dollars per year | Any amount. | +| `pprofinc` | Primary taxpayer's income from a specified service trade or business (SSTB), eligible for the qualified business income deduction subject to its phase-out. | Dollars per year | Any amount. | +| `sprofinc` | Spouse's SSTB income; see `pprofinc`. Read only on joint returns. | Dollars per year | Any amount. | +| `scorp` | S corporation and partnership profits (TAXSIM-35 describes this column as passive business income). | Dollars per year | Any amount; losses are entered as negative amounts. | + +#### Investment and other income + +| Column | Meaning | Type | Valid values | +|---|---|---|---| +| `dividends` | Qualified dividends (all dividends before 2003). Non-qualified dividends belong in `intrec`. | Dollars per year | Any amount. | +| `intrec` | Taxable interest received, and non-qualified dividends. | Dollars per year | Any amount. | +| `stcg` | Short-term capital gains or losses. | Dollars per year | Any amount; losses are negative. | +| `ltcg` | Long-term capital gains or losses. | Dollars per year | Any amount; losses are negative. | +| `otherprop` | Other property income in AGI that is subject to the net investment income tax, such as rent not eligible for the QBI deduction. | Dollars per year | Any amount; losses are negative. | +| `nonprop` | Other non-property income in AGI not subject to the net investment income tax (TAXSIM-35 lists alimony, non-wage fellowships and state tax refunds; adjustments such as IRA contributions go in as negative amounts). | Dollars per year | Any amount; adjustments are negative. | + +#### Retirement and benefits + +| Column | Meaning | Type | Valid values | +|---|---|---|---| +| `pensions` | Taxable pensions and IRA distributions. | Dollars per year | Any amount. | +| `gssi` | Gross Social Security benefits. | Dollars per year | Any amount. | +| `pui` | Unemployment compensation received by the primary taxpayer. | Dollars per year | Any amount. | +| `sui` | Unemployment compensation received by the spouse. Read only on joint returns. | Dollars per year | Any amount. | +| `transfers` | Non-taxable transfer income (welfare, workers' compensation, veterans' benefits, child support), which can affect state property tax rebates. | Dollars per year | Any amount. | + +#### Deductions and expenses + +| Column | Meaning | Type | Valid values | +|---|---|---|---| +| `rentpaid` | Rent paid, used for state renter credits and property tax rebates. | Dollars per year | Any amount. | +| `proptax` | Real estate taxes paid. | Dollars per year | Any amount. | +| `otheritem` | Other itemized deductions that TAXSIM-35 treats as AMT preferences (other state and local taxes, the preference share of medical expenses, other interest, miscellaneous). | Dollars per year | Any amount. | +| `mortgage` | Itemized deductions that are not AMT preferences (home mortgage interest, charitable contributions, deductible medical expenses, and so on). | Dollars per year | Any amount. | +| `childcare` | Child care expenses. | Dollars per year | Any amount. | + +#### Output and options + +| Column | Meaning | Type | Valid values | +|---|---|---|---| +| `idtl` | How much output to return for the record. | Code | 0 standard output, 2 full output, 5 full output plus a text report. Any other value returns no tax amounts for the record on PolicyEngine rows. | +| `opt1` | A TAXSIM-35 option number, passed to the TAXSIM-35 executable for pre-2021 rows (for example 30, its PSL-conformance mode). | Code | See https://taxsim.nber.org/taxsimtest/options.html. PolicyEngine rows ignore it. | +| `opt1v` | The value for the option in `opt1`. | Number | See `opt1`. | + + +## How the emulator reads each column + +Generated by running the emulator's input code on test records, so it shows what the code does rather than what it is meant to do. + +- **Blank cell**: the value used when the column is present but the cell is empty or missing, on records computed by PolicyEngine. +- **Column left out**: the value used when the file has no such column. +- **PolicyEngine input**: the PolicyEngine US variable the column sets, and for whom. "Primary taxpayer" is the filer in `page`; "spouse" exists only on joint returns. +- **Pre-2021 rows**: whether the column reaches the TAXSIM-35 executable. Blank cells are written to it as 0, which TAXSIM-35 reads by its own rules (for example, it reads a taxpayer age of 0 as 40). + + +| Column | Blank cell | Column left out | PolicyEngine input (2021 and later) | Pre-2021 rows, to TAXSIM-35 | +|---|---|---|---|---| +| `taxsimid` | Blank in the output | Records numbered 1, 2, 3, ... | None: returned as `taxsimid` | Passed | +| `year` | Error: ValueError: cannot convert float NaN to integer | Error: ValueError: Input data must contain a 'year' column | The period every variable is computed for | Passed | +| `state` | 0 | 0 | `state_fips`, converted from the SOI code. State 0 is computed as Texas, which has no income tax, and reported as 0 | Passed | +| `statefip` | `state` is used | `state` is used | `state_fips` (converted to `state` first) | Converted to `state` first | +| `mstat` | 1; 0 also becomes 1 | 1 | 1, 8 and 3 builds a one-adult unit; 2 adds a spouse to the tax unit; 6 builds a one-adult unit with `is_separated` and `cohabitating_spouses` set. Tested codes: 1, 2, 6, 8 and 3 | Passed | +| `page` | 40; 0 also becomes 40 | 40 | `age` of the primary taxpayer | Passed | +| `sage` | 40; 0 also becomes 40 | 40 | `age` of the spouse (joint returns only) | Passed | +| `dependent_exemption` | Not used | Not used | Not used: no effect on PolicyEngine rows | Not passed | +| `depx` | 0 | 0 | Number of dependents added to the tax unit | Passed | +| `age1` | 10; 0 also becomes 10 | 10 | `age` of dependent 1 | Passed | +| `age2` | 10; 0 also becomes 10 | 10 | `age` of dependent 2 | Passed | +| `age3` | 10; 0 also becomes 10 | 10 | `age` of dependent 3 | Passed | +| `age4` | 10; 0 also becomes 10 | 10 | `age` of dependent 4 | Passed | +| `age5` | 10; 0 also becomes 10 | 10 | `age` of dependent 5 | Passed | +| `age6` | 10; 0 also becomes 10 | 10 | `age` of dependent 6 | Passed | +| `age7` | 10; 0 also becomes 10 | 10 | `age` of dependent 7 | Passed | +| `age8` | 10; 0 also becomes 10 | 10 | `age` of dependent 8 | Passed | +| `age9` | 10; 0 also becomes 10 | 10 | `age` of dependent 9 | Passed | +| `age10` | 10; 0 also becomes 10 | 10 | `age` of dependent 10 | Passed | +| `age11` | 10; 0 also becomes 10 | 0 | `age` of dependent 11 | Not passed | +| `dep13` | 0 | 0 | Dependent `age`s 10, 15, 17 and 21 (see `dep13`) | Converted to ages first | +| `dep17` | 0 | 0 | Dependent `age`s 10, 15, 17 and 21 (see `dep13`) | Converted to ages first | +| `dep18` | 0 | 0 | Dependent `age`s 10, 15, 17 and 21 (see `dep13`) | Converted to ages first | +| `pwages` | 0 | 0 | `employment_income` of the primary taxpayer | Passed | +| `swages` | 0 | 0 | `employment_income` of the spouse; ignored unless `mstat` is 2 | Passed | +| `psemp` | 0 | 0 | `self_employment_income` of the primary taxpayer, summed with `pbusinc` | Passed | +| `ssemp` | 0 | 0 | `self_employment_income` of the spouse; ignored unless `mstat` is 2 | Passed | +| `pbusinc` | 0 | 0 | `self_employment_income` of the primary taxpayer, summed with `psemp` | Passed | +| `sbusinc` | 0 | 0 | `self_employment_income` of the spouse; ignored unless `mstat` is 2 | Passed | +| `pprofinc` | 0 | 0 | `sstb_self_employment_income` of the primary taxpayer | Passed | +| `sprofinc` | 0 | 0 | `sstb_self_employment_income` of the spouse; ignored unless `mstat` is 2 | Passed | +| `scorp` | 0 | 0 | `partnership_s_corp_income`, split evenly between spouses on joint returns | Passed | +| `dividends` | 0 | 0 | `qualified_dividend_income`, split evenly between spouses on joint returns | Passed | +| `intrec` | 0 | 0 | `taxable_interest_income`, split evenly between spouses on joint returns | Passed | +| `stcg` | 0 | 0 | `short_term_capital_gains`, split evenly between spouses on joint returns | Passed | +| `ltcg` | 0 | 0 | `long_term_capital_gains`, split evenly between spouses on joint returns | Passed | +| `otherprop` | 0 | 0 | `rental_income` of the primary taxpayer | Passed | +| `nonprop` | Not used | Not used | Not used: no effect on PolicyEngine rows | Passed | +| `pensions` | 0 | 0 | `taxable_private_pension_income`, split evenly between spouses on joint returns, or all to the older spouse when only one has reached the age threshold (see below) | Passed | +| `gssi` | 0 | 0 | `social_security_retirement`, split evenly between spouses on joint returns, or all to the older spouse when only one has reached the age threshold (see below) | Passed | +| `pui` | 0 | 0 | `unemployment_compensation` of the primary taxpayer | Passed | +| `sui` | 0 | 0 | `unemployment_compensation` of the spouse; ignored unless `mstat` is 2 | Passed | +| `transfers` | 0 | 0 | `general_assistance` of the primary taxpayer | Passed | +| `rentpaid` | 0 | 0 | `rent` of the primary taxpayer | Passed | +| `proptax` | 0 | 0 | `real_estate_taxes` of the primary taxpayer | Passed | +| `otheritem` | 0 | 0 | `deductible_mortgage_interest` of the primary taxpayer, summed with `mortgage` | Passed | +| `mortgage` | 0 | 0 | `deductible_mortgage_interest` of the primary taxpayer, summed with `otheritem` | Passed | +| `childcare` | 0 | 0 | `tax_unit_childcare_expenses` of the tax unit | Passed | +| `idtl` | 0 | 0 | None: selects the output columns | Passed | +| `opt1` | Not used | Not used | Not used: no effect on PolicyEngine rows | Passed | +| `opt1v` | Not used | Not used | Not used: no effect on PolicyEngine rows | Passed | + + +On joint returns, pensions and Social Security are split evenly between spouses unless exactly one spouse has reached the age at which state retirement exclusions start. Then the older spouse gets the whole amount, so an age-based exclusion is not lost on the younger one. The ages: + + +- Default threshold: 55, for `gssi` in every state and for `pensions` in states not listed below. +- `pensions` in GA: 62. +- `pensions` in KY: always split evenly. + + +A few columns also switch on assumptions at run time, after the inputs above are built. The [design document](design.md#adjustments-at-run-time) lists them. The ones that depend on an input value: any `otherprop` turns off the QBI deduction on rental income; `rentpaid` in Minnesota assumes a Certificate of Rent Paid; and `rentpaid` in Maine is treated as including utilities. + +## Blank cells, text and unknown columns + +TAXSIM-35 accepts no missing values: "missing data can be represented by zeroes". The emulator is more lenient, which makes mistakes easier to miss: + +- **Blank cells** take the values in the table above: 0 for amounts, 40 for adult ages, 10 for dependent ages, 1 for `mstat`, 0 for `state`. +- **Missing-value words** that pandas recognizes, such as `NA`, `N/A`, `NaN`, `null` and `#N/A`, are read as blank cells. +- **Any other text** stops the run, including Stata's `.` for missing and numbers with thousands separators (`"50,000"`). The error names the value: `could not convert string to float: '.'`. +- **Unknown or misspelled column names are ignored without a warning.** A column named `PWAGES` or `wages` is dropped, and the record is computed as if it had no wages. Column names are case-sensitive. The web runner warns about unrecognized columns; the command line and Python do not. + +Recode missing values yourself before running, so every 0 is a choice. The [worked example](#worked-example-from-a-survey-file-to-taxes) does this. + +## What the emulator rejects + +These stop the whole run with an error naming the problem. Each one was checked against the code and is covered by a test. + +| Input | Error | +|---|---| +| No `year` column | `Input data must contain a 'year' column` | +| A blank `year` | `Cannot convert non-finite values (NA or inf) to integer` from the command line and `StitchedRunner`; `cannot convert float NaN to integer` from `PolicyEngineRunner` | +| `state` outside 0 to 51, or not a whole number | `Record 1: 52 is not a valid TAXSIM SOI state code (0-51)` | +| `state` of -1 (TAXSIM's every-state option) | `TAXSIM state -1 (compute every state) is not supported` | +| `state` given as text, such as `CA` | `TAXSIM state code must be a number, got 'CA'` | +| `statefip` that is not a state or DC | `statefip must be a valid US state FIPS code (1-56, including DC) or 0` | +| Both `state` and `statefip` nonzero | `state 5 and statefip 6 are both nonzero; TAXSIM accepts only one of them` | +| Text in a numeric column, including `.` | `could not convert string to float: '.'` | + +The R package is the exception for state codes: it converts two-letter abbreviations such as `"CA"` to SOI codes before calling the emulator. + +## Values the emulator does not check + +The emulator computes these without complaint. Check for them yourself. + +- **Filing status codes other than 1, 2 and 6.** On PolicyEngine rows they are computed as an unmarried filer; the table above shows which codes were tested. TAXSIM-35's code 8, a dependent filing their own return, therefore gets a full standard deduction instead of a dependent's. [#1218](https://github.com/PolicyEngine/policyengine-taxsim/pull/1218) proposes support for code 8. +- **Spouse columns on non-joint returns.** `sage`, `swages`, `ssemp`, `sbusinc`, `sprofinc` and `sui` are ignored unless `mstat` is 2. TAXSIM-35 treats a nonzero value as an error. Survey data that pair this year's marital status with last year's income can hit this. +- **`nonprop`.** PolicyEngine rows ignore it, so other non-property income (alimony received, fellowships) and adjustments (IRA contributions) entered there have no effect. Pre-2021 rows pass it to TAXSIM-35. [#1245](https://github.com/PolicyEngine/policyengine-taxsim/pull/1245) proposes mapping it. +- **`idtl` values other than 0, 2 and 5.** The record is computed but its output cells are blank. +- **Negative amounts.** They are passed to the engines as given. +- **Duplicate `taxsimid` values.** Both records are computed. Merging results back on `taxsimid` then fails or doubles up, so keep IDs unique. +- **Fractions in codes and counts.** On PolicyEngine rows, `year`, `mstat`, `page`, `sage`, `depx` and the dependent ages are cut to whole numbers: an age of 40.7 becomes 40. +- **Ages given for more dependents than `depx`.** Only the first `depx` ages are read. + +## Dependents + +- Set `depx` to the number of dependents and give their ages in `age1`, `age2`, and so on. PolicyEngine rows read up to 11; pre-2021 rows pass ages for up to 10 to TAXSIM-35. +- A dependent age of 0, or a blank one, is read as 10. **Code infants as 1**, as TAXSIM-35 instructs. Otherwise a newborn misses credits for young children, such as the 2021 child tax credit of $3,600 for children under 6 instead of $3,000. +- There is no input for full-time students. On PolicyEngine rows a dependent aged 19 or older is not a qualifying child for the earned income tax credit, so TAXSIM-35's advice to code students aged 20 to 23 as 19 does not carry over: a student counts for the EITC only if coded as 18 or younger. +- Files written for TAXSIM-32 can give counts instead of ages: `dep13`, `dep17` and `dep18` (cumulative). The emulator converts them to ages 10, 15, 17 and 21. On PolicyEngine rows the counts are used when the record has no positive age; on pre-2021 rows only when the file has no age columns. + +## Married couples + +- `mstat` 2 is a joint return with a spouse. Give the spouse's age in `sage` and their own earnings in `swages`, `ssemp`, `sbusinc`, `sprofinc` and `sui`. +- Household amounts with no spouse column (interest, dividends, capital gains, S corporation income) are split evenly between spouses. Pensions and Social Security follow the age rule above. +- `mstat` 6 is one spouse's separate return. It builds a one-adult tax unit: give only that spouse's income and leave the spouse columns at 0. PolicyEngine files it as married filing separately, or as head of household when a qualifying child lets the filer be treated as unmarried. + +## Reading the output + +Choose the output with `idtl`: 0 for the standard columns, 2 for full detail, 5 for full detail plus a text report. Only the stdin command writes the text report; other interfaces return the same results as a table. The [design document](design.md#where-each-output-comes-from) lists every output column and how it is computed. The main ones: + +| Column | Meaning | +|---|---| +| `taxsimid`, `year`, `state` | Echoed from the input | +| `fiitax` | Federal income tax, after credits; refundable credits make it negative | +| `siitax` | State income tax, after credits | +| `fica` | Social Security and Medicare taxes, employee and employer shares | +| `tfica` | The taxpayer's share of `fica` | +| `frate`, `srate` | Federal and state marginal rates on wages, in percent | +| `v10` | Federal adjusted gross income (with `idtl` 2 or 5) | + +Things to know when you use the results: + +- **Merge on `taxsimid`, not row order.** The command line and `StitchedRunner` return records in input order. `PolicyEngineRunner` and the R package currently return them grouped by year. +- **Round to cents.** PolicyEngine computes in 32-bit floating point. A value can come back as `4009.199951171875`; it means 4009.20. +- **A file mixing years before and after 2021 has both engines' columns.** Cells an engine doesn't produce are blank, and TAXSIM-35 adds a column named for its build stamp, such as `cd2026081819`. +- **Results depend on the versions installed.** Record the policyengine-taxsim and policyengine-us versions with your results. The [design document](design.md#versions-and-pinning) explains how to pin them. + +## Worked example: from a survey file to taxes + +This example starts from a survey-style extract with its own column names and codes, builds the TAXSIM input, computes taxes, and merges them back. The six households are made up for this guide. The files are in [`docs/examples/custom-dataset/`](examples/custom-dataset/); copy that folder and run the script for your language there. + +The survey extract: + + +```csv +hh_id,tax_year,state_fips,marital_status,age_head,age_spouse,num_children,child_age_1,child_age_2,child_age_3,wages_head,wages_spouse,self_emp_head,interest,dividends,pension,social_security,unemployment,rent_paid,property_tax,mortgage_interest,charity,childcare_cost +101,2023,6,1,38,36,2,4,9,,85000,42000,,300,,,,,,5500,12000,1500,6000 +102,2023,36,5,27,,1,0,,,38000,,,,,,,,16800,,,,4200 +103,2024,12,1,68,66,0,,,,,,,2500,1800,30000,34000,,,3200,,800, +104,2024,48,5,29,,0,,,,52000,,8000,120,,,,,13200,,,, +105,2022,39,1,44,41,3,2,6,15,60000,,,,,,,4000,14400,,,,3000 +106,2019,42,3,51,,0,,,,47000,,,900,400,,,,,2100,6000,, +``` + + +It codes marital status 1 as married, gives state FIPS codes, leaves blanks for "none", and records one newborn as age 0 (household 102). The crosswalk in each language does the same five things: + +1. Turns blank amounts into zeros. +2. Maps each survey concept to a TAXSIM column, recoding marital status to `mstat` and adding charity to mortgage interest in `mortgage`. +3. Recodes the newborn's age from 0 to 1, and missing ages to 0. +4. Checks for missing values, filing status codes and duplicate IDs, which the emulator would not catch. +5. Computes taxes and merges them back on `taxsimid`, rounded to cents. + +### Python + +Uses `StitchedRunner`, so household 106 (2019) goes to TAXSIM-35 like it would on the command line. + + +```python +"""Turn a survey extract into TAXSIM input, compute taxes, and merge them back. + +Run from this directory: python crosswalk.py +survey_extract.csv is made up; swap in your own file and column names. +""" + +import pandas as pd + +from policyengine_taxsim.runners import StitchedRunner + +survey = pd.read_csv("survey_extract.csv") + +# 1. Blank amounts mean "none". TAXSIM input has no missing values, so make +# them zeros. +amounts = [ + "wages_head", "wages_spouse", "self_emp_head", "interest", "dividends", + "pension", "social_security", "unemployment", "rent_paid", + "property_tax", "mortgage_interest", "charity", "childcare_cost", +] # fmt: skip +survey[amounts] = survey[amounts].fillna(0) + +# 2. Map each survey concept to a TAXSIM column. This survey codes married +# as 1; everyone else files as unmarried (head of household with a child). +married = survey["marital_status"] == 1 +taxsim = pd.DataFrame( + { + "taxsimid": survey["hh_id"], + "year": survey["tax_year"], + "statefip": survey["state_fips"], # FIPS codes; SOI codes go in `state` + "mstat": married.map({True: 2, False: 1}), + "page": survey["age_head"], + "sage": survey["age_spouse"].where(married, 0).fillna(0), + "depx": survey["num_children"].fillna(0), + "pwages": survey["wages_head"], + "swages": survey["wages_spouse"].where(married, 0), + "psemp": survey["self_emp_head"], + "intrec": survey["interest"], + "dividends": survey["dividends"], + "pensions": survey["pension"], + "gssi": survey["social_security"], + "pui": survey["unemployment"], + "rentpaid": survey["rent_paid"], + "proptax": survey["property_tax"], + # Mortgage interest and charity are both itemized deductions that + # are not AMT preferences, so both go in `mortgage`. + "mortgage": survey["mortgage_interest"] + survey["charity"], + "childcare": survey["childcare_cost"], + "idtl": 2, # full output + } +) + +# 3. Dependent ages. The emulator reads an age of 0 as "not given" (and uses +# 10), so code infants as 1, as TAXSIM-35 instructs. +for slot in (1, 2, 3): + age = survey[f"child_age_{slot}"] + taxsim[f"age{slot}"] = age.mask(age == 0, 1).fillna(0) + +# 4. Check before running: the emulator does not reject most bad values. +assert taxsim.notna().all().all(), "recode every missing value first" +assert taxsim["mstat"].isin([1, 2, 6]).all(), "mstat must be 1, 2 or 6" +assert taxsim["taxsimid"].is_unique, "taxsimid must identify each record" + +# 5. Keep the TAXSIM input for the record, then compute. StitchedRunner is +# what the policyengine-taxsim command uses: 2021 and later go to +# PolicyEngine, earlier years to TAXSIM-35. +taxsim.to_csv("taxsim_input.csv", index=False) +results = StitchedRunner(taxsim).run() + +# 6. Merge back on taxsimid. Amounts are computed in 32-bit floating point, +# so round them to cents. +keep = ["taxsimid", "fiitax", "siitax", "fica", "v10"] +taxes = results[keep].astype(float).round(2) +merged = survey.merge(taxes, left_on="hh_id", right_on="taxsimid", how="left") +merged.drop(columns="taxsimid").to_csv("survey_with_taxes.csv", index=False) +print(merged[["hh_id", "tax_year", "fiitax", "siitax", "fica", "v10"]]) +``` + + +### Stata + +Writes the TAXSIM input as a Stata file and calls the `policyengine` subcommand, which reads and writes `.dta` directly, so no CSV parsing is involved. Stata's shell must be able to find `policyengine-taxsim`. If it can't, give the full path, for example `! /home/me/taxsim-env/bin/policyengine-taxsim` on Linux or macOS, or `! C:\taxsim-env\Scripts\policyengine-taxsim.exe` on Windows. + + +```stata +* Turn a survey extract into TAXSIM input, compute taxes, and merge them back. +* Run from this directory: do crosswalk.do +* survey_extract.csv is made up; swap in your own file and variable names. +* Stata's shell must find the policyengine-taxsim command (see the guide). + +import delimited using "survey_extract.csv", clear asdouble + +* 1. Blank amounts mean "none". TAXSIM input has no missing values. +foreach v of varlist wages_head wages_spouse self_emp_head interest dividends /// + pension social_security unemployment rent_paid property_tax /// + mortgage_interest charity childcare_cost { + replace `v' = 0 if missing(`v') +} + +* 2. Map each survey concept to a TAXSIM variable. This survey codes married +* as 1; everyone else files as unmarried. (dividends already has its +* TAXSIM name.) +generate taxsimid = hh_id +generate year = tax_year +generate statefip = state_fips +generate mstat = cond(marital_status == 1, 2, 1) +generate page = age_head +generate sage = cond(mstat == 2, age_spouse, 0) +replace sage = 0 if missing(sage) +generate depx = cond(missing(num_children), 0, num_children) +generate pwages = wages_head +generate swages = cond(mstat == 2, wages_spouse, 0) +generate psemp = self_emp_head +generate intrec = interest +generate pensions = pension +generate gssi = social_security +generate pui = unemployment +generate rentpaid = rent_paid +generate proptax = property_tax +* Mortgage interest and charity are both non-AMT-preference itemized deductions. +generate mortgage = mortgage_interest + charity +generate childcare = childcare_cost +generate idtl = 2 + +* 3. Dependent ages: 0 reads as "not given" (age 10), so code infants as 1. +forvalues i = 1/3 { + generate age`i' = child_age_`i' + replace age`i' = 1 if age`i' == 0 + replace age`i' = 0 if missing(age`i') +} + +* 4. Write the TAXSIM input and run the emulator on it. The policyengine +* subcommand reads and writes Stata files directly. +preserve +keep taxsimid year statefip mstat page sage depx age1 age2 age3 pwages /// + swages psemp intrec dividends pensions gssi pui rentpaid proptax /// + mortgage childcare idtl +save "taxsim_input.dta", replace +! policyengine-taxsim policyengine taxsim_input.dta -o taxsim_results.dta +restore + +* 5. Merge the results back on taxsimid and round amounts to cents. +merge 1:1 taxsimid using "taxsim_results.dta", /// + keepusing(fiitax siitax fica v10) nogenerate +foreach v of varlist fiitax siitax fica v10 { + replace `v' = round(`v', 0.01) +} +save "survey_with_taxes.dta", replace +list hh_id tax_year fiitax siitax fica v10 +``` + + +This script has not been run in Stata; the build machine has no Stata license. Its handoff to the emulator (a `.dta` file in, a `.dta` file out, merged on `taxsimid`) is tested by `tests/test_worked_example.py`, which runs the same command on the same input. + +### R + +Uses base R and the command line, so it needs no R packages and works offline once policyengine-taxsim is installed. The `policyenginetaxsim` R package is an alternative, but it installs Python packages from GitHub on first use and computes every year with PolicyEngine. + + +```r +# Turn a survey extract into TAXSIM input, compute taxes, and merge them back. +# Run from this directory: Rscript crosswalk.R +# survey_extract.csv is made up; swap in your own file and column names. +# Needs only base R and the policyengine-taxsim command on the PATH. + +survey <- read.csv("survey_extract.csv") + +# 1. Blank amounts mean "none". TAXSIM input has no missing values. +amounts <- c( + "wages_head", "wages_spouse", "self_emp_head", "interest", "dividends", + "pension", "social_security", "unemployment", "rent_paid", + "property_tax", "mortgage_interest", "charity", "childcare_cost" +) +survey[amounts][is.na(survey[amounts])] <- 0 + +# 2. Map each survey concept to a TAXSIM column. This survey codes married +# as 1; everyone else files as unmarried. +married <- survey$marital_status == 1 +taxsim <- data.frame( + taxsimid = survey$hh_id, + year = survey$tax_year, + statefip = survey$state_fips, # FIPS codes; SOI codes go in `state` + mstat = ifelse(married, 2, 1), + page = survey$age_head, + sage = ifelse(married & !is.na(survey$age_spouse), survey$age_spouse, 0), + depx = ifelse(is.na(survey$num_children), 0, survey$num_children), + pwages = survey$wages_head, + swages = ifelse(married, survey$wages_spouse, 0), + psemp = survey$self_emp_head, + intrec = survey$interest, + dividends = survey$dividends, + pensions = survey$pension, + gssi = survey$social_security, + pui = survey$unemployment, + rentpaid = survey$rent_paid, + proptax = survey$property_tax, + # Mortgage interest and charity are both non-AMT-preference itemized + # deductions, so both go in `mortgage`. + mortgage = survey$mortgage_interest + survey$charity, + childcare = survey$childcare_cost, + idtl = 2 +) + +# 3. Dependent ages: 0 reads as "not given" (age 10), so code infants as 1. +for (slot in 1:3) { + age <- survey[[paste0("child_age_", slot)]] + age[!is.na(age) & age == 0] <- 1 + age[is.na(age)] <- 0 + taxsim[[paste0("age", slot)]] <- age +} + +# 4. Check before running: the emulator does not reject most bad values. +stopifnot(!anyNA(taxsim), all(taxsim$mstat %in% c(1, 2, 6))) +stopifnot(!anyDuplicated(taxsim$taxsimid)) + +# 5. Write the TAXSIM input, run the emulator, and read the results. +write.csv(taxsim, "taxsim_input.csv", row.names = FALSE) +status <- system2( + "policyengine-taxsim", + c("policyengine", "taxsim_input.csv", "-o", "taxsim_results.csv") +) +stopifnot(status == 0) +results <- read.csv("taxsim_results.csv") + +# 6. Merge back on taxsimid and round amounts to cents. +taxes <- round(results[c("taxsimid", "fiitax", "siitax", "fica", "v10")], 2) +merged <- merge(survey, taxes, by.x = "hh_id", by.y = "taxsimid", all.x = TRUE) +write.csv(merged, "survey_with_taxes.csv", row.names = FALSE) +print(merged[c("hh_id", "tax_year", "fiitax", "siitax", "fica", "v10")]) +``` + + +### Result + +All three scripts print the same taxes. This run used policyengine-taxsim 3.1.1 with policyengine-us 2.38.0 on Python 3.11; other versions can give different amounts. + +| hh_id | tax_year | fiitax | siitax | fica | v10 | +|---|---|---|---|---|---| +| 101 | 2023 | 7327.00 | 2566.80 | 19431.00 | 127300.00 | +| 102 | 2023 | -2307.89 | -269.19 | 5814.00 | 38000.00 | +| 103 | 2024 | 1240.50 | 0.00 | 0.00 | 46505.00 | +| 104 | 2024 | 4984.14 | 0.00 | 9086.36 | 59554.82 | +| 105 | 2022 | -1839.00 | 1145.83 | 9180.00 | 64000.00 | +| 106 | 2019 | 4090.00 | 1482.81 | 7191.00 | 48300.00 | + +Household 102, the single parent with a newborn, has negative federal and state tax because refundable credits exceed tax. Household 106 was computed by TAXSIM-35 because its tax year is 2019. + +## State codes + +`state` takes SOI codes; `statefip` takes FIPS codes. Give one or the other. + + +| SOI | State | FIPS | SOI | State | FIPS | SOI | State | FIPS | SOI | State | FIPS | +|---|---|---|---|---|---|---|---|---|---|---|---| +| 1 | AL | 1 | 2 | AK | 2 | 3 | AZ | 4 | 4 | AR | 5 | +| 5 | CA | 6 | 6 | CO | 8 | 7 | CT | 9 | 8 | DE | 10 | +| 9 | DC | 11 | 10 | FL | 12 | 11 | GA | 13 | 12 | HI | 15 | +| 13 | ID | 16 | 14 | IL | 17 | 15 | IN | 18 | 16 | IA | 19 | +| 17 | KS | 20 | 18 | KY | 21 | 19 | LA | 22 | 20 | ME | 23 | +| 21 | MD | 24 | 22 | MA | 25 | 23 | MI | 26 | 24 | MN | 27 | +| 25 | MS | 28 | 26 | MO | 29 | 27 | MT | 30 | 28 | NE | 31 | +| 29 | NV | 32 | 30 | NH | 33 | 31 | NJ | 34 | 32 | NM | 35 | +| 33 | NY | 36 | 34 | NC | 37 | 35 | ND | 38 | 36 | OH | 39 | +| 37 | OK | 40 | 38 | OR | 41 | 39 | PA | 42 | 40 | RI | 44 | +| 41 | SC | 45 | 42 | SD | 46 | 43 | TN | 47 | 44 | TX | 48 | +| 45 | UT | 49 | 46 | VT | 50 | 47 | VA | 51 | 48 | WA | 53 | +| 49 | WV | 54 | 50 | WI | 55 | 51 | WY | 56 | | | | + diff --git a/docs/reference/input_variables.yaml b/docs/reference/input_variables.yaml new file mode 100644 index 000000000..405743cbd --- /dev/null +++ b/docs/reference/input_variables.yaml @@ -0,0 +1,239 @@ +# What each TAXSIM input column means, for docs/input-guide.md. +# +# This file holds only what the code cannot say: the meaning, type and valid +# values of each column. How the emulator reads a column (what a blank cell +# becomes, which PolicyEngine variable it feeds, whether pre-2021 TAXSIM rows +# receive it) is worked out from the code by scripts/generate_docs_reference.py. +# +# tests/test_docs_reference.py fails when this file is missing a column the +# emulator reads, lists one it does not, or when docs/input-guide.md no longer +# matches what the generator produces. After editing, run: +# +# python scripts/generate_docs_reference.py +# +# Fields: +# group section heading in the generated table +# meaning what the column holds +# type kind of value and units +# valid accepted values; "TAXSIM-35" notes quote NBER's input documentation +# (https://taxsim.nber.org/taxsimtest/, retrieved 2026-10-09) + +taxsimid: + group: Record and filing unit + meaning: Record identifier, returned unchanged in the output so you can merge results back onto your data. + type: Number + valid: Any non-negative number. Give every record its own value; if the column is left out, records are numbered 1, 2, 3, ... in file order. +year: + group: Record and filing unit + meaning: Tax year. Required. + type: Four-digit year + valid: A whole number. 2021 and later are computed by PolicyEngine; earlier years by the bundled TAXSIM-35 executable, which covers 1960 onward (state must be 0 before 1977, per TAXSIM-35). +state: + group: Record and filing unit + meaning: State of residence, as a TAXSIM SOI code. + type: Code + valid: 1 (Alabama) to 51 (Wyoming), in alphabetical order with DC as 9; 0 for no state tax. -1 (TAXSIM's every-state option) is rejected. Use `state` or `statefip`, not both. +statefip: + group: Record and filing unit + meaning: State of residence, as a FIPS code. An alternative to `state`. + type: Code + valid: 1 (Alabama) to 56 (Wyoming), including 11 for DC; 0 or blank to use `state` instead. Codes that are not a state or DC (3, 7, 14, 43, 52) are rejected, as is a record with both `state` and `statefip` nonzero. +mstat: + group: Record and filing unit + meaning: Filing status. + type: Code + valid: 1 unmarried (filed as head of household when a dependent qualifies), 2 married filing jointly, 6 married filing separately. TAXSIM-35 also defines 8 (dependent taxpayer); see "Values the emulator does not check". +page: + group: Record and filing unit + meaning: Age of the primary taxpayer on December 31 of the tax year. + type: Years + valid: A whole number of years. +sage: + group: Record and filing unit + meaning: Age of the spouse on December 31 of the tax year. Read only on joint returns (`mstat` 2). + type: Years + valid: A whole number of years. TAXSIM-35 treats a nonzero `sage` on an unmarried return as an error. +dependent_exemption: + group: Record and filing unit + meaning: Listed in the emulator's TAXSIM input definition, but neither engine reads it. Use `depx` and the dependent ages. + type: Number + valid: Ignored. +depx: + group: Dependents + meaning: Number of dependents. + type: Count + valid: 0 to 11 on PolicyEngine rows. Pre-2021 TAXSIM rows receive ages for at most 10 dependents. +age1: + group: Dependents + meaning: Age of dependent 1 on December 31 of the tax year. `age2` to `age11` hold the ages of dependents 2 to 11. + type: Years + valid: A whole number of years. Ages are read only for the first `depx` dependents. Code an infant as 1, as TAXSIM-35 instructs. `age11` reaches PolicyEngine rows only; the TAXSIM-35 executable rejects it, so pre-2021 rows drop it. +age2: &dependent_age + group: Dependents + meaning: Age of a later dependent; see `age1`. + type: Years + valid: See `age1`. +age3: *dependent_age +age4: *dependent_age +age5: *dependent_age +age6: *dependent_age +age7: *dependent_age +age8: *dependent_age +age9: *dependent_age +age10: *dependent_age +age11: *dependent_age +dep13: + group: Dependents + meaning: TAXSIM-32 style count of dependents under 13. An alternative to the dependent ages. + type: Count + valid: Counts are cumulative, so dep13 is at most dep17, which is at most dep18. Converted to ages 10 (under 13), 15 (13 to 16), 17 (17) and 21 (any of `depx` beyond `dep18`). PolicyEngine rows use the counts when the record gives no positive dependent age; pre-2021 rows use them only when the file has no age columns at all. +dep17: + group: Dependents + meaning: TAXSIM-32 style count of dependents under 17, including those under 13. + type: Count + valid: See `dep13`. +dep18: + group: Dependents + meaning: TAXSIM-32 style count of dependents under 18, including those under 17. + type: Count + valid: See `dep13`. +pwages: + group: Wages and self-employment + meaning: Wage and salary income of the primary taxpayer. + type: Dollars per year + valid: Any amount. +swages: + group: Wages and self-employment + meaning: Wage and salary income of the spouse. Read only on joint returns. + type: Dollars per year + valid: Any amount. TAXSIM-35 requires zero on non-joint returns. +psemp: + group: Wages and self-employment + meaning: Self-employment income of the primary taxpayer that is not qualified business income, before self-employment tax. + type: Dollars per year + valid: Any amount. +ssemp: + group: Wages and self-employment + meaning: Self-employment income of the spouse; see `psemp`. Read only on joint returns. + type: Dollars per year + valid: Any amount. +pbusinc: + group: Business income (QBI) + meaning: Primary taxpayer's active business income eligible for the qualified business income deduction without the specified-service phase-out. + type: Dollars per year + valid: Any amount. +sbusinc: + group: Business income (QBI) + meaning: Spouse's active business income; see `pbusinc`. Read only on joint returns. + type: Dollars per year + valid: Any amount. +pprofinc: + group: Business income (QBI) + meaning: Primary taxpayer's income from a specified service trade or business (SSTB), eligible for the qualified business income deduction subject to its phase-out. + type: Dollars per year + valid: Any amount. +sprofinc: + group: Business income (QBI) + meaning: Spouse's SSTB income; see `pprofinc`. Read only on joint returns. + type: Dollars per year + valid: Any amount. +scorp: + group: Business income (QBI) + meaning: S corporation and partnership profits (TAXSIM-35 describes this column as passive business income). + type: Dollars per year + valid: Any amount; losses are entered as negative amounts. +dividends: + group: Investment and other income + meaning: Qualified dividends (all dividends before 2003). Non-qualified dividends belong in `intrec`. + type: Dollars per year + valid: Any amount. +intrec: + group: Investment and other income + meaning: Taxable interest received, and non-qualified dividends. + type: Dollars per year + valid: Any amount. +stcg: + group: Investment and other income + meaning: Short-term capital gains or losses. + type: Dollars per year + valid: Any amount; losses are negative. +ltcg: + group: Investment and other income + meaning: Long-term capital gains or losses. + type: Dollars per year + valid: Any amount; losses are negative. +otherprop: + group: Investment and other income + meaning: Other property income in AGI that is subject to the net investment income tax, such as rent not eligible for the QBI deduction. + type: Dollars per year + valid: Any amount; losses are negative. +nonprop: + group: Investment and other income + meaning: Other non-property income in AGI not subject to the net investment income tax (TAXSIM-35 lists alimony, non-wage fellowships and state tax refunds; adjustments such as IRA contributions go in as negative amounts). + type: Dollars per year + valid: Any amount; adjustments are negative. +pensions: + group: Retirement and benefits + meaning: Taxable pensions and IRA distributions. + type: Dollars per year + valid: Any amount. +gssi: + group: Retirement and benefits + meaning: Gross Social Security benefits. + type: Dollars per year + valid: Any amount. +pui: + group: Retirement and benefits + meaning: Unemployment compensation received by the primary taxpayer. + type: Dollars per year + valid: Any amount. +sui: + group: Retirement and benefits + meaning: Unemployment compensation received by the spouse. Read only on joint returns. + type: Dollars per year + valid: Any amount. +transfers: + group: Retirement and benefits + meaning: Non-taxable transfer income (welfare, workers' compensation, veterans' benefits, child support), which can affect state property tax rebates. + type: Dollars per year + valid: Any amount. +rentpaid: + group: Deductions and expenses + meaning: Rent paid, used for state renter credits and property tax rebates. + type: Dollars per year + valid: Any amount. +proptax: + group: Deductions and expenses + meaning: Real estate taxes paid. + type: Dollars per year + valid: Any amount. +otheritem: + group: Deductions and expenses + meaning: Other itemized deductions that TAXSIM-35 treats as AMT preferences (other state and local taxes, the preference share of medical expenses, other interest, miscellaneous). + type: Dollars per year + valid: Any amount. +mortgage: + group: Deductions and expenses + meaning: Itemized deductions that are not AMT preferences (home mortgage interest, charitable contributions, deductible medical expenses, and so on). + type: Dollars per year + valid: Any amount. +childcare: + group: Deductions and expenses + meaning: Child care expenses. + type: Dollars per year + valid: Any amount. +idtl: + group: Output and options + meaning: How much output to return for the record. + type: Code + valid: 0 standard output, 2 full output, 5 full output plus a text report. Any other value returns no tax amounts for the record on PolicyEngine rows. +opt1: + group: Output and options + meaning: A TAXSIM-35 option number, passed to the TAXSIM-35 executable for pre-2021 rows (for example 30, its PSL-conformance mode). + type: Code + valid: See https://taxsim.nber.org/taxsimtest/options.html. PolicyEngine rows ignore it. +opt1v: + group: Output and options + meaning: The value for the option in `opt1`. + type: Number + valid: See `opt1`. diff --git a/docs/security-and-deployment.md b/docs/security-and-deployment.md new file mode 100644 index 000000000..7eb4757c1 --- /dev/null +++ b/docs/security-and-deployment.md @@ -0,0 +1,327 @@ +# Security and deployment notes + +For IT and security reviewers deciding whether policyengine-taxsim can run on their systems. It covers what the package installs and runs, what touches the network and what does not, which files it writes, and how to install it on a machine without internet access. + +Blocks marked as generated come from the code, the bundled files and the committed dependency snapshot, through `scripts/generate_docs_reference.py`; `tests/test_docs_reference.py` fails when one is out of date. Statements about the network were checked on 2026-10-09 as described under [How this was checked](#how-this-was-checked). + +Contents: + +- [Summary](#summary) +- [Network use](#network-use) +- [Files and processes](#files-and-processes) +- [Bundled TAXSIM-35 executables](#bundled-taxsim-35-executables) +- [Python versions](#python-versions) +- [Dependencies](#dependencies) +- [Installing without internet access](#installing-without-internet-access) +- [Updates and patching](#updates-and-patching) + +## Summary + +- **A local run makes no network connections.** Installed with pip and run from the command line, Python or R, the emulator computes everything on the machine. Nothing is sent to PolicyEngine or anyone else. A test in CI fails if a run tries to open a connection. +- **The hosted web runner is different.** The upload page at policyengine.org/us/taxsim/run sends your CSV to PolicyEngine's server. Do not use it for confidential data. +- **Installing needs the network** (PyPI, or your internal mirror), unless you install from downloaded files as described below. +- **It runs a bundled third-party executable** for tax years before 2021: NBER's TAXSIM-35, unsigned, x86-64 only. +- **It installs dozens of Python packages**, including networking and developer libraries that a run never calls. The [full list](#dependencies) has versions and licenses. Two of them, policyengine-us and policyengine-core, are licensed under the GNU Affero General Public License v3; policyengine-taxsim itself is MIT-licensed. +- **It needs Python 3.10 or later**; use 3.11 or later to get current tax rules. + +## Network use + +### A local run: nothing + +A standard run means any of the following, installed from PyPI or a mirror: + +- `policyengine-taxsim < input.csv > output.csv` +- the `policyengine`, `taxsim`, `compare` and `sample-data` subcommands +- `PolicyEngineRunner` or `StitchedRunner` from Python +- `policyengine_calculate_taxes()` from the R package, once installed + +None of these opens a network connection, sends data anywhere, or downloads data, tax rules or executables. Specifically: + +- **Tax rules** are Python and YAML files inside the policyengine-us package, read from disk. +- **No survey data is downloaded.** PolicyEngine US downloads its default dataset (from Hugging Face) only when a simulation is created without a dataset (`policyengine_us/system.py`, `Microsimulation.__init__`). The emulator always passes its own dataset built from your input file, so that download never happens. +- **The TAXSIM-35 executables** ship inside the package; nothing is fetched for years before 2021. They import no networking functions (see [Bundled TAXSIM-35 executables](#bundled-taxsim-35-executables)). +- **Supplemental Poverty Measure data** that policyengine-us 2.x loads comes from a file bundled in the spm-calculator package. The spm-calculator functions that download Consumer Expenditure Survey files are research tools that a tax calculation does not call. +- **No update checks, telemetry or license checks** are made. + +Several installed packages can make network requests (requests, urllib3, httpx, huggingface-hub, census), because policyengine-core and spm-calculator use them for other tasks. A run imports some of them but makes no requests. On import, urllib3 opens a socket bound to the loopback address `::1` to test for IPv6 support; it sends nothing and is closed at once. + +### What does use the network + +| What | When | Where it connects | What it sends | +|---|---|---|---| +| Installing with pip or uv | Install and upgrade | PyPI (or your configured mirror); GitHub for `git+https://` installs | Package requests | +| R package setup, `setup_policyengine()` | Run once by you, or automatically by the first `policyengine_calculate_taxes()` when no environment exists | GitHub and PyPI, to install `policyengine-taxsim` from GitHub's `main` branch with `--upgrade`; may download Miniconda through reticulate | Package requests | +| `StitchedRunner(..., use_remote_taxsim=True)` or `RemoteTaxsimRunner` | Only when Python code asks for it; no command-line flag sets it | NBER, `https://taxsim.nber.org/taxsim35/redirect.cgi` | Records before 2021, all TAXSIM input columns | +| Local API server, `uvicorn policyengine_taxsim.api:local_app` | Only if you start it; needs the `api` extra and the `modal` package | NBER for records before 2021; Mailchimp and Resend if its email endpoint is used | As above, plus the email address and the results | +| Web runner at policyengine.org/us/taxsim/run | When you upload a file in a browser | PolicyEngine's API on Modal (`policyengine--policyengine-taxsim-taxsimapi-serve.modal.run`) | The whole uploaded CSV | +| Web runner, "email results" option | When you ask for results by email | The same API, which sends results through Resend and, if "Keep me updated" is checked (it is by default), adds the address to PolicyEngine's Mailchimp list | The CSV, the email address, and the results as an attachment | +| `resources/taxsimtest/taxsim-docker-wrapper.sh` | Developer tool, not used by the package | Docker Hub (`ubuntu:24.04`) and Ubuntu's package mirrors, on its first build | Image and package requests | + +The hosted service's code (`policyengine_taxsim/api.py`) computes results in memory and writes nothing to permanent storage. What Modal, the hosting platform, logs is outside this repository. + +### How this was checked + +On 2026-10-09, with policyengine-taxsim at this commit, policyengine-us 2.38.0 (Python 3.11) and 1.783.0 (Python 3.10), on macOS: + +1. **Code review** of every network call in policyengine-taxsim, and of the download paths in policyengine-us, policyengine-core and spm-calculator listed above. +2. **Recording every network call.** A Python audit hook logged socket, DNS and HTTP events during a command-line run of records from 2019 (computed by TAXSIM-35) and 2023 to 2025 (PolicyEngine), with empty download caches. It recorded no connection, DNS lookup or HTTP request; the only socket event was urllib3's loopback test. +3. **Blocking the network.** The same run under macOS's `sandbox-exec` with all inbound and outbound network access denied completed and produced the same output. +4. **Inspecting the executables'** imported libraries and symbols (below). +5. **Installing offline.** The [offline installation](#installing-without-internet-access) was carried out on macOS with Python 3.11 inside the same no-network sandbox, using uv's equivalents of the pip commands (`uv pip install --no-index --find-links ... --require-hashes`), and the check command printed the expected result. Every package in the Python 3.11 snapshot was confirmed to have a wheel with a listed hash for Linux x86-64 (manylinux 2.28) and for macOS on Apple silicon. + +`tests/test_no_network.py` repeats step 2 in CI on Linux, macOS and Windows with Python 3.10 and 3.11: it runs the command line with an audit hook that raises on any connection, DNS lookup or HTTP request, so a change that adds one fails the build. To check an installation yourself, run the same command with your firewall blocking the Python process; the [worked example](input-guide.md#worked-example-from-a-survey-file-to-taxes) is a suitable input. + +## Files and processes + +What a run writes: + +| What | Where | When | Removed | +|---|---|---|---| +| Your input records, as PolicyEngine variables, in an HDF5 file | Python's temporary directory (`TMPDIR` on macOS and Linux, `TEMP` on Windows) | Each chunk of up to 10,000 records from 2021 on | When the chunk finishes | +| Records before 2021 as CSV, and TAXSIM-35's output | The same temporary directory | Each batch of records before 2021 | When TAXSIM-35 finishes | +| Results | The output file you name, or stdout | Every run | No | +| PolicyEngine test files (YAML) holding each record's inputs | The working directory | Only with `--logs` | No | + +The temporary files are deleted in `finally` blocks, so errors do not leave them behind, but a process killed outright (for example by `kill -9` or a power loss) can. If your input is confidential, point `TMPDIR` or `TEMP` at an approved location before running. + +Processes started: + +- **TAXSIM-35**, for records before 2021: run through the system shell as `cat | > ` (`cmd.exe` with `type` on Windows). Only paths generated by the emulator reach the command line, never values from your data. +- **`uname -p`**, once, from Python's standard `platform` module during import (seen on macOS). + +Before running TAXSIM-35 on macOS or Linux, the emulator sets the executable's permissions to 755 (`os.chmod`). On a shared installation owned by another account, that call fails with a permission error even when the file is already executable, so records before 2021 cannot be computed. Until [#1412](https://github.com/PolicyEngine/policyengine-taxsim/pull/1412) changes this to skip files that are already executable, install the package as the account that runs it, or compute only 2021 and later. + +## Bundled TAXSIM-35 executables + +The package includes NBER's TAXSIM-35 executables, installed to `share/policyengine_taxsim/` inside the Python environment. The emulator runs one of the three `taxsimtest` builds; the `taxsim35` builds are used only by this repository's tests. Generated from the files in `resources/`: + + +| File | Format | Build stamp | Bytes | SHA-256 | Run by the emulator | +|---|---|---|---|---|---| +| `resources/taxsim35/taxsim-latest-windows.exe` | Windows PE, 32-bit x86 | Not found | 2,317,791 | `85325403b2b6b40bebb2b7680b5dbceb29a9b1019dabf7f0596bb99e429b1e47` | No (tests only) | +| `resources/taxsim35/taxsim35-osx.exe` | macOS Mach-O, x86-64 | cdate-2025Aug23 | 1,661,800 | `0c879416a3bb96f9903cd21aab84108402fd760c4bf280f68aad331f7b57ff1e` | No (tests only) | +| `resources/taxsim35/taxsim35-unix.exe` | Linux ELF, x86-64 | Not found | 4,545,432 | `c83d6a214e49f0206f69eb675502968ffe1109dff4420f5ec4b8d85f7386055d` | No (tests only) | +| `resources/taxsimtest/taxsimtest-linux.exe` | Linux ELF, x86-64 | cd2026081819 | 2,129,624 | `00a321d2467ba011992f8b83c6e485a9b710c48fca4262a23fec1de26942a89b` | Yes, on Linux | +| `resources/taxsimtest/taxsimtest-osx.exe` | macOS Mach-O, x86-64 | cd2026081819 | 2,070,264 | `4a17af9c2adbea27b1e6cce240610aede264e008bcdf64b131e0c81220f62b8c` | Yes, on macOS | +| `resources/taxsimtest/taxsimtest-windows.exe` | Windows PE, x86-64 | cd2026081318 | 3,035,784 | `a8207e7cf207ee9ce066eedc51cc5dd531c956de0a8b567fca1933ca0fa0e9c3` | Yes, on Windows | + + +- **Source.** NBER distributes these as compiled programs; their source is not in this repository. `resources/taxsimtest/README.md` records where each is downloaded from and how a new build is checked before it is committed. +- **Signatures.** None is code-signed: the macOS build is unsigned (`codesign` reports "not signed at all") and the Windows build has no Authenticode certificate. Check the hashes above instead (`shasum -a 256 ` on macOS and Linux, `Get-FileHash ` in PowerShell). +- **Platforms.** All three are x86-64. On Apple silicon Macs the macOS build runs under Rosetta 2, which must be installed. The Linux build needs the GNU Fortran runtime (`libgfortran.so.5` and `libquadmath.so.0`: the `libgfortran5` and `libquadmath0` packages on Debian and Ubuntu, `libgfortran` and `libquadmath` on Red Hat systems); without it, records before 2021 fail with "error while loading shared libraries". There is no build for ARM Linux. +- **Libraries.** The macOS build links only the system library (`libSystem`). The Linux build links `libgfortran.so.5`, `libm.so.6`, `libgcc_s.so.1`, `libquadmath.so.0` and `libc.so.6`. The Windows build imports only from `KERNEL32.dll` and `msvcrt.dll`. None of the three imports a socket, DNS or HTTP function. + +## Python versions + + +- `pyproject.toml` requires Python `>=3.10`. +- CI runs the test suite on `ubuntu-latest`, `macos-latest`, `windows-latest` with Python 3.10 and 3.11. +- As of 2026-10-09T19:00:00Z, the latest policyengine-us (2.38.1) requires Python `<3.15,>=3.11`. Which policyengine-us each Python version installs: + +| Python | policyengine-us | policyengine-core | +|---|---|---| +| 3.10 | 1.783.0 | 3.31.1 | +| 3.11 | 2.38.1 | 3.32.29 | +| 3.12 | 2.38.1 | 3.32.29 | +| 3.13 | 2.38.1 | 3.32.29 | +| 3.14 | 2.38.1 | 3.32.29 | + + +What this means in practice: + +- **Use Python 3.11 or later.** policyengine-us stopped supporting Python 3.10 after release 1.783.0 (July 2026), so a Python 3.10 installation keeps the tax rules of that release and gets none of the corrections made since. +- **Python 3.9 and earlier cannot install policyengine-taxsim.** For an older system Python, install a newer Python alongside it (from python.org, your package manager, or `uv python install`) in its own environment; the emulator does not depend on the system Python. +- CI tests Python 3.10 and 3.11. Python 3.12 to 3.14 install the same packages, some at newer versions (see the table below), but are not tested in CI. + +## Dependencies + +### Direct + +What `pyproject.toml` requires: + + +| Requirement | Installed | +|---|---| +| `policyengine-us>=1.711.0` | Always | +| `spm-calculator<1; python_version < "3.11"` | Always | +| `pandas` | Always | +| `PyYAML` | Always | +| `click` | Always | +| `matplotlib` | Always | +| `numpy` | Always | +| `tqdm` | Always | +| `fastapi>=0.100.0` | Only with `policyengine-taxsim[api]` | +| `uvicorn>=0.20.0` | Only with `policyengine-taxsim[api]` | +| `resend>=2.0.0` | Only with `policyengine-taxsim[api]` | + + +### Everything installed + +Every package an installation pulls in, resolved for Linux x86-64, with the package that requires it and its license from PyPI. Generated from the snapshot in [`docs/dependencies/`](dependencies/): + + +| Package | 3.10 | 3.11 | 3.12 | 3.13 | 3.14 | Required by | License | +|---|---|---|---|---|---|---|---| +| annotated-types | 0.8.0 | 0.8.0 | 0.8.0 | 0.8.0 | 0.8.0 | pydantic | MIT | +| anyio | 4.15.1 | 4.15.1 | 4.15.1 | 4.15.1 | 4.15.1 | httpx, httpx2 | MIT | +| asttokens | 3.0.2 | 3.0.2 | 3.0.2 | 3.0.2 | 3.0.2 | stack-data | Apache 2.0 | +| blosc2 | 4.3.3 | 4.14.1 | 4.14.1 | 4.14.1 | 4.14.1 | tables | BSD-3-Clause | +| census | 0.8.27 | 0.8.27 | 0.8.27 | 0.8.27 | 0.8.27 | spm-calculator | BSD | +| certifi | 2026.7.22 | 2026.7.22 | 2026.7.22 | 2026.7.22 | 2026.7.22 | httpcore, httpx, requests | MPL-2.0 | +| charset-normalizer | 3.5.2 | 3.5.2 | 3.5.2 | 3.5.2 | 3.5.2 | requests | MIT | +| click | 8.5.0 | 8.5.0 | 8.5.0 | 8.5.0 | 8.5.0 | huggingface-hub, policyengine-taxsim | BSD-3-Clause | +| contourpy | 1.3.2 | 1.3.3 | 1.4.0 | 1.4.0 | 1.4.0 | matplotlib | BSD-style (full text in metadata) | +| cycler | 0.12.1 | 0.12.1 | 0.12.1 | 0.12.1 | 0.12.1 | matplotlib | BSD-style (full text in metadata) | +| decorator | 5.3.1 | 5.3.1 | 5.3.1 | 5.3.1 | 5.3.1 | ipython | BSD-2-Clause | +| dpath | 2.2.0 | 2.2.0 | 2.2.0 | 2.2.0 | 2.2.0 | policyengine-core | MIT | +| et-xmlfile | 2.0.0 | 2.0.0 | 2.0.0 | 2.0.0 | 2.0.0 | openpyxl | MIT | +| exceptiongroup | 1.3.1 | - | - | - | - | anyio, ipython, pytest | MIT License | +| executing | 2.2.1 | 2.2.1 | 2.2.1 | 2.2.1 | 2.2.1 | stack-data | MIT | +| filelock | 4.0.12 | 4.0.12 | 4.0.12 | 4.0.12 | 4.0.12 | huggingface-hub | MIT | +| fonttools | 4.65.0 | 4.66.1 | 4.66.1 | 4.66.1 | 4.66.1 | matplotlib | MIT | +| fsspec | 2026.9.0 | 2026.9.0 | 2026.9.0 | 2026.9.0 | 2026.9.0 | huggingface-hub | BSD-3-Clause | +| h11 | 0.16.0 | 0.16.0 | 0.16.0 | 0.16.0 | 0.16.0 | httpcore, httpcore2 | MIT | +| h2 | - | 4.4.1 | 4.4.1 | 4.4.1 | 4.4.1 | httpx | MIT | +| h5py | 3.16.0 | 3.16.0 | 3.16.0 | 3.16.0 | 3.16.0 | policyengine-core | BSD-3-Clause | +| hf-xet | 1.7.0 | 1.7.0 | 1.7.0 | 1.7.0 | 1.7.0 | huggingface-hub | Apache-2.0 | +| hpack | - | 4.2.0 | 4.2.0 | 4.2.0 | 4.2.0 | h2 | MIT | +| httpcore | - | 1.0.9 | 1.0.9 | 1.0.9 | 1.0.9 | httpx | BSD-3-Clause | +| httpcore2 | 2.13.1 | 2.13.1 | 2.13.1 | 2.13.1 | 2.13.1 | httpx2 | BSD-3-Clause | +| httpx | - | 0.28.1 | 0.28.1 | 0.28.1 | 0.28.1 | blosc2 | BSD-3-Clause | +| httpx2 | 2.13.1 | 2.13.1 | 2.13.1 | 2.13.1 | 2.13.1 | huggingface-hub | BSD-3-Clause | +| huggingface-hub | 2.2.0 | 2.2.0 | 2.2.0 | 2.2.0 | 2.2.0 | policyengine-core | Apache-2.0 | +| hyperframe | - | 6.1.0 | 6.1.0 | 6.1.0 | 6.1.0 | h2 | MIT-style (full text in metadata) | +| idna | 3.20 | 3.20 | 3.20 | 3.20 | 3.20 | anyio, httpx, httpx2, requests | BSD-3-Clause | +| iniconfig | 2.3.1 | 2.3.1 | 2.3.1 | 2.3.1 | 2.3.1 | pytest | MIT | +| ipython | 8.39.0 | 8.39.0 | 8.39.0 | 8.39.0 | 8.39.0 | policyengine-core, pyvis | BSD-3-Clause | +| jedi | 0.20.0 | 0.20.0 | 0.20.0 | 0.20.0 | 0.20.0 | ipython | MIT | +| jellyfish | 1.2.1 | 1.2.1 | 1.2.1 | 1.2.1 | 1.2.1 | us | MIT License | +| jinja2 | 3.1.6 | 3.1.6 | 3.1.6 | 3.1.6 | 3.1.6 | pyvis | BSD License | +| jsonpickle | 4.1.3 | 4.1.3 | 4.1.3 | 4.1.3 | 4.1.3 | pyvis | BSD-3-Clause | +| kiwisolver | 1.5.1 | 1.5.1 | 1.5.1 | 1.5.1 | 1.5.1 | matplotlib | BSD-style (full text in metadata) | +| markdown-it-py | - | 4.2.0 | 4.2.0 | 4.2.0 | 4.2.0 | rich | MIT License | +| markupsafe | 3.0.4 | 3.0.4 | 3.0.4 | 3.0.4 | 3.0.4 | jinja2 | BSD-3-Clause | +| matplotlib | 3.10.9 | 3.11.2 | 3.11.2 | 3.11.2 | 3.11.2 | policyengine-taxsim | MIT-style (full text in metadata) | +| matplotlib-inline | 0.2.2 | 0.2.2 | 0.2.2 | 0.2.2 | 0.2.2 | ipython | BSD-3-Clause | +| mdurl | - | 0.1.2 | 0.1.2 | 0.1.2 | 0.1.2 | markdown-it-py | MIT License | +| microdf-python | 1.5.11 | 1.5.11 | 1.5.11 | 1.5.11 | 1.5.11 | policyengine-core, policyengine-us | MIT | +| msgpack | 1.2.3 | 1.2.3 | 1.2.3 | 1.2.3 | 1.2.3 | blosc2 | Apache-2.0 | +| ndindex | 1.10.1 | 1.10.1 | 1.10.1 | 1.10.1 | 1.10.1 | blosc2 | MIT | +| networkx | 3.4.2 | 3.6.1 | 3.7 | 3.7 | 3.7 | pyvis | BSD License | +| numexpr | 2.14.1 | 2.14.2 | 2.14.2 | 2.14.2 | 2.14.2 | blosc2, policyengine-core, tables | MIT | +| numpy | 2.2.6 | 2.4.6 | 2.5.3 | 2.5.3 | 2.5.3 | blosc2, contourpy, h5py, matplotlib, microdf-python, numexpr, pandas, policyengine-core, policyengine-taxsim, spm-calculator, tables | BSD-style (full text in metadata) | +| openpyxl | 3.1.5 | 3.1.5 | 3.1.5 | 3.1.5 | 3.1.5 | spm-calculator | MIT | +| packaging | 26.3 | 26.3 | 26.3 | 26.3 | 26.3 | huggingface-hub, matplotlib, plotly, pytest, tables, wheel | Apache-2.0 OR BSD-2-Clause | +| pandas | 2.3.3 | 3.0.6 | 3.0.6 | 3.0.6 | 3.0.6 | microdf-python, policyengine-core, policyengine-taxsim, policyengine-us, spm-calculator | BSD-style (full text in metadata) | +| parso | 0.8.7 | 0.8.7 | 0.8.7 | 0.8.7 | 0.8.7 | jedi | MIT | +| pexpect | 4.9.0 | 4.9.0 | 4.9.0 | 4.9.0 | 4.9.0 | ipython | ISC license | +| pillow | 12.3.0 | 12.3.0 | 12.3.0 | 12.3.0 | 12.3.0 | matplotlib | MIT-CMU | +| plotly | 5.24.1 | 5.24.1 | 5.24.1 | 5.24.1 | 5.24.1 | policyengine-core | MIT | +| pluggy | 1.6.0 | 1.6.0 | 1.6.0 | 1.6.0 | 1.6.0 | pytest | MIT | +| policyengine-core | 3.31.1 | 3.32.29 | 3.32.29 | 3.32.29 | 3.32.29 | policyengine-us | GNU Affero General Public License v3 | +| policyengine-us | 1.783.0 | 2.38.1 | 2.38.1 | 2.38.1 | 2.38.1 | policyengine-taxsim | GNU Affero General Public License v3 | +| prompt-toolkit | 3.0.53 | 3.0.53 | 3.0.53 | 3.0.53 | 3.0.53 | ipython | BSD License | +| psutil | 6.1.1 | 6.1.1 | 6.1.1 | 6.1.1 | 6.1.1 | policyengine-core | BSD-3-Clause | +| ptyprocess | 0.7.0 | 0.7.0 | 0.7.0 | 0.7.0 | 0.7.0 | pexpect | ISC License (ISCL) | +| pure-eval | 0.2.4 | 0.2.4 | 0.2.4 | 0.2.4 | 0.2.4 | stack-data | MIT | +| py-cpuinfo | 9.0.0 | 9.0.0 | 9.0.0 | 9.0.0 | 9.0.0 | tables | MIT | +| pydantic | 2.14.0 | 2.14.0 | 2.14.0 | 2.14.0 | 2.14.0 | blosc2 | MIT | +| pydantic-core | 2.50.0 | 2.50.0 | 2.50.0 | 2.50.0 | 2.50.0 | pydantic | MIT | +| pygments | 2.21.0 | 2.21.0 | 2.21.0 | 2.21.0 | 2.21.0 | ipython, pytest, rich | BSD-2-Clause | +| pyparsing | 3.3.3 | 3.3.3 | 3.3.3 | 3.3.3 | 3.3.3 | matplotlib | MIT | +| pytest | 8.4.2 | 9.1.1 | 9.1.1 | 9.1.1 | 9.1.1 | policyengine-core | MIT | +| python-dateutil | 2.9.0.post0 | 2.9.0.post0 | 2.9.0.post0 | 2.9.0.post0 | 2.9.0.post0 | matplotlib, pandas | Dual License | +| pytz | 2026.5 | - | - | - | - | pandas | MIT | +| pyvis | 0.3.2 | 0.3.2 | 0.3.2 | 0.3.2 | 0.3.2 | policyengine-core | BSD | +| pyyaml | 6.0.3 | 6.0.3 | 6.0.3 | 6.0.3 | 6.0.3 | huggingface-hub, policyengine-taxsim | MIT | +| requests | 2.34.2 | 2.34.2 | 2.34.2 | 2.34.2 | 2.34.2 | blosc2, census, policyengine-core, spm-calculator | Apache-2.0 | +| rich | - | 15.0.0 | 15.0.0 | 15.0.0 | 15.0.0 | blosc2 | MIT | +| six | 1.17.0 | 1.17.0 | 1.17.0 | 1.17.0 | 1.17.0 | python-dateutil | MIT | +| sortedcontainers | 2.4.0 | 2.4.0 | 2.4.0 | 2.4.0 | 2.4.0 | policyengine-core | Apache 2.0 | +| spm-calculator | 0.3.1 | 1.0.0.post1 | 1.0.0.post1 | 1.0.0.post1 | 1.0.0.post1 | policyengine-taxsim, policyengine-us | MIT | +| stack-data | 0.6.3 | 0.6.3 | 0.6.3 | 0.6.3 | 0.6.3 | ipython | MIT | +| standard-imghdr | 3.13.0 | 3.13.0 | 3.13.0 | 3.13.0 | 3.13.0 | policyengine-core | PSF-2.0 | +| tables | 3.10.1 | 3.11.1 | 3.11.1 | 3.11.1 | 3.11.1 | policyengine-us | BSD 3-Clause License | +| tenacity | 9.2.1 | 9.2.1 | 9.2.1 | 9.2.1 | 9.2.1 | plotly | Apache-2.0 | +| threadpoolctl | 3.7.0 | 3.7.0 | 3.7.0 | 3.7.0 | 3.7.0 | blosc2 | BSD-3-Clause | +| tomli | 2.5.0 | - | - | - | - | huggingface-hub, pytest | MIT | +| tqdm | 4.70.1 | 4.70.1 | 4.70.1 | 4.70.1 | 4.70.1 | huggingface-hub, policyengine-taxsim, policyengine-us | MPL-2.0 AND MIT | +| traitlets | 5.16.1 | 5.16.1 | 5.16.1 | 5.16.1 | 5.16.1 | ipython, matplotlib-inline | BSD-style (full text in metadata) | +| truststore | 0.10.4 | 0.10.4 | 0.10.4 | 0.10.4 | 0.10.4 | httpcore2, httpx2 | MIT | +| typing-extensions | 4.16.0 | 4.16.0 | 4.16.0 | 4.16.0 | 4.16.0 | anyio, exceptiongroup, httpx2, huggingface-hub, ipython, pydantic, pydantic-core, tables, typing-inspection | PSF-2.0 | +| typing-inspection | 0.4.4 | 0.4.4 | 0.4.4 | 0.4.4 | 0.4.4 | pydantic | MIT | +| tzdata | 2026.5 | - | - | - | - | pandas | Apache-2.0 | +| urllib3 | 2.8.0 | 2.8.0 | 2.8.0 | 2.8.0 | 2.8.0 | requests | MIT | +| us | 4.0.0 | 4.0.0 | 4.0.0 | 4.0.0 | 4.0.0 | spm-calculator | BSD-style (full text in metadata) | +| wcwidth | 0.9.2 | 0.9.2 | 0.9.2 | 0.9.2 | 0.9.2 | prompt-toolkit | MIT License | +| wheel | 0.48.0 | 0.48.0 | 0.48.0 | 0.48.0 | 0.48.0 | policyengine-core | MIT | + +Packages, not counting policyengine-taxsim itself: 85 on Python 3.10, 89 on Python 3.11, 89 on Python 3.12, 89 on Python 3.13, 89 on Python 3.14. + +Packages that differ from Linux on other platforms: + +- Windows (x86-64): on Python 3.10, adds colorama; leaves out pexpect, ptyprocess; on Python 3.11 to 3.14, adds colorama, tzdata; leaves out h2, hpack, httpcore, httpx, hyperframe, markdown-it-py, mdurl, pexpect, ptyprocess, rich. +- macOS (Apple silicon): on Python 3.11 to 3.14, leaves out h2, hpack, httpcore, httpx, hyperframe, markdown-it-py, mdurl, rich. + + +Most of these come from policyengine-core and policyengine-us rather than from the emulator. Some exist for tasks a tax calculation never performs: pytest and IPython (developer tools), plotly, matplotlib and pyvis (charts), huggingface-hub (dataset downloads), census, openpyxl and us (spm-calculator's survey tools). They are installed because their parent packages declare them, not because a run uses them. + +The repository's `uv.lock` is not used by CI and is out of date (it pins policyengine-us 1.550.2, below the minimum in `pyproject.toml` and no longer on PyPI). Use the snapshot here instead. + +### The snapshot + +The snapshot fixes one reviewed set of versions. Each `docs/dependencies/requirements-py3.X.txt` lists every package with its version and SHA-256 hashes, and `snapshot.json` records the platform differences and licenses. To regenerate it for a later date: + + +```bash +python scripts/generate_docs_reference.py --refresh-dependencies 2026-10-09T19:00:00Z +``` + +The committed snapshot was resolved with uv 0.12.13 (Homebrew 2026-09-10 aarch64-apple-darwin) for `x86_64-manylinux_2_28` and packages published before 2026-10-09T19:00:00Z. + + +The resolution is reproducible: re-running the command with the same timestamp gives the same versions, as long as PyPI still has them. For a platform other than Linux, run the `uv pip compile` command at the top of a snapshot file with a different `--python-platform` (for example `x86_64-pc-windows-msvc`). + +## Installing without internet access + +On a machine with internet access, download every file the installation needs. This example targets a Linux x86-64 server with Python 3.11; change `--platform` and `--python-version` for other targets (`win_amd64` for 64-bit Windows): + +```bash +pip download --dest wheels --only-binary=:all: \ + --platform manylinux_2_28_x86_64 --python-version 3.11 \ + --require-hashes -r docs/dependencies/requirements-py3.11.txt +pip download --dest wheels --only-binary=:all: --no-deps \ + --platform manylinux_2_28_x86_64 --python-version 3.11 \ + policyengine-taxsim==3.1.1 +``` + +Copy `wheels/` and the requirements file to the target machine, then install from them with no network access: + +```bash +python3.11 -m venv taxsim-env +taxsim-env/bin/pip install --no-index --find-links wheels \ + --require-hashes -r requirements-py3.11.txt +taxsim-env/bin/pip install --no-index --find-links wheels --no-deps \ + policyengine-taxsim==3.1.1 +``` + +`--require-hashes` makes pip refuse any file whose SHA-256 differs from the snapshot. To install into an internal package repository instead, upload the contents of `wheels/` and install `policyengine-taxsim==3.1.1` from it as usual. + +Check the installation. With the snapshot's policyengine-us (2.38.1) this prints `fiitax` 4358 and `siitax` 2255; other versions can differ: + +```bash +printf 'taxsimid,year,state,mstat,page,pwages\n1,2023,33,1,30,52000\n' | taxsim-env/bin/policyengine-taxsim +``` + +## Updates and patching + +- The package never updates itself. Upgrades happen only when you run pip. +- policyengine-taxsim and policyengine-us release frequently; policyengine-us released three versions on 2026-10-09 alone. For production work, pick versions, review them once, and keep the downloaded files; see [Versions and pinning](design.md#versions-and-pinning). +- To scan a snapshot for published vulnerabilities, run `pip-audit` against it (it queries the PyPI and OSV vulnerability databases): + + ```bash + uvx pip-audit --disable-pip --require-hashes -r docs/dependencies/requirements-py3.11.txt + ``` + + On 2026-10-09 this found no known vulnerabilities in the Python 3.11 to 3.14 snapshots. The Python 3.10 snapshot had one, in pytest 8.4.2 ([PYSEC-2026-1845](https://osv.dev/vulnerability/PYSEC-2026-1845), fixed in 9.0.3), a test tool that a run never imports. +- Report security problems through [GitHub](https://github.com/PolicyEngine/policyengine-taxsim/issues) or to hello@policyengine.org. diff --git a/r-package/policyenginetaxsim/R/calculate_taxes.R b/r-package/policyenginetaxsim/R/calculate_taxes.R index 459da0ab9..fcf04d3cd 100644 --- a/r-package/policyenginetaxsim/R/calculate_taxes.R +++ b/r-package/policyenginetaxsim/R/calculate_taxes.R @@ -69,7 +69,7 @@ #' # Basic example: Single filer with wage income #' my_data <- data.frame( #' year = 2023, -#' state = 6, # California +#' state = 5, # California #' mstat = 1, # Single #' pwages = 50000 # $50,000 wages #' ) @@ -80,7 +80,7 @@ #' # Married couple with multiple income sources #' couple_data <- data.frame( #' year = 2023, -#' state = 36, # New York +#' state = 33, # New York #' mstat = 2, # Married filing jointly #' pwages = 75000, # Primary earner wages #' swages = 50000, # Spouse wages diff --git a/scripts/generate_docs_reference.py b/scripts/generate_docs_reference.py new file mode 100644 index 000000000..199c1fc37 --- /dev/null +++ b/scripts/generate_docs_reference.py @@ -0,0 +1,1242 @@ +"""Generate the reference blocks in docs/ from the code. + +The guides in docs/ hold blocks between + + + + +that this script rebuilds from the emulator itself, so they cannot drift: + +- How each input column is read: found by running the emulator's own input + path (PolicyEngineRunner, then TaxsimMicrosimDataset) on probe records and + reading the PolicyEngine inputs it builds, and by writing the input file the + TAXSIM-35 executable would receive. +- What each column means: docs/reference/input_variables.yaml, the one + hand-written source. It must list exactly the columns the code reads. +- Where each output comes from: policyengine_taxsim/config/variable_mappings.yaml. +- Bundled executables: hashed and inspected from resources/. +- Python versions and dependencies: pyproject.toml, the CI workflow, and the + dependency snapshots in docs/dependencies/. +- Worked examples: the files in docs/examples/custom-dataset/. + +tests/test_docs_reference.py fails when a committed block differs from what +this script produces. + + python scripts/generate_docs_reference.py # rewrite stale blocks + python scripts/generate_docs_reference.py --check # exit 1 if any is stale + python scripts/generate_docs_reference.py --refresh-dependencies 2026-10-09T19:00:00Z + # re-resolve docs/dependencies/ with uv as of that time (needs network) +""" + +from __future__ import annotations + +import argparse +import contextlib +import hashlib +import inspect +import io +import json +import math +import re +import subprocess +import sys +import urllib.request +from collections import defaultdict +from pathlib import Path + +import numpy as np +import pandas as pd +import yaml + +REPO = Path(__file__).resolve().parents[1] +DOCS = REPO / "docs" +INPUT_METADATA = DOCS / "reference" / "input_variables.yaml" +DEPENDENCIES = DOCS / "dependencies" +SNAPSHOT = DEPENDENCIES / "snapshot.json" +EXAMPLES = DOCS / "examples" / "custom-dataset" + +BLOCK = re.compile( + r"(\n)(?P.*?)" + r"()", + re.S, +) + +# Probe records: a 2023 California return, so every column is read in a year +# PolicyEngine computes and in a state with an income tax. +PROBE_YEAR = 2023 +PROBE_STATE = 5 +PROBE_AMOUNT = 1000.0 +JOINT = {"year": PROBE_YEAR, "state": PROBE_STATE, "mstat": 2, "page": 40, "sage": 40} +SINGLE = {"year": PROBE_YEAR, "state": PROBE_STATE, "mstat": 1, "page": 40} + +# The Python versions the dependency snapshots cover, and the platform they +# are resolved for (servers); other platforms are compared against it. +SNAPSHOT_PYTHONS = ("3.10", "3.11", "3.12", "3.13", "3.14") +SNAPSHOT_PLATFORM = "x86_64-manylinux_2_28" +OTHER_PLATFORMS = { + "Windows (x86-64)": "x86_64-pc-windows-msvc", + "macOS (Apple silicon)": "aarch64-apple-darwin", +} + + +# --------------------------------------------------------------------------- +# Reading the emulator's input path +# --------------------------------------------------------------------------- + + +class ProbeError(Exception): + """The emulator's input path raised for a probe record.""" + + +def read_inputs(record: dict) -> dict: + """Run one record through PolicyEngineRunner's input path, stopping before + the simulation. + + PolicyEngineRunner validates the record (statefip, state codes) and + _run_once converts the year and splits the records into chunks. Each chunk + normally goes to _run_chunk, which builds a TaxsimMicrosimDataset and + simulates it; here the dataset is generated and kept instead. Returns the + record as the dataset builder saw it after defaults ("frame") and the + PolicyEngine input arrays it built ("inputs"). + """ + from policyengine_taxsim.runners.policyengine_runner import ( + PolicyEngineRunner, + TaxsimMicrosimDataset, + ) + + seen = {} + + def keep_dataset(chunk_df): + dataset = TaxsimMicrosimDataset.__new__(TaxsimMicrosimDataset) + dataset.input_df = chunk_df.copy() + frames = [] + build_people = dataset._process_person_data_for_year + + def watch(year_data, year): + frames.append(year_data.copy()) + return build_people(year_data, year) + + dataset._process_person_data_for_year = watch + data = {} + dataset.save_dataset = data.update + dataset.generate() + year = int(frames[0]["year"].iloc[0]) + seen["frame"] = frames[0].iloc[0] + seen["inputs"] = { + name: np.asarray(by_year[year]) + for name, by_year in data.items() + if year in by_year + } + return pd.DataFrame() + + key = json.dumps(record, sort_keys=True, default=str) + if key in _PROBES: + if isinstance(_PROBES[key], ProbeError): + raise _PROBES[key] + return _PROBES[key] + quiet = io.StringIO() + try: + with contextlib.redirect_stderr(quiet), contextlib.redirect_stdout(quiet): + runner = PolicyEngineRunner(pd.DataFrame([record])) + runner._run_chunk = keep_dataset + runner._run_once(show_progress=False, on_progress=None) + except Exception as error: # reported in the docs as the emulator's answer + _PROBES[key] = ProbeError(f"{type(error).__name__}: {error}") + raise _PROBES[key] from None + _PROBES[key] = seen + return seen + + +_PROBES = {} + + +def roles(inputs: dict) -> dict: + """Person indices of the primary taxpayer, spouse and dependents.""" + return { + "head": np.flatnonzero(inputs["is_tax_unit_head"]), + "spouse": np.flatnonzero(inputs["is_tax_unit_spouse"]), + "dependents": np.flatnonzero(inputs["is_tax_unit_dependent"]), + } + + +def changed_inputs(with_value: dict, without: dict) -> dict: + """PolicyEngine inputs that differ between two probes of one structure.""" + changed = {} + for name, array in with_value["inputs"].items(): + other = without["inputs"].get(name) + if other is None or array.shape != other.shape: + continue + if array.dtype.kind in "fiub" and not np.array_equal(array, other): + changed[name] = array.astype(float) - other.astype(float) + return changed + + +def read_taxsim_file(record: dict) -> dict: + """The record as written to the input file of the TAXSIM-35 executable. + + Uses TaxsimRunner's own validation and file writer; the executable is not + run, so this works on machines without it. + """ + from policyengine_taxsim.runners.taxsim_runner import TaxsimRunner + + runner = TaxsimRunner.__new__(TaxsimRunner) + runner.input_df = pd.DataFrame([record]) + runner._validate_input() + path = Path(runner._create_taxsim_input_file(runner.input_df)) + try: + written = pd.read_csv(path) + finally: + path.unlink() + return written.iloc[0].to_dict() + + +# --------------------------------------------------------------------------- +# Input columns +# --------------------------------------------------------------------------- + + +def load_input_metadata() -> dict: + with open(INPUT_METADATA) as stream: + return yaml.safe_load(stream) + + +def read_columns() -> set: + """Every input column either engine reads. + + TaxsimRunner.ALL_COLUMNS is what pre-2021 rows pass to TAXSIM-35 and what + PolicyEngineRunner fills in when missing; PolicyEngine rows also read + age11 and every column named in the input mapping; statefip is resolved + for both engines by BaseTaxRunner. + """ + from policyengine_taxsim.core.utils import load_variable_mappings + from policyengine_taxsim.runners.taxsim_runner import TaxsimRunner + + mappings = load_variable_mappings() + columns = set(TaxsimRunner.ALL_COLUMNS) | {"statefip"} + columns |= {f"age{slot}" for slot in range(1, DEPENDENT_SLOTS + 1)} + for item in mappings["taxsim_input_definition"]: + columns |= set(item) + situation = mappings["taxsim_to_policyengine"]["household_situation"] + for key in ("additional_income_units", "additional_tax_units"): + for item in situation[key]: + for sources in item.values(): + columns |= { + source + for source in sources or [] + if source in TaxsimRunner.ALL_COLUMNS + } + return columns + + +# PolicyEngineRunner reads dependent ages from age1 to age11 +# (_process_person_data_for_year); the input-handling table confirms by probe. +DEPENDENT_SLOTS = 11 + +GROUP_ORDER = ( + "Record and filing unit", + "Dependents", + "Wages and self-employment", + "Business income (QBI)", + "Investment and other income", + "Retirement and benefits", + "Deductions and expenses", + "Output and options", +) + + +def _cell(text) -> str: + return str(text).replace("|", "\\|").replace("\n", " ").strip() + + +def column_order(metadata: dict) -> list: + order = [] + for group in GROUP_ORDER: + order += [name for name, entry in metadata.items() if entry["group"] == group] + unknown = set(metadata) - set(order) + if unknown: + raise ValueError(f"Columns with an unknown group: {sorted(unknown)}") + return order + + +def block_input_columns() -> str: + metadata = load_input_metadata() + lines = [] + for group in GROUP_ORDER: + names = [n for n in column_order(metadata) if metadata[n]["group"] == group] + if not names: + continue + lines += [f"#### {group}", "", "| Column | Meaning | Type | Valid values |"] + lines.append("|---|---|---|---|") + for name in names: + if re.fullmatch(r"age([2-9]|1[01])", name): + continue # age2..age11 share age1's row + entry = metadata[name] + label = "`age1` to `age11`" if name == "age1" else f"`{name}`" + lines.append( + f"| {label} | {_cell(entry['meaning'])} | {_cell(entry['type'])}" + f" | {_cell(entry['valid'])} |" + ) + lines.append("") + return "\n".join(lines) + + +def _number(value) -> str: + value = float(value) + return str(int(value)) if value.is_integer() else f"{value:g}" + + +def _probe_value(column: str) -> float: + return 7.0 if column.startswith("age") else PROBE_AMOUNT + + +def _base_for(column: str) -> dict: + """A probe record that lets ``column`` take effect.""" + if column.startswith("age"): + return {**JOINT, "depx": DEPENDENT_SLOTS} + return dict(JOINT) + + +def _effective_value(column: str, seen: dict) -> str: + """The value a column ends up with in the dataset the emulator builds.""" + match = re.fullmatch(r"age(\d+)", column) + if match: + dependents = roles(seen["inputs"])["dependents"] + return _number(seen["inputs"]["age"][dependents[int(match.group(1)) - 1]]) + frame = seen["frame"] + return _number(frame[column]) if column in frame.index else "Not read" + + +def blank_handling(column: str, used: bool) -> tuple[str, str]: + """What a blank cell and a left-out column become on PolicyEngine rows, + as the dataset builder sees them after defaults, or the error the + emulator stops with.""" + if not used: + return "Not used", "Not used" + if column == "statefip": + return "`state` is used", "`state` is used" + if column == "taxsimid": + return "Blank in the output", "Records numbered 1, 2, 3, ..." + results = [] + for mode in ("blank", "omit"): + record = _base_for(column) + if mode == "omit": + record.pop(column, None) + else: + record[column] = math.nan + try: + results.append(_effective_value(column, read_inputs(record))) + except ProbeError as error: + results.append(f"Error: {error}") + blank, absent = results + if column != "year": + zero = _effective_value(column, read_inputs({**_base_for(column), column: 0})) + if zero != "0": + blank += f"; 0 also becomes {zero}" + return blank, absent + + +def _single_share(column: str, variable: str) -> float: + """What the primary taxpayer of a one-adult return gets from ``column``.""" + with_value = read_inputs({**SINGLE, column: PROBE_AMOUNT}) + without = read_inputs({**SINGLE, column: 0}) + delta = changed_inputs(with_value, without).get(variable) + return 0.0 if delta is None else float(delta.sum()) + + +def amount_target(column: str) -> str: + """Which PolicyEngine input an amount column feeds, and who gets it, read + from probes of a joint and a one-adult return.""" + amount = PROBE_AMOUNT + joint = read_inputs({**JOINT, column: amount}) + changed = changed_inputs(joint, read_inputs({**JOINT, column: 0})) + if not changed: + return "Not used: no effect on PolicyEngine rows" + n_people = len(joint["inputs"]["is_tax_unit_head"]) + who = roles(joint["inputs"]) + parts = [] + for variable, delta in sorted(changed.items()): + if delta.shape[0] != n_people: + parts.append(f"`{variable}` of the tax unit") + continue + head = float(delta[who["head"]].sum()) + spouse = float(delta[who["spouse"]].sum()) + single = _single_share(column, variable) + if math.isclose(head, amount) and spouse == 0 and math.isclose(single, amount): + parts.append(f"`{variable}` of the primary taxpayer") + elif head == 0 and math.isclose(spouse, amount) and single == 0: + parts.append(f"`{variable}` of the spouse; ignored unless `mstat` is 2") + elif ( + math.isclose(head, amount / 2) + and math.isclose(spouse, amount / 2) + and math.isclose(single, amount) + ): + text = f"`{variable}`, split evenly between spouses on joint returns" + if _older_spouse_takes_all(column, variable): + text += ( + ", or all to the older spouse when only one has reached " + "the age threshold (see below)" + ) + parts.append(text) + else: + raise ValueError( + f"{column}: unrecognized allocation of {variable} " + f"(joint {head}/{spouse}, single {single}). Extend " + "scripts/generate_docs_reference.py to describe it." + ) + return "; ".join(parts) + + +def policyengine_targets(columns) -> dict: + """Column -> description of the PolicyEngine input it feeds. Columns that + feed the same variable for the same person say so.""" + targets = {} + for column in columns: + structural = _structural_target(column) + targets[column] = structural if structural else amount_target(column) + by_target = defaultdict(list) + for column, target in targets.items(): + if target.startswith("`") and ";" not in target: + by_target[target].append(column) + for target, sharing in by_target.items(): + for column in sharing: + others = [other for other in sharing if other != column] + if others: + targets[column] = ( + target + ", summed with " + " and ".join(f"`{o}`" for o in others) + ) + return targets + + +def _older_spouse_takes_all(column: str, variable: str) -> bool: + record = {**JOINT, "page": 70, "sage": 40, column: PROBE_AMOUNT} + seen = read_inputs(record) + who = roles(seen["inputs"]) + values = seen["inputs"][variable] + return math.isclose(values[who["head"]].sum(), PROBE_AMOUNT) and math.isclose( + values[who["spouse"]].sum(), 0 + ) + + +def _ages(record: dict) -> list: + seen = read_inputs(record) + who = roles(seen["inputs"]) + return [int(age) for age in seen["inputs"]["age"][who["dependents"]]] + + +def _structural_target(column: str) -> str | None: + """Columns that shape the tax unit rather than add an amount. Each claim is + checked against a probe; a failed check stops the generator.""" + + def check(condition, claim): + if not condition: + raise ValueError(f"{column}: the emulator no longer does this: {claim}") + + if column == "taxsimid": + return "None: returned as `taxsimid`" + if column == "year": + seen = read_inputs({**SINGLE, "year": 2024}) + check(seen["frame"]["year"] == 2024, "year sets the period") + return "The period every variable is computed for" + if column == "state": + ny = read_inputs({**SINGLE, "state": 33})["inputs"]["state_fips"] + none = read_inputs({**SINGLE, "state": 0})["inputs"]["state_fips"] + check(list(ny) == [36] and list(none) == [48], "SOI -> FIPS, 0 -> Texas") + return ( + "`state_fips`, converted from the SOI code. State 0 is computed as " + "Texas, which has no income tax, and reported as 0" + ) + if column == "statefip": + seen = read_inputs({**SINGLE, "state": 0, "statefip": 36}) + check(list(seen["inputs"]["state_fips"]) == [36], "statefip -> state_fips") + return "`state_fips` (converted to `state` first)" + if column == "mstat": + return mstat_handling() + if column == "page": + seen = read_inputs({**SINGLE, "page": 70}) + who = roles(seen["inputs"]) + check(seen["inputs"]["age"][who["head"]].tolist() == [70], "page -> age") + return "`age` of the primary taxpayer" + if column == "sage": + joint = read_inputs({**JOINT, "sage": 70}) + who = roles(joint["inputs"]) + check(joint["inputs"]["age"][who["spouse"]].tolist() == [70], "sage -> age") + single = read_inputs({**SINGLE, "sage": 70}) + check(len(roles(single["inputs"])["spouse"]) == 0, "no spouse when single") + return "`age` of the spouse (joint returns only)" + if column == "depx": + seen = read_inputs({**SINGLE, "depx": 3}) + check(len(roles(seen["inputs"])["dependents"]) == 3, "depx -> dependents") + return "Number of dependents added to the tax unit" + match = re.fullmatch(r"age(\d+)", column) + if match: + slot = int(match.group(1)) + ages = _ages({**JOINT, "depx": DEPENDENT_SLOTS, column: 7}) + check(ages[slot - 1] == 7, f"{column} -> dependent {slot}") + return f"`age` of dependent {slot}" + if column in ("dep13", "dep17", "dep18"): + ages = _ages({**SINGLE, "depx": 4, "dep13": 1, "dep17": 2, "dep18": 3}) + check(ages == [10, 15, 17, 21], "dependent counts -> ages 10, 15, 17, 21") + return "Dependent `age`s 10, 15, 17 and 21 (see `dep13`)" + if column == "idtl": + return "None: selects the output columns" + return None + + +MSTAT_PROBES = (1, 2, 6, 8, 3) + + +def _mstat_structure(code: int) -> tuple: + seen = read_inputs({**SINGLE, "mstat": code, "sage": 40}) + inputs = seen["inputs"] + return ( + len(roles(inputs)["spouse"]) > 0, + bool(np.any(inputs["is_separated"])), + bool(np.any(inputs["cohabitating_spouses"])), + ) + + +def mstat_handling() -> str: + """How each filing-status code shapes the tax unit, read from probes.""" + groups = defaultdict(list) + for code in MSTAT_PROBES: + groups[_mstat_structure(code)].append(code) + sentences = [] + for (spouse, separated, cohabiting), codes in groups.items(): + label = _codes(codes) + if spouse: + sentences.append(f"{label} adds a spouse to the tax unit") + elif separated and cohabiting: + sentences.append( + f"{label} builds a one-adult unit with `is_separated` and " + "`cohabitating_spouses` set" + ) + else: + sentences.append(f"{label} builds a one-adult unit") + return "; ".join(sentences) + ". Tested codes: " + _codes(MSTAT_PROBES) + + +def _codes(codes) -> str: + codes = [str(c) for c in codes] + return codes[0] if len(codes) == 1 else ", ".join(codes[:-1]) + " and " + codes[-1] + + +def taxsim_handling(column: str) -> str: + """What pre-2021 rows pass to the TAXSIM-35 executable for a column.""" + if column == "taxsimid": + return "Passed" + if column in ("dep13", "dep17", "dep18"): + written = read_taxsim_file( + {**SINGLE, "year": 2019, "depx": 4, "dep13": 1, "dep17": 2, "dep18": 3} + ) + ages = [written.get(f"age{slot}") for slot in range(1, 5)] + if ages == [10, 15, 17, 21] and column not in written: + return "Converted to ages first" + return "Passed" if column in written else "Not passed" + if column == "statefip": + written = read_taxsim_file({**SINGLE, "year": 2019, "state": 0, column: 36}) + if column not in written and written["state"] == 33: + return "Converted to `state` first" + return "Passed" if column in written else "Not passed" + value = _probe_value(column) + record = {**_base_for(column), "year": 2019, column: value} + written = read_taxsim_file(record) + if column not in written: + return "Not passed" + if float(written[column]) != value: + raise ValueError(f"{column}: TAXSIM-35 receives {written[column]}, not {value}") + return "Passed" + + +def block_input_handling() -> str: + metadata = load_input_metadata() + columns = column_order(metadata) + targets = policyengine_targets(columns) + lines = [ + "| Column | Blank cell | Column left out | PolicyEngine input (2021 and later) | Pre-2021 rows, to TAXSIM-35 |", + "|---|---|---|---|---|", + ] + for name in columns: + target = targets[name] + blank, absent = blank_handling(name, not target.startswith("Not used")) + lines.append( + f"| `{name}` | {_cell(blank)} | {_cell(absent)} | {_cell(target)}" + f" | {taxsim_handling(name)} |" + ) + return "\n".join(lines) + "\n" + + +def block_pension_split_ages() -> str: + """The age thresholds for allocating pensions and Social Security between + spouses, read from PolicyEngineRunner and checked by probes.""" + from policyengine_taxsim.core.utils import STATE_NUMBERS + from policyengine_taxsim.runners.policyengine_runner import ( + TaxsimMicrosimDataset as D, + ) + + default = D._DEFAULT_PENSION_SPLIT_AGE + for column in ("pensions", "gssi"): + straddle = {**JOINT, "page": default, "sage": default - 1, column: 1000} + seen = read_inputs(straddle) + variable = ( + "taxable_private_pension_income" + if column == "pensions" + else "social_security_retirement" + ) + who = roles(seen["inputs"]) + if seen["inputs"][variable][who["head"]].sum() != 1000: + raise ValueError(f"{column}: default threshold is no longer {default}") + lines = [ + f"- Default threshold: {default}, for `gssi` in every state and for " + "`pensions` in states not listed below.", + ] + for state, age in sorted(D._PENSION_SPLIT_AGE_BY_STATE.items()): + record = { + **JOINT, + "state": STATE_NUMBERS[state], + "page": max(age, 1), + "sage": max(age - 1, 0), + "pensions": 1000, + } + seen = read_inputs(record) + who = roles(seen["inputs"]) + head = seen["inputs"]["taxable_private_pension_income"][who["head"]].sum() + if age == 0: + if head != 500: + raise ValueError(f"{state}: pensions no longer always split") + lines.append(f"- `pensions` in {state}: always split evenly.") + else: + if head != 1000: + raise ValueError(f"{state}: pension threshold is no longer {age}") + lines.append(f"- `pensions` in {state}: {age}.") + return "\n".join(lines) + "\n" + + +def block_state_codes() -> str: + from policyengine_taxsim.core.utils import SOI_TO_FIPS_MAP, STATE_MAPPING + + rows = [(soi, STATE_MAPPING[soi], SOI_TO_FIPS_MAP[soi]) for soi in STATE_MAPPING] + per_line = 4 + header = "| " + " | ".join(["SOI | State | FIPS"] * per_line) + " |" + rule = "|" + "---|" * (3 * per_line) + lines = [header, rule] + for start in range(0, len(rows), per_line): + chunk = rows[start : start + per_line] + cells = [f"{soi} | {code} | {fips}" for soi, code, fips in chunk] + cells += [" | | "] * (per_line - len(chunk)) + lines.append("| " + " | ".join(cells) + " |") + return "\n".join(lines) + "\n" + + +def block_example(name: str): + language = {".py": "python", ".do": "stata", ".R": "r", ".csv": "csv"} + + def render() -> str: + path = EXAMPLES / name + fence = language[path.suffix] + return f"```{fence}\n{path.read_text().rstrip()}\n```\n" + + return render + + +# Dataset entries that describe the tax unit's structure rather than set a +# policy input; left out of the fixed-inputs list. +STRUCTURE = re.compile( + r"^(person_\w*id|\w+_id|\w+_weight|is_tax_unit_\w+|age|state_fips|" + r"is_separated|cohabitating_spouses)$" +) + + +def block_fixed_inputs() -> str: + """PolicyEngine inputs the dataset builder sets on every record whatever + the input file says, read from the dataset built for a minimal record.""" + from policyengine_taxsim.runners.policyengine_runner import ( + TaxsimMicrosimDataset, + ) + + dataset = TaxsimMicrosimDataset.__new__(TaxsimMicrosimDataset) + fed_by_columns = set(dataset._get_taxsim_to_pe_variable_mapping()) + fed_by_columns |= set(dataset._get_tax_unit_variable_mapping()) + seen = read_inputs({"year": PROBE_YEAR, "state": PROBE_STATE}) + lines = [] + for name, values in sorted(seen["inputs"].items()): + if name in fed_by_columns or STRUCTURE.match(name): + continue + if values.dtype.kind not in "fiub": + continue + distinct = np.unique(values) + value = _number(distinct[0]) if len(distinct) == 1 else "varies" + lines.append(f"- `{name}` = {value}") + return "\n".join(lines) + "\n" + + +def run_time_pins() -> list: + """Variables PolicyEngineRunner holds fixed on the Microsimulation, read + by building one for a chunk that meets every condition in + _build_configured_sim and recording each _pin_input call. + + Not a generated block: which variables exist depends on the installed + policyengine-us, so tests/test_docs_reference.py only checks that each + one appears in docs/design.md.""" + from policyengine_taxsim.runners import policyengine_runner as module + + chunk = pd.DataFrame( + [ + {**SINGLE, "taxsimid": 1, "state": 0, "otherprop": 1000}, + {**SINGLE, "taxsimid": 2, "state": 24, "rentpaid": 9000}, + {**SINGLE, "taxsimid": 3, "state": 20, "rentpaid": 9000}, + {**SINGLE, "taxsimid": 4, "state": 21, "pwages": 50000}, + {**SINGLE, "taxsimid": 5, "state": 33, "pwages": 50000}, + ] + ) + pinned = [] + real_pin = module._pin_input + + def record(sim, variable_name, value, period): + pinned.append(variable_name) + return real_pin(sim, variable_name, value, period) + + quiet = io.StringIO() + with contextlib.redirect_stderr(quiet), contextlib.redirect_stdout(quiet): + runner = module.PolicyEngineRunner( + chunk.copy(), disable_salt=True, assume_w2_wages=True + ) + dataset = module.TaxsimMicrosimDataset(runner.input_df) + try: + dataset.generate() + module._pin_input = record + runner._build_configured_sim(dataset, runner.input_df, zero_salt=True) + finally: + module._pin_input = real_pin + dataset.cleanup() + return sorted(set(pinned)) + + +def block_one_time_rebates() -> str: + from policyengine_taxsim.core.state_output_resolver import ( + ONE_TIME_REBATE_VARIABLES, + ) + + return ", ".join(f"`{name}`" for name in ONE_TIME_REBATE_VARIABLES) + "\n" + + +# --------------------------------------------------------------------------- +# Outputs +# --------------------------------------------------------------------------- + +# Outputs that _extract_vectorized_results adjusts after the variable in the +# mapping file is computed. Each note names a marker that must still appear +# in that method (or a file that must exist), so a removed adjustment stops +# the generator instead of leaving a stale note. +OUTPUT_NOTES = { + "fiitax": ( + "tests/test_addmed_excluded_from_fiitax.py", + "Includes the net investment income tax but not the Additional " + "Medicare Tax, which is in `fica`, `tfica` and `addmed`", + ), + "v22": ( + 'if "v22" in columns', + "In years when the credit is not fully refundable, capped at " + "`ctc_limiting_tax_liability`, so it reports the non-refundable part", + ), + "v40": ( + 'if "v40" in columns and rebate_free_sim is not None', + "Summed with one-time state rebates set to 0; they are reported in " + "`srebate` instead", + ), + "staxbc": ( + "_apply_de_staxbc_elected_path", + "For Delaware couples who elect to file separately on a combined " + "return, the sum of the two separate taxes", + ), +} + + +def _output_note(name: str) -> str: + from policyengine_taxsim.runners.policyengine_runner import PolicyEngineRunner + + if name not in OUTPUT_NOTES: + return "" + marker, note = OUTPUT_NOTES[name] + source = inspect.getsource(PolicyEngineRunner._extract_vectorized_results) + if marker not in source and not (REPO / marker).exists(): + raise ValueError(f"{name}: the adjustment marked {marker!r} is gone") + return f". {note}" + + +def block_output_sources() -> str: + from policyengine_taxsim.core.state_output_resolver import ( + has_state_variable_mapping, + is_output_adapter, + ) + from policyengine_taxsim.core.utils import load_variable_mappings + + outputs = load_variable_mappings()["policyengine_to_taxsim"] + lines = [ + "| Output | TAXSIM-35 description | Computed from | idtl |", + "|---|---|---|---|", + ] + for name, mapping in outputs.items(): + variable = mapping.get("variable", "") + variables = mapping.get("variables") or [] + levels = ", ".join( + str(level) for entry in mapping.get("idtl", []) for level in entry.values() + ) + if not mapping.get("implemented", False): + source = "Not produced on PolicyEngine rows" + elif variable in ("taxsimid", "get_year", "get_state_code"): + source = "The input value" + elif variable == "na_pe": + source = "Always 0 on PolicyEngine rows" + elif variable == "marginal_rate_computed": + base = "income_tax" if name == "frate" else "state_income_tax" + source = f"Change in `{base}` when wages rise by $100, as a percentage" + elif variable == "srebate_computed": + source = ( + "`state_income_tax` with one-time state rebates set to 0, " + "minus `state_income_tax`" + ) + elif has_state_variable_mapping(mapping): + states = len([s for s, v in mapping["state_variables"].items() if v]) + source = f"A state-specific variable ({states} states mapped)" + elif is_output_adapter(variable): + source = f"`{variable}` adapter (state-specific rules)" + elif variables: + source = " + ".join(f"`{v}`" for v in variables) + else: + source = f"`{variable}`" + description = mapping.get("text_description", "") + source += _output_note(name) + lines.append(f"| `{name}` | {_cell(description)} | {source} | {levels} |") + return "\n".join(lines) + "\n" + + +# --------------------------------------------------------------------------- +# Bundled executables +# --------------------------------------------------------------------------- + + +def _binary_kind(data: bytes) -> str: + if data[:4] == b"\x7fELF": + machine = int.from_bytes(data[18:20], "little") + return {0x3E: "Linux ELF, x86-64", 0xB7: "Linux ELF, arm64"}.get( + machine, f"Linux ELF, machine {machine:#x}" + ) + if data[:4] in (b"\xcf\xfa\xed\xfe", b"\xca\xfe\xba\xbe"): + cpu = int.from_bytes(data[4:8], "little") + return { + 0x01000007: "macOS Mach-O, x86-64", + 0x0100000C: "macOS Mach-O, arm64", + }.get(cpu, "macOS Mach-O") + if data[:2] == b"MZ": + offset = int.from_bytes(data[0x3C:0x40], "little") + machine = int.from_bytes(data[offset + 4 : offset + 6], "little") + return {0x8664: "Windows PE, x86-64", 0x14C: "Windows PE, 32-bit x86"}.get( + machine, "Windows PE" + ) + return "Unknown" + + +def _build_stamp(data: bytes) -> str: + match = re.search(rb"cd\d{10}|cdate-\d{4}[A-Za-z]{3}\d{1,2}", data) + return match.group(0).decode() if match else "Not found" + + +def run_time_binaries() -> dict: + """The executable TaxsimRunner picks on each operating system.""" + import platform + from unittest import mock + + from policyengine_taxsim.runners.taxsim_runner import TaxsimRunner + + detect = TaxsimRunner.__dict__["_detect_taxsim_executable"] + detect = detect.__func__ if isinstance(detect, staticmethod) else detect + takes_self = len(inspect.signature(detect).parameters) == 1 + picked = {} + for system in ("Darwin", "Linux", "Windows"): + with mock.patch.object(platform, "system", return_value=system): + path = detect(None) if takes_self else detect() + picked[path.name] = system + return picked + + +def block_taxsim_binaries() -> str: + picked = run_time_binaries() + lines = [ + "| File | Format | Build stamp | Bytes | SHA-256 | Run by the emulator |", + "|---|---|---|---|---|---|", + ] + for path in sorted((REPO / "resources").glob("*/*.exe")): + data = path.read_bytes() + used = picked.get(path.name) + lines.append( + f"| `{path.relative_to(REPO).as_posix()}` | {_binary_kind(data)} | " + f"{_build_stamp(data)} | {len(data):,} | `{hashlib.sha256(data).hexdigest()}` | " + f"{'Yes, on ' + {'Darwin': 'macOS'}.get(used, used) if used else 'No (tests only)'} |" + ) + return "\n".join(lines) + "\n" + + +# --------------------------------------------------------------------------- +# Python versions and dependencies +# --------------------------------------------------------------------------- + + +def _pyproject() -> dict: + try: + import tomllib + except ImportError: # Python 3.10 + import tomli as tomllib + with open(REPO / "pyproject.toml", "rb") as stream: + return tomllib.load(stream) + + +def block_python_versions() -> str: + project = _pyproject()["project"] + with open(REPO / ".github" / "workflows" / "ci.yml") as stream: + ci = yaml.safe_load(stream) + matrix = ci["jobs"]["test"]["strategy"]["matrix"] + snapshot = json.loads(SNAPSHOT.read_text()) + lines = [ + f"- `pyproject.toml` requires Python `{project['requires-python']}`.", + "- CI runs the test suite on " + + ", ".join(f"`{os}`" for os in matrix["os"]) + + " with Python " + + " and ".join(str(v) for v in matrix["python-version"]) + + ".", + f"- As of {snapshot['exclude_newer']}, the latest policyengine-us " + f"({snapshot['policyengine_us_latest']['version']}) requires Python " + f"`{snapshot['policyengine_us_latest']['requires_python']}`. Which " + "policyengine-us each Python version installs:", + "", + "| Python | policyengine-us | policyengine-core |", + "|---|---|---|", + ] + for python in SNAPSHOT_PYTHONS: + versions = snapshot["linux"][python] + lines.append( + f"| {python} | {versions.get('policyengine-us', '-')} | " + f"{versions.get('policyengine-core', '-')} |" + ) + return "\n".join(lines) + "\n" + + +def block_direct_dependencies() -> str: + project = _pyproject()["project"] + lines = ["| Requirement | Installed |", "|---|---|"] + for requirement in project["dependencies"]: + lines.append(f"| `{requirement}` | Always |") + for extra, requirements in project.get("optional-dependencies", {}).items(): + for requirement in requirements: + lines.append( + f"| `{requirement}` | Only with `policyengine-taxsim[{extra}]` |" + ) + return "\n".join(lines) + "\n" + + +def parse_requirements(path: Path) -> dict: + """name -> (version, [required by]) from a `uv pip compile` file.""" + packages = {} + current = None + for line in path.read_text().splitlines(): + match = re.match(r"^([A-Za-z0-9][A-Za-z0-9._-]*)==(\S+)", line) + if match: + current = match.group(1).lower() + packages[current] = (match.group(2), []) + continue + match = re.match(r"^\s+#\s+(?:via\s+)?([A-Za-z0-9][A-Za-z0-9._-]*)", line) + if match and current and match.group(1).lower() != "via": + packages[current][1].append(match.group(1).lower()) + return packages + + +def block_dependency_tree() -> str: + snapshot = json.loads(SNAPSHOT.read_text()) + resolved = { + python: parse_requirements(DEPENDENCIES / f"requirements-py{python}.txt") + for python in SNAPSHOT_PYTHONS + } + names = sorted(set().union(*resolved.values())) + header = ( + "| Package | " + " | ".join(SNAPSHOT_PYTHONS) + " | Required by | License |" + ) + lines = [header, "|---|" + "---|" * (len(SNAPSHOT_PYTHONS) + 2)] + for name in names: + versions = [ + resolved[python][name][0] if name in resolved[python] else "-" + for python in SNAPSHOT_PYTHONS + ] + required_by = sorted( + { + source + for python in SNAPSHOT_PYTHONS + if name in resolved[python] + for source in resolved[python][name][1] + } + ) + licence = snapshot["licenses"].get(name, "Not recorded") + lines.append( + f"| {name} | " + + " | ".join(versions) + + f" | {', '.join(required_by)} | {_cell(licence)} |" + ) + counts = ", ".join( + f"{len(resolved[python])} on Python {python}" for python in SNAPSHOT_PYTHONS + ) + lines += ["", f"Packages, not counting policyengine-taxsim itself: {counts}."] + lines += ["", "Packages that differ from Linux on other platforms:", ""] + for label, platform in OTHER_PLATFORMS.items(): + groups = [] # [pythons, added, removed], consecutive versions merged + for python in SNAPSHOT_PYTHONS: + linux = set(snapshot["linux"][python]) + other = set(snapshot["platforms"][platform][python]) + added, removed = sorted(other - linux), sorted(linux - other) + if groups and groups[-1][1:] == [added, removed]: + groups[-1][0].append(python) + else: + groups.append([[python], added, removed]) + differences = [] + for pythons, added, removed in groups: + if not (added or removed): + continue + parts = [] + if added: + parts.append("adds " + ", ".join(added)) + if removed: + parts.append("leaves out " + ", ".join(removed)) + span = pythons[0] if len(pythons) == 1 else f"{pythons[0]} to {pythons[-1]}" + differences.append(f"on Python {span}, " + "; ".join(parts)) + lines.append(f"- {label}: " + ("; ".join(differences) or "none") + ".") + return "\n".join(lines) + "\n" + + +def block_snapshot_command() -> str: + snapshot = json.loads(SNAPSHOT.read_text()) + return ( + "```bash\n" + f"python scripts/generate_docs_reference.py --refresh-dependencies " + f"{snapshot['exclude_newer']}\n```\n\n" + f"The committed snapshot was resolved with {snapshot['resolver']} for " + f"`{SNAPSHOT_PLATFORM}` and packages published before " + f"{snapshot['exclude_newer']}.\n" + ) + + +def refresh_dependencies(exclude_newer: str) -> None: + """Re-resolve the dependency snapshots with uv (needs network).""" + DEPENDENCIES.mkdir(parents=True, exist_ok=True) + resolver = subprocess.run( + ["uv", "--version"], capture_output=True, text=True, check=True + ).stdout.strip() + + def compile_set(python, platform, output, hashes): + command = [ + "uv", + "pip", + "compile", + "pyproject.toml", + "--quiet", + "--python-version", + python, + "--python-platform", + platform, + "--exclude-newer", + exclude_newer, + "-o", + str(output), + ] + if hashes: + command.append("--generate-hashes") + shown = " ".join( + ["uv pip compile pyproject.toml", "--python-version", python] + + ["--python-platform", platform, "--exclude-newer", exclude_newer] + + (["--generate-hashes"] if hashes else []) + + ["-o", f"docs/dependencies/{output.name}"] + ) + command += ["--custom-compile-command", shown] + subprocess.run(command, cwd=REPO, check=True) + return { + name: version for name, (version, _) in parse_requirements(output).items() + } + + linux, platforms = {}, {platform: {} for platform in OTHER_PLATFORMS.values()} + scratch = DEPENDENCIES / ".scratch.txt" + for python in SNAPSHOT_PYTHONS: + output = DEPENDENCIES / f"requirements-py{python}.txt" + linux[python] = compile_set(python, SNAPSHOT_PLATFORM, output, hashes=True) + for platform in OTHER_PLATFORMS.values(): + platforms[platform][python] = compile_set(python, platform, scratch, False) + scratch.unlink() + + licenses = {} + every = { + (name, version) + for sets in [linux, *platforms.values()] + for packages in sets.values() + for name, version in packages.items() + } + for name, version in sorted(every): + if name not in licenses: + licenses[name] = _pypi_license(name, version) + SNAPSHOT.write_text( + json.dumps( + { + "exclude_newer": exclude_newer, + "resolver": resolver, + "policyengine_us_latest": _newest_release( + "policyengine-us", exclude_newer + ), + "linux": linux, + "platforms": platforms, + "licenses": licenses, + }, + indent=1, + sort_keys=True, + ) + + "\n" + ) + + +def _newest_release(name: str, before: str) -> dict: + """The highest version of ``name`` uploaded to PyPI before ``before``.""" + releases = _pypi_json(name)["releases"] + + def key(version): + return tuple(int(part) for part in re.findall(r"\d+", version)) + + uploaded = [ + version + for version, files in releases.items() + if files and min(f["upload_time_iso_8601"] for f in files) < before + ] + newest = max(uploaded, key=key) + return { + "version": newest, + "requires_python": _pypi_json(name, newest)["info"]["requires_python"], + } + + +def _pypi_json(name: str, version: str | None = None) -> dict: + url = f"https://pypi.org/pypi/{name}/{version + '/' if version else ''}json" + with urllib.request.urlopen(url, timeout=60) as response: + return json.load(response) + + +def _pypi_license(name: str, version: str) -> str: + info = _pypi_json(name, version)["info"] + expression = info.get("license_expression") + if expression: + return expression + text = (info.get("license") or "").strip() + if text and len(text) <= 60 and "\n" not in text: + return text + for phrase, name in ( + ( + "Redistribution and use in source and binary forms", + "BSD-style (full text in metadata)", + ), + ( + "Permission is hereby granted, free of charge", + "MIT-style (full text in metadata)", + ), + ("Apache License", "Apache (full text in metadata)"), + ): + if phrase in text: + return name + classifiers = [ + c.split(" :: ")[-1] + for c in info.get("classifiers") or [] + if c.startswith("License ::") and c != "License :: OSI Approved" + ] + return ", ".join(classifiers) or "See the package's metadata" + + +# --------------------------------------------------------------------------- +# Driver +# --------------------------------------------------------------------------- + +GENERATED = { + "input-guide.md": { + "input-columns": block_input_columns, + "input-handling": block_input_handling, + "pension-split-ages": block_pension_split_ages, + "state-codes": block_state_codes, + "example-survey-csv": block_example("survey_extract.csv"), + "example-python": block_example("crosswalk.py"), + "example-stata": block_example("crosswalk.do"), + "example-r": block_example("crosswalk.R"), + }, + "design.md": { + "fixed-inputs": block_fixed_inputs, + "one-time-rebates": block_one_time_rebates, + "output-sources": block_output_sources, + }, + "security-and-deployment.md": { + "python-versions": block_python_versions, + "direct-dependencies": block_direct_dependencies, + "dependency-tree": block_dependency_tree, + "snapshot-command": block_snapshot_command, + "taxsim-binaries": block_taxsim_binaries, + }, +} + + +def render(document: str, text: str) -> str: + """``text`` with every generated block of ``document`` rebuilt.""" + generators = GENERATED[document] + found = set() + + def replace(match): + name = match.group("name") + if name not in generators: + raise ValueError(f"docs/{document}: no generator for block {name!r}") + found.add(name) + return match.group(1) + generators[name]() + match.group(4) + + rendered = BLOCK.sub(replace, text) + missing = set(generators) - found + if missing: + raise ValueError(f"docs/{document}: missing blocks {sorted(missing)}") + return rendered + + +def stale_documents() -> list: + stale = [] + for document in GENERATED: + path = DOCS / document + text = path.read_text() + if render(document, text) != text: + stale.append(document) + return stale + + +def main(argv=None) -> int: + parser = argparse.ArgumentParser(description=__doc__.split("\n\n")[0]) + parser.add_argument("--check", action="store_true", help="exit 1 if stale") + parser.add_argument( + "--refresh-dependencies", + metavar="TIMESTAMP", + help="re-resolve docs/dependencies/ with uv for packages published " + "before TIMESTAMP (needs network)", + ) + args = parser.parse_args(argv) + if args.refresh_dependencies: + refresh_dependencies(args.refresh_dependencies) + if args.check: + stale = stale_documents() + for document in stale: + print(f"docs/{document} is out of date", file=sys.stderr) + if stale: + print("Run: python scripts/generate_docs_reference.py", file=sys.stderr) + return 1 if stale else 0 + for document in GENERATED: + path = DOCS / document + text = path.read_text() + rendered = render(document, text) + if rendered != text: + path.write_text(rendered) + print(f"Updated docs/{document}") + return 0 + + +if __name__ == "__main__": + sys.exit(main()) diff --git a/tests/test_docs_reference.py b/tests/test_docs_reference.py new file mode 100644 index 000000000..5d023f698 --- /dev/null +++ b/tests/test_docs_reference.py @@ -0,0 +1,119 @@ +"""The reference blocks in docs/ match the code. + +scripts/generate_docs_reference.py rebuilds every block between +```` markers in docs/input-guide.md, +docs/design.md and docs/security-and-deployment.md from the code: input +handling by running the emulator's input path on probe records, outputs from +variable_mappings.yaml, executables from resources/, dependencies from +pyproject.toml and the snapshot in docs/dependencies/. These tests fail when a +committed block no longer matches, or when the hand-written input metadata +and the columns the code reads disagree. + +Fix a failure by running ``python scripts/generate_docs_reference.py`` and +committing the result (after adding any new column to +docs/reference/input_variables.yaml). +""" + +import ast +import importlib.util +import json +import re +from pathlib import Path + +import pytest +from packaging.requirements import Requirement +from packaging.utils import canonicalize_name + +REPO = Path(__file__).resolve().parents[1] +_spec = importlib.util.spec_from_file_location( + "generate_docs_reference", REPO / "scripts" / "generate_docs_reference.py" +) +generator = importlib.util.module_from_spec(_spec) +_spec.loader.exec_module(generator) + +REGENERATE = "Run: python scripts/generate_docs_reference.py" + + +@pytest.mark.parametrize("document", sorted(generator.GENERATED)) +def test_generated_blocks_are_current(document): + text = (REPO / "docs" / document).read_text() + assert generator.render(document, text) == text, ( + f"docs/{document} no longer matches the code. {REGENERATE}" + ) + + +def test_input_metadata_lists_exactly_the_columns_the_code_reads(): + documented = set(generator.load_input_metadata()) + read = generator.read_columns() + assert documented == read, ( + f"Add to docs/reference/input_variables.yaml: {sorted(read - documented)}; " + f"remove: {sorted(documented - read)}. Then {REGENERATE.lower()}" + ) + + +def test_input_metadata_entries_are_complete(): + for name, entry in generator.load_input_metadata().items(): + assert set(entry) == {"group", "meaning", "type", "valid"}, name + assert entry["group"] in generator.GROUP_ORDER, name + + +def test_web_runner_knows_the_documented_columns(): + """The web runner warns about columns outside api.KNOWN_COLUMNS. api.py + imports modal at import time, so the set is read from its source.""" + tree = ast.parse((REPO / "policyengine_taxsim" / "api.py").read_text()) + known = next( + ast.literal_eval(node.value) + for node in tree.body + if isinstance(node, ast.Assign) + and any( + getattr(target, "id", None) == "KNOWN_COLUMNS" for target in node.targets + ) + ) + documented = set(generator.load_input_metadata()) + assert known <= documented + # The TAXSIM-35 option columns reach pre-2021 rows but draw the warning. + assert documented - known == {"opt1", "opt1v"} + + +def test_every_run_time_pin_is_in_the_design_doc(): + """docs/design.md's "Adjustments at run time" table names every variable + PolicyEngineRunner holds fixed on the Microsimulation.""" + design = (REPO / "docs" / "design.md").read_text() + section = design.split("## Adjustments at run time")[1].split("\n## ")[0] + named = set(re.findall(r"`(\w+)`", section)) + missing = [name for name in generator.run_time_pins() if name not in named] + assert not missing, f"Add to the table in docs/design.md: {missing}" + + +@pytest.mark.parametrize("python", generator.SNAPSHOT_PYTHONS) +def test_dependency_snapshot_satisfies_pyproject(python): + """Each direct dependency in pyproject.toml is in the snapshot at a version + pyproject allows, so changing a requirement forces a refresh + (python scripts/generate_docs_reference.py --refresh-dependencies TIME).""" + resolved = generator.parse_requirements( + REPO / "docs" / "dependencies" / f"requirements-py{python}.txt" + ) + for text in generator._pyproject()["project"]["dependencies"]: + requirement = Requirement(text) + if requirement.marker and not requirement.marker.evaluate( + {"python_version": python, "python_full_version": f"{python}.0"} + ): + continue + name = canonicalize_name(requirement.name) + assert name in resolved, f"{name} missing from the Python {python} snapshot" + assert requirement.specifier.contains(resolved[name][0], prereleases=True), ( + f"Python {python} snapshot has {name}=={resolved[name][0]}, " + f"outside {requirement.specifier}" + ) + + +def test_snapshot_files_are_the_resolutions_snapshot_json_records(): + snapshot = json.loads( + (REPO / "docs" / "dependencies" / "snapshot.json").read_text() + ) + for python in generator.SNAPSHOT_PYTHONS: + resolved = generator.parse_requirements( + REPO / "docs" / "dependencies" / f"requirements-py{python}.txt" + ) + versions = {name: entry[0] for name, entry in resolved.items()} + assert versions == snapshot["linux"][python], python diff --git a/tests/test_input_guide_claims.py b/tests/test_input_guide_claims.py new file mode 100644 index 000000000..c27e09ae9 --- /dev/null +++ b/tests/test_input_guide_claims.py @@ -0,0 +1,196 @@ +"""docs/input-guide.md's lists of rejected and unchecked inputs match the +emulator. + +The guide's "What the emulator rejects" table quotes each error message, and +"Values the emulator does not check" says what happens instead. Each case here +feeds the input to the emulator and checks both that the guide still quotes the +message and that the emulator still behaves that way. The rejections all +happen before any simulation; the unchecked cases are read off the +PolicyEngine inputs the emulator builds, and one simulation covers the cases +that only show in the output. +""" + +import importlib.util +import io +from pathlib import Path + +import numpy as np +import pandas as pd +import pytest + +from policyengine_taxsim.runners import PolicyEngineRunner, StitchedRunner + +REPO = Path(__file__).resolve().parents[1] +GUIDE = (REPO / "docs" / "input-guide.md").read_text() + +_spec = importlib.util.spec_from_file_location( + "generate_docs_reference", REPO / "scripts" / "generate_docs_reference.py" +) +generator = importlib.util.module_from_spec(_spec) +_spec.loader.exec_module(generator) + + +def _frame(csv: str) -> pd.DataFrame: + return pd.read_csv(io.StringIO(csv)) + + +HEADER = "taxsimid,year,state,mstat,pwages\n" + +REJECTED = { + "no year column": ( + StitchedRunner, + "taxsimid,state,mstat,pwages\n1,5,1,50000\n", + "Input data must contain a 'year' column", + ), + "blank year, command line": ( + StitchedRunner, + HEADER + "1,,5,1,50000\n", + "Cannot convert non-finite values (NA or inf) to integer", + ), + "blank year, PolicyEngineRunner": ( + PolicyEngineRunner, + HEADER + "1,,5,1,50000\n", + "cannot convert float NaN to integer", + ), + "state out of range": ( + StitchedRunner, + HEADER + "1,2023,52,1,50000\n", + "Record 1: 52 is not a valid TAXSIM SOI state code (0-51)", + ), + "state -1": ( + StitchedRunner, + HEADER + "1,2023,-1,1,50000\n", + "TAXSIM state -1 (compute every state) is not supported", + ), + "state as text": ( + StitchedRunner, + HEADER + "1,2023,CA,1,50000\n", + "TAXSIM state code must be a number, got 'CA'", + ), + "statefip not a state": ( + StitchedRunner, + "taxsimid,year,statefip,mstat,pwages\n1,2023,3,1,50000\n", + "statefip must be a valid US state FIPS code (1-56, including DC) or 0", + ), + "state and statefip": ( + StitchedRunner, + "taxsimid,year,state,statefip,mstat,pwages\n1,2023,5,6,1,50000\n", + "state 5 and statefip 6 are both nonzero; TAXSIM accepts only one of them", + ), + "text in a numeric column": ( + StitchedRunner, + HEADER + "1,2023,5,1,.\n", + "could not convert string to float: '.'", + ), +} + + +@pytest.mark.parametrize("case", sorted(REJECTED)) +def test_guide_quotes_the_error(case): + message = REJECTED[case][2] + assert message in GUIDE, f"docs/input-guide.md no longer quotes: {message}" + + +@pytest.mark.parametrize("case", sorted(REJECTED)) +def test_emulator_rejects_the_input(case): + runner, csv, message = REJECTED[case] + with pytest.raises(Exception) as error: + runner(_frame(csv)).run(show_progress=False) + assert message in str(error.value) + + +def _inputs(**record) -> dict: + """The PolicyEngine inputs the emulator builds for one 2023 California + record.""" + return generator.read_inputs({"year": 2023, "state": 5, **record})["inputs"] + + +def _same(first: dict, second: dict) -> bool: + return first.keys() == second.keys() and all( + np.array_equal(first[name], second[name]) for name in first + ) + + +@pytest.mark.parametrize("code", [3, 8]) +def test_other_filing_status_codes_build_an_unmarried_return(code): + assert _same(_inputs(mstat=code, pwages=50000), _inputs(mstat=1, pwages=50000)) + + +@pytest.mark.parametrize( + "column", ["sage", "swages", "ssemp", "sbusinc", "sprofinc", "sui"] +) +def test_spouse_columns_are_ignored_unless_joint(column): + assert "Spouse columns on non-joint returns" in GUIDE + for mstat in (1, 6): + with_value = _inputs(mstat=mstat, pwages=50000, **{column: 30000}) + assert _same(with_value, _inputs(mstat=mstat, pwages=50000)), (column, mstat) + + +def test_nonprop_has_no_effect_on_policyengine_rows(): + for mstat in (1, 2): + assert _same( + _inputs(mstat=mstat, pwages=50000, nonprop=10000), + _inputs(mstat=mstat, pwages=50000), + ) + + +def test_negative_amounts_are_passed_through(): + inputs = _inputs(mstat=1, pwages=-5000) + assert inputs["employment_income"][inputs["is_tax_unit_head"]].tolist() == [-5000] + + +def test_fractions_in_codes_and_counts_are_cut(): + fractional = generator.read_inputs( + {"year": 2023.9, "state": 5, "mstat": 2.6, "page": 40.7, "sage": 38.2, + "depx": 1.9, "age1": 7.9} + ) # fmt: skip + whole = generator.read_inputs( + { + "year": 2023, + "state": 5, + "mstat": 2, + "page": 40, + "sage": 38, + "depx": 1, + "age1": 7, + } + ) + assert fractional["frame"]["year"] == 2023 + assert _same(fractional["inputs"], whole["inputs"]) + + +def test_ages_beyond_depx_are_ignored(): + inputs = _inputs(mstat=1, depx=1, age1=3, age2=4) + assert inputs["age"][inputs["is_tax_unit_dependent"]].tolist() == [3] + + +def test_unknown_and_misspelled_columns_are_ignored(): + record = {"year": 2023, "state": 5, "mstat": 1} + misspelled = generator.read_inputs({**record, "PWAGES": 50000, "wages": 50000}) + assert _same(misspelled["inputs"], generator.read_inputs(record)["inputs"]) + + +def test_missing_value_words_read_as_blank(): + df = _frame("taxsimid,year,state,mstat,pwages,page\n1,2023,5,1,NA,null\n") + assert df[["pwages", "page"]].isna().all().all() + inputs = generator.read_inputs(df.iloc[0].to_dict())["inputs"] + assert inputs["employment_income"].tolist() == [0] + assert inputs["age"].tolist() == [40] + + +def test_output_level_claims(): + """One simulation: an idtl other than 0, 2 and 5 leaves the record's + output cells blank, and duplicate taxsimids are both computed.""" + results = PolicyEngineRunner( + _frame( + "taxsimid,year,state,mstat,pwages,idtl\n" + "1,2023,5,1,50000,7\n" + "2,2023,5,1,50000,2\n" + "2,2023,5,1,80000,2\n" + ) + ).run(show_progress=False) + odd = results[results["taxsimid"] == 1].iloc[0] + assert pd.isna(odd["fiitax"]) and pd.isna(odd["siitax"]) + duplicates = results[results["taxsimid"] == 2] + assert len(duplicates) == 2 + assert duplicates["fiitax"].nunique() == 2 diff --git a/tests/test_no_network.py b/tests/test_no_network.py new file mode 100644 index 000000000..82ecc4957 --- /dev/null +++ b/tests/test_no_network.py @@ -0,0 +1,80 @@ +"""A standard run opens no network connection. + +docs/security-and-deployment.md says a local run sends nothing anywhere. This +runs the command line in a fresh Python process with an audit hook installed +before anything is imported. The hook records and refuses every outbound +connection, DNS lookup and HTTP request, so the run fails if one is attempted, +and the test fails even if the caller swallowed the refusal. The input mixes +years computed by the bundled TAXSIM-35 executable and by PolicyEngine, +including a record with no state tax. + +urllib3 binds a socket to the loopback address on import to test for IPv6; +that sends nothing and is allowed. +""" + +import os +import subprocess +import sys + +import pandas as pd + +GUARDED_RUN = r""" +import sys + +BLOCKED = { + "socket.connect", "socket.getaddrinfo", + "socket.gethostbyname", "socket.gethostbyname_ex", "socket.gethostbyaddr", + "socket.getnameinfo", "socket.sendto", "socket.sendmsg", + "urllib.Request", "http.client.connect", "ftplib.connect", + "smtplib.connect", "imaplib.open", "poplib.connect", "nntplib.connect", + "telnetlib.Telnet.open", "webbrowser.open", +} +log_path = sys.argv[1] + + +def guard(event, args): + if event in BLOCKED: + with open(log_path, "a") as log: + log.write(f"{event} {args!r}\n") + raise RuntimeError(f"network access during a run: {event}") + + +sys.addaudithook(guard) +sys.argv = ["policyengine-taxsim", "policyengine", sys.argv[2], "-o", sys.argv[3]] +from policyengine_taxsim.cli import cli + +cli() +""" + +INPUT = """taxsimid,year,state,mstat,page,sage,depx,age1,pwages,swages,intrec,pensions,gssi,rentpaid,proptax,mortgage,idtl +1,2019,5,2,40,38,1,4,60000,25000,300,0,0,0,4000,9000,2 +2,2023,33,1,30,0,0,0,52000,0,0,0,0,14000,0,0,2 +3,2024,21,2,67,66,0,0,0,0,1200,30000,36000,0,3000,0,2 +4,2025,0,1,45,0,1,12,38000,0,0,0,0,9000,0,0,0 +""" + + +def test_command_line_run_opens_no_connection(tmp_path): + source = tmp_path / "input.csv" + source.write_text(INPUT) + output = tmp_path / "output.csv" + attempts = tmp_path / "network.log" + attempts.touch() + environment = dict(os.environ) + # Empty download caches, so nothing can be satisfied from an earlier run. + environment["HF_HOME"] = str(tmp_path / "hf") + environment["XDG_CACHE_HOME"] = str(tmp_path / "cache") + result = subprocess.run( + [sys.executable, "-c", GUARDED_RUN, str(attempts), str(source), str(output)], + cwd=tmp_path, + capture_output=True, + text=True, + env=environment, + ) + assert attempts.read_text() == "", ( + f"network access attempted:\n{attempts.read_text()}" + ) + assert result.returncode == 0, result.stderr[-3000:] + results = pd.read_csv(output) + assert results["taxsimid"].tolist() == [1, 2, 3, 4] + assert results["fiitax"].notna().all() diff --git a/tests/test_worked_example.py b/tests/test_worked_example.py new file mode 100644 index 000000000..23da87e0a --- /dev/null +++ b/tests/test_worked_example.py @@ -0,0 +1,112 @@ +"""The worked example in docs/input-guide.md runs as documented. + +Runs docs/examples/custom-dataset/crosswalk.py in a copy of that folder, then +repeats the Stata script's hand-off to the emulator (a .dta file through the +policyengine subcommand) on the same TAXSIM input and checks it gives the same +taxes. Stata itself is not available in CI. When Rscript is available, also +runs crosswalk.R and checks it agrees. +""" + +import os +import shutil +import subprocess +import sys +from pathlib import Path + +import pandas as pd +import pytest + +REPO = Path(__file__).resolve().parents[1] +EXAMPLE = REPO / "docs" / "examples" / "custom-dataset" +TAXES = ["fiitax", "siitax", "fica", "v10"] + + +def _environment() -> dict: + """Puts this Python's policyengine-taxsim command first on the PATH, as + an activated environment would.""" + env = dict(os.environ) + env["PATH"] = str(Path(sys.executable).parent) + os.pathsep + env.get("PATH", "") + return env + + +@pytest.fixture(scope="module") +def python_run(tmp_path_factory): + folder = tmp_path_factory.mktemp("example") / "custom-dataset" + shutil.copytree(EXAMPLE, folder) + result = subprocess.run( + [sys.executable, "crosswalk.py"], + cwd=folder, + capture_output=True, + text=True, + env=_environment(), + ) + assert result.returncode == 0, result.stderr[-3000:] + return folder + + +def test_python_example_computes_every_household(python_run): + survey = pd.read_csv(python_run / "survey_extract.csv") + merged = pd.read_csv(python_run / "survey_with_taxes.csv") + assert merged["hh_id"].tolist() == survey["hh_id"].tolist() + assert merged[TAXES].notna().all().all() + + +def test_python_example_recodes_as_documented(python_run): + taxsim = pd.read_csv(python_run / "taxsim_input.csv").set_index("taxsimid") + assert taxsim.notna().all().all() + # Household 102's newborn is coded as 1, and married is mstat 2. + assert taxsim.loc[102, "age1"] == 1 + assert taxsim.loc[101, "mstat"] == 2 and taxsim.loc[102, "mstat"] == 1 + # Charity is added to mortgage interest. + assert taxsim.loc[101, "mortgage"] == 12000 + 1500 + + +def test_stata_hand_off_gives_the_same_taxes(python_run): + """crosswalk.do saves the TAXSIM input as .dta and runs + `policyengine-taxsim policyengine taxsim_input.dta -o taxsim_results.dta`.""" + taxsim = pd.read_csv(python_run / "taxsim_input.csv") + taxsim.to_stata(python_run / "taxsim_input.dta", write_index=False) + result = subprocess.run( + [ + sys.executable, + "-m", + "policyengine_taxsim.cli", + "policyengine", + "taxsim_input.dta", + "-o", + "taxsim_results.dta", + ], + cwd=python_run, + capture_output=True, + text=True, + env=_environment(), + ) + assert result.returncode == 0, result.stderr[-3000:] + from_stata = pd.read_stata(python_run / "taxsim_results.dta").set_index("taxsimid") + from_python = pd.read_csv(python_run / "survey_with_taxes.csv").set_index("hh_id") + for household in from_python.index: + for column in TAXES: + assert ( + abs( + from_stata.loc[household, column] + - from_python.loc[household, column] + ) + < 0.01 + ) + + +@pytest.mark.skipif(shutil.which("Rscript") is None, reason="Rscript not installed") +def test_r_example_gives_the_same_taxes(python_run, tmp_path): + folder = tmp_path / "custom-dataset" + shutil.copytree(EXAMPLE, folder) + result = subprocess.run( + ["Rscript", "crosswalk.R"], + cwd=folder, + capture_output=True, + text=True, + env=_environment(), + ) + assert result.returncode == 0, result.stderr[-3000:] + from_r = pd.read_csv(folder / "survey_with_taxes.csv").set_index("hh_id") + from_python = pd.read_csv(python_run / "survey_with_taxes.csv").set_index("hh_id") + pd.testing.assert_frame_equal(from_r[TAXES], from_python[TAXES], atol=0.01) From f21f99d2e4f0de5bd0dafc44d1b6f1a3ccbefdd5 Mon Sep 17 00:00:00 2001 From: Max Ghenis Date: Fri, 9 Oct 2026 20:34:01 -0400 Subject: [PATCH 2/9] Check the worked example and network claims in tests; tighten generated tables Co-Authored-By: Claude Opus 5.5 --- docs/dependencies/snapshot.json | 18 +-- docs/design.md | 1 + .../custom-dataset/survey_extract.csv | 2 +- docs/input-guide.md | 12 +- docs/reference/input_variables.yaml | 4 +- docs/security-and-deployment.md | 18 +-- scripts/generate_docs_reference.py | 51 +++---- tests/test_no_network.py | 4 +- tests/test_worked_example.py | 131 +++++++++++------- 9 files changed, 136 insertions(+), 105 deletions(-) diff --git a/docs/dependencies/snapshot.json b/docs/dependencies/snapshot.json index 3f4c61927..01b6ab266 100644 --- a/docs/dependencies/snapshot.json +++ b/docs/dependencies/snapshot.json @@ -10,8 +10,8 @@ "charset-normalizer": "MIT", "click": "BSD-3-Clause", "colorama": "BSD License", - "contourpy": "BSD-style (full text in metadata)", - "cycler": "BSD-style (full text in metadata)", + "contourpy": "BSD License", + "cycler": "BSD License", "decorator": "BSD-2-Clause", "dpath": "MIT", "et-xmlfile": "MIT", @@ -30,7 +30,7 @@ "httpx": "BSD-3-Clause", "httpx2": "BSD-3-Clause", "huggingface-hub": "Apache-2.0", - "hyperframe": "MIT-style (full text in metadata)", + "hyperframe": "MIT License", "idna": "BSD-3-Clause", "iniconfig": "MIT", "ipython": "BSD-3-Clause", @@ -38,10 +38,10 @@ "jellyfish": "MIT License", "jinja2": "BSD License", "jsonpickle": "BSD-3-Clause", - "kiwisolver": "BSD-style (full text in metadata)", + "kiwisolver": "BSD License", "markdown-it-py": "MIT License", "markupsafe": "BSD-3-Clause", - "matplotlib": "MIT-style (full text in metadata)", + "matplotlib": "Python Software Foundation License", "matplotlib-inline": "BSD-3-Clause", "mdurl": "MIT License", "microdf-python": "MIT", @@ -49,10 +49,10 @@ "ndindex": "MIT", "networkx": "BSD License", "numexpr": "MIT", - "numpy": "BSD-style (full text in metadata)", + "numpy": "BSD License", "openpyxl": "MIT", "packaging": "Apache-2.0 OR BSD-2-Clause", - "pandas": "BSD-style (full text in metadata)", + "pandas": "BSD License", "parso": "MIT", "pexpect": "ISC license", "pillow": "MIT-CMU", @@ -86,7 +86,7 @@ "threadpoolctl": "BSD-3-Clause", "tomli": "MIT", "tqdm": "MPL-2.0 AND MIT", - "traitlets": "BSD-style (full text in metadata)", + "traitlets": "BSD License", "truststore": "MIT", "typing-extensions": "PSF-2.0", "typing-inspection": "MIT", @@ -1396,5 +1396,5 @@ "requires_python": "<3.15,>=3.11", "version": "2.38.1" }, - "resolver": "uv 0.12.13 (Homebrew 2026-09-10 aarch64-apple-darwin)" + "resolver": "uv 0.11.7 (9d177269e 2026-04-15 aarch64-apple-darwin)" } diff --git a/docs/design.md b/docs/design.md index e2d2a76ec..cc5d09bfb 100644 --- a/docs/design.md +++ b/docs/design.md @@ -241,6 +241,7 @@ Calculations: - **Maryland.** `siitax` excludes county income tax, as TAXSIM-35's does. - **New York.** `siitax` excludes the payments made outside Form IT-201. - **Itemized deductions.** `mortgage` and `otheritem` are treated alike; in some states and years TAXSIM-35 leaves `otheritem` out of the state itemized deduction. See the README. +- **Active business income (`pbusinc`, `sbusinc`).** The emulator treats it like `psemp`: subject to self-employment tax and eligible for the QBI deduction, as NBER's input documentation describes. The bundled TAXSIM-35 build (cd2026081819) applies no self-employment tax to it. For a single filer with $100,000 of `pbusinc` in 2023, the emulator reports `fiitax` 9,226.50 and `fica` 14,129.55; the build reports 10,469.90 and 0 (checked 2026-10-09). `tests/test_passthrough_qbid.py` pins the emulator's treatment, which its docstring traces to a June 2026 comparison by TAXSIM's author. - **S corporation income and the net investment income tax.** Passive by default with policyengine-us 2.10.1 or later; see `--scorp-treatment` in the README. - **Married filing separately.** `tests/test_married_filing_separately.py` documents the separate-return cases where the bundled TAXSIM-35 build and the emulator differ and the emulator deliberately does not copy TAXSIM-35. - **Marginal rates.** A $100 wage change instead of one cent; see above. diff --git a/docs/examples/custom-dataset/survey_extract.csv b/docs/examples/custom-dataset/survey_extract.csv index 0ce5a34e1..44c9d6f64 100644 --- a/docs/examples/custom-dataset/survey_extract.csv +++ b/docs/examples/custom-dataset/survey_extract.csv @@ -3,5 +3,5 @@ hh_id,tax_year,state_fips,marital_status,age_head,age_spouse,num_children,child_ 102,2023,36,5,27,,1,0,,,38000,,,,,,,,16800,,,,4200 103,2024,12,1,68,66,0,,,,,,,2500,1800,30000,34000,,,3200,,800, 104,2024,48,5,29,,0,,,,52000,,8000,120,,,,,13200,,,, -105,2022,39,1,44,41,3,2,6,15,60000,,,,,,,4000,14400,,,,3000 +105,2023,39,1,44,41,3,2,6,15,60000,,,,,,,4000,14400,,,,3000 106,2019,42,3,51,,0,,,,47000,,,900,400,,,,,2100,6000,, diff --git a/docs/input-guide.md b/docs/input-guide.md index 5751aaec0..b88c8d27f 100644 --- a/docs/input-guide.md +++ b/docs/input-guide.md @@ -97,14 +97,14 @@ What each column means. The descriptions come from [`docs/reference/input_variab |---|---|---|---| | `pwages` | Wage and salary income of the primary taxpayer. | Dollars per year | Any amount. | | `swages` | Wage and salary income of the spouse. Read only on joint returns. | Dollars per year | Any amount. TAXSIM-35 requires zero on non-joint returns. | -| `psemp` | Self-employment income of the primary taxpayer that is not qualified business income, before self-employment tax. | Dollars per year | Any amount. | +| `psemp` | Self-employment income of the primary taxpayer, before self-employment tax. NBER's page describes it as not eligible for the qualified business income deduction, but the emulator and the bundled TAXSIM-35 build both apply the deduction to it. | Dollars per year | Any amount. | | `ssemp` | Self-employment income of the spouse; see `psemp`. Read only on joint returns. | Dollars per year | Any amount. | #### Business income (QBI) | Column | Meaning | Type | Valid values | |---|---|---|---| -| `pbusinc` | Primary taxpayer's active business income eligible for the qualified business income deduction without the specified-service phase-out. | Dollars per year | Any amount. | +| `pbusinc` | Primary taxpayer's active business income eligible for the qualified business income deduction without the specified-service phase-out. The emulator also applies self-employment tax to it; the bundled TAXSIM-35 build does not (see the design document's known differences). | Dollars per year | Any amount. | | `sbusinc` | Spouse's active business income; see `pbusinc`. Read only on joint returns. | Dollars per year | Any amount. | | `pprofinc` | Primary taxpayer's income from a specified service trade or business (SSTB), eligible for the qualified business income deduction subject to its phase-out. | Dollars per year | Any amount. | | `sprofinc` | Spouse's SSTB income; see `pprofinc`. Read only on joint returns. | Dollars per year | Any amount. | @@ -163,10 +163,10 @@ Generated by running the emulator's input code on test records, so it shows what | Column | Blank cell | Column left out | PolicyEngine input (2021 and later) | Pre-2021 rows, to TAXSIM-35 | |---|---|---|---|---| | `taxsimid` | Blank in the output | Records numbered 1, 2, 3, ... | None: returned as `taxsimid` | Passed | -| `year` | Error: ValueError: cannot convert float NaN to integer | Error: ValueError: Input data must contain a 'year' column | The period every variable is computed for | Passed | +| `year` | The run stops with an error | The run stops with an error | The period every variable is computed for | Passed | | `state` | 0 | 0 | `state_fips`, converted from the SOI code. State 0 is computed as Texas, which has no income tax, and reported as 0 | Passed | | `statefip` | `state` is used | `state` is used | `state_fips` (converted to `state` first) | Converted to `state` first | -| `mstat` | 1; 0 also becomes 1 | 1 | 1, 8 and 3 builds a one-adult unit; 2 adds a spouse to the tax unit; 6 builds a one-adult unit with `is_separated` and `cohabitating_spouses` set. Tested codes: 1, 2, 6, 8 and 3 | Passed | +| `mstat` | 1; 0 also becomes 1 | 1 | 2: a spouse is added to the tax unit. 6: one adult, with `is_separated` and `cohabitating_spouses` set. 1, 3, 4, 5, 7, 8 and 9: one adult, treated as unmarried | Passed | | `page` | 40; 0 also becomes 40 | 40 | `age` of the primary taxpayer | Passed | | `sage` | 40; 0 also becomes 40 | 40 | `age` of the spouse (joint returns only) | Passed | | `dependent_exemption` | Not used | Not used | Not used: no effect on PolicyEngine rows | Not passed | @@ -313,7 +313,7 @@ hh_id,tax_year,state_fips,marital_status,age_head,age_spouse,num_children,child_ 102,2023,36,5,27,,1,0,,,38000,,,,,,,,16800,,,,4200 103,2024,12,1,68,66,0,,,,,,,2500,1800,30000,34000,,,3200,,800, 104,2024,48,5,29,,0,,,,52000,,8000,120,,,,,13200,,,, -105,2022,39,1,44,41,3,2,6,15,60000,,,,,,,4000,14400,,,,3000 +105,2023,39,1,44,41,3,2,6,15,60000,,,,,,,4000,14400,,,,3000 106,2019,42,3,51,,0,,,,47000,,,900,400,,,,,2100,6000,, ``` @@ -573,7 +573,7 @@ All three scripts print the same taxes. This run used policyengine-taxsim 3.1.1 | 102 | 2023 | -2307.89 | -269.19 | 5814.00 | 38000.00 | | 103 | 2024 | 1240.50 | 0.00 | 0.00 | 46505.00 | | 104 | 2024 | 4984.14 | 0.00 | 9086.36 | 59554.82 | -| 105 | 2022 | -1839.00 | 1145.83 | 9180.00 | 64000.00 | +| 105 | 2023 | -2084.00 | 1108.79 | 9180.00 | 64000.00 | | 106 | 2019 | 4090.00 | 1482.81 | 7191.00 | 48300.00 | Household 102, the single parent with a newborn, has negative federal and state tax because refundable credits exceed tax. Household 106 was computed by TAXSIM-35 because its tax year is 2019. diff --git a/docs/reference/input_variables.yaml b/docs/reference/input_variables.yaml index 405743cbd..53be0c95f 100644 --- a/docs/reference/input_variables.yaml +++ b/docs/reference/input_variables.yaml @@ -109,7 +109,7 @@ swages: valid: Any amount. TAXSIM-35 requires zero on non-joint returns. psemp: group: Wages and self-employment - meaning: Self-employment income of the primary taxpayer that is not qualified business income, before self-employment tax. + meaning: Self-employment income of the primary taxpayer, before self-employment tax. NBER's page describes it as not eligible for the qualified business income deduction, but the emulator and the bundled TAXSIM-35 build both apply the deduction to it. type: Dollars per year valid: Any amount. ssemp: @@ -119,7 +119,7 @@ ssemp: valid: Any amount. pbusinc: group: Business income (QBI) - meaning: Primary taxpayer's active business income eligible for the qualified business income deduction without the specified-service phase-out. + meaning: Primary taxpayer's active business income eligible for the qualified business income deduction without the specified-service phase-out. The emulator also applies self-employment tax to it; the bundled TAXSIM-35 build does not (see the design document's known differences). type: Dollars per year valid: Any amount. sbusinc: diff --git a/docs/security-and-deployment.md b/docs/security-and-deployment.md index 7eb4757c1..43c85056c 100644 --- a/docs/security-and-deployment.md +++ b/docs/security-and-deployment.md @@ -170,8 +170,8 @@ Every package an installation pulls in, resolved for Linux x86-64, with the pack | certifi | 2026.7.22 | 2026.7.22 | 2026.7.22 | 2026.7.22 | 2026.7.22 | httpcore, httpx, requests | MPL-2.0 | | charset-normalizer | 3.5.2 | 3.5.2 | 3.5.2 | 3.5.2 | 3.5.2 | requests | MIT | | click | 8.5.0 | 8.5.0 | 8.5.0 | 8.5.0 | 8.5.0 | huggingface-hub, policyengine-taxsim | BSD-3-Clause | -| contourpy | 1.3.2 | 1.3.3 | 1.4.0 | 1.4.0 | 1.4.0 | matplotlib | BSD-style (full text in metadata) | -| cycler | 0.12.1 | 0.12.1 | 0.12.1 | 0.12.1 | 0.12.1 | matplotlib | BSD-style (full text in metadata) | +| contourpy | 1.3.2 | 1.3.3 | 1.4.0 | 1.4.0 | 1.4.0 | matplotlib | BSD License | +| cycler | 0.12.1 | 0.12.1 | 0.12.1 | 0.12.1 | 0.12.1 | matplotlib | BSD License | | decorator | 5.3.1 | 5.3.1 | 5.3.1 | 5.3.1 | 5.3.1 | ipython | BSD-2-Clause | | dpath | 2.2.0 | 2.2.0 | 2.2.0 | 2.2.0 | 2.2.0 | policyengine-core | MIT | | et-xmlfile | 2.0.0 | 2.0.0 | 2.0.0 | 2.0.0 | 2.0.0 | openpyxl | MIT | @@ -190,7 +190,7 @@ Every package an installation pulls in, resolved for Linux x86-64, with the pack | httpx | - | 0.28.1 | 0.28.1 | 0.28.1 | 0.28.1 | blosc2 | BSD-3-Clause | | httpx2 | 2.13.1 | 2.13.1 | 2.13.1 | 2.13.1 | 2.13.1 | huggingface-hub | BSD-3-Clause | | huggingface-hub | 2.2.0 | 2.2.0 | 2.2.0 | 2.2.0 | 2.2.0 | policyengine-core | Apache-2.0 | -| hyperframe | - | 6.1.0 | 6.1.0 | 6.1.0 | 6.1.0 | h2 | MIT-style (full text in metadata) | +| hyperframe | - | 6.1.0 | 6.1.0 | 6.1.0 | 6.1.0 | h2 | MIT License | | idna | 3.20 | 3.20 | 3.20 | 3.20 | 3.20 | anyio, httpx, httpx2, requests | BSD-3-Clause | | iniconfig | 2.3.1 | 2.3.1 | 2.3.1 | 2.3.1 | 2.3.1 | pytest | MIT | | ipython | 8.39.0 | 8.39.0 | 8.39.0 | 8.39.0 | 8.39.0 | policyengine-core, pyvis | BSD-3-Clause | @@ -198,10 +198,10 @@ Every package an installation pulls in, resolved for Linux x86-64, with the pack | jellyfish | 1.2.1 | 1.2.1 | 1.2.1 | 1.2.1 | 1.2.1 | us | MIT License | | jinja2 | 3.1.6 | 3.1.6 | 3.1.6 | 3.1.6 | 3.1.6 | pyvis | BSD License | | jsonpickle | 4.1.3 | 4.1.3 | 4.1.3 | 4.1.3 | 4.1.3 | pyvis | BSD-3-Clause | -| kiwisolver | 1.5.1 | 1.5.1 | 1.5.1 | 1.5.1 | 1.5.1 | matplotlib | BSD-style (full text in metadata) | +| kiwisolver | 1.5.1 | 1.5.1 | 1.5.1 | 1.5.1 | 1.5.1 | matplotlib | BSD License | | markdown-it-py | - | 4.2.0 | 4.2.0 | 4.2.0 | 4.2.0 | rich | MIT License | | markupsafe | 3.0.4 | 3.0.4 | 3.0.4 | 3.0.4 | 3.0.4 | jinja2 | BSD-3-Clause | -| matplotlib | 3.10.9 | 3.11.2 | 3.11.2 | 3.11.2 | 3.11.2 | policyengine-taxsim | MIT-style (full text in metadata) | +| matplotlib | 3.10.9 | 3.11.2 | 3.11.2 | 3.11.2 | 3.11.2 | policyengine-taxsim | Python Software Foundation License | | matplotlib-inline | 0.2.2 | 0.2.2 | 0.2.2 | 0.2.2 | 0.2.2 | ipython | BSD-3-Clause | | mdurl | - | 0.1.2 | 0.1.2 | 0.1.2 | 0.1.2 | markdown-it-py | MIT License | | microdf-python | 1.5.11 | 1.5.11 | 1.5.11 | 1.5.11 | 1.5.11 | policyengine-core, policyengine-us | MIT | @@ -209,10 +209,10 @@ Every package an installation pulls in, resolved for Linux x86-64, with the pack | ndindex | 1.10.1 | 1.10.1 | 1.10.1 | 1.10.1 | 1.10.1 | blosc2 | MIT | | networkx | 3.4.2 | 3.6.1 | 3.7 | 3.7 | 3.7 | pyvis | BSD License | | numexpr | 2.14.1 | 2.14.2 | 2.14.2 | 2.14.2 | 2.14.2 | blosc2, policyengine-core, tables | MIT | -| numpy | 2.2.6 | 2.4.6 | 2.5.3 | 2.5.3 | 2.5.3 | blosc2, contourpy, h5py, matplotlib, microdf-python, numexpr, pandas, policyengine-core, policyengine-taxsim, spm-calculator, tables | BSD-style (full text in metadata) | +| numpy | 2.2.6 | 2.4.6 | 2.5.3 | 2.5.3 | 2.5.3 | blosc2, contourpy, h5py, matplotlib, microdf-python, numexpr, pandas, policyengine-core, policyengine-taxsim, spm-calculator, tables | BSD License | | openpyxl | 3.1.5 | 3.1.5 | 3.1.5 | 3.1.5 | 3.1.5 | spm-calculator | MIT | | packaging | 26.3 | 26.3 | 26.3 | 26.3 | 26.3 | huggingface-hub, matplotlib, plotly, pytest, tables, wheel | Apache-2.0 OR BSD-2-Clause | -| pandas | 2.3.3 | 3.0.6 | 3.0.6 | 3.0.6 | 3.0.6 | microdf-python, policyengine-core, policyengine-taxsim, policyengine-us, spm-calculator | BSD-style (full text in metadata) | +| pandas | 2.3.3 | 3.0.6 | 3.0.6 | 3.0.6 | 3.0.6 | microdf-python, policyengine-core, policyengine-taxsim, policyengine-us, spm-calculator | BSD License | | parso | 0.8.7 | 0.8.7 | 0.8.7 | 0.8.7 | 0.8.7 | jedi | MIT | | pexpect | 4.9.0 | 4.9.0 | 4.9.0 | 4.9.0 | 4.9.0 | ipython | ISC license | | pillow | 12.3.0 | 12.3.0 | 12.3.0 | 12.3.0 | 12.3.0 | matplotlib | MIT-CMU | @@ -246,7 +246,7 @@ Every package an installation pulls in, resolved for Linux x86-64, with the pack | threadpoolctl | 3.7.0 | 3.7.0 | 3.7.0 | 3.7.0 | 3.7.0 | blosc2 | BSD-3-Clause | | tomli | 2.5.0 | - | - | - | - | huggingface-hub, pytest | MIT | | tqdm | 4.70.1 | 4.70.1 | 4.70.1 | 4.70.1 | 4.70.1 | huggingface-hub, policyengine-taxsim, policyengine-us | MPL-2.0 AND MIT | -| traitlets | 5.16.1 | 5.16.1 | 5.16.1 | 5.16.1 | 5.16.1 | ipython, matplotlib-inline | BSD-style (full text in metadata) | +| traitlets | 5.16.1 | 5.16.1 | 5.16.1 | 5.16.1 | 5.16.1 | ipython, matplotlib-inline | BSD License | | truststore | 0.10.4 | 0.10.4 | 0.10.4 | 0.10.4 | 0.10.4 | httpcore2, httpx2 | MIT | | typing-extensions | 4.16.0 | 4.16.0 | 4.16.0 | 4.16.0 | 4.16.0 | anyio, exceptiongroup, httpx2, huggingface-hub, ipython, pydantic, pydantic-core, tables, typing-inspection | PSF-2.0 | | typing-inspection | 0.4.4 | 0.4.4 | 0.4.4 | 0.4.4 | 0.4.4 | pydantic | MIT | @@ -277,7 +277,7 @@ The snapshot fixes one reviewed set of versions. Each `docs/dependencies/require python scripts/generate_docs_reference.py --refresh-dependencies 2026-10-09T19:00:00Z ``` -The committed snapshot was resolved with uv 0.12.13 (Homebrew 2026-09-10 aarch64-apple-darwin) for `x86_64-manylinux_2_28` and packages published before 2026-10-09T19:00:00Z. +The committed snapshot was resolved with uv 0.11.7 (9d177269e 2026-04-15 aarch64-apple-darwin) for `x86_64-manylinux_2_28` and packages published before 2026-10-09T19:00:00Z. The resolution is reproducible: re-running the command with the same timestamp gives the same versions, as long as PyPI still has them. For a platform other than Linux, run the `uv pip compile` command at the top of a snapshot file with a different `--python-platform` (for example `x86_64-pc-windows-msvc`). diff --git a/scripts/generate_docs_reference.py b/scripts/generate_docs_reference.py index 199c1fc37..07edfb0b5 100644 --- a/scripts/generate_docs_reference.py +++ b/scripts/generate_docs_reference.py @@ -325,8 +325,8 @@ def blank_handling(column: str, used: bool) -> tuple[str, str]: record[column] = math.nan try: results.append(_effective_value(column, read_inputs(record))) - except ProbeError as error: - results.append(f"Error: {error}") + except ProbeError: + results.append("The run stops with an error") blank, absent = results if column != "year": zero = _effective_value(column, read_inputs({**_base_for(column), column: 0})) @@ -482,7 +482,7 @@ def check(condition, claim): return None -MSTAT_PROBES = (1, 2, 6, 8, 3) +MSTAT_PROBES = tuple(range(1, 10)) def _mstat_structure(code: int) -> tuple: @@ -496,23 +496,27 @@ def _mstat_structure(code: int) -> tuple: def mstat_handling() -> str: - """How each filing-status code shapes the tax unit, read from probes.""" + """How each filing-status code from 1 to 9 shapes the tax unit, read from + probes.""" groups = defaultdict(list) for code in MSTAT_PROBES: groups[_mstat_structure(code)].append(code) sentences = [] - for (spouse, separated, cohabiting), codes in groups.items(): - label = _codes(codes) + for (spouse, separated, cohabiting), codes in sorted( + groups.items(), key=lambda item: len(item[1]) + ): if spouse: - sentences.append(f"{label} adds a spouse to the tax unit") + sentences.append(f"{_codes(codes)}: a spouse is added to the tax unit") elif separated and cohabiting: sentences.append( - f"{label} builds a one-adult unit with `is_separated` and " + f"{_codes(codes)}: one adult, with `is_separated` and " "`cohabitating_spouses` set" ) + elif not separated and not cohabiting: + sentences.append(f"{_codes(codes)}: one adult, treated as unmarried") else: - sentences.append(f"{label} builds a one-adult unit") - return "; ".join(sentences) + ". Tested codes: " + _codes(MSTAT_PROBES) + raise ValueError(f"mstat {codes}: unrecognized structure") + return ". ".join(sentences) def _codes(codes) -> str: @@ -1122,6 +1126,9 @@ def _pypi_json(name: str, version: str | None = None) -> dict: def _pypi_license(name: str, version: str) -> str: + """The license a package declares on PyPI: its SPDX expression, else a + short license field, else its license classifiers, else the family its + license text belongs to.""" info = _pypi_json(name, version)["info"] expression = info.get("license_expression") if expression: @@ -1129,25 +1136,21 @@ def _pypi_license(name: str, version: str) -> str: text = (info.get("license") or "").strip() if text and len(text) <= 60 and "\n" not in text: return text - for phrase, name in ( - ( - "Redistribution and use in source and binary forms", - "BSD-style (full text in metadata)", - ), - ( - "Permission is hereby granted, free of charge", - "MIT-style (full text in metadata)", - ), - ("Apache License", "Apache (full text in metadata)"), - ): - if phrase in text: - return name classifiers = [ c.split(" :: ")[-1] for c in info.get("classifiers") or [] if c.startswith("License ::") and c != "License :: OSI Approved" ] - return ", ".join(classifiers) or "See the package's metadata" + if classifiers: + return ", ".join(classifiers) + for phrase, family in ( + ("Redistribution and use in source and binary forms", "BSD-style"), + ("Permission is hereby granted, free of charge", "MIT-style"), + ("Apache License", "Apache"), + ): + if phrase in text: + return f"{family} (full text in metadata)" + return "See the package's metadata" # --------------------------------------------------------------------------- diff --git a/tests/test_no_network.py b/tests/test_no_network.py index 82ecc4957..254a392a0 100644 --- a/tests/test_no_network.py +++ b/tests/test_no_network.py @@ -49,8 +49,8 @@ def guard(event, args): INPUT = """taxsimid,year,state,mstat,page,sage,depx,age1,pwages,swages,intrec,pensions,gssi,rentpaid,proptax,mortgage,idtl 1,2019,5,2,40,38,1,4,60000,25000,300,0,0,0,4000,9000,2 2,2023,33,1,30,0,0,0,52000,0,0,0,0,14000,0,0,2 -3,2024,21,2,67,66,0,0,0,0,1200,30000,36000,0,3000,0,2 -4,2025,0,1,45,0,1,12,38000,0,0,0,0,9000,0,0,0 +3,2023,21,2,67,66,0,0,0,0,1200,30000,36000,0,3000,0,2 +4,2024,0,1,45,0,1,12,38000,0,0,0,0,9000,0,0,0 """ diff --git a/tests/test_worked_example.py b/tests/test_worked_example.py index 23da87e0a..b724bfd73 100644 --- a/tests/test_worked_example.py +++ b/tests/test_worked_example.py @@ -4,43 +4,37 @@ repeats the Stata script's hand-off to the emulator (a .dta file through the policyengine subcommand) on the same TAXSIM input and checks it gives the same taxes. Stata itself is not available in CI. When Rscript is available, also -runs crosswalk.R and checks it agrees. +checks that crosswalk.R builds the same input and merges the same way. """ import os +import runpy import shutil import subprocess -import sys from pathlib import Path import pandas as pd import pytest +from click.testing import CliRunner + +from policyengine_taxsim.cli import cli REPO = Path(__file__).resolve().parents[1] EXAMPLE = REPO / "docs" / "examples" / "custom-dataset" TAXES = ["fiitax", "siitax", "fica", "v10"] -def _environment() -> dict: - """Puts this Python's policyengine-taxsim command first on the PATH, as - an activated environment would.""" - env = dict(os.environ) - env["PATH"] = str(Path(sys.executable).parent) + os.pathsep + env.get("PATH", "") - return env - - @pytest.fixture(scope="module") def python_run(tmp_path_factory): + """The example folder after `python crosswalk.py` has run in it.""" folder = tmp_path_factory.mktemp("example") / "custom-dataset" shutil.copytree(EXAMPLE, folder) - result = subprocess.run( - [sys.executable, "crosswalk.py"], - cwd=folder, - capture_output=True, - text=True, - env=_environment(), - ) - assert result.returncode == 0, result.stderr[-3000:] + start = Path.cwd() + os.chdir(folder) + try: + runpy.run_path("crosswalk.py", run_name="__main__") + finally: + os.chdir(start) return folder @@ -65,48 +59,81 @@ def test_stata_hand_off_gives_the_same_taxes(python_run): """crosswalk.do saves the TAXSIM input as .dta and runs `policyengine-taxsim policyengine taxsim_input.dta -o taxsim_results.dta`.""" taxsim = pd.read_csv(python_run / "taxsim_input.csv") - taxsim.to_stata(python_run / "taxsim_input.dta", write_index=False) - result = subprocess.run( - [ - sys.executable, - "-m", - "policyengine_taxsim.cli", - "policyengine", - "taxsim_input.dta", - "-o", - "taxsim_results.dta", - ], - cwd=python_run, - capture_output=True, - text=True, - env=_environment(), - ) - assert result.returncode == 0, result.stderr[-3000:] - from_stata = pd.read_stata(python_run / "taxsim_results.dta").set_index("taxsimid") + source = python_run / "taxsim_input.dta" + output = python_run / "taxsim_results.dta" + taxsim.to_stata(source, write_index=False) + result = CliRunner().invoke(cli, ["policyengine", str(source), "-o", str(output)]) + assert result.exit_code == 0, f"{result.output}\n{result.exception}" + from_stata = pd.read_stata(output) + from_stata["taxsimid"] = from_stata["taxsimid"].astype(int) + from_stata = from_stata.set_index("taxsimid")[TAXES].astype(float) from_python = pd.read_csv(python_run / "survey_with_taxes.csv").set_index("hh_id") - for household in from_python.index: - for column in TAXES: - assert ( - abs( - from_stata.loc[household, column] - - from_python.loc[household, column] - ) - < 0.01 - ) - - -@pytest.mark.skipif(shutil.which("Rscript") is None, reason="Rscript not installed") -def test_r_example_gives_the_same_taxes(python_run, tmp_path): + pd.testing.assert_frame_equal( + from_stata.loc[from_python.index].round(2), + from_python[TAXES], + check_names=False, + atol=0.01, + ) + + +STAND_IN = """#!/bin/sh +# Stand-in for policyengine-taxsim: records its arguments and writes the +# results the Python run computed to the path after -o. +echo "$@" > "$STAND_IN_LOG" +cp "$STAND_IN_RESULTS" "$4" +""" + + +@pytest.mark.skipif( + shutil.which("Rscript") is None or os.name == "nt", + reason="needs Rscript and a POSIX shell", +) +def test_r_example_recodes_and_merges_like_python(python_run, tmp_path): + """crosswalk.R builds the same TAXSIM input as crosswalk.py, calls the + documented command, and merges the results the same way. + + The emulator is replaced by a stand-in that returns the taxes the Python + run computed, so this checks the R code in about a second; the real + command on this input is exercised by the Stata hand-off test above. The + whole R script was run against the real emulator when the guide was + written.""" folder = tmp_path / "custom-dataset" shutil.copytree(EXAMPLE, folder) + from_python = pd.read_csv(python_run / "survey_with_taxes.csv") + canned = tmp_path / "canned_results.csv" + from_python.rename(columns={"hh_id": "taxsimid"})[["taxsimid", *TAXES]].to_csv( + canned, index=False + ) + bin_folder = tmp_path / "bin" + bin_folder.mkdir() + stand_in = bin_folder / "policyengine-taxsim" + stand_in.write_text(STAND_IN) + stand_in.chmod(0o755) + log = tmp_path / "stand_in.log" + environment = dict(os.environ) + environment["PATH"] = str(bin_folder) + os.pathsep + environment.get("PATH", "") + environment["STAND_IN_LOG"] = str(log) + environment["STAND_IN_RESULTS"] = str(canned) result = subprocess.run( ["Rscript", "crosswalk.R"], cwd=folder, capture_output=True, text=True, - env=_environment(), + env=environment, ) assert result.returncode == 0, result.stderr[-3000:] + assert log.read_text().split() == [ + "policyengine", + "taxsim_input.csv", + "-o", + "taxsim_results.csv", + ] + pd.testing.assert_frame_equal( + pd.read_csv(folder / "taxsim_input.csv"), + pd.read_csv(python_run / "taxsim_input.csv"), + check_dtype=False, + ) from_r = pd.read_csv(folder / "survey_with_taxes.csv").set_index("hh_id") - from_python = pd.read_csv(python_run / "survey_with_taxes.csv").set_index("hh_id") - pd.testing.assert_frame_equal(from_r[TAXES], from_python[TAXES], atol=0.01) + pd.testing.assert_frame_equal( + from_r[TAXES], from_python.set_index("hh_id")[TAXES], atol=0.01 + ) From 49a22dad0b25eec49cdbf90d52550d88a2a9d133 Mon Sep 17 00:00:00 2001 From: Max Ghenis Date: Fri, 9 Oct 2026 20:36:10 -0400 Subject: [PATCH 3/9] Add a conservation property test for amount columns Co-Authored-By: Claude Opus 5.5 --- docs/design.md | 2 +- tests/test_input_guide_claims.py | 55 +++++++++++++++++++++++++++++++- 2 files changed, 55 insertions(+), 2 deletions(-) diff --git a/docs/design.md b/docs/design.md index cc5d09bfb..3b35da4a4 100644 --- a/docs/design.md +++ b/docs/design.md @@ -251,5 +251,5 @@ Calculations: - `tests/` runs on every pull request on Linux, macOS and Windows with Python 3.10 and 3.11 (`.github/workflows/ci.yml`). - `tests/test_public_contract.py` and `tests/test_cli_entry_point.py` pin the public surfaces: the `policyengine-taxsim` command, the `policyengine_taxsim.runners` import path, and `PolicyEngineRunner(df).run()`. -- `tests/test_docs_reference.py` regenerates every generated block in these documents and fails if one is out of date. `tests/test_input_guide_claims.py` checks the input guide's lists of rejected and unchecked values. `tests/test_worked_example.py` runs the worked example. `tests/test_no_network.py` runs the emulator with every network connection refused. +- `tests/test_docs_reference.py` regenerates every generated block in these documents and fails if one is out of date. `tests/test_input_guide_claims.py` checks the input guide's lists of rejected and unchecked values, and checks with random records that every amount column reaches PolicyEngine exactly once, however it is split between spouses. `tests/test_worked_example.py` runs the worked example. `tests/test_no_network.py` runs the emulator with every network connection refused. - Many tests check the emulator against output from the bundled TAXSIM-35 executable; the [comparison dashboard](https://policyengine.org/us/taxsim) runs the full comparison for each year from 2021. diff --git a/tests/test_input_guide_claims.py b/tests/test_input_guide_claims.py index c27e09ae9..d0a47592e 100644 --- a/tests/test_input_guide_claims.py +++ b/tests/test_input_guide_claims.py @@ -7,7 +7,8 @@ message and that the emulator still behaves that way. The rejections all happen before any simulation; the unchecked cases are read off the PolicyEngine inputs the emulator builds, and one simulation covers the cases -that only show in the output. +that only show in the output. A property-based test checks that amount +columns are conserved on their way into PolicyEngine. """ import importlib.util @@ -17,6 +18,8 @@ import numpy as np import pandas as pd import pytest +from hypothesis import given, settings +from hypothesis import strategies as st from policyengine_taxsim.runners import PolicyEngineRunner, StitchedRunner @@ -194,3 +197,53 @@ def test_output_level_claims(): duplicates = results[results["taxsimid"] == 2] assert len(duplicates) == 2 assert duplicates["fiitax"].nunique() == 2 + + +# Columns that go to the spouse, so they count only on joint returns. +SPOUSE_COLUMNS = {"swages", "ssemp", "sbusinc", "sprofinc", "sui"} +# Read on pre-2021 rows only: PolicyEngine rows ignore it (the guide says so, +# and #1245 proposes mapping it). An intended exception to conservation. +UNMAPPED_COLUMNS = {"nonprop"} +AMOUNT_COLUMNS = sorted( + name + for name, entry in generator.load_input_metadata().items() + if entry["type"] == "Dollars per year" +) + + +@settings(max_examples=75, deadline=None) +@given( + column=st.sampled_from(AMOUNT_COLUMNS), + amount=st.integers(min_value=-5_000_000, max_value=5_000_000).filter(bool), + mstat=st.sampled_from([1, 2, 6]), + page=st.integers(min_value=18, max_value=95), + sage=st.integers(min_value=18, max_value=95), + state=st.integers(min_value=1, max_value=51), + depx=st.integers(min_value=0, max_value=3), +) +def test_every_dollar_reaches_policyengine_exactly_once( + column, amount, mstat, page, sage, state, depx +): + """Conservation: whatever the filing status, ages and state, an amount + column adds exactly its value to the PolicyEngine inputs, summed over + people and variables. Splitting between spouses and the pension age rule + move money between people but never create or lose it. Spouse columns add + nothing off joint returns, and nonprop adds nothing at all.""" + record = { + "year": 2023, + "state": state, + "mstat": mstat, + "page": page, + "sage": sage, + "depx": depx, + } + with_amount = generator.read_inputs({**record, column: amount}) + without = generator.read_inputs({**record, column: 0}) + added = sum( + float(delta.sum()) + for delta in generator.changed_inputs(with_amount, without).values() + ) + counts = column not in UNMAPPED_COLUMNS and ( + column not in SPOUSE_COLUMNS or mstat == 2 + ) + assert added == (amount if counts else 0) From af36659f6c9cf31b509186775c44aecaaca053c7 Mon Sep 17 00:00:00 2001 From: Max Ghenis Date: Fri, 9 Oct 2026 20:45:04 -0400 Subject: [PATCH 4/9] Read files as UTF-8 and allow loopback sockets in the network guard Co-Authored-By: Claude Opus 5.5 --- docs/security-and-deployment.md | 2 +- scripts/generate_docs_reference.py | 29 +++++++++++++--------- tests/test_docs_reference.py | 10 +++++--- tests/test_input_guide_claims.py | 2 +- tests/test_no_network.py | 39 +++++++++++++++++++++--------- tests/test_worked_example.py | 2 +- 6 files changed, 54 insertions(+), 30 deletions(-) diff --git a/docs/security-and-deployment.md b/docs/security-and-deployment.md index 43c85056c..d08f10c85 100644 --- a/docs/security-and-deployment.md +++ b/docs/security-and-deployment.md @@ -69,7 +69,7 @@ On 2026-10-09, with policyengine-taxsim at this commit, policyengine-us 2.38.0 ( 4. **Inspecting the executables'** imported libraries and symbols (below). 5. **Installing offline.** The [offline installation](#installing-without-internet-access) was carried out on macOS with Python 3.11 inside the same no-network sandbox, using uv's equivalents of the pip commands (`uv pip install --no-index --find-links ... --require-hashes`), and the check command printed the expected result. Every package in the Python 3.11 snapshot was confirmed to have a wheel with a listed hash for Linux x86-64 (manylinux 2.28) and for macOS on Apple silicon. -`tests/test_no_network.py` repeats step 2 in CI on Linux, macOS and Windows with Python 3.10 and 3.11: it runs the command line with an audit hook that raises on any connection, DNS lookup or HTTP request, so a change that adds one fails the build. To check an installation yourself, run the same command with your firewall blocking the Python process; the [worked example](input-guide.md#worked-example-from-a-survey-file-to-taxes) is a suitable input. +`tests/test_no_network.py` repeats step 2 in CI on Linux, macOS and Windows with Python 3.10 and 3.11: it runs the command line with an audit hook that refuses any connection leaving the machine, DNS lookup or HTTP request made through Python, so a change that adds one fails the build. The hook does not see inside the TAXSIM-35 executable, which is why step 4 inspects its imports. To check an installation yourself, run the same command with your firewall blocking the Python process; the [worked example](input-guide.md#worked-example-from-a-survey-file-to-taxes) is a suitable input. ## Files and processes diff --git a/scripts/generate_docs_reference.py b/scripts/generate_docs_reference.py index 07edfb0b5..d3c6427fb 100644 --- a/scripts/generate_docs_reference.py +++ b/scripts/generate_docs_reference.py @@ -186,7 +186,10 @@ def read_taxsim_file(record: dict) -> dict: try: written = pd.read_csv(path) finally: - path.unlink() + try: + path.unlink() + except OSError: # as TaxsimRunner.run: Windows may still hold it + pass return written.iloc[0].to_dict() @@ -196,7 +199,7 @@ def read_taxsim_file(record: dict) -> dict: def load_input_metadata() -> dict: - with open(INPUT_METADATA) as stream: + with open(INPUT_METADATA, encoding="utf-8") as stream: return yaml.safe_load(stream) @@ -637,7 +640,7 @@ def block_example(name: str): def render() -> str: path = EXAMPLES / name fence = language[path.suffix] - return f"```{fence}\n{path.read_text().rstrip()}\n```\n" + return f"```{fence}\n{path.read_text(encoding='utf-8').rstrip()}\n```\n" return render @@ -896,10 +899,10 @@ def _pyproject() -> dict: def block_python_versions() -> str: project = _pyproject()["project"] - with open(REPO / ".github" / "workflows" / "ci.yml") as stream: + with open(REPO / ".github" / "workflows" / "ci.yml", encoding="utf-8") as stream: ci = yaml.safe_load(stream) matrix = ci["jobs"]["test"]["strategy"]["matrix"] - snapshot = json.loads(SNAPSHOT.read_text()) + snapshot = json.loads(SNAPSHOT.read_text(encoding="utf-8")) lines = [ f"- `pyproject.toml` requires Python `{project['requires-python']}`.", "- CI runs the test suite on " @@ -941,7 +944,7 @@ def parse_requirements(path: Path) -> dict: """name -> (version, [required by]) from a `uv pip compile` file.""" packages = {} current = None - for line in path.read_text().splitlines(): + for line in path.read_text(encoding="utf-8").splitlines(): match = re.match(r"^([A-Za-z0-9][A-Za-z0-9._-]*)==(\S+)", line) if match: current = match.group(1).lower() @@ -954,7 +957,7 @@ def parse_requirements(path: Path) -> dict: def block_dependency_tree() -> str: - snapshot = json.loads(SNAPSHOT.read_text()) + snapshot = json.loads(SNAPSHOT.read_text(encoding="utf-8")) resolved = { python: parse_requirements(DEPENDENCIES / f"requirements-py{python}.txt") for python in SNAPSHOT_PYTHONS @@ -1014,7 +1017,7 @@ def block_dependency_tree() -> str: def block_snapshot_command() -> str: - snapshot = json.loads(SNAPSHOT.read_text()) + snapshot = json.loads(SNAPSHOT.read_text(encoding="utf-8")) return ( "```bash\n" f"python scripts/generate_docs_reference.py --refresh-dependencies " @@ -1096,7 +1099,9 @@ def compile_set(python, platform, output, hashes): indent=1, sort_keys=True, ) - + "\n" + + "\n", + encoding="utf-8", + newline="\n", ) @@ -1206,7 +1211,7 @@ def stale_documents() -> list: stale = [] for document in GENERATED: path = DOCS / document - text = path.read_text() + text = path.read_text(encoding="utf-8") if render(document, text) != text: stale.append(document) return stale @@ -1233,10 +1238,10 @@ def main(argv=None) -> int: return 1 if stale else 0 for document in GENERATED: path = DOCS / document - text = path.read_text() + text = path.read_text(encoding="utf-8") rendered = render(document, text) if rendered != text: - path.write_text(rendered) + path.write_text(rendered, encoding="utf-8", newline="\n") print(f"Updated docs/{document}") return 0 diff --git a/tests/test_docs_reference.py b/tests/test_docs_reference.py index 5d023f698..8d4e50f6b 100644 --- a/tests/test_docs_reference.py +++ b/tests/test_docs_reference.py @@ -36,7 +36,7 @@ @pytest.mark.parametrize("document", sorted(generator.GENERATED)) def test_generated_blocks_are_current(document): - text = (REPO / "docs" / document).read_text() + text = (REPO / "docs" / document).read_text(encoding="utf-8") assert generator.render(document, text) == text, ( f"docs/{document} no longer matches the code. {REGENERATE}" ) @@ -60,7 +60,9 @@ def test_input_metadata_entries_are_complete(): def test_web_runner_knows_the_documented_columns(): """The web runner warns about columns outside api.KNOWN_COLUMNS. api.py imports modal at import time, so the set is read from its source.""" - tree = ast.parse((REPO / "policyengine_taxsim" / "api.py").read_text()) + tree = ast.parse( + (REPO / "policyengine_taxsim" / "api.py").read_text(encoding="utf-8") + ) known = next( ast.literal_eval(node.value) for node in tree.body @@ -78,7 +80,7 @@ def test_web_runner_knows_the_documented_columns(): def test_every_run_time_pin_is_in_the_design_doc(): """docs/design.md's "Adjustments at run time" table names every variable PolicyEngineRunner holds fixed on the Microsimulation.""" - design = (REPO / "docs" / "design.md").read_text() + design = (REPO / "docs" / "design.md").read_text(encoding="utf-8") section = design.split("## Adjustments at run time")[1].split("\n## ")[0] named = set(re.findall(r"`(\w+)`", section)) missing = [name for name in generator.run_time_pins() if name not in named] @@ -109,7 +111,7 @@ def test_dependency_snapshot_satisfies_pyproject(python): def test_snapshot_files_are_the_resolutions_snapshot_json_records(): snapshot = json.loads( - (REPO / "docs" / "dependencies" / "snapshot.json").read_text() + (REPO / "docs" / "dependencies" / "snapshot.json").read_text(encoding="utf-8") ) for python in generator.SNAPSHOT_PYTHONS: resolved = generator.parse_requirements( diff --git a/tests/test_input_guide_claims.py b/tests/test_input_guide_claims.py index d0a47592e..9a76e8b08 100644 --- a/tests/test_input_guide_claims.py +++ b/tests/test_input_guide_claims.py @@ -24,7 +24,7 @@ from policyengine_taxsim.runners import PolicyEngineRunner, StitchedRunner REPO = Path(__file__).resolve().parents[1] -GUIDE = (REPO / "docs" / "input-guide.md").read_text() +GUIDE = (REPO / "docs" / "input-guide.md").read_text(encoding="utf-8") _spec = importlib.util.spec_from_file_location( "generate_docs_reference", REPO / "scripts" / "generate_docs_reference.py" diff --git a/tests/test_no_network.py b/tests/test_no_network.py index 254a392a0..2fabe4bf4 100644 --- a/tests/test_no_network.py +++ b/tests/test_no_network.py @@ -2,14 +2,19 @@ docs/security-and-deployment.md says a local run sends nothing anywhere. This runs the command line in a fresh Python process with an audit hook installed -before anything is imported. The hook records and refuses every outbound -connection, DNS lookup and HTTP request, so the run fails if one is attempted, -and the test fails even if the caller swallowed the refusal. The input mixes -years computed by the bundled TAXSIM-35 executable and by PolicyEngine, -including a record with no state tax. - -urllib3 binds a socket to the loopback address on import to test for IPv6; -that sends nothing and is allowed. +before anything is imported. The hook records and refuses every connection +that would leave the machine, every DNS lookup and every HTTP request, so the +run fails if one is attempted, and the test fails even if the caller swallowed +the refusal. The input mixes years computed by the bundled TAXSIM-35 +executable and by PolicyEngine, including a record with no state tax. + +Sockets that stay on the machine are allowed: connections to the loopback +address, and urllib3's bind to it on import to test for IPv6. + +The hook sees Python's own network calls. It does not see inside the +TAXSIM-35 executable, a separate process whose imports contain no networking +functions (docs/security-and-deployment.md), or inside compiled extensions +that open sockets without Python's socket module. """ import os @@ -29,11 +34,23 @@ "smtplib.connect", "imaplib.open", "poplib.connect", "nntplib.connect", "telnetlib.Telnet.open", "webbrowser.open", } +LOOPBACK = {"127.0.0.1", "::1", "localhost"} log_path = sys.argv[1] +def stays_on_this_machine(event, args): + # A socket connected to the loopback address or to a Unix-domain path + # (as asyncio's self-pipe is on Windows) never leaves the machine. + if event != "socket.connect": + return False + address = args[1] + return isinstance(address, (str, bytes)) or ( + isinstance(address, tuple) and address and address[0] in LOOPBACK + ) + + def guard(event, args): - if event in BLOCKED: + if event in BLOCKED and not stays_on_this_machine(event, args): with open(log_path, "a") as log: log.write(f"{event} {args!r}\n") raise RuntimeError(f"network access during a run: {event}") @@ -71,8 +88,8 @@ def test_command_line_run_opens_no_connection(tmp_path): text=True, env=environment, ) - assert attempts.read_text() == "", ( - f"network access attempted:\n{attempts.read_text()}" + assert attempts.read_text(encoding="utf-8") == "", ( + f"network access attempted:\n{attempts.read_text(encoding='utf-8')}" ) assert result.returncode == 0, result.stderr[-3000:] results = pd.read_csv(output) diff --git a/tests/test_worked_example.py b/tests/test_worked_example.py index b724bfd73..e8e57e502 100644 --- a/tests/test_worked_example.py +++ b/tests/test_worked_example.py @@ -122,7 +122,7 @@ def test_r_example_recodes_and_merges_like_python(python_run, tmp_path): env=environment, ) assert result.returncode == 0, result.stderr[-3000:] - assert log.read_text().split() == [ + assert log.read_text(encoding="utf-8").split() == [ "policyengine", "taxsim_input.csv", "-o", From b0ce19d7fd186e0bc93cf610dfd058f6c34bdbcc Mon Sep 17 00:00:00 2001 From: Max Ghenis Date: Fri, 9 Oct 2026 20:47:43 -0400 Subject: [PATCH 5/9] Give the offline recipe the platform tags it needs Co-Authored-By: Claude Opus 5.5 --- docs/security-and-deployment.md | 12 ++++++++---- 1 file changed, 8 insertions(+), 4 deletions(-) diff --git a/docs/security-and-deployment.md b/docs/security-and-deployment.md index d08f10c85..551a9e6b5 100644 --- a/docs/security-and-deployment.md +++ b/docs/security-and-deployment.md @@ -67,7 +67,7 @@ On 2026-10-09, with policyengine-taxsim at this commit, policyengine-us 2.38.0 ( 2. **Recording every network call.** A Python audit hook logged socket, DNS and HTTP events during a command-line run of records from 2019 (computed by TAXSIM-35) and 2023 to 2025 (PolicyEngine), with empty download caches. It recorded no connection, DNS lookup or HTTP request; the only socket event was urllib3's loopback test. 3. **Blocking the network.** The same run under macOS's `sandbox-exec` with all inbound and outbound network access denied completed and produced the same output. 4. **Inspecting the executables'** imported libraries and symbols (below). -5. **Installing offline.** The [offline installation](#installing-without-internet-access) was carried out on macOS with Python 3.11 inside the same no-network sandbox, using uv's equivalents of the pip commands (`uv pip install --no-index --find-links ... --require-hashes`), and the check command printed the expected result. Every package in the Python 3.11 snapshot was confirmed to have a wheel with a listed hash for Linux x86-64 (manylinux 2.28) and for macOS on Apple silicon. +5. **Installing offline.** The install step of the [offline installation](#installing-without-internet-access) was carried out on macOS with Python 3.11 inside the same no-network sandbox, using uv's equivalents of the pip commands (`uv pip install --no-index --find-links ... --require-hashes`), and the check command printed the expected result. The `pip download` commands themselves were not run. Their `--platform` flags were checked by computing the tags pip accepts with the `packaging` library: in each of the five snapshots, every package has a file with a listed hash that those flags accept. `tests/test_no_network.py` repeats step 2 in CI on Linux, macOS and Windows with Python 3.10 and 3.11: it runs the command line with an audit hook that refuses any connection leaving the machine, DNS lookup or HTTP request made through Python, so a change that adds one fails the build. The hook does not see inside the TAXSIM-35 executable, which is why step 4 inspects its imports. To check an installation yourself, run the same command with your firewall blocking the Python process; the [worked example](input-guide.md#worked-example-from-a-survey-file-to-taxes) is a suitable input. @@ -284,17 +284,21 @@ The resolution is reproducible: re-running the command with the same timestamp g ## Installing without internet access -On a machine with internet access, download every file the installation needs. This example targets a Linux x86-64 server with Python 3.11; change `--platform` and `--python-version` for other targets (`win_amd64` for 64-bit Windows): +On a machine with internet access, download every file the installation needs. This example targets a Linux x86-64 server with Python 3.11, the platform the snapshot is resolved for: ```bash pip download --dest wheels --only-binary=:all: \ - --platform manylinux_2_28_x86_64 --python-version 3.11 \ + --platform manylinux_2_28_x86_64 --platform manylinux2014_x86_64 \ + --python-version 3.11 \ --require-hashes -r docs/dependencies/requirements-py3.11.txt pip download --dest wheels --only-binary=:all: --no-deps \ - --platform manylinux_2_28_x86_64 --python-version 3.11 \ + --platform manylinux_2_28_x86_64 --platform manylinux2014_x86_64 \ + --python-version 3.11 \ policyengine-taxsim==3.1.1 ``` +Both `--platform` flags are needed: pip matches each one exactly, and the packages' Linux files carry one tag or the other. For another Python version, change `--python-version` and the requirements file. On Windows and macOS a few packages differ (see the list under the dependency table), so first resolve the snapshot for that platform: run the `uv pip compile` command at the top of the requirements file with a different `--python-platform`, then download with that platform's tag (`win_amd64` for 64-bit Windows). If the connected machine has the same operating system and Python version as the target, leave out `--platform` and `--python-version`. + Copy `wheels/` and the requirements file to the target machine, then install from them with no network access: ```bash From 48ecd63e0a7575f72d9d3b627553cffafdb2c98c Mon Sep 17 00:00:00 2001 From: Max Ghenis Date: Fri, 9 Oct 2026 21:05:43 -0400 Subject: [PATCH 6/9] Drop the uv.lock note; #1420 removes the file Co-Authored-By: Claude Opus 5.5 --- docs/design.md | 2 +- docs/security-and-deployment.md | 2 -- 2 files changed, 1 insertion(+), 3 deletions(-) diff --git a/docs/design.md b/docs/design.md index 3b35da4a4..b6964cf70 100644 --- a/docs/design.md +++ b/docs/design.md @@ -216,7 +216,7 @@ A new policyengine-us release can change results for any year, including past ye print(package, version(package)) ``` In R, `policyengine_versions()` prints the same. For pre-2021 records, the progress message names the TAXSIM-35 build. [#1412](https://github.com/PolicyEngine/policyengine-taxsim/pull/1412) proposes a `--version` flag and a provenance file written with each run. -3. **Keep a copy of the packages.** PyPI does not keep every release. On 2026-10-09 the oldest policyengine-us release still on PyPI was 1.691.1, uploaded 2026-05-12, and the oldest policyengine-taxsim release was 2.10.0, uploaded 2026-02-26. Earlier releases can no longer be installed by version number, and policyengine-us has no git tags for most releases either. Download the exact files you run (`pip download`) and keep them with your results; the [security notes](security-and-deployment.md#installing-without-internet-access) show how. +3. **Keep a copy of the packages.** PyPI's index does not keep every release. On 2026-10-09 the oldest policyengine-us release listed there was 1.691.1, uploaded 2026-05-12, and the oldest policyengine-taxsim release was 2.10.0, uploaded 2026-02-26. Earlier releases can no longer be installed by version number, and policyengine-us has no git tags for most releases either. Download the exact files you run (`pip download`) and keep them with your results; the [security notes](security-and-deployment.md#installing-without-internet-access) show how. **TAXSIM-35 build.** The executables ship inside the policyengine-taxsim package, so pinning policyengine-taxsim pins them too. diff --git a/docs/security-and-deployment.md b/docs/security-and-deployment.md index 551a9e6b5..5e92753df 100644 --- a/docs/security-and-deployment.md +++ b/docs/security-and-deployment.md @@ -266,8 +266,6 @@ Packages that differ from Linux on other platforms: Most of these come from policyengine-core and policyengine-us rather than from the emulator. Some exist for tasks a tax calculation never performs: pytest and IPython (developer tools), plotly, matplotlib and pyvis (charts), huggingface-hub (dataset downloads), census, openpyxl and us (spm-calculator's survey tools). They are installed because their parent packages declare them, not because a run uses them. -The repository's `uv.lock` is not used by CI and is out of date (it pins policyengine-us 1.550.2, below the minimum in `pyproject.toml` and no longer on PyPI). Use the snapshot here instead. - ### The snapshot The snapshot fixes one reviewed set of versions. Each `docs/dependencies/requirements-py3.X.txt` lists every package with its version and SHA-256 hashes, and `snapshot.json` records the platform differences and licenses. To regenerate it for a later date: From 2d3be9ab01cddcccea0beff2374721c6a39184ae Mon Sep 17 00:00:00 2001 From: Max Ghenis Date: Fri, 9 Oct 2026 21:23:08 -0400 Subject: [PATCH 7/9] Address independent review: scope claims to what was verified - Temporary files: deletion is attempted, not guaranteed; test leftovers. - Pre-2021 records: state checks do not apply, state -1 returns a wrong answer, idtl 5 does not work, marginal rates are 0. - Maryland: the bundled TAXSIM build includes county tax. - tfica includes employee state payroll taxes on PolicyEngine rows. - Linux TAXSIM build needs glibc 2.34 (generated from the binary). - Examples: do not round identifiers; Stata stores IDs as double and checks inputs before running. - Say what the network test covers and what it cannot see. Co-Authored-By: Claude Opus 5.5 --- docs/design.md | 15 ++-- docs/examples/custom-dataset/crosswalk.R | 7 +- docs/examples/custom-dataset/crosswalk.do | 45 +++++++----- docs/examples/custom-dataset/crosswalk.py | 11 +-- docs/input-guide.md | 86 ++++++++++++++--------- docs/reference/input_variables.yaml | 6 +- docs/security-and-deployment.md | 34 ++++++--- scripts/generate_docs_reference.py | 39 +++++++++- tests/test_input_guide_claims.py | 34 +++++++++ tests/test_no_network.py | 18 +++++ 10 files changed, 219 insertions(+), 76 deletions(-) diff --git a/docs/design.md b/docs/design.md index b6964cf70..b31f739c6 100644 --- a/docs/design.md +++ b/docs/design.md @@ -106,7 +106,7 @@ After building the `Microsimulation`, `PolicyEngineRunner._build_configured_sim` | `rental_income_would_be_qualified` | Any `otherprop` | TAXSIM-35 gives no QBI deduction on `otherprop`; PolicyEngine would otherwise treat rental income as qualified | | `mn_renters_credit_qualifying_crp` | Minnesota renters | Assumes the Certificate of Rent Paid that Minnesota's renter's credit requires and TAXSIM-35 inputs can't record | | `ssi`, `snap`, `tanf`, `wic`, and the state SSI supplements `ca_state_supplement`, `co_state_supplement`, `ma_state_supplement`, `nm_ssi_state_supplement`, `sc_ssi_state_supplement` and `tx_ssi_state_supplement` | Always | Benefits PolicyEngine would otherwise compute; TAXSIM-35 has none, and some count as income in state credits | -| `md_local_income_tax_before_refundable_credits` | Maryland | TAXSIM-35's Maryland `siitax` excludes county income tax | +| `md_local_income_tax_before_refundable_credits` | Maryland | Makes Maryland `siitax` state-only, with no county income tax. TAXSIM-35 builds differ on this: see Known differences | | `utilities_included_in_rent` | Maine renters | Maine's property tax fairness credit excludes utilities from rent; TAXSIM-35's `rentpaid` is gross rent | | `ny_additional_ctc`, `ny_inflation_refund_credit`, `ny_supplemental_eitc` | New York | Payments made outside Form IT-201, which TAXSIM-35's `siitax` excludes | @@ -197,6 +197,12 @@ Every output (generated from `variable_mappings.yaml`): The executables are NBER's `taxsimtest` builds of TAXSIM-35. `resources/taxsimtest/README.md` describes how they are updated and checked; the [security notes](security-and-deployment.md#bundled-taxsim-35-executables) list their hashes and platforms. +Limits of this path, each checked against the bundled macOS build on 2026-10-09: + +- **No state check.** `PolicyEngineRunner` validates `state`; `TaxsimRunner` passes it through. An unknown code stops the run. `state` -1 makes TAXSIM-35 return a row for every state, and `StitchedRunner` keeps only the first, so the record comes back as Alabama. +- **`idtl` 5 does not work.** TAXSIM-35 answers `idtl` 5 with a text report. The fallback parser (`_parse_verbose_taxsim_output`) reads only the standard columns from it and returns one record however many were sent, so `StitchedRunner` returns the standard columns for one record and fails with an index error for two or more. Use `idtl` 2. +- **Marginal rates are 0.** The build returns `frate` and `srate` of 0. + ## Versions and pinning Three things determine a result: the policyengine-taxsim version (input and output mapping), the policyengine-us version (tax rules), and, for years before 2021, the bundled TAXSIM-35 build. @@ -238,18 +244,19 @@ Calculations: - **Additional Medicare Tax.** `fiitax` excludes it and `tfica`, `fica` and `addmed` include it, following TAXSIM's author on [#416](https://github.com/PolicyEngine/policyengine-taxsim/issues/416) and [#1225](https://github.com/PolicyEngine/policyengine-taxsim/issues/1225). The bundled TAXSIM-35 build (cd2026081819) still adds it to `fiitax` for 2013 to 2023, so pre-2021 rows owing it carry it in `fiitax`. See the README. - **State income tax as a federal deduction.** By default PolicyEngine deducts the state income tax it computes, as the law allows. The `PolicyEngineRunner.run` docstring records that the bundled TAXSIM-35 build deducted mortgage interest and property tax but not state income tax in the states and years checked; `--disable-salt` removes the state income tax deduction to match. - **One-time state rebates.** PolicyEngine counts them in the tax year they are based on. TAXSIM-35 by default counts them in the year they are paid; its option 30 (`--taxsim-opt30` in `compare`) uses PolicyEngine's convention. `srebate` reports the amount either way. -- **Maryland.** `siitax` excludes county income tax, as TAXSIM-35's does. +- **Maryland.** The emulator's `siitax` excludes county income tax. TAXSIM-35 builds differ: the comments in `_build_configured_sim` record builds that return state-only tax, but the bundled August 2026 builds add a flat 3.2% county tax. For a single filer with $100,000 of wages in 2024, the bundled macOS build returns `siitax` 7,428.45 against a tax before credits (`staxbc`) of 4,417.25. `tests/test_md_local_tax_parity.py` pins the state-only values and marks the affected builds. - **New York.** `siitax` excludes the payments made outside Form IT-201. - **Itemized deductions.** `mortgage` and `otheritem` are treated alike; in some states and years TAXSIM-35 leaves `otheritem` out of the state itemized deduction. See the README. - **Active business income (`pbusinc`, `sbusinc`).** The emulator treats it like `psemp`: subject to self-employment tax and eligible for the QBI deduction, as NBER's input documentation describes. The bundled TAXSIM-35 build (cd2026081819) applies no self-employment tax to it. For a single filer with $100,000 of `pbusinc` in 2023, the emulator reports `fiitax` 9,226.50 and `fica` 14,129.55; the build reports 10,469.90 and 0 (checked 2026-10-09). `tests/test_passthrough_qbid.py` pins the emulator's treatment, which its docstring traces to a June 2026 comparison by TAXSIM's author. - **S corporation income and the net investment income tax.** Passive by default with policyengine-us 2.10.1 or later; see `--scorp-treatment` in the README. - **Married filing separately.** `tests/test_married_filing_separately.py` documents the separate-return cases where the bundled TAXSIM-35 build and the emulator differ and the emulator deliberately does not copy TAXSIM-35. -- **Marginal rates.** A $100 wage change instead of one cent; see above. +- **Marginal rates.** PolicyEngine rows use a $100 wage change instead of one cent; see above. The bundled TAXSIM-35 build returns `frate` and `srate` of 0 on the records checked, so pre-2021 rows carry no usable marginal rates. +- **Payroll taxes.** On PolicyEngine rows `tfica` includes employee state payroll taxes and contributions (policyengine-us's `employee_state_payroll_tax`, which covers 14 states in policyengine-us 2.38); `fica` does not, and the bundled TAXSIM-35 build's `tfica` had none on the California record checked. In New York in 2023, $52,000 of wages gives `tfica` 4,009.20, which is half of `fica` (3,978.00) plus 31.20. - **Outputs not produced.** Outputs marked "Not produced" in the table above are absent on PolicyEngine rows, and `v42` and `v43` are always 0. ## Testing - `tests/` runs on every pull request on Linux, macOS and Windows with Python 3.10 and 3.11 (`.github/workflows/ci.yml`). - `tests/test_public_contract.py` and `tests/test_cli_entry_point.py` pin the public surfaces: the `policyengine-taxsim` command, the `policyengine_taxsim.runners` import path, and `PolicyEngineRunner(df).run()`. -- `tests/test_docs_reference.py` regenerates every generated block in these documents and fails if one is out of date. `tests/test_input_guide_claims.py` checks the input guide's lists of rejected and unchecked values, and checks with random records that every amount column reaches PolicyEngine exactly once, however it is split between spouses. `tests/test_worked_example.py` runs the worked example. `tests/test_no_network.py` runs the emulator with every network connection refused. +- `tests/test_docs_reference.py` regenerates every generated block in these documents and fails if one is out of date. That catches a change in what the generator observes; text the generator adds itself, such as the $100 step in the marginal-rate rows, is tied to the code only by a marker check. `tests/test_input_guide_claims.py` checks the input guide's lists of rejected and unchecked values, and checks with random records that every amount column reaches PolicyEngine exactly once, however it is split between spouses. `tests/test_worked_example.py` runs the worked example. `tests/test_no_network.py` runs the `policyengine` subcommand on four records with an audit hook that refuses connections leaving the machine; the security notes say what that does and does not cover. - Many tests check the emulator against output from the bundled TAXSIM-35 executable; the [comparison dashboard](https://policyengine.org/us/taxsim) runs the full comparison for each year from 2021. diff --git a/docs/examples/custom-dataset/crosswalk.R b/docs/examples/custom-dataset/crosswalk.R index 94b92ab94..af0befd49 100644 --- a/docs/examples/custom-dataset/crosswalk.R +++ b/docs/examples/custom-dataset/crosswalk.R @@ -62,8 +62,11 @@ status <- system2( stopifnot(status == 0) results <- read.csv("taxsim_results.csv") -# 6. Merge back on taxsimid and round amounts to cents. -taxes <- round(results[c("taxsimid", "fiitax", "siitax", "fica", "v10")], 2) +# 6. Merge back on taxsimid and round amounts to cents. Leave taxsimid alone: +# it is an identifier. +tax_columns <- c("fiitax", "siitax", "fica", "v10") +taxes <- results[c("taxsimid", tax_columns)] +taxes[tax_columns] <- round(taxes[tax_columns], 2) merged <- merge(survey, taxes, by.x = "hh_id", by.y = "taxsimid", all.x = TRUE) write.csv(merged, "survey_with_taxes.csv", row.names = FALSE) print(merged[c("hh_id", "tax_year", "fiitax", "siitax", "fica", "v10")]) diff --git a/docs/examples/custom-dataset/crosswalk.do b/docs/examples/custom-dataset/crosswalk.do index 84f8e5318..e757933c0 100644 --- a/docs/examples/custom-dataset/crosswalk.do +++ b/docs/examples/custom-dataset/crosswalk.do @@ -14,8 +14,9 @@ foreach v of varlist wages_head wages_spouse self_emp_head interest dividends // * 2. Map each survey concept to a TAXSIM variable. This survey codes married * as 1; everyone else files as unmarried. (dividends already has its -* TAXSIM name.) -generate taxsimid = hh_id +* TAXSIM name.) Store identifiers and amounts as double: Stata's default +* float type cannot hold every whole number above 16,777,216. +generate double taxsimid = hh_id generate year = tax_year generate statefip = state_fips generate mstat = cond(marital_status == 1, 2, 1) @@ -23,18 +24,18 @@ generate page = age_head generate sage = cond(mstat == 2, age_spouse, 0) replace sage = 0 if missing(sage) generate depx = cond(missing(num_children), 0, num_children) -generate pwages = wages_head -generate swages = cond(mstat == 2, wages_spouse, 0) -generate psemp = self_emp_head -generate intrec = interest -generate pensions = pension -generate gssi = social_security -generate pui = unemployment -generate rentpaid = rent_paid -generate proptax = property_tax +generate double pwages = wages_head +generate double swages = cond(mstat == 2, wages_spouse, 0) +generate double psemp = self_emp_head +generate double intrec = interest +generate double pensions = pension +generate double gssi = social_security +generate double pui = unemployment +generate double rentpaid = rent_paid +generate double proptax = property_tax * Mortgage interest and charity are both non-AMT-preference itemized deductions. -generate mortgage = mortgage_interest + charity -generate childcare = childcare_cost +generate double mortgage = mortgage_interest + charity +generate double childcare = childcare_cost generate idtl = 2 * 3. Dependent ages: 0 reads as "not given" (age 10), so code infants as 1. @@ -44,17 +45,25 @@ forvalues i = 1/3 { replace age`i' = 0 if missing(age`i') } -* 4. Write the TAXSIM input and run the emulator on it. The policyengine +* 4. Check before running: the emulator does not reject most bad values. +local taxsimvars taxsimid year statefip mstat page sage depx age1 age2 age3 /// + pwages swages psemp intrec dividends pensions gssi pui rentpaid proptax /// + mortgage childcare idtl +foreach v of local taxsimvars { + assert !missing(`v') +} +assert inlist(mstat, 1, 2, 6) +isid taxsimid + +* 5. Write the TAXSIM input and run the emulator on it. The policyengine * subcommand reads and writes Stata files directly. preserve -keep taxsimid year statefip mstat page sage depx age1 age2 age3 pwages /// - swages psemp intrec dividends pensions gssi pui rentpaid proptax /// - mortgage childcare idtl +keep `taxsimvars' save "taxsim_input.dta", replace ! policyengine-taxsim policyengine taxsim_input.dta -o taxsim_results.dta restore -* 5. Merge the results back on taxsimid and round amounts to cents. +* 6. Merge the results back on taxsimid and round amounts to cents. merge 1:1 taxsimid using "taxsim_results.dta", /// keepusing(fiitax siitax fica v10) nogenerate foreach v of varlist fiitax siitax fica v10 { diff --git a/docs/examples/custom-dataset/crosswalk.py b/docs/examples/custom-dataset/crosswalk.py index af04ce2e3..10424da01 100644 --- a/docs/examples/custom-dataset/crosswalk.py +++ b/docs/examples/custom-dataset/crosswalk.py @@ -12,12 +12,12 @@ # 1. Blank amounts mean "none". TAXSIM input has no missing values, so make # them zeros. -amounts = [ +survey_amounts = [ "wages_head", "wages_spouse", "self_emp_head", "interest", "dividends", "pension", "social_security", "unemployment", "rent_paid", "property_tax", "mortgage_interest", "charity", "childcare_cost", ] # fmt: skip -survey[amounts] = survey[amounts].fillna(0) +survey[survey_amounts] = survey[survey_amounts].fillna(0) # 2. Map each survey concept to a TAXSIM column. This survey codes married # as 1; everyone else files as unmarried (head of household with a child). @@ -67,9 +67,10 @@ results = StitchedRunner(taxsim).run() # 6. Merge back on taxsimid. Amounts are computed in 32-bit floating point, -# so round them to cents. -keep = ["taxsimid", "fiitax", "siitax", "fica", "v10"] -taxes = results[keep].astype(float).round(2) +# so round them to cents. Leave taxsimid alone: it is an identifier. +amounts = ["fiitax", "siitax", "fica", "v10"] +taxes = results[["taxsimid", *amounts]].copy() +taxes[amounts] = taxes[amounts].astype(float).round(2) merged = survey.merge(taxes, left_on="hh_id", right_on="taxsimid", how="left") merged.drop(columns="taxsimid").to_csv("survey_with_taxes.csv", index=False) print(merged[["hh_id", "tax_year", "fiitax", "siitax", "fica", "v10"]]) diff --git a/docs/input-guide.md b/docs/input-guide.md index b88c8d27f..0890e3ed7 100644 --- a/docs/input-guide.md +++ b/docs/input-guide.md @@ -2,7 +2,7 @@ This guide is for analysts who want to compute taxes for their own records, such as a survey extract, with policyengine-taxsim. It covers every input column the emulator reads, what it does with blanks and unexpected values, and a complete example that goes from a survey file to taxes merged back onto it, in Python, Stata and R. -The tables marked as generated are produced from the emulator's code by `scripts/generate_docs_reference.py`. `tests/test_docs_reference.py` fails whenever the code and these tables disagree, so they describe the code in this commit. +The tables marked as generated are produced by `scripts/generate_docs_reference.py`, which runs the emulator's input code on test records and reads its mapping files. `tests/test_docs_reference.py` regenerates them and fails when the committed tables differ, so they show what the code in this commit does for the cases the generator tries. Contents: @@ -72,9 +72,9 @@ What each column means. The descriptions come from [`docs/reference/input_variab | Column | Meaning | Type | Valid values | |---|---|---|---| -| `taxsimid` | Record identifier, returned unchanged in the output so you can merge results back onto your data. | Number | Any non-negative number. Give every record its own value; if the column is left out, records are numbered 1, 2, 3, ... in file order. | +| `taxsimid` | Record identifier, returned unchanged in the output so you can merge results back onto your data. | Number | Any non-negative number. Give every record its own value; if the column is left out, records are numbered 1, 2, 3, ... in file order. In Stata, store it as `double`. | | `year` | Tax year. Required. | Four-digit year | A whole number. 2021 and later are computed by PolicyEngine; earlier years by the bundled TAXSIM-35 executable, which covers 1960 onward (state must be 0 before 1977, per TAXSIM-35). | -| `state` | State of residence, as a TAXSIM SOI code. | Code | 1 (Alabama) to 51 (Wyoming), in alphabetical order with DC as 9; 0 for no state tax. -1 (TAXSIM's every-state option) is rejected. Use `state` or `statefip`, not both. | +| `state` | State of residence, as a TAXSIM SOI code. | Code | 1 (Alabama) to 51 (Wyoming), in alphabetical order with DC as 9; 0 for no state tax. Never -1 (TAXSIM's every-state option), which records from 2021 on reject and earlier records answer wrongly. Use `state` or `statefip`, not both. | | `statefip` | State of residence, as a FIPS code. An alternative to `state`. | Code | 1 (Alabama) to 56 (Wyoming), including 11 for DC; 0 or blank to use `state` instead. Codes that are not a state or DC (3, 7, 14, 43, 52) are rejected, as is a record with both `state` and `statefip` nonzero. | | `mstat` | Filing status. | Code | 1 unmarried (filed as head of household when a dependent qualifies), 2 married filing jointly, 6 married filing separately. TAXSIM-35 also defines 8 (dependent taxpayer); see "Values the emulator does not check". | | `page` | Age of the primary taxpayer on December 31 of the tax year. | Years | A whole number of years. | @@ -145,7 +145,7 @@ What each column means. The descriptions come from [`docs/reference/input_variab | Column | Meaning | Type | Valid values | |---|---|---|---| -| `idtl` | How much output to return for the record. | Code | 0 standard output, 2 full output, 5 full output plus a text report. Any other value returns no tax amounts for the record on PolicyEngine rows. | +| `idtl` | How much output to return for the record. | Code | 0 standard output, 2 full output, 5 a text report (stdin command, records from 2021 on). Use 2 for full output as a table. Any other value returns no tax amounts for the record on PolicyEngine rows. | | `opt1` | A TAXSIM-35 option number, passed to the TAXSIM-35 executable for pre-2021 rows (for example 30, its PSL-conformance mode). | Code | See https://taxsim.nber.org/taxsimtest/options.html. PolicyEngine rows ignore it. | | `opt1v` | The value for the option in `opt1`. | Number | See `opt1`. | @@ -238,7 +238,7 @@ Recode missing values yourself before running, so every 0 is a choice. The [work ## What the emulator rejects -These stop the whole run with an error naming the problem. Each one was checked against the code and is covered by a test. +These stop the whole run with an error naming the problem. Each one is covered by a test. The `state` checks apply to records from 2021 on; see below for earlier records. | Input | Error | |---|---| @@ -253,6 +253,11 @@ These stop the whole run with an error naming the problem. Each one was checked The R package is the exception for state codes: it converts two-letter abbreviations such as `"CA"` to SOI codes before calling the emulator. +Records before 2021 go to TAXSIM-35 without the `state` checks: + +- A code TAXSIM-35 does not know, such as 52, stops the run with an error from TAXSIM-35. +- **`state` -1 is not rejected and gives a wrong answer.** TAXSIM-35 returns one row for every state, and the emulator keeps only the first, so the record comes back with Alabama's tax and `state` 1. Never use -1. + ## Values the emulator does not check The emulator computes these without complaint. Check for them yourself. @@ -281,7 +286,7 @@ The emulator computes these without complaint. Check for them yourself. ## Reading the output -Choose the output with `idtl`: 0 for the standard columns, 2 for full detail, 5 for full detail plus a text report. Only the stdin command writes the text report; other interfaces return the same results as a table. The [design document](design.md#where-each-output-comes-from) lists every output column and how it is computed. The main ones: +Choose the output with `idtl`: 0 for the standard columns, 2 for full detail, 5 for a text report. Use 2 when you want a table. `idtl` 5 gives the text report only from the stdin command and only for records from 2021 on; other interfaces return those records as a table. For records before 2021, `idtl` 5 does not work: one such record returns only the standard columns, and two or more stop the run with `positional indexers are out-of-bounds`. The [design document](design.md#where-each-output-comes-from) lists every output column and how it is computed. The main ones: | Column | Meaning | |---|---| @@ -289,8 +294,8 @@ Choose the output with `idtl`: 0 for the standard columns, 2 for full detail, 5 | `fiitax` | Federal income tax, after credits; refundable credits make it negative | | `siitax` | State income tax, after credits | | `fica` | Social Security and Medicare taxes, employee and employer shares | -| `tfica` | The taxpayer's share of `fica` | -| `frate`, `srate` | Federal and state marginal rates on wages, in percent | +| `tfica` | The taxpayer's own payroll taxes: the employee share of Social Security and Medicare, and self-employment tax. On PolicyEngine rows it also includes employee state payroll taxes and contributions, which TAXSIM-35 leaves out | +| `frate`, `srate` | Federal and state marginal rates on wages, in percent. The bundled TAXSIM-35 build returns 0 for both, so ignore them on records before 2021 | | `v10` | Federal adjusted gross income (with `idtl` 2 or 5) | Things to know when you use the results: @@ -346,12 +351,12 @@ survey = pd.read_csv("survey_extract.csv") # 1. Blank amounts mean "none". TAXSIM input has no missing values, so make # them zeros. -amounts = [ +survey_amounts = [ "wages_head", "wages_spouse", "self_emp_head", "interest", "dividends", "pension", "social_security", "unemployment", "rent_paid", "property_tax", "mortgage_interest", "charity", "childcare_cost", ] # fmt: skip -survey[amounts] = survey[amounts].fillna(0) +survey[survey_amounts] = survey[survey_amounts].fillna(0) # 2. Map each survey concept to a TAXSIM column. This survey codes married # as 1; everyone else files as unmarried (head of household with a child). @@ -401,9 +406,10 @@ taxsim.to_csv("taxsim_input.csv", index=False) results = StitchedRunner(taxsim).run() # 6. Merge back on taxsimid. Amounts are computed in 32-bit floating point, -# so round them to cents. -keep = ["taxsimid", "fiitax", "siitax", "fica", "v10"] -taxes = results[keep].astype(float).round(2) +# so round them to cents. Leave taxsimid alone: it is an identifier. +amounts = ["fiitax", "siitax", "fica", "v10"] +taxes = results[["taxsimid", *amounts]].copy() +taxes[amounts] = taxes[amounts].astype(float).round(2) merged = survey.merge(taxes, left_on="hh_id", right_on="taxsimid", how="left") merged.drop(columns="taxsimid").to_csv("survey_with_taxes.csv", index=False) print(merged[["hh_id", "tax_year", "fiitax", "siitax", "fica", "v10"]]) @@ -412,7 +418,7 @@ print(merged[["hh_id", "tax_year", "fiitax", "siitax", "fica", "v10"]]) ### Stata -Writes the TAXSIM input as a Stata file and calls the `policyengine` subcommand, which reads and writes `.dta` directly, so no CSV parsing is involved. Stata's shell must be able to find `policyengine-taxsim`. If it can't, give the full path, for example `! /home/me/taxsim-env/bin/policyengine-taxsim` on Linux or macOS, or `! C:\taxsim-env\Scripts\policyengine-taxsim.exe` on Windows. +Writes the TAXSIM input as a Stata file and calls the `policyengine` subcommand, which reads and writes `.dta` directly, so no CSV parsing is involved. It stores the record ID and the amounts as `double`: Stata's default `float` type cannot hold every whole number above 16,777,216, so long survey IDs would collide. Stata's shell must be able to find `policyengine-taxsim`. If it can't, give the full path, for example `! /home/me/taxsim-env/bin/policyengine-taxsim` on Linux or macOS, or `! C:\taxsim-env\Scripts\policyengine-taxsim.exe` on Windows. ```stata @@ -432,8 +438,9 @@ foreach v of varlist wages_head wages_spouse self_emp_head interest dividends // * 2. Map each survey concept to a TAXSIM variable. This survey codes married * as 1; everyone else files as unmarried. (dividends already has its -* TAXSIM name.) -generate taxsimid = hh_id +* TAXSIM name.) Store identifiers and amounts as double: Stata's default +* float type cannot hold every whole number above 16,777,216. +generate double taxsimid = hh_id generate year = tax_year generate statefip = state_fips generate mstat = cond(marital_status == 1, 2, 1) @@ -441,18 +448,18 @@ generate page = age_head generate sage = cond(mstat == 2, age_spouse, 0) replace sage = 0 if missing(sage) generate depx = cond(missing(num_children), 0, num_children) -generate pwages = wages_head -generate swages = cond(mstat == 2, wages_spouse, 0) -generate psemp = self_emp_head -generate intrec = interest -generate pensions = pension -generate gssi = social_security -generate pui = unemployment -generate rentpaid = rent_paid -generate proptax = property_tax +generate double pwages = wages_head +generate double swages = cond(mstat == 2, wages_spouse, 0) +generate double psemp = self_emp_head +generate double intrec = interest +generate double pensions = pension +generate double gssi = social_security +generate double pui = unemployment +generate double rentpaid = rent_paid +generate double proptax = property_tax * Mortgage interest and charity are both non-AMT-preference itemized deductions. -generate mortgage = mortgage_interest + charity -generate childcare = childcare_cost +generate double mortgage = mortgage_interest + charity +generate double childcare = childcare_cost generate idtl = 2 * 3. Dependent ages: 0 reads as "not given" (age 10), so code infants as 1. @@ -462,17 +469,25 @@ forvalues i = 1/3 { replace age`i' = 0 if missing(age`i') } -* 4. Write the TAXSIM input and run the emulator on it. The policyengine +* 4. Check before running: the emulator does not reject most bad values. +local taxsimvars taxsimid year statefip mstat page sage depx age1 age2 age3 /// + pwages swages psemp intrec dividends pensions gssi pui rentpaid proptax /// + mortgage childcare idtl +foreach v of local taxsimvars { + assert !missing(`v') +} +assert inlist(mstat, 1, 2, 6) +isid taxsimid + +* 5. Write the TAXSIM input and run the emulator on it. The policyengine * subcommand reads and writes Stata files directly. preserve -keep taxsimid year statefip mstat page sage depx age1 age2 age3 pwages /// - swages psemp intrec dividends pensions gssi pui rentpaid proptax /// - mortgage childcare idtl +keep `taxsimvars' save "taxsim_input.dta", replace ! policyengine-taxsim policyengine taxsim_input.dta -o taxsim_results.dta restore -* 5. Merge the results back on taxsimid and round amounts to cents. +* 6. Merge the results back on taxsimid and round amounts to cents. merge 1:1 taxsimid using "taxsim_results.dta", /// keepusing(fiitax siitax fica v10) nogenerate foreach v of varlist fiitax siitax fica v10 { @@ -555,8 +570,11 @@ status <- system2( stopifnot(status == 0) results <- read.csv("taxsim_results.csv") -# 6. Merge back on taxsimid and round amounts to cents. -taxes <- round(results[c("taxsimid", "fiitax", "siitax", "fica", "v10")], 2) +# 6. Merge back on taxsimid and round amounts to cents. Leave taxsimid alone: +# it is an identifier. +tax_columns <- c("fiitax", "siitax", "fica", "v10") +taxes <- results[c("taxsimid", tax_columns)] +taxes[tax_columns] <- round(taxes[tax_columns], 2) merged <- merge(survey, taxes, by.x = "hh_id", by.y = "taxsimid", all.x = TRUE) write.csv(merged, "survey_with_taxes.csv", row.names = FALSE) print(merged[c("hh_id", "tax_year", "fiitax", "siitax", "fica", "v10")]) diff --git a/docs/reference/input_variables.yaml b/docs/reference/input_variables.yaml index 53be0c95f..5119551ca 100644 --- a/docs/reference/input_variables.yaml +++ b/docs/reference/input_variables.yaml @@ -22,7 +22,7 @@ taxsimid: group: Record and filing unit meaning: Record identifier, returned unchanged in the output so you can merge results back onto your data. type: Number - valid: Any non-negative number. Give every record its own value; if the column is left out, records are numbered 1, 2, 3, ... in file order. + valid: Any non-negative number. Give every record its own value; if the column is left out, records are numbered 1, 2, 3, ... in file order. In Stata, store it as `double`. year: group: Record and filing unit meaning: Tax year. Required. @@ -32,7 +32,7 @@ state: group: Record and filing unit meaning: State of residence, as a TAXSIM SOI code. type: Code - valid: 1 (Alabama) to 51 (Wyoming), in alphabetical order with DC as 9; 0 for no state tax. -1 (TAXSIM's every-state option) is rejected. Use `state` or `statefip`, not both. + valid: 1 (Alabama) to 51 (Wyoming), in alphabetical order with DC as 9; 0 for no state tax. Never -1 (TAXSIM's every-state option), which records from 2021 on reject and earlier records answer wrongly. Use `state` or `statefip`, not both. statefip: group: Record and filing unit meaning: State of residence, as a FIPS code. An alternative to `state`. @@ -226,7 +226,7 @@ idtl: group: Output and options meaning: How much output to return for the record. type: Code - valid: 0 standard output, 2 full output, 5 full output plus a text report. Any other value returns no tax amounts for the record on PolicyEngine rows. + valid: 0 standard output, 2 full output, 5 a text report (stdin command, records from 2021 on). Use 2 for full output as a table. Any other value returns no tax amounts for the record on PolicyEngine rows. opt1: group: Output and options meaning: A TAXSIM-35 option number, passed to the TAXSIM-35 executable for pre-2021 rows (for example 30, its PSL-conformance mode). diff --git a/docs/security-and-deployment.md b/docs/security-and-deployment.md index 5e92753df..e0857411a 100644 --- a/docs/security-and-deployment.md +++ b/docs/security-and-deployment.md @@ -17,10 +17,11 @@ Contents: ## Summary -- **A local run makes no network connections.** Installed with pip and run from the command line, Python or R, the emulator computes everything on the machine. Nothing is sent to PolicyEngine or anyone else. A test in CI fails if a run tries to open a connection. +- **A local run makes no network connections.** Installed with pip and run from the command line, Python or R, the emulator computes everything on the machine. Nothing is sent to PolicyEngine or anyone else. A test in CI runs the command line and fails if Python tries to open a connection. - **The hosted web runner is different.** The upload page at policyengine.org/us/taxsim/run sends your CSV to PolicyEngine's server. Do not use it for confidential data. - **Installing needs the network** (PyPI, or your internal mirror), unless you install from downloaded files as described below. -- **It runs a bundled third-party executable** for tax years before 2021: NBER's TAXSIM-35, unsigned, x86-64 only. +- **It runs a bundled third-party executable** for tax years before 2021: NBER's TAXSIM-35, unsigned, x86-64 only. On Linux it needs glibc 2.34 or newer, so it does not run on Red Hat Enterprise Linux 8. +- **It writes your input records to temporary files** while it runs. It tries to delete them, but that is not guaranteed. - **It installs dozens of Python packages**, including networking and developer libraries that a run never calls. The [full list](#dependencies) has versions and licenses. Two of them, policyengine-us and policyengine-core, are licensed under the GNU Affero General Public License v3; policyengine-taxsim itself is MIT-licensed. - **It needs Python 3.10 or later**; use 3.11 or later to get current tax rules. @@ -69,7 +70,13 @@ On 2026-10-09, with policyengine-taxsim at this commit, policyengine-us 2.38.0 ( 4. **Inspecting the executables'** imported libraries and symbols (below). 5. **Installing offline.** The install step of the [offline installation](#installing-without-internet-access) was carried out on macOS with Python 3.11 inside the same no-network sandbox, using uv's equivalents of the pip commands (`uv pip install --no-index --find-links ... --require-hashes`), and the check command printed the expected result. The `pip download` commands themselves were not run. Their `--platform` flags were checked by computing the tags pip accepts with the `packaging` library: in each of the five snapshots, every package has a file with a listed hash that those flags accept. -`tests/test_no_network.py` repeats step 2 in CI on Linux, macOS and Windows with Python 3.10 and 3.11: it runs the command line with an audit hook that refuses any connection leaving the machine, DNS lookup or HTTP request made through Python, so a change that adds one fails the build. The hook does not see inside the TAXSIM-35 executable, which is why step 4 inspects its imports. To check an installation yourself, run the same command with your firewall blocking the Python process; the [worked example](input-guide.md#worked-example-from-a-survey-file-to-taxes) is a suitable input. +`tests/test_no_network.py` repeats step 2 in CI on Linux, macOS and Windows with Python 3.10 and 3.11. It runs the `policyengine` subcommand on four records (one from 2019, one with no state, `idtl` 0 and 2) with an audit hook that refuses any connection leaving the machine, DNS lookup or HTTP request made through Python. A change that adds one on that path fails the build. What it does not cover: + +- Other paths: the stdin command, `compare`, `--logs`, `idtl` 5, the R package, and states and inputs outside those four records. Steps 1 to 3 above covered the stdin command. +- Connections to the loopback address, which stay on the machine and are allowed. +- Anything Python's audit hooks cannot see: the TAXSIM-35 executable, a separate process (step 4 inspects its imports instead), and compiled extensions that open sockets without Python's `socket` module. + +To check an installation yourself, run your own input with your firewall blocking the Python process, as in step 3; the [worked example](input-guide.md#worked-example-from-a-survey-file-to-taxes) is a suitable input. ## Files and processes @@ -77,12 +84,19 @@ What a run writes: | What | Where | When | Removed | |---|---|---|---| -| Your input records, as PolicyEngine variables, in an HDF5 file | Python's temporary directory (`TMPDIR` on macOS and Linux, `TEMP` on Windows) | Each chunk of up to 10,000 records from 2021 on | When the chunk finishes | -| Records before 2021 as CSV, and TAXSIM-35's output | The same temporary directory | Each batch of records before 2021 | When TAXSIM-35 finishes | +| Your input records, as PolicyEngine variables, in an HDF5 file | Python's temporary directory (`TMPDIR` on macOS and Linux, `TEMP` on Windows) | Each chunk of up to 10,000 records from 2021 on | Deletion is attempted when the chunk finishes | +| Records before 2021 as CSV, and TAXSIM-35's output | The same temporary directory | Each batch of records before 2021 | Deletion is attempted when TAXSIM-35 finishes | | Results | The output file you name, or stdout | Every run | No | | PolicyEngine test files (YAML) holding each record's inputs | The working directory | Only with `--logs` | No | -The temporary files are deleted in `finally` blocks, so errors do not leave them behind, but a process killed outright (for example by `kill -9` or a power loss) can. If your input is confidential, point `TMPDIR` or `TEMP` at an approved location before running. +Treat the temporary directory as holding your data. The emulator tries to delete its temporary files when each chunk or batch ends, including after an error, but deletion is not guaranteed: + +- A failed deletion is ignored without a message (`TaxsimMicrosimDataset.cleanup`, `TaxsimRunner.run`). +- If writing the TAXSIM-35 input file fails partway, for example on a full disk, the partial file is left behind. +- A process killed outright, for example by `kill -9` or a power loss, leaves whatever it had written. +- On Windows the emulator tries to delete the HDF5 file while it still holds it open, which Windows normally refuses. This has not been checked on a Windows machine. + +`tests/test_no_network.py` gives its run a private temporary directory and checks that nothing is left in it after a normal run. On Linux and macOS a leftover file fails the test; on Windows it is reported as an expected failure until the behavior there is confirmed. If your input is confidential, point `TMPDIR` or `TEMP` at an approved location before running, and clear it afterward. Processes started: @@ -104,12 +118,16 @@ The package includes NBER's TAXSIM-35 executables, installed to `share/policyeng | `resources/taxsimtest/taxsimtest-linux.exe` | Linux ELF, x86-64 | cd2026081819 | 2,129,624 | `00a321d2467ba011992f8b83c6e485a9b710c48fca4262a23fec1de26942a89b` | Yes, on Linux | | `resources/taxsimtest/taxsimtest-osx.exe` | macOS Mach-O, x86-64 | cd2026081819 | 2,070,264 | `4a17af9c2adbea27b1e6cce240610aede264e008bcdf64b131e0c81220f62b8c` | Yes, on macOS | | `resources/taxsimtest/taxsimtest-windows.exe` | Windows PE, x86-64 | cd2026081318 | 3,035,784 | `a8207e7cf207ee9ce066eedc51cc5dd531c956de0a8b567fca1933ca0fa0e9c3` | Yes, on Windows | + +- `resources/taxsim35/taxsim35-unix.exe` needs no shared libraries (statically linked). +- `resources/taxsimtest/taxsimtest-linux.exe` needs glibc 2.34 or newer, and `libc.so.6`, `libgcc_s.so.1`, `libgfortran.so.5`, `libm.so.6`, `libquadmath.so.0`. - **Source.** NBER distributes these as compiled programs; their source is not in this repository. `resources/taxsimtest/README.md` records where each is downloaded from and how a new build is checked before it is committed. - **Signatures.** None is code-signed: the macOS build is unsigned (`codesign` reports "not signed at all") and the Windows build has no Authenticode certificate. Check the hashes above instead (`shasum -a 256 ` on macOS and Linux, `Get-FileHash ` in PowerShell). -- **Platforms.** All three are x86-64. On Apple silicon Macs the macOS build runs under Rosetta 2, which must be installed. The Linux build needs the GNU Fortran runtime (`libgfortran.so.5` and `libquadmath.so.0`: the `libgfortran5` and `libquadmath0` packages on Debian and Ubuntu, `libgfortran` and `libquadmath` on Red Hat systems); without it, records before 2021 fail with "error while loading shared libraries". There is no build for ARM Linux. -- **Libraries.** The macOS build links only the system library (`libSystem`). The Linux build links `libgfortran.so.5`, `libm.so.6`, `libgcc_s.so.1`, `libquadmath.so.0` and `libc.so.6`. The Windows build imports only from `KERNEL32.dll` and `msvcrt.dll`. None of the three imports a socket, DNS or HTTP function. +- **Platforms.** All three are x86-64. On Apple silicon Macs the macOS build runs under Rosetta 2, which must be installed. There is no build for ARM Linux. +- **Linux requirements.** The Linux build needs glibc 2.34 or newer and the GNU Fortran runtime, as listed under the table. glibc 2.34 rules out Red Hat Enterprise Linux 8 (glibc 2.28) and Ubuntu 20.04 (glibc 2.31); it is met by Red Hat Enterprise Linux 9 and Ubuntu 22.04. This is separate from the Python packages, which install on older systems. The Fortran runtime is the `libgfortran5` and `libquadmath0` packages on Debian and Ubuntu, `libgfortran` and `libquadmath` on Red Hat systems; without it, records before 2021 fail with "error while loading shared libraries". On a system that cannot meet these, compute only 2021 and later. +- **Libraries.** The macOS build links only the system library (`libSystem`). The Linux build links the libraries listed under the table. The Windows build imports only from `KERNEL32.dll` and `msvcrt.dll`. None of the three imports a socket, DNS or HTTP function. ## Python versions diff --git a/scripts/generate_docs_reference.py b/scripts/generate_docs_reference.py index d3c6427fb..b21230e89 100644 --- a/scripts/generate_docs_reference.py +++ b/scripts/generate_docs_reference.py @@ -866,21 +866,56 @@ def run_time_binaries() -> dict: return picked +def _elf_is_dynamic(data: bytes) -> bool: + """Whether a 64-bit little-endian ELF file has a PT_DYNAMIC segment.""" + offset = int.from_bytes(data[0x20:0x28], "little") + size = int.from_bytes(data[0x36:0x38], "little") + count = int.from_bytes(data[0x38:0x3A], "little") + return any( + int.from_bytes(data[offset + i * size : offset + i * size + 4], "little") == 2 + for i in range(count) + ) + + +def _elf_requirements(data: bytes) -> str: + """Shared libraries and minimum glibc a Linux executable names, read from + the strings in its dynamic section.""" + if not _elf_is_dynamic(data): + return "no shared libraries (statically linked)" + tokens = {token.decode("ascii", "ignore") for token in data.split(b"\0")} + libraries = sorted( + token for token in tokens if re.fullmatch(r"lib[\w+-]+\.so(\.\d+)*", token) + ) + versions = sorted( + tuple(int(part) for part in token.split("_")[1].split(".")) + for token in tokens + if re.fullmatch(r"GLIBC_\d+(\.\d+)+", token) + ) + glibc = ".".join(str(part) for part in versions[-1]) + return f"glibc {glibc} or newer, and " + ", ".join( + f"`{name}`" for name in libraries + ) + + def block_taxsim_binaries() -> str: picked = run_time_binaries() lines = [ "| File | Format | Build stamp | Bytes | SHA-256 | Run by the emulator |", "|---|---|---|---|---|---|", ] + needs = [] for path in sorted((REPO / "resources").glob("*/*.exe")): data = path.read_bytes() used = picked.get(path.name) + name = path.relative_to(REPO).as_posix() lines.append( - f"| `{path.relative_to(REPO).as_posix()}` | {_binary_kind(data)} | " + f"| `{name}` | {_binary_kind(data)} | " f"{_build_stamp(data)} | {len(data):,} | `{hashlib.sha256(data).hexdigest()}` | " f"{'Yes, on ' + {'Darwin': 'macOS'}.get(used, used) if used else 'No (tests only)'} |" ) - return "\n".join(lines) + "\n" + if data[:4] == b"\x7fELF": + needs.append(f"- `{name}` needs {_elf_requirements(data)}.") + return "\n".join(lines + ["", *needs]) + "\n" # --------------------------------------------------------------------------- diff --git a/tests/test_input_guide_claims.py b/tests/test_input_guide_claims.py index 9a76e8b08..f87dadd0d 100644 --- a/tests/test_input_guide_claims.py +++ b/tests/test_input_guide_claims.py @@ -102,6 +102,40 @@ def test_emulator_rejects_the_input(case): assert message in str(error.value) +PRE_2021 = "taxsimid,year,state,mstat,page,pwages,idtl\n" + + +def test_records_before_2021_skip_the_state_checks(): + """The guide warns that pre-2021 records reach TAXSIM-35 unchecked: an + unknown state stops the run there, and state -1 comes back as a single + record for the first state. A fix that rejects -1 for these records should + fail here, as a prompt to update the guide.""" + assert "**`state` -1 is not rejected and gives a wrong answer.**" in GUIDE + with pytest.raises(Exception): + StitchedRunner(_frame(PRE_2021 + "1,2019,52,1,40,50000,0\n")).run( + show_progress=False + ) + results = StitchedRunner(_frame(PRE_2021 + "7,2019,-1,1,40,50000,0\n")).run( + show_progress=False + ) + assert len(results) == 1 + assert results["state"].iloc[0] == 1 + + +def test_idtl_5_does_not_work_before_2021(): + """One pre-2021 idtl 5 record returns only the standard columns; two stop + the run. The guide says to use idtl 2.""" + assert "For records before 2021, `idtl` 5 does not work" in GUIDE + one = StitchedRunner(_frame(PRE_2021 + "1,2019,5,1,40,50000,5\n")).run( + show_progress=False + ) + assert len(one) == 1 and "v10" not in one.columns + with pytest.raises(IndexError): + StitchedRunner( + _frame(PRE_2021 + "1,2019,5,1,40,50000,5\n2,2019,33,1,40,80000,5\n") + ).run(show_progress=False) + + def _inputs(**record) -> dict: """The PolicyEngine inputs the emulator builds for one 2023 California record.""" diff --git a/tests/test_no_network.py b/tests/test_no_network.py index 2fabe4bf4..2c5eb5207 100644 --- a/tests/test_no_network.py +++ b/tests/test_no_network.py @@ -11,6 +11,9 @@ Sockets that stay on the machine are allowed: connections to the loopback address, and urllib3's bind to it on import to test for IPv6. +The run also gets a private temporary directory, and the test checks that no +file is left in it afterward (reported as an expected failure on Windows). + The hook sees Python's own network calls. It does not see inside the TAXSIM-35 executable, a separate process whose imports contain no networking functions (docs/security-and-deployment.md), or inside compiled extensions @@ -22,6 +25,7 @@ import sys import pandas as pd +import pytest GUARDED_RUN = r""" import sys @@ -81,6 +85,11 @@ def test_command_line_run_opens_no_connection(tmp_path): # Empty download caches, so nothing can be satisfied from an earlier run. environment["HF_HOME"] = str(tmp_path / "hf") environment["XDG_CACHE_HOME"] = str(tmp_path / "cache") + # A private temporary directory, to see what the run leaves behind. + scratch = tmp_path / "tmp" + scratch.mkdir() + for name in ("TMPDIR", "TEMP", "TMP"): + environment[name] = str(scratch) result = subprocess.run( [sys.executable, "-c", GUARDED_RUN, str(attempts), str(source), str(output)], cwd=tmp_path, @@ -95,3 +104,12 @@ def test_command_line_run_opens_no_connection(tmp_path): results = pd.read_csv(output) assert results["taxsimid"].tolist() == [1, 2, 3, 4] assert results["fiitax"].notna().all() + + # The run's temporary files hold the input records. After a normal run + # none should remain. Windows cannot delete a file that is still open, and + # the emulator's cleanup ignores that failure, so a leftover there is + # reported as an expected failure rather than hidden. + leftovers = sorted(path.name for path in scratch.rglob("*") if path.is_file()) + if leftovers and os.name == "nt": + pytest.xfail(f"temporary files left behind on Windows: {leftovers}") + assert not leftovers, f"temporary files left behind: {leftovers}" From 4e37bfc096d68e6923cd9bf1ef162d648f064e43 Mon Sep 17 00:00:00 2001 From: Max Ghenis Date: Fri, 9 Oct 2026 21:16:13 -0400 Subject: [PATCH 8/9] Document and test the pbusinc self-employment tax difference The emulator applies self-employment tax to pbusinc and sbusinc, as NBER's input documentation describes. The bundled taxsimtest build (cd2026081819) does not, and applies the net investment income tax instead. Taxsim #1254 asks TAXSIM's author which is intended. - tests/test_pbusinc_self_employment_tax.py pins both treatments, with expected values from the bundled binary, and adds property tests that pbusinc is interchangeable with psemp in both input paths. - docs/design.md and the pbusinc entry of the input reference say what each engine does and link the open question. Co-Authored-By: Claude Opus 5.5 --- .../pbusinc-self-employment-tax.changed.md | 1 + docs/design.md | 2 +- docs/input-guide.md | 2 +- docs/reference/input_variables.yaml | 2 +- tests/test_passthrough_qbid.py | 4 + tests/test_pbusinc_self_employment_tax.py | 349 ++++++++++++++++++ 6 files changed, 357 insertions(+), 3 deletions(-) create mode 100644 changelog.d/pbusinc-self-employment-tax.changed.md create mode 100644 tests/test_pbusinc_self_employment_tax.py diff --git a/changelog.d/pbusinc-self-employment-tax.changed.md b/changelog.d/pbusinc-self-employment-tax.changed.md new file mode 100644 index 000000000..63c276bc3 --- /dev/null +++ b/changelog.d/pbusinc-self-employment-tax.changed.md @@ -0,0 +1 @@ +Document and test the difference between the emulator and the bundled TAXSIM-35 build in how they tax `pbusinc` and `sbusinc`: the emulator applies self-employment tax, as NBER's input documentation describes, and the build does not (#1254). diff --git a/docs/design.md b/docs/design.md index b31f739c6..65506c731 100644 --- a/docs/design.md +++ b/docs/design.md @@ -247,7 +247,7 @@ Calculations: - **Maryland.** The emulator's `siitax` excludes county income tax. TAXSIM-35 builds differ: the comments in `_build_configured_sim` record builds that return state-only tax, but the bundled August 2026 builds add a flat 3.2% county tax. For a single filer with $100,000 of wages in 2024, the bundled macOS build returns `siitax` 7,428.45 against a tax before credits (`staxbc`) of 4,417.25. `tests/test_md_local_tax_parity.py` pins the state-only values and marks the affected builds. - **New York.** `siitax` excludes the payments made outside Form IT-201. - **Itemized deductions.** `mortgage` and `otheritem` are treated alike; in some states and years TAXSIM-35 leaves `otheritem` out of the state itemized deduction. See the README. -- **Active business income (`pbusinc`, `sbusinc`).** The emulator treats it like `psemp`: subject to self-employment tax and eligible for the QBI deduction, as NBER's input documentation describes. The bundled TAXSIM-35 build (cd2026081819) applies no self-employment tax to it. For a single filer with $100,000 of `pbusinc` in 2023, the emulator reports `fiitax` 9,226.50 and `fica` 14,129.55; the build reports 10,469.90 and 0 (checked 2026-10-09). `tests/test_passthrough_qbid.py` pins the emulator's treatment, which its docstring traces to a June 2026 comparison by TAXSIM's author. +- **Active business income (`pbusinc`, `sbusinc`).** The emulator treats it like `psemp`: subject to self-employment tax and the Additional Medicare Tax, and eligible for the QBI deduction. NBER's input documentation (retrieved 2026-10-09) describes it as "Subject to NIIT, SECA and Medicare additional Earnings Tax", and the TAXSIM-35 build bundled before the current one (cdate-20260521) applied self-employment tax to it. The bundled build (cd2026081819) applies no self-employment tax or Additional Medicare Tax to it and applies the net investment income tax instead, as it does for `scorp`. For a single California filer with $100,000 of `pbusinc` in 2023, the emulator reports `fiitax` 9,226.50 and `fica` 14,129.55; the build reports 10,469.90 and 0. [#1254](https://github.com/PolicyEngine/policyengine-taxsim/issues/1254) asks TAXSIM's author which is intended; he wants to settle the pass-through inputs together, and the emulator keeps the documented treatment until then. `tests/test_pbusinc_self_employment_tax.py` pins both treatments. - **S corporation income and the net investment income tax.** Passive by default with policyengine-us 2.10.1 or later; see `--scorp-treatment` in the README. - **Married filing separately.** `tests/test_married_filing_separately.py` documents the separate-return cases where the bundled TAXSIM-35 build and the emulator differ and the emulator deliberately does not copy TAXSIM-35. - **Marginal rates.** PolicyEngine rows use a $100 wage change instead of one cent; see above. The bundled TAXSIM-35 build returns `frate` and `srate` of 0 on the records checked, so pre-2021 rows carry no usable marginal rates. diff --git a/docs/input-guide.md b/docs/input-guide.md index 0890e3ed7..b35c44376 100644 --- a/docs/input-guide.md +++ b/docs/input-guide.md @@ -104,7 +104,7 @@ What each column means. The descriptions come from [`docs/reference/input_variab | Column | Meaning | Type | Valid values | |---|---|---|---| -| `pbusinc` | Primary taxpayer's active business income eligible for the qualified business income deduction without the specified-service phase-out. The emulator also applies self-employment tax to it; the bundled TAXSIM-35 build does not (see the design document's known differences). | Dollars per year | Any amount. | +| `pbusinc` | Primary taxpayer's active business income eligible for the qualified business income deduction without the specified-service phase-out. The emulator applies self-employment tax to it, as NBER's page describes; the bundled TAXSIM-35 build applies the net investment income tax instead (see the design document's known differences). Neither applies self-employment tax to `scorp`. | Dollars per year | Any amount. | | `sbusinc` | Spouse's active business income; see `pbusinc`. Read only on joint returns. | Dollars per year | Any amount. | | `pprofinc` | Primary taxpayer's income from a specified service trade or business (SSTB), eligible for the qualified business income deduction subject to its phase-out. | Dollars per year | Any amount. | | `sprofinc` | Spouse's SSTB income; see `pprofinc`. Read only on joint returns. | Dollars per year | Any amount. | diff --git a/docs/reference/input_variables.yaml b/docs/reference/input_variables.yaml index 5119551ca..fdb30e525 100644 --- a/docs/reference/input_variables.yaml +++ b/docs/reference/input_variables.yaml @@ -119,7 +119,7 @@ ssemp: valid: Any amount. pbusinc: group: Business income (QBI) - meaning: Primary taxpayer's active business income eligible for the qualified business income deduction without the specified-service phase-out. The emulator also applies self-employment tax to it; the bundled TAXSIM-35 build does not (see the design document's known differences). + meaning: Primary taxpayer's active business income eligible for the qualified business income deduction without the specified-service phase-out. The emulator applies self-employment tax to it, as NBER's page describes; the bundled TAXSIM-35 build applies the net investment income tax instead (see the design document's known differences). Neither applies self-employment tax to `scorp`. type: Dollars per year valid: Any amount. sbusinc: diff --git a/tests/test_passthrough_qbid.py b/tests/test_passthrough_qbid.py index c3f878b75..f1819fb6c 100644 --- a/tests/test_passthrough_qbid.py +++ b/tests/test_passthrough_qbid.py @@ -33,6 +33,10 @@ Fixes taxsim #384 (FICA and QBI income), #943 (scorp QBID), #1004 (scorp QBID), #762 (QBID across pass-through inputs); addresses #1018 and #1003. + +The TAXSIM-35 figures below are from that June 2026 comparison. The bundled +taxsimtest build (cd2026081819) no longer applies SECA to pbusinc (taxsim +#1254); tests/test_pbusinc_self_employment_tax.py pins that difference. """ import numpy as np diff --git a/tests/test_pbusinc_self_employment_tax.py b/tests/test_pbusinc_self_employment_tax.py new file mode 100644 index 000000000..eaacc71b5 --- /dev/null +++ b/tests/test_pbusinc_self_employment_tax.py @@ -0,0 +1,349 @@ +""" +The emulator applies self-employment tax to active business income +(`pbusinc`, `sbusinc`), as NBER's input documentation describes. The +bundled taxsimtest builds do not. + +Basis for the emulator's treatment: +- NBER's taxsimtest input page (https://taxsim.nber.org/taxsimtest/, + "Date last modified: 28 February 2026", retrieved 2026-10-09), item 26, + under "The following are for the TCJA Business Tax Deduction": + "pbusinc and sbusinc Primary and secondary Taxpayer's active income + eligible for the QBI deduction without phaseout and assuming + sufficient wages paid or capital to be eligible for the full + deduction. Subject to NIIT, SECA and Medicare additional Earnings + Tax." +- The emulator adds `pbusinc` to `psemp` and `sbusinc` to `ssemp` in + PolicyEngine's `self_employment_income` (variable_mappings.yaml, + taxsim #1051), so it bears self-employment tax and the Additional + Medicare Tax. It bears no net investment income tax. The three taxes + NBER's sentence lists cannot all fall on the same income: 26 U.S.C. + 1411(c)(6), under "Net investment income", says "Net investment + income shall not include any item taken into account in determining + self-employment income for such taxable year on which a tax is + imposed by section 1401(b)." +- The macOS builds bundled earlier (cdate-2025Jul5, cdate-2025Aug23, + cdate-20260521) gave `pbusinc` the same 2023 row as `psemp` below. + +Bundled-binary difference: the bundled builds (cd2026081819 for macOS +and Linux) apply no self-employment tax and no Additional Medicare Tax +to `pbusinc` and `sbusinc`, and apply the net investment income tax +instead. On the records below the `pbusinc` row equals the `scorp` row. +taxsimtest cd2026081819, single, age 40, idtl=2: + + year state input amount fiitax fica v10 qbid niit addmed + 2023 CA psemp 100000 9226.50 14129.55 92935.23 15817.05 0.00 0.00 + 2023 CA pbusinc 100000 10469.90 0.00 100000.00 17230.00 0.00 0.00 + 2024 none psemp 300000 47044.47 29634.30 285529.58 54185.92 0.00 693.45 + 2024 none pbusinc 300000 54548.90 0.00 300000.00 57080.00 3800.00 0.00 + +Open question: taxsim #1254 asks TAXSIM's author whether taxsimtest +should skip SECA on `pbusinc`. He replied (2026-09-29) that with SECA on +it "there is no passthru that is free of SECA", and asked to settle "the +treatment of all relevant 7 variables" together. Until that is settled, +the emulator keeps the documented treatment. The `test_taxsimtest_*` +tests pin the binary's own behavior, so a refreshed build that changes +it gets noticed. +""" + +import importlib.util +from pathlib import Path + +import numpy as np +import pandas as pd +import pytest +from hypothesis import given, settings +from hypothesis import strategies as st + +from policyengine_taxsim import generate_household +from policyengine_taxsim.runners.policyengine_runner import PolicyEngineRunner +from policyengine_taxsim.runners.taxsim_runner import TaxsimRunner + +REPO = Path(__file__).resolve().parents[1] + +_spec = importlib.util.spec_from_file_location( + "generate_docs_reference", REPO / "scripts" / "generate_docs_reference.py" +) +generator = importlib.util.module_from_spec(_spec) +_spec.loader.exec_module(generator) + +# taxsimtest cd2026081819, idtl=2, single, age 40: +# (year, state, amount) -> {input: (fiitax, fica, v10, qbid, niit, addmed)}. +CA_2023 = (2023, 5, 100_000.0) +FEDERAL_2024 = (2024, 0, 300_000.0) +TAXSIMTEST = { + CA_2023: { + "psemp": (9226.50, 14129.55, 92935.23, 15817.05, 0.00, 0.00), + "pbusinc": (10469.90, 0.00, 100000.00, 17230.00, 0.00, 0.00), + }, + FEDERAL_2024: { + "psemp": (47044.47, 29634.30, 285529.58, 54185.92, 0.00, 693.45), + "pbusinc": (54548.90, 0.00, 300000.00, 57080.00, 3800.00, 0.00), + }, +} +OUTPUTS = ["fiitax", "fica", "v10", "qbid", "niit", "addmed"] +SOURCES = ["psemp", "pbusinc", "scorp"] + +REVISIT = ( + "The bundled taxsimtest build treats pbusinc differently from " + "cd2026081819. Check taxsim #1254 and NBER's input page, then revisit " + "the 'Active business income' bullet in docs/design.md, the pbusinc " + "entry in docs/reference/input_variables.yaml (and run " + "scripts/generate_docs_reference.py), and the notes in this module." +) + + +def _record(taxsimid, year, state, **amounts): + return { + "taxsimid": taxsimid, + "year": year, + "state": state, + "mstat": 1, + "page": 40, + "sage": 0, + "depx": 0, + "psemp": 0.0, + "ssemp": 0.0, + "pbusinc": 0.0, + "sbusinc": 0.0, + "scorp": 0.0, + "idtl": 2, + **amounts, + } + + +def _single_source_frame(): + """One record per case and source, numbered case by case.""" + return pd.DataFrame( + [ + _record(10 * case + position, year, state, **{source: amount}) + for case, (year, state, amount) in enumerate(TAXSIMTEST, start=1) + for position, source in enumerate(SOURCES) + ] + ) + + +def _row(results, case, source): + index = list(TAXSIMTEST).index(case) + 1 + return results.loc[10 * index + SOURCES.index(source)] + + +@pytest.fixture(scope="module") +def emulator(): + # taxsimtest has no wage limit on the QBI deduction, so the comparison + # assumes enough W-2 wages (taxsim #1404). + runner = PolicyEngineRunner(_single_source_frame(), assume_w2_wages=True) + return runner.run(show_progress=False).set_index("taxsimid") + + +@pytest.fixture(scope="module") +def taxsimtest(): + return ( + TaxsimRunner(_single_source_frame()) + .run(show_progress=False) + .set_index("taxsimid") + ) + + +@pytest.mark.parametrize("case", list(TAXSIMTEST)) +def test_emulator_taxes_pbusinc_as_taxsimtest_taxes_psemp(emulator, case): + """The documented treatment: `pbusinc` gets taxsimtest's `psemp` row, + with self-employment tax, its deduction from AGI, the QBI deduction + and, above the threshold, the Additional Medicare Tax.""" + row = _row(emulator, case, "pbusinc") + for name, expected in zip(OUTPUTS, TAXSIMTEST[case]["psemp"]): + assert row[name] == pytest.approx(expected, abs=1.0), (case, name) + + +@pytest.mark.parametrize("case", list(TAXSIMTEST)) +def test_emulator_gives_pbusinc_and_psemp_the_same_result(emulator, case): + pbusinc = _row(emulator, case, "pbusinc").drop("taxsimid", errors="ignore") + psemp = _row(emulator, case, "psemp").drop("taxsimid", errors="ignore") + pd.testing.assert_series_equal(pbusinc, psemp, check_names=False) + + +@pytest.mark.parametrize("case", list(TAXSIMTEST)) +def test_taxsimtest_applies_self_employment_tax_to_psemp(taxsimtest, case): + """The reference the emulator's `pbusinc` treatment is checked against. + Only the taxes are pinned: the bundled Windows build is older than the + macOS and Linux builds and differs from them in other amounts.""" + row = _row(taxsimtest, case, "psemp") + _, fica, *_ = TAXSIMTEST[case]["psemp"] + assert row["fica"] == pytest.approx(fica, abs=0.01) + assert row["v10"] < case[2] + assert row["niit"] == 0 + + +@pytest.mark.parametrize("case", list(TAXSIMTEST)) +def test_taxsimtest_applies_no_self_employment_tax_to_pbusinc(taxsimtest, case): + """The known difference: no self-employment tax, no deduction for it + in AGI, no Additional Medicare Tax, and the net investment income tax + above its threshold.""" + row = _row(taxsimtest, case, "pbusinc") + for name, expected in zip(OUTPUTS, TAXSIMTEST[case]["pbusinc"]): + assert row[name] == pytest.approx(expected, abs=0.01), ( + f"{case} {name}: expected {expected}, got {row[name]}. {REVISIT}" + ) + + +@pytest.mark.parametrize("case", list(TAXSIMTEST)) +def test_taxsimtest_gives_pbusinc_the_scorp_row(taxsimtest, case): + pbusinc = _row(taxsimtest, case, "pbusinc") + scorp = _row(taxsimtest, case, "scorp") + for name in OUTPUTS + ["siitax", "tfica"]: + assert pbusinc[name] == pytest.approx(scorp[name], abs=0.01), ( + f"{case} {name}: pbusinc {pbusinc[name]}, scorp {scorp[name]}. {REVISIT}" + ) + + +GRID_YEARS = [2021, 2022, 2023, 2024, 2025] +GRID_AMOUNTS = [1_000.0, 15_000.0, 50_000.0, 100_000.0, 200_000.0, 300_000.0, 1e6] + + +def test_taxsimtest_pbusinc_and_sbusinc_bear_no_self_employment_tax_in_any_year(): + """For every year the emulator computes and from $1,000 to $1 million, + on single and joint returns: `psemp` and `ssemp` bear self-employment + tax, `pbusinc` and `sbusinc` bear none and enter AGI in full.""" + records = [] + for year in GRID_YEARS: + for amount in GRID_AMOUNTS: + for column in ("psemp", "pbusinc"): + records.append((year, {column: amount})) + for column in ("ssemp", "sbusinc"): + records.append((year, {"mstat": 2, "sage": 40, column: amount})) + frame = pd.DataFrame( + [ + _record(taxsimid, year, 0, **amounts) + for taxsimid, (year, amounts) in enumerate(records, start=1) + ] + ) + results = TaxsimRunner(frame).run(show_progress=False).set_index("taxsimid") + for taxsimid, record in frame.set_index("taxsimid").iterrows(): + row = results.loc[taxsimid] + if record["psemp"] or record["ssemp"]: + assert row["fica"] > 0, dict(record) + continue + amount = record["pbusinc"] + record["sbusinc"] + where = f"{dict(record)}. {REVISIT}" + assert row["fica"] == 0, where + assert row["tfica"] == 0, where + assert row["addmed"] == 0, where + assert row["v10"] == pytest.approx(amount, abs=0.01), where + + +def _same(first: dict, second: dict) -> bool: + return first.keys() == second.keys() and all( + np.array_equal(first[name], second[name]) for name in first + ) + + +whole_dollars = st.integers(min_value=-2_000_000, max_value=2_000_000) + + +@settings(max_examples=60, deadline=None) +@given( + psemp=whole_dollars, + pbusinc=whole_dollars, + ssemp=whole_dollars, + sbusinc=whole_dollars, + mstat=st.sampled_from([1, 2, 6]), + page=st.integers(min_value=18, max_value=95), + sage=st.integers(min_value=18, max_value=95), + state=st.integers(min_value=1, max_value=51), + depx=st.integers(min_value=0, max_value=3), +) +def test_pbusinc_is_interchangeable_with_psemp( + psemp, pbusinc, ssemp, sbusinc, mstat, page, sage, state, depx +): + """Invariant: whatever the filing status, ages and state, moving + `pbusinc` into `psemp` and `sbusinc` into `ssemp` leaves every + PolicyEngine input unchanged. The emulator has no other treatment of + active business income.""" + record = { + "year": 2023, + "state": state, + "mstat": mstat, + "page": page, + "sage": sage, + "depx": depx, + } + split = generator.read_inputs( + { + **record, + "psemp": psemp, + "pbusinc": pbusinc, + "ssemp": ssemp, + "sbusinc": sbusinc, + } + ) + merged = generator.read_inputs( + { + **record, + "psemp": psemp + pbusinc, + "pbusinc": 0, + "ssemp": ssemp + sbusinc, + "sbusinc": 0, + } + ) + assert _same(split["inputs"], merged["inputs"]) + + +@settings(max_examples=60, deadline=None) +@given( + psemp=whole_dollars, + pbusinc=whole_dollars, + ssemp=whole_dollars, + sbusinc=whole_dollars, + mstat=st.sampled_from([1, 2]), + year=st.sampled_from(GRID_YEARS), +) +def test_single_household_path_sums_them_like_the_runner( + psemp, pbusinc, ssemp, sbusinc, mstat, year +): + """generate_household (the per-record library path) and the + Microsimulation runner both put `psemp + pbusinc` on the primary + taxpayer and `ssemp + sbusinc` on the spouse of a joint return.""" + record = { + "taxsimid": 1, + "year": year, + "state": 5, + "mstat": mstat, + "page": 40, + "sage": 40 if mstat == 2 else 0, + "psemp": psemp, + "pbusinc": pbusinc, + "ssemp": ssemp, + "sbusinc": sbusinc, + } + people = generate_household(dict(record))["people"] + household_path = [people["you"]["self_employment_income"][str(year)]] + if mstat == 2: + household_path.append( + people["your partner"]["self_employment_income"][str(year)] + ) + + inputs = generator.read_inputs({**record, "depx": 0})["inputs"] + roles = generator.roles(inputs) + runner_path = [inputs["self_employment_income"][roles["head"]].sum()] + if mstat == 2: + runner_path.append(inputs["self_employment_income"][roles["spouse"]].sum()) + + expected = [psemp + pbusinc] + ([ssemp + sbusinc] if mstat == 2 else []) + assert household_path == expected + assert [float(amount) for amount in runner_path] == expected + + +def test_design_document_quotes_these_figures(): + """docs/design.md's known-differences entry gives the 2023 figures + pinned above and points to the open question.""" + design = (REPO / "docs" / "design.md").read_text() + entry = next( + line + for line in design.splitlines() + if line.startswith("- **Active business income") + ) + emulator_row = TAXSIMTEST[CA_2023]["psemp"] + binary_row = TAXSIMTEST[CA_2023]["pbusinc"] + for amount in (emulator_row[0], emulator_row[1], binary_row[0]): + assert f"{amount:,.2f}" in entry, amount + assert "issues/1254" in entry + assert "tests/test_pbusinc_self_employment_tax.py" in entry From 4486fdeab43d9c5d2818c86c248a0df87c130111 Mon Sep 17 00:00:00 2001 From: Max Ghenis Date: Fri, 9 Oct 2026 21:50:24 -0400 Subject: [PATCH 9/9] Address independent review of the pbusinc difference - Quote the taxsimtest page's post-FICA note and 26 U.S.C. 1411(c)(1)-(2) next to item 26, name the page and retrieval date, and say the page does not settle the question on its own. - Say the bundled Windows build (cd2026081318) agrees; CI ran the binary pins on all three platforms. - Pin self-employment tax on pprofinc in the bundled builds, and add a differential test that the emulator's scorp row equals the builds' pbusinc row, which the design document now offers as the way to get their result. - Sample years in the interchangeability property, and use tolerances that allow for the emulator's float32 outputs. Co-Authored-By: Claude Opus 5.5 --- docs/design.md | 2 +- docs/input-guide.md | 2 +- docs/reference/input_variables.yaml | 2 +- tests/test_pbusinc_self_employment_tax.py | 153 ++++++++++++++-------- 4 files changed, 99 insertions(+), 60 deletions(-) diff --git a/docs/design.md b/docs/design.md index 65506c731..5e378df6e 100644 --- a/docs/design.md +++ b/docs/design.md @@ -247,7 +247,7 @@ Calculations: - **Maryland.** The emulator's `siitax` excludes county income tax. TAXSIM-35 builds differ: the comments in `_build_configured_sim` record builds that return state-only tax, but the bundled August 2026 builds add a flat 3.2% county tax. For a single filer with $100,000 of wages in 2024, the bundled macOS build returns `siitax` 7,428.45 against a tax before credits (`staxbc`) of 4,417.25. `tests/test_md_local_tax_parity.py` pins the state-only values and marks the affected builds. - **New York.** `siitax` excludes the payments made outside Form IT-201. - **Itemized deductions.** `mortgage` and `otheritem` are treated alike; in some states and years TAXSIM-35 leaves `otheritem` out of the state itemized deduction. See the README. -- **Active business income (`pbusinc`, `sbusinc`).** The emulator treats it like `psemp`: subject to self-employment tax and the Additional Medicare Tax, and eligible for the QBI deduction. NBER's input documentation (retrieved 2026-10-09) describes it as "Subject to NIIT, SECA and Medicare additional Earnings Tax", and the TAXSIM-35 build bundled before the current one (cdate-20260521) applied self-employment tax to it. The bundled build (cd2026081819) applies no self-employment tax or Additional Medicare Tax to it and applies the net investment income tax instead, as it does for `scorp`. For a single California filer with $100,000 of `pbusinc` in 2023, the emulator reports `fiitax` 9,226.50 and `fica` 14,129.55; the build reports 10,469.90 and 0. [#1254](https://github.com/PolicyEngine/policyengine-taxsim/issues/1254) asks TAXSIM's author which is intended; he wants to settle the pass-through inputs together, and the emulator keeps the documented treatment until then. `tests/test_pbusinc_self_employment_tax.py` pins both treatments. +- **Active business income (`pbusinc`, `sbusinc`).** The emulator adds it to `psemp`, so it bears self-employment tax and the Additional Medicare Tax, earns the QBI deduction, and is not subject to the net investment income tax. Item 26 of NBER's [taxsimtest input page](https://taxsim.nber.org/taxsimtest/) (retrieved 2026-10-10) lists it as "Subject to NIIT, SECA and Medicare additional Earnings Tax"; the same page's notes say amounts other than `psemp` and `ssemp` "should be post-FICA". The bundled TAXSIM-35 builds (cd2026081819 for macOS and Linux, cd2026081318 for Windows) apply no self-employment tax or Additional Medicare Tax to it and apply the net investment income tax instead; the macOS build bundled before them (cdate-20260521) applied self-employment tax. For a single California filer with $100,000 of `pbusinc` in 2023, the emulator reports `fiitax` 9,226.50 and `fica` 14,129.55; the bundled builds report 10,469.90 and 0, as does the emulator when the amount is entered as `scorp`. [#1254](https://github.com/PolicyEngine/policyengine-taxsim/issues/1254) asks TAXSIM's author which treatment is intended; he wants to settle the pass-through inputs together, and the emulator keeps the self-employment tax until then. `tests/test_pbusinc_self_employment_tax.py` pins both treatments. - **S corporation income and the net investment income tax.** Passive by default with policyengine-us 2.10.1 or later; see `--scorp-treatment` in the README. - **Married filing separately.** `tests/test_married_filing_separately.py` documents the separate-return cases where the bundled TAXSIM-35 build and the emulator differ and the emulator deliberately does not copy TAXSIM-35. - **Marginal rates.** PolicyEngine rows use a $100 wage change instead of one cent; see above. The bundled TAXSIM-35 build returns `frate` and `srate` of 0 on the records checked, so pre-2021 rows carry no usable marginal rates. diff --git a/docs/input-guide.md b/docs/input-guide.md index b35c44376..c80f8b521 100644 --- a/docs/input-guide.md +++ b/docs/input-guide.md @@ -104,7 +104,7 @@ What each column means. The descriptions come from [`docs/reference/input_variab | Column | Meaning | Type | Valid values | |---|---|---|---| -| `pbusinc` | Primary taxpayer's active business income eligible for the qualified business income deduction without the specified-service phase-out. The emulator applies self-employment tax to it, as NBER's page describes; the bundled TAXSIM-35 build applies the net investment income tax instead (see the design document's known differences). Neither applies self-employment tax to `scorp`. | Dollars per year | Any amount. | +| `pbusinc` | Primary taxpayer's active business income eligible for the qualified business income deduction without the specified-service phase-out. The emulator adds it to `psemp`, so it bears self-employment tax and a loss offsets `psemp`. The bundled TAXSIM-35 builds apply no self-employment tax to it (see the design document's known differences). | Dollars per year | Any amount. | | `sbusinc` | Spouse's active business income; see `pbusinc`. Read only on joint returns. | Dollars per year | Any amount. | | `pprofinc` | Primary taxpayer's income from a specified service trade or business (SSTB), eligible for the qualified business income deduction subject to its phase-out. | Dollars per year | Any amount. | | `sprofinc` | Spouse's SSTB income; see `pprofinc`. Read only on joint returns. | Dollars per year | Any amount. | diff --git a/docs/reference/input_variables.yaml b/docs/reference/input_variables.yaml index fdb30e525..65cd02f3e 100644 --- a/docs/reference/input_variables.yaml +++ b/docs/reference/input_variables.yaml @@ -119,7 +119,7 @@ ssemp: valid: Any amount. pbusinc: group: Business income (QBI) - meaning: Primary taxpayer's active business income eligible for the qualified business income deduction without the specified-service phase-out. The emulator applies self-employment tax to it, as NBER's page describes; the bundled TAXSIM-35 build applies the net investment income tax instead (see the design document's known differences). Neither applies self-employment tax to `scorp`. + meaning: Primary taxpayer's active business income eligible for the qualified business income deduction without the specified-service phase-out. The emulator adds it to `psemp`, so it bears self-employment tax and a loss offsets `psemp`. The bundled TAXSIM-35 builds apply no self-employment tax to it (see the design document's known differences). type: Dollars per year valid: Any amount. sbusinc: diff --git a/tests/test_pbusinc_self_employment_tax.py b/tests/test_pbusinc_self_employment_tax.py index eaacc71b5..c6da4a410 100644 --- a/tests/test_pbusinc_self_employment_tax.py +++ b/tests/test_pbusinc_self_employment_tax.py @@ -1,34 +1,48 @@ """ The emulator applies self-employment tax to active business income -(`pbusinc`, `sbusinc`), as NBER's input documentation describes. The -bundled taxsimtest builds do not. - -Basis for the emulator's treatment: -- NBER's taxsimtest input page (https://taxsim.nber.org/taxsimtest/, - "Date last modified: 28 February 2026", retrieved 2026-10-09), item 26, - under "The following are for the TCJA Business Tax Deduction": - "pbusinc and sbusinc Primary and secondary Taxpayer's active income - eligible for the QBI deduction without phaseout and assuming - sufficient wages paid or capital to be eligible for the full - deduction. Subject to NIIT, SECA and Medicare additional Earnings - Tax." -- The emulator adds `pbusinc` to `psemp` and `sbusinc` to `ssemp` in - PolicyEngine's `self_employment_income` (variable_mappings.yaml, - taxsim #1051), so it bears self-employment tax and the Additional - Medicare Tax. It bears no net investment income tax. The three taxes - NBER's sentence lists cannot all fall on the same income: 26 U.S.C. - 1411(c)(6), under "Net investment income", says "Net investment - income shall not include any item taken into account in determining - self-employment income for such taxable year on which a tax is - imposed by section 1401(b)." -- The macOS builds bundled earlier (cdate-2025Jul5, cdate-2025Aug23, - cdate-20260521) gave `pbusinc` the same 2023 row as `psemp` below. +(`pbusinc`, `sbusinc`). The bundled taxsimtest builds do not. + +NBER's taxsimtest input page (https://taxsim.nber.org/taxsimtest/, +retrieved 2026-10-10): +- Item 26, under "The following are for the TCJA Business Tax + Deduction" (footer "Date last modified: 28 February 2026"): "pbusinc + and sbusinc Primary and secondary Taxpayer's active income eligible + for the QBI deduction without phaseout and assuming sufficient wages + paid or capital to be eligible for the full deduction. Subject to + NIIT, SECA and Medicare additional Earnings Tax." Internet Archive + captures of the page from 2025-08-21 and 2026-04-17 end item 26 with + "Subject to SECA and Medicare additional Earnings Tax." +- "Random Notes" (footer "Date last modified: August 23, 2024"): "The + values you supply for psemp and ssemp should be pre-FICA while the + vaues you supply for the other QBI eligible amounts should be + post-FICA, consistent with the information returns supplied to + taxpayers." Both captures have this note too, from when the bundled + builds applied self-employment tax to `pbusinc`, and it also covers + `pprofinc`, which every bundled build taxes. + +The emulator follows item 26's self-employment tax. It adds `pbusinc` to +`psemp` and `sbusinc` to `ssemp` in PolicyEngine's +`self_employment_income` (variable_mappings.yaml, taxsim #1051), so the +income bears self-employment tax and the Additional Medicare Tax, and a +`pbusinc` loss offsets `psemp`. It bears no net investment income tax: +26 U.S.C. 1411(c)(1)(A)(ii) counts "other gross income derived from a +trade or business described in paragraph (2)", paragraph (2) describes +"(A) a passive activity (within the meaning of section 469) with +respect to the taxpayer, or (B) a trade or business of trading in +financial instruments or commodities", and 1411(c)(6) says "Net +investment income shall not include any item taken into account in +determining self-employment income for such taxable year on which a tax +is imposed by section 1401(b)." Bundled-binary difference: the bundled builds (cd2026081819 for macOS -and Linux) apply no self-employment tax and no Additional Medicare Tax -to `pbusinc` and `sbusinc`, and apply the net investment income tax -instead. On the records below the `pbusinc` row equals the `scorp` row. -taxsimtest cd2026081819, single, age 40, idtl=2: +and Linux, cd2026081318 for Windows) apply no self-employment tax and no +Additional Medicare Tax to `pbusinc` and `sbusinc`, and apply the net +investment income tax instead. On the records below the `pbusinc` row +equals the `scorp` row, and the emulator gives the same figures for +`scorp` treated as passive. The macOS builds bundled earlier +(cdate-2025Jul5, cdate-2025Aug23, cdate-20260521) gave `pbusinc` the +`psemp` figures in these columns. taxsimtest cd2026081819, single, age +40, idtl=2: year state input amount fiitax fica v10 qbid niit addmed 2023 CA psemp 100000 9226.50 14129.55 92935.23 15817.05 0.00 0.00 @@ -36,13 +50,16 @@ 2024 none psemp 300000 47044.47 29634.30 285529.58 54185.92 0.00 693.45 2024 none pbusinc 300000 54548.90 0.00 300000.00 57080.00 3800.00 0.00 -Open question: taxsim #1254 asks TAXSIM's author whether taxsimtest -should skip SECA on `pbusinc`. He replied (2026-09-29) that with SECA on -it "there is no passthru that is free of SECA", and asked to settle "the -treatment of all relevant 7 variables" together. Until that is settled, -the emulator keeps the documented treatment. The `test_taxsimtest_*` -tests pin the binary's own behavior, so a refreshed build that changes -it gets noticed. +Open question: taxsim #1254 reports this to TAXSIM's author. He replied +(2026-09-29): "If businc is subject to FICA, and scorp is subject to EIC +(and therefore subject to SECA) and semp is subject to SECA (as it has +been since the start of Taxsim) then there is no passthru that is free +of SECA, which then means that there is no place in taxsim to put pure +profits, such as real estate, manufacturing, etc." He asked to discuss +"the treatment of all relevant 7 variables" together. Until that is +settled, the emulator keeps item 26's self-employment tax. The +`test_taxsimtest_*` tests pin the bundled builds, so a refreshed build +that changes this gets noticed. """ import importlib.util @@ -81,11 +98,11 @@ }, } OUTPUTS = ["fiitax", "fica", "v10", "qbid", "niit", "addmed"] -SOURCES = ["psemp", "pbusinc", "scorp"] +SOURCES = ["psemp", "pbusinc", "pprofinc", "scorp"] REVISIT = ( "The bundled taxsimtest build treats pbusinc differently from " - "cd2026081819. Check taxsim #1254 and NBER's input page, then revisit " + "cd2026081819 and cd2026081318. Check taxsim #1254 and NBER's input page, then revisit " "the 'Active business income' bullet in docs/design.md, the pbusinc " "entry in docs/reference/input_variables.yaml (and run " "scripts/generate_docs_reference.py), and the notes in this module." @@ -105,6 +122,7 @@ def _record(taxsimid, year, state, **amounts): "ssemp": 0.0, "pbusinc": 0.0, "sbusinc": 0.0, + "pprofinc": 0.0, "scorp": 0.0, "idtl": 2, **amounts, @@ -129,9 +147,12 @@ def _row(results, case, source): @pytest.fixture(scope="module") def emulator(): - # taxsimtest has no wage limit on the QBI deduction, so the comparison - # assumes enough W-2 wages (taxsim #1404). - runner = PolicyEngineRunner(_single_source_frame(), assume_w2_wages=True) + # Item 26 has taxsimtest assume enough wages for the full QBI deduction, + # so the comparison does too (taxsim #1404). scorp is set to passive, + # the default from policyengine-us 2.10.1, so Python 3.10 runs match. + runner = PolicyEngineRunner( + _single_source_frame(), assume_w2_wages=True, scorp_treatment="passive" + ) return runner.run(show_progress=False).set_index("taxsimid") @@ -151,7 +172,8 @@ def test_emulator_taxes_pbusinc_as_taxsimtest_taxes_psemp(emulator, case): and, above the threshold, the Additional Medicare Tax.""" row = _row(emulator, case, "pbusinc") for name, expected in zip(OUTPUTS, TAXSIMTEST[case]["psemp"]): - assert row[name] == pytest.approx(expected, abs=1.0), (case, name) + # The emulator's outputs are float32, a few cents coarse at $300,000. + assert row[name] == pytest.approx(expected, abs=0.05), (case, name) @pytest.mark.parametrize("case", list(TAXSIMTEST)) @@ -162,15 +184,30 @@ def test_emulator_gives_pbusinc_and_psemp_the_same_result(emulator, case): @pytest.mark.parametrize("case", list(TAXSIMTEST)) -def test_taxsimtest_applies_self_employment_tax_to_psemp(taxsimtest, case): - """The reference the emulator's `pbusinc` treatment is checked against. - Only the taxes are pinned: the bundled Windows build is older than the - macOS and Linux builds and differs from them in other amounts.""" - row = _row(taxsimtest, case, "psemp") - _, fica, *_ = TAXSIMTEST[case]["psemp"] +def test_emulator_gives_scorp_the_bundled_builds_pbusinc_result( + emulator, taxsimtest, case +): + """For these records, entering the amount as `scorp` gives the bundled + builds' `pbusinc` figures, as docs/design.md says.""" + scorp = _row(emulator, case, "scorp") + pbusinc = _row(taxsimtest, case, "pbusinc") + for name in OUTPUTS + ["siitax", "tfica"]: + assert scorp[name] == pytest.approx(pbusinc[name], abs=0.05), (case, name) + + +@pytest.mark.parametrize("source", ["psemp", "pprofinc"]) +@pytest.mark.parametrize("case", list(TAXSIMTEST)) +def test_taxsimtest_applies_self_employment_tax_to_psemp_and_pprofinc( + taxsimtest, case, source +): + """The reference the emulator's `pbusinc` treatment is checked against, + and the other self-employment input the bundled builds still tax.""" + row = _row(taxsimtest, case, source) + _, fica, _, _, niit, addmed = TAXSIMTEST[case]["psemp"] assert row["fica"] == pytest.approx(fica, abs=0.01) + assert row["addmed"] == pytest.approx(addmed, abs=0.01) + assert row["niit"] == niit assert row["v10"] < case[2] - assert row["niit"] == 0 @pytest.mark.parametrize("case", list(TAXSIMTEST)) @@ -200,8 +237,8 @@ def test_taxsimtest_gives_pbusinc_the_scorp_row(taxsimtest, case): def test_taxsimtest_pbusinc_and_sbusinc_bear_no_self_employment_tax_in_any_year(): - """For every year the emulator computes and from $1,000 to $1 million, - on single and joint returns: `psemp` and `ssemp` bear self-employment + """For 2021 to 2025 and from $1,000 to $1 million, on single and joint + returns: `psemp` and `ssemp` bear self-employment tax, `pbusinc` and `sbusinc` bear none and enter AGI in full.""" records = [] for year in GRID_YEARS: @@ -250,16 +287,17 @@ def _same(first: dict, second: dict) -> bool: sage=st.integers(min_value=18, max_value=95), state=st.integers(min_value=1, max_value=51), depx=st.integers(min_value=0, max_value=3), + year=st.sampled_from(GRID_YEARS), ) def test_pbusinc_is_interchangeable_with_psemp( - psemp, pbusinc, ssemp, sbusinc, mstat, page, sage, state, depx + psemp, pbusinc, ssemp, sbusinc, mstat, page, sage, state, depx, year ): - """Invariant: whatever the filing status, ages and state, moving - `pbusinc` into `psemp` and `sbusinc` into `ssemp` leaves every - PolicyEngine input unchanged. The emulator has no other treatment of - active business income.""" + """Invariant: whatever the year, filing status, ages and state, moving + `pbusinc` into `psemp` and `sbusinc` into `ssemp` leaves every input + of the dataset the emulator builds unchanged. The emulator has no + other treatment of active business income.""" record = { - "year": 2023, + "year": year, "state": state, "mstat": mstat, "page": page, @@ -334,8 +372,8 @@ def test_single_household_path_sums_them_like_the_runner( def test_design_document_quotes_these_figures(): """docs/design.md's known-differences entry gives the 2023 figures - pinned above and points to the open question.""" - design = (REPO / "docs" / "design.md").read_text() + pinned above, the `scorp` alternative and the open question.""" + design = (REPO / "docs" / "design.md").read_text(encoding="utf-8") entry = next( line for line in design.splitlines() @@ -346,4 +384,5 @@ def test_design_document_quotes_these_figures(): for amount in (emulator_row[0], emulator_row[1], binary_row[0]): assert f"{amount:,.2f}" in entry, amount assert "issues/1254" in entry + assert "entered as `scorp`" in entry assert "tests/test_pbusinc_self_employment_tax.py" in entry