From 079804a0fc5ab32534e591ed3a81175c3fe9ded3 Mon Sep 17 00:00:00 2001 From: ilgazca Date: Wed, 30 Jul 2025 18:53:50 +0300 Subject: [PATCH] some new features --- .venv/bin/install_cmdstan | 8 + .venv/bin/install_cxx_toolchain | 8 + .venv/bin/tqdm | 8 + .../cmdstanpy-1.2.5.dist-info/INSTALLER | 1 + .../cmdstanpy-1.2.5.dist-info/LICENSE.md | 15 + .../cmdstanpy-1.2.5.dist-info/METADATA | 102 + .../cmdstanpy-1.2.5.dist-info/RECORD | 60 + .../cmdstanpy-1.2.5.dist-info/WHEEL | 5 + .../entry_points.txt | 3 + .../cmdstanpy-1.2.5.dist-info/top_level.txt | 1 + .../site-packages/cmdstanpy/__init__.py | 66 + .../__pycache__/__init__.cpython-312.pyc | Bin 0 -> 1552 bytes .../__pycache__/_version.cpython-312.pyc | Bin 0 -> 257 bytes .../__pycache__/cmdstan_args.cpython-312.pyc | Bin 0 -> 46458 bytes .../__pycache__/compilation.cpython-312.pyc | Bin 0 -> 25132 bytes .../install_cmdstan.cpython-312.pyc | Bin 0 -> 30651 bytes .../install_cxx_toolchain.cpython-312.pyc | Bin 0 -> 15379 bytes .../__pycache__/model.cpython-312.pyc | Bin 0 -> 89031 bytes .../__pycache__/progress.cpython-312.pyc | Bin 0 -> 1891 bytes .../site-packages/cmdstanpy/_version.py | 3 + .../site-packages/cmdstanpy/cmdstan_args.py | 1005 ++++ .../site-packages/cmdstanpy/compilation.py | 579 ++ .../cmdstanpy/install_cmdstan.py | 711 +++ .../cmdstanpy/install_cxx_toolchain.py | 372 ++ .../site-packages/cmdstanpy/model.py | 2173 ++++++++ .../site-packages/cmdstanpy/progress.py | 49 + .../site-packages/cmdstanpy/py.typed | 0 .../cmdstanpy/stanfit/__init__.py | 269 + .../__pycache__/__init__.cpython-312.pyc | Bin 0 -> 10041 bytes .../stanfit/__pycache__/gq.cpython-312.pyc | Bin 0 -> 29307 bytes .../__pycache__/laplace.cpython-312.pyc | Bin 0 -> 13229 bytes .../stanfit/__pycache__/mcmc.cpython-312.pyc | Bin 0 -> 37153 bytes .../__pycache__/metadata.cpython-312.pyc | Bin 0 -> 3028 bytes .../stanfit/__pycache__/mle.cpython-312.pyc | Bin 0 -> 13229 bytes .../__pycache__/pathfinder.cpython-312.pyc | Bin 0 -> 12028 bytes .../__pycache__/runset.cpython-312.pyc | Bin 0 -> 15401 bytes .../stanfit/__pycache__/vb.cpython-312.pyc | Bin 0 -> 11360 bytes .../site-packages/cmdstanpy/stanfit/gq.py | 734 +++ .../cmdstanpy/stanfit/laplace.py | 304 ++ .../site-packages/cmdstanpy/stanfit/mcmc.py | 826 +++ .../cmdstanpy/stanfit/metadata.py | 53 + .../site-packages/cmdstanpy/stanfit/mle.py | 284 + .../cmdstanpy/stanfit/pathfinder.py | 237 + .../site-packages/cmdstanpy/stanfit/runset.py | 307 ++ .../site-packages/cmdstanpy/stanfit/vb.py | 240 + .../site-packages/cmdstanpy/utils/__init__.py | 147 + .../__pycache__/__init__.cpython-312.pyc | Bin 0 -> 4074 bytes .../utils/__pycache__/cmdstan.cpython-312.pyc | Bin 0 -> 22572 bytes .../utils/__pycache__/command.cpython-312.pyc | Bin 0 -> 4034 bytes .../__pycache__/data_munging.cpython-312.pyc | Bin 0 -> 2372 bytes .../__pycache__/filesystem.cpython-312.pyc | Bin 0 -> 11194 bytes .../utils/__pycache__/json.cpython-312.pyc | Bin 0 -> 361 bytes .../utils/__pycache__/logging.cpython-312.pyc | Bin 0 -> 1258 bytes .../utils/__pycache__/stancsv.cpython-312.pyc | Bin 0 -> 21579 bytes .../site-packages/cmdstanpy/utils/cmdstan.py | 554 ++ .../site-packages/cmdstanpy/utils/command.py | 94 + .../cmdstanpy/utils/data_munging.py | 44 + .../cmdstanpy/utils/filesystem.py | 236 + .../site-packages/cmdstanpy/utils/json.py | 6 + .../site-packages/cmdstanpy/utils/logging.py | 25 + .../site-packages/cmdstanpy/utils/stancsv.py | 486 ++ .../holidays-0.77.dist-info/INSTALLER | 1 + .../holidays-0.77.dist-info/METADATA | 1815 +++++++ .../holidays-0.77.dist-info/RECORD | 1111 ++++ .../holidays-0.77.dist-info/WHEEL | 5 + .../licenses/CONTRIBUTORS | 162 + .../holidays-0.77.dist-info/licenses/LICENSE | 23 + .../holidays-0.77.dist-info/top_level.txt | 1 + .../site-packages/holidays/__init__.py | 22 + .../__pycache__/__init__.cpython-312.pyc | Bin 0 -> 588 bytes .../__pycache__/constants.cpython-312.pyc | Bin 0 -> 1331 bytes .../__pycache__/helpers.cpython-312.pyc | Bin 0 -> 1329 bytes .../__pycache__/holiday_base.cpython-312.pyc | Bin 0 -> 61394 bytes .../holidays/__pycache__/ical.cpython-312.pyc | Bin 0 -> 9471 bytes .../observed_holiday_base.cpython-312.pyc | Bin 0 -> 11376 bytes .../__pycache__/registry.cpython-312.pyc | Bin 0 -> 18899 bytes .../__pycache__/utils.cpython-312.pyc | Bin 0 -> 16259 bytes .../__pycache__/version.cpython-312.pyc | Bin 0 -> 226 bytes .../holidays/calendars/__init__.py | 28 + .../__pycache__/__init__.cpython-312.pyc | Bin 0 -> 1426 bytes .../__pycache__/balinese_saka.cpython-312.pyc | Bin 0 -> 4307 bytes .../__pycache__/buddhist.cpython-312.pyc | Bin 0 -> 14429 bytes .../__pycache__/chinese.cpython-312.pyc | Bin 0 -> 40565 bytes .../__pycache__/custom.cpython-312.pyc | Bin 0 -> 1631 bytes .../__pycache__/gregorian.cpython-312.pyc | Bin 0 -> 3664 bytes .../__pycache__/hebrew.cpython-312.pyc | Bin 0 -> 49481 bytes .../__pycache__/hindu.cpython-312.pyc | Bin 0 -> 45000 bytes .../__pycache__/islamic.cpython-312.pyc | Bin 0 -> 123194 bytes .../__pycache__/julian.cpython-312.pyc | Bin 0 -> 238 bytes .../julian_revised.cpython-312.pyc | Bin 0 -> 255 bytes .../__pycache__/mongolian.cpython-312.pyc | Bin 0 -> 11016 bytes .../__pycache__/persian.cpython-312.pyc | Bin 0 -> 2496 bytes .../__pycache__/sinhala.cpython-312.pyc | Bin 0 -> 13330 bytes .../__pycache__/thai.cpython-312.pyc | Bin 0 -> 22813 bytes .../holidays/calendars/balinese_saka.py | 112 + .../holidays/calendars/buddhist.py | 444 ++ .../holidays/calendars/chinese.py | 1354 +++++ .../holidays/calendars/custom.py | 34 + .../holidays/calendars/gregorian.py | 95 + .../holidays/calendars/hebrew.py | 1633 ++++++ .../site-packages/holidays/calendars/hindu.py | 1494 ++++++ .../holidays/calendars/islamic.py | 4043 ++++++++++++++ .../holidays/calendars/julian.py | 13 + .../holidays/calendars/julian_revised.py | 13 + .../holidays/calendars/mongolian.py | 342 ++ .../holidays/calendars/persian.py | 64 + .../holidays/calendars/sinhala.py | 414 ++ .../site-packages/holidays/calendars/thai.py | 799 +++ .../site-packages/holidays/constants.py | 69 + .../holidays/countries/__init__.py | 261 + .../__pycache__/__init__.cpython-312.pyc | Bin 0 -> 24405 bytes .../__pycache__/afghanistan.cpython-312.pyc | Bin 0 -> 6759 bytes .../__pycache__/aland_islands.cpython-312.pyc | Bin 0 -> 1485 bytes .../__pycache__/albania.cpython-312.pyc | Bin 0 -> 7261 bytes .../__pycache__/algeria.cpython-312.pyc | Bin 0 -> 4518 bytes .../american_samoa.cpython-312.pyc | Bin 0 -> 1282 bytes .../__pycache__/andorra.cpython-312.pyc | Bin 0 -> 13064 bytes .../__pycache__/angola.cpython-312.pyc | Bin 0 -> 8464 bytes .../__pycache__/anguilla.cpython-312.pyc | Bin 0 -> 8256 bytes .../antigua_and_barbuda.cpython-312.pyc | Bin 0 -> 7551 bytes .../__pycache__/argentina.cpython-312.pyc | Bin 0 -> 42434 bytes .../__pycache__/armenia.cpython-312.pyc | Bin 0 -> 4645 bytes .../__pycache__/aruba.cpython-312.pyc | Bin 0 -> 5216 bytes .../__pycache__/australia.cpython-312.pyc | Bin 0 -> 36006 bytes .../__pycache__/austria.cpython-312.pyc | Bin 0 -> 6847 bytes .../__pycache__/azerbaijan.cpython-312.pyc | Bin 0 -> 14406 bytes .../__pycache__/bahamas.cpython-312.pyc | Bin 0 -> 5117 bytes .../__pycache__/bahrain.cpython-312.pyc | Bin 0 -> 4460 bytes .../__pycache__/bangladesh.cpython-312.pyc | Bin 0 -> 2375 bytes .../__pycache__/barbados.cpython-312.pyc | Bin 0 -> 4633 bytes .../__pycache__/belarus.cpython-312.pyc | Bin 0 -> 10297 bytes .../__pycache__/belgium.cpython-312.pyc | Bin 0 -> 3882 bytes .../__pycache__/belize.cpython-312.pyc | Bin 0 -> 4378 bytes .../__pycache__/benin.cpython-312.pyc | Bin 0 -> 12339 bytes .../__pycache__/bermuda.cpython-312.pyc | Bin 0 -> 7837 bytes .../__pycache__/bolivia.cpython-312.pyc | Bin 0 -> 8303 bytes ...re_sint_eustatius_and_saba.cpython-312.pyc | Bin 0 -> 6087 bytes .../bosnia_and_herzegovina.cpython-312.pyc | Bin 0 -> 11698 bytes .../__pycache__/botswana.cpython-312.pyc | Bin 0 -> 4624 bytes .../__pycache__/brazil.cpython-312.pyc | Bin 0 -> 19706 bytes .../british_virgin_islands.cpython-312.pyc | Bin 0 -> 8919 bytes .../__pycache__/brunei.cpython-312.pyc | Bin 0 -> 17147 bytes .../__pycache__/bulgaria.cpython-312.pyc | Bin 0 -> 6804 bytes .../__pycache__/burkina_faso.cpython-312.pyc | Bin 0 -> 5201 bytes .../__pycache__/burundi.cpython-312.pyc | Bin 0 -> 4348 bytes .../__pycache__/cabo_verde.cpython-312.pyc | Bin 0 -> 13842 bytes .../__pycache__/cambodia.cpython-312.pyc | Bin 0 -> 10374 bytes .../__pycache__/cameroon.cpython-312.pyc | Bin 0 -> 6930 bytes .../__pycache__/canada.cpython-312.pyc | Bin 0 -> 24808 bytes .../cayman_islands.cpython-312.pyc | Bin 0 -> 7760 bytes .../central_african_republic.cpython-312.pyc | Bin 0 -> 5697 bytes .../__pycache__/chad.cpython-312.pyc | Bin 0 -> 5122 bytes .../__pycache__/chile.cpython-312.pyc | Bin 0 -> 11981 bytes .../__pycache__/china.cpython-312.pyc | Bin 0 -> 15510 bytes .../christmas_island.cpython-312.pyc | Bin 0 -> 10719 bytes .../__pycache__/cocos_islands.cpython-312.pyc | Bin 0 -> 12554 bytes .../__pycache__/colombia.cpython-312.pyc | Bin 0 -> 5922 bytes .../__pycache__/congo.cpython-312.pyc | Bin 0 -> 3137 bytes .../__pycache__/cook_islands.cpython-312.pyc | Bin 0 -> 7231 bytes .../__pycache__/costa_rica.cpython-312.pyc | Bin 0 -> 5622 bytes .../__pycache__/croatia.cpython-312.pyc | Bin 0 -> 4269 bytes .../__pycache__/cuba.cpython-312.pyc | Bin 0 -> 5550 bytes .../__pycache__/curacao.cpython-312.pyc | Bin 0 -> 5169 bytes .../__pycache__/cyprus.cpython-312.pyc | Bin 0 -> 4808 bytes .../__pycache__/czechia.cpython-312.pyc | Bin 0 -> 4415 bytes .../__pycache__/denmark.cpython-312.pyc | Bin 0 -> 3805 bytes .../__pycache__/djibouti.cpython-312.pyc | Bin 0 -> 3611 bytes .../__pycache__/dominica.cpython-312.pyc | Bin 0 -> 5915 bytes .../dominican_republic.cpython-312.pyc | Bin 0 -> 3835 bytes .../__pycache__/dr_congo.cpython-312.pyc | Bin 0 -> 6027 bytes .../__pycache__/ecuador.cpython-312.pyc | Bin 0 -> 4205 bytes .../__pycache__/egypt.cpython-312.pyc | Bin 0 -> 4836 bytes .../__pycache__/el_salvador.cpython-312.pyc | Bin 0 -> 4129 bytes .../equatorial_guinea.cpython-312.pyc | Bin 0 -> 6977 bytes .../__pycache__/estonia.cpython-312.pyc | Bin 0 -> 2972 bytes .../__pycache__/eswatini.cpython-312.pyc | Bin 0 -> 4642 bytes .../__pycache__/ethiopia.cpython-312.pyc | Bin 0 -> 7656 bytes .../falkland_islands.cpython-312.pyc | Bin 0 -> 7049 bytes .../__pycache__/faroe_islands.cpython-312.pyc | Bin 0 -> 4489 bytes .../__pycache__/fiji.cpython-312.pyc | Bin 0 -> 7938 bytes .../__pycache__/finland.cpython-312.pyc | Bin 0 -> 12740 bytes .../__pycache__/france.cpython-312.pyc | Bin 0 -> 13384 bytes .../__pycache__/french_guiana.cpython-312.pyc | Bin 0 -> 1375 bytes .../french_polynesia.cpython-312.pyc | Bin 0 -> 1340 bytes ...rench_southern_territories.cpython-312.pyc | Bin 0 -> 1618 bytes .../__pycache__/gabon.cpython-312.pyc | Bin 0 -> 5360 bytes .../__pycache__/georgia.cpython-312.pyc | Bin 0 -> 5454 bytes .../__pycache__/germany.cpython-312.pyc | Bin 0 -> 12665 bytes .../__pycache__/ghana.cpython-312.pyc | Bin 0 -> 4167 bytes .../__pycache__/gibraltar.cpython-312.pyc | Bin 0 -> 11438 bytes .../__pycache__/greece.cpython-312.pyc | Bin 0 -> 4630 bytes .../__pycache__/greenland.cpython-312.pyc | Bin 0 -> 4076 bytes .../__pycache__/grenada.cpython-312.pyc | Bin 0 -> 7696 bytes .../__pycache__/guadeloupe.cpython-312.pyc | Bin 0 -> 1364 bytes .../__pycache__/guam.cpython-312.pyc | Bin 0 -> 1253 bytes .../__pycache__/guatemala.cpython-312.pyc | Bin 0 -> 4180 bytes .../__pycache__/guernsey.cpython-312.pyc | Bin 0 -> 13091 bytes .../__pycache__/guinea.cpython-312.pyc | Bin 0 -> 6815 bytes .../__pycache__/guyana.cpython-312.pyc | Bin 0 -> 11365 bytes .../__pycache__/haiti.cpython-312.pyc | Bin 0 -> 5165 bytes .../__pycache__/honduras.cpython-312.pyc | Bin 0 -> 3464 bytes .../__pycache__/hongkong.cpython-312.pyc | Bin 0 -> 16681 bytes .../__pycache__/hungary.cpython-312.pyc | Bin 0 -> 11060 bytes .../__pycache__/iceland.cpython-312.pyc | Bin 0 -> 4048 bytes .../__pycache__/india.cpython-312.pyc | Bin 0 -> 23941 bytes .../__pycache__/indonesia.cpython-312.pyc | Bin 0 -> 29802 bytes .../__pycache__/iran.cpython-312.pyc | Bin 0 -> 16671 bytes .../__pycache__/ireland.cpython-312.pyc | Bin 0 -> 3924 bytes .../__pycache__/isle_of_man.cpython-312.pyc | Bin 0 -> 2803 bytes .../__pycache__/israel.cpython-312.pyc | Bin 0 -> 6423 bytes .../__pycache__/italy.cpython-312.pyc | Bin 0 -> 36108 bytes .../__pycache__/ivory_coast.cpython-312.pyc | Bin 0 -> 6983 bytes .../__pycache__/jamaica.cpython-312.pyc | Bin 0 -> 3123 bytes .../__pycache__/japan.cpython-312.pyc | Bin 0 -> 11179 bytes .../__pycache__/jersey.cpython-312.pyc | Bin 0 -> 9852 bytes .../__pycache__/jordan.cpython-312.pyc | Bin 0 -> 4096 bytes .../__pycache__/kazakhstan.cpython-312.pyc | Bin 0 -> 14698 bytes .../__pycache__/kenya.cpython-312.pyc | Bin 0 -> 9973 bytes .../__pycache__/kuwait.cpython-312.pyc | Bin 0 -> 3966 bytes .../__pycache__/kyrgyzstan.cpython-312.pyc | Bin 0 -> 3503 bytes .../__pycache__/laos.cpython-312.pyc | Bin 0 -> 12460 bytes .../__pycache__/latvia.cpython-312.pyc | Bin 0 -> 4990 bytes .../__pycache__/lebanon.cpython-312.pyc | Bin 0 -> 15766 bytes .../__pycache__/lesotho.cpython-312.pyc | Bin 0 -> 3422 bytes .../__pycache__/libya.cpython-312.pyc | Bin 0 -> 8536 bytes .../__pycache__/liechtenstein.cpython-312.pyc | Bin 0 -> 4437 bytes .../__pycache__/lithuania.cpython-312.pyc | Bin 0 -> 3975 bytes .../__pycache__/luxembourg.cpython-312.pyc | Bin 0 -> 2917 bytes .../__pycache__/macau.cpython-312.pyc | Bin 0 -> 17951 bytes .../__pycache__/madagascar.cpython-312.pyc | Bin 0 -> 4069 bytes .../__pycache__/malawi.cpython-312.pyc | Bin 0 -> 3212 bytes .../__pycache__/malaysia.cpython-312.pyc | Bin 0 -> 37758 bytes .../__pycache__/maldives.cpython-312.pyc | Bin 0 -> 3591 bytes .../__pycache__/mali.cpython-312.pyc | Bin 0 -> 5581 bytes .../__pycache__/malta.cpython-312.pyc | Bin 0 -> 4559 bytes .../marshall_islands.cpython-312.pyc | Bin 0 -> 4184 bytes .../__pycache__/martinique.cpython-312.pyc | Bin 0 -> 1364 bytes .../__pycache__/mauritania.cpython-312.pyc | Bin 0 -> 2885 bytes .../__pycache__/mauritius.cpython-312.pyc | Bin 0 -> 7898 bytes .../__pycache__/mayotte.cpython-312.pyc | Bin 0 -> 1352 bytes .../__pycache__/mexico.cpython-312.pyc | Bin 0 -> 3894 bytes .../__pycache__/micronesia.cpython-312.pyc | Bin 0 -> 11074 bytes .../__pycache__/moldova.cpython-312.pyc | Bin 0 -> 3917 bytes .../__pycache__/monaco.cpython-312.pyc | Bin 0 -> 4243 bytes .../__pycache__/mongolia.cpython-312.pyc | Bin 0 -> 8741 bytes .../__pycache__/montenegro.cpython-312.pyc | Bin 0 -> 8866 bytes .../__pycache__/montserrat.cpython-312.pyc | Bin 0 -> 8729 bytes .../__pycache__/morocco.cpython-312.pyc | Bin 0 -> 4681 bytes .../__pycache__/mozambique.cpython-312.pyc | Bin 0 -> 3329 bytes .../__pycache__/namibia.cpython-312.pyc | Bin 0 -> 8309 bytes .../__pycache__/nauru.cpython-312.pyc | Bin 0 -> 6144 bytes .../__pycache__/nepal.cpython-312.pyc | Bin 0 -> 14801 bytes .../__pycache__/netherlands.cpython-312.pyc | Bin 0 -> 4343 bytes .../__pycache__/new_caledonia.cpython-312.pyc | Bin 0 -> 1328 bytes .../__pycache__/new_zealand.cpython-312.pyc | Bin 0 -> 13268 bytes .../__pycache__/nicaragua.cpython-312.pyc | Bin 0 -> 4301 bytes .../__pycache__/niger.cpython-312.pyc | Bin 0 -> 11330 bytes .../__pycache__/nigeria.cpython-312.pyc | Bin 0 -> 4649 bytes .../__pycache__/niue.cpython-312.pyc | Bin 0 -> 5465 bytes .../norfolk_island.cpython-312.pyc | Bin 0 -> 6008 bytes .../north_macedonia.cpython-312.pyc | Bin 0 -> 15200 bytes .../northern_mariana_islands.cpython-312.pyc | Bin 0 -> 1317 bytes .../__pycache__/norway.cpython-312.pyc | Bin 0 -> 4815 bytes .../__pycache__/oman.cpython-312.pyc | Bin 0 -> 6216 bytes .../__pycache__/pakistan.cpython-312.pyc | Bin 0 -> 7164 bytes .../__pycache__/palau.cpython-312.pyc | Bin 0 -> 5847 bytes .../__pycache__/palestine.cpython-312.pyc | Bin 0 -> 7518 bytes .../__pycache__/panama.cpython-312.pyc | Bin 0 -> 6020 bytes .../papua_new_guinea.cpython-312.pyc | Bin 0 -> 7552 bytes .../__pycache__/paraguay.cpython-312.pyc | Bin 0 -> 7060 bytes .../__pycache__/peru.cpython-312.pyc | Bin 0 -> 4207 bytes .../__pycache__/philippines.cpython-312.pyc | Bin 0 -> 13104 bytes .../__pycache__/poland.cpython-312.pyc | Bin 0 -> 5878 bytes .../__pycache__/portugal.cpython-312.pyc | Bin 0 -> 13018 bytes .../__pycache__/puerto_rico.cpython-312.pyc | Bin 0 -> 1273 bytes .../__pycache__/qatar.cpython-312.pyc | Bin 0 -> 6511 bytes .../__pycache__/reunion.cpython-312.pyc | Bin 0 -> 1354 bytes .../__pycache__/romania.cpython-312.pyc | Bin 0 -> 3858 bytes .../__pycache__/russia.cpython-312.pyc | Bin 0 -> 10661 bytes .../saint_barthelemy.cpython-312.pyc | Bin 0 -> 1342 bytes .../saint_kitts_and_nevis.cpython-312.pyc | Bin 0 -> 8832 bytes .../__pycache__/saint_lucia.cpython-312.pyc | Bin 0 -> 4210 bytes .../__pycache__/saint_martin.cpython-312.pyc | Bin 0 -> 1340 bytes .../saint_pierre_and_miquelon.cpython-312.pyc | Bin 0 -> 1374 bytes ...vincent_and_the_grenadines.cpython-312.pyc | Bin 0 -> 6675 bytes .../__pycache__/samoa.cpython-312.pyc | Bin 0 -> 2874 bytes .../__pycache__/san_marino.cpython-312.pyc | Bin 0 -> 4869 bytes .../sao_tome_and_principe.cpython-312.pyc | Bin 0 -> 4942 bytes .../__pycache__/saudi_arabia.cpython-312.pyc | Bin 0 -> 5753 bytes .../__pycache__/senegal.cpython-312.pyc | Bin 0 -> 7315 bytes .../__pycache__/serbia.cpython-312.pyc | Bin 0 -> 3783 bytes .../__pycache__/seychelles.cpython-312.pyc | Bin 0 -> 7562 bytes .../__pycache__/sierra_leone.cpython-312.pyc | Bin 0 -> 5874 bytes .../__pycache__/singapore.cpython-312.pyc | Bin 0 -> 12141 bytes .../__pycache__/sint_maarten.cpython-312.pyc | Bin 0 -> 4891 bytes .../__pycache__/slovakia.cpython-312.pyc | Bin 0 -> 5040 bytes .../__pycache__/slovenia.cpython-312.pyc | Bin 0 -> 5792 bytes .../solomon_islands.cpython-312.pyc | Bin 0 -> 10795 bytes .../__pycache__/south_africa.cpython-312.pyc | Bin 0 -> 7108 bytes .../__pycache__/south_korea.cpython-312.pyc | Bin 0 -> 18335 bytes .../__pycache__/spain.cpython-312.pyc | Bin 0 -> 39801 bytes .../__pycache__/sri_lanka.cpython-312.pyc | Bin 0 -> 19377 bytes .../__pycache__/suriname.cpython-312.pyc | Bin 0 -> 8468 bytes .../svalbard_and_jan_mayen.cpython-312.pyc | Bin 0 -> 1319 bytes .../__pycache__/sweden.cpython-312.pyc | Bin 0 -> 5169 bytes .../__pycache__/switzerland.cpython-312.pyc | Bin 0 -> 25578 bytes .../__pycache__/taiwan.cpython-312.pyc | Bin 0 -> 19410 bytes .../__pycache__/tanzania.cpython-312.pyc | Bin 0 -> 9148 bytes .../__pycache__/thailand.cpython-312.pyc | Bin 0 -> 46175 bytes .../__pycache__/timor_leste.cpython-312.pyc | Bin 0 -> 12092 bytes .../__pycache__/togo.cpython-312.pyc | Bin 0 -> 8677 bytes .../__pycache__/tokelau.cpython-312.pyc | Bin 0 -> 2612 bytes .../__pycache__/tonga.cpython-312.pyc | Bin 0 -> 10489 bytes .../trinidad_and_tobago.cpython-312.pyc | Bin 0 -> 8581 bytes .../__pycache__/tunisia.cpython-312.pyc | Bin 0 -> 3946 bytes .../__pycache__/turkey.cpython-312.pyc | Bin 0 -> 12193 bytes .../turks_and_caicos_islands.cpython-312.pyc | Bin 0 -> 6288 bytes .../__pycache__/tuvalu.cpython-312.pyc | Bin 0 -> 7754 bytes .../__pycache__/ukraine.cpython-312.pyc | Bin 0 -> 16543 bytes .../united_arab_emirates.cpython-312.pyc | Bin 0 -> 10185 bytes .../united_kingdom.cpython-312.pyc | Bin 0 -> 9129 bytes .../__pycache__/united_states.cpython-312.pyc | Bin 0 -> 61028 bytes ...tes_minor_outlying_islands.cpython-312.pyc | Bin 0 -> 1345 bytes ...ited_states_virgin_islands.cpython-312.pyc | Bin 0 -> 1328 bytes .../__pycache__/uruguay.cpython-312.pyc | Bin 0 -> 8035 bytes .../__pycache__/uzbekistan.cpython-312.pyc | Bin 0 -> 9263 bytes .../__pycache__/vanuatu.cpython-312.pyc | Bin 0 -> 4309 bytes .../__pycache__/vatican_city.cpython-312.pyc | Bin 0 -> 8356 bytes .../__pycache__/venezuela.cpython-312.pyc | Bin 0 -> 4879 bytes .../__pycache__/vietnam.cpython-312.pyc | Bin 0 -> 7673 bytes .../wallis_and_futuna.cpython-312.pyc | Bin 0 -> 1343 bytes .../__pycache__/yemen.cpython-312.pyc | Bin 0 -> 8614 bytes .../__pycache__/zambia.cpython-312.pyc | Bin 0 -> 4949 bytes .../__pycache__/zimbabwe.cpython-312.pyc | Bin 0 -> 3523 bytes .../holidays/countries/afghanistan.py | 202 + .../holidays/countries/aland_islands.py | 47 + .../holidays/countries/albania.py | 171 + .../holidays/countries/algeria.py | 104 + .../holidays/countries/american_samoa.py | 39 + .../holidays/countries/andorra.py | 229 + .../holidays/countries/angola.py | 187 + .../holidays/countries/anguilla.py | 175 + .../holidays/countries/antigua_and_barbuda.py | 145 + .../holidays/countries/argentina.py | 1000 ++++ .../holidays/countries/armenia.py | 108 + .../site-packages/holidays/countries/aruba.py | 159 + .../holidays/countries/australia.py | 1010 ++++ .../holidays/countries/austria.py | 171 + .../holidays/countries/azerbaijan.py | 354 ++ .../holidays/countries/bahamas.py | 142 + .../holidays/countries/bahrain.py | 113 + .../holidays/countries/bangladesh.py | 61 + .../holidays/countries/barbados.py | 107 + .../holidays/countries/belarus.py | 303 ++ .../holidays/countries/belgium.py | 93 + .../holidays/countries/belize.py | 114 + .../site-packages/holidays/countries/benin.py | 199 + .../holidays/countries/bermuda.py | 152 + .../holidays/countries/bolivia.py | 175 + .../bonaire_sint_eustatius_and_saba.py | 134 + .../countries/bosnia_and_herzegovina.py | 313 ++ .../holidays/countries/botswana.py | 91 + .../holidays/countries/brazil.py | 391 ++ .../countries/british_virgin_islands.py | 205 + .../holidays/countries/brunei.py | 509 ++ .../holidays/countries/bulgaria.py | 138 + .../holidays/countries/burkina_faso.py | 144 + .../holidays/countries/burundi.py | 100 + .../holidays/countries/cabo_verde.py | 293 + .../holidays/countries/cambodia.py | 316 ++ .../holidays/countries/cameroon.py | 196 + .../holidays/countries/canada.py | 565 ++ .../holidays/countries/cayman_islands.py | 162 + .../countries/central_african_republic.py | 143 + .../site-packages/holidays/countries/chad.py | 143 + .../site-packages/holidays/countries/chile.py | 268 + .../site-packages/holidays/countries/china.py | 460 ++ .../holidays/countries/christmas_island.py | 215 + .../holidays/countries/cocos_islands.py | 260 + .../holidays/countries/colombia.py | 120 + .../site-packages/holidays/countries/congo.py | 79 + .../holidays/countries/cook_islands.py | 148 + .../holidays/countries/costa_rica.py | 128 + .../holidays/countries/croatia.py | 112 + .../site-packages/holidays/countries/cuba.py | 108 + .../holidays/countries/curacao.py | 174 + .../holidays/countries/cyprus.py | 104 + .../holidays/countries/czechia.py | 108 + .../holidays/countries/denmark.py | 93 + .../holidays/countries/djibouti.py | 90 + .../holidays/countries/dominica.py | 129 + .../holidays/countries/dominican_republic.py | 92 + .../holidays/countries/dr_congo.py | 139 + .../holidays/countries/ecuador.py | 109 + .../site-packages/holidays/countries/egypt.py | 108 + .../holidays/countries/el_salvador.py | 121 + .../holidays/countries/equatorial_guinea.py | 150 + .../holidays/countries/estonia.py | 76 + .../holidays/countries/eswatini.py | 93 + .../holidays/countries/ethiopia.py | 171 + .../holidays/countries/falkland_islands.py | 141 + .../holidays/countries/faroe_islands.py | 102 + .../site-packages/holidays/countries/fiji.py | 183 + .../holidays/countries/finland.py | 356 ++ .../holidays/countries/france.py | 342 ++ .../holidays/countries/french_guiana.py | 44 + .../holidays/countries/french_polynesia.py | 43 + .../countries/french_southern_territories.py | 48 + .../site-packages/holidays/countries/gabon.py | 147 + .../holidays/countries/georgia.py | 118 + .../holidays/countries/germany.py | 277 + .../site-packages/holidays/countries/ghana.py | 103 + .../holidays/countries/gibraltar.py | 219 + .../holidays/countries/greece.py | 104 + .../holidays/countries/greenland.py | 98 + .../holidays/countries/grenada.py | 143 + .../holidays/countries/guadeloupe.py | 44 + .../site-packages/holidays/countries/guam.py | 39 + .../holidays/countries/guatemala.py | 90 + .../holidays/countries/guernsey.py | 331 ++ .../holidays/countries/guinea.py | 182 + .../holidays/countries/guyana.py | 279 + .../site-packages/holidays/countries/haiti.py | 129 + .../holidays/countries/honduras.py | 85 + .../holidays/countries/hongkong.py | 431 ++ .../holidays/countries/hungary.py | 288 + .../holidays/countries/iceland.py | 98 + .../site-packages/holidays/countries/india.py | 627 +++ .../holidays/countries/indonesia.py | 885 +++ .../site-packages/holidays/countries/iran.py | 611 +++ .../holidays/countries/ireland.py | 97 + .../holidays/countries/isle_of_man.py | 69 + .../holidays/countries/israel.py | 152 + .../site-packages/holidays/countries/italy.py | 695 +++ .../holidays/countries/ivory_coast.py | 156 + .../holidays/countries/jamaica.py | 79 + .../site-packages/holidays/countries/japan.py | 261 + .../holidays/countries/jersey.py | 240 + .../holidays/countries/jordan.py | 93 + .../holidays/countries/kazakhstan.py | 318 ++ .../site-packages/holidays/countries/kenya.py | 259 + .../holidays/countries/kuwait.py | 90 + .../holidays/countries/kyrgyzstan.py | 94 + .../site-packages/holidays/countries/laos.py | 388 ++ .../holidays/countries/latvia.py | 124 + .../holidays/countries/lebanon.py | 448 ++ .../holidays/countries/lesotho.py | 92 + .../site-packages/holidays/countries/libya.py | 227 + .../holidays/countries/liechtenstein.py | 112 + .../holidays/countries/lithuania.py | 97 + .../holidays/countries/luxembourg.py | 76 + .../site-packages/holidays/countries/macau.py | 480 ++ .../holidays/countries/madagascar.py | 99 + .../holidays/countries/malawi.py | 68 + .../holidays/countries/malaysia.py | 1029 ++++ .../holidays/countries/maldives.py | 93 + .../site-packages/holidays/countries/mali.py | 151 + .../site-packages/holidays/countries/malta.py | 151 + .../holidays/countries/marshall_islands.py | 105 + .../holidays/countries/martinique.py | 44 + .../holidays/countries/mauritania.py | 77 + .../holidays/countries/mauritius.py | 197 + .../holidays/countries/mayotte.py | 44 + .../holidays/countries/mexico.py | 93 + .../holidays/countries/micronesia.py | 205 + .../holidays/countries/moldova.py | 101 + .../holidays/countries/monaco.py | 93 + .../holidays/countries/mongolia.py | 202 + .../holidays/countries/montenegro.py | 203 + .../holidays/countries/montserrat.py | 177 + .../holidays/countries/morocco.py | 115 + .../holidays/countries/mozambique.py | 72 + .../holidays/countries/namibia.py | 161 + .../site-packages/holidays/countries/nauru.py | 129 + .../site-packages/holidays/countries/nepal.py | 441 ++ .../holidays/countries/netherlands.py | 100 + .../holidays/countries/new_caledonia.py | 43 + .../holidays/countries/new_zealand.py | 306 ++ .../holidays/countries/nicaragua.py | 121 + .../site-packages/holidays/countries/niger.py | 320 ++ .../holidays/countries/nigeria.py | 111 + .../site-packages/holidays/countries/niue.py | 115 + .../holidays/countries/norfolk_island.py | 129 + .../holidays/countries/north_macedonia.py | 320 ++ .../countries/northern_mariana_islands.py | 39 + .../holidays/countries/norway.py | 138 + .../site-packages/holidays/countries/oman.py | 185 + .../holidays/countries/pakistan.py | 204 + .../site-packages/holidays/countries/palau.py | 127 + .../holidays/countries/palestine.py | 177 + .../holidays/countries/panama.py | 119 + .../holidays/countries/papua_new_guinea.py | 179 + .../holidays/countries/paraguay.py | 224 + .../site-packages/holidays/countries/peru.py | 102 + .../holidays/countries/philippines.py | 345 ++ .../holidays/countries/poland.py | 134 + .../holidays/countries/portugal.py | 282 + .../holidays/countries/puerto_rico.py | 39 + .../site-packages/holidays/countries/qatar.py | 172 + .../holidays/countries/reunion.py | 44 + .../holidays/countries/romania.py | 98 + .../holidays/countries/russia.py | 525 ++ .../holidays/countries/saint_barthelemy.py | 43 + .../countries/saint_kitts_and_nevis.py | 183 + .../holidays/countries/saint_lucia.py | 89 + .../holidays/countries/saint_martin.py | 43 + .../countries/saint_pierre_and_miquelon.py | 43 + .../saint_vincent_and_the_grenadines.py | 130 + .../site-packages/holidays/countries/samoa.py | 73 + .../holidays/countries/san_marino.py | 115 + .../countries/sao_tome_and_principe.py | 112 + .../holidays/countries/saudi_arabia.py | 129 + .../holidays/countries/senegal.py | 193 + .../holidays/countries/serbia.py | 80 + .../holidays/countries/seychelles.py | 169 + .../holidays/countries/sierra_leone.py | 149 + .../holidays/countries/singapore.py | 339 ++ .../holidays/countries/sint_maarten.py | 118 + .../holidays/countries/slovakia.py | 119 + .../holidays/countries/slovenia.py | 140 + .../holidays/countries/solomon_islands.py | 220 + .../holidays/countries/south_africa.py | 157 + .../holidays/countries/south_korea.py | 597 +++ .../site-packages/holidays/countries/spain.py | 767 +++ .../holidays/countries/sri_lanka.py | 525 ++ .../holidays/countries/suriname.py | 227 + .../countries/svalbard_and_jan_mayen.py | 41 + .../holidays/countries/sweden.py | 130 + .../holidays/countries/switzerland.py | 559 ++ .../holidays/countries/taiwan.py | 437 ++ .../holidays/countries/tanzania.py | 310 ++ .../holidays/countries/thailand.py | 1126 ++++ .../holidays/countries/timor_leste.py | 509 ++ .../site-packages/holidays/countries/togo.py | 182 + .../holidays/countries/tokelau.py | 66 + .../site-packages/holidays/countries/tonga.py | 231 + .../holidays/countries/trinidad_and_tobago.py | 197 + .../holidays/countries/tunisia.py | 93 + .../holidays/countries/turkey.py | 337 ++ .../countries/turks_and_caicos_islands.py | 134 + .../holidays/countries/tuvalu.py | 175 + .../holidays/countries/ukraine.py | 382 ++ .../countries/united_arab_emirates.py | 247 + .../holidays/countries/united_kingdom.py | 225 + .../holidays/countries/united_states.py | 1426 +++++ .../united_states_minor_outlying_islands.py | 39 + .../countries/united_states_virgin_islands.py | 39 + .../holidays/countries/uruguay.py | 175 + .../holidays/countries/uzbekistan.py | 252 + .../holidays/countries/vanuatu.py | 106 + .../holidays/countries/vatican_city.py | 199 + .../holidays/countries/venezuela.py | 112 + .../holidays/countries/vietnam.py | 180 + .../holidays/countries/wallis_and_futuna.py | 43 + .../site-packages/holidays/countries/yemen.py | 207 + .../holidays/countries/zambia.py | 117 + .../holidays/countries/zimbabwe.py | 87 + .../v1_incompatibility.cpython-312.pyc | Bin 0 -> 1728 bytes .../deprecations/v1_incompatibility.py | 43 + .../holidays/financial/__init__.py | 18 + .../__pycache__/__init__.cpython-312.pyc | Bin 0 -> 667 bytes .../brasil_bolsa_balcao.cpython-312.pyc | Bin 0 -> 5207 bytes .../european_central_bank.cpython-312.pyc | Bin 0 -> 3008 bytes .../ice_futures_europe.cpython-312.pyc | Bin 0 -> 2356 bytes .../ny_stock_exchange.cpython-312.pyc | Bin 0 -> 11551 bytes .../holidays/financial/brasil_bolsa_balcao.py | 109 + .../financial/european_central_bank.py | 66 + .../holidays/financial/ice_futures_europe.py | 45 + .../holidays/financial/ny_stock_exchange.py | 287 + .../site-packages/holidays/groups/__init__.py | 28 + .../__pycache__/__init__.cpython-312.pyc | Bin 0 -> 1207 bytes .../__pycache__/balinese_saka.cpython-312.pyc | Bin 0 -> 1871 bytes .../__pycache__/buddhist.cpython-312.pyc | Bin 0 -> 2672 bytes .../__pycache__/chinese.cpython-312.pyc | Bin 0 -> 13746 bytes .../__pycache__/christian.cpython-312.pyc | Bin 0 -> 22335 bytes .../groups/__pycache__/custom.cpython-312.pyc | Bin 0 -> 1870 bytes .../__pycache__/eastern.cpython-312.pyc | Bin 0 -> 1636 bytes .../groups/__pycache__/hebrew.cpython-312.pyc | Bin 0 -> 6908 bytes .../groups/__pycache__/hindu.cpython-312.pyc | Bin 0 -> 23588 bytes .../__pycache__/international.cpython-312.pyc | Bin 0 -> 9872 bytes .../__pycache__/islamic.cpython-312.pyc | Bin 0 -> 20935 bytes .../__pycache__/mongolian.cpython-312.pyc | Bin 0 -> 4971 bytes .../__pycache__/persian.cpython-312.pyc | Bin 0 -> 8370 bytes .../__pycache__/sinhala.cpython-312.pyc | Bin 0 -> 8985 bytes .../groups/__pycache__/thai.cpython-312.pyc | Bin 0 -> 8580 bytes .../holidays/groups/balinese_saka.py | 45 + .../site-packages/holidays/groups/buddhist.py | 63 + .../site-packages/holidays/groups/chinese.py | 277 + .../holidays/groups/christian.py | 463 ++ .../site-packages/holidays/groups/custom.py | 47 + .../site-packages/holidays/groups/eastern.py | 51 + .../site-packages/holidays/groups/hebrew.py | 151 + .../site-packages/holidays/groups/hindu.py | 481 ++ .../holidays/groups/international.py | 220 + .../site-packages/holidays/groups/islamic.py | 453 ++ .../holidays/groups/mongolian.py | 103 + .../site-packages/holidays/groups/persian.py | 169 + .../site-packages/holidays/groups/sinhala.py | 192 + .../site-packages/holidays/groups/thai.py | 206 + .../site-packages/holidays/helpers.py | 49 + .../site-packages/holidays/holiday_base.py | 1421 +++++ .../python3.12/site-packages/holidays/ical.py | 228 + .../holidays/locale/am/LC_MESSAGES/ET.mo | Bin 0 -> 430 bytes .../holidays/locale/ar/LC_MESSAGES/AE.mo | Bin 0 -> 428 bytes .../holidays/locale/ar/LC_MESSAGES/BH.mo | Bin 0 -> 428 bytes .../holidays/locale/ar/LC_MESSAGES/CA.mo | Bin 0 -> 2509 bytes .../holidays/locale/ar/LC_MESSAGES/DJ.mo | Bin 0 -> 1301 bytes .../holidays/locale/ar/LC_MESSAGES/DZ.mo | Bin 0 -> 428 bytes .../holidays/locale/ar/LC_MESSAGES/EG.mo | Bin 0 -> 428 bytes .../holidays/locale/ar/LC_MESSAGES/ET.mo | Bin 0 -> 1999 bytes .../holidays/locale/ar/LC_MESSAGES/JO.mo | Bin 0 -> 428 bytes .../holidays/locale/ar/LC_MESSAGES/KW.mo | Bin 0 -> 428 bytes .../holidays/locale/ar/LC_MESSAGES/LB.mo | Bin 0 -> 415 bytes .../holidays/locale/ar/LC_MESSAGES/LY.mo | Bin 0 -> 415 bytes .../holidays/locale/ar/LC_MESSAGES/MA.mo | Bin 0 -> 428 bytes .../holidays/locale/ar/LC_MESSAGES/OM.mo | Bin 0 -> 427 bytes .../holidays/locale/ar/LC_MESSAGES/PS.mo | Bin 0 -> 416 bytes .../holidays/locale/ar/LC_MESSAGES/SA.mo | Bin 0 -> 428 bytes .../holidays/locale/ar/LC_MESSAGES/TN.mo | Bin 0 -> 428 bytes .../holidays/locale/ar/LC_MESSAGES/UA.mo | Bin 0 -> 2603 bytes .../holidays/locale/ar/LC_MESSAGES/YE.mo | Bin 0 -> 427 bytes .../holidays/locale/ar_QA/LC_MESSAGES/QA.mo | Bin 0 -> 422 bytes .../holidays/locale/az/LC_MESSAGES/AZ.mo | Bin 0 -> 428 bytes .../holidays/locale/be/LC_MESSAGES/BY.mo | Bin 0 -> 430 bytes .../holidays/locale/bg/LC_MESSAGES/BG.mo | Bin 0 -> 430 bytes .../holidays/locale/bs/LC_MESSAGES/BA.mo | Bin 0 -> 433 bytes .../holidays/locale/ca/LC_MESSAGES/AD.mo | Bin 0 -> 427 bytes .../holidays/locale/cnr/LC_MESSAGES/ME.mo | Bin 0 -> 429 bytes .../holidays/locale/coa_CC/LC_MESSAGES/CC.mo | Bin 0 -> 1376 bytes .../holidays/locale/cs/LC_MESSAGES/CZ.mo | Bin 0 -> 428 bytes .../holidays/locale/da/LC_MESSAGES/DK.mo | Bin 0 -> 430 bytes .../holidays/locale/da/LC_MESSAGES/FO.mo | Bin 0 -> 1165 bytes .../holidays/locale/da/LC_MESSAGES/GL.mo | Bin 0 -> 1163 bytes .../holidays/locale/de/LC_MESSAGES/AT.mo | Bin 0 -> 433 bytes .../holidays/locale/de/LC_MESSAGES/BE.mo | Bin 0 -> 1126 bytes .../holidays/locale/de/LC_MESSAGES/CH.mo | Bin 0 -> 431 bytes .../holidays/locale/de/LC_MESSAGES/CV.mo | Bin 0 -> 3174 bytes .../holidays/locale/de/LC_MESSAGES/DE.mo | Bin 0 -> 433 bytes .../holidays/locale/de/LC_MESSAGES/LI.mo | Bin 0 -> 431 bytes .../holidays/locale/de/LC_MESSAGES/LU.mo | Bin 0 -> 944 bytes .../holidays/locale/de/LC_MESSAGES/PL.mo | Bin 0 -> 1990 bytes .../holidays/locale/el/LC_MESSAGES/CY.mo | Bin 0 -> 430 bytes .../holidays/locale/el/LC_MESSAGES/GR.mo | Bin 0 -> 430 bytes .../holidays/locale/en_AI/LC_MESSAGES/AI.mo | Bin 0 -> 431 bytes .../holidays/locale/en_AU/LC_MESSAGES/AU.mo | Bin 0 -> 435 bytes .../holidays/locale/en_BM/LC_MESSAGES/BM.mo | Bin 0 -> 421 bytes .../holidays/locale/en_BQ/LC_MESSAGES/BQ.mo | Bin 0 -> 1216 bytes .../holidays/locale/en_CA/LC_MESSAGES/CA.mo | Bin 0 -> 436 bytes .../holidays/locale/en_CC/LC_MESSAGES/CC.mo | Bin 0 -> 446 bytes .../holidays/locale/en_CI/LC_MESSAGES/CI.mo | Bin 0 -> 1725 bytes .../holidays/locale/en_CK/LC_MESSAGES/CK.mo | Bin 0 -> 422 bytes .../holidays/locale/en_CX/LC_MESSAGES/CX.mo | Bin 0 -> 437 bytes .../holidays/locale/en_CY/LC_MESSAGES/CY.mo | Bin 0 -> 1669 bytes .../holidays/locale/en_ET/LC_MESSAGES/ET.mo | Bin 0 -> 1734 bytes .../holidays/locale/en_FM/LC_MESSAGES/FM.mo | Bin 0 -> 421 bytes .../holidays/locale/en_GB/LC_MESSAGES/FK.mo | Bin 0 -> 420 bytes .../holidays/locale/en_GB/LC_MESSAGES/GB.mo | Bin 0 -> 435 bytes .../holidays/locale/en_GB/LC_MESSAGES/GI.mo | Bin 0 -> 422 bytes .../holidays/locale/en_GB/LC_MESSAGES/IM.mo | Bin 0 -> 435 bytes .../holidays/locale/en_GB/LC_MESSAGES/KY.mo | Bin 0 -> 420 bytes .../holidays/locale/en_GB/LC_MESSAGES/TV.mo | Bin 0 -> 1494 bytes .../holidays/locale/en_GD/LC_MESSAGES/GD.mo | Bin 0 -> 421 bytes .../holidays/locale/en_GY/LC_MESSAGES/GY.mo | Bin 0 -> 421 bytes .../holidays/locale/en_HK/LC_MESSAGES/HK.mo | Bin 0 -> 3464 bytes .../holidays/locale/en_IN/LC_MESSAGES/IN.mo | Bin 0 -> 450 bytes .../holidays/locale/en_KE/LC_MESSAGES/KE.mo | Bin 0 -> 433 bytes .../holidays/locale/en_LC/LC_MESSAGES/LC.mo | Bin 0 -> 431 bytes .../holidays/locale/en_MO/LC_MESSAGES/MO.mo | Bin 0 -> 4339 bytes .../holidays/locale/en_MS/LC_MESSAGES/MS.mo | Bin 0 -> 422 bytes .../holidays/locale/en_MU/LC_MESSAGES/MU.mo | Bin 0 -> 421 bytes .../holidays/locale/en_NA/LC_MESSAGES/NA.mo | Bin 0 -> 409 bytes .../holidays/locale/en_NF/LC_MESSAGES/NF.mo | Bin 0 -> 413 bytes .../holidays/locale/en_NR/LC_MESSAGES/NR.mo | Bin 0 -> 423 bytes .../holidays/locale/en_NU/LC_MESSAGES/NU.mo | Bin 0 -> 420 bytes .../holidays/locale/en_PH/LC_MESSAGES/PH.mo | Bin 0 -> 435 bytes .../holidays/locale/en_PK/LC_MESSAGES/PK.mo | Bin 0 -> 446 bytes .../holidays/locale/en_SC/LC_MESSAGES/SC.mo | Bin 0 -> 438 bytes .../holidays/locale/en_SG/LC_MESSAGES/SG.mo | Bin 0 -> 435 bytes .../holidays/locale/en_SL/LC_MESSAGES/SL.mo | Bin 0 -> 1162 bytes .../holidays/locale/en_TC/LC_MESSAGES/TC.mo | Bin 0 -> 416 bytes .../holidays/locale/en_TK/LC_MESSAGES/TK.mo | Bin 0 -> 413 bytes .../holidays/locale/en_TL/LC_MESSAGES/TL.mo | Bin 0 -> 2987 bytes .../holidays/locale/en_TT/LC_MESSAGES/TT.mo | Bin 0 -> 423 bytes .../holidays/locale/en_US/LC_MESSAGES/AD.mo | Bin 0 -> 1944 bytes .../holidays/locale/en_US/LC_MESSAGES/AE.mo | Bin 0 -> 1320 bytes .../holidays/locale/en_US/LC_MESSAGES/AF.mo | Bin 0 -> 1372 bytes .../holidays/locale/en_US/LC_MESSAGES/AI.mo | Bin 0 -> 1784 bytes .../holidays/locale/en_US/LC_MESSAGES/AL.mo | Bin 0 -> 1572 bytes .../holidays/locale/en_US/LC_MESSAGES/AM.mo | Bin 0 -> 1536 bytes .../holidays/locale/en_US/LC_MESSAGES/AO.mo | Bin 0 -> 1892 bytes .../holidays/locale/en_US/LC_MESSAGES/AR.mo | Bin 0 -> 7790 bytes .../holidays/locale/en_US/LC_MESSAGES/AS.mo | Bin 0 -> 435 bytes .../holidays/locale/en_US/LC_MESSAGES/AT.mo | Bin 0 -> 1451 bytes .../holidays/locale/en_US/LC_MESSAGES/AU.mo | Bin 0 -> 2288 bytes .../holidays/locale/en_US/LC_MESSAGES/AW.mo | Bin 0 -> 1156 bytes .../holidays/locale/en_US/LC_MESSAGES/AX.mo | Bin 0 -> 436 bytes .../holidays/locale/en_US/LC_MESSAGES/AZ.mo | Bin 0 -> 2030 bytes .../holidays/locale/en_US/LC_MESSAGES/BA.mo | Bin 0 -> 1721 bytes .../holidays/locale/en_US/LC_MESSAGES/BE.mo | Bin 0 -> 1118 bytes .../holidays/locale/en_US/LC_MESSAGES/BG.mo | Bin 0 -> 1801 bytes .../holidays/locale/en_US/LC_MESSAGES/BH.mo | Bin 0 -> 1090 bytes .../holidays/locale/en_US/LC_MESSAGES/BJ.mo | Bin 0 -> 1630 bytes .../holidays/locale/en_US/LC_MESSAGES/BL.mo | Bin 0 -> 432 bytes .../holidays/locale/en_US/LC_MESSAGES/BM.mo | Bin 0 -> 1338 bytes .../holidays/locale/en_US/LC_MESSAGES/BN.mo | Bin 0 -> 1681 bytes .../holidays/locale/en_US/LC_MESSAGES/BO.mo | Bin 0 -> 1665 bytes .../holidays/locale/en_US/LC_MESSAGES/BQ.mo | Bin 0 -> 1215 bytes .../holidays/locale/en_US/LC_MESSAGES/BR.mo | Bin 0 -> 4213 bytes .../holidays/locale/en_US/LC_MESSAGES/BVMF.mo | Bin 0 -> 1142 bytes .../holidays/locale/en_US/LC_MESSAGES/BY.mo | Bin 0 -> 2376 bytes .../holidays/locale/en_US/LC_MESSAGES/CA.mo | Bin 0 -> 2130 bytes .../holidays/locale/en_US/LC_MESSAGES/CC.mo | Bin 0 -> 1364 bytes .../holidays/locale/en_US/LC_MESSAGES/CD.mo | Bin 0 -> 1861 bytes .../holidays/locale/en_US/LC_MESSAGES/CF.mo | Bin 0 -> 1141 bytes .../holidays/locale/en_US/LC_MESSAGES/CG.mo | Bin 0 -> 892 bytes .../holidays/locale/en_US/LC_MESSAGES/CH.mo | Bin 0 -> 1598 bytes .../holidays/locale/en_US/LC_MESSAGES/CI.mo | Bin 0 -> 1735 bytes .../holidays/locale/en_US/LC_MESSAGES/CK.mo | Bin 0 -> 1615 bytes .../holidays/locale/en_US/LC_MESSAGES/CL.mo | Bin 0 -> 2104 bytes .../holidays/locale/en_US/LC_MESSAGES/CN.mo | Bin 0 -> 1431 bytes .../holidays/locale/en_US/LC_MESSAGES/CO.mo | Bin 0 -> 1393 bytes .../holidays/locale/en_US/LC_MESSAGES/CR.mo | Bin 0 -> 1327 bytes .../holidays/locale/en_US/LC_MESSAGES/CU.mo | Bin 0 -> 1060 bytes .../holidays/locale/en_US/LC_MESSAGES/CV.mo | Bin 0 -> 3187 bytes .../holidays/locale/en_US/LC_MESSAGES/CW.mo | Bin 0 -> 1257 bytes .../holidays/locale/en_US/LC_MESSAGES/CX.mo | Bin 0 -> 1171 bytes .../holidays/locale/en_US/LC_MESSAGES/CY.mo | Bin 0 -> 1680 bytes .../holidays/locale/en_US/LC_MESSAGES/CZ.mo | Bin 0 -> 1583 bytes .../holidays/locale/en_US/LC_MESSAGES/DE.mo | Bin 0 -> 1897 bytes .../holidays/locale/en_US/LC_MESSAGES/DJ.mo | Bin 0 -> 1162 bytes .../holidays/locale/en_US/LC_MESSAGES/DK.mo | Bin 0 -> 1102 bytes .../holidays/locale/en_US/LC_MESSAGES/DO.mo | Bin 0 -> 1045 bytes .../holidays/locale/en_US/LC_MESSAGES/DZ.mo | Bin 0 -> 1170 bytes .../holidays/locale/en_US/LC_MESSAGES/EC.mo | Bin 0 -> 1014 bytes .../holidays/locale/en_US/LC_MESSAGES/EE.mo | Bin 0 -> 1009 bytes .../holidays/locale/en_US/LC_MESSAGES/EG.mo | Bin 0 -> 1592 bytes .../holidays/locale/en_US/LC_MESSAGES/ES.mo | Bin 0 -> 3289 bytes .../holidays/locale/en_US/LC_MESSAGES/ET.mo | Bin 0 -> 1722 bytes .../holidays/locale/en_US/LC_MESSAGES/FI.mo | Bin 0 -> 2995 bytes .../holidays/locale/en_US/LC_MESSAGES/FK.mo | Bin 0 -> 1193 bytes .../holidays/locale/en_US/LC_MESSAGES/FM.mo | Bin 0 -> 1783 bytes .../holidays/locale/en_US/LC_MESSAGES/FO.mo | Bin 0 -> 1219 bytes .../holidays/locale/en_US/LC_MESSAGES/FR.mo | Bin 0 -> 1735 bytes .../holidays/locale/en_US/LC_MESSAGES/GB.mo | Bin 0 -> 1851 bytes .../holidays/locale/en_US/LC_MESSAGES/GD.mo | Bin 0 -> 1218 bytes .../holidays/locale/en_US/LC_MESSAGES/GE.mo | Bin 0 -> 1877 bytes .../holidays/locale/en_US/LC_MESSAGES/GF.mo | Bin 0 -> 432 bytes .../holidays/locale/en_US/LC_MESSAGES/GI.mo | Bin 0 -> 1714 bytes .../holidays/locale/en_US/LC_MESSAGES/GL.mo | Bin 0 -> 1186 bytes .../holidays/locale/en_US/LC_MESSAGES/GN.mo | Bin 0 -> 1383 bytes .../holidays/locale/en_US/LC_MESSAGES/GP.mo | Bin 0 -> 432 bytes .../holidays/locale/en_US/LC_MESSAGES/GQ.mo | Bin 0 -> 1434 bytes .../holidays/locale/en_US/LC_MESSAGES/GR.mo | Bin 0 -> 1426 bytes .../holidays/locale/en_US/LC_MESSAGES/GT.mo | Bin 0 -> 958 bytes .../holidays/locale/en_US/LC_MESSAGES/GU.mo | Bin 0 -> 435 bytes .../holidays/locale/en_US/LC_MESSAGES/GY.mo | Bin 0 -> 1311 bytes .../holidays/locale/en_US/LC_MESSAGES/HK.mo | Bin 0 -> 3352 bytes .../holidays/locale/en_US/LC_MESSAGES/HN.mo | Bin 0 -> 1000 bytes .../holidays/locale/en_US/LC_MESSAGES/HR.mo | Bin 0 -> 1392 bytes .../holidays/locale/en_US/LC_MESSAGES/HT.mo | Bin 0 -> 1897 bytes .../holidays/locale/en_US/LC_MESSAGES/HU.mo | Bin 0 -> 1398 bytes .../holidays/locale/en_US/LC_MESSAGES/ID.mo | Bin 0 -> 2881 bytes .../holidays/locale/en_US/LC_MESSAGES/IL.mo | Bin 0 -> 1399 bytes .../holidays/locale/en_US/LC_MESSAGES/IM.mo | Bin 0 -> 673 bytes .../holidays/locale/en_US/LC_MESSAGES/IN.mo | Bin 0 -> 4110 bytes .../holidays/locale/en_US/LC_MESSAGES/IR.mo | Bin 0 -> 2564 bytes .../holidays/locale/en_US/LC_MESSAGES/IS.mo | Bin 0 -> 1250 bytes .../holidays/locale/en_US/LC_MESSAGES/JO.mo | Bin 0 -> 1176 bytes .../holidays/locale/en_US/LC_MESSAGES/JP.mo | Bin 0 -> 1695 bytes .../holidays/locale/en_US/LC_MESSAGES/KE.mo | Bin 0 -> 1796 bytes .../holidays/locale/en_US/LC_MESSAGES/KH.mo | Bin 0 -> 4237 bytes .../holidays/locale/en_US/LC_MESSAGES/KR.mo | Bin 0 -> 3607 bytes .../holidays/locale/en_US/LC_MESSAGES/KW.mo | Bin 0 -> 1112 bytes .../holidays/locale/en_US/LC_MESSAGES/KY.mo | Bin 0 -> 1563 bytes .../holidays/locale/en_US/LC_MESSAGES/KZ.mo | Bin 0 -> 1834 bytes .../holidays/locale/en_US/LC_MESSAGES/LA.mo | Bin 0 -> 4096 bytes .../holidays/locale/en_US/LC_MESSAGES/LB.mo | Bin 0 -> 2505 bytes .../holidays/locale/en_US/LC_MESSAGES/LC.mo | Bin 0 -> 1056 bytes .../holidays/locale/en_US/LC_MESSAGES/LI.mo | Bin 0 -> 1408 bytes .../holidays/locale/en_US/LC_MESSAGES/LK.mo | Bin 0 -> 4183 bytes .../holidays/locale/en_US/LC_MESSAGES/LT.mo | Bin 0 -> 1501 bytes .../holidays/locale/en_US/LC_MESSAGES/LU.mo | Bin 0 -> 935 bytes .../holidays/locale/en_US/LC_MESSAGES/LV.mo | Bin 0 -> 1704 bytes .../holidays/locale/en_US/LC_MESSAGES/LY.mo | Bin 0 -> 2067 bytes .../holidays/locale/en_US/LC_MESSAGES/MA.mo | Bin 0 -> 1375 bytes .../holidays/locale/en_US/LC_MESSAGES/MC.mo | Bin 0 -> 1099 bytes .../holidays/locale/en_US/LC_MESSAGES/MD.mo | Bin 0 -> 1444 bytes .../holidays/locale/en_US/LC_MESSAGES/ME.mo | Bin 0 -> 1221 bytes .../holidays/locale/en_US/LC_MESSAGES/MF.mo | Bin 0 -> 432 bytes .../holidays/locale/en_US/LC_MESSAGES/MG.mo | Bin 0 -> 1230 bytes .../holidays/locale/en_US/LC_MESSAGES/MK.mo | Bin 0 -> 2493 bytes .../holidays/locale/en_US/LC_MESSAGES/ML.mo | Bin 0 -> 1214 bytes .../holidays/locale/en_US/LC_MESSAGES/MN.mo | Bin 0 -> 2691 bytes .../holidays/locale/en_US/LC_MESSAGES/MO.mo | Bin 0 -> 4213 bytes .../holidays/locale/en_US/LC_MESSAGES/MP.mo | Bin 0 -> 435 bytes .../holidays/locale/en_US/LC_MESSAGES/MQ.mo | Bin 0 -> 432 bytes .../holidays/locale/en_US/LC_MESSAGES/MS.mo | Bin 0 -> 1443 bytes .../holidays/locale/en_US/LC_MESSAGES/MT.mo | Bin 0 -> 1221 bytes .../holidays/locale/en_US/LC_MESSAGES/MU.mo | Bin 0 -> 1343 bytes .../holidays/locale/en_US/LC_MESSAGES/MX.mo | Bin 0 -> 883 bytes .../holidays/locale/en_US/LC_MESSAGES/MY.mo | Bin 0 -> 4353 bytes .../holidays/locale/en_US/LC_MESSAGES/MZ.mo | Bin 0 -> 1053 bytes .../holidays/locale/en_US/LC_MESSAGES/NA.mo | Bin 0 -> 1807 bytes .../holidays/locale/en_US/LC_MESSAGES/NC.mo | Bin 0 -> 432 bytes .../holidays/locale/en_US/LC_MESSAGES/NE.mo | Bin 0 -> 1586 bytes .../holidays/locale/en_US/LC_MESSAGES/NF.mo | Bin 0 -> 1127 bytes .../holidays/locale/en_US/LC_MESSAGES/NI.mo | Bin 0 -> 1056 bytes .../holidays/locale/en_US/LC_MESSAGES/NL.mo | Bin 0 -> 980 bytes .../holidays/locale/en_US/LC_MESSAGES/NO.mo | Bin 0 -> 1025 bytes .../holidays/locale/en_US/LC_MESSAGES/NR.mo | Bin 0 -> 1255 bytes .../holidays/locale/en_US/LC_MESSAGES/NU.mo | Bin 0 -> 1170 bytes .../holidays/locale/en_US/LC_MESSAGES/OM.mo | Bin 0 -> 947 bytes .../holidays/locale/en_US/LC_MESSAGES/PA.mo | Bin 0 -> 1361 bytes .../holidays/locale/en_US/LC_MESSAGES/PE.mo | Bin 0 -> 1399 bytes .../holidays/locale/en_US/LC_MESSAGES/PF.mo | Bin 0 -> 432 bytes .../holidays/locale/en_US/LC_MESSAGES/PH.mo | Bin 0 -> 1810 bytes .../holidays/locale/en_US/LC_MESSAGES/PK.mo | Bin 0 -> 978 bytes .../holidays/locale/en_US/LC_MESSAGES/PL.mo | Bin 0 -> 1949 bytes .../holidays/locale/en_US/LC_MESSAGES/PM.mo | Bin 0 -> 432 bytes .../holidays/locale/en_US/LC_MESSAGES/PR.mo | Bin 0 -> 435 bytes .../holidays/locale/en_US/LC_MESSAGES/PS.mo | Bin 0 -> 1742 bytes .../holidays/locale/en_US/LC_MESSAGES/PT.mo | Bin 0 -> 2906 bytes .../holidays/locale/en_US/LC_MESSAGES/PY.mo | Bin 0 -> 1296 bytes .../holidays/locale/en_US/LC_MESSAGES/QA.mo | Bin 0 -> 919 bytes .../holidays/locale/en_US/LC_MESSAGES/RE.mo | Bin 0 -> 432 bytes .../holidays/locale/en_US/LC_MESSAGES/RO.mo | Bin 0 -> 1058 bytes .../holidays/locale/en_US/LC_MESSAGES/RS.mo | Bin 0 -> 1022 bytes .../holidays/locale/en_US/LC_MESSAGES/RU.mo | Bin 0 -> 1846 bytes .../holidays/locale/en_US/LC_MESSAGES/SA.mo | Bin 0 -> 946 bytes .../holidays/locale/en_US/LC_MESSAGES/SC.mo | Bin 0 -> 1642 bytes .../holidays/locale/en_US/LC_MESSAGES/SE.mo | Bin 0 -> 1297 bytes .../holidays/locale/en_US/LC_MESSAGES/SG.mo | Bin 0 -> 1191 bytes .../holidays/locale/en_US/LC_MESSAGES/SI.mo | Bin 0 -> 1817 bytes .../holidays/locale/en_US/LC_MESSAGES/SJ.mo | Bin 0 -> 432 bytes .../holidays/locale/en_US/LC_MESSAGES/SK.mo | Bin 0 -> 1821 bytes .../holidays/locale/en_US/LC_MESSAGES/SL.mo | Bin 0 -> 1145 bytes .../holidays/locale/en_US/LC_MESSAGES/SM.mo | Bin 0 -> 1647 bytes .../holidays/locale/en_US/LC_MESSAGES/SN.mo | Bin 0 -> 1393 bytes .../holidays/locale/en_US/LC_MESSAGES/SR.mo | Bin 0 -> 1398 bytes .../holidays/locale/en_US/LC_MESSAGES/ST.mo | Bin 0 -> 1137 bytes .../holidays/locale/en_US/LC_MESSAGES/SV.mo | Bin 0 -> 1033 bytes .../holidays/locale/en_US/LC_MESSAGES/SX.mo | Bin 0 -> 1157 bytes .../holidays/locale/en_US/LC_MESSAGES/TC.mo | Bin 0 -> 1192 bytes .../holidays/locale/en_US/LC_MESSAGES/TF.mo | Bin 0 -> 433 bytes .../holidays/locale/en_US/LC_MESSAGES/TG.mo | Bin 0 -> 1239 bytes .../holidays/locale/en_US/LC_MESSAGES/TH.mo | Bin 0 -> 10651 bytes .../holidays/locale/en_US/LC_MESSAGES/TK.mo | Bin 0 -> 667 bytes .../holidays/locale/en_US/LC_MESSAGES/TL.mo | Bin 0 -> 3020 bytes .../holidays/locale/en_US/LC_MESSAGES/TN.mo | Bin 0 -> 1335 bytes .../holidays/locale/en_US/LC_MESSAGES/TO.mo | Bin 0 -> 1584 bytes .../holidays/locale/en_US/LC_MESSAGES/TR.mo | Bin 0 -> 1322 bytes .../holidays/locale/en_US/LC_MESSAGES/TT.mo | Bin 0 -> 1336 bytes .../holidays/locale/en_US/LC_MESSAGES/TV.mo | Bin 0 -> 1494 bytes .../holidays/locale/en_US/LC_MESSAGES/TW.mo | Bin 0 -> 2295 bytes .../holidays/locale/en_US/LC_MESSAGES/TZ.mo | Bin 0 -> 1796 bytes .../holidays/locale/en_US/LC_MESSAGES/UA.mo | Bin 0 -> 2353 bytes .../holidays/locale/en_US/LC_MESSAGES/UM.mo | Bin 0 -> 435 bytes .../holidays/locale/en_US/LC_MESSAGES/US.mo | Bin 0 -> 435 bytes .../holidays/locale/en_US/LC_MESSAGES/UY.mo | Bin 0 -> 1664 bytes .../holidays/locale/en_US/LC_MESSAGES/UZ.mo | Bin 0 -> 1358 bytes .../holidays/locale/en_US/LC_MESSAGES/VA.mo | Bin 0 -> 2264 bytes .../holidays/locale/en_US/LC_MESSAGES/VC.mo | Bin 0 -> 1195 bytes .../holidays/locale/en_US/LC_MESSAGES/VE.mo | Bin 0 -> 1324 bytes .../holidays/locale/en_US/LC_MESSAGES/VG.mo | Bin 0 -> 1868 bytes .../holidays/locale/en_US/LC_MESSAGES/VI.mo | Bin 0 -> 435 bytes .../holidays/locale/en_US/LC_MESSAGES/VN.mo | Bin 0 -> 1443 bytes .../holidays/locale/en_US/LC_MESSAGES/WF.mo | Bin 0 -> 432 bytes .../holidays/locale/en_US/LC_MESSAGES/YE.mo | Bin 0 -> 1330 bytes .../holidays/locale/en_US/LC_MESSAGES/YT.mo | Bin 0 -> 432 bytes .../holidays/locale/en_VC/LC_MESSAGES/VC.mo | Bin 0 -> 441 bytes .../holidays/locale/en_VG/LC_MESSAGES/VG.mo | Bin 0 -> 421 bytes .../holidays/locale/es/LC_MESSAGES/AR.mo | Bin 0 -> 430 bytes .../holidays/locale/es/LC_MESSAGES/BO.mo | Bin 0 -> 430 bytes .../holidays/locale/es/LC_MESSAGES/CL.mo | Bin 0 -> 433 bytes .../holidays/locale/es/LC_MESSAGES/CO.mo | Bin 0 -> 430 bytes .../holidays/locale/es/LC_MESSAGES/CR.mo | Bin 0 -> 431 bytes .../holidays/locale/es/LC_MESSAGES/CU.mo | Bin 0 -> 433 bytes .../holidays/locale/es/LC_MESSAGES/CV.mo | Bin 0 -> 3400 bytes .../holidays/locale/es/LC_MESSAGES/DO.mo | Bin 0 -> 433 bytes .../holidays/locale/es/LC_MESSAGES/EC.mo | Bin 0 -> 433 bytes .../holidays/locale/es/LC_MESSAGES/ES.mo | Bin 0 -> 428 bytes .../holidays/locale/es/LC_MESSAGES/GQ.mo | Bin 0 -> 414 bytes .../holidays/locale/es/LC_MESSAGES/GT.mo | Bin 0 -> 437 bytes .../holidays/locale/es/LC_MESSAGES/HN.mo | Bin 0 -> 433 bytes .../holidays/locale/es/LC_MESSAGES/HT.mo | Bin 0 -> 1989 bytes .../holidays/locale/es/LC_MESSAGES/MX.mo | Bin 0 -> 433 bytes .../holidays/locale/es/LC_MESSAGES/NI.mo | Bin 0 -> 431 bytes .../holidays/locale/es/LC_MESSAGES/PA.mo | Bin 0 -> 427 bytes .../holidays/locale/es/LC_MESSAGES/PE.mo | Bin 0 -> 430 bytes .../holidays/locale/es/LC_MESSAGES/PY.mo | Bin 0 -> 433 bytes .../holidays/locale/es/LC_MESSAGES/SV.mo | Bin 0 -> 427 bytes .../holidays/locale/es/LC_MESSAGES/UY.mo | Bin 0 -> 433 bytes .../holidays/locale/es/LC_MESSAGES/VE.mo | Bin 0 -> 433 bytes .../holidays/locale/et/LC_MESSAGES/EE.mo | Bin 0 -> 430 bytes .../holidays/locale/fa_AF/LC_MESSAGES/AF.mo | Bin 0 -> 430 bytes .../holidays/locale/fa_IR/LC_MESSAGES/IR.mo | Bin 0 -> 434 bytes .../holidays/locale/fi/LC_MESSAGES/AX.mo | Bin 0 -> 433 bytes .../holidays/locale/fi/LC_MESSAGES/FI.mo | Bin 0 -> 433 bytes .../holidays/locale/fi/LC_MESSAGES/GL.mo | Bin 0 -> 1222 bytes .../holidays/locale/fil/LC_MESSAGES/PH.mo | Bin 0 -> 1960 bytes .../holidays/locale/fo/LC_MESSAGES/FO.mo | Bin 0 -> 403 bytes .../holidays/locale/fr/LC_MESSAGES/BE.mo | Bin 0 -> 1129 bytes .../holidays/locale/fr/LC_MESSAGES/BL.mo | Bin 0 -> 429 bytes .../holidays/locale/fr/LC_MESSAGES/CA.mo | Bin 0 -> 2317 bytes .../holidays/locale/fr/LC_MESSAGES/CD.mo | Bin 0 -> 425 bytes .../holidays/locale/fr/LC_MESSAGES/CF.mo | Bin 0 -> 425 bytes .../holidays/locale/fr/LC_MESSAGES/CG.mo | Bin 0 -> 429 bytes .../holidays/locale/fr/LC_MESSAGES/CH.mo | Bin 0 -> 1622 bytes .../holidays/locale/fr/LC_MESSAGES/CI.mo | Bin 0 -> 415 bytes .../holidays/locale/fr/LC_MESSAGES/CV.mo | Bin 0 -> 3615 bytes .../holidays/locale/fr/LC_MESSAGES/DJ.mo | Bin 0 -> 430 bytes .../holidays/locale/fr/LC_MESSAGES/DZ.mo | Bin 0 -> 1249 bytes .../holidays/locale/fr/LC_MESSAGES/FR.mo | Bin 0 -> 430 bytes .../holidays/locale/fr/LC_MESSAGES/GF.mo | Bin 0 -> 429 bytes .../holidays/locale/fr/LC_MESSAGES/GN.mo | Bin 0 -> 415 bytes .../holidays/locale/fr/LC_MESSAGES/GP.mo | Bin 0 -> 429 bytes .../holidays/locale/fr/LC_MESSAGES/LU.mo | Bin 0 -> 933 bytes .../holidays/locale/fr/LC_MESSAGES/MA.mo | Bin 0 -> 1458 bytes .../holidays/locale/fr/LC_MESSAGES/MC.mo | Bin 0 -> 430 bytes .../holidays/locale/fr/LC_MESSAGES/MF.mo | Bin 0 -> 429 bytes .../holidays/locale/fr/LC_MESSAGES/ML.mo | Bin 0 -> 415 bytes .../holidays/locale/fr/LC_MESSAGES/MQ.mo | Bin 0 -> 429 bytes .../holidays/locale/fr/LC_MESSAGES/NC.mo | Bin 0 -> 429 bytes .../holidays/locale/fr/LC_MESSAGES/PF.mo | Bin 0 -> 429 bytes .../holidays/locale/fr/LC_MESSAGES/PM.mo | Bin 0 -> 429 bytes .../holidays/locale/fr/LC_MESSAGES/RE.mo | Bin 0 -> 429 bytes .../holidays/locale/fr/LC_MESSAGES/TF.mo | Bin 0 -> 430 bytes .../holidays/locale/fr/LC_MESSAGES/TG.mo | Bin 0 -> 415 bytes .../holidays/locale/fr/LC_MESSAGES/WF.mo | Bin 0 -> 429 bytes .../holidays/locale/fr/LC_MESSAGES/YT.mo | Bin 0 -> 429 bytes .../holidays/locale/fr_BJ/LC_MESSAGES/BJ.mo | Bin 0 -> 422 bytes .../holidays/locale/fr_HT/LC_MESSAGES/HT.mo | Bin 0 -> 437 bytes .../holidays/locale/fr_NE/LC_MESSAGES/NE.mo | Bin 0 -> 420 bytes .../holidays/locale/fr_SN/LC_MESSAGES/SN.mo | Bin 0 -> 422 bytes .../holidays/locale/fy/LC_MESSAGES/NL.mo | Bin 0 -> 966 bytes .../holidays/locale/he/LC_MESSAGES/IL.mo | Bin 0 -> 428 bytes .../holidays/locale/hi/LC_MESSAGES/IN.mo | Bin 0 -> 5778 bytes .../holidays/locale/hr/LC_MESSAGES/HR.mo | Bin 0 -> 428 bytes .../holidays/locale/ht/LC_MESSAGES/HT.mo | Bin 0 -> 1832 bytes .../holidays/locale/hu/LC_MESSAGES/HU.mo | Bin 0 -> 430 bytes .../holidays/locale/hy/LC_MESSAGES/AM.mo | Bin 0 -> 430 bytes .../holidays/locale/id/LC_MESSAGES/ID.mo | Bin 0 -> 430 bytes .../holidays/locale/is/LC_MESSAGES/FO.mo | Bin 0 -> 1213 bytes .../holidays/locale/is/LC_MESSAGES/GL.mo | Bin 0 -> 1206 bytes .../holidays/locale/is/LC_MESSAGES/IS.mo | Bin 0 -> 431 bytes .../holidays/locale/it/LC_MESSAGES/CH.mo | Bin 0 -> 1630 bytes .../holidays/locale/it/LC_MESSAGES/SM.mo | Bin 0 -> 403 bytes .../holidays/locale/it/LC_MESSAGES/VA.mo | Bin 0 -> 429 bytes .../holidays/locale/ja/LC_MESSAGES/JP.mo | Bin 0 -> 430 bytes .../holidays/locale/ka/LC_MESSAGES/GE.mo | Bin 0 -> 432 bytes .../holidays/locale/kk/LC_MESSAGES/KZ.mo | Bin 0 -> 427 bytes .../holidays/locale/kl/LC_MESSAGES/GL.mo | Bin 0 -> 427 bytes .../holidays/locale/km/LC_MESSAGES/KH.mo | Bin 0 -> 402 bytes .../holidays/locale/ko/LC_MESSAGES/KR.mo | Bin 0 -> 430 bytes .../holidays/locale/lb/LC_MESSAGES/LU.mo | Bin 0 -> 430 bytes .../holidays/locale/lo/LC_MESSAGES/LA.mo | Bin 0 -> 400 bytes .../holidays/locale/lt/LC_MESSAGES/LT.mo | Bin 0 -> 430 bytes .../holidays/locale/lv/LC_MESSAGES/LV.mo | Bin 0 -> 430 bytes .../holidays/locale/mg/LC_MESSAGES/MG.mo | Bin 0 -> 433 bytes .../holidays/locale/mk/LC_MESSAGES/MK.mo | Bin 0 -> 427 bytes .../holidays/locale/mn/LC_MESSAGES/MN.mo | Bin 0 -> 446 bytes .../holidays/locale/ms/LC_MESSAGES/BN.mo | Bin 0 -> 402 bytes .../holidays/locale/ms_MY/LC_MESSAGES/MY.mo | Bin 0 -> 435 bytes .../holidays/locale/mt/LC_MESSAGES/MT.mo | Bin 0 -> 383 bytes .../holidays/locale/nl/LC_MESSAGES/AW.mo | Bin 0 -> 1153 bytes .../holidays/locale/nl/LC_MESSAGES/BE.mo | Bin 0 -> 430 bytes .../holidays/locale/nl/LC_MESSAGES/BQ.mo | Bin 0 -> 425 bytes .../holidays/locale/nl/LC_MESSAGES/CW.mo | Bin 0 -> 1285 bytes .../holidays/locale/nl/LC_MESSAGES/NL.mo | Bin 0 -> 433 bytes .../holidays/locale/nl/LC_MESSAGES/SR.mo | Bin 0 -> 415 bytes .../holidays/locale/nl/LC_MESSAGES/SX.mo | Bin 0 -> 413 bytes .../holidays/locale/no/LC_MESSAGES/FO.mo | Bin 0 -> 1188 bytes .../holidays/locale/no/LC_MESSAGES/GL.mo | Bin 0 -> 1192 bytes .../holidays/locale/no/LC_MESSAGES/NO.mo | Bin 0 -> 433 bytes .../holidays/locale/no/LC_MESSAGES/SJ.mo | Bin 0 -> 429 bytes .../holidays/locale/pap_AW/LC_MESSAGES/AW.mo | Bin 0 -> 422 bytes .../holidays/locale/pap_BQ/LC_MESSAGES/BQ.mo | Bin 0 -> 1249 bytes .../holidays/locale/pap_CW/LC_MESSAGES/CW.mo | Bin 0 -> 441 bytes .../holidays/locale/pl/LC_MESSAGES/PL.mo | Bin 0 -> 428 bytes .../holidays/locale/ps_AF/LC_MESSAGES/AF.mo | Bin 0 -> 1577 bytes .../holidays/locale/pt_AO/LC_MESSAGES/AO.mo | Bin 0 -> 436 bytes .../holidays/locale/pt_BR/LC_MESSAGES/BR.mo | Bin 0 -> 433 bytes .../holidays/locale/pt_BR/LC_MESSAGES/BVMF.mo | Bin 0 -> 433 bytes .../holidays/locale/pt_CV/LC_MESSAGES/CV.mo | Bin 0 -> 431 bytes .../holidays/locale/pt_MO/LC_MESSAGES/MO.mo | Bin 0 -> 4427 bytes .../holidays/locale/pt_MZ/LC_MESSAGES/MZ.mo | Bin 0 -> 436 bytes .../holidays/locale/pt_PT/LC_MESSAGES/PT.mo | Bin 0 -> 441 bytes .../holidays/locale/pt_ST/LC_MESSAGES/ST.mo | Bin 0 -> 422 bytes .../holidays/locale/pt_TL/LC_MESSAGES/TL.mo | Bin 0 -> 436 bytes .../holidays/locale/ro/LC_MESSAGES/MD.mo | Bin 0 -> 433 bytes .../holidays/locale/ro/LC_MESSAGES/RO.mo | Bin 0 -> 433 bytes .../holidays/locale/ru/LC_MESSAGES/BY.mo | Bin 0 -> 2767 bytes .../holidays/locale/ru/LC_MESSAGES/RU.mo | Bin 0 -> 430 bytes .../holidays/locale/si_LK/LC_MESSAGES/LK.mo | Bin 0 -> 435 bytes .../holidays/locale/sk/LC_MESSAGES/CZ.mo | Bin 0 -> 1668 bytes .../holidays/locale/sk/LC_MESSAGES/SK.mo | Bin 0 -> 433 bytes .../holidays/locale/sl/LC_MESSAGES/SI.mo | Bin 0 -> 428 bytes .../holidays/locale/sq/LC_MESSAGES/AL.mo | Bin 0 -> 427 bytes .../holidays/locale/sr/LC_MESSAGES/BA.mo | Bin 0 -> 2216 bytes .../holidays/locale/sr/LC_MESSAGES/RS.mo | Bin 0 -> 430 bytes .../holidays/locale/sv/LC_MESSAGES/FO.mo | Bin 0 -> 1179 bytes .../holidays/locale/sv/LC_MESSAGES/GL.mo | Bin 0 -> 1178 bytes .../holidays/locale/sv/LC_MESSAGES/SE.mo | Bin 0 -> 433 bytes .../holidays/locale/sv_FI/LC_MESSAGES/AX.mo | Bin 0 -> 436 bytes .../holidays/locale/sv_FI/LC_MESSAGES/FI.mo | Bin 0 -> 2959 bytes .../holidays/locale/sw/LC_MESSAGES/KE.mo | Bin 0 -> 1897 bytes .../holidays/locale/sw/LC_MESSAGES/TZ.mo | Bin 0 -> 430 bytes .../holidays/locale/ta_LK/LC_MESSAGES/LK.mo | Bin 0 -> 5686 bytes .../holidays/locale/tet/LC_MESSAGES/TL.mo | Bin 0 -> 3159 bytes .../holidays/locale/th/LC_MESSAGES/AE.mo | Bin 0 -> 1929 bytes .../holidays/locale/th/LC_MESSAGES/AS.mo | Bin 0 -> 432 bytes .../holidays/locale/th/LC_MESSAGES/AU.mo | Bin 0 -> 3860 bytes .../holidays/locale/th/LC_MESSAGES/AX.mo | Bin 0 -> 433 bytes .../holidays/locale/th/LC_MESSAGES/BL.mo | Bin 0 -> 429 bytes .../holidays/locale/th/LC_MESSAGES/BN.mo | Bin 0 -> 2664 bytes .../holidays/locale/th/LC_MESSAGES/BY.mo | Bin 0 -> 3325 bytes .../holidays/locale/th/LC_MESSAGES/CA.mo | Bin 0 -> 3566 bytes .../holidays/locale/th/LC_MESSAGES/CN.mo | Bin 0 -> 1861 bytes .../holidays/locale/th/LC_MESSAGES/DE.mo | Bin 0 -> 3200 bytes .../holidays/locale/th/LC_MESSAGES/FI.mo | Bin 0 -> 4815 bytes .../holidays/locale/th/LC_MESSAGES/FR.mo | Bin 0 -> 2917 bytes .../holidays/locale/th/LC_MESSAGES/GB.mo | Bin 0 -> 3636 bytes .../holidays/locale/th/LC_MESSAGES/GF.mo | Bin 0 -> 429 bytes .../holidays/locale/th/LC_MESSAGES/GP.mo | Bin 0 -> 429 bytes .../holidays/locale/th/LC_MESSAGES/GU.mo | Bin 0 -> 432 bytes .../holidays/locale/th/LC_MESSAGES/HK.mo | Bin 0 -> 5008 bytes .../holidays/locale/th/LC_MESSAGES/ID.mo | Bin 0 -> 4818 bytes .../holidays/locale/th/LC_MESSAGES/IL.mo | Bin 0 -> 2105 bytes .../holidays/locale/th/LC_MESSAGES/IM.mo | Bin 0 -> 933 bytes .../holidays/locale/th/LC_MESSAGES/JP.mo | Bin 0 -> 2794 bytes .../holidays/locale/th/LC_MESSAGES/KH.mo | Bin 0 -> 5977 bytes .../holidays/locale/th/LC_MESSAGES/KR.mo | Bin 0 -> 5624 bytes .../holidays/locale/th/LC_MESSAGES/LA.mo | Bin 0 -> 5322 bytes .../holidays/locale/th/LC_MESSAGES/MF.mo | Bin 0 -> 429 bytes .../holidays/locale/th/LC_MESSAGES/MO.mo | Bin 0 -> 6317 bytes .../holidays/locale/th/LC_MESSAGES/MP.mo | Bin 0 -> 432 bytes .../holidays/locale/th/LC_MESSAGES/MQ.mo | Bin 0 -> 429 bytes .../holidays/locale/th/LC_MESSAGES/MY.mo | Bin 0 -> 7474 bytes .../holidays/locale/th/LC_MESSAGES/NC.mo | Bin 0 -> 429 bytes .../holidays/locale/th/LC_MESSAGES/NO.mo | Bin 0 -> 1563 bytes .../holidays/locale/th/LC_MESSAGES/PF.mo | Bin 0 -> 429 bytes .../holidays/locale/th/LC_MESSAGES/PH.mo | Bin 0 -> 2788 bytes .../holidays/locale/th/LC_MESSAGES/PM.mo | Bin 0 -> 429 bytes .../holidays/locale/th/LC_MESSAGES/PR.mo | Bin 0 -> 432 bytes .../holidays/locale/th/LC_MESSAGES/RE.mo | Bin 0 -> 429 bytes .../holidays/locale/th/LC_MESSAGES/RU.mo | Bin 0 -> 2413 bytes .../holidays/locale/th/LC_MESSAGES/SE.mo | Bin 0 -> 2082 bytes .../holidays/locale/th/LC_MESSAGES/SG.mo | Bin 0 -> 1743 bytes .../holidays/locale/th/LC_MESSAGES/SJ.mo | Bin 0 -> 429 bytes .../holidays/locale/th/LC_MESSAGES/TF.mo | Bin 0 -> 429 bytes .../holidays/locale/th/LC_MESSAGES/TH.mo | Bin 0 -> 402 bytes .../holidays/locale/th/LC_MESSAGES/TL.mo | Bin 0 -> 4531 bytes .../holidays/locale/th/LC_MESSAGES/TW.mo | Bin 0 -> 3529 bytes .../holidays/locale/th/LC_MESSAGES/UA.mo | Bin 0 -> 3193 bytes .../holidays/locale/th/LC_MESSAGES/UM.mo | Bin 0 -> 432 bytes .../holidays/locale/th/LC_MESSAGES/US.mo | Bin 0 -> 10754 bytes .../holidays/locale/th/LC_MESSAGES/VA.mo | Bin 0 -> 3787 bytes .../holidays/locale/th/LC_MESSAGES/VI.mo | Bin 0 -> 432 bytes .../holidays/locale/th/LC_MESSAGES/VN.mo | Bin 0 -> 1928 bytes .../holidays/locale/th/LC_MESSAGES/WF.mo | Bin 0 -> 429 bytes .../holidays/locale/th/LC_MESSAGES/YT.mo | Bin 0 -> 429 bytes .../holidays/locale/tkl/LC_MESSAGES/TK.mo | Bin 0 -> 691 bytes .../holidays/locale/to/LC_MESSAGES/TO.mo | Bin 0 -> 430 bytes .../holidays/locale/tr/LC_MESSAGES/TR.mo | Bin 0 -> 400 bytes .../holidays/locale/tvl/LC_MESSAGES/TV.mo | Bin 0 -> 427 bytes .../holidays/locale/uk/LC_MESSAGES/AD.mo | Bin 0 -> 2558 bytes .../holidays/locale/uk/LC_MESSAGES/AL.mo | Bin 0 -> 1906 bytes .../holidays/locale/uk/LC_MESSAGES/AO.mo | Bin 0 -> 2469 bytes .../holidays/locale/uk/LC_MESSAGES/AR.mo | Bin 0 -> 9931 bytes .../holidays/locale/uk/LC_MESSAGES/AT.mo | Bin 0 -> 1937 bytes .../holidays/locale/uk/LC_MESSAGES/AW.mo | Bin 0 -> 1404 bytes .../holidays/locale/uk/LC_MESSAGES/AX.mo | Bin 0 -> 433 bytes .../holidays/locale/uk/LC_MESSAGES/AZ.mo | Bin 0 -> 2593 bytes .../holidays/locale/uk/LC_MESSAGES/BA.mo | Bin 0 -> 2320 bytes .../holidays/locale/uk/LC_MESSAGES/BE.mo | Bin 0 -> 1412 bytes .../holidays/locale/uk/LC_MESSAGES/BG.mo | Bin 0 -> 2251 bytes .../holidays/locale/uk/LC_MESSAGES/BL.mo | Bin 0 -> 429 bytes .../holidays/locale/uk/LC_MESSAGES/BO.mo | Bin 0 -> 2208 bytes .../holidays/locale/uk/LC_MESSAGES/BR.mo | Bin 0 -> 5766 bytes .../holidays/locale/uk/LC_MESSAGES/BVMF.mo | Bin 0 -> 1448 bytes .../holidays/locale/uk/LC_MESSAGES/CH.mo | Bin 0 -> 2163 bytes .../holidays/locale/uk/LC_MESSAGES/CL.mo | Bin 0 -> 2726 bytes .../holidays/locale/uk/LC_MESSAGES/CO.mo | Bin 0 -> 1793 bytes .../holidays/locale/uk/LC_MESSAGES/CR.mo | Bin 0 -> 1543 bytes .../holidays/locale/uk/LC_MESSAGES/CU.mo | Bin 0 -> 1257 bytes .../holidays/locale/uk/LC_MESSAGES/CW.mo | Bin 0 -> 1512 bytes .../holidays/locale/uk/LC_MESSAGES/CY.mo | Bin 0 -> 1978 bytes .../holidays/locale/uk/LC_MESSAGES/CZ.mo | Bin 0 -> 2000 bytes .../holidays/locale/uk/LC_MESSAGES/DE.mo | Bin 0 -> 2440 bytes .../holidays/locale/uk/LC_MESSAGES/DK.mo | Bin 0 -> 1328 bytes .../holidays/locale/uk/LC_MESSAGES/DO.mo | Bin 0 -> 1251 bytes .../holidays/locale/uk/LC_MESSAGES/EC.mo | Bin 0 -> 1173 bytes .../holidays/locale/uk/LC_MESSAGES/EE.mo | Bin 0 -> 1177 bytes .../holidays/locale/uk/LC_MESSAGES/ES.mo | Bin 0 -> 4258 bytes .../holidays/locale/uk/LC_MESSAGES/FI.mo | Bin 0 -> 3854 bytes .../holidays/locale/uk/LC_MESSAGES/FR.mo | Bin 0 -> 2204 bytes .../holidays/locale/uk/LC_MESSAGES/GE.mo | Bin 0 -> 2213 bytes .../holidays/locale/uk/LC_MESSAGES/GF.mo | Bin 0 -> 429 bytes .../holidays/locale/uk/LC_MESSAGES/GL.mo | Bin 0 -> 1418 bytes .../holidays/locale/uk/LC_MESSAGES/GP.mo | Bin 0 -> 429 bytes .../holidays/locale/uk/LC_MESSAGES/GR.mo | Bin 0 -> 1670 bytes .../holidays/locale/uk/LC_MESSAGES/HN.mo | Bin 0 -> 1160 bytes .../holidays/locale/uk/LC_MESSAGES/HR.mo | Bin 0 -> 1826 bytes .../holidays/locale/uk/LC_MESSAGES/HU.mo | Bin 0 -> 1717 bytes .../holidays/locale/uk/LC_MESSAGES/ID.mo | Bin 0 -> 4168 bytes .../holidays/locale/uk/LC_MESSAGES/IL.mo | Bin 0 -> 1558 bytes .../holidays/locale/uk/LC_MESSAGES/IS.mo | Bin 0 -> 1477 bytes .../holidays/locale/uk/LC_MESSAGES/KZ.mo | Bin 0 -> 2187 bytes .../holidays/locale/uk/LC_MESSAGES/LI.mo | Bin 0 -> 1805 bytes .../holidays/locale/uk/LC_MESSAGES/LT.mo | Bin 0 -> 1860 bytes .../holidays/locale/uk/LC_MESSAGES/LU.mo | Bin 0 -> 1145 bytes .../holidays/locale/uk/LC_MESSAGES/LV.mo | Bin 0 -> 2117 bytes .../holidays/locale/uk/LC_MESSAGES/MC.mo | Bin 0 -> 1372 bytes .../holidays/locale/uk/LC_MESSAGES/MD.mo | Bin 0 -> 1723 bytes .../holidays/locale/uk/LC_MESSAGES/ME.mo | Bin 0 -> 1473 bytes .../holidays/locale/uk/LC_MESSAGES/MF.mo | Bin 0 -> 429 bytes .../holidays/locale/uk/LC_MESSAGES/MG.mo | Bin 0 -> 1474 bytes .../holidays/locale/uk/LC_MESSAGES/MK.mo | Bin 0 -> 3086 bytes .../holidays/locale/uk/LC_MESSAGES/MQ.mo | Bin 0 -> 429 bytes .../holidays/locale/uk/LC_MESSAGES/MX.mo | Bin 0 -> 1016 bytes .../holidays/locale/uk/LC_MESSAGES/MZ.mo | Bin 0 -> 1306 bytes .../holidays/locale/uk/LC_MESSAGES/NA.mo | Bin 0 -> 2235 bytes .../holidays/locale/uk/LC_MESSAGES/NC.mo | Bin 0 -> 429 bytes .../holidays/locale/uk/LC_MESSAGES/NI.mo | Bin 0 -> 1253 bytes .../holidays/locale/uk/LC_MESSAGES/NL.mo | Bin 0 -> 1144 bytes .../holidays/locale/uk/LC_MESSAGES/NO.mo | Bin 0 -> 1192 bytes .../holidays/locale/uk/LC_MESSAGES/PA.mo | Bin 0 -> 1739 bytes .../holidays/locale/uk/LC_MESSAGES/PE.mo | Bin 0 -> 1730 bytes .../holidays/locale/uk/LC_MESSAGES/PF.mo | Bin 0 -> 429 bytes .../holidays/locale/uk/LC_MESSAGES/PL.mo | Bin 0 -> 2399 bytes .../holidays/locale/uk/LC_MESSAGES/PM.mo | Bin 0 -> 429 bytes .../holidays/locale/uk/LC_MESSAGES/PT.mo | Bin 0 -> 3690 bytes .../holidays/locale/uk/LC_MESSAGES/PY.mo | Bin 0 -> 1588 bytes .../holidays/locale/uk/LC_MESSAGES/RE.mo | Bin 0 -> 429 bytes .../holidays/locale/uk/LC_MESSAGES/RO.mo | Bin 0 -> 1279 bytes .../holidays/locale/uk/LC_MESSAGES/SE.mo | Bin 0 -> 1615 bytes .../holidays/locale/uk/LC_MESSAGES/SI.mo | Bin 0 -> 2305 bytes .../holidays/locale/uk/LC_MESSAGES/SJ.mo | Bin 0 -> 429 bytes .../holidays/locale/uk/LC_MESSAGES/SK.mo | Bin 0 -> 2252 bytes .../holidays/locale/uk/LC_MESSAGES/SM.mo | Bin 0 -> 2040 bytes .../holidays/locale/uk/LC_MESSAGES/SV.mo | Bin 0 -> 1205 bytes .../holidays/locale/uk/LC_MESSAGES/TF.mo | Bin 0 -> 428 bytes .../holidays/locale/uk/LC_MESSAGES/TH.mo | Bin 0 -> 13418 bytes .../holidays/locale/uk/LC_MESSAGES/TR.mo | Bin 0 -> 1645 bytes .../holidays/locale/uk/LC_MESSAGES/UA.mo | Bin 0 -> 430 bytes .../holidays/locale/uk/LC_MESSAGES/UY.mo | Bin 0 -> 2070 bytes .../holidays/locale/uk/LC_MESSAGES/UZ.mo | Bin 0 -> 1654 bytes .../holidays/locale/uk/LC_MESSAGES/VE.mo | Bin 0 -> 1621 bytes .../holidays/locale/uk/LC_MESSAGES/WF.mo | Bin 0 -> 429 bytes .../holidays/locale/uk/LC_MESSAGES/YT.mo | Bin 0 -> 429 bytes .../holidays/locale/ur_PK/LC_MESSAGES/PK.mo | Bin 0 -> 1057 bytes .../holidays/locale/uz/LC_MESSAGES/UZ.mo | Bin 0 -> 428 bytes .../holidays/locale/vi/LC_MESSAGES/VN.mo | Bin 0 -> 427 bytes .../holidays/locale/zh_CN/LC_MESSAGES/CN.mo | Bin 0 -> 438 bytes .../holidays/locale/zh_CN/LC_MESSAGES/HK.mo | Bin 0 -> 2870 bytes .../holidays/locale/zh_CN/LC_MESSAGES/MO.mo | Bin 0 -> 3543 bytes .../holidays/locale/zh_CN/LC_MESSAGES/TW.mo | Bin 0 -> 2064 bytes .../holidays/locale/zh_HK/LC_MESSAGES/HK.mo | Bin 0 -> 435 bytes .../holidays/locale/zh_MO/LC_MESSAGES/MO.mo | Bin 0 -> 435 bytes .../holidays/locale/zh_TW/LC_MESSAGES/CN.mo | Bin 0 -> 1282 bytes .../holidays/locale/zh_TW/LC_MESSAGES/TW.mo | Bin 0 -> 434 bytes .../site-packages/holidays/mixins/__init__.py | 18 + .../__pycache__/__init__.cpython-312.pyc | Bin 0 -> 430 bytes .../__pycache__/child_entity.cpython-312.pyc | Bin 0 -> 1590 bytes ...red_discretionary_holidays.cpython-312.pyc | Bin 0 -> 1017 bytes .../holidays/mixins/child_entity.py | 43 + .../preferred_discretionary_holidays.py | 28 + .../holidays/observed_holiday_base.py | 246 + .../site-packages/holidays/py.typed | 3 + .../site-packages/holidays/registry.py | 360 ++ .../site-packages/holidays/utils.py | 437 ++ .../site-packages/holidays/version.py | 13 + .../INSTALLER | 1 + .../LICENSE | 202 + .../METADATA | 103 + .../RECORD | 67 + .../importlib_resources-6.5.2.dist-info/WHEEL | 5 + .../top_level.txt | 1 + .../importlib_resources/__init__.py | 40 + .../__pycache__/__init__.cpython-312.pyc | Bin 0 -> 879 bytes .../__pycache__/_adapters.cpython-312.pyc | Bin 0 -> 9674 bytes .../__pycache__/_common.cpython-312.pyc | Bin 0 -> 8862 bytes .../__pycache__/_functional.cpython-312.pyc | Bin 0 -> 3688 bytes .../__pycache__/_itertools.cpython-312.pyc | Bin 0 -> 1602 bytes .../__pycache__/abc.cpython-312.pyc | Bin 0 -> 9493 bytes .../__pycache__/readers.cpython-312.pyc | Bin 0 -> 12174 bytes .../__pycache__/simple.cpython-312.pyc | Bin 0 -> 5530 bytes .../importlib_resources/_adapters.py | 168 + .../importlib_resources/_common.py | 211 + .../importlib_resources/_functional.py | 84 + .../importlib_resources/_itertools.py | 38 + .../site-packages/importlib_resources/abc.py | 193 + .../importlib_resources/compat/__init__.py | 0 .../__pycache__/__init__.cpython-312.pyc | Bin 0 -> 218 bytes .../compat/__pycache__/py39.cpython-312.pyc | Bin 0 -> 400 bytes .../importlib_resources/compat/py39.py | 9 + .../importlib_resources/future/__init__.py | 0 .../__pycache__/__init__.cpython-312.pyc | Bin 0 -> 218 bytes .../__pycache__/adapters.cpython-312.pyc | Bin 0 -> 5375 bytes .../importlib_resources/future/adapters.py | 102 + .../importlib_resources/py.typed | 0 .../importlib_resources/readers.py | 202 + .../importlib_resources/simple.py | 106 + .../importlib_resources/tests/__init__.py | 0 .../__pycache__/__init__.cpython-312.pyc | Bin 0 -> 217 bytes .../tests/__pycache__/_path.cpython-312.pyc | Bin 0 -> 3986 bytes .../test_compatibilty_files.cpython-312.pyc | Bin 0 -> 8859 bytes .../__pycache__/test_contents.cpython-312.pyc | Bin 0 -> 1799 bytes .../__pycache__/test_custom.cpython-312.pyc | Bin 0 -> 3089 bytes .../__pycache__/test_files.cpython-312.pyc | Bin 0 -> 10399 bytes .../test_functional.cpython-312.pyc | Bin 0 -> 14636 bytes .../__pycache__/test_open.cpython-312.pyc | Bin 0 -> 6150 bytes .../__pycache__/test_path.cpython-312.pyc | Bin 0 -> 4628 bytes .../__pycache__/test_read.cpython-312.pyc | Bin 0 -> 6480 bytes .../__pycache__/test_reader.cpython-312.pyc | Bin 0 -> 10067 bytes .../__pycache__/test_resource.cpython-312.pyc | Bin 0 -> 15787 bytes .../__pycache__/test_util.cpython-312.pyc | Bin 0 -> 1845 bytes .../tests/__pycache__/util.cpython-312.pyc | Bin 0 -> 17885 bytes .../tests/__pycache__/zip.cpython-312.pyc | Bin 0 -> 1319 bytes .../importlib_resources/tests/_path.py | 90 + .../tests/compat/__init__.py | 0 .../__pycache__/__init__.cpython-312.pyc | Bin 0 -> 224 bytes .../compat/__pycache__/py312.cpython-312.pyc | Bin 0 -> 897 bytes .../compat/__pycache__/py39.cpython-312.pyc | Bin 0 -> 738 bytes .../importlib_resources/tests/compat/py312.py | 18 + .../importlib_resources/tests/compat/py39.py | 13 + .../tests/test_compatibilty_files.py | 103 + .../tests/test_contents.py | 39 + .../importlib_resources/tests/test_custom.py | 48 + .../importlib_resources/tests/test_files.py | 194 + .../tests/test_functional.py | 267 + .../importlib_resources/tests/test_open.py | 85 + .../importlib_resources/tests/test_path.py | 63 + .../importlib_resources/tests/test_read.py | 94 + .../importlib_resources/tests/test_reader.py | 137 + .../tests/test_resource.py | 238 + .../importlib_resources/tests/test_util.py | 29 + .../importlib_resources/tests/util.py | 308 ++ .../importlib_resources/tests/zip.py | 26 + .../prophet-1.1.7.dist-info/INSTALLER | 1 + .../prophet-1.1.7.dist-info/METADATA | 82 + .../prophet-1.1.7.dist-info/RECORD | 783 +++ .../prophet-1.1.7.dist-info/REQUESTED | 0 .../prophet-1.1.7.dist-info/WHEEL | 6 + .../prophet-1.1.7.dist-info/licenses/LICENSE | 21 + .../prophet-1.1.7.dist-info/top_level.txt | 1 + .../prophet.libs/libtbb-ff323302.so.2 | Bin 0 -> 3678161 bytes .../prophet.libs/libtbbmalloc-4dcb68e3.so.2 | Bin 0 -> 1010017 bytes .../site-packages/prophet/__init__.py | 14 + .../__pycache__/__init__.cpython-312.pyc | Bin 0 -> 677 bytes .../__pycache__/__version__.cpython-312.pyc | Bin 0 -> 228 bytes .../__pycache__/diagnostics.cpython-312.pyc | Bin 0 -> 27837 bytes .../__pycache__/forecaster.cpython-312.pyc | Bin 0 -> 87003 bytes .../__pycache__/make_holidays.cpython-312.pyc | Bin 0 -> 2637 bytes .../__pycache__/models.cpython-312.pyc | Bin 0 -> 12807 bytes .../prophet/__pycache__/plot.cpython-312.pyc | Bin 0 -> 43214 bytes .../__pycache__/serialize.cpython-312.pyc | Bin 0 -> 8356 bytes .../__pycache__/utilities.cpython-312.pyc | Bin 0 -> 4536 bytes .../site-packages/prophet/__version__.py | 1 + .../site-packages/prophet/diagnostics.py | 684 +++ .../site-packages/prophet/forecaster.py | 1939 +++++++ .../site-packages/prophet/make_holidays.py | 77 + .../site-packages/prophet/models.py | 283 + .../python3.12/site-packages/prophet/plot.py | 1025 ++++ .../site-packages/prophet/serialize.py | 218 + .../stan_model/cmdstan-2.33.1/bin/diagnose | Bin 0 -> 401448 bytes .../stan_model/cmdstan-2.33.1/bin/print | Bin 0 -> 406592 bytes .../stan_model/cmdstan-2.33.1/bin/stanc | Bin 0 -> 14393232 bytes .../stan_model/cmdstan-2.33.1/bin/stansummary | Bin 0 -> 686384 bytes .../stan/lib/stan_math/lib/tbb/arena.d | 64 + .../stan/lib/stan_math/lib/tbb/arena.o | Bin 0 -> 840888 bytes .../stan/lib/stan_math/lib/tbb/backend.d | 32 + .../stan/lib/stan_math/lib/tbb/backend.o | Bin 0 -> 537304 bytes .../stan/lib/stan_math/lib/tbb/backref.d | 31 + .../stan/lib/stan_math/lib/tbb/backref.o | Bin 0 -> 144704 bytes .../lib/tbb/cache_aligned_allocator.d | 22 + .../lib/tbb/cache_aligned_allocator.o | Bin 0 -> 81696 bytes .../stan_math/lib/tbb/concurrent_hash_map.d | 30 + .../stan_math/lib/tbb/concurrent_hash_map.o | Bin 0 -> 43968 bytes .../stan_math/lib/tbb/concurrent_monitor.d | 27 + .../stan_math/lib/tbb/concurrent_monitor.o | Bin 0 -> 187784 bytes .../lib/stan_math/lib/tbb/concurrent_queue.d | 43 + .../lib/stan_math/lib/tbb/concurrent_queue.o | Bin 0 -> 552104 bytes .../stan_math/lib/tbb/concurrent_queue_v2.d | 24 + .../stan_math/lib/tbb/concurrent_queue_v2.o | Bin 0 -> 237576 bytes .../lib/stan_math/lib/tbb/concurrent_vector.d | 31 + .../lib/stan_math/lib/tbb/concurrent_vector.o | Bin 0 -> 842536 bytes .../stan_math/lib/tbb/concurrent_vector_v2.d | 26 + .../stan_math/lib/tbb/concurrent_vector_v2.o | Bin 0 -> 234328 bytes .../stan_math/lib/tbb/condition_variable.d | 37 + .../stan_math/lib/tbb/condition_variable.o | Bin 0 -> 32320 bytes .../lib/stan_math/lib/tbb/critical_section.d | 26 + .../lib/stan_math/lib/tbb/critical_section.o | Bin 0 -> 36104 bytes .../stan/lib/stan_math/lib/tbb/dynamic_link.d | 18 + .../stan/lib/stan_math/lib/tbb/dynamic_link.o | Bin 0 -> 107600 bytes .../stan/lib/stan_math/lib/tbb/frontend.d | 34 + .../stan/lib/stan_math/lib/tbb/frontend.o | Bin 0 -> 671136 bytes .../stan/lib/stan_math/lib/tbb/governor.d | 57 + .../stan/lib/stan_math/lib/tbb/governor.o | Bin 0 -> 258440 bytes .../stan/lib/stan_math/lib/tbb/itt_notify.d | 13 + .../stan/lib/stan_math/lib/tbb/itt_notify.o | Bin 0 -> 294328 bytes .../lib/stan_math/lib/tbb/itt_notify_malloc.d | 13 + .../lib/stan_math/lib/tbb/itt_notify_malloc.o | Bin 0 -> 294504 bytes .../lib/stan_math/lib/tbb/large_objects.d | 32 + .../lib/stan_math/lib/tbb/large_objects.o | Bin 0 -> 530560 bytes .../stan/lib/stan_math/lib/tbb/libtbb.so | 1 + .../stan/lib/stan_math/lib/tbb/libtbb.so.2 | Bin 0 -> 3592920 bytes .../lib/stan_math/lib/tbb/libtbbmalloc.so | 1 + .../lib/stan_math/lib/tbb/libtbbmalloc.so.2 | Bin 0 -> 1001488 bytes .../stan_math/lib/tbb/libtbbmalloc_proxy.so | 1 + .../stan_math/lib/tbb/libtbbmalloc_proxy.so.2 | Bin 0 -> 75577 bytes .../stan/lib/stan_math/lib/tbb/market.d | 59 + .../stan/lib/stan_math/lib/tbb/market.o | Bin 0 -> 411256 bytes .../stan/lib/stan_math/lib/tbb/mutex.d | 28 + .../stan/lib/stan_math/lib/tbb/mutex.o | Bin 0 -> 38680 bytes .../lib/stan_math/lib/tbb/observer_proxy.d | 58 + .../lib/stan_math/lib/tbb/observer_proxy.o | Bin 0 -> 283568 bytes .../stan/lib/stan_math/lib/tbb/pipeline.d | 30 + .../stan/lib/stan_math/lib/tbb/pipeline.o | Bin 0 -> 307856 bytes .../lib/stan_math/lib/tbb/private_server.d | 39 + .../lib/stan_math/lib/tbb/private_server.o | Bin 0 -> 354632 bytes .../stan/lib/stan_math/lib/tbb/proxy.d | 12 + .../stan/lib/stan_math/lib/tbb/proxy.o | Bin 0 -> 101632 bytes .../lib/stan_math/lib/tbb/queuing_mutex.d | 23 + .../lib/stan_math/lib/tbb/queuing_mutex.o | Bin 0 -> 55216 bytes .../lib/stan_math/lib/tbb/queuing_rw_mutex.d | 22 + .../lib/stan_math/lib/tbb/queuing_rw_mutex.o | Bin 0 -> 257208 bytes .../stan_math/lib/tbb/reader_writer_lock.d | 25 + .../stan_math/lib/tbb/reader_writer_lock.o | Bin 0 -> 279048 bytes .../lib/stan_math/lib/tbb/recursive_mutex.d | 21 + .../lib/stan_math/lib/tbb/recursive_mutex.o | Bin 0 -> 32888 bytes .../stan/lib/stan_math/lib/tbb/rml_tbb.d | 8 + .../stan/lib/stan_math/lib/tbb/rml_tbb.o | Bin 0 -> 24928 bytes .../stan/lib/stan_math/lib/tbb/scheduler.d | 59 + .../stan/lib/stan_math/lib/tbb/scheduler.o | Bin 0 -> 944544 bytes .../stan/lib/stan_math/lib/tbb/semaphore.d | 15 + .../stan/lib/stan_math/lib/tbb/semaphore.o | Bin 0 -> 19824 bytes .../stan/lib/stan_math/lib/tbb/spin_mutex.d | 27 + .../stan/lib/stan_math/lib/tbb/spin_mutex.o | Bin 0 -> 33144 bytes .../lib/stan_math/lib/tbb/spin_rw_mutex.d | 28 + .../lib/stan_math/lib/tbb/spin_rw_mutex.o | Bin 0 -> 59016 bytes .../lib/stan_math/lib/tbb/spin_rw_mutex_v2.d | 20 + .../lib/stan_math/lib/tbb/spin_rw_mutex_v2.o | Bin 0 -> 60848 bytes .../stan/lib/stan_math/lib/tbb/task.d | 58 + .../stan/lib/stan_math/lib/tbb/task.o | Bin 0 -> 207784 bytes .../stan_math/lib/tbb/task_group_context.d | 57 + .../stan_math/lib/tbb/task_group_context.o | Bin 0 -> 373312 bytes .../stan/lib/stan_math/lib/tbb/task_v2.d | 17 + .../stan/lib/stan_math/lib/tbb/task_v2.o | Bin 0 -> 25000 bytes .../stan/lib/stan_math/lib/tbb/tbb-make-check | 0 .../stan/lib/stan_math/lib/tbb/tbb.def | 405 ++ .../lib/tbb/tbb_function_replacement.d | 3 + .../lib/tbb/tbb_function_replacement.o | Bin 0 -> 2840 bytes .../stan/lib/stan_math/lib/tbb/tbb_main.d | 47 + .../stan/lib/stan_math/lib/tbb/tbb_main.o | Bin 0 -> 273456 bytes .../stan/lib/stan_math/lib/tbb/tbb_misc.d | 20 + .../stan/lib/stan_math/lib/tbb/tbb_misc.o | Bin 0 -> 107032 bytes .../stan/lib/stan_math/lib/tbb/tbb_misc_ex.d | 17 + .../stan/lib/stan_math/lib/tbb/tbb_misc_ex.o | Bin 0 -> 94024 bytes .../lib/stan_math/lib/tbb/tbb_statistics.d | 4 + .../lib/stan_math/lib/tbb/tbb_statistics.o | Bin 0 -> 16256 bytes .../stan/lib/stan_math/lib/tbb/tbb_thread.d | 27 + .../stan/lib/stan_math/lib/tbb/tbb_thread.o | Bin 0 -> 58184 bytes .../stan/lib/stan_math/lib/tbb/tbbmalloc.d | 27 + .../stan/lib/stan_math/lib/tbb/tbbmalloc.def | 65 + .../stan/lib/stan_math/lib/tbb/tbbmalloc.o | Bin 0 -> 34376 bytes .../lib/stan_math/lib/tbb/tbbmallocproxy.def | 47 + .../stan/lib/stan_math/lib/tbb/tbbvars.csh | 19 + .../stan/lib/stan_math/lib/tbb/tbbvars.sh | 19 + .../lib/stan_math/lib/tbb/version_string.ver | 11 + .../lib/stan_math/lib/tbb/version_tbb_2020.3 | 0 .../lib/stan_math/lib/tbb/x86_rtm_rw_mutex.d | 35 + .../lib/stan_math/lib/tbb/x86_rtm_rw_mutex.o | Bin 0 -> 82872 bytes .../stan_math/lib/tbb_2020.3/.gitattributes | 45 + .../lib/stan_math/lib/tbb_2020.3/.gitignore | 90 + .../stan/lib/stan_math/lib/tbb_2020.3/CHANGES | 2919 ++++++++++ .../lib/stan_math/lib/tbb_2020.3/Doxyfile | 1325 +++++ .../stan/lib/stan_math/lib/tbb_2020.3/LICENSE | 201 + .../lib/stan_math/lib/tbb_2020.3/Makefile | 75 + .../stan/lib/stan_math/lib/tbb_2020.3/README | 11 + .../lib/stan_math/lib/tbb_2020.3/README.md | 33 + .../lib/stan_math/lib/tbb_2020.3/STAN_CHANGES | 4 + .../lib/tbb_2020.3/build/AIX.gcc.inc | 71 + .../stan_math/lib/tbb_2020.3/build/AIX.inc | 62 + .../lib/tbb_2020.3/build/BSD.clang.inc | 106 + .../stan_math/lib/tbb_2020.3/build/BSD.inc | 70 + .../lib/tbb_2020.3/build/FreeBSD.clang.inc | 17 + .../lib/tbb_2020.3/build/FreeBSD.gcc.inc | 89 + .../lib/tbb_2020.3/build/FreeBSD.inc | 15 + .../lib/tbb_2020.3/build/Makefile.rml | 169 + .../lib/tbb_2020.3/build/Makefile.tbb | 114 + .../lib/tbb_2020.3/build/Makefile.tbbbind | 69 + .../lib/tbb_2020.3/build/Makefile.tbbmalloc | 256 + .../lib/tbb_2020.3/build/Makefile.tbbproxy | 105 + .../lib/tbb_2020.3/build/Makefile.test | 321 ++ .../lib/tbb_2020.3/build/OpenBSD.clang.inc | 15 + .../lib/tbb_2020.3/build/OpenBSD.inc | 15 + .../lib/tbb_2020.3/build/SunOS.gcc.inc | 88 + .../stan_math/lib/tbb_2020.3/build/SunOS.inc | 79 + .../lib/tbb_2020.3/build/SunOS.suncc.inc | 88 + .../lib/tbb_2020.3/build/android.clang.inc | 126 + .../lib/tbb_2020.3/build/android.gcc.inc | 113 + .../lib/tbb_2020.3/build/android.icc.inc | 116 + .../lib/tbb_2020.3/build/android.inc | 59 + .../lib/tbb_2020.3/build/android.linux.inc | 63 + .../build/android.linux.launcher.sh | 144 + .../lib/tbb_2020.3/build/android.macos.inc | 72 + .../lib/tbb_2020.3/build/android.windows.inc | 74 + .../lib/tbb_2020.3/build/big_iron.inc | 72 + .../stan_math/lib/tbb_2020.3/build/build.py | 204 + .../lib/tbb_2020.3/build/codecov.txt | 7 + .../stan_math/lib/tbb_2020.3/build/common.inc | 170 + .../lib/tbb_2020.3/build/common_rules.inc | 169 + .../stan_math/lib/tbb_2020.3/build/detect.js | 203 + .../lib/tbb_2020.3/build/generate_tbbvars.bat | 62 + .../lib/tbb_2020.3/build/generate_tbbvars.sh | 67 + .../stan_math/lib/tbb_2020.3/build/index.html | 247 + .../lib/tbb_2020.3/build/ios.clang.inc | 15 + .../lib/tbb_2020.3/build/ios.macos.inc | 34 + .../lib/tbb_2020.3/build/linux.clang.inc | 115 + .../lib/tbb_2020.3/build/linux.gcc.inc | 156 + .../lib/tbb_2020.3/build/linux.icc.inc | 118 + .../stan_math/lib/tbb_2020.3/build/linux.inc | 145 + .../lib/tbb_2020.3/build/linux.pathcc.inc | 89 + .../lib/tbb_2020.3/build/linux.xl.inc | 100 + .../lib/tbb_2020.3/build/macos.clang.inc | 136 + .../lib/tbb_2020.3/build/macos.gcc.inc | 128 + .../lib/tbb_2020.3/build/macos.icc.inc | 107 + .../stan_math/lib/tbb_2020.3/build/macos.inc | 109 + .../lib/tbb_2020.3/build/mic.icc.inc | 72 + .../lib/tbb_2020.3/build/mic.linux.inc | 39 + .../tbb_2020.3/build/mic.linux.launcher.sh | 157 + .../lib/tbb_2020.3/build/mic.offload.inc | 114 + .../lib/tbb_2020.3/build/suncc.map.pause | 1 + .../lib/tbb_2020.3/build/test_launcher.bat | 70 + .../lib/tbb_2020.3/build/test_launcher.sh | 90 + .../lib/tbb_2020.3/build/version_info_aix.sh | 30 + .../tbb_2020.3/build/version_info_android.sh | 29 + .../tbb_2020.3/build/version_info_linux.sh | 30 + .../tbb_2020.3/build/version_info_macos.sh | 28 + .../tbb_2020.3/build/version_info_sunos.sh | 27 + .../tbb_2020.3/build/version_info_windows.js | 91 + .../lib/tbb_2020.3/build/vs2013/index.html | 30 + .../lib/tbb_2020.3/build/vs2013/makefile.sln | 80 + .../lib/tbb_2020.3/build/vs2013/tbb.vcxproj | 697 +++ .../tbb_2020.3/build/vs2013/tbbmalloc.vcxproj | 559 ++ .../build/vs2013/tbbmalloc_proxy.vcxproj | 425 ++ .../build/vs2013/version_string.ver | 1 + .../lib/tbb_2020.3/build/windows.cl.inc | 162 + .../lib/tbb_2020.3/build/windows.gcc.inc | 138 + .../lib/tbb_2020.3/build/windows.icl.inc | 184 + .../lib/tbb_2020.3/build/windows.inc | 118 + .../stan_math/lib/tbb_2020.3/cmake/README.rst | 361 ++ .../lib/tbb_2020.3/cmake/TBBBuild.cmake | 197 + .../lib/tbb_2020.3/cmake/TBBGet.cmake | 294 + .../tbb_2020.3/cmake/TBBInstallConfig.cmake | 124 + .../lib/tbb_2020.3/cmake/TBBMakeConfig.cmake | 164 + .../cmake/tbb_config_generator.cmake | 41 + .../cmake/tbb_config_installer.cmake | 48 + .../cmake/templates/TBBConfig.cmake.in | 98 + .../templates/TBBConfigInternal.cmake.in | 98 + .../cmake/templates/TBBConfigVersion.cmake.in | 24 + .../lib/tbb_2020.3/doc/Release_Notes.txt | 132 + .../copyright_brand_disclaimer_doxygen.txt | 9 + .../lib/tbb_2020.3/include/index.html | 25 + .../include/serial/tbb/parallel_for.h | 226 + .../include/serial/tbb/tbb_annotate.h | 32 + .../lib/tbb_2020.3/include/tbb/aggregator.h | 204 + .../tbb_2020.3/include/tbb/aligned_space.h | 60 + .../lib/tbb_2020.3/include/tbb/atomic.h | 586 ++ .../tbb_2020.3/include/tbb/blocked_range.h | 168 + .../tbb_2020.3/include/tbb/blocked_range2d.h | 104 + .../tbb_2020.3/include/tbb/blocked_range3d.h | 123 + .../tbb_2020.3/include/tbb/blocked_rangeNd.h | 150 + .../include/tbb/cache_aligned_allocator.h | 209 + .../lib/tbb_2020.3/include/tbb/combinable.h | 88 + .../include/tbb/compat/condition_variable | 489 ++ .../lib/tbb_2020.3/include/tbb/compat/ppl.h | 75 + .../lib/tbb_2020.3/include/tbb/compat/thread | 73 + .../lib/tbb_2020.3/include/tbb/compat/tuple | 501 ++ .../include/tbb/concurrent_hash_map.h | 1650 ++++++ .../include/tbb/concurrent_lru_cache.h | 290 + .../tbb_2020.3/include/tbb/concurrent_map.h | 389 ++ .../include/tbb/concurrent_priority_queue.h | 552 ++ .../tbb_2020.3/include/tbb/concurrent_queue.h | 479 ++ .../tbb_2020.3/include/tbb/concurrent_set.h | 304 ++ .../include/tbb/concurrent_unordered_map.h | 492 ++ .../include/tbb/concurrent_unordered_set.h | 448 ++ .../include/tbb/concurrent_vector.h | 1396 +++++ .../tbb_2020.3/include/tbb/critical_section.h | 147 + .../include/tbb/enumerable_thread_specific.h | 1173 ++++ .../lib/tbb_2020.3/include/tbb/flow_graph.h | 4743 +++++++++++++++++ .../include/tbb/flow_graph_abstractions.h | 53 + .../include/tbb/flow_graph_opencl_node.h | 1504 ++++++ .../tbb_2020.3/include/tbb/global_control.h | 78 + .../lib/tbb_2020.3/include/tbb/index.html | 29 + .../lib/tbb_2020.3/include/tbb/info.h | 52 + .../include/tbb/internal/_aggregator_impl.h | 180 + .../include/tbb/internal/_allocator_traits.h | 156 + .../tbb/internal/_concurrent_queue_impl.h | 1081 ++++ .../tbb/internal/_concurrent_skip_list_impl.h | 1085 ++++ .../tbb/internal/_concurrent_unordered_impl.h | 1684 ++++++ .../_deprecated_header_message_guard.h | 69 + .../tbb/internal/_flow_graph_async_msg_impl.h | 153 + .../tbb/internal/_flow_graph_body_impl.h | 507 ++ .../tbb/internal/_flow_graph_cache_impl.h | 592 ++ .../include/tbb/internal/_flow_graph_impl.h | 547 ++ .../tbb/internal/_flow_graph_indexer_impl.h | 480 ++ .../internal/_flow_graph_item_buffer_impl.h | 283 + .../tbb/internal/_flow_graph_join_impl.h | 2002 +++++++ .../tbb/internal/_flow_graph_node_impl.h | 971 ++++ .../tbb/internal/_flow_graph_node_set_impl.h | 269 + .../internal/_flow_graph_nodes_deduction.h | 298 ++ .../tbb/internal/_flow_graph_streaming_node.h | 743 +++ .../internal/_flow_graph_tagged_buffer_impl.h | 249 + .../tbb/internal/_flow_graph_trace_impl.h | 364 ++ .../tbb/internal/_flow_graph_types_impl.h | 723 +++ .../include/tbb/internal/_mutex_padding.h | 98 + .../include/tbb/internal/_node_handle_impl.h | 168 + .../include/tbb/internal/_range_iterator.h | 66 + .../tbb/internal/_tbb_hash_compare_impl.h | 105 + .../include/tbb/internal/_tbb_strings.h | 79 + .../include/tbb/internal/_tbb_trace_impl.h | 55 + .../include/tbb/internal/_tbb_windef.h | 69 + .../include/tbb/internal/_template_helpers.h | 311 ++ .../_warning_suppress_disable_notice.h | 27 + .../_warning_suppress_enable_notice.h | 32 + .../tbb/internal/_x86_eliding_mutex_impl.h | 144 + .../tbb/internal/_x86_rtm_rw_mutex_impl.h | 223 + .../lib/tbb_2020.3/include/tbb/iterators.h | 326 ++ .../tbb_2020.3/include/tbb/machine/gcc_arm.h | 216 + .../include/tbb/machine/gcc_generic.h | 233 + .../include/tbb/machine/gcc_ia32_common.h | 109 + .../tbb_2020.3/include/tbb/machine/gcc_itsx.h | 119 + .../include/tbb/machine/ibm_aix51.h | 66 + .../include/tbb/machine/icc_generic.h | 258 + .../include/tbb/machine/linux_common.h | 105 + .../include/tbb/machine/linux_ia32.h | 228 + .../include/tbb/machine/linux_ia64.h | 177 + .../include/tbb/machine/linux_intel64.h | 92 + .../tbb_2020.3/include/tbb/machine/mac_ppc.h | 309 ++ .../include/tbb/machine/macos_common.h | 129 + .../include/tbb/machine/mic_common.h | 53 + .../include/tbb/machine/msvc_armv7.h | 167 + .../include/tbb/machine/msvc_ia32_common.h | 275 + .../include/tbb/machine/sunos_sparc.h | 199 + .../include/tbb/machine/windows_api.h | 65 + .../include/tbb/machine/windows_ia32.h | 105 + .../include/tbb/machine/windows_intel64.h | 70 + .../lib/tbb_2020.3/include/tbb/memory_pool.h | 275 + .../lib/tbb_2020.3/include/tbb/mutex.h | 246 + .../lib/tbb_2020.3/include/tbb/null_mutex.h | 50 + .../tbb_2020.3/include/tbb/null_rw_mutex.h | 52 + .../lib/tbb_2020.3/include/tbb/parallel_do.h | 553 ++ .../lib/tbb_2020.3/include/tbb/parallel_for.h | 425 ++ .../include/tbb/parallel_for_each.h | 133 + .../tbb_2020.3/include/tbb/parallel_invoke.h | 460 ++ .../tbb_2020.3/include/tbb/parallel_reduce.h | 657 +++ .../tbb_2020.3/include/tbb/parallel_scan.h | 416 ++ .../tbb_2020.3/include/tbb/parallel_sort.h | 257 + .../tbb_2020.3/include/tbb/parallel_while.h | 188 + .../lib/tbb_2020.3/include/tbb/partitioner.h | 681 +++ .../lib/tbb_2020.3/include/tbb/pipeline.h | 689 +++ .../tbb_2020.3/include/tbb/queuing_mutex.h | 113 + .../tbb_2020.3/include/tbb/queuing_rw_mutex.h | 154 + .../include/tbb/reader_writer_lock.h | 246 + .../tbb_2020.3/include/tbb/recursive_mutex.h | 248 + .../tbb_2020.3/include/tbb/runtime_loader.h | 193 + .../include/tbb/scalable_allocator.h | 388 ++ .../lib/tbb_2020.3/include/tbb/spin_mutex.h | 214 + .../tbb_2020.3/include/tbb/spin_rw_mutex.h | 252 + .../lib/tbb_2020.3/include/tbb/task.h | 1189 +++++ .../lib/tbb_2020.3/include/tbb/task_arena.h | 511 ++ .../lib/tbb_2020.3/include/tbb/task_group.h | 366 ++ .../include/tbb/task_scheduler_init.h | 174 + .../include/tbb/task_scheduler_observer.h | 166 + .../lib/tbb_2020.3/include/tbb/tbb.h | 97 + .../tbb_2020.3/include/tbb/tbb_allocator.h | 203 + .../lib/tbb_2020.3/include/tbb/tbb_config.h | 873 +++ .../include/tbb/tbb_disable_exceptions.h | 31 + .../tbb_2020.3/include/tbb/tbb_exception.h | 362 ++ .../lib/tbb_2020.3/include/tbb/tbb_machine.h | 978 ++++ .../tbb_2020.3/include/tbb/tbb_profiling.h | 355 ++ .../lib/tbb_2020.3/include/tbb/tbb_stddef.h | 565 ++ .../lib/tbb_2020.3/include/tbb/tbb_thread.h | 345 ++ .../tbb_2020.3/include/tbb/tbbmalloc_proxy.h | 65 + .../lib/tbb_2020.3/include/tbb/tick_count.h | 136 + .../lib/stan_math/lib/tbb_2020.3/index.html | 48 + .../stan_math/lib/tbb_2020.3/jni/Android.mk | 62 + .../lib/tbb_2020.3/jni/Application.mk | 67 + .../stan_math/lib/tbb_2020.3/python/Makefile | 45 + .../stan_math/lib/tbb_2020.3/python/TBB.py | 24 + .../lib/tbb_2020.3/python/index.html | 84 + .../lib/tbb_2020.3/python/rml/Makefile | 151 + .../lib/tbb_2020.3/python/rml/ipc_server.cpp | 1115 ++++ .../lib/tbb_2020.3/python/rml/ipc_utils.cpp | 140 + .../lib/tbb_2020.3/python/rml/ipc_utils.h | 30 + .../stan_math/lib/tbb_2020.3/python/setup.py | 120 + .../lib/tbb_2020.3/python/tbb/__init__.py | 325 ++ .../lib/tbb_2020.3/python/tbb/__main__.py | 20 + .../stan_math/lib/tbb_2020.3/python/tbb/api.i | 175 + .../lib/tbb_2020.3/python/tbb/pool.py | 631 +++ .../lib/tbb_2020.3/python/tbb/test.py | 195 + .../lib/stan_math/lib/tbb_2020.3/src/Makefile | 276 + .../stan_math/lib/tbb_2020.3/src/index.html | 76 + .../src/old/concurrent_queue_v2.cpp | 361 ++ .../tbb_2020.3/src/old/concurrent_queue_v2.h | 320 ++ .../src/old/concurrent_vector_v2.cpp | 252 + .../tbb_2020.3/src/old/concurrent_vector_v2.h | 508 ++ .../tbb_2020.3/src/old/spin_rw_mutex_v2.cpp | 152 + .../lib/tbb_2020.3/src/old/spin_rw_mutex_v2.h | 171 + .../lib/tbb_2020.3/src/old/task_v2.cpp | 34 + .../src/old/test_concurrent_queue_v2.cpp | 344 ++ .../src/old/test_concurrent_vector_v2.cpp | 554 ++ .../lib/tbb_2020.3/src/old/test_mutex_v2.cpp | 238 + .../old/test_task_scheduler_observer_v3.cpp | 117 + .../src/perf/coarse_grained_raii_lru_cache.h | 143 + .../lib/tbb_2020.3/src/perf/cpq_pdes.cpp | 226 + .../src/perf/fibonacci_impl_tbb.cpp | 74 + .../lib/tbb_2020.3/src/perf/harness_perf.h | 39 + .../lib/tbb_2020.3/src/perf/perf.cpp | 856 +++ .../stan_math/lib/tbb_2020.3/src/perf/perf.h | 253 + .../lib/tbb_2020.3/src/perf/perf_sched.cpp | 452 ++ .../lib/tbb_2020.3/src/perf/run_statistics.sh | 28 + .../lib/tbb_2020.3/src/perf/statistics.cpp | 440 ++ .../lib/tbb_2020.3/src/perf/statistics.h | 187 + .../lib/tbb_2020.3/src/perf/statistics_xml.h | 196 + .../tbb_2020.3/src/perf/time_async_return.cpp | 222 + .../src/perf/time_cpq_throughput_test.cpp | 290 + .../src/perf/time_fibonacci_cutoff.cpp | 126 + .../lib/tbb_2020.3/src/perf/time_framework.h | 347 ++ .../lib/tbb_2020.3/src/perf/time_hash_map.cpp | 257 + .../src/perf/time_hash_map_fill.cpp | 163 + .../src/perf/time_hash_map_fill.html | 122 + .../tbb_2020.3/src/perf/time_locked_work.cpp | 162 + .../src/perf/time_lru_cache_throughput.cpp | 213 + .../src/perf/time_parallel_for_each.cpp | 66 + .../src/perf/time_resumable_tasks.cpp | 323 ++ .../lib/tbb_2020.3/src/perf/time_sandbox.h | 167 + .../tbb_2020.3/src/perf/time_split_node.cpp | 116 + .../lib/tbb_2020.3/src/perf/time_vector.cpp | 245 + .../lib/tbb_2020.3/src/rml/client/index.html | 42 + .../src/rml/client/library_assert.h | 30 + .../src/rml/client/omp_dynamic_link.cpp | 20 + .../src/rml/client/omp_dynamic_link.h | 26 + .../tbb_2020.3/src/rml/client/rml_factory.h | 90 + .../lib/tbb_2020.3/src/rml/client/rml_omp.cpp | 42 + .../lib/tbb_2020.3/src/rml/client/rml_tbb.cpp | 44 + .../lib/tbb_2020.3/src/rml/include/index.html | 29 + .../lib/tbb_2020.3/src/rml/include/rml_base.h | 184 + .../lib/tbb_2020.3/src/rml/include/rml_omp.h | 126 + .../lib/tbb_2020.3/src/rml/include/rml_tbb.h | 97 + .../lib/tbb_2020.3/src/rml/index.html | 31 + .../tbb_2020.3/src/rml/perfor/omp_nested.cpp | 140 + .../tbb_2020.3/src/rml/perfor/omp_simple.cpp | 156 + .../src/rml/perfor/tbb_multi_omp.cpp | 182 + .../tbb_2020.3/src/rml/perfor/tbb_simple.cpp | 187 + .../tbb_2020.3/src/rml/perfor/thread_level.h | 130 + .../lib/tbb_2020.3/src/rml/server/index.html | 18 + .../lib/tbb_2020.3/src/rml/server/irml.rc | 112 + .../tbb_2020.3/src/rml/server/job_automaton.h | 141 + .../src/rml/server/lin-rml-export.def | 26 + .../tbb_2020.3/src/rml/server/rml_server.cpp | 3305 ++++++++++++ .../src/rml/server/thread_monitor.h | 268 + .../tbb_2020.3/src/rml/server/wait_counter.h | 69 + .../src/rml/server/win32-rml-export.def | 23 + .../src/rml/server/win64-rml-export.def | 23 + .../tbb_2020.3/src/rml/test/rml_omp_stub.cpp | 68 + .../src/rml/test/test_job_automaton.cpp | 148 + .../src/rml/test/test_rml_mixed.cpp | 314 ++ .../tbb_2020.3/src/rml/test/test_rml_omp.cpp | 199 + .../src/rml/test/test_rml_omp_c_linkage.c | 22 + .../tbb_2020.3/src/rml/test/test_rml_tbb.cpp | 201 + .../lib/tbb_2020.3/src/rml/test/test_server.h | 429 ++ .../src/rml/test/test_thread_monitor.cpp | 113 + .../lib/tbb_2020.3/src/tbb/arena.cpp | 1220 +++++ .../stan_math/lib/tbb_2020.3/src/tbb/arena.h | 556 ++ .../src/tbb/cache_aligned_allocator.cpp | 252 + .../lib/tbb_2020.3/src/tbb/cilk-tbb-interop.h | 111 + .../lib/tbb_2020.3/src/tbb/co_context.h | 217 + .../src/tbb/concurrent_hash_map.cpp | 54 + .../tbb_2020.3/src/tbb/concurrent_monitor.cpp | 132 + .../tbb_2020.3/src/tbb/concurrent_monitor.h | 237 + .../tbb_2020.3/src/tbb/concurrent_queue.cpp | 670 +++ .../tbb_2020.3/src/tbb/concurrent_vector.cpp | 610 +++ .../tbb_2020.3/src/tbb/condition_variable.cpp | 205 + .../tbb_2020.3/src/tbb/critical_section.cpp | 27 + .../lib/tbb_2020.3/src/tbb/custom_scheduler.h | 829 +++ .../lib/tbb_2020.3/src/tbb/dynamic_link.cpp | 573 ++ .../lib/tbb_2020.3/src/tbb/dynamic_link.h | 119 + .../lib/tbb_2020.3/src/tbb/governor.cpp | 549 ++ .../lib/tbb_2020.3/src/tbb/governor.h | 166 + .../src/tbb/ia32-masm/atomic_support.asm | 184 + .../lib/tbb_2020.3/src/tbb/ia32-masm/itsx.asm | 76 + .../src/tbb/ia32-masm/lock_byte.asm | 34 + .../src/tbb/ia64-gas/atomic_support.s | 666 +++ .../tbb_2020.3/src/tbb/ia64-gas/ia64_misc.s | 95 + .../tbb_2020.3/src/tbb/ia64-gas/lock_byte.s | 42 + .../lib/tbb_2020.3/src/tbb/ia64-gas/log2.s | 54 + .../lib/tbb_2020.3/src/tbb/ia64-gas/pause.s | 29 + .../src/tbb/ibm_aix51/atomic_support.c | 51 + .../lib/tbb_2020.3/src/tbb/index.html | 31 + .../src/tbb/intel64-masm/atomic_support.asm | 68 + .../src/tbb/intel64-masm/intel64_misc.asm | 29 + .../tbb_2020.3/src/tbb/intel64-masm/itsx.asm | 72 + .../lib/tbb_2020.3/src/tbb/intrusive_list.h | 237 + .../lib/tbb_2020.3/src/tbb/itt_notify.cpp | 95 + .../lib/tbb_2020.3/src/tbb/itt_notify.h | 131 + .../tbb_2020.3/src/tbb/lin32-tbb-export.def | 45 + .../tbb_2020.3/src/tbb/lin32-tbb-export.lst | 410 ++ .../src/tbb/lin32-tbbbind-export.def | 24 + .../tbb_2020.3/src/tbb/lin64-tbb-export.def | 42 + .../tbb_2020.3/src/tbb/lin64-tbb-export.lst | 391 ++ .../src/tbb/lin64-tbbbind-export.def | 24 + .../src/tbb/lin64ipf-tbb-export.def | 44 + .../src/tbb/lin64ipf-tbb-export.lst | 427 ++ .../tbb_2020.3/src/tbb/mac32-tbb-export.def | 19 + .../tbb_2020.3/src/tbb/mac32-tbb-export.lst | 418 ++ .../tbb_2020.3/src/tbb/mac64-tbb-export.def | 19 + .../tbb_2020.3/src/tbb/mac64-tbb-export.lst | 415 ++ .../lib/tbb_2020.3/src/tbb/mailbox.h | 242 + .../lib/tbb_2020.3/src/tbb/market.cpp | 819 +++ .../stan_math/lib/tbb_2020.3/src/tbb/market.h | 391 ++ .../lib/tbb_2020.3/src/tbb/mutex.cpp | 148 + .../lib/tbb_2020.3/src/tbb/observer_proxy.cpp | 365 ++ .../lib/tbb_2020.3/src/tbb/observer_proxy.h | 169 + .../lib/tbb_2020.3/src/tbb/pipeline.cpp | 788 +++ .../lib/tbb_2020.3/src/tbb/private_server.cpp | 418 ++ .../lib/tbb_2020.3/src/tbb/queuing_mutex.cpp | 104 + .../tbb_2020.3/src/tbb/queuing_rw_mutex.cpp | 488 ++ .../tbb_2020.3/src/tbb/reader_writer_lock.cpp | 343 ++ .../tbb_2020.3/src/tbb/recursive_mutex.cpp | 132 + .../lib/tbb_2020.3/src/tbb/scheduler.cpp | 1472 +++++ .../lib/tbb_2020.3/src/tbb/scheduler.h | 1027 ++++ .../lib/tbb_2020.3/src/tbb/scheduler_common.h | 455 ++ .../tbb_2020.3/src/tbb/scheduler_utility.h | 129 + .../lib/tbb_2020.3/src/tbb/semaphore.cpp | 90 + .../lib/tbb_2020.3/src/tbb/semaphore.h | 250 + .../lib/tbb_2020.3/src/tbb/spin_mutex.cpp | 54 + .../lib/tbb_2020.3/src/tbb/spin_rw_mutex.cpp | 155 + .../stan_math/lib/tbb_2020.3/src/tbb/task.cpp | 271 + .../tbb_2020.3/src/tbb/task_group_context.cpp | 493 ++ .../lib/tbb_2020.3/src/tbb/task_stream.h | 168 + .../tbb_2020.3/src/tbb/task_stream_extended.h | 319 ++ .../lib/tbb_2020.3/src/tbb/tbb_assert_impl.h | 102 + .../lib/tbb_2020.3/src/tbb/tbb_bind.cpp | 302 ++ .../lib/tbb_2020.3/src/tbb/tbb_environment.h | 85 + .../lib/tbb_2020.3/src/tbb/tbb_main.cpp | 585 ++ .../lib/tbb_2020.3/src/tbb/tbb_main.h | 95 + .../lib/tbb_2020.3/src/tbb/tbb_misc.cpp | 318 ++ .../lib/tbb_2020.3/src/tbb/tbb_misc.h | 292 + .../lib/tbb_2020.3/src/tbb/tbb_misc_ex.cpp | 401 ++ .../lib/tbb_2020.3/src/tbb/tbb_resource.rc | 112 + .../lib/tbb_2020.3/src/tbb/tbb_statistics.cpp | 183 + .../lib/tbb_2020.3/src/tbb/tbb_statistics.h | 236 + .../lib/tbb_2020.3/src/tbb/tbb_thread.cpp | 192 + .../lib/tbb_2020.3/src/tbb/tbb_version.h | 115 + .../stan_math/lib/tbb_2020.3/src/tbb/tls.h | 120 + .../src/tbb/tools_api/disable_warnings.h | 35 + .../tbb_2020.3/src/tbb/tools_api/ittnotify.h | 4164 +++++++++++++++ .../src/tbb/tools_api/ittnotify_config.h | 585 ++ .../src/tbb/tools_api/ittnotify_static.c | 1244 +++++ .../src/tbb/tools_api/ittnotify_static.h | 354 ++ .../src/tbb/tools_api/ittnotify_types.h | 73 + .../src/tbb/tools_api/legacy/ittnotify.h | 998 ++++ .../tbb_2020.3/src/tbb/win32-tbb-export.def | 24 + .../tbb_2020.3/src/tbb/win32-tbb-export.lst | 350 ++ .../src/tbb/win32-tbbbind-export.def | 22 + .../src/tbb/win64-gcc-tbb-export.def | 40 + .../src/tbb/win64-gcc-tbb-export.lst | 399 ++ .../tbb_2020.3/src/tbb/win64-tbb-export.def | 22 + .../tbb_2020.3/src/tbb/win64-tbb-export.lst | 345 ++ .../src/tbb/win64-tbbbind-export.def | 22 + .../tbb_2020.3/src/tbb/winrt-tbb-export.lst | 296 + .../tbb_2020.3/src/tbb/x86_rtm_rw_mutex.cpp | 278 + .../lib/tbb_2020.3/src/tbbmalloc/Customize.h | 146 + .../lib/tbb_2020.3/src/tbbmalloc/MapMemory.h | 205 + .../lib/tbb_2020.3/src/tbbmalloc/Statistics.h | 125 + .../tbb_2020.3/src/tbbmalloc/Synchronize.h | 104 + .../src/tbbmalloc/TypeDefinitions.h | 58 + .../lib/tbb_2020.3/src/tbbmalloc/backend.cpp | 1489 ++++++ .../lib/tbb_2020.3/src/tbbmalloc/backend.h | 385 ++ .../lib/tbb_2020.3/src/tbbmalloc/backref.cpp | 338 ++ .../lib/tbb_2020.3/src/tbbmalloc/frontend.cpp | 3291 ++++++++++++ .../lib/tbb_2020.3/src/tbbmalloc/index.html | 54 + .../src/tbbmalloc/large_objects.cpp | 1033 ++++ .../tbb_2020.3/src/tbbmalloc/large_objects.h | 368 ++ .../src/tbbmalloc/lin32-proxy-export.def | 55 + .../src/tbbmalloc/lin32-tbbmalloc-export.def | 73 + .../src/tbbmalloc/lin64-proxy-export.def | 55 + .../src/tbbmalloc/lin64-tbbmalloc-export.def | 73 + .../src/tbbmalloc/lin64ipf-proxy-export.def | 55 + .../tbbmalloc/lin64ipf-tbbmalloc-export.def | 76 + .../src/tbbmalloc/mac32-tbbmalloc-export.def | 46 + .../src/tbbmalloc/mac64-tbbmalloc-export.def | 46 + .../lib/tbb_2020.3/src/tbbmalloc/proxy.cpp | 809 +++ .../lib/tbb_2020.3/src/tbbmalloc/proxy.h | 62 + .../src/tbbmalloc/proxy_overload_osx.h | 186 + .../tbb_2020.3/src/tbbmalloc/shared_utils.h | 151 + .../tbbmalloc/tbb_function_replacement.cpp | 583 ++ .../src/tbbmalloc/tbb_function_replacement.h | 79 + .../tbb_2020.3/src/tbbmalloc/tbbmalloc.cpp | 117 + .../lib/tbb_2020.3/src/tbbmalloc/tbbmalloc.rc | 115 + .../src/tbbmalloc/tbbmalloc_internal.h | 717 +++ .../src/tbbmalloc/tbbmalloc_internal_api.h | 40 + .../tbbmalloc/win32-gcc-tbbmalloc-export.def | 49 + .../src/tbbmalloc/win32-tbbmalloc-export.def | 45 + .../tbbmalloc/win64-gcc-tbbmalloc-export.def | 49 + .../src/tbbmalloc/win64-tbbmalloc-export.def | 46 + .../src/tbbproxy/tbbproxy-windows.asm | 107 + .../lib/tbb_2020.3/src/tbbproxy/tbbproxy.cpp | 608 +++ .../lib/tbb_2020.3/src/test/harness.h | 882 +++ .../tbb_2020.3/src/test/harness_allocator.h | 869 +++ .../src/test/harness_allocator_overload.h | 35 + .../lib/tbb_2020.3/src/test/harness_assert.h | 37 + .../tbb_2020.3/src/test/harness_bad_expr.h | 73 + .../lib/tbb_2020.3/src/test/harness_barrier.h | 136 + .../tbb_2020.3/src/test/harness_checktype.h | 95 + .../tbb_2020.3/src/test/harness_concurrency.h | 101 + .../src/test/harness_concurrency_tracker.h | 170 + .../lib/tbb_2020.3/src/test/harness_cpu.h | 116 + .../lib/tbb_2020.3/src/test/harness_defs.h | 220 + .../src/test/harness_dynamic_libs.h | 124 + .../lib/tbb_2020.3/src/test/harness_eh.h | 313 ++ .../lib/tbb_2020.3/src/test/harness_fp.h | 168 + .../lib/tbb_2020.3/src/test/harness_graph.h | 1240 +++++ .../src/test/harness_inject_scheduler.h | 82 + .../tbb_2020.3/src/test/harness_iterator.h | 160 + .../lib/tbb_2020.3/src/test/harness_m128.h | 125 + .../lib/tbb_2020.3/src/test/harness_memory.h | 141 + .../lib/tbb_2020.3/src/test/harness_mic.h | 42 + .../lib/tbb_2020.3/src/test/harness_preload.h | 43 + .../lib/tbb_2020.3/src/test/harness_report.h | 174 + .../src/test/harness_runtime_loader.h | 33 + .../src/test/harness_state_trackable.h | 143 + .../lib/tbb_2020.3/src/test/harness_task.h | 51 + .../src/test/harness_tbb_independence.h | 83 + .../src/test/harness_test_cases_framework.h | 236 + .../lib/tbb_2020.3/src/test/harness_tls.h | 75 + .../lib/tbb_2020.3/src/test/harness_tsx.h | 66 + .../src/test/test_ScalableAllocator.cpp | 223 + .../src/test/test_ScalableAllocator_STL.cpp | 50 + .../tbb_2020.3/src/test/test_aggregator.cpp | 180 + .../src/test/test_aligned_space.cpp | 115 + .../lib/tbb_2020.3/src/test/test_allocator.h | 278 + .../tbb_2020.3/src/test/test_allocator_STL.h | 147 + .../src/test/test_arena_constraints_hwloc.cpp | 383 ++ .../src/test/test_arena_constraints_stubs.cpp | 41 + .../lib/tbb_2020.3/src/test/test_assembly.cpp | 160 + .../tbb_2020.3/src/test/test_async_msg.cpp | 599 +++ .../tbb_2020.3/src/test/test_async_node.cpp | 857 +++ .../lib/tbb_2020.3/src/test/test_atomic.cpp | 1601 ++++++ .../src/test/test_blocked_range.cpp | 206 + .../src/test/test_blocked_range2d.cpp | 168 + .../src/test/test_blocked_range3d.cpp | 201 + .../src/test/test_blocked_rangeNd.cpp | 255 + .../src/test/test_broadcast_node.cpp | 385 ++ .../tbb_2020.3/src/test/test_buffer_node.cpp | 492 ++ .../src/test/test_cache_aligned_allocator.cpp | 76 + .../test/test_cache_aligned_allocator_STL.cpp | 42 + .../tbb_2020.3/src/test/test_cilk_common.h | 79 + .../src/test/test_cilk_dynamic_load.cpp | 152 + .../tbb_2020.3/src/test/test_cilk_interop.cpp | 151 + .../tbb_2020.3/src/test/test_combinable.cpp | 503 ++ .../src/test/test_composite_node.cpp | 602 +++ .../test/test_concurrent_associative_common.h | 1518 ++++++ .../src/test/test_concurrent_hash_map.cpp | 1713 ++++++ .../src/test/test_concurrent_lru_cache.cpp | 462 ++ .../src/test/test_concurrent_map.cpp | 265 + .../src/test/test_concurrent_monitor.cpp | 365 ++ .../src/test/test_concurrent_ordered_common.h | 375 ++ .../test/test_concurrent_priority_queue.cpp | 1216 +++++ .../src/test/test_concurrent_queue.cpp | 1752 ++++++ .../test/test_concurrent_queue_whitebox.cpp | 97 + .../src/test/test_concurrent_set.cpp | 253 + .../test/test_concurrent_unordered_common.h | 293 + .../test/test_concurrent_unordered_map.cpp | 252 + .../test/test_concurrent_unordered_set.cpp | 272 + .../src/test/test_concurrent_vector.cpp | 1874 +++++++ .../src/test/test_condition_variable.h | 763 +++ .../src/test/test_container_move_support.h | 897 ++++ .../src/test/test_continue_node.cpp | 568 ++ .../src/test/test_critical_section.cpp | 212 + .../tbb_2020.3/src/test/test_dynamic_link.cpp | 80 + .../src/test/test_eh_algorithms.cpp | 1579 ++++++ .../src/test/test_eh_flow_graph.cpp | 2081 ++++++++ .../lib/tbb_2020.3/src/test/test_eh_tasks.cpp | 787 +++ .../test/test_enumerable_thread_specific.cpp | 1380 +++++ .../src/test/test_environment_whitebox.cpp | 241 + .../src/test/test_examples_common_utility.cpp | 598 +++ .../tbb_2020.3/src/test/test_fast_random.cpp | 196 + .../tbb_2020.3/src/test/test_flow_graph.cpp | 386 ++ .../src/test/test_flow_graph_priorities.cpp | 611 +++ .../src/test/test_flow_graph_whitebox.cpp | 719 +++ .../src/test/test_follows_and_precedes_api.h | 263 + .../lib/tbb_2020.3/src/test/test_fp.cpp | 381 ++ .../src/test/test_function_node.cpp | 684 +++ .../src/test/test_global_control.cpp | 793 +++ .../src/test/test_global_control_whitebox.cpp | 78 + .../lib/tbb_2020.3/src/test/test_halt.cpp | 109 + .../src/test/test_handle_perror.cpp | 54 + .../src/test/test_hw_concurrency.cpp | 52 + .../tbb_2020.3/src/test/test_indexer_node.cpp | 997 ++++ .../src/test/test_initializer_list.h | 172 + .../tbb_2020.3/src/test/test_inits_loop.cpp | 90 + .../tbb_2020.3/src/test/test_input_node.cpp | 388 ++ .../src/test/test_intrusive_list.cpp | 146 + .../tbb_2020.3/src/test/test_iterators.cpp | 281 + .../tbb_2020.3/src/test/test_ittnotify.cpp | 88 + .../tbb_2020.3/src/test/test_join_node.cpp | 192 + .../lib/tbb_2020.3/src/test/test_join_node.h | 2177 ++++++++ .../src/test/test_join_node_key_matching.cpp | 102 + .../test/test_join_node_msg_key_matching.cpp | 115 + .../lib/tbb_2020.3/src/test/test_lambda.cpp | 235 + .../tbb_2020.3/src/test/test_limiter_node.cpp | 674 +++ .../src/test/test_malloc_atexit.cpp | 157 + .../src/test/test_malloc_compliance.cpp | 1121 ++++ .../src/test/test_malloc_init_shutdown.cpp | 176 + .../src/test/test_malloc_lib_unload.cpp | 218 + .../src/test/test_malloc_new_handler.cpp | 81 + .../src/test/test_malloc_overload.cpp | 477 ++ .../src/test/test_malloc_overload_disable.cpp | 69 + .../tbb_2020.3/src/test/test_malloc_pools.cpp | 883 +++ .../tbb_2020.3/src/test/test_malloc_pure_c.c | 128 + .../src/test/test_malloc_regression.cpp | 186 + .../src/test/test_malloc_shutdown_hang.cpp | 125 + .../src/test/test_malloc_used_by_lib.cpp | 167 + .../src/test/test_malloc_whitebox.cpp | 1629 ++++++ .../tbb_2020.3/src/test/test_model_plugin.cpp | 216 + .../src/test/test_multifunction_node.cpp | 771 +++ .../lib/tbb_2020.3/src/test/test_mutex.cpp | 711 +++ .../src/test/test_mutex_native_threads.cpp | 217 + .../src/test/test_opencl_kernel_32.spir | Bin 0 -> 1440 bytes .../src/test/test_opencl_kernel_64.spir | Bin 0 -> 1468 bytes .../tbb_2020.3/src/test/test_opencl_node.cl | 185 + .../tbb_2020.3/src/test/test_opencl_node.cpp | 911 ++++ .../test_opencl_precompiled_kernel_gpu_32.ir | Bin 0 -> 4110 bytes .../test_opencl_precompiled_kernel_gpu_64.ir | Bin 0 -> 4186 bytes .../lib/tbb_2020.3/src/test/test_openmp.cpp | 246 + .../src/test/test_overwrite_node.cpp | 203 + .../tbb_2020.3/src/test/test_parallel_do.cpp | 424 ++ .../tbb_2020.3/src/test/test_parallel_for.cpp | 777 +++ .../src/test/test_parallel_for_each.cpp | 244 + .../test/test_parallel_for_vectorization.cpp | 71 + .../src/test/test_parallel_invoke.cpp | 317 ++ .../src/test/test_parallel_pipeline.cpp | 673 +++ .../src/test/test_parallel_reduce.cpp | 488 ++ .../src/test/test_parallel_scan.cpp | 459 ++ .../src/test/test_parallel_sort.cpp | 556 ++ .../src/test/test_parallel_while.cpp | 167 + .../tbb_2020.3/src/test/test_partitioner.h | 607 +++ .../src/test/test_partitioner_whitebox.cpp | 147 + .../src/test/test_partitioner_whitebox.h | 468 ++ .../lib/tbb_2020.3/src/test/test_pipeline.cpp | 309 ++ .../src/test/test_pipeline_with_tbf.cpp | 528 ++ .../src/test/test_priority_queue_node.cpp | 410 ++ .../tbb_2020.3/src/test/test_queue_node.cpp | 518 ++ .../src/test/test_range_based_for.h | 75 + .../src/test/test_reader_writer_lock.cpp | 234 + .../src/test/test_resumable_tasks.cpp | 431 ++ .../src/test/test_runtime_loader.cpp | 281 + .../src/test/test_rwm_upgrade_downgrade.cpp | 70 + .../tbb_2020.3/src/test/test_semaphore.cpp | 311 ++ .../src/test/test_sequencer_node.cpp | 464 ++ .../tbb_2020.3/src/test/test_source_node.cpp | 572 ++ .../tbb_2020.3/src/test/test_split_node.cpp | 452 ++ .../src/test/test_static_assert.cpp | 85 + .../tbb_2020.3/src/test/test_std_thread.cpp | 39 + .../src/test/test_streaming_node.cpp | 913 ++++ .../tbb_2020.3/src/test/test_tagged_msg.cpp | 259 + .../lib/tbb_2020.3/src/test/test_task.cpp | 1345 +++++ .../tbb_2020.3/src/test/test_task_arena.cpp | 1674 ++++++ .../src/test/test_task_assertions.cpp | 90 + .../src/test/test_task_auto_init.cpp | 198 + .../tbb_2020.3/src/test/test_task_enqueue.cpp | 376 ++ .../tbb_2020.3/src/test/test_task_group.cpp | 1115 ++++ .../tbb_2020.3/src/test/test_task_leaks.cpp | 293 + .../src/test/test_task_priority.cpp | 667 +++ .../src/test/test_task_scheduler_init.cpp | 367 ++ .../src/test/test_task_scheduler_observer.cpp | 344 ++ .../src/test/test_task_steal_limit.cpp | 75 + .../src/test/test_tbb_condition_variable.cpp | 25 + .../lib/tbb_2020.3/src/test/test_tbb_fork.cpp | 326 ++ .../tbb_2020.3/src/test/test_tbb_header.cpp | 365 ++ .../tbb_2020.3/src/test/test_tbb_thread.cpp | 29 + .../tbb_2020.3/src/test/test_tbb_version.cpp | 284 + .../lib/tbb_2020.3/src/test/test_thread.h | 305 ++ .../tbb_2020.3/src/test/test_tick_count.cpp | 199 + .../lib/tbb_2020.3/src/test/test_tuple.cpp | 200 + .../src/test/test_write_once_node.cpp | 212 + .../lib/tbb_2020.3/src/test/test_yield.cpp | 64 + .../lib/tbb_2020.3/third-party-programs.txt | 230 + .../site-packages/prophet/stan_model/prophet | Bin 0 -> 2854448 bytes .../prophet/stan_model/prophet.hpp | 1343 +++++ .../prophet/stan_model/prophet.stan | 143 + .../prophet/stan_model/prophet_model.bin | Bin 0 -> 2854448 bytes .../site-packages/prophet/tests/__init__.py | 0 .../__pycache__/__init__.cpython-312.pyc | Bin 0 -> 205 bytes .../__pycache__/conftest.cpython-312.pyc | Bin 0 -> 3422 bytes .../test_diagnostics.cpython-312.pyc | Bin 0 -> 25299 bytes .../__pycache__/test_prophet.cpython-312.pyc | Bin 0 -> 57130 bytes .../test_serialize.cpython-312.pyc | Bin 0 -> 7770 bytes .../test_utilities.cpython-312.pyc | Bin 0 -> 1882 bytes .../site-packages/prophet/tests/conftest.py | 57 + .../site-packages/prophet/tests/data.csv | 511 ++ .../site-packages/prophet/tests/data2.csv | 864 +++ .../site-packages/prophet/tests/data3.csv | 71 + .../tests/serialized_model_v0.6.1.dev0.json | 1 + .../tests/serialized_model_v0.7.1.json | 1 + .../tests/serialized_model_v1.0.1.json | 1 + .../prophet/tests/test_diagnostics.py | 403 ++ .../prophet/tests/test_prophet.py | 984 ++++ .../prophet/tests/test_serialize.py | 142 + .../prophet/tests/test_utilities.py | 27 + .../site-packages/prophet/utilities.py | 105 + .../stanio-0.5.1.dist-info/INSTALLER | 1 + .../stanio-0.5.1.dist-info/LICENSE | 11 + .../stanio-0.5.1.dist-info/METADATA | 37 + .../stanio-0.5.1.dist-info/RECORD | 15 + .../stanio-0.5.1.dist-info/WHEEL | 5 + .../stanio-0.5.1.dist-info/top_level.txt | 1 + .../site-packages/stanio/__init__.py | 14 + .../__pycache__/__init__.cpython-312.pyc | Bin 0 -> 486 bytes .../stanio/__pycache__/csv.cpython-312.pyc | Bin 0 -> 2387 bytes .../stanio/__pycache__/json.cpython-312.pyc | Bin 0 -> 5032 bytes .../__pycache__/reshape.cpython-312.pyc | Bin 0 -> 11733 bytes .../python3.12/site-packages/stanio/csv.py | 50 + .../python3.12/site-packages/stanio/json.py | 102 + .../python3.12/site-packages/stanio/py.typed | 0 .../site-packages/stanio/reshape.py | 252 + .../tqdm-4.67.1.dist-info/INSTALLER | 1 + .../tqdm-4.67.1.dist-info/LICENCE | 49 + .../tqdm-4.67.1.dist-info/METADATA | 1594 ++++++ .../tqdm-4.67.1.dist-info/RECORD | 74 + .../site-packages/tqdm-4.67.1.dist-info/WHEEL | 5 + .../tqdm-4.67.1.dist-info/entry_points.txt | 2 + .../tqdm-4.67.1.dist-info/top_level.txt | 1 + .../python3.12/site-packages/tqdm/__init__.py | 38 + .../python3.12/site-packages/tqdm/__main__.py | 3 + .../tqdm/__pycache__/__init__.cpython-312.pyc | Bin 0 -> 1696 bytes .../tqdm/__pycache__/__main__.cpython-312.pyc | Bin 0 -> 250 bytes .../__pycache__/_dist_ver.cpython-312.pyc | Bin 0 -> 224 bytes .../tqdm/__pycache__/_main.cpython-312.pyc | Bin 0 -> 498 bytes .../tqdm/__pycache__/_monitor.cpython-312.pyc | Bin 0 -> 4179 bytes .../tqdm/__pycache__/_tqdm.cpython-312.pyc | Bin 0 -> 493 bytes .../__pycache__/_tqdm_gui.cpython-312.pyc | Bin 0 -> 506 bytes .../_tqdm_notebook.cpython-312.pyc | Bin 0 -> 527 bytes .../__pycache__/_tqdm_pandas.cpython-312.pyc | Bin 0 -> 1431 bytes .../tqdm/__pycache__/_utils.cpython-312.pyc | Bin 0 -> 905 bytes .../tqdm/__pycache__/asyncio.cpython-312.pyc | Bin 0 -> 4485 bytes .../tqdm/__pycache__/auto.cpython-312.pyc | Bin 0 -> 1359 bytes .../__pycache__/autonotebook.cpython-312.pyc | Bin 0 -> 1270 bytes .../tqdm/__pycache__/cli.cpython-312.pyc | Bin 0 -> 15440 bytes .../tqdm/__pycache__/dask.cpython-312.pyc | Bin 0 -> 2568 bytes .../tqdm/__pycache__/gui.cpython-312.pyc | Bin 0 -> 7806 bytes .../tqdm/__pycache__/keras.cpython-312.pyc | Bin 0 -> 6920 bytes .../tqdm/__pycache__/notebook.cpython-312.pyc | Bin 0 -> 11652 bytes .../tqdm/__pycache__/rich.cpython-312.pyc | Bin 0 -> 7244 bytes .../tqdm/__pycache__/std.cpython-312.pyc | Bin 0 -> 64491 bytes .../tqdm/__pycache__/tk.cpython-312.pyc | Bin 0 -> 9949 bytes .../tqdm/__pycache__/utils.cpython-312.pyc | Bin 0 -> 18802 bytes .../tqdm/__pycache__/version.cpython-312.pyc | Bin 0 -> 623 bytes .../site-packages/tqdm/_dist_ver.py | 1 + .../python3.12/site-packages/tqdm/_main.py | 9 + .../python3.12/site-packages/tqdm/_monitor.py | 95 + .../python3.12/site-packages/tqdm/_tqdm.py | 9 + .../site-packages/tqdm/_tqdm_gui.py | 9 + .../site-packages/tqdm/_tqdm_notebook.py | 9 + .../site-packages/tqdm/_tqdm_pandas.py | 24 + .../python3.12/site-packages/tqdm/_utils.py | 11 + .../python3.12/site-packages/tqdm/asyncio.py | 93 + .../lib/python3.12/site-packages/tqdm/auto.py | 40 + .../site-packages/tqdm/autonotebook.py | 29 + .../lib/python3.12/site-packages/tqdm/cli.py | 324 ++ .../site-packages/tqdm/completion.sh | 19 + .../site-packages/tqdm/contrib/__init__.py | 92 + .../__pycache__/__init__.cpython-312.pyc | Bin 0 -> 4209 bytes .../contrib/__pycache__/bells.cpython-312.pyc | Bin 0 -> 1330 bytes .../__pycache__/concurrent.cpython-312.pyc | Bin 0 -> 4681 bytes .../__pycache__/discord.cpython-312.pyc | Bin 0 -> 8100 bytes .../__pycache__/itertools.cpython-312.pyc | Bin 0 -> 1444 bytes .../__pycache__/logging.cpython-312.pyc | Bin 0 -> 5152 bytes .../contrib/__pycache__/slack.cpython-312.pyc | Bin 0 -> 6109 bytes .../__pycache__/telegram.cpython-312.pyc | Bin 0 -> 7747 bytes .../__pycache__/utils_worker.cpython-312.pyc | Bin 0 -> 2098 bytes .../site-packages/tqdm/contrib/bells.py | 26 + .../site-packages/tqdm/contrib/concurrent.py | 105 + .../site-packages/tqdm/contrib/discord.py | 156 + .../site-packages/tqdm/contrib/itertools.py | 35 + .../site-packages/tqdm/contrib/logging.py | 126 + .../site-packages/tqdm/contrib/slack.py | 120 + .../site-packages/tqdm/contrib/telegram.py | 153 + .../tqdm/contrib/utils_worker.py | 38 + .../lib/python3.12/site-packages/tqdm/dask.py | 44 + .../lib/python3.12/site-packages/tqdm/gui.py | 179 + .../python3.12/site-packages/tqdm/keras.py | 122 + .../python3.12/site-packages/tqdm/notebook.py | 317 ++ .../lib/python3.12/site-packages/tqdm/rich.py | 151 + .../lib/python3.12/site-packages/tqdm/std.py | 1524 ++++++ .venv/lib/python3.12/site-packages/tqdm/tk.py | 196 + .../lib/python3.12/site-packages/tqdm/tqdm.1 | 314 ++ .../python3.12/site-packages/tqdm/utils.py | 399 ++ .../python3.12/site-packages/tqdm/version.py | 9 + app.py | 354 +- models/__init__.py | 1 + models/__pycache__/__init__.cpython-312.pyc | Bin 0 -> 163 bytes models/__pycache__/plotting.cpython-312.pyc | Bin 0 -> 6882 bytes .../__pycache__/time_series.cpython-312.pyc | Bin 0 -> 8038 bytes models/plotting.py | 138 + models/time_series.py | 176 + templates/index.html | 154 +- templates/results.html | 323 +- utils/__init__.py | 1 + utils/__pycache__/__init__.cpython-312.pyc | Bin 0 -> 162 bytes .../__pycache__/file_handling.cpython-312.pyc | Bin 0 -> 1353 bytes .../forecast_history.cpython-312.pyc | Bin 0 -> 2649 bytes utils/file_handling.py | 15 + utils/forecast_history.py | 58 + 2118 files changed, 297840 insertions(+), 502 deletions(-) create mode 100755 .venv/bin/install_cmdstan create mode 100755 .venv/bin/install_cxx_toolchain create mode 100755 .venv/bin/tqdm create mode 100644 .venv/lib/python3.12/site-packages/cmdstanpy-1.2.5.dist-info/INSTALLER create mode 100644 .venv/lib/python3.12/site-packages/cmdstanpy-1.2.5.dist-info/LICENSE.md create mode 100644 .venv/lib/python3.12/site-packages/cmdstanpy-1.2.5.dist-info/METADATA create mode 100644 .venv/lib/python3.12/site-packages/cmdstanpy-1.2.5.dist-info/RECORD create mode 100644 .venv/lib/python3.12/site-packages/cmdstanpy-1.2.5.dist-info/WHEEL create mode 100644 .venv/lib/python3.12/site-packages/cmdstanpy-1.2.5.dist-info/entry_points.txt create mode 100644 .venv/lib/python3.12/site-packages/cmdstanpy-1.2.5.dist-info/top_level.txt create mode 100644 .venv/lib/python3.12/site-packages/cmdstanpy/__init__.py create mode 100644 .venv/lib/python3.12/site-packages/cmdstanpy/__pycache__/__init__.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/cmdstanpy/__pycache__/_version.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/cmdstanpy/__pycache__/cmdstan_args.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/cmdstanpy/__pycache__/compilation.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/cmdstanpy/__pycache__/install_cmdstan.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/cmdstanpy/__pycache__/install_cxx_toolchain.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/cmdstanpy/__pycache__/model.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/cmdstanpy/__pycache__/progress.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/cmdstanpy/_version.py create mode 100644 .venv/lib/python3.12/site-packages/cmdstanpy/cmdstan_args.py create mode 100644 .venv/lib/python3.12/site-packages/cmdstanpy/compilation.py create mode 100644 .venv/lib/python3.12/site-packages/cmdstanpy/install_cmdstan.py create mode 100644 .venv/lib/python3.12/site-packages/cmdstanpy/install_cxx_toolchain.py create mode 100644 .venv/lib/python3.12/site-packages/cmdstanpy/model.py create mode 100644 .venv/lib/python3.12/site-packages/cmdstanpy/progress.py create mode 100644 .venv/lib/python3.12/site-packages/cmdstanpy/py.typed create mode 100644 .venv/lib/python3.12/site-packages/cmdstanpy/stanfit/__init__.py create mode 100644 .venv/lib/python3.12/site-packages/cmdstanpy/stanfit/__pycache__/__init__.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/cmdstanpy/stanfit/__pycache__/gq.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/cmdstanpy/stanfit/__pycache__/laplace.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/cmdstanpy/stanfit/__pycache__/mcmc.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/cmdstanpy/stanfit/__pycache__/metadata.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/cmdstanpy/stanfit/__pycache__/mle.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/cmdstanpy/stanfit/__pycache__/pathfinder.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/cmdstanpy/stanfit/__pycache__/runset.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/cmdstanpy/stanfit/__pycache__/vb.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/cmdstanpy/stanfit/gq.py create mode 100644 .venv/lib/python3.12/site-packages/cmdstanpy/stanfit/laplace.py create mode 100644 .venv/lib/python3.12/site-packages/cmdstanpy/stanfit/mcmc.py create mode 100644 .venv/lib/python3.12/site-packages/cmdstanpy/stanfit/metadata.py create mode 100644 .venv/lib/python3.12/site-packages/cmdstanpy/stanfit/mle.py create mode 100644 .venv/lib/python3.12/site-packages/cmdstanpy/stanfit/pathfinder.py create mode 100644 .venv/lib/python3.12/site-packages/cmdstanpy/stanfit/runset.py create mode 100644 .venv/lib/python3.12/site-packages/cmdstanpy/stanfit/vb.py create mode 100644 .venv/lib/python3.12/site-packages/cmdstanpy/utils/__init__.py create mode 100644 .venv/lib/python3.12/site-packages/cmdstanpy/utils/__pycache__/__init__.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/cmdstanpy/utils/__pycache__/cmdstan.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/cmdstanpy/utils/__pycache__/command.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/cmdstanpy/utils/__pycache__/data_munging.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/cmdstanpy/utils/__pycache__/filesystem.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/cmdstanpy/utils/__pycache__/json.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/cmdstanpy/utils/__pycache__/logging.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/cmdstanpy/utils/__pycache__/stancsv.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/cmdstanpy/utils/cmdstan.py create mode 100644 .venv/lib/python3.12/site-packages/cmdstanpy/utils/command.py create mode 100644 .venv/lib/python3.12/site-packages/cmdstanpy/utils/data_munging.py create mode 100644 .venv/lib/python3.12/site-packages/cmdstanpy/utils/filesystem.py create mode 100644 .venv/lib/python3.12/site-packages/cmdstanpy/utils/json.py create mode 100644 .venv/lib/python3.12/site-packages/cmdstanpy/utils/logging.py create mode 100644 .venv/lib/python3.12/site-packages/cmdstanpy/utils/stancsv.py create mode 100644 .venv/lib/python3.12/site-packages/holidays-0.77.dist-info/INSTALLER create mode 100644 .venv/lib/python3.12/site-packages/holidays-0.77.dist-info/METADATA create mode 100644 .venv/lib/python3.12/site-packages/holidays-0.77.dist-info/RECORD create mode 100644 .venv/lib/python3.12/site-packages/holidays-0.77.dist-info/WHEEL create mode 100644 .venv/lib/python3.12/site-packages/holidays-0.77.dist-info/licenses/CONTRIBUTORS create mode 100644 .venv/lib/python3.12/site-packages/holidays-0.77.dist-info/licenses/LICENSE create mode 100644 .venv/lib/python3.12/site-packages/holidays-0.77.dist-info/top_level.txt create mode 100644 .venv/lib/python3.12/site-packages/holidays/__init__.py create mode 100644 .venv/lib/python3.12/site-packages/holidays/__pycache__/__init__.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/holidays/__pycache__/constants.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/holidays/__pycache__/helpers.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/holidays/__pycache__/holiday_base.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/holidays/__pycache__/ical.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/holidays/__pycache__/observed_holiday_base.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/holidays/__pycache__/registry.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/holidays/__pycache__/utils.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/holidays/__pycache__/version.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/holidays/calendars/__init__.py create mode 100644 .venv/lib/python3.12/site-packages/holidays/calendars/__pycache__/__init__.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/holidays/calendars/__pycache__/balinese_saka.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/holidays/calendars/__pycache__/buddhist.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/holidays/calendars/__pycache__/chinese.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/holidays/calendars/__pycache__/custom.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/holidays/calendars/__pycache__/gregorian.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/holidays/calendars/__pycache__/hebrew.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/holidays/calendars/__pycache__/hindu.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/holidays/calendars/__pycache__/islamic.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/holidays/calendars/__pycache__/julian.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/holidays/calendars/__pycache__/julian_revised.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/holidays/calendars/__pycache__/mongolian.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/holidays/calendars/__pycache__/persian.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/holidays/calendars/__pycache__/sinhala.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/holidays/calendars/__pycache__/thai.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/holidays/calendars/balinese_saka.py create mode 100644 .venv/lib/python3.12/site-packages/holidays/calendars/buddhist.py create mode 100644 .venv/lib/python3.12/site-packages/holidays/calendars/chinese.py create mode 100644 .venv/lib/python3.12/site-packages/holidays/calendars/custom.py create mode 100644 .venv/lib/python3.12/site-packages/holidays/calendars/gregorian.py create mode 100644 .venv/lib/python3.12/site-packages/holidays/calendars/hebrew.py create mode 100644 .venv/lib/python3.12/site-packages/holidays/calendars/hindu.py create mode 100644 .venv/lib/python3.12/site-packages/holidays/calendars/islamic.py create mode 100644 .venv/lib/python3.12/site-packages/holidays/calendars/julian.py create mode 100644 .venv/lib/python3.12/site-packages/holidays/calendars/julian_revised.py create mode 100644 .venv/lib/python3.12/site-packages/holidays/calendars/mongolian.py create mode 100644 .venv/lib/python3.12/site-packages/holidays/calendars/persian.py create mode 100644 .venv/lib/python3.12/site-packages/holidays/calendars/sinhala.py create mode 100644 .venv/lib/python3.12/site-packages/holidays/calendars/thai.py create mode 100644 .venv/lib/python3.12/site-packages/holidays/constants.py create mode 100644 .venv/lib/python3.12/site-packages/holidays/countries/__init__.py create mode 100644 .venv/lib/python3.12/site-packages/holidays/countries/__pycache__/__init__.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/holidays/countries/__pycache__/afghanistan.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/holidays/countries/__pycache__/aland_islands.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/holidays/countries/__pycache__/albania.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/holidays/countries/__pycache__/algeria.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/holidays/countries/__pycache__/american_samoa.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/holidays/countries/__pycache__/andorra.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/holidays/countries/__pycache__/angola.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/holidays/countries/__pycache__/anguilla.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/holidays/countries/__pycache__/antigua_and_barbuda.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/holidays/countries/__pycache__/argentina.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/holidays/countries/__pycache__/armenia.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/holidays/countries/__pycache__/aruba.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/holidays/countries/__pycache__/australia.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/holidays/countries/__pycache__/austria.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/holidays/countries/__pycache__/azerbaijan.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/holidays/countries/__pycache__/bahamas.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/holidays/countries/__pycache__/bahrain.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/holidays/countries/__pycache__/bangladesh.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/holidays/countries/__pycache__/barbados.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/holidays/countries/__pycache__/belarus.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/holidays/countries/__pycache__/belgium.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/holidays/countries/__pycache__/belize.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/holidays/countries/__pycache__/benin.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/holidays/countries/__pycache__/bermuda.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/holidays/countries/__pycache__/bolivia.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/holidays/countries/__pycache__/bonaire_sint_eustatius_and_saba.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/holidays/countries/__pycache__/bosnia_and_herzegovina.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/holidays/countries/__pycache__/botswana.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/holidays/countries/__pycache__/brazil.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/holidays/countries/__pycache__/british_virgin_islands.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/holidays/countries/__pycache__/brunei.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/holidays/countries/__pycache__/bulgaria.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/holidays/countries/__pycache__/burkina_faso.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/holidays/countries/__pycache__/burundi.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/holidays/countries/__pycache__/cabo_verde.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/holidays/countries/__pycache__/cambodia.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/holidays/countries/__pycache__/cameroon.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/holidays/countries/__pycache__/canada.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/holidays/countries/__pycache__/cayman_islands.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/holidays/countries/__pycache__/central_african_republic.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/holidays/countries/__pycache__/chad.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/holidays/countries/__pycache__/chile.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/holidays/countries/__pycache__/china.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/holidays/countries/__pycache__/christmas_island.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/holidays/countries/__pycache__/cocos_islands.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/holidays/countries/__pycache__/colombia.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/holidays/countries/__pycache__/congo.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/holidays/countries/__pycache__/cook_islands.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/holidays/countries/__pycache__/costa_rica.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/holidays/countries/__pycache__/croatia.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/holidays/countries/__pycache__/cuba.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/holidays/countries/__pycache__/curacao.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/holidays/countries/__pycache__/cyprus.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/holidays/countries/__pycache__/czechia.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/holidays/countries/__pycache__/denmark.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/holidays/countries/__pycache__/djibouti.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/holidays/countries/__pycache__/dominica.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/holidays/countries/__pycache__/dominican_republic.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/holidays/countries/__pycache__/dr_congo.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/holidays/countries/__pycache__/ecuador.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/holidays/countries/__pycache__/egypt.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/holidays/countries/__pycache__/el_salvador.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/holidays/countries/__pycache__/equatorial_guinea.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/holidays/countries/__pycache__/estonia.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/holidays/countries/__pycache__/eswatini.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/holidays/countries/__pycache__/ethiopia.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/holidays/countries/__pycache__/falkland_islands.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/holidays/countries/__pycache__/faroe_islands.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/holidays/countries/__pycache__/fiji.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/holidays/countries/__pycache__/finland.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/holidays/countries/__pycache__/france.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/holidays/countries/__pycache__/french_guiana.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/holidays/countries/__pycache__/french_polynesia.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/holidays/countries/__pycache__/french_southern_territories.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/holidays/countries/__pycache__/gabon.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/holidays/countries/__pycache__/georgia.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/holidays/countries/__pycache__/germany.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/holidays/countries/__pycache__/ghana.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/holidays/countries/__pycache__/gibraltar.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/holidays/countries/__pycache__/greece.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/holidays/countries/__pycache__/greenland.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/holidays/countries/__pycache__/grenada.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/holidays/countries/__pycache__/guadeloupe.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/holidays/countries/__pycache__/guam.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/holidays/countries/__pycache__/guatemala.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/holidays/countries/__pycache__/guernsey.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/holidays/countries/__pycache__/guinea.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/holidays/countries/__pycache__/guyana.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/holidays/countries/__pycache__/haiti.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/holidays/countries/__pycache__/honduras.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/holidays/countries/__pycache__/hongkong.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/holidays/countries/__pycache__/hungary.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/holidays/countries/__pycache__/iceland.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/holidays/countries/__pycache__/india.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/holidays/countries/__pycache__/indonesia.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/holidays/countries/__pycache__/iran.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/holidays/countries/__pycache__/ireland.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/holidays/countries/__pycache__/isle_of_man.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/holidays/countries/__pycache__/israel.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/holidays/countries/__pycache__/italy.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/holidays/countries/__pycache__/ivory_coast.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/holidays/countries/__pycache__/jamaica.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/holidays/countries/__pycache__/japan.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/holidays/countries/__pycache__/jersey.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/holidays/countries/__pycache__/jordan.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/holidays/countries/__pycache__/kazakhstan.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/holidays/countries/__pycache__/kenya.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/holidays/countries/__pycache__/kuwait.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/holidays/countries/__pycache__/kyrgyzstan.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/holidays/countries/__pycache__/laos.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/holidays/countries/__pycache__/latvia.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/holidays/countries/__pycache__/lebanon.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/holidays/countries/__pycache__/lesotho.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/holidays/countries/__pycache__/libya.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/holidays/countries/__pycache__/liechtenstein.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/holidays/countries/__pycache__/lithuania.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/holidays/countries/__pycache__/luxembourg.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/holidays/countries/__pycache__/macau.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/holidays/countries/__pycache__/madagascar.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/holidays/countries/__pycache__/malawi.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/holidays/countries/__pycache__/malaysia.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/holidays/countries/__pycache__/maldives.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/holidays/countries/__pycache__/mali.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/holidays/countries/__pycache__/malta.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/holidays/countries/__pycache__/marshall_islands.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/holidays/countries/__pycache__/martinique.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/holidays/countries/__pycache__/mauritania.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/holidays/countries/__pycache__/mauritius.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/holidays/countries/__pycache__/mayotte.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/holidays/countries/__pycache__/mexico.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/holidays/countries/__pycache__/micronesia.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/holidays/countries/__pycache__/moldova.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/holidays/countries/__pycache__/monaco.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/holidays/countries/__pycache__/mongolia.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/holidays/countries/__pycache__/montenegro.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/holidays/countries/__pycache__/montserrat.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/holidays/countries/__pycache__/morocco.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/holidays/countries/__pycache__/mozambique.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/holidays/countries/__pycache__/namibia.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/holidays/countries/__pycache__/nauru.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/holidays/countries/__pycache__/nepal.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/holidays/countries/__pycache__/netherlands.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/holidays/countries/__pycache__/new_caledonia.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/holidays/countries/__pycache__/new_zealand.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/holidays/countries/__pycache__/nicaragua.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/holidays/countries/__pycache__/niger.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/holidays/countries/__pycache__/nigeria.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/holidays/countries/__pycache__/niue.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/holidays/countries/__pycache__/norfolk_island.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/holidays/countries/__pycache__/north_macedonia.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/holidays/countries/__pycache__/northern_mariana_islands.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/holidays/countries/__pycache__/norway.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/holidays/countries/__pycache__/oman.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/holidays/countries/__pycache__/pakistan.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/holidays/countries/__pycache__/palau.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/holidays/countries/__pycache__/palestine.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/holidays/countries/__pycache__/panama.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/holidays/countries/__pycache__/papua_new_guinea.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/holidays/countries/__pycache__/paraguay.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/holidays/countries/__pycache__/peru.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/holidays/countries/__pycache__/philippines.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/holidays/countries/__pycache__/poland.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/holidays/countries/__pycache__/portugal.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/holidays/countries/__pycache__/puerto_rico.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/holidays/countries/__pycache__/qatar.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/holidays/countries/__pycache__/reunion.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/holidays/countries/__pycache__/romania.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/holidays/countries/__pycache__/russia.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/holidays/countries/__pycache__/saint_barthelemy.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/holidays/countries/__pycache__/saint_kitts_and_nevis.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/holidays/countries/__pycache__/saint_lucia.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/holidays/countries/__pycache__/saint_martin.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/holidays/countries/__pycache__/saint_pierre_and_miquelon.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/holidays/countries/__pycache__/saint_vincent_and_the_grenadines.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/holidays/countries/__pycache__/samoa.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/holidays/countries/__pycache__/san_marino.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/holidays/countries/__pycache__/sao_tome_and_principe.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/holidays/countries/__pycache__/saudi_arabia.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/holidays/countries/__pycache__/senegal.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/holidays/countries/__pycache__/serbia.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/holidays/countries/__pycache__/seychelles.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/holidays/countries/__pycache__/sierra_leone.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/holidays/countries/__pycache__/singapore.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/holidays/countries/__pycache__/sint_maarten.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/holidays/countries/__pycache__/slovakia.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/holidays/countries/__pycache__/slovenia.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/holidays/countries/__pycache__/solomon_islands.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/holidays/countries/__pycache__/south_africa.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/holidays/countries/__pycache__/south_korea.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/holidays/countries/__pycache__/spain.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/holidays/countries/__pycache__/sri_lanka.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/holidays/countries/__pycache__/suriname.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/holidays/countries/__pycache__/svalbard_and_jan_mayen.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/holidays/countries/__pycache__/sweden.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/holidays/countries/__pycache__/switzerland.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/holidays/countries/__pycache__/taiwan.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/holidays/countries/__pycache__/tanzania.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/holidays/countries/__pycache__/thailand.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/holidays/countries/__pycache__/timor_leste.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/holidays/countries/__pycache__/togo.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/holidays/countries/__pycache__/tokelau.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/holidays/countries/__pycache__/tonga.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/holidays/countries/__pycache__/trinidad_and_tobago.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/holidays/countries/__pycache__/tunisia.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/holidays/countries/__pycache__/turkey.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/holidays/countries/__pycache__/turks_and_caicos_islands.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/holidays/countries/__pycache__/tuvalu.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/holidays/countries/__pycache__/ukraine.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/holidays/countries/__pycache__/united_arab_emirates.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/holidays/countries/__pycache__/united_kingdom.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/holidays/countries/__pycache__/united_states.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/holidays/countries/__pycache__/united_states_minor_outlying_islands.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/holidays/countries/__pycache__/united_states_virgin_islands.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/holidays/countries/__pycache__/uruguay.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/holidays/countries/__pycache__/uzbekistan.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/holidays/countries/__pycache__/vanuatu.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/holidays/countries/__pycache__/vatican_city.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/holidays/countries/__pycache__/venezuela.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/holidays/countries/__pycache__/vietnam.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/holidays/countries/__pycache__/wallis_and_futuna.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/holidays/countries/__pycache__/yemen.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/holidays/countries/__pycache__/zambia.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/holidays/countries/__pycache__/zimbabwe.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/holidays/countries/afghanistan.py create mode 100644 .venv/lib/python3.12/site-packages/holidays/countries/aland_islands.py create mode 100644 .venv/lib/python3.12/site-packages/holidays/countries/albania.py create mode 100644 .venv/lib/python3.12/site-packages/holidays/countries/algeria.py create mode 100644 .venv/lib/python3.12/site-packages/holidays/countries/american_samoa.py create mode 100644 .venv/lib/python3.12/site-packages/holidays/countries/andorra.py create mode 100644 .venv/lib/python3.12/site-packages/holidays/countries/angola.py create mode 100644 .venv/lib/python3.12/site-packages/holidays/countries/anguilla.py create mode 100644 .venv/lib/python3.12/site-packages/holidays/countries/antigua_and_barbuda.py create mode 100644 .venv/lib/python3.12/site-packages/holidays/countries/argentina.py create mode 100644 .venv/lib/python3.12/site-packages/holidays/countries/armenia.py create mode 100644 .venv/lib/python3.12/site-packages/holidays/countries/aruba.py create mode 100644 .venv/lib/python3.12/site-packages/holidays/countries/australia.py create mode 100644 .venv/lib/python3.12/site-packages/holidays/countries/austria.py create mode 100644 .venv/lib/python3.12/site-packages/holidays/countries/azerbaijan.py create mode 100644 .venv/lib/python3.12/site-packages/holidays/countries/bahamas.py create mode 100644 .venv/lib/python3.12/site-packages/holidays/countries/bahrain.py create mode 100644 .venv/lib/python3.12/site-packages/holidays/countries/bangladesh.py create mode 100644 .venv/lib/python3.12/site-packages/holidays/countries/barbados.py create mode 100644 .venv/lib/python3.12/site-packages/holidays/countries/belarus.py create mode 100644 .venv/lib/python3.12/site-packages/holidays/countries/belgium.py create mode 100644 .venv/lib/python3.12/site-packages/holidays/countries/belize.py create mode 100644 .venv/lib/python3.12/site-packages/holidays/countries/benin.py create mode 100644 .venv/lib/python3.12/site-packages/holidays/countries/bermuda.py create mode 100644 .venv/lib/python3.12/site-packages/holidays/countries/bolivia.py create mode 100644 .venv/lib/python3.12/site-packages/holidays/countries/bonaire_sint_eustatius_and_saba.py create mode 100644 .venv/lib/python3.12/site-packages/holidays/countries/bosnia_and_herzegovina.py create mode 100644 .venv/lib/python3.12/site-packages/holidays/countries/botswana.py create mode 100644 .venv/lib/python3.12/site-packages/holidays/countries/brazil.py create mode 100644 .venv/lib/python3.12/site-packages/holidays/countries/british_virgin_islands.py create mode 100644 .venv/lib/python3.12/site-packages/holidays/countries/brunei.py create mode 100644 .venv/lib/python3.12/site-packages/holidays/countries/bulgaria.py create mode 100644 .venv/lib/python3.12/site-packages/holidays/countries/burkina_faso.py create mode 100644 .venv/lib/python3.12/site-packages/holidays/countries/burundi.py create mode 100644 .venv/lib/python3.12/site-packages/holidays/countries/cabo_verde.py create mode 100644 .venv/lib/python3.12/site-packages/holidays/countries/cambodia.py create mode 100644 .venv/lib/python3.12/site-packages/holidays/countries/cameroon.py create mode 100644 .venv/lib/python3.12/site-packages/holidays/countries/canada.py create mode 100644 .venv/lib/python3.12/site-packages/holidays/countries/cayman_islands.py create mode 100644 .venv/lib/python3.12/site-packages/holidays/countries/central_african_republic.py create mode 100644 .venv/lib/python3.12/site-packages/holidays/countries/chad.py create mode 100644 .venv/lib/python3.12/site-packages/holidays/countries/chile.py create mode 100644 .venv/lib/python3.12/site-packages/holidays/countries/china.py create mode 100644 .venv/lib/python3.12/site-packages/holidays/countries/christmas_island.py create mode 100644 .venv/lib/python3.12/site-packages/holidays/countries/cocos_islands.py create mode 100644 .venv/lib/python3.12/site-packages/holidays/countries/colombia.py create mode 100644 .venv/lib/python3.12/site-packages/holidays/countries/congo.py create mode 100644 .venv/lib/python3.12/site-packages/holidays/countries/cook_islands.py create mode 100644 .venv/lib/python3.12/site-packages/holidays/countries/costa_rica.py create mode 100644 .venv/lib/python3.12/site-packages/holidays/countries/croatia.py create mode 100644 .venv/lib/python3.12/site-packages/holidays/countries/cuba.py create mode 100644 .venv/lib/python3.12/site-packages/holidays/countries/curacao.py create mode 100644 .venv/lib/python3.12/site-packages/holidays/countries/cyprus.py create mode 100644 .venv/lib/python3.12/site-packages/holidays/countries/czechia.py create mode 100644 .venv/lib/python3.12/site-packages/holidays/countries/denmark.py create mode 100644 .venv/lib/python3.12/site-packages/holidays/countries/djibouti.py create mode 100644 .venv/lib/python3.12/site-packages/holidays/countries/dominica.py create mode 100644 .venv/lib/python3.12/site-packages/holidays/countries/dominican_republic.py create mode 100644 .venv/lib/python3.12/site-packages/holidays/countries/dr_congo.py create mode 100644 .venv/lib/python3.12/site-packages/holidays/countries/ecuador.py create mode 100644 .venv/lib/python3.12/site-packages/holidays/countries/egypt.py create mode 100644 .venv/lib/python3.12/site-packages/holidays/countries/el_salvador.py create mode 100644 .venv/lib/python3.12/site-packages/holidays/countries/equatorial_guinea.py create mode 100644 .venv/lib/python3.12/site-packages/holidays/countries/estonia.py create mode 100644 .venv/lib/python3.12/site-packages/holidays/countries/eswatini.py create mode 100644 .venv/lib/python3.12/site-packages/holidays/countries/ethiopia.py create mode 100644 .venv/lib/python3.12/site-packages/holidays/countries/falkland_islands.py create mode 100644 .venv/lib/python3.12/site-packages/holidays/countries/faroe_islands.py create mode 100644 .venv/lib/python3.12/site-packages/holidays/countries/fiji.py create mode 100644 .venv/lib/python3.12/site-packages/holidays/countries/finland.py create mode 100644 .venv/lib/python3.12/site-packages/holidays/countries/france.py create mode 100644 .venv/lib/python3.12/site-packages/holidays/countries/french_guiana.py create mode 100644 .venv/lib/python3.12/site-packages/holidays/countries/french_polynesia.py create mode 100644 .venv/lib/python3.12/site-packages/holidays/countries/french_southern_territories.py create mode 100644 .venv/lib/python3.12/site-packages/holidays/countries/gabon.py create mode 100644 .venv/lib/python3.12/site-packages/holidays/countries/georgia.py create mode 100644 .venv/lib/python3.12/site-packages/holidays/countries/germany.py create mode 100644 .venv/lib/python3.12/site-packages/holidays/countries/ghana.py create mode 100644 .venv/lib/python3.12/site-packages/holidays/countries/gibraltar.py create mode 100644 .venv/lib/python3.12/site-packages/holidays/countries/greece.py create mode 100644 .venv/lib/python3.12/site-packages/holidays/countries/greenland.py create mode 100644 .venv/lib/python3.12/site-packages/holidays/countries/grenada.py create mode 100644 .venv/lib/python3.12/site-packages/holidays/countries/guadeloupe.py create mode 100644 .venv/lib/python3.12/site-packages/holidays/countries/guam.py create mode 100644 .venv/lib/python3.12/site-packages/holidays/countries/guatemala.py create mode 100644 .venv/lib/python3.12/site-packages/holidays/countries/guernsey.py create mode 100644 .venv/lib/python3.12/site-packages/holidays/countries/guinea.py create mode 100644 .venv/lib/python3.12/site-packages/holidays/countries/guyana.py create mode 100644 .venv/lib/python3.12/site-packages/holidays/countries/haiti.py create mode 100644 .venv/lib/python3.12/site-packages/holidays/countries/honduras.py create mode 100644 .venv/lib/python3.12/site-packages/holidays/countries/hongkong.py create mode 100644 .venv/lib/python3.12/site-packages/holidays/countries/hungary.py create mode 100644 .venv/lib/python3.12/site-packages/holidays/countries/iceland.py create mode 100644 .venv/lib/python3.12/site-packages/holidays/countries/india.py create mode 100644 .venv/lib/python3.12/site-packages/holidays/countries/indonesia.py create mode 100644 .venv/lib/python3.12/site-packages/holidays/countries/iran.py create mode 100644 .venv/lib/python3.12/site-packages/holidays/countries/ireland.py create mode 100644 .venv/lib/python3.12/site-packages/holidays/countries/isle_of_man.py create mode 100644 .venv/lib/python3.12/site-packages/holidays/countries/israel.py create mode 100644 .venv/lib/python3.12/site-packages/holidays/countries/italy.py create mode 100644 .venv/lib/python3.12/site-packages/holidays/countries/ivory_coast.py create mode 100644 .venv/lib/python3.12/site-packages/holidays/countries/jamaica.py create mode 100644 .venv/lib/python3.12/site-packages/holidays/countries/japan.py create mode 100644 .venv/lib/python3.12/site-packages/holidays/countries/jersey.py create mode 100644 .venv/lib/python3.12/site-packages/holidays/countries/jordan.py create mode 100644 .venv/lib/python3.12/site-packages/holidays/countries/kazakhstan.py create mode 100644 .venv/lib/python3.12/site-packages/holidays/countries/kenya.py create mode 100644 .venv/lib/python3.12/site-packages/holidays/countries/kuwait.py create mode 100644 .venv/lib/python3.12/site-packages/holidays/countries/kyrgyzstan.py create mode 100644 .venv/lib/python3.12/site-packages/holidays/countries/laos.py create mode 100644 .venv/lib/python3.12/site-packages/holidays/countries/latvia.py create mode 100644 .venv/lib/python3.12/site-packages/holidays/countries/lebanon.py create mode 100644 .venv/lib/python3.12/site-packages/holidays/countries/lesotho.py create mode 100644 .venv/lib/python3.12/site-packages/holidays/countries/libya.py create mode 100644 .venv/lib/python3.12/site-packages/holidays/countries/liechtenstein.py create mode 100644 .venv/lib/python3.12/site-packages/holidays/countries/lithuania.py create mode 100644 .venv/lib/python3.12/site-packages/holidays/countries/luxembourg.py create mode 100644 .venv/lib/python3.12/site-packages/holidays/countries/macau.py create mode 100644 .venv/lib/python3.12/site-packages/holidays/countries/madagascar.py create mode 100644 .venv/lib/python3.12/site-packages/holidays/countries/malawi.py create mode 100644 .venv/lib/python3.12/site-packages/holidays/countries/malaysia.py create mode 100644 .venv/lib/python3.12/site-packages/holidays/countries/maldives.py create mode 100644 .venv/lib/python3.12/site-packages/holidays/countries/mali.py create mode 100644 .venv/lib/python3.12/site-packages/holidays/countries/malta.py create mode 100644 .venv/lib/python3.12/site-packages/holidays/countries/marshall_islands.py create mode 100644 .venv/lib/python3.12/site-packages/holidays/countries/martinique.py create mode 100644 .venv/lib/python3.12/site-packages/holidays/countries/mauritania.py create mode 100644 .venv/lib/python3.12/site-packages/holidays/countries/mauritius.py create mode 100644 .venv/lib/python3.12/site-packages/holidays/countries/mayotte.py create mode 100644 .venv/lib/python3.12/site-packages/holidays/countries/mexico.py create mode 100644 .venv/lib/python3.12/site-packages/holidays/countries/micronesia.py create mode 100644 .venv/lib/python3.12/site-packages/holidays/countries/moldova.py create mode 100644 .venv/lib/python3.12/site-packages/holidays/countries/monaco.py create mode 100644 .venv/lib/python3.12/site-packages/holidays/countries/mongolia.py create mode 100644 .venv/lib/python3.12/site-packages/holidays/countries/montenegro.py create mode 100644 .venv/lib/python3.12/site-packages/holidays/countries/montserrat.py create mode 100644 .venv/lib/python3.12/site-packages/holidays/countries/morocco.py create mode 100644 .venv/lib/python3.12/site-packages/holidays/countries/mozambique.py create mode 100644 .venv/lib/python3.12/site-packages/holidays/countries/namibia.py create mode 100644 .venv/lib/python3.12/site-packages/holidays/countries/nauru.py create mode 100644 .venv/lib/python3.12/site-packages/holidays/countries/nepal.py create mode 100644 .venv/lib/python3.12/site-packages/holidays/countries/netherlands.py create mode 100644 .venv/lib/python3.12/site-packages/holidays/countries/new_caledonia.py create mode 100644 .venv/lib/python3.12/site-packages/holidays/countries/new_zealand.py create mode 100644 .venv/lib/python3.12/site-packages/holidays/countries/nicaragua.py create mode 100644 .venv/lib/python3.12/site-packages/holidays/countries/niger.py create mode 100644 .venv/lib/python3.12/site-packages/holidays/countries/nigeria.py create mode 100644 .venv/lib/python3.12/site-packages/holidays/countries/niue.py create mode 100644 .venv/lib/python3.12/site-packages/holidays/countries/norfolk_island.py create mode 100644 .venv/lib/python3.12/site-packages/holidays/countries/north_macedonia.py create mode 100644 .venv/lib/python3.12/site-packages/holidays/countries/northern_mariana_islands.py create mode 100644 .venv/lib/python3.12/site-packages/holidays/countries/norway.py create mode 100644 .venv/lib/python3.12/site-packages/holidays/countries/oman.py create mode 100644 .venv/lib/python3.12/site-packages/holidays/countries/pakistan.py create mode 100644 .venv/lib/python3.12/site-packages/holidays/countries/palau.py create mode 100644 .venv/lib/python3.12/site-packages/holidays/countries/palestine.py create mode 100644 .venv/lib/python3.12/site-packages/holidays/countries/panama.py create mode 100644 .venv/lib/python3.12/site-packages/holidays/countries/papua_new_guinea.py create mode 100644 .venv/lib/python3.12/site-packages/holidays/countries/paraguay.py create mode 100644 .venv/lib/python3.12/site-packages/holidays/countries/peru.py create mode 100644 .venv/lib/python3.12/site-packages/holidays/countries/philippines.py create mode 100644 .venv/lib/python3.12/site-packages/holidays/countries/poland.py create mode 100644 .venv/lib/python3.12/site-packages/holidays/countries/portugal.py create mode 100644 .venv/lib/python3.12/site-packages/holidays/countries/puerto_rico.py create mode 100644 .venv/lib/python3.12/site-packages/holidays/countries/qatar.py create mode 100644 .venv/lib/python3.12/site-packages/holidays/countries/reunion.py create mode 100644 .venv/lib/python3.12/site-packages/holidays/countries/romania.py create mode 100644 .venv/lib/python3.12/site-packages/holidays/countries/russia.py create mode 100644 .venv/lib/python3.12/site-packages/holidays/countries/saint_barthelemy.py create mode 100644 .venv/lib/python3.12/site-packages/holidays/countries/saint_kitts_and_nevis.py create mode 100644 .venv/lib/python3.12/site-packages/holidays/countries/saint_lucia.py create mode 100644 .venv/lib/python3.12/site-packages/holidays/countries/saint_martin.py create mode 100644 .venv/lib/python3.12/site-packages/holidays/countries/saint_pierre_and_miquelon.py create mode 100644 .venv/lib/python3.12/site-packages/holidays/countries/saint_vincent_and_the_grenadines.py create mode 100644 .venv/lib/python3.12/site-packages/holidays/countries/samoa.py create mode 100644 .venv/lib/python3.12/site-packages/holidays/countries/san_marino.py create mode 100644 .venv/lib/python3.12/site-packages/holidays/countries/sao_tome_and_principe.py create mode 100644 .venv/lib/python3.12/site-packages/holidays/countries/saudi_arabia.py create mode 100644 .venv/lib/python3.12/site-packages/holidays/countries/senegal.py create mode 100644 .venv/lib/python3.12/site-packages/holidays/countries/serbia.py create mode 100644 .venv/lib/python3.12/site-packages/holidays/countries/seychelles.py create mode 100644 .venv/lib/python3.12/site-packages/holidays/countries/sierra_leone.py create mode 100644 .venv/lib/python3.12/site-packages/holidays/countries/singapore.py create mode 100644 .venv/lib/python3.12/site-packages/holidays/countries/sint_maarten.py create mode 100644 .venv/lib/python3.12/site-packages/holidays/countries/slovakia.py create mode 100644 .venv/lib/python3.12/site-packages/holidays/countries/slovenia.py create mode 100644 .venv/lib/python3.12/site-packages/holidays/countries/solomon_islands.py create mode 100644 .venv/lib/python3.12/site-packages/holidays/countries/south_africa.py create mode 100644 .venv/lib/python3.12/site-packages/holidays/countries/south_korea.py create mode 100644 .venv/lib/python3.12/site-packages/holidays/countries/spain.py create mode 100644 .venv/lib/python3.12/site-packages/holidays/countries/sri_lanka.py create mode 100644 .venv/lib/python3.12/site-packages/holidays/countries/suriname.py create mode 100644 .venv/lib/python3.12/site-packages/holidays/countries/svalbard_and_jan_mayen.py create mode 100644 .venv/lib/python3.12/site-packages/holidays/countries/sweden.py create mode 100644 .venv/lib/python3.12/site-packages/holidays/countries/switzerland.py create mode 100644 .venv/lib/python3.12/site-packages/holidays/countries/taiwan.py create mode 100644 .venv/lib/python3.12/site-packages/holidays/countries/tanzania.py create mode 100644 .venv/lib/python3.12/site-packages/holidays/countries/thailand.py create mode 100644 .venv/lib/python3.12/site-packages/holidays/countries/timor_leste.py create mode 100644 .venv/lib/python3.12/site-packages/holidays/countries/togo.py create mode 100644 .venv/lib/python3.12/site-packages/holidays/countries/tokelau.py create mode 100644 .venv/lib/python3.12/site-packages/holidays/countries/tonga.py create mode 100644 .venv/lib/python3.12/site-packages/holidays/countries/trinidad_and_tobago.py create mode 100644 .venv/lib/python3.12/site-packages/holidays/countries/tunisia.py create mode 100644 .venv/lib/python3.12/site-packages/holidays/countries/turkey.py create mode 100644 .venv/lib/python3.12/site-packages/holidays/countries/turks_and_caicos_islands.py create mode 100644 .venv/lib/python3.12/site-packages/holidays/countries/tuvalu.py create mode 100644 .venv/lib/python3.12/site-packages/holidays/countries/ukraine.py create mode 100644 .venv/lib/python3.12/site-packages/holidays/countries/united_arab_emirates.py create mode 100644 .venv/lib/python3.12/site-packages/holidays/countries/united_kingdom.py create mode 100644 .venv/lib/python3.12/site-packages/holidays/countries/united_states.py create mode 100644 .venv/lib/python3.12/site-packages/holidays/countries/united_states_minor_outlying_islands.py create mode 100644 .venv/lib/python3.12/site-packages/holidays/countries/united_states_virgin_islands.py create mode 100644 .venv/lib/python3.12/site-packages/holidays/countries/uruguay.py create mode 100644 .venv/lib/python3.12/site-packages/holidays/countries/uzbekistan.py create mode 100644 .venv/lib/python3.12/site-packages/holidays/countries/vanuatu.py create mode 100644 .venv/lib/python3.12/site-packages/holidays/countries/vatican_city.py create mode 100644 .venv/lib/python3.12/site-packages/holidays/countries/venezuela.py create mode 100644 .venv/lib/python3.12/site-packages/holidays/countries/vietnam.py create mode 100644 .venv/lib/python3.12/site-packages/holidays/countries/wallis_and_futuna.py create mode 100644 .venv/lib/python3.12/site-packages/holidays/countries/yemen.py create mode 100644 .venv/lib/python3.12/site-packages/holidays/countries/zambia.py create mode 100644 .venv/lib/python3.12/site-packages/holidays/countries/zimbabwe.py create mode 100644 .venv/lib/python3.12/site-packages/holidays/deprecations/__pycache__/v1_incompatibility.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/holidays/deprecations/v1_incompatibility.py create mode 100644 .venv/lib/python3.12/site-packages/holidays/financial/__init__.py create mode 100644 .venv/lib/python3.12/site-packages/holidays/financial/__pycache__/__init__.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/holidays/financial/__pycache__/brasil_bolsa_balcao.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/holidays/financial/__pycache__/european_central_bank.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/holidays/financial/__pycache__/ice_futures_europe.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/holidays/financial/__pycache__/ny_stock_exchange.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/holidays/financial/brasil_bolsa_balcao.py create mode 100644 .venv/lib/python3.12/site-packages/holidays/financial/european_central_bank.py create mode 100644 .venv/lib/python3.12/site-packages/holidays/financial/ice_futures_europe.py create mode 100644 .venv/lib/python3.12/site-packages/holidays/financial/ny_stock_exchange.py create mode 100644 .venv/lib/python3.12/site-packages/holidays/groups/__init__.py create mode 100644 .venv/lib/python3.12/site-packages/holidays/groups/__pycache__/__init__.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/holidays/groups/__pycache__/balinese_saka.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/holidays/groups/__pycache__/buddhist.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/holidays/groups/__pycache__/chinese.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/holidays/groups/__pycache__/christian.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/holidays/groups/__pycache__/custom.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/holidays/groups/__pycache__/eastern.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/holidays/groups/__pycache__/hebrew.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/holidays/groups/__pycache__/hindu.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/holidays/groups/__pycache__/international.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/holidays/groups/__pycache__/islamic.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/holidays/groups/__pycache__/mongolian.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/holidays/groups/__pycache__/persian.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/holidays/groups/__pycache__/sinhala.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/holidays/groups/__pycache__/thai.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/holidays/groups/balinese_saka.py create mode 100644 .venv/lib/python3.12/site-packages/holidays/groups/buddhist.py create mode 100644 .venv/lib/python3.12/site-packages/holidays/groups/chinese.py create mode 100644 .venv/lib/python3.12/site-packages/holidays/groups/christian.py create mode 100644 .venv/lib/python3.12/site-packages/holidays/groups/custom.py create mode 100644 .venv/lib/python3.12/site-packages/holidays/groups/eastern.py create mode 100644 .venv/lib/python3.12/site-packages/holidays/groups/hebrew.py create mode 100644 .venv/lib/python3.12/site-packages/holidays/groups/hindu.py create mode 100644 .venv/lib/python3.12/site-packages/holidays/groups/international.py create mode 100644 .venv/lib/python3.12/site-packages/holidays/groups/islamic.py create mode 100644 .venv/lib/python3.12/site-packages/holidays/groups/mongolian.py create mode 100644 .venv/lib/python3.12/site-packages/holidays/groups/persian.py create mode 100644 .venv/lib/python3.12/site-packages/holidays/groups/sinhala.py create mode 100644 .venv/lib/python3.12/site-packages/holidays/groups/thai.py create mode 100644 .venv/lib/python3.12/site-packages/holidays/helpers.py create mode 100644 .venv/lib/python3.12/site-packages/holidays/holiday_base.py create mode 100644 .venv/lib/python3.12/site-packages/holidays/ical.py create mode 100644 .venv/lib/python3.12/site-packages/holidays/locale/am/LC_MESSAGES/ET.mo create mode 100644 .venv/lib/python3.12/site-packages/holidays/locale/ar/LC_MESSAGES/AE.mo create mode 100644 .venv/lib/python3.12/site-packages/holidays/locale/ar/LC_MESSAGES/BH.mo create mode 100644 .venv/lib/python3.12/site-packages/holidays/locale/ar/LC_MESSAGES/CA.mo create mode 100644 .venv/lib/python3.12/site-packages/holidays/locale/ar/LC_MESSAGES/DJ.mo create mode 100644 .venv/lib/python3.12/site-packages/holidays/locale/ar/LC_MESSAGES/DZ.mo create mode 100644 .venv/lib/python3.12/site-packages/holidays/locale/ar/LC_MESSAGES/EG.mo create mode 100644 .venv/lib/python3.12/site-packages/holidays/locale/ar/LC_MESSAGES/ET.mo create mode 100644 .venv/lib/python3.12/site-packages/holidays/locale/ar/LC_MESSAGES/JO.mo create mode 100644 .venv/lib/python3.12/site-packages/holidays/locale/ar/LC_MESSAGES/KW.mo create mode 100644 .venv/lib/python3.12/site-packages/holidays/locale/ar/LC_MESSAGES/LB.mo create mode 100644 .venv/lib/python3.12/site-packages/holidays/locale/ar/LC_MESSAGES/LY.mo create mode 100644 .venv/lib/python3.12/site-packages/holidays/locale/ar/LC_MESSAGES/MA.mo create mode 100644 .venv/lib/python3.12/site-packages/holidays/locale/ar/LC_MESSAGES/OM.mo create mode 100644 .venv/lib/python3.12/site-packages/holidays/locale/ar/LC_MESSAGES/PS.mo create mode 100644 .venv/lib/python3.12/site-packages/holidays/locale/ar/LC_MESSAGES/SA.mo create mode 100644 .venv/lib/python3.12/site-packages/holidays/locale/ar/LC_MESSAGES/TN.mo create mode 100644 .venv/lib/python3.12/site-packages/holidays/locale/ar/LC_MESSAGES/UA.mo create mode 100644 .venv/lib/python3.12/site-packages/holidays/locale/ar/LC_MESSAGES/YE.mo create mode 100644 .venv/lib/python3.12/site-packages/holidays/locale/ar_QA/LC_MESSAGES/QA.mo create mode 100644 .venv/lib/python3.12/site-packages/holidays/locale/az/LC_MESSAGES/AZ.mo create mode 100644 .venv/lib/python3.12/site-packages/holidays/locale/be/LC_MESSAGES/BY.mo create mode 100644 .venv/lib/python3.12/site-packages/holidays/locale/bg/LC_MESSAGES/BG.mo create mode 100644 .venv/lib/python3.12/site-packages/holidays/locale/bs/LC_MESSAGES/BA.mo create mode 100644 .venv/lib/python3.12/site-packages/holidays/locale/ca/LC_MESSAGES/AD.mo create mode 100644 .venv/lib/python3.12/site-packages/holidays/locale/cnr/LC_MESSAGES/ME.mo create mode 100644 .venv/lib/python3.12/site-packages/holidays/locale/coa_CC/LC_MESSAGES/CC.mo create mode 100644 .venv/lib/python3.12/site-packages/holidays/locale/cs/LC_MESSAGES/CZ.mo create mode 100644 .venv/lib/python3.12/site-packages/holidays/locale/da/LC_MESSAGES/DK.mo create mode 100644 .venv/lib/python3.12/site-packages/holidays/locale/da/LC_MESSAGES/FO.mo create mode 100644 .venv/lib/python3.12/site-packages/holidays/locale/da/LC_MESSAGES/GL.mo create mode 100644 .venv/lib/python3.12/site-packages/holidays/locale/de/LC_MESSAGES/AT.mo create mode 100644 .venv/lib/python3.12/site-packages/holidays/locale/de/LC_MESSAGES/BE.mo create mode 100644 .venv/lib/python3.12/site-packages/holidays/locale/de/LC_MESSAGES/CH.mo create mode 100644 .venv/lib/python3.12/site-packages/holidays/locale/de/LC_MESSAGES/CV.mo create mode 100644 .venv/lib/python3.12/site-packages/holidays/locale/de/LC_MESSAGES/DE.mo create mode 100644 .venv/lib/python3.12/site-packages/holidays/locale/de/LC_MESSAGES/LI.mo create mode 100644 .venv/lib/python3.12/site-packages/holidays/locale/de/LC_MESSAGES/LU.mo create mode 100644 .venv/lib/python3.12/site-packages/holidays/locale/de/LC_MESSAGES/PL.mo create mode 100644 .venv/lib/python3.12/site-packages/holidays/locale/el/LC_MESSAGES/CY.mo create mode 100644 .venv/lib/python3.12/site-packages/holidays/locale/el/LC_MESSAGES/GR.mo create mode 100644 .venv/lib/python3.12/site-packages/holidays/locale/en_AI/LC_MESSAGES/AI.mo create mode 100644 .venv/lib/python3.12/site-packages/holidays/locale/en_AU/LC_MESSAGES/AU.mo create mode 100644 .venv/lib/python3.12/site-packages/holidays/locale/en_BM/LC_MESSAGES/BM.mo create mode 100644 .venv/lib/python3.12/site-packages/holidays/locale/en_BQ/LC_MESSAGES/BQ.mo create mode 100644 .venv/lib/python3.12/site-packages/holidays/locale/en_CA/LC_MESSAGES/CA.mo create mode 100644 .venv/lib/python3.12/site-packages/holidays/locale/en_CC/LC_MESSAGES/CC.mo create mode 100644 .venv/lib/python3.12/site-packages/holidays/locale/en_CI/LC_MESSAGES/CI.mo create mode 100644 .venv/lib/python3.12/site-packages/holidays/locale/en_CK/LC_MESSAGES/CK.mo create mode 100644 .venv/lib/python3.12/site-packages/holidays/locale/en_CX/LC_MESSAGES/CX.mo create mode 100644 .venv/lib/python3.12/site-packages/holidays/locale/en_CY/LC_MESSAGES/CY.mo create mode 100644 .venv/lib/python3.12/site-packages/holidays/locale/en_ET/LC_MESSAGES/ET.mo create mode 100644 .venv/lib/python3.12/site-packages/holidays/locale/en_FM/LC_MESSAGES/FM.mo create mode 100644 .venv/lib/python3.12/site-packages/holidays/locale/en_GB/LC_MESSAGES/FK.mo create mode 100644 .venv/lib/python3.12/site-packages/holidays/locale/en_GB/LC_MESSAGES/GB.mo create mode 100644 .venv/lib/python3.12/site-packages/holidays/locale/en_GB/LC_MESSAGES/GI.mo create mode 100644 .venv/lib/python3.12/site-packages/holidays/locale/en_GB/LC_MESSAGES/IM.mo create mode 100644 .venv/lib/python3.12/site-packages/holidays/locale/en_GB/LC_MESSAGES/KY.mo create mode 100644 .venv/lib/python3.12/site-packages/holidays/locale/en_GB/LC_MESSAGES/TV.mo create mode 100644 .venv/lib/python3.12/site-packages/holidays/locale/en_GD/LC_MESSAGES/GD.mo create mode 100644 .venv/lib/python3.12/site-packages/holidays/locale/en_GY/LC_MESSAGES/GY.mo create mode 100644 .venv/lib/python3.12/site-packages/holidays/locale/en_HK/LC_MESSAGES/HK.mo create mode 100644 .venv/lib/python3.12/site-packages/holidays/locale/en_IN/LC_MESSAGES/IN.mo create mode 100644 .venv/lib/python3.12/site-packages/holidays/locale/en_KE/LC_MESSAGES/KE.mo create mode 100644 .venv/lib/python3.12/site-packages/holidays/locale/en_LC/LC_MESSAGES/LC.mo create mode 100644 .venv/lib/python3.12/site-packages/holidays/locale/en_MO/LC_MESSAGES/MO.mo create mode 100644 .venv/lib/python3.12/site-packages/holidays/locale/en_MS/LC_MESSAGES/MS.mo create mode 100644 .venv/lib/python3.12/site-packages/holidays/locale/en_MU/LC_MESSAGES/MU.mo create mode 100644 .venv/lib/python3.12/site-packages/holidays/locale/en_NA/LC_MESSAGES/NA.mo create mode 100644 .venv/lib/python3.12/site-packages/holidays/locale/en_NF/LC_MESSAGES/NF.mo create mode 100644 .venv/lib/python3.12/site-packages/holidays/locale/en_NR/LC_MESSAGES/NR.mo create mode 100644 .venv/lib/python3.12/site-packages/holidays/locale/en_NU/LC_MESSAGES/NU.mo create mode 100644 .venv/lib/python3.12/site-packages/holidays/locale/en_PH/LC_MESSAGES/PH.mo create mode 100644 .venv/lib/python3.12/site-packages/holidays/locale/en_PK/LC_MESSAGES/PK.mo create mode 100644 .venv/lib/python3.12/site-packages/holidays/locale/en_SC/LC_MESSAGES/SC.mo create mode 100644 .venv/lib/python3.12/site-packages/holidays/locale/en_SG/LC_MESSAGES/SG.mo create mode 100644 .venv/lib/python3.12/site-packages/holidays/locale/en_SL/LC_MESSAGES/SL.mo create mode 100644 .venv/lib/python3.12/site-packages/holidays/locale/en_TC/LC_MESSAGES/TC.mo create mode 100644 .venv/lib/python3.12/site-packages/holidays/locale/en_TK/LC_MESSAGES/TK.mo create mode 100644 .venv/lib/python3.12/site-packages/holidays/locale/en_TL/LC_MESSAGES/TL.mo create mode 100644 .venv/lib/python3.12/site-packages/holidays/locale/en_TT/LC_MESSAGES/TT.mo create mode 100644 .venv/lib/python3.12/site-packages/holidays/locale/en_US/LC_MESSAGES/AD.mo create mode 100644 .venv/lib/python3.12/site-packages/holidays/locale/en_US/LC_MESSAGES/AE.mo create mode 100644 .venv/lib/python3.12/site-packages/holidays/locale/en_US/LC_MESSAGES/AF.mo create mode 100644 .venv/lib/python3.12/site-packages/holidays/locale/en_US/LC_MESSAGES/AI.mo create mode 100644 .venv/lib/python3.12/site-packages/holidays/locale/en_US/LC_MESSAGES/AL.mo create mode 100644 .venv/lib/python3.12/site-packages/holidays/locale/en_US/LC_MESSAGES/AM.mo create mode 100644 .venv/lib/python3.12/site-packages/holidays/locale/en_US/LC_MESSAGES/AO.mo create mode 100644 .venv/lib/python3.12/site-packages/holidays/locale/en_US/LC_MESSAGES/AR.mo create mode 100644 .venv/lib/python3.12/site-packages/holidays/locale/en_US/LC_MESSAGES/AS.mo create mode 100644 .venv/lib/python3.12/site-packages/holidays/locale/en_US/LC_MESSAGES/AT.mo create mode 100644 .venv/lib/python3.12/site-packages/holidays/locale/en_US/LC_MESSAGES/AU.mo create mode 100644 .venv/lib/python3.12/site-packages/holidays/locale/en_US/LC_MESSAGES/AW.mo create mode 100644 .venv/lib/python3.12/site-packages/holidays/locale/en_US/LC_MESSAGES/AX.mo create mode 100644 .venv/lib/python3.12/site-packages/holidays/locale/en_US/LC_MESSAGES/AZ.mo create mode 100644 .venv/lib/python3.12/site-packages/holidays/locale/en_US/LC_MESSAGES/BA.mo create mode 100644 .venv/lib/python3.12/site-packages/holidays/locale/en_US/LC_MESSAGES/BE.mo create mode 100644 .venv/lib/python3.12/site-packages/holidays/locale/en_US/LC_MESSAGES/BG.mo create mode 100644 .venv/lib/python3.12/site-packages/holidays/locale/en_US/LC_MESSAGES/BH.mo create mode 100644 .venv/lib/python3.12/site-packages/holidays/locale/en_US/LC_MESSAGES/BJ.mo create mode 100644 .venv/lib/python3.12/site-packages/holidays/locale/en_US/LC_MESSAGES/BL.mo create mode 100644 .venv/lib/python3.12/site-packages/holidays/locale/en_US/LC_MESSAGES/BM.mo create mode 100644 .venv/lib/python3.12/site-packages/holidays/locale/en_US/LC_MESSAGES/BN.mo create mode 100644 .venv/lib/python3.12/site-packages/holidays/locale/en_US/LC_MESSAGES/BO.mo create mode 100644 .venv/lib/python3.12/site-packages/holidays/locale/en_US/LC_MESSAGES/BQ.mo create mode 100644 .venv/lib/python3.12/site-packages/holidays/locale/en_US/LC_MESSAGES/BR.mo create mode 100644 .venv/lib/python3.12/site-packages/holidays/locale/en_US/LC_MESSAGES/BVMF.mo create mode 100644 .venv/lib/python3.12/site-packages/holidays/locale/en_US/LC_MESSAGES/BY.mo create mode 100644 .venv/lib/python3.12/site-packages/holidays/locale/en_US/LC_MESSAGES/CA.mo create mode 100644 .venv/lib/python3.12/site-packages/holidays/locale/en_US/LC_MESSAGES/CC.mo create mode 100644 .venv/lib/python3.12/site-packages/holidays/locale/en_US/LC_MESSAGES/CD.mo create mode 100644 .venv/lib/python3.12/site-packages/holidays/locale/en_US/LC_MESSAGES/CF.mo create mode 100644 .venv/lib/python3.12/site-packages/holidays/locale/en_US/LC_MESSAGES/CG.mo create mode 100644 .venv/lib/python3.12/site-packages/holidays/locale/en_US/LC_MESSAGES/CH.mo create mode 100644 .venv/lib/python3.12/site-packages/holidays/locale/en_US/LC_MESSAGES/CI.mo create mode 100644 .venv/lib/python3.12/site-packages/holidays/locale/en_US/LC_MESSAGES/CK.mo create mode 100644 .venv/lib/python3.12/site-packages/holidays/locale/en_US/LC_MESSAGES/CL.mo create mode 100644 .venv/lib/python3.12/site-packages/holidays/locale/en_US/LC_MESSAGES/CN.mo create mode 100644 .venv/lib/python3.12/site-packages/holidays/locale/en_US/LC_MESSAGES/CO.mo create mode 100644 .venv/lib/python3.12/site-packages/holidays/locale/en_US/LC_MESSAGES/CR.mo create mode 100644 .venv/lib/python3.12/site-packages/holidays/locale/en_US/LC_MESSAGES/CU.mo create mode 100644 .venv/lib/python3.12/site-packages/holidays/locale/en_US/LC_MESSAGES/CV.mo create mode 100644 .venv/lib/python3.12/site-packages/holidays/locale/en_US/LC_MESSAGES/CW.mo create mode 100644 .venv/lib/python3.12/site-packages/holidays/locale/en_US/LC_MESSAGES/CX.mo create mode 100644 .venv/lib/python3.12/site-packages/holidays/locale/en_US/LC_MESSAGES/CY.mo create mode 100644 .venv/lib/python3.12/site-packages/holidays/locale/en_US/LC_MESSAGES/CZ.mo create mode 100644 .venv/lib/python3.12/site-packages/holidays/locale/en_US/LC_MESSAGES/DE.mo create mode 100644 .venv/lib/python3.12/site-packages/holidays/locale/en_US/LC_MESSAGES/DJ.mo create mode 100644 .venv/lib/python3.12/site-packages/holidays/locale/en_US/LC_MESSAGES/DK.mo create mode 100644 .venv/lib/python3.12/site-packages/holidays/locale/en_US/LC_MESSAGES/DO.mo create mode 100644 .venv/lib/python3.12/site-packages/holidays/locale/en_US/LC_MESSAGES/DZ.mo create mode 100644 .venv/lib/python3.12/site-packages/holidays/locale/en_US/LC_MESSAGES/EC.mo create mode 100644 .venv/lib/python3.12/site-packages/holidays/locale/en_US/LC_MESSAGES/EE.mo create mode 100644 .venv/lib/python3.12/site-packages/holidays/locale/en_US/LC_MESSAGES/EG.mo create mode 100644 .venv/lib/python3.12/site-packages/holidays/locale/en_US/LC_MESSAGES/ES.mo create mode 100644 .venv/lib/python3.12/site-packages/holidays/locale/en_US/LC_MESSAGES/ET.mo create mode 100644 .venv/lib/python3.12/site-packages/holidays/locale/en_US/LC_MESSAGES/FI.mo create mode 100644 .venv/lib/python3.12/site-packages/holidays/locale/en_US/LC_MESSAGES/FK.mo create mode 100644 .venv/lib/python3.12/site-packages/holidays/locale/en_US/LC_MESSAGES/FM.mo create mode 100644 .venv/lib/python3.12/site-packages/holidays/locale/en_US/LC_MESSAGES/FO.mo create mode 100644 .venv/lib/python3.12/site-packages/holidays/locale/en_US/LC_MESSAGES/FR.mo create mode 100644 .venv/lib/python3.12/site-packages/holidays/locale/en_US/LC_MESSAGES/GB.mo create mode 100644 .venv/lib/python3.12/site-packages/holidays/locale/en_US/LC_MESSAGES/GD.mo create mode 100644 .venv/lib/python3.12/site-packages/holidays/locale/en_US/LC_MESSAGES/GE.mo create mode 100644 .venv/lib/python3.12/site-packages/holidays/locale/en_US/LC_MESSAGES/GF.mo create mode 100644 .venv/lib/python3.12/site-packages/holidays/locale/en_US/LC_MESSAGES/GI.mo create mode 100644 .venv/lib/python3.12/site-packages/holidays/locale/en_US/LC_MESSAGES/GL.mo create mode 100644 .venv/lib/python3.12/site-packages/holidays/locale/en_US/LC_MESSAGES/GN.mo create mode 100644 .venv/lib/python3.12/site-packages/holidays/locale/en_US/LC_MESSAGES/GP.mo create mode 100644 .venv/lib/python3.12/site-packages/holidays/locale/en_US/LC_MESSAGES/GQ.mo create mode 100644 .venv/lib/python3.12/site-packages/holidays/locale/en_US/LC_MESSAGES/GR.mo create mode 100644 .venv/lib/python3.12/site-packages/holidays/locale/en_US/LC_MESSAGES/GT.mo create mode 100644 .venv/lib/python3.12/site-packages/holidays/locale/en_US/LC_MESSAGES/GU.mo create mode 100644 .venv/lib/python3.12/site-packages/holidays/locale/en_US/LC_MESSAGES/GY.mo create mode 100644 .venv/lib/python3.12/site-packages/holidays/locale/en_US/LC_MESSAGES/HK.mo create mode 100644 .venv/lib/python3.12/site-packages/holidays/locale/en_US/LC_MESSAGES/HN.mo create mode 100644 .venv/lib/python3.12/site-packages/holidays/locale/en_US/LC_MESSAGES/HR.mo create mode 100644 .venv/lib/python3.12/site-packages/holidays/locale/en_US/LC_MESSAGES/HT.mo create mode 100644 .venv/lib/python3.12/site-packages/holidays/locale/en_US/LC_MESSAGES/HU.mo create mode 100644 .venv/lib/python3.12/site-packages/holidays/locale/en_US/LC_MESSAGES/ID.mo create mode 100644 .venv/lib/python3.12/site-packages/holidays/locale/en_US/LC_MESSAGES/IL.mo create mode 100644 .venv/lib/python3.12/site-packages/holidays/locale/en_US/LC_MESSAGES/IM.mo create mode 100644 .venv/lib/python3.12/site-packages/holidays/locale/en_US/LC_MESSAGES/IN.mo create mode 100644 .venv/lib/python3.12/site-packages/holidays/locale/en_US/LC_MESSAGES/IR.mo create mode 100644 .venv/lib/python3.12/site-packages/holidays/locale/en_US/LC_MESSAGES/IS.mo create mode 100644 .venv/lib/python3.12/site-packages/holidays/locale/en_US/LC_MESSAGES/JO.mo create mode 100644 .venv/lib/python3.12/site-packages/holidays/locale/en_US/LC_MESSAGES/JP.mo create mode 100644 .venv/lib/python3.12/site-packages/holidays/locale/en_US/LC_MESSAGES/KE.mo create mode 100644 .venv/lib/python3.12/site-packages/holidays/locale/en_US/LC_MESSAGES/KH.mo create mode 100644 .venv/lib/python3.12/site-packages/holidays/locale/en_US/LC_MESSAGES/KR.mo create mode 100644 .venv/lib/python3.12/site-packages/holidays/locale/en_US/LC_MESSAGES/KW.mo create mode 100644 .venv/lib/python3.12/site-packages/holidays/locale/en_US/LC_MESSAGES/KY.mo create mode 100644 .venv/lib/python3.12/site-packages/holidays/locale/en_US/LC_MESSAGES/KZ.mo create mode 100644 .venv/lib/python3.12/site-packages/holidays/locale/en_US/LC_MESSAGES/LA.mo create mode 100644 .venv/lib/python3.12/site-packages/holidays/locale/en_US/LC_MESSAGES/LB.mo create mode 100644 .venv/lib/python3.12/site-packages/holidays/locale/en_US/LC_MESSAGES/LC.mo create mode 100644 .venv/lib/python3.12/site-packages/holidays/locale/en_US/LC_MESSAGES/LI.mo create mode 100644 .venv/lib/python3.12/site-packages/holidays/locale/en_US/LC_MESSAGES/LK.mo create mode 100644 .venv/lib/python3.12/site-packages/holidays/locale/en_US/LC_MESSAGES/LT.mo create mode 100644 .venv/lib/python3.12/site-packages/holidays/locale/en_US/LC_MESSAGES/LU.mo create mode 100644 .venv/lib/python3.12/site-packages/holidays/locale/en_US/LC_MESSAGES/LV.mo create mode 100644 .venv/lib/python3.12/site-packages/holidays/locale/en_US/LC_MESSAGES/LY.mo create mode 100644 .venv/lib/python3.12/site-packages/holidays/locale/en_US/LC_MESSAGES/MA.mo create mode 100644 .venv/lib/python3.12/site-packages/holidays/locale/en_US/LC_MESSAGES/MC.mo create mode 100644 .venv/lib/python3.12/site-packages/holidays/locale/en_US/LC_MESSAGES/MD.mo create mode 100644 .venv/lib/python3.12/site-packages/holidays/locale/en_US/LC_MESSAGES/ME.mo create mode 100644 .venv/lib/python3.12/site-packages/holidays/locale/en_US/LC_MESSAGES/MF.mo create mode 100644 .venv/lib/python3.12/site-packages/holidays/locale/en_US/LC_MESSAGES/MG.mo create mode 100644 .venv/lib/python3.12/site-packages/holidays/locale/en_US/LC_MESSAGES/MK.mo create mode 100644 .venv/lib/python3.12/site-packages/holidays/locale/en_US/LC_MESSAGES/ML.mo create mode 100644 .venv/lib/python3.12/site-packages/holidays/locale/en_US/LC_MESSAGES/MN.mo create mode 100644 .venv/lib/python3.12/site-packages/holidays/locale/en_US/LC_MESSAGES/MO.mo create mode 100644 .venv/lib/python3.12/site-packages/holidays/locale/en_US/LC_MESSAGES/MP.mo create mode 100644 .venv/lib/python3.12/site-packages/holidays/locale/en_US/LC_MESSAGES/MQ.mo create mode 100644 .venv/lib/python3.12/site-packages/holidays/locale/en_US/LC_MESSAGES/MS.mo create mode 100644 .venv/lib/python3.12/site-packages/holidays/locale/en_US/LC_MESSAGES/MT.mo create mode 100644 .venv/lib/python3.12/site-packages/holidays/locale/en_US/LC_MESSAGES/MU.mo create mode 100644 .venv/lib/python3.12/site-packages/holidays/locale/en_US/LC_MESSAGES/MX.mo create mode 100644 .venv/lib/python3.12/site-packages/holidays/locale/en_US/LC_MESSAGES/MY.mo create mode 100644 .venv/lib/python3.12/site-packages/holidays/locale/en_US/LC_MESSAGES/MZ.mo create mode 100644 .venv/lib/python3.12/site-packages/holidays/locale/en_US/LC_MESSAGES/NA.mo create mode 100644 .venv/lib/python3.12/site-packages/holidays/locale/en_US/LC_MESSAGES/NC.mo create mode 100644 .venv/lib/python3.12/site-packages/holidays/locale/en_US/LC_MESSAGES/NE.mo create mode 100644 .venv/lib/python3.12/site-packages/holidays/locale/en_US/LC_MESSAGES/NF.mo create mode 100644 .venv/lib/python3.12/site-packages/holidays/locale/en_US/LC_MESSAGES/NI.mo create mode 100644 .venv/lib/python3.12/site-packages/holidays/locale/en_US/LC_MESSAGES/NL.mo create mode 100644 .venv/lib/python3.12/site-packages/holidays/locale/en_US/LC_MESSAGES/NO.mo create mode 100644 .venv/lib/python3.12/site-packages/holidays/locale/en_US/LC_MESSAGES/NR.mo create mode 100644 .venv/lib/python3.12/site-packages/holidays/locale/en_US/LC_MESSAGES/NU.mo create mode 100644 .venv/lib/python3.12/site-packages/holidays/locale/en_US/LC_MESSAGES/OM.mo create mode 100644 .venv/lib/python3.12/site-packages/holidays/locale/en_US/LC_MESSAGES/PA.mo create mode 100644 .venv/lib/python3.12/site-packages/holidays/locale/en_US/LC_MESSAGES/PE.mo create mode 100644 .venv/lib/python3.12/site-packages/holidays/locale/en_US/LC_MESSAGES/PF.mo create mode 100644 .venv/lib/python3.12/site-packages/holidays/locale/en_US/LC_MESSAGES/PH.mo create mode 100644 .venv/lib/python3.12/site-packages/holidays/locale/en_US/LC_MESSAGES/PK.mo create mode 100644 .venv/lib/python3.12/site-packages/holidays/locale/en_US/LC_MESSAGES/PL.mo create mode 100644 .venv/lib/python3.12/site-packages/holidays/locale/en_US/LC_MESSAGES/PM.mo create mode 100644 .venv/lib/python3.12/site-packages/holidays/locale/en_US/LC_MESSAGES/PR.mo create mode 100644 .venv/lib/python3.12/site-packages/holidays/locale/en_US/LC_MESSAGES/PS.mo create mode 100644 .venv/lib/python3.12/site-packages/holidays/locale/en_US/LC_MESSAGES/PT.mo create mode 100644 .venv/lib/python3.12/site-packages/holidays/locale/en_US/LC_MESSAGES/PY.mo create mode 100644 .venv/lib/python3.12/site-packages/holidays/locale/en_US/LC_MESSAGES/QA.mo create mode 100644 .venv/lib/python3.12/site-packages/holidays/locale/en_US/LC_MESSAGES/RE.mo create mode 100644 .venv/lib/python3.12/site-packages/holidays/locale/en_US/LC_MESSAGES/RO.mo create mode 100644 .venv/lib/python3.12/site-packages/holidays/locale/en_US/LC_MESSAGES/RS.mo create mode 100644 .venv/lib/python3.12/site-packages/holidays/locale/en_US/LC_MESSAGES/RU.mo create mode 100644 .venv/lib/python3.12/site-packages/holidays/locale/en_US/LC_MESSAGES/SA.mo create mode 100644 .venv/lib/python3.12/site-packages/holidays/locale/en_US/LC_MESSAGES/SC.mo create mode 100644 .venv/lib/python3.12/site-packages/holidays/locale/en_US/LC_MESSAGES/SE.mo create mode 100644 .venv/lib/python3.12/site-packages/holidays/locale/en_US/LC_MESSAGES/SG.mo create mode 100644 .venv/lib/python3.12/site-packages/holidays/locale/en_US/LC_MESSAGES/SI.mo create mode 100644 .venv/lib/python3.12/site-packages/holidays/locale/en_US/LC_MESSAGES/SJ.mo create mode 100644 .venv/lib/python3.12/site-packages/holidays/locale/en_US/LC_MESSAGES/SK.mo create mode 100644 .venv/lib/python3.12/site-packages/holidays/locale/en_US/LC_MESSAGES/SL.mo create mode 100644 .venv/lib/python3.12/site-packages/holidays/locale/en_US/LC_MESSAGES/SM.mo create mode 100644 .venv/lib/python3.12/site-packages/holidays/locale/en_US/LC_MESSAGES/SN.mo create mode 100644 .venv/lib/python3.12/site-packages/holidays/locale/en_US/LC_MESSAGES/SR.mo create mode 100644 .venv/lib/python3.12/site-packages/holidays/locale/en_US/LC_MESSAGES/ST.mo create mode 100644 .venv/lib/python3.12/site-packages/holidays/locale/en_US/LC_MESSAGES/SV.mo create mode 100644 .venv/lib/python3.12/site-packages/holidays/locale/en_US/LC_MESSAGES/SX.mo create mode 100644 .venv/lib/python3.12/site-packages/holidays/locale/en_US/LC_MESSAGES/TC.mo create mode 100644 .venv/lib/python3.12/site-packages/holidays/locale/en_US/LC_MESSAGES/TF.mo create mode 100644 .venv/lib/python3.12/site-packages/holidays/locale/en_US/LC_MESSAGES/TG.mo create mode 100644 .venv/lib/python3.12/site-packages/holidays/locale/en_US/LC_MESSAGES/TH.mo create mode 100644 .venv/lib/python3.12/site-packages/holidays/locale/en_US/LC_MESSAGES/TK.mo create mode 100644 .venv/lib/python3.12/site-packages/holidays/locale/en_US/LC_MESSAGES/TL.mo create mode 100644 .venv/lib/python3.12/site-packages/holidays/locale/en_US/LC_MESSAGES/TN.mo create mode 100644 .venv/lib/python3.12/site-packages/holidays/locale/en_US/LC_MESSAGES/TO.mo create mode 100644 .venv/lib/python3.12/site-packages/holidays/locale/en_US/LC_MESSAGES/TR.mo create mode 100644 .venv/lib/python3.12/site-packages/holidays/locale/en_US/LC_MESSAGES/TT.mo create mode 100644 .venv/lib/python3.12/site-packages/holidays/locale/en_US/LC_MESSAGES/TV.mo create mode 100644 .venv/lib/python3.12/site-packages/holidays/locale/en_US/LC_MESSAGES/TW.mo create mode 100644 .venv/lib/python3.12/site-packages/holidays/locale/en_US/LC_MESSAGES/TZ.mo create mode 100644 .venv/lib/python3.12/site-packages/holidays/locale/en_US/LC_MESSAGES/UA.mo create mode 100644 .venv/lib/python3.12/site-packages/holidays/locale/en_US/LC_MESSAGES/UM.mo create mode 100644 .venv/lib/python3.12/site-packages/holidays/locale/en_US/LC_MESSAGES/US.mo create mode 100644 .venv/lib/python3.12/site-packages/holidays/locale/en_US/LC_MESSAGES/UY.mo create mode 100644 .venv/lib/python3.12/site-packages/holidays/locale/en_US/LC_MESSAGES/UZ.mo create mode 100644 .venv/lib/python3.12/site-packages/holidays/locale/en_US/LC_MESSAGES/VA.mo create mode 100644 .venv/lib/python3.12/site-packages/holidays/locale/en_US/LC_MESSAGES/VC.mo create mode 100644 .venv/lib/python3.12/site-packages/holidays/locale/en_US/LC_MESSAGES/VE.mo create mode 100644 .venv/lib/python3.12/site-packages/holidays/locale/en_US/LC_MESSAGES/VG.mo create mode 100644 .venv/lib/python3.12/site-packages/holidays/locale/en_US/LC_MESSAGES/VI.mo create mode 100644 .venv/lib/python3.12/site-packages/holidays/locale/en_US/LC_MESSAGES/VN.mo create mode 100644 .venv/lib/python3.12/site-packages/holidays/locale/en_US/LC_MESSAGES/WF.mo create mode 100644 .venv/lib/python3.12/site-packages/holidays/locale/en_US/LC_MESSAGES/YE.mo create mode 100644 .venv/lib/python3.12/site-packages/holidays/locale/en_US/LC_MESSAGES/YT.mo create mode 100644 .venv/lib/python3.12/site-packages/holidays/locale/en_VC/LC_MESSAGES/VC.mo create mode 100644 .venv/lib/python3.12/site-packages/holidays/locale/en_VG/LC_MESSAGES/VG.mo create mode 100644 .venv/lib/python3.12/site-packages/holidays/locale/es/LC_MESSAGES/AR.mo create mode 100644 .venv/lib/python3.12/site-packages/holidays/locale/es/LC_MESSAGES/BO.mo create mode 100644 .venv/lib/python3.12/site-packages/holidays/locale/es/LC_MESSAGES/CL.mo create mode 100644 .venv/lib/python3.12/site-packages/holidays/locale/es/LC_MESSAGES/CO.mo create mode 100644 .venv/lib/python3.12/site-packages/holidays/locale/es/LC_MESSAGES/CR.mo create mode 100644 .venv/lib/python3.12/site-packages/holidays/locale/es/LC_MESSAGES/CU.mo create mode 100644 .venv/lib/python3.12/site-packages/holidays/locale/es/LC_MESSAGES/CV.mo create mode 100644 .venv/lib/python3.12/site-packages/holidays/locale/es/LC_MESSAGES/DO.mo create mode 100644 .venv/lib/python3.12/site-packages/holidays/locale/es/LC_MESSAGES/EC.mo create mode 100644 .venv/lib/python3.12/site-packages/holidays/locale/es/LC_MESSAGES/ES.mo create mode 100644 .venv/lib/python3.12/site-packages/holidays/locale/es/LC_MESSAGES/GQ.mo create mode 100644 .venv/lib/python3.12/site-packages/holidays/locale/es/LC_MESSAGES/GT.mo create mode 100644 .venv/lib/python3.12/site-packages/holidays/locale/es/LC_MESSAGES/HN.mo create mode 100644 .venv/lib/python3.12/site-packages/holidays/locale/es/LC_MESSAGES/HT.mo create mode 100644 .venv/lib/python3.12/site-packages/holidays/locale/es/LC_MESSAGES/MX.mo create mode 100644 .venv/lib/python3.12/site-packages/holidays/locale/es/LC_MESSAGES/NI.mo create mode 100644 .venv/lib/python3.12/site-packages/holidays/locale/es/LC_MESSAGES/PA.mo create mode 100644 .venv/lib/python3.12/site-packages/holidays/locale/es/LC_MESSAGES/PE.mo create mode 100644 .venv/lib/python3.12/site-packages/holidays/locale/es/LC_MESSAGES/PY.mo create mode 100644 .venv/lib/python3.12/site-packages/holidays/locale/es/LC_MESSAGES/SV.mo create mode 100644 .venv/lib/python3.12/site-packages/holidays/locale/es/LC_MESSAGES/UY.mo create mode 100644 .venv/lib/python3.12/site-packages/holidays/locale/es/LC_MESSAGES/VE.mo create mode 100644 .venv/lib/python3.12/site-packages/holidays/locale/et/LC_MESSAGES/EE.mo create mode 100644 .venv/lib/python3.12/site-packages/holidays/locale/fa_AF/LC_MESSAGES/AF.mo create mode 100644 .venv/lib/python3.12/site-packages/holidays/locale/fa_IR/LC_MESSAGES/IR.mo create mode 100644 .venv/lib/python3.12/site-packages/holidays/locale/fi/LC_MESSAGES/AX.mo create mode 100644 .venv/lib/python3.12/site-packages/holidays/locale/fi/LC_MESSAGES/FI.mo create mode 100644 .venv/lib/python3.12/site-packages/holidays/locale/fi/LC_MESSAGES/GL.mo create mode 100644 .venv/lib/python3.12/site-packages/holidays/locale/fil/LC_MESSAGES/PH.mo create mode 100644 .venv/lib/python3.12/site-packages/holidays/locale/fo/LC_MESSAGES/FO.mo create mode 100644 .venv/lib/python3.12/site-packages/holidays/locale/fr/LC_MESSAGES/BE.mo create mode 100644 .venv/lib/python3.12/site-packages/holidays/locale/fr/LC_MESSAGES/BL.mo create mode 100644 .venv/lib/python3.12/site-packages/holidays/locale/fr/LC_MESSAGES/CA.mo create mode 100644 .venv/lib/python3.12/site-packages/holidays/locale/fr/LC_MESSAGES/CD.mo create mode 100644 .venv/lib/python3.12/site-packages/holidays/locale/fr/LC_MESSAGES/CF.mo create mode 100644 .venv/lib/python3.12/site-packages/holidays/locale/fr/LC_MESSAGES/CG.mo create mode 100644 .venv/lib/python3.12/site-packages/holidays/locale/fr/LC_MESSAGES/CH.mo create mode 100644 .venv/lib/python3.12/site-packages/holidays/locale/fr/LC_MESSAGES/CI.mo create mode 100644 .venv/lib/python3.12/site-packages/holidays/locale/fr/LC_MESSAGES/CV.mo create mode 100644 .venv/lib/python3.12/site-packages/holidays/locale/fr/LC_MESSAGES/DJ.mo create mode 100644 .venv/lib/python3.12/site-packages/holidays/locale/fr/LC_MESSAGES/DZ.mo create mode 100644 .venv/lib/python3.12/site-packages/holidays/locale/fr/LC_MESSAGES/FR.mo create mode 100644 .venv/lib/python3.12/site-packages/holidays/locale/fr/LC_MESSAGES/GF.mo create mode 100644 .venv/lib/python3.12/site-packages/holidays/locale/fr/LC_MESSAGES/GN.mo create mode 100644 .venv/lib/python3.12/site-packages/holidays/locale/fr/LC_MESSAGES/GP.mo create mode 100644 .venv/lib/python3.12/site-packages/holidays/locale/fr/LC_MESSAGES/LU.mo create mode 100644 .venv/lib/python3.12/site-packages/holidays/locale/fr/LC_MESSAGES/MA.mo create mode 100644 .venv/lib/python3.12/site-packages/holidays/locale/fr/LC_MESSAGES/MC.mo create mode 100644 .venv/lib/python3.12/site-packages/holidays/locale/fr/LC_MESSAGES/MF.mo create mode 100644 .venv/lib/python3.12/site-packages/holidays/locale/fr/LC_MESSAGES/ML.mo create mode 100644 .venv/lib/python3.12/site-packages/holidays/locale/fr/LC_MESSAGES/MQ.mo create mode 100644 .venv/lib/python3.12/site-packages/holidays/locale/fr/LC_MESSAGES/NC.mo create mode 100644 .venv/lib/python3.12/site-packages/holidays/locale/fr/LC_MESSAGES/PF.mo create mode 100644 .venv/lib/python3.12/site-packages/holidays/locale/fr/LC_MESSAGES/PM.mo create mode 100644 .venv/lib/python3.12/site-packages/holidays/locale/fr/LC_MESSAGES/RE.mo create mode 100644 .venv/lib/python3.12/site-packages/holidays/locale/fr/LC_MESSAGES/TF.mo create mode 100644 .venv/lib/python3.12/site-packages/holidays/locale/fr/LC_MESSAGES/TG.mo create mode 100644 .venv/lib/python3.12/site-packages/holidays/locale/fr/LC_MESSAGES/WF.mo create mode 100644 .venv/lib/python3.12/site-packages/holidays/locale/fr/LC_MESSAGES/YT.mo create mode 100644 .venv/lib/python3.12/site-packages/holidays/locale/fr_BJ/LC_MESSAGES/BJ.mo create mode 100644 .venv/lib/python3.12/site-packages/holidays/locale/fr_HT/LC_MESSAGES/HT.mo create mode 100644 .venv/lib/python3.12/site-packages/holidays/locale/fr_NE/LC_MESSAGES/NE.mo create mode 100644 .venv/lib/python3.12/site-packages/holidays/locale/fr_SN/LC_MESSAGES/SN.mo create mode 100644 .venv/lib/python3.12/site-packages/holidays/locale/fy/LC_MESSAGES/NL.mo create mode 100644 .venv/lib/python3.12/site-packages/holidays/locale/he/LC_MESSAGES/IL.mo create mode 100644 .venv/lib/python3.12/site-packages/holidays/locale/hi/LC_MESSAGES/IN.mo create mode 100644 .venv/lib/python3.12/site-packages/holidays/locale/hr/LC_MESSAGES/HR.mo create mode 100644 .venv/lib/python3.12/site-packages/holidays/locale/ht/LC_MESSAGES/HT.mo create mode 100644 .venv/lib/python3.12/site-packages/holidays/locale/hu/LC_MESSAGES/HU.mo create mode 100644 .venv/lib/python3.12/site-packages/holidays/locale/hy/LC_MESSAGES/AM.mo create mode 100644 .venv/lib/python3.12/site-packages/holidays/locale/id/LC_MESSAGES/ID.mo create mode 100644 .venv/lib/python3.12/site-packages/holidays/locale/is/LC_MESSAGES/FO.mo create mode 100644 .venv/lib/python3.12/site-packages/holidays/locale/is/LC_MESSAGES/GL.mo create mode 100644 .venv/lib/python3.12/site-packages/holidays/locale/is/LC_MESSAGES/IS.mo create mode 100644 .venv/lib/python3.12/site-packages/holidays/locale/it/LC_MESSAGES/CH.mo create mode 100644 .venv/lib/python3.12/site-packages/holidays/locale/it/LC_MESSAGES/SM.mo create mode 100644 .venv/lib/python3.12/site-packages/holidays/locale/it/LC_MESSAGES/VA.mo create mode 100644 .venv/lib/python3.12/site-packages/holidays/locale/ja/LC_MESSAGES/JP.mo create mode 100644 .venv/lib/python3.12/site-packages/holidays/locale/ka/LC_MESSAGES/GE.mo create mode 100644 .venv/lib/python3.12/site-packages/holidays/locale/kk/LC_MESSAGES/KZ.mo create mode 100644 .venv/lib/python3.12/site-packages/holidays/locale/kl/LC_MESSAGES/GL.mo create mode 100644 .venv/lib/python3.12/site-packages/holidays/locale/km/LC_MESSAGES/KH.mo create mode 100644 .venv/lib/python3.12/site-packages/holidays/locale/ko/LC_MESSAGES/KR.mo create mode 100644 .venv/lib/python3.12/site-packages/holidays/locale/lb/LC_MESSAGES/LU.mo create mode 100644 .venv/lib/python3.12/site-packages/holidays/locale/lo/LC_MESSAGES/LA.mo create mode 100644 .venv/lib/python3.12/site-packages/holidays/locale/lt/LC_MESSAGES/LT.mo create mode 100644 .venv/lib/python3.12/site-packages/holidays/locale/lv/LC_MESSAGES/LV.mo create mode 100644 .venv/lib/python3.12/site-packages/holidays/locale/mg/LC_MESSAGES/MG.mo create mode 100644 .venv/lib/python3.12/site-packages/holidays/locale/mk/LC_MESSAGES/MK.mo create mode 100644 .venv/lib/python3.12/site-packages/holidays/locale/mn/LC_MESSAGES/MN.mo create mode 100644 .venv/lib/python3.12/site-packages/holidays/locale/ms/LC_MESSAGES/BN.mo create mode 100644 .venv/lib/python3.12/site-packages/holidays/locale/ms_MY/LC_MESSAGES/MY.mo create mode 100644 .venv/lib/python3.12/site-packages/holidays/locale/mt/LC_MESSAGES/MT.mo create mode 100644 .venv/lib/python3.12/site-packages/holidays/locale/nl/LC_MESSAGES/AW.mo create mode 100644 .venv/lib/python3.12/site-packages/holidays/locale/nl/LC_MESSAGES/BE.mo create mode 100644 .venv/lib/python3.12/site-packages/holidays/locale/nl/LC_MESSAGES/BQ.mo create mode 100644 .venv/lib/python3.12/site-packages/holidays/locale/nl/LC_MESSAGES/CW.mo create mode 100644 .venv/lib/python3.12/site-packages/holidays/locale/nl/LC_MESSAGES/NL.mo create mode 100644 .venv/lib/python3.12/site-packages/holidays/locale/nl/LC_MESSAGES/SR.mo create mode 100644 .venv/lib/python3.12/site-packages/holidays/locale/nl/LC_MESSAGES/SX.mo create mode 100644 .venv/lib/python3.12/site-packages/holidays/locale/no/LC_MESSAGES/FO.mo create mode 100644 .venv/lib/python3.12/site-packages/holidays/locale/no/LC_MESSAGES/GL.mo create mode 100644 .venv/lib/python3.12/site-packages/holidays/locale/no/LC_MESSAGES/NO.mo create mode 100644 .venv/lib/python3.12/site-packages/holidays/locale/no/LC_MESSAGES/SJ.mo create mode 100644 .venv/lib/python3.12/site-packages/holidays/locale/pap_AW/LC_MESSAGES/AW.mo create mode 100644 .venv/lib/python3.12/site-packages/holidays/locale/pap_BQ/LC_MESSAGES/BQ.mo create mode 100644 .venv/lib/python3.12/site-packages/holidays/locale/pap_CW/LC_MESSAGES/CW.mo create mode 100644 .venv/lib/python3.12/site-packages/holidays/locale/pl/LC_MESSAGES/PL.mo create mode 100644 .venv/lib/python3.12/site-packages/holidays/locale/ps_AF/LC_MESSAGES/AF.mo create mode 100644 .venv/lib/python3.12/site-packages/holidays/locale/pt_AO/LC_MESSAGES/AO.mo create mode 100644 .venv/lib/python3.12/site-packages/holidays/locale/pt_BR/LC_MESSAGES/BR.mo create mode 100644 .venv/lib/python3.12/site-packages/holidays/locale/pt_BR/LC_MESSAGES/BVMF.mo create mode 100644 .venv/lib/python3.12/site-packages/holidays/locale/pt_CV/LC_MESSAGES/CV.mo create mode 100644 .venv/lib/python3.12/site-packages/holidays/locale/pt_MO/LC_MESSAGES/MO.mo create mode 100644 .venv/lib/python3.12/site-packages/holidays/locale/pt_MZ/LC_MESSAGES/MZ.mo create mode 100644 .venv/lib/python3.12/site-packages/holidays/locale/pt_PT/LC_MESSAGES/PT.mo create mode 100644 .venv/lib/python3.12/site-packages/holidays/locale/pt_ST/LC_MESSAGES/ST.mo create mode 100644 .venv/lib/python3.12/site-packages/holidays/locale/pt_TL/LC_MESSAGES/TL.mo create mode 100644 .venv/lib/python3.12/site-packages/holidays/locale/ro/LC_MESSAGES/MD.mo create mode 100644 .venv/lib/python3.12/site-packages/holidays/locale/ro/LC_MESSAGES/RO.mo create mode 100644 .venv/lib/python3.12/site-packages/holidays/locale/ru/LC_MESSAGES/BY.mo create mode 100644 .venv/lib/python3.12/site-packages/holidays/locale/ru/LC_MESSAGES/RU.mo create mode 100644 .venv/lib/python3.12/site-packages/holidays/locale/si_LK/LC_MESSAGES/LK.mo create mode 100644 .venv/lib/python3.12/site-packages/holidays/locale/sk/LC_MESSAGES/CZ.mo create mode 100644 .venv/lib/python3.12/site-packages/holidays/locale/sk/LC_MESSAGES/SK.mo create mode 100644 .venv/lib/python3.12/site-packages/holidays/locale/sl/LC_MESSAGES/SI.mo create mode 100644 .venv/lib/python3.12/site-packages/holidays/locale/sq/LC_MESSAGES/AL.mo create mode 100644 .venv/lib/python3.12/site-packages/holidays/locale/sr/LC_MESSAGES/BA.mo create mode 100644 .venv/lib/python3.12/site-packages/holidays/locale/sr/LC_MESSAGES/RS.mo create mode 100644 .venv/lib/python3.12/site-packages/holidays/locale/sv/LC_MESSAGES/FO.mo create mode 100644 .venv/lib/python3.12/site-packages/holidays/locale/sv/LC_MESSAGES/GL.mo create mode 100644 .venv/lib/python3.12/site-packages/holidays/locale/sv/LC_MESSAGES/SE.mo create mode 100644 .venv/lib/python3.12/site-packages/holidays/locale/sv_FI/LC_MESSAGES/AX.mo create mode 100644 .venv/lib/python3.12/site-packages/holidays/locale/sv_FI/LC_MESSAGES/FI.mo create mode 100644 .venv/lib/python3.12/site-packages/holidays/locale/sw/LC_MESSAGES/KE.mo create mode 100644 .venv/lib/python3.12/site-packages/holidays/locale/sw/LC_MESSAGES/TZ.mo create mode 100644 .venv/lib/python3.12/site-packages/holidays/locale/ta_LK/LC_MESSAGES/LK.mo create mode 100644 .venv/lib/python3.12/site-packages/holidays/locale/tet/LC_MESSAGES/TL.mo create mode 100644 .venv/lib/python3.12/site-packages/holidays/locale/th/LC_MESSAGES/AE.mo create mode 100644 .venv/lib/python3.12/site-packages/holidays/locale/th/LC_MESSAGES/AS.mo create mode 100644 .venv/lib/python3.12/site-packages/holidays/locale/th/LC_MESSAGES/AU.mo create mode 100644 .venv/lib/python3.12/site-packages/holidays/locale/th/LC_MESSAGES/AX.mo create mode 100644 .venv/lib/python3.12/site-packages/holidays/locale/th/LC_MESSAGES/BL.mo create mode 100644 .venv/lib/python3.12/site-packages/holidays/locale/th/LC_MESSAGES/BN.mo create mode 100644 .venv/lib/python3.12/site-packages/holidays/locale/th/LC_MESSAGES/BY.mo create mode 100644 .venv/lib/python3.12/site-packages/holidays/locale/th/LC_MESSAGES/CA.mo create mode 100644 .venv/lib/python3.12/site-packages/holidays/locale/th/LC_MESSAGES/CN.mo create mode 100644 .venv/lib/python3.12/site-packages/holidays/locale/th/LC_MESSAGES/DE.mo create mode 100644 .venv/lib/python3.12/site-packages/holidays/locale/th/LC_MESSAGES/FI.mo create mode 100644 .venv/lib/python3.12/site-packages/holidays/locale/th/LC_MESSAGES/FR.mo create mode 100644 .venv/lib/python3.12/site-packages/holidays/locale/th/LC_MESSAGES/GB.mo create mode 100644 .venv/lib/python3.12/site-packages/holidays/locale/th/LC_MESSAGES/GF.mo create mode 100644 .venv/lib/python3.12/site-packages/holidays/locale/th/LC_MESSAGES/GP.mo create mode 100644 .venv/lib/python3.12/site-packages/holidays/locale/th/LC_MESSAGES/GU.mo create mode 100644 .venv/lib/python3.12/site-packages/holidays/locale/th/LC_MESSAGES/HK.mo create mode 100644 .venv/lib/python3.12/site-packages/holidays/locale/th/LC_MESSAGES/ID.mo create mode 100644 .venv/lib/python3.12/site-packages/holidays/locale/th/LC_MESSAGES/IL.mo create mode 100644 .venv/lib/python3.12/site-packages/holidays/locale/th/LC_MESSAGES/IM.mo create mode 100644 .venv/lib/python3.12/site-packages/holidays/locale/th/LC_MESSAGES/JP.mo create mode 100644 .venv/lib/python3.12/site-packages/holidays/locale/th/LC_MESSAGES/KH.mo create mode 100644 .venv/lib/python3.12/site-packages/holidays/locale/th/LC_MESSAGES/KR.mo create mode 100644 .venv/lib/python3.12/site-packages/holidays/locale/th/LC_MESSAGES/LA.mo create mode 100644 .venv/lib/python3.12/site-packages/holidays/locale/th/LC_MESSAGES/MF.mo create mode 100644 .venv/lib/python3.12/site-packages/holidays/locale/th/LC_MESSAGES/MO.mo create mode 100644 .venv/lib/python3.12/site-packages/holidays/locale/th/LC_MESSAGES/MP.mo create mode 100644 .venv/lib/python3.12/site-packages/holidays/locale/th/LC_MESSAGES/MQ.mo create mode 100644 .venv/lib/python3.12/site-packages/holidays/locale/th/LC_MESSAGES/MY.mo create mode 100644 .venv/lib/python3.12/site-packages/holidays/locale/th/LC_MESSAGES/NC.mo create mode 100644 .venv/lib/python3.12/site-packages/holidays/locale/th/LC_MESSAGES/NO.mo create mode 100644 .venv/lib/python3.12/site-packages/holidays/locale/th/LC_MESSAGES/PF.mo create mode 100644 .venv/lib/python3.12/site-packages/holidays/locale/th/LC_MESSAGES/PH.mo create mode 100644 .venv/lib/python3.12/site-packages/holidays/locale/th/LC_MESSAGES/PM.mo create mode 100644 .venv/lib/python3.12/site-packages/holidays/locale/th/LC_MESSAGES/PR.mo create mode 100644 .venv/lib/python3.12/site-packages/holidays/locale/th/LC_MESSAGES/RE.mo create mode 100644 .venv/lib/python3.12/site-packages/holidays/locale/th/LC_MESSAGES/RU.mo create mode 100644 .venv/lib/python3.12/site-packages/holidays/locale/th/LC_MESSAGES/SE.mo create mode 100644 .venv/lib/python3.12/site-packages/holidays/locale/th/LC_MESSAGES/SG.mo create mode 100644 .venv/lib/python3.12/site-packages/holidays/locale/th/LC_MESSAGES/SJ.mo create mode 100644 .venv/lib/python3.12/site-packages/holidays/locale/th/LC_MESSAGES/TF.mo create mode 100644 .venv/lib/python3.12/site-packages/holidays/locale/th/LC_MESSAGES/TH.mo create mode 100644 .venv/lib/python3.12/site-packages/holidays/locale/th/LC_MESSAGES/TL.mo create mode 100644 .venv/lib/python3.12/site-packages/holidays/locale/th/LC_MESSAGES/TW.mo create mode 100644 .venv/lib/python3.12/site-packages/holidays/locale/th/LC_MESSAGES/UA.mo create mode 100644 .venv/lib/python3.12/site-packages/holidays/locale/th/LC_MESSAGES/UM.mo create mode 100644 .venv/lib/python3.12/site-packages/holidays/locale/th/LC_MESSAGES/US.mo create mode 100644 .venv/lib/python3.12/site-packages/holidays/locale/th/LC_MESSAGES/VA.mo create mode 100644 .venv/lib/python3.12/site-packages/holidays/locale/th/LC_MESSAGES/VI.mo create mode 100644 .venv/lib/python3.12/site-packages/holidays/locale/th/LC_MESSAGES/VN.mo create mode 100644 .venv/lib/python3.12/site-packages/holidays/locale/th/LC_MESSAGES/WF.mo create mode 100644 .venv/lib/python3.12/site-packages/holidays/locale/th/LC_MESSAGES/YT.mo create mode 100644 .venv/lib/python3.12/site-packages/holidays/locale/tkl/LC_MESSAGES/TK.mo create mode 100644 .venv/lib/python3.12/site-packages/holidays/locale/to/LC_MESSAGES/TO.mo create mode 100644 .venv/lib/python3.12/site-packages/holidays/locale/tr/LC_MESSAGES/TR.mo create mode 100644 .venv/lib/python3.12/site-packages/holidays/locale/tvl/LC_MESSAGES/TV.mo create mode 100644 .venv/lib/python3.12/site-packages/holidays/locale/uk/LC_MESSAGES/AD.mo create mode 100644 .venv/lib/python3.12/site-packages/holidays/locale/uk/LC_MESSAGES/AL.mo create mode 100644 .venv/lib/python3.12/site-packages/holidays/locale/uk/LC_MESSAGES/AO.mo create mode 100644 .venv/lib/python3.12/site-packages/holidays/locale/uk/LC_MESSAGES/AR.mo create mode 100644 .venv/lib/python3.12/site-packages/holidays/locale/uk/LC_MESSAGES/AT.mo create mode 100644 .venv/lib/python3.12/site-packages/holidays/locale/uk/LC_MESSAGES/AW.mo create mode 100644 .venv/lib/python3.12/site-packages/holidays/locale/uk/LC_MESSAGES/AX.mo create mode 100644 .venv/lib/python3.12/site-packages/holidays/locale/uk/LC_MESSAGES/AZ.mo create mode 100644 .venv/lib/python3.12/site-packages/holidays/locale/uk/LC_MESSAGES/BA.mo create mode 100644 .venv/lib/python3.12/site-packages/holidays/locale/uk/LC_MESSAGES/BE.mo create mode 100644 .venv/lib/python3.12/site-packages/holidays/locale/uk/LC_MESSAGES/BG.mo create mode 100644 .venv/lib/python3.12/site-packages/holidays/locale/uk/LC_MESSAGES/BL.mo create mode 100644 .venv/lib/python3.12/site-packages/holidays/locale/uk/LC_MESSAGES/BO.mo create mode 100644 .venv/lib/python3.12/site-packages/holidays/locale/uk/LC_MESSAGES/BR.mo create mode 100644 .venv/lib/python3.12/site-packages/holidays/locale/uk/LC_MESSAGES/BVMF.mo create mode 100644 .venv/lib/python3.12/site-packages/holidays/locale/uk/LC_MESSAGES/CH.mo create mode 100644 .venv/lib/python3.12/site-packages/holidays/locale/uk/LC_MESSAGES/CL.mo create mode 100644 .venv/lib/python3.12/site-packages/holidays/locale/uk/LC_MESSAGES/CO.mo create mode 100644 .venv/lib/python3.12/site-packages/holidays/locale/uk/LC_MESSAGES/CR.mo create mode 100644 .venv/lib/python3.12/site-packages/holidays/locale/uk/LC_MESSAGES/CU.mo create mode 100644 .venv/lib/python3.12/site-packages/holidays/locale/uk/LC_MESSAGES/CW.mo create mode 100644 .venv/lib/python3.12/site-packages/holidays/locale/uk/LC_MESSAGES/CY.mo create mode 100644 .venv/lib/python3.12/site-packages/holidays/locale/uk/LC_MESSAGES/CZ.mo create mode 100644 .venv/lib/python3.12/site-packages/holidays/locale/uk/LC_MESSAGES/DE.mo create mode 100644 .venv/lib/python3.12/site-packages/holidays/locale/uk/LC_MESSAGES/DK.mo create mode 100644 .venv/lib/python3.12/site-packages/holidays/locale/uk/LC_MESSAGES/DO.mo create mode 100644 .venv/lib/python3.12/site-packages/holidays/locale/uk/LC_MESSAGES/EC.mo create mode 100644 .venv/lib/python3.12/site-packages/holidays/locale/uk/LC_MESSAGES/EE.mo create mode 100644 .venv/lib/python3.12/site-packages/holidays/locale/uk/LC_MESSAGES/ES.mo create mode 100644 .venv/lib/python3.12/site-packages/holidays/locale/uk/LC_MESSAGES/FI.mo create mode 100644 .venv/lib/python3.12/site-packages/holidays/locale/uk/LC_MESSAGES/FR.mo create mode 100644 .venv/lib/python3.12/site-packages/holidays/locale/uk/LC_MESSAGES/GE.mo create mode 100644 .venv/lib/python3.12/site-packages/holidays/locale/uk/LC_MESSAGES/GF.mo create mode 100644 .venv/lib/python3.12/site-packages/holidays/locale/uk/LC_MESSAGES/GL.mo create mode 100644 .venv/lib/python3.12/site-packages/holidays/locale/uk/LC_MESSAGES/GP.mo create mode 100644 .venv/lib/python3.12/site-packages/holidays/locale/uk/LC_MESSAGES/GR.mo create mode 100644 .venv/lib/python3.12/site-packages/holidays/locale/uk/LC_MESSAGES/HN.mo create mode 100644 .venv/lib/python3.12/site-packages/holidays/locale/uk/LC_MESSAGES/HR.mo create mode 100644 .venv/lib/python3.12/site-packages/holidays/locale/uk/LC_MESSAGES/HU.mo create mode 100644 .venv/lib/python3.12/site-packages/holidays/locale/uk/LC_MESSAGES/ID.mo create mode 100644 .venv/lib/python3.12/site-packages/holidays/locale/uk/LC_MESSAGES/IL.mo create mode 100644 .venv/lib/python3.12/site-packages/holidays/locale/uk/LC_MESSAGES/IS.mo create mode 100644 .venv/lib/python3.12/site-packages/holidays/locale/uk/LC_MESSAGES/KZ.mo create mode 100644 .venv/lib/python3.12/site-packages/holidays/locale/uk/LC_MESSAGES/LI.mo create mode 100644 .venv/lib/python3.12/site-packages/holidays/locale/uk/LC_MESSAGES/LT.mo create mode 100644 .venv/lib/python3.12/site-packages/holidays/locale/uk/LC_MESSAGES/LU.mo create mode 100644 .venv/lib/python3.12/site-packages/holidays/locale/uk/LC_MESSAGES/LV.mo create mode 100644 .venv/lib/python3.12/site-packages/holidays/locale/uk/LC_MESSAGES/MC.mo create mode 100644 .venv/lib/python3.12/site-packages/holidays/locale/uk/LC_MESSAGES/MD.mo create mode 100644 .venv/lib/python3.12/site-packages/holidays/locale/uk/LC_MESSAGES/ME.mo create mode 100644 .venv/lib/python3.12/site-packages/holidays/locale/uk/LC_MESSAGES/MF.mo create mode 100644 .venv/lib/python3.12/site-packages/holidays/locale/uk/LC_MESSAGES/MG.mo create mode 100644 .venv/lib/python3.12/site-packages/holidays/locale/uk/LC_MESSAGES/MK.mo create mode 100644 .venv/lib/python3.12/site-packages/holidays/locale/uk/LC_MESSAGES/MQ.mo create mode 100644 .venv/lib/python3.12/site-packages/holidays/locale/uk/LC_MESSAGES/MX.mo create mode 100644 .venv/lib/python3.12/site-packages/holidays/locale/uk/LC_MESSAGES/MZ.mo create mode 100644 .venv/lib/python3.12/site-packages/holidays/locale/uk/LC_MESSAGES/NA.mo create mode 100644 .venv/lib/python3.12/site-packages/holidays/locale/uk/LC_MESSAGES/NC.mo create mode 100644 .venv/lib/python3.12/site-packages/holidays/locale/uk/LC_MESSAGES/NI.mo create mode 100644 .venv/lib/python3.12/site-packages/holidays/locale/uk/LC_MESSAGES/NL.mo create mode 100644 .venv/lib/python3.12/site-packages/holidays/locale/uk/LC_MESSAGES/NO.mo create mode 100644 .venv/lib/python3.12/site-packages/holidays/locale/uk/LC_MESSAGES/PA.mo create mode 100644 .venv/lib/python3.12/site-packages/holidays/locale/uk/LC_MESSAGES/PE.mo create mode 100644 .venv/lib/python3.12/site-packages/holidays/locale/uk/LC_MESSAGES/PF.mo create mode 100644 .venv/lib/python3.12/site-packages/holidays/locale/uk/LC_MESSAGES/PL.mo create mode 100644 .venv/lib/python3.12/site-packages/holidays/locale/uk/LC_MESSAGES/PM.mo create mode 100644 .venv/lib/python3.12/site-packages/holidays/locale/uk/LC_MESSAGES/PT.mo create mode 100644 .venv/lib/python3.12/site-packages/holidays/locale/uk/LC_MESSAGES/PY.mo create mode 100644 .venv/lib/python3.12/site-packages/holidays/locale/uk/LC_MESSAGES/RE.mo create mode 100644 .venv/lib/python3.12/site-packages/holidays/locale/uk/LC_MESSAGES/RO.mo create mode 100644 .venv/lib/python3.12/site-packages/holidays/locale/uk/LC_MESSAGES/SE.mo create mode 100644 .venv/lib/python3.12/site-packages/holidays/locale/uk/LC_MESSAGES/SI.mo create mode 100644 .venv/lib/python3.12/site-packages/holidays/locale/uk/LC_MESSAGES/SJ.mo create mode 100644 .venv/lib/python3.12/site-packages/holidays/locale/uk/LC_MESSAGES/SK.mo create mode 100644 .venv/lib/python3.12/site-packages/holidays/locale/uk/LC_MESSAGES/SM.mo create mode 100644 .venv/lib/python3.12/site-packages/holidays/locale/uk/LC_MESSAGES/SV.mo create mode 100644 .venv/lib/python3.12/site-packages/holidays/locale/uk/LC_MESSAGES/TF.mo create mode 100644 .venv/lib/python3.12/site-packages/holidays/locale/uk/LC_MESSAGES/TH.mo create mode 100644 .venv/lib/python3.12/site-packages/holidays/locale/uk/LC_MESSAGES/TR.mo create mode 100644 .venv/lib/python3.12/site-packages/holidays/locale/uk/LC_MESSAGES/UA.mo create mode 100644 .venv/lib/python3.12/site-packages/holidays/locale/uk/LC_MESSAGES/UY.mo create mode 100644 .venv/lib/python3.12/site-packages/holidays/locale/uk/LC_MESSAGES/UZ.mo create mode 100644 .venv/lib/python3.12/site-packages/holidays/locale/uk/LC_MESSAGES/VE.mo create mode 100644 .venv/lib/python3.12/site-packages/holidays/locale/uk/LC_MESSAGES/WF.mo create mode 100644 .venv/lib/python3.12/site-packages/holidays/locale/uk/LC_MESSAGES/YT.mo create mode 100644 .venv/lib/python3.12/site-packages/holidays/locale/ur_PK/LC_MESSAGES/PK.mo create mode 100644 .venv/lib/python3.12/site-packages/holidays/locale/uz/LC_MESSAGES/UZ.mo create mode 100644 .venv/lib/python3.12/site-packages/holidays/locale/vi/LC_MESSAGES/VN.mo create mode 100644 .venv/lib/python3.12/site-packages/holidays/locale/zh_CN/LC_MESSAGES/CN.mo create mode 100644 .venv/lib/python3.12/site-packages/holidays/locale/zh_CN/LC_MESSAGES/HK.mo create mode 100644 .venv/lib/python3.12/site-packages/holidays/locale/zh_CN/LC_MESSAGES/MO.mo create mode 100644 .venv/lib/python3.12/site-packages/holidays/locale/zh_CN/LC_MESSAGES/TW.mo create mode 100644 .venv/lib/python3.12/site-packages/holidays/locale/zh_HK/LC_MESSAGES/HK.mo create mode 100644 .venv/lib/python3.12/site-packages/holidays/locale/zh_MO/LC_MESSAGES/MO.mo create mode 100644 .venv/lib/python3.12/site-packages/holidays/locale/zh_TW/LC_MESSAGES/CN.mo create mode 100644 .venv/lib/python3.12/site-packages/holidays/locale/zh_TW/LC_MESSAGES/TW.mo create mode 100644 .venv/lib/python3.12/site-packages/holidays/mixins/__init__.py create mode 100644 .venv/lib/python3.12/site-packages/holidays/mixins/__pycache__/__init__.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/holidays/mixins/__pycache__/child_entity.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/holidays/mixins/__pycache__/preferred_discretionary_holidays.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/holidays/mixins/child_entity.py create mode 100644 .venv/lib/python3.12/site-packages/holidays/mixins/preferred_discretionary_holidays.py create mode 100644 .venv/lib/python3.12/site-packages/holidays/observed_holiday_base.py create mode 100644 .venv/lib/python3.12/site-packages/holidays/py.typed create mode 100644 .venv/lib/python3.12/site-packages/holidays/registry.py create mode 100644 .venv/lib/python3.12/site-packages/holidays/utils.py create mode 100644 .venv/lib/python3.12/site-packages/holidays/version.py create mode 100644 .venv/lib/python3.12/site-packages/importlib_resources-6.5.2.dist-info/INSTALLER create mode 100644 .venv/lib/python3.12/site-packages/importlib_resources-6.5.2.dist-info/LICENSE create mode 100644 .venv/lib/python3.12/site-packages/importlib_resources-6.5.2.dist-info/METADATA create mode 100644 .venv/lib/python3.12/site-packages/importlib_resources-6.5.2.dist-info/RECORD create mode 100644 .venv/lib/python3.12/site-packages/importlib_resources-6.5.2.dist-info/WHEEL create mode 100644 .venv/lib/python3.12/site-packages/importlib_resources-6.5.2.dist-info/top_level.txt create mode 100644 .venv/lib/python3.12/site-packages/importlib_resources/__init__.py create mode 100644 .venv/lib/python3.12/site-packages/importlib_resources/__pycache__/__init__.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/importlib_resources/__pycache__/_adapters.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/importlib_resources/__pycache__/_common.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/importlib_resources/__pycache__/_functional.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/importlib_resources/__pycache__/_itertools.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/importlib_resources/__pycache__/abc.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/importlib_resources/__pycache__/readers.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/importlib_resources/__pycache__/simple.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/importlib_resources/_adapters.py create mode 100644 .venv/lib/python3.12/site-packages/importlib_resources/_common.py create mode 100644 .venv/lib/python3.12/site-packages/importlib_resources/_functional.py create mode 100644 .venv/lib/python3.12/site-packages/importlib_resources/_itertools.py create mode 100644 .venv/lib/python3.12/site-packages/importlib_resources/abc.py create mode 100644 .venv/lib/python3.12/site-packages/importlib_resources/compat/__init__.py create mode 100644 .venv/lib/python3.12/site-packages/importlib_resources/compat/__pycache__/__init__.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/importlib_resources/compat/__pycache__/py39.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/importlib_resources/compat/py39.py create mode 100644 .venv/lib/python3.12/site-packages/importlib_resources/future/__init__.py create mode 100644 .venv/lib/python3.12/site-packages/importlib_resources/future/__pycache__/__init__.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/importlib_resources/future/__pycache__/adapters.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/importlib_resources/future/adapters.py create mode 100644 .venv/lib/python3.12/site-packages/importlib_resources/py.typed create mode 100644 .venv/lib/python3.12/site-packages/importlib_resources/readers.py create mode 100644 .venv/lib/python3.12/site-packages/importlib_resources/simple.py create mode 100644 .venv/lib/python3.12/site-packages/importlib_resources/tests/__init__.py create mode 100644 .venv/lib/python3.12/site-packages/importlib_resources/tests/__pycache__/__init__.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/importlib_resources/tests/__pycache__/_path.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/importlib_resources/tests/__pycache__/test_compatibilty_files.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/importlib_resources/tests/__pycache__/test_contents.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/importlib_resources/tests/__pycache__/test_custom.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/importlib_resources/tests/__pycache__/test_files.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/importlib_resources/tests/__pycache__/test_functional.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/importlib_resources/tests/__pycache__/test_open.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/importlib_resources/tests/__pycache__/test_path.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/importlib_resources/tests/__pycache__/test_read.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/importlib_resources/tests/__pycache__/test_reader.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/importlib_resources/tests/__pycache__/test_resource.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/importlib_resources/tests/__pycache__/test_util.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/importlib_resources/tests/__pycache__/util.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/importlib_resources/tests/__pycache__/zip.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/importlib_resources/tests/_path.py create mode 100644 .venv/lib/python3.12/site-packages/importlib_resources/tests/compat/__init__.py create mode 100644 .venv/lib/python3.12/site-packages/importlib_resources/tests/compat/__pycache__/__init__.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/importlib_resources/tests/compat/__pycache__/py312.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/importlib_resources/tests/compat/__pycache__/py39.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/importlib_resources/tests/compat/py312.py create mode 100644 .venv/lib/python3.12/site-packages/importlib_resources/tests/compat/py39.py create mode 100644 .venv/lib/python3.12/site-packages/importlib_resources/tests/test_compatibilty_files.py create mode 100644 .venv/lib/python3.12/site-packages/importlib_resources/tests/test_contents.py create mode 100644 .venv/lib/python3.12/site-packages/importlib_resources/tests/test_custom.py create mode 100644 .venv/lib/python3.12/site-packages/importlib_resources/tests/test_files.py create mode 100644 .venv/lib/python3.12/site-packages/importlib_resources/tests/test_functional.py create mode 100644 .venv/lib/python3.12/site-packages/importlib_resources/tests/test_open.py create mode 100644 .venv/lib/python3.12/site-packages/importlib_resources/tests/test_path.py create mode 100644 .venv/lib/python3.12/site-packages/importlib_resources/tests/test_read.py create mode 100644 .venv/lib/python3.12/site-packages/importlib_resources/tests/test_reader.py create mode 100644 .venv/lib/python3.12/site-packages/importlib_resources/tests/test_resource.py create mode 100644 .venv/lib/python3.12/site-packages/importlib_resources/tests/test_util.py create mode 100644 .venv/lib/python3.12/site-packages/importlib_resources/tests/util.py create mode 100644 .venv/lib/python3.12/site-packages/importlib_resources/tests/zip.py create mode 100644 .venv/lib/python3.12/site-packages/prophet-1.1.7.dist-info/INSTALLER create mode 100644 .venv/lib/python3.12/site-packages/prophet-1.1.7.dist-info/METADATA create mode 100644 .venv/lib/python3.12/site-packages/prophet-1.1.7.dist-info/RECORD create mode 100644 .venv/lib/python3.12/site-packages/prophet-1.1.7.dist-info/REQUESTED create mode 100644 .venv/lib/python3.12/site-packages/prophet-1.1.7.dist-info/WHEEL create mode 100644 .venv/lib/python3.12/site-packages/prophet-1.1.7.dist-info/licenses/LICENSE create mode 100644 .venv/lib/python3.12/site-packages/prophet-1.1.7.dist-info/top_level.txt create mode 100755 .venv/lib/python3.12/site-packages/prophet.libs/libtbb-ff323302.so.2 create mode 100755 .venv/lib/python3.12/site-packages/prophet.libs/libtbbmalloc-4dcb68e3.so.2 create mode 100644 .venv/lib/python3.12/site-packages/prophet/__init__.py create mode 100644 .venv/lib/python3.12/site-packages/prophet/__pycache__/__init__.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/prophet/__pycache__/__version__.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/prophet/__pycache__/diagnostics.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/prophet/__pycache__/forecaster.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/prophet/__pycache__/make_holidays.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/prophet/__pycache__/models.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/prophet/__pycache__/plot.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/prophet/__pycache__/serialize.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/prophet/__pycache__/utilities.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/prophet/__version__.py create mode 100644 .venv/lib/python3.12/site-packages/prophet/diagnostics.py create mode 100644 .venv/lib/python3.12/site-packages/prophet/forecaster.py create mode 100644 .venv/lib/python3.12/site-packages/prophet/make_holidays.py create mode 100644 .venv/lib/python3.12/site-packages/prophet/models.py create mode 100644 .venv/lib/python3.12/site-packages/prophet/plot.py create mode 100644 .venv/lib/python3.12/site-packages/prophet/serialize.py create mode 100755 .venv/lib/python3.12/site-packages/prophet/stan_model/cmdstan-2.33.1/bin/diagnose create mode 100755 .venv/lib/python3.12/site-packages/prophet/stan_model/cmdstan-2.33.1/bin/print create mode 100755 .venv/lib/python3.12/site-packages/prophet/stan_model/cmdstan-2.33.1/bin/stanc create mode 100755 .venv/lib/python3.12/site-packages/prophet/stan_model/cmdstan-2.33.1/bin/stansummary create mode 100644 .venv/lib/python3.12/site-packages/prophet/stan_model/cmdstan-2.33.1/stan/lib/stan_math/lib/tbb/arena.d create mode 100644 .venv/lib/python3.12/site-packages/prophet/stan_model/cmdstan-2.33.1/stan/lib/stan_math/lib/tbb/arena.o create mode 100644 .venv/lib/python3.12/site-packages/prophet/stan_model/cmdstan-2.33.1/stan/lib/stan_math/lib/tbb/backend.d create mode 100644 .venv/lib/python3.12/site-packages/prophet/stan_model/cmdstan-2.33.1/stan/lib/stan_math/lib/tbb/backend.o create mode 100644 .venv/lib/python3.12/site-packages/prophet/stan_model/cmdstan-2.33.1/stan/lib/stan_math/lib/tbb/backref.d create mode 100644 .venv/lib/python3.12/site-packages/prophet/stan_model/cmdstan-2.33.1/stan/lib/stan_math/lib/tbb/backref.o create mode 100644 .venv/lib/python3.12/site-packages/prophet/stan_model/cmdstan-2.33.1/stan/lib/stan_math/lib/tbb/cache_aligned_allocator.d create mode 100644 .venv/lib/python3.12/site-packages/prophet/stan_model/cmdstan-2.33.1/stan/lib/stan_math/lib/tbb/cache_aligned_allocator.o create mode 100644 .venv/lib/python3.12/site-packages/prophet/stan_model/cmdstan-2.33.1/stan/lib/stan_math/lib/tbb/concurrent_hash_map.d create mode 100644 .venv/lib/python3.12/site-packages/prophet/stan_model/cmdstan-2.33.1/stan/lib/stan_math/lib/tbb/concurrent_hash_map.o create mode 100644 .venv/lib/python3.12/site-packages/prophet/stan_model/cmdstan-2.33.1/stan/lib/stan_math/lib/tbb/concurrent_monitor.d create mode 100644 .venv/lib/python3.12/site-packages/prophet/stan_model/cmdstan-2.33.1/stan/lib/stan_math/lib/tbb/concurrent_monitor.o create mode 100644 .venv/lib/python3.12/site-packages/prophet/stan_model/cmdstan-2.33.1/stan/lib/stan_math/lib/tbb/concurrent_queue.d create mode 100644 .venv/lib/python3.12/site-packages/prophet/stan_model/cmdstan-2.33.1/stan/lib/stan_math/lib/tbb/concurrent_queue.o create mode 100644 .venv/lib/python3.12/site-packages/prophet/stan_model/cmdstan-2.33.1/stan/lib/stan_math/lib/tbb/concurrent_queue_v2.d create mode 100644 .venv/lib/python3.12/site-packages/prophet/stan_model/cmdstan-2.33.1/stan/lib/stan_math/lib/tbb/concurrent_queue_v2.o create mode 100644 .venv/lib/python3.12/site-packages/prophet/stan_model/cmdstan-2.33.1/stan/lib/stan_math/lib/tbb/concurrent_vector.d create mode 100644 .venv/lib/python3.12/site-packages/prophet/stan_model/cmdstan-2.33.1/stan/lib/stan_math/lib/tbb/concurrent_vector.o create mode 100644 .venv/lib/python3.12/site-packages/prophet/stan_model/cmdstan-2.33.1/stan/lib/stan_math/lib/tbb/concurrent_vector_v2.d create mode 100644 .venv/lib/python3.12/site-packages/prophet/stan_model/cmdstan-2.33.1/stan/lib/stan_math/lib/tbb/concurrent_vector_v2.o create mode 100644 .venv/lib/python3.12/site-packages/prophet/stan_model/cmdstan-2.33.1/stan/lib/stan_math/lib/tbb/condition_variable.d create mode 100644 .venv/lib/python3.12/site-packages/prophet/stan_model/cmdstan-2.33.1/stan/lib/stan_math/lib/tbb/condition_variable.o create mode 100644 .venv/lib/python3.12/site-packages/prophet/stan_model/cmdstan-2.33.1/stan/lib/stan_math/lib/tbb/critical_section.d create mode 100644 .venv/lib/python3.12/site-packages/prophet/stan_model/cmdstan-2.33.1/stan/lib/stan_math/lib/tbb/critical_section.o create mode 100644 .venv/lib/python3.12/site-packages/prophet/stan_model/cmdstan-2.33.1/stan/lib/stan_math/lib/tbb/dynamic_link.d create mode 100644 .venv/lib/python3.12/site-packages/prophet/stan_model/cmdstan-2.33.1/stan/lib/stan_math/lib/tbb/dynamic_link.o create mode 100644 .venv/lib/python3.12/site-packages/prophet/stan_model/cmdstan-2.33.1/stan/lib/stan_math/lib/tbb/frontend.d create mode 100644 .venv/lib/python3.12/site-packages/prophet/stan_model/cmdstan-2.33.1/stan/lib/stan_math/lib/tbb/frontend.o create mode 100644 .venv/lib/python3.12/site-packages/prophet/stan_model/cmdstan-2.33.1/stan/lib/stan_math/lib/tbb/governor.d create mode 100644 .venv/lib/python3.12/site-packages/prophet/stan_model/cmdstan-2.33.1/stan/lib/stan_math/lib/tbb/governor.o create mode 100644 .venv/lib/python3.12/site-packages/prophet/stan_model/cmdstan-2.33.1/stan/lib/stan_math/lib/tbb/itt_notify.d create mode 100644 .venv/lib/python3.12/site-packages/prophet/stan_model/cmdstan-2.33.1/stan/lib/stan_math/lib/tbb/itt_notify.o create mode 100644 .venv/lib/python3.12/site-packages/prophet/stan_model/cmdstan-2.33.1/stan/lib/stan_math/lib/tbb/itt_notify_malloc.d create mode 100644 .venv/lib/python3.12/site-packages/prophet/stan_model/cmdstan-2.33.1/stan/lib/stan_math/lib/tbb/itt_notify_malloc.o create mode 100644 .venv/lib/python3.12/site-packages/prophet/stan_model/cmdstan-2.33.1/stan/lib/stan_math/lib/tbb/large_objects.d create mode 100644 .venv/lib/python3.12/site-packages/prophet/stan_model/cmdstan-2.33.1/stan/lib/stan_math/lib/tbb/large_objects.o create mode 100644 .venv/lib/python3.12/site-packages/prophet/stan_model/cmdstan-2.33.1/stan/lib/stan_math/lib/tbb/libtbb.so create mode 100755 .venv/lib/python3.12/site-packages/prophet/stan_model/cmdstan-2.33.1/stan/lib/stan_math/lib/tbb/libtbb.so.2 create mode 100644 .venv/lib/python3.12/site-packages/prophet/stan_model/cmdstan-2.33.1/stan/lib/stan_math/lib/tbb/libtbbmalloc.so create mode 100755 .venv/lib/python3.12/site-packages/prophet/stan_model/cmdstan-2.33.1/stan/lib/stan_math/lib/tbb/libtbbmalloc.so.2 create mode 100644 .venv/lib/python3.12/site-packages/prophet/stan_model/cmdstan-2.33.1/stan/lib/stan_math/lib/tbb/libtbbmalloc_proxy.so create mode 100755 .venv/lib/python3.12/site-packages/prophet/stan_model/cmdstan-2.33.1/stan/lib/stan_math/lib/tbb/libtbbmalloc_proxy.so.2 create mode 100644 .venv/lib/python3.12/site-packages/prophet/stan_model/cmdstan-2.33.1/stan/lib/stan_math/lib/tbb/market.d create mode 100644 .venv/lib/python3.12/site-packages/prophet/stan_model/cmdstan-2.33.1/stan/lib/stan_math/lib/tbb/market.o create mode 100644 .venv/lib/python3.12/site-packages/prophet/stan_model/cmdstan-2.33.1/stan/lib/stan_math/lib/tbb/mutex.d create mode 100644 .venv/lib/python3.12/site-packages/prophet/stan_model/cmdstan-2.33.1/stan/lib/stan_math/lib/tbb/mutex.o create mode 100644 .venv/lib/python3.12/site-packages/prophet/stan_model/cmdstan-2.33.1/stan/lib/stan_math/lib/tbb/observer_proxy.d create mode 100644 .venv/lib/python3.12/site-packages/prophet/stan_model/cmdstan-2.33.1/stan/lib/stan_math/lib/tbb/observer_proxy.o create mode 100644 .venv/lib/python3.12/site-packages/prophet/stan_model/cmdstan-2.33.1/stan/lib/stan_math/lib/tbb/pipeline.d create mode 100644 .venv/lib/python3.12/site-packages/prophet/stan_model/cmdstan-2.33.1/stan/lib/stan_math/lib/tbb/pipeline.o create mode 100644 .venv/lib/python3.12/site-packages/prophet/stan_model/cmdstan-2.33.1/stan/lib/stan_math/lib/tbb/private_server.d create mode 100644 .venv/lib/python3.12/site-packages/prophet/stan_model/cmdstan-2.33.1/stan/lib/stan_math/lib/tbb/private_server.o create mode 100644 .venv/lib/python3.12/site-packages/prophet/stan_model/cmdstan-2.33.1/stan/lib/stan_math/lib/tbb/proxy.d create mode 100644 .venv/lib/python3.12/site-packages/prophet/stan_model/cmdstan-2.33.1/stan/lib/stan_math/lib/tbb/proxy.o create mode 100644 .venv/lib/python3.12/site-packages/prophet/stan_model/cmdstan-2.33.1/stan/lib/stan_math/lib/tbb/queuing_mutex.d create mode 100644 .venv/lib/python3.12/site-packages/prophet/stan_model/cmdstan-2.33.1/stan/lib/stan_math/lib/tbb/queuing_mutex.o create mode 100644 .venv/lib/python3.12/site-packages/prophet/stan_model/cmdstan-2.33.1/stan/lib/stan_math/lib/tbb/queuing_rw_mutex.d create mode 100644 .venv/lib/python3.12/site-packages/prophet/stan_model/cmdstan-2.33.1/stan/lib/stan_math/lib/tbb/queuing_rw_mutex.o create mode 100644 .venv/lib/python3.12/site-packages/prophet/stan_model/cmdstan-2.33.1/stan/lib/stan_math/lib/tbb/reader_writer_lock.d create mode 100644 .venv/lib/python3.12/site-packages/prophet/stan_model/cmdstan-2.33.1/stan/lib/stan_math/lib/tbb/reader_writer_lock.o create mode 100644 .venv/lib/python3.12/site-packages/prophet/stan_model/cmdstan-2.33.1/stan/lib/stan_math/lib/tbb/recursive_mutex.d create mode 100644 .venv/lib/python3.12/site-packages/prophet/stan_model/cmdstan-2.33.1/stan/lib/stan_math/lib/tbb/recursive_mutex.o create mode 100644 .venv/lib/python3.12/site-packages/prophet/stan_model/cmdstan-2.33.1/stan/lib/stan_math/lib/tbb/rml_tbb.d create mode 100644 .venv/lib/python3.12/site-packages/prophet/stan_model/cmdstan-2.33.1/stan/lib/stan_math/lib/tbb/rml_tbb.o create mode 100644 .venv/lib/python3.12/site-packages/prophet/stan_model/cmdstan-2.33.1/stan/lib/stan_math/lib/tbb/scheduler.d create mode 100644 .venv/lib/python3.12/site-packages/prophet/stan_model/cmdstan-2.33.1/stan/lib/stan_math/lib/tbb/scheduler.o create mode 100644 .venv/lib/python3.12/site-packages/prophet/stan_model/cmdstan-2.33.1/stan/lib/stan_math/lib/tbb/semaphore.d create mode 100644 .venv/lib/python3.12/site-packages/prophet/stan_model/cmdstan-2.33.1/stan/lib/stan_math/lib/tbb/semaphore.o create mode 100644 .venv/lib/python3.12/site-packages/prophet/stan_model/cmdstan-2.33.1/stan/lib/stan_math/lib/tbb/spin_mutex.d create mode 100644 .venv/lib/python3.12/site-packages/prophet/stan_model/cmdstan-2.33.1/stan/lib/stan_math/lib/tbb/spin_mutex.o create mode 100644 .venv/lib/python3.12/site-packages/prophet/stan_model/cmdstan-2.33.1/stan/lib/stan_math/lib/tbb/spin_rw_mutex.d create mode 100644 .venv/lib/python3.12/site-packages/prophet/stan_model/cmdstan-2.33.1/stan/lib/stan_math/lib/tbb/spin_rw_mutex.o create mode 100644 .venv/lib/python3.12/site-packages/prophet/stan_model/cmdstan-2.33.1/stan/lib/stan_math/lib/tbb/spin_rw_mutex_v2.d create mode 100644 .venv/lib/python3.12/site-packages/prophet/stan_model/cmdstan-2.33.1/stan/lib/stan_math/lib/tbb/spin_rw_mutex_v2.o create mode 100644 .venv/lib/python3.12/site-packages/prophet/stan_model/cmdstan-2.33.1/stan/lib/stan_math/lib/tbb/task.d create mode 100644 .venv/lib/python3.12/site-packages/prophet/stan_model/cmdstan-2.33.1/stan/lib/stan_math/lib/tbb/task.o create mode 100644 .venv/lib/python3.12/site-packages/prophet/stan_model/cmdstan-2.33.1/stan/lib/stan_math/lib/tbb/task_group_context.d create mode 100644 .venv/lib/python3.12/site-packages/prophet/stan_model/cmdstan-2.33.1/stan/lib/stan_math/lib/tbb/task_group_context.o create mode 100644 .venv/lib/python3.12/site-packages/prophet/stan_model/cmdstan-2.33.1/stan/lib/stan_math/lib/tbb/task_v2.d create mode 100644 .venv/lib/python3.12/site-packages/prophet/stan_model/cmdstan-2.33.1/stan/lib/stan_math/lib/tbb/task_v2.o create mode 100644 .venv/lib/python3.12/site-packages/prophet/stan_model/cmdstan-2.33.1/stan/lib/stan_math/lib/tbb/tbb-make-check create mode 100644 .venv/lib/python3.12/site-packages/prophet/stan_model/cmdstan-2.33.1/stan/lib/stan_math/lib/tbb/tbb.def create mode 100644 .venv/lib/python3.12/site-packages/prophet/stan_model/cmdstan-2.33.1/stan/lib/stan_math/lib/tbb/tbb_function_replacement.d create mode 100644 .venv/lib/python3.12/site-packages/prophet/stan_model/cmdstan-2.33.1/stan/lib/stan_math/lib/tbb/tbb_function_replacement.o create mode 100644 .venv/lib/python3.12/site-packages/prophet/stan_model/cmdstan-2.33.1/stan/lib/stan_math/lib/tbb/tbb_main.d create mode 100644 .venv/lib/python3.12/site-packages/prophet/stan_model/cmdstan-2.33.1/stan/lib/stan_math/lib/tbb/tbb_main.o create mode 100644 .venv/lib/python3.12/site-packages/prophet/stan_model/cmdstan-2.33.1/stan/lib/stan_math/lib/tbb/tbb_misc.d create mode 100644 .venv/lib/python3.12/site-packages/prophet/stan_model/cmdstan-2.33.1/stan/lib/stan_math/lib/tbb/tbb_misc.o create mode 100644 .venv/lib/python3.12/site-packages/prophet/stan_model/cmdstan-2.33.1/stan/lib/stan_math/lib/tbb/tbb_misc_ex.d create mode 100644 .venv/lib/python3.12/site-packages/prophet/stan_model/cmdstan-2.33.1/stan/lib/stan_math/lib/tbb/tbb_misc_ex.o create mode 100644 .venv/lib/python3.12/site-packages/prophet/stan_model/cmdstan-2.33.1/stan/lib/stan_math/lib/tbb/tbb_statistics.d create mode 100644 .venv/lib/python3.12/site-packages/prophet/stan_model/cmdstan-2.33.1/stan/lib/stan_math/lib/tbb/tbb_statistics.o create mode 100644 .venv/lib/python3.12/site-packages/prophet/stan_model/cmdstan-2.33.1/stan/lib/stan_math/lib/tbb/tbb_thread.d create mode 100644 .venv/lib/python3.12/site-packages/prophet/stan_model/cmdstan-2.33.1/stan/lib/stan_math/lib/tbb/tbb_thread.o create mode 100644 .venv/lib/python3.12/site-packages/prophet/stan_model/cmdstan-2.33.1/stan/lib/stan_math/lib/tbb/tbbmalloc.d create mode 100644 .venv/lib/python3.12/site-packages/prophet/stan_model/cmdstan-2.33.1/stan/lib/stan_math/lib/tbb/tbbmalloc.def create mode 100644 .venv/lib/python3.12/site-packages/prophet/stan_model/cmdstan-2.33.1/stan/lib/stan_math/lib/tbb/tbbmalloc.o create mode 100644 .venv/lib/python3.12/site-packages/prophet/stan_model/cmdstan-2.33.1/stan/lib/stan_math/lib/tbb/tbbmallocproxy.def create mode 100644 .venv/lib/python3.12/site-packages/prophet/stan_model/cmdstan-2.33.1/stan/lib/stan_math/lib/tbb/tbbvars.csh create mode 100644 .venv/lib/python3.12/site-packages/prophet/stan_model/cmdstan-2.33.1/stan/lib/stan_math/lib/tbb/tbbvars.sh create mode 100644 .venv/lib/python3.12/site-packages/prophet/stan_model/cmdstan-2.33.1/stan/lib/stan_math/lib/tbb/version_string.ver create mode 100644 .venv/lib/python3.12/site-packages/prophet/stan_model/cmdstan-2.33.1/stan/lib/stan_math/lib/tbb/version_tbb_2020.3 create mode 100644 .venv/lib/python3.12/site-packages/prophet/stan_model/cmdstan-2.33.1/stan/lib/stan_math/lib/tbb/x86_rtm_rw_mutex.d create mode 100644 .venv/lib/python3.12/site-packages/prophet/stan_model/cmdstan-2.33.1/stan/lib/stan_math/lib/tbb/x86_rtm_rw_mutex.o create mode 100644 .venv/lib/python3.12/site-packages/prophet/stan_model/cmdstan-2.33.1/stan/lib/stan_math/lib/tbb_2020.3/.gitattributes create mode 100644 .venv/lib/python3.12/site-packages/prophet/stan_model/cmdstan-2.33.1/stan/lib/stan_math/lib/tbb_2020.3/.gitignore create mode 100644 .venv/lib/python3.12/site-packages/prophet/stan_model/cmdstan-2.33.1/stan/lib/stan_math/lib/tbb_2020.3/CHANGES create mode 100644 .venv/lib/python3.12/site-packages/prophet/stan_model/cmdstan-2.33.1/stan/lib/stan_math/lib/tbb_2020.3/Doxyfile create mode 100644 .venv/lib/python3.12/site-packages/prophet/stan_model/cmdstan-2.33.1/stan/lib/stan_math/lib/tbb_2020.3/LICENSE create mode 100644 .venv/lib/python3.12/site-packages/prophet/stan_model/cmdstan-2.33.1/stan/lib/stan_math/lib/tbb_2020.3/Makefile create mode 100644 .venv/lib/python3.12/site-packages/prophet/stan_model/cmdstan-2.33.1/stan/lib/stan_math/lib/tbb_2020.3/README create mode 100644 .venv/lib/python3.12/site-packages/prophet/stan_model/cmdstan-2.33.1/stan/lib/stan_math/lib/tbb_2020.3/README.md create mode 100644 .venv/lib/python3.12/site-packages/prophet/stan_model/cmdstan-2.33.1/stan/lib/stan_math/lib/tbb_2020.3/STAN_CHANGES create mode 100644 .venv/lib/python3.12/site-packages/prophet/stan_model/cmdstan-2.33.1/stan/lib/stan_math/lib/tbb_2020.3/build/AIX.gcc.inc create mode 100644 .venv/lib/python3.12/site-packages/prophet/stan_model/cmdstan-2.33.1/stan/lib/stan_math/lib/tbb_2020.3/build/AIX.inc create mode 100644 .venv/lib/python3.12/site-packages/prophet/stan_model/cmdstan-2.33.1/stan/lib/stan_math/lib/tbb_2020.3/build/BSD.clang.inc create mode 100644 .venv/lib/python3.12/site-packages/prophet/stan_model/cmdstan-2.33.1/stan/lib/stan_math/lib/tbb_2020.3/build/BSD.inc create mode 100644 .venv/lib/python3.12/site-packages/prophet/stan_model/cmdstan-2.33.1/stan/lib/stan_math/lib/tbb_2020.3/build/FreeBSD.clang.inc create mode 100644 .venv/lib/python3.12/site-packages/prophet/stan_model/cmdstan-2.33.1/stan/lib/stan_math/lib/tbb_2020.3/build/FreeBSD.gcc.inc create mode 100644 .venv/lib/python3.12/site-packages/prophet/stan_model/cmdstan-2.33.1/stan/lib/stan_math/lib/tbb_2020.3/build/FreeBSD.inc create mode 100644 .venv/lib/python3.12/site-packages/prophet/stan_model/cmdstan-2.33.1/stan/lib/stan_math/lib/tbb_2020.3/build/Makefile.rml create mode 100644 .venv/lib/python3.12/site-packages/prophet/stan_model/cmdstan-2.33.1/stan/lib/stan_math/lib/tbb_2020.3/build/Makefile.tbb create mode 100644 .venv/lib/python3.12/site-packages/prophet/stan_model/cmdstan-2.33.1/stan/lib/stan_math/lib/tbb_2020.3/build/Makefile.tbbbind create mode 100644 .venv/lib/python3.12/site-packages/prophet/stan_model/cmdstan-2.33.1/stan/lib/stan_math/lib/tbb_2020.3/build/Makefile.tbbmalloc create mode 100644 .venv/lib/python3.12/site-packages/prophet/stan_model/cmdstan-2.33.1/stan/lib/stan_math/lib/tbb_2020.3/build/Makefile.tbbproxy create mode 100644 .venv/lib/python3.12/site-packages/prophet/stan_model/cmdstan-2.33.1/stan/lib/stan_math/lib/tbb_2020.3/build/Makefile.test create mode 100644 .venv/lib/python3.12/site-packages/prophet/stan_model/cmdstan-2.33.1/stan/lib/stan_math/lib/tbb_2020.3/build/OpenBSD.clang.inc create mode 100644 .venv/lib/python3.12/site-packages/prophet/stan_model/cmdstan-2.33.1/stan/lib/stan_math/lib/tbb_2020.3/build/OpenBSD.inc create mode 100644 .venv/lib/python3.12/site-packages/prophet/stan_model/cmdstan-2.33.1/stan/lib/stan_math/lib/tbb_2020.3/build/SunOS.gcc.inc create mode 100644 .venv/lib/python3.12/site-packages/prophet/stan_model/cmdstan-2.33.1/stan/lib/stan_math/lib/tbb_2020.3/build/SunOS.inc create mode 100644 .venv/lib/python3.12/site-packages/prophet/stan_model/cmdstan-2.33.1/stan/lib/stan_math/lib/tbb_2020.3/build/SunOS.suncc.inc create mode 100644 .venv/lib/python3.12/site-packages/prophet/stan_model/cmdstan-2.33.1/stan/lib/stan_math/lib/tbb_2020.3/build/android.clang.inc create mode 100644 .venv/lib/python3.12/site-packages/prophet/stan_model/cmdstan-2.33.1/stan/lib/stan_math/lib/tbb_2020.3/build/android.gcc.inc create mode 100644 .venv/lib/python3.12/site-packages/prophet/stan_model/cmdstan-2.33.1/stan/lib/stan_math/lib/tbb_2020.3/build/android.icc.inc create mode 100644 .venv/lib/python3.12/site-packages/prophet/stan_model/cmdstan-2.33.1/stan/lib/stan_math/lib/tbb_2020.3/build/android.inc create mode 100644 .venv/lib/python3.12/site-packages/prophet/stan_model/cmdstan-2.33.1/stan/lib/stan_math/lib/tbb_2020.3/build/android.linux.inc create mode 100644 .venv/lib/python3.12/site-packages/prophet/stan_model/cmdstan-2.33.1/stan/lib/stan_math/lib/tbb_2020.3/build/android.linux.launcher.sh create mode 100644 .venv/lib/python3.12/site-packages/prophet/stan_model/cmdstan-2.33.1/stan/lib/stan_math/lib/tbb_2020.3/build/android.macos.inc create mode 100644 .venv/lib/python3.12/site-packages/prophet/stan_model/cmdstan-2.33.1/stan/lib/stan_math/lib/tbb_2020.3/build/android.windows.inc create mode 100644 .venv/lib/python3.12/site-packages/prophet/stan_model/cmdstan-2.33.1/stan/lib/stan_math/lib/tbb_2020.3/build/big_iron.inc create mode 100644 .venv/lib/python3.12/site-packages/prophet/stan_model/cmdstan-2.33.1/stan/lib/stan_math/lib/tbb_2020.3/build/build.py create mode 100644 .venv/lib/python3.12/site-packages/prophet/stan_model/cmdstan-2.33.1/stan/lib/stan_math/lib/tbb_2020.3/build/codecov.txt create mode 100644 .venv/lib/python3.12/site-packages/prophet/stan_model/cmdstan-2.33.1/stan/lib/stan_math/lib/tbb_2020.3/build/common.inc create mode 100644 .venv/lib/python3.12/site-packages/prophet/stan_model/cmdstan-2.33.1/stan/lib/stan_math/lib/tbb_2020.3/build/common_rules.inc create mode 100644 .venv/lib/python3.12/site-packages/prophet/stan_model/cmdstan-2.33.1/stan/lib/stan_math/lib/tbb_2020.3/build/detect.js create mode 100644 .venv/lib/python3.12/site-packages/prophet/stan_model/cmdstan-2.33.1/stan/lib/stan_math/lib/tbb_2020.3/build/generate_tbbvars.bat create mode 100644 .venv/lib/python3.12/site-packages/prophet/stan_model/cmdstan-2.33.1/stan/lib/stan_math/lib/tbb_2020.3/build/generate_tbbvars.sh create mode 100644 .venv/lib/python3.12/site-packages/prophet/stan_model/cmdstan-2.33.1/stan/lib/stan_math/lib/tbb_2020.3/build/index.html create mode 100644 .venv/lib/python3.12/site-packages/prophet/stan_model/cmdstan-2.33.1/stan/lib/stan_math/lib/tbb_2020.3/build/ios.clang.inc create mode 100644 .venv/lib/python3.12/site-packages/prophet/stan_model/cmdstan-2.33.1/stan/lib/stan_math/lib/tbb_2020.3/build/ios.macos.inc create mode 100644 .venv/lib/python3.12/site-packages/prophet/stan_model/cmdstan-2.33.1/stan/lib/stan_math/lib/tbb_2020.3/build/linux.clang.inc create mode 100644 .venv/lib/python3.12/site-packages/prophet/stan_model/cmdstan-2.33.1/stan/lib/stan_math/lib/tbb_2020.3/build/linux.gcc.inc create mode 100644 .venv/lib/python3.12/site-packages/prophet/stan_model/cmdstan-2.33.1/stan/lib/stan_math/lib/tbb_2020.3/build/linux.icc.inc create mode 100644 .venv/lib/python3.12/site-packages/prophet/stan_model/cmdstan-2.33.1/stan/lib/stan_math/lib/tbb_2020.3/build/linux.inc create mode 100644 .venv/lib/python3.12/site-packages/prophet/stan_model/cmdstan-2.33.1/stan/lib/stan_math/lib/tbb_2020.3/build/linux.pathcc.inc create mode 100644 .venv/lib/python3.12/site-packages/prophet/stan_model/cmdstan-2.33.1/stan/lib/stan_math/lib/tbb_2020.3/build/linux.xl.inc create mode 100644 .venv/lib/python3.12/site-packages/prophet/stan_model/cmdstan-2.33.1/stan/lib/stan_math/lib/tbb_2020.3/build/macos.clang.inc create mode 100644 .venv/lib/python3.12/site-packages/prophet/stan_model/cmdstan-2.33.1/stan/lib/stan_math/lib/tbb_2020.3/build/macos.gcc.inc create mode 100644 .venv/lib/python3.12/site-packages/prophet/stan_model/cmdstan-2.33.1/stan/lib/stan_math/lib/tbb_2020.3/build/macos.icc.inc create mode 100644 .venv/lib/python3.12/site-packages/prophet/stan_model/cmdstan-2.33.1/stan/lib/stan_math/lib/tbb_2020.3/build/macos.inc create mode 100644 .venv/lib/python3.12/site-packages/prophet/stan_model/cmdstan-2.33.1/stan/lib/stan_math/lib/tbb_2020.3/build/mic.icc.inc create mode 100644 .venv/lib/python3.12/site-packages/prophet/stan_model/cmdstan-2.33.1/stan/lib/stan_math/lib/tbb_2020.3/build/mic.linux.inc create mode 100644 .venv/lib/python3.12/site-packages/prophet/stan_model/cmdstan-2.33.1/stan/lib/stan_math/lib/tbb_2020.3/build/mic.linux.launcher.sh create mode 100644 .venv/lib/python3.12/site-packages/prophet/stan_model/cmdstan-2.33.1/stan/lib/stan_math/lib/tbb_2020.3/build/mic.offload.inc create mode 100644 .venv/lib/python3.12/site-packages/prophet/stan_model/cmdstan-2.33.1/stan/lib/stan_math/lib/tbb_2020.3/build/suncc.map.pause create mode 100644 .venv/lib/python3.12/site-packages/prophet/stan_model/cmdstan-2.33.1/stan/lib/stan_math/lib/tbb_2020.3/build/test_launcher.bat create mode 100644 .venv/lib/python3.12/site-packages/prophet/stan_model/cmdstan-2.33.1/stan/lib/stan_math/lib/tbb_2020.3/build/test_launcher.sh create mode 100644 .venv/lib/python3.12/site-packages/prophet/stan_model/cmdstan-2.33.1/stan/lib/stan_math/lib/tbb_2020.3/build/version_info_aix.sh create mode 100644 .venv/lib/python3.12/site-packages/prophet/stan_model/cmdstan-2.33.1/stan/lib/stan_math/lib/tbb_2020.3/build/version_info_android.sh create mode 100644 .venv/lib/python3.12/site-packages/prophet/stan_model/cmdstan-2.33.1/stan/lib/stan_math/lib/tbb_2020.3/build/version_info_linux.sh create mode 100644 .venv/lib/python3.12/site-packages/prophet/stan_model/cmdstan-2.33.1/stan/lib/stan_math/lib/tbb_2020.3/build/version_info_macos.sh create mode 100644 .venv/lib/python3.12/site-packages/prophet/stan_model/cmdstan-2.33.1/stan/lib/stan_math/lib/tbb_2020.3/build/version_info_sunos.sh create mode 100644 .venv/lib/python3.12/site-packages/prophet/stan_model/cmdstan-2.33.1/stan/lib/stan_math/lib/tbb_2020.3/build/version_info_windows.js create mode 100644 .venv/lib/python3.12/site-packages/prophet/stan_model/cmdstan-2.33.1/stan/lib/stan_math/lib/tbb_2020.3/build/vs2013/index.html create mode 100644 .venv/lib/python3.12/site-packages/prophet/stan_model/cmdstan-2.33.1/stan/lib/stan_math/lib/tbb_2020.3/build/vs2013/makefile.sln create mode 100644 .venv/lib/python3.12/site-packages/prophet/stan_model/cmdstan-2.33.1/stan/lib/stan_math/lib/tbb_2020.3/build/vs2013/tbb.vcxproj create mode 100644 .venv/lib/python3.12/site-packages/prophet/stan_model/cmdstan-2.33.1/stan/lib/stan_math/lib/tbb_2020.3/build/vs2013/tbbmalloc.vcxproj create mode 100644 .venv/lib/python3.12/site-packages/prophet/stan_model/cmdstan-2.33.1/stan/lib/stan_math/lib/tbb_2020.3/build/vs2013/tbbmalloc_proxy.vcxproj create mode 100644 .venv/lib/python3.12/site-packages/prophet/stan_model/cmdstan-2.33.1/stan/lib/stan_math/lib/tbb_2020.3/build/vs2013/version_string.ver create mode 100644 .venv/lib/python3.12/site-packages/prophet/stan_model/cmdstan-2.33.1/stan/lib/stan_math/lib/tbb_2020.3/build/windows.cl.inc create mode 100644 .venv/lib/python3.12/site-packages/prophet/stan_model/cmdstan-2.33.1/stan/lib/stan_math/lib/tbb_2020.3/build/windows.gcc.inc create mode 100644 .venv/lib/python3.12/site-packages/prophet/stan_model/cmdstan-2.33.1/stan/lib/stan_math/lib/tbb_2020.3/build/windows.icl.inc create mode 100644 .venv/lib/python3.12/site-packages/prophet/stan_model/cmdstan-2.33.1/stan/lib/stan_math/lib/tbb_2020.3/build/windows.inc create mode 100644 .venv/lib/python3.12/site-packages/prophet/stan_model/cmdstan-2.33.1/stan/lib/stan_math/lib/tbb_2020.3/cmake/README.rst create mode 100644 .venv/lib/python3.12/site-packages/prophet/stan_model/cmdstan-2.33.1/stan/lib/stan_math/lib/tbb_2020.3/cmake/TBBBuild.cmake create mode 100644 .venv/lib/python3.12/site-packages/prophet/stan_model/cmdstan-2.33.1/stan/lib/stan_math/lib/tbb_2020.3/cmake/TBBGet.cmake create mode 100644 .venv/lib/python3.12/site-packages/prophet/stan_model/cmdstan-2.33.1/stan/lib/stan_math/lib/tbb_2020.3/cmake/TBBInstallConfig.cmake create mode 100644 .venv/lib/python3.12/site-packages/prophet/stan_model/cmdstan-2.33.1/stan/lib/stan_math/lib/tbb_2020.3/cmake/TBBMakeConfig.cmake create mode 100644 .venv/lib/python3.12/site-packages/prophet/stan_model/cmdstan-2.33.1/stan/lib/stan_math/lib/tbb_2020.3/cmake/tbb_config_generator.cmake create mode 100644 .venv/lib/python3.12/site-packages/prophet/stan_model/cmdstan-2.33.1/stan/lib/stan_math/lib/tbb_2020.3/cmake/tbb_config_installer.cmake create mode 100644 .venv/lib/python3.12/site-packages/prophet/stan_model/cmdstan-2.33.1/stan/lib/stan_math/lib/tbb_2020.3/cmake/templates/TBBConfig.cmake.in create mode 100644 .venv/lib/python3.12/site-packages/prophet/stan_model/cmdstan-2.33.1/stan/lib/stan_math/lib/tbb_2020.3/cmake/templates/TBBConfigInternal.cmake.in create mode 100644 .venv/lib/python3.12/site-packages/prophet/stan_model/cmdstan-2.33.1/stan/lib/stan_math/lib/tbb_2020.3/cmake/templates/TBBConfigVersion.cmake.in create mode 100644 .venv/lib/python3.12/site-packages/prophet/stan_model/cmdstan-2.33.1/stan/lib/stan_math/lib/tbb_2020.3/doc/Release_Notes.txt create mode 100644 .venv/lib/python3.12/site-packages/prophet/stan_model/cmdstan-2.33.1/stan/lib/stan_math/lib/tbb_2020.3/doc/copyright_brand_disclaimer_doxygen.txt create mode 100644 .venv/lib/python3.12/site-packages/prophet/stan_model/cmdstan-2.33.1/stan/lib/stan_math/lib/tbb_2020.3/include/index.html create mode 100644 .venv/lib/python3.12/site-packages/prophet/stan_model/cmdstan-2.33.1/stan/lib/stan_math/lib/tbb_2020.3/include/serial/tbb/parallel_for.h create mode 100644 .venv/lib/python3.12/site-packages/prophet/stan_model/cmdstan-2.33.1/stan/lib/stan_math/lib/tbb_2020.3/include/serial/tbb/tbb_annotate.h create mode 100644 .venv/lib/python3.12/site-packages/prophet/stan_model/cmdstan-2.33.1/stan/lib/stan_math/lib/tbb_2020.3/include/tbb/aggregator.h create mode 100644 .venv/lib/python3.12/site-packages/prophet/stan_model/cmdstan-2.33.1/stan/lib/stan_math/lib/tbb_2020.3/include/tbb/aligned_space.h create mode 100644 .venv/lib/python3.12/site-packages/prophet/stan_model/cmdstan-2.33.1/stan/lib/stan_math/lib/tbb_2020.3/include/tbb/atomic.h create mode 100644 .venv/lib/python3.12/site-packages/prophet/stan_model/cmdstan-2.33.1/stan/lib/stan_math/lib/tbb_2020.3/include/tbb/blocked_range.h create mode 100644 .venv/lib/python3.12/site-packages/prophet/stan_model/cmdstan-2.33.1/stan/lib/stan_math/lib/tbb_2020.3/include/tbb/blocked_range2d.h create mode 100644 .venv/lib/python3.12/site-packages/prophet/stan_model/cmdstan-2.33.1/stan/lib/stan_math/lib/tbb_2020.3/include/tbb/blocked_range3d.h create mode 100644 .venv/lib/python3.12/site-packages/prophet/stan_model/cmdstan-2.33.1/stan/lib/stan_math/lib/tbb_2020.3/include/tbb/blocked_rangeNd.h create mode 100644 .venv/lib/python3.12/site-packages/prophet/stan_model/cmdstan-2.33.1/stan/lib/stan_math/lib/tbb_2020.3/include/tbb/cache_aligned_allocator.h create mode 100644 .venv/lib/python3.12/site-packages/prophet/stan_model/cmdstan-2.33.1/stan/lib/stan_math/lib/tbb_2020.3/include/tbb/combinable.h create mode 100644 .venv/lib/python3.12/site-packages/prophet/stan_model/cmdstan-2.33.1/stan/lib/stan_math/lib/tbb_2020.3/include/tbb/compat/condition_variable create mode 100644 .venv/lib/python3.12/site-packages/prophet/stan_model/cmdstan-2.33.1/stan/lib/stan_math/lib/tbb_2020.3/include/tbb/compat/ppl.h create mode 100644 .venv/lib/python3.12/site-packages/prophet/stan_model/cmdstan-2.33.1/stan/lib/stan_math/lib/tbb_2020.3/include/tbb/compat/thread create mode 100644 .venv/lib/python3.12/site-packages/prophet/stan_model/cmdstan-2.33.1/stan/lib/stan_math/lib/tbb_2020.3/include/tbb/compat/tuple create mode 100644 .venv/lib/python3.12/site-packages/prophet/stan_model/cmdstan-2.33.1/stan/lib/stan_math/lib/tbb_2020.3/include/tbb/concurrent_hash_map.h create mode 100644 .venv/lib/python3.12/site-packages/prophet/stan_model/cmdstan-2.33.1/stan/lib/stan_math/lib/tbb_2020.3/include/tbb/concurrent_lru_cache.h create mode 100644 .venv/lib/python3.12/site-packages/prophet/stan_model/cmdstan-2.33.1/stan/lib/stan_math/lib/tbb_2020.3/include/tbb/concurrent_map.h create mode 100644 .venv/lib/python3.12/site-packages/prophet/stan_model/cmdstan-2.33.1/stan/lib/stan_math/lib/tbb_2020.3/include/tbb/concurrent_priority_queue.h create mode 100644 .venv/lib/python3.12/site-packages/prophet/stan_model/cmdstan-2.33.1/stan/lib/stan_math/lib/tbb_2020.3/include/tbb/concurrent_queue.h create mode 100644 .venv/lib/python3.12/site-packages/prophet/stan_model/cmdstan-2.33.1/stan/lib/stan_math/lib/tbb_2020.3/include/tbb/concurrent_set.h create mode 100644 .venv/lib/python3.12/site-packages/prophet/stan_model/cmdstan-2.33.1/stan/lib/stan_math/lib/tbb_2020.3/include/tbb/concurrent_unordered_map.h create mode 100644 .venv/lib/python3.12/site-packages/prophet/stan_model/cmdstan-2.33.1/stan/lib/stan_math/lib/tbb_2020.3/include/tbb/concurrent_unordered_set.h create mode 100644 .venv/lib/python3.12/site-packages/prophet/stan_model/cmdstan-2.33.1/stan/lib/stan_math/lib/tbb_2020.3/include/tbb/concurrent_vector.h create mode 100644 .venv/lib/python3.12/site-packages/prophet/stan_model/cmdstan-2.33.1/stan/lib/stan_math/lib/tbb_2020.3/include/tbb/critical_section.h create mode 100644 .venv/lib/python3.12/site-packages/prophet/stan_model/cmdstan-2.33.1/stan/lib/stan_math/lib/tbb_2020.3/include/tbb/enumerable_thread_specific.h create mode 100644 .venv/lib/python3.12/site-packages/prophet/stan_model/cmdstan-2.33.1/stan/lib/stan_math/lib/tbb_2020.3/include/tbb/flow_graph.h create mode 100644 .venv/lib/python3.12/site-packages/prophet/stan_model/cmdstan-2.33.1/stan/lib/stan_math/lib/tbb_2020.3/include/tbb/flow_graph_abstractions.h create mode 100644 .venv/lib/python3.12/site-packages/prophet/stan_model/cmdstan-2.33.1/stan/lib/stan_math/lib/tbb_2020.3/include/tbb/flow_graph_opencl_node.h create mode 100644 .venv/lib/python3.12/site-packages/prophet/stan_model/cmdstan-2.33.1/stan/lib/stan_math/lib/tbb_2020.3/include/tbb/global_control.h create mode 100644 .venv/lib/python3.12/site-packages/prophet/stan_model/cmdstan-2.33.1/stan/lib/stan_math/lib/tbb_2020.3/include/tbb/index.html create mode 100644 .venv/lib/python3.12/site-packages/prophet/stan_model/cmdstan-2.33.1/stan/lib/stan_math/lib/tbb_2020.3/include/tbb/info.h create mode 100644 .venv/lib/python3.12/site-packages/prophet/stan_model/cmdstan-2.33.1/stan/lib/stan_math/lib/tbb_2020.3/include/tbb/internal/_aggregator_impl.h create mode 100644 .venv/lib/python3.12/site-packages/prophet/stan_model/cmdstan-2.33.1/stan/lib/stan_math/lib/tbb_2020.3/include/tbb/internal/_allocator_traits.h create mode 100644 .venv/lib/python3.12/site-packages/prophet/stan_model/cmdstan-2.33.1/stan/lib/stan_math/lib/tbb_2020.3/include/tbb/internal/_concurrent_queue_impl.h create mode 100644 .venv/lib/python3.12/site-packages/prophet/stan_model/cmdstan-2.33.1/stan/lib/stan_math/lib/tbb_2020.3/include/tbb/internal/_concurrent_skip_list_impl.h create mode 100644 .venv/lib/python3.12/site-packages/prophet/stan_model/cmdstan-2.33.1/stan/lib/stan_math/lib/tbb_2020.3/include/tbb/internal/_concurrent_unordered_impl.h create mode 100644 .venv/lib/python3.12/site-packages/prophet/stan_model/cmdstan-2.33.1/stan/lib/stan_math/lib/tbb_2020.3/include/tbb/internal/_deprecated_header_message_guard.h create mode 100644 .venv/lib/python3.12/site-packages/prophet/stan_model/cmdstan-2.33.1/stan/lib/stan_math/lib/tbb_2020.3/include/tbb/internal/_flow_graph_async_msg_impl.h create mode 100644 .venv/lib/python3.12/site-packages/prophet/stan_model/cmdstan-2.33.1/stan/lib/stan_math/lib/tbb_2020.3/include/tbb/internal/_flow_graph_body_impl.h create mode 100644 .venv/lib/python3.12/site-packages/prophet/stan_model/cmdstan-2.33.1/stan/lib/stan_math/lib/tbb_2020.3/include/tbb/internal/_flow_graph_cache_impl.h create mode 100644 .venv/lib/python3.12/site-packages/prophet/stan_model/cmdstan-2.33.1/stan/lib/stan_math/lib/tbb_2020.3/include/tbb/internal/_flow_graph_impl.h create mode 100644 .venv/lib/python3.12/site-packages/prophet/stan_model/cmdstan-2.33.1/stan/lib/stan_math/lib/tbb_2020.3/include/tbb/internal/_flow_graph_indexer_impl.h create mode 100644 .venv/lib/python3.12/site-packages/prophet/stan_model/cmdstan-2.33.1/stan/lib/stan_math/lib/tbb_2020.3/include/tbb/internal/_flow_graph_item_buffer_impl.h create mode 100644 .venv/lib/python3.12/site-packages/prophet/stan_model/cmdstan-2.33.1/stan/lib/stan_math/lib/tbb_2020.3/include/tbb/internal/_flow_graph_join_impl.h create mode 100644 .venv/lib/python3.12/site-packages/prophet/stan_model/cmdstan-2.33.1/stan/lib/stan_math/lib/tbb_2020.3/include/tbb/internal/_flow_graph_node_impl.h create mode 100644 .venv/lib/python3.12/site-packages/prophet/stan_model/cmdstan-2.33.1/stan/lib/stan_math/lib/tbb_2020.3/include/tbb/internal/_flow_graph_node_set_impl.h create mode 100644 .venv/lib/python3.12/site-packages/prophet/stan_model/cmdstan-2.33.1/stan/lib/stan_math/lib/tbb_2020.3/include/tbb/internal/_flow_graph_nodes_deduction.h create mode 100644 .venv/lib/python3.12/site-packages/prophet/stan_model/cmdstan-2.33.1/stan/lib/stan_math/lib/tbb_2020.3/include/tbb/internal/_flow_graph_streaming_node.h create mode 100644 .venv/lib/python3.12/site-packages/prophet/stan_model/cmdstan-2.33.1/stan/lib/stan_math/lib/tbb_2020.3/include/tbb/internal/_flow_graph_tagged_buffer_impl.h create mode 100644 .venv/lib/python3.12/site-packages/prophet/stan_model/cmdstan-2.33.1/stan/lib/stan_math/lib/tbb_2020.3/include/tbb/internal/_flow_graph_trace_impl.h create mode 100644 .venv/lib/python3.12/site-packages/prophet/stan_model/cmdstan-2.33.1/stan/lib/stan_math/lib/tbb_2020.3/include/tbb/internal/_flow_graph_types_impl.h create mode 100644 .venv/lib/python3.12/site-packages/prophet/stan_model/cmdstan-2.33.1/stan/lib/stan_math/lib/tbb_2020.3/include/tbb/internal/_mutex_padding.h create mode 100644 .venv/lib/python3.12/site-packages/prophet/stan_model/cmdstan-2.33.1/stan/lib/stan_math/lib/tbb_2020.3/include/tbb/internal/_node_handle_impl.h create mode 100644 .venv/lib/python3.12/site-packages/prophet/stan_model/cmdstan-2.33.1/stan/lib/stan_math/lib/tbb_2020.3/include/tbb/internal/_range_iterator.h create mode 100644 .venv/lib/python3.12/site-packages/prophet/stan_model/cmdstan-2.33.1/stan/lib/stan_math/lib/tbb_2020.3/include/tbb/internal/_tbb_hash_compare_impl.h create mode 100644 .venv/lib/python3.12/site-packages/prophet/stan_model/cmdstan-2.33.1/stan/lib/stan_math/lib/tbb_2020.3/include/tbb/internal/_tbb_strings.h create mode 100644 .venv/lib/python3.12/site-packages/prophet/stan_model/cmdstan-2.33.1/stan/lib/stan_math/lib/tbb_2020.3/include/tbb/internal/_tbb_trace_impl.h create mode 100644 .venv/lib/python3.12/site-packages/prophet/stan_model/cmdstan-2.33.1/stan/lib/stan_math/lib/tbb_2020.3/include/tbb/internal/_tbb_windef.h create mode 100644 .venv/lib/python3.12/site-packages/prophet/stan_model/cmdstan-2.33.1/stan/lib/stan_math/lib/tbb_2020.3/include/tbb/internal/_template_helpers.h create mode 100644 .venv/lib/python3.12/site-packages/prophet/stan_model/cmdstan-2.33.1/stan/lib/stan_math/lib/tbb_2020.3/include/tbb/internal/_warning_suppress_disable_notice.h create mode 100644 .venv/lib/python3.12/site-packages/prophet/stan_model/cmdstan-2.33.1/stan/lib/stan_math/lib/tbb_2020.3/include/tbb/internal/_warning_suppress_enable_notice.h create mode 100644 .venv/lib/python3.12/site-packages/prophet/stan_model/cmdstan-2.33.1/stan/lib/stan_math/lib/tbb_2020.3/include/tbb/internal/_x86_eliding_mutex_impl.h create mode 100644 .venv/lib/python3.12/site-packages/prophet/stan_model/cmdstan-2.33.1/stan/lib/stan_math/lib/tbb_2020.3/include/tbb/internal/_x86_rtm_rw_mutex_impl.h create mode 100644 .venv/lib/python3.12/site-packages/prophet/stan_model/cmdstan-2.33.1/stan/lib/stan_math/lib/tbb_2020.3/include/tbb/iterators.h create mode 100644 .venv/lib/python3.12/site-packages/prophet/stan_model/cmdstan-2.33.1/stan/lib/stan_math/lib/tbb_2020.3/include/tbb/machine/gcc_arm.h create mode 100644 .venv/lib/python3.12/site-packages/prophet/stan_model/cmdstan-2.33.1/stan/lib/stan_math/lib/tbb_2020.3/include/tbb/machine/gcc_generic.h create mode 100644 .venv/lib/python3.12/site-packages/prophet/stan_model/cmdstan-2.33.1/stan/lib/stan_math/lib/tbb_2020.3/include/tbb/machine/gcc_ia32_common.h create mode 100644 .venv/lib/python3.12/site-packages/prophet/stan_model/cmdstan-2.33.1/stan/lib/stan_math/lib/tbb_2020.3/include/tbb/machine/gcc_itsx.h create mode 100644 .venv/lib/python3.12/site-packages/prophet/stan_model/cmdstan-2.33.1/stan/lib/stan_math/lib/tbb_2020.3/include/tbb/machine/ibm_aix51.h create mode 100644 .venv/lib/python3.12/site-packages/prophet/stan_model/cmdstan-2.33.1/stan/lib/stan_math/lib/tbb_2020.3/include/tbb/machine/icc_generic.h create mode 100644 .venv/lib/python3.12/site-packages/prophet/stan_model/cmdstan-2.33.1/stan/lib/stan_math/lib/tbb_2020.3/include/tbb/machine/linux_common.h create mode 100644 .venv/lib/python3.12/site-packages/prophet/stan_model/cmdstan-2.33.1/stan/lib/stan_math/lib/tbb_2020.3/include/tbb/machine/linux_ia32.h create mode 100644 .venv/lib/python3.12/site-packages/prophet/stan_model/cmdstan-2.33.1/stan/lib/stan_math/lib/tbb_2020.3/include/tbb/machine/linux_ia64.h create mode 100644 .venv/lib/python3.12/site-packages/prophet/stan_model/cmdstan-2.33.1/stan/lib/stan_math/lib/tbb_2020.3/include/tbb/machine/linux_intel64.h create mode 100644 .venv/lib/python3.12/site-packages/prophet/stan_model/cmdstan-2.33.1/stan/lib/stan_math/lib/tbb_2020.3/include/tbb/machine/mac_ppc.h create mode 100644 .venv/lib/python3.12/site-packages/prophet/stan_model/cmdstan-2.33.1/stan/lib/stan_math/lib/tbb_2020.3/include/tbb/machine/macos_common.h create mode 100644 .venv/lib/python3.12/site-packages/prophet/stan_model/cmdstan-2.33.1/stan/lib/stan_math/lib/tbb_2020.3/include/tbb/machine/mic_common.h create mode 100644 .venv/lib/python3.12/site-packages/prophet/stan_model/cmdstan-2.33.1/stan/lib/stan_math/lib/tbb_2020.3/include/tbb/machine/msvc_armv7.h create mode 100644 .venv/lib/python3.12/site-packages/prophet/stan_model/cmdstan-2.33.1/stan/lib/stan_math/lib/tbb_2020.3/include/tbb/machine/msvc_ia32_common.h create mode 100644 .venv/lib/python3.12/site-packages/prophet/stan_model/cmdstan-2.33.1/stan/lib/stan_math/lib/tbb_2020.3/include/tbb/machine/sunos_sparc.h create mode 100644 .venv/lib/python3.12/site-packages/prophet/stan_model/cmdstan-2.33.1/stan/lib/stan_math/lib/tbb_2020.3/include/tbb/machine/windows_api.h create mode 100644 .venv/lib/python3.12/site-packages/prophet/stan_model/cmdstan-2.33.1/stan/lib/stan_math/lib/tbb_2020.3/include/tbb/machine/windows_ia32.h create mode 100644 .venv/lib/python3.12/site-packages/prophet/stan_model/cmdstan-2.33.1/stan/lib/stan_math/lib/tbb_2020.3/include/tbb/machine/windows_intel64.h create mode 100644 .venv/lib/python3.12/site-packages/prophet/stan_model/cmdstan-2.33.1/stan/lib/stan_math/lib/tbb_2020.3/include/tbb/memory_pool.h create mode 100644 .venv/lib/python3.12/site-packages/prophet/stan_model/cmdstan-2.33.1/stan/lib/stan_math/lib/tbb_2020.3/include/tbb/mutex.h create mode 100644 .venv/lib/python3.12/site-packages/prophet/stan_model/cmdstan-2.33.1/stan/lib/stan_math/lib/tbb_2020.3/include/tbb/null_mutex.h create mode 100644 .venv/lib/python3.12/site-packages/prophet/stan_model/cmdstan-2.33.1/stan/lib/stan_math/lib/tbb_2020.3/include/tbb/null_rw_mutex.h create mode 100644 .venv/lib/python3.12/site-packages/prophet/stan_model/cmdstan-2.33.1/stan/lib/stan_math/lib/tbb_2020.3/include/tbb/parallel_do.h create mode 100644 .venv/lib/python3.12/site-packages/prophet/stan_model/cmdstan-2.33.1/stan/lib/stan_math/lib/tbb_2020.3/include/tbb/parallel_for.h create mode 100644 .venv/lib/python3.12/site-packages/prophet/stan_model/cmdstan-2.33.1/stan/lib/stan_math/lib/tbb_2020.3/include/tbb/parallel_for_each.h create mode 100644 .venv/lib/python3.12/site-packages/prophet/stan_model/cmdstan-2.33.1/stan/lib/stan_math/lib/tbb_2020.3/include/tbb/parallel_invoke.h create mode 100644 .venv/lib/python3.12/site-packages/prophet/stan_model/cmdstan-2.33.1/stan/lib/stan_math/lib/tbb_2020.3/include/tbb/parallel_reduce.h create mode 100644 .venv/lib/python3.12/site-packages/prophet/stan_model/cmdstan-2.33.1/stan/lib/stan_math/lib/tbb_2020.3/include/tbb/parallel_scan.h create mode 100644 .venv/lib/python3.12/site-packages/prophet/stan_model/cmdstan-2.33.1/stan/lib/stan_math/lib/tbb_2020.3/include/tbb/parallel_sort.h create mode 100644 .venv/lib/python3.12/site-packages/prophet/stan_model/cmdstan-2.33.1/stan/lib/stan_math/lib/tbb_2020.3/include/tbb/parallel_while.h create mode 100644 .venv/lib/python3.12/site-packages/prophet/stan_model/cmdstan-2.33.1/stan/lib/stan_math/lib/tbb_2020.3/include/tbb/partitioner.h create mode 100644 .venv/lib/python3.12/site-packages/prophet/stan_model/cmdstan-2.33.1/stan/lib/stan_math/lib/tbb_2020.3/include/tbb/pipeline.h create mode 100644 .venv/lib/python3.12/site-packages/prophet/stan_model/cmdstan-2.33.1/stan/lib/stan_math/lib/tbb_2020.3/include/tbb/queuing_mutex.h create mode 100644 .venv/lib/python3.12/site-packages/prophet/stan_model/cmdstan-2.33.1/stan/lib/stan_math/lib/tbb_2020.3/include/tbb/queuing_rw_mutex.h create mode 100644 .venv/lib/python3.12/site-packages/prophet/stan_model/cmdstan-2.33.1/stan/lib/stan_math/lib/tbb_2020.3/include/tbb/reader_writer_lock.h create mode 100644 .venv/lib/python3.12/site-packages/prophet/stan_model/cmdstan-2.33.1/stan/lib/stan_math/lib/tbb_2020.3/include/tbb/recursive_mutex.h create mode 100644 .venv/lib/python3.12/site-packages/prophet/stan_model/cmdstan-2.33.1/stan/lib/stan_math/lib/tbb_2020.3/include/tbb/runtime_loader.h create mode 100644 .venv/lib/python3.12/site-packages/prophet/stan_model/cmdstan-2.33.1/stan/lib/stan_math/lib/tbb_2020.3/include/tbb/scalable_allocator.h create mode 100644 .venv/lib/python3.12/site-packages/prophet/stan_model/cmdstan-2.33.1/stan/lib/stan_math/lib/tbb_2020.3/include/tbb/spin_mutex.h create mode 100644 .venv/lib/python3.12/site-packages/prophet/stan_model/cmdstan-2.33.1/stan/lib/stan_math/lib/tbb_2020.3/include/tbb/spin_rw_mutex.h create mode 100644 .venv/lib/python3.12/site-packages/prophet/stan_model/cmdstan-2.33.1/stan/lib/stan_math/lib/tbb_2020.3/include/tbb/task.h create mode 100644 .venv/lib/python3.12/site-packages/prophet/stan_model/cmdstan-2.33.1/stan/lib/stan_math/lib/tbb_2020.3/include/tbb/task_arena.h create mode 100644 .venv/lib/python3.12/site-packages/prophet/stan_model/cmdstan-2.33.1/stan/lib/stan_math/lib/tbb_2020.3/include/tbb/task_group.h create mode 100644 .venv/lib/python3.12/site-packages/prophet/stan_model/cmdstan-2.33.1/stan/lib/stan_math/lib/tbb_2020.3/include/tbb/task_scheduler_init.h create mode 100644 .venv/lib/python3.12/site-packages/prophet/stan_model/cmdstan-2.33.1/stan/lib/stan_math/lib/tbb_2020.3/include/tbb/task_scheduler_observer.h create mode 100644 .venv/lib/python3.12/site-packages/prophet/stan_model/cmdstan-2.33.1/stan/lib/stan_math/lib/tbb_2020.3/include/tbb/tbb.h create mode 100644 .venv/lib/python3.12/site-packages/prophet/stan_model/cmdstan-2.33.1/stan/lib/stan_math/lib/tbb_2020.3/include/tbb/tbb_allocator.h create mode 100644 .venv/lib/python3.12/site-packages/prophet/stan_model/cmdstan-2.33.1/stan/lib/stan_math/lib/tbb_2020.3/include/tbb/tbb_config.h create mode 100644 .venv/lib/python3.12/site-packages/prophet/stan_model/cmdstan-2.33.1/stan/lib/stan_math/lib/tbb_2020.3/include/tbb/tbb_disable_exceptions.h create mode 100644 .venv/lib/python3.12/site-packages/prophet/stan_model/cmdstan-2.33.1/stan/lib/stan_math/lib/tbb_2020.3/include/tbb/tbb_exception.h create mode 100644 .venv/lib/python3.12/site-packages/prophet/stan_model/cmdstan-2.33.1/stan/lib/stan_math/lib/tbb_2020.3/include/tbb/tbb_machine.h create mode 100644 .venv/lib/python3.12/site-packages/prophet/stan_model/cmdstan-2.33.1/stan/lib/stan_math/lib/tbb_2020.3/include/tbb/tbb_profiling.h create mode 100644 .venv/lib/python3.12/site-packages/prophet/stan_model/cmdstan-2.33.1/stan/lib/stan_math/lib/tbb_2020.3/include/tbb/tbb_stddef.h create mode 100644 .venv/lib/python3.12/site-packages/prophet/stan_model/cmdstan-2.33.1/stan/lib/stan_math/lib/tbb_2020.3/include/tbb/tbb_thread.h create mode 100644 .venv/lib/python3.12/site-packages/prophet/stan_model/cmdstan-2.33.1/stan/lib/stan_math/lib/tbb_2020.3/include/tbb/tbbmalloc_proxy.h create mode 100644 .venv/lib/python3.12/site-packages/prophet/stan_model/cmdstan-2.33.1/stan/lib/stan_math/lib/tbb_2020.3/include/tbb/tick_count.h create mode 100644 .venv/lib/python3.12/site-packages/prophet/stan_model/cmdstan-2.33.1/stan/lib/stan_math/lib/tbb_2020.3/index.html create mode 100644 .venv/lib/python3.12/site-packages/prophet/stan_model/cmdstan-2.33.1/stan/lib/stan_math/lib/tbb_2020.3/jni/Android.mk create mode 100644 .venv/lib/python3.12/site-packages/prophet/stan_model/cmdstan-2.33.1/stan/lib/stan_math/lib/tbb_2020.3/jni/Application.mk create mode 100644 .venv/lib/python3.12/site-packages/prophet/stan_model/cmdstan-2.33.1/stan/lib/stan_math/lib/tbb_2020.3/python/Makefile create mode 100644 .venv/lib/python3.12/site-packages/prophet/stan_model/cmdstan-2.33.1/stan/lib/stan_math/lib/tbb_2020.3/python/TBB.py create mode 100644 .venv/lib/python3.12/site-packages/prophet/stan_model/cmdstan-2.33.1/stan/lib/stan_math/lib/tbb_2020.3/python/index.html create mode 100644 .venv/lib/python3.12/site-packages/prophet/stan_model/cmdstan-2.33.1/stan/lib/stan_math/lib/tbb_2020.3/python/rml/Makefile create mode 100644 .venv/lib/python3.12/site-packages/prophet/stan_model/cmdstan-2.33.1/stan/lib/stan_math/lib/tbb_2020.3/python/rml/ipc_server.cpp create mode 100644 .venv/lib/python3.12/site-packages/prophet/stan_model/cmdstan-2.33.1/stan/lib/stan_math/lib/tbb_2020.3/python/rml/ipc_utils.cpp create mode 100644 .venv/lib/python3.12/site-packages/prophet/stan_model/cmdstan-2.33.1/stan/lib/stan_math/lib/tbb_2020.3/python/rml/ipc_utils.h create mode 100644 .venv/lib/python3.12/site-packages/prophet/stan_model/cmdstan-2.33.1/stan/lib/stan_math/lib/tbb_2020.3/python/setup.py create mode 100644 .venv/lib/python3.12/site-packages/prophet/stan_model/cmdstan-2.33.1/stan/lib/stan_math/lib/tbb_2020.3/python/tbb/__init__.py create mode 100644 .venv/lib/python3.12/site-packages/prophet/stan_model/cmdstan-2.33.1/stan/lib/stan_math/lib/tbb_2020.3/python/tbb/__main__.py create mode 100644 .venv/lib/python3.12/site-packages/prophet/stan_model/cmdstan-2.33.1/stan/lib/stan_math/lib/tbb_2020.3/python/tbb/api.i create mode 100644 .venv/lib/python3.12/site-packages/prophet/stan_model/cmdstan-2.33.1/stan/lib/stan_math/lib/tbb_2020.3/python/tbb/pool.py create mode 100644 .venv/lib/python3.12/site-packages/prophet/stan_model/cmdstan-2.33.1/stan/lib/stan_math/lib/tbb_2020.3/python/tbb/test.py create mode 100644 .venv/lib/python3.12/site-packages/prophet/stan_model/cmdstan-2.33.1/stan/lib/stan_math/lib/tbb_2020.3/src/Makefile create mode 100644 .venv/lib/python3.12/site-packages/prophet/stan_model/cmdstan-2.33.1/stan/lib/stan_math/lib/tbb_2020.3/src/index.html create mode 100644 .venv/lib/python3.12/site-packages/prophet/stan_model/cmdstan-2.33.1/stan/lib/stan_math/lib/tbb_2020.3/src/old/concurrent_queue_v2.cpp create mode 100644 .venv/lib/python3.12/site-packages/prophet/stan_model/cmdstan-2.33.1/stan/lib/stan_math/lib/tbb_2020.3/src/old/concurrent_queue_v2.h create mode 100644 .venv/lib/python3.12/site-packages/prophet/stan_model/cmdstan-2.33.1/stan/lib/stan_math/lib/tbb_2020.3/src/old/concurrent_vector_v2.cpp create mode 100644 .venv/lib/python3.12/site-packages/prophet/stan_model/cmdstan-2.33.1/stan/lib/stan_math/lib/tbb_2020.3/src/old/concurrent_vector_v2.h create mode 100644 .venv/lib/python3.12/site-packages/prophet/stan_model/cmdstan-2.33.1/stan/lib/stan_math/lib/tbb_2020.3/src/old/spin_rw_mutex_v2.cpp create mode 100644 .venv/lib/python3.12/site-packages/prophet/stan_model/cmdstan-2.33.1/stan/lib/stan_math/lib/tbb_2020.3/src/old/spin_rw_mutex_v2.h create mode 100644 .venv/lib/python3.12/site-packages/prophet/stan_model/cmdstan-2.33.1/stan/lib/stan_math/lib/tbb_2020.3/src/old/task_v2.cpp create mode 100644 .venv/lib/python3.12/site-packages/prophet/stan_model/cmdstan-2.33.1/stan/lib/stan_math/lib/tbb_2020.3/src/old/test_concurrent_queue_v2.cpp create mode 100644 .venv/lib/python3.12/site-packages/prophet/stan_model/cmdstan-2.33.1/stan/lib/stan_math/lib/tbb_2020.3/src/old/test_concurrent_vector_v2.cpp create mode 100644 .venv/lib/python3.12/site-packages/prophet/stan_model/cmdstan-2.33.1/stan/lib/stan_math/lib/tbb_2020.3/src/old/test_mutex_v2.cpp create mode 100644 .venv/lib/python3.12/site-packages/prophet/stan_model/cmdstan-2.33.1/stan/lib/stan_math/lib/tbb_2020.3/src/old/test_task_scheduler_observer_v3.cpp create mode 100644 .venv/lib/python3.12/site-packages/prophet/stan_model/cmdstan-2.33.1/stan/lib/stan_math/lib/tbb_2020.3/src/perf/coarse_grained_raii_lru_cache.h create mode 100644 .venv/lib/python3.12/site-packages/prophet/stan_model/cmdstan-2.33.1/stan/lib/stan_math/lib/tbb_2020.3/src/perf/cpq_pdes.cpp create mode 100644 .venv/lib/python3.12/site-packages/prophet/stan_model/cmdstan-2.33.1/stan/lib/stan_math/lib/tbb_2020.3/src/perf/fibonacci_impl_tbb.cpp create mode 100644 .venv/lib/python3.12/site-packages/prophet/stan_model/cmdstan-2.33.1/stan/lib/stan_math/lib/tbb_2020.3/src/perf/harness_perf.h create mode 100644 .venv/lib/python3.12/site-packages/prophet/stan_model/cmdstan-2.33.1/stan/lib/stan_math/lib/tbb_2020.3/src/perf/perf.cpp create mode 100644 .venv/lib/python3.12/site-packages/prophet/stan_model/cmdstan-2.33.1/stan/lib/stan_math/lib/tbb_2020.3/src/perf/perf.h create mode 100644 .venv/lib/python3.12/site-packages/prophet/stan_model/cmdstan-2.33.1/stan/lib/stan_math/lib/tbb_2020.3/src/perf/perf_sched.cpp create mode 100644 .venv/lib/python3.12/site-packages/prophet/stan_model/cmdstan-2.33.1/stan/lib/stan_math/lib/tbb_2020.3/src/perf/run_statistics.sh create mode 100644 .venv/lib/python3.12/site-packages/prophet/stan_model/cmdstan-2.33.1/stan/lib/stan_math/lib/tbb_2020.3/src/perf/statistics.cpp create mode 100644 .venv/lib/python3.12/site-packages/prophet/stan_model/cmdstan-2.33.1/stan/lib/stan_math/lib/tbb_2020.3/src/perf/statistics.h create mode 100644 .venv/lib/python3.12/site-packages/prophet/stan_model/cmdstan-2.33.1/stan/lib/stan_math/lib/tbb_2020.3/src/perf/statistics_xml.h create mode 100644 .venv/lib/python3.12/site-packages/prophet/stan_model/cmdstan-2.33.1/stan/lib/stan_math/lib/tbb_2020.3/src/perf/time_async_return.cpp create mode 100644 .venv/lib/python3.12/site-packages/prophet/stan_model/cmdstan-2.33.1/stan/lib/stan_math/lib/tbb_2020.3/src/perf/time_cpq_throughput_test.cpp create mode 100644 .venv/lib/python3.12/site-packages/prophet/stan_model/cmdstan-2.33.1/stan/lib/stan_math/lib/tbb_2020.3/src/perf/time_fibonacci_cutoff.cpp create mode 100644 .venv/lib/python3.12/site-packages/prophet/stan_model/cmdstan-2.33.1/stan/lib/stan_math/lib/tbb_2020.3/src/perf/time_framework.h create mode 100644 .venv/lib/python3.12/site-packages/prophet/stan_model/cmdstan-2.33.1/stan/lib/stan_math/lib/tbb_2020.3/src/perf/time_hash_map.cpp create mode 100644 .venv/lib/python3.12/site-packages/prophet/stan_model/cmdstan-2.33.1/stan/lib/stan_math/lib/tbb_2020.3/src/perf/time_hash_map_fill.cpp create mode 100644 .venv/lib/python3.12/site-packages/prophet/stan_model/cmdstan-2.33.1/stan/lib/stan_math/lib/tbb_2020.3/src/perf/time_hash_map_fill.html create mode 100644 .venv/lib/python3.12/site-packages/prophet/stan_model/cmdstan-2.33.1/stan/lib/stan_math/lib/tbb_2020.3/src/perf/time_locked_work.cpp create mode 100644 .venv/lib/python3.12/site-packages/prophet/stan_model/cmdstan-2.33.1/stan/lib/stan_math/lib/tbb_2020.3/src/perf/time_lru_cache_throughput.cpp create mode 100644 .venv/lib/python3.12/site-packages/prophet/stan_model/cmdstan-2.33.1/stan/lib/stan_math/lib/tbb_2020.3/src/perf/time_parallel_for_each.cpp create mode 100644 .venv/lib/python3.12/site-packages/prophet/stan_model/cmdstan-2.33.1/stan/lib/stan_math/lib/tbb_2020.3/src/perf/time_resumable_tasks.cpp create mode 100644 .venv/lib/python3.12/site-packages/prophet/stan_model/cmdstan-2.33.1/stan/lib/stan_math/lib/tbb_2020.3/src/perf/time_sandbox.h create mode 100644 .venv/lib/python3.12/site-packages/prophet/stan_model/cmdstan-2.33.1/stan/lib/stan_math/lib/tbb_2020.3/src/perf/time_split_node.cpp create mode 100644 .venv/lib/python3.12/site-packages/prophet/stan_model/cmdstan-2.33.1/stan/lib/stan_math/lib/tbb_2020.3/src/perf/time_vector.cpp create mode 100644 .venv/lib/python3.12/site-packages/prophet/stan_model/cmdstan-2.33.1/stan/lib/stan_math/lib/tbb_2020.3/src/rml/client/index.html create mode 100644 .venv/lib/python3.12/site-packages/prophet/stan_model/cmdstan-2.33.1/stan/lib/stan_math/lib/tbb_2020.3/src/rml/client/library_assert.h create mode 100644 .venv/lib/python3.12/site-packages/prophet/stan_model/cmdstan-2.33.1/stan/lib/stan_math/lib/tbb_2020.3/src/rml/client/omp_dynamic_link.cpp create mode 100644 .venv/lib/python3.12/site-packages/prophet/stan_model/cmdstan-2.33.1/stan/lib/stan_math/lib/tbb_2020.3/src/rml/client/omp_dynamic_link.h create mode 100644 .venv/lib/python3.12/site-packages/prophet/stan_model/cmdstan-2.33.1/stan/lib/stan_math/lib/tbb_2020.3/src/rml/client/rml_factory.h create mode 100644 .venv/lib/python3.12/site-packages/prophet/stan_model/cmdstan-2.33.1/stan/lib/stan_math/lib/tbb_2020.3/src/rml/client/rml_omp.cpp create mode 100644 .venv/lib/python3.12/site-packages/prophet/stan_model/cmdstan-2.33.1/stan/lib/stan_math/lib/tbb_2020.3/src/rml/client/rml_tbb.cpp create mode 100644 .venv/lib/python3.12/site-packages/prophet/stan_model/cmdstan-2.33.1/stan/lib/stan_math/lib/tbb_2020.3/src/rml/include/index.html create mode 100644 .venv/lib/python3.12/site-packages/prophet/stan_model/cmdstan-2.33.1/stan/lib/stan_math/lib/tbb_2020.3/src/rml/include/rml_base.h create mode 100644 .venv/lib/python3.12/site-packages/prophet/stan_model/cmdstan-2.33.1/stan/lib/stan_math/lib/tbb_2020.3/src/rml/include/rml_omp.h create mode 100644 .venv/lib/python3.12/site-packages/prophet/stan_model/cmdstan-2.33.1/stan/lib/stan_math/lib/tbb_2020.3/src/rml/include/rml_tbb.h create mode 100644 .venv/lib/python3.12/site-packages/prophet/stan_model/cmdstan-2.33.1/stan/lib/stan_math/lib/tbb_2020.3/src/rml/index.html create mode 100644 .venv/lib/python3.12/site-packages/prophet/stan_model/cmdstan-2.33.1/stan/lib/stan_math/lib/tbb_2020.3/src/rml/perfor/omp_nested.cpp create mode 100644 .venv/lib/python3.12/site-packages/prophet/stan_model/cmdstan-2.33.1/stan/lib/stan_math/lib/tbb_2020.3/src/rml/perfor/omp_simple.cpp create mode 100644 .venv/lib/python3.12/site-packages/prophet/stan_model/cmdstan-2.33.1/stan/lib/stan_math/lib/tbb_2020.3/src/rml/perfor/tbb_multi_omp.cpp create mode 100644 .venv/lib/python3.12/site-packages/prophet/stan_model/cmdstan-2.33.1/stan/lib/stan_math/lib/tbb_2020.3/src/rml/perfor/tbb_simple.cpp create mode 100644 .venv/lib/python3.12/site-packages/prophet/stan_model/cmdstan-2.33.1/stan/lib/stan_math/lib/tbb_2020.3/src/rml/perfor/thread_level.h create mode 100644 .venv/lib/python3.12/site-packages/prophet/stan_model/cmdstan-2.33.1/stan/lib/stan_math/lib/tbb_2020.3/src/rml/server/index.html create mode 100644 .venv/lib/python3.12/site-packages/prophet/stan_model/cmdstan-2.33.1/stan/lib/stan_math/lib/tbb_2020.3/src/rml/server/irml.rc create mode 100644 .venv/lib/python3.12/site-packages/prophet/stan_model/cmdstan-2.33.1/stan/lib/stan_math/lib/tbb_2020.3/src/rml/server/job_automaton.h create mode 100644 .venv/lib/python3.12/site-packages/prophet/stan_model/cmdstan-2.33.1/stan/lib/stan_math/lib/tbb_2020.3/src/rml/server/lin-rml-export.def create mode 100644 .venv/lib/python3.12/site-packages/prophet/stan_model/cmdstan-2.33.1/stan/lib/stan_math/lib/tbb_2020.3/src/rml/server/rml_server.cpp create mode 100644 .venv/lib/python3.12/site-packages/prophet/stan_model/cmdstan-2.33.1/stan/lib/stan_math/lib/tbb_2020.3/src/rml/server/thread_monitor.h create mode 100644 .venv/lib/python3.12/site-packages/prophet/stan_model/cmdstan-2.33.1/stan/lib/stan_math/lib/tbb_2020.3/src/rml/server/wait_counter.h create mode 100644 .venv/lib/python3.12/site-packages/prophet/stan_model/cmdstan-2.33.1/stan/lib/stan_math/lib/tbb_2020.3/src/rml/server/win32-rml-export.def create mode 100644 .venv/lib/python3.12/site-packages/prophet/stan_model/cmdstan-2.33.1/stan/lib/stan_math/lib/tbb_2020.3/src/rml/server/win64-rml-export.def create mode 100644 .venv/lib/python3.12/site-packages/prophet/stan_model/cmdstan-2.33.1/stan/lib/stan_math/lib/tbb_2020.3/src/rml/test/rml_omp_stub.cpp create mode 100644 .venv/lib/python3.12/site-packages/prophet/stan_model/cmdstan-2.33.1/stan/lib/stan_math/lib/tbb_2020.3/src/rml/test/test_job_automaton.cpp create mode 100644 .venv/lib/python3.12/site-packages/prophet/stan_model/cmdstan-2.33.1/stan/lib/stan_math/lib/tbb_2020.3/src/rml/test/test_rml_mixed.cpp create mode 100644 .venv/lib/python3.12/site-packages/prophet/stan_model/cmdstan-2.33.1/stan/lib/stan_math/lib/tbb_2020.3/src/rml/test/test_rml_omp.cpp create mode 100644 .venv/lib/python3.12/site-packages/prophet/stan_model/cmdstan-2.33.1/stan/lib/stan_math/lib/tbb_2020.3/src/rml/test/test_rml_omp_c_linkage.c create mode 100644 .venv/lib/python3.12/site-packages/prophet/stan_model/cmdstan-2.33.1/stan/lib/stan_math/lib/tbb_2020.3/src/rml/test/test_rml_tbb.cpp create mode 100644 .venv/lib/python3.12/site-packages/prophet/stan_model/cmdstan-2.33.1/stan/lib/stan_math/lib/tbb_2020.3/src/rml/test/test_server.h create mode 100644 .venv/lib/python3.12/site-packages/prophet/stan_model/cmdstan-2.33.1/stan/lib/stan_math/lib/tbb_2020.3/src/rml/test/test_thread_monitor.cpp create mode 100644 .venv/lib/python3.12/site-packages/prophet/stan_model/cmdstan-2.33.1/stan/lib/stan_math/lib/tbb_2020.3/src/tbb/arena.cpp create mode 100644 .venv/lib/python3.12/site-packages/prophet/stan_model/cmdstan-2.33.1/stan/lib/stan_math/lib/tbb_2020.3/src/tbb/arena.h create mode 100644 .venv/lib/python3.12/site-packages/prophet/stan_model/cmdstan-2.33.1/stan/lib/stan_math/lib/tbb_2020.3/src/tbb/cache_aligned_allocator.cpp create mode 100644 .venv/lib/python3.12/site-packages/prophet/stan_model/cmdstan-2.33.1/stan/lib/stan_math/lib/tbb_2020.3/src/tbb/cilk-tbb-interop.h create mode 100644 .venv/lib/python3.12/site-packages/prophet/stan_model/cmdstan-2.33.1/stan/lib/stan_math/lib/tbb_2020.3/src/tbb/co_context.h create mode 100644 .venv/lib/python3.12/site-packages/prophet/stan_model/cmdstan-2.33.1/stan/lib/stan_math/lib/tbb_2020.3/src/tbb/concurrent_hash_map.cpp create mode 100644 .venv/lib/python3.12/site-packages/prophet/stan_model/cmdstan-2.33.1/stan/lib/stan_math/lib/tbb_2020.3/src/tbb/concurrent_monitor.cpp create mode 100644 .venv/lib/python3.12/site-packages/prophet/stan_model/cmdstan-2.33.1/stan/lib/stan_math/lib/tbb_2020.3/src/tbb/concurrent_monitor.h create mode 100644 .venv/lib/python3.12/site-packages/prophet/stan_model/cmdstan-2.33.1/stan/lib/stan_math/lib/tbb_2020.3/src/tbb/concurrent_queue.cpp create mode 100644 .venv/lib/python3.12/site-packages/prophet/stan_model/cmdstan-2.33.1/stan/lib/stan_math/lib/tbb_2020.3/src/tbb/concurrent_vector.cpp create mode 100644 .venv/lib/python3.12/site-packages/prophet/stan_model/cmdstan-2.33.1/stan/lib/stan_math/lib/tbb_2020.3/src/tbb/condition_variable.cpp create mode 100644 .venv/lib/python3.12/site-packages/prophet/stan_model/cmdstan-2.33.1/stan/lib/stan_math/lib/tbb_2020.3/src/tbb/critical_section.cpp create mode 100644 .venv/lib/python3.12/site-packages/prophet/stan_model/cmdstan-2.33.1/stan/lib/stan_math/lib/tbb_2020.3/src/tbb/custom_scheduler.h create mode 100644 .venv/lib/python3.12/site-packages/prophet/stan_model/cmdstan-2.33.1/stan/lib/stan_math/lib/tbb_2020.3/src/tbb/dynamic_link.cpp create mode 100644 .venv/lib/python3.12/site-packages/prophet/stan_model/cmdstan-2.33.1/stan/lib/stan_math/lib/tbb_2020.3/src/tbb/dynamic_link.h create mode 100644 .venv/lib/python3.12/site-packages/prophet/stan_model/cmdstan-2.33.1/stan/lib/stan_math/lib/tbb_2020.3/src/tbb/governor.cpp create mode 100644 .venv/lib/python3.12/site-packages/prophet/stan_model/cmdstan-2.33.1/stan/lib/stan_math/lib/tbb_2020.3/src/tbb/governor.h create mode 100644 .venv/lib/python3.12/site-packages/prophet/stan_model/cmdstan-2.33.1/stan/lib/stan_math/lib/tbb_2020.3/src/tbb/ia32-masm/atomic_support.asm create mode 100644 .venv/lib/python3.12/site-packages/prophet/stan_model/cmdstan-2.33.1/stan/lib/stan_math/lib/tbb_2020.3/src/tbb/ia32-masm/itsx.asm create mode 100644 .venv/lib/python3.12/site-packages/prophet/stan_model/cmdstan-2.33.1/stan/lib/stan_math/lib/tbb_2020.3/src/tbb/ia32-masm/lock_byte.asm create mode 100644 .venv/lib/python3.12/site-packages/prophet/stan_model/cmdstan-2.33.1/stan/lib/stan_math/lib/tbb_2020.3/src/tbb/ia64-gas/atomic_support.s create mode 100644 .venv/lib/python3.12/site-packages/prophet/stan_model/cmdstan-2.33.1/stan/lib/stan_math/lib/tbb_2020.3/src/tbb/ia64-gas/ia64_misc.s create mode 100644 .venv/lib/python3.12/site-packages/prophet/stan_model/cmdstan-2.33.1/stan/lib/stan_math/lib/tbb_2020.3/src/tbb/ia64-gas/lock_byte.s create mode 100644 .venv/lib/python3.12/site-packages/prophet/stan_model/cmdstan-2.33.1/stan/lib/stan_math/lib/tbb_2020.3/src/tbb/ia64-gas/log2.s create mode 100644 .venv/lib/python3.12/site-packages/prophet/stan_model/cmdstan-2.33.1/stan/lib/stan_math/lib/tbb_2020.3/src/tbb/ia64-gas/pause.s create mode 100644 .venv/lib/python3.12/site-packages/prophet/stan_model/cmdstan-2.33.1/stan/lib/stan_math/lib/tbb_2020.3/src/tbb/ibm_aix51/atomic_support.c create mode 100644 .venv/lib/python3.12/site-packages/prophet/stan_model/cmdstan-2.33.1/stan/lib/stan_math/lib/tbb_2020.3/src/tbb/index.html create mode 100644 .venv/lib/python3.12/site-packages/prophet/stan_model/cmdstan-2.33.1/stan/lib/stan_math/lib/tbb_2020.3/src/tbb/intel64-masm/atomic_support.asm create mode 100644 .venv/lib/python3.12/site-packages/prophet/stan_model/cmdstan-2.33.1/stan/lib/stan_math/lib/tbb_2020.3/src/tbb/intel64-masm/intel64_misc.asm create mode 100644 .venv/lib/python3.12/site-packages/prophet/stan_model/cmdstan-2.33.1/stan/lib/stan_math/lib/tbb_2020.3/src/tbb/intel64-masm/itsx.asm create mode 100644 .venv/lib/python3.12/site-packages/prophet/stan_model/cmdstan-2.33.1/stan/lib/stan_math/lib/tbb_2020.3/src/tbb/intrusive_list.h create mode 100644 .venv/lib/python3.12/site-packages/prophet/stan_model/cmdstan-2.33.1/stan/lib/stan_math/lib/tbb_2020.3/src/tbb/itt_notify.cpp create mode 100644 .venv/lib/python3.12/site-packages/prophet/stan_model/cmdstan-2.33.1/stan/lib/stan_math/lib/tbb_2020.3/src/tbb/itt_notify.h create mode 100644 .venv/lib/python3.12/site-packages/prophet/stan_model/cmdstan-2.33.1/stan/lib/stan_math/lib/tbb_2020.3/src/tbb/lin32-tbb-export.def create mode 100644 .venv/lib/python3.12/site-packages/prophet/stan_model/cmdstan-2.33.1/stan/lib/stan_math/lib/tbb_2020.3/src/tbb/lin32-tbb-export.lst create mode 100644 .venv/lib/python3.12/site-packages/prophet/stan_model/cmdstan-2.33.1/stan/lib/stan_math/lib/tbb_2020.3/src/tbb/lin32-tbbbind-export.def create mode 100644 .venv/lib/python3.12/site-packages/prophet/stan_model/cmdstan-2.33.1/stan/lib/stan_math/lib/tbb_2020.3/src/tbb/lin64-tbb-export.def create mode 100644 .venv/lib/python3.12/site-packages/prophet/stan_model/cmdstan-2.33.1/stan/lib/stan_math/lib/tbb_2020.3/src/tbb/lin64-tbb-export.lst create mode 100644 .venv/lib/python3.12/site-packages/prophet/stan_model/cmdstan-2.33.1/stan/lib/stan_math/lib/tbb_2020.3/src/tbb/lin64-tbbbind-export.def create mode 100644 .venv/lib/python3.12/site-packages/prophet/stan_model/cmdstan-2.33.1/stan/lib/stan_math/lib/tbb_2020.3/src/tbb/lin64ipf-tbb-export.def create mode 100644 .venv/lib/python3.12/site-packages/prophet/stan_model/cmdstan-2.33.1/stan/lib/stan_math/lib/tbb_2020.3/src/tbb/lin64ipf-tbb-export.lst create mode 100644 .venv/lib/python3.12/site-packages/prophet/stan_model/cmdstan-2.33.1/stan/lib/stan_math/lib/tbb_2020.3/src/tbb/mac32-tbb-export.def create mode 100644 .venv/lib/python3.12/site-packages/prophet/stan_model/cmdstan-2.33.1/stan/lib/stan_math/lib/tbb_2020.3/src/tbb/mac32-tbb-export.lst create mode 100644 .venv/lib/python3.12/site-packages/prophet/stan_model/cmdstan-2.33.1/stan/lib/stan_math/lib/tbb_2020.3/src/tbb/mac64-tbb-export.def create mode 100644 .venv/lib/python3.12/site-packages/prophet/stan_model/cmdstan-2.33.1/stan/lib/stan_math/lib/tbb_2020.3/src/tbb/mac64-tbb-export.lst create mode 100644 .venv/lib/python3.12/site-packages/prophet/stan_model/cmdstan-2.33.1/stan/lib/stan_math/lib/tbb_2020.3/src/tbb/mailbox.h create mode 100644 .venv/lib/python3.12/site-packages/prophet/stan_model/cmdstan-2.33.1/stan/lib/stan_math/lib/tbb_2020.3/src/tbb/market.cpp create mode 100644 .venv/lib/python3.12/site-packages/prophet/stan_model/cmdstan-2.33.1/stan/lib/stan_math/lib/tbb_2020.3/src/tbb/market.h create mode 100644 .venv/lib/python3.12/site-packages/prophet/stan_model/cmdstan-2.33.1/stan/lib/stan_math/lib/tbb_2020.3/src/tbb/mutex.cpp create mode 100644 .venv/lib/python3.12/site-packages/prophet/stan_model/cmdstan-2.33.1/stan/lib/stan_math/lib/tbb_2020.3/src/tbb/observer_proxy.cpp create mode 100644 .venv/lib/python3.12/site-packages/prophet/stan_model/cmdstan-2.33.1/stan/lib/stan_math/lib/tbb_2020.3/src/tbb/observer_proxy.h create mode 100644 .venv/lib/python3.12/site-packages/prophet/stan_model/cmdstan-2.33.1/stan/lib/stan_math/lib/tbb_2020.3/src/tbb/pipeline.cpp create mode 100644 .venv/lib/python3.12/site-packages/prophet/stan_model/cmdstan-2.33.1/stan/lib/stan_math/lib/tbb_2020.3/src/tbb/private_server.cpp create mode 100644 .venv/lib/python3.12/site-packages/prophet/stan_model/cmdstan-2.33.1/stan/lib/stan_math/lib/tbb_2020.3/src/tbb/queuing_mutex.cpp create mode 100644 .venv/lib/python3.12/site-packages/prophet/stan_model/cmdstan-2.33.1/stan/lib/stan_math/lib/tbb_2020.3/src/tbb/queuing_rw_mutex.cpp create mode 100644 .venv/lib/python3.12/site-packages/prophet/stan_model/cmdstan-2.33.1/stan/lib/stan_math/lib/tbb_2020.3/src/tbb/reader_writer_lock.cpp create mode 100644 .venv/lib/python3.12/site-packages/prophet/stan_model/cmdstan-2.33.1/stan/lib/stan_math/lib/tbb_2020.3/src/tbb/recursive_mutex.cpp create mode 100644 .venv/lib/python3.12/site-packages/prophet/stan_model/cmdstan-2.33.1/stan/lib/stan_math/lib/tbb_2020.3/src/tbb/scheduler.cpp create mode 100644 .venv/lib/python3.12/site-packages/prophet/stan_model/cmdstan-2.33.1/stan/lib/stan_math/lib/tbb_2020.3/src/tbb/scheduler.h create mode 100644 .venv/lib/python3.12/site-packages/prophet/stan_model/cmdstan-2.33.1/stan/lib/stan_math/lib/tbb_2020.3/src/tbb/scheduler_common.h create mode 100644 .venv/lib/python3.12/site-packages/prophet/stan_model/cmdstan-2.33.1/stan/lib/stan_math/lib/tbb_2020.3/src/tbb/scheduler_utility.h create mode 100644 .venv/lib/python3.12/site-packages/prophet/stan_model/cmdstan-2.33.1/stan/lib/stan_math/lib/tbb_2020.3/src/tbb/semaphore.cpp create mode 100644 .venv/lib/python3.12/site-packages/prophet/stan_model/cmdstan-2.33.1/stan/lib/stan_math/lib/tbb_2020.3/src/tbb/semaphore.h create mode 100644 .venv/lib/python3.12/site-packages/prophet/stan_model/cmdstan-2.33.1/stan/lib/stan_math/lib/tbb_2020.3/src/tbb/spin_mutex.cpp create mode 100644 .venv/lib/python3.12/site-packages/prophet/stan_model/cmdstan-2.33.1/stan/lib/stan_math/lib/tbb_2020.3/src/tbb/spin_rw_mutex.cpp create mode 100644 .venv/lib/python3.12/site-packages/prophet/stan_model/cmdstan-2.33.1/stan/lib/stan_math/lib/tbb_2020.3/src/tbb/task.cpp create mode 100644 .venv/lib/python3.12/site-packages/prophet/stan_model/cmdstan-2.33.1/stan/lib/stan_math/lib/tbb_2020.3/src/tbb/task_group_context.cpp create mode 100644 .venv/lib/python3.12/site-packages/prophet/stan_model/cmdstan-2.33.1/stan/lib/stan_math/lib/tbb_2020.3/src/tbb/task_stream.h create mode 100644 .venv/lib/python3.12/site-packages/prophet/stan_model/cmdstan-2.33.1/stan/lib/stan_math/lib/tbb_2020.3/src/tbb/task_stream_extended.h create mode 100644 .venv/lib/python3.12/site-packages/prophet/stan_model/cmdstan-2.33.1/stan/lib/stan_math/lib/tbb_2020.3/src/tbb/tbb_assert_impl.h create mode 100644 .venv/lib/python3.12/site-packages/prophet/stan_model/cmdstan-2.33.1/stan/lib/stan_math/lib/tbb_2020.3/src/tbb/tbb_bind.cpp create mode 100644 .venv/lib/python3.12/site-packages/prophet/stan_model/cmdstan-2.33.1/stan/lib/stan_math/lib/tbb_2020.3/src/tbb/tbb_environment.h create mode 100644 .venv/lib/python3.12/site-packages/prophet/stan_model/cmdstan-2.33.1/stan/lib/stan_math/lib/tbb_2020.3/src/tbb/tbb_main.cpp create mode 100644 .venv/lib/python3.12/site-packages/prophet/stan_model/cmdstan-2.33.1/stan/lib/stan_math/lib/tbb_2020.3/src/tbb/tbb_main.h create mode 100644 .venv/lib/python3.12/site-packages/prophet/stan_model/cmdstan-2.33.1/stan/lib/stan_math/lib/tbb_2020.3/src/tbb/tbb_misc.cpp create mode 100644 .venv/lib/python3.12/site-packages/prophet/stan_model/cmdstan-2.33.1/stan/lib/stan_math/lib/tbb_2020.3/src/tbb/tbb_misc.h create mode 100644 .venv/lib/python3.12/site-packages/prophet/stan_model/cmdstan-2.33.1/stan/lib/stan_math/lib/tbb_2020.3/src/tbb/tbb_misc_ex.cpp create mode 100644 .venv/lib/python3.12/site-packages/prophet/stan_model/cmdstan-2.33.1/stan/lib/stan_math/lib/tbb_2020.3/src/tbb/tbb_resource.rc create mode 100644 .venv/lib/python3.12/site-packages/prophet/stan_model/cmdstan-2.33.1/stan/lib/stan_math/lib/tbb_2020.3/src/tbb/tbb_statistics.cpp create mode 100644 .venv/lib/python3.12/site-packages/prophet/stan_model/cmdstan-2.33.1/stan/lib/stan_math/lib/tbb_2020.3/src/tbb/tbb_statistics.h create mode 100644 .venv/lib/python3.12/site-packages/prophet/stan_model/cmdstan-2.33.1/stan/lib/stan_math/lib/tbb_2020.3/src/tbb/tbb_thread.cpp create mode 100644 .venv/lib/python3.12/site-packages/prophet/stan_model/cmdstan-2.33.1/stan/lib/stan_math/lib/tbb_2020.3/src/tbb/tbb_version.h create mode 100644 .venv/lib/python3.12/site-packages/prophet/stan_model/cmdstan-2.33.1/stan/lib/stan_math/lib/tbb_2020.3/src/tbb/tls.h create mode 100644 .venv/lib/python3.12/site-packages/prophet/stan_model/cmdstan-2.33.1/stan/lib/stan_math/lib/tbb_2020.3/src/tbb/tools_api/disable_warnings.h create mode 100644 .venv/lib/python3.12/site-packages/prophet/stan_model/cmdstan-2.33.1/stan/lib/stan_math/lib/tbb_2020.3/src/tbb/tools_api/ittnotify.h create mode 100644 .venv/lib/python3.12/site-packages/prophet/stan_model/cmdstan-2.33.1/stan/lib/stan_math/lib/tbb_2020.3/src/tbb/tools_api/ittnotify_config.h create mode 100644 .venv/lib/python3.12/site-packages/prophet/stan_model/cmdstan-2.33.1/stan/lib/stan_math/lib/tbb_2020.3/src/tbb/tools_api/ittnotify_static.c create mode 100644 .venv/lib/python3.12/site-packages/prophet/stan_model/cmdstan-2.33.1/stan/lib/stan_math/lib/tbb_2020.3/src/tbb/tools_api/ittnotify_static.h create mode 100644 .venv/lib/python3.12/site-packages/prophet/stan_model/cmdstan-2.33.1/stan/lib/stan_math/lib/tbb_2020.3/src/tbb/tools_api/ittnotify_types.h create mode 100644 .venv/lib/python3.12/site-packages/prophet/stan_model/cmdstan-2.33.1/stan/lib/stan_math/lib/tbb_2020.3/src/tbb/tools_api/legacy/ittnotify.h create mode 100644 .venv/lib/python3.12/site-packages/prophet/stan_model/cmdstan-2.33.1/stan/lib/stan_math/lib/tbb_2020.3/src/tbb/win32-tbb-export.def create mode 100644 .venv/lib/python3.12/site-packages/prophet/stan_model/cmdstan-2.33.1/stan/lib/stan_math/lib/tbb_2020.3/src/tbb/win32-tbb-export.lst create mode 100644 .venv/lib/python3.12/site-packages/prophet/stan_model/cmdstan-2.33.1/stan/lib/stan_math/lib/tbb_2020.3/src/tbb/win32-tbbbind-export.def create mode 100644 .venv/lib/python3.12/site-packages/prophet/stan_model/cmdstan-2.33.1/stan/lib/stan_math/lib/tbb_2020.3/src/tbb/win64-gcc-tbb-export.def create mode 100644 .venv/lib/python3.12/site-packages/prophet/stan_model/cmdstan-2.33.1/stan/lib/stan_math/lib/tbb_2020.3/src/tbb/win64-gcc-tbb-export.lst create mode 100644 .venv/lib/python3.12/site-packages/prophet/stan_model/cmdstan-2.33.1/stan/lib/stan_math/lib/tbb_2020.3/src/tbb/win64-tbb-export.def create mode 100644 .venv/lib/python3.12/site-packages/prophet/stan_model/cmdstan-2.33.1/stan/lib/stan_math/lib/tbb_2020.3/src/tbb/win64-tbb-export.lst create mode 100644 .venv/lib/python3.12/site-packages/prophet/stan_model/cmdstan-2.33.1/stan/lib/stan_math/lib/tbb_2020.3/src/tbb/win64-tbbbind-export.def create mode 100644 .venv/lib/python3.12/site-packages/prophet/stan_model/cmdstan-2.33.1/stan/lib/stan_math/lib/tbb_2020.3/src/tbb/winrt-tbb-export.lst create mode 100644 .venv/lib/python3.12/site-packages/prophet/stan_model/cmdstan-2.33.1/stan/lib/stan_math/lib/tbb_2020.3/src/tbb/x86_rtm_rw_mutex.cpp create mode 100644 .venv/lib/python3.12/site-packages/prophet/stan_model/cmdstan-2.33.1/stan/lib/stan_math/lib/tbb_2020.3/src/tbbmalloc/Customize.h create mode 100644 .venv/lib/python3.12/site-packages/prophet/stan_model/cmdstan-2.33.1/stan/lib/stan_math/lib/tbb_2020.3/src/tbbmalloc/MapMemory.h create mode 100644 .venv/lib/python3.12/site-packages/prophet/stan_model/cmdstan-2.33.1/stan/lib/stan_math/lib/tbb_2020.3/src/tbbmalloc/Statistics.h create mode 100644 .venv/lib/python3.12/site-packages/prophet/stan_model/cmdstan-2.33.1/stan/lib/stan_math/lib/tbb_2020.3/src/tbbmalloc/Synchronize.h create mode 100644 .venv/lib/python3.12/site-packages/prophet/stan_model/cmdstan-2.33.1/stan/lib/stan_math/lib/tbb_2020.3/src/tbbmalloc/TypeDefinitions.h create mode 100644 .venv/lib/python3.12/site-packages/prophet/stan_model/cmdstan-2.33.1/stan/lib/stan_math/lib/tbb_2020.3/src/tbbmalloc/backend.cpp create mode 100644 .venv/lib/python3.12/site-packages/prophet/stan_model/cmdstan-2.33.1/stan/lib/stan_math/lib/tbb_2020.3/src/tbbmalloc/backend.h create mode 100644 .venv/lib/python3.12/site-packages/prophet/stan_model/cmdstan-2.33.1/stan/lib/stan_math/lib/tbb_2020.3/src/tbbmalloc/backref.cpp create mode 100644 .venv/lib/python3.12/site-packages/prophet/stan_model/cmdstan-2.33.1/stan/lib/stan_math/lib/tbb_2020.3/src/tbbmalloc/frontend.cpp create mode 100644 .venv/lib/python3.12/site-packages/prophet/stan_model/cmdstan-2.33.1/stan/lib/stan_math/lib/tbb_2020.3/src/tbbmalloc/index.html create mode 100644 .venv/lib/python3.12/site-packages/prophet/stan_model/cmdstan-2.33.1/stan/lib/stan_math/lib/tbb_2020.3/src/tbbmalloc/large_objects.cpp create mode 100644 .venv/lib/python3.12/site-packages/prophet/stan_model/cmdstan-2.33.1/stan/lib/stan_math/lib/tbb_2020.3/src/tbbmalloc/large_objects.h create mode 100644 .venv/lib/python3.12/site-packages/prophet/stan_model/cmdstan-2.33.1/stan/lib/stan_math/lib/tbb_2020.3/src/tbbmalloc/lin32-proxy-export.def create mode 100644 .venv/lib/python3.12/site-packages/prophet/stan_model/cmdstan-2.33.1/stan/lib/stan_math/lib/tbb_2020.3/src/tbbmalloc/lin32-tbbmalloc-export.def create mode 100644 .venv/lib/python3.12/site-packages/prophet/stan_model/cmdstan-2.33.1/stan/lib/stan_math/lib/tbb_2020.3/src/tbbmalloc/lin64-proxy-export.def create mode 100644 .venv/lib/python3.12/site-packages/prophet/stan_model/cmdstan-2.33.1/stan/lib/stan_math/lib/tbb_2020.3/src/tbbmalloc/lin64-tbbmalloc-export.def create mode 100644 .venv/lib/python3.12/site-packages/prophet/stan_model/cmdstan-2.33.1/stan/lib/stan_math/lib/tbb_2020.3/src/tbbmalloc/lin64ipf-proxy-export.def create mode 100644 .venv/lib/python3.12/site-packages/prophet/stan_model/cmdstan-2.33.1/stan/lib/stan_math/lib/tbb_2020.3/src/tbbmalloc/lin64ipf-tbbmalloc-export.def create mode 100644 .venv/lib/python3.12/site-packages/prophet/stan_model/cmdstan-2.33.1/stan/lib/stan_math/lib/tbb_2020.3/src/tbbmalloc/mac32-tbbmalloc-export.def create mode 100644 .venv/lib/python3.12/site-packages/prophet/stan_model/cmdstan-2.33.1/stan/lib/stan_math/lib/tbb_2020.3/src/tbbmalloc/mac64-tbbmalloc-export.def create mode 100644 .venv/lib/python3.12/site-packages/prophet/stan_model/cmdstan-2.33.1/stan/lib/stan_math/lib/tbb_2020.3/src/tbbmalloc/proxy.cpp create mode 100644 .venv/lib/python3.12/site-packages/prophet/stan_model/cmdstan-2.33.1/stan/lib/stan_math/lib/tbb_2020.3/src/tbbmalloc/proxy.h create mode 100644 .venv/lib/python3.12/site-packages/prophet/stan_model/cmdstan-2.33.1/stan/lib/stan_math/lib/tbb_2020.3/src/tbbmalloc/proxy_overload_osx.h create mode 100644 .venv/lib/python3.12/site-packages/prophet/stan_model/cmdstan-2.33.1/stan/lib/stan_math/lib/tbb_2020.3/src/tbbmalloc/shared_utils.h create mode 100644 .venv/lib/python3.12/site-packages/prophet/stan_model/cmdstan-2.33.1/stan/lib/stan_math/lib/tbb_2020.3/src/tbbmalloc/tbb_function_replacement.cpp create mode 100644 .venv/lib/python3.12/site-packages/prophet/stan_model/cmdstan-2.33.1/stan/lib/stan_math/lib/tbb_2020.3/src/tbbmalloc/tbb_function_replacement.h create mode 100644 .venv/lib/python3.12/site-packages/prophet/stan_model/cmdstan-2.33.1/stan/lib/stan_math/lib/tbb_2020.3/src/tbbmalloc/tbbmalloc.cpp create mode 100644 .venv/lib/python3.12/site-packages/prophet/stan_model/cmdstan-2.33.1/stan/lib/stan_math/lib/tbb_2020.3/src/tbbmalloc/tbbmalloc.rc create mode 100644 .venv/lib/python3.12/site-packages/prophet/stan_model/cmdstan-2.33.1/stan/lib/stan_math/lib/tbb_2020.3/src/tbbmalloc/tbbmalloc_internal.h create mode 100644 .venv/lib/python3.12/site-packages/prophet/stan_model/cmdstan-2.33.1/stan/lib/stan_math/lib/tbb_2020.3/src/tbbmalloc/tbbmalloc_internal_api.h create mode 100644 .venv/lib/python3.12/site-packages/prophet/stan_model/cmdstan-2.33.1/stan/lib/stan_math/lib/tbb_2020.3/src/tbbmalloc/win32-gcc-tbbmalloc-export.def create mode 100644 .venv/lib/python3.12/site-packages/prophet/stan_model/cmdstan-2.33.1/stan/lib/stan_math/lib/tbb_2020.3/src/tbbmalloc/win32-tbbmalloc-export.def create mode 100644 .venv/lib/python3.12/site-packages/prophet/stan_model/cmdstan-2.33.1/stan/lib/stan_math/lib/tbb_2020.3/src/tbbmalloc/win64-gcc-tbbmalloc-export.def create mode 100644 .venv/lib/python3.12/site-packages/prophet/stan_model/cmdstan-2.33.1/stan/lib/stan_math/lib/tbb_2020.3/src/tbbmalloc/win64-tbbmalloc-export.def create mode 100644 .venv/lib/python3.12/site-packages/prophet/stan_model/cmdstan-2.33.1/stan/lib/stan_math/lib/tbb_2020.3/src/tbbproxy/tbbproxy-windows.asm create mode 100644 .venv/lib/python3.12/site-packages/prophet/stan_model/cmdstan-2.33.1/stan/lib/stan_math/lib/tbb_2020.3/src/tbbproxy/tbbproxy.cpp create mode 100644 .venv/lib/python3.12/site-packages/prophet/stan_model/cmdstan-2.33.1/stan/lib/stan_math/lib/tbb_2020.3/src/test/harness.h create mode 100644 .venv/lib/python3.12/site-packages/prophet/stan_model/cmdstan-2.33.1/stan/lib/stan_math/lib/tbb_2020.3/src/test/harness_allocator.h create mode 100644 .venv/lib/python3.12/site-packages/prophet/stan_model/cmdstan-2.33.1/stan/lib/stan_math/lib/tbb_2020.3/src/test/harness_allocator_overload.h create mode 100644 .venv/lib/python3.12/site-packages/prophet/stan_model/cmdstan-2.33.1/stan/lib/stan_math/lib/tbb_2020.3/src/test/harness_assert.h create mode 100644 .venv/lib/python3.12/site-packages/prophet/stan_model/cmdstan-2.33.1/stan/lib/stan_math/lib/tbb_2020.3/src/test/harness_bad_expr.h create mode 100644 .venv/lib/python3.12/site-packages/prophet/stan_model/cmdstan-2.33.1/stan/lib/stan_math/lib/tbb_2020.3/src/test/harness_barrier.h create mode 100644 .venv/lib/python3.12/site-packages/prophet/stan_model/cmdstan-2.33.1/stan/lib/stan_math/lib/tbb_2020.3/src/test/harness_checktype.h create mode 100644 .venv/lib/python3.12/site-packages/prophet/stan_model/cmdstan-2.33.1/stan/lib/stan_math/lib/tbb_2020.3/src/test/harness_concurrency.h create mode 100644 .venv/lib/python3.12/site-packages/prophet/stan_model/cmdstan-2.33.1/stan/lib/stan_math/lib/tbb_2020.3/src/test/harness_concurrency_tracker.h create mode 100644 .venv/lib/python3.12/site-packages/prophet/stan_model/cmdstan-2.33.1/stan/lib/stan_math/lib/tbb_2020.3/src/test/harness_cpu.h create mode 100644 .venv/lib/python3.12/site-packages/prophet/stan_model/cmdstan-2.33.1/stan/lib/stan_math/lib/tbb_2020.3/src/test/harness_defs.h create mode 100644 .venv/lib/python3.12/site-packages/prophet/stan_model/cmdstan-2.33.1/stan/lib/stan_math/lib/tbb_2020.3/src/test/harness_dynamic_libs.h create mode 100644 .venv/lib/python3.12/site-packages/prophet/stan_model/cmdstan-2.33.1/stan/lib/stan_math/lib/tbb_2020.3/src/test/harness_eh.h create mode 100644 .venv/lib/python3.12/site-packages/prophet/stan_model/cmdstan-2.33.1/stan/lib/stan_math/lib/tbb_2020.3/src/test/harness_fp.h create mode 100644 .venv/lib/python3.12/site-packages/prophet/stan_model/cmdstan-2.33.1/stan/lib/stan_math/lib/tbb_2020.3/src/test/harness_graph.h create mode 100644 .venv/lib/python3.12/site-packages/prophet/stan_model/cmdstan-2.33.1/stan/lib/stan_math/lib/tbb_2020.3/src/test/harness_inject_scheduler.h create mode 100644 .venv/lib/python3.12/site-packages/prophet/stan_model/cmdstan-2.33.1/stan/lib/stan_math/lib/tbb_2020.3/src/test/harness_iterator.h create mode 100644 .venv/lib/python3.12/site-packages/prophet/stan_model/cmdstan-2.33.1/stan/lib/stan_math/lib/tbb_2020.3/src/test/harness_m128.h create mode 100644 .venv/lib/python3.12/site-packages/prophet/stan_model/cmdstan-2.33.1/stan/lib/stan_math/lib/tbb_2020.3/src/test/harness_memory.h create mode 100644 .venv/lib/python3.12/site-packages/prophet/stan_model/cmdstan-2.33.1/stan/lib/stan_math/lib/tbb_2020.3/src/test/harness_mic.h create mode 100644 .venv/lib/python3.12/site-packages/prophet/stan_model/cmdstan-2.33.1/stan/lib/stan_math/lib/tbb_2020.3/src/test/harness_preload.h create mode 100644 .venv/lib/python3.12/site-packages/prophet/stan_model/cmdstan-2.33.1/stan/lib/stan_math/lib/tbb_2020.3/src/test/harness_report.h create mode 100644 .venv/lib/python3.12/site-packages/prophet/stan_model/cmdstan-2.33.1/stan/lib/stan_math/lib/tbb_2020.3/src/test/harness_runtime_loader.h create mode 100644 .venv/lib/python3.12/site-packages/prophet/stan_model/cmdstan-2.33.1/stan/lib/stan_math/lib/tbb_2020.3/src/test/harness_state_trackable.h create mode 100644 .venv/lib/python3.12/site-packages/prophet/stan_model/cmdstan-2.33.1/stan/lib/stan_math/lib/tbb_2020.3/src/test/harness_task.h create mode 100644 .venv/lib/python3.12/site-packages/prophet/stan_model/cmdstan-2.33.1/stan/lib/stan_math/lib/tbb_2020.3/src/test/harness_tbb_independence.h create mode 100644 .venv/lib/python3.12/site-packages/prophet/stan_model/cmdstan-2.33.1/stan/lib/stan_math/lib/tbb_2020.3/src/test/harness_test_cases_framework.h create mode 100644 .venv/lib/python3.12/site-packages/prophet/stan_model/cmdstan-2.33.1/stan/lib/stan_math/lib/tbb_2020.3/src/test/harness_tls.h create mode 100644 .venv/lib/python3.12/site-packages/prophet/stan_model/cmdstan-2.33.1/stan/lib/stan_math/lib/tbb_2020.3/src/test/harness_tsx.h create mode 100644 .venv/lib/python3.12/site-packages/prophet/stan_model/cmdstan-2.33.1/stan/lib/stan_math/lib/tbb_2020.3/src/test/test_ScalableAllocator.cpp create mode 100644 .venv/lib/python3.12/site-packages/prophet/stan_model/cmdstan-2.33.1/stan/lib/stan_math/lib/tbb_2020.3/src/test/test_ScalableAllocator_STL.cpp create mode 100644 .venv/lib/python3.12/site-packages/prophet/stan_model/cmdstan-2.33.1/stan/lib/stan_math/lib/tbb_2020.3/src/test/test_aggregator.cpp create mode 100644 .venv/lib/python3.12/site-packages/prophet/stan_model/cmdstan-2.33.1/stan/lib/stan_math/lib/tbb_2020.3/src/test/test_aligned_space.cpp create mode 100644 .venv/lib/python3.12/site-packages/prophet/stan_model/cmdstan-2.33.1/stan/lib/stan_math/lib/tbb_2020.3/src/test/test_allocator.h create mode 100644 .venv/lib/python3.12/site-packages/prophet/stan_model/cmdstan-2.33.1/stan/lib/stan_math/lib/tbb_2020.3/src/test/test_allocator_STL.h create mode 100644 .venv/lib/python3.12/site-packages/prophet/stan_model/cmdstan-2.33.1/stan/lib/stan_math/lib/tbb_2020.3/src/test/test_arena_constraints_hwloc.cpp create mode 100644 .venv/lib/python3.12/site-packages/prophet/stan_model/cmdstan-2.33.1/stan/lib/stan_math/lib/tbb_2020.3/src/test/test_arena_constraints_stubs.cpp create mode 100644 .venv/lib/python3.12/site-packages/prophet/stan_model/cmdstan-2.33.1/stan/lib/stan_math/lib/tbb_2020.3/src/test/test_assembly.cpp create mode 100644 .venv/lib/python3.12/site-packages/prophet/stan_model/cmdstan-2.33.1/stan/lib/stan_math/lib/tbb_2020.3/src/test/test_async_msg.cpp create mode 100644 .venv/lib/python3.12/site-packages/prophet/stan_model/cmdstan-2.33.1/stan/lib/stan_math/lib/tbb_2020.3/src/test/test_async_node.cpp create mode 100644 .venv/lib/python3.12/site-packages/prophet/stan_model/cmdstan-2.33.1/stan/lib/stan_math/lib/tbb_2020.3/src/test/test_atomic.cpp create mode 100644 .venv/lib/python3.12/site-packages/prophet/stan_model/cmdstan-2.33.1/stan/lib/stan_math/lib/tbb_2020.3/src/test/test_blocked_range.cpp create mode 100644 .venv/lib/python3.12/site-packages/prophet/stan_model/cmdstan-2.33.1/stan/lib/stan_math/lib/tbb_2020.3/src/test/test_blocked_range2d.cpp create mode 100644 .venv/lib/python3.12/site-packages/prophet/stan_model/cmdstan-2.33.1/stan/lib/stan_math/lib/tbb_2020.3/src/test/test_blocked_range3d.cpp create mode 100644 .venv/lib/python3.12/site-packages/prophet/stan_model/cmdstan-2.33.1/stan/lib/stan_math/lib/tbb_2020.3/src/test/test_blocked_rangeNd.cpp create mode 100644 .venv/lib/python3.12/site-packages/prophet/stan_model/cmdstan-2.33.1/stan/lib/stan_math/lib/tbb_2020.3/src/test/test_broadcast_node.cpp create mode 100644 .venv/lib/python3.12/site-packages/prophet/stan_model/cmdstan-2.33.1/stan/lib/stan_math/lib/tbb_2020.3/src/test/test_buffer_node.cpp create mode 100644 .venv/lib/python3.12/site-packages/prophet/stan_model/cmdstan-2.33.1/stan/lib/stan_math/lib/tbb_2020.3/src/test/test_cache_aligned_allocator.cpp create mode 100644 .venv/lib/python3.12/site-packages/prophet/stan_model/cmdstan-2.33.1/stan/lib/stan_math/lib/tbb_2020.3/src/test/test_cache_aligned_allocator_STL.cpp create mode 100644 .venv/lib/python3.12/site-packages/prophet/stan_model/cmdstan-2.33.1/stan/lib/stan_math/lib/tbb_2020.3/src/test/test_cilk_common.h create mode 100644 .venv/lib/python3.12/site-packages/prophet/stan_model/cmdstan-2.33.1/stan/lib/stan_math/lib/tbb_2020.3/src/test/test_cilk_dynamic_load.cpp create mode 100644 .venv/lib/python3.12/site-packages/prophet/stan_model/cmdstan-2.33.1/stan/lib/stan_math/lib/tbb_2020.3/src/test/test_cilk_interop.cpp create mode 100644 .venv/lib/python3.12/site-packages/prophet/stan_model/cmdstan-2.33.1/stan/lib/stan_math/lib/tbb_2020.3/src/test/test_combinable.cpp create mode 100644 .venv/lib/python3.12/site-packages/prophet/stan_model/cmdstan-2.33.1/stan/lib/stan_math/lib/tbb_2020.3/src/test/test_composite_node.cpp create mode 100644 .venv/lib/python3.12/site-packages/prophet/stan_model/cmdstan-2.33.1/stan/lib/stan_math/lib/tbb_2020.3/src/test/test_concurrent_associative_common.h create mode 100644 .venv/lib/python3.12/site-packages/prophet/stan_model/cmdstan-2.33.1/stan/lib/stan_math/lib/tbb_2020.3/src/test/test_concurrent_hash_map.cpp create mode 100644 .venv/lib/python3.12/site-packages/prophet/stan_model/cmdstan-2.33.1/stan/lib/stan_math/lib/tbb_2020.3/src/test/test_concurrent_lru_cache.cpp create mode 100644 .venv/lib/python3.12/site-packages/prophet/stan_model/cmdstan-2.33.1/stan/lib/stan_math/lib/tbb_2020.3/src/test/test_concurrent_map.cpp create mode 100644 .venv/lib/python3.12/site-packages/prophet/stan_model/cmdstan-2.33.1/stan/lib/stan_math/lib/tbb_2020.3/src/test/test_concurrent_monitor.cpp create mode 100644 .venv/lib/python3.12/site-packages/prophet/stan_model/cmdstan-2.33.1/stan/lib/stan_math/lib/tbb_2020.3/src/test/test_concurrent_ordered_common.h create mode 100644 .venv/lib/python3.12/site-packages/prophet/stan_model/cmdstan-2.33.1/stan/lib/stan_math/lib/tbb_2020.3/src/test/test_concurrent_priority_queue.cpp create mode 100644 .venv/lib/python3.12/site-packages/prophet/stan_model/cmdstan-2.33.1/stan/lib/stan_math/lib/tbb_2020.3/src/test/test_concurrent_queue.cpp create mode 100644 .venv/lib/python3.12/site-packages/prophet/stan_model/cmdstan-2.33.1/stan/lib/stan_math/lib/tbb_2020.3/src/test/test_concurrent_queue_whitebox.cpp create mode 100644 .venv/lib/python3.12/site-packages/prophet/stan_model/cmdstan-2.33.1/stan/lib/stan_math/lib/tbb_2020.3/src/test/test_concurrent_set.cpp create mode 100644 .venv/lib/python3.12/site-packages/prophet/stan_model/cmdstan-2.33.1/stan/lib/stan_math/lib/tbb_2020.3/src/test/test_concurrent_unordered_common.h create mode 100644 .venv/lib/python3.12/site-packages/prophet/stan_model/cmdstan-2.33.1/stan/lib/stan_math/lib/tbb_2020.3/src/test/test_concurrent_unordered_map.cpp create mode 100644 .venv/lib/python3.12/site-packages/prophet/stan_model/cmdstan-2.33.1/stan/lib/stan_math/lib/tbb_2020.3/src/test/test_concurrent_unordered_set.cpp create mode 100644 .venv/lib/python3.12/site-packages/prophet/stan_model/cmdstan-2.33.1/stan/lib/stan_math/lib/tbb_2020.3/src/test/test_concurrent_vector.cpp create mode 100644 .venv/lib/python3.12/site-packages/prophet/stan_model/cmdstan-2.33.1/stan/lib/stan_math/lib/tbb_2020.3/src/test/test_condition_variable.h create mode 100644 .venv/lib/python3.12/site-packages/prophet/stan_model/cmdstan-2.33.1/stan/lib/stan_math/lib/tbb_2020.3/src/test/test_container_move_support.h create mode 100644 .venv/lib/python3.12/site-packages/prophet/stan_model/cmdstan-2.33.1/stan/lib/stan_math/lib/tbb_2020.3/src/test/test_continue_node.cpp create mode 100644 .venv/lib/python3.12/site-packages/prophet/stan_model/cmdstan-2.33.1/stan/lib/stan_math/lib/tbb_2020.3/src/test/test_critical_section.cpp create mode 100644 .venv/lib/python3.12/site-packages/prophet/stan_model/cmdstan-2.33.1/stan/lib/stan_math/lib/tbb_2020.3/src/test/test_dynamic_link.cpp create mode 100644 .venv/lib/python3.12/site-packages/prophet/stan_model/cmdstan-2.33.1/stan/lib/stan_math/lib/tbb_2020.3/src/test/test_eh_algorithms.cpp create mode 100644 .venv/lib/python3.12/site-packages/prophet/stan_model/cmdstan-2.33.1/stan/lib/stan_math/lib/tbb_2020.3/src/test/test_eh_flow_graph.cpp create mode 100644 .venv/lib/python3.12/site-packages/prophet/stan_model/cmdstan-2.33.1/stan/lib/stan_math/lib/tbb_2020.3/src/test/test_eh_tasks.cpp create mode 100644 .venv/lib/python3.12/site-packages/prophet/stan_model/cmdstan-2.33.1/stan/lib/stan_math/lib/tbb_2020.3/src/test/test_enumerable_thread_specific.cpp create mode 100644 .venv/lib/python3.12/site-packages/prophet/stan_model/cmdstan-2.33.1/stan/lib/stan_math/lib/tbb_2020.3/src/test/test_environment_whitebox.cpp create mode 100644 .venv/lib/python3.12/site-packages/prophet/stan_model/cmdstan-2.33.1/stan/lib/stan_math/lib/tbb_2020.3/src/test/test_examples_common_utility.cpp create mode 100644 .venv/lib/python3.12/site-packages/prophet/stan_model/cmdstan-2.33.1/stan/lib/stan_math/lib/tbb_2020.3/src/test/test_fast_random.cpp create mode 100644 .venv/lib/python3.12/site-packages/prophet/stan_model/cmdstan-2.33.1/stan/lib/stan_math/lib/tbb_2020.3/src/test/test_flow_graph.cpp create mode 100644 .venv/lib/python3.12/site-packages/prophet/stan_model/cmdstan-2.33.1/stan/lib/stan_math/lib/tbb_2020.3/src/test/test_flow_graph_priorities.cpp create mode 100644 .venv/lib/python3.12/site-packages/prophet/stan_model/cmdstan-2.33.1/stan/lib/stan_math/lib/tbb_2020.3/src/test/test_flow_graph_whitebox.cpp create mode 100644 .venv/lib/python3.12/site-packages/prophet/stan_model/cmdstan-2.33.1/stan/lib/stan_math/lib/tbb_2020.3/src/test/test_follows_and_precedes_api.h create mode 100644 .venv/lib/python3.12/site-packages/prophet/stan_model/cmdstan-2.33.1/stan/lib/stan_math/lib/tbb_2020.3/src/test/test_fp.cpp create mode 100644 .venv/lib/python3.12/site-packages/prophet/stan_model/cmdstan-2.33.1/stan/lib/stan_math/lib/tbb_2020.3/src/test/test_function_node.cpp create mode 100644 .venv/lib/python3.12/site-packages/prophet/stan_model/cmdstan-2.33.1/stan/lib/stan_math/lib/tbb_2020.3/src/test/test_global_control.cpp create mode 100644 .venv/lib/python3.12/site-packages/prophet/stan_model/cmdstan-2.33.1/stan/lib/stan_math/lib/tbb_2020.3/src/test/test_global_control_whitebox.cpp create mode 100644 .venv/lib/python3.12/site-packages/prophet/stan_model/cmdstan-2.33.1/stan/lib/stan_math/lib/tbb_2020.3/src/test/test_halt.cpp create mode 100644 .venv/lib/python3.12/site-packages/prophet/stan_model/cmdstan-2.33.1/stan/lib/stan_math/lib/tbb_2020.3/src/test/test_handle_perror.cpp create mode 100644 .venv/lib/python3.12/site-packages/prophet/stan_model/cmdstan-2.33.1/stan/lib/stan_math/lib/tbb_2020.3/src/test/test_hw_concurrency.cpp create mode 100644 .venv/lib/python3.12/site-packages/prophet/stan_model/cmdstan-2.33.1/stan/lib/stan_math/lib/tbb_2020.3/src/test/test_indexer_node.cpp create mode 100644 .venv/lib/python3.12/site-packages/prophet/stan_model/cmdstan-2.33.1/stan/lib/stan_math/lib/tbb_2020.3/src/test/test_initializer_list.h create mode 100644 .venv/lib/python3.12/site-packages/prophet/stan_model/cmdstan-2.33.1/stan/lib/stan_math/lib/tbb_2020.3/src/test/test_inits_loop.cpp create mode 100644 .venv/lib/python3.12/site-packages/prophet/stan_model/cmdstan-2.33.1/stan/lib/stan_math/lib/tbb_2020.3/src/test/test_input_node.cpp create mode 100644 .venv/lib/python3.12/site-packages/prophet/stan_model/cmdstan-2.33.1/stan/lib/stan_math/lib/tbb_2020.3/src/test/test_intrusive_list.cpp create mode 100644 .venv/lib/python3.12/site-packages/prophet/stan_model/cmdstan-2.33.1/stan/lib/stan_math/lib/tbb_2020.3/src/test/test_iterators.cpp create mode 100644 .venv/lib/python3.12/site-packages/prophet/stan_model/cmdstan-2.33.1/stan/lib/stan_math/lib/tbb_2020.3/src/test/test_ittnotify.cpp create mode 100644 .venv/lib/python3.12/site-packages/prophet/stan_model/cmdstan-2.33.1/stan/lib/stan_math/lib/tbb_2020.3/src/test/test_join_node.cpp create mode 100644 .venv/lib/python3.12/site-packages/prophet/stan_model/cmdstan-2.33.1/stan/lib/stan_math/lib/tbb_2020.3/src/test/test_join_node.h create mode 100644 .venv/lib/python3.12/site-packages/prophet/stan_model/cmdstan-2.33.1/stan/lib/stan_math/lib/tbb_2020.3/src/test/test_join_node_key_matching.cpp create mode 100644 .venv/lib/python3.12/site-packages/prophet/stan_model/cmdstan-2.33.1/stan/lib/stan_math/lib/tbb_2020.3/src/test/test_join_node_msg_key_matching.cpp create mode 100644 .venv/lib/python3.12/site-packages/prophet/stan_model/cmdstan-2.33.1/stan/lib/stan_math/lib/tbb_2020.3/src/test/test_lambda.cpp create mode 100644 .venv/lib/python3.12/site-packages/prophet/stan_model/cmdstan-2.33.1/stan/lib/stan_math/lib/tbb_2020.3/src/test/test_limiter_node.cpp create mode 100644 .venv/lib/python3.12/site-packages/prophet/stan_model/cmdstan-2.33.1/stan/lib/stan_math/lib/tbb_2020.3/src/test/test_malloc_atexit.cpp create mode 100644 .venv/lib/python3.12/site-packages/prophet/stan_model/cmdstan-2.33.1/stan/lib/stan_math/lib/tbb_2020.3/src/test/test_malloc_compliance.cpp create mode 100644 .venv/lib/python3.12/site-packages/prophet/stan_model/cmdstan-2.33.1/stan/lib/stan_math/lib/tbb_2020.3/src/test/test_malloc_init_shutdown.cpp create mode 100644 .venv/lib/python3.12/site-packages/prophet/stan_model/cmdstan-2.33.1/stan/lib/stan_math/lib/tbb_2020.3/src/test/test_malloc_lib_unload.cpp create mode 100644 .venv/lib/python3.12/site-packages/prophet/stan_model/cmdstan-2.33.1/stan/lib/stan_math/lib/tbb_2020.3/src/test/test_malloc_new_handler.cpp create mode 100644 .venv/lib/python3.12/site-packages/prophet/stan_model/cmdstan-2.33.1/stan/lib/stan_math/lib/tbb_2020.3/src/test/test_malloc_overload.cpp create mode 100644 .venv/lib/python3.12/site-packages/prophet/stan_model/cmdstan-2.33.1/stan/lib/stan_math/lib/tbb_2020.3/src/test/test_malloc_overload_disable.cpp create mode 100644 .venv/lib/python3.12/site-packages/prophet/stan_model/cmdstan-2.33.1/stan/lib/stan_math/lib/tbb_2020.3/src/test/test_malloc_pools.cpp create mode 100644 .venv/lib/python3.12/site-packages/prophet/stan_model/cmdstan-2.33.1/stan/lib/stan_math/lib/tbb_2020.3/src/test/test_malloc_pure_c.c create mode 100644 .venv/lib/python3.12/site-packages/prophet/stan_model/cmdstan-2.33.1/stan/lib/stan_math/lib/tbb_2020.3/src/test/test_malloc_regression.cpp create mode 100644 .venv/lib/python3.12/site-packages/prophet/stan_model/cmdstan-2.33.1/stan/lib/stan_math/lib/tbb_2020.3/src/test/test_malloc_shutdown_hang.cpp create mode 100644 .venv/lib/python3.12/site-packages/prophet/stan_model/cmdstan-2.33.1/stan/lib/stan_math/lib/tbb_2020.3/src/test/test_malloc_used_by_lib.cpp create mode 100644 .venv/lib/python3.12/site-packages/prophet/stan_model/cmdstan-2.33.1/stan/lib/stan_math/lib/tbb_2020.3/src/test/test_malloc_whitebox.cpp create mode 100644 .venv/lib/python3.12/site-packages/prophet/stan_model/cmdstan-2.33.1/stan/lib/stan_math/lib/tbb_2020.3/src/test/test_model_plugin.cpp create mode 100644 .venv/lib/python3.12/site-packages/prophet/stan_model/cmdstan-2.33.1/stan/lib/stan_math/lib/tbb_2020.3/src/test/test_multifunction_node.cpp create mode 100644 .venv/lib/python3.12/site-packages/prophet/stan_model/cmdstan-2.33.1/stan/lib/stan_math/lib/tbb_2020.3/src/test/test_mutex.cpp create mode 100644 .venv/lib/python3.12/site-packages/prophet/stan_model/cmdstan-2.33.1/stan/lib/stan_math/lib/tbb_2020.3/src/test/test_mutex_native_threads.cpp create mode 100644 .venv/lib/python3.12/site-packages/prophet/stan_model/cmdstan-2.33.1/stan/lib/stan_math/lib/tbb_2020.3/src/test/test_opencl_kernel_32.spir create mode 100644 .venv/lib/python3.12/site-packages/prophet/stan_model/cmdstan-2.33.1/stan/lib/stan_math/lib/tbb_2020.3/src/test/test_opencl_kernel_64.spir create mode 100644 .venv/lib/python3.12/site-packages/prophet/stan_model/cmdstan-2.33.1/stan/lib/stan_math/lib/tbb_2020.3/src/test/test_opencl_node.cl create mode 100644 .venv/lib/python3.12/site-packages/prophet/stan_model/cmdstan-2.33.1/stan/lib/stan_math/lib/tbb_2020.3/src/test/test_opencl_node.cpp create mode 100644 .venv/lib/python3.12/site-packages/prophet/stan_model/cmdstan-2.33.1/stan/lib/stan_math/lib/tbb_2020.3/src/test/test_opencl_precompiled_kernel_gpu_32.ir create mode 100644 .venv/lib/python3.12/site-packages/prophet/stan_model/cmdstan-2.33.1/stan/lib/stan_math/lib/tbb_2020.3/src/test/test_opencl_precompiled_kernel_gpu_64.ir create mode 100644 .venv/lib/python3.12/site-packages/prophet/stan_model/cmdstan-2.33.1/stan/lib/stan_math/lib/tbb_2020.3/src/test/test_openmp.cpp create mode 100644 .venv/lib/python3.12/site-packages/prophet/stan_model/cmdstan-2.33.1/stan/lib/stan_math/lib/tbb_2020.3/src/test/test_overwrite_node.cpp create mode 100644 .venv/lib/python3.12/site-packages/prophet/stan_model/cmdstan-2.33.1/stan/lib/stan_math/lib/tbb_2020.3/src/test/test_parallel_do.cpp create mode 100644 .venv/lib/python3.12/site-packages/prophet/stan_model/cmdstan-2.33.1/stan/lib/stan_math/lib/tbb_2020.3/src/test/test_parallel_for.cpp create mode 100644 .venv/lib/python3.12/site-packages/prophet/stan_model/cmdstan-2.33.1/stan/lib/stan_math/lib/tbb_2020.3/src/test/test_parallel_for_each.cpp create mode 100644 .venv/lib/python3.12/site-packages/prophet/stan_model/cmdstan-2.33.1/stan/lib/stan_math/lib/tbb_2020.3/src/test/test_parallel_for_vectorization.cpp create mode 100644 .venv/lib/python3.12/site-packages/prophet/stan_model/cmdstan-2.33.1/stan/lib/stan_math/lib/tbb_2020.3/src/test/test_parallel_invoke.cpp create mode 100644 .venv/lib/python3.12/site-packages/prophet/stan_model/cmdstan-2.33.1/stan/lib/stan_math/lib/tbb_2020.3/src/test/test_parallel_pipeline.cpp create mode 100644 .venv/lib/python3.12/site-packages/prophet/stan_model/cmdstan-2.33.1/stan/lib/stan_math/lib/tbb_2020.3/src/test/test_parallel_reduce.cpp create mode 100644 .venv/lib/python3.12/site-packages/prophet/stan_model/cmdstan-2.33.1/stan/lib/stan_math/lib/tbb_2020.3/src/test/test_parallel_scan.cpp create mode 100644 .venv/lib/python3.12/site-packages/prophet/stan_model/cmdstan-2.33.1/stan/lib/stan_math/lib/tbb_2020.3/src/test/test_parallel_sort.cpp create mode 100644 .venv/lib/python3.12/site-packages/prophet/stan_model/cmdstan-2.33.1/stan/lib/stan_math/lib/tbb_2020.3/src/test/test_parallel_while.cpp create mode 100644 .venv/lib/python3.12/site-packages/prophet/stan_model/cmdstan-2.33.1/stan/lib/stan_math/lib/tbb_2020.3/src/test/test_partitioner.h create mode 100644 .venv/lib/python3.12/site-packages/prophet/stan_model/cmdstan-2.33.1/stan/lib/stan_math/lib/tbb_2020.3/src/test/test_partitioner_whitebox.cpp create mode 100644 .venv/lib/python3.12/site-packages/prophet/stan_model/cmdstan-2.33.1/stan/lib/stan_math/lib/tbb_2020.3/src/test/test_partitioner_whitebox.h create mode 100644 .venv/lib/python3.12/site-packages/prophet/stan_model/cmdstan-2.33.1/stan/lib/stan_math/lib/tbb_2020.3/src/test/test_pipeline.cpp create mode 100644 .venv/lib/python3.12/site-packages/prophet/stan_model/cmdstan-2.33.1/stan/lib/stan_math/lib/tbb_2020.3/src/test/test_pipeline_with_tbf.cpp create mode 100644 .venv/lib/python3.12/site-packages/prophet/stan_model/cmdstan-2.33.1/stan/lib/stan_math/lib/tbb_2020.3/src/test/test_priority_queue_node.cpp create mode 100644 .venv/lib/python3.12/site-packages/prophet/stan_model/cmdstan-2.33.1/stan/lib/stan_math/lib/tbb_2020.3/src/test/test_queue_node.cpp create mode 100644 .venv/lib/python3.12/site-packages/prophet/stan_model/cmdstan-2.33.1/stan/lib/stan_math/lib/tbb_2020.3/src/test/test_range_based_for.h create mode 100644 .venv/lib/python3.12/site-packages/prophet/stan_model/cmdstan-2.33.1/stan/lib/stan_math/lib/tbb_2020.3/src/test/test_reader_writer_lock.cpp create mode 100644 .venv/lib/python3.12/site-packages/prophet/stan_model/cmdstan-2.33.1/stan/lib/stan_math/lib/tbb_2020.3/src/test/test_resumable_tasks.cpp create mode 100644 .venv/lib/python3.12/site-packages/prophet/stan_model/cmdstan-2.33.1/stan/lib/stan_math/lib/tbb_2020.3/src/test/test_runtime_loader.cpp create mode 100644 .venv/lib/python3.12/site-packages/prophet/stan_model/cmdstan-2.33.1/stan/lib/stan_math/lib/tbb_2020.3/src/test/test_rwm_upgrade_downgrade.cpp create mode 100644 .venv/lib/python3.12/site-packages/prophet/stan_model/cmdstan-2.33.1/stan/lib/stan_math/lib/tbb_2020.3/src/test/test_semaphore.cpp create mode 100644 .venv/lib/python3.12/site-packages/prophet/stan_model/cmdstan-2.33.1/stan/lib/stan_math/lib/tbb_2020.3/src/test/test_sequencer_node.cpp create mode 100644 .venv/lib/python3.12/site-packages/prophet/stan_model/cmdstan-2.33.1/stan/lib/stan_math/lib/tbb_2020.3/src/test/test_source_node.cpp create mode 100644 .venv/lib/python3.12/site-packages/prophet/stan_model/cmdstan-2.33.1/stan/lib/stan_math/lib/tbb_2020.3/src/test/test_split_node.cpp create mode 100644 .venv/lib/python3.12/site-packages/prophet/stan_model/cmdstan-2.33.1/stan/lib/stan_math/lib/tbb_2020.3/src/test/test_static_assert.cpp create mode 100644 .venv/lib/python3.12/site-packages/prophet/stan_model/cmdstan-2.33.1/stan/lib/stan_math/lib/tbb_2020.3/src/test/test_std_thread.cpp create mode 100644 .venv/lib/python3.12/site-packages/prophet/stan_model/cmdstan-2.33.1/stan/lib/stan_math/lib/tbb_2020.3/src/test/test_streaming_node.cpp create mode 100644 .venv/lib/python3.12/site-packages/prophet/stan_model/cmdstan-2.33.1/stan/lib/stan_math/lib/tbb_2020.3/src/test/test_tagged_msg.cpp create mode 100644 .venv/lib/python3.12/site-packages/prophet/stan_model/cmdstan-2.33.1/stan/lib/stan_math/lib/tbb_2020.3/src/test/test_task.cpp create mode 100644 .venv/lib/python3.12/site-packages/prophet/stan_model/cmdstan-2.33.1/stan/lib/stan_math/lib/tbb_2020.3/src/test/test_task_arena.cpp create mode 100644 .venv/lib/python3.12/site-packages/prophet/stan_model/cmdstan-2.33.1/stan/lib/stan_math/lib/tbb_2020.3/src/test/test_task_assertions.cpp create mode 100644 .venv/lib/python3.12/site-packages/prophet/stan_model/cmdstan-2.33.1/stan/lib/stan_math/lib/tbb_2020.3/src/test/test_task_auto_init.cpp create mode 100644 .venv/lib/python3.12/site-packages/prophet/stan_model/cmdstan-2.33.1/stan/lib/stan_math/lib/tbb_2020.3/src/test/test_task_enqueue.cpp create mode 100644 .venv/lib/python3.12/site-packages/prophet/stan_model/cmdstan-2.33.1/stan/lib/stan_math/lib/tbb_2020.3/src/test/test_task_group.cpp create mode 100644 .venv/lib/python3.12/site-packages/prophet/stan_model/cmdstan-2.33.1/stan/lib/stan_math/lib/tbb_2020.3/src/test/test_task_leaks.cpp create mode 100644 .venv/lib/python3.12/site-packages/prophet/stan_model/cmdstan-2.33.1/stan/lib/stan_math/lib/tbb_2020.3/src/test/test_task_priority.cpp create mode 100644 .venv/lib/python3.12/site-packages/prophet/stan_model/cmdstan-2.33.1/stan/lib/stan_math/lib/tbb_2020.3/src/test/test_task_scheduler_init.cpp create mode 100644 .venv/lib/python3.12/site-packages/prophet/stan_model/cmdstan-2.33.1/stan/lib/stan_math/lib/tbb_2020.3/src/test/test_task_scheduler_observer.cpp create mode 100644 .venv/lib/python3.12/site-packages/prophet/stan_model/cmdstan-2.33.1/stan/lib/stan_math/lib/tbb_2020.3/src/test/test_task_steal_limit.cpp create mode 100644 .venv/lib/python3.12/site-packages/prophet/stan_model/cmdstan-2.33.1/stan/lib/stan_math/lib/tbb_2020.3/src/test/test_tbb_condition_variable.cpp create mode 100644 .venv/lib/python3.12/site-packages/prophet/stan_model/cmdstan-2.33.1/stan/lib/stan_math/lib/tbb_2020.3/src/test/test_tbb_fork.cpp create mode 100644 .venv/lib/python3.12/site-packages/prophet/stan_model/cmdstan-2.33.1/stan/lib/stan_math/lib/tbb_2020.3/src/test/test_tbb_header.cpp create mode 100644 .venv/lib/python3.12/site-packages/prophet/stan_model/cmdstan-2.33.1/stan/lib/stan_math/lib/tbb_2020.3/src/test/test_tbb_thread.cpp create mode 100644 .venv/lib/python3.12/site-packages/prophet/stan_model/cmdstan-2.33.1/stan/lib/stan_math/lib/tbb_2020.3/src/test/test_tbb_version.cpp create mode 100644 .venv/lib/python3.12/site-packages/prophet/stan_model/cmdstan-2.33.1/stan/lib/stan_math/lib/tbb_2020.3/src/test/test_thread.h create mode 100644 .venv/lib/python3.12/site-packages/prophet/stan_model/cmdstan-2.33.1/stan/lib/stan_math/lib/tbb_2020.3/src/test/test_tick_count.cpp create mode 100644 .venv/lib/python3.12/site-packages/prophet/stan_model/cmdstan-2.33.1/stan/lib/stan_math/lib/tbb_2020.3/src/test/test_tuple.cpp create mode 100644 .venv/lib/python3.12/site-packages/prophet/stan_model/cmdstan-2.33.1/stan/lib/stan_math/lib/tbb_2020.3/src/test/test_write_once_node.cpp create mode 100644 .venv/lib/python3.12/site-packages/prophet/stan_model/cmdstan-2.33.1/stan/lib/stan_math/lib/tbb_2020.3/src/test/test_yield.cpp create mode 100644 .venv/lib/python3.12/site-packages/prophet/stan_model/cmdstan-2.33.1/stan/lib/stan_math/lib/tbb_2020.3/third-party-programs.txt create mode 100755 .venv/lib/python3.12/site-packages/prophet/stan_model/prophet create mode 100644 .venv/lib/python3.12/site-packages/prophet/stan_model/prophet.hpp create mode 100644 .venv/lib/python3.12/site-packages/prophet/stan_model/prophet.stan create mode 100755 .venv/lib/python3.12/site-packages/prophet/stan_model/prophet_model.bin create mode 100644 .venv/lib/python3.12/site-packages/prophet/tests/__init__.py create mode 100644 .venv/lib/python3.12/site-packages/prophet/tests/__pycache__/__init__.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/prophet/tests/__pycache__/conftest.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/prophet/tests/__pycache__/test_diagnostics.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/prophet/tests/__pycache__/test_prophet.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/prophet/tests/__pycache__/test_serialize.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/prophet/tests/__pycache__/test_utilities.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/prophet/tests/conftest.py create mode 100644 .venv/lib/python3.12/site-packages/prophet/tests/data.csv create mode 100644 .venv/lib/python3.12/site-packages/prophet/tests/data2.csv create mode 100644 .venv/lib/python3.12/site-packages/prophet/tests/data3.csv create mode 100644 .venv/lib/python3.12/site-packages/prophet/tests/serialized_model_v0.6.1.dev0.json create mode 100644 .venv/lib/python3.12/site-packages/prophet/tests/serialized_model_v0.7.1.json create mode 100644 .venv/lib/python3.12/site-packages/prophet/tests/serialized_model_v1.0.1.json create mode 100644 .venv/lib/python3.12/site-packages/prophet/tests/test_diagnostics.py create mode 100644 .venv/lib/python3.12/site-packages/prophet/tests/test_prophet.py create mode 100644 .venv/lib/python3.12/site-packages/prophet/tests/test_serialize.py create mode 100644 .venv/lib/python3.12/site-packages/prophet/tests/test_utilities.py create mode 100644 .venv/lib/python3.12/site-packages/prophet/utilities.py create mode 100644 .venv/lib/python3.12/site-packages/stanio-0.5.1.dist-info/INSTALLER create mode 100644 .venv/lib/python3.12/site-packages/stanio-0.5.1.dist-info/LICENSE create mode 100644 .venv/lib/python3.12/site-packages/stanio-0.5.1.dist-info/METADATA create mode 100644 .venv/lib/python3.12/site-packages/stanio-0.5.1.dist-info/RECORD create mode 100644 .venv/lib/python3.12/site-packages/stanio-0.5.1.dist-info/WHEEL create mode 100644 .venv/lib/python3.12/site-packages/stanio-0.5.1.dist-info/top_level.txt create mode 100644 .venv/lib/python3.12/site-packages/stanio/__init__.py create mode 100644 .venv/lib/python3.12/site-packages/stanio/__pycache__/__init__.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/stanio/__pycache__/csv.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/stanio/__pycache__/json.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/stanio/__pycache__/reshape.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/stanio/csv.py create mode 100644 .venv/lib/python3.12/site-packages/stanio/json.py create mode 100644 .venv/lib/python3.12/site-packages/stanio/py.typed create mode 100644 .venv/lib/python3.12/site-packages/stanio/reshape.py create mode 100644 .venv/lib/python3.12/site-packages/tqdm-4.67.1.dist-info/INSTALLER create mode 100644 .venv/lib/python3.12/site-packages/tqdm-4.67.1.dist-info/LICENCE create mode 100644 .venv/lib/python3.12/site-packages/tqdm-4.67.1.dist-info/METADATA create mode 100644 .venv/lib/python3.12/site-packages/tqdm-4.67.1.dist-info/RECORD create mode 100644 .venv/lib/python3.12/site-packages/tqdm-4.67.1.dist-info/WHEEL create mode 100644 .venv/lib/python3.12/site-packages/tqdm-4.67.1.dist-info/entry_points.txt create mode 100644 .venv/lib/python3.12/site-packages/tqdm-4.67.1.dist-info/top_level.txt create mode 100644 .venv/lib/python3.12/site-packages/tqdm/__init__.py create mode 100644 .venv/lib/python3.12/site-packages/tqdm/__main__.py create mode 100644 .venv/lib/python3.12/site-packages/tqdm/__pycache__/__init__.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/tqdm/__pycache__/__main__.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/tqdm/__pycache__/_dist_ver.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/tqdm/__pycache__/_main.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/tqdm/__pycache__/_monitor.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/tqdm/__pycache__/_tqdm.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/tqdm/__pycache__/_tqdm_gui.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/tqdm/__pycache__/_tqdm_notebook.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/tqdm/__pycache__/_tqdm_pandas.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/tqdm/__pycache__/_utils.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/tqdm/__pycache__/asyncio.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/tqdm/__pycache__/auto.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/tqdm/__pycache__/autonotebook.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/tqdm/__pycache__/cli.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/tqdm/__pycache__/dask.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/tqdm/__pycache__/gui.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/tqdm/__pycache__/keras.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/tqdm/__pycache__/notebook.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/tqdm/__pycache__/rich.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/tqdm/__pycache__/std.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/tqdm/__pycache__/tk.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/tqdm/__pycache__/utils.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/tqdm/__pycache__/version.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/tqdm/_dist_ver.py create mode 100644 .venv/lib/python3.12/site-packages/tqdm/_main.py create mode 100644 .venv/lib/python3.12/site-packages/tqdm/_monitor.py create mode 100644 .venv/lib/python3.12/site-packages/tqdm/_tqdm.py create mode 100644 .venv/lib/python3.12/site-packages/tqdm/_tqdm_gui.py create mode 100644 .venv/lib/python3.12/site-packages/tqdm/_tqdm_notebook.py create mode 100644 .venv/lib/python3.12/site-packages/tqdm/_tqdm_pandas.py create mode 100644 .venv/lib/python3.12/site-packages/tqdm/_utils.py create mode 100644 .venv/lib/python3.12/site-packages/tqdm/asyncio.py create mode 100644 .venv/lib/python3.12/site-packages/tqdm/auto.py create mode 100644 .venv/lib/python3.12/site-packages/tqdm/autonotebook.py create mode 100644 .venv/lib/python3.12/site-packages/tqdm/cli.py create mode 100755 .venv/lib/python3.12/site-packages/tqdm/completion.sh create mode 100644 .venv/lib/python3.12/site-packages/tqdm/contrib/__init__.py create mode 100644 .venv/lib/python3.12/site-packages/tqdm/contrib/__pycache__/__init__.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/tqdm/contrib/__pycache__/bells.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/tqdm/contrib/__pycache__/concurrent.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/tqdm/contrib/__pycache__/discord.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/tqdm/contrib/__pycache__/itertools.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/tqdm/contrib/__pycache__/logging.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/tqdm/contrib/__pycache__/slack.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/tqdm/contrib/__pycache__/telegram.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/tqdm/contrib/__pycache__/utils_worker.cpython-312.pyc create mode 100644 .venv/lib/python3.12/site-packages/tqdm/contrib/bells.py create mode 100644 .venv/lib/python3.12/site-packages/tqdm/contrib/concurrent.py create mode 100644 .venv/lib/python3.12/site-packages/tqdm/contrib/discord.py create mode 100644 .venv/lib/python3.12/site-packages/tqdm/contrib/itertools.py create mode 100644 .venv/lib/python3.12/site-packages/tqdm/contrib/logging.py create mode 100644 .venv/lib/python3.12/site-packages/tqdm/contrib/slack.py create mode 100644 .venv/lib/python3.12/site-packages/tqdm/contrib/telegram.py create mode 100644 .venv/lib/python3.12/site-packages/tqdm/contrib/utils_worker.py create mode 100644 .venv/lib/python3.12/site-packages/tqdm/dask.py create mode 100644 .venv/lib/python3.12/site-packages/tqdm/gui.py create mode 100644 .venv/lib/python3.12/site-packages/tqdm/keras.py create mode 100644 .venv/lib/python3.12/site-packages/tqdm/notebook.py create mode 100644 .venv/lib/python3.12/site-packages/tqdm/rich.py create mode 100644 .venv/lib/python3.12/site-packages/tqdm/std.py create mode 100644 .venv/lib/python3.12/site-packages/tqdm/tk.py create mode 100644 .venv/lib/python3.12/site-packages/tqdm/tqdm.1 create mode 100644 .venv/lib/python3.12/site-packages/tqdm/utils.py create mode 100644 .venv/lib/python3.12/site-packages/tqdm/version.py create mode 100644 models/__init__.py create mode 100644 models/__pycache__/__init__.cpython-312.pyc create mode 100644 models/__pycache__/plotting.cpython-312.pyc create mode 100644 models/__pycache__/time_series.cpython-312.pyc create mode 100644 models/plotting.py create mode 100644 models/time_series.py create mode 100644 utils/__init__.py create mode 100644 utils/__pycache__/__init__.cpython-312.pyc create mode 100644 utils/__pycache__/file_handling.cpython-312.pyc create mode 100644 utils/__pycache__/forecast_history.cpython-312.pyc create mode 100644 utils/file_handling.py create mode 100644 utils/forecast_history.py diff --git a/.venv/bin/install_cmdstan b/.venv/bin/install_cmdstan new file mode 100755 index 00000000..bb8bdd0f --- /dev/null +++ b/.venv/bin/install_cmdstan @@ -0,0 +1,8 @@ +#!/home/ilgazc/PycharmProjects/TimeSeriesAnalysis/.venv/bin/python3.12 +# -*- coding: utf-8 -*- +import re +import sys +from cmdstanpy.install_cmdstan import __main__ +if __name__ == '__main__': + sys.argv[0] = re.sub(r'(-script\.pyw|\.exe)?$', '', sys.argv[0]) + sys.exit(__main__()) diff --git a/.venv/bin/install_cxx_toolchain b/.venv/bin/install_cxx_toolchain new file mode 100755 index 00000000..7af0181c --- /dev/null +++ b/.venv/bin/install_cxx_toolchain @@ -0,0 +1,8 @@ +#!/home/ilgazc/PycharmProjects/TimeSeriesAnalysis/.venv/bin/python3.12 +# -*- coding: utf-8 -*- +import re +import sys +from cmdstanpy.install_cxx_toolchain import __main__ +if __name__ == '__main__': + sys.argv[0] = re.sub(r'(-script\.pyw|\.exe)?$', '', sys.argv[0]) + sys.exit(__main__()) diff --git a/.venv/bin/tqdm b/.venv/bin/tqdm new file mode 100755 index 00000000..4bc322f1 --- /dev/null +++ b/.venv/bin/tqdm @@ -0,0 +1,8 @@ +#!/home/ilgazc/PycharmProjects/TimeSeriesAnalysis/.venv/bin/python3.12 +# -*- coding: utf-8 -*- +import re +import sys +from tqdm.cli import main +if __name__ == '__main__': + sys.argv[0] = re.sub(r'(-script\.pyw|\.exe)?$', '', sys.argv[0]) + sys.exit(main()) diff --git a/.venv/lib/python3.12/site-packages/cmdstanpy-1.2.5.dist-info/INSTALLER b/.venv/lib/python3.12/site-packages/cmdstanpy-1.2.5.dist-info/INSTALLER new file mode 100644 index 00000000..a1b589e3 --- /dev/null +++ b/.venv/lib/python3.12/site-packages/cmdstanpy-1.2.5.dist-info/INSTALLER @@ -0,0 +1 @@ +pip diff --git a/.venv/lib/python3.12/site-packages/cmdstanpy-1.2.5.dist-info/LICENSE.md b/.venv/lib/python3.12/site-packages/cmdstanpy-1.2.5.dist-info/LICENSE.md new file mode 100644 index 00000000..04a3a9df --- /dev/null +++ b/.venv/lib/python3.12/site-packages/cmdstanpy-1.2.5.dist-info/LICENSE.md @@ -0,0 +1,15 @@ +BSD 3-Clause License + +Copyright (c) 2019, Stan Developers and their Assignees +All rights reserved. + +Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: + +* Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. + +* Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. + +* Neither the name of the copyright holder nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + diff --git a/.venv/lib/python3.12/site-packages/cmdstanpy-1.2.5.dist-info/METADATA b/.venv/lib/python3.12/site-packages/cmdstanpy-1.2.5.dist-info/METADATA new file mode 100644 index 00000000..16131638 --- /dev/null +++ b/.venv/lib/python3.12/site-packages/cmdstanpy-1.2.5.dist-info/METADATA @@ -0,0 +1,102 @@ +Metadata-Version: 2.1 +Name: cmdstanpy +Version: 1.2.5 +Summary: Python interface to CmdStan +Author: Stan Dev Team +License: BSD-3-Clause +Project-URL: Homepage, https://github.com/stan-dev/cmdstanpy +Project-URL: Bug Tracker, https://github.com/stan-dev/cmdstanpy/issues +Classifier: Programming Language :: Python :: 3 +Classifier: License :: OSI Approved :: BSD License +Classifier: Operating System :: OS Independent +Classifier: Development Status :: 5 - Production/Stable +Classifier: Intended Audience :: Science/Research +Classifier: Natural Language :: English +Classifier: Programming Language :: Python +Classifier: Topic :: Scientific/Engineering :: Information Analysis +Requires-Python: >=3.8 +Description-Content-Type: text/markdown +License-File: LICENSE.md +Requires-Dist: pandas +Requires-Dist: numpy>=1.21 +Requires-Dist: tqdm +Requires-Dist: stanio<2.0.0,>=0.4.0 +Provides-Extra: all +Requires-Dist: xarray; extra == "all" +Provides-Extra: test +Requires-Dist: flake8; extra == "test" +Requires-Dist: pylint; extra == "test" +Requires-Dist: pytest; extra == "test" +Requires-Dist: pytest-cov; extra == "test" +Requires-Dist: pytest-order; extra == "test" +Requires-Dist: mypy; extra == "test" +Requires-Dist: xarray; extra == "test" +Provides-Extra: docs +Requires-Dist: sphinx<6,>5; extra == "docs" +Requires-Dist: pydata-sphinx-theme<0.9; extra == "docs" +Requires-Dist: nbsphinx; extra == "docs" +Requires-Dist: ipython; extra == "docs" +Requires-Dist: ipykernel; extra == "docs" +Requires-Dist: ipywidgets; extra == "docs" +Requires-Dist: sphinx-copybutton; extra == "docs" +Requires-Dist: xarray; extra == "docs" +Requires-Dist: matplotlib; extra == "docs" + +# CmdStanPy + +[![codecov](https://codecov.io/gh/stan-dev/cmdstanpy/branch/master/graph/badge.svg)](https://codecov.io/gh/stan-dev/cmdstanpy) + + +CmdStanPy is a lightweight pure-Python interface to CmdStan which provides access to the Stan compiler and all inference algorithms. It supports both development and production workflows. Because model development and testing may require many iterations, the defaults favor development mode and therefore output files are stored on a temporary filesystem. Non-default options allow all aspects of a run to be specified so that scripts can be used to distributed analysis jobs across nodes and machines. + +CmdStanPy is distributed via PyPi: https://pypi.org/project/cmdstanpy/ + +or Conda Forge: https://anaconda.org/conda-forge/cmdstanpy + +### Goals + +- Clean interface to Stan services so that CmdStanPy can keep up with Stan releases. + +- Provide access to all CmdStan inference methods. + +- Easy to install, + + minimal Python library dependencies: numpy, pandas + + Python code doesn't interface directly with c++, only calls compiled executables + +- Modular - CmdStanPy produces a MCMC sample (or point estimate) from the posterior; other packages do analysis and visualization. + +- Low memory overhead - by default, minimal memory used above that required by CmdStanPy; objects run CmdStan programs and track CmdStan input and output files. + + +### Source Repository + +CmdStanPy and CmdStan are available from GitHub: https://github.com/stan-dev/cmdstanpy and https://github.com/stan-dev/cmdstan + + +### Docs + +The latest release documentation is hosted on https://mc-stan.org/cmdstanpy, older release versions are available from readthedocs: https://cmdstanpy.readthedocs.io + +### Licensing + +The CmdStanPy, CmdStan, and the core Stan C++ code are licensed under new BSD. + +### Example + +```python +import os +from cmdstanpy import cmdstan_path, CmdStanModel + +# specify locations of Stan program file and data +stan_file = os.path.join(cmdstan_path(), 'examples', 'bernoulli', 'bernoulli.stan') +data_file = os.path.join(cmdstan_path(), 'examples', 'bernoulli', 'bernoulli.data.json') + +# instantiate a model; compiles the Stan program by default +model = CmdStanModel(stan_file=stan_file) + +# obtain a posterior sample from the model conditioned on the data +fit = model.sample(chains=4, data=data_file) + +# summarize the results (wraps CmdStan `bin/stansummary`): +fit.summary() +``` diff --git a/.venv/lib/python3.12/site-packages/cmdstanpy-1.2.5.dist-info/RECORD b/.venv/lib/python3.12/site-packages/cmdstanpy-1.2.5.dist-info/RECORD new file mode 100644 index 00000000..83170cf6 --- /dev/null +++ b/.venv/lib/python3.12/site-packages/cmdstanpy-1.2.5.dist-info/RECORD @@ -0,0 +1,60 @@ +../../../bin/install_cmdstan,sha256=wXQ7YJaxaA94uHRfLPrP1r4l4y3WbOu-Oq8hesC6GRs,284 +../../../bin/install_cxx_toolchain,sha256=OQqGRHSWnIewU1OYztVUdB9b1p71QR_jvOPdIDCi_uA,290 +cmdstanpy-1.2.5.dist-info/INSTALLER,sha256=zuuue4knoyJ-UwPPXg8fezS7VCrXJQrAP7zeNuwvFQg,4 +cmdstanpy-1.2.5.dist-info/LICENSE.md,sha256=idyB5B6vvYuD6l6IVtMLDi0q-IUMmhKkS5MnM8XgTvI,1526 +cmdstanpy-1.2.5.dist-info/METADATA,sha256=0ScvA_iMXhi1MwJj_3dH1Dcm2w8unLHbv8K1Y7RtfV4,4050 +cmdstanpy-1.2.5.dist-info/RECORD,, +cmdstanpy-1.2.5.dist-info/WHEEL,sha256=PZUExdf71Ui_so67QXpySuHtCi3-J3wvF4ORK6k_S8U,91 +cmdstanpy-1.2.5.dist-info/entry_points.txt,sha256=jMCL_dUqeodJmm8BtARyRkIvkL2m8AvIwpoduddo01Y,136 +cmdstanpy-1.2.5.dist-info/top_level.txt,sha256=DymymE6zsANoee61D6GcZ9I2c9H2zrrgv12IP1Ob_nA,10 +cmdstanpy/__init__.py,sha256=VA2CIWvIFkE9FXFUi0DXnAlIDpzuDXGn66lMOX13tv4,1290 +cmdstanpy/__pycache__/__init__.cpython-312.pyc,, +cmdstanpy/__pycache__/_version.cpython-312.pyc,, +cmdstanpy/__pycache__/cmdstan_args.cpython-312.pyc,, +cmdstanpy/__pycache__/compilation.cpython-312.pyc,, +cmdstanpy/__pycache__/install_cmdstan.cpython-312.pyc,, +cmdstanpy/__pycache__/install_cxx_toolchain.cpython-312.pyc,, +cmdstanpy/__pycache__/model.cpython-312.pyc,, +cmdstanpy/__pycache__/progress.cpython-312.pyc,, +cmdstanpy/_version.py,sha256=zN4cqI6KhD4VXPuuWSYE-PKGpLSwPmM8qkOM-67JsyQ,42 +cmdstanpy/cmdstan_args.py,sha256=rKpQrym_ltoa3Qa0mUJMR6jI1v4_mhjmtTd-jlX24ig,39752 +cmdstanpy/compilation.py,sha256=rBTbFiTxautFRx_cWWdZN30h8W4iKsaVreBhBp3QYC4,20806 +cmdstanpy/install_cmdstan.py,sha256=61mVVIC7Bggl1oC7EZvi914uc9tJmqfSTPYWUSE0X54,23553 +cmdstanpy/install_cxx_toolchain.py,sha256=xNyxwUeYyM5vJjnxporefK77SsQUvvM78JeZnFQtKdI,11704 +cmdstanpy/model.py,sha256=5HtQvSnmkVYOJVH7aekF9NKZQmUz8VzthqoxJYGkCyY,89664 +cmdstanpy/progress.py,sha256=k5OQgEpUgh8p7VfMNX23uQcaoKuHA_mJ2XGOAKjUJyY,1317 +cmdstanpy/py.typed,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0 +cmdstanpy/stanfit/__init__.py,sha256=WxvdlTPU1XvxGOIqIF5OKR71O538TDGcBFBE_NLrgAg,10356 +cmdstanpy/stanfit/__pycache__/__init__.cpython-312.pyc,, +cmdstanpy/stanfit/__pycache__/gq.cpython-312.pyc,, +cmdstanpy/stanfit/__pycache__/laplace.cpython-312.pyc,, +cmdstanpy/stanfit/__pycache__/mcmc.cpython-312.pyc,, +cmdstanpy/stanfit/__pycache__/metadata.cpython-312.pyc,, +cmdstanpy/stanfit/__pycache__/mle.cpython-312.pyc,, +cmdstanpy/stanfit/__pycache__/pathfinder.cpython-312.pyc,, +cmdstanpy/stanfit/__pycache__/runset.cpython-312.pyc,, +cmdstanpy/stanfit/__pycache__/vb.cpython-312.pyc,, +cmdstanpy/stanfit/gq.py,sha256=ppUEuOqA7bUnxuahKSqvJ80NB52dBoYVdetqIRpeloM,26049 +cmdstanpy/stanfit/laplace.py,sha256=8St71_dKSQTFw7LKCUGxviGufiMAzlb4IZ2jZ1lcQBI,9618 +cmdstanpy/stanfit/mcmc.py,sha256=l2sc4gjLm7cvCZNNgN4EPzMEVbbYc7Gu6vyJ1FtyMqg,31735 +cmdstanpy/stanfit/metadata.py,sha256=kcQ5-shQ_F3RYAbguc5V_SzWP8KWi2pWrObxFLWpPjg,1596 +cmdstanpy/stanfit/mle.py,sha256=aAk7M1cDhRI-6GRbdqqAcsVVReFhKxReUWSEllTADuM,10458 +cmdstanpy/stanfit/pathfinder.py,sha256=Iz-JjZyDkJ8IGbZDr0_Tnjh0iEGlClNiB89sqFRVXn8,8322 +cmdstanpy/stanfit/runset.py,sha256=0nD_Aq5Jyl6cID-MNWHS-ZFJ786osJR9NmJBqs7JcS0,10851 +cmdstanpy/stanfit/vb.py,sha256=kJvjsUqy9O7pKWQoVaS0R4bh7DpBKk-aD1iq_QpSktA,8502 +cmdstanpy/utils/__init__.py,sha256=irzAF4bKE-NNWoAJKKH0VNKPnFjUBsWkylfdzX6YYpo,3740 +cmdstanpy/utils/__pycache__/__init__.cpython-312.pyc,, +cmdstanpy/utils/__pycache__/cmdstan.cpython-312.pyc,, +cmdstanpy/utils/__pycache__/command.cpython-312.pyc,, +cmdstanpy/utils/__pycache__/data_munging.cpython-312.pyc,, +cmdstanpy/utils/__pycache__/filesystem.cpython-312.pyc,, +cmdstanpy/utils/__pycache__/json.cpython-312.pyc,, +cmdstanpy/utils/__pycache__/logging.cpython-312.pyc,, +cmdstanpy/utils/__pycache__/stancsv.cpython-312.pyc,, +cmdstanpy/utils/cmdstan.py,sha256=uRHFVB955k_nFbR02DUpX-q9xVZzYqnKjjmMJD6L9xk,19196 +cmdstanpy/utils/command.py,sha256=1nPeOI8Gn6r-WAb3TAe1mqweK-1K0aJRmMulYwdWxNk,3229 +cmdstanpy/utils/data_munging.py,sha256=Gw764AKLIzWu9LvO-N7CgUjcIzUOnVANX6khkb-m1Gk,1245 +cmdstanpy/utils/filesystem.py,sha256=t4HHG0IESmUVraF_WlSQs8JRzkGBKJUsj2gSCdt4UHQ,7099 +cmdstanpy/utils/json.py,sha256=rFQwxTr4OCTUMhBAuCNLQY4rRrwY5m1c9ufw0081_XM,132 +cmdstanpy/utils/logging.py,sha256=PipH_4YiZdoe5C9bTf5GEPhoI7zPHRx4VPe4AUCbHvw,699 +cmdstanpy/utils/stancsv.py,sha256=oB1V4dvDgCywoADew39wrbTrSZVXZXvoq3xFUvsiOZ4,16455 diff --git a/.venv/lib/python3.12/site-packages/cmdstanpy-1.2.5.dist-info/WHEEL b/.venv/lib/python3.12/site-packages/cmdstanpy-1.2.5.dist-info/WHEEL new file mode 100644 index 00000000..ae527e7d --- /dev/null +++ b/.venv/lib/python3.12/site-packages/cmdstanpy-1.2.5.dist-info/WHEEL @@ -0,0 +1,5 @@ +Wheel-Version: 1.0 +Generator: setuptools (75.6.0) +Root-Is-Purelib: true +Tag: py3-none-any + diff --git a/.venv/lib/python3.12/site-packages/cmdstanpy-1.2.5.dist-info/entry_points.txt b/.venv/lib/python3.12/site-packages/cmdstanpy-1.2.5.dist-info/entry_points.txt new file mode 100644 index 00000000..5fda0886 --- /dev/null +++ b/.venv/lib/python3.12/site-packages/cmdstanpy-1.2.5.dist-info/entry_points.txt @@ -0,0 +1,3 @@ +[console_scripts] +install_cmdstan = cmdstanpy.install_cmdstan:__main__ +install_cxx_toolchain = cmdstanpy.install_cxx_toolchain:__main__ diff --git a/.venv/lib/python3.12/site-packages/cmdstanpy-1.2.5.dist-info/top_level.txt b/.venv/lib/python3.12/site-packages/cmdstanpy-1.2.5.dist-info/top_level.txt new file mode 100644 index 00000000..242dea1f --- /dev/null +++ b/.venv/lib/python3.12/site-packages/cmdstanpy-1.2.5.dist-info/top_level.txt @@ -0,0 +1 @@ +cmdstanpy diff --git a/.venv/lib/python3.12/site-packages/cmdstanpy/__init__.py b/.venv/lib/python3.12/site-packages/cmdstanpy/__init__.py new file mode 100644 index 00000000..4e3c134e --- /dev/null +++ b/.venv/lib/python3.12/site-packages/cmdstanpy/__init__.py @@ -0,0 +1,66 @@ +# pylint: disable=wrong-import-position +"""CmdStanPy Module""" + +import atexit +import shutil +import tempfile + +_TMPDIR = tempfile.mkdtemp() +_CMDSTAN_WARMUP = 1000 +_CMDSTAN_SAMPLING = 1000 +_CMDSTAN_THIN = 1 +_CMDSTAN_REFRESH = 100 +_DOT_CMDSTAN = '.cmdstan' + + +def _cleanup_tmpdir() -> None: + """Force deletion of _TMPDIR.""" + shutil.rmtree(_TMPDIR, ignore_errors=True) + + +atexit.register(_cleanup_tmpdir) + + +from ._version import __version__ # noqa +from .compilation import compile_stan_file, format_stan_file +from .install_cmdstan import rebuild_cmdstan +from .model import CmdStanModel +from .stanfit import ( + CmdStanGQ, + CmdStanLaplace, + CmdStanMCMC, + CmdStanMLE, + CmdStanPathfinder, + CmdStanVB, + from_csv, +) +from .utils import ( + cmdstan_path, + cmdstan_version, + install_cmdstan, + set_cmdstan_path, + set_make_env, + show_versions, + write_stan_json, +) + +__all__ = [ + 'set_cmdstan_path', + 'cmdstan_path', + 'set_make_env', + 'install_cmdstan', + 'compile_stan_file', + 'format_stan_file', + 'CmdStanMCMC', + 'CmdStanMLE', + 'CmdStanGQ', + 'CmdStanVB', + 'CmdStanLaplace', + 'CmdStanPathfinder', + 'CmdStanModel', + 'from_csv', + 'write_stan_json', + 'show_versions', + 'rebuild_cmdstan', + 'cmdstan_version', +] diff --git a/.venv/lib/python3.12/site-packages/cmdstanpy/__pycache__/__init__.cpython-312.pyc b/.venv/lib/python3.12/site-packages/cmdstanpy/__pycache__/__init__.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..9fd8f4dbe0f97c350dc954d5e2236678ce168119 GIT binary patch literal 1552 zcmY+E&u<$=6vt=Rj_vqI)^>h7N#myFhb8ceazhnTNYXY^Y)oQ6n#*XrGmbae*|laj zDbC4}Div|!fYduDQ20-{6oDWbR6$h^^j3&aq@I|!*-c>N{my&OZ+7N=W@f)HmGVfn zSLPS}{1`&d!AV*wHqJ5{LXQze7*UPtu7pV)0|u46L=!B$6bS$ahX?eCGzub zl~3Zy$S$~3d>T(jcF~>Tvv`)z;W<8!=Xnj+_yS(wi+GVQ;iV|2;c$wF6omX*{ zU&q(^3SQwi@C|+w-_+19q7z?h__d+lC?A#AINb>?uQRN-e0t!r7qGy#^QXe~0+#!N zDmltEZB7G~XT#q~ODhAgp1r5!F$&}I5Zcp|l&e03?5I)gJN+ci(9kf|NFUYi_`+s& z%3KyYzE}5qb<%Bh);G7C-G(Mh&aUSRMwk%32-=O5%mn>|&~ar(@K7)&vvK;j=nUp~ z)i?V-XQt!sT1U3o8QOhI@Q(2Jm>mXY*Wql335Nx%p5+b$Cor3b%sVt)=e{`@hJD|A zxB1R3GjKxo_Q10Dtz8zFF@nL+B*gKYkdWqJC=Ft}%<>KfB;*6?2vJh=m(>%1jL;wH z{G--!>#H}unff{16a^Jj6%`0MWFkyn$->nA^z8@z}rnk(`LlEoLAM? z6_5obih4${@IZL&#_Q_*5bE26$cz=T&zw+XRf^1oj1QvS$nt#(ju?lyLDpL9JKfbb z`E+%=^>Ig5E(1HOtrfqhPwAQ+p>J=Zg1S#-q^V(i)8)7ZW4`7jm!zQ>ja_V zpG%;K37D{OaXu`#9RDdlq5&1jF%J75RV=e`hjPaZ9;y`-6u{UZylndxmD7qtdVNGk(w4 zK7aFyP?Z^D$D0^C+85yTjb5Bs^v|JgLPA6xcpz^6PKPsMObj^I3M_PH5d1M?L tUm8E5`ac<@t^9^=KSggnMa$=UPSekklD|OCtN(NVo|-J^$JuC={{n7PnXLc- literal 0 HcmV?d00001 diff --git a/.venv/lib/python3.12/site-packages/cmdstanpy/__pycache__/_version.cpython-312.pyc b/.venv/lib/python3.12/site-packages/cmdstanpy/__pycache__/_version.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..75f28d2acfdfa78bf336421abf97132a5e472f0c GIT binary patch literal 257 zcmX@j%ge<81i$pVGPHp7V-N=h7@>^MJV3^Dh7^V|m%79FTu+*aB z%>2A6Rzp1_JySnTrd#as@hSPq@$t8~2lQe2XlS5T=Bvrn&}@)n0pZhlH>PO4oIJJ4c~M~ZoY W#0O?ZM#h^ALJ#;v8@Y>Efg%7mn@ZRK literal 0 HcmV?d00001 diff --git a/.venv/lib/python3.12/site-packages/cmdstanpy/__pycache__/cmdstan_args.cpython-312.pyc b/.venv/lib/python3.12/site-packages/cmdstanpy/__pycache__/cmdstan_args.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..6a7ca8a4485dd66fc5cda5bd71950213bb4ff669 GIT binary patch literal 46458 zcmeIbdvqIDnjcso01^a10wloq3w#qK#fM0}_>yQ*Ps_C1k~?E|x7joSNu)_oU4SGD zqHL+BXV&WWjLCLqL{58-sEkfb#hSG=>ic?sxxnPL5T;^LhLCPagcSApDXX z{K=Fp55opQxFYz35y5BhWlR}H40s!-GNz3q#%a@t$w2<5Df6^>#LVpGsm$rDk*sOU zh-Er^BzxLAVx6{)*rx3xcJ@7EDrY1YVKS#2)6Nkm^UIpbo6aA}XLie!YuY{Ho-P|1fSJ!e8(t3 zj8yn+{wyCt`*Hx8>C63|X{0j6&jG(G7TSr>dGBP%VLi+*AAT;yubTO};a8ye)iA$8 z_!TLBwal*=ekF=u9rG)NUzy@p&-}{aSE2YdoXhZ5hF#XZ)4rpjv4CexJaKy39|#4l zzoL{4do$vueSy={anso8(2Um*H-#pq{oc&DaWHT$ZW@{x55-MKCW4`O)>C7rPE7<( z#4S&s3Qf!e#-`%t=K`=Gkj>{mK6ZL4G%5y8z?n6A?5Ssl4m}Gr_VH<75D|}_8Vj9_ z7joAbzZgW&(HH&4XGA~zMgLgHKN=XD_WMRd{+C0e$0w%zaq9_xXmo1k#0kF`w*kaA zI_(dM6XS8mS#bjJ4D)1gCNM4)vt-I;E<8L1_Z7h}puGtr89u{^F+=d1-jQKP%t@}y zBv)3F%aY{EPI6g&8GhUG44)A-Z$D@9n&X*I`9mjXeBr92r%#=l5kr2ThZjGRk1rm| zXRs}vDf&aF#lSeahw_+VqXzfz85rm^hFM`!`KVeZc_vja;m7D)fHrBoWGlWH|Hyn) z@S29>hQ7F=Ep8a_8spicqvKO!!Qkj<+%n1vA2t&ujv7MHKXp7vN%MR@)qZkj+TT7g zbz&?$-u}$F@snfX^fThjq<=gVY(It;bJQ9ee-zKYKpn*d4L#en@#9_U4G?c*m`yqti3K(^G!r%sx8$ zozr7els~w#Mn`=!4^Z9^ z#A>|6Dl!VVLBmUM0LJ%(k4)ab&dK}1*Dvn>$l?0InTrQMDy{r+L&Q|{QGVf@4HuvM zC^!EH$1fiED6inn!i$F!CWCp8VWIX@f!-2o!WuW98Jjxo7b_@+LKx%PmZ7w!*YV|w zFe_YoBBZpoSs|prhLlz_$%k!(;Lq_4KA?#1S+vQQN)cIZD4TzuHT+ocW&BabJ2LL? z8qNtRUyaFM(Go?9{PQBu^yy&8^P=B#f{g*9Cv+0yR7cpYe3&`z37tFT_e=yr=v~%{ z;6#8r{({9?_KD(*cq2pHf*4rI1Su|$hgC-0erg6yapH`B z6rn_#2O9AU9)odFSj)0UvWnMj1#|wl#;DdLtEm zEBXBqd%va@fL?j1W76}m6smsdaK_v{M@mlo-yAT)&*z$o}dKWHXOHMz!yi)Vy-xSDxSj}>?5rrY{4;f zK>3>~baEmP&zT;3c{C*Y{XYLGEEY25xjs7>@}C+FPK5pO92Uu_KX3w5h%auFoId|l zXe{oO920?w(CDd?V?lr1CHY8bM$b+Jd^2a`4#`u+X*)jgG8P@D#>BDdxD`vGQOs@_ zVWh#-K`lgnXbfT9_SdkW+hS@S<==!^OueJ(&}xKB8C+*ga8XG1%$ng+hTGXpxM-MW z4^8)@N>^vDEdFga3*VH^KWl+Y9e}gpVk>cip0&cIc5fS8b_I(at{lac16MA0vG|l6 z&*tKrlYcvBxRLRB{vnj^#Ml(-!ZY(C&Hin}-aN4%Kq5_Q;%+kbkTFQc6ENa7xdLbm zR~)pw6ZaC#5E=W(*iXg*G7ge)2u9rDn;1J0mCqDB9S_JFFf2rJ;IY~>Vl!tn* z9z35?89tqK17B8Jd^+$+_;m6Me3rEMbl{Wl>6KHtFFP$h9e5R=TC20kwMy&Dl;_fK zqx5wAeb$%ILW0ejwx$dB#oJ%7PEDWBrkg|EnE2w9zrRacEB%x=p=}r8t4=FRYV-Ca zT*WCx1Lvi00gH~mZt3X2eaX_vNmDvHG4Y)6_je5;+Gw!{d7#Zy%HzxBEyf@u!P3~A z^7tGoEUp*CA8noUg|539b9n|PYUF8ws2mT05%Pc-e#nWjW_ z(#uPdzfq#J&tQ*!d>nGt@X`*%+op*(PdDC8W8^vIF(578&81~X_!fG@H_?|b7%!M+ zO>)aMyl&T|E?+lwMxP;!NM@CCR%16|D>~WCQ=q=*OqV`RY6m(np;ivhb0x0oWAnMr z2x7JmTh`Gc9%jxI__H+71q`|{1^TTt&_xUyb5|1X-wAc_m?mi}l=4i{Rw(7s$Ir_u zX|yZREoa@5R!k$)y>{@+Fm*K4z4WGJeb%0}mft z!?Yh{k5a>L`AYS1pD`qj$Ynge$S*Aq*%MOM*ORnLO?mY3`buf@#j#E9NeQI+_GQW| zL`z`yglHYi9$&ey;$|hMI$y{P(UO=wv{%sUHN2Dz0^3b!%ew!uWlhUi_Jj^{n@aAP z%MkxBO>5APUEcNRj9OKC?RE3`c)oZopiZCUY4mx%mu3tZ65f%4c(^%(Sad?Tkd-v% z>5MEK9%J6BGUi!kEf=!U`m)i|Dl}tWwO-z4E ze=m5gubOAAY&NRWiS#tYD4uy3z0_+*0!27DXY_MTe>5U&r1Dc*1}r~$B9() zR{Pas)^CeSiJ&e1r?0Lp2EL^!nR>mF2|dkwg#O$hl@TwQ)Hhm`LPPR3{3iHQF>*KC zUFq$@dwrlz>Fu}2GhWVkiKq%@iMkMM2pF)lP}A3_mp*-5JQe)SQlqmcXZtf9f8G6= z4%}vUBI=Bqw4Q59lOvs&cux46>%>A-!-95tuOkxooJC;W}xrQJh6!+Waw_Os@gV$l z)-V_Q;P2s~)%V2?`0Mn?uZ$|Er3JRCC2-Do&gk6|{X*?M=A);1L^VXM@sx**ZB*r@)yPq>G7Pu5H40dRkjHGQl@@MVvn$oMe0X|O+p_S z!#2E|aadV-YS=ppgK*3fmBojf&3oTQq~M=kC_jWEtcxJAXL6XRLK4Fe>f81tHnc|3F@Bc9RL5jXj#{L@LC>g>J~{s6kJI1p~sGJzm;G2w&A zQd{5D%s6`BK$`;iZ;-YiQCRg;vYA_`nCfx4PddT^hPsyIRurLGOPNPY}B1 zrUcyKAQv}!Nvr)JgA6gm{=2v5kop}$TT+) zAPsVVdMLn}2yfcTRME=%*_a1&-pq*r7^yxELj2KIWiazkfU_=o#O@ge~Jm;ZrB1vKAVyciqf**LuSmsp*P2y6`hT;Q^eW9>~&FR zUBub?z~NeTR7V}vOV33e&1;2w=ZtHvqE%OI)KwdCwXc=7ua<6)mTtclyfd`gcO=?( zWTo_}xxEagDe7v9xVqO$yH`tlqouuT#bpb}Rx7qfE4Cs@WrcHl6Pbd$c-7Ssb+trX zJJw2ftd2t+@0G4uA~0u2ungu)LC==C;0`eZ#Ue@yYsaV3O>wU*?Jg( zt4a}VNom3?)DI-=D9|^0FZV`mHOSXO-PM-Gmg~WoqXiA_O7DDcq^3KH7T4H5H}ng4 z-C9A(m2b>{BT~0BTCj7iu_M`Yd$eFXhy1v#;_8mY9ajey2bSwd2rpK)9chYqdse-J zQSab~b${9Nvz8U_@Ji*=k>aP<%NmwKZ=b(*exd~mh=K(ze8O3}eN)4Hp0F7)QECBqK~SSIed>mE=JWA3{3 z@~!K|Rm+w;MX272{JCu4%kwN{qcVGM^v0Y!)@oblOuuk?)D+ddXI`$jm$!pqy>fp3 z{EDk~>C9c%7P)Ho81C=c|Fg{X@~S1%+qP@AmGai*<4EwJq4c5IOfAEVWZTg)qJ{hK z)cv&O&s$as_uq5vUu)}_JF<>y550T-#`#~=_bz5H7#6m#ZSPyKt(7${pO2RHtk<-n z@~b=UcWl3%dFwlOI&Yu;vmDfXZ6#{Hq7uEWykg1lhuha{8`nKGZ(FZfmwRu`Mq7qf zJo{EXPewh|uUy!Nw(hB0I{k+i)*Ct!85#9E{&q+I?K5jl-sQm? z=H<|>=YVQw!^5o1#+rnXSzYsKu2A2*?rFSb`H)JpzI1^~v!rP``&MtPc=uXy-D+`5 zw76yY(7odAi5)^i-={kTjB{z*1KJB(=6XSKwD`cC?w|JldGAW`fqMl9)@tkZ3TnN| zyWH?zZLDg0qXv=cE&Dz^zOv=1m73v5 z`S4mu0iM16x}96l+?@Rv;SUkS7Hm5Put_l2Tl27 zX%OnU-?Qg~hV^pKlKbtlYh}w{yH>eU-hp)WYMWgyhWtc^v7q&{Okqpcjs5R+WBjpw zU|Z=LT4~+)FxyPSu^Gd0E*p;djNo$5g;t9iqeYD|SIcrW42<6>iUQAlPs6p$rO;~Q zj%eeK70*tzMRnw-5#1BDc_Ow}Hlo)>9d%3Jx$9_p&&o!0no#*T8)@8$M$@T|=uP*V z+HPbnhgRE%qU}Q~P5U;Wu8rDiBP4{4`KmGMXk5m8)$*P+U(x)0v+KQ#_pP_Bk>*~Y z?p9HI?|a*C6y7qeb{vd$99;1p+JL$$YO9LaS{UlusH1ji?5?BnW|*a#ru*x`n@_xZ z_{QN#!w#VCP*GRiuc}`>v*cTC=!rJ;tW;^|A&WE*jn0oQO~ou-(wuwORbEz^-NRp}3f&a0f9s^)FX)B!aq{RuDTHV7fsW=t+SrxIE zmnNO2q#Rn*5ZsnFHIU-f6UE<#)` z$Pw$wXl}@r4n6&Xmmz)AFplqaQpbRfP!`H*a^4u<4(q%EH`p>@kge`Lr>YJ-rHOMS%r zGR0%O%j0I_8)WO7K;%~%=5zbrq z`7tZsQ6XF^*%X09=3r) zG!gLk2Tq5AVJjV9VMkZ`!`Z|dpd%~&;Vg;T(I3{5J^JHjMl<>xlpA)IrN2|Pc7!t- z@v!?~dIOpnUm;L99Cg@tn{Qxeg<|NI57TMWThI+elBNvKCN z4$%jdmefJc88V(AgUCh_eTe8$x+gOx=)++cH;fX|=N0mJ6-JQO6sS*$Sd)bsq#6yo zw4`&{a|BC^;6KJ10mmn>TC%@ky=j1vb>6!0JodG(Tze(busu??R zNJDR=tS{#5CuG?3M{G4b!lEVjYISF{x-;V08Y$|E*}J8jNVJ}HigLBGEn3<3o+;+q z#v}daa@}fkPqeuw;w8-Yoc%mn<;$I}X!CA5@>n()b3Ubg^g2IDa9LMJ|g_SenQtn^kZW%>^${Cv4=hbEq70Y>-Sc5x#J>L%V@94e;h<1%!CkUYuw+_#?wW1+ zSfr#A)SW~DeJKP{{qb2zV_WTduwKJhR^FzGJ+->r?WTs(?y=96#luMI=2B|1FHBb34M$er^Lx^IQ&^iheM&wpd@Z5bq~{+%D|lo zhMOUj5W?|Du%>8Q9@}shbVi02+XkqO$4yV{KX5c|dhz&)VBCC!Im}bcl{xG`8=48k zGXv~BK>Z?~6`GkE1#c>DAAw)iGX63Gw59cFgwxFQb%LVA5gzNqD3_;**jCY9P#ef9D2HFfHnNz|!<7270DMk&ubvfF1w>RJ$wwuQ^zAQz9l*oBM` z9hqg%ELQP+FMrYSx>L>7Yz9<9m{n@ecMa^!4-cq$KQc9$Og@;-;t@+S<+)^2<1r?b2FDH6kwFD=r*>g=d}8aebNygGYcpOu#d@M_bbvxD{7(!lEMOnvq= zupXXv_3g_^154|Zlqcx~pSB!y%36DZ5A%Za^8t0=_C+N6c*hTKeP+s!Q~C-IU70vM z%5V+IJ_s)aaMt{|=NsoQeCzX!R?h(SC-Dbl{2q+qa0f&wzH@p)gs>4bhlJG7Bvlvm zhnRdFW*;UbK@$%P7w*>17@I)B<}A%n`N&byo6knpcrMo_Gdg(Wz|%)1)<5l@;-<+N zXgn}a&78$llugMRoe4~xi)TUO(O3v7WN6Y6d&r|AjZ<2o<@q0vM%XcHLfj3J4g&Z>gpsuUs>fseWVIZ#Akqt7-!)3fwx)QfYm6aNP}wWAKaCB44$aN6LGXM{_vvGf%z-lg*(>dVaKhG;>)}z;D2*EJ!wi6KXPkQ<8ex zbP}0fS@@`F*pN=0=`Jl!I)D96@?K!5c6-Lvvc3P!XaBzagCpSzaxl zv^a@DpaZ`Fr_QvS7AFz=b>KJP)H$r5ma${wiy=nZ)S1}RhExvq%OuL2&j)0Z6@<(s ziX?P=kuWgrfVgHivXkVqhA8R50DBsG-og%<7|Ex&&#lT7*Z;Xq-P81c&UQW6{`7yY z>|vOT?SW`F)Bkync5~DJxmDR6;gfbw>;K$Lo16Y{Udl!XL{2N;%=C9cQCbMqF6{*V zm~3pmNjJ+#^OCw*pzQ#s0=`Y5H&6i?MI-D^TG-3w`3stOUSSi@1Bs>-an;2v^+cD! z9K^|5prgG#d~J9Y@+x&ZA#@X|?Tr-m#q5j%2Kr6J*1$nQ0epM(+9*VZB1PL{_8o+& z?{Z(nR?8uZm+Ibbz1F%^87bhE$Ai~va=yv^=`y;kGj;3U(`|bW~ z{Y&i{`c-+*(xh$NL zl}#?IP+FO=kEio#R z8QMxSq3X-x%L28>;>-0}lyBs3f`(J`NVcq4%<4C>P?>(&1}cypR3IBvfH~r}BV(tg z#>OQgP#s7?vI?*OY3q_$G*c3U%&LL2reAMvdY>!)FQm`>=UU5@~|@k_Y<~q&QPZ4Q@@26iUPYO|6lN z0ZU;tr4mM0kO>F{rJxi@bYPJd*-2CaiU12c;o+acfQBWQ(xbQk*ISff3e;In@kuOL ztT_isdTVrGwbLc`z&4%&KaQe7z_r z3xV30rH*r&o?Ga?x@&RQ0>q&kAk|B=de8TJ_#_H;5=lQU%tne@WA-g1Om*S=7t%~~ z8NAFiI{T+cyGX{bsc}+cr|GN>W5_|n5yK}&2!pP_Zf^*$DsgH z)?wNBC@zKy+cvz3#c({A81G>A2S-`gh-Wi59lVJ%J>^%!ewZZ{lgD32nb>N$_i{^8_V-vL^{x3iv{*;Ul z$@m!=|0@~)f{dS&@h@S3d&}mZO>BBLi7`lZ!l|76tzmH#sqG8PsGzd+aMBof24S)E zs1wTSvGj1PeGyj1gUVLoaFlTl2Uiv;Gd$$45308kRHdS8k{BWPWG%&ySl76byd=$$ zx||J2jLOXl6mSfM(t{O<&ZMPXfh57|OkO@k!Ep*+9rBV-(KnU?t3w9znbV|KX^=b* z#HrQ5YB(TzBo=TZ)N;_m>X1&7xDi@dw;DIMC2=FPu!S5#eJ61vw6HqFkR)z|7FLhT zq2WfH%kk!lR}trz>5{|1p;EfjQXaNbG>j~swkQ5MKsK%-Q+pg=NOn_?`w4>Ju-FEY z@!t!P7zE~zr4va_(SoK(b5G3DD=kc4n15mE8;s)24lH@21>Q(YU(C|4`&kZs&(gc8 zh3x-^-nXfRtZtu9OSbzG3*59gzl4l;TAV~y))`YaESh!3lC(I#g!Fe>oJ3aE8KX9& zQ)g^Si<8L8I`A8CDw8a_gZ!k$Nn~Xm_zgIcUe$%wca0gF{-+DxemIzBWc0j-x1E$F4_A#u-Xh!YQDPFX1ZN= zVah5~-e~WqDG&GFV9HZA+O(slbFu#;QqtMEtjegZGGc4yY?mKPNvj za;OmwVs}6^l1>omLD%0%-3OT;o{(OJ342W=@c}BTKdG)Udmn%dPegt*?4Ys8#QZFB zL5x)rBh4n4l@s%A{;@ zB61ZI7W!5~u2LSZj9leHxhGLUwn`FntsKZ zRKkcT(idVHWP@d3fhejHhTA}1u_B}uqCoa|;Q{E#A?*`iJ3ST%;f4r*khZqr4qZM0 zDbyigx{OJN<~)OV_IU6NQxYLvzcHLdV@I=*XzVnplbj`p1F%WYIfHlvHe6igl*lEc z3M%NHVSD_4jqgdj1L9MKtMn7E?8_-cklH5RA@efk^~;8VaD)FR!)}qA|!vUE;dPL z8WXpY3fqIimKE(VH6uz4;kpfsf|L-XS!@_L3H=`^j8uj}H~CG#;KEH*<~Yn6Jd;dV zX3T)ckl`&?Nt~_yaVM}?IgZzYRmP7cnA6i^gy#WikA>!xKv&i>2$Gh z?(vBbuA-A9se}FK6l^KNiv4#GIJrb=01sED=^FB4;&-S(w*ipJjY%hXp!_6e>ELwx z7w81cu4vt^JGIfefk^G{h-**GGN^K$B~rXimlV%<$80vCeySd*NPkY^UlAM`rzmB_ zPoNp5Ct=C}RlRO0c+CsBGIR4S(?fb;a%gP%#Ar9?uVKm{J}%iADIV`cd8Twa055(z z09JlF09I)fpy-kY-y(R>^YAW=)WO$hJee^9{WKf@e1$j@z&W>>ut}!_vJ@NfZY95L z*rb8ls`%L;$!}Nua}@tv#pb|pU+8mUP`6^ZF9Lm?=ijDJ{E1@*};4>K)k-_X{#u8^l0>c6 z!s<{?lBm@#lpuS6*UjzfJBeDY#j8V=NTOD2@fNH2xGjlVt;MTDbx5LCYhiWh3|eaS zIRj3k5CwWT+?^s(t{s3BfxA?ha&ZY^)AyK^UgnVGy7M&GfToIei~ooaZr8!uLw;&6 zPC+d%QfY;gv`A%Zn+;u&FKUR*5d7Z}23;{1r~lpk3zWvQfes zVXvgnyHg3;`l~Aw^2r8*w_t8+b@l%fv{7W*CoRG7zaK$ce+8@@=V3B3IwWkdFO4L; zR>_I(FnXyYO-N!s=nT8bgxIu7E3)}Ui=|j+NKRY!M5xw*PmUKb`P!P4>}hclp;`xi z15TakAT3TJRO`T};3OHM9BDt2FYiY*BeD2TkZ|!&VT5zEi#;e}(609S!zL{E`o-@O z^ly{#Ju-;28@4K|z5cKxdAZk*bx?=^)2@St=qp=AC6B*inmtfa>LN(q{QR5--roih zD{1r77_&5OipaMK1q7QB175Xl2I`HSmv=@KVc-QfWaUmSo?IA-6cK@tZ`SmW^V1Q2 z2vog#`PB#%UCR0ho`dxB?rXcDQ!`T5eb2e=aR>hOC8{?;Qhh8XRNYE?tr7*3j^<0- z%3R%Tg)AZ4R<<23H1{dnVc6Mr81KZ^ za%nq^7vB!U%D2O?N{e?YmvQ`*r%bjzG@+o9x5KHMVCiOM5@42&$4i@Bwh_g_b`tEu zb~MMI>vtTNwx?O}b%G+9C*Q1Wf>@YzSF&{DGN)&9-)z8J{P_rh`-+(RKiHDcd}|AsUy5t#E-a1AqB%WnjyUOVJ>BT>xkaD@4*{8-&>; z+i@%IQ_dVI1OcuzZj%pK`kj4*{V60&paHeqJUOj6sskuQ2x+ekW8jq`= z*a;QfkbpY{psQEjcC&jGSS+MXN7em&_T&WAvX4s#`swtfUk;$E*%{-4-cp>yaVtrI zPK}Zt?0B|h_rDA)Q#^x{Z$Wm$FI4r6A}CZ3Lr3~p+!TbAc-%|}U4n6|JYtg;c}sBO z1jxMrbTf7u$+iVTqrP*%KQSJR+nMhvafVa{$Frbv9>Q=Zr9FL)(!>No*&#Md3&SMJ z@FVy1SoUacW~RHCX_3huChSH8J;_D)Eh|z4vvk&;li8*FmKEs%cGjLt>I+QRjfNWu z3uF;g(YFw_LD@f~?1{MKkXRT}_C9+0s(?vZGz9)S30DortBb3Se^uW}xPFp^tARu5 z;%eew)pruEf0%@;nM3K~YUN+mcM`6dBwTGAN*7lL|Ej)|a2-m*wUtBZ;_BvK)pruE zTJ;7joaNu8LUCJ&q}ADjyD%{f(v$jTXZ3aV+mrngyw;pG;?6^&WV2`1$Z-V>>MhJ{ z5vmjR9XS-F{=o|npMo>&c`iWrq0ES&56eRU4JjBBpyFGi&wIqb2Bi2mWc-qhe@Di@ zC*yC)_zz_Kij4nA#(yH?Ka=q>8B`mR7MlXH)x%)dyJMVShk!(CWQ=kvHj<4^vDCDf zOtt7G+dn6R8jyO5T0Bk83uH{fz^aq+c~Vl!Qn1P725D5`+!6NHNN&0{!?r>T`;W8; zXhfxA9oWXjHf6Gw{F2pE$S*oZ^1781#N@LjbvsEYvszJ7ku3MQZY!93>3VO>*1lfq zxw>U>%WFfw_vCs`(Sq&zH)A=_lkByihR6WqL0%8Dk-IzFre&!fv5^_}`WI%T-d zO>LJJ-4?N_(*LdjCG_aD)uyHlS0C!)4$=6^9`(XSUTVCyd5K&wYA!`Jss!6@f&ok_ zpMm~3EJ{zULmG)w9(5vOlaDe%t6-PD6{7tXdysY=h>$WBhm>h|l8C7(k9wh=h%*9u zn4~@{YU{_ArhatNp_CIwc6!*@LEFTX2iH|=bEE_D8|0`GInu!-k3y7Ry{~qrs#BZa zoHY5>3B57D>Y@b)N0sZ_#VMxNN?Dld^h=#ZhtK(#wyi8?)Zz^da(imqeGIO>Je>MY zkBeVa%UbM^8iLy{cB$7d^K{TP=#z&yg!=ZGe0e_8&3uk?@=5g@w{aX8ZIwm(oB@}p zYFm*`Iy9~52*>r99-l|J)nyCHsxA<4}{g@F(VO@*e=m|P8N-ZX74lYYm(mJ7ep85N` zhI59;=5b@o`J<#TBWmurEku$+>`_`<3G$-@Ir##IRNt7D(QASekB#NqJPeN|IQ$#6 z=|_}Q(nz1KO+O;MwxrK(rnHs0i04WCKQ}R!maFk3jaH9HSrXhMMzsxNX@y>UOTzXQ z#L9E8=1adn$iknQzd^k#S3@x2Pj%0sU&{)#nj#2)qDIddY6X?77$SNJdyZ$+fw}^* zR26fUUdbU}o7qcdd^f{qxRCKm##zHz;br6V!db-Ii5>J=C`NrAdkcdwm-%`V|Ds-Z zzabUYuQnCl$}uaJ^j1#e`AsEYCjt;MlOdxlD8BOhl?n_ z5ZD5YoUg_j&X+vsqC;YOf&}jqsk4M#xHgvVKb5W{1=SxSyy5b3(GT*ykLO&;T#u(d z7;fJn2COY0x)f8otQMh&;Mf*!J*r%;tTGHd6SzMa$r)3NPJ+%j+Y;XKm?-2s8(Hxa zgG7mH0DKsx&c;(Ca~QO@L_&c*B-+)hj3upJ>gAVhzsjdF8B~#QriKPf097CIpMch6 zeu-wMbcyCp716J-;1zyFbdK=zddPU8YqgG@fl>k7h#mCwdA7D~-PYfsUAh2tYjbng)-9TAK-<^_ z(Ni>n{I^&C+p9()eC!A~RK%cCZzZLc9pv|CqDv4j|1@hiXK~vCsv2z#7lH>*%>;au z6@IU&!eD9(9~xHf8kVrJ4*1whhFPDY!c#97)?PVEpLKIh3G^%VmL~7wH>lnk)Iuc2 zmx@kS7>CH|hD$9RV~VMONjFc2pW)@lpya_sZpXh_*?nCtJ1x%5m7q36azT1KCH_D+ zN?%(4NQ@38b;iLVPcBT?ZvIQR~cj4=^$iz1MJiE*h_x2)}WY2PSZr-_)OgX z>}i}5nfC7!#TjVreg;=xOa!UXOCIKlAVNq&cP$hN5i#SY8Qf7C&lLUBGiSh^-1qXh zA9~4W0uoQ6gWzZ@tGShx@h<4(dprv_g9Om@;+7YopO!eCVlMMXJk0g)DJ0SA;ug7A zgVBjGeOkIjW0F2Ie#47oW9$*4xUlX`N1&{=f-WGC;)vQB)+;?%Pb{90E}U3*=3mL0&sufT#h#Mz$cnQI%!8`j*M?qy z8n>9a3zb6{b#J#{YmecEfQ;V!WzrRWaz6rNbOgthx_H-G|nS%da{X9f-A{5V~sVOos{A z-&wPB%GTwJF8dbymQC+EZaDtJ^%uu}^7WsTt(5JXv#b}CEHo_*-7D}ya`H2yP}ux2 z@{>KEz0eeM)DJsz#}wX5+6E6*a^zb!-&h(?4b!X|D_Ejg{b4Pdl?f4jFcwqj(s=F@g zuDkxtKYn4w-Az>hzbjAAKYjhk9}lm%yFSh4_XbLGOy%qO6>n~NZ7(jKy=q^yFX!DV zxbw9I`%3Zd)#9OO@z6@~{?~?n|Io+m(i5oZx>c4=;5 zMB}KazIy1bLvuq=e!MXD!StjEbhem2N(K$Nn(OM0dKH*qyEw4QS5x z!a3iSiTR1^t{CpC)tpkQd)s@>8*`E3<4E<^)oQx_M9yaQ&`ROHh;!c>M1h~b{Cp&* z=4Ovnpg*tudFaEkSj$tao9|o6-;X;wsGIj(hHB<&>E77p#pdg$S=;Ts-TU*5zqJ0$ z8fkbk<~TwH-80`q_o|{0){6J679YS>oog5za2+c$T~dlJMdfRP;%1}ZuK5&77Rzz7 zD?Z;e#`0QOTVAbdk5;w6R~B>kqc^S=H${t^R*So$#a*|??iTM@$0fyet2JArHCx{s zjuq`qzJC^X0msU=rQAQ;{Ilj2?^7$4!;#`)#9O|dv_=mZU@h5+_O2ws6wBK}nMhmf z^8LNx`S6>&uaD!p+qN5RD-FBux_EQieSi1956(z;y+YmCkDtDI^p^Ym%G;GITlSy; z_Gs^XMYUJfTpf99WNsfHTIdel`g>&^N$Ia&@g7{MJQOKDgrjA+?6*S5Z%b4Q_L{%@ z^n8X;Qh$90dQ5+fVX8`QdM)=`I&W;hRrh}T?e>+HC!{u=DU??wvWx{)|21I*=;xo6 zVu*qUk^f5LY6XI0fRjcY`7+ti`>)=9b*1Bg)WdKOOc{dbl~M4Vvd@DwGyRJ#gT@y+ zg?~9Pm^IoX{H572y2bdHSrxGV+fK)5v+=%AKU#0RUvDP+7W3$itovIn_X;V=x zx2tcRTBu5sQqsJlgCRK`xJgn!7imK4mY_Zc>tkDih3*njZxTUkF^cXq>9NfkQ(#SL zVePY~6j)t7ED(p+PdVvW(UI8NfU{Vw7j8?7GZ#2@;5Xn@qy;%fL71#i?c9bl@`{Et zV&OnE-w_^C$W416apPi&GIL4auS$4gdwq!<)I^FEU-mTN)c!uBV>imwBzn)JEgFh1U&o0OhgnA62&L%^i7PN2+RaS6XR^sz!?GU z9MT`gUXn?K(uIq%Bxyg?R{s*&XA)r=QLzyD{S6sx`^L6_Gvs7DHMU9n&*WtLz>mrH zyD)GrowjCdwi1bOs7_RprgLnqZ%ip3rB@qkfTbT?e46&g$V_!HWl)nLNH?hINb z%3m|C*>YdojU5E;F^^R3f^hrX*S>#tq4v5_Qh~nW!8$4G*>SgY2iw>Tth)C_-TScY ze(NZ;TnoppzOeYh^4@4gN2Hu?;=5<> z;-dT5jSD_)&nJF=rjO)3JbE*LE$nM9SLkIotU)f;u3}N3RV; zYPLqox?)bcq%iq7#N3&fonOeeu<>q2TCqm3Vr9FD$;HW=bum}FHVr-3dX`!vW$pKz z9Xt(`G|AJ$xawn;hL3EeT)hfZxwPX36X|}zk8DM} z1S^(imjaQZZ87_H%EaR|&A;(z9rC&PtGSiY+{)G5hG=fXQgC_iN^S?*gsP+6!j3rX z-#?5s6^%T@-Xh&I4nzo%E^eC%j7^a$AnC*dt*0cyhmCBE3~`xk|B8&eWc*Vyh$GNJ3ff-*cS;Cj5 zXs$O=L0>8bXTjXjh598~*UBw-q+naru{}{mUp+!Wb)uSVHKbCeYko_jmRxm0Rc)f4 zYz?H?rIBn+q>!d|z9K<+OEl8~ix$`(P8puhFdsG~_Lv1+&DhZV>zu7-*Ml5q!i+ca z?kY@Vkqvt4rTYzSwbM^pt-wA`Yllj?X#$l7e^=pAlR_*^E!NH{B literal 0 HcmV?d00001 diff --git a/.venv/lib/python3.12/site-packages/cmdstanpy/__pycache__/compilation.cpython-312.pyc b/.venv/lib/python3.12/site-packages/cmdstanpy/__pycache__/compilation.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..42fa4f8cfc44c42f312aa13ec1d091d0bd9413f9 GIT binary patch literal 25132 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 OHL>lpQcA+Q^Zx_rw1?{e literal 0 HcmV?d00001 diff --git a/.venv/lib/python3.12/site-packages/cmdstanpy/__pycache__/install_cmdstan.cpython-312.pyc b/.venv/lib/python3.12/site-packages/cmdstanpy/__pycache__/install_cmdstan.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..8ddfcc43d3aeb0b3e7526601a7fc8ce0d90bb64a GIT binary patch literal 30651 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 literal 0 HcmV?d00001 diff --git a/.venv/lib/python3.12/site-packages/cmdstanpy/__pycache__/install_cxx_toolchain.cpython-312.pyc b/.venv/lib/python3.12/site-packages/cmdstanpy/__pycache__/install_cxx_toolchain.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..193140dd993eaa7b0fbc9bf6d9d343c60ce473a1 GIT binary patch literal 15379 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

@`n2kMr`m&UgO?YThv zC;ng6KCJy!)5E6q$bWb>AH13m49q*WIqzcQCby6F*SuwK&)M788uRv3o80Lq7T@A< z&Qf2fs$H??s#+JUPpazXt$P)FzWSBn4PW!T`H7=ySB0B+v9{9foUko z9Zmj#)pB4kV=MgPTC|XwFuN+#wXH4{00Z?AZ98sBy&dqn%Ec*>f z#;W~#1ZqlPXa&DG5l7RY=+B(iTKR6jC4mP3b2x&gykrTcjB`;rJ@k-}9ZC;l;kYDb zPJW-C5vbHb8{o{V6@Otu?ffNPvBKi1E>O`F@VBR;arh09VoH{=>pxb>yi&2H%D+|7 zew(2w2C3dJXpyaOYXNPIB+72>7alk9lgQ4nAdEsT{fUsw-Gx-yPK#oyM0I#F2hqE* zp6~#UmCBViex)p!n4vwJQs*y$x;K&U|96PYG25=1EmvF4)s}Z1n!8fq>|0!Ij;md9 ztPXD+dwqke-Q)&KsRgTNv3jHFDyZU2bx#?C$qYAOlS8Reu=)#DXTj50aP@(O78Wo; z0cTl(Dq5ha;OhO>0$BYuxL;#+4yxPBs#nv-@%F9e0^4$W7tLGV=A5_r!`6@5KWJY& zzSh0kk@tr3j$<3#v1ipw988;Xsv{67=Ty4Aly)1_P8a+j2UKFH??s_Wkb-+vM%Gby z^o}M+N6Ej2+!WFmmFz%YF0fe}%-0@$%yrPg&;rmDX2Z`*t_0cPV25lO9Tid$sQ%~J zcoTYfH6lMp?<{(K;K^=9(c7i!dC4Ruf?Z-f4*D86JCb5Xz@_1LC{)cWo6|Fsp!Xxl zW(lgT39@S0R{G5eg)6eB^xcK%L{d--1u+h+MBmi}tZ7Mv?@6Erq|a&e2Pt6jmP&zVczIPQh6Y`-_0>d5n2L)R z$S>g&2&@q4t`O^dOv4upEI7%8Q15G?{mifIaBim)A|Jy_#37r$F%$% z)ABb=e~#&Y5;(Xxv7A~;~Z26r%}*v-^5eC-Ib18gBsUo>LmNo_;Xgb_F!ZeP(tqgKY{E81w( z&ba+WS_RIA*}mh#)UV%UkFo7*#v%j3x=K(I2jgF$h>nQg+3A;69ySdZ*rQ1oA6*&nhi!>g^U(rWwre^g{>!aBF3M2fcz vP3-ZN%d1tZk=45Q2X`3w+_}KAokc6dIp;H<8tXsfoPT-^SP9oam-+t!pQh*( literal 0 HcmV?d00001 diff --git a/.venv/lib/python3.12/site-packages/cmdstanpy/__pycache__/model.cpython-312.pyc b/.venv/lib/python3.12/site-packages/cmdstanpy/__pycache__/model.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..7d8eeddc65cf4d2ab209d40724a72b1577cbd49d GIT binary patch literal 89031 zcmeFad3apcbthO0mO@nlRR9Y6_OKBs5-1Sd35pcKeFG_pv=-P7P{b>M1){2;R|PIm zl@`bIeUPIbgK?%swVVi=sK?Nd9n&3m%=BcsEw>YI-3f|-gHko7%}i@1qn>|gi)kft ze_!Tz?tS;YR|_awc6#z9DiW_=y?2*$w{!13=XcKiQE92&gwIEPU%IgW*UYB>Oh3e@ zNWJ;s_sk~Kt0vhrY?95gWy(BkX5W@!3;VVXTiJKPZ~^-+94=(vMZ-nxyLh;mecOg@ z__j`!gzUq1Go@894o$S7Fsx(wKT*mH;rd%QSu$$c%PnCx%hATpq!<8Y=uqRYC zTotMwt`5}<*Mw?^YeRLzb)ov<`cT7g0}F4NY8-At+P10YP|I)&dsZ?fg<6MOLv6!t zq4weSP{(jbsB^fJy|Yhk2z3p2g}R5kL*8L;Xyfq4(5B%{p`PKMQ15VW$T#d`;T%(a zq0PgaL;b`3p)JE(LR*KohPDlF3vD0X9@;UyBeZjPCkyAC+7;S8ygM{7JP_J5yeIU? z@FStU!+Y7g(y4u+M~5E`?H}Hc-(|9EYA|$Q_@LPoXb2n%m?ys^s$Tz=E#uZY{2V@F zF$L;ncVJ6kYhe400v=-csKs>DB$s~?t#iYoK09{R;;l$K4~FEkF@Ja{A_u14r&p)F z=CtFCA_tU!d?+{;!_SIy7nFcsek>B1I(#KCHWP~|cxpQvQ-a}%<7aSRGB!OkG8UN$ z$GrBmbufH2Z9C|nn)08Y3Zx4tm9*`6ETHh;r-IQ~y7*L(9!#Z+hy2siNGEMOGaU;? z!u06e)#<>KekEP_nJ}Ip{esxDa>!elc8?q!I&}8j;OUVk4j*~q@Y!SOa_!04!J)@a z9Y1|E?b04SHTcBPXC6xzkDMEN?9lNi(vGo6XgWCMr+mD&v_mcYpfV9nS04?8K~OC4 z_>4as3&w(hD0}WW<)5DNj|JF|qM<rZCDfI3EF?$Kv?J4?E?q5tT?!~s6o2G=U_7D((snt5h6{!KVL5G|2*gIF zA`=qE+o83pzY*T@e$!H|}J_f&uI>odS znNR}JXxe%t7#rh#jbHbxKR);pn8~ZAfC&u3M9g8>T4FN(lP}8_x!|j2xiC-=D5P#J z7X^ysV*J?x#c~Or+5&}vl5q>YWAE*Go;eWS8L$V60}i>Ag;ECzhLmNzLUw(zc-SeI z1q#P4vipk#!=-^T^;h{93vQ^y4!hXXB7~_hJaubND-BP}5uYeSij*JXc#v*|`c$PC zPpj~>l9yP%B3H{bC~GZBR>!C<40w2{`H+_D166VZ-V)Vzxe-)Xv)m~sDqR)wV}oDI zwaGwJO=egTMy0RW5VDqqq}pgPJgo!uYAfK41j_66wvw;PR=E|_m;Qq7(uVNuYMIL9 z4wR`uPxa&P?HFOMALIP$&;*@%G?d zSwI^1$&Y-oaJcp3>ubFb@^ctzd(nQsXl?G(D0@`9+ppbqp@yphZED%Xs2j}tG+%49 z@&1n#3@yy+*fL(kz7J@59n|g)p;iuSzm8~kN0D!#kz*iT)~@)@<|CGI-r~m)rv>kM z%Zd^lM-C^DE`NGb%i)xEH>BO2M%c`La|TbS?>vUT2et0wNTZmQvMkU(zE6GvqoX6Y z1?4!}?(8RMyK^X8r>Fz5aFF%!@tKU?{vb-9L`v;BDU}5_1UiZS@oM=g(B73x`}$Ah z1WNVvCn%Lpe>dunw^082*T=3t>YmZsZCJbetd-?A7P*uC_J6hZ7aq628g6x7E5n#}r`Le2Jqu`e z zUjFJV{EKo(;?eq?Q5NW#95zf#>MiE;DbVHP<3WBwYiVOUhrVk6h1)rdvPtWeNShP& zHX~~Fw#ghf#Iqh$(-G9Pp&nJv)i>TKPor#`#aNeLl%Eas%L-OAf&)eoa|@`fnn3^N z{eZ>RXF6K*l*uv7a$5u20^292a_dkY1P9`?=nT@P)k>Z;$BX1k`l?1--R;CC=p}`= zME*a*M%FIjbM8Vw8jFOZF=b{9I~^&+mi!X7Gm*lDNI;eXY)eI3qaJ#9J`%g&Qwa%1 zrOUyoDG`>%QwbQSv@Zo^B;c1=UMz7e5#=kNyeD*-*lp4_(4=?Tq5V^YW; z8@tdWb)QFr%faz+?D)fUhsHs_zbZ{d&`8)SMkPv^_5XnE&8$%LnXv$EAgM2-Ime~Z z(R0d7V05$xF<8r}FMFf_jglbi9*W+is09p^z!eAuu$?rt94`}f%Gd=2VqG^gb85}8 zkq8qTLMy%OU_>Cvl2@*_X#v8&j|hqYRjA)!D){U|g>e$0AXhtEIkKww`hPxrEvj{O>~Wpwy|E>Mtv|C%it0s2em6|^smzc(e1_| z)ROfajlAnKV0)vZ86#kHluZq&OCOs@{O5yH!Pr$QoIYjfecvw$2@ji9E@K7(1Los_ z^&bRmnJE>dMgHg#4e8ITiyR{VVsb1-qRIc^$JUqg;#!7mEMKJ1q& zjx?EK#p3y-NKZV#cf2rO6feGMy+LWyZ_`L2zoYv}CY~0*`S)aL=5P8X=6#4&3y^}A zW8C(lRW3}}!gaB75le)ftQ1f5Z@K7(S_-o%UZ7ay;)E@3e(C9ljBPW-HcwXR>54m% zceFlMBc916le9R>`ozs5E%E&YbNqp68rvgod9f^Roj1Su-wgTK^^{`uBD={(ai@Pz zw&?fb?qg!Kig5aO+#>Q5-^M=jG3mAI>4-b@2CYwtXJ~n~y`mk4k~;F%=mX=6biQEz z7|J^Jyv3bf($9gyL`lLP>(bt7wJtj^;%&4%ZlCmuxB9nSDk#V(N!c$`64aQUfp!<| z`j`@K(t>I?ajg_oLSs)$l*D>Pu>36~yM$_DyD8y_J0|-?c>P<9i-eQ!h(!#HXZH)v zOD5&$$IzUwRUX*htffj5CF}5*ew{XP7uQE-LWFNU)t`O8l4`)2D6wj62CB)0N zi#YnXR_-#{6E8zKJL0A*=E*WWgt#;GD1;@3A^MA4b+OxIn)R4WV-^GF!{~qMz{k|u zuV$QE1tsDe{X-k6A45U@ajvSjMA_+Eq@6K3)*I&!h%eIlMC05v`GAzwvF~1I)OCMM zP2?MOZb5DCs0*LVpU*Foi_CW07k8RWN~eLFRF^laLZ{=FKjwA>->qV*MBpmz39X9Gud&m zVtHIVi)%CbE`S*)A z`uF5P{a)P3jUul^dA$6^9zzQG)((e7JpDU%RNQMd)+9H}E%=jes4#;>`9rpBYrI^q zWw~uKUw+3$ezB9{Zt|44)4${86UNzozy3zt<*ko)*(@lS%ro!EZKA$rk&L*{{x;NN zo_ytYQh7aNLYt0?w)A%TzXY~wC$R&4jzeJ^^iM%oEk({xVr#F8tBfKpKlIY-HiDw$ z5fPSySdE&o!5NTpx0@^gwpBbu zF3JmzYsnB5x@=CBuuKsU;wl$c7&iWfB0iKrLf=rTF%A2zOhJZmho2M6urd3jJ9jFj zp#pNUP^)_Y8*w4E^W~{aHJD-RuGM4Oboy+|`% zBp8#m+;mA_<{p@K{NcbA5@St5grG_h`L^5Gw~a!=KsY)>qAXR&c!9}+)U1si%4dgU z;c8?Cd+#U{66WbDOlV57CSCrumn2`B06^J;g3dmZQA~YT{>ztiw*Pn-QmCLTaaj~d zfuL?;CPY#^mXRu|Vj>Kw?YTtTY+xuDCDexco{NmtIME(fWF{Kqa!K@aF4HDSn2=#3 z7sIH?5LDt7lU~odAn%OMj9uV^=DEcC#Jy(=eZ&H0YlAA;^oxaH!rtc+X|pnGYgeUA z@6*!o{RX;p;F7j80d@eGp{Qb|)P_%!v^f-vGBGCPzp={!$QK!@yj+kF=V@EWA+JD+ z%!G|3xu(nqq~{V`(nEK?bn#OF^FZ1^TXGo^s(=p#o-K}@Kkt*LrXXc08ka{PrwoV1ltI`+{eIac{lCw2~vP>;PX?1r- zy(BAoZ1CK%w0TdufNs1N)|1jDz}}$v07!W^rVE)6KW!hOgt=^|WJEAag@gua*Fi36 zQ@9*13aFG?9f}Y~rfsYPK@^{MB9SWr8DJsk36xEgK=Eb2LW0nAAxYMz)AlDx=6P6A zA_}S?qM!_EOC*{uU;rZ`TtPH2HLh$!IE8j*$_~2FS~82J@wny@qy|wq^{TXGTuv9OBSiTeq6o1ZD}_0b zE=G&7kVWVj=nT;c1R{={`S~c&cOeoA^aZCT{Ig?yk6j(R;8#MADG{2^qkZR4*s}qJ z0Bh(RSEIpbpAVw;OMOVRZ<z($GUGz@`qJ1hJZ2D>+7qw0Uvp2%v zT_Yp2RYtDm6OU&=UGz6lWiOiUZ8KHZ&K103Pt`Z$%ay8Y!dKZ^YtL%yBgxiBQuSS_ z+IIZEUtG{;pDS3gHQ%$FN=jF4%}HDHs;w(&>sqmS?>4s5ySlrMin&Kq)%7nQea~6_ z8>d#CQqn2ivlNs!+_x5$mi^Ria@M7)o92$*byO`mTGxz$%;nqfTdk#K_iQFl^J-;# zva)@pvU9CkN_md1dQK-jr&G0UA6P9_)gM?3YAWuT3d$=$OMS;`oi|zMU9Q_Scj%Q9 zcO9N3M`OxWlXSHp?mdgSYRLS7)k+bpCSIFZZT2ObeK(b_Uw-@YYTsb8 zZ}8jR<-SwP%|l4#%vxpDt2?jle0AToeG465>wB|rrE&{WTWa01+PXX0y8Cv=zwP_O zzU9^v%he~B+$Y!S8{g=9t?P~6*LoLAmg~2?d~$AZ?#i00Vt&_eB(6Vu$0aS=R=am6 zyLaF2TIoK(%H&)1Y)^W&-;%!-`9@^fa|9(L8Z9VPk;zm0>cDRftVwNOD}J+hRoa}C zHs7jUmIkhs&KLZa{rcejB2z{6y!>k9T4W)*Qod>>NtD z%jdV;w_0|U-76|C-m0 za_@=n`;)zAlC@`kT07Dn&#HCbANrPCk1toBSaP3Ot7~|p=CztPnqF&Kh<)w(H=kdw z+wt-V)coaCWle7V)htW9dHuaMc$WfP8+fbYYc+4ythV+iTl;TyEw>Kb#@*gKm3!Cf zJMLL5bsPS2L(iMzi|4*R{Pyten&l0H9~2ifRHNrrRo|zAefiOsA6<4dE|lDHc<)&% zN)MaY-1XN_F4iqIY`uNx$L_)VZKm>uuQ*rTZAo|AQv1Ob_o2UVRLsX-eg4|>OEtYI zr~AvNUOx5J=)%s|jJsTFDUG;eHc)UNqSB%#`zwa}7q@S6}N-N$& zMb*Dn|3>p`&5QQsx~=m?smi+feQKM$@wwMNw^rNndf8&pt-@Q+ef#kDx1%pMSI-|o zZ!l8-$nEhJ_u*7$_t&0&^XWBD?OJX7YHd%lwkOrpe*M^6%GYM!oTX;CHGcd2a@XK$ z*U@Cx(eGQAyG|t=Pa(;=dJJ3|y+s=;e#`Qz{hIyyjum&?y>gKFQIuHm_Z!Qf@K}FX zx9f>k(~{41)?>QkDSV>2_)crd*>dZhjg4oW)@5fQ?w36WTb|r${qr4WT*ow31k#|H zfEE@XyoU>L?B+@1TRfu=1Ob}Jia(+24K-u}xc9uVpajV$SP@*BF z;uWkL&t{0A-s<_q&1X&C!qb_2et@kP_db`HEq^XyFM&QyU0Tp1H+v*j81$r;J;`2D z;ElIX8AguEV{{=IiSh(p&f$W!OcY-<(N8N;s!B;x;`9V_4?W8>_wdJ7)NzzFNiUjG zt_`cM-lVH{QU3bm+mp+#-E##gSI4SrQ_{6*@zAY~Z}oknZ`pN#p0=;LHYQyg7q{K= ze5?5z&C9O+^mNmzYfI9#<<_>_p4HuFlDp3=yB?$Gm2-{{kcBCuV^HI=jzJ=kSE&n7 zkgN}?(>(jf+MZ{K>GNo6=gXiUtlwvoNDIi!fk*obwuZ0G zrttZfpI@>yQ_Acb{{bRdQ8Occi|#c!>wdGxsPVnIJ@$~;c1Z#DK;@)om+2-g&A5ss|ef6y~BS0Nd(j$OrZP^K+8Ux)( zoFE8n!d)>fOaCQ5Y-|X+Kp-uW)2I+S4j15fpU^a55jyThr{Q$EfJzC26DzhT3dw}i zW_#MaS2=)Ng|vc90N{1-tr!gjw((P*rJy!!^O!tD8KoCb)5TAhi*(sUmkYRfZG0jE zgdqwjn=*%I*z*O$0qke#D{a1#F1~mP`_G`FT*cccO{k)I)H#dBEfJe%IMd@M8qRkR zjq$~{j=7?g!}aC8FYjG)NLWeD4c)UiOX}Au8@@6ycL;l$uO3_|_*&_krOS=JTSZF^ zJHK76<(JA8VWD3sSxe_50Q;tLHC&<&lN{JCz+NPh+aHXYuhjhv$ptFJFK5+Uy;yp-N13 zv@!G4&kg;}&q_=UkN!1wI_}1wnJgfT@3NYc&gSdSt~gsk@;@2+`MpBC`Y5^?#rn;` z_5=Nvsm~57t}%oyUy(e^+0KYsOqa%!jeCui|FC zY4s(i&bY`rP%s|F5;UDP=?rW#&nhXVF{TGIHN3ThgshLq2@|_@c0udgG%jgE8G~rh zFfMz0`N-s8L+T|2O=967%#2I{T7`iCaTkpqLOcaIN|J(TX)~#nhI!=js2<3t$qwsd z1`Qt@2T=xZ5f@XC$b`v(lnJ_{vB6eg%CF21~r>KHW~m~r0q_=^sGB9t|CHB^&YPs-O*@~4F<#TvK70W+E; zNL1G6W`R&>nN5Ho7y1iOJgp<>qV@raKxPBuGvTp;QLsbmFVk0jT==HT{<^(7?o983 zT3_u#?}5=~FOLQpq7(`1l6r7@IpC8Hb5U;;^99833 zF2>=O0JkxjDlnCL{;Fytv#l9Ml;q?9Jkr!e3C>K*ga&4WP$qIPdJ!ETBGQ1OQ9y%= z4I!2-Nlb$=pL76|h>8$A;-8A@&^n=4F?6h49T4&s`xhw+=-reobs4*2S61!;z7}We zW*V6Q&J*B6<~2(ksU0eMWMOULP?EULCYaxO(b){*@Q2`T2FJL`_34_tGnEFLajhalf4%bnD{GGeRGKCT&TrUd4 zCSK`0fRbpEU7NvKNyO&@QbGVyG$jOzu{c9H70G1ki?bl zx^FEgv6D1W%wB61jY~~~%M}NfoCn^sRj%4PlC};KsGWZKbgIFdYTT5n>%>wAg6-A% zo@9N`e=RL8vFC2VXf9!MkPkQOtzYs7=qf#)Us1HICl9i;(SY2uQRoAwpYul1-+poGvb%r7twbpupoFfJ` zcTRD3Q*mlDiem^)bNmN+3PW<7CEJ!?bz!!gqj?D$tPBu5SOR!3S7~7nM2r9$Vpv+y zZbmelbA;llfcl(LlJ+~Rl!o9}QA*`^5G1!e+Lpf_Vb<$!QHOE8d;=lr^98J&6J`hj zv<*L2CHz&!6>A=KV-E->Hu{sr8L!z7vBDx*C;byKXoGte8|6$O6Ft))Mzm^UA8et! z0Worj-y+R?TY3U&=c856_ZgP627f7>m7ZWr=1jR6Q}y#n()UsQV^aY#S`un*gL&3z zWe{Y|HXr1+N2HMC3m!IG5?36MprtM5;-`xUtH^W-;F2yreuk+>x&E{;K&n!&RTX*C zGE2FHU{PWl8e9A4_>m=3qma*|?V`VqcQ2amx+=f?!k1oHt7u+o*|S{n$ddCBJen)G zXDKQvTPv^1)aTUHy?XiD<*!_wFJSr{us*kE&hcR>^Z@Gp&+nI*+%?bzAhy26OSw05 z$?0ENEl{Qr!X4=Ok{oDf6INcgD)i*~J0}D9XN0Ol%+x1|5%3~8)0t<%_7USx^ zQ00e4!$XL=gh3J!8{H#B7={Y(a1Fjlg~(h9*qS!DGk(06)s7^)hCG8C&QZ3D!X?B@v?gdIhAA^=-1EvmYqz`}G4Tpa+xu$KG- ztrv{|C?Z))5KNtDT)z@v=845PH??K0%eIoR@?~;cqBSF}(NO`1LgD$I9Hz!mtk)q! zVlt%&?ZL*#IE? zvj3j}jamh$lx5FIIV~>&@P!`j6!~siFC(?H+FjT#o>{xfavxNc2F}0Yj%{fuX!^ z!$$CNgyZ6O+6XFykXJrK7q-i>0_~M9&&h^MEZH716FSP2YO44?U)IY1LP_(*hnlK} zcgvOGGt}0s$5>}*L@)Udtn=4Acm)%tzO`h5(H<4e~1R%-{6 zwF6l{?>ma>f#CWlWo%FKk+bue&QPb^d8~7&^K7~Rk~=?PH$CH|?22*fZKLTNk28Ub|hf{2)xt2@2SdPrg9J69imn(s1XCT-F3^I&WDdqxD zbs=(@en%sqs#pn(V^Rbzk*36v@eth9(H#nuwoUrSBIko(ht!G1hgKkL?fUQ8+Erh- zVjX9Tm&EOHN8A}NjhDq;ad*7>rul}t=}FYYtCbCg&6-8FVilxq&_o6Rm#DX5^{E)w zw3;r}D5TbHLa~jj)wfx3*tlZ-q;K)+Vw#O?{uLOWYI;wdBDpwT3(XMNDF_=&XgSi#99H`G0a_(r(a+}I*d zQItiwg{Nc?L6~UrPb_ zUZ&oWu>iRe49$d?^m8hBArb-f9?l;CC)T`&uw@b8AHX6r$hTq9b}nNfEAY#FC9Ap9 zp!p1JX9hY1EO&d@vJhf%5}vF07>zC}l_<;TD9!X#8mza3-xuhxqtpJ&P{BpQBnv)| zvW>yH2Ne^Nd8!sIF%ca|eDY7?hp$8?B!|>Ugyx%(sQ?kCF91Hn6ey}|69LF)(tBDZ zYs)k&{D@wG@lol<(%KjB^=MRZ6@XYjt3G7dLRb_uLn?1v_nkxPVo#(79y)b+RG1FY zGE_ zR)=a;pvklZyB=XwV-Ie1?V&9XfVwXb3;C7Yc?)g7UsDX?kjgwY4D5TG0QfCVCk zZQY1!);I>AFIrN>Y}LwUB1;`2!x0C-`4G~dJMZDjM<^XL^3Vq$C5A>pLX;;%(*aND z=iym+t-J6{2+b%>aQC?p=m3Yv zyAZ6kQ2k`G0(Y_*#S^AFo7sTh@@reSNWD@&({Rq{Y%sGFs=NhxLH*4$_Nh#4LgtN>~N5DvEN)y&zi{O-A)uh(o6gOo^)ZxCp7* z4@O1n&4hzgm!gM(d-&;o0)qixp8zF>Z?$t0t1M)_&oN2IO=<-PwPW_bIXQ6&H;zjb{u^CCl zB9MRhQ8DE6i%Gax?y9tl@7gg^u1diWCT*Y%)OAM2)Jv^Ml`$S64{tQ2xUM<|C)Av+ zqo^ys(c&~~Fiie!l1;bN! zt|%N#Dis1JVO0zFb8IERcn!w4AWke_Vq}rZ%9L5%xhzq$SnOwPuzwdH07eeTMuR#= zGYYEHK_t+aQ2_;vLmclrLsCd0aSwYr6P*F^8UkZSCTYhBl0b`f=2}W^s$Sqiw&%9F zaTA{lr(w%}MgoHykxw}+_sFR_1{_U&8HE5uG%!UD5YNNW+(ibTpyea42I1?gN1~eL zT`i-VUU|jq>WJRFDw7k^bp>1|xcWvDFpwbCTLW5yI>N;@b=-I9w zsq2)uIUTqhi-fy!lB2=SWgr96DX>MXIQI)9kvS=H|(1rK6^U6=HSNKeq8LH9#v!e*@pP;6*}tO+iM zW}{RKAS~(!YBAL}tXr_&B^{$ZiUCbZtqHJ}62WGhbr*)sQn`Q%b^{+JHx9> zo+CNT$NUsOVL?!nOz%(nF;ekpNl_(2L4c(WtMHiAMyn2uk+5|NZT8tl9V;X*qHN3M zJw};jmdj1d=>fQT74xmwZh@Tut(V0yqcIuP!6qNvf@azkQzxL+8JNZ|P&rI$iVn)w z(;UQ?uZaZ+jk`1?cdZ$fBlZR8vlH0fVvnQl7Ig@vHiz|Z#)3$Tt+tYo+LA8}zK>Bi zc39%55J)WwwZ;I6c%b{mA_wA_P{60%pdQER$tcx{j7gtVW~drA%kVuoGRR0w?^?P= z7aBSuwHXEGZFz}CTsYWJrB#w2J}a3%P!*N1(JK)-m?Y6+;Gj{+VPHg`TLnT&ov(jl zZeoQvp-Qr`H=e{!jrohnE)Dg87&tO(@`J4pohD zrK`cflqyLYQU!vi0H9^!z{5fu*bU(mJkC;Mi4UNt486%kYBBP-kteA^=`r9+v225u zK{6ya_?U2DOX&@8u@#tgNT#uh+|mG3E@FvAm48bQEz18+0ltmP?3TlXYZ7i?jg8uhl?M|FN?p$-AO(UQ5J?Tl zwTCoYVO-eoSKcaxFdodmgYuhn$MB*AH&V!5phBn;Zb$kA-EF`Ho+==99U0?b_;dy1 zx+CbnBQ!!VKB71PXzW5@>>?CMFQh1rAK+Ex-KW&7C`%0~E@!4B#@KO-^M(Fn=E44>}yMbEt(--uX&{(Fb z>Qhzl0@0Xi=uFkMrka4&^`>fDkgca|?$Et@Q*+DQ>9wkc1<#`YcK1rv!MP*A^{zUb zlFp`-yE^4=rZ}}NFnTI&zHcflE&H$&*{zng-`i{|ajn`~leX3sTl-yC6^F{MxVlmm zM^-C_k`-`iQ2DCun(cZuS;Q|4zTUL#?pmx~^*)mHKCn~-L+O$d%b$OOq#Q%TorTn509Eb2%I?d**^j~ zOQr1}MLW@u@7T)@*IVDI9dsWqEBsEk4L|<4tnhG6$sbo1(|vv6;r3$K)ij{{!wnJi z6Qp4!<-`cKUA&tpKcbG~qIDZ~TT}cYoWa1Z2G~Yp!0%B&2d&6P;Q1v4JDpPYg9*hT z>PS1-l1zP90EQnzW%H-rGFwK>*rGD8zjo}uafZ$h7JNQqC z*U`7(>4o00-4FD?(LlPAKjF!YKpF!#JZTqysHf>L_^L^J7*&Lt3dcs|tC*dGV^KIX zCe5x`N+@ZRZLAp=`k+&rNUupe?}Jk?&jISt^P&@)Nj%8@Bs@S00_aMBSlN0J+Eb<8 zptmi^r?b^Pz22a_@PSue>x(Tq8c|2%>H1lr{X=Y3N2>#J6V~tnGAO!u2>CbbdRq}^ zk~Gm-AGwfX2+b?>p%$dl0xfWEDT?xzLNkFfl%fE2VI_OrJgF4tO-0jD8&a_*TH*x> zNwy_gQR{h-i=teKws>1!56mU9UDQ%OeX;-icjt-IF56jp+w!znT~>49Cw$-`sY*Bz?eHITH4j(CS` zokg%~mRCxcg>^^xKk54Gcu}lFq#;@dUNwvI^p%RdeMPg;7PLdB{ZLfJi?XQtO1w3? z+n^;cA}VBaz2-avmgik26Z6K}k?4$f#5++kyU9ct-KhB$mtl-oJ}j*TCW8iED+@*~ z`X4;f62D;|*^@U#OTO5m9`zcD7lC%vN@7EN1HAfzSAgCUL+aIeQ{Ny`5Z_-ggWgSo zrg$qxh&5~mvLhF{QVwiJC2$-yH&oPeqRZgVSu?Bz-lRK5i%9kX2BwJnioIDYN`Vkw z=VuUU;Rq$9rQmJlSWK>Y+DW z7{?oaA1`4c_T>ptqK0UAu_(4*yiYVBZo@2kjO?KCf;>$5e3zm|dT%z1)=2ck4vQ4x zo6tXsfYxcf*&>kG37_t{HQsVl<2z{UKEvqsO&$}e=-;9*qDO;spq2Y3PwH>Q9jH7d z?)C4u52Lm&ULWs?H{EQ#p(6dwrdKu;z~cpa3;u~RVD_t1{vh7-(l;%pc#qsBx9e|W zXGEHlkBK||Tkg2oDX2_rj&FYHv+>QmS7YqaY<$*GM$N_m=?{*dkCHA!?&y2`BT~)Vle_g8ao;4_ zZvmdG{~_b{ijp9vE#5V^ECL`cCLei zySdKuJ^7zg-YRl#i~p;D;n~IJn~-ymmV{u1O!^R5$_r8Y>Cc=y+k0&2APnKzals@k z#D<0A<{;uD8*fQg{Fil6wyNj`mP1IlAhIV#F3xa*)Se;;=e8suWXKl?lJJHB1W2G@ zkQx5nLg{#^9tKEUH|f_wjc1=bxw9|-uN z(qmL}&|Egq4re|;5NVfDFGj>26YGkKQU%dWRLziguw@~j7?bP^+!(g=T577iUuao@ zCPXg^U*-BDLu#4&R|DuyOKE)+8w~-p(8Gc5wDkUdfbYbCcwFxPDfSMCOEe|*r+f%X z^rla-cPjHor~g%8?>M7lKommSfys-p&fnnBM1i=Yi2+<+)rq9JyGJchndT;Y5jeiZm!VcKtF)R?Uy-pvu^VjB4Y;SBfUk zZ@GHGZ22rlU+Q{QRe(!PMVdVWRlo`8Cq@$SP#1Ct4iSQYDBln!8+Fp{CM+&FWx>Ga z4oj#Q%sf%xGxQY*B{w<>^dbO5Bhi@<%v?tq$Q14*{nJpnjK%1Y7d6e67kWD~y*6pb zanj_NZVE~XV#0Yq&EXx1s*SZJNi?4_7xS#TqnW)(=)a*tXK1bL24+ODewDXXGn$Gm zxkSAIi^Cv)>Of(IL}$tZHHelW1Xe~`0=zalDn^wmjt7`fjid|i$*2%*f}TxvlMe>Q zwc(KcYlBoI2VEjX(mM;r8$j0tFW^Hcmo5A~2l!^xql#{$uAc?=RW;|LqNxQKMn+#R zW@?j}6(>~{I4Ys8NbAa>bCQ2di2#J4$IR?w6p7VkZ%~f|g8cF&hPI;jPnT08Ecx#~6F{-mL));3h z^qK>SRhLmPl@2~j=avQ(0>Oh7@I1&u73fwoB=YnmO!XQOcZrlOjngx%H#vJu5i`+N>?%cyTX z0S!D(rXE>b2U5yrjK*Q<^M^zE- z2)JhTNE&W5M>7j5j}3z?hXDQA27Ii=Y2wjiFvcrV$}Mn)8Xjl6tB5M5m8T5@spw&v zLMsL+%0b&ziNsH0BcYXpawc(%mT{h}n2KNHLl z64rlcOp-f5ctz_vq7bnGh6v8c@s`l=6(E?kY+)!rxcKIq8QoG9m|{<{P27B7+WB9QdKekziTdNugaaSrwj(1cut1`EVk&Z;x1m07iy2oVksQlXe;_H&)YZ)G$~h#W zHj2uF1R+{<-T>4+vIj;6MQq~CvjyQ$D;2GkGk3DLhT5do;|#>m5!Jbnr^J9>0Av%; zO9e86Ut(7?glQx)9RdB=X^jCr#&%7ZAJL-3aK(p;EbJ6TGfA6$%v>r=u3wppRfsjB zoOucFviZ0tX-b%VrEc|rxp&NuZ6c^JkjO9m#hgA)`*q_kI|}%pf7N3StqgpHvh#>?N6z9JZ|Mbq3y5 zR9GM1<8masl!s<1HUn?`8I%(_JPjtUGtf@fweY&By5VJ3A?Pf$&SFw1Z9|rkoX&MA zVKKaoMk&mQPTPQU`zw%z>dQz-7rukmBjtd(KD)9F>nQro1TvcY4Ii6BBO|UU&7|d0LkjF8f`C_@0k^JbWW(c#_kQ`)-e3U_0$43|+R|*rULN}F>2=gOOU7N}> zO@?ND{ViAykV&iWY@u7J|}3T*Z6}1fj7rxTzqfygun5K$ugp z(h^HCI6KqYN}V9MYVlJ8;ut9y|1lX5XJNJT*(#}OXBx;{qXj)q_TUP^=Rr6IM?!S= z26?R@1cVTlaxIKue0OKK9mp~&!tU;2ERJa#Wl)G~9h!#418tA_@*R8KF{Al$ra<|D z9#ISlaOWuS9TLb~K3s^!rlSLWeW9^l;!eJZGSMeT#t5%*u{))t%ab0r3%Yv)h|SM zx}+#esHKgkjO0{Tt?DVXQtVkdlu1MY&Ox9S#;S%{(dO%82A6$V#lrgjLFTVm3z5ld z20^SW|DDWV^<@y29-o@Ol9Ghj$$FMcS&d8jT4C&{YB9n2Ga8eya9DN6s7sL*6xLKq zU;;Z7w%@~!h|dcC^FcCirw&hv(j-BqQ5i|`{jt<7+Kg1lo1}4^G=jrGpxtIOhVJ}z z3acw*W*{+NYNT(2a|e|=sauYKLavmBy&_-vv7Id6%m(E=QpnSkLbtlk^1^hLOdWYt zL90-EBb9x7iEx1c^Jn&bUK=?`1&JS9e(Z_EgNM$tGwpeNKn&@8rkn+#s6Tb5D3+$o zg#cIWlVlN#W{yY1QX6Y%Y~ymL57mM*pDnb;Z$8crI@_d|a1Pwzgw`Ub-!A~Zlv%sZ zZebe)RcJy!t8xG>Lae|KL&5RzvuB?my(czSveY@FbswR7r_DZF_v4-FHvmrZJ_d5& zo831k#K@vPMS`j%BM)gk7(O###zfS9Eq)G?KnOn{oWi-Z)7bFoLT1U$&6vr8C|y9t z)<{P#M+6K8ECA<66~7i{b}o*@}+DVJeV@dY*vS zK;^9q-rEcZh3tK<%UF!Afv$5;eCBW$YUqo{Y1_tJ&WI5LmLLWVKtD7RIVEC*a)J%5 z*NM%b;4MDp6|)V9UP@J1B)73m)-<^p!BB}vwAh8$7Bxp-+Rdmt{h6VWb9{u&Zev{# zYX1kcQ*I~R#b_h2fEG=!S4}>tf&hU1(0j_0B0n`|CZbUngYd#@vT5pOD&N&p;}3`m zA2T7J-6ay&sPdzagnPr_!$w?MPJz5-X*=>(JH7IM&vaV(Kf1$Tz zBd>g)F8>A>?YI`KA4of>b^xr%aO4Z6mM&xnARLVJLyGewy0Bcxz&l-)*DMzX{0>su zU5+RhffK;7eSc1YtwH&U^8Zo-WG0?2MP6)yHUhs07n!Yiy5JBJd>`fdTd(DPGFW+^ ztmIK%8wTtY9ebtx2TI^exag$IhKUE1`({f>q!NhPJEQ!>lS2 z5OdvNkjV(0;cWdOKpb#H7ipue;7S8G#K-4sO@@yE!Mq3TA2ry8ivU`A88%ZMCkfCPbBG`k!ivth~6 zw$|MGR{LAQ-@SNi$8y`i?ZM^deJ`I$l{Q|#bf>gab;VDf9muJ~*1PT&czC#90-p}> z$KTS)Lq2<_R8rkeH2$Qq?X@Edk1jWE{h&}dptxr(%{fw12M*`f&gY#gN!3WNCaxtGe(ly%%QbsfYYrxB4ldUm zo^zrK<{$skp43L)lCujwB1*fLoPBGajf?$@=WlseJddQ@jSEG0+#Bw8c$aX{ZoPN$ zWU_we+{si^^W5o_W5Z%+($Tk8>0NAHeBxH!O68tZckhzBGu7OC%aLr}Gw(>Xw#}EN zDq9wI-l^QU=4t-QsZ~#R($jsu}Dt-RvC z)3mX7@w3a`-LF`_Y=7ClRN0xdZMf_3EIAt2x_cMLZD=_@lZ(ffJ9nV&8mi&%0|eMi+XrrM z_~y`ZMNj0|NfZCGZJ&pc$*j)cXVIh%KSXKRj)6}|g{#dG}Wuf&e@wH~u znYqdP6K~(!)wgV@5aiKPk38z?DUXf!%S^TH?>6>dd-m2P@`O^~MOXMh!3|Cggi93u zq^UP0Z6(Jjwe9ztT($N&=l!-Ue<$<71@pBj;q&A#Tpc&-Zyo-lZ7bgWf3b5v$ZV~6 zcjx|Ft@D?zk6l;hpPLUY^e;TVaByMfj;Ht5)q7S`dGk+A2!(#!+BIMLUar#=IBMZe zQ`%LhDV@8S-;{2+LAhU7N`6y*+Kls_Q&Q)((z{ac9qG(ByH>XhCASPMZ#gqxs=6>~ zO}bl`+8$YP@4b8A$lTDou10jsd3&m|d8u+k%G3N-U((Zm?ZjPA^TMX2r+5BDs#032 z?8cjwwyjCeR{p9t>FJ|a_4ALeHT&j|rkc7IcP5**+aw{bXpf4HTV+2kfArhC*6NzC zUs`SHOSbg=dEMsuL7aL0>X~b2*nt+_WUV*V(wS;(N^RJh>g=bh)OF8gs_OVFldY=y zr&d#aKOLF2-~7{Rle=l5X{mMKU3b&<@rCm%ZtwjfQ{VPg-;t#6NUEvxKK#^F%$H#N zc$!eq#b<6k`}XH<58mnByVlgUu;X_=f8D%R+wg|{HT!C9ce1v7v6A}r+wr7#&r0nh z8Lxg^yAefg-h>Rwna7(|x0G~C3!WAChTQ6RR%mC0yr-Ytc0GRc+^r2aKDXi=KuuLt z&yTNGdy~~*7s=|L#j%z0Ew|36T3X+@{MzN$ug*KwWZRPNwx#ynx6!W0Qk9!;ok~{j zS6Rn~q-VoY*TEIfp;X`2`BN*No>bqS`6I8Mx<>bOnB3NTZZyeiRd=$gd%0>On0sX% zKc8f!a?{;v-{Pgk3-?UsomqrS4Xrb?g|lcN^#1FYmMb^R9r`dtUWCZ4 zPuR*%vHP2!ohdZc?fjdcxlK(6&42T=VKWBJhm&S%>ty+(AAPtFVx%?0srm z@t75^zO?Y^ z>XKANF+!&53ZG`)eH=7{s|&oe6TV;Jn|UURbyh50I`QlXUqh1`P3bbj%Z(kh(g*h@ z@?l`b-v{5pA`o6~>@Ri4EjU4h-m#DIR6N~-#0~ZBBrP4YKKjAfu&K8vEHPRsvrpU- zvx)ndpu!X*8rWxCJ6;n09V`h44wzKENr({io$thvgfo0FBcBQpLs(!d-G&qFG%I|$ z;3C#08Rad!p_cs%I1m$5ICXz6ai@5faNvXuy^d_+IlPhRrFH0~)u`APcjWW2k|@J- zNzkl+CtP?=i{Pw}GWU>ep`AYhe=*?<+O+!DXgd(=6xqmj*`Yl*oFyV_HGm^S3le2= z!GxL7*ezn}-^z}Mq_I@g9%yX*q%;`(lsIpei4+s=xO=i!r%Bw!wGgl+@6(C8}bN@@IHob+cU50(=@&#|E`GTG`=) z0)2~48p`YA!!&tF#L>Uu<)sGxJxXp?2=5;79?_B4pGM{6Q9Yix6Qu)hsGK}5p6cJ? zeWEsAtF+6N@mlyE@EE)nRf**w%mFd07cIN(TI>b;>8e! zqfiJwrpj75ZiwKUS5&w*-}f2h_Y7nu1piF6MOG=Ax8k$d7ehz{xj1t=t%JJqS-|(? zJAj74qq9Okc|bp&lY~hm9cHK%A$4cEYF%bbVF-@I5HIvttvb8d6pxOIiZN87?!dr^ zlhKbAF#>oZ<62q_5(dFZ){2 zKuc5^0n_6{uPRD?4l#{#IHsOa-Ro;Ga6*|2xSW=-=ILKc3p!%Z@^DuEpB}BlTR?>w ze|ogeKh~plj4OKRbHOU1ht$C5Sxk@YwzF*JvqRv#u65XDhApTzXsH{LlrU4iNZC zRcB>nD$J~YmB$HXWI#%V{6`C^^QsZ{&x(RcM%9$*Y?f+yz3Mz|0TW(O~Ur4s2zRl~6`@=*bLS&&VL$s;DX;A^b3% zfhzz77(VKL!2NH`=_VQ5Tb$UG|C|{l#uqqLSfS75Q(6Xbgi7P+1H!4vsEaI{XSMeW zBE=*~Q(8ts`TU-!)&LK8a-52Q6{n*zi1(*w%y0#wQPY`_dd#JtF%3cL}VhXJP4Wt>{OSYLoeEbt@@;Vujjq%MPit!wtA2BaZ}PtvI2 zB|BzLPXP!QsG5Oo0uQ60=wPG997laB#^~@BX3qr(r!d!I^CK;3LHoYSQ>?y zJ$XC~3_UO*e6PhhaCR)F=Nqt>JeRPS5DSFeC#iUWe51LAB~349E%uVxbC0QlLp;}P zOT{un?YWO#WiR@=$Eo5j5#W6@N*tXA}9O7FWvDGnb)Q~9$)A=s}oJ^-JvbmVRCuHykP-$>Vn;meT zLjUXto%fJMxnVf}(sTopQGzuU*NA(I6{gA7ktbhAf%usW-={l*n&33`AJYAg=)!_C zee~bZ&wr20Y};WYlp#+o4A>P5B$tX67r;{pRHAg#{RR$m*hCK)a-o=lk?@fnd7zMR zkO%Lf7ZLjDr%M-IhUxMGUBYzH=)-9Y4D-#A!5kNH5h2oU{#>t4g?v8pbKiY*m*;2) z4!S6y>q!|owvaN9-v}!$bgsbZc#`=(PS(3NlKo!V-(O~ zSpcx4OX*%~DCH`}(MwpHr0-*4Cqx25$Y{Hjspo&q!qoF^@46b+swJpjs&;)~ zwboQXy$Kz#%~V?R8>d#CQqoE9%6slxaZCeFrf=+;JN2HUYJTdi&wg{`9|e~>j;%P3 zQ-GF?zn`qjE-BNf*pp|n->aaE!f{Wu~OQ%=IUJVFIKF$ zde*AjD9odJ;h{sVu0g_e_1CRxq8snHHX6=wFeYj@xi>syQt!3zPF1%Mn#N3Gw&zenT9rwxj zYqgDlB@{1If34xohQ-e9KyVxBsNA@cS);_4x5aYstw%>kpmVPMWMgG8N+f zN4CO~-YgOlacCa9OA)-w*TN%xvF4|}0p~k3#t0L~KJf;*1X>ciINc%9gj5MTm-UG^!JBzy zy!xi&hN`V0FYNSBP@Mbwg{Dc-9){FJ{X+NAG)dE2*5`#rngSEex;|l&aMf8K*%_-B zkMijf1yzX_gWvIHxl}wy{Yr6ZvR$O1e+&8&t=Z+%wQ>g92s@bdiMPDaD)PBOJrN(- z#=M|+$19*`C0r!?$eI@Fp?jc9cFJziTC5H?iPZFOQHJPu^Ve}))N!kbgL6B6xw@gL znSJuMR{2A>mZp9ExH^unSI1J^j?-5v5_Y*Vuh!Ep+9c7Yw*<~NQCkW+T~FS4O_P11 zjQY2zX%Tz9G!1%G?Hq$dd%T@AZT+UG`7)NH&wy>2P4nhg{&{{47v8L+`@)+u`QyCu zA5@)KmA@Kr0J~T@JpmgWbvpx{7;_s$hM_HOM<6BqlV(?dMYOJnD$>LPvdly?96#}Q%D7%`y47HO9BqXpei50&K%Yas)GvDDxAo|7KiHa;k9apI{s9#X6!oa>jNQMJ2S(~ z+DQiSso!jIS~(3V>U{a+$EqBHv>du}SsSLi$T$kdxmY0zMF}~x2~WVw8oc*PU2qH? zj=I(%1}6fPuoD z`De;4kWnI&daWGBH2YrNV2T6b0&zGH3c-a*LfCgA2fnZU<3j z_yCFd4PNYs7pOtjOM$n@Y387uT;S>Y2c`_lOfNT)SY!%E7)+63U_g2z0LDSS{O}Zx zduijSm4Ky&B^!Vg5V_|=xM*TLV?7$k5wI1iLE)Ge3=*72V;$6~m6zuuD~$ z4-2g&!6wTH)5_&0tl}hb5C<;@5IOLN&nh0>kCdsj1@xmA(W;aw8_DXHbbuKd051|z z;Q5oe3~W1x&Z-SF=AMjFVxBv-jM{RE`Bd#sLwIv;#gJ}%WIPlD$D&?`kq1Bn^WZoQ zXUmw?4blN>?g0Yl42(VxK}3M!`m`HF8>c6u)UGmSWb#me)}mQK;=8nLoRPj-0CY%Y zHVi-8*7;0ls8jAd);ZL9wk@a6QZ|U2&y$C7KYhS|H4qIlV3&~1P|VE59@3$So_mVS z7#~@_KAt>~3kx`y4;H}2$OG^IywpNQ-!*$Q3lfm|{vl8SEW=Ts*Uk@(|JM++DLWvR zQ+Cp27hT??XS?a{U(wwF-I3(~i1JiS2i$U=raQYVHyNea9piU(gOn^Vr+ya$bt7sFEJZ?5_2E( z9s;qS&WpqpN z7Wi==u1o{a5cK&%|7VZqH{3Dfpz;8tI1ivO5_|3It)d* z2ED3%?(lmJ8_7Hvrowfd^xs`crouI?un?x_4buH8M^P0804k3)fy)uIZjT1`Tpq_j``ASClW$zC3%q{rZ(< zSNF2RyEu5q(fck{DfIG|sy%QAKtO>4W|*#n5>oEklzV5&edK;Ic?y6QzIxTwnRIoo zxVlo!9jnd#$>#oBzGU+tsk*D?BMZ@$@=c4gsF*h%eeKcZhMsvFDY1LrtMI(K@!H0e z`@nY(eDBaZhoCI3ESozB8(eqgZ*6&X;M&0Tv4vgBl|9R@-dpB7u6~%-FI9G>+B@e@ z-7BzEZTibi{crEM)w8_m(R;-(XeH=E%k}7TMf;Mo9ZzZ=U9CQxtUe6)2CJT~q^E1y z<7ME7c`NeJgT7Z#50(k#_L`>1CzF5I%r<; z#p@@FMe6#uY?DibqIFU=G1TAUSZMW!Y-gz$DRk%*8dUI_xtwl}n@{mBJ0C&H@e)u6 zlTW2O?tIY_cO;x~$4l-wt~t4B260gHmJ14@q~|7*q@=gS9r2R59kENvEE2|>s=`0f zU{KZ@p#zNuQ(mKyW0S#D*OX7ejuzHb=Ykd}sOh+JH`M&>2>W;gRQ;|S4*ovTEW4pd zZxW%QEG~}Mz_e2B3s9w-CTV)k`oyJp3yzDgg_&dle+7_05&aXbmizk!X|gpd8T=G2 z35E9qmG;r&Q2J^rWIY|IbP1rB^+8&iDqepD^}5=7#W%uj(%*|aL6ay;qBW)&*+Mz3 zjR1pbt#;^puG;sN|6v^k?#n`fJL3Q@!!9Q6Oa<;^U_i8@fiS=@DeEgLeR-F=b0Ssj zfb=BJyn!keI~#e$ORm)@rLBcZN(tUg#j5;~$Yqzj zm8?@U0yY?p=?XV-{@A1{)g+aoVkedSzOVar&wxWxa;Z|zt|02od)=>JzkcU;{NDHR z+mH#u3gV5P%NO&KjQ!r)uiHBd$qR=%_6;69mLsgXw-lKLH z&%#6MWiVnnBa-c>GKa_7_`E*So+s*_5#>~h`dxeqiMyJ{=Dlr{OI{TEDE&UyZ1N%` zl8}{Z)?oAMz>9@}3sK*nUuhZ>lkk&)IWb8K013bH%7By4T<@!eyE4G zFn>XPWd1rl@glV8nB-l2Rx)p4$KuP2G0BfL2SRFncoT`k>^vW&T(`F9mCxT)Ae28& zBY5J}7#-x(KUbALJU0Qs=vln*o~269NYd0CPZg@@o}fLN%JXZdk77iqYGsTIT?H&? z3i@q@F1aJWElEd`qey01Dtrs&P2<+wEg!BD$Iim5r{32rHjVU)ZWVf!{P$|&T6%cu zj5sN@-fJ7v3^eT4zh0cdQA-i-8mXwf@*euUPPx!(rTTp2Lh^@r;W<1yHVLmV{cNk3 zPxTU>PTjToBSUbkjrl(&lOr=->9byvtUAxp6(ILYjG=mAwaXx8!#(d9FjOtr-h?^^ zbD$7907R5}vV)X2x>X9E!UbQeYka=ctMf()icob$T7B>ZU#<=;y)4|m_x*P4jCqwH z!6*@wv||cc=Y2o;_jqC6%jhNgSAXF*^TfH&IJ)n5-lva^Nm#gR;SvmPCa-8tlnVCk zF|uc_wV0Nj*Z3i#$MQb+Q94vd*esnYfbh7Jmv(-;K@!428+>4r=SS*@yh38oZNR=Q zp;5{Hy!K+_JL2$*06p}Uj_xjXn+4fKo|P}3I(2rOl)v}%rlyI2B@U2;bOuo?Q#Z{) z#GrbRO`t~ANAl`L%Z|DhYDb=#)XDV*oo^vT5Hecsyt44VufYDt*9WA@Aj1PNE&soR zIcV#FRovY`Rpf4#_r>;X{loRK0#1c&?|!+n>U1a_GcoVu8MyuRS@l0erS(w^S52t! zPz80Ko}Aou+)GmtH?P@=&SmAbOR6k{T}<$9L>mM-D1ia4iE$u;u<_)Ln@4o14K^Iu zIiRiQmz2PFalC_v>GDR5Tt=+s4m!j7+>R1+uZAEU`0k_~K=mNL%cp!*DfD zgzXRr+dPMlk58zyZhNGsx23mhYqUMm{hzLWfAelZ1_4RFMXIy%I^}IU?i>LQ#=iN8bdZ`Y;jf~96Kjbd< zcFoHKTnSEq{+5TXExPUOkVHF`)E}_C8HtMnwsAg~p&$0;YA+JICn^`ml z>UTmOQLzdC9q*IrAfukG|yMZE^;ukkw!m>pEl-95~`8vWLv&X zWj-oU9V}Q7)*e_&q zzSm@Ag)*BA=QrH+hGB)?i_`MeWNkTFyX;#DY+eiWrvv>fft?=}e-aq{je2yyGY@#s z*}WWI>Dcx9zBdlfA5N7=)2>#SZ%>$B+nw>$rJx^gY)PS5MlPh9w|p4d536>D7A)o@l2?)axiol?GXhQ~h09~kThGp}xbIy}*+5E%cYUiGhwtf+) z0x$<;A-(Riau*$ISE_ywoI<^{X|IW_J-6oq6>fTh1~kC8f6aF!?K=X<#Wnk)JrR1V z>Uvf3kvD5ryc?H7YtfzQ=+2esZUY5iXy|XifI$c#g_OPJ?hblWs&fzN=2Otk$4MXe zv!Lss$?~)MN4$eutUvFzBk}PT>)>w3$Ne_Me_^s7blPBvfW`-|5PKyKm zk#Bs2j+6{lR_NkB>gYoDB$F9%m2Y5v;Xt?c$0pwW+YUe`j z9J#fdDS9O^Q_#q3taPS`a*B3O&ec7d7jl5um)M*oRxCg42QU%6NBe8HmXm)GaKVq1SO z`HD@`M2E(f0rhZ--C{t%RhWEUr!Qi%M@ZQsny+-#RIV=2(MwX*2RS5kXD3l{6a8cZ z5dv#nNQrnWSqW@yWyrOV``}{6kBtm{E1#h_%4V(Fq0D7klc+Ja5D1zwLb^aXa_O?Ho=}cohSZl7+H@)aO27*f zFXUB9*A43$pLo4N>}z5kbwRvGRj;>WzDDIMQ`76^=hc{51J>KKmPh5Ch!h~M0D2Y2Y@t!&xl1@E|71@vB@Z(mngtA(wpyTBd(5KWfD8< ztln4FPWkW1SEFG>d=+qpb7SKdpM!k0klGdphy^nDu$B#nLeAlU8u@?D>pL2txoxWV z@H+Ima88>uBmXf-9QC&9H#qo9kUEXUJNIL74Z?pL+eakDJ5A>Ci<6hn!;C<~m6n2CQ8TDI7>Ya# z?{N^lPdim1dnb&FWsBALv_n|?+%;_jo6#R>jvpV4TC(o(u}kDsR&(T$wT_cVS9sgR z$;|1_jiNpqNmxVn3pDny-l<9u`vI?44O}8N-Fj~WsNAH=ZmZpnl5p}PYifk8A{&*8 zX%wwe`Ag5gjjo)bD^9}{Mb-j9Qr4-~hpHpLL)m=v5^_0*!$!=8X3dvkSv$Ns$H+ii)TQ#H zPavD>!ttl{6r@Z#`_w;|)L%J`a-r<31Gc{gQz;U5ho?Qaez_N2URio;59WVkZ(1_3k&+ma|w zHZNI|FC;yw@~*VEYr*oH%KEj+Xu2}G9QaA)k1Ky}TdjO_?(lDd<=38EeDc~ei_aum zmnK(&I|%6QS$H&QO`b|Vm8$Jb`8TCqo8|^Gp7NBZkvJmfqBHTW%UebY*)^%h(LwdFCNp^9rK7EdHY%l_5i7F69|dH0YB zZ3m-q?9vC2=(`l)>`9 zPT=s6VKIbpc$;w-0u|4czG#ZW8qZms6bDGvHd8{x`HVYe zC+M#O+$dNtJEH6UVt%klrn7)OzhnASc!jx8YcO!|{6k=C{u4xc+?50G)tMzcXNK1u z&y44s&dP}=!M^E?oN;YRXXy%od+z}x=fI!u^NwnxY!NGDXX{)<+%X?8%Ood82?O#W;j=7x_MoxOuE8ZZ2*7+~lSMuyJ18Fiis0SfJy zapi%biy$7*J=d6|mqX`zjVDA*u*+a7w}@*f%_GJTdu!1}5KWR?HtRJ+4Kdx`)r=S3 zRf=Z4-|;@cyUIR|$qS7A7Sa}-;2^m1SY&AI(j;{6`RaWLo!PxM5j2K1C|U>Zr5pbt z6X*2BsCt$Hv{D660~zV9Be)0xfNP5(#JtD*1;+U0m?IsU;&y*Y%Jq_ zHxX|GUj`>nicR3;$pRfuklS1(p3w*bw~G3!gpNV8()Z;ar^U(NE~B9|UPREE|IeAC z++G+VF@-9nU`O;ge+-VFdt022WH_kCd5(it<8zfczHq3xlP78HoP=kJv!_%W-De8{ zM%CUVXLeuXSt9?KY_xohXNi!SI1WAW`SFf8&_Apyj=^E~rg7ClbjRt-II+(sqKO$| zopHV}21n$1?ll}`Q!lhc(iqZ~NaEWX7*G&{9gMS+c}MA)!6h-(3uF%BYdnis0=1=> zKp+2*j4&L9Jo78Wvxp56_8#B}odAw7Iz!@8!?wRr;2Y=!h7P6+k0E zN9R*z#Jl^f$iE2#P8zpZEL=rLVoL&o*XB(tMy;IQMY(ZV__8t;-P0n(AFNDGpGWs5Ig0#QF9e@Y3*ffvUoKwMtDprRw#c|s#S z!0r+L13z${eN)J!Z_L^sJ9_-k@S&#<$RRL|&vlV#M9bM=5xm0@CN@ zI6A0DGFqMk!kDDO*wO+QR_GfG0VzmqA%B9xa0Xl5Oh#!mva5q^DMd#`gJ)e@ALZaI z{w>u?x6KeQM^dbh>wZ;8gK3Q#P$ymLEmR#a!Io9JJpo&JRzD2}kU<(A)BuYU7427<%)F6_POCiYueSUn8`^&Ti?>=4|ct~>y~6`_hl+;6bpWD zh8k~K@w@24(SKicV*fj>t7RQG!i~xOZ|RAu7PPfD6J zVPkiud;2nkV5S{gGg}9iM-{8NY!GOYA}SK55k7OlNqxpuAxZ@rgq(r9+LtDlpTe8j z9es|J@&QNsezeB9$2 z+->=Iw-xbU6k88^Y^rOM-_bz+UkJuA>hwPyd|}4bS52>)Uk&9-@`RM45C|h?nl}q+ z1*905X6oMqpD`PwtHHbY|QnhzDSDlcZh)yud~Tiv?9SDq?-y^w@alr>ula7qC=;*4&F0%jCS z&*`#6r4Mei*ZoBV92yX17{5ln91qR$C1$iQcSg^6V}6#(@0~g% z-i%fgt4jcDVi2=lU-Qo$7P*YyoczH8tI9WwoFWzjKx`&36MRq82brWR?kjHi7vC>( zKw{lC>x-2YS~-n9V8$nEDt_TF{-7vhM)!z5dViI_D1EZw!Y_NJcb_u>oK_bV6mjb~l7|hla zN zBO3((?+&Ot3p9}JG^`2$@=Yv=dQB5@;L_wI&ZHB>3H++a8F_9@Hbg6c=uC{AC+EspT?bF3)V=qRUW7G77jHS>>V3?-PJ^RrdXFz+F5CLRYlX3IY z&Ve&PU_?&5H2dsyi4l)Xd$nu?hlkJ^3V(ky+7|~QrbH8>npx8e%-L>EUmDxAci)*r@I%Wr zq87Ayg$w$hnB}jSu22q(enXFl942YrT*w2_JfN<|I(G%m>qd?P9Z_`Y;^bu30X_^J zfU%Y>8-6~r7O#B&rBr!m29C0z-yT^USq(I? zp|AFIpnd7sa?{@iw#l#H0r@oq(?N|-=VLXh5moqWoc5vP$XH5FzcCLx?ZFMsM*WL_ zzz*+3IU~`i0i{@v`#(=_`<#NODfk5i^AyZc5Tk(X2Fl|Iveu&)F$uG_{Rh4|^2E?k zw&>`gqX)9Z$ByrR?1|%O>N5nlpkZV^j#iel#j&x8^A|7B2*Nm%U#5Z>sKK}l8Z)w= zu04g9al3EkItYG!55!~Z9)HG5UsUX|!e z9$U3XZ`gg}O2*ZB!{zybnIIk4+>7p1UH6K&XT{a~nbqQOg3qjMm@CaxhUeUwlCrgu zjh~ck)E)RO7q4~gO?U16$e->yuu?rZH=LZK#f|ZF4 zngzk}bXCvtz)G-hZt#Y`X3gK2_7frn{^xKqVJ*~>4z=7+tq0;~t-K{&-f|-lx^{T+ zaHetNXC6DTqPGH)xBPCAwXE+mH@@#J&vnm|ZMkNpV$Xs#Q`fj){edgv4PGl*Ecsz6 zqyo6;3tfvYM!(;d@-=7t<=1vB?nwDtGvT_oc3j`F7T%N&Z(0d=FYL#Z<`Wo!)c_7W z)V3TSgq(%$|RJ` zZ%O-_;W4kWX04(nUD2{q(K>%u=<6fvyQOD&c-6J7%VMO$ix>M{-qs{+Sd6R?b6>w9K!+2-$XYIdn~{7SP}naz%pDe{j%IQ z9JTzi-7~z~^2=Q&gz{a?G2J*I;!+9zr)}cSze4aTas5TFT64Mna~ki5+xj1ND9mX3 zd#z|*+AqCf9ygywxzARDLI$qIpy}puY$Ilg6`eJmHsP3rnK+DCF}&4jSf1~jUk?}I z$yxJj)|lPk@M4ZBY&Ys(%o!^=RXiun70p?}%@xI5;N~ndmScF1An>#17o=$ESQu5( zX|-b$u)}@%Qe^6nV&|DEdv0v}dDi&|%0U&$sW4fbT8^BLpU$zfBXa44kRZ4;B7--v zhC^7?S<4GkxCG$T+;+fD!`TaZRW#zPJ<_02FlS@W0*x-7^3aExs~AWMtIJ11;-BQKM)W=*qJ;t(0sLy$2iL#Yr48Rks!r=>R6rhu118$+mhCgrY|*@R#zgHkYq|icHfEnG`nDuHV~%;7 zdVLgaqW+01g<908Kk?jp&O)n8PVa#Jb&kmY8^uribOURkso-#YY9gkdD}58SRrMI? zbf_rwVV$*$N3uoF!T4dcBwMWFu;sVtnTrUrrVH`{{aP8&p~8EurvZ4nq!Mxf6@%J~ z(}b7bMni-p3#uF=TwYS2X9|!>&H=u_laePwoFuDE_kbE#$#IsxPVdR5c3zOj zE@`?qqR>=sZS>5=i_aT0dEVtSM3etV6#n^DDdX`keEYTUWUA|FXZ*7f?A)6MfU>32 zlVyvKB@cos*MO)=>r&AN#qSos?OqLRqHCZeemHc?Ce^eNaa8@5;;rYeKfhG}=7p82j)ehw#gXermP~JstW|fVtGiaJdlnC5f|b`s7e|vPR)gJ{ z>d3-@OjToY;Ckocz|BBa#$S^Rru`eBSy(ubXk0wJ8i3*F;KKN#bIn_y#vWRajXl%7 zb-}7$Ye;(=lHF-9fWe=5JDH8Zs@dCQB~ zf*mwKY48WJOemZQAIenKC;L*B?Wu~6OnFV>OycQOuq9Jo_gP7Cx%(FU_qr7~p1MWP z&smj_-?8l-iz4CY{YL&-Zn{e;jzeqUtx4Id|L5&TOvoRnh3n61AE_vc+D1l32JwH? zGC276B-MyoDLEJoAyjX1WMuI8;D}6X0PfYOm&E?ezK~*!<60PfcDNn^K*_e@gdV6f{t-FN84742<$xrA@o(TuzAN3bZ?M|QX>@Zm)36~^-<+v!%=B!{ zbZyQwwJ2pnX6sQCi1NOjw}TwN8K_PiTO3xb>YZXK5K(Mu+zxBqibIV%rHX2$M2$ni z7D*N*k1aJOpL*M!F5je-syEzH2-yE*?~*0icl|;-*r9mT8(s-YE&biT@`b6ylgTI3 zH62S+sq)@**=9wp3>1@2_nmU}p=XM$)$F>lfx@Pz%+}gOJKe(Zba6qkhpbhJrbIkBka+QW=N$=2rORRchAHEGMi0fFF=^G=l9);kECrXQmXCedxb&TLba$$0ce-v5ReFnF=`H&A z^d^quZI_phFZV8eE4^`Bs$pBYrjK&>>bZM!av!_rR;e|xa3&F7Jby<*RB6H&=%XZ4 zzdD~C-Un$-@(_N)b}MEbxGkmz2rcJ!X+y{ zY7akWc-k!OGYy(DwGEj=!{Bpi1lKfBWJ4>38{065GcD~I3~pROHgt`e2Lrug1Ldi# zy|rn^Z1vxC`xg!-29o~7qv=3%GQPC$gCp-A`7n?Q>`J?LD_~5le)OEDd?7x6Ua@h~ zjzcF4PbQ8f8xv2ZgBzBtOY!A>KRNQ_BOe7)!2@Z}pyJ?sPAOQglyKA~`NN6c#SR7M z6;PmCDi13jj(R0bt%1c|N*O18Qm`iR#NuO$pOXQ}SCwd9tW$!Vgj4(4#KhvLQqIW= zDs{`^CIw!-9Yu+$k7(6N#kOT66Iv8E42&Q(8vdgf6SDr=Hr_hStWlE!)*prnNKE(M`|bzS`Bzt<>Adi%|5Z z@|bDdh7tO>N!qsK_AyR8tZVs!VyUb$;a@COY@EbQY)Cd<$86-JQ>tzPrLs#Y;iOCQ z1QrGofyDUrN?QX%{dFUZuoZ>bqsJd7Vlbmk^zKR4>8U7hrP>Z zeq5Vw-}_Nh$~Ab)VlHzkZTwgleOeGp`4exKEFDi(cBlP4N;lu?q4mC(qnpLh+``GN z5|AFf*E^JLoa~coHzdceKdWr#WWQ+U9h}@rU$Bd#yJ^ns;pkqIm^6>5ox9H@)io*u zYGS{M#^wPvF=(QS98?pJ@|{C!;;>1K+av0QA(R?YhSda4t7-Gg7(W|2mtt@K6Ga_E zv_(3Dcb?F)d(=U^xsQe)mX`cQMG3xa#{N(t?c8g+T}knW4MEP&`@(?eixlYQP`6^^ zTXxZ(4o+fwZBj}&YAh(6R2LMEdc_BqaT0zvLW-ZG#$v+B3Mmv$>{u#VI`*z(d2=ef zEgkGrxY}4roc@L0`Pw^S&N-+}UVJnrT<$DHTx|(7MqMMtvGQUv<2sV-nrG9~7OM}7 zLbT&{FGU~LI-K2DdpU`YP1L^-85D_9QD#jDdVV5thRnm21NS? zIT;d5WH~1*M6!~T@HrD&n3x|`!knz8Ay>oET3WP;JgVa)Pgh!{>p9sV-r2~>Ci()) z{H)T<$qlsHZsceS)icV`R?&%VoNT8~?BHmp7_p)?E9;Z~>!k{}sInOycV`P{oKZVX zv5s4;QS9<+udLe}(N9=f(N$Pxv0RzqN;G(w zlhtBns^Mg3=~|j86?*Da?ek8{CLMl zMXBKawC8{l<;PlSF>B)}dQc?*Iyl)$WpCnW7e%`{+9P_smy?^R*SBzVt7yAzoa_@D z0(XYeFFC_^cJQ5}HeR9>+ffsiA}4lr%);BHl)8yZ#}d6sOQLV_LUMem=Yt*Z?ns5U zroGz~ko(AvxfXa3H6#kf24BJt7;}!3pjlmSRL@u6@o@5tMyK`f#t2g!PnxZpK^CJ% z7+~rmvTk&BblH-c6e~s08SXO0#!)*BN(V=A zMmVgLaFiJ=`%>dle5q>rcq+O*9qCV(?@&tlu3J=xiv^(t^0|!f41vAzWvs3>YgHPZ zZf>*IK+BV`EN)jUh~M=16f1sF0jF=Fg=ypd7spP4va|!6*L;Um!GTUHj0)zW8?G+N8l3zq8yPVtnwM?03HN>pP$Q ze7-ZkW-@66c9j3Jd_hC#57|jfZ3WGbAlN~lAO|fV2Rp>W3pj4c0&x^eVJg!cbqZEF z8dHnJNo}eNDW`*VIGRI>s-r_+cZ^N6U{pyiU7JYHF+1Q64L@_1X@v(R&V-(o{zfB!iO{0&Dpt`Yjal$g($^YxWau~PA7&TP~dBJf!jf0 zGL8x;hijMT;vMv=MkmaSDr1KVEVoB_(RD-tj{%w_tYP*Y|; zD(B0=GRwPO$*S4;*{WT(`0^|dmY5xi{Jgu&3XHoYyYCd6RqEd}|Ezb+qOi>1xjB^7pNCAZoZUa3z zligFZyaPHBX13%au@nR`FC2n@^1?4V*g~P4i)|^9JsE)3A@^FjmSpaKnWKafM{ISJ zth`5#M=+|YRW+y8-kk+eLtvb;TQ;kNpe%G8>bSyM^jKR4Sq6d@1AdD4tC7*>r8aj( z%0ylN)F$Y=p=)_=&63F{)5Zmn{vggSt0^Jvzw=M$v{=}v!wX6!SRWZB7Jdvd<3#X40LQ@&bs(r3uMETi=u6WZ?)T6B7OgdfeL|E0lqnW zl5*#=ETGO_fQI);*Dsx{r${ZX_;#Fuf^8gER_4^HwbB2BjY2kY4czk$beJN>z*8Na z9l75<`mlFsYo?)U#_(^w{k!M(ddKee?e~uDb&frM(mim9h%x-A^Zc%Lzmvk!uV?;h zXfSjn&OxqkI|kAB#-#E?=bOsUcvAUAn^b^MLxK*2z!Q-sv56evSy;{oB?w9Ir!9gr zr=aumFeN`R1`dEi^{2XTn_rmQ^9R~slXPjrO$DWf8Zv57)Cup}z%i@osKYd!z&1@j z1eBFTo7@(W1jV?<-l3-*d_ilERlCg zya%qKV2lq5!D=&waL@0k>v8|kM%T7_fQA|=f(Li!n+Tdl`V3C*W*Z2ayJ1r{&Ea$S H_#yrq69dr0 literal 0 HcmV?d00001 diff --git a/.venv/lib/python3.12/site-packages/cmdstanpy/_version.py b/.venv/lib/python3.12/site-packages/cmdstanpy/_version.py new file mode 100644 index 00000000..11ebb7e0 --- /dev/null +++ b/.venv/lib/python3.12/site-packages/cmdstanpy/_version.py @@ -0,0 +1,3 @@ +"""PyPi Version""" + +__version__ = '1.2.5' diff --git a/.venv/lib/python3.12/site-packages/cmdstanpy/cmdstan_args.py b/.venv/lib/python3.12/site-packages/cmdstanpy/cmdstan_args.py new file mode 100644 index 00000000..07040d6d --- /dev/null +++ b/.venv/lib/python3.12/site-packages/cmdstanpy/cmdstan_args.py @@ -0,0 +1,1005 @@ +""" +CmdStan arguments +""" +import os +from enum import Enum, auto +from time import time +from typing import Any, Dict, List, Mapping, Optional, Union + +import numpy as np +from numpy.random import default_rng + +from cmdstanpy import _TMPDIR +from cmdstanpy.utils import ( + cmdstan_path, + cmdstan_version_before, + create_named_text_file, + get_logger, + read_metric, + write_stan_json, +) + +OptionalPath = Union[str, os.PathLike, None] + + +class Method(Enum): + """Supported CmdStan method names.""" + + SAMPLE = auto() + OPTIMIZE = auto() + GENERATE_QUANTITIES = auto() + VARIATIONAL = auto() + LAPLACE = auto() + PATHFINDER = auto() + + def __repr__(self) -> str: + return '<%s.%s>' % (self.__class__.__name__, self.name) + + +def positive_int(value: Any, name: str) -> None: + if value is not None: + if isinstance(value, (int, np.integer)): + if value <= 0: + raise ValueError(f'{name} must be greater than 0') + else: + raise ValueError(f'{name} must be of type int') + + +def positive_float(value: Any, name: str) -> None: + if value is not None: + if isinstance(value, (int, float, np.floating)): + if value <= 0: + raise ValueError(f'{name} must be greater than 0') + else: + raise ValueError(f'{name} must be of type float') + + +class SamplerArgs: + """Arguments for the NUTS adaptive sampler.""" + + def __init__( + self, + iter_warmup: Optional[int] = None, + iter_sampling: Optional[int] = None, + save_warmup: bool = False, + thin: Optional[int] = None, + max_treedepth: Optional[int] = None, + metric: Union[ + str, Dict[str, Any], List[str], List[Dict[str, Any]], None + ] = None, + step_size: Union[float, List[float], None] = None, + adapt_engaged: bool = True, + adapt_delta: Optional[float] = None, + adapt_init_phase: Optional[int] = None, + adapt_metric_window: Optional[int] = None, + adapt_step_size: Optional[int] = None, + fixed_param: bool = False, + num_chains: int = 1, + ) -> None: + """Initialize object.""" + self.iter_warmup = iter_warmup + self.iter_sampling = iter_sampling + self.save_warmup = save_warmup + self.thin = thin + self.max_treedepth = max_treedepth + self.metric = metric + self.metric_type: Optional[str] = None + self.metric_file: Union[str, List[str], None] = None + self.step_size = step_size + self.adapt_engaged = adapt_engaged + self.adapt_delta = adapt_delta + self.adapt_init_phase = adapt_init_phase + self.adapt_metric_window = adapt_metric_window + self.adapt_step_size = adapt_step_size + self.fixed_param = fixed_param + self.diagnostic_file = None + self.num_chains = num_chains + + def validate(self, chains: Optional[int]) -> None: + """ + Check arguments correctness and consistency. + + * adaptation and warmup args are consistent + * if file(s) for metric are supplied, check contents. + * length of per-chain lists equals specified # of chains + """ + if not isinstance(chains, (int, np.integer)) or chains < 1: + raise ValueError( + 'Sampler expects number of chains to be greater than 0.' + ) + if not ( + self.adapt_delta is None + and self.adapt_init_phase is None + and self.adapt_metric_window is None + and self.adapt_step_size is None + ): + if self.adapt_engaged is False: + msg = 'Conflicting arguments: adapt_engaged: False' + if self.adapt_delta is not None: + msg = '{}, adapt_delta: {}'.format(msg, self.adapt_delta) + if self.adapt_init_phase is not None: + msg = '{}, adapt_init_phase: {}'.format( + msg, self.adapt_init_phase + ) + if self.adapt_metric_window is not None: + msg = '{}, adapt_metric_window: {}'.format( + msg, self.adapt_metric_window + ) + if self.adapt_step_size is not None: + msg = '{}, adapt_step_size: {}'.format( + msg, self.adapt_step_size + ) + raise ValueError(msg) + + if self.iter_warmup is not None: + if self.iter_warmup < 0 or not isinstance( + self.iter_warmup, (int, np.integer) + ): + raise ValueError( + 'Value for iter_warmup must be a non-negative integer,' + ' found {}.'.format(self.iter_warmup) + ) + if self.iter_warmup == 0 and self.adapt_engaged: + raise ValueError( + 'Must specify iter_warmup > 0 when adapt_engaged=True.' + ) + if self.iter_sampling is not None: + if self.iter_sampling < 0 or not isinstance( + self.iter_sampling, (int, np.integer) + ): + raise ValueError( + 'Argument "iter_sampling" must be a non-negative integer,' + ' found {}.'.format(self.iter_sampling) + ) + + positive_int(self.thin, 'thin') + positive_int(self.max_treedepth, 'max_treedepth') + + if self.step_size is not None: + if isinstance( + self.step_size, (float, int, np.integer, np.floating) + ): + if self.step_size <= 0: + raise ValueError( + 'Argument "step_size" must be > 0, ' + 'found {}.'.format(self.step_size) + ) + else: + if len(self.step_size) != chains: + raise ValueError( + 'Expecting {} per-chain step_size specifications, ' + ' found {}.'.format(chains, len(self.step_size)) + ) + for i, step_size in enumerate(self.step_size): + if step_size < 0: + raise ValueError( + 'Argument "step_size" must be > 0, ' + 'chain {}, found {}.'.format(i + 1, step_size) + ) + if self.metric is not None: + if isinstance(self.metric, str): + if self.metric in ['diag', 'diag_e']: + self.metric_type = 'diag_e' + elif self.metric in ['dense', 'dense_e']: + self.metric_type = 'dense_e' + elif self.metric in ['unit', 'unit_e']: + self.metric_type = 'unit_e' + else: + if not os.path.exists(self.metric): + raise ValueError('no such file {}'.format(self.metric)) + dims = read_metric(self.metric) + if len(dims) == 1: + self.metric_type = 'diag_e' + else: + self.metric_type = 'dense_e' + self.metric_file = self.metric + elif isinstance(self.metric, dict): + if 'inv_metric' not in self.metric: + raise ValueError( + 'Entry "inv_metric" not found in metric dict.' + ) + dims = list(np.asarray(self.metric['inv_metric']).shape) + if len(dims) == 1: + self.metric_type = 'diag_e' + else: + self.metric_type = 'dense_e' + dict_file = create_named_text_file( + dir=_TMPDIR, prefix="metric", suffix=".json" + ) + write_stan_json(dict_file, self.metric) + self.metric_file = dict_file + elif isinstance(self.metric, (list, tuple)): + if len(self.metric) != chains: + raise ValueError( + 'Number of metric files must match number of chains,' + ' found {} metric files for {} chains.'.format( + len(self.metric), chains + ) + ) + if all(isinstance(elem, dict) for elem in self.metric): + metric_files: List[str] = [] + for i, metric in enumerate(self.metric): + metric_dict: Dict[str, Any] = metric # type: ignore + if 'inv_metric' not in metric_dict: + raise ValueError( + 'Entry "inv_metric" not found in metric dict ' + 'for chain {}.'.format(i + 1) + ) + if i == 0: + dims = list( + np.asarray(metric_dict['inv_metric']).shape + ) + else: + dims2 = list( + np.asarray(metric_dict['inv_metric']).shape + ) + if dims != dims2: + raise ValueError( + 'Found inconsistent "inv_metric" entry ' + 'for chain {}: entry has dims ' + '{}, expected {}.'.format( + i + 1, dims, dims2 + ) + ) + dict_file = create_named_text_file( + dir=_TMPDIR, prefix="metric", suffix=".json" + ) + write_stan_json(dict_file, metric_dict) + metric_files.append(dict_file) + if len(dims) == 1: + self.metric_type = 'diag_e' + else: + self.metric_type = 'dense_e' + self.metric_file = metric_files + elif all(isinstance(elem, str) for elem in self.metric): + metric_files = [] + for i, metric in enumerate(self.metric): + assert isinstance(metric, str) # typecheck + if not os.path.exists(metric): + raise ValueError('no such file {}'.format(metric)) + if i == 0: + dims = read_metric(metric) + else: + dims2 = read_metric(metric) + if len(dims) != len(dims2): + raise ValueError( + 'Metrics files {}, {},' + ' inconsistent metrics'.format( + self.metric[0], metric + ) + ) + if dims != dims2: + raise ValueError( + 'Metrics files {}, {},' + ' inconsistent metrics'.format( + self.metric[0], metric + ) + ) + metric_files.append(metric) + if len(dims) == 1: + self.metric_type = 'diag_e' + else: + self.metric_type = 'dense_e' + self.metric_file = metric_files + else: + raise ValueError( + 'Argument "metric" must be a list of pathnames or ' + 'Python dicts, found list of {}.'.format( + type(self.metric[0]) + ) + ) + else: + raise ValueError( + 'Invalid metric specified, not a recognized metric type, ' + 'must be either a metric type name, a filepath, dict, ' + 'or list of per-chain filepaths or dicts. Found ' + 'an object of type {}.'.format(type(self.metric)) + ) + + if self.adapt_delta is not None: + if not 0 < self.adapt_delta < 1: + raise ValueError( + 'Argument "adapt_delta" must be between 0 and 1,' + ' found {}'.format(self.adapt_delta) + ) + if self.adapt_init_phase is not None: + if self.adapt_init_phase < 0 or not isinstance( + self.adapt_init_phase, (int, np.integer) + ): + raise ValueError( + 'Argument "adapt_init_phase" must be a non-negative ' + 'integer, found {}'.format(self.adapt_init_phase) + ) + if self.adapt_metric_window is not None: + if self.adapt_metric_window < 0 or not isinstance( + self.adapt_metric_window, (int, np.integer) + ): + raise ValueError( + 'Argument "adapt_metric_window" must be a non-negative ' + ' integer, found {}'.format(self.adapt_metric_window) + ) + if self.adapt_step_size is not None: + if self.adapt_step_size < 0 or not isinstance( + self.adapt_step_size, (int, np.integer) + ): + raise ValueError( + 'Argument "adapt_step_size" must be a non-negative integer,' + 'found {}'.format(self.adapt_step_size) + ) + positive_int(self.num_chains, 'num_chains') + + if self.fixed_param and ( + self.max_treedepth is not None + or self.metric is not None + or self.step_size is not None + or not ( + self.adapt_delta is None + and self.adapt_init_phase is None + and self.adapt_metric_window is None + and self.adapt_step_size is None + ) + ): + raise ValueError( + 'When fixed_param=True, cannot specify adaptation parameters.' + ) + + def compose(self, idx: int, cmd: List[str]) -> List[str]: + """ + Compose CmdStan command for method-specific non-default arguments. + """ + cmd.append('method=sample') + if self.iter_sampling is not None: + cmd.append(f'num_samples={self.iter_sampling}') + if self.iter_warmup is not None: + cmd.append(f'num_warmup={self.iter_warmup}') + if self.save_warmup: + cmd.append('save_warmup=1') + if self.thin is not None: + cmd.append(f'thin={self.thin}') + if self.fixed_param: + cmd.append('algorithm=fixed_param') + return cmd + else: + cmd.append('algorithm=hmc') + if self.max_treedepth is not None: + cmd.append('engine=nuts') + cmd.append(f'max_depth={self.max_treedepth}') + if self.step_size is not None: + if not isinstance(self.step_size, list): + cmd.append(f'stepsize={self.step_size}') + else: + cmd.append(f'stepsize={self.step_size[idx]}') + if self.metric is not None: + cmd.append(f'metric={self.metric_type}') + if self.metric_file is not None: + if not isinstance(self.metric_file, list): + cmd.append(f'metric_file={self.metric_file}') + else: + cmd.append(f'metric_file={self.metric_file[idx]}') + cmd.append('adapt') + if self.adapt_engaged: + cmd.append('engaged=1') + else: + cmd.append('engaged=0') + if self.adapt_delta is not None: + cmd.append(f'delta={self.adapt_delta}') + if self.adapt_init_phase is not None: + cmd.append(f'init_buffer={self.adapt_init_phase}') + if self.adapt_metric_window is not None: + cmd.append(f'window={self.adapt_metric_window}') + if self.adapt_step_size is not None: + cmd.append('term_buffer={}'.format(self.adapt_step_size)) + if self.num_chains > 1: + cmd.append('num_chains={}'.format(self.num_chains)) + + return cmd + + +class OptimizeArgs: + """Container for arguments for the optimizer.""" + + OPTIMIZE_ALGOS = {'BFGS', 'bfgs', 'LBFGS', 'lbfgs', 'Newton', 'newton'} + bfgs_only = { + "init_alpha", + "tol_obj", + "tol_rel_obj", + "tol_grad", + "tol_rel_grad", + "tol_param", + "history_size", + } + + def __init__( + self, + algorithm: Optional[str] = None, + init_alpha: Optional[float] = None, + iter: Optional[int] = None, + save_iterations: bool = False, + tol_obj: Optional[float] = None, + tol_rel_obj: Optional[float] = None, + tol_grad: Optional[float] = None, + tol_rel_grad: Optional[float] = None, + tol_param: Optional[float] = None, + history_size: Optional[int] = None, + jacobian: bool = False, + ) -> None: + self.algorithm = algorithm or "" + self.init_alpha = init_alpha + self.iter = iter + self.save_iterations = save_iterations + self.tol_obj = tol_obj + self.tol_rel_obj = tol_rel_obj + self.tol_grad = tol_grad + self.tol_rel_grad = tol_rel_grad + self.tol_param = tol_param + self.history_size = history_size + self.jacobian = jacobian + + def validate(self, _chains: Optional[int] = None) -> None: + """ + Check arguments correctness and consistency. + """ + if self.algorithm and self.algorithm not in self.OPTIMIZE_ALGOS: + raise ValueError( + 'Please specify optimizer algorithms as one of [{}]'.format( + ', '.join(self.OPTIMIZE_ALGOS) + ) + ) + + if self.algorithm.lower() not in {'bfgs', 'lbfgs'}: + for arg in self.bfgs_only: + if getattr(self, arg) is not None: + raise ValueError( + f'{arg} requires that algorithm be set to bfgs or lbfgs' + ) + if self.algorithm.lower() != 'lbfgs': + if self.history_size is not None: + raise ValueError( + 'history_size requires that algorithm be set to lbfgs' + ) + + positive_float(self.init_alpha, 'init_alpha') + positive_int(self.iter, 'iter') + positive_float(self.tol_obj, 'tol_obj') + positive_float(self.tol_rel_obj, 'tol_rel_obj') + positive_float(self.tol_grad, 'tol_grad') + positive_float(self.tol_rel_grad, 'tol_rel_grad') + positive_float(self.tol_param, 'tol_param') + positive_int(self.history_size, 'history_size') + + def compose(self, _idx: int, cmd: List[str]) -> List[str]: + """compose command string for CmdStan for non-default arg values.""" + cmd.append('method=optimize') + if self.algorithm: + cmd.append(f'algorithm={self.algorithm.lower()}') + if self.init_alpha is not None: + cmd.append(f'init_alpha={self.init_alpha}') + if self.tol_obj is not None: + cmd.append(f'tol_obj={self.tol_obj}') + if self.tol_rel_obj is not None: + cmd.append(f'tol_rel_obj={self.tol_rel_obj}') + if self.tol_grad is not None: + cmd.append(f'tol_grad={self.tol_grad}') + if self.tol_rel_grad is not None: + cmd.append(f'tol_rel_grad={self.tol_rel_grad}') + if self.tol_param is not None: + cmd.append(f'tol_param={self.tol_param}') + if self.history_size is not None: + cmd.append(f'history_size={self.history_size}') + if self.iter is not None: + cmd.append(f'iter={self.iter}') + if self.save_iterations: + cmd.append('save_iterations=1') + if self.jacobian: + cmd.append("jacobian=1") + return cmd + + +class LaplaceArgs: + """Arguments needed for laplace method.""" + + def __init__( + self, mode: str, draws: Optional[int] = None, jacobian: bool = True + ) -> None: + self.mode = mode + self.jacobian = jacobian + self.draws = draws + + def validate(self, _chains: Optional[int] = None) -> None: + """Check arguments correctness and consistency.""" + if not os.path.exists(self.mode): + raise ValueError(f'Invalid path for mode file: {self.mode}') + positive_int(self.draws, 'draws') + + def compose(self, _idx: int, cmd: List[str]) -> List[str]: + """compose command string for CmdStan for non-default arg values.""" + cmd.append('method=laplace') + cmd.append(f'mode={self.mode}') + if self.draws: + cmd.append(f'draws={self.draws}') + if not self.jacobian: + cmd.append("jacobian=0") + return cmd + + +class PathfinderArgs: + """Container for arguments for Pathfinder.""" + + def __init__( + self, + init_alpha: Optional[float] = None, + tol_obj: Optional[float] = None, + tol_rel_obj: Optional[float] = None, + tol_grad: Optional[float] = None, + tol_rel_grad: Optional[float] = None, + tol_param: Optional[float] = None, + history_size: Optional[int] = None, + num_psis_draws: Optional[int] = None, + num_paths: Optional[int] = None, + max_lbfgs_iters: Optional[int] = None, + num_draws: Optional[int] = None, + num_elbo_draws: Optional[int] = None, + save_single_paths: bool = False, + psis_resample: bool = True, + calculate_lp: bool = True, + ) -> None: + self.init_alpha = init_alpha + self.tol_obj = tol_obj + self.tol_rel_obj = tol_rel_obj + self.tol_grad = tol_grad + self.tol_rel_grad = tol_rel_grad + self.tol_param = tol_param + self.history_size = history_size + + self.num_psis_draws = num_psis_draws + self.num_paths = num_paths + self.max_lbfgs_iters = max_lbfgs_iters + self.num_draws = num_draws + self.num_elbo_draws = num_elbo_draws + + self.save_single_paths = save_single_paths + self.psis_resample = psis_resample + self.calculate_lp = calculate_lp + + def validate(self, _chains: Optional[int] = None) -> None: + """ + Check arguments correctness and consistency. + """ + positive_float(self.init_alpha, 'init_alpha') + positive_float(self.tol_obj, 'tol_obj') + positive_float(self.tol_rel_obj, 'tol_rel_obj') + positive_float(self.tol_grad, 'tol_grad') + positive_float(self.tol_rel_grad, 'tol_rel_grad') + positive_float(self.tol_param, 'tol_param') + positive_int(self.history_size, 'history_size') + + positive_int(self.num_psis_draws, 'num_psis_draws') + positive_int(self.num_paths, 'num_paths') + positive_int(self.max_lbfgs_iters, 'max_lbfgs_iters') + positive_int(self.num_draws, 'num_draws') + positive_int(self.num_elbo_draws, 'num_elbo_draws') + + def compose(self, _idx: int, cmd: List[str]) -> List[str]: + """compose command string for CmdStan for non-default arg values.""" + cmd.append('method=pathfinder') + + if self.init_alpha is not None: + cmd.append(f'init_alpha={self.init_alpha}') + if self.tol_obj is not None: + cmd.append(f'tol_obj={self.tol_obj}') + if self.tol_rel_obj is not None: + cmd.append(f'tol_rel_obj={self.tol_rel_obj}') + if self.tol_grad is not None: + cmd.append(f'tol_grad={self.tol_grad}') + if self.tol_rel_grad is not None: + cmd.append(f'tol_rel_grad={self.tol_rel_grad}') + if self.tol_param is not None: + cmd.append(f'tol_param={self.tol_param}') + if self.history_size is not None: + cmd.append(f'history_size={self.history_size}') + + if self.num_psis_draws is not None: + cmd.append(f'num_psis_draws={self.num_psis_draws}') + if self.num_paths is not None: + cmd.append(f'num_paths={self.num_paths}') + if self.max_lbfgs_iters is not None: + cmd.append(f'max_lbfgs_iters={self.max_lbfgs_iters}') + if self.num_draws is not None: + cmd.append(f'num_draws={self.num_draws}') + if self.num_elbo_draws is not None: + cmd.append(f'num_elbo_draws={self.num_elbo_draws}') + + if self.save_single_paths: + cmd.append('save_single_paths=1') + + if not self.psis_resample: + cmd.append('psis_resample=0') + + if not self.calculate_lp: + cmd.append('calculate_lp=0') + + return cmd + + +class GenerateQuantitiesArgs: + """Arguments needed for generate_quantities method.""" + + def __init__(self, csv_files: List[str]) -> None: + """Initialize object.""" + self.sample_csv_files = csv_files + + def validate( + self, chains: Optional[int] = None # pylint: disable=unused-argument + ) -> None: + """ + Check arguments correctness and consistency. + + * check that sample csv files exist + """ + for csv in self.sample_csv_files: + if not os.path.exists(csv): + raise ValueError( + 'Invalid path for sample csv file: {}'.format(csv) + ) + + def compose(self, idx: int, cmd: List[str]) -> List[str]: + """ + Compose CmdStan command for method-specific non-default arguments. + """ + cmd.append('method=generate_quantities') + cmd.append(f'fitted_params={self.sample_csv_files[idx]}') + return cmd + + +class VariationalArgs: + """Arguments needed for variational method.""" + + VARIATIONAL_ALGOS = {'meanfield', 'fullrank'} + + def __init__( + self, + algorithm: Optional[str] = None, + iter: Optional[int] = None, + grad_samples: Optional[int] = None, + elbo_samples: Optional[int] = None, + eta: Optional[float] = None, + adapt_iter: Optional[int] = None, + adapt_engaged: bool = True, + tol_rel_obj: Optional[float] = None, + eval_elbo: Optional[int] = None, + output_samples: Optional[int] = None, + ) -> None: + self.algorithm = algorithm + self.iter = iter + self.grad_samples = grad_samples + self.elbo_samples = elbo_samples + self.eta = eta + self.adapt_iter = adapt_iter + self.adapt_engaged = adapt_engaged + self.tol_rel_obj = tol_rel_obj + self.eval_elbo = eval_elbo + self.output_samples = output_samples + + def validate( + self, chains: Optional[int] = None # pylint: disable=unused-argument + ) -> None: + """ + Check arguments correctness and consistency. + """ + if ( + self.algorithm is not None + and self.algorithm not in self.VARIATIONAL_ALGOS + ): + raise ValueError( + 'Please specify variational algorithms as one of [{}]'.format( + ', '.join(self.VARIATIONAL_ALGOS) + ) + ) + positive_int(self.iter, 'iter') + positive_int(self.grad_samples, 'grad_samples') + positive_int(self.elbo_samples, 'elbo_samples') + positive_float(self.eta, 'eta') + positive_int(self.adapt_iter, 'adapt_iter') + positive_float(self.tol_rel_obj, 'tol_rel_obj') + positive_int(self.eval_elbo, 'eval_elbo') + positive_int(self.output_samples, 'output_samples') + + # pylint: disable=unused-argument + def compose(self, idx: int, cmd: List[str]) -> List[str]: + """ + Compose CmdStan command for method-specific non-default arguments. + """ + cmd.append('method=variational') + if self.algorithm is not None: + cmd.append(f'algorithm={self.algorithm}') + if self.iter is not None: + cmd.append(f'iter={self.iter}') + if self.grad_samples is not None: + cmd.append(f'grad_samples={self.grad_samples}') + if self.elbo_samples is not None: + cmd.append(f'elbo_samples={self.elbo_samples}') + if self.eta is not None: + cmd.append(f'eta={self.eta}') + cmd.append('adapt') + if self.adapt_engaged: + cmd.append('engaged=1') + if self.adapt_iter is not None: + cmd.append(f'iter={self.adapt_iter}') + else: + cmd.append('engaged=0') + if self.tol_rel_obj is not None: + cmd.append(f'tol_rel_obj={self.tol_rel_obj}') + if self.eval_elbo is not None: + cmd.append(f'eval_elbo={self.eval_elbo}') + if self.output_samples is not None: + cmd.append(f'output_samples={self.output_samples}') + return cmd + + +class CmdStanArgs: + """ + Container for CmdStan command line arguments. + Consists of arguments common to all methods and + and an object which contains the method-specific arguments. + """ + + def __init__( + self, + model_name: str, + model_exe: OptionalPath, + chain_ids: Optional[List[int]], + method_args: Union[ + SamplerArgs, + OptimizeArgs, + GenerateQuantitiesArgs, + VariationalArgs, + LaplaceArgs, + PathfinderArgs, + ], + data: Union[Mapping[str, Any], str, None] = None, + seed: Union[int, List[int], None] = None, + inits: Union[int, float, str, List[str], None] = None, + output_dir: OptionalPath = None, + sig_figs: Optional[int] = None, + save_latent_dynamics: bool = False, + save_profile: bool = False, + refresh: Optional[int] = None, + ) -> None: + """Initialize object.""" + self.model_name = model_name + self.model_exe = model_exe + self.chain_ids = chain_ids + self.data = data + self.seed = seed + self.inits = inits + self.output_dir = output_dir + self.sig_figs = sig_figs + self.save_latent_dynamics = save_latent_dynamics + self.save_profile = save_profile + self.refresh = refresh + self.method_args = method_args + if isinstance(method_args, SamplerArgs): + self.method = Method.SAMPLE + elif isinstance(method_args, OptimizeArgs): + self.method = Method.OPTIMIZE + elif isinstance(method_args, GenerateQuantitiesArgs): + self.method = Method.GENERATE_QUANTITIES + elif isinstance(method_args, VariationalArgs): + self.method = Method.VARIATIONAL + elif isinstance(method_args, LaplaceArgs): + self.method = Method.LAPLACE + elif isinstance(method_args, PathfinderArgs): + self.method = Method.PATHFINDER + else: + raise ValueError( + 'Unsupported method args type: {}'.format(type(method_args)) + ) + self.method_args.validate(len(chain_ids) if chain_ids else None) + self.validate() + + def validate(self) -> None: + """ + Check arguments correctness and consistency. + + * input files must exist + * output files must be in a writeable directory + * if no seed specified, set random seed. + * length of per-chain lists equals specified # of chains + """ + if self.model_name is None: + raise ValueError('no stan model specified') + if self.model_exe is None: + raise ValueError('model not compiled') + + if self.chain_ids is not None: + for chain_id in self.chain_ids: + if chain_id < 1: + raise ValueError('invalid chain_id {}'.format(chain_id)) + if self.output_dir is not None: + self.output_dir = os.path.realpath( + os.path.expanduser(self.output_dir) + ) + if not os.path.exists(self.output_dir): + try: + os.makedirs(self.output_dir) + get_logger().info( + 'created output directory: %s', self.output_dir + ) + except (RuntimeError, PermissionError) as exc: + raise ValueError( + 'Invalid path for output files, ' + 'no such dir: {}.'.format(self.output_dir) + ) from exc + if not os.path.isdir(self.output_dir): + raise ValueError( + 'Specified output_dir is not a directory: {}.'.format( + self.output_dir + ) + ) + try: + testpath = os.path.join(self.output_dir, str(time())) + with open(testpath, 'w+'): + pass + os.remove(testpath) # cleanup + except Exception as exc: + raise ValueError( + 'Invalid path for output files,' + ' cannot write to dir: {}.'.format(self.output_dir) + ) from exc + if self.refresh is not None: + if ( + not isinstance(self.refresh, (int, np.integer)) + or self.refresh < 1 + ): + raise ValueError( + 'Argument "refresh" must be a positive integer value, ' + 'found {}.'.format(self.refresh) + ) + + if self.sig_figs is not None: + if ( + not isinstance(self.sig_figs, (int, np.integer)) + or self.sig_figs < 1 + or self.sig_figs > 18 + ): + raise ValueError( + 'Argument "sig_figs" must be an integer between 1 and 18,' + ' found {}'.format(self.sig_figs) + ) + # TODO: remove at some future release + if cmdstan_version_before(2, 25): + self.sig_figs = None + get_logger().warning( + 'Argument "sig_figs" invalid for CmdStan versions < 2.25, ' + 'using version %s in directory %s', + os.path.basename(cmdstan_path()), + os.path.dirname(cmdstan_path()), + ) + + if self.seed is None: + rng = default_rng() + self.seed = rng.integers(low=1, high=99999, size=1).item() + else: + if not isinstance(self.seed, (int, list, np.integer)): + raise ValueError( + 'Argument "seed" must be an integer between ' + '0 and 2**32-1, found {}.'.format(self.seed) + ) + if isinstance(self.seed, (int, np.integer)): + if self.seed < 0 or self.seed > 2**32 - 1: + raise ValueError( + 'Argument "seed" must be an integer between ' + '0 and 2**32-1, found {}.'.format(self.seed) + ) + else: + if self.chain_ids is None: + raise ValueError( + 'List of per-chain seeds cannot be evaluated without ' + 'corresponding list of chain_ids.' + ) + if len(self.seed) != len(self.chain_ids): + raise ValueError( + 'Number of seeds must match number of chains,' + ' found {} seed for {} chains.'.format( + len(self.seed), len(self.chain_ids) + ) + ) + for seed in self.seed: + if seed < 0 or seed > 2**32 - 1: + raise ValueError( + 'Argument "seed" must be an integer value' + ' between 0 and 2**32-1,' + ' found {}'.format(seed) + ) + + if isinstance(self.data, str): + if not os.path.exists(self.data): + raise ValueError('no such file {}'.format(self.data)) + elif self.data is not None and not isinstance(self.data, (str, dict)): + raise ValueError('Argument "data" must be string or dict') + + if self.inits is not None: + if isinstance(self.inits, (float, int, np.floating, np.integer)): + if self.inits < 0: + raise ValueError( + 'Argument "inits" must be > 0, found {}'.format( + self.inits + ) + ) + elif isinstance(self.inits, str): + if not ( + isinstance(self.method_args, SamplerArgs) + and self.method_args.num_chains > 1 + or isinstance(self.method_args, PathfinderArgs) + ): + if not os.path.exists(self.inits): + raise ValueError('no such file {}'.format(self.inits)) + elif isinstance(self.inits, list): + if self.chain_ids is None: + raise ValueError( + 'List of inits files cannot be evaluated without ' + 'corresponding list of chain_ids.' + ) + + if len(self.inits) != len(self.chain_ids): + raise ValueError( + 'Number of inits files must match number of chains,' + ' found {} inits files for {} chains.'.format( + len(self.inits), len(self.chain_ids) + ) + ) + for inits in self.inits: + if not os.path.exists(inits): + raise ValueError('no such file {}'.format(inits)) + + def compose_command( + self, + idx: int, + csv_file: str, + *, + diagnostic_file: Optional[str] = None, + profile_file: Optional[str] = None, + ) -> List[str]: + """ + Compose CmdStan command for non-default arguments. + """ + cmd: List[str] = [] + if idx is not None and self.chain_ids is not None: + if idx < 0 or idx > len(self.chain_ids) - 1: + raise ValueError( + 'index ({}) exceeds number of chains ({})'.format( + idx, len(self.chain_ids) + ) + ) + cmd.append(self.model_exe) # type: ignore # guaranteed by validate + cmd.append(f'id={self.chain_ids[idx]}') + else: + cmd.append(self.model_exe) # type: ignore # guaranteed by validate + + if self.seed is not None: + if not isinstance(self.seed, list): + cmd.append('random') + cmd.append(f'seed={self.seed}') + else: + cmd.append('random') + cmd.append(f'seed={self.seed[idx]}') + if self.data is not None: + cmd.append('data') + cmd.append(f'file={self.data}') + if self.inits is not None: + if not isinstance(self.inits, list): + cmd.append(f'init={self.inits}') + else: + cmd.append(f'init={self.inits[idx]}') + cmd.append('output') + cmd.append(f'file={csv_file}') + if diagnostic_file: + cmd.append(f'diagnostic_file={diagnostic_file}') + if profile_file: + cmd.append(f'profile_file={profile_file}') + if self.refresh is not None: + cmd.append(f'refresh={self.refresh}') + if self.sig_figs is not None: + cmd.append(f'sig_figs={self.sig_figs}') + cmd = self.method_args.compose(idx, cmd) + return cmd diff --git a/.venv/lib/python3.12/site-packages/cmdstanpy/compilation.py b/.venv/lib/python3.12/site-packages/cmdstanpy/compilation.py new file mode 100644 index 00000000..4c21585a --- /dev/null +++ b/.venv/lib/python3.12/site-packages/cmdstanpy/compilation.py @@ -0,0 +1,579 @@ +""" +Makefile options for stanc and C++ compilers +""" + +import io +import json +import os +import platform +import shutil +import subprocess +from copy import copy +from datetime import datetime +from pathlib import Path +from typing import Any, Dict, Iterable, List, Optional, Union + +from cmdstanpy.utils import get_logger +from cmdstanpy.utils.cmdstan import ( + EXTENSION, + cmdstan_path, + cmdstan_version, + cmdstan_version_before, +) +from cmdstanpy.utils.command import do_command +from cmdstanpy.utils.filesystem import SanitizedOrTmpFilePath + +STANC_OPTS = [ + 'O', + 'O0', + 'O1', + 'Oexperimental', + 'allow-undefined', + 'use-opencl', + 'warn-uninitialized', + 'include-paths', + 'name', + 'warn-pedantic', +] + +# TODO(2.0): remove +STANC_DEPRECATED_OPTS = { + 'allow_undefined': 'allow-undefined', + 'include_paths': 'include-paths', +} + +STANC_IGNORE_OPTS = [ + 'debug-lex', + 'debug-parse', + 'debug-ast', + 'debug-decorated-ast', + 'debug-generate-data', + 'debug-mir', + 'debug-mir-pretty', + 'debug-optimized-mir', + 'debug-optimized-mir-pretty', + 'debug-transformed-mir', + 'debug-transformed-mir-pretty', + 'dump-stan-math-signatures', + 'auto-format', + 'print-canonical', + 'print-cpp', + 'o', + 'help', + 'version', +] + +OptionalPath = Union[str, os.PathLike, None] + + +# TODO(2.0): can remove add function and other logic +class CompilerOptions: + """ + User-specified flags for stanc and C++ compiler. + + Attributes: + stanc_options - stanc compiler flags, options + cpp_options - makefile options (NAME=value) + user_header - path to a user .hpp file to include during compilation + """ + + def __init__( + self, + *, + stanc_options: Optional[Dict[str, Any]] = None, + cpp_options: Optional[Dict[str, Any]] = None, + user_header: OptionalPath = None, + ) -> None: + """Initialize object.""" + self._stanc_options = stanc_options if stanc_options is not None else {} + self._cpp_options = cpp_options if cpp_options is not None else {} + self._user_header = str(user_header) if user_header is not None else '' + + def __repr__(self) -> str: + return 'stanc_options={}, cpp_options={}'.format( + self._stanc_options, self._cpp_options + ) + + def __eq__(self, other: Any) -> bool: + """Overrides the default implementation""" + if self.is_empty() and other is None: # equiv w/r/t compiler + return True + if not isinstance(other, CompilerOptions): + return False + return ( + self._stanc_options == other.stanc_options + and self._cpp_options == other.cpp_options + and self._user_header == other.user_header + ) + + def is_empty(self) -> bool: + """True if no options specified.""" + return ( + self._stanc_options == {} + and self._cpp_options == {} + and self._user_header == '' + ) + + @property + def stanc_options(self) -> Dict[str, Union[bool, int, str, Iterable[str]]]: + """Stanc compiler options.""" + return self._stanc_options + + @property + def cpp_options(self) -> Dict[str, Union[bool, int]]: + """C++ compiler options.""" + return self._cpp_options + + @property + def user_header(self) -> str: + """user header.""" + return self._user_header + + def validate(self) -> None: + """ + Check compiler args. + Raise ValueError if invalid options are found. + """ + self.validate_stanc_opts() + self.validate_cpp_opts() + self.validate_user_header() + + def validate_stanc_opts(self) -> None: + """ + Check stanc compiler args and consistency between stanc and C++ options. + Raise ValueError if bad config is found. + """ + # pylint: disable=no-member + if self._stanc_options is None: + return + ignore = [] + paths = None + has_o_flag = False + + for deprecated, replacement in STANC_DEPRECATED_OPTS.items(): + if deprecated in self._stanc_options: + if replacement: + get_logger().warning( + 'compiler option "%s" is deprecated, use "%s" instead', + deprecated, + replacement, + ) + self._stanc_options[replacement] = copy( + self._stanc_options[deprecated] + ) + del self._stanc_options[deprecated] + else: + get_logger().warning( + 'compiler option "%s" is deprecated and ' + 'should not be used', + deprecated, + ) + for key, val in self._stanc_options.items(): + if key in STANC_IGNORE_OPTS: + get_logger().info('ignoring compiler option: %s', key) + ignore.append(key) + elif key not in STANC_OPTS: + raise ValueError(f'unknown stanc compiler option: {key}') + elif key == 'include-paths': + paths = val + if isinstance(val, str): + paths = val.split(',') + elif not isinstance(val, list): + raise ValueError( + 'Invalid include-paths, expecting list or ' + f'string, found type: {type(val)}.' + ) + elif key == 'use-opencl': + if self._cpp_options is None: + self._cpp_options = {'STAN_OPENCL': 'TRUE'} + else: + self._cpp_options['STAN_OPENCL'] = 'TRUE' + elif key.startswith('O'): + if has_o_flag: + get_logger().warning( + 'More than one of (O, O1, O2, Oexperimental)' + 'optimizations passed. Only the last one will' + 'be used' + ) + else: + has_o_flag = True + + for opt in ignore: + del self._stanc_options[opt] + if paths is not None: + bad_paths = [dir for dir in paths if not os.path.exists(dir)] + if any(bad_paths): + raise ValueError( + 'invalid include paths: {}'.format(', '.join(bad_paths)) + ) + + self._stanc_options['include-paths'] = [ + os.path.abspath(os.path.expanduser(path)) for path in paths + ] + + def validate_cpp_opts(self) -> None: + """ + Check cpp compiler args. + Raise ValueError if bad config is found. + """ + if self._cpp_options is None: + return + for key in ['OPENCL_DEVICE_ID', 'OPENCL_PLATFORM_ID']: + if key in self._cpp_options: + self._cpp_options['STAN_OPENCL'] = 'TRUE' + val = self._cpp_options[key] + if not isinstance(val, int) or val < 0: + raise ValueError( + f'{key} must be a non-negative integer value,' + f' found {val}.' + ) + + def validate_user_header(self) -> None: + """ + User header exists. + Raise ValueError if bad config is found. + """ + if self._user_header != "": + if not ( + os.path.exists(self._user_header) + and os.path.isfile(self._user_header) + ): + raise ValueError( + f"User header file {self._user_header} cannot be found" + ) + if self._user_header[-4:] != '.hpp': + raise ValueError( + f"Header file must end in .hpp, got {self._user_header}" + ) + if "allow-undefined" not in self._stanc_options: + self._stanc_options["allow-undefined"] = True + # set full path + self._user_header = os.path.abspath(self._user_header) + + if ' ' in self._user_header: + raise ValueError( + "User header must be in a location with no spaces in path!" + ) + + if ( + 'USER_HEADER' in self._cpp_options + and self._user_header != self._cpp_options['USER_HEADER'] + ): + raise ValueError( + "Disagreement in user_header C++ options found!\n" + f"{self._user_header}, {self._cpp_options['USER_HEADER']}" + ) + + self._cpp_options['USER_HEADER'] = self._user_header + + def add(self, new_opts: "CompilerOptions") -> None: # noqa: disable=Q000 + """Adds options to existing set of compiler options.""" + if new_opts.stanc_options is not None: + if self._stanc_options is None: + self._stanc_options = new_opts.stanc_options + else: + for key, val in new_opts.stanc_options.items(): + if key == 'include-paths': + if isinstance(val, Iterable) and not isinstance( + val, str + ): + for path in val: + self.add_include_path(str(path)) + else: + self.add_include_path(str(val)) + else: + self._stanc_options[key] = val + if new_opts.cpp_options is not None: + for key, val in new_opts.cpp_options.items(): + self._cpp_options[key] = val + if new_opts._user_header != '' and self._user_header == '': + self._user_header = new_opts._user_header + + def add_include_path(self, path: str) -> None: + """Adds include path to existing set of compiler options.""" + path = os.path.abspath(os.path.expanduser(path)) + if 'include-paths' not in self._stanc_options: + self._stanc_options['include-paths'] = [path] + elif path not in self._stanc_options['include-paths']: + self._stanc_options['include-paths'].append(path) + + def compose_stanc(self, filename_in_msg: Optional[str]) -> List[str]: + opts = [] + + if filename_in_msg is not None: + opts.append(f'--filename-in-msg={filename_in_msg}') + + if self._stanc_options is not None and len(self._stanc_options) > 0: + for key, val in self._stanc_options.items(): + if key == 'include-paths': + opts.append( + '--include-paths=' + + ','.join( + ( + Path(p).as_posix() + for p in self._stanc_options['include-paths'] + ) + ) + ) + elif key == 'name': + opts.append(f'--name={val}') + else: + opts.append(f'--{key}') + return opts + + def compose(self, filename_in_msg: Optional[str] = None) -> List[str]: + """ + Format makefile options as list of strings. + + Parameters + ---------- + filename_in_msg : str, optional + filename to be displayed in stanc3 error messages + (if different from actual filename on disk), by default None + """ + opts = [ + 'STANCFLAGS+=' + flag.replace(" ", "\\ ") + for flag in self.compose_stanc(filename_in_msg) + ] + if self._cpp_options is not None and len(self._cpp_options) > 0: + for key, val in self._cpp_options.items(): + opts.append(f'{key}={val}') + return opts + + +def src_info( + stan_file: str, compiler_options: CompilerOptions +) -> Dict[str, Any]: + """ + Get source info for Stan program file. + + This function is used in the implementation of + :meth:`CmdStanModel.src_info`, and should not be called directly. + """ + cmd = ( + [os.path.join(cmdstan_path(), 'bin', 'stanc' + EXTENSION)] + # handle include-paths, allow-undefined etc + + compiler_options.compose_stanc(None) + + ['--info', str(stan_file)] + ) + proc = subprocess.run(cmd, capture_output=True, text=True, check=False) + if proc.returncode: + raise ValueError( + f"Failed to get source info for Stan model " + f"'{stan_file}'. Console:\n{proc.stderr}" + ) + result: Dict[str, Any] = json.loads(proc.stdout) + return result + + +def compile_stan_file( + src: Union[str, Path], + force: bool = False, + stanc_options: Optional[Dict[str, Any]] = None, + cpp_options: Optional[Dict[str, Any]] = None, + user_header: OptionalPath = None, +) -> str: + """ + Compile the given Stan program file. Translates the Stan code to + C++, then calls the C++ compiler. + + By default, this function compares the timestamps on the source and + executable files; if the executable is newer than the source file, it + will not recompile the file, unless argument ``force`` is ``True`` + or unless the compiler options have been changed. + + :param src: Path to Stan program file. + + :param force: When ``True``, always compile, even if the executable file + is newer than the source file. Used for Stan models which have + ``#include`` directives in order to force recompilation when changes + are made to the included files. + + :param stanc_options: Options for stanc compiler. + :param cpp_options: Options for C++ compiler. + :param user_header: A path to a header file to include during C++ + compilation. + """ + + src = Path(src).resolve() + if not src.exists(): + raise ValueError(f'stan file does not exist: {src}') + + compiler_options = CompilerOptions( + stanc_options=stanc_options, + cpp_options=cpp_options, + user_header=user_header, + ) + compiler_options.validate() + + exe_target = src.with_suffix(EXTENSION) + if exe_target.exists(): + exe_time = os.path.getmtime(exe_target) + included_files = [src] + included_files.extend( + src_info(str(src), compiler_options).get('included_files', []) + ) + out_of_date = any( + os.path.getmtime(included_file) > exe_time + for included_file in included_files + ) + if not out_of_date and not force: + get_logger().debug('found newer exe file, not recompiling') + return str(exe_target) + + compilation_failed = False + # if target path has spaces or special characters, use a copy in a + # temporary directory (GNU-Make constraint) + with SanitizedOrTmpFilePath(str(src)) as (stan_file, is_copied): + exe_file = os.path.splitext(stan_file)[0] + EXTENSION + + hpp_file = os.path.splitext(exe_file)[0] + '.hpp' + if os.path.exists(hpp_file): + os.remove(hpp_file) + if os.path.exists(exe_file): + get_logger().debug('Removing %s', exe_file) + os.remove(exe_file) + + get_logger().info( + 'compiling stan file %s to exe file %s', + stan_file, + exe_target, + ) + + make = os.getenv( + 'MAKE', + 'make' if platform.system() != 'Windows' else 'mingw32-make', + ) + cmd = [make] + cmd.extend(compiler_options.compose(filename_in_msg=src.name)) + cmd.append(Path(exe_file).as_posix()) + + sout = io.StringIO() + try: + do_command(cmd=cmd, cwd=cmdstan_path(), fd_out=sout) + except RuntimeError as e: + sout.write(f'\n{str(e)}\n') + compilation_failed = True + finally: + console = sout.getvalue() + + get_logger().debug('Console output:\n%s', console) + if not compilation_failed: + if is_copied: + shutil.copy(exe_file, exe_target) + get_logger().info('compiled model executable: %s', exe_target) + if 'Warning' in console: + lines = console.split('\n') + warnings = [x for x in lines if x.startswith('Warning')] + get_logger().warning( + 'Stan compiler has produced %d warnings:', + len(warnings), + ) + get_logger().warning(console) + if compilation_failed: + if 'PCH' in console or 'precompiled header' in console: + get_logger().warning( + "CmdStan's precompiled header (PCH) files " + "may need to be rebuilt." + "Please run cmdstanpy.rebuild_cmdstan().\n" + "If the issue persists please open a bug report" + ) + raise ValueError( + f"Failed to compile Stan model '{src}'. " f"Console:\n{console}" + ) + return str(exe_target) + + +def format_stan_file( + stan_file: Union[str, os.PathLike], + *, + overwrite_file: bool = False, + canonicalize: Union[bool, str, Iterable[str]] = False, + max_line_length: int = 78, + backup: bool = True, + stanc_options: Optional[Dict[str, Any]] = None, +) -> None: + """ + Run stanc's auto-formatter on the model code. Either saves directly + back to the file or prints for inspection + + :param stan_file: Path to Stan program file. + :param overwrite_file: If True, save the updated code to disk, rather + than printing it. By default False + :param canonicalize: Whether or not the compiler should 'canonicalize' + the Stan model, removing things like deprecated syntax. Default is + False. If True, all canonicalizations are run. If it is a list of + strings, those options are passed to stanc (new in Stan 2.29) + :param max_line_length: Set the wrapping point for the formatter. The + default value is 78, which wraps most lines by the 80th character. + :param backup: If True, create a stanfile.bak backup before + writing to the file. Only disable this if you're sure you have other + copies of the file or are using a version control system like Git. + :param stanc_options: Additional options to pass to the stanc compiler. + """ + stan_file = Path(stan_file).resolve() + + if not stan_file.exists(): + raise ValueError(f'File does not exist: {stan_file}') + + try: + cmd = ( + [os.path.join(cmdstan_path(), 'bin', 'stanc' + EXTENSION)] + # handle include-paths, allow-undefined etc + + CompilerOptions(stanc_options=stanc_options).compose_stanc(None) + + [str(stan_file)] + ) + + if canonicalize: + if cmdstan_version_before(2, 29): + if isinstance(canonicalize, bool): + cmd.append('--print-canonical') + else: + raise ValueError( + "Invalid arguments passed for current CmdStan" + + " version({})\n".format( + cmdstan_version() or "Unknown" + ) + + "--canonicalize requires 2.29 or higher" + ) + else: + if isinstance(canonicalize, str): + cmd.append('--canonicalize=' + canonicalize) + elif isinstance(canonicalize, Iterable): + cmd.append('--canonicalize=' + ','.join(canonicalize)) + else: + cmd.append('--print-canonical') + + # before 2.29, having both --print-canonical + # and --auto-format printed twice + if not (cmdstan_version_before(2, 29) and canonicalize): + cmd.append('--auto-format') + + if not cmdstan_version_before(2, 29): + cmd.append(f'--max-line-length={max_line_length}') + elif max_line_length != 78: + raise ValueError( + "Invalid arguments passed for current CmdStan version" + + " ({})\n".format(cmdstan_version() or "Unknown") + + "--max-line-length requires 2.29 or higher" + ) + + out = subprocess.run(cmd, capture_output=True, text=True, check=True) + if out.stderr: + get_logger().warning(out.stderr) + result = out.stdout + if overwrite_file: + if result: + if backup: + shutil.copyfile( + stan_file, + str(stan_file) + + '.bak-' + + datetime.now().strftime("%Y%m%d%H%M%S"), + ) + stan_file.write_text(result) + else: + print(result) + + except (ValueError, RuntimeError) as e: + raise RuntimeError("Stanc formatting failed") from e diff --git a/.venv/lib/python3.12/site-packages/cmdstanpy/install_cmdstan.py b/.venv/lib/python3.12/site-packages/cmdstanpy/install_cmdstan.py new file mode 100644 index 00000000..0ee829e4 --- /dev/null +++ b/.venv/lib/python3.12/site-packages/cmdstanpy/install_cmdstan.py @@ -0,0 +1,711 @@ +#!/usr/bin/env python +""" +Download and install a CmdStan release from GitHub. +Downloads the release tar.gz file to temporary storage. +Retries GitHub requests in order to allow for transient network outages. +Builds CmdStan executables and tests the compiler by building +example model ``bernoulli.stan``. + +Optional command line arguments: + -i, --interactive: flag, when specified ignore other arguments and + ask user for settings on STDIN + -v, --version : version, defaults to latest release version + -d, --dir : install directory, defaults to '$HOME/.cmdstan + --overwrite: flag, when specified re-installs existing version + --progress: flag, when specified show progress bar for CmdStan download + --verbose: flag, when specified prints output from CmdStan build process + --cores: int, number of cores to use when building, defaults to 1 + -c, --compiler : flag, add C++ compiler to path (Windows only) +""" +import argparse +import json +import os +import platform +import re +import shutil +import sys +import tarfile +import urllib.error +import urllib.request +from collections import OrderedDict +from pathlib import Path +from time import sleep +from typing import TYPE_CHECKING, Any, Callable, Dict, Optional, Union + +from tqdm.auto import tqdm + +from cmdstanpy import _DOT_CMDSTAN +from cmdstanpy.utils import ( + cmdstan_path, + do_command, + pushd, + validate_dir, + wrap_url_progress_hook, +) +from cmdstanpy.utils.cmdstan import get_download_url + +from . import progress as progbar + +if sys.version_info >= (3, 8) or TYPE_CHECKING: + # mypy only knows about the new built-in cached_property + from functools import cached_property +else: + # on older Python versions, this is the recommended + # way to get the same effect + from functools import lru_cache + + def cached_property(fun): + return property(lru_cache(maxsize=None)(fun)) + + +try: + # on MacOS and Linux, importing this + # improves the UX of the input() function + import readline + + # dummy statement to use import for flake8/pylint + _ = readline.__doc__ +except ImportError: + pass + + +class CmdStanRetrieveError(RuntimeError): + pass + + +class CmdStanInstallError(RuntimeError): + pass + + +def is_windows() -> bool: + return platform.system() == 'Windows' + + +MAKE = os.getenv('MAKE', 'make' if not is_windows() else 'mingw32-make') +EXTENSION = '.exe' if is_windows() else '' + + +def get_headers() -> Dict[str, str]: + """Create headers dictionary.""" + headers = {} + GITHUB_PAT = os.environ.get("GITHUB_PAT") # pylint:disable=invalid-name + if GITHUB_PAT is not None: + headers["Authorization"] = "token {}".format(GITHUB_PAT) + return headers + + +def latest_version() -> str: + """Report latest CmdStan release version.""" + url = 'https://api.github.com/repos/stan-dev/cmdstan/releases/latest' + request = urllib.request.Request(url, headers=get_headers()) + for i in range(6): + try: + response = urllib.request.urlopen(request).read() + break + except urllib.error.URLError as e: + print('Cannot connect to github.') + print(e) + if i < 5: + print('retry ({}/5)'.format(i + 1)) + sleep(1) + continue + raise CmdStanRetrieveError( + 'Cannot connect to CmdStan github repo.' + ) from e + content = json.loads(response.decode('utf-8')) + tag = content['tag_name'] + match = re.search(r'v?(.+)', tag) + if match is not None: + tag = match.group(1) + return tag # type: ignore + + +def home_cmdstan() -> str: + return os.path.expanduser(os.path.join('~', _DOT_CMDSTAN)) + + +# pylint: disable=too-few-public-methods +class InstallationSettings: + """ + A static installation settings object + """ + + def __init__( + self, + *, + version: Optional[str] = None, + dir: Optional[str] = None, + progress: bool = False, + verbose: bool = False, + overwrite: bool = False, + cores: int = 1, + compiler: bool = False, + **kwargs: Any, + ): + self.version = version if version else latest_version() + self.dir = dir if dir else home_cmdstan() + self.progress = progress + self.verbose = verbose + self.overwrite = overwrite + self.cores = cores + self.compiler = compiler and is_windows() + + _ = kwargs # ignore all other inputs. + # Useful if initialized from a dictionary like **dict + + +def yes_no(answer: str, default: bool) -> bool: + answer = answer.lower() + if answer in ('y', 'yes'): + return True + if answer in ('n', 'no'): + return False + return default + + +class InteractiveSettings: + """ + Installation settings provided on-demand in an interactive format. + + This provides the same set of properties as the ``InstallationSettings`` + object, but rather than them being fixed by the constructor the user is + asked for input whenever they are accessed for the first time. + """ + + @cached_property + def version(self) -> str: + latest = latest_version() + print("Which version would you like to install?") + print(f"Default: {latest}") + answer = input("Type version or hit enter to continue: ") + return answer if answer else latest + + @cached_property + def dir(self) -> str: + directory = home_cmdstan() + print("Where would you like to install CmdStan?") + print(f"Default: {directory}") + answer = input("Type full path or hit enter to continue: ") + return os.path.expanduser(answer) if answer else directory + + @cached_property + def progress(self) -> bool: + print("Show installation progress bars?") + print("Default: y") + answer = input("[y/n]: ") + return yes_no(answer, True) + + @cached_property + def verbose(self) -> bool: + print("Show verbose output of the installation process?") + print("Default: n") + answer = input("[y/n]: ") + return yes_no(answer, False) + + @cached_property + def overwrite(self) -> bool: + print("Overwrite existing CmdStan installation?") + print("Default: n") + answer = input("[y/n]: ") + return yes_no(answer, False) + + @cached_property + def compiler(self) -> bool: + if not is_windows(): + return False + print("Would you like to install the RTools40 C++ toolchain?") + print("A C++ toolchain is required for CmdStan.") + print( + "If you are not sure if you need the toolchain or not, " + "the most likely case is you do need it, and should answer 'y'." + ) + print("Default: n") + answer = input("[y/n]: ") + return yes_no(answer, False) + + @cached_property + def cores(self) -> int: + max_cpus = os.cpu_count() or 1 + print( + "How many CPU cores would you like to use for installing " + "and compiling CmdStan?" + ) + print(f"Default: 1, Max: {max_cpus}") + answer = input("Enter a number or hit enter to continue: ") + try: + return min(max_cpus, max(int(answer), 1)) + except ValueError: + return 1 + + +def clean_all(verbose: bool = False) -> None: + """ + Run `make clean-all` in the current directory (must be a cmdstan library). + + :param verbose: Boolean value; when ``True``, show output from make command. + """ + cmd = [MAKE, 'clean-all'] + try: + if verbose: + do_command(cmd) + else: + do_command(cmd, fd_out=None) + + except RuntimeError as e: + # pylint: disable=raise-missing-from + raise CmdStanInstallError(f'Command "make clean-all" failed\n{str(e)}') + + +def build(verbose: bool = False, progress: bool = True, cores: int = 1) -> None: + """ + Run command ``make build`` in the current directory, which must be + the home directory of a CmdStan version (or GitHub repo). + By default, displays a progress bar which tracks make command outputs. + If argument ``verbose=True``, instead of a progress bar, streams + make command outputs to sys.stdout. When both ``verbose`` and ``progress`` + are ``False``, runs silently. + + :param verbose: Boolean value; when ``True``, show output from make command. + Default is ``False``. + :param progress: Boolean value; when ``True`` display progress progress bar. + Default is ``True``. + :param cores: Integer, number of cores to use in the ``make`` command. + Default is 1 core. + """ + cmd = [MAKE, 'build', f'-j{cores}'] + try: + if verbose: + do_command(cmd) + elif progress and progbar.allow_show_progress(): + progress_hook: Any = _wrap_build_progress_hook() + do_command(cmd, fd_out=None, pbar=progress_hook) + else: + do_command(cmd, fd_out=None) + + except RuntimeError as e: + # pylint: disable=raise-missing-from + raise CmdStanInstallError(f'Command "make build" failed\n{str(e)}') + if not os.path.exists(os.path.join('bin', 'stansummary' + EXTENSION)): + raise CmdStanInstallError( + f'bin/stansummary{EXTENSION} not found' + ', please rebuild or report a bug!' + ) + if not os.path.exists(os.path.join('bin', 'diagnose' + EXTENSION)): + raise CmdStanInstallError( + f'bin/stansummary{EXTENSION} not found' + ', please rebuild or report a bug!' + ) + + if is_windows(): + # Add tbb to the $PATH on Windows + libtbb = os.path.join( + os.getcwd(), 'stan', 'lib', 'stan_math', 'lib', 'tbb' + ) + os.environ['PATH'] = ';'.join( + list( + OrderedDict.fromkeys( + [libtbb] + os.environ.get('PATH', '').split(';') + ) + ) + ) + + +@progbar.wrap_callback +def _wrap_build_progress_hook() -> Optional[Callable[[str], None]]: + """Sets up tqdm callback for CmdStan sampler console msgs.""" + pad = ' ' * 20 + msgs_expected = 150 # hack: 2.27 make build send ~140 msgs to console + pbar: tqdm = tqdm( + total=msgs_expected, + bar_format="{desc} ({elapsed}) | {bar} | {postfix[0][value]}", + postfix=[{"value": f'Building CmdStan {pad}'}], + colour='blue', + desc='', + position=0, + ) + + def build_progress_hook(line: str) -> None: + if line.startswith('--- CmdStan'): + pbar.set_description('Done') + pbar.postfix[0]["value"] = line + pbar.update(msgs_expected - pbar.n) + pbar.close() + else: + if line.startswith('--'): + pbar.postfix[0]["value"] = line + else: + pbar.postfix[0]["value"] = f'{line[:8]} ... {line[-20:]}' + pbar.set_description('Compiling') + pbar.update(1) + + return build_progress_hook + + +def compile_example(verbose: bool = False) -> None: + """ + Compile the example model. + The current directory must be a cmdstan installation, i.e., + contains the makefile, Stanc compiler, and all libraries. + + :param verbose: Boolean value; when ``True``, show output from make command. + """ + path = Path('examples', 'bernoulli', 'bernoulli').with_suffix(EXTENSION) + if path.is_file(): + path.unlink() + + cmd = [MAKE, path.as_posix()] + try: + if verbose: + do_command(cmd) + else: + do_command(cmd, fd_out=None) + except RuntimeError as e: + # pylint: disable=raise-missing-from + raise CmdStanInstallError(f'Command "{" ".join(cmd)}" failed:\n{e}') + + if not path.is_file(): + raise CmdStanInstallError("Failed to generate example binary") + + +def rebuild_cmdstan( + verbose: bool = False, progress: bool = True, cores: int = 1 +) -> None: + """ + Rebuilds the existing CmdStan installation. + This assumes CmdStan has already been installed, + though it need not be installed via CmdStanPy for + this function to work. + + :param verbose: Boolean value; when ``True``, show output from make command. + Default is ``False``. + :param progress: Boolean value; when ``True`` display progress progress bar. + Default is ``True``. + :param cores: Integer, number of cores to use in the ``make`` command. + Default is 1 core. + """ + try: + with pushd(cmdstan_path()): + clean_all(verbose) + build(verbose, progress, cores) + compile_example(verbose) + except ValueError as e: + raise CmdStanInstallError( + "Failed to rebuild CmdStan. Are you sure it is installed?" + ) from e + + +def install_version( + cmdstan_version: str, + overwrite: bool = False, + verbose: bool = False, + progress: bool = True, + cores: int = 1, +) -> None: + """ + Build specified CmdStan version by spawning subprocesses to + run the Make utility on the downloaded CmdStan release src files. + Assumes that current working directory is parent of release dir. + + :param cmdstan_version: CmdStan release, corresponds to release dirname. + :param overwrite: when ``True``, run ``make clean-all`` before building. + :param verbose: Boolean value; when ``True``, show output from make command. + """ + with pushd(cmdstan_version): + print( + 'Building version {}, may take several minutes, ' + 'depending on your system.'.format(cmdstan_version) + ) + if overwrite and os.path.exists('.'): + print( + 'Overwrite requested, remove existing build of version ' + '{}'.format(cmdstan_version) + ) + clean_all(verbose) + print('Rebuilding version {}'.format(cmdstan_version)) + build(verbose, progress=progress, cores=cores) + print('Installed {}'.format(cmdstan_version)) + + +def is_version_available(version: str) -> bool: + if 'git:' in version: + return True # no good way in general to check if a git tag exists + + is_available = True + url = get_download_url(version) + for i in range(6): + try: + urllib.request.urlopen(url) + except urllib.error.HTTPError as err: + print(f'Release {version} is unavailable from URL {url}') + print(f'HTTPError: {err.code}') + is_available = False + break + except urllib.error.URLError as e: + if i < 5: + print( + 'checking version {} availability, retry ({}/5)'.format( + version, i + 1 + ) + ) + sleep(1) + continue + print('Release {} is unavailable from URL {}'.format(version, url)) + print('URLError: {}'.format(e.reason)) + is_available = False + return is_available + + +def retrieve_version(version: str, progress: bool = True) -> None: + """Download specified CmdStan version.""" + if version is None or version == '': + raise ValueError('Argument "version" unspecified.') + + if 'git:' in version: + tag = version.split(':')[1] + tag_folder = version.replace(':', '-').replace('/', '_') + print(f"Cloning CmdStan branch '{tag}' from stan-dev/cmdstan on GitHub") + do_command( + [ + 'git', + 'clone', + '--depth', + '1', + '--branch', + tag, + '--recursive', + '--shallow-submodules', + 'https://github.com/stan-dev/cmdstan.git', + f'cmdstan-{tag_folder}', + ] + ) + return + + print('Downloading CmdStan version {}'.format(version)) + url = get_download_url(version) + for i in range(6): # always retry to allow for transient URLErrors + try: + if progress and progbar.allow_show_progress(): + progress_hook: Optional[ + Callable[[int, int, int], None] + ] = wrap_url_progress_hook() + else: + progress_hook = None + file_tmp, _ = urllib.request.urlretrieve( + url, filename=None, reporthook=progress_hook + ) + break + except urllib.error.HTTPError as e: + raise CmdStanRetrieveError( + 'HTTPError: {}\n' + 'Version {} not available from github.com.'.format( + e.code, version + ) + ) from e + except urllib.error.URLError as e: + print( + 'Failed to download CmdStan version {} from github.com'.format( + version + ) + ) + print(e) + if i < 5: + print('retry ({}/5)'.format(i + 1)) + sleep(1) + continue + print('Version {} not available from github.com.'.format(version)) + raise CmdStanRetrieveError( + 'Version {} not available from github.com.'.format(version) + ) from e + print('Download successful, file: {}'.format(file_tmp)) + try: + print('Extracting distribution') + tar = tarfile.open(file_tmp) + first = tar.next() + if first is not None: + top_dir = first.name + else: + top_dir = '' + cmdstan_dir = f'cmdstan-{version}' + if top_dir != cmdstan_dir: + raise CmdStanInstallError( + 'tarfile should contain top-level dir {},' + 'but found dir {} instead.'.format(cmdstan_dir, top_dir) + ) + target = os.getcwd() + if is_windows(): + # fixes long-path limitation on Windows + target = r'\\?\{}'.format(target) + + if progress and progbar.allow_show_progress(): + for member in tqdm( + iterable=tar.getmembers(), + total=len(tar.getmembers()), + colour='blue', + leave=False, + ): + tar.extract(member=member) + else: + tar.extractall() + except Exception as e: # pylint: disable=broad-except + raise CmdStanInstallError( + f'Failed to unpack file {file_tmp}, error:\n\t{str(e)}' + ) from e + finally: + tar.close() + print(f'Unpacked download as {cmdstan_dir}') + + +def run_compiler_install(dir: str, verbose: bool, progress: bool) -> None: + from .install_cxx_toolchain import is_installed as _is_installed_cxx + from .install_cxx_toolchain import run_rtools_install as _main_cxx + from .utils import cxx_toolchain_path + + compiler_found = False + rtools40_home = os.environ.get('RTOOLS40_HOME') + for cxx_loc in ([rtools40_home] if rtools40_home is not None else []) + [ + home_cmdstan(), + os.path.join(os.path.abspath("/"), "RTools40"), + os.path.join(os.path.abspath("/"), "RTools"), + os.path.join(os.path.abspath("/"), "RTools35"), + os.path.join(os.path.abspath("/"), "RBuildTools"), + ]: + for cxx_version in ['40', '35']: + if _is_installed_cxx(cxx_loc, cxx_version): + compiler_found = True + break + if compiler_found: + break + if not compiler_found: + print('Installing RTools40') + # copy argv and clear sys.argv + _main_cxx( + { + 'dir': dir, + 'progress': progress, + 'version': None, + 'verbose': verbose, + } + ) + cxx_version = '40' + # Add toolchain to $PATH + cxx_toolchain_path(cxx_version, dir) + + +def run_install(args: Union[InteractiveSettings, InstallationSettings]) -> None: + """ + Run a (potentially interactive) installation + """ + validate_dir(args.dir) + print('CmdStan install directory: {}'.format(args.dir)) + + # these accesses just 'warm up' the interactive install + _ = args.progress + _ = args.verbose + + if args.compiler: + run_compiler_install(args.dir, args.verbose, args.progress) + + if 'git:' in args.version: + tag = args.version.replace(':', '-').replace('/', '_') + cmdstan_version = f'cmdstan-{tag}' + else: + cmdstan_version = f'cmdstan-{args.version}' + with pushd(args.dir): + already_installed = os.path.exists(cmdstan_version) and os.path.exists( + os.path.join( + cmdstan_version, + 'examples', + 'bernoulli', + 'bernoulli' + EXTENSION, + ) + ) + if not already_installed or args.overwrite: + if is_version_available(args.version): + print('Installing CmdStan version: {}'.format(args.version)) + else: + raise ValueError( + f'Version {args.version} cannot be downloaded. ' + 'Connection to GitHub failed. ' + 'Check firewall settings or ensure this version exists.' + ) + shutil.rmtree(cmdstan_version, ignore_errors=True) + retrieve_version(args.version, args.progress) + install_version( + cmdstan_version=cmdstan_version, + overwrite=already_installed and args.overwrite, + verbose=args.verbose, + progress=args.progress, + cores=args.cores, + ) + else: + print('CmdStan version {} already installed'.format(args.version)) + + with pushd(cmdstan_version): + print('Test model compilation') + compile_example(args.verbose) + + +def parse_cmdline_args() -> Dict[str, Any]: + parser = argparse.ArgumentParser("install_cmdstan") + parser.add_argument( + '--interactive', + '-i', + action='store_true', + help="Ignore other arguments and run the installation in " + + "interactive mode", + ) + parser.add_argument( + '--version', + '-v', + help="version, defaults to latest release version. " + "If git is installed, you can also specify a git tag or branch, " + "e.g. git:develop", + ) + parser.add_argument( + '--dir', '-d', help="install directory, defaults to '$HOME/.cmdstan" + ) + parser.add_argument( + '--overwrite', + action='store_true', + help="flag, when specified re-installs existing version", + ) + parser.add_argument( + '--verbose', + action='store_true', + help="flag, when specified prints output from CmdStan build process", + ) + parser.add_argument( + '--progress', + action='store_true', + help="flag, when specified show progress bar for CmdStan download", + ) + parser.add_argument( + "--cores", + default=1, + type=int, + help="number of cores to use while building", + ) + if is_windows(): + # use compiler installed with install_cxx_toolchain + # Install a new compiler if compiler not found + # Search order is RTools40, RTools35 + parser.add_argument( + '--compiler', + '-c', + dest='compiler', + action='store_true', + help="flag, add C++ compiler to path (Windows only)", + ) + return vars(parser.parse_args(sys.argv[1:])) + + +def __main__() -> None: + args = parse_cmdline_args() + if args.get('interactive', False): + run_install(InteractiveSettings()) + else: + run_install(InstallationSettings(**args)) + + +if __name__ == '__main__': + __main__() diff --git a/.venv/lib/python3.12/site-packages/cmdstanpy/install_cxx_toolchain.py b/.venv/lib/python3.12/site-packages/cmdstanpy/install_cxx_toolchain.py new file mode 100644 index 00000000..19d9ca2a --- /dev/null +++ b/.venv/lib/python3.12/site-packages/cmdstanpy/install_cxx_toolchain.py @@ -0,0 +1,372 @@ +#!/usr/bin/env python +""" +Download and install a C++ toolchain. +Currently implemented platforms (platform.system) + Windows: RTools 3.5, 4.0 (default) + Darwin (macOS): Not implemented + Linux: Not implemented +Optional command line arguments: + -v, --version : version, defaults to latest + -d, --dir : install directory, defaults to '~/.cmdstan + -s (--silent) : install with /VERYSILENT instead of /SILENT for RTools + -m --no-make : don't install mingw32-make (Windows RTools 4.0 only) + --progress : flag, when specified show progress bar for RTools download +""" +import argparse +import os +import platform +import shutil +import subprocess +import sys +import urllib.request +from collections import OrderedDict +from time import sleep +from typing import Any, Dict, List + +from cmdstanpy import _DOT_CMDSTAN +from cmdstanpy.utils import pushd, validate_dir, wrap_url_progress_hook + +EXTENSION = '.exe' if platform.system() == 'Windows' else '' +IS_64BITS = sys.maxsize > 2**32 + + +def usage() -> None: + """Print usage.""" + print( + """Arguments: + -v (--version) :CmdStan version + -d (--dir) : install directory + -s (--silent) : install with /VERYSILENT instead of /SILENT for RTools + -m (--no-make) : don't install mingw32-make (Windows RTools 4.0 only) + --progress : flag, when specified show progress bar for RTools download + -h (--help) : this message + """ + ) + + +def get_config(dir: str, silent: bool) -> List[str]: + """Assemble config info.""" + config = [] + if platform.system() == 'Windows': + _, dir = os.path.splitdrive(os.path.abspath(dir)) + if dir.startswith('\\'): + dir = dir[1:] + config = [ + '/SP-', + '/VERYSILENT' if silent else '/SILENT', + '/SUPPRESSMSGBOXES', + '/CURRENTUSER', + 'LANG="English"', + '/DIR="{}"'.format(dir), + '/NOICONS', + '/NORESTART', + ] + return config + + +def install_version( + installation_dir: str, + installation_file: str, + version: str, + silent: bool, + verbose: bool = False, +) -> None: + """Install specified toolchain version.""" + with pushd('.'): + print( + 'Installing the C++ toolchain: {}'.format( + os.path.splitext(installation_file)[0] + ) + ) + cmd = [installation_file] + cmd.extend(get_config(installation_dir, silent)) + print(' '.join(cmd)) + proc = subprocess.Popen( + cmd, + cwd=None, + stdin=subprocess.DEVNULL, + stdout=subprocess.PIPE, + stderr=subprocess.PIPE, + env=os.environ, + ) + while proc.poll() is None: + if proc.stdout: + output = proc.stdout.readline().decode('utf-8').strip() + if output and verbose: + print(output, flush=True) + _, stderr = proc.communicate() + if proc.returncode: + print('Installation failed: returncode={}'.format(proc.returncode)) + if stderr: + print(stderr.decode('utf-8').strip()) + if is_installed(installation_dir, version): + print('Installation files found at the installation location.') + sys.exit(3) + # check installation + if is_installed(installation_dir, version): + os.remove(installation_file) + print('Installed {}'.format(os.path.splitext(installation_file)[0])) + + +def install_mingw32_make(toolchain_loc: str, verbose: bool = False) -> None: + """Install mingw32-make for Windows RTools 4.0.""" + os.environ['PATH'] = ';'.join( + list( + OrderedDict.fromkeys( + [ + os.path.join( + toolchain_loc, + 'mingw_64' if IS_64BITS else 'mingw_32', + 'bin', + ), + os.path.join(toolchain_loc, 'usr', 'bin'), + ] + + os.environ.get('PATH', '').split(';') + ) + ) + ) + cmd = [ + 'pacman', + '-Sy', + 'mingw-w64-x86_64-make' if IS_64BITS else 'mingw-w64-i686-make', + '--noconfirm', + ] + with pushd('.'): + print(' '.join(cmd)) + proc = subprocess.Popen( + cmd, + cwd=None, + stdin=subprocess.DEVNULL, + stdout=subprocess.PIPE, + stderr=subprocess.PIPE, + env=os.environ, + ) + while proc.poll() is None: + if proc.stdout: + output = proc.stdout.readline().decode('utf-8').strip() + if output and verbose: + print(output, flush=True) + _, stderr = proc.communicate() + if proc.returncode: + print( + 'mingw32-make installation failed: returncode={}'.format( + proc.returncode + ) + ) + if stderr: + print(stderr.decode('utf-8').strip()) + sys.exit(3) + print('Installed mingw32-make.exe') + + +def is_installed(toolchain_loc: str, version: str) -> bool: + """Returns True is toolchain is installed.""" + if platform.system() == 'Windows': + if version in ['35', '3.5']: + if not os.path.exists(os.path.join(toolchain_loc, 'bin')): + return False + return os.path.exists( + os.path.join( + toolchain_loc, + 'mingw_64' if IS_64BITS else 'mingw_32', + 'bin', + 'g++' + EXTENSION, + ) + ) + elif version in ['40', '4.0', '4']: + return os.path.exists( + os.path.join( + toolchain_loc, + 'mingw64' if IS_64BITS else 'mingw32', + 'bin', + 'g++' + EXTENSION, + ) + ) + else: + return False + return False + + +def latest_version() -> str: + """Windows version hardcoded to 4.0.""" + if platform.system() == 'Windows': + return '4.0' + return '' + + +def retrieve_toolchain(filename: str, url: str, progress: bool = True) -> None: + """Download toolchain from URL.""" + print('Downloading C++ toolchain: {}'.format(filename)) + for i in range(6): + try: + if progress: + progress_hook = wrap_url_progress_hook() + else: + progress_hook = None + _ = urllib.request.urlretrieve( + url, filename=filename, reporthook=progress_hook + ) + break + except urllib.error.URLError as err: + print('Failed to download C++ toolchain') + print(err) + if i < 5: + print('retry ({}/5)'.format(i + 1)) + sleep(1) + continue + sys.exit(3) + print('Download successful, file: {}'.format(filename)) + + +def normalize_version(version: str) -> str: + """Return maj.min part of version string.""" + if platform.system() == 'Windows': + if version in ['4', '40']: + version = '4.0' + elif version == '35': + version = '3.5' + return version + + +def get_toolchain_name() -> str: + """Return toolchain name.""" + if platform.system() == 'Windows': + return 'RTools' + return '' + + +# TODO(2.0): drop 3.5 support +def get_url(version: str) -> str: + """Return URL for toolchain.""" + url = '' + if platform.system() == 'Windows': + if version == '4.0': + # pylint: disable=line-too-long + if IS_64BITS: + url = 'https://cran.r-project.org/bin/windows/Rtools/rtools40-x86_64.exe' # noqa: disable=E501 + else: + url = 'https://cran.r-project.org/bin/windows/Rtools/rtools40-i686.exe' # noqa: disable=E501 + elif version == '3.5': + url = 'https://cran.r-project.org/bin/windows/Rtools/Rtools35.exe' + return url + + +def get_toolchain_version(name: str, version: str) -> str: + """Toolchain version.""" + toolchain_folder = '' + if platform.system() == 'Windows': + toolchain_folder = '{}{}'.format(name, version.replace('.', '')) + + return toolchain_folder + + +def run_rtools_install(args: Dict[str, Any]) -> None: + """Main.""" + if platform.system() not in {'Windows'}: + raise NotImplementedError( + 'Download for the C++ toolchain ' + 'on the current platform has not ' + f'been implemented: {platform.system()}' + ) + toolchain = get_toolchain_name() + version = args['version'] + if version is None: + version = latest_version() + version = normalize_version(version) + print("C++ toolchain '{}' version: {}".format(toolchain, version)) + + url = get_url(version) + + if 'verbose' in args: + verbose = args['verbose'] + else: + verbose = False + + install_dir = args['dir'] + if install_dir is None: + install_dir = os.path.expanduser(os.path.join('~', _DOT_CMDSTAN)) + validate_dir(install_dir) + print('Install directory: {}'.format(install_dir)) + + if 'progress' in args: + progress = args['progress'] + else: + progress = False + + if platform.system() == 'Windows': + silent = 'silent' in args + # force silent == False for 4.0 version + if 'silent' not in args and version in ('4.0', '4', '40'): + silent = False + else: + silent = False + + toolchain_folder = get_toolchain_version(toolchain, version) + with pushd(install_dir): + if is_installed(toolchain_folder, version): + print('C++ toolchain {} already installed'.format(toolchain_folder)) + else: + if os.path.exists(toolchain_folder): + shutil.rmtree(toolchain_folder, ignore_errors=False) + retrieve_toolchain( + toolchain_folder + EXTENSION, url, progress=progress + ) + install_version( + toolchain_folder, + toolchain_folder + EXTENSION, + version, + silent, + verbose, + ) + if ( + 'no-make' not in args + and (platform.system() == 'Windows') + and (version in ('4.0', '4', '40')) + ): + if os.path.exists( + os.path.join( + toolchain_folder, 'mingw64', 'bin', 'mingw32-make.exe' + ) + ): + print('mingw32-make.exe already installed') + else: + install_mingw32_make(toolchain_folder, verbose) + + +def parse_cmdline_args() -> Dict[str, Any]: + parser = argparse.ArgumentParser() + parser.add_argument('--version', '-v', help="version, defaults to latest") + parser.add_argument( + '--dir', '-d', help="install directory, defaults to '~/.cmdstan" + ) + parser.add_argument( + '--silent', + '-s', + action='store_true', + help="install with /VERYSILENT instead of /SILENT for RTools", + ) + parser.add_argument( + '--no-make', + '-m', + action='store_false', + help="don't install mingw32-make (Windows RTools 4.0 only)", + ) + parser.add_argument( + '--verbose', + action='store_true', + help="flag, when specified prints output from RTools build process", + ) + parser.add_argument( + '--progress', + action='store_true', + help="flag, when specified show progress bar for CmdStan download", + ) + return vars(parser.parse_args(sys.argv[1:])) + + +def __main__() -> None: + run_rtools_install(parse_cmdline_args()) + + +if __name__ == '__main__': + __main__() diff --git a/.venv/lib/python3.12/site-packages/cmdstanpy/model.py b/.venv/lib/python3.12/site-packages/cmdstanpy/model.py new file mode 100644 index 00000000..11519886 --- /dev/null +++ b/.venv/lib/python3.12/site-packages/cmdstanpy/model.py @@ -0,0 +1,2173 @@ +"""CmdStanModel""" + +import os +import platform +import re +import shutil +import subprocess +import sys +import tempfile +import threading +from collections import OrderedDict +from concurrent.futures import ThreadPoolExecutor +from io import StringIO +from multiprocessing import cpu_count +from typing import ( + Any, + Callable, + Dict, + Iterable, + List, + Literal, + Mapping, + Optional, + TypeVar, + Union, +) + +import pandas as pd +from tqdm.auto import tqdm + +from cmdstanpy import ( + _CMDSTAN_REFRESH, + _CMDSTAN_SAMPLING, + _CMDSTAN_WARMUP, + _TMPDIR, + compilation, +) +from cmdstanpy.cmdstan_args import ( + CmdStanArgs, + GenerateQuantitiesArgs, + LaplaceArgs, + Method, + OptimizeArgs, + PathfinderArgs, + SamplerArgs, + VariationalArgs, +) +from cmdstanpy.stanfit import ( + CmdStanGQ, + CmdStanLaplace, + CmdStanMCMC, + CmdStanMLE, + CmdStanPathfinder, + CmdStanVB, + RunSet, + from_csv, +) +from cmdstanpy.utils import ( + cmdstan_path, + cmdstan_version_before, + do_command, + get_logger, + returncode_msg, +) +from cmdstanpy.utils.filesystem import temp_inits, temp_single_json + +from . import progress as progbar + +OptionalPath = Union[str, os.PathLike, None] +Fit = TypeVar('Fit', CmdStanMCMC, CmdStanMLE, CmdStanVB) + + +class CmdStanModel: + # overview, omitted from doc comment in order to improve Sphinx docs. + # A CmdStanModel object encapsulates the Stan program and provides + # methods for compilation and inference. + """ + The constructor method allows model instantiation given either the + Stan program source file or the compiled executable, or both. + This will compile the model if provided a Stan file and no executable, + + :param model_name: Model name, used for output file names. + Optional, default is the base filename of the Stan program file. + Deprecated: In version 2.0.0, model name cannot be + specified and will always be taken from executable. + + :param stan_file: Path to Stan program file. + + :param exe_file: Path to compiled executable file. Optional, unless + no Stan program file is specified. If both the program file and + the compiled executable file are specified, the base filenames + must match, (but different directory locations are allowed). + + :param force_compile: If ``True``, always compile, even if there + is an existing executable file for this model. + + :param stanc_options: Options for stanc compiler, specified as a Python + dictionary containing Stanc3 compiler option name, value pairs. + Optional. + + :param cpp_options: Options for C++ compiler, specified as a Python + dictionary containing C++ compiler option name, value pairs. + Optional. + + :param user_header: A path to a header file to include during C++ + compilation. + Optional. + + :param compile: Whether or not to compile the model. Default is ``True``. + If set to the string ``"force"``, it will always compile even if + an existing executable is found. + Deprecated: Use ``force_compile`` instead. The ability to instantiate + a CmdStanModel without an executable will be removed in version 2.0.0. + + """ + + def __init__( + self, + model_name: Optional[str] = None, + stan_file: OptionalPath = None, + exe_file: OptionalPath = None, + force_compile: bool = False, + stanc_options: Optional[Dict[str, Any]] = None, + cpp_options: Optional[Dict[str, Any]] = None, + user_header: OptionalPath = None, + *, + compile: Union[bool, Literal['force'], None] = None, + ) -> None: + """ + Initialize object given constructor args. + + :param model_name: Deprecated. Model name, used for output file names. + :param stan_file: Path to Stan program file. + :param exe_file: Path to compiled executable file. + :param force_compile: Whether or not to force recompilation if + executable file already exists. + :param stanc_options: Options for stanc compiler. + :param cpp_options: Options for C++ compiler. + :param user_header: A path to a header file to include during C++ + compilation. + :param compile: Deprecated. Whether or not to compile the model. + """ + self._name = '' + self._stan_file = None + self._exe_file = None + self._compiler_options = compilation.CompilerOptions( + stanc_options=stanc_options, + cpp_options=cpp_options, + user_header=user_header, + ) + self._compiler_options.validate() + + self._fixed_param = False + + if compile is None: + compile = True + else: + get_logger().warning( + "CmdStanModel(compile=...) is deprecated and will be " + "removed in the next major version. The constructor will " + "always ensure a model has a compiled executable.\n" + "If you wish to force recompilation, use force_compile=True " + "instead." + ) + + if force_compile: + compile = 'force' + + if model_name is not None: + get_logger().warning( + "CmdStanModel(model_name=...) is deprecated and will be " + "removed in the next major version." + ) + if not model_name.strip(): + raise ValueError( + 'Invalid value for argument model name, found "{}"'.format( + model_name + ) + ) + self._name = model_name.strip() + + if stan_file is None: + if exe_file is None: + raise ValueError( + 'Missing model file arguments, you must specify ' + 'either Stan source or executable program file or both.' + ) + else: + self._stan_file = os.path.realpath(os.path.expanduser(stan_file)) + if not os.path.exists(self._stan_file): + raise ValueError('no such file {}'.format(self._stan_file)) + _, filename = os.path.split(stan_file) + if len(filename) < 6 or not filename.endswith('.stan'): + raise ValueError( + 'invalid stan filename {}'.format(self._stan_file) + ) + if not self._name: + self._name, _ = os.path.splitext(filename) + + # if program has include directives, record path + with open(self._stan_file, 'r') as fd: + program = fd.read() + if '#include' in program: + path, _ = os.path.split(self._stan_file) + self._compiler_options.add_include_path(path) + + # try to detect models w/out parameters, needed for sampler + if (not cmdstan_version_before(2, 27)) and cmdstan_version_before( + 2, 36 + ): + try: + model_info = self.src_info() + if 'parameters' in model_info: + self._fixed_param |= len(model_info['parameters']) == 0 + except ValueError as e: + if compile: + raise + get_logger().debug(e) + + if exe_file is not None: + self._exe_file = os.path.realpath(os.path.expanduser(exe_file)) + if not os.path.exists(self._exe_file): + raise ValueError('no such file {}'.format(self._exe_file)) + _, exename = os.path.split(self._exe_file) + if not self._name: + self._name, _ = os.path.splitext(exename) + else: + if self._name != os.path.splitext(exename)[0]: + raise ValueError( + 'Name mismatch between Stan file and compiled' + ' executable, expecting basename: {}' + ' found: {}.'.format(self._name, exename) + ) + + if platform.system() == 'Windows': + try: + do_command(['where.exe', 'tbb.dll'], fd_out=None) + except RuntimeError: + # Add tbb to the $PATH on Windows + libtbb = os.environ.get('STAN_TBB') + if libtbb is None: + libtbb = os.path.join( + cmdstan_path(), 'stan', 'lib', 'stan_math', 'lib', 'tbb' + ) + get_logger().debug("Adding TBB (%s) to PATH", libtbb) + os.environ['PATH'] = ';'.join( + list( + OrderedDict.fromkeys( + [libtbb] + os.environ.get('PATH', '').split(';') + ) + ) + ) + else: + get_logger().debug("TBB already found in load path") + + if compile and self._exe_file is None: + self.compile(force=str(compile).lower() == 'force', _internal=True) + + def __repr__(self) -> str: + repr = 'CmdStanModel: name={}'.format(self._name) + repr = '{}\n\t stan_file={}'.format(repr, self._stan_file) + repr = '{}\n\t exe_file={}'.format(repr, self._exe_file) + repr = '{}\n\t compiler_options={}'.format(repr, self._compiler_options) + return repr + + @property + def name(self) -> str: + """ + Model name used in output filename templates. Default is basename + of Stan program or exe file, unless specified in call to constructor + via argument ``model_name``. + """ + return self._name + + @property + def stan_file(self) -> OptionalPath: + """Full path to Stan program file.""" + return self._stan_file + + @property + def exe_file(self) -> OptionalPath: + """Full path to Stan exe file.""" + return self._exe_file + + def exe_info(self) -> Dict[str, str]: + """ + Run model with option 'info'. Parse output statements, which all + have form 'key = value' into a Dict. + If exe file compiled with CmdStan < 2.27, option 'info' isn't + available and the method returns an empty dictionary. + """ + result: Dict[str, str] = {} + if self.exe_file is None: + return result + try: + info = StringIO() + do_command(cmd=[str(self.exe_file), 'info'], fd_out=info) + lines = info.getvalue().split('\n') + for line in lines: + kv_pair = [x.strip() for x in line.split('=')] + if len(kv_pair) != 2: + continue + result[kv_pair[0]] = kv_pair[1] + return result + except RuntimeError as e: + get_logger().debug(e) + return result + + def src_info(self) -> Dict[str, Any]: + """ + Run stanc with option '--info'. + + If stanc is older than 2.27 or if the stan + file cannot be found, returns an empty dictionary. + """ + if self.stan_file is None or cmdstan_version_before(2, 27): + return {} + return compilation.src_info(str(self.stan_file), self._compiler_options) + + # TODO(2.0) remove + def format( + self, + overwrite_file: bool = False, + canonicalize: Union[bool, str, Iterable[str]] = False, + max_line_length: int = 78, + *, + backup: bool = True, + ) -> None: + """ + Deprecated: Use :func:`cmdstanpy.format_stan_file()` instead. + + Run stanc's auto-formatter on the model code. Either saves directly + back to the file or prints for inspection + + + :param overwrite_file: If True, save the updated code to disk, rather + than printing it. By default False + :param canonicalize: Whether or not the compiler should 'canonicalize' + the Stan model, removing things like deprecated syntax. Default is + False. If True, all canonicalizations are run. If it is a list of + strings, those options are passed to stanc (new in Stan 2.29) + :param max_line_length: Set the wrapping point for the formatter. The + default value is 78, which wraps most lines by the 80th character. + :param backup: If True, create a stanfile.bak backup before + writing to the file. Only disable this if you're sure you have other + copies of the file or are using a version control system like Git. + """ + + get_logger().warning( + "CmdStanModel.format() is deprecated and will be " + "removed in the next major version.\n" + "Use cmdstanpy.format_stan_file() instead." + ) + + if self.stan_file is None: + raise ValueError("No Stan file found for this module") + + compilation.format_stan_file( + self.stan_file, + overwrite_file=overwrite_file, + max_line_length=max_line_length, + canonicalize=canonicalize, + backup=backup, + stanc_options=self.stanc_options, + ) + + @property + def stanc_options(self) -> Dict[str, Union[bool, int, str]]: + """Options to stanc compilers.""" + return self._compiler_options._stanc_options + + @property + def cpp_options(self) -> Dict[str, Union[bool, int]]: + """Options to C++ compilers.""" + return self._compiler_options._cpp_options + + @property + def user_header(self) -> str: + """The user header file if it exists, otherwise empty""" + return self._compiler_options._user_header + + def code(self) -> Optional[str]: + """Return Stan program as a string.""" + if not self._stan_file: + raise RuntimeError('Please specify source file') + + code = None + try: + with open(self._stan_file, 'r') as fd: + code = fd.read() + except IOError: + get_logger().error( + 'Cannot read file Stan file: %s', self._stan_file + ) + return code + + # TODO(2.0): remove + def compile( + self, + force: bool = False, + stanc_options: Optional[Dict[str, Any]] = None, + cpp_options: Optional[Dict[str, Any]] = None, + user_header: OptionalPath = None, + override_options: bool = False, + *, + _internal: bool = False, + ) -> None: + """ + Deprecated: To compile a model, use the :class:`~cmdstanpy.CmdStanModel` + constructor or :func:`cmdstanpy.compile_stan_file()`. + + Compile the given Stan program file. Translates the Stan code to + C++, then calls the C++ compiler. + + By default, this function compares the timestamps on the source and + executable files; if the executable is newer than the source file, it + will not recompile the file, unless argument ``force`` is ``True`` + or unless the compiler options have been changed. + + :param force: When ``True``, always compile, even if the executable file + is newer than the source file. Used for Stan models which have + ``#include`` directives in order to force recompilation when changes + are made to the included files. + + :param stanc_options: Options for stanc compiler. + :param cpp_options: Options for C++ compiler. + :param user_header: A path to a header file to include during C++ + compilation. + + :param override_options: When ``True``, override existing option. + When ``False``, add/replace existing options. Default is ``False``. + """ + if not _internal: + get_logger().warning( + "CmdStanModel.compile() is deprecated and will be removed in " + "the next major version. To compile a model, use the " + "CmdStanModel() constructor or cmdstanpy.compile_stan_file()." + ) + + if not self._stan_file: + raise RuntimeError('Please specify source file') + + compiler_options = None + if ( + stanc_options is not None + or cpp_options is not None + or user_header is not None + ): + compiler_options = compilation.CompilerOptions( + stanc_options=stanc_options, + cpp_options=cpp_options, + user_header=user_header, + ) + compiler_options.validate() + + if compiler_options != self._compiler_options: + force = True + if self._compiler_options is None: + self._compiler_options = compiler_options + elif override_options: + self._compiler_options = compiler_options + else: + self._compiler_options.add(compiler_options) + + self._exe_file = compilation.compile_stan_file( + str(self.stan_file), + force=force, + stanc_options=self._compiler_options.stanc_options, + cpp_options=self._compiler_options.cpp_options, + user_header=self._compiler_options.user_header, + ) + + def optimize( + self, + data: Union[Mapping[str, Any], str, os.PathLike, None] = None, + seed: Optional[int] = None, + inits: Union[Mapping[str, Any], float, str, os.PathLike, None] = None, + output_dir: OptionalPath = None, + sig_figs: Optional[int] = None, + save_profile: bool = False, + algorithm: Optional[str] = None, + init_alpha: Optional[float] = None, + tol_obj: Optional[float] = None, + tol_rel_obj: Optional[float] = None, + tol_grad: Optional[float] = None, + tol_rel_grad: Optional[float] = None, + tol_param: Optional[float] = None, + history_size: Optional[int] = None, + iter: Optional[int] = None, + save_iterations: bool = False, + require_converged: bool = True, + show_console: bool = False, + refresh: Optional[int] = None, + time_fmt: str = "%Y%m%d%H%M%S", + timeout: Optional[float] = None, + jacobian: bool = False, + # would be nice to move this further up, but that's a breaking change + ) -> CmdStanMLE: + """ + Run the specified CmdStan optimize algorithm to produce a + penalized maximum likelihood estimate of the model parameters. + + This function validates the specified configuration, composes a call to + the CmdStan ``optimize`` method and spawns one subprocess to run the + optimizer and waits for it to run to completion. + Unspecified arguments are not included in the call to CmdStan, i.e., + those arguments will have CmdStan default values. + + The :class:`CmdStanMLE` object records the command, the return code, + and the paths to the optimize method output CSV and console files. + The output files are written either to a specified output directory + or to a temporary directory which is deleted upon session exit. + + Output files are either written to a temporary directory or to the + specified output directory. Output filenames correspond to the template + '--' plus the file suffix which is + either '.csv' for the CmdStan output or '.txt' for + the console messages, e.g. 'bernoulli-201912081451-1.csv'. + Output files written to the temporary directory contain an additional + 8-character random string, e.g. 'bernoulli-201912081451-1-5nm6as7u.csv'. + + :param data: Values for all data variables in the model, specified + either as a dictionary with entries matching the data variables, + or as the path of a data file in JSON or Rdump format. + + :param seed: The seed for random number generator. Must be an integer + between 0 and 2^32 - 1. If unspecified, + :func:`numpy.random.default_rng` is used to generate a seed. + + :param inits: Specifies how the sampler initializes parameter values. + Initialization is either uniform random on a range centered on 0, + exactly 0, or a dictionary or file of initial values for some or + all parameters in the model. The default initialization behavior + will initialize all parameter values on range [-2, 2] on the + *unconstrained* support. If the expected parameter values are + too far from this range, this option may improve estimation. + The following value types are allowed: + + * Single number, n > 0 - initialization range is [-n, n]. + * 0 - all parameters are initialized to 0. + * dictionary - pairs parameter name : initial value. + * string - pathname to a JSON or Rdump data file. + + :param output_dir: Name of the directory to which CmdStan output + files are written. If unspecified, output files will be written + to a temporary directory which is deleted upon session exit. + + :param sig_figs: Numerical precision used for output CSV and text files. + Must be an integer between 1 and 18. If unspecified, the default + precision for the system file I/O is used; the usual value is 6. + Introduced in CmdStan-2.25. + + :param save_profile: Whether or not to profile auto-diff operations in + labelled blocks of code. If ``True``, CSV outputs are written to + file '--profile-'. + Introduced in CmdStan-2.26. + + :param algorithm: Algorithm to use. One of: 'BFGS', 'LBFGS', 'Newton' + + :param init_alpha: Line search step size for first iteration + + :param tol_obj: Convergence tolerance on changes in objective + function value + + :param tol_rel_obj: Convergence tolerance on relative changes + in objective function value + + :param tol_grad: Convergence tolerance on the norm of the gradient + + :param tol_rel_grad: Convergence tolerance on the relative + norm of the gradient + + :param tol_param: Convergence tolerance on changes in parameter value + + :param history_size: Size of the history for LBFGS Hessian + approximation. The value should be less than the dimensionality + of the parameter space. 5-10 usually sufficient + + :param iter: Total number of iterations + + :param save_iterations: When ``True``, save intermediate approximations + to the output CSV file. Default is ``False``. + + :param require_converged: Whether or not to raise an error if Stan + reports that "The algorithm may not have converged". + + :param show_console: If ``True``, stream CmdStan messages sent to + stdout and stderr to the console. Default is ``False``. + + :param refresh: Specify the number of iterations cmdstan will take + between progress messages. Default value is 100. + + :param time_fmt: A format string passed to + :meth:`~datetime.datetime.strftime` to decide the file names for + output CSVs. Defaults to "%Y%m%d%H%M%S" + + :param timeout: Duration at which optimization times out in seconds. + + :param jacobian: Whether or not to use the Jacobian adjustment for + constrained variables in optimization. By default this is false, + meaning optimization yields the Maximum Likehood Estimate (MLE). + Setting it to true yields the Maximum A Posteriori Estimate (MAP). + + :return: CmdStanMLE object + """ + optimize_args = OptimizeArgs( + algorithm=algorithm, + init_alpha=init_alpha, + tol_obj=tol_obj, + tol_rel_obj=tol_rel_obj, + tol_grad=tol_grad, + tol_rel_grad=tol_rel_grad, + tol_param=tol_param, + history_size=history_size, + iter=iter, + save_iterations=save_iterations, + jacobian=jacobian, + ) + + if jacobian and cmdstan_version_before(2, 32, self.exe_info()): + raise ValueError( + "Jacobian adjustment for optimization is only supported " + "in CmdStan 2.32 and above." + ) + + with temp_single_json(data) as _data, temp_inits( + inits, allow_multiple=False + ) as _inits: + args = CmdStanArgs( + self._name, + self._exe_file, + chain_ids=None, + data=_data, + seed=seed, + inits=_inits, + output_dir=output_dir, + sig_figs=sig_figs, + save_profile=save_profile, + method_args=optimize_args, + refresh=refresh, + ) + dummy_chain_id = 0 + runset = RunSet(args=args, chains=1, time_fmt=time_fmt) + self._run_cmdstan( + runset, + dummy_chain_id, + show_console=show_console, + timeout=timeout, + ) + runset.raise_for_timeouts() + + if not runset._check_retcodes(): + msg = "Error during optimization! Command '{}' failed: {}".format( + ' '.join(runset.cmd(0)), runset.get_err_msgs() + ) + if 'Line search failed' in msg and not require_converged: + get_logger().warning(msg) + else: + raise RuntimeError(msg) + mle = CmdStanMLE(runset) + return mle + + # pylint: disable=too-many-arguments + def sample( + self, + data: Union[Mapping[str, Any], str, os.PathLike, None] = None, + chains: Optional[int] = None, + parallel_chains: Optional[int] = None, + threads_per_chain: Optional[int] = None, + seed: Union[int, List[int], None] = None, + chain_ids: Union[int, List[int], None] = None, + inits: Union[ + Mapping[str, Any], + float, + str, + List[str], + List[Mapping[str, Any]], + None, + ] = None, + iter_warmup: Optional[int] = None, + iter_sampling: Optional[int] = None, + save_warmup: bool = False, + thin: Optional[int] = None, + max_treedepth: Optional[int] = None, + metric: Union[ + str, Dict[str, Any], List[str], List[Dict[str, Any]], None + ] = None, + step_size: Union[float, List[float], None] = None, + adapt_engaged: bool = True, + adapt_delta: Optional[float] = None, + adapt_init_phase: Optional[int] = None, + adapt_metric_window: Optional[int] = None, + adapt_step_size: Optional[int] = None, + fixed_param: bool = False, + output_dir: OptionalPath = None, + sig_figs: Optional[int] = None, + save_latent_dynamics: bool = False, + save_profile: bool = False, + show_progress: bool = True, + show_console: bool = False, + refresh: Optional[int] = None, + time_fmt: str = "%Y%m%d%H%M%S", + timeout: Optional[float] = None, + *, + force_one_process_per_chain: Optional[bool] = None, + ) -> CmdStanMCMC: + """ + Run or more chains of the NUTS-HMC sampler to produce a set of draws + from the posterior distribution of a model conditioned on some data. + + This function validates the specified configuration, composes a call to + the CmdStan ``sample`` method and spawns one subprocess per chain to run + the sampler and waits for all chains to run to completion. + Unspecified arguments are not included in the call to CmdStan, i.e., + those arguments will have CmdStan default values. + + For each chain, the :class:`CmdStanMCMC` object records the command, + the return code, the sampler output file paths, and the corresponding + console outputs, if any. The output files are written either to a + specified output directory or to a temporary directory which is deleted + upon session exit. + + Output files are either written to a temporary directory or to the + specified output directory. Ouput filenames correspond to the template + '--' plus the file suffix which is + either '.csv' for the CmdStan output or '.txt' for + the console messages, e.g. 'bernoulli-201912081451-1.csv'. + Output files written to the temporary directory contain an additional + 8-character random string, e.g. 'bernoulli-201912081451-1-5nm6as7u.csv'. + + :param data: Values for all data variables in the model, specified + either as a dictionary with entries matching the data variables, + or as the path of a data file in JSON or Rdump format. + + :param chains: Number of sampler chains, must be a positive integer. + + :param parallel_chains: Number of processes to run in parallel. Must be + a positive integer. Defaults to :func:`multiprocessing.cpu_count`, + i.e., it will only run as many chains in parallel as there are + cores on the machine. Note that CmdStan 2.28 and higher can run + all chains in parallel providing that the model was compiled with + threading support. + + :param threads_per_chain: The number of threads to use in parallelized + sections within an MCMC chain (e.g., when using the Stan functions + ``reduce_sum()`` or ``map_rect()``). This will only have an effect + if the model was compiled with threading support. For such models, + CmdStan version 2.28 and higher will run all chains in parallel + from within a single process. The total number of threads used + will be ``parallel_chains * threads_per_chain``, where the default + value for parallel_chains is the number of cpus, not chains. + + :param seed: The seed for random number generator. Must be an integer + between 0 and 2^32 - 1. If unspecified, + :func:`numpy.random.default_rng` + is used to generate a seed which will be used for all chains. + When the same seed is used across all chains, + the chain-id is used to advance the RNG to avoid dependent samples. + + :param chain_ids: The offset for the random number generator, either + an integer or a list of unique per-chain offsets. If unspecified, + chain ids are numbered sequentially starting from 1. + + :param inits: Specifies how the sampler initializes parameter values. + Initialization is either uniform random on a range centered on 0, + exactly 0, or a dictionary or file of initial values for some or all + parameters in the model. The default initialization behavior will + initialize all parameter values on range [-2, 2] on the + *unconstrained* support. If the expected parameter values are + too far from this range, this option may improve adaptation. + The following value types are allowed: + + * Single number n > 0 - initialization range is [-n, n]. + * 0 - all parameters are initialized to 0. + * dictionary - pairs parameter name : initial value. + * string - pathname to a JSON or Rdump data file. + * list of strings - per-chain pathname to data file. + * list of dictionaries - per-chain initial values. + + :param iter_warmup: Number of warmup iterations for each chain. + + :param iter_sampling: Number of draws from the posterior for each + chain. + + :param save_warmup: When ``True``, sampler saves warmup draws as part of + the Stan CSV output file. + + :param thin: Period between recorded iterations. Default is 1, i.e., + all iterations are recorded. + + :param max_treedepth: Maximum depth of trees evaluated by NUTS sampler + per iteration. + + :param metric: Specification of the mass matrix, either as a + vector consisting of the diagonal elements of the covariance + matrix ('diag' or 'diag_e') or the full covariance matrix + ('dense' or 'dense_e'). + + If the value of the metric argument is a string other than + 'diag', 'diag_e', 'dense', or 'dense_e', it must be + a valid filepath to a JSON or Rdump file which contains an entry + 'inv_metric' whose value is either the diagonal vector or + the full covariance matrix. + + If the value of the metric argument is a list of paths, its + length must match the number of chains and all paths must be + unique. + + If the value of the metric argument is a Python dict object, it + must contain an entry 'inv_metric' which specifies either the + diagnoal or dense matrix. + + If the value of the metric argument is a list of Python dicts, + its length must match the number of chains and all dicts must + containan entry 'inv_metric' and all 'inv_metric' entries must + have the same shape. + + :param step_size: Initial step size for HMC sampler. The value is + either a single number or a list of numbers which will be used + as the global or per-chain initial step size, respectively. + The length of the list of step sizes must match the number of + chains. + + :param adapt_engaged: When ``True``, adapt step size and metric. + + :param adapt_delta: Adaptation target Metropolis acceptance rate. + The default value is 0.8. Increasing this value, which must be + strictly less than 1, causes adaptation to use smaller step sizes + which improves the effective sample size, but may increase the time + per iteration. + + :param adapt_init_phase: Iterations for initial phase of adaptation + during which step size is adjusted so that the chain converges + towards the typical set. + + :param adapt_metric_window: The second phase of adaptation tunes + the metric and step size in a series of intervals. This parameter + specifies the number of iterations used for the first tuning + interval; window size increases for each subsequent interval. + + :param adapt_step_size: Number of iterations given over to adjusting + the step size given the tuned metric during the final phase of + adaptation. + + :param fixed_param: When ``True``, call CmdStan with argument + ``algorithm=fixed_param`` which runs the sampler without + updating the Markov Chain, thus the values of all parameters and + transformed parameters are constant across all draws and + only those values in the generated quantities block that are + produced by RNG functions may change. This provides + a way to use Stan programs to generate simulated data via the + generated quantities block. Default value is ``False``. + + :param output_dir: Name of the directory to which CmdStan output + files are written. If unspecified, output files will be written + to a temporary directory which is deleted upon session exit. + + :param sig_figs: Numerical precision used for output CSV and text files. + Must be an integer between 1 and 18. If unspecified, the default + precision for the system file I/O is used; the usual value is 6. + Introduced in CmdStan-2.25. + + :param save_latent_dynamics: Whether or not to output the position and + momentum information for the model parameters (unconstrained). + If ``True``, CSV outputs are written to an output file + '--diagnostic-', + e.g. 'bernoulli-201912081451-diagnostic-1.csv', see + https://mc-stan.org/docs/cmdstan-guide/stan_csv.html, + section "Diagnostic CSV output file" for details. + + :param save_profile: Whether or not to profile auto-diff operations in + labelled blocks of code. If ``True``, CSV outputs are written to + file '--profile-'. + Introduced in CmdStan-2.26, see + https://mc-stan.org/docs/cmdstan-guide/stan_csv.html, + section "Profiling CSV output file" for details. + + :param show_progress: If ``True``, display progress bar to track + progress for warmup and sampling iterations. Default is ``True``, + unless package tqdm progress bar encounter errors. + + :param show_console: If ``True``, stream CmdStan messages sent to stdout + and stderr to the console. Default is ``False``. + + :param refresh: Specify the number of iterations CmdStan will take + between progress messages. Default value is 100. + + :param time_fmt: A format string passed to + :meth:`~datetime.datetime.strftime` to decide the file names for + output CSVs. Defaults to "%Y%m%d%H%M%S" + + :param force_one_process_per_chain: If ``True``, run multiple chains in + distinct processes regardless of model ability to run parallel + chains (CmdStan 2.28+ feature). If ``False``, always run multiple + chains in one process (does not check that this is valid). + + If None (Default): Check that CmdStan version is >=2.28, and that + model was compiled with STAN_THREADS=True, and utilize the + parallel chain functionality if those conditions are met. + + :param timeout: Duration at which sampling times out in seconds. + + :return: CmdStanMCMC object + """ + if fixed_param is None: + fixed_param = self._fixed_param + + if chains is None: + chains = 4 + if chains < 1: + raise ValueError( + 'Chains must be a positive integer value, found {}.'.format( + chains + ) + ) + + if parallel_chains is None: + parallel_chains = max(min(cpu_count(), chains), 1) + elif parallel_chains > chains: + get_logger().info( + 'Requested %u parallel_chains but only %u required, ' + 'will run all chains in parallel.', + parallel_chains, + chains, + ) + parallel_chains = chains + elif parallel_chains < 1: + raise ValueError( + 'Argument parallel_chains must be a positive integer, ' + 'found {}.'.format(parallel_chains) + ) + if threads_per_chain is None: + threads_per_chain = 1 + if threads_per_chain < 1: + raise ValueError( + 'Argument threads_per_chain must be a positive integer, ' + 'found {}.'.format(threads_per_chain) + ) + + parallel_procs = parallel_chains + num_threads = threads_per_chain + one_process_per_chain = True + info_dict = self.exe_info() + stan_threads = info_dict.get('STAN_THREADS', 'false').lower() + # run multi-chain sampler unless algo is fixed_param or 1 chain + if chains == 1: + force_one_process_per_chain = True + + if ( + force_one_process_per_chain is None + and not cmdstan_version_before(2, 28, info_dict) + and stan_threads == 'true' + ): + one_process_per_chain = False + num_threads = parallel_chains * num_threads + parallel_procs = 1 + if force_one_process_per_chain is False: + if not cmdstan_version_before(2, 28, info_dict): + one_process_per_chain = False + num_threads = parallel_chains * num_threads + parallel_procs = 1 + if stan_threads == 'false': + get_logger().warning( + 'Stan program not compiled for threading, ' + 'process will run chains sequentially. ' + 'For multi-chain parallelization, recompile ' + 'the model with argument ' + '"cpp_options={\'STAN_THREADS\':\'TRUE\'}.' + ) + else: + get_logger().warning( + 'Installed version of CmdStan cannot multi-process ' + 'chains, will run %d processes. ' + 'Run "install_cmdstan" to upgrade to latest version.', + chains, + ) + os.environ['STAN_NUM_THREADS'] = str(num_threads) + + if chain_ids is None: + chain_ids = [i + 1 for i in range(chains)] + else: + if isinstance(chain_ids, int): + if chain_ids < 1: + raise ValueError( + 'Chain_id must be a positive integer value,' + ' found {}.'.format(chain_ids) + ) + chain_ids = [i + chain_ids for i in range(chains)] + else: + if not one_process_per_chain: + for i, j in zip(chain_ids, chain_ids[1:]): + if i != j - 1: + raise ValueError( + 'chain_ids must be sequential list of integers,' + ' found {}.'.format(chain_ids) + ) + if not len(chain_ids) == chains: + raise ValueError( + 'Chain_ids must correspond to number of chains' + ' specified {} chains, found {} chain_ids.'.format( + chains, len(chain_ids) + ) + ) + for chain_id in chain_ids: + if chain_id < 0: + raise ValueError( + 'Chain_id must be a non-negative integer value,' + ' found {}.'.format(chain_id) + ) + + sampler_args = SamplerArgs( + num_chains=1 if one_process_per_chain else chains, + iter_warmup=iter_warmup, + iter_sampling=iter_sampling, + save_warmup=save_warmup, + thin=thin, + max_treedepth=max_treedepth, + metric=metric, + step_size=step_size, + adapt_engaged=adapt_engaged, + adapt_delta=adapt_delta, + adapt_init_phase=adapt_init_phase, + adapt_metric_window=adapt_metric_window, + adapt_step_size=adapt_step_size, + fixed_param=fixed_param, + ) + + with temp_single_json(data) as _data, temp_inits( + inits, id=chain_ids[0] + ) as _inits: + cmdstan_inits: Union[str, List[str], int, float, None] + if one_process_per_chain and isinstance(inits, list): # legacy + cmdstan_inits = [ + f"{_inits[:-5]}_{i}.json" for i in chain_ids # type: ignore + ] + else: + cmdstan_inits = _inits + + args = CmdStanArgs( + self._name, + self._exe_file, + chain_ids=chain_ids, + data=_data, + seed=seed, + inits=cmdstan_inits, + output_dir=output_dir, + sig_figs=sig_figs, + save_latent_dynamics=save_latent_dynamics, + save_profile=save_profile, + method_args=sampler_args, + refresh=refresh, + ) + + if show_console: + show_progress = False + else: + show_progress = show_progress and progbar.allow_show_progress() + get_logger().info('CmdStan start processing') + + progress_hook: Optional[Callable[[str, int], None]] = None + if show_progress: + iter_total = 0 + if iter_warmup is None: + iter_total += _CMDSTAN_WARMUP + else: + iter_total += iter_warmup + if iter_sampling is None: + iter_total += _CMDSTAN_SAMPLING + else: + iter_total += iter_sampling + if refresh is None: + refresh = _CMDSTAN_REFRESH + iter_total = iter_total // refresh + 2 + + progress_hook = self._wrap_sampler_progress_hook( + chain_ids=chain_ids, + total=iter_total, + ) + runset = RunSet( + args=args, + chains=chains, + chain_ids=chain_ids, + time_fmt=time_fmt, + one_process_per_chain=one_process_per_chain, + ) + with ThreadPoolExecutor(max_workers=parallel_procs) as executor: + for i in range(runset.num_procs): + executor.submit( + self._run_cmdstan, + runset=runset, + idx=i, + show_progress=show_progress, + show_console=show_console, + progress_hook=progress_hook, + timeout=timeout, + ) + if show_progress and progress_hook is not None: + progress_hook("Done", -1) # -1 == all chains finished + + # advance terminal window cursor past progress bars + term_size: os.terminal_size = shutil.get_terminal_size( + fallback=(80, 24) + ) + if term_size is not None and term_size[0] > 0: + for i in range(chains): + sys.stdout.write(' ' * term_size[0]) + sys.stdout.flush() + sys.stdout.write('\n') + get_logger().info('CmdStan done processing.') + + runset.raise_for_timeouts() + + get_logger().debug('runset\n%s', repr(runset)) + + # hack needed to parse CSV files if model has no params + # needed if exe is supplied without stan file + with open(runset.stdout_files[0], 'r') as fd: + console_msgs = fd.read() + get_logger().debug('Chain 1 console:\n%s', console_msgs) + if 'running fixed_param sampler' in console_msgs: + get_logger().debug("Detected fixed param model") + sampler_args.fixed_param = True + runset._args.method_args = sampler_args + + errors = runset.get_err_msgs() + if not runset._check_retcodes(): + msg = ( + f'Error during sampling:\n{errors}\n' + f'Command and output files:\n{repr(runset)}' + ) + if not show_console: + msg += ( + '\nConsider re-running with show_console=True if the' + ' above output is unclear!' + ) + raise RuntimeError(msg) + if errors: + msg = f'Non-fatal error during sampling:\n{errors}' + if not show_console: + msg += ( + '\nConsider re-running with show_console=True if the' + ' above output is unclear!' + ) + get_logger().warning(msg) + + mcmc = CmdStanMCMC(runset) + return mcmc + + def generate_quantities( + self, + data: Union[Mapping[str, Any], str, os.PathLike, None] = None, + previous_fit: Union[Fit, List[str], None] = None, + seed: Optional[int] = None, + gq_output_dir: OptionalPath = None, + sig_figs: Optional[int] = None, + show_console: bool = False, + refresh: Optional[int] = None, + time_fmt: str = "%Y%m%d%H%M%S", + timeout: Optional[float] = None, + *, + mcmc_sample: Union[CmdStanMCMC, List[str], None] = None, + ) -> CmdStanGQ[Fit]: + """ + Run CmdStan's generate_quantities method which runs the generated + quantities block of a model given an existing sample. + + This function takes one of the Stan fit objects + :class:`CmdStanMCMC`, :class:`CmdStanMLE`, or :class:`CmdStanVB` + and the data required for the model and calls to the CmdStan + ``generate_quantities`` method to generate additional quantities of + interest. + + The :class:`CmdStanGQ` object records the command, the return code, + and the paths to the generate method output CSV and console files. + The output files are written either to a specified output directory + or to a temporary directory which is deleted upon session exit. + + Output files are either written to a temporary directory or to the + specified output directory. Output filenames correspond to the template + '--' plus the file suffix which is + either '.csv' for the CmdStan output or '.txt' for + the console messages, e.g. 'bernoulli-201912081451-1.csv'. + Output files written to the temporary directory contain an additional + 8-character random string, e.g. 'bernoulli-201912081451-1-5nm6as7u.csv'. + + :param data: Values for all data variables in the model, specified + either as a dictionary with entries matching the data variables, + or as the path of a data file in JSON or Rdump format. + + :param previous_fit: Can be either a :class:`CmdStanMCMC`, + :class:`CmdStanMLE`, or :class:`CmdStanVB` or a list of + stan-csv files generated by fitting the model to the data + using any Stan interface. + + :param seed: The seed for random number generator. Must be an integer + between 0 and 2^32 - 1. If unspecified, + :func:`numpy.random.default_rng` + is used to generate a seed which will be used for all chains. + *NOTE: Specifying the seed will guarantee the same result for + multiple invocations of this method with the same inputs. However + this will not reproduce results from the sample method given + the same inputs because the RNG will be in a different state.* + + :param gq_output_dir: Name of the directory in which the CmdStan output + files are saved. If unspecified, files will be written to a + temporary directory which is deleted upon session exit. + + :param sig_figs: Numerical precision used for output CSV and text files. + Must be an integer between 1 and 18. If unspecified, the default + precision for the system file I/O is used; the usual value is 6. + Introduced in CmdStan-2.25. + + :param show_console: If ``True``, stream CmdStan messages sent to + stdout and stderr to the console. Default is ``False``. + + :param refresh: Specify the number of iterations CmdStan will take + between progress messages. Default value is 100. + + :param time_fmt: A format string passed to + :meth:`~datetime.datetime.strftime` to decide the file names for + output CSVs. Defaults to "%Y%m%d%H%M%S" + + :param timeout: Duration at which generation times out in seconds. + + :return: CmdStanGQ object + """ + # TODO(2.0): remove + if mcmc_sample is not None: + if previous_fit: + raise ValueError( + "Cannot supply both 'previous_fit' and " + "deprecated argument 'mcmc_sample'" + ) + get_logger().warning( + "Argument name `mcmc_sample` is deprecated, please " + "rename to `previous_fit`." + ) + + previous_fit = mcmc_sample # type: ignore + + if isinstance(previous_fit, (CmdStanMCMC, CmdStanMLE, CmdStanVB)): + fit_object = previous_fit + fit_csv_files = previous_fit.runset.csv_files + elif isinstance(previous_fit, list): + if len(previous_fit) < 1: + raise ValueError( + 'Expecting list of Stan CSV files, found empty list' + ) + try: + fit_csv_files = previous_fit + fit_object = from_csv(fit_csv_files) # type: ignore + except ValueError as e: + raise ValueError( + 'Invalid sample from Stan CSV files, error:\n\t{}\n\t' + ' while processing files\n\t{}'.format( + repr(e), '\n\t'.join(previous_fit) + ) + ) from e + else: + raise ValueError( + 'Previous fit must be either CmdStanPy fit object' + ' or list of paths to Stan CSV files.' + ) + if isinstance(fit_object, CmdStanMCMC): + chains = fit_object.chains + chain_ids = fit_object.chain_ids + if fit_object._save_warmup: + get_logger().warning( + 'Sample contains saved warmup draws which will be used ' + 'to generate additional quantities of interest.' + ) + elif isinstance(fit_object, CmdStanMLE): + if cmdstan_version_before(2, 31): + raise RuntimeError( + "Method generate_quantities was not " + "available for non-HMC until CmdStan 2.31" + ) + chains = 1 + chain_ids = [1] + if fit_object._save_iterations: + get_logger().warning( + 'MLE contains saved iterations which will be used ' + 'to generate additional quantities of interest.' + ) + else: # isinstance(fit_object, CmdStanVB) + if cmdstan_version_before(2, 31): + raise RuntimeError( + "Method generate_quantities was not " + "available for non-HMC until CmdStan 2.31" + ) + chains = 1 + chain_ids = [1] + + generate_quantities_args = GenerateQuantitiesArgs( + csv_files=fit_csv_files + ) + generate_quantities_args.validate(chains) + with temp_single_json(data) as _data: + args = CmdStanArgs( + self._name, + self._exe_file, + chain_ids=chain_ids, + data=_data, + seed=seed, + output_dir=gq_output_dir, + sig_figs=sig_figs, + method_args=generate_quantities_args, + refresh=refresh, + ) + runset = RunSet( + args=args, chains=chains, chain_ids=chain_ids, time_fmt=time_fmt + ) + + parallel_chains_avail = cpu_count() + parallel_chains = max(min(parallel_chains_avail - 2, chains), 1) + with ThreadPoolExecutor(max_workers=parallel_chains) as executor: + for i in range(chains): + executor.submit( + self._run_cmdstan, + runset, + i, + show_console=show_console, + timeout=timeout, + ) + + runset.raise_for_timeouts() + errors = runset.get_err_msgs() + if errors: + msg = ( + f'Error during generate_quantities:\n{errors}\n' + f'Command and output files:\n{repr(runset)}' + ) + if not show_console: + msg += ( + '\nConsider re-running with show_console=True if the' + ' above output is unclear!' + ) + raise RuntimeError(msg) + quantities = CmdStanGQ(runset=runset, previous_fit=fit_object) + return quantities + + def variational( + self, + data: Union[Mapping[str, Any], str, os.PathLike, None] = None, + seed: Optional[int] = None, + inits: Optional[float] = None, + output_dir: OptionalPath = None, + sig_figs: Optional[int] = None, + save_latent_dynamics: bool = False, + save_profile: bool = False, + algorithm: Optional[str] = None, + iter: Optional[int] = None, + grad_samples: Optional[int] = None, + elbo_samples: Optional[int] = None, + eta: Optional[float] = None, + adapt_engaged: bool = True, + adapt_iter: Optional[int] = None, + tol_rel_obj: Optional[float] = None, + eval_elbo: Optional[int] = None, + draws: Optional[int] = None, + require_converged: bool = True, + show_console: bool = False, + refresh: Optional[int] = None, + time_fmt: str = "%Y%m%d%H%M%S", + timeout: Optional[float] = None, + *, + output_samples: Optional[int] = None, + ) -> CmdStanVB: + """ + Run CmdStan's variational inference algorithm to approximate + the posterior distribution of the model conditioned on the data. + + This function validates the specified configuration, composes a call to + the CmdStan ``variational`` method and spawns one subprocess to run the + optimizer and waits for it to run to completion. + Unspecified arguments are not included in the call to CmdStan, i.e., + those arguments will have CmdStan default values. + + The :class:`CmdStanVB` object records the command, the return code, + and the paths to the variational method output CSV and console files. + The output files are written either to a specified output directory + or to a temporary directory which is deleted upon session exit. + + Output files are either written to a temporary directory or to the + specified output directory. Output filenames correspond to the template + '--' plus the file suffix which is + either '.csv' for the CmdStan output or '.txt' for + the console messages, e.g. 'bernoulli-201912081451-1.csv'. + Output files written to the temporary directory contain an additional + 8-character random string, e.g. 'bernoulli-201912081451-1-5nm6as7u.csv'. + + :param data: Values for all data variables in the model, specified + either as a dictionary with entries matching the data variables, + or as the path of a data file in JSON or Rdump format. + + :param seed: The seed for random number generator. Must be an integer + between 0 and 2^32 - 1. If unspecified, + :func:`numpy.random.default_rng` + is used to generate a seed which will be used for all chains. + + :param inits: Specifies how the sampler initializes parameter values. + Initialization is uniform random on a range centered on 0 with + default range of 2. Specifying a single number n > 0 changes + the initialization range to [-n, n]. + + :param output_dir: Name of the directory to which CmdStan output + files are written. If unspecified, output files will be written + to a temporary directory which is deleted upon session exit. + + :param sig_figs: Numerical precision used for output CSV and text files. + Must be an integer between 1 and 18. If unspecified, the default + precision for the system file I/O is used; the usual value is 6. + Introduced in CmdStan-2.25. + + :param save_latent_dynamics: Whether or not to save diagnostics. + If ``True``, CSV outputs are written to output file + '--diagnostic-', + e.g. 'bernoulli-201912081451-diagnostic-1.csv'. + + :param save_profile: Whether or not to profile auto-diff operations in + labelled blocks of code. If ``True``, CSV outputs are written to + file '--profile-'. + Introduced in CmdStan-2.26. + + :param algorithm: Algorithm to use. One of: 'meanfield', 'fullrank'. + + :param iter: Maximum number of ADVI iterations. + + :param grad_samples: Number of MC draws for computing the gradient. + Default is 10. If problems arise, try doubling current value. + + :param elbo_samples: Number of MC draws for estimate of ELBO. + + :param eta: Step size scaling parameter. + + :param adapt_engaged: Whether eta adaptation is engaged. + + :param adapt_iter: Number of iterations for eta adaptation. + + :param tol_rel_obj: Relative tolerance parameter for convergence. + + :param eval_elbo: Number of iterations between ELBO evaluations. + + :param draws: Number of approximate posterior output draws + to save. + + :param require_converged: Whether or not to raise an error if Stan + reports that "The algorithm may not have converged". + + :param show_console: If ``True``, stream CmdStan messages sent to + stdout and stderr to the console. Default is ``False``. + + :param refresh: Specify the number of iterations CmdStan will take + between progress messages. Default value is 100. + + :param time_fmt: A format string passed to + :meth:`~datetime.datetime.strftime` to decide the file names for + output CSVs. Defaults to "%Y%m%d%H%M%S" + + :param timeout: Duration at which variational Bayesian inference times + out in seconds. + + :return: CmdStanVB object + """ + # TODO(2.0): remove + if output_samples is not None: + if draws is not None: + raise ValueError( + "Cannot supply both 'draws' and deprecated argument " + "'output_samples'" + ) + get_logger().warning( + "Argument name `output_samples` is deprecated, please " + "rename to `draws`." + ) + + draws = output_samples + + variational_args = VariationalArgs( + algorithm=algorithm, + iter=iter, + grad_samples=grad_samples, + elbo_samples=elbo_samples, + eta=eta, + adapt_engaged=adapt_engaged, + adapt_iter=adapt_iter, + tol_rel_obj=tol_rel_obj, + eval_elbo=eval_elbo, + output_samples=draws, + ) + + with temp_single_json(data) as _data, temp_inits( + inits, allow_multiple=False + ) as _inits: + args = CmdStanArgs( + self._name, + self._exe_file, + chain_ids=None, + data=_data, + seed=seed, + inits=_inits, + output_dir=output_dir, + sig_figs=sig_figs, + save_latent_dynamics=save_latent_dynamics, + save_profile=save_profile, + method_args=variational_args, + refresh=refresh, + ) + + dummy_chain_id = 0 + runset = RunSet(args=args, chains=1, time_fmt=time_fmt) + self._run_cmdstan( + runset, + dummy_chain_id, + show_console=show_console, + timeout=timeout, + ) + runset.raise_for_timeouts() + + # treat failure to converge as failure + transcript_file = runset.stdout_files[dummy_chain_id] + pat = re.compile(r'The algorithm may not have converged.', re.M) + with open(transcript_file, 'r') as transcript: + contents = transcript.read() + if len(re.findall(pat, contents)) > 0: + if require_converged: + raise RuntimeError( + 'The algorithm may not have converged.\n' + 'If you would like to inspect the output, ' + 're-call with require_converged=False' + ) + # else: + get_logger().warning( + '%s\n%s', + 'The algorithm may not have converged.', + 'Proceeding because require_converged is set to False', + ) + if not runset._check_retcodes(): + transcript_file = runset.stdout_files[dummy_chain_id] + with open(transcript_file, 'r') as transcript: + contents = transcript.read() + pat = re.compile( + r'stan::variational::normal_meanfield::calc_grad:', re.M + ) + if len(re.findall(pat, contents)) > 0: + if grad_samples is None: + grad_samples = 10 + msg = ( + 'Variational algorithm gradient calculation failed. ' + 'Double the value of argument "grad_samples", ' + 'current value is {}.'.format(grad_samples) + ) + else: + msg = 'Error during variational inference: {}'.format( + runset.get_err_msgs() + ) + raise RuntimeError(msg) + # pylint: disable=invalid-name + vb = CmdStanVB(runset) + return vb + + def pathfinder( + self, + data: Union[Mapping[str, Any], str, os.PathLike, None] = None, + *, + init_alpha: Optional[float] = None, + tol_obj: Optional[float] = None, + tol_rel_obj: Optional[float] = None, + tol_grad: Optional[float] = None, + tol_rel_grad: Optional[float] = None, + tol_param: Optional[float] = None, + history_size: Optional[int] = None, + num_paths: Optional[int] = None, + max_lbfgs_iters: Optional[int] = None, + draws: Optional[int] = None, + num_single_draws: Optional[int] = None, + num_elbo_draws: Optional[int] = None, + psis_resample: bool = True, + calculate_lp: bool = True, + # arguments standard to all methods + seed: Optional[int] = None, + inits: Union[Dict[str, float], float, str, os.PathLike, None] = None, + output_dir: OptionalPath = None, + sig_figs: Optional[int] = None, + save_profile: bool = False, + show_console: bool = False, + refresh: Optional[int] = None, + time_fmt: str = "%Y%m%d%H%M%S", + timeout: Optional[float] = None, + num_threads: Optional[int] = None, + ) -> CmdStanPathfinder: + """ + Run CmdStan's Pathfinder variational inference algorithm. + + :param data: Values for all data variables in the model, specified + either as a dictionary with entries matching the data variables, + or as the path of a data file in JSON or Rdump format. + + :param num_paths: Number of single-path Pathfinders to run. + Default is 4, when the number of paths is 1 then no importance + sampling is done. + + :param draws: Number of approximate draws to return. + + :param num_single_draws: Number of draws each single-pathfinder will + draw. + If ``num_paths`` is 1, only one of this and ``draws`` should be + used. + + :param max_lbfgs_iters: Maximum number of L-BFGS iterations. + + :param num_elbo_draws: Number of Monte Carlo draws to evaluate ELBO. + + :param psis_resample: Whether or not to use Pareto Smoothed Importance + Sampling on the result of the individual Pathfinders. If False, the + result contains the draws from each path. + + :param calculate_lp: Whether or not to calculate the log probability + for approximate draws. If False, this also implies that + ``psis_resample`` will be set to False. + + :param seed: The seed for random number generator. Must be an integer + between 0 and 2^32 - 1. If unspecified, + :func:`numpy.random.default_rng` is used to generate a seed. + + :param inits: Specifies how the algorithm initializes parameter values. + Initialization is either uniform random on a range centered on 0, + exactly 0, or a dictionary or file of initial values for some or all + parameters in the model. The default initialization behavior will + initialize all parameter values on range [-2, 2] on the + *unconstrained* support. If the expected parameter values are + too far from this range, this option may improve adaptation. + The following value types are allowed: + + * Single number n > 0 - initialization range is [-n, n]. + * 0 - all parameters are initialized to 0. + * dictionary - pairs parameter name : initial value. + * string - pathname to a JSON or Rdump data file. + * list of strings - per-path pathname to data file. + * list of dictionaries - per-path initial values. + + :param init_alpha: For internal L-BFGS: Line search step size for + first iteration + + :param tol_obj: For internal L-BFGS: Convergence tolerance on changes + in objective function value + + :param tol_rel_obj: For internal L-BFGS: Convergence tolerance on + relative changes in objective function value + + :param tol_grad: For internal L-BFGS: Convergence tolerance on the + norm of the gradient + + :param tol_rel_grad: For internal L-BFGS: Convergence tolerance on + the relative norm of the gradient + + :param tol_param: For internal L-BFGS: Convergence tolerance on changes + in parameter value + + :param history_size: For internal L-BFGS: Size of the history for LBFGS + Hessian approximation. The value should be less than the + dimensionality of the parameter space. 5-10 is usually sufficient + + :param output_dir: Name of the directory to which CmdStan output + files are written. If unspecified, output files will be written + to a temporary directory which is deleted upon session exit. + + :param sig_figs: Numerical precision used for output CSV and text files. + Must be an integer between 1 and 18. If unspecified, the default + precision for the system file I/O is used; the usual value is 6. + Introduced in CmdStan-2.25. + + :param save_profile: Whether or not to profile auto-diff operations in + labelled blocks of code. If ``True``, CSV outputs are written to + file '--profile-'. + Introduced in CmdStan-2.26, see + https://mc-stan.org/docs/cmdstan-guide/stan_csv.html, + section "Profiling CSV output file" for details. + + :param show_console: If ``True``, stream CmdStan messages sent to stdout + and stderr to the console. Default is ``False``. + + :param refresh: Specify the number of iterations CmdStan will take + between progress messages. Default value is 100. + + :param time_fmt: A format string passed to + :meth:`~datetime.datetime.strftime` to decide the file names for + output CSVs. Defaults to "%Y%m%d%H%M%S" + + :param timeout: Duration at which Pathfinder times + out in seconds. Defaults to None. + + :param num_threads: Number of threads to request for parallel execution. + A number other than ``1`` requires the model to have been compiled + with STAN_THREADS=True. + + :return: A :class:`CmdStanPathfinder` object + + References + ---------- + + Zhang, L., Carpenter, B., Gelman, A., & Vehtari, A. (2022). Pathfinder: + Parallel quasi-Newton variational inference. Journal of Machine Learning + Research, 23(306), 1–49. Retrieved from + http://jmlr.org/papers/v23/21-0889.html + """ + + exe_info = self.exe_info() + if cmdstan_version_before(2, 33, exe_info): + raise ValueError( + "Method 'pathfinder' not available for CmdStan versions " + "before 2.33" + ) + + if (not psis_resample or not calculate_lp) and cmdstan_version_before( + 2, 34, exe_info + ): + raise ValueError( + "Arguments 'psis_resample' and 'calculate_lp' are only " + "available for CmdStan versions 2.34 and later" + ) + + if num_threads is not None: + if ( + num_threads != 1 + and exe_info.get('STAN_THREADS', '').lower() != 'true' + ): + raise ValueError( + "Model must be compiled with 'STAN_THREADS=true' to use" + " 'num_threads' argument" + ) + os.environ['STAN_NUM_THREADS'] = str(num_threads) + + if num_paths == 1: + if num_single_draws is None: + num_single_draws = draws + if draws is not None and num_single_draws != draws: + raise ValueError( + "Cannot specify both 'draws' and 'num_single_draws'" + " when 'num_paths' is 1" + ) + + pathfinder_args = PathfinderArgs( + init_alpha=init_alpha, + tol_obj=tol_obj, + tol_rel_obj=tol_rel_obj, + tol_grad=tol_grad, + tol_rel_grad=tol_rel_grad, + tol_param=tol_param, + history_size=history_size, + num_psis_draws=draws, + num_paths=num_paths, + max_lbfgs_iters=max_lbfgs_iters, + num_draws=num_single_draws, + num_elbo_draws=num_elbo_draws, + psis_resample=psis_resample, + calculate_lp=calculate_lp, + ) + + with temp_single_json(data) as _data, temp_inits(inits) as _inits: + args = CmdStanArgs( + self._name, + self._exe_file, + chain_ids=None, + data=_data, + seed=seed, + inits=_inits, + output_dir=output_dir, + sig_figs=sig_figs, + save_profile=save_profile, + method_args=pathfinder_args, + refresh=refresh, + ) + dummy_chain_id = 0 + runset = RunSet(args=args, chains=1, time_fmt=time_fmt) + self._run_cmdstan( + runset, + dummy_chain_id, + show_console=show_console, + timeout=timeout, + ) + runset.raise_for_timeouts() + + if not runset._check_retcodes(): + msg = "Error during Pathfinder! Command '{}' failed: {}".format( + ' '.join(runset.cmd(0)), runset.get_err_msgs() + ) + raise RuntimeError(msg) + return CmdStanPathfinder(runset) + + def log_prob( + self, + params: Union[Dict[str, Any], str, os.PathLike], + data: Union[Mapping[str, Any], str, os.PathLike, None] = None, + *, + jacobian: bool = True, + sig_figs: Optional[int] = None, + ) -> pd.DataFrame: + """ + Calculate the log probability and gradient at the given parameter + values. + + .. note:: This function is **NOT** an efficient way to evaluate the log + density of the model. It should be used for diagnostics ONLY. + Please, do not use this for other purposes such as testing new + sampling algorithms! + + :param params: Values for all parameters in the model, specified + either as a dictionary with entries matching the parameter + variables, or as the path of a data file in JSON or Rdump format. + + These should be given on the constrained (natural) scale. + + :param data: Values for all data variables in the model, specified + either as a dictionary with entries matching the data variables, + or as the path of a data file in JSON or Rdump format. + + :param jacobian: Whether or not to enable the Jacobian adjustment + for constrained parameters. Defaults to ``True``. + + :param sig_figs: Numerical precision used for output CSV and text files. + Must be an integer between 1 and 18. If unspecified, the default + precision for the system file I/O is used; the usual value is 6. + + :return: A pandas.DataFrame containing columns "lp__" and additional + columns for the gradient values. These gradients will be for the + unconstrained parameters of the model. + """ + + if cmdstan_version_before(2, 31, self.exe_info()): + raise ValueError( + "Method 'log_prob' not available for CmdStan versions " + "before 2.31" + ) + with temp_single_json(data) as _data, temp_single_json( + params + ) as _params: + cmd = [ + str(self.exe_file), + "log_prob", + f"constrained_params={_params}", + f"jacobian={int(jacobian)}", + ] + if _data is not None: + cmd += ["data", f"file={_data}"] + + output_dir = tempfile.mkdtemp(prefix=self.name, dir=_TMPDIR) + + output = os.path.join(output_dir, "output.csv") + cmd += ["output", f"file={output}"] + if sig_figs is not None: + cmd.append(f"sig_figs={sig_figs}") + + get_logger().debug("Cmd: %s", str(cmd)) + + proc = subprocess.run( + cmd, capture_output=True, check=False, text=True + ) + if proc.returncode: + get_logger().error( + "'log_prob' command failed!\nstdout:%s\nstderr:%s", + proc.stdout, + proc.stderr, + ) + raise RuntimeError( + "Method 'log_prob' failed with return code " + + str(proc.returncode) + ) + + result = pd.read_csv(output, comment="#") + return result + + def laplace_sample( + self, + data: Union[Mapping[str, Any], str, os.PathLike, None] = None, + mode: Union[CmdStanMLE, str, os.PathLike, None] = None, + draws: Optional[int] = None, + *, + jacobian: bool = True, # NB: Different than optimize! + seed: Optional[int] = None, + output_dir: OptionalPath = None, + sig_figs: Optional[int] = None, + save_profile: bool = False, + show_console: bool = False, + refresh: Optional[int] = None, + time_fmt: str = "%Y%m%d%H%M%S", + timeout: Optional[float] = None, + opt_args: Optional[Dict[str, Any]] = None, + ) -> CmdStanLaplace: + """ + Run a Laplace approximation around the posterior mode. + + :param data: Values for all data variables in the model, specified + either as a dictionary with entries matching the data variables, + or as the path of a data file in JSON or Rdump format. + + :param mode: The mode around which to place the approximation, either + + * A :class:`CmdStanMLE` object + * A path to a CSV file containing the output of an optimization run. + * ``None`` - use default optimizer settings and/or any ``opt_args``. + + :param draws: Number of approximate draws to return. + Defaults to 1000 + + :param jacobian: Whether or not to enable the Jacobian adjustment + for constrained parameters. Defaults to ``True``. + Note: This must match the argument used in the creation of + ``mode``, if supplied. + + :param output_dir: Name of the directory to which CmdStan output + files are written. If unspecified, output files will be written + to a temporary directory which is deleted upon session exit. + + :param sig_figs: Numerical precision used for output CSV and text files. + Must be an integer between 1 and 18. If unspecified, the default + precision for the system file I/O is used; the usual value is 6. + Introduced in CmdStan-2.25. + + :param save_profile: Whether or not to profile auto-diff operations in + labelled blocks of code. If ``True``, CSV outputs are written to + file '--profile-'. + Introduced in CmdStan-2.26, see + https://mc-stan.org/docs/cmdstan-guide/stan_csv.html, + section "Profiling CSV output file" for details. + + :param show_console: If ``True``, stream CmdStan messages sent to stdout + and stderr to the console. Default is ``False``. + + :param refresh: Specify the number of iterations CmdStan will take + between progress messages. Default value is 100. + + :param time_fmt: A format string passed to + :meth:`~datetime.datetime.strftime` to decide the file names for + output CSVs. Defaults to "%Y%m%d%H%M%S" + + :param timeout: Duration at which Pathfinder times + out in seconds. Defaults to None. + + :param opt_args: Dictionary of additional arguments + which will be passed to :meth:`~CmdStanModel.optimize` + + :return: A :class:`CmdStanLaplace` object. + """ + if cmdstan_version_before(2, 32, self.exe_info()): + raise ValueError( + "Method 'laplace_sample' not available for CmdStan versions " + "before 2.32" + ) + if opt_args is not None and mode is not None: + raise ValueError( + "Cannot specify both 'opt_args' and 'mode' arguments" + ) + if mode is None: + optimize_args = { + "seed": seed, + "sig_figs": sig_figs, + "jacobian": jacobian, + "save_profile": save_profile, + "show_console": show_console, + "refresh": refresh, + "time_fmt": time_fmt, + "timeout": timeout, + "output_dir": output_dir, + } + optimize_args.update(opt_args or {}) + optimize_args['time_fmt'] = 'opt-' + time_fmt + try: + cmdstan_mode: CmdStanMLE = self.optimize( + data=data, + **optimize_args, # type: ignore + ) + except Exception as e: + raise RuntimeError( + "Failed to run optimizer on model. " + "Consider supplying a mode or additional optimizer args" + ) from e + elif not isinstance(mode, CmdStanMLE): + cmdstan_mode = from_csv(mode) # type: ignore # we check below + else: + cmdstan_mode = mode + + if cmdstan_mode.runset.method != Method.OPTIMIZE: + raise ValueError( + "Mode must be a CmdStanMLE or a path to an optimize CSV" + ) + + mode_jacobian = ( + cmdstan_mode.runset._args.method_args.jacobian # type: ignore + ) + if mode_jacobian != jacobian: + raise ValueError( + "Jacobian argument to optimize and laplace must match!\n" + f"Laplace was run with jacobian={jacobian},\n" + f"but optimize was run with jacobian={mode_jacobian}" + ) + + laplace_args = LaplaceArgs( + cmdstan_mode.runset.csv_files[0], draws, jacobian + ) + + with temp_single_json(data) as _data: + args = CmdStanArgs( + self._name, + self._exe_file, + chain_ids=None, + data=_data, + seed=seed, + output_dir=output_dir, + sig_figs=sig_figs, + save_profile=save_profile, + method_args=laplace_args, + refresh=refresh, + ) + dummy_chain_id = 0 + runset = RunSet(args=args, chains=1, time_fmt=time_fmt) + self._run_cmdstan( + runset, + dummy_chain_id, + show_console=show_console, + timeout=timeout, + ) + runset.raise_for_timeouts() + return CmdStanLaplace(runset, cmdstan_mode) + + def _run_cmdstan( + self, + runset: RunSet, + idx: int, + show_progress: bool = False, + show_console: bool = False, + progress_hook: Optional[Callable[[str, int], None]] = None, + timeout: Optional[float] = None, + ) -> None: + """ + Helper function which encapsulates call to CmdStan. + Uses subprocess POpen object to run the process. + Records stdout, stderr messages, and process returncode. + Args 'show_progress' and 'show_console' allow use of progress bar, + streaming output to console, respectively. + """ + get_logger().debug('idx %d', idx) + get_logger().debug( + 'running CmdStan, num_threads: %s', + str(os.environ.get('STAN_NUM_THREADS')), + ) + + logger_prefix = 'CmdStan' + console_prefix = '' + if runset.one_process_per_chain: + logger_prefix = 'Chain [{}]'.format(runset.chain_ids[idx]) + console_prefix = 'Chain [{}] '.format(runset.chain_ids[idx]) + + cmd = runset.cmd(idx) + get_logger().debug('CmdStan args: %s', cmd) + + if not show_progress: + get_logger().info('%s start processing', logger_prefix) + try: + fd_out = open(runset.stdout_files[idx], 'w') + proc = subprocess.Popen( + cmd, + bufsize=1, + stdin=subprocess.DEVNULL, + stdout=subprocess.PIPE, + stderr=subprocess.STDOUT, # avoid buffer overflow + env=os.environ, + universal_newlines=True, + ) + timer: Optional[threading.Timer] + if timeout: + + def _timer_target() -> None: + # Abort if the process has already terminated. + if proc.poll() is not None: + return + proc.terminate() + runset._set_timeout_flag(idx, True) + + timer = threading.Timer(timeout, _timer_target) + timer.daemon = True + timer.start() + else: + timer = None + while proc.poll() is None: + if proc.stdout is not None: + line = proc.stdout.readline() + fd_out.write(line) + line = line.strip() + if show_console: + print(f'{console_prefix}{line}') + elif progress_hook is not None: + progress_hook(line, idx) + + stdout, _ = proc.communicate() + retcode = proc.returncode + runset._set_retcode(idx, retcode) + if timer: + timer.cancel() + + if stdout: + fd_out.write(stdout) + if show_console: + lines = stdout.split('\n') + for line in lines: + print(f'{console_prefix}{line}') + fd_out.close() + except OSError as e: + msg = 'Failed with error {}\n'.format(str(e)) + raise RuntimeError(msg) from e + finally: + fd_out.close() + + if not show_progress: + get_logger().info('%s done processing', logger_prefix) + + if retcode != 0: + retcode_summary = returncode_msg(retcode) + serror = '' + try: + serror = os.strerror(retcode) + except (ArithmeticError, ValueError): + pass + get_logger().error( + '%s error: %s %s', logger_prefix, retcode_summary, serror + ) + + @staticmethod + @progbar.wrap_callback + def _wrap_sampler_progress_hook( + chain_ids: List[int], + total: int, + ) -> Optional[Callable[[str, int], None]]: + """ + Sets up tqdm callback for CmdStan sampler console msgs. + CmdStan progress messages start with "Iteration", for single chain + process, "Chain [id] Iteration" for multi-chain processing. + For the latter, manage array of pbars, update accordingly. + """ + pat = re.compile(r'Chain \[(\d*)\] (Iteration.*)') + pbars: Dict[int, tqdm] = { + chain_id: tqdm( + total=total, + bar_format="{desc} |{bar}| {elapsed} {postfix[0][value]}", + postfix=[{"value": "Status"}], + desc=f'chain {chain_id}', + colour='yellow', + ) + for chain_id in chain_ids + } + + def progress_hook(line: str, idx: int) -> None: + if line == "Done": + for pbar in pbars.values(): + pbar.postfix[0]["value"] = 'Sampling completed' + pbar.update(total - pbar.n) + pbar.close() + else: + match = pat.match(line) + if match: + idx = int(match.group(1)) + mline = match.group(2).strip() + elif line.startswith("Iteration"): + mline = line + idx = chain_ids[idx] + else: + return + if 'Sampling' in mline: + pbars[idx].colour = 'blue' + pbars[idx].update(1) + pbars[idx].postfix[0]["value"] = mline + + return progress_hook diff --git a/.venv/lib/python3.12/site-packages/cmdstanpy/progress.py b/.venv/lib/python3.12/site-packages/cmdstanpy/progress.py new file mode 100644 index 00000000..0f26a88f --- /dev/null +++ b/.venv/lib/python3.12/site-packages/cmdstanpy/progress.py @@ -0,0 +1,49 @@ +""" +Record tqdm progress bar fail during session +""" +import functools +import logging + +_SHOW_PROGRESS: bool = True + + +def allow_show_progress() -> bool: + """Return False if any progressbar errors have occurred this session""" + return _SHOW_PROGRESS + + +def _disable_progress(e: Exception) -> None: + """Print an exception and disable progress bars for this session""" + # pylint: disable=global-statement + global _SHOW_PROGRESS + if _SHOW_PROGRESS: + _SHOW_PROGRESS = False + logging.getLogger('cmdstanpy').error( + 'Error in progress bar initialization:\n' + '\t%s\n' + 'Disabling progress bars for this session', + str(e), + ) + + +def wrap_callback(func): # type: ignore + """Wrap a callback generator so it fails safely""" + + @functools.wraps(func) + def safe_progress(*args, **kwargs): # type: ignore + # pylint: disable=unused-argument + def callback(*args, **kwargs): # type: ignore + # totally empty callback + return None + + if not allow_show_progress(): + return callback + + try: + return func(*args, **kwargs) + # pylint: disable=broad-except + except Exception as e: + _disable_progress(e) + return callback + + return safe_progress diff --git a/.venv/lib/python3.12/site-packages/cmdstanpy/py.typed b/.venv/lib/python3.12/site-packages/cmdstanpy/py.typed new file mode 100644 index 00000000..e69de29b diff --git a/.venv/lib/python3.12/site-packages/cmdstanpy/stanfit/__init__.py b/.venv/lib/python3.12/site-packages/cmdstanpy/stanfit/__init__.py new file mode 100644 index 00000000..50764a30 --- /dev/null +++ b/.venv/lib/python3.12/site-packages/cmdstanpy/stanfit/__init__.py @@ -0,0 +1,269 @@ +"""Container objects for results of CmdStan run(s).""" + +import glob +import os +from typing import Any, Dict, List, Optional, Union + +from cmdstanpy.cmdstan_args import ( + CmdStanArgs, + LaplaceArgs, + OptimizeArgs, + PathfinderArgs, + SamplerArgs, + VariationalArgs, +) +from cmdstanpy.utils import check_sampler_csv, get_logger, scan_config + +from .gq import CmdStanGQ +from .laplace import CmdStanLaplace +from .mcmc import CmdStanMCMC +from .metadata import InferenceMetadata +from .mle import CmdStanMLE +from .pathfinder import CmdStanPathfinder +from .runset import RunSet +from .vb import CmdStanVB + +__all__ = [ + "RunSet", + "InferenceMetadata", + "CmdStanMCMC", + "CmdStanMLE", + "CmdStanVB", + "CmdStanGQ", + "CmdStanLaplace", + "CmdStanPathfinder", +] + + +def from_csv( + path: Union[str, List[str], os.PathLike, None] = None, + method: Optional[str] = None, +) -> Union[ + CmdStanMCMC, CmdStanMLE, CmdStanVB, CmdStanPathfinder, CmdStanLaplace, None +]: + """ + Instantiate a CmdStan object from a the Stan CSV files from a CmdStan run. + CSV files are specified from either a list of Stan CSV files or a single + filepath which can be either a directory name, a Stan CSV filename, or + a pathname pattern (i.e., a Python glob). The optional argument 'method' + checks that the CSV files were produced by that method. + Stan CSV files from CmdStan methods 'sample', 'optimize', and 'variational' + result in objects of class CmdStanMCMC, CmdStanMLE, and CmdStanVB, + respectively. + + :param path: directory path + :param method: method name (optional) + + :return: either a CmdStanMCMC, CmdStanMLE, or CmdStanVB object + """ + if path is None: + raise ValueError('Must specify path to Stan CSV files.') + if method is not None and method not in [ + 'sample', + 'optimize', + 'variational', + 'laplace', + 'pathfinder', + ]: + raise ValueError( + 'Bad method argument {}, must be one of: ' + '"sample", "optimize", "variational"'.format(method) + ) + + csvfiles = [] + if isinstance(path, list): + csvfiles = path + elif isinstance(path, str) and '*' in path: + splits = os.path.split(path) + if splits[0] is not None: + if not (os.path.exists(splits[0]) and os.path.isdir(splits[0])): + raise ValueError( + 'Invalid path specification, {} ' + ' unknown directory: {}'.format(path, splits[0]) + ) + csvfiles = glob.glob(path) + elif isinstance(path, (str, os.PathLike)): + if os.path.exists(path) and os.path.isdir(path): + for file in os.listdir(path): + if os.path.splitext(file)[1] == ".csv": + csvfiles.append(os.path.join(path, file)) + elif os.path.exists(path): + csvfiles.append(str(path)) + else: + raise ValueError('Invalid path specification: {}'.format(path)) + else: + raise ValueError('Invalid path specification: {}'.format(path)) + + if len(csvfiles) == 0: + raise ValueError('No CSV files found in directory {}'.format(path)) + for file in csvfiles: + if not (os.path.exists(file) and os.path.splitext(file)[1] == ".csv"): + raise ValueError( + 'Bad CSV file path spec,' + ' includes non-csv file: {}'.format(file) + ) + + config_dict: Dict[str, Any] = {} + try: + with open(csvfiles[0], 'r') as fd: + scan_config(fd, config_dict, 0) + except (IOError, OSError, PermissionError) as e: + raise ValueError('Cannot read CSV file: {}'.format(csvfiles[0])) from e + if 'model' not in config_dict or 'method' not in config_dict: + raise ValueError("File {} is not a Stan CSV file.".format(csvfiles[0])) + if method is not None and method != config_dict['method']: + raise ValueError( + 'Expecting Stan CSV output files from method {}, ' + ' found outputs from method {}'.format( + method, config_dict['method'] + ) + ) + try: + if config_dict['method'] == 'sample': + chains = len(csvfiles) + sampler_args = SamplerArgs( + iter_sampling=config_dict['num_samples'], + iter_warmup=config_dict['num_warmup'], + thin=config_dict['thin'], + save_warmup=config_dict['save_warmup'], + ) + # bugfix 425, check for fixed_params output + try: + check_sampler_csv( + csvfiles[0], + iter_sampling=config_dict['num_samples'], + iter_warmup=config_dict['num_warmup'], + thin=config_dict['thin'], + save_warmup=config_dict['save_warmup'], + ) + except ValueError: + try: + check_sampler_csv( + csvfiles[0], + is_fixed_param=True, + iter_sampling=config_dict['num_samples'], + iter_warmup=config_dict['num_warmup'], + thin=config_dict['thin'], + save_warmup=config_dict['save_warmup'], + ) + sampler_args = SamplerArgs( + iter_sampling=config_dict['num_samples'], + iter_warmup=config_dict['num_warmup'], + thin=config_dict['thin'], + save_warmup=config_dict['save_warmup'], + fixed_param=True, + ) + except ValueError as e: + raise ValueError( + 'Invalid or corrupt Stan CSV output file, ' + ) from e + + cmdstan_args = CmdStanArgs( + model_name=config_dict['model'], + model_exe=config_dict['model'], + chain_ids=[x + 1 for x in range(chains)], + method_args=sampler_args, + ) + runset = RunSet(args=cmdstan_args, chains=chains) + runset._csv_files = csvfiles + for i in range(len(runset._retcodes)): + runset._set_retcode(i, 0) + fit = CmdStanMCMC(runset) + fit.draws() + return fit + elif config_dict['method'] == 'optimize': + if 'algorithm' not in config_dict: + raise ValueError( + "Cannot find optimization algorithm" + " in file {}.".format(csvfiles[0]) + ) + optimize_args = OptimizeArgs( + algorithm=config_dict['algorithm'], + save_iterations=config_dict['save_iterations'], + jacobian=config_dict.get('jacobian', 0), + ) + cmdstan_args = CmdStanArgs( + model_name=config_dict['model'], + model_exe=config_dict['model'], + chain_ids=None, + method_args=optimize_args, + ) + runset = RunSet(args=cmdstan_args) + runset._csv_files = csvfiles + for i in range(len(runset._retcodes)): + runset._set_retcode(i, 0) + return CmdStanMLE(runset) + elif config_dict['method'] == 'variational': + if 'algorithm' not in config_dict: + raise ValueError( + "Cannot find variational algorithm" + " in file {}.".format(csvfiles[0]) + ) + variational_args = VariationalArgs( + algorithm=config_dict['algorithm'], + iter=config_dict['iter'], + grad_samples=config_dict['grad_samples'], + elbo_samples=config_dict['elbo_samples'], + eta=config_dict['eta'], + tol_rel_obj=config_dict['tol_rel_obj'], + eval_elbo=config_dict['eval_elbo'], + output_samples=config_dict['output_samples'], + ) + cmdstan_args = CmdStanArgs( + model_name=config_dict['model'], + model_exe=config_dict['model'], + chain_ids=None, + method_args=variational_args, + ) + runset = RunSet(args=cmdstan_args) + runset._csv_files = csvfiles + for i in range(len(runset._retcodes)): + runset._set_retcode(i, 0) + return CmdStanVB(runset) + elif config_dict['method'] == 'laplace': + laplace_args = LaplaceArgs( + mode=config_dict['mode'], + draws=config_dict['draws'], + jacobian=config_dict['jacobian'], + ) + cmdstan_args = CmdStanArgs( + model_name=config_dict['model'], + model_exe=config_dict['model'], + chain_ids=None, + method_args=laplace_args, + ) + runset = RunSet(args=cmdstan_args) + runset._csv_files = csvfiles + for i in range(len(runset._retcodes)): + runset._set_retcode(i, 0) + mode: CmdStanMLE = from_csv( + config_dict['mode'], + method='optimize', + ) # type: ignore + return CmdStanLaplace(runset, mode=mode) + elif config_dict['method'] == 'pathfinder': + pathfinder_args = PathfinderArgs( + num_draws=config_dict['num_draws'], + num_paths=config_dict['num_paths'], + ) + cmdstan_args = CmdStanArgs( + model_name=config_dict['model'], + model_exe=config_dict['model'], + chain_ids=None, + method_args=pathfinder_args, + ) + runset = RunSet(args=cmdstan_args) + runset._csv_files = csvfiles + for i in range(len(runset._retcodes)): + runset._set_retcode(i, 0) + return CmdStanPathfinder(runset) + else: + get_logger().info( + 'Unable to process CSV output files from method %s.', + (config_dict['method']), + ) + return None + except (IOError, OSError, PermissionError) as e: + raise ValueError( + 'An error occurred processing the CSV files:\n\t{}'.format(str(e)) + ) from e diff --git a/.venv/lib/python3.12/site-packages/cmdstanpy/stanfit/__pycache__/__init__.cpython-312.pyc b/.venv/lib/python3.12/site-packages/cmdstanpy/stanfit/__pycache__/__init__.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..f078402700825cde7df793f62613135d7c15bb53 GIT binary patch literal 10041 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 X|Ksh;x{5($tLB@(hsT8?4M;0WCy2gJ-k z-2;+<2DYL&RiHyhV3IOHTZtgYTLvS=Mp9cFI@wJW@7CJ2`(vjC+A|u{WhT+qZff@j zC{X2C`(yVzx2L-Yg8@l7uG&&duHjOl~d-r5>v}L4)-Iq}BqX<#XI+Q^-Gi(lr>5CBl)IDDmTQiBDV*c}bL~ zClh>poR_9!u}JJZg}Tm*h!akT{L9nfSR#^$h%(=P;`tCC6%!ZYg6khC$B-#oG8mtZ zB}6IY&RUMdX0q0y$XFs;vEpQGT$IGvn25Z>L>PfCEzYT9c(Q+bI(9}( z;Le!~f8l7>ay*h4Q@@CMcIO_}>+zv(a3VKiLPs?VrV)!^7OjFsv)Sa(BYqYd5Pi9rWqI!^*}E#_U9MB|R)1jTxxj-@4vB^u2l6r09fLj6~4ddoEDQxO_ii5`+(*oO3t`RVmCJR)bLbO=1k z-7GYruFVf=CA-jqFWHidL*KY~pHRQMRcJ-*R-s#H!?lgIo>i<8ebfus_qGb#@n(DO zO>tUQVF%*uK>c&yBNw~)7qAQMh}|yq2q7_~em~Z$twINC*ui>Cz1S&siQVcqMepg% z>peX)w$M&}9G!T6_De1v$3~77pH56oCuDwHibwg}kmEIGHJZn)z|4Bo^pXfZCh#xK z@B_rW2F__CI4+2jJw?)+?puS!UWTVQ@b~=#VNl{3=D^Mea)0KCAm>5 z6+4na1M70){wB)7NI3G7-30Y@- zCu5jN!jq9%k&nMLA&w<_W}o@26vv#SHg#@x>EgvJQ+P|0QIYSHi`<1NY&s_7((td$ z-QtErWm&sALrGM%tpCKZ;bWgZa`xEh^Pf2~eD>tolgG|vT`z?B1$CB>;Fdl4$UA#3iLpyNCnGQIoSMP38|&}s?b|6w5@PpMcKcMgf?|BC9 z`s&xrri$jDH@CmFeYxs;4YwLro1a*>S^VW|oTaRM&B0YS%v-OO-fQZfx88Boe$d?d zo%Xldm;3&>i-I#1mFbF*QW09M=$yCTt?gLeyIR{fZ~a>NI`ZVka=n%AIS2mO$hpEs z4tjn5TNZ`m(EIeUlMBM7*eF6wy`LK~w@6QU7aS8z)Z7?2QMU1!o&@uG?j6h9xl(BY z*c^n!qUARUwh4XI8Pv8YSCLVvjj2yW$7kfE-Dz};5+_Y(xR8B#wo&gU1ALTN|$yhu(6_+6}PQ)XztW(b<>y{G&vQX)V%u*M~X04JqCCOAYo|k$k z1RbBk3Ol|Ub^o~p2Wjwpmo+lK~6B)Pn^=Gd>n|3!S?uOjMhOo3dq_{(Acdz2^ zU1_@QOSyYj-3Ql8tX|i=bs-XLZ6oebJFxp?hkc- z{+h{2BT1hXKrnYC_4H@B7A~QWASe>mb7q5L(mYXQ%=|9*8q};g^Oww*O}esSoeiCt ziN#|xQB0itp~JKArp;k`4J?DyfmH2@$a$?uP+KKP>^d=~NL7jSx&yI1OY{mH9OF81FkZM^H_Q!V>%x8ANwH9fWJJCbrASuH}wI6b3XU7LVeyQm@+uz!r@`Y0F(EnMpA@F0FIm%P58wtLpDXt9wMp2t1)Ds>-7*b_%-LV4B8q~Aih;Wi{-+04C(J4?&RLdr zbSjR{JC5#*$4@g%%2CgH`GzW%B0j64%KszWoGGFA@Z$VY>+3_@i*It=oH+?iilis0 zHKF%yq||#ca>yOUdT)}+!|&*$WX^Q0>(@fZk~E=&r%*y`5<1=`lWe-?fLvxJ`8#P* zuNR*{o0+Z!64VatzzkAkzWJo}Nm>hY(f|al^dgVRW!#@PasY zQ3eVSPVi?iSoy&-FXVVT&qN;v9fT(*bF%{xnIfjNj*#zY1T@Ru)$F+LL0Ga4gELJ$*>okT&E z*s1v1G-aI%CoY5>S#w0lmVxh3XP*j7;i#PT2$AslSX@p(`=<)A2?%I~`T%J^PNC|P zm4qmg>_j13j(#pB2w@Ntkkw|7=Z1k+n`lIaC^>ckr8F9jNI^CoKr5Zcm5<0cYXUCR zl2_(JC0Uykjscq>u}mVypbC-u>5e!Wn?XZ1b;h#^v!WEwnj%@70PH4_wOkZuWa{|r z>oEo=b>MNfA#a#&7GTE_MgDI%VYHTW75;hK-HNJ(#En<3zw(ocmiZ$Yk9Xn7S1;YI zY0uO)yjgd%E?wKB)b=dDtkm{Cu$XIo*KH3RTy1EJw+ps)J6GSdFnF(~Zq4lEgCAO4 zwZXM2uAzCU<>oWXZ7Y^r9jo=bKiJj|S+il^&-WevzCFXYey8-U(lozE;rFbB6@Fia zZ^`g&OJi@ja+h_dZU44)o1-zf#yM((_ZyMPnxFHvt{pXT-pYCRW)?&2gs~Ws4;UB4 zweTn=U}9jHW-ErLqb~t313;#VEj^Gun7Y6|*E1lL$0^x2ob?(lucjf9gRy)xww?0^ zUVr84D``)Y;%Q1bntt6Sb`28h#YY5LD=Ne&3K~U_R9N5_QM6fqL4hge*Nc|9Rq?c@ z9IdR(JsUW=K3P$_e3E7sOvDk<*yh=T`uHEl>@QQJYYL!{4@Dw8La-zHzcKW)Zk3me zlH?%cD|LcwwtP(0kVaLWv#I{0h?GC0<FA8&A@urU+a}sF;G;ODaBxQ5paB%d2qqksbuy8d zs?D<3FF{sj0559|#%kq+G(85i725YWdxZolz^TEyjD_GtjG4*m8spcbGO%bZPRPU> zxUfO94oxM_*F3ebZ&8but1Vhi0|70Xax}1JJRY)UUEuJem!TFNcz~zJ5Tr~=^DG$g9B>rrhk5dE zQJvF}moVIUJbbVAWQ|)8cUB{FlMS_sY=~Pd+@6P6*^>5Iq zGsL}K^15Tpa-JJAzX){e3*dTlC3B9XL$F>PLf11VORk%*m0P(vCxxHq=3Gf9qGfYjLjz!kH5p|qPVX_OSf#P;}a5a45sxbwYW1fI4kKz?Bnm z38HOIvX6!*U}}`(szyO3M+l?SqA_ieB{Ix2;T+;T?p1vv5jj6i*a1YDs2Gh)GhO^- zPdI3+l7AuS@q7_i+;rXL8P!-0*Fm!h5I!T!CA3{tR4cQq2xS-dnoe}TKNqo36 zB}EP$$SdZ#a~tNPLuaLF@!UB;9g~wf9aaB9?fSH=pvItjd96mZ&6z9FW{_&)h%Q4( zg5IEJ+oh9(Awm|VOH6}eGG1H~M5#+}-189t#{6kbF~clBtTvNDg4%yPBFPEu6>BVJ zPGK@4-`mCa^z?Kw5r87o-(=W`uNQ_DoXjw4y3={e+W`BRsEjt35AdHQ_3hlbTqBWu zL4?(rKKCh!Agf_4fuwpq)MY8I3NLo?kscAnqmbO>4=OU*1T>UM4qp;;GDPm97}d`a zixtlu1)iK1pic7qklJ0;zDio#xpT+ElQO>W=6Y`E2ZdGL+y!!9o4z9Y!G?Nn?ALkS z<7k1RWt11Z$cUAK-VzNPjypFy=D6Hyr0iKZ1^NoftVsMEteyT$X(8Y8V z&<@{hjA)gJL`K20w@koXuSDeGP>u970wBeMfdMT+37Jt%s-jRgq;-8{N`49|0RtdF zNUEVHuNuK9sYE)IL>ii8p$Im-0)S%|uK;NhRQ=9L`4FHiXJI>FJrOyn-lCnD#3$v^-rTh>Yo!8ZZDZsF zleG%dQ*zcRNbxBso0D?Zf`BZQ52#T@xFS7CS(a}sj7(-B;!1gk3Q_~!f$?$HQ_xFE zs*_Jb?1WDGv}ps(>hLYZ6i4g4>;2No54^#}-RZh6rLOCpi+8*OnVR}^O-QK;rEB)S zSF;zdf8U+=djZJ|i?QX%?eLwzQ>fdGXRkktoGN_CiM4>I=IX>Zn!fRTs(c%A3h-;3t&ArV zFGHLb_um}&*2{m=l&b3lgpqP|{c`2>~1rrt8lcp|B5N9el3Y70hl}T4PA6X`1j0MMImq}NJ znDYIoG7*PmhhC=I$E>ZEg`H9tr7 z9--SehX!>p0ZR7;D59^ix)ke`k6*uYTlDM4q@dTiWQ#f%D_xPV_ba!<|0a+G-^q_w z*MS0~?UD|yUzpGXu2~YD+B-NsbZhs<)rha9Ba>FlnzYT?lXh?qZephqTf0k^B+c3g z05ro*^lER6YtjrDA~&7@+LTW88Sk{aFMub`0VbI%PwdgcCiZG~#x?KlJ|k4S6H1b0 zLJ0$(Fr(9vbZe!XIG~2)pD8|K5I@FI%n@?Vlb7RRHD3NX?``q&09M&hp0a;tdAyI# zFt%Bnnr&hDM(!`(^cVbApGp-488(~MX zRO=T>+dD2jy$>V2Em{*$EJ*(#s{-`#Xc;3iEyGvHTw{bF4?q} z#gk8mzpCac0e^YIKgIxaX+pLJf05d|wH8V?76PUKj>-HG{J)RGek>XmkmIVCIU)g$ zVkiiqRRC}{z&B9c2X(J|T|d@~($4hiF8&e>*>PYw&k-`CamB9!#_4n|hycWVR(bSgXW`t!YA zy)QBlh$6F8J2qn;Bqt8=q->JYK9D&eM8KQ0`fal3|7(GSJ~1Gnw|#-0H~KI%A|J(& zE?|sE5jsuagcT7btS^p^X6>X()0I@o(b10sg-%uj@IQdN&ln{pRsJ7o7LqO!88h@* zba^R3A#{Shk1l87185~3H`F0T@tn25teCY@2S7Nj{%{bQNKOfc?k~lN3JKOyoK7T+ zO5}j5YWTz_RW+aHd`YI0M5kAA%9cRaC;d5V$Ep$1`^hfBd?K>G0@WVvBE3dwY*==J zA)zYy@cn}iIFd6ri);x{RC=2=oy}Sk%mGA2@WdEgJF?~}A?wsfI|B^yO079k>>9^>_T9r(ZStpH_QPxDI;1z@p5Mq`sIsdYX6gZ<} z(J>XouplmQ1(cb7oMW;>Tj8QY3oexh5y`BBeR_7sKE8e@6PXz*A2EOF z6*?v9G>4N+A4X%6g;&+Jgr)-;n*!peD9Zzef zp=t5>b?3c$egPVD{TpZBeDUUs%llUw_N>_^{}S;EDDHVaY=2+1=iggzpG_Yc zRt^oX?t4zDdTze-UPI%2Nv5%B-kB-&D5!8X5AeZXwb=S*&&{56uus9Szb{kQ_~zl8 zhtqZaN?rfTpi;MQVJH)*yD@xySO-{^Tff(HtLOIazd88*gQ*%qB`T}#JGjcmrT*pC zbjJau<3PIOn9^}9-SM1)-+{nUtgU zo;PsAb=|czvEW+u_RibxHMYL_%FS04NBw-s0uY=J+~u#Iyn6BvUb+#v9$7Li?OP7N zb#S$6*UFAn_rTA~0#`q~@cg1 zmwVr;TMcwCUs-kU+ag(onhd!ugco-#J*@=0R!neWT6OnrnF2tV|3>-s@+H^u(<>L= zwWS)5|LFNU-sk3R9{`Lwc>UnripC||YQ^?Upz(pt5^&8s7`$~e^uDL+ZguUAnd>w6 zYC@SBeyJLm8$*NOH6LtwP-?I70g&<6-!HS*G^}yyLd80iK*!4NRG?!uurD1L zQUXIiYE1=(Rs+vv0`&}9Lb0o=QEWo2>_Du_x$?@4zi#n_;%`m4TkmO@e~4Q_^$NCuahak^zK z#$)wW7Akn^P}$NIX)~+3BE11twNAJeSXDXaR9(jMe1Nn<5&Hk)tm}%@L(>76{Nol; z`cn|!SR(1W2r5>Xe}lqE-@{AQm5A!A9RS?aM)-G7k8W@@`>KarYWP|h(9~-iffqvc z3XTL(WQV4@Y@nnAO0Ss!$XM}b1Kf8bPq{E9bdW%!AgOSloxy!jyy5GBIR$V|36yIc zoYV4!(pm(DW4^KVP@;~pR7Fbu*pxUZVb%#9)HCu;mb{%)bl^i`dsK{TV+kDw6fDKo zJ{j~hx(t4p%kwLF?D{{<<3ytlP=ov}iu*M`W;;JDAAGll+;_9*e3eU*R(4nR=oY=! z2+tB5XrR^b?d`>2LZih1id8aC6y#WVXeuXjXD`+hiojif3Ln2+_`)1fVrSARFu&|? za)J%_OhM1xvz4e=M?v8XHUy02e8U3p$Sgg9Fc&HFQXd2Oij|jmR>3h_hCH__bCLK- zEFwP$8t{%UMNL}^$l=lObD3!0{MLZV1os=}IX4@n0ITLo43I5JlpnJnC0Uywes__) z%I2lQc~GFC5LeVC1{$=hXUt5oiES*EtJ2^ACBHlZW08)EI zBd1Os8_K#r4dXr5bFc-$4ARKMExtx+4N&6u=uw9sq~FD3)=E$ZEens5^W4)E<1grR zj!xgF6S>$kC_?%=-H~vjq7>#UQnn-~TV|aJz!Ng9eGHWqlW?=;I!K^G2@bdyFw8*0 zGAK^^W1O;1y@|4As@LX>69M4ZMC*j3f?w~|)BOIrSa z21k39`)C*EZu(_-pHhef9w5EfdO0e^t&)@OvM+{m_yl35FF_sSp z>*vce{>pg=^yV#rf}d*IwD4x^W-PsJud;3Ld;Y!eS2ty9>J}5}#$8I|u5{yo(m0TA z98&OGGjy+JySnUhdF)P2AM~#`JvTkemLJ!2VWCMX^kh18TnQb2S6&T0ySnXEs^--F z3MjJ=0$gpw;@LO9c=L2(lD^vaB#Ke(EQ2wJ+)BbH!Iuex?|9`e^Pg1 zVK7r2TnfEc-MM19efYgyCo@Jdeq7TBCx!Z_O;`^TsGr9w(aN;DUUAnip82u6362NQ zv+Vgu!#%@iVV@G%2W-J`-RM_p`qMQ>m71gTW%nApQr$8gFuY|~Ip#8qh zvez|Vx(*GqVSex~R?~U|_$5U;?QK`Q?aO|}+f5+`H1JW06${GI3Jv$&D9%r-+ZHT$ zy-jd#*xGj^?@gx?=v0&yUI&$n6!Bfu58y4S^j#!Gn^(1=yR%w}gT+;k))9>ajKSp|8@iGW#?ZlLVA{$X) zVY0pfg^`N3AJNp*D<;{8)Wzf3jd<_qY9e!lhb=il@;y6HwxD)zT$47zVc7ej{5SSfuvovy`rq`B{Ai!T+ z_H>3;wQj1gvG(*cy4(!8S}h6rCU2~u=7_9%ud795?vi@G!_0EsZxF0c;Jf2BWXgf{w~ z=C7aY<`5}qwKrRz2`e%!Mab>((7S8bE*>&$qC4NU-yoDA)pdM2hRuDTS<+ew{mU1u zL}4w)x*6ZT8&tdcyZX_k^!hO+Sfdn%g?xq;AHLwcq1cf6f-Zd_E+xjW9CDfr^QdnR z>e{VSx-4N=A{GwKr$=uGS>3*ZxwRMDx}rJU96EQ-D3GBF59nN!ao9~!R7qoiKOzXo znc2^wLtF;mL~l`Dt<{k`MLRZNr39^=$yev~qLajqLhqpE393Ss+gJk?%mDFRSG~qb86Ac*c_XfQ zD&)KL$W%!3zfvvKu5beLshk+?6{MpS%CyL7++{7;kwkS^57DCs6Mz)PE*&`=cF3u! zihoS0{tJu2*6osBsIG&~x?yBCo|sp8FS8e`I;aKfYGe`;nf6B~RRg4Q%vS4$nvD(R zfvhSIKo^7s?uBNnvOji%juw0BD@%vqW0h8wfjXP3HGY$)G{oT;WiM7;~+>EegkthCjC2D zT{fJOHYVwtNYckvbT)#ruLTJZ&KVtSNn6g;;P^x|$mn3Ewe;aZG>Ohjbm^GfQHZ}v zGnmoXj-$neT_9?-Wq?i~$8ZgClBNd;r+Et{F$HRynGkPgE9q&`qq?>+k9+2(g?}wP zUvEQ=p>JaOMl)+s3VHsf7+W#@O%V&Z{-y{;*}f4Ao2(RL*Tf4$s!>~IvOxQ2*IaBR z%LFWgze*`Y&01M^qVcRURn;b4zG3E*XKS`#uJT#puHQszaMxDO7nrv{1b$krJCSnK zY{g=K8sO)LGIiaws;672!y*=??$F9OPV>hXc7OF0keAA)e+aZ9lE=Sz@IB9tOk*!$ zYrRTi?@FuEc;xnWoEGd0iQjXB`&G8l{v}oOWt%s?pgF{XzjZT;|4G0S?B0Z3kR;O# zfd{a37aoEcJMHBdB~!{x*po~LQ;O}WK>J-5TLNN$7kFR94z1-fZb|67B4ACrO|$1< zpGzH_D4v5x0gNpImS|1rUSw7sOC!V8GOHKVhxqo_Nx4*q!e({BWBHUCnk>G8EH-gL8sH%VW`1M|Dgnz}+(DT~LfEha>< z@u5S$7y(3q-AA2Rn}`*iv^vql7AQ)8K*>ltRHa9o7@bPYu$_mp7AVEclQL@?$7b0H z=>?)`jl*x!*i*o>Ck`@8dz;Rka8cq>#NTADj$?sn_TlwI5|~e zCF7e1ZXWna<&ODdcPlCvgc}#HUrbkZDpj4!$CRqRmBBj|`)(h7pFY%T&B+DZ-B9QE zg13U1K<&4E-wD1ITp=7$1 zUN6~h!OTiggu_bB#-cOiLMw3#4sAq}?~!E3VjiPZHo-jW0$0_`fqcxM5-1>n$6~xz z-De8)Ojs&l1ua0?2KA6-m~ksM9z$+b4v2yjTfD5A^kVeLOnSt&RR`w(fxB#VZq+q5 znWKTq7FElm*h$#ObVOCj*TxeKUrm}ABRUF^uuWmdxkPU8fgB?wv$dIdLIfN3d9G?b zn!%JjwSS97)<+#y`8sZJ8nh^GOE3I4*-}wBUQurh`q-$skQkZu<0c=9{o~P-3 ze*-*5mnzduPbl~eJh5;Rf`_+qA(HYmrW}oHP1v?AUEinF_bnV-l zqk%rxYNWAH%k)m3*&=U5m^XXbNhi?f8bJrWxA4H2G#B%`5zK-a``eh+{o2nwV%Kia zc*s~Pq=nM-+#e!f!|t=vC4|h@=1rG+y;z0+h(_@b z5eL#g{E#b)3}JuGjRV&YEO#s%SoQBox%b?K=dd~kVX9sf)7y5xw{3T(8jINpYx(o% zZ(CPBt5hFKc@OC*3CM;NZ-`+ce_!rd2+W@cv=XQ$e54wV=iXq>jX6^pOjqtwDtE24 zrTd;y`kqMzo<*t}-{1TE3uhO0AQg6azO)v)1KZgN$ zfH9oo7#Lx??g480NY&m;UGVp-14VtlGssFFgcq6ZlI(w1U_P}LHGmp#i;P_@ZOA;V z`n9;QsAV#u?WkeQOr#PRU3rVC2y0q4_htlc=*2l@c1p<<8Is3OX+WY0H-Z=*!;eXcyt*1rNGrqw4D@b zH(hlbU7$=d{>?#TJObPZC1DEyXJ9ymT~3X08GA+PM955mZBI0705%?(ic17-VV_*G zsv0EV5e7Ip#)uFSVem>?7zhIvwqfCSz|tCvPft!py8CwZ?(gl}wXb*gp5E@>?me;S z-mv_{bPx7k-;uw+NH@K3JWO{7Ytj-qpb=Amk_6if7TiJKQd1+6p1yB z-YR3-|3B!Vd4m2wgZ>JeUNfDCJfX1fjFvRFb-eU{@!9hAK*@wpwgK_ZPxT|}#WW>? zE7!wa=k?O7rD;c#;%HiG`LSdBW;jIeN~e$r&if#)9-0b2QKTCg&iu^Nff!}M0kqRR zJp0tAumDe#5;Occ<`kxmTxP%%u=%}+wQA%T2oFyFoIbmtEfFJzU7EuJrYJ%()YW(l z@_Gi3c^lbcQ)F6_rV`Fu$I+7){64iw3(~#Hec>dl)*C(?viLai9Pak2J$pCQt$W>SR8l4EKV3W7>zv%85onEKYvveYUB~e4NO_8$>DAlaxvKB1WRkvIw zom_R&Bi^nqL?m|-=_Q=9)|cY(NoFgNh{a0;%t>$1iE&;J-O+3zeV0y0=|tMCVZ&h) zzC?^tDy0+kGgYZzS_Gjtl7+&W>24RDdgw%cA?!p?atz(&E8Kmv#pYOZRoMFPd8^iJ zxT2Y>gKH&p=iprB>rT4cj?G^dTh=*T)`AXO$C3rRCEGfd&EIp~a;?+tTEK2=SQOSd zT-LlHTjkPOSYG7i_P4&cj{U$Z*IqDj_VP8e+19*h!AADB=5>n}fQ-~vZHv2?EI0Sl z>o)y$Tkf^hc4$#t8eH}-J$*C&A&19Y6x=~;CJJ`jHY|1e5M|hwdxtyh5nbPuX>84G zYsu8{AC`@pY~842W$juCyTzu{4QozzOB?pAm9kqmMNs3Gb1wJm!K=Y_4|{Xm!gcq8 z5`OPHht0N{d*y!YB;?0dI`Yy`D$uT!V}TaE$mPOrvGlHXjYWqL272{Z>(@)!n{!qw zyFHJn-R91e`%{5IrF>}3f+xyha51nrcC*&V0pYm}=uV|icOdWkuoQQC6S%P=tXLM? zeaMk;mO+!vzvN%z=(=K6ueW`F6a0Q~ zorSGEV-DJ?mJ(|mE-TiRGq;=nrsMk^E2GM;W9t;QzOTZ@uWhfj@e~P{72C?#?f#Vu zf96@I$F;oy+n(jtH4c}RzP}jwvw?NGUF-7McEb^nzT=vO?mKs~>pf>F`&c%F-ES|q z?O3W=Zg~qU?Qna$b)7D2&8+uXZNPMv4y?FtpG>tJQyPv_Cv9S1;l3Gn>QJOn80wNr zFhI$379Q8krX;I7lGy=g!Z@Td7{+P{^_NIrlo(qf`BP;NZ0s`z1KfdAc?mHOAbw<7 zQq>Q;y4wI_GFiLo@-6*<;{P>8Ej>w-enS1 zXR14|RTsQx_FYVoZ2$SJmAJghqlgEp|Ln*T#ZJqNWziBG#)`A%OE0NQxEW7o9BU&N z%Q_CKJpHg#jV8n|ClhmCvzSaKa5IzjBNu1le_<{&nSa4)r**np-^Q8zKjr*uR-38e zr`Bo!gDGo(qIdk9JE?Fdf5z?p?_9&rxE(*^>VC!rf5z4RoxN;cT=@J_$8u!VzVB7b z1N)TA)U;5tXu0nGh@<;|T5I7Pe%N+R4N#EYvj(Uj4Ij(ol>J@%Q8V`gbIDP+W4FYoaDY`($_lHIcwg|$y>TP#R6E%Sp6&9<)kC0T0a^RVIZaXx`rV+a4#_3g$@Q|0X22?i2{Y9&a?5nLzQWQHtF3**GS*NSX*0$a zM@nu$)d8weZUP#l!8xRpmU*34R4(7L6hwH1&yw0W?uHmTur_p1>w?SSt9d=u(k zhS7&H%@f8>wUprQ#8wV{aon^a2#hZLp6lT_wL57unk0VOVbqJi)iK{9 z0>)$fzRu6_b6k*C#hy76-V8G3l66M=biGk4{z@hT3&s>ykZdv_u!3fzUi_69kr*TA z%}Jse_RN`$R^Y2OTCvfVwC7knl8l6+k+du(&Q8nWWFY;_%Sr;WLf>*R#u&L*lrPSp zmxPERLUe#$h?`Vg%EO75=5KNe?eeJKty%TKN)6sM+sUC9P7WP;PIJB#il*e}6eXc( zR>&&IAk7xcpRgs!j@T5R(JV}4Xx5;lgf6HGEnIUzRs<&^QCU@J3pGa&Q|NL+&;(VE zPAH9NS7@&^Yd8^~h)k+<)FdH4OY}`8Vsc+3IvGlb`(Bt0Plc4&3rd2%TkSg&iOHuS zkYsfTQf*d^sC|L+a{PQ>G;+3YW)|`+zBkZ6(5FU{@}8Mc_*`gGR{O#+Nrh~hneC&W ziAb_9zdwPQSzc02FV6qi`i}c;_Xl->dmeAj z#Bb^Pbyv^ZJ6D_E^WF5VcRjgjF*mq#oVnJWvvaMT3&LgBMpGMpoF8>{zti(}&+5RB zdhuHG(Uxs1JF{H_nXZA`{h6-)>sy{!u-^eWoC5sf#O&93B2sur2R6G(B5R%zYc>B3|aL+VRO~qpf ztmy(37Xc)}pmJrKgZn>?=Pz&jd=8!ClLfUQStP3@ylcCa|8nqHVNntc42d(oi|1y! z?OZ>n@)t}z_X@}3->jj=?W2C4F%ByGaPa0|3HAce$?99Mj3QM#zvuE-%N3j08Ff>4#DdLfdWQnpf; zEt&{P$%{$NGJ#ssZ&FChXr>8Cr3HwhvXkEHf+1CvV=w`9j!bt}(sX%0D1uYJjp8+K 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 RiF?1vHni3JekYIee*ij30mJ|R literal 0 HcmV?d00001 diff --git a/.venv/lib/python3.12/site-packages/cmdstanpy/stanfit/__pycache__/mcmc.cpython-312.pyc b/.venv/lib/python3.12/site-packages/cmdstanpy/stanfit/__pycache__/mcmc.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..bae499e2ef56edb9619d998b0d56c87cae350b1b GIT binary patch literal 37153 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 literal 0 HcmV?d00001 diff --git a/.venv/lib/python3.12/site-packages/cmdstanpy/stanfit/__pycache__/metadata.cpython-312.pyc b/.venv/lib/python3.12/site-packages/cmdstanpy/stanfit/__pycache__/metadata.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..bc38b752fff9582121867a91fd3e1b3b22d88da2 GIT binary patch literal 3028 zcmcImU2IcT96$G?T`AkjhX%%&J1__|j@AJJAp?ai3NbFk&BZjD%iX=F+bzBKmUC{m zw06P+4`49Un8-*>Eb)O69>n+{PbT{6%Nit;8xu`<@~u)50}sakxgTBGW@2JINzd2+ z8 znTUv9N4k6o>5$II6BXDlVv$5gli#ZDMDNV7urP ziVn83Sj9u8KI*6zrbX*_u52VJy3z@&;_C*P zSc^=@zm!?mBGXxtlW}+BX)8-8u{82#5T|lAj$wom(QGSgOctr?7`BB~OUH2I5X)ga zazPBUMxKQ6g)5+VI(U@5unvumV~=Nws5<0DvrW@e;p@v6O$+-ZmhvP|Fjh1P!_#Ws z&~Ydp5Z$P6lpCeQDN<`h3ktvsQya_@{2H$bJU1lsL+D+wV^*4#D^hOV3K2N!VyKr1SGQKAiu|c~ zb-Ro-keHRg%CNG~|MOM4_E(`5{ZW!MQ3$M=0gsmVNx8i9v}HI3WTOm?Gm#^j<2Mpd zO^`V^PSqL3Ke(czj3nFKgrb=`gU(XIl<|XMyX{^#hTIXuAtrNU#M0S};Y_*h3bgH% ztt->ev~FDSRPcQ=;>wKVvy`XBl|8a>&K0H^j~*{v{IrmsvQ3gU@{?*=OP?ueQz|vj zP@7xL(qo26MhP_tJ7KB$5;IsjHBGGPbl#Xq7fSF|>p*H?f0}_!`wFUdPMsty9k@{_ zrMW3t!%2s@k}8zkn4%aEA4Mr|Th&jgkhTE~WS_xw5&hP?`?CB~Z2K>X=a&*YYl)rJ zLks=2zQgwtM=s0tD8jqGC|@ssUU@8uJ@E&Z-?DrMj1;?hJf;^y{N{_4@~gTBN!`>Z8PyMjOaKX+*{DINJiIebaSv zOZ5AW2%l43Cwrnl#3C?jK|=tC-&|gU9f1R2wUBG2dMwaNDA(GQ!EM+8qbMnklsiJm zIU0X|HV%jz1-v#@hqeRzErD)^g>l`Oa@%;6DJjr@in34J&V_grUqnAA@KRz=EwN`o zUfMfY+dFtKacnVmtN}!{wnwi5GD^E4x~=)_d=?wZcy;eQ%hAgf__=+&0d070ZuZLT{Mb^@K&@xs zUSj`ZY(MP*mS=LybLmwp;4^;?P!86W1L{#IpK8Vn>JqRAvOx`X0$w(r9LQmQMlCT6 z7zN?MXBFjaKPIWk6h50Tz@f!|fo_B^tnzn#3#OHORy*55PJ%q+fN>GkR5hRRano8pu4^K7xqG#T zP2x-3zs_a<<}O^huo!#6^Ddd-oz7#fC;cX<90lAMSY060DbXGLuEV<<50Xmz_}y-pZXxfp9>!4q8hR6dz}c5DT|$3| zawJx7k4NJ3PIYKubM@5q59$bxcXl=SQr{{>j?ecs5G(-R(ayTq7CBIrtD_5j)pu@m zK0oWiV literal 0 HcmV?d00001 diff --git a/.venv/lib/python3.12/site-packages/cmdstanpy/stanfit/__pycache__/mle.cpython-312.pyc b/.venv/lib/python3.12/site-packages/cmdstanpy/stanfit/__pycache__/mle.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..4f1ffb67be2f40e99cee2c605569bc68c69085e4 GIT binary patch literal 13229 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 S?#S`KC9r-_@EHCu{ literal 0 HcmV?d00001 diff --git a/.venv/lib/python3.12/site-packages/cmdstanpy/stanfit/__pycache__/runset.cpython-312.pyc b/.venv/lib/python3.12/site-packages/cmdstanpy/stanfit/__pycache__/runset.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..fac56a5cb7daa14588a14ff6f04b2493a6873237 GIT binary patch literal 15401 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Π=_I~3}oPeq45OmN(=A=XPb}aVX@ph3p`NMs< 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 literal 0 HcmV?d00001 diff --git a/.venv/lib/python3.12/site-packages/cmdstanpy/stanfit/gq.py b/.venv/lib/python3.12/site-packages/cmdstanpy/stanfit/gq.py new file mode 100644 index 00000000..6c77ec95 --- /dev/null +++ b/.venv/lib/python3.12/site-packages/cmdstanpy/stanfit/gq.py @@ -0,0 +1,734 @@ +""" +Container for the result of running the +generate quantities (GQ) method +""" + +from collections import Counter +from typing import ( + Any, + Dict, + Generic, + Hashable, + List, + MutableMapping, + NoReturn, + Optional, + Tuple, + TypeVar, + Union, + overload, +) + +import numpy as np +import pandas as pd + +try: + import xarray as xr + + XARRAY_INSTALLED = True +except ImportError: + XARRAY_INSTALLED = False + + +from cmdstanpy.cmdstan_args import Method +from cmdstanpy.utils import build_xarray_data, flatten_chains, get_logger +from cmdstanpy.utils.stancsv import scan_generic_csv + +from .mcmc import CmdStanMCMC +from .metadata import InferenceMetadata +from .mle import CmdStanMLE +from .runset import RunSet +from .vb import CmdStanVB + +Fit = TypeVar('Fit', CmdStanMCMC, CmdStanMLE, CmdStanVB) + + +class CmdStanGQ(Generic[Fit]): + """ + Container for outputs from CmdStan generate_quantities run. + Created by :meth:`CmdStanModel.generate_quantities`. + """ + + def __init__( + self, + runset: RunSet, + previous_fit: Fit, + ) -> None: + """Initialize object.""" + if not runset.method == Method.GENERATE_QUANTITIES: + raise ValueError( + 'Wrong runset method, expecting generate_quantities runset, ' + 'found method {}'.format(runset.method) + ) + self.runset = runset + + self.previous_fit: Fit = previous_fit + + self._draws: np.ndarray = np.array(()) + config = self._validate_csv_files() + self._metadata = InferenceMetadata(config) + + def __repr__(self) -> str: + repr = 'CmdStanGQ: model={} chains={}{}'.format( + self.runset.model, + self.chains, + self.runset._args.method_args.compose(0, cmd=[]), + ) + repr = '{}\n csv_files:\n\t{}\n output_files:\n\t{}'.format( + repr, + '\n\t'.join(self.runset.csv_files), + '\n\t'.join(self.runset.stdout_files), + ) + return repr + + def __getattr__(self, attr: str) -> np.ndarray: + """Synonymous with ``fit.stan_variable(attr)""" + if attr.startswith("_"): + raise AttributeError(f"Unknown variable name {attr}") + try: + return self.stan_variable(attr) + except ValueError as e: + # pylint: disable=raise-missing-from + raise AttributeError(*e.args) + + def __getstate__(self) -> dict: + # This function returns the mapping of objects to serialize with pickle. + # See https://docs.python.org/3/library/pickle.html#object.__getstate__ + # for details. We call _assemble_generated_quantities to ensure + # the data are loaded prior to serialization. + self._assemble_generated_quantities() + return self.__dict__ + + def _validate_csv_files(self) -> Dict[str, Any]: + """ + Checks that Stan CSV output files for all chains are consistent + and returns dict containing config and column names. + + Raises exception when inconsistencies detected. + """ + dzero = {} + for i in range(self.chains): + if i == 0: + dzero = scan_generic_csv( + path=self.runset.csv_files[i], + ) + else: + drest = scan_generic_csv( + path=self.runset.csv_files[i], + ) + for key in dzero: + if ( + key + not in [ + 'id', + 'fitted_params', + 'diagnostic_file', + 'metric_file', + 'profile_file', + 'init', + 'seed', + 'start_datetime', + ] + and dzero[key] != drest[key] + ): + raise ValueError( + 'CmdStan config mismatch in Stan CSV file {}: ' + 'arg {} is {}, expected {}'.format( + self.runset.csv_files[i], + key, + dzero[key], + drest[key], + ) + ) + return dzero + + @property + def chains(self) -> int: + """Number of chains.""" + return self.runset.chains + + @property + def chain_ids(self) -> List[int]: + """Chain ids.""" + return self.runset.chain_ids + + @property + def column_names(self) -> Tuple[str, ...]: + """ + Names of generated quantities of interest. + """ + return self._metadata.cmdstan_config['column_names'] # type: ignore + + @property + def metadata(self) -> InferenceMetadata: + """ + Returns object which contains CmdStan configuration as well as + information about the names and structure of the inference method + and model output variables. + """ + return self._metadata + + def draws( + self, + *, + inc_warmup: bool = False, + inc_iterations: bool = False, + concat_chains: bool = False, + inc_sample: bool = False, + ) -> np.ndarray: + """ + Returns a numpy.ndarray over the generated quantities draws from + all chains which is stored column major so that the values + for a parameter are contiguous in memory, likewise all draws from + a chain are contiguous. By default, returns a 3D array arranged + (draws, chains, columns); parameter ``concat_chains=True`` will + return a 2D array where all chains are flattened into a single column, + preserving chain order, so that given M chains of N draws, + the first N draws are from chain 1, ..., and the the last N draws + are from chain M. + + :param inc_warmup: When ``True`` and the warmup draws are present in + the output, i.e., the sampler was run with ``save_warmup=True``, + then the warmup draws are included. Default value is ``False``. + + :param concat_chains: When ``True`` return a 2D array flattening all + all draws from all chains. Default value is ``False``. + + :param inc_sample: When ``True`` include all columns in the previous_fit + draws array as well, excepting columns for variables already present + in the generated quantities drawset. Default value is ``False``. + + See Also + -------- + CmdStanGQ.draws_pd + CmdStanGQ.draws_xr + CmdStanMCMC.draws + """ + self._assemble_generated_quantities() + inc_warmup |= inc_iterations + if inc_warmup: + if ( + isinstance(self.previous_fit, CmdStanMCMC) + and not self.previous_fit._save_warmup + ): + get_logger().warning( + "Sample doesn't contain draws from warmup iterations," + ' rerun sampler with "save_warmup=True".' + ) + elif ( + isinstance(self.previous_fit, CmdStanMLE) + and not self.previous_fit._save_iterations + ): + get_logger().warning( + "MLE doesn't contain draws from pre-convergence iterations," + ' rerun optimization with "save_iterations=True".' + ) + elif isinstance(self.previous_fit, CmdStanVB): + get_logger().warning( + "Variational fit doesn't make sense with argument " + '"inc_warmup=True"' + ) + + if inc_sample: + cols_1 = self.previous_fit.column_names + cols_2 = self.column_names + dups = [ + item + for item, count in Counter(cols_1 + cols_2).items() + if count > 1 + ] + drop_cols: List[int] = [] + for dup in dups: + drop_cols.extend( + self.previous_fit._metadata.stan_vars[dup].columns() + ) + + start_idx, _ = self._draws_start(inc_warmup) + previous_draws = self._previous_draws(True) + if concat_chains and inc_sample: + return flatten_chains( + np.dstack( + ( + np.delete(previous_draws, drop_cols, axis=1), + self._draws, + ) + )[start_idx:, :, :] + ) + if concat_chains: + return flatten_chains(self._draws[start_idx:, :, :]) + if inc_sample: + return np.dstack( + ( + np.delete(previous_draws, drop_cols, axis=1), + self._draws, + ) + )[start_idx:, :, :] + return self._draws[start_idx:, :, :] + + def draws_pd( + self, + vars: Union[List[str], str, None] = None, + inc_warmup: bool = False, + inc_sample: bool = False, + ) -> pd.DataFrame: + """ + Returns the generated quantities draws as a pandas DataFrame. + Flattens all chains into single column. Container variables + (array, vector, matrix) will span multiple columns, one column + per element. E.g. variable 'matrix[2,2] foo' spans 4 columns: + 'foo[1,1], ... foo[2,2]'. + + :param vars: optional list of variable names. + + :param inc_warmup: When ``True`` and the warmup draws are present in + the output, i.e., the sampler was run with ``save_warmup=True``, + then the warmup draws are included. Default value is ``False``. + + See Also + -------- + CmdStanGQ.draws + CmdStanGQ.draws_xr + CmdStanMCMC.draws_pd + """ + if vars is not None: + if isinstance(vars, str): + vars_list = [vars] + else: + vars_list = vars + + vars_list = list(dict.fromkeys(vars_list)) + + if inc_warmup: + if ( + isinstance(self.previous_fit, CmdStanMCMC) + and not self.previous_fit._save_warmup + ): + get_logger().warning( + "Sample doesn't contain draws from warmup iterations," + ' rerun sampler with "save_warmup=True".' + ) + elif ( + isinstance(self.previous_fit, CmdStanMLE) + and not self.previous_fit._save_iterations + ): + get_logger().warning( + "MLE doesn't contain draws from pre-convergence iterations," + ' rerun optimization with "save_iterations=True".' + ) + elif isinstance(self.previous_fit, CmdStanVB): + get_logger().warning( + "Variational fit doesn't make sense with argument " + '"inc_warmup=True"' + ) + + self._assemble_generated_quantities() + + all_columns = ['chain__', 'iter__', 'draw__'] + list(self.column_names) + + gq_cols: List[str] = [] + mcmc_vars: List[str] = [] + if vars is not None: + for var in vars_list: + if var in self._metadata.stan_vars: + info = self._metadata.stan_vars[var] + gq_cols.extend( + self.column_names[info.start_idx : info.end_idx] + ) + elif ( + inc_sample and var in self.previous_fit._metadata.stan_vars + ): + info = self.previous_fit._metadata.stan_vars[var] + mcmc_vars.extend( + self.previous_fit.column_names[ + info.start_idx : info.end_idx + ] + ) + elif var in ['chain__', 'iter__', 'draw__']: + gq_cols.append(var) + else: + raise ValueError('Unknown variable: {}'.format(var)) + else: + gq_cols = all_columns + vars_list = gq_cols + + previous_draws_pd = self._previous_draws_pd(mcmc_vars, inc_warmup) + + draws = self.draws(inc_warmup=inc_warmup) + # add long-form columns for chain, iteration, draw + n_draws, n_chains, _ = draws.shape + chains_col = ( + np.repeat(np.arange(1, n_chains + 1), n_draws) + .reshape(1, n_chains, n_draws) + .T + ) + iter_col = ( + np.tile(np.arange(1, n_draws + 1), n_chains) + .reshape(1, n_chains, n_draws) + .T + ) + draw_col = ( + np.arange(1, (n_draws * n_chains) + 1) + .reshape(1, n_chains, n_draws) + .T + ) + draws = np.concatenate([chains_col, iter_col, draw_col, draws], axis=2) + + draws_pd = pd.DataFrame( + data=flatten_chains(draws), + columns=all_columns, + ) + + if inc_sample and mcmc_vars: + if gq_cols: + return pd.concat( + [ + previous_draws_pd, + draws_pd[gq_cols], + ], + axis='columns', + )[vars_list] + else: + return previous_draws_pd + elif inc_sample and vars is None: + cols_1 = list(previous_draws_pd.columns) + cols_2 = list(draws_pd.columns) + dups = [ + item + for item, count in Counter(cols_1 + cols_2).items() + if count > 1 + ] + return pd.concat( + [ + previous_draws_pd.drop(columns=dups).reset_index(drop=True), + draws_pd, + ], + axis=1, + ) + elif gq_cols: + return draws_pd[gq_cols] + + return draws_pd + + @overload + def draws_xr( + self: Union["CmdStanGQ[CmdStanMLE]", "CmdStanGQ[CmdStanVB]"], + vars: Union[str, List[str], None] = None, + inc_warmup: bool = False, + inc_sample: bool = False, + ) -> NoReturn: + ... + + @overload + def draws_xr( + self: "CmdStanGQ[CmdStanMCMC]", + vars: Union[str, List[str], None] = None, + inc_warmup: bool = False, + inc_sample: bool = False, + ) -> "xr.Dataset": + ... + + def draws_xr( + self, + vars: Union[str, List[str], None] = None, + inc_warmup: bool = False, + inc_sample: bool = False, + ) -> "xr.Dataset": + """ + Returns the generated quantities draws as a xarray Dataset. + + This method can only be called when the underlying fit was made + through sampling, it cannot be used on MLE or VB outputs. + + :param vars: optional list of variable names. + + :param inc_warmup: When ``True`` and the warmup draws are present in + the MCMC sample, then the warmup draws are included. + Default value is ``False``. + + See Also + -------- + CmdStanGQ.draws + CmdStanGQ.draws_pd + CmdStanMCMC.draws_xr + """ + if not XARRAY_INSTALLED: + raise RuntimeError( + 'Package "xarray" is not installed, cannot produce draws array.' + ) + if not isinstance(self.previous_fit, CmdStanMCMC): + raise RuntimeError( + 'Method "draws_xr" is only available when ' + 'original fit is done via Sampling.' + ) + mcmc_vars_list = [] + dup_vars = [] + if vars is not None: + if isinstance(vars, str): + vars_list = [vars] + else: + vars_list = vars + for var in vars_list: + if var not in self._metadata.stan_vars: + if inc_sample and ( + var in self.previous_fit._metadata.stan_vars + ): + mcmc_vars_list.append(var) + dup_vars.append(var) + else: + raise ValueError('Unknown variable: {}'.format(var)) + else: + vars_list = list(self._metadata.stan_vars.keys()) + if inc_sample: + for var in self.previous_fit._metadata.stan_vars.keys(): + if var not in vars_list and var not in mcmc_vars_list: + mcmc_vars_list.append(var) + for var in dup_vars: + vars_list.remove(var) + + self._assemble_generated_quantities() + + num_draws = self.previous_fit.num_draws_sampling + sample_config = self.previous_fit._metadata.cmdstan_config + attrs: MutableMapping[Hashable, Any] = { + "stan_version": f"{sample_config['stan_version_major']}." + f"{sample_config['stan_version_minor']}." + f"{sample_config['stan_version_patch']}", + "model": sample_config["model"], + "num_draws_sampling": num_draws, + } + if inc_warmup and sample_config['save_warmup']: + num_draws += self.previous_fit.num_draws_warmup + attrs["num_draws_warmup"] = self.previous_fit.num_draws_warmup + + data: MutableMapping[Hashable, Any] = {} + coordinates: MutableMapping[Hashable, Any] = { + "chain": self.chain_ids, + "draw": np.arange(num_draws), + } + + for var in vars_list: + build_xarray_data( + data, + self._metadata.stan_vars[var], + self.draws(inc_warmup=inc_warmup), + ) + if inc_sample: + for var in mcmc_vars_list: + build_xarray_data( + data, + self.previous_fit._metadata.stan_vars[var], + self.previous_fit.draws(inc_warmup=inc_warmup), + ) + + return xr.Dataset(data, coords=coordinates, attrs=attrs).transpose( + 'chain', 'draw', ... + ) + + def stan_variable(self, var: str, **kwargs: bool) -> np.ndarray: + """ + Return a numpy.ndarray which contains the set of draws + for the named Stan program variable. Flattens the chains, + leaving the draws in chain order. The first array dimension, + corresponds to number of draws in the sample. + The remaining dimensions correspond to + the shape of the Stan program variable. + + Underlyingly draws are in chain order, i.e., for a sample with + N chains of M draws each, the first M array elements are from chain 1, + the next M are from chain 2, and the last M elements are from chain N. + + * If the variable is a scalar variable, the return array has shape + ( draws * chains, 1). + * If the variable is a vector, the return array has shape + ( draws * chains, len(vector)) + * If the variable is a matrix, the return array has shape + ( draws * chains, size(dim 1), size(dim 2) ) + * If the variable is an array with N dimensions, the return array + has shape ( draws * chains, size(dim 1), ..., size(dim N)) + + For example, if the Stan program variable ``theta`` is a 3x3 matrix, + and the sample consists of 4 chains with 1000 post-warmup draws, + this function will return a numpy.ndarray with shape (4000,3,3). + + This functionaltiy is also available via a shortcut using ``.`` - + writing ``fit.a`` is a synonym for ``fit.stan_variable("a")`` + + :param var: variable name + + :param kwargs: Additional keyword arguments are passed to the underlying + fit's ``stan_variable`` method if the variable is not a generated + quantity. + + See Also + -------- + CmdStanGQ.stan_variables + CmdStanMCMC.stan_variable + CmdStanMLE.stan_variable + CmdStanPathfinder.stan_variable + CmdStanVB.stan_variable + CmdStanLaplace.stan_variable + """ + model_var_names = self.previous_fit._metadata.stan_vars.keys() + gq_var_names = self._metadata.stan_vars.keys() + if not (var in model_var_names or var in gq_var_names): + raise ValueError( + f'Unknown variable name: {var}\n' + 'Available variables are ' + + ", ".join(model_var_names | gq_var_names) + ) + if var not in gq_var_names: + # TODO(2.0) atleast1d may not be needed + return np.atleast_1d( # type: ignore + self.previous_fit.stan_variable(var, **kwargs) + ) + + # is gq variable + self._assemble_generated_quantities() + + draw1, _ = self._draws_start( + inc_warmup=kwargs.get('inc_warmup', False) + or kwargs.get('inc_iterations', False) + ) + draws = flatten_chains(self._draws[draw1:]) + out: np.ndarray = self._metadata.stan_vars[var].extract_reshape(draws) + return out + + def stan_variables(self, **kwargs: bool) -> Dict[str, np.ndarray]: + """ + Return a dictionary mapping Stan program variables names + to the corresponding numpy.ndarray containing the inferred values. + + :param kwargs: Additional keyword arguments are passed to the underlying + fit's ``stan_variable`` method if the variable is not a generated + quantity. + + See Also + -------- + CmdStanGQ.stan_variable + CmdStanMCMC.stan_variables + CmdStanMLE.stan_variables + CmdStanPathfinder.stan_variables + CmdStanVB.stan_variables + CmdStanLaplace.stan_variables + """ + result = {} + sample_var_names = self.previous_fit._metadata.stan_vars.keys() + gq_var_names = self._metadata.stan_vars.keys() + for name in gq_var_names: + result[name] = self.stan_variable(name, **kwargs) + for name in sample_var_names: + if name not in gq_var_names: + result[name] = self.stan_variable(name, **kwargs) + return result + + def _assemble_generated_quantities(self) -> None: + if self._draws.shape != (0,): + return + # use numpy loadtxt + _, num_draws = self._draws_start(inc_warmup=True) + + gq_sample: np.ndarray = np.empty( + (num_draws, self.chains, len(self.column_names)), + dtype=float, + order='F', + ) + for chain in range(self.chains): + with open(self.runset.csv_files[chain], 'r') as fd: + lines = (line for line in fd if not line.startswith('#')) + gq_sample[:, chain, :] = np.loadtxt( + lines, dtype=np.ndarray, ndmin=2, skiprows=1, delimiter=',' + ) + self._draws = gq_sample + + def _draws_start(self, inc_warmup: bool) -> Tuple[int, int]: + draw1 = 0 + p_fit = self.previous_fit + if isinstance(p_fit, CmdStanMCMC): + num_draws = p_fit.num_draws_sampling + if p_fit._save_warmup: + if inc_warmup: + num_draws += p_fit.num_draws_warmup + else: + draw1 = p_fit.num_draws_warmup + + elif isinstance(p_fit, CmdStanMLE): + num_draws = 1 + if p_fit._save_iterations: + opt_iters = len(p_fit.optimized_iterations_np) # type: ignore + if inc_warmup: + num_draws = opt_iters + else: + draw1 = opt_iters - 1 + else: # CmdStanVB: + draw1 = 1 # skip mean + num_draws = p_fit.variational_sample.shape[0] + if inc_warmup: + num_draws += 1 + + return draw1, num_draws + + def _previous_draws(self, inc_warmup: bool) -> np.ndarray: + """ + Extract the draws from self.previous_fit. + Return is always 3-d + """ + p_fit = self.previous_fit + if isinstance(p_fit, CmdStanMCMC): + return p_fit.draws(inc_warmup=inc_warmup) + elif isinstance(p_fit, CmdStanMLE): + if inc_warmup and p_fit._save_iterations: + return p_fit.optimized_iterations_np[:, None] # type: ignore + + return np.atleast_2d( # type: ignore + p_fit.optimized_params_np, + )[:, None] + else: # CmdStanVB: + if inc_warmup: + return np.vstack( + [p_fit.variational_params_np, p_fit.variational_sample] + )[:, None] + return p_fit.variational_sample[:, None] + + def _previous_draws_pd( + self, vars: List[str], inc_warmup: bool + ) -> pd.DataFrame: + if vars: + sel: Union[List[str], slice] = vars + else: + sel = slice(None, None) + + p_fit = self.previous_fit + if isinstance(p_fit, CmdStanMCMC): + return p_fit.draws_pd(vars or None, inc_warmup=inc_warmup) + + elif isinstance(p_fit, CmdStanMLE): + if inc_warmup and p_fit._save_iterations: + return p_fit.optimized_iterations_pd[sel] # type: ignore + else: + return p_fit.optimized_params_pd[sel] + else: # CmdStanVB: + return p_fit.variational_sample_pd[sel] + + def save_csvfiles(self, dir: Optional[str] = None) -> None: + """ + Move output CSV files to specified directory. If files were + written to the temporary session directory, clean filename. + E.g., save 'bernoulli-201912081451-1-5nm6as7u.csv' as + 'bernoulli-201912081451-1.csv'. + + :param dir: directory path + + See Also + -------- + stanfit.RunSet.save_csvfiles + cmdstanpy.from_csv + """ + self.runset.save_csvfiles(dir) + + # TODO(2.0): remove + @property + def mcmc_sample(self) -> Union[CmdStanMCMC, CmdStanMLE, CmdStanVB]: + get_logger().warning( + "Property `mcmc_sample` is deprecated, use `previous_fit` instead" + ) + return self.previous_fit diff --git a/.venv/lib/python3.12/site-packages/cmdstanpy/stanfit/laplace.py b/.venv/lib/python3.12/site-packages/cmdstanpy/stanfit/laplace.py new file mode 100644 index 00000000..741593e7 --- /dev/null +++ b/.venv/lib/python3.12/site-packages/cmdstanpy/stanfit/laplace.py @@ -0,0 +1,304 @@ +""" + Container for the result of running a laplace approximation. +""" + +from typing import ( + Any, + Dict, + Hashable, + List, + MutableMapping, + Optional, + Tuple, + Union, +) + +import numpy as np +import pandas as pd + +try: + import xarray as xr + + XARRAY_INSTALLED = True +except ImportError: + XARRAY_INSTALLED = False + +from cmdstanpy.cmdstan_args import Method +from cmdstanpy.utils.data_munging import build_xarray_data +from cmdstanpy.utils.stancsv import scan_generic_csv + +from .metadata import InferenceMetadata +from .mle import CmdStanMLE +from .runset import RunSet + +# TODO list: +# - docs and example notebook +# - make sure features like standalone GQ are updated/working + + +class CmdStanLaplace: + def __init__(self, runset: RunSet, mode: CmdStanMLE) -> None: + """Initialize object.""" + if not runset.method == Method.LAPLACE: + raise ValueError( + 'Wrong runset method, expecting laplace runset, ' + 'found method {}'.format(runset.method) + ) + self._runset = runset + self._mode = mode + + self._draws: np.ndarray = np.array(()) + + config = scan_generic_csv(runset.csv_files[0]) + self._metadata = InferenceMetadata(config) + + def _assemble_draws(self) -> None: + if self._draws.shape != (0,): + return + + with open(self._runset.csv_files[0], 'r') as fd: + while (fd.readline()).startswith("#"): + pass + self._draws = np.loadtxt( + fd, + dtype=float, + ndmin=2, + delimiter=',', + comments="#", + ) + + def stan_variable(self, var: str) -> np.ndarray: + """ + Return a numpy.ndarray which contains the estimates for the + for the named Stan program variable where the dimensions of the + numpy.ndarray match the shape of the Stan program variable. + + This functionaltiy is also available via a shortcut using ``.`` - + writing ``fit.a`` is a synonym for ``fit.stan_variable("a")`` + + :param var: variable name + + See Also + -------- + CmdStanMLE.stan_variables + CmdStanMCMC.stan_variable + CmdStanPathfinder.stan_variable + CmdStanVB.stan_variable + CmdStanGQ.stan_variable + """ + self._assemble_draws() + try: + out: np.ndarray = self._metadata.stan_vars[var].extract_reshape( + self._draws + ) + return out + except KeyError: + # pylint: disable=raise-missing-from + raise ValueError( + f'Unknown variable name: {var}\n' + 'Available variables are ' + + ", ".join(self._metadata.stan_vars.keys()) + ) + + def stan_variables(self) -> Dict[str, np.ndarray]: + """ + Return a dictionary mapping Stan program variables names + to the corresponding numpy.ndarray containing the inferred values. + + :param inc_warmup: When ``True`` and the warmup draws are present in + the MCMC sample, then the warmup draws are included. + Default value is ``False`` + + See Also + -------- + CmdStanGQ.stan_variable + CmdStanMCMC.stan_variables + CmdStanMLE.stan_variables + CmdStanPathfinder.stan_variables + CmdStanVB.stan_variables + """ + result = {} + for name in self._metadata.stan_vars: + result[name] = self.stan_variable(name) + return result + + def method_variables(self) -> Dict[str, np.ndarray]: + """ + Returns a dictionary of all sampler variables, i.e., all + output column names ending in `__`. Assumes that all variables + are scalar variables where column name is variable name. + Maps each column name to a numpy.ndarray (draws x chains x 1) + containing per-draw diagnostic values. + """ + self._assemble_draws() + return { + name: var.extract_reshape(self._draws) + for name, var in self._metadata.method_vars.items() + } + + def draws(self) -> np.ndarray: + """ + Return a numpy.ndarray containing the draws from the + approximate posterior distribution. This is a 2-D array + of shape (draws, parameters). + """ + self._assemble_draws() + return self._draws + + def draws_pd( + self, + vars: Union[List[str], str, None] = None, + ) -> pd.DataFrame: + if vars is not None: + if isinstance(vars, str): + vars_list = [vars] + else: + vars_list = vars + + self._assemble_draws() + cols = [] + if vars is not None: + for var in dict.fromkeys(vars_list): + if var in self._metadata.method_vars: + cols.append(var) + elif var in self._metadata.stan_vars: + info = self._metadata.stan_vars[var] + cols.extend( + self.column_names[info.start_idx : info.end_idx] + ) + else: + raise ValueError(f'Unknown variable: {var}') + + else: + cols = list(self.column_names) + + return pd.DataFrame(self._draws, columns=self.column_names)[cols] + + def draws_xr( + self, + vars: Union[str, List[str], None] = None, + ) -> "xr.Dataset": + """ + Returns the sampler draws as a xarray Dataset. + + :param vars: optional list of variable names. + + See Also + -------- + CmdStanMCMC.draws_xr + CmdStanGQ.draws_xr + """ + if not XARRAY_INSTALLED: + raise RuntimeError( + 'Package "xarray" is not installed, cannot produce draws array.' + ) + + if vars is None: + vars_list = list(self._metadata.stan_vars.keys()) + elif isinstance(vars, str): + vars_list = [vars] + else: + vars_list = vars + + self._assemble_draws() + + meta = self._metadata.cmdstan_config + attrs: MutableMapping[Hashable, Any] = { + "stan_version": f"{meta['stan_version_major']}." + f"{meta['stan_version_minor']}.{meta['stan_version_patch']}", + "model": meta["model"], + } + + data: MutableMapping[Hashable, Any] = {} + coordinates: MutableMapping[Hashable, Any] = { + "draw": np.arange(self._draws.shape[0]), + } + + for var in vars_list: + build_xarray_data( + data, + self._metadata.stan_vars[var], + self._draws[:, np.newaxis, :], + ) + return ( + xr.Dataset(data, coords=coordinates, attrs=attrs) + .transpose('draw', ...) + .squeeze() + ) + + @property + def mode(self) -> CmdStanMLE: + """ + Return the maximum a posteriori estimate (mode) + as a :class:`CmdStanMLE` object. + """ + return self._mode + + @property + def metadata(self) -> InferenceMetadata: + """ + Returns object which contains CmdStan configuration as well as + information about the names and structure of the inference method + and model output variables. + """ + return self._metadata + + def __repr__(self) -> str: + mode = '\n'.join( + ['\t' + line for line in repr(self.mode).splitlines()] + )[1:] + rep = 'CmdStanLaplace: model={} \nmode=({})\n{}'.format( + self._runset.model, + mode, + self._runset._args.method_args.compose(0, cmd=[]), + ) + rep = '{}\n csv_files:\n\t{}\n output_files:\n\t{}'.format( + rep, + '\n\t'.join(self._runset.csv_files), + '\n\t'.join(self._runset.stdout_files), + ) + return rep + + def __getattr__(self, attr: str) -> np.ndarray: + """Synonymous with ``fit.stan_variable(attr)""" + if attr.startswith("_"): + raise AttributeError(f"Unknown variable name {attr}") + try: + return self.stan_variable(attr) + except ValueError as e: + # pylint: disable=raise-missing-from + raise AttributeError(*e.args) + + def __getstate__(self) -> dict: + # This function returns the mapping of objects to serialize with pickle. + # See https://docs.python.org/3/library/pickle.html#object.__getstate__ + # for details. We call _assemble_draws to ensure posterior samples have + # been loaded prior to serialization. + self._assemble_draws() + return self.__dict__ + + @property + def column_names(self) -> Tuple[str, ...]: + """ + Names of all outputs from the sampler, comprising sampler parameters + and all components of all model parameters, transformed parameters, + and quantities of interest. Corresponds to Stan CSV file header row, + with names munged to array notation, e.g. `beta[1]` not `beta.1`. + """ + return self._metadata.cmdstan_config['column_names'] # type: ignore + + def save_csvfiles(self, dir: Optional[str] = None) -> None: + """ + Move output CSV files to specified directory. If files were + written to the temporary session directory, clean filename. + E.g., save 'bernoulli-201912081451-1-5nm6as7u.csv' as + 'bernoulli-201912081451-1.csv'. + + :param dir: directory path + + See Also + -------- + stanfit.RunSet.save_csvfiles + cmdstanpy.from_csv + """ + self._runset.save_csvfiles(dir) diff --git a/.venv/lib/python3.12/site-packages/cmdstanpy/stanfit/mcmc.py b/.venv/lib/python3.12/site-packages/cmdstanpy/stanfit/mcmc.py new file mode 100644 index 00000000..8c93c8e3 --- /dev/null +++ b/.venv/lib/python3.12/site-packages/cmdstanpy/stanfit/mcmc.py @@ -0,0 +1,826 @@ +""" +Container for the result of running the sample (MCMC) method +""" + +import math +import os +from io import StringIO +from typing import ( + Any, + Dict, + Hashable, + List, + MutableMapping, + Optional, + Sequence, + Tuple, + Union, +) + +import numpy as np +import pandas as pd + +try: + import xarray as xr + + XARRAY_INSTALLED = True +except ImportError: + XARRAY_INSTALLED = False + +from cmdstanpy import _CMDSTAN_SAMPLING, _CMDSTAN_THIN, _CMDSTAN_WARMUP, _TMPDIR +from cmdstanpy.cmdstan_args import Method, SamplerArgs +from cmdstanpy.utils import ( + EXTENSION, + build_xarray_data, + check_sampler_csv, + cmdstan_path, + cmdstan_version_before, + create_named_text_file, + do_command, + flatten_chains, + get_logger, +) + +from .metadata import InferenceMetadata +from .runset import RunSet + + +class CmdStanMCMC: + """ + Container for outputs from CmdStan sampler run. + Provides methods to summarize and diagnose the model fit + and accessor methods to access the entire sample or + individual items. Created by :meth:`CmdStanModel.sample` + + The sample is lazily instantiated on first access of either + the resulting sample or the HMC tuning parameters, i.e., the + step size and metric. + """ + + # pylint: disable=too-many-public-methods + def __init__( + self, + runset: RunSet, + ) -> None: + """Initialize object.""" + if not runset.method == Method.SAMPLE: + raise ValueError( + 'Wrong runset method, expecting sample runset, ' + 'found method {}'.format(runset.method) + ) + self.runset = runset + + # info from runset to be exposed + sampler_args = self.runset._args.method_args + assert isinstance( + sampler_args, SamplerArgs + ) # make the typechecker happy + self._iter_sampling: int = _CMDSTAN_SAMPLING + if sampler_args.iter_sampling is not None: + self._iter_sampling = sampler_args.iter_sampling + self._iter_warmup: int = _CMDSTAN_WARMUP + if sampler_args.iter_warmup is not None: + self._iter_warmup = sampler_args.iter_warmup + self._thin: int = _CMDSTAN_THIN + if sampler_args.thin is not None: + self._thin = sampler_args.thin + self._is_fixed_param = sampler_args.fixed_param + self._save_warmup: bool = sampler_args.save_warmup + self._sig_figs = runset._args.sig_figs + + # info from CSV values, instantiated lazily + self._draws: np.ndarray = np.array(()) + # only valid when not is_fixed_param + self._metric: np.ndarray = np.array(()) + self._step_size: np.ndarray = np.array(()) + self._divergences: np.ndarray = np.zeros(self.runset.chains, dtype=int) + self._max_treedepths: np.ndarray = np.zeros( + self.runset.chains, dtype=int + ) + + # info from CSV initial comments and header + config = self._validate_csv_files() + self._metadata: InferenceMetadata = InferenceMetadata(config) + if not self._is_fixed_param: + self._check_sampler_diagnostics() + + def __repr__(self) -> str: + repr = 'CmdStanMCMC: model={} chains={}{}'.format( + self.runset.model, + self.runset.chains, + self.runset._args.method_args.compose(0, cmd=[]), + ) + repr = '{}\n csv_files:\n\t{}\n output_files:\n\t{}'.format( + repr, + '\n\t'.join(self.runset.csv_files), + '\n\t'.join(self.runset.stdout_files), + ) + # TODO - hamiltonian, profiling files + return repr + + def __getattr__(self, attr: str) -> np.ndarray: + """Synonymous with ``fit.stan_variable(attr)""" + if attr.startswith("_"): + raise AttributeError(f"Unknown variable name {attr}") + try: + return self.stan_variable(attr) + except ValueError as e: + # pylint: disable=raise-missing-from + raise AttributeError(*e.args) + + def __getstate__(self) -> dict: + # This function returns the mapping of objects to serialize with pickle. + # See https://docs.python.org/3/library/pickle.html#object.__getstate__ + # for details. We call _assemble_draws to ensure posterior samples have + # been loaded prior to serialization. + self._assemble_draws() + return self.__dict__ + + @property + def chains(self) -> int: + """Number of chains.""" + return self.runset.chains + + @property + def chain_ids(self) -> List[int]: + """Chain ids.""" + return self.runset.chain_ids + + @property + def num_draws_warmup(self) -> int: + """Number of warmup draws per chain, i.e., thinned warmup iterations.""" + return int(math.ceil((self._iter_warmup) / self._thin)) + + @property + def num_draws_sampling(self) -> int: + """ + Number of sampling (post-warmup) draws per chain, i.e., + thinned sampling iterations. + """ + return int(math.ceil((self._iter_sampling) / self._thin)) + + @property + def metadata(self) -> InferenceMetadata: + """ + Returns object which contains CmdStan configuration as well as + information about the names and structure of the inference method + and model output variables. + """ + return self._metadata + + @property + def column_names(self) -> Tuple[str, ...]: + """ + Names of all outputs from the sampler, comprising sampler parameters + and all components of all model parameters, transformed parameters, + and quantities of interest. Corresponds to Stan CSV file header row, + with names munged to array notation, e.g. `beta[1]` not `beta.1`. + """ + return self._metadata.cmdstan_config['column_names'] # type: ignore + + @property + def metric_type(self) -> Optional[str]: + """ + Metric type used for adaptation, either 'diag_e' or 'dense_e', according + to CmdStan arg 'metric'. + When sampler algorithm 'fixed_param' is specified, metric_type is None. + """ + return ( + self._metadata.cmdstan_config['metric'] + if not self._is_fixed_param + else None + ) + + @property + def metric(self) -> Optional[np.ndarray]: + """ + Metric used by sampler for each chain. + When sampler algorithm 'fixed_param' is specified, metric is None. + """ + if self._is_fixed_param: + return None + if self._metadata.cmdstan_config['metric'] == 'unit_e': + get_logger().info( + 'Unit diagnonal metric, inverse mass matrix size unknown.' + ) + return None + self._assemble_draws() + return self._metric + + @property + def step_size(self) -> Optional[np.ndarray]: + """ + Step size used by sampler for each chain. + When sampler algorithm 'fixed_param' is specified, step size is None. + """ + self._assemble_draws() + return self._step_size if not self._is_fixed_param else None + + @property + def thin(self) -> int: + """ + Period between recorded iterations. (Default is 1). + """ + return self._thin + + @property + def divergences(self) -> Optional[np.ndarray]: + """ + Per-chain total number of post-warmup divergent iterations. + When sampler algorithm 'fixed_param' is specified, returns None. + """ + return self._divergences if not self._is_fixed_param else None + + @property + def max_treedepths(self) -> Optional[np.ndarray]: + """ + Per-chain total number of post-warmup iterations where the NUTS sampler + reached the maximum allowed treedepth. + When sampler algorithm 'fixed_param' is specified, returns None. + """ + return self._max_treedepths if not self._is_fixed_param else None + + def draws( + self, *, inc_warmup: bool = False, concat_chains: bool = False + ) -> np.ndarray: + """ + Returns a numpy.ndarray over all draws from all chains which is + stored column major so that the values for a parameter are contiguous + in memory, likewise all draws from a chain are contiguous. + By default, returns a 3D array arranged (draws, chains, columns); + parameter ``concat_chains=True`` will return a 2D array where all + chains are flattened into a single column, preserving chain order, + so that given M chains of N draws, the first N draws are from chain 1, + up through the last N draws from chain M. + + :param inc_warmup: When ``True`` and the warmup draws are present in + the output, i.e., the sampler was run with ``save_warmup=True``, + then the warmup draws are included. Default value is ``False``. + + :param concat_chains: When ``True`` return a 2D array flattening all + all draws from all chains. Default value is ``False``. + + See Also + -------- + CmdStanMCMC.draws_pd + CmdStanMCMC.draws_xr + CmdStanGQ.draws + """ + self._assemble_draws() + + if inc_warmup and not self._save_warmup: + get_logger().warning( + "Sample doesn't contain draws from warmup iterations," + ' rerun sampler with "save_warmup=True".' + ) + + start_idx = 0 + if not inc_warmup and self._save_warmup: + start_idx = self.num_draws_warmup + + if concat_chains: + return flatten_chains(self._draws[start_idx:, :, :]) + return self._draws[start_idx:, :, :] + + def _validate_csv_files(self) -> Dict[str, Any]: + """ + Checks that Stan CSV output files for all chains are consistent + and returns dict containing config and column names. + + Tabulates sampling iters which are divergent or at max treedepth + Raises exception when inconsistencies detected. + """ + dzero = {} + for i in range(self.chains): + if i == 0: + dzero = check_sampler_csv( + path=self.runset.csv_files[i], + is_fixed_param=self._is_fixed_param, + iter_sampling=self._iter_sampling, + iter_warmup=self._iter_warmup, + save_warmup=self._save_warmup, + thin=self._thin, + ) + if not self._is_fixed_param: + self._divergences[i] = dzero['ct_divergences'] + self._max_treedepths[i] = dzero['ct_max_treedepth'] + else: + drest = check_sampler_csv( + path=self.runset.csv_files[i], + is_fixed_param=self._is_fixed_param, + iter_sampling=self._iter_sampling, + iter_warmup=self._iter_warmup, + save_warmup=self._save_warmup, + thin=self._thin, + ) + for key in dzero: + # check args that matter for parsing, plus name, version + if ( + key + in [ + 'stan_version_major', + 'stan_version_minor', + 'stan_version_patch', + 'stanc_version', + 'model', + 'num_samples', + 'num_warmup', + 'save_warmup', + 'thin', + 'refresh', + ] + and dzero[key] != drest[key] + ): + raise ValueError( + 'CmdStan config mismatch in Stan CSV file {}: ' + 'arg {} is {}, expected {}'.format( + self.runset.csv_files[i], + key, + dzero[key], + drest[key], + ) + ) + if not self._is_fixed_param: + self._divergences[i] = drest['ct_divergences'] + self._max_treedepths[i] = drest['ct_max_treedepth'] + return dzero + + def _check_sampler_diagnostics(self) -> None: + """ + Warn if any iterations ended in divergences or hit maxtreedepth. + """ + if np.any(self._divergences) or np.any(self._max_treedepths): + diagnostics = ['Some chains may have failed to converge.'] + ct_iters = self._metadata.cmdstan_config['num_samples'] + for i in range(self.runset._chains): + if self._divergences[i] > 0: + diagnostics.append( + f'Chain {i + 1} had {self._divergences[i]} ' + 'divergent transitions ' + f'({((self._divergences[i]/ct_iters)*100):.1f}%)' + ) + if self._max_treedepths[i] > 0: + diagnostics.append( + f'Chain {i + 1} had {self._max_treedepths[i]} ' + 'iterations at max treedepth ' + f'({((self._max_treedepths[i]/ct_iters)*100):.1f}%)' + ) + diagnostics.append( + 'Use the "diagnose()" method on the CmdStanMCMC object' + ' to see further information.' + ) + get_logger().warning('\n\t'.join(diagnostics)) + + def _assemble_draws(self) -> None: + """ + Allocates and populates the step size, metric, and sample arrays + by parsing the validated stan_csv files. + """ + if self._draws.shape != (0,): + return + num_draws = self.num_draws_sampling + sampling_iter_start = 0 + if self._save_warmup: + num_draws += self.num_draws_warmup + sampling_iter_start = self.num_draws_warmup + self._draws = np.empty( + (num_draws, self.chains, len(self.column_names)), + dtype=float, + order='F', + ) + self._step_size = np.empty(self.chains, dtype=float) + for chain in range(self.chains): + with open(self.runset.csv_files[chain], 'r') as fd: + line = fd.readline().strip() + # read initial comments, CSV header row + while len(line) > 0 and line.startswith('#'): + line = fd.readline().strip() + if not self._is_fixed_param: + # handle warmup draws, if any + if self._save_warmup: + for i in range(self.num_draws_warmup): + line = fd.readline().strip() + xs = line.split(',') + self._draws[i, chain, :] = [float(x) for x in xs] + line = fd.readline().strip() + if line != '# Adaptation terminated': # shouldn't happen? + while line != '# Adaptation terminated': + line = fd.readline().strip() + # step_size, metric (diag_e and dense_e only) + line = fd.readline().strip() + _, step_size = line.split('=') + self._step_size[chain] = float(step_size.strip()) + if self._metadata.cmdstan_config['metric'] != 'unit_e': + line = fd.readline().strip() # metric type + line = fd.readline().lstrip(' #\t').rstrip() + num_unconstrained_params = len(line.split(',')) + if chain == 0: # can't allocate w/o num params + if self.metric_type == 'diag_e': + self._metric = np.empty( + (self.chains, num_unconstrained_params), + dtype=float, + ) + else: + self._metric = np.empty( + ( + self.chains, + num_unconstrained_params, + num_unconstrained_params, + ), + dtype=float, + ) + if line: + if self.metric_type == 'diag_e': + xs = line.split(',') + self._metric[chain, :] = [float(x) for x in xs] + else: + xs = line.strip().split(',') + self._metric[chain, 0, :] = [ + float(x) for x in xs + ] + for i in range(1, num_unconstrained_params): + line = fd.readline().lstrip(' #\t').rstrip() + xs = line.split(',') + self._metric[chain, i, :] = [ + float(x) for x in xs + ] + else: # unit_e changed in 2.34 to have an extra line + pos = fd.tell() + line = fd.readline().strip() + if not line.startswith('#'): + fd.seek(pos) + + # process draws + for i in range(sampling_iter_start, num_draws): + line = fd.readline().strip() + xs = line.split(',') + self._draws[i, chain, :] = [float(x) for x in xs] + assert self._draws is not None + + def summary( + self, + percentiles: Sequence[int] = (5, 50, 95), + sig_figs: int = 6, + ) -> pd.DataFrame: + """ + Run cmdstan/bin/stansummary over all output CSV files, assemble + summary into DataFrame object. The first row contains statistics + for the total joint log probability `lp__`, but is omitted when the + Stan model has no parameters. The remaining rows contain summary + statistics for all parameters, transformed parameters, and generated + quantities variables, in program declaration order. + + :param percentiles: Ordered non-empty sequence of percentiles to report. + Must be integers from (1, 99), inclusive. Defaults to + ``(5, 50, 95)`` + + :param sig_figs: Number of significant figures to report. + Must be an integer between 1 and 18. If unspecified, the default + precision for the system file I/O is used; the usual value is 6. + If precision above 6 is requested, sample must have been produced + by CmdStan version 2.25 or later and sampler output precision + must equal to or greater than the requested summary precision. + + :return: pandas.DataFrame + """ + if len(percentiles) == 0: + raise ValueError( + 'Invalid percentiles argument, must be ordered' + ' non-empty list from (1, 99), inclusive.' + ) + cur_pct = 0 + for pct in percentiles: + if pct > 99 or not pct > cur_pct: + raise ValueError( + 'Invalid percentiles spec, must be ordered' + ' non-empty list from (1, 99), inclusive.' + ) + cur_pct = pct + percentiles_str = ( + f"--percentiles= {','.join(str(x) for x in percentiles)}" + ) + + if not isinstance(sig_figs, int) or sig_figs < 1 or sig_figs > 18: + raise ValueError( + 'Keyword "sig_figs" must be an integer between 1 and 18,' + ' found {}'.format(sig_figs) + ) + csv_sig_figs = self._sig_figs or 6 + if sig_figs > csv_sig_figs: + get_logger().warning( + 'Requesting %d significant digits of output, but CSV files' + ' only have %d digits of precision.', + sig_figs, + csv_sig_figs, + ) + sig_figs_str = f'--sig_figs={sig_figs}' + cmd_path = os.path.join( + cmdstan_path(), 'bin', 'stansummary' + EXTENSION + ) + tmp_csv_file = 'stansummary-{}-'.format(self.runset._args.model_name) + tmp_csv_path = create_named_text_file( + dir=_TMPDIR, prefix=tmp_csv_file, suffix='.csv', name_only=True + ) + csv_str = '--csv_filename={}'.format(tmp_csv_path) + # TODO: remove at some future release + if cmdstan_version_before(2, 24): + csv_str = '--csv_file={}'.format(tmp_csv_path) + cmd = [ + cmd_path, + percentiles_str, + sig_figs_str, + csv_str, + ] + self.runset.csv_files + do_command(cmd, fd_out=None) + with open(tmp_csv_path, 'rb') as fd: + summary_data = pd.read_csv( + fd, + delimiter=',', + header=0, + index_col=0, + comment='#', + float_precision='high', + ) + mask = ( + [not x.endswith('__') for x in summary_data.index] + if self._is_fixed_param + else [ + x == 'lp__' or not x.endswith('__') for x in summary_data.index + ] + ) + summary_data.index.name = None + return summary_data[mask] + + def diagnose(self) -> Optional[str]: + """ + Run cmdstan/bin/diagnose over all output CSV files, + return console output. + + The diagnose utility reads the outputs of all chains + and checks for the following potential problems: + + + Transitions that hit the maximum treedepth + + Divergent transitions + + Low E-BFMI values (sampler transitions HMC potential energy) + + Low effective sample sizes + + High R-hat values + """ + cmd_path = os.path.join(cmdstan_path(), 'bin', 'diagnose' + EXTENSION) + cmd = [cmd_path] + self.runset.csv_files + result = StringIO() + do_command(cmd=cmd, fd_out=result) + return result.getvalue() + + def draws_pd( + self, + vars: Union[List[str], str, None] = None, + inc_warmup: bool = False, + ) -> pd.DataFrame: + """ + Returns the sample draws as a pandas DataFrame. + Flattens all chains into single column. Container variables + (array, vector, matrix) will span multiple columns, one column + per element. E.g. variable 'matrix[2,2] foo' spans 4 columns: + 'foo[1,1], ... foo[2,2]'. + + :param vars: optional list of variable names. + + :param inc_warmup: When ``True`` and the warmup draws are present in + the output, i.e., the sampler was run with ``save_warmup=True``, + then the warmup draws are included. Default value is ``False``. + + See Also + -------- + CmdStanMCMC.draws + CmdStanMCMC.draws_xr + CmdStanGQ.draws_pd + """ + if vars is not None: + if isinstance(vars, str): + vars_list = [vars] + else: + vars_list = vars + + if inc_warmup and not self._save_warmup: + get_logger().warning( + 'Draws from warmup iterations not available,' + ' must run sampler with "save_warmup=True".' + ) + + self._assemble_draws() + cols = [] + if vars is not None: + for var in dict.fromkeys(vars_list): + if var in self._metadata.method_vars: + cols.append(var) + elif var in self._metadata.stan_vars: + info = self._metadata.stan_vars[var] + cols.extend( + self.column_names[info.start_idx : info.end_idx] + ) + elif var in ['chain__', 'iter__', 'draw__']: + cols.append(var) + else: + raise ValueError(f'Unknown variable: {var}') + else: + cols = ['chain__', 'iter__', 'draw__'] + list(self.column_names) + + draws = self.draws(inc_warmup=inc_warmup) + # add long-form columns for chain, iteration, draw + n_draws, n_chains, _ = draws.shape + chains_col = ( + np.repeat(np.arange(1, n_chains + 1), n_draws) + .reshape(1, n_chains, n_draws) + .T + ) + iter_col = ( + np.tile(np.arange(1, n_draws + 1), n_chains) + .reshape(1, n_chains, n_draws) + .T + ) + draw_col = ( + np.arange(1, (n_draws * n_chains) + 1) + .reshape(1, n_chains, n_draws) + .T + ) + draws = np.concatenate([chains_col, iter_col, draw_col, draws], axis=2) + + return pd.DataFrame( + data=flatten_chains(draws), + columns=['chain__', 'iter__', 'draw__'] + list(self.column_names), + )[cols] + + def draws_xr( + self, vars: Union[str, List[str], None] = None, inc_warmup: bool = False + ) -> "xr.Dataset": + """ + Returns the sampler draws as a xarray Dataset. + + :param vars: optional list of variable names. + + :param inc_warmup: When ``True`` and the warmup draws are present in + the output, i.e., the sampler was run with ``save_warmup=True``, + then the warmup draws are included. Default value is ``False``. + + See Also + -------- + CmdStanMCMC.draws + CmdStanMCMC.draws_pd + CmdStanGQ.draws_xr + """ + if not XARRAY_INSTALLED: + raise RuntimeError( + 'Package "xarray" is not installed, cannot produce draws array.' + ) + if inc_warmup and not self._save_warmup: + get_logger().warning( + "Draws from warmup iterations not available," + ' must run sampler with "save_warmup=True".' + ) + if vars is None: + vars_list = list(self._metadata.stan_vars.keys()) + elif isinstance(vars, str): + vars_list = [vars] + else: + vars_list = vars + + self._assemble_draws() + + num_draws = self.num_draws_sampling + meta = self._metadata.cmdstan_config + attrs: MutableMapping[Hashable, Any] = { + "stan_version": f"{meta['stan_version_major']}." + f"{meta['stan_version_minor']}.{meta['stan_version_patch']}", + "model": meta["model"], + "num_draws_sampling": num_draws, + } + if inc_warmup and self._save_warmup: + num_draws += self.num_draws_warmup + attrs["num_draws_warmup"] = self.num_draws_warmup + + data: MutableMapping[Hashable, Any] = {} + coordinates: MutableMapping[Hashable, Any] = { + "chain": self.chain_ids, + "draw": np.arange(num_draws), + } + + for var in vars_list: + build_xarray_data( + data, + self._metadata.stan_vars[var], + self.draws(inc_warmup=inc_warmup), + ) + return xr.Dataset(data, coords=coordinates, attrs=attrs).transpose( + 'chain', 'draw', ... + ) + + def stan_variable( + self, + var: str, + inc_warmup: bool = False, + ) -> np.ndarray: + """ + Return a numpy.ndarray which contains the set of draws + for the named Stan program variable. Flattens the chains, + leaving the draws in chain order. The first array dimension, + corresponds to number of draws or post-warmup draws in the sample, + per argument ``inc_warmup``. The remaining dimensions correspond to + the shape of the Stan program variable. + + Underlyingly draws are in chain order, i.e., for a sample with + N chains of M draws each, the first M array elements are from chain 1, + the next M are from chain 2, and the last M elements are from chain N. + + * If the variable is a scalar variable, the return array has shape + ( draws * chains, 1). + * If the variable is a vector, the return array has shape + ( draws * chains, len(vector)) + * If the variable is a matrix, the return array has shape + ( draws * chains, size(dim 1), size(dim 2) ) + * If the variable is an array with N dimensions, the return array + has shape ( draws * chains, size(dim 1), ..., size(dim N)) + + For example, if the Stan program variable ``theta`` is a 3x3 matrix, + and the sample consists of 4 chains with 1000 post-warmup draws, + this function will return a numpy.ndarray with shape (4000,3,3). + + This functionaltiy is also available via a shortcut using ``.`` - + writing ``fit.a`` is a synonym for ``fit.stan_variable("a")`` + + :param var: variable name + + :param inc_warmup: When ``True`` and the warmup draws are present in + the output, i.e., the sampler was run with ``save_warmup=True``, + then the warmup draws are included. Default value is ``False``. + + See Also + -------- + CmdStanMCMC.stan_variables + CmdStanMLE.stan_variable + CmdStanPathfinder.stan_variable + CmdStanVB.stan_variable + CmdStanGQ.stan_variable + CmdStanLaplace.stan_variable + """ + try: + draws = self.draws(inc_warmup=inc_warmup, concat_chains=True) + out: np.ndarray = self._metadata.stan_vars[var].extract_reshape( + draws + ) + return out + except KeyError: + # pylint: disable=raise-missing-from + raise ValueError( + f'Unknown variable name: {var}\n' + 'Available variables are ' + + ", ".join(self._metadata.stan_vars.keys()) + ) + + def stan_variables(self) -> Dict[str, np.ndarray]: + """ + Return a dictionary mapping Stan program variables names + to the corresponding numpy.ndarray containing the inferred values. + + See Also + -------- + CmdStanMCMC.stan_variable + CmdStanMLE.stan_variables + CmdStanPathfinder.stan_variables + CmdStanVB.stan_variables + CmdStanGQ.stan_variables + CmdStanLaplace.stan_variables + """ + result = {} + for name in self._metadata.stan_vars: + result[name] = self.stan_variable(name) + return result + + def method_variables(self) -> Dict[str, np.ndarray]: + """ + Returns a dictionary of all sampler variables, i.e., all + output column names ending in `__`. Assumes that all variables + are scalar variables where column name is variable name. + Maps each column name to a numpy.ndarray (draws x chains x 1) + containing per-draw diagnostic values. + """ + self._assemble_draws() + return { + name: var.extract_reshape(self._draws) + for name, var in self._metadata.method_vars.items() + } + + def save_csvfiles(self, dir: Optional[str] = None) -> None: + """ + Move output CSV files to specified directory. If files were + written to the temporary session directory, clean filename. + E.g., save 'bernoulli-201912081451-1-5nm6as7u.csv' as + 'bernoulli-201912081451-1.csv'. + + :param dir: directory path + + See Also + -------- + stanfit.RunSet.save_csvfiles + cmdstanpy.from_csv + """ + self.runset.save_csvfiles(dir) diff --git a/.venv/lib/python3.12/site-packages/cmdstanpy/stanfit/metadata.py b/.venv/lib/python3.12/site-packages/cmdstanpy/stanfit/metadata.py new file mode 100644 index 00000000..4869f2a0 --- /dev/null +++ b/.venv/lib/python3.12/site-packages/cmdstanpy/stanfit/metadata.py @@ -0,0 +1,53 @@ +"""Container for metadata parsed from the output of a CmdStan run""" + +import copy +from typing import Any, Dict + +import stanio + + +class InferenceMetadata: + """ + CmdStan configuration and contents of output file parsed out of + the Stan CSV file header comments and column headers. + Assumes valid CSV files. + """ + + def __init__(self, config: Dict[str, Any]) -> None: + """Initialize object from CSV headers""" + self._cmdstan_config = config + vars = stanio.parse_header(config['raw_header']) + + self._method_vars = { + k: v for (k, v) in vars.items() if k.endswith('__') + } + self._stan_vars = { + k: v for (k, v) in vars.items() if not k.endswith('__') + } + + def __repr__(self) -> str: + return 'Metadata:\n{}\n'.format(self._cmdstan_config) + + @property + def cmdstan_config(self) -> Dict[str, Any]: + """ + Returns a dictionary containing a set of name, value pairs + parsed out of the Stan CSV file header. These include the + command configuration and the CSV file header row information. + Uses deepcopy for immutability. + """ + return copy.deepcopy(self._cmdstan_config) + + @property + def method_vars(self) -> Dict[str, stanio.Variable]: + """ + Method variable names always end in `__`, e.g. `lp__`. + """ + return self._method_vars + + @property + def stan_vars(self) -> Dict[str, stanio.Variable]: + """ + These are the user-defined variables in the Stan program. + """ + return self._stan_vars diff --git a/.venv/lib/python3.12/site-packages/cmdstanpy/stanfit/mle.py b/.venv/lib/python3.12/site-packages/cmdstanpy/stanfit/mle.py new file mode 100644 index 00000000..3a50ba10 --- /dev/null +++ b/.venv/lib/python3.12/site-packages/cmdstanpy/stanfit/mle.py @@ -0,0 +1,284 @@ +"""Container for the result of running optimization""" + +from collections import OrderedDict +from typing import Dict, Optional, Tuple, Union + +import numpy as np +import pandas as pd + +from cmdstanpy.cmdstan_args import Method, OptimizeArgs +from cmdstanpy.utils import get_logger, scan_optimize_csv + +from .metadata import InferenceMetadata +from .runset import RunSet + + +class CmdStanMLE: + """ + Container for outputs from CmdStan optimization. + Created by :meth:`CmdStanModel.optimize`. + """ + + def __init__(self, runset: RunSet) -> None: + """Initialize object.""" + if not runset.method == Method.OPTIMIZE: + raise ValueError( + 'Wrong runset method, expecting optimize runset, ' + 'found method {}'.format(runset.method) + ) + self.runset = runset + # info from runset to be exposed + self.converged = runset._check_retcodes() + optimize_args = self.runset._args.method_args + assert isinstance( + optimize_args, OptimizeArgs + ) # make the typechecker happy + self._save_iterations: bool = optimize_args.save_iterations + self._set_mle_attrs(runset.csv_files[0]) + + def __repr__(self) -> str: + repr = 'CmdStanMLE: model={}{}'.format( + self.runset.model, self.runset._args.method_args.compose(0, cmd=[]) + ) + repr = '{}\n csv_file:\n\t{}\n output_file:\n\t{}'.format( + repr, + '\n\t'.join(self.runset.csv_files), + '\n\t'.join(self.runset.stdout_files), + ) + if not self.converged: + repr = '{}\n Warning: invalid estimate, '.format(repr) + repr = '{} optimization failed to converge.'.format(repr) + return repr + + def __getattr__(self, attr: str) -> Union[np.ndarray, float]: + """Synonymous with ``fit.stan_variable(attr)""" + if attr.startswith("_"): + raise AttributeError(f"Unknown variable name {attr}") + try: + return self.stan_variable(attr) + except ValueError as e: + # pylint: disable=raise-missing-from + raise AttributeError(*e.args) + + def _set_mle_attrs(self, sample_csv_0: str) -> None: + meta = scan_optimize_csv(sample_csv_0, self._save_iterations) + self._metadata = InferenceMetadata(meta) + self._column_names: Tuple[str, ...] = meta['column_names'] + self._mle: np.ndarray = meta['mle'] + if self._save_iterations: + self._all_iters: np.ndarray = meta['all_iters'] + + @property + def column_names(self) -> Tuple[str, ...]: + """ + Names of estimated quantities, includes joint log probability, + and all parameters, transformed parameters, and generated quantities. + """ + return self._column_names + + @property + def metadata(self) -> InferenceMetadata: + """ + Returns object which contains CmdStan configuration as well as + information about the names and structure of the inference method + and model output variables. + """ + return self._metadata + + @property + def optimized_params_np(self) -> np.ndarray: + """ + Returns all final estimates from the optimizer as a numpy.ndarray + which contains all optimizer outputs, i.e., the value for `lp__` + as well as all Stan program variables. + """ + if not self.converged: + get_logger().warning( + 'Invalid estimate, optimization failed to converge.' + ) + return self._mle + + @property + def optimized_iterations_np(self) -> Optional[np.ndarray]: + """ + Returns all saved iterations from the optimizer and final estimate + as a numpy.ndarray which contains all optimizer outputs, i.e., + the value for `lp__` as well as all Stan program variables. + + """ + if not self._save_iterations: + get_logger().warning( + 'Intermediate iterations not saved to CSV output file. ' + 'Rerun the optimize method with "save_iterations=True".' + ) + return None + if not self.converged: + get_logger().warning( + 'Invalid estimate, optimization failed to converge.' + ) + return self._all_iters + + @property + def optimized_params_pd(self) -> pd.DataFrame: + """ + Returns all final estimates from the optimizer as a pandas.DataFrame + which contains all optimizer outputs, i.e., the value for `lp__` + as well as all Stan program variables. + """ + if not self.runset._check_retcodes(): + get_logger().warning( + 'Invalid estimate, optimization failed to converge.' + ) + return pd.DataFrame([self._mle], columns=self.column_names) + + @property + def optimized_iterations_pd(self) -> Optional[pd.DataFrame]: + """ + Returns all saved iterations from the optimizer and final estimate + as a pandas.DataFrame which contains all optimizer outputs, i.e., + the value for `lp__` as well as all Stan program variables. + + """ + if not self._save_iterations: + get_logger().warning( + 'Intermediate iterations not saved to CSV output file. ' + 'Rerun the optimize method with "save_iterations=True".' + ) + return None + if not self.converged: + get_logger().warning( + 'Invalid estimate, optimization failed to converge.' + ) + return pd.DataFrame(self._all_iters, columns=self.column_names) + + @property + def optimized_params_dict(self) -> Dict[str, np.float64]: + """ + Returns all estimates from the optimizer, including `lp__` as a + Python Dict. Only returns estimate from final iteration. + """ + if not self.runset._check_retcodes(): + get_logger().warning( + 'Invalid estimate, optimization failed to converge.' + ) + return OrderedDict(zip(self.column_names, self._mle)) + + def stan_variable( + self, + var: str, + *, + inc_iterations: bool = False, + warn: bool = True, + ) -> Union[np.ndarray, float]: + """ + Return a numpy.ndarray which contains the estimates for the + for the named Stan program variable where the dimensions of the + numpy.ndarray match the shape of the Stan program variable. + + This functionaltiy is also available via a shortcut using ``.`` - + writing ``fit.a`` is a synonym for ``fit.stan_variable("a")`` + + :param var: variable name + + :param inc_iterations: When ``True`` and the intermediate estimates + are included in the output, i.e., the optimizer was run with + ``save_iterations=True``, then intermediate estimates are included. + Default value is ``False``. + + See Also + -------- + CmdStanMLE.stan_variables + CmdStanMCMC.stan_variable + CmdStanPathfinder.stan_variable + CmdStanVB.stan_variable + CmdStanGQ.stan_variable + CmdStanLaplace.stan_variable + """ + if var not in self._metadata.stan_vars: + raise ValueError( + f'Unknown variable name: {var}\n' + 'Available variables are ' + ", ".join(self._metadata.stan_vars) + ) + if warn and inc_iterations and not self._save_iterations: + get_logger().warning( + 'Intermediate iterations not saved to CSV output file. ' + 'Rerun the optimize method with "save_iterations=True".' + ) + if warn and not self.runset._check_retcodes(): + get_logger().warning( + 'Invalid estimate, optimization failed to converge.' + ) + if inc_iterations and self._save_iterations: + data = self._all_iters + else: + data = self._mle + + try: + out: np.ndarray = self._metadata.stan_vars[var].extract_reshape( + data + ) + # TODO(2.0) remove + if out.shape == () or out.shape == (1,): + get_logger().warning( + "The default behavior of CmdStanMLE.stan_variable() " + "will change in a future release to always return a " + "numpy.ndarray, even for scalar variables." + ) + return out.item() # type: ignore + return out + except KeyError: + # pylint: disable=raise-missing-from + raise ValueError( + f'Unknown variable name: {var}\n' + 'Available variables are ' + + ", ".join(self._metadata.stan_vars.keys()) + ) + + def stan_variables( + self, inc_iterations: bool = False + ) -> Dict[str, Union[np.ndarray, float]]: + """ + Return a dictionary mapping Stan program variables names + to the corresponding numpy.ndarray containing the inferred values. + + :param inc_iterations: When ``True`` and the intermediate estimates + are included in the output, i.e., the optimizer was run with + ``save_iterations=True``, then intermediate estimates are included. + Default value is ``False``. + + + See Also + -------- + CmdStanMLE.stan_variable + CmdStanMCMC.stan_variables + CmdStanPathfinder.stan_variables + CmdStanVB.stan_variables + CmdStanGQ.stan_variables + CmdStanLaplace.stan_variables + """ + if not self.runset._check_retcodes(): + get_logger().warning( + 'Invalid estimate, optimization failed to converge.' + ) + result = {} + for name in self._metadata.stan_vars: + result[name] = self.stan_variable( + name, inc_iterations=inc_iterations, warn=False + ) + return result + + def save_csvfiles(self, dir: Optional[str] = None) -> None: + """ + Move output CSV files to specified directory. If files were + written to the temporary session directory, clean filename. + E.g., save 'bernoulli-201912081451-1-5nm6as7u.csv' as + 'bernoulli-201912081451-1.csv'. + + :param dir: directory path + + See Also + -------- + stanfit.RunSet.save_csvfiles + cmdstanpy.from_csv + """ + self.runset.save_csvfiles(dir) diff --git a/.venv/lib/python3.12/site-packages/cmdstanpy/stanfit/pathfinder.py b/.venv/lib/python3.12/site-packages/cmdstanpy/stanfit/pathfinder.py new file mode 100644 index 00000000..8e63f85f --- /dev/null +++ b/.venv/lib/python3.12/site-packages/cmdstanpy/stanfit/pathfinder.py @@ -0,0 +1,237 @@ +""" +Container for the result of running Pathfinder. +""" + +from typing import Dict, List, Optional, Tuple, Union + +import numpy as np + +from cmdstanpy.cmdstan_args import Method +from cmdstanpy.stanfit.metadata import InferenceMetadata +from cmdstanpy.stanfit.runset import RunSet +from cmdstanpy.utils.stancsv import scan_generic_csv + + +class CmdStanPathfinder: + """ + Container for outputs from the Pathfinder algorithm. + Created by :meth:`CmdStanModel.pathfinder()`. + """ + + def __init__(self, runset: RunSet): + """Initialize object.""" + if not runset.method == Method.PATHFINDER: + raise ValueError( + 'Wrong runset method, expecting Pathfinder runset, ' + 'found method {}'.format(runset.method) + ) + self._runset = runset + + self._draws: np.ndarray = np.array(()) + + config = scan_generic_csv(runset.csv_files[0]) + self._metadata = InferenceMetadata(config) + + def create_inits( + self, seed: Optional[int] = None, chains: int = 4 + ) -> Union[List[Dict[str, np.ndarray]], Dict[str, np.ndarray]]: + """ + Create initial values for the parameters of the model + by randomly selecting draws from the Pathfinder approximation. + + :param seed: Used for random selection, defaults to None + :param chains: Number of initial values to return, defaults to 4 + :return: The initial values for the parameters of the model. + + If ``chains`` is 1, a dictionary is returned, otherwise a list + of dictionaries is returned, in the format expected for the + ``inits`` argument. of :meth:`CmdStanModel.sample`. + """ + self._assemble_draws() + rng = np.random.default_rng(seed) + idxs = rng.choice(self._draws.shape[0], size=chains, replace=False) + if chains == 1: + draw = self._draws[idxs[0]] + return { + name: var.extract_reshape(draw) + for name, var in self._metadata.stan_vars.items() + } + else: + return [ + { + name: var.extract_reshape(self._draws[idx]) + for name, var in self._metadata.stan_vars.items() + } + for idx in idxs + ] + + def __repr__(self) -> str: + rep = 'CmdStanPathfinder: model={}{}'.format( + self._runset.model, + self._runset._args.method_args.compose(0, cmd=[]), + ) + rep = '{}\n csv_files:\n\t{}\n output_files:\n\t{}'.format( + rep, + '\n\t'.join(self._runset.csv_files), + '\n\t'.join(self._runset.stdout_files), + ) + return rep + + # below this is identical to same functions in Laplace + def _assemble_draws(self) -> None: + if self._draws.shape != (0,): + return + + with open(self._runset.csv_files[0], 'r') as fd: + while (fd.readline()).startswith("#"): + pass + self._draws = np.loadtxt( + fd, + dtype=float, + ndmin=2, + delimiter=',', + comments="#", + ) + + def stan_variable(self, var: str) -> np.ndarray: + """ + Return a numpy.ndarray which contains the estimates for the + for the named Stan program variable where the dimensions of the + numpy.ndarray match the shape of the Stan program variable. + + This functionaltiy is also available via a shortcut using ``.`` - + writing ``fit.a`` is a synonym for ``fit.stan_variable("a")`` + + :param var: variable name + + See Also + -------- + CmdStanPathfinder.stan_variables + CmdStanMLE.stan_variable + CmdStanMCMC.stan_variable + CmdStanVB.stan_variable + CmdStanGQ.stan_variable + CmdStanLaplace.stan_variable + """ + self._assemble_draws() + try: + out: np.ndarray = self._metadata.stan_vars[var].extract_reshape( + self._draws + ) + return out + except KeyError: + # pylint: disable=raise-missing-from + raise ValueError( + f'Unknown variable name: {var}\n' + 'Available variables are ' + + ", ".join(self._metadata.stan_vars.keys()) + ) + + def stan_variables(self) -> Dict[str, np.ndarray]: + """ + Return a dictionary mapping Stan program variables names + to the corresponding numpy.ndarray containing the inferred values. + + See Also + -------- + CmdStanPathfinder.stan_variable + CmdStanMCMC.stan_variables + CmdStanMLE.stan_variables + CmdStanVB.stan_variables + CmdStanGQ.stan_variables + CmdStanLaplace.stan_variables + """ + result = {} + for name in self._metadata.stan_vars: + result[name] = self.stan_variable(name) + return result + + def method_variables(self) -> Dict[str, np.ndarray]: + """ + Returns a dictionary of all sampler variables, i.e., all + output column names ending in `__`. Assumes that all variables + are scalar variables where column name is variable name. + Maps each column name to a numpy.ndarray (draws x chains x 1) + containing per-draw diagnostic values. + """ + self._assemble_draws() + return { + name: var.extract_reshape(self._draws) + for name, var in self._metadata.method_vars.items() + } + + def draws(self) -> np.ndarray: + """ + Return a numpy.ndarray containing the draws from the + approximate posterior distribution. This is a 2-D array + of shape (draws, parameters). + """ + self._assemble_draws() + return self._draws + + def __getattr__(self, attr: str) -> np.ndarray: + """Synonymous with ``fit.stan_variable(attr)""" + if attr.startswith("_"): + raise AttributeError(f"Unknown variable name {attr}") + try: + return self.stan_variable(attr) + except ValueError as e: + # pylint: disable=raise-missing-from + raise AttributeError(*e.args) + + def __getstate__(self) -> dict: + # This function returns the mapping of objects to serialize with pickle. + # See https://docs.python.org/3/library/pickle.html#object.__getstate__ + # for details. We call _assemble_draws to ensure posterior samples have + # been loaded prior to serialization. + self._assemble_draws() + return self.__dict__ + + @property + def metadata(self) -> InferenceMetadata: + """ + Returns object which contains CmdStan configuration as well as + information about the names and structure of the inference method + and model output variables. + """ + return self._metadata + + @property + def column_names(self) -> Tuple[str, ...]: + """ + Names of all outputs from the sampler, comprising sampler parameters + and all components of all model parameters, transformed parameters, + and quantities of interest. Corresponds to Stan CSV file header row, + with names munged to array notation, e.g. `beta[1]` not `beta.1`. + """ + return self._metadata.cmdstan_config['column_names'] # type: ignore + + @property + def is_resampled(self) -> bool: + """ + Returns True if the draws were resampled from several Pathfinder + approximations, False otherwise. + """ + return ( # type: ignore + self._metadata.cmdstan_config.get("num_paths", 4) > 1 + and self._metadata.cmdstan_config.get('psis_resample', 1) + in (1, 'true') + and self._metadata.cmdstan_config.get('calculate_lp', 1) + in (1, 'true') + ) + + def save_csvfiles(self, dir: Optional[str] = None) -> None: + """ + Move output CSV files to specified directory. If files were + written to the temporary session directory, clean filename. + E.g., save 'bernoulli-201912081451-1-5nm6as7u.csv' as + 'bernoulli-201912081451-1.csv'. + + :param dir: directory path + + See Also + -------- + stanfit.RunSet.save_csvfiles + cmdstanpy.from_csv + """ + self._runset.save_csvfiles(dir) diff --git a/.venv/lib/python3.12/site-packages/cmdstanpy/stanfit/runset.py b/.venv/lib/python3.12/site-packages/cmdstanpy/stanfit/runset.py new file mode 100644 index 00000000..de11a461 --- /dev/null +++ b/.venv/lib/python3.12/site-packages/cmdstanpy/stanfit/runset.py @@ -0,0 +1,307 @@ +""" +Container for the information used in a generic CmdStan run, +such as file locations +""" + +import os +import re +import shutil +import tempfile +from datetime import datetime +from time import time +from typing import List, Optional + +from cmdstanpy import _TMPDIR +from cmdstanpy.cmdstan_args import CmdStanArgs, Method +from cmdstanpy.utils import get_logger + + +class RunSet: + """ + Encapsulates the configuration and results of a call to any CmdStan + inference method. Records the method return code and locations of + all console, error, and output files. + + RunSet objects are instantiated by the CmdStanModel class inference methods + which validate all inputs, therefore "__init__" method skips input checks. + """ + + def __init__( + self, + args: CmdStanArgs, + chains: int = 1, + *, + chain_ids: Optional[List[int]] = None, + time_fmt: str = "%Y%m%d%H%M%S", + one_process_per_chain: bool = True, + ) -> None: + """Initialize object (no input arg checks).""" + self._args = args + self._chains = chains + self._one_process_per_chain = one_process_per_chain + if one_process_per_chain: + self._num_procs = chains + else: + self._num_procs = 1 + self._retcodes = [-1 for _ in range(self._num_procs)] + self._timeout_flags = [False for _ in range(self._num_procs)] + if chain_ids is None: + chain_ids = [i + 1 for i in range(chains)] + self._chain_ids = chain_ids + + if args.output_dir is not None: + self._output_dir = args.output_dir + else: + # make a per-run subdirectory of our master temp directory + self._output_dir = tempfile.mkdtemp( + prefix=args.model_name, dir=_TMPDIR + ) + + # output files prefix: ``-_`` + self._base_outfile = ( + f'{args.model_name}-{datetime.now().strftime(time_fmt)}' + ) + # per-process outputs + self._stdout_files = [''] * self._num_procs + self._profile_files = [''] * self._num_procs # optional + if one_process_per_chain: + for i in range(chains): + self._stdout_files[i] = self.file_path("-stdout.txt", id=i) + if args.save_profile: + self._profile_files[i] = self.file_path( + ".csv", extra="-profile", id=chain_ids[i] + ) + else: + self._stdout_files[0] = self.file_path("-stdout.txt") + if args.save_profile: + self._profile_files[0] = self.file_path( + ".csv", extra="-profile" + ) + + # per-chain output files + self._csv_files: List[str] = [''] * chains + self._diagnostic_files = [''] * chains # optional + + if chains == 1: + self._csv_files[0] = self.file_path(".csv") + if args.save_latent_dynamics: + self._diagnostic_files[0] = self.file_path( + ".csv", extra="-diagnostic" + ) + else: + for i in range(chains): + self._csv_files[i] = self.file_path(".csv", id=chain_ids[i]) + if args.save_latent_dynamics: + self._diagnostic_files[i] = self.file_path( + ".csv", extra="-diagnostic", id=chain_ids[i] + ) + + def __repr__(self) -> str: + repr = 'RunSet: chains={}, chain_ids={}, num_processes={}'.format( + self._chains, self._chain_ids, self._num_procs + ) + repr = '{}\n cmd (chain 1):\n\t{}'.format(repr, self.cmd(0)) + repr = '{}\n retcodes={}'.format(repr, self._retcodes) + repr = f'{repr}\n per-chain output files (showing chain 1 only):' + repr = '{}\n csv_file:\n\t{}'.format(repr, self._csv_files[0]) + if self._args.save_latent_dynamics: + repr = '{}\n diagnostics_file:\n\t{}'.format( + repr, self._diagnostic_files[0] + ) + if self._args.save_profile: + repr = '{}\n profile_file:\n\t{}'.format( + repr, self._profile_files[0] + ) + repr = '{}\n console_msgs (if any):\n\t{}'.format( + repr, self._stdout_files[0] + ) + return repr + + @property + def model(self) -> str: + """Stan model name.""" + return self._args.model_name + + @property + def method(self) -> Method: + """CmdStan method used to generate this fit.""" + return self._args.method + + @property + def num_procs(self) -> int: + """Number of processes run.""" + return self._num_procs + + @property + def one_process_per_chain(self) -> bool: + """ + When True, for each chain, call CmdStan in its own subprocess. + When False, use CmdStan's `num_chains` arg to run parallel chains. + Always True if CmdStan < 2.28. + For CmdStan 2.28 and up, `sample` method determines value. + """ + return self._one_process_per_chain + + @property + def chains(self) -> int: + """Number of chains.""" + return self._chains + + @property + def chain_ids(self) -> List[int]: + """Chain ids.""" + return self._chain_ids + + def cmd(self, idx: int) -> List[str]: + """ + Assemble CmdStan invocation. + When running parallel chains from single process (2.28 and up), + specify CmdStan arg `num_chains` and leave chain idx off CSV files. + """ + if self._one_process_per_chain: + return self._args.compose_command( + idx, + csv_file=self.csv_files[idx], + diagnostic_file=self.diagnostic_files[idx] + if self._args.save_latent_dynamics + else None, + profile_file=self.profile_files[idx] + if self._args.save_profile + else None, + ) + else: + return self._args.compose_command( + idx, + csv_file=self.file_path('.csv'), + diagnostic_file=self.file_path(".csv", extra="-diagnostic") + if self._args.save_latent_dynamics + else None, + profile_file=self.file_path(".csv", extra="-profile") + if self._args.save_profile + else None, + ) + + @property + def csv_files(self) -> List[str]: + """List of paths to CmdStan output files.""" + return self._csv_files + + @property + def stdout_files(self) -> List[str]: + """ + List of paths to transcript of CmdStan messages sent to the console. + Transcripts include config information, progress, and error messages. + """ + return self._stdout_files + + def _check_retcodes(self) -> bool: + """Returns ``True`` when all chains have retcode 0.""" + for code in self._retcodes: + if code != 0: + return False + return True + + @property + def diagnostic_files(self) -> List[str]: + """List of paths to CmdStan hamiltonian diagnostic files.""" + return self._diagnostic_files + + @property + def profile_files(self) -> List[str]: + """List of paths to CmdStan profiler files.""" + return self._profile_files + + # pylint: disable=invalid-name + def file_path( + self, suffix: str, *, extra: str = "", id: Optional[int] = None + ) -> str: + if id is not None: + suffix = f"_{id}{suffix}" + file = os.path.join( + self._output_dir, f"{self._base_outfile}{extra}{suffix}" + ) + return file + + def _retcode(self, idx: int) -> int: + """Get retcode for process[idx].""" + return self._retcodes[idx] + + def _set_retcode(self, idx: int, val: int) -> None: + """Set retcode at process[idx] to val.""" + self._retcodes[idx] = val + + def _set_timeout_flag(self, idx: int, val: bool) -> None: + """Set timeout_flag at process[idx] to val.""" + self._timeout_flags[idx] = val + + def get_err_msgs(self) -> str: + """Checks console messages for each CmdStan run.""" + msgs = [] + for i in range(self._num_procs): + if ( + os.path.exists(self._stdout_files[i]) + and os.stat(self._stdout_files[i]).st_size > 0 + ): + if self._args.method == Method.OPTIMIZE: + msgs.append('console log output:\n') + with open(self._stdout_files[0], 'r') as fd: + msgs.append(fd.read()) + else: + with open(self._stdout_files[i], 'r') as fd: + contents = fd.read() + # pattern matches initial "Exception" or "Error" msg + pat = re.compile(r'^E[rx].*$', re.M) + errors = re.findall(pat, contents) + if len(errors) > 0: + msgs.append('\n\t'.join(errors)) + return '\n'.join(msgs) + + def save_csvfiles(self, dir: Optional[str] = None) -> None: + """ + Moves CSV files to specified directory. + + :param dir: directory path + + See Also + -------- + cmdstanpy.from_csv + """ + if dir is None: + dir = os.path.realpath('.') + test_path = os.path.join(dir, str(time())) + try: + os.makedirs(dir, exist_ok=True) + with open(test_path, 'w'): + pass + os.remove(test_path) # cleanup + except (IOError, OSError, PermissionError) as exc: + raise RuntimeError('Cannot save to path: {}'.format(dir)) from exc + + for i in range(self.chains): + if not os.path.exists(self._csv_files[i]): + raise ValueError( + 'Cannot access CSV file {}'.format(self._csv_files[i]) + ) + + to_path = os.path.join(dir, os.path.basename(self._csv_files[i])) + if os.path.exists(to_path): + raise ValueError( + 'File exists, not overwriting: {}'.format(to_path) + ) + try: + get_logger().debug( + 'saving tmpfile: "%s" as: "%s"', self._csv_files[i], to_path + ) + shutil.move(self._csv_files[i], to_path) + self._csv_files[i] = to_path + except (IOError, OSError, PermissionError) as e: + raise ValueError( + 'Cannot save to file: {}'.format(to_path) + ) from e + + def raise_for_timeouts(self) -> None: + if any(self._timeout_flags): + raise TimeoutError( + f"{sum(self._timeout_flags)} of {self.num_procs} processes " + "timed out" + ) diff --git a/.venv/lib/python3.12/site-packages/cmdstanpy/stanfit/vb.py b/.venv/lib/python3.12/site-packages/cmdstanpy/stanfit/vb.py new file mode 100644 index 00000000..102f292c --- /dev/null +++ b/.venv/lib/python3.12/site-packages/cmdstanpy/stanfit/vb.py @@ -0,0 +1,240 @@ +"""Container for the results of running autodiff variational inference""" + +from collections import OrderedDict +from typing import Dict, Optional, Tuple, Union + +import numpy as np +import pandas as pd + +from cmdstanpy.cmdstan_args import Method +from cmdstanpy.utils import scan_variational_csv +from cmdstanpy.utils.logging import get_logger + +from .metadata import InferenceMetadata +from .runset import RunSet + + +class CmdStanVB: + """ + Container for outputs from CmdStan variational run. + Created by :meth:`CmdStanModel.variational`. + """ + + def __init__(self, runset: RunSet) -> None: + """Initialize object.""" + if not runset.method == Method.VARIATIONAL: + raise ValueError( + 'Wrong runset method, expecting variational inference, ' + 'found method {}'.format(runset.method) + ) + self.runset = runset + self._set_variational_attrs(runset.csv_files[0]) + + def __repr__(self) -> str: + repr = 'CmdStanVB: model={}{}'.format( + self.runset.model, self.runset._args.method_args.compose(0, cmd=[]) + ) + repr = '{}\n csv_file:\n\t{}\n output_file:\n\t{}'.format( + repr, + '\n\t'.join(self.runset.csv_files), + '\n\t'.join(self.runset.stdout_files), + ) + # TODO - diagnostic, profiling files + return repr + + def __getattr__(self, attr: str) -> Union[np.ndarray, float]: + """Synonymous with ``fit.stan_variable(attr)""" + if attr.startswith("_"): + raise AttributeError(f"Unknown variable name {attr}") + try: + return self.stan_variable(attr) + except ValueError as e: + # pylint: disable=raise-missing-from + raise AttributeError(*e.args) + + def _set_variational_attrs(self, sample_csv_0: str) -> None: + meta = scan_variational_csv(sample_csv_0) + self._metadata = InferenceMetadata(meta) + # these three assignments don't grant type information + self._column_names: Tuple[str, ...] = meta['column_names'] + self._eta: float = meta['eta'] + self._variational_mean: np.ndarray = meta['variational_mean'] + self._variational_sample: np.ndarray = meta['variational_sample'] + + @property + def columns(self) -> int: + """ + Total number of information items returned by sampler. + Includes approximation information and names of model parameters + and computed quantities. + """ + return len(self._column_names) + + @property + def column_names(self) -> Tuple[str, ...]: + """ + Names of information items returned by sampler for each draw. + Includes approximation information and names of model parameters + and computed quantities. + """ + return self._column_names + + @property + def eta(self) -> float: + """ + Step size scaling parameter 'eta' + """ + return self._eta + + @property + def variational_params_np(self) -> np.ndarray: + """ + Returns inferred parameter means as numpy array. + """ + return self._variational_mean + + @property + def variational_params_pd(self) -> pd.DataFrame: + """ + Returns inferred parameter means as pandas DataFrame. + """ + return pd.DataFrame([self._variational_mean], columns=self.column_names) + + @property + def variational_params_dict(self) -> Dict[str, np.ndarray]: + """Returns inferred parameter means as Dict.""" + return OrderedDict(zip(self.column_names, self._variational_mean)) + + @property + def metadata(self) -> InferenceMetadata: + """ + Returns object which contains CmdStan configuration as well as + information about the names and structure of the inference method + and model output variables. + """ + return self._metadata + + def stan_variable( + self, var: str, *, mean: Optional[bool] = None + ) -> Union[np.ndarray, float]: + """ + Return a numpy.ndarray which contains the estimates for the + for the named Stan program variable where the dimensions of the + numpy.ndarray match the shape of the Stan program variable, with + a leading axis added for the number of draws from the variational + approximation. + + * If the variable is a scalar variable, the return array has shape + ( draws, ). + * If the variable is a vector, the return array has shape + ( draws, len(vector)) + * If the variable is a matrix, the return array has shape + ( draws, size(dim 1), size(dim 2) ) + * If the variable is an array with N dimensions, the return array + has shape ( draws, size(dim 1), ..., size(dim N)) + + This functionaltiy is also available via a shortcut using ``.`` - + writing ``fit.a`` is a synonym for ``fit.stan_variable("a")`` + + :param var: variable name + + :param mean: if True, return the variational mean. Otherwise, + return the variational sample. The default behavior will + change in a future release to return the variational sample. + + See Also + -------- + CmdStanVB.stan_variables + CmdStanMCMC.stan_variable + CmdStanMLE.stan_variable + CmdStanPathfinder.stan_variable + CmdStanGQ.stan_variable + CmdStanLaplace.stan_variable + """ + # TODO(2.0): remove None case, make default `False` + if mean is None: + get_logger().warning( + "The default behavior of CmdStanVB.stan_variable() " + "will change in a future release to return the " + "variational sample, rather than the mean.\n" + "To maintain the current behavior, pass the argument " + "mean=True" + ) + mean = True + if mean: + draws = self._variational_mean + else: + draws = self._variational_sample + + try: + out: np.ndarray = self._metadata.stan_vars[var].extract_reshape( + draws + ) + # TODO(2.0): remove + if out.shape == () or out.shape == (1,): + if mean: + get_logger().warning( + "The default behavior of " + "CmdStanVB.stan_variable(mean=True) will change in a " + "future release to always return a numpy.ndarray, even " + "for scalar variables." + ) + return out.item() # type: ignore + return out + except KeyError: + # pylint: disable=raise-missing-from + raise ValueError( + f'Unknown variable name: {var}\n' + 'Available variables are ' + + ", ".join(self._metadata.stan_vars.keys()) + ) + + def stan_variables( + self, *, mean: Optional[bool] = None + ) -> Dict[str, Union[np.ndarray, float]]: + """ + Return a dictionary mapping Stan program variables names + to the corresponding numpy.ndarray containing the inferred values. + + See Also + -------- + CmdStanVB.stan_variable + CmdStanMCMC.stan_variables + CmdStanMLE.stan_variables + CmdStanGQ.stan_variables + CmdStanPathfinder.stan_variables + CmdStanLaplace.stan_variables + """ + result = {} + for name in self._metadata.stan_vars: + result[name] = self.stan_variable(name, mean=mean) + return result + + @property + def variational_sample(self) -> np.ndarray: + """Returns the set of approximate posterior output draws.""" + return self._variational_sample + + @property + def variational_sample_pd(self) -> pd.DataFrame: + """ + Returns the set of approximate posterior output draws as + a pandas DataFrame. + """ + return pd.DataFrame(self._variational_sample, columns=self.column_names) + + def save_csvfiles(self, dir: Optional[str] = None) -> None: + """ + Move output CSV files to specified directory. If files were + written to the temporary session directory, clean filename. + E.g., save 'bernoulli-201912081451-1-5nm6as7u.csv' as + 'bernoulli-201912081451-1.csv'. + + :param dir: directory path + + See Also + -------- + stanfit.RunSet.save_csvfiles + cmdstanpy.from_csv + """ + self.runset.save_csvfiles(dir) diff --git a/.venv/lib/python3.12/site-packages/cmdstanpy/utils/__init__.py b/.venv/lib/python3.12/site-packages/cmdstanpy/utils/__init__.py new file mode 100644 index 00000000..9b2da413 --- /dev/null +++ b/.venv/lib/python3.12/site-packages/cmdstanpy/utils/__init__.py @@ -0,0 +1,147 @@ +""" +Utility functions +""" +import os +import platform +import sys + +from .cmdstan import ( + EXTENSION, + cmdstan_path, + cmdstan_version, + cmdstan_version_before, + cxx_toolchain_path, + get_latest_cmdstan, + install_cmdstan, + set_cmdstan_path, + set_make_env, + validate_cmdstan_path, + validate_dir, + wrap_url_progress_hook, +) +from .command import do_command, returncode_msg +from .data_munging import build_xarray_data, flatten_chains +from .filesystem import ( + SanitizedOrTmpFilePath, + create_named_text_file, + pushd, + windows_short_path, +) +from .json import write_stan_json +from .logging import get_logger +from .stancsv import ( + check_sampler_csv, + parse_rdump_value, + read_metric, + rload, + scan_column_names, + scan_config, + scan_hmc_params, + scan_optimize_csv, + scan_sampler_csv, + scan_sampling_iters, + scan_variational_csv, + scan_warmup_iters, +) + + +def show_versions(output: bool = True) -> str: + """Prints out system and dependency information for debugging""" + + import importlib + import locale + import struct + + deps_info = [] + try: + (sysname, _, release, _, machine, processor) = platform.uname() + deps_info.extend( + [ + ("python", sys.version), + ("python-bits", struct.calcsize("P") * 8), + ("OS", f"{sysname}"), + ("OS-release", f"{release}"), + ("machine", f"{machine}"), + ("processor", f"{processor}"), + ("byteorder", f"{sys.byteorder}"), + ("LC_ALL", f'{os.environ.get("LC_ALL", "None")}'), + ("LANG", f'{os.environ.get("LANG", "None")}'), + ("LOCALE", f"{locale.getlocale()}"), + ] + ) + # pylint: disable=broad-except + except Exception: + pass + + try: + deps_info.append(('cmdstan_folder', cmdstan_path())) + deps_info.append(('cmdstan', str(cmdstan_version()))) + # pylint: disable=broad-except + except Exception: + deps_info.append(('cmdstan', 'NOT FOUND')) + + deps = ['cmdstanpy', 'pandas', 'xarray', 'tqdm', 'numpy'] + for module in deps: + try: + if module in sys.modules: + mod = sys.modules[module] + else: + mod = importlib.import_module(module) + # pylint: disable=broad-except + except Exception: + deps_info.append((module, None)) + else: + try: + ver = mod.__version__ # type: ignore + deps_info.append((module, ver)) + # pylint: disable=broad-except + except Exception: + deps_info.append((module, "installed")) + + out = 'INSTALLED VERSIONS\n---------------------\n' + for k, info in deps_info: + out += f'{k}: {info}\n' + if output: + print(out) + return " " + else: + return out + + +__all__ = [ + 'EXTENSION', + 'SanitizedOrTmpFilePath', + 'build_xarray_data', + 'check_sampler_csv', + 'cmdstan_path', + 'cmdstan_version', + 'cmdstan_version_before', + 'create_named_text_file', + 'cxx_toolchain_path', + 'do_command', + 'flatten_chains', + 'get_latest_cmdstan', + 'get_logger', + 'install_cmdstan', + 'parse_rdump_value', + 'pushd', + 'read_metric', + 'returncode_msg', + 'rload', + 'scan_column_names', + 'scan_config', + 'scan_hmc_params', + 'scan_optimize_csv', + 'scan_sampler_csv', + 'scan_sampling_iters', + 'scan_variational_csv', + 'scan_warmup_iters', + 'set_cmdstan_path', + 'set_make_env', + 'show_versions', + 'validate_cmdstan_path', + 'validate_dir', + 'windows_short_path', + 'wrap_url_progress_hook', + 'write_stan_json', +] diff --git a/.venv/lib/python3.12/site-packages/cmdstanpy/utils/__pycache__/__init__.cpython-312.pyc b/.venv/lib/python3.12/site-packages/cmdstanpy/utils/__pycache__/__init__.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..4fc8531a3008fdc474ab577a477dd6a3b85db82a GIT binary patch literal 4074 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 literal 0 HcmV?d00001 diff --git a/.venv/lib/python3.12/site-packages/cmdstanpy/utils/__pycache__/command.cpython-312.pyc b/.venv/lib/python3.12/site-packages/cmdstanpy/utils/__pycache__/command.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..157fae5139504b59b8dfe6d25dc7f7ac292efd8b GIT binary patch literal 4034 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 literal 0 HcmV?d00001 diff --git a/.venv/lib/python3.12/site-packages/cmdstanpy/utils/__pycache__/data_munging.cpython-312.pyc b/.venv/lib/python3.12/site-packages/cmdstanpy/utils/__pycache__/data_munging.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..52219519d8975e3f0de9d80bb718a54d4c0af296 GIT binary patch literal 2372 zcma)7-D^}w6rZ^tyEk`}Y~p7$8mE4wU8~vFAVLgkXkrC124Y1P%677MHo5VBEOYOg z>>4FlK~q}nLt9g%G<|Bse)!Ob2nGLuzGNF|!mWjZFZFFpgj%0^=I*Z1sL;9GnKLuz zoH=LC@0|Iip+QH`o+LjS`9neIftb{qRwb5y1L8U|Pzo8?kSuIVDan>ovaO^PEY@U8 zO+~^nnu;0@kHJi#0i=c?16eJpR-th5HmO(^U|SQ5aGpq=D`?+ zUxt5q4Xj>A{?ok)G%7vAS0!&%_YHjZ0787Puhw`BX;kQ1)&8%(n%>%Y3BUY&Llyyf z#hxPeieS-&S4pdaS7@a%xx3t3Uj20#Mj)a=~@h{`)g)%Y>fA0g*2 z5W}=RF5G=6BKuHK0X~|*f$DOD@q`-47IOks;E)CSX=>$JALlL)A^=dE`a!e;QkIZ; zL`Z7@)iig zR>3p9WXCz?oJ(5fP%>BWM_i|~rC^n(e3veTbAm( z7VCRT^*#5S)_!_?aow)cx?KxR?aQ*%(6}rsalMR`I=x(vnpzj*q!cGJ&87H`nX`-S z2TJV+=5VRKs}%2=Jhl|y{LDVgV;dG@ZKYV-j5hnm{I<@y&iPo|LhSIoa(EdGLV+S2 z=m=zhQVzpZY5_N zYO_7WqC?E`_7DnKJtyGi5lAHpNDT`k<%Lk*AE7=OGa;RZ7|DB(KEMU(sB54ofW&!ApQ9d8BLO02=lG%G&Y`?%8R?4g=@1LumYboLcc|kj*Xu&V4(J~Lg&t3$`Sk;({U>kZ>9t?C zeAzOs&+MATGv2)oZ^G)op786#);8RqhyHQJk%VmCW(Pn-j#@xX)?E zPgirA6W~ZFyak5PY`$5DXn;-OoEPdQ9}rS;qxl8fc>?&i!tb4g4ooetL9gwDEKuq{ zQy10`{Pf<>opavZi+3(A9PGch|0FCeG!2xLfyra#2&!vd(qfBRYe{RJes@9JSytr@ zk;&exYp=CTwOs1w8$oBHA&92ahMP&JgNR=cuOAn<=fZ6+o~J+!AJ0H?azR9t3eydu zjuE0GtOkJ$pb50o)!H4}d=rJ*D}HI+wrk`qc8Cjnh+OfmKv$MA#(zr^R{n_~+*v~V z9-uY9qlR*%2_L~T(zp6IP$dLC%YQ81EG~z1xjl{}OM1(6%gp}S^|RjXcV@?LZkyYF zclVv$^NHTlj=uR#eI@;9Sq8p8>*Ck8O>HZyK*NPJHeE|irOHt;(@;czR0mXO=zr`_ BL#hA( literal 0 HcmV?d00001 diff --git a/.venv/lib/python3.12/site-packages/cmdstanpy/utils/__pycache__/filesystem.cpython-312.pyc b/.venv/lib/python3.12/site-packages/cmdstanpy/utils/__pycache__/filesystem.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..54afa6a7ad21061a630bb559c4692ea5fd09045b GIT binary patch literal 11194 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 b6?eq><>NmYd4FWZ)19b$>MlMei~9cq1{1mJ literal 0 HcmV?d00001 diff --git a/.venv/lib/python3.12/site-packages/cmdstanpy/utils/cmdstan.py b/.venv/lib/python3.12/site-packages/cmdstanpy/utils/cmdstan.py new file mode 100644 index 00000000..2577b352 --- /dev/null +++ b/.venv/lib/python3.12/site-packages/cmdstanpy/utils/cmdstan.py @@ -0,0 +1,554 @@ +""" +Utilities for finding and installing CmdStan +""" +import os +import platform +import subprocess +import sys +from collections import OrderedDict +from typing import Callable, Dict, Optional, Tuple, Union + +from tqdm.auto import tqdm + +from cmdstanpy import _DOT_CMDSTAN + +from .. import progress as progbar +from .logging import get_logger + +EXTENSION = '.exe' if platform.system() == 'Windows' else '' + + +def determine_linux_arch() -> str: + machine = platform.machine() + arch = "" + if machine == "aarch64": + arch = "arm64" + elif machine == "armv7l": + # Telling armel and armhf apart is nontrivial + # c.f. https://forums.raspberrypi.com/viewtopic.php?t=20873 + readelf = subprocess.run( + ["readelf", "-A", "/proc/self/exe"], + check=True, + stdout=subprocess.PIPE, + text=True, + ) + if "Tag_ABI_VFP_args" in readelf.stdout: + arch = "armel" + else: + arch = "armhf" + elif machine == "mips64": + arch = "mips64el" + elif machine == "ppc64el" or machine == "ppc64le": + arch = "ppc64el" + elif machine == "s390x": + arch = "s390x" + return arch + + +def get_download_url(version: str) -> str: + arch = os.environ.get("CMDSTAN_ARCH", "") + if not arch and platform.system() == "Linux": + arch = determine_linux_arch() + + if arch and arch.lower() != "false": + url_end = f'v{version}/cmdstan-{version}-linux-{arch}.tar.gz' + else: + url_end = f'v{version}/cmdstan-{version}.tar.gz' + + return f'https://github.com/stan-dev/cmdstan/releases/download/{url_end}' + + +def validate_dir(install_dir: str) -> None: + """Check that specified install directory exists, can write.""" + if not os.path.exists(install_dir): + try: + os.makedirs(install_dir) + except (IOError, OSError, PermissionError) as e: + raise ValueError( + 'Cannot create directory: {}'.format(install_dir) + ) from e + else: + if not os.path.isdir(install_dir): + raise ValueError( + 'File exists, should be a directory: {}'.format(install_dir) + ) + try: + with open('tmp_test_w', 'w'): + pass + os.remove('tmp_test_w') # cleanup + except OSError as e: + raise ValueError( + 'Cannot write files to directory {}'.format(install_dir) + ) from e + + +def get_latest_cmdstan(cmdstan_dir: str) -> Optional[str]: + """ + Given a valid directory path, find all installed CmdStan versions + and return highest (i.e., latest) version number. + + Assumes directory consists of CmdStan releases, created by + function `install_cmdstan`, and therefore dirnames have format + "cmdstan-.." or "cmdstan-..-rc", + which is CmdStan release practice as of v 2.24. + """ + versions = [ + name[8:] + for name in os.listdir(cmdstan_dir) + if os.path.isdir(os.path.join(cmdstan_dir, name)) + and name.startswith('cmdstan-') + ] + if len(versions) == 0: + return None + if len(versions) == 1: + return 'cmdstan-' + versions[0] + # we can only compare numeric versions + versions = [v for v in versions if v[0].isdigit() and v.count('.') == 2] + # munge rc for sort, e.g. 2.25.0-rc1 -> 2.25.-99 + for i in range(len(versions)): # # pylint: disable=C0200 + if '-rc' in versions[i]: + comps = versions[i].split('-rc') + mmp = comps[0].split('.') + rc_num = comps[1] + patch = str(int(rc_num) - 100) + versions[i] = '.'.join([mmp[0], mmp[1], patch]) + + versions.sort(key=lambda s: list(map(int, s.split('.')))) + latest = versions[len(versions) - 1] + + # unmunge as needed + mmp = latest.split('.') + if int(mmp[2]) < 0: + rc_num = str(int(mmp[2]) + 100) + mmp[2] = "0-rc" + rc_num + latest = '.'.join(mmp) + + return 'cmdstan-' + latest + + +def validate_cmdstan_path(path: str) -> None: + """ + Validate that CmdStan directory exists and binaries have been built. + Throws exception if specified path is invalid. + """ + if not os.path.isdir(path): + raise ValueError(f'No CmdStan directory, path {path} does not exist.') + if not os.path.exists(os.path.join(path, 'bin', 'stanc' + EXTENSION)): + raise ValueError( + f'CmdStan installataion missing binaries in {path}/bin. ' + 'Re-install cmdstan by running command "install_cmdstan ' + '--overwrite", or Python code "import cmdstanpy; ' + 'cmdstanpy.install_cmdstan(overwrite=True)"' + ) + + +def set_cmdstan_path(path: str) -> None: + """ + Validate, then set CmdStan directory path. + """ + validate_cmdstan_path(path) + os.environ['CMDSTAN'] = path + + +def set_make_env(make: str) -> None: + """ + set MAKE environmental variable. + """ + os.environ['MAKE'] = make + + +def cmdstan_path() -> str: + """ + Validate, then return CmdStan directory path. + """ + cmdstan = '' + if 'CMDSTAN' in os.environ and len(os.environ['CMDSTAN']) > 0: + cmdstan = os.environ['CMDSTAN'] + else: + cmdstan_dir = os.path.expanduser(os.path.join('~', _DOT_CMDSTAN)) + if not os.path.exists(cmdstan_dir): + raise ValueError( + 'No CmdStan installation found, run command "install_cmdstan"' + 'or (re)activate your conda environment!' + ) + latest_cmdstan = get_latest_cmdstan(cmdstan_dir) + if latest_cmdstan is None: + raise ValueError( + 'No CmdStan installation found, run command "install_cmdstan"' + 'or (re)activate your conda environment!' + ) + cmdstan = os.path.join(cmdstan_dir, latest_cmdstan) + os.environ['CMDSTAN'] = cmdstan + validate_cmdstan_path(cmdstan) + return os.path.normpath(cmdstan) + + +def cmdstan_version() -> Optional[Tuple[int, ...]]: + """ + Parses version string out of CmdStan makefile variable CMDSTAN_VERSION, + returns Tuple(Major, minor). + + If CmdStan installation is not found or cannot parse version from makefile + logs warning and returns None. Lenient behavoir required for CI tests, + per comment: + https://github.com/stan-dev/cmdstanpy/pull/321#issuecomment-733817554 + """ + try: + makefile = os.path.join(cmdstan_path(), 'makefile') + except ValueError as e: + get_logger().info('No CmdStan installation found.') + get_logger().debug("%s", e) + return None + + if not os.path.exists(makefile): + get_logger().info( + 'CmdStan installation %s missing makefile, cannot get version.', + cmdstan_path(), + ) + return None + + with open(makefile, 'r') as fd: + contents = fd.read() + + start_idx = contents.find('CMDSTAN_VERSION := ') + if start_idx < 0: + get_logger().info( + 'Cannot parse version from makefile: %s.', + makefile, + ) + return None + + start_idx += len('CMDSTAN_VERSION := ') + end_idx = contents.find('\n', start_idx) + + version = contents[start_idx:end_idx] + splits = version.split('.') + if len(splits) != 3: + get_logger().info( + 'Cannot parse version, expected "..", ' + 'found: "%s".', + version, + ) + return None + return tuple(int(x) for x in splits[0:2]) + + +def cmdstan_version_before( + major: int, minor: int, info: Optional[Dict[str, str]] = None +) -> bool: + """ + Check that CmdStan version is less than Major.minor version. + + :param major: Major version number + :param minor: Minor version number + + :return: True if version at or above major.minor, else False. + """ + cur_version = None + if info is None or 'stan_version_major' not in info: + cur_version = cmdstan_version() + else: + cur_version = ( + int(info['stan_version_major']), + int(info['stan_version_minor']), + ) + if cur_version is None: + get_logger().info( + 'Cannot determine whether version is before %d.%d.', major, minor + ) + return False + if cur_version[0] < major or ( + cur_version[0] == major and cur_version[1] < minor + ): + return True + return False + + +def cxx_toolchain_path( + version: Optional[str] = None, install_dir: Optional[str] = None +) -> Tuple[str, ...]: + """ + Validate, then activate C++ toolchain directory path. + """ + if platform.system() != 'Windows': + raise RuntimeError( + 'Functionality is currently only supported on Windows' + ) + if version is not None and not isinstance(version, str): + raise TypeError('Format version number as a string') + logger = get_logger() + if 'CMDSTAN_TOOLCHAIN' in os.environ: + toolchain_root = os.environ['CMDSTAN_TOOLCHAIN'] + if os.path.exists(os.path.join(toolchain_root, 'mingw64')): + compiler_path = os.path.join( + toolchain_root, + 'mingw64' if (sys.maxsize > 2**32) else 'mingw32', + 'bin', + ) + if os.path.exists(compiler_path): + tool_path = os.path.join(toolchain_root, 'usr', 'bin') + if not os.path.exists(tool_path): + tool_path = '' + compiler_path = '' + logger.warning( + 'Found invalid installion for RTools40 on %s', + toolchain_root, + ) + toolchain_root = '' + else: + compiler_path = '' + logger.warning( + 'Found invalid installion for RTools40 on %s', + toolchain_root, + ) + toolchain_root = '' + + elif os.path.exists(os.path.join(toolchain_root, 'mingw_64')): + compiler_path = os.path.join( + toolchain_root, + 'mingw_64' if (sys.maxsize > 2**32) else 'mingw_32', + 'bin', + ) + if os.path.exists(compiler_path): + tool_path = os.path.join(toolchain_root, 'bin') + if not os.path.exists(tool_path): + tool_path = '' + compiler_path = '' + logger.warning( + 'Found invalid installion for RTools35 on %s', + toolchain_root, + ) + toolchain_root = '' + else: + compiler_path = '' + logger.warning( + 'Found invalid installion for RTools35 on %s', + toolchain_root, + ) + toolchain_root = '' + else: + rtools40_home = os.environ.get('RTOOLS40_HOME') + cmdstan_dir = os.path.expanduser(os.path.join('~', _DOT_CMDSTAN)) + for toolchain_root in ( + ([rtools40_home] if rtools40_home is not None else []) + + ( + [ + os.path.join(install_dir, 'RTools40'), + os.path.join(install_dir, 'RTools35'), + os.path.join(install_dir, 'RTools30'), + os.path.join(install_dir, 'RTools'), + ] + if install_dir is not None + else [] + ) + + [ + os.path.join(cmdstan_dir, 'RTools40'), + os.path.join(os.path.abspath("/"), "RTools40"), + os.path.join(cmdstan_dir, 'RTools35'), + os.path.join(os.path.abspath("/"), "RTools35"), + os.path.join(cmdstan_dir, 'RTools'), + os.path.join(os.path.abspath("/"), "RTools"), + os.path.join(os.path.abspath("/"), "RBuildTools"), + ] + ): + compiler_path = '' + tool_path = '' + + if os.path.exists(toolchain_root): + if version not in ('35', '3.5', '3'): + compiler_path = os.path.join( + toolchain_root, + 'mingw64' if (sys.maxsize > 2**32) else 'mingw32', + 'bin', + ) + if os.path.exists(compiler_path): + tool_path = os.path.join(toolchain_root, 'usr', 'bin') + if not os.path.exists(tool_path): + tool_path = '' + compiler_path = '' + logger.warning( + 'Found invalid installation for RTools40 on %s', + toolchain_root, + ) + toolchain_root = '' + else: + break + else: + compiler_path = '' + logger.warning( + 'Found invalid installation for RTools40 on %s', + toolchain_root, + ) + toolchain_root = '' + else: + compiler_path = os.path.join( + toolchain_root, + 'mingw_64' if (sys.maxsize > 2**32) else 'mingw_32', + 'bin', + ) + if os.path.exists(compiler_path): + tool_path = os.path.join(toolchain_root, 'bin') + if not os.path.exists(tool_path): + tool_path = '' + compiler_path = '' + logger.warning( + 'Found invalid installation for RTools35 on %s', + toolchain_root, + ) + toolchain_root = '' + else: + break + else: + compiler_path = '' + logger.warning( + 'Found invalid installation for RTools35 on %s', + toolchain_root, + ) + toolchain_root = '' + else: + toolchain_root = '' + + if not toolchain_root: + raise ValueError( + 'no RTools toolchain installation found, ' + 'run command line script ' + '"python -m cmdstanpy.install_cxx_toolchain"' + ) + logger.info('Add C++ toolchain to $PATH: %s', toolchain_root) + os.environ['PATH'] = ';'.join( + list( + OrderedDict.fromkeys( + [compiler_path, tool_path] + os.getenv('PATH', '').split(';') + ) + ) + ) + return compiler_path, tool_path + + +def install_cmdstan( + version: Optional[str] = None, + dir: Optional[str] = None, + overwrite: bool = False, + compiler: bool = False, + progress: bool = False, + verbose: bool = False, + cores: int = 1, + *, + interactive: bool = False, +) -> bool: + """ + Download and install a CmdStan release from GitHub. Downloads the release + tar.gz file to temporary storage. Retries GitHub requests in order + to allow for transient network outages. Builds CmdStan executables + and tests the compiler by building example model ``bernoulli.stan``. + + :param version: CmdStan version string, e.g. "2.29.2". + Defaults to latest CmdStan release. + If ``git`` is installed, a git tag or branch of stan-dev/cmdstan + can be specified, e.g. "git:develop". + + :param dir: Path to install directory. Defaults to hidden directory + ``$HOME/.cmdstan``. + If no directory is specified and the above directory does not + exist, directory ``$HOME/.cmdstan`` will be created and populated. + + :param overwrite: Boolean value; when ``True``, will overwrite and + rebuild an existing CmdStan installation. Default is ``False``. + + :param compiler: Boolean value; when ``True`` on WINDOWS ONLY, use the + C++ compiler from the ``install_cxx_toolchain`` command or install + one if none is found. + + :param progress: Boolean value; when ``True``, show a progress bar for + downloading and unpacking CmdStan. Default is ``False``. + + :param verbose: Boolean value; when ``True``, show console output from all + intallation steps, i.e., download, build, and test CmdStan release. + Default is ``False``. + :param cores: Integer, number of cores to use in the ``make`` command. + Default is 1 core. + + :param interactive: Boolean value; if true, ignore all other arguments + to this function and run in an interactive mode, prompting the user + to provide the other information manually through the standard input. + + This flag should only be used in interactive environments, + e.g. on the command line. + + :return: Boolean value; ``True`` for success. + """ + logger = get_logger() + try: + from ..install_cmdstan import ( + InstallationSettings, + InteractiveSettings, + run_install, + ) + + args: Union[InstallationSettings, InteractiveSettings] + + if interactive: + if any( + [ + version, + dir, + overwrite, + compiler, + progress, + verbose, + cores != 1, + ] + ): + logger.warning( + "Interactive installation requested but other arguments" + " were used.\n\tThese values will be ignored!" + ) + args = InteractiveSettings() + else: + args = InstallationSettings( + version=version, + overwrite=overwrite, + verbose=verbose, + compiler=compiler, + progress=progress, + dir=dir, + cores=cores, + ) + run_install(args) + # pylint: disable=broad-except + except Exception as e: + logger.warning('CmdStan installation failed.\n%s', str(e)) + return False + + if 'git:' in args.version: + folder = f"cmdstan-{args.version.replace(':', '-').replace('/', '_')}" + else: + folder = f"cmdstan-{args.version}" + set_cmdstan_path(os.path.join(args.dir, folder)) + + return True + + +@progbar.wrap_callback +def wrap_url_progress_hook() -> Optional[Callable[[int, int, int], None]]: + """Sets up tqdm callback for url downloads.""" + pbar: tqdm = tqdm( + unit='B', + unit_scale=True, + unit_divisor=1024, + colour='blue', + leave=False, + ) + + def download_progress_hook( + count: int, block_size: int, total_size: int + ) -> None: + if pbar.total is None: + pbar.total = total_size + pbar.reset() + downloaded_size = count * block_size + pbar.update(downloaded_size - pbar.n) + if pbar.n >= total_size: + pbar.close() + + return download_progress_hook diff --git a/.venv/lib/python3.12/site-packages/cmdstanpy/utils/command.py b/.venv/lib/python3.12/site-packages/cmdstanpy/utils/command.py new file mode 100644 index 00000000..ca95983e --- /dev/null +++ b/.venv/lib/python3.12/site-packages/cmdstanpy/utils/command.py @@ -0,0 +1,94 @@ +""" +Run commands and handle returncodes +""" +import os +import subprocess +import sys +from typing import Callable, List, Optional, TextIO + +from .filesystem import pushd +from .logging import get_logger + + +def do_command( + cmd: List[str], + cwd: Optional[str] = None, + *, + fd_out: Optional[TextIO] = sys.stdout, + pbar: Optional[Callable[[str], None]] = None, +) -> None: + """ + Run command as subprocess, polls process output pipes and + either streams outputs to supplied output stream or sends + each line (stripped) to the supplied progress bar callback hook. + + Raises ``RuntimeError`` on non-zero return code or execption ``OSError``. + + :param cmd: command and args. + :param cwd: directory in which to run command, if unspecified, + run command in the current working directory. + :param fd_out: when supplied, streams to this output stream, + else writes to sys.stdout. + :param pbar: optional callback hook to tqdm, which takes + single ``str`` arguent, see: + https://github.com/tqdm/tqdm#hooks-and-callbacks. + + """ + get_logger().debug('cmd: %s\ncwd: %s', ' '.join(cmd), cwd) + try: + # NB: Using this rather than cwd arg to Popen due to windows behavior + with pushd(cwd if cwd is not None else '.'): + # TODO: replace with subprocess.run in later Python versions? + proc = subprocess.Popen( + cmd, + bufsize=1, + stdin=subprocess.DEVNULL, + stdout=subprocess.PIPE, + stderr=subprocess.STDOUT, # avoid buffer overflow + env=os.environ, + universal_newlines=True, + ) + while proc.poll() is None: + if proc.stdout is not None: + line = proc.stdout.readline() + if fd_out is not None: + fd_out.write(line) + if pbar is not None: + pbar(line.strip()) + + stdout, _ = proc.communicate() + if stdout: + if len(stdout) > 0: + if fd_out is not None: + fd_out.write(stdout) + if pbar is not None: + pbar(stdout.strip()) + + if proc.returncode != 0: # throw RuntimeError + msg + serror = '' + try: + serror = os.strerror(proc.returncode) + except (ArithmeticError, ValueError): + pass + msg = 'Command {}\n\t{} {}'.format( + cmd, returncode_msg(proc.returncode), serror + ) + raise RuntimeError(msg) + except OSError as e: + msg = 'Command: {}\nfailed with error {}\n'.format(cmd, str(e)) + raise RuntimeError(msg) from e + + +def returncode_msg(retcode: int) -> str: + """interpret retcode""" + if retcode < 0: + sig = -1 * retcode + return f'terminated by signal {sig}' + if retcode <= 125: + return 'error during processing' + if retcode == 126: # shouldn't happen + return '' + if retcode == 127: + return 'program not found' + sig = retcode - 128 + return f'terminated by signal {sig}' diff --git a/.venv/lib/python3.12/site-packages/cmdstanpy/utils/data_munging.py b/.venv/lib/python3.12/site-packages/cmdstanpy/utils/data_munging.py new file mode 100644 index 00000000..495d40a5 --- /dev/null +++ b/.venv/lib/python3.12/site-packages/cmdstanpy/utils/data_munging.py @@ -0,0 +1,44 @@ +""" +Common functions for reshaping numpy arrays +""" +from typing import Hashable, MutableMapping, Tuple + +import numpy as np +import stanio + + +def flatten_chains(draws_array: np.ndarray) -> np.ndarray: + """ + Flatten a 3D array of draws X chains X variable into 2D array + where all chains are concatenated into a single column. + + :param draws_array: 3D array of draws + """ + if len(draws_array.shape) != 3: + raise ValueError( + 'Expecting 3D array, found array with {} dims'.format( + len(draws_array.shape) + ) + ) + + num_rows = draws_array.shape[0] * draws_array.shape[1] + num_cols = draws_array.shape[2] + return draws_array.reshape((num_rows, num_cols), order='F') + + +def build_xarray_data( + data: MutableMapping[Hashable, Tuple[Tuple[str, ...], np.ndarray]], + var: stanio.Variable, + drawset: np.ndarray, +) -> None: + """ + Adds Stan variable name, labels, and values to a dictionary + that will be used to construct an xarray DataSet. + """ + var_dims: Tuple[str, ...] = ('draw', 'chain') + var_dims += tuple(f"{var.name}_dim_{i}" for i in range(len(var.dimensions))) + + data[var.name] = ( + var_dims, + var.extract_reshape(drawset), + ) diff --git a/.venv/lib/python3.12/site-packages/cmdstanpy/utils/filesystem.py b/.venv/lib/python3.12/site-packages/cmdstanpy/utils/filesystem.py new file mode 100644 index 00000000..233898e1 --- /dev/null +++ b/.venv/lib/python3.12/site-packages/cmdstanpy/utils/filesystem.py @@ -0,0 +1,236 @@ +""" +Utilities for interacting with the filesystem on multiple platforms +""" +import contextlib +import os +import platform +import re +import shutil +import tempfile +from typing import Any, Iterator, List, Mapping, Optional, Tuple, Union + +from cmdstanpy import _TMPDIR + +from .json import write_stan_json +from .logging import get_logger + +EXTENSION = '.exe' if platform.system() == 'Windows' else '' + + +def windows_short_path(path: str) -> str: + """ + Gets the short path name of a given long path. + http://stackoverflow.com/a/23598461/200291 + + On non-Windows platforms, returns the path + + If (base)path does not exist, function raises RuntimeError + """ + if platform.system() != 'Windows': + return path + + if os.path.isfile(path) or ( + not os.path.isdir(path) and os.path.splitext(path)[1] != '' + ): + base_path, file_name = os.path.split(path) + else: + base_path, file_name = path, '' + + if not os.path.exists(base_path): + raise RuntimeError( + 'Windows short path function needs a valid directory. ' + 'Base directory does not exist: "{}"'.format(base_path) + ) + + import ctypes + from ctypes import wintypes + + # pylint: disable=invalid-name + _GetShortPathNameW = ( + ctypes.windll.kernel32.GetShortPathNameW # type: ignore + ) + + _GetShortPathNameW.argtypes = [ + wintypes.LPCWSTR, + wintypes.LPWSTR, + wintypes.DWORD, + ] + _GetShortPathNameW.restype = wintypes.DWORD + + output_buf_size = 0 + while True: + output_buf = ctypes.create_unicode_buffer(output_buf_size) + needed = _GetShortPathNameW(base_path, output_buf, output_buf_size) + if output_buf_size >= needed: + short_base_path = output_buf.value + break + else: + output_buf_size = needed + + short_path = ( + os.path.join(short_base_path, file_name) + if file_name + else short_base_path + ) + return short_path + + +def create_named_text_file( + dir: str, prefix: str, suffix: str, name_only: bool = False +) -> str: + """ + Create a named unique file, return filename. + Flag 'name_only' will create then delete the tmp file; + this lets us create filename args for commands which + disallow overwriting existing files (e.g., 'stansummary'). + """ + fd = tempfile.NamedTemporaryFile( + mode='w+', prefix=prefix, suffix=suffix, dir=dir, delete=name_only + ) + path = fd.name + fd.close() + return path + + +@contextlib.contextmanager +def pushd(new_dir: str) -> Iterator[None]: + """Acts like pushd/popd.""" + previous_dir = os.getcwd() + os.chdir(new_dir) + try: + yield + finally: + os.chdir(previous_dir) + + +def _temp_single_json( + data: Union[str, os.PathLike, Mapping[str, Any], None] +) -> Iterator[Optional[str]]: + """Context manager for json files.""" + if data is None: + yield None + return + if isinstance(data, (str, os.PathLike)): + yield str(data) + return + + data_file = create_named_text_file(dir=_TMPDIR, prefix='', suffix='.json') + get_logger().debug('input tempfile: %s', data_file) + write_stan_json(data_file, data) + try: + yield data_file + finally: + with contextlib.suppress(PermissionError): + os.remove(data_file) + + +temp_single_json = contextlib.contextmanager(_temp_single_json) + + +def _temp_multiinput( + input: Union[str, os.PathLike, Mapping[str, Any], List[Any], None], + base: int = 1, +) -> Iterator[Optional[str]]: + if isinstance(input, list): + # most complicated case: list of inits + # for multiple chains, we need to create multiple files + # which look like somename_{i}.json and then pass somename.json + # to CmdStan + + mother_file = create_named_text_file( + dir=_TMPDIR, prefix='', suffix='.json', name_only=True + ) + new_files = [ + os.path.splitext(mother_file)[0] + f'_{i+base}.json' + for i in range(len(input)) + ] + for init, file in zip(input, new_files): + if isinstance(init, dict): + write_stan_json(file, init) + elif isinstance(init, str): + shutil.copy(init, file) + else: + raise ValueError( + 'A list of inits must contain dicts or strings, not' + + str(type(init)) + ) + try: + yield mother_file + finally: + for file in new_files: + with contextlib.suppress(PermissionError): + os.remove(file) + else: + yield from _temp_single_json(input) + + +@contextlib.contextmanager +def temp_inits( + inits: Union[ + str, os.PathLike, Mapping[str, Any], float, int, List[Any], None + ], + *, + allow_multiple: bool = True, + id: int = 1, +) -> Iterator[Union[str, float, int, None]]: + if isinstance(inits, (float, int)): + yield inits + return + if allow_multiple: + yield from _temp_multiinput(inits, base=id) + else: + if isinstance(inits, list): + raise ValueError('Expected single initialization, got list') + yield from _temp_single_json(inits) + + +class SanitizedOrTmpFilePath: + """ + Context manager for tmpfiles, handles special characters in filepath. + """ + + UNIXISH_PATTERN = re.compile(r"[\s~]") + WINDOWS_PATTERN = re.compile(r"\s") + + @classmethod + def _has_special_chars(cls, file_path: str) -> bool: + if platform.system() == "Windows": + return bool(cls.WINDOWS_PATTERN.search(file_path)) + return bool(cls.UNIXISH_PATTERN.search(file_path)) + + def __init__(self, file_path: str): + self._tmpdir = None + + if self._has_special_chars(os.path.abspath(file_path)): + base_path, file_name = os.path.split(os.path.abspath(file_path)) + os.makedirs(base_path, exist_ok=True) + try: + short_base_path = windows_short_path(base_path) + if os.path.exists(short_base_path): + file_path = os.path.join(short_base_path, file_name) + except RuntimeError: + pass + + if self._has_special_chars(os.path.abspath(file_path)): + tmpdir = tempfile.mkdtemp() + if self._has_special_chars(tmpdir): + raise RuntimeError( + 'Unable to generate temporary path without spaces or ' + 'special characters! \n Please move your stan file to a ' + 'location without spaces or special characters.' + ) + + _, path = tempfile.mkstemp(suffix='.stan', dir=tmpdir) + + shutil.copy(file_path, path) + self._path = path + self._tmpdir = tmpdir + else: + self._path = file_path + + def __enter__(self) -> Tuple[str, bool]: + return self._path, self._tmpdir is not None + + def __exit__(self, exc_type, exc_val, exc_tb) -> None: # type: ignore + if self._tmpdir: + shutil.rmtree(self._tmpdir, ignore_errors=True) diff --git a/.venv/lib/python3.12/site-packages/cmdstanpy/utils/json.py b/.venv/lib/python3.12/site-packages/cmdstanpy/utils/json.py new file mode 100644 index 00000000..ce1674e6 --- /dev/null +++ b/.venv/lib/python3.12/site-packages/cmdstanpy/utils/json.py @@ -0,0 +1,6 @@ +""" +Delegated to stanio - https://github.com/WardBrian/stanio +""" +from stanio import write_stan_json + +__all__ = ['write_stan_json'] diff --git a/.venv/lib/python3.12/site-packages/cmdstanpy/utils/logging.py b/.venv/lib/python3.12/site-packages/cmdstanpy/utils/logging.py new file mode 100644 index 00000000..6f33ec85 --- /dev/null +++ b/.venv/lib/python3.12/site-packages/cmdstanpy/utils/logging.py @@ -0,0 +1,25 @@ +""" +CmdStanPy logging +""" +import functools +import logging + + +@functools.lru_cache(maxsize=None) +def get_logger() -> logging.Logger: + """cmdstanpy logger""" + logger = logging.getLogger('cmdstanpy') + if len(logger.handlers) == 0: + # send all messages to handlers + logger.setLevel(logging.DEBUG) + # add a default handler to the logger to INFO and higher + handler = logging.StreamHandler() + handler.setLevel(logging.INFO) + handler.setFormatter( + logging.Formatter( + '%(asctime)s - %(name)s - %(levelname)s - %(message)s', + "%H:%M:%S", + ) + ) + logger.addHandler(handler) + return logger diff --git a/.venv/lib/python3.12/site-packages/cmdstanpy/utils/stancsv.py b/.venv/lib/python3.12/site-packages/cmdstanpy/utils/stancsv.py new file mode 100644 index 00000000..b7a3b21c --- /dev/null +++ b/.venv/lib/python3.12/site-packages/cmdstanpy/utils/stancsv.py @@ -0,0 +1,486 @@ +""" +Utility functions for reading the Stan CSV format +""" +import json +import math +import re +from typing import Any, Dict, List, MutableMapping, Optional, TextIO, Union + +import numpy as np +import pandas as pd + +from cmdstanpy import _CMDSTAN_SAMPLING, _CMDSTAN_THIN, _CMDSTAN_WARMUP + + +def check_sampler_csv( + path: str, + is_fixed_param: bool = False, + iter_sampling: Optional[int] = None, + iter_warmup: Optional[int] = None, + save_warmup: bool = False, + thin: Optional[int] = None, +) -> Dict[str, Any]: + """Capture essential config, shape from stan_csv file.""" + meta = scan_sampler_csv(path, is_fixed_param) + if thin is None: + thin = _CMDSTAN_THIN + elif thin > _CMDSTAN_THIN: + if 'thin' not in meta: + raise ValueError( + 'bad Stan CSV file {}, ' + 'config error, expected thin = {}'.format(path, thin) + ) + if meta['thin'] != thin: + raise ValueError( + 'bad Stan CSV file {}, ' + 'config error, expected thin = {}, found {}'.format( + path, thin, meta['thin'] + ) + ) + draws_sampling = iter_sampling + if draws_sampling is None: + draws_sampling = _CMDSTAN_SAMPLING + draws_warmup = iter_warmup + if draws_warmup is None: + draws_warmup = _CMDSTAN_WARMUP + draws_warmup = int(math.ceil(draws_warmup / thin)) + draws_sampling = int(math.ceil(draws_sampling / thin)) + if meta['draws_sampling'] != draws_sampling: + raise ValueError( + 'bad Stan CSV file {}, expected {} draws, found {}'.format( + path, draws_sampling, meta['draws_sampling'] + ) + ) + if save_warmup: + if not ('save_warmup' in meta and meta['save_warmup'] in (1, 'true')): + raise ValueError( + 'bad Stan CSV file {}, ' + 'config error, expected save_warmup = 1'.format(path) + ) + if meta['draws_warmup'] != draws_warmup: + raise ValueError( + 'bad Stan CSV file {}, ' + 'expected {} warmup draws, found {}'.format( + path, draws_warmup, meta['draws_warmup'] + ) + ) + return meta + + +def scan_sampler_csv(path: str, is_fixed_param: bool = False) -> Dict[str, Any]: + """Process sampler stan_csv output file line by line.""" + dict: Dict[str, Any] = {} + lineno = 0 + with open(path, 'r') as fd: + try: + lineno = scan_config(fd, dict, lineno) + lineno = scan_column_names(fd, dict, lineno) + if not is_fixed_param: + lineno = scan_warmup_iters(fd, dict, lineno) + lineno = scan_hmc_params(fd, dict, lineno) + lineno = scan_sampling_iters(fd, dict, lineno, is_fixed_param) + except ValueError as e: + raise ValueError("Error in reading csv file: " + path) from e + return dict + + +def scan_optimize_csv(path: str, save_iters: bool = False) -> Dict[str, Any]: + """Process optimizer stan_csv output file line by line.""" + dict: Dict[str, Any] = {} + lineno = 0 + # scan to find config, header, num saved iters + with open(path, 'r') as fd: + lineno = scan_config(fd, dict, lineno) + lineno = scan_column_names(fd, dict, lineno) + iters = 0 + for line in fd: + iters += 1 + if save_iters: + all_iters: np.ndarray = np.empty( + (iters, len(dict['column_names'])), dtype=float, order='F' + ) + # rescan to capture estimates + with open(path, 'r') as fd: + for i in range(lineno): + fd.readline() + for i in range(iters): + line = fd.readline().strip() + if len(line) < 1: + raise ValueError( + 'cannot parse CSV file {}, error at line {}'.format( + path, lineno + i + ) + ) + xs = line.split(',') + if save_iters: + all_iters[i, :] = [float(x) for x in xs] + if i == iters - 1: + mle: np.ndarray = np.array(xs, dtype=float) + # pylint: disable=possibly-used-before-assignment + dict['mle'] = mle + if save_iters: + dict['all_iters'] = all_iters + return dict + + +def scan_generic_csv(path: str) -> Dict[str, Any]: + """Process laplace stan_csv output file line by line.""" + dict: Dict[str, Any] = {} + lineno = 0 + with open(path, 'r') as fd: + lineno = scan_config(fd, dict, lineno) + lineno = scan_column_names(fd, dict, lineno) + return dict + + +def scan_variational_csv(path: str) -> Dict[str, Any]: + """Process advi stan_csv output file line by line.""" + dict: Dict[str, Any] = {} + lineno = 0 + with open(path, 'r') as fd: + lineno = scan_config(fd, dict, lineno) + lineno = scan_column_names(fd, dict, lineno) + line = fd.readline().lstrip(' #\t').rstrip() + lineno += 1 + if line.startswith('Stepsize adaptation complete.'): + line = fd.readline().lstrip(' #\t\n') + lineno += 1 + if not line.startswith('eta'): + raise ValueError( + 'line {}: expecting eta, found:\n\t "{}"'.format( + lineno, line + ) + ) + _, eta = line.split('=') + dict['eta'] = float(eta) + line = fd.readline().lstrip(' #\t\n') + lineno += 1 + xs = line.split(',') + variational_mean = [float(x) for x in xs] + dict['variational_mean'] = np.array(variational_mean) + dict['variational_sample'] = pd.read_csv( + path, + comment='#', + skiprows=lineno, + header=None, + float_precision='high', + ).to_numpy() + return dict + + +def scan_config(fd: TextIO, config_dict: Dict[str, Any], lineno: int) -> int: + """ + Scan initial stan_csv file comments lines and + save non-default configuration information to config_dict. + """ + cur_pos = fd.tell() + line = fd.readline().strip() + while len(line) > 0 and line.startswith('#'): + lineno += 1 + if line.endswith('(Default)'): + line = line.replace('(Default)', '') + line = line.lstrip(' #\t') + key_val = line.split('=') + if len(key_val) == 2: + if key_val[0].strip() == 'file' and not key_val[1].endswith('csv'): + config_dict['data_file'] = key_val[1].strip() + elif key_val[0].strip() != 'file': + raw_val = key_val[1].strip() + val: Union[int, float, str] + try: + val = int(raw_val) + except ValueError: + try: + val = float(raw_val) + except ValueError: + if raw_val == "true": + val = 1 + elif raw_val == "false": + val = 0 + else: + val = raw_val + config_dict[key_val[0].strip()] = val + cur_pos = fd.tell() + line = fd.readline().strip() + fd.seek(cur_pos) + return lineno + + +def scan_warmup_iters( + fd: TextIO, config_dict: Dict[str, Any], lineno: int +) -> int: + """ + Check warmup iterations, if any. + """ + if 'save_warmup' not in config_dict: + return lineno + cur_pos = fd.tell() + line = fd.readline().strip() + draws_found = 0 + while len(line) > 0 and not line.startswith('#'): + lineno += 1 + draws_found += 1 + cur_pos = fd.tell() + line = fd.readline().strip() + fd.seek(cur_pos) + config_dict['draws_warmup'] = draws_found + return lineno + + +def scan_column_names( + fd: TextIO, config_dict: MutableMapping[str, Any], lineno: int +) -> int: + """ + Process columns header, add to config_dict as 'column_names' + """ + line = fd.readline().strip() + lineno += 1 + config_dict['raw_header'] = line.strip() + names = line.split(',') + config_dict['column_names'] = tuple(munge_varnames(names)) + return lineno + + +def munge_varname(name: str) -> str: + if '.' not in name and ':' not in name: + return name + + tuple_parts = name.split(':') + for i, part in enumerate(tuple_parts): + if '.' not in part: + continue + part = part.replace('.', '[', 1) + part = part.replace('.', ',') + part += ']' + tuple_parts[i] = part + + return '.'.join(tuple_parts) + + +def munge_varnames(names: List[str]) -> List[str]: + """ + Change formatting for indices of container var elements + from use of dot separator to array-like notation, e.g., + rewrite label ``y_forecast.2.4`` to ``y_forecast[2,4]``. + """ + if names is None: + raise ValueError('missing argument "names"') + return [munge_varname(name) for name in names] + + +def scan_hmc_params( + fd: TextIO, config_dict: Dict[str, Any], lineno: int +) -> int: + """ + Scan step size, metric from stan_csv file comment lines. + """ + metric = config_dict['metric'] + line = fd.readline().strip() + lineno += 1 + if not line == '# Adaptation terminated': + raise ValueError( + 'line {}: expecting metric, found:\n\t "{}"'.format(lineno, line) + ) + line = fd.readline().strip() + lineno += 1 + label, step_size = line.split('=') + if not label.startswith('# Step size'): + raise ValueError( + 'line {}: expecting step size, ' + 'found:\n\t "{}"'.format(lineno, line) + ) + try: + float(step_size.strip()) + except ValueError as e: + raise ValueError( + 'line {}: invalid step size: {}'.format(lineno, step_size) + ) from e + before_metric = fd.tell() + line = fd.readline().strip() + lineno += 1 + if metric == 'unit_e': + if line.startswith("# No free parameters"): + return lineno + else: + fd.seek(before_metric) + return lineno - 1 + + if not ( + ( + metric == 'diag_e' + and line == '# Diagonal elements of inverse mass matrix:' + ) + or ( + metric == 'dense_e' and line == '# Elements of inverse mass matrix:' + ) + ): + raise ValueError( + 'line {}: invalid or missing mass matrix ' + 'specification'.format(lineno) + ) + line = fd.readline().lstrip(' #\t') + lineno += 1 + num_unconstrained_params = len(line.split(',')) + if metric == 'diag_e': + return lineno + else: + for _ in range(1, num_unconstrained_params): + line = fd.readline().lstrip(' #\t') + lineno += 1 + if len(line.split(',')) != num_unconstrained_params: + raise ValueError( + 'line {}: invalid or missing mass matrix ' + 'specification'.format(lineno) + ) + return lineno + + +def scan_sampling_iters( + fd: TextIO, config_dict: Dict[str, Any], lineno: int, is_fixed_param: bool +) -> int: + """ + Parse sampling iteration, save number of iterations to config_dict. + Also save number of divergences, max_treedepth hits + """ + draws_found = 0 + num_cols = len(config_dict['column_names']) + if not is_fixed_param: + idx_divergent = config_dict['column_names'].index('divergent__') + idx_treedepth = config_dict['column_names'].index('treedepth__') + max_treedepth = config_dict['max_depth'] + ct_divergences = 0 + ct_max_treedepth = 0 + + cur_pos = fd.tell() + line = fd.readline().strip() + while len(line) > 0 and not line.startswith('#'): + lineno += 1 + draws_found += 1 + data = line.split(',') + if len(data) != num_cols: + raise ValueError( + 'line {}: bad draw, expecting {} items, found {}\n'.format( + lineno, num_cols, len(line.split(',')) + ) + + 'This error could be caused by running out of disk space.\n' + 'Try clearing up TEMP or setting output_dir to a path' + ' on another drive.', + ) + cur_pos = fd.tell() + line = fd.readline().strip() + if not is_fixed_param: + ct_divergences += int(data[idx_divergent]) # type: ignore + if int(data[idx_treedepth]) == max_treedepth: # type: ignore + ct_max_treedepth += 1 + + fd.seek(cur_pos) + config_dict['draws_sampling'] = draws_found + if not is_fixed_param: + config_dict['ct_divergences'] = ct_divergences + config_dict['ct_max_treedepth'] = ct_max_treedepth + return lineno + + +def read_metric(path: str) -> List[int]: + """ + Read metric file in JSON or Rdump format. + Return dimensions of entry "inv_metric". + """ + if path.endswith('.json'): + with open(path, 'r') as fd: + metric_dict = json.load(fd) + if 'inv_metric' in metric_dict: + dims_np: np.ndarray = np.asarray(metric_dict['inv_metric']) + return list(dims_np.shape) + else: + raise ValueError( + 'metric file {}, bad or missing' + ' entry "inv_metric"'.format(path) + ) + else: + dims = list(read_rdump_metric(path)) + if dims is None: + raise ValueError( + 'metric file {}, bad or missing' + ' entry "inv_metric"'.format(path) + ) + return dims + + +def read_rdump_metric(path: str) -> List[int]: + """ + Find dimensions of variable named 'inv_metric' in Rdump data file. + """ + metric_dict = rload(path) + if metric_dict is None or not ( + 'inv_metric' in metric_dict + and isinstance(metric_dict['inv_metric'], np.ndarray) + ): + raise ValueError( + 'metric file {}, bad or missing entry "inv_metric"'.format(path) + ) + return list(metric_dict['inv_metric'].shape) + + +def rload(fname: str) -> Optional[Dict[str, Union[int, float, np.ndarray]]]: + """Parse data and parameter variable values from an R dump format file. + This parser only supports the subset of R dump data as described + in the "Dump Data Format" section of the CmdStan manual, i.e., + scalar, vector, matrix, and array data types. + """ + data_dict = {} + with open(fname, 'r') as fd: + lines = fd.readlines() + # Variable data may span multiple lines, parse accordingly + idx = 0 + while idx < len(lines) and '<-' not in lines[idx]: + idx += 1 + if idx == len(lines): + return None + start_idx = idx + idx += 1 + while True: + while idx < len(lines) and '<-' not in lines[idx]: + idx += 1 + next_var = idx + var_data = ''.join(lines[start_idx:next_var]).replace('\n', '') + lhs, rhs = [item.strip() for item in var_data.split('<-')] + lhs = lhs.replace('"', '') # strip optional Jags double quotes + rhs = rhs.replace('L', '') # strip R long int qualifier + data_dict[lhs] = parse_rdump_value(rhs) + if idx == len(lines): + break + start_idx = next_var + idx += 1 + return data_dict + + +def parse_rdump_value(rhs: str) -> Union[int, float, np.ndarray]: + """Process right hand side of Rdump variable assignment statement. + Value is either scalar, vector, or multi-dim structure. + Use regex to capture structure values, dimensions. + """ + pat = re.compile( + r'structure\(\s*c\((?P[^)]*)\)' + r'(,\s*\.Dim\s*=\s*c\s*\((?P[^)]*)\s*\))?\)' + ) + val: Union[int, float, np.ndarray] + try: + if rhs.startswith('structure'): + parse = pat.match(rhs) + if parse is None or parse.group('vals') is None: + raise ValueError(rhs) + vals = [float(v) for v in parse.group('vals').split(',')] + val = np.array(vals, order='F') + if parse.group('dims') is not None: + dims = [int(v) for v in parse.group('dims').split(',')] + val = np.array(vals).reshape(dims, order='F') + elif rhs.startswith('c(') and rhs.endswith(')'): + val = np.array([float(item) for item in rhs[2:-1].split(',')]) + elif '.' in rhs or 'e' in rhs: + val = float(rhs) + else: + val = int(rhs) + except TypeError as e: + raise ValueError('bad value in Rdump file: {}'.format(rhs)) from e + return val diff --git a/.venv/lib/python3.12/site-packages/holidays-0.77.dist-info/INSTALLER b/.venv/lib/python3.12/site-packages/holidays-0.77.dist-info/INSTALLER new file mode 100644 index 00000000..a1b589e3 --- /dev/null +++ b/.venv/lib/python3.12/site-packages/holidays-0.77.dist-info/INSTALLER @@ -0,0 +1 @@ +pip diff --git a/.venv/lib/python3.12/site-packages/holidays-0.77.dist-info/METADATA b/.venv/lib/python3.12/site-packages/holidays-0.77.dist-info/METADATA new file mode 100644 index 00000000..86a99a2d --- /dev/null +++ b/.venv/lib/python3.12/site-packages/holidays-0.77.dist-info/METADATA @@ -0,0 +1,1815 @@ +Metadata-Version: 2.4 +Name: holidays +Version: 0.77 +Summary: Open World Holidays Framework +Author: Vacanza Team +Maintainer: Arkadii Yakovets, Panpakorn Siripanich, Serhii Murza +License-Expression: MIT +Project-URL: Documentation, https://holidays.readthedocs.io/en/latest/ +Project-URL: Repository, https://github.com/vacanza/holidays/ +Project-URL: Changelog, https://github.com/vacanza/holidays/releases/ +Keywords: holidays,calendar,l10n,worldwide,vacation +Classifier: Development Status :: 4 - Beta +Classifier: Intended Audience :: Developers +Classifier: Intended Audience :: Education +Classifier: Intended Audience :: End Users/Desktop +Classifier: Intended Audience :: Financial and Insurance Industry +Classifier: Intended Audience :: Information Technology +Classifier: Operating System :: OS Independent +Classifier: Programming Language :: Python :: 3 :: Only +Classifier: Programming Language :: Python :: 3.9 +Classifier: Programming Language :: Python :: 3.10 +Classifier: Programming Language :: Python :: 3.11 +Classifier: Programming Language :: Python :: 3.12 +Classifier: Programming Language :: Python :: 3.13 +Classifier: Programming Language :: Python :: Implementation :: CPython +Classifier: Topic :: File Formats :: JSON +Classifier: Topic :: Office/Business :: Financial :: Accounting +Classifier: Topic :: Office/Business :: Financial :: Investment +Classifier: Topic :: Office/Business :: Scheduling +Classifier: Topic :: Software Development :: Libraries :: Python Modules +Requires-Python: >=3.9 +Description-Content-Type: text/markdown +License-File: CONTRIBUTORS +License-File: LICENSE +Requires-Dist: python-dateutil +Dynamic: license-file + +# Holidays + +A fast, efficient Python library for generating country- and subdivision- (e.g. state or province) +specific sets of government-designated holidays on the fly. It aims to make determining whether a +specific date is a holiday as fast and flexible as possible. + + + + + + + + + + + + + + + + + + + + + + + + + + + +
PyPI + PyPI downloads PyPI version PyPI release date +
CI/CD + CI/CD status Documentation status +
Code + License Python supported versions Code style Code coverage +
GitHub + GitHub stars GitHub forks GitHub contributors GitHub last commit +
Citation + Open World Holidays Framework DOI +
Snyk + Open World Holidays Package Health Score +
+ +## Install + +The latest stable version can always be installed or updated via pip: + +``` shell +pip install --upgrade holidays +``` + +The latest development (dev) version can be installed directly from GitHub: + +``` shell +pip install --upgrade https://github.com/vacanza/holidays/tarball/dev +``` + +All new features are always first pushed to dev branch, then released on main branch upon official +version upgrades. + +## Documentation + +The documentation is hosted on [Read the Docs](https://holidays.readthedocs.io/). + +## Quick Start + +``` python +from datetime import date +import holidays + +us_holidays = holidays.US() # this is a dict-like object +# the below is the same, but takes a string: +us_holidays = holidays.country_holidays('US') # this is a dict-like object + +nyse_holidays = holidays.NYSE() # this is a dict-like object +# the below is the same, but takes a string: +nyse_holidays = holidays.financial_holidays('NYSE') # this is a dict-like object + +date(2015, 1, 1) in us_holidays # True +date(2015, 1, 2) in us_holidays # False +us_holidays.get('2014-01-01') # "New Year's Day" +``` + +The HolidayBase dict-like class will also recognize date strings and Unix timestamps: + +``` python +'2014-01-01' in us_holidays # True +'1/1/2014' in us_holidays # True +1388597445 in us_holidays # True +``` + +Some holidays may be only present in parts of a country: + +``` python +us_pr_holidays = holidays.country_holidays('US', subdiv='PR') +'2018-01-06' in us_holidays # False +'2018-01-06' in us_pr_holidays # True +``` + +Please see the [holidays documentation](https://holidays.readthedocs.io/) for additional examples +and detailed information. + +## Available Countries + +We currently support 223 country codes. The standard way to refer to a country is by using its [ISO +3166-1 alpha-2 code](https://en.wikipedia.org/wiki/List_of_ISO_3166_country_codes), the same used +for domain names, and for a subdivision its [ISO 3166-2 +code](https://en.wikipedia.org/wiki/ISO_3166-2). Some countries have common or foreign names or +abbreviations as aliases for their subdivisions. These are defined in the (optional) +`subdivisions_aliases` attribute. Some of the countries support more than one language for holiday +names output. A default language is defined by `default_language` (optional) attribute for each +entity and is used as a fallback when neither user specified language nor user locale language +available. The default language code is a [ISO 639-1 +code](https://en.wikipedia.org/wiki/List_of_ISO_639-1_codes). A list of all languages supported by +country is defined by `supported_languages` (optional) attribute. If there is no designated [ISO +639-1 code](https://en.wikipedia.org/wiki/List_of_ISO_639-1_codes) then [ISO 639-2 +code](https://en.wikipedia.org/wiki/List_of_ISO_639-2_codes) can be used. + +Many countries have other categories of holidays in addition to common (national-wide) holidays: +bank holidays, school holidays, additional (paid or non-paid) holidays, holidays of state or public +employees, religious holidays (valid only for these religions followers). A list of all categories +supported by country is defined by `supported_categories` (optional) attribute. + +The following is a list of supported countries, their subdivisions followed by their aliases (if +any) in brackets, available languages and additional holiday categories. All countries support +**PUBLIC** holidays category by default. All other default values are highlighted with bold: + + +++++++ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
CountryCodeSubdivisionsSupported LanguagesSupported Categories
AfghanistanAFen_US, fa_AF, ps_AF
Aland IslandsAXCan also be loaded as country FI, subdivision 01en_US, fi, sv_FI, th, ukUNOFFICIAL, WORKDAY
AlbaniaALen_US, sq, uk
AlgeriaDZar, en_US, fr
American SamoaASCan also be loaded as country US, subdivision ASen_US, thGOVERNMENT, UNOFFICIAL
AndorraADParishes: 02 (Canillo), 03 (Encamp), 04 (La Massana), 05 (Ordino), 06 (Sant Julià de Lòria), 07 (Andorra la Vella), 08 (Escaldes-Engordany)ca, en_US, ukGOVERNMENT
AngolaAOen_US, pt_AO, uk
AnguillaAIen_AI, en_US
Antigua and BarbudaAG
ArgentinaARProvinces: A (Salta), B (Buenos Aires), C (Ciudad Autónoma de Buenos Aires), D (San Luis), E (Entre Ríos), F (La Rioja), G (Santiago del Estero), H (Chaco), J (San Juan), K (Catamarca), L (La Pampa), M (Mendoza), N (Misiones), P (Formosa), Q (Neuquén), R (Río Negro), S (Santa Fe), T (Tucumán), U (Chubut), V (Tierra del Fuego), W (Corrientes), X (Córdoba), Y (Jujuy), Z (Santa Cruz)en_US, es, ukARMENIAN, BANK, GOVERNMENT, HEBREW, ISLAMIC
ArmeniaAMen_US, hy
ArubaAWen_US, nl, pap_AW, uk
AustraliaAUStates and territories: ACT (Australian Capital Territory), NSW (New South Wales), NT (Northern Territory), QLD (Queensland), SA (South Australia), TAS (Tasmania), VIC (Victoria), WA (Western Australia)en_AU, en_US, thBANK, HALF_DAY
AustriaATStates: 1 (Burgenland, Bgld, B), 2 (Kärnten, Ktn, K), 3 (Niederösterreich, NÖ, N), 4 (Oberösterreich, OÖ, O), 5 (Salzburg, Sbg, S), 6 (Steiermark, Stmk, St), 7 (Tirol, T), 8 (Vorarlberg, Vbg, V), 9 (Wien, W)de, en_US, ukBANK
AzerbaijanAZaz, en_US, ukWORKDAY
BahamasBS
BahrainBHar, en_US
BangladeshBD
BarbadosBB
BelarusBYbe, en_US, ru, thWORKDAY
BelgiumBEde, en_US, fr, nl, ukBANK
BelizeBZ
BeninBJen_US, fr_BJWORKDAY
BermudaBMen_BM, en_US
BoliviaBODepartments: B (El Beni), C (Cochabamba), H (Chuquisaca), L (La Paz), N (Pando), O (Oruro), P (Potosí), S (Santa Cruz), T (Tarija)en_US, es, uk
Bonaire, Sint Eustatius and SabaBQSubdivisions: BON (Bonaire), SAB (Saba), STA (Sint Eustatius)en_BQ, en_US, nl, pap_BQ
Bosnia and HerzegovinaBAEntities and district: BIH (Federacija Bosne i Hercegovine, FBiH), BRC (Brčko distrikt, BD), SRP (Republika Srpska, RS)bs, en_US, sr, uk
BotswanaBW
BrazilBRStates: AC (Acre), AL (Alagoas), AM (Amazonas), AP (Amapá), BA (Bahia), CE (Ceará), DF (Distrito Federal), ES (Espírito Santo), GO (Goiás), MA (Maranhão), MG (Minas Gerais), MS (Mato Grosso do Sul), MT (Mato Grosso), PA (Pará), PB (Paraíba), PE (Pernambuco), PI (Piauí), PR (Paraná), RJ (Rio de Janeiro), RN (Rio Grande do Norte), RO (Rondônia), RR (Roraima), RS (Rio Grande do Sul), SC (Santa Catarina), SE (Sergipe), SP (São Paulo), TO (Tocantins)en_US, pt_BR, ukOPTIONAL
British Virgin IslandsVGen_US, en_VG
BruneiBNen_US, ms, th
BulgariaBGbg, en_US, ukSCHOOL
Burkina FasoBF
BurundiBI
Cabo VerdeCVMunicipalities: BR (Brava), BV (Boa Vista), CA (Santa Catarina), CF (Santa Catarina do Fogo), CR (Santa Cruz), MA (Maio), MO (Mosteiros), PA (Paul), PN (Porto Novo), PR (Praia), RB (Ribeira Brava), RG (Ribeira Grande), RS (Ribeira Grande de Santiago), SD (São Domingos), SF (São Filipe), SL (Sal), SM (São Miguel), SO (São Lourenço dos Órgãos), SS (São Salvador do Mundo), SV (São Vicente), TA (Tarrafal), TS (Tarrafal de São Nicolau)de, en_US, es, fr, pt_CVOPTIONAL
CambodiaKHen_US, km, th
CameroonCM
CanadaCAProvinces and territories: AB (Alberta), BC (British Columbia, Colombie-Britannique), MB (Manitoba), NB (New Brunswick, Nouveau-Brunswick), NL (Newfoundland and Labrador, Terre-Neuve-et-Labrador), NS (Nova Scotia, Nouvelle-Écosse), NT (Northwest Territories, Territoires du Nord-Ouest), NU (Nunavut), ON (Ontario), PE (Prince Edward Island, Île-du-Prince-Édouard), QC (Quebec, Québec), SK (Saskatchewan), YT (Yukon)ar, en_CA, en_US, fr, thGOVERNMENT, OPTIONAL
Cayman IslandsKYen_GB, en_US
Central African RepublicCFen_US, fr
ChadTD
ChileCLRegions: AI (Aisén del General Carlos Ibañez del Campo), AN (Antofagasta), AP (Arica y Parinacota), AR (La Araucanía), AT (Atacama), BI (Biobío), CO (Coquimbo), LI (Libertador General Bernardo O'Higgins), LL (Los Lagos), LR (Los Ríos), MA (Magallanes), ML (Maule), NB (Ñuble), RM (Región Metropolitana de Santiago), TA (Tarapacá), VS (Valparaíso)en_US, es, ukBANK
ChinaCNen_US, th, zh_CN, zh_TWHALF_DAY
Christmas IslandCXen_CX, en_US
Cocos IslandsCCcoa_CC, en_CC, en_US
ColombiaCOen_US, es, uk
CongoCGen_US, fr
Cook IslandsCKen_CK, en_US
Costa RicaCRen_US, es, ukOPTIONAL
CroatiaHRen_US, hr, uk
CubaCUen_US, es, uk
CuracaoCWen_US, nl, pap_CW, ukHALF_DAY
CyprusCYel, en_CY, en_US, ukBANK, OPTIONAL
CzechiaCZcs, en_US, sk, uk
DenmarkDKda, en_US, ukOPTIONAL
DjiboutiDJar, en_US, fr
DominicaDM
Dominican RepublicDOen_US, es, uk
DR CongoCDen_US, fr
EcuadorECen_US, es, uk
EgyptEGar, en_US
El SalvadorSVDepartments: AH (Ahuachapán), CA (Cabañas), CH (Chalatenango), CU (Cuscatlán), LI (La Libertad), MO (Morazán), PA (La Paz), SA (Santa Ana), SM (San Miguel), SO (Sonsonate), SS (San Salvador), SV (San Vicente), UN (La Unión), US (Usulután)en_US, es, uk
Equatorial GuineaGQProvinces: AN (Annobón, Annobon), BN (Bioko Norte, North Bioko), BS (Bioko Sur, South Bioko), CS (Centro Sur, South Center), DJ (Djibloho), KN (Kié-Ntem, Kie-Ntem), LI (Litoral, Coast), WN (Wele-Nzas)en_US, es
EstoniaEEen_US, et, uk
EswatiniSZ
EthiopiaETam, ar, en_ET, en_USWORKDAY
Falkland IslandsFKen_GB, en_USGOVERNMENT, WORKDAY
Faroe IslandsFOda, en_US, fo, is, no, svHALF_DAY
FijiFJWORKDAY
FinlandFIRegions: 01 (Ahvenanmaan maakunta, Landskapet Åland), 02 (Etelä-Karjala, Södra Karelen), 03 (Etelä-Pohjanmaa, Södra Österbotten), 04 (Etelä-Savo, Södra Savolax), 05 (Kainuu, Kajanaland), 06 (Kanta-Häme, Egentliga Tavastland), 07 (Keski-Pohjanmaa, Mellersta Österbotten), 08 (Keski-Suomi, Mellersta Finland), 09 (Kymenlaakso, Kymmenedalen), 10 (Lappi, Lappland), 11 (Pirkanmaa, Birkaland), 12 (Pohjanmaa, Österbotten), 13 (Pohjois-Karjala, Norra Karelen), 14 (Pohjois-Pohjanmaa, Norra Österbotten), 15 (Pohjois-Savo, Norra Savolax), 16 (Päijät-Häme, Päijänne-Tavastland), 17 (Satakunta), 18 (Uusimaa, Nyland), 19 (Varsinais-Suomi, Egentliga Finland)en_US, fi, sv_FI, th, ukUNOFFICIAL, WORKDAY
FranceFRDepartments/European Collectivity/DOM/ROM/TOM: 57 (Moselle), 6AE (Alsace), 971 (GP, GUA, Guadeloupe), 972 (MQ, Martinique), 973 (GY, Guyane), 974 (RE, LRE, La Réunion), 976 (YT, MAY, Mayotte), BL (Saint-Barthélemy), MF (Saint-Martin), NC (Nouvelle-Calédonie), PF (Polynésie Française), PM (Saint-Pierre-et-Miquelon), TF (Terres australes françaises), WF (Wallis-et-Futuna)en_US, fr, th, uk
French GuianaGFCan also be loaded as country FR, subdivision 973en_US, fr, th, uk
French PolynesiaPFCan also be loaded as country FR, subdivision PFen_US, fr, th, uk
French Southern TerritoriesTFCan also be loaded as country FR, subdivision TFen_US, fr, th, uk
GabonGA
GeorgiaGEen_US, ka, ukGOVERNMENT
GermanyDELands: BB (Brandenburg), BE (Berlin), BW (Baden-Württemberg), BY (Bayern), HB (Bremen), HE (Hessen), HH (Hamburg), MV (Mecklenburg-Vorpommern), NI (Niedersachsen), NW (Nordrhein-Westfalen), RP (Rheinland-Pfalz), SH (Schleswig-Holstein), SL (Saarland), SN (Sachsen), ST (Sachsen-Anhalt), TH (Thüringen)de, en_US, th, ukCATHOLIC
GhanaGH
GibraltarGIen_GB, en_US
GreeceGRel, en_US, ukHALF_DAY
GreenlandGLda, en_US, fi, is, kl, no, sv, ukOPTIONAL
GrenadaGDen_GD, en_US
GuadeloupeGPCan also be loaded as country FR, subdivision 971en_US, fr, th, uk
GuamGUCan also be loaded as country US, subdivision GUen_US, thGOVERNMENT, UNOFFICIAL
GuatemalaGTen_US, es
GuernseyGG
GuineaGNen_US, fr
GuyanaGYen_GY, en_US
HaitiHTen_US, es, fr_HT, htOPTIONAL
HondurasHNen_US, es, uk
Hong KongHKen_HK, en_US, th, zh_CN, zh_HKOPTIONAL
HungaryHUen_US, hu, uk
IcelandISen_US, is, ukHALF_DAY
IndiaINStates: AN (Andaman and Nicobar Islands), AP (Andhra Pradesh), AR (Arunachal Pradesh, Arunāchal Pradesh), AS (Assam), BR (Bihar, Bihār), CG (Chhattisgarh, Chhattīsgarh), CH (Chandigarh, Chandīgarh), DH (Dadra and Nagar Haveli and Daman and Diu, Dādra and Nagar Haveli and Damān and Diu), DL (Delhi), GA (Goa), GJ (Gujarat, Gujarāt), HP (Himachal Pradesh, Himāchal Pradesh), HR (Haryana, Haryāna), JH (Jharkhand, Jhārkhand), JK (Jammu and Kashmir, Jammu and Kashmīr), KA (Karnataka, Karnātaka), KL (Kerala), LA (Ladakh, Ladākh), LD (Lakshadweep), MH (Maharashtra, Mahārāshtra), ML (Meghalaya, Meghālaya), MN (Manipur), MP (Madhya Pradesh), MZ (Mizoram), NL (Nagaland, Nāgāland), OD (Odisha), PB (Punjab), PY (Puducherry), RJ (Rajasthan, Rājasthān), SK (Sikkim), TN (Tamil Nadu, Tamil Nādu), TR (Tripura), TS (Telangana, Telangāna), UK (Uttarakhand, Uttarākhand), UP (Uttar Pradesh), WB (West Bengal)en_IN, en_US, hiOPTIONAL
IndonesiaIDen_US, id, th, ukGOVERNMENT
IranIRen_US, fa_IR
IrelandIE
Isle of ManIMen_GB, en_US, th
IsraelILen_US, he, th, ukOPTIONAL, SCHOOL
ItalyITProvinces: AG (Agrigento), AL (Alessandria), AN (Ancona), AO (Aosta), AP (Ascoli Piceno), AQ (L'Aquila), AR (Arezzo), AT (Asti), AV (Avellino), BA (Bari), BG (Bergamo), BI (Biella), BL (Belluno), BN (Benevento), BO (Bologna), BR (Brindisi), BS (Brescia), BT (Barletta-Andria-Trani), BZ (Bolzano), CA (Cagliari), CB (Campobasso), CE (Caserta), CH (Chieti), CL (Caltanissetta), CN (Cuneo), CO (Como), CR (Cremona), CS (Cosenza), CT (Catania), CZ (Catanzaro), EN (Enna), FC (Forli-Cesena, Forlì-Cesena), FE (Ferrara), FG (Foggia), FI (Firenze), FM (Fermo), FR (Frosinone), GE (Genova), GO (Gorizia), GR (Grosseto), IM (Imperia), IS (Isernia), KR (Crotone), LC (Lecco), LE (Lecce), LI (Livorno), LO (Lodi), LT (Latina), LU (Lucca), MB (Monza e Brianza), MC (Macerata), ME (Messina), MI (Milano), MN (Mantova), MO (Modena), MS (Massa-Carrara), MT (Matera), NA (Napoli), NO (Novara), NU (Nuoro), OR (Oristano), PA (Palermo), PC (Piacenza), PD (Padova), PE (Pescara), PG (Perugia), PI (Pisa), PN (Pordenone), PO (Prato), PR (Parma), PT (Pistoia), PU (Pesaro e Urbino), PV (Pavia), PZ (Potenza), RA (Ravenna), RC (Reggio Calabria), RE (Reggio Emilia), RG (Ragusa), RI (Rieti), RM (Roma), RN (Rimini), RO (Rovigo), SA (Salerno), SI (Siena), SO (Sondrio), SP (La Spezia), SR (Siracusa), SS (Sassari), SU (Sud Sardegna), SV (Savona), TA (Taranto), TE (Teramo), TN (Trento), TO (Torino), TP (Trapani), TR (Terni), TS (Trieste), TV (Treviso), UD (Udine), VA (Varese), VB (Verbano-Cusio-Ossola), VC (Vercelli), VE (Venezia), VI (Vicenza), VR (Verona), VT (Viterbo), VV (Vibo Valentia); cities: Andria, Barletta, Cesena, Forli (Forlì), Pesaro, Trani, Urbino
Ivory CoastCIen_CI, en_US, fr
JamaicaJM
JapanJPen_US, ja, thBANK
JerseyJE
JordanJOar, en_US
KazakhstanKZen_US, kk, uk
KenyaKEen_KE, en_US, swHINDU, ISLAMIC
KuwaitKWar, en_US
KyrgyzstanKG
LaosLAen_US, lo, thBANK, SCHOOL, WORKDAY
LatviaLVen_US, lv, uk
LebanonLBar, en_USBANK, GOVERNMENT
LesothoLS
LibyaLYar, en_USWORKDAY
LiechtensteinLIde, en_US, ukBANK
LithuaniaLTen_US, lt, uk
LuxembourgLUde, en_US, fr, lb, uk
MacauMOHistorical municipalities: I (Concelho das Ilhas, 海島市, 海岛市), M (Concelho de Macau, 澳門市, 澳门市)en_MO, en_US, pt_MO, th, zh_CN, zh_MOGOVERNMENT, MANDATORY
MadagascarMGen_US, mg, uk
MalawiMW
MalaysiaMYStates and federal territories: 01 (Johor, JHR), 02 (Kedah, KDH), 03 (Kelantan, KTN), 04 (Melaka, MLK), 05 (Negeri Sembilan, NSN), 06 (Pahang, PHG), 07 (Pulau Pinang, PNG), 08 (Perak, PRK), 09 (Perlis, PLS), 10 (Selangor, SGR), 11 (Terengganu, TRG), 12 (Sabah, SBH), 13 (Sarawak, SWK), 14 (Wilayah Persekutuan Kuala Lumpur, KUL), 15 (Wilayah Persekutuan Labuan, LBN), 16 (Wilayah Persekutuan Putrajaya, PJY)en_US, ms_MY, th
MaldivesMV
MaliMLen_US, fr
MaltaMTen_US, mt
Marshall Islands (the)MH
MartiniqueMQCan also be loaded as country FR, subdivision 972en_US, fr, th, uk
MauritaniaMR
MauritiusMUen_MU, en_US
MayotteYTCan also be loaded as country FR, subdivision 976en_US, fr, th, uk
MexicoMXen_US, es, uk
MicronesiaFMStates: KSA (Kosrae, Kusaie), PNI (Pohnpei, Ponape), TRK (Chuuk, Truk), YAP (Yap)en_FM, en_US
MoldovaMDen_US, ro, uk
MonacoMCen_US, fr, uk
MongoliaMNen_US, mnWORKDAY
MontenegroMEcnr, en_US, ukCATHOLIC, HEBREW, ISLAMIC, ORTHODOX, WORKDAY
MontserratMSen_MS, en_US
MoroccoMAar, en_US, fr
MozambiqueMZen_US, pt_MZ, uk
NamibiaNAen_NA, en_US, uk
NauruNRen_NR, en_US
NepalNPWORKDAY
NetherlandsNLen_US, fy, nl, ukOPTIONAL
New CaledoniaNCCan also be loaded as country FR, subdivision NCen_US, fr, th, uk
New ZealandNZRegions and Special Island Authorities: AUK (Auckland, Tāmaki-Makaurau, AU), BOP (Bay of Plenty, Toi Moana, BP), CAN (Canterbury, Waitaha, CA), CIT (Chatham Islands Territory, Chatham Islands, Wharekauri, CI), GIS (Gisborne, Te Tairāwhiti, GI), HKB (Hawke's Bay, Te Matau-a-Māui, HB), MBH (Marlborough, MA), MWT (Manawatū Whanganui, Manawatū-Whanganui, MW), NSN (Nelson, Whakatū, NE), NTL (Northland, Te Taitokerau, NO), OTA (Otago, Ō Tākou, OT), STL (Southland, Te Taiao Tonga, SO), TAS (Tasman, Te tai o Aorere, TS), TKI (Taranaki, TK), WGN (Greater Wellington, Te Pane Matua Taiao, Wellington, Te Whanganui-a-Tara, WG), WKO (Waikato, WK), WTC (West Coast, Te Tai o Poutini, WC); subregions: South Canterbury
NicaraguaNISubdivisions: AN (Costa Caribe Norte), AS (Costa Caribe Sur), BO (Boaco), CA (Carazo), CI (Chinandega), CO (Chontales), ES (Estelí), GR (Granada), JI (Jinotega), LE (León), MD (Madriz), MN (Managua), MS (Masaya), MT (Matagalpa), NS (Nueva Segovia), RI (Rivas), SJ (Río San Juan)en_US, es, uk
NigerNEen_US, fr_NEOPTIONAL
NigeriaNG
NiueNUen_NU, en_US
Norfolk IslandNFen_NF, en_US
Northern Mariana Islands (the)MPCan also be loaded as country US, subdivision MPen_US, thGOVERNMENT, UNOFFICIAL
North MacedoniaMKen_US, mk, ukALBANIAN, BOSNIAN, CATHOLIC, HEBREW, ISLAMIC, ORTHODOX, ROMA, SERBIAN, TURKISH, VLACH
NorwayNOCounties and Arctic Regions: 03 (Oslo), 11 (Rogaland), 15 (Møre og Romsdal), 18 (Nordland), 21 (Svalbard), 22 (Jan Mayen), 30 (Viken), 34 (Innlandet), 38 (Vestfold og Telemark), 42 (Agder), 46 (Vestland), 50 (Trööndelage, Trøndelag), 54 (Romssa ja Finnmárkku, Troms og Finnmark, Tromssan ja Finmarkun)en_US, no, th, uk
OmanOMar, en_US
PakistanPKen_PK, en_US, ur_PK
PalauPWARMED_FORCES, HALF_DAY
PalestinePSar, en_USCATHOLIC, ORTHODOX
PanamaPAen_US, es, ukBANK
Papua New GuineaPG
ParaguayPYen_US, es, ukGOVERNMENT
PeruPEen_US, es, uk
PhilippinesPHen_PH, en_US, fil, thWORKDAY
PolandPLde, en_US, pl, uk
PortugalPTDistricts: 01 (Aveiro), 02 (Beja), 03 (Braga), 04 (Bragança), 05 (Castelo Branco), 06 (Coimbra), 07 (Évora), 08 (Faro), 09 (Guarda), 10 (Leiria), 11 (Lisboa), 12 (Portalegre), 13 (Porto), 14 (Santarém), 15 (Setúbal), 16 (Viana do Castelo), 17 (Vila Real), 18 (Viseu), 20 (Região Autónoma dos Açores), 30 (Região Autónoma da Madeira)en_US, pt_PT, ukOPTIONAL
Puerto RicoPRCan also be loaded as country US, subdivision PRen_US, thGOVERNMENT, UNOFFICIAL
QatarQAar_QA, en_USBANK
ReunionRECan also be loaded as country FR, subdivision 974en_US, fr, th, uk
RomaniaROen_US, ro, uk
RussiaRUen_US, ru, th
Saint BarthélemyBLCan also be loaded as country FR, subdivision BLen_US, fr, th, uk
Saint Kitts and NevisKNHALF_DAY, WORKDAY
Saint LuciaLCen_LC, en_US
Saint MartinMFCan also be loaded as country FR, subdivision MFen_US, fr, th, uk
Saint Pierre and MiquelonPMCan also be loaded as country FR, subdivision PMen_US, fr, th, uk
Saint Vincent and the GrenadinesVCen_US, en_VC
SamoaWS
San MarinoSMen_US, it, ukBANK
Sao Tome and PrincipeSTDistricts and Autonomous Region: 01 (Água Grande), 02 (Cantagalo), 03 (Caué), 04 (Lembá), 05 (Lobata), 06 (Mé-Zóchi), P (Príncipe)en_US, pt_ST
Saudi ArabiaSAar, en_US
SenegalSNen_US, fr_SN
SerbiaRSen_US, sr
SeychellesSCen_SC, en_US
Sierra LeoneSLen_SL, en_US
SingaporeSGen_SG, en_US, th
Sint MaartenSXen_US, nl
SlovakiaSKen_US, sk, ukWORKDAY
SloveniaSIen_US, sl, ukWORKDAY
Solomon IslandsSBSubdivisions: CE (Central), CH (Choiseul), CT (Capital Territory, Honiara), GU (Guadalcanal), IS (Isabel), MK (Makira-Ulawa), ML (Malaita), RB (Rennell and Bellona), TE (Temotu), WE (Western)
South AfricaZA
South KoreaKRen_US, ko, thBANK
SpainESAutonomous communities: AN (Andalucía), AR (Aragón), AS (Asturias), CB (Cantabria), CE (Ceuta), CL (Castilla y León), CM (Castilla-La Mancha), CN (Canarias), CT (Cataluña, Catalunya), EX (Extremadura), GA (Galicia), IB (Islas Baleares, Illes Balears), MC (Murcia), MD (Madrid), ML (Melilla), NC (Navarra), PV (País Vasco), RI (La Rioja), VC (Valenciana)en_US, es, uk
Sri LankaLKen_US, si_LK, ta_LKBANK, GOVERNMENT, WORKDAY
SurinameSRen_US, nl
Svalbard and Jan MayenSJCan also be loaded as country NO, subdivision 21 and 22en_US, no, th, uk
SwedenSEen_US, sv, th, uk
SwitzerlandCHCantons: AG (Aargau), AI (Appenzell Innerrhoden), AR (Appenzell Ausserrhoden), BE (Bern, Berne), BL (Basel-Landschaft), BS (Basel-Stadt), FR (Freiburg, Fribourg), GE (Genève), GL (Glarus), GR (Graubünden, Grigioni, Grischun), JU (Jura), LU (Luzern), NE (Neuchâtel), NW (Nidwalden), OW (Obwalden), SG (Sankt Gallen), SH (Schaffhausen), SO (Solothurn), SZ (Schwyz), TG (Thurgau), TI (Ticino), UR (Uri), VD (Vaud), VS (Valais, Wallis), ZG (Zug), ZH (Zürich)de, en_US, fr, it, ukHALF_DAY, OPTIONAL
TaiwanTWen_US, th, zh_CN, zh_TWGOVERNMENT, OPTIONAL, SCHOOL, WORKDAY
TanzaniaTZen_US, swBANK
ThailandTHen_US, th, ukARMED_FORCES, BANK, GOVERNMENT, SCHOOL, WORKDAY
Timor LesteTLen_TL, en_US, pt_TL, tet, thGOVERNMENT, WORKDAY
TogoTGen_US, frWORKDAY
TokelauTKen_TK, en_US, tkl
TongaTOen_US, to
Trinidad and TobagoTTen_TT, en_USOPTIONAL
TunisiaTNar, en_US
TurkeyTRen_US, tr, ukHALF_DAY
Turks and Caicos IslandsTCen_TC, en_US
TuvaluTVTown/Island Councils: FUN (Funafuti), NIT (Niutao), NKF (Nukufetau), NKL (Nukulaelae), NMA (Nanumea), NMG (Nanumaga, Nanumanga), NUI (Nui), VAI (Vaitupu)en_GB, en_US, tvl
UkraineUAar, en_US, th, ukWORKDAY
United Arab EmiratesAEar, en_US, thGOVERNMENT, OPTIONAL
United KingdomGBSubdivisions: ENG (England), NIR (Northern Ireland), SCT (Scotland), WLS (Wales)en_GB, en_US, th
United States Minor Outlying IslandsUMCan also be loaded as country US, subdivision UMen_US, thGOVERNMENT, UNOFFICIAL
United States of America (the)USStates and territories: AK (Alaska), AL (Alabama), AR (Arkansas), AS (American Samoa), AZ (Arizona), CA (California), CO (Colorado), CT (Connecticut), DC (District of Columbia), DE (Delaware), FL (Florida), GA (Georgia), GU (Guam), HI (Hawaii), IA (Iowa), ID (Idaho), IL (Illinois), IN (Indiana), KS (Kansas), KY (Kentucky), LA (Louisiana), MA (Massachusetts), MD (Maryland), ME (Maine), MI (Michigan), MN (Minnesota), MO (Missouri), MP (Northern Mariana Islands), MS (Mississippi), MT (Montana), NC (North Carolina), ND (North Dakota), NE (Nebraska), NH (New Hampshire), NJ (New Jersey), NM (New Mexico), NV (Nevada), NY (New York), OH (Ohio), OK (Oklahoma), OR (Oregon), PA (Pennsylvania), PR (Puerto Rico), RI (Rhode Island), SC (South Carolina), SD (South Dakota), TN (Tennessee), TX (Texas), UM (United States Minor Outlying Islands), UT (Utah), VA (Virginia), VI (Virgin Islands, U.S.), VT (Vermont), WA (Washington), WI (Wisconsin), WV (West Virginia), WY (Wyoming)en_US, thGOVERNMENT, UNOFFICIAL
United States Virgin Islands (the)See Virgin Islands (U.S.)GOVERNMENT, UNOFFICIAL
UruguayUYen_US, es, ukBANK
UzbekistanUZen_US, uk, uz
VanuatuVU
Vatican CityVAen_US, it, th
VenezuelaVEen_US, es, uk
VietnamVNen_US, th, vi
Virgin Islands (U.S.)VICan also be loaded as country US, subdivision VIen_US, thGOVERNMENT, UNOFFICIAL
Wallis and FutunaWFCan also be loaded as country FR, subdivision WFen_US, fr, th, uk
YemenYEar, en_USSCHOOL, WORKDAY
ZambiaZM
ZimbabweZW
+ +## Available Financial Markets + +The standard way to refer to a financial market is to use its [ISO 10383 +MIC](https://www.iso20022.org/market-identifier-codes) (Market Identifier Code) as a "market" +code when available. The following financial markets are available: + + ++++++ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
EntityCodeInfoSupported Languages
Brasil, Bolsa, BalcãoBVMFBrazil Stock Exchange and Over-the-Counter Market holidays (same as ANBIMA holidays)en_US, pt_BR, uk
European Central BankXECBTrans-European Automated Real-time Gross Settlement (TARGET2)
ICE Futures EuropeIFEUA London-based Investment Exchange holidays
New York Stock ExchangeXNYSNYSE market holidays (used by all other US-exchanges, including NASDAQ, etc.)
+ +## Contributions + +[Issues](https://github.com/vacanza/holidays/issues) and [pull +requests](https://github.com/vacanza/holidays/pulls) are always welcome. Please see +[here](https://github.com/vacanza/holidays/blob/dev/CONTRIBUTING.md) for more information. + +## License + +Code and documentation are available according to the MIT License (see +[LICENSE](https://github.com/vacanza/holidays/blob/dev/LICENSE)). diff --git a/.venv/lib/python3.12/site-packages/holidays-0.77.dist-info/RECORD b/.venv/lib/python3.12/site-packages/holidays-0.77.dist-info/RECORD new file mode 100644 index 00000000..793f6bb7 --- /dev/null +++ b/.venv/lib/python3.12/site-packages/holidays-0.77.dist-info/RECORD @@ -0,0 +1,1111 @@ +holidays-0.77.dist-info/INSTALLER,sha256=zuuue4knoyJ-UwPPXg8fezS7VCrXJQrAP7zeNuwvFQg,4 +holidays-0.77.dist-info/METADATA,sha256=MGMAqp9LuoGBzGtXGvB-6Hn7LwRdHH5oJ-pc8ZzjZy4,46448 +holidays-0.77.dist-info/RECORD,, +holidays-0.77.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91 +holidays-0.77.dist-info/licenses/CONTRIBUTORS,sha256=eMbBxUYXFhw9Q6RARcOC82MlZVoWlMTgQrOqaGs3838,2488 +holidays-0.77.dist-info/licenses/LICENSE,sha256=qaRbNMUziFD5hzKfNRApNOyW0rOkRWOZi8zAG9nJ4-k,1246 +holidays-0.77.dist-info/top_level.txt,sha256=VbGrOCSM-V2kztuL_7CoDKLOgzOc85ueFsng7VYerrQ,9 +holidays/__init__.py,sha256=8KEDrEA3kozqL5nvlN5I8kMeYb8mlQ-gtO25UhCB9R4,833 +holidays/__pycache__/__init__.cpython-312.pyc,, +holidays/__pycache__/constants.cpython-312.pyc,, +holidays/__pycache__/helpers.cpython-312.pyc,, +holidays/__pycache__/holiday_base.cpython-312.pyc,, +holidays/__pycache__/ical.cpython-312.pyc,, +holidays/__pycache__/observed_holiday_base.cpython-312.pyc,, +holidays/__pycache__/registry.cpython-312.pyc,, +holidays/__pycache__/utils.cpython-312.pyc,, +holidays/__pycache__/version.cpython-312.pyc,, +holidays/calendars/__init__.py,sha256=QHFZElyJazdO6BGEeCgcFD-0nd2MsZr_g61Ax3AjzZk,1520 +holidays/calendars/__pycache__/__init__.cpython-312.pyc,, +holidays/calendars/__pycache__/balinese_saka.cpython-312.pyc,, +holidays/calendars/__pycache__/buddhist.cpython-312.pyc,, +holidays/calendars/__pycache__/chinese.cpython-312.pyc,, +holidays/calendars/__pycache__/custom.cpython-312.pyc,, +holidays/calendars/__pycache__/gregorian.cpython-312.pyc,, +holidays/calendars/__pycache__/hebrew.cpython-312.pyc,, +holidays/calendars/__pycache__/hindu.cpython-312.pyc,, +holidays/calendars/__pycache__/islamic.cpython-312.pyc,, +holidays/calendars/__pycache__/julian.cpython-312.pyc,, +holidays/calendars/__pycache__/julian_revised.cpython-312.pyc,, +holidays/calendars/__pycache__/mongolian.cpython-312.pyc,, +holidays/calendars/__pycache__/persian.cpython-312.pyc,, +holidays/calendars/__pycache__/sinhala.cpython-312.pyc,, +holidays/calendars/__pycache__/thai.cpython-312.pyc,, +holidays/calendars/balinese_saka.py,sha256=lbax1UM6GMrUtpQZVcbKSPgJN6I2QoYe5p1DxNFwcqY,3306 +holidays/calendars/buddhist.py,sha256=VwBFc_K_aYgZ0XcK_GN0j9c8N0iE_WV5ybLpdUyWlE0,11405 +holidays/calendars/chinese.py,sha256=JwfSM7F4xJ9-33gCEw7Y3qN0P-UuBeBotOuWMnbmnEI,34386 +holidays/calendars/custom.py,sha256=yU_QoNnQ7L079iKz2V-eZIbrkPolGElEfSQ43eKvPbg,1250 +holidays/calendars/gregorian.py,sha256=cofHQ_X6o8cdcX93ZkYXdgPe81WzyTKEehGopTh4WbQ,2833 +holidays/calendars/hebrew.py,sha256=rtIciWVIspS8vfGJsk30MwhU7bV2knnpvepJlThY7Ok,40618 +holidays/calendars/hindu.py,sha256=n-fahybpPhZg-JW8KM4Tepv_kc2qaDM7uC2NdwFjvuo,40384 +holidays/calendars/islamic.py,sha256=ZRcI_xfHunvjwxyuDEfDmHTDpQrBwHPG163ghqB0LMw,102560 +holidays/calendars/julian.py,sha256=iFMLzBHfOzU-37kB_FymCcHd8KKuNDWQQDiAQKBUDuA,568 +holidays/calendars/julian_revised.py,sha256=8FRtk5uX1rVGEbVEC7sfnGtLh63zmrZyCQ-wnj1i6Ik,584 +holidays/calendars/mongolian.py,sha256=3dzvWbazuHO3jjhrna1Y9ab_8p2gbcKUUcn6XG696-o,8985 +holidays/calendars/persian.py,sha256=jvyne940362TvbM68tZfIkUIn55Iz3HXFVv_6r5mQt0,2140 +holidays/calendars/sinhala.py,sha256=_QdHG92Nhbbgp_mG1SbwY-dqpDD8dYEE3v00bAc14hs,11315 +holidays/calendars/thai.py,sha256=BPP35vNC4PBBcXNRmmzwhLqJVHn3XtinkhX0pgk3mE0,24888 +holidays/constants.py,sha256=Hu3fBOVnKuRqail8gY5deciuWbBv5_XC3oKomzVgx-c,1422 +holidays/countries/__init__.py,sha256=wLnCXN9wNQ5O6lnM2_jtb8xfPCDFJr_DzGGm0vT9Vyk,14430 +holidays/countries/__pycache__/__init__.cpython-312.pyc,, +holidays/countries/__pycache__/afghanistan.cpython-312.pyc,, +holidays/countries/__pycache__/aland_islands.cpython-312.pyc,, +holidays/countries/__pycache__/albania.cpython-312.pyc,, +holidays/countries/__pycache__/algeria.cpython-312.pyc,, +holidays/countries/__pycache__/american_samoa.cpython-312.pyc,, +holidays/countries/__pycache__/andorra.cpython-312.pyc,, +holidays/countries/__pycache__/angola.cpython-312.pyc,, +holidays/countries/__pycache__/anguilla.cpython-312.pyc,, +holidays/countries/__pycache__/antigua_and_barbuda.cpython-312.pyc,, +holidays/countries/__pycache__/argentina.cpython-312.pyc,, +holidays/countries/__pycache__/armenia.cpython-312.pyc,, +holidays/countries/__pycache__/aruba.cpython-312.pyc,, +holidays/countries/__pycache__/australia.cpython-312.pyc,, +holidays/countries/__pycache__/austria.cpython-312.pyc,, +holidays/countries/__pycache__/azerbaijan.cpython-312.pyc,, +holidays/countries/__pycache__/bahamas.cpython-312.pyc,, +holidays/countries/__pycache__/bahrain.cpython-312.pyc,, +holidays/countries/__pycache__/bangladesh.cpython-312.pyc,, +holidays/countries/__pycache__/barbados.cpython-312.pyc,, +holidays/countries/__pycache__/belarus.cpython-312.pyc,, +holidays/countries/__pycache__/belgium.cpython-312.pyc,, +holidays/countries/__pycache__/belize.cpython-312.pyc,, +holidays/countries/__pycache__/benin.cpython-312.pyc,, +holidays/countries/__pycache__/bermuda.cpython-312.pyc,, +holidays/countries/__pycache__/bolivia.cpython-312.pyc,, +holidays/countries/__pycache__/bonaire_sint_eustatius_and_saba.cpython-312.pyc,, +holidays/countries/__pycache__/bosnia_and_herzegovina.cpython-312.pyc,, +holidays/countries/__pycache__/botswana.cpython-312.pyc,, +holidays/countries/__pycache__/brazil.cpython-312.pyc,, +holidays/countries/__pycache__/british_virgin_islands.cpython-312.pyc,, +holidays/countries/__pycache__/brunei.cpython-312.pyc,, +holidays/countries/__pycache__/bulgaria.cpython-312.pyc,, +holidays/countries/__pycache__/burkina_faso.cpython-312.pyc,, +holidays/countries/__pycache__/burundi.cpython-312.pyc,, +holidays/countries/__pycache__/cabo_verde.cpython-312.pyc,, +holidays/countries/__pycache__/cambodia.cpython-312.pyc,, +holidays/countries/__pycache__/cameroon.cpython-312.pyc,, +holidays/countries/__pycache__/canada.cpython-312.pyc,, +holidays/countries/__pycache__/cayman_islands.cpython-312.pyc,, +holidays/countries/__pycache__/central_african_republic.cpython-312.pyc,, +holidays/countries/__pycache__/chad.cpython-312.pyc,, +holidays/countries/__pycache__/chile.cpython-312.pyc,, +holidays/countries/__pycache__/china.cpython-312.pyc,, +holidays/countries/__pycache__/christmas_island.cpython-312.pyc,, +holidays/countries/__pycache__/cocos_islands.cpython-312.pyc,, +holidays/countries/__pycache__/colombia.cpython-312.pyc,, +holidays/countries/__pycache__/congo.cpython-312.pyc,, +holidays/countries/__pycache__/cook_islands.cpython-312.pyc,, +holidays/countries/__pycache__/costa_rica.cpython-312.pyc,, +holidays/countries/__pycache__/croatia.cpython-312.pyc,, +holidays/countries/__pycache__/cuba.cpython-312.pyc,, +holidays/countries/__pycache__/curacao.cpython-312.pyc,, +holidays/countries/__pycache__/cyprus.cpython-312.pyc,, +holidays/countries/__pycache__/czechia.cpython-312.pyc,, +holidays/countries/__pycache__/denmark.cpython-312.pyc,, +holidays/countries/__pycache__/djibouti.cpython-312.pyc,, +holidays/countries/__pycache__/dominica.cpython-312.pyc,, +holidays/countries/__pycache__/dominican_republic.cpython-312.pyc,, +holidays/countries/__pycache__/dr_congo.cpython-312.pyc,, +holidays/countries/__pycache__/ecuador.cpython-312.pyc,, +holidays/countries/__pycache__/egypt.cpython-312.pyc,, +holidays/countries/__pycache__/el_salvador.cpython-312.pyc,, +holidays/countries/__pycache__/equatorial_guinea.cpython-312.pyc,, +holidays/countries/__pycache__/estonia.cpython-312.pyc,, +holidays/countries/__pycache__/eswatini.cpython-312.pyc,, +holidays/countries/__pycache__/ethiopia.cpython-312.pyc,, +holidays/countries/__pycache__/falkland_islands.cpython-312.pyc,, +holidays/countries/__pycache__/faroe_islands.cpython-312.pyc,, +holidays/countries/__pycache__/fiji.cpython-312.pyc,, +holidays/countries/__pycache__/finland.cpython-312.pyc,, +holidays/countries/__pycache__/france.cpython-312.pyc,, +holidays/countries/__pycache__/french_guiana.cpython-312.pyc,, +holidays/countries/__pycache__/french_polynesia.cpython-312.pyc,, +holidays/countries/__pycache__/french_southern_territories.cpython-312.pyc,, +holidays/countries/__pycache__/gabon.cpython-312.pyc,, +holidays/countries/__pycache__/georgia.cpython-312.pyc,, +holidays/countries/__pycache__/germany.cpython-312.pyc,, +holidays/countries/__pycache__/ghana.cpython-312.pyc,, +holidays/countries/__pycache__/gibraltar.cpython-312.pyc,, +holidays/countries/__pycache__/greece.cpython-312.pyc,, +holidays/countries/__pycache__/greenland.cpython-312.pyc,, +holidays/countries/__pycache__/grenada.cpython-312.pyc,, +holidays/countries/__pycache__/guadeloupe.cpython-312.pyc,, +holidays/countries/__pycache__/guam.cpython-312.pyc,, +holidays/countries/__pycache__/guatemala.cpython-312.pyc,, +holidays/countries/__pycache__/guernsey.cpython-312.pyc,, +holidays/countries/__pycache__/guinea.cpython-312.pyc,, +holidays/countries/__pycache__/guyana.cpython-312.pyc,, +holidays/countries/__pycache__/haiti.cpython-312.pyc,, +holidays/countries/__pycache__/honduras.cpython-312.pyc,, +holidays/countries/__pycache__/hongkong.cpython-312.pyc,, +holidays/countries/__pycache__/hungary.cpython-312.pyc,, +holidays/countries/__pycache__/iceland.cpython-312.pyc,, +holidays/countries/__pycache__/india.cpython-312.pyc,, +holidays/countries/__pycache__/indonesia.cpython-312.pyc,, +holidays/countries/__pycache__/iran.cpython-312.pyc,, +holidays/countries/__pycache__/ireland.cpython-312.pyc,, +holidays/countries/__pycache__/isle_of_man.cpython-312.pyc,, +holidays/countries/__pycache__/israel.cpython-312.pyc,, +holidays/countries/__pycache__/italy.cpython-312.pyc,, +holidays/countries/__pycache__/ivory_coast.cpython-312.pyc,, +holidays/countries/__pycache__/jamaica.cpython-312.pyc,, +holidays/countries/__pycache__/japan.cpython-312.pyc,, +holidays/countries/__pycache__/jersey.cpython-312.pyc,, +holidays/countries/__pycache__/jordan.cpython-312.pyc,, +holidays/countries/__pycache__/kazakhstan.cpython-312.pyc,, +holidays/countries/__pycache__/kenya.cpython-312.pyc,, +holidays/countries/__pycache__/kuwait.cpython-312.pyc,, +holidays/countries/__pycache__/kyrgyzstan.cpython-312.pyc,, +holidays/countries/__pycache__/laos.cpython-312.pyc,, +holidays/countries/__pycache__/latvia.cpython-312.pyc,, +holidays/countries/__pycache__/lebanon.cpython-312.pyc,, +holidays/countries/__pycache__/lesotho.cpython-312.pyc,, +holidays/countries/__pycache__/libya.cpython-312.pyc,, +holidays/countries/__pycache__/liechtenstein.cpython-312.pyc,, +holidays/countries/__pycache__/lithuania.cpython-312.pyc,, +holidays/countries/__pycache__/luxembourg.cpython-312.pyc,, +holidays/countries/__pycache__/macau.cpython-312.pyc,, +holidays/countries/__pycache__/madagascar.cpython-312.pyc,, +holidays/countries/__pycache__/malawi.cpython-312.pyc,, +holidays/countries/__pycache__/malaysia.cpython-312.pyc,, +holidays/countries/__pycache__/maldives.cpython-312.pyc,, +holidays/countries/__pycache__/mali.cpython-312.pyc,, +holidays/countries/__pycache__/malta.cpython-312.pyc,, +holidays/countries/__pycache__/marshall_islands.cpython-312.pyc,, +holidays/countries/__pycache__/martinique.cpython-312.pyc,, +holidays/countries/__pycache__/mauritania.cpython-312.pyc,, +holidays/countries/__pycache__/mauritius.cpython-312.pyc,, +holidays/countries/__pycache__/mayotte.cpython-312.pyc,, +holidays/countries/__pycache__/mexico.cpython-312.pyc,, +holidays/countries/__pycache__/micronesia.cpython-312.pyc,, +holidays/countries/__pycache__/moldova.cpython-312.pyc,, +holidays/countries/__pycache__/monaco.cpython-312.pyc,, +holidays/countries/__pycache__/mongolia.cpython-312.pyc,, +holidays/countries/__pycache__/montenegro.cpython-312.pyc,, +holidays/countries/__pycache__/montserrat.cpython-312.pyc,, +holidays/countries/__pycache__/morocco.cpython-312.pyc,, +holidays/countries/__pycache__/mozambique.cpython-312.pyc,, +holidays/countries/__pycache__/namibia.cpython-312.pyc,, +holidays/countries/__pycache__/nauru.cpython-312.pyc,, +holidays/countries/__pycache__/nepal.cpython-312.pyc,, +holidays/countries/__pycache__/netherlands.cpython-312.pyc,, +holidays/countries/__pycache__/new_caledonia.cpython-312.pyc,, +holidays/countries/__pycache__/new_zealand.cpython-312.pyc,, +holidays/countries/__pycache__/nicaragua.cpython-312.pyc,, +holidays/countries/__pycache__/niger.cpython-312.pyc,, +holidays/countries/__pycache__/nigeria.cpython-312.pyc,, +holidays/countries/__pycache__/niue.cpython-312.pyc,, +holidays/countries/__pycache__/norfolk_island.cpython-312.pyc,, +holidays/countries/__pycache__/north_macedonia.cpython-312.pyc,, +holidays/countries/__pycache__/northern_mariana_islands.cpython-312.pyc,, +holidays/countries/__pycache__/norway.cpython-312.pyc,, +holidays/countries/__pycache__/oman.cpython-312.pyc,, +holidays/countries/__pycache__/pakistan.cpython-312.pyc,, +holidays/countries/__pycache__/palau.cpython-312.pyc,, +holidays/countries/__pycache__/palestine.cpython-312.pyc,, +holidays/countries/__pycache__/panama.cpython-312.pyc,, +holidays/countries/__pycache__/papua_new_guinea.cpython-312.pyc,, +holidays/countries/__pycache__/paraguay.cpython-312.pyc,, +holidays/countries/__pycache__/peru.cpython-312.pyc,, +holidays/countries/__pycache__/philippines.cpython-312.pyc,, +holidays/countries/__pycache__/poland.cpython-312.pyc,, +holidays/countries/__pycache__/portugal.cpython-312.pyc,, +holidays/countries/__pycache__/puerto_rico.cpython-312.pyc,, +holidays/countries/__pycache__/qatar.cpython-312.pyc,, +holidays/countries/__pycache__/reunion.cpython-312.pyc,, +holidays/countries/__pycache__/romania.cpython-312.pyc,, +holidays/countries/__pycache__/russia.cpython-312.pyc,, +holidays/countries/__pycache__/saint_barthelemy.cpython-312.pyc,, +holidays/countries/__pycache__/saint_kitts_and_nevis.cpython-312.pyc,, +holidays/countries/__pycache__/saint_lucia.cpython-312.pyc,, +holidays/countries/__pycache__/saint_martin.cpython-312.pyc,, +holidays/countries/__pycache__/saint_pierre_and_miquelon.cpython-312.pyc,, +holidays/countries/__pycache__/saint_vincent_and_the_grenadines.cpython-312.pyc,, +holidays/countries/__pycache__/samoa.cpython-312.pyc,, +holidays/countries/__pycache__/san_marino.cpython-312.pyc,, +holidays/countries/__pycache__/sao_tome_and_principe.cpython-312.pyc,, +holidays/countries/__pycache__/saudi_arabia.cpython-312.pyc,, +holidays/countries/__pycache__/senegal.cpython-312.pyc,, +holidays/countries/__pycache__/serbia.cpython-312.pyc,, +holidays/countries/__pycache__/seychelles.cpython-312.pyc,, +holidays/countries/__pycache__/sierra_leone.cpython-312.pyc,, +holidays/countries/__pycache__/singapore.cpython-312.pyc,, +holidays/countries/__pycache__/sint_maarten.cpython-312.pyc,, +holidays/countries/__pycache__/slovakia.cpython-312.pyc,, +holidays/countries/__pycache__/slovenia.cpython-312.pyc,, +holidays/countries/__pycache__/solomon_islands.cpython-312.pyc,, +holidays/countries/__pycache__/south_africa.cpython-312.pyc,, +holidays/countries/__pycache__/south_korea.cpython-312.pyc,, +holidays/countries/__pycache__/spain.cpython-312.pyc,, +holidays/countries/__pycache__/sri_lanka.cpython-312.pyc,, +holidays/countries/__pycache__/suriname.cpython-312.pyc,, +holidays/countries/__pycache__/svalbard_and_jan_mayen.cpython-312.pyc,, +holidays/countries/__pycache__/sweden.cpython-312.pyc,, +holidays/countries/__pycache__/switzerland.cpython-312.pyc,, +holidays/countries/__pycache__/taiwan.cpython-312.pyc,, +holidays/countries/__pycache__/tanzania.cpython-312.pyc,, +holidays/countries/__pycache__/thailand.cpython-312.pyc,, +holidays/countries/__pycache__/timor_leste.cpython-312.pyc,, +holidays/countries/__pycache__/togo.cpython-312.pyc,, +holidays/countries/__pycache__/tokelau.cpython-312.pyc,, +holidays/countries/__pycache__/tonga.cpython-312.pyc,, +holidays/countries/__pycache__/trinidad_and_tobago.cpython-312.pyc,, +holidays/countries/__pycache__/tunisia.cpython-312.pyc,, +holidays/countries/__pycache__/turkey.cpython-312.pyc,, +holidays/countries/__pycache__/turks_and_caicos_islands.cpython-312.pyc,, +holidays/countries/__pycache__/tuvalu.cpython-312.pyc,, +holidays/countries/__pycache__/ukraine.cpython-312.pyc,, +holidays/countries/__pycache__/united_arab_emirates.cpython-312.pyc,, +holidays/countries/__pycache__/united_kingdom.cpython-312.pyc,, +holidays/countries/__pycache__/united_states.cpython-312.pyc,, +holidays/countries/__pycache__/united_states_minor_outlying_islands.cpython-312.pyc,, +holidays/countries/__pycache__/united_states_virgin_islands.cpython-312.pyc,, +holidays/countries/__pycache__/uruguay.cpython-312.pyc,, +holidays/countries/__pycache__/uzbekistan.cpython-312.pyc,, +holidays/countries/__pycache__/vanuatu.cpython-312.pyc,, +holidays/countries/__pycache__/vatican_city.cpython-312.pyc,, +holidays/countries/__pycache__/venezuela.cpython-312.pyc,, +holidays/countries/__pycache__/vietnam.cpython-312.pyc,, +holidays/countries/__pycache__/wallis_and_futuna.cpython-312.pyc,, +holidays/countries/__pycache__/yemen.cpython-312.pyc,, +holidays/countries/__pycache__/zambia.cpython-312.pyc,, +holidays/countries/__pycache__/zimbabwe.cpython-312.pyc,, +holidays/countries/afghanistan.py,sha256=f9JhviqYyu96uHmAhadFUuwexdknfL7c8jitWt0j5vQ,5829 +holidays/countries/aland_islands.py,sha256=YsdE9QrHZXyjE9fPXY3SvT7QfVtVspewlTCW0dILCaM,1349 +holidays/countries/albania.py,sha256=SqU19yIO57uwbpjHx8U9-XYuSD-cBZu46t87Cg6-82A,5752 +holidays/countries/algeria.py,sha256=anRDTYOGjKytIyw2lwwq5lIrYVikr5dFmJ5vIbUsyp8,3749 +holidays/countries/american_samoa.py,sha256=xDGtuVVdqJIAFZHXOEo0X57m1U7j9oNwtDVEqn0mjLo,1160 +holidays/countries/andorra.py,sha256=yp5WKnuLTyp3M4SI8pQlVrMBCQRbjBd3qNJJomKhUjA,11235 +holidays/countries/angola.py,sha256=efv5QKb3eDmY9sAewUGxyYYQIXc-MHk2RTUOCqAV8A0,7399 +holidays/countries/anguilla.py,sha256=3bblKJp2abi_G1m5O4HEBogZmthEGB6kfogIP44J2TY,7519 +holidays/countries/antigua_and_barbuda.py,sha256=izo24Zw6dczz0sTf6So_BQZrsx-7CWESBzJOaYCn1pI,7022 +holidays/countries/argentina.py,sha256=OH61g5Cf8OosTIZO80TyIAh0xQ7RvF3FCL6QjLyIhf4,45513 +holidays/countries/armenia.py,sha256=qCKLdthbrcjDE50hIRR3ONjoAhuiH05G1qG5kv5Qcvo,3810 +holidays/countries/aruba.py,sha256=PDeeK2AYbMtf3Dojo7c4DFztZStIu3uRge8mEqYXfKk,5891 +holidays/countries/australia.py,sha256=edexK1fgYtlTJKN5Jdbc-WzfbcVr8tRf8C-wAc2B3zY,36987 +holidays/countries/austria.py,sha256=PwTsMvpENhUjzHete2W1JZGcfS9AV4hhYt3KcqLOyTc,4928 +holidays/countries/azerbaijan.py,sha256=xB7AvP7mCMKBXzfqpnu7x0KFkcRNUA8qEaI2LZ-8IEI,12872 +holidays/countries/bahamas.py,sha256=IzPmcH31u1-uKGm-tgRyVBNgXaYxw1EbCtqx8Tl0hb0,5686 +holidays/countries/bahrain.py,sha256=y8XUpZDig4lKSoVp4u868lKDd2_KfTsjmkyo3t4pERg,3500 +holidays/countries/bangladesh.py,sha256=x0I7l5ci8hKzUM4a2XtIXTzQgyJhzJ_ddnamNtm7fJA,1995 +holidays/countries/barbados.py,sha256=xwMvS-ZVGB1tnAIBUxJJmS840mYwgdn_McspT0VYq8o,4038 +holidays/countries/belarus.py,sha256=qgbpbPZpfPOYDu06hQ79U3jLsV6ekD8jYwRMsXO2pSQ,10218 +holidays/countries/belgium.py,sha256=4bmltstbqdAClzLNlt0jN1GhflTXOYrKV2Si_v8mwf4,2947 +holidays/countries/belize.py,sha256=QGvl5lxCbGlfTdwONMKaHG9Z-m9hhiNovxdYfE3H-MM,4142 +holidays/countries/benin.py,sha256=jp3ZMGg5icWIXfzqYNaOptzKbSpSbFEE_ZHj-EJ5Hl0,11685 +holidays/countries/bermuda.py,sha256=AgJB2GmcK29aVToLa1p4nJvYUjmVZ4GVR-jbiGcZXzw,6859 +holidays/countries/bolivia.py,sha256=fBF3BKHM_J6ME9dcChrcjMsbfqTOEhI9amB-9uiAJ2w,6390 +holidays/countries/bonaire_sint_eustatius_and_saba.py,sha256=gMoEUi5MUsDtMKy5CYpVAIR8QWL3AMdat223bbUxhSg,4757 +holidays/countries/bosnia_and_herzegovina.py,sha256=r095abK7etRvGFME75JSYOWUb8OtdtjWkrF6hejrhHw,10109 +holidays/countries/botswana.py,sha256=W1AbVuKElpL-rV2X3cTYrY9iL_oNnlnN4Zp8o1R2aMc,3362 +holidays/countries/brazil.py,sha256=TRE4jbALdh4J8djwLoJ8CccnTG-sakaRPnUgRzR5_QY,13674 +holidays/countries/british_virgin_islands.py,sha256=pGMktxs0IPAGYhdk4uxM0rVR-WiNbCoaoLxj1OyRFAA,8080 +holidays/countries/brunei.py,sha256=nDX4ayaACFr2F_pAn6SdJV8s9_cMmHRa74m7gySIyC0,18029 +holidays/countries/bulgaria.py,sha256=3TQEtgCl_Qo6WkUreVNGe1PRZphW5zGyQ11ilCWcWAw,5478 +holidays/countries/burkina_faso.py,sha256=18Hn9PylJc96OYPx01tKv16hWCUUrGhD-Si9Zsvu0k0,4364 +holidays/countries/burundi.py,sha256=WUQZjzclDy4eVb46hk6hOYnP6WstmN1C6SAr7k1M5kU,3457 +holidays/countries/cabo_verde.py,sha256=xzJCT6RDuQD348ze5PltfcHxUZbdIx52va17kNLimLU,11101 +holidays/countries/cambodia.py,sha256=tlKI2k-Lh8n_F15Oc1Bs--pb5Iotj-tY-XDCXJuH36g,15664 +holidays/countries/cameroon.py,sha256=QIU8No-2B1efRj7vresp21F8wSlnt-uWqH1aLjwn4ZQ,5550 +holidays/countries/canada.py,sha256=VAP0f94uO-fOJf_0HIN9pJ6q_eXuzow0XfnEo0hthJU,20029 +holidays/countries/cayman_islands.py,sha256=1L1sAH26L0e3-K14ypw9lTpOD6MwOK2-3b0De3JLDCc,7104 +holidays/countries/central_african_republic.py,sha256=s9xNKqJwzD1FUs0b6fCBvqAZrumlp51eMV9qdHSK5C0,4785 +holidays/countries/chad.py,sha256=FdZjGEPv0TqSVt0-9X1bcgnqT1NP8Rh_MF35TigMAmQ,4165 +holidays/countries/chile.py,sha256=Fs5J65tDIxabsgTqTk_TINNOXfjYkJeYa5jVkmGbagw,10212 +holidays/countries/china.py,sha256=kwaSDM4tiV7MF6wGEtRh1XtqHTHZAzwzishTsBmoziQ,21194 +holidays/countries/christmas_island.py,sha256=G_BJh1j2cesZi5gHsQ5H1B2eYXxE3qIOH6ppLHX36p4,9556 +holidays/countries/cocos_islands.py,sha256=xUpfhzNJD8ljGv7XcT2_VpjFJxSJZ-18F4_v6O5JskY,11645 +holidays/countries/colombia.py,sha256=9jMxBBhuoaqRkgzeCn6czhH2LqmPAIfhdXFynpWzI5Y,4811 +holidays/countries/congo.py,sha256=8GZAsIDudKT13x1cK7ifzUptVCKuvgh5nSv1thLxlVc,2470 +holidays/countries/cook_islands.py,sha256=unv9Nd2TVYwilYh_69RZ8-uchQMAWNHxneLRQX25TMI,6158 +holidays/countries/costa_rica.py,sha256=_psz2o49W1g7x-0cHjw_rGoGEXUKJGm74H_LR_KoNqc,4506 +holidays/countries/croatia.py,sha256=K_ragW28Lj3ABfiUUpfkSm0D8efNvL9E-114GADcB2I,3582 +holidays/countries/cuba.py,sha256=xLCgetuC66Su6iRzH-hdZN9r4SISy0Urcw5tVWWoT2g,4871 +holidays/countries/curacao.py,sha256=-l9sZhyaasiDg7zE34K6_82Arf30H84jKltHukJrNeU,5721 +holidays/countries/cyprus.py,sha256=YvtJtrAHIBd_VmSbuZZdUh7hzaIOS9KBZp5odpjb_xA,3585 +holidays/countries/czechia.py,sha256=ngp3zcxcHl-0k36ko5YRH0gOxg7qu2rsvVFrd7qj6fo,3797 +holidays/countries/denmark.py,sha256=xhbiuc-Fh6gRDDcBIpXlxnT_YZATRNX7GDEZLWWwj78,2853 +holidays/countries/djibouti.py,sha256=ZiW82ZFpaSpAYaEs1OG94bB4jrb1Wj70DjNy-iKn004,2882 +holidays/countries/dominica.py,sha256=YVWFy46P7TmihV_BZBDwRJEqY6zFG1dbKLX1_KE86WE,5321 +holidays/countries/dominican_republic.py,sha256=kHGtj68welSl3mLSTMSA1x8ePJD5iMVRGT3tVyVqOx0,3000 +holidays/countries/dr_congo.py,sha256=xqvtQweO6zxHS2wU5JT65aIsNcME_cKJllnZvacMK_s,5631 +holidays/countries/ecuador.py,sha256=A14R5feLhOktcKSfau3hn22DlbajzeNgZYzTWlF7Sx8,3932 +holidays/countries/egypt.py,sha256=TqqT5wT6Qs7J6AbR7FlsffPvPeNtKoQHG-Nz1TNVpJU,3801 +holidays/countries/el_salvador.py,sha256=pP7luTp-pYMKVNnUQkp22B49FDAGaAcbwd1EUiP0POo,3761 +holidays/countries/equatorial_guinea.py,sha256=BUHTGy5Yr22iaYqspulfLHEnWlp8pugorEkASkBQtTI,6189 +holidays/countries/estonia.py,sha256=5-GeHePVrLvyiXmEVXpnKDUnzTQJFZWUJ7M4rUx5o-w,2229 +holidays/countries/eswatini.py,sha256=MjjoG18BHxb2QT9ebxZqMhaPgwwGD8DB5goayXKVLUI,3293 +holidays/countries/ethiopia.py,sha256=EtHq9TaeWQ04ISymFyiCuXYLV31Pxqnqm0VtPRKHXqM,6237 +holidays/countries/falkland_islands.py,sha256=_AimxxPFsvA6QQ-buOVqu1AzaiJZJCv-iihMZS2LB9I,5717 +holidays/countries/faroe_islands.py,sha256=MACWPrmphuzkCS1_NaWrrNcNvpqgyT2jKnX-lu_0fHk,3516 +holidays/countries/fiji.py,sha256=W1tsJGtN_Eb3SVLjDXkrmKCw2XXbVi_D-1N4x-opmN8,7160 +holidays/countries/finland.py,sha256=h78GKmirSrtXzLS1xFdIiKiBYI7GyZIaJRNWmCBRKT0,13856 +holidays/countries/france.py,sha256=Ssqb_xyvvOU0su1wv2Jvh8WjmbJb_E_lJZBCh_82NuM,14266 +holidays/countries/french_guiana.py,sha256=k0hyogqmcTUtHyB1ykner0Bj963DpZSDvs6fmWkvLqE,1228 +holidays/countries/french_polynesia.py,sha256=mrfnE4sZjavX9xkrOMZfAES90HkdB0U8Q-YnUy24Dqk,1227 +holidays/countries/french_southern_territories.py,sha256=orrzqdAywcrcusFPKqvRC7Zt-V17PLmdLRRFkRPBsPc,1467 +holidays/countries/gabon.py,sha256=Xm-jjaszdCV8g9MKkHSrEJqmW3RRV3qdN5FDFl2Lkp8,4388 +holidays/countries/georgia.py,sha256=xVvcLSZm3bXWbFYJYteNq1rIfJsxBWWkMj_Tn8zvSuE,4566 +holidays/countries/germany.py,sha256=Em3w_a1iBvBUxjh23eOYBYX6k5yw1zoGTL2RR1xYxQo,9498 +holidays/countries/ghana.py,sha256=XkG8LvAGVQ3MorAD66CfbCHswwuTVFCuQ0Wd8m2Il6A,3417 +holidays/countries/gibraltar.py,sha256=57JzRuuMdqEnIBlSAC6_oX4cM9tStAioSmT_ICdi2YY,10524 +holidays/countries/greece.py,sha256=4BSic1B7x27CwI4AQNrLmUE-WxgUlOgAYYhBQCh7PHg,3600 +holidays/countries/greenland.py,sha256=Kn6nrzCxHasdRTCedMxnt4HL5l8UM32lOfEaE7Ecjww,3142 +holidays/countries/grenada.py,sha256=yL2Pi79hKYcrGDLEqU8hQeTbOgzYsWrsjW0LS3Lw9A8,6598 +holidays/countries/guadeloupe.py,sha256=qgkQ1_Gn6Lqy52SHn6zQZCHG5qflBTWIrHKvctnw7sw,1218 +holidays/countries/guam.py,sha256=US2s3JoL6P3qoTPwgnWl5DE-HgkhRqzzJLxP6j18wx4,1138 +holidays/countries/guatemala.py,sha256=RHqEfOMadq--y5g1ksCtdoYRtRrJsx1Od8w1_XR50Y0,3145 +holidays/countries/guernsey.py,sha256=Zp-wTbvfnO5EJQXKtwBrsuLI1Jy7vOkgXQN95nR6nCo,14831 +holidays/countries/guinea.py,sha256=G-xWs-Ox_5PhROL1a8FcZgfe47a8ciY8cs0o7cCFmRk,5998 +holidays/countries/guyana.py,sha256=mqdUP2dCT6VmG6YqtjMKDoeDn_Jf_4VwmHT_lbSk5cw,9908 +holidays/countries/haiti.py,sha256=P1WhurSKFXAB15VLNeEQrmK8ch13RUMa8U632XwcI8c,4264 +holidays/countries/honduras.py,sha256=9J9_DvStkrY1gHEwxDREAA6NyBsGOK_Aj9wxxUiymMk,2789 +holidays/countries/hongkong.py,sha256=BazZC4UJ5gmBoAVY1Ej_KfUTP7Cp8m0rAx1zKhrYCl4,16298 +holidays/countries/hungary.py,sha256=Ub4cbHGk_kKavyUY6RzKbnKk9_43SDdYlDVOZ7X8oWQ,10561 +holidays/countries/iceland.py,sha256=crwo_LD9qc4uAQWSXYZCpN_drpsK11o7lrndeoATSE8,3001 +holidays/countries/india.py,sha256=N_SDn4pIy6metMUxIqSJ3CzB2UHXM1cX5HR1Ns0vF9Y,20426 +holidays/countries/indonesia.py,sha256=_s2v4iH1fMpALxCdXcNmABVwv5j44K4iO9RnSCtCzDc,33112 +holidays/countries/iran.py,sha256=lT0YJKgeN9S5VmREE9yVg7eyRYO2RnIMl7pLlmj_TWs,16092 +holidays/countries/ireland.py,sha256=9ibumJB2bxO4yIRSORlwchTXnW6pJVObodajFs0Xel4,3172 +holidays/countries/isle_of_man.py,sha256=VEZyDqGsQqn8sObZcycxSeTYwkovKDK4tcL2JAE6G-o,2588 +holidays/countries/israel.py,sha256=gprzVFaD2pRib-xxcnNcH1bwifTsBjj86G_bf5bQpzU,5097 +holidays/countries/italy.py,sha256=wz2Agj_HNrQscYwC0wJN8oXzogF8THDwA_v_aYT85go,22232 +holidays/countries/ivory_coast.py,sha256=Hi3tWG3-TiPUKqrujt8UTaNvguSBH66AK1xqnutAH24,6113 +holidays/countries/jamaica.py,sha256=FqI3wVQUVSRf3YDnST-w9Fi-Kq_9PIELnStV5VXkO9Q,2475 +holidays/countries/japan.py,sha256=qmcTkP9XYo38G-776NzOJ5o-x5cZQfU0aTlEnoe25kE,8914 +holidays/countries/jersey.py,sha256=Nurw6_pWFQJVRQogY3Xd5kID8qABtwbKEilNxF0Ri8k,10733 +holidays/countries/jordan.py,sha256=eJT9LTnu12a3-IrhbeGEoh3Mup1jweAftrOI1pQGoc4,3322 +holidays/countries/kazakhstan.py,sha256=K0AACexvn7E1xJ6EO5M2zz0EwHb0VXt_EcVe0p63sW0,12990 +holidays/countries/kenya.py,sha256=PBYjXdbBiIafripI-gcRNeZn-rPJgHOcHgk9vhKmZJM,8910 +holidays/countries/kuwait.py,sha256=PnnPe3Slk7vwmoCxH4FpuaV3MOAuoH2IvJa4EwimJFs,3235 +holidays/countries/kyrgyzstan.py,sha256=RYq5M3DdwshEJKZM957BMWacQ4ghVFIdEDG5bVmOGV8,3024 +holidays/countries/laos.py,sha256=EUIUAFb2NCRGO_OhxMV-CfKNHBdMHwyit8HwmfwBv8s,17678 +holidays/countries/latvia.py,sha256=wm8pkcHuKesA3NYTb9BHHcH31dWAyVXGIiLJgSBRebE,4261 +holidays/countries/lebanon.py,sha256=Xmc4lrEImCK5iUs4U_D-tr1bSX6UlZePVpwl1uAEtVQ,14776 +holidays/countries/lesotho.py,sha256=fTYUWvU2ko-C4GaLjAalYC1TVa4FEODV_7wHNQwAuEk,2781 +holidays/countries/libya.py,sha256=0lyzmAZ_o3p4MSCGl1BORTQ-F7dJ1T8Ass3jPTM91qI,8131 +holidays/countries/liechtenstein.py,sha256=9_EmpnLTJ4NSVEmnRPdObrl308DPH0sFBgFDUmWb4Mk,3282 +holidays/countries/lithuania.py,sha256=jhswyF3C20eHT8LpmXBoBDUNZ7JQ0PCO8nnkJRqkVGc,3188 +holidays/countries/luxembourg.py,sha256=glr76Wyfx27uCDBRWc8yNBMhK6CT-xnXgphlvgFHlr8,2205 +holidays/countries/macau.py,sha256=bdA3z9KCvDMkFP1BV4MlKb37gWqarK3Jod9bnL_5GfM,19802 +holidays/countries/madagascar.py,sha256=tjQWhGplc6xgnsX4GWaUUQeDSrZk0kVgBdAJDW991rY,3167 +holidays/countries/malawi.py,sha256=RYViAPnp9iu6eMC27g6NUILl112KDeME9akkWKrUp3U,2257 +holidays/countries/malaysia.py,sha256=zdyVkOQmT_rZKtm9b9qqP9hTY6YxcGiof4WV1ewlt2A,31433 +holidays/countries/maldives.py,sha256=VmxJsyHUqwy08gAlDsM1XTY9GzUddOVNwo0IieY0KKk,3010 +holidays/countries/mali.py,sha256=fNJ-41SaPvd4c-8SWqELhZv4LtRn94i9P6XZ95-FpJ0,4998 +holidays/countries/malta.py,sha256=u5WORShQHIsNeEiZ20NX5iLTLGoaefNZJrwjuIEqifs,5129 +holidays/countries/marshall_islands.py,sha256=YiC6U7cPXdD3I6QZYv2NnRCNjpWRepRXGKl1SkMECX0,3370 +holidays/countries/martinique.py,sha256=MPLSm1ZtrUTKdvqHSqg6xXWHPgipeAZo85qRakDZbVc,1218 +holidays/countries/mauritania.py,sha256=FtcfQxsW2G5XSsLNC0pJM00in-m3RLpfOm9CvU1weTM,2392 +holidays/countries/mauritius.py,sha256=XVlP5R0GZ2woAJNUGBNEXS2HKbpx2Oxsg_SG7YeMnIs,6971 +holidays/countries/mayotte.py,sha256=h8hcVVgvb3v2dqMnhf6Gu5S-dMP3f4aI3DOMmXMrRBg,1206 +holidays/countries/mexico.py,sha256=Hb64Hz2fz54gQkYT0ilAQhcwSd_ttE5iNqqRQ1Y_EtM,3338 +holidays/countries/micronesia.py,sha256=Y7otcCld8uj_axZ4_aZlICMIBGW7nczdd3_li4TZKrw,9329 +holidays/countries/moldova.py,sha256=Ez0m2am5rRSimDVy0Z5voX2Cu1RSdEM08nvpXD1jFZo,3370 +holidays/countries/monaco.py,sha256=ASHws-sNAXuxJ54ajqqJep5u8SZcz4l7MpDZaTIjE84,3103 +holidays/countries/mongolia.py,sha256=RfM0KY6nVznN1E7QgWflcSOYmGu1MiNoSu8NaufaMXQ,8281 +holidays/countries/montenegro.py,sha256=tGbdDEHfNnW9eU6nCkDzJN05S8Qk_hz5DF5S8vBcX4E,6603 +holidays/countries/montserrat.py,sha256=RM2JfLPKte9noKI75mIBc1CPtTnYvzQGWrUcFqDMw4M,8013 +holidays/countries/morocco.py,sha256=BQwiyXLtnE8RJlwjEj0C4ZqMzrIxO4IU-7Xjm6maUaI,3906 +holidays/countries/mozambique.py,sha256=1WHOPjr3JpzVR0NxpZuwNMgHsIP8N4zAlQ8WpU9uERE,2485 +holidays/countries/namibia.py,sha256=zqIP5ztoM_CBI0xgyjV9hMme_lrAc_MOwoFWJ5q8CXE,7628 +holidays/countries/nauru.py,sha256=i31C6cZJUBBYykGeyvIX7bi6i8hiLILeDFbQMARUOYY,5441 +holidays/countries/nepal.py,sha256=WnYGVsPqaTvr2EpbnHBEpfapJkooW3z8BGUbfEMmvzM,13669 +holidays/countries/netherlands.py,sha256=qhKS2XfnQlOrb0Vm9P2iKY5h9vNiP6rdSMKsSwfFTe4,3332 +holidays/countries/new_caledonia.py,sha256=N5DqUjhAvcO_uKxwoySsy9P-mvJKP9ArcBV28dpd-uo,1216 +holidays/countries/new_zealand.py,sha256=dEM7ZLQCHBb9gfUkPZWOK_FIWc2IubdGBa8xxrDHbHI,11210 +holidays/countries/nicaragua.py,sha256=OEnUBW5C1yJJ1o0CDnpsmAf_cG9P316hSACmFY59nXM,3736 +holidays/countries/niger.py,sha256=hrruaeyeK7_VKt5tXvuqTv4WegC4IE4Rn4rBTzYLo08,9896 +holidays/countries/nigeria.py,sha256=kBCxaMk4iQL9vZQMNc_L7lru0k772wtZrsmHmFcvJ8s,3514 +holidays/countries/niue.py,sha256=xQJCVJtL-gIcDtI9dI-YBIT39wLVbgu_60Q66V-cKl8,4487 +holidays/countries/norfolk_island.py,sha256=o8FbSCOSWLMtL9o-175x8-JYUCFeu4B08SB7u47qf9c,5185 +holidays/countries/north_macedonia.py,sha256=Iz_1N7r-NsRLCPztwUe1fpVLVGmsklW3tOIBKYRbwgc,11997 +holidays/countries/northern_mariana_islands.py,sha256=wCJkJAV1vx4AOp6P-Xw3lCQYTBg2Dd-3iJimxB-Io2I,1176 +holidays/countries/norway.py,sha256=bqkdNtMaySGBtuZ7hdeku2TMvj3tf9blFiaBfMQs3Io,4608 +holidays/countries/oman.py,sha256=ioy5xrmr1xYMhC7Y4uUcrNJsQCVWs2gWWycwDRsucJM,5837 +holidays/countries/pakistan.py,sha256=XfDjvolYQSsd8MJIVUb11oRi4DgpI_iJIxpdc4V--v4,6199 +holidays/countries/palau.py,sha256=KKXUzg4l5en30BzdPeZEJYB0tYea-mdDf94OVyzySpc,5148 +holidays/countries/palestine.py,sha256=igjb3uoHLVGNdm8W5mD3jgkyUkzCjoBot9vCmbzbIWE,6224 +holidays/countries/panama.py,sha256=sqUOszkEdNA3NwczAVXGelLt7kmw-zn6O75J1kC1Wc4,4738 +holidays/countries/papua_new_guinea.py,sha256=WxPOxe9k1WKDqv4uNPudi5BSm1McIq6A0ZKcpZcUMBM,8247 +holidays/countries/paraguay.py,sha256=9-vQdTuhOk2MI6cPsdQpjyn52-h5O7mU8meAnju8KH8,8945 +holidays/countries/peru.py,sha256=g23z-Z0udo67xTuPbeM7gMLDzQ-s1cSpsS2J9aAd0aY,3456 +holidays/countries/philippines.py,sha256=WFhS9HZR34JOy3WB3TfFZkmtZ4JMOb2Mf3nkO6fuZ0k,12117 +holidays/countries/poland.py,sha256=Idf437U3u9SO0w-GnyDjebV40WU9kaWTTzBvx2RQMv8,4666 +holidays/countries/portugal.py,sha256=jJUcKvfJMMYE5YFe_TEQACRChdhwPHt7mEDrdWz6-tg,9958 +holidays/countries/puerto_rico.py,sha256=ov7SNpgEbzkEuPhmifn6twz4j9g0YPIGOgtWO4Afol0,1151 +holidays/countries/qatar.py,sha256=b0Eh9c9OTn1QF39Pw2mcOT6qYNMfHZ-_2Z9liJKTFKs,5248 +holidays/countries/reunion.py,sha256=RJYIu-gkRxl4dNnIOZemCi36OPGV0wpJ03CpnMQBaWs,1211 +holidays/countries/romania.py,sha256=cvCIXRcAD_4h-azPO82DkFIOI29ZBHCkBFs_x5XuUDE,3055 +holidays/countries/russia.py,sha256=5OR4HoeHTa55flXu_aWrtG7jbK5fv9I0ojChng61t3w,19990 +holidays/countries/saint_barthelemy.py,sha256=8Ut9dSIszHoK6oYcHjJd7f7P_2sjDR0owfg0OUoJOCU,1199 +holidays/countries/saint_kitts_and_nevis.py,sha256=1AnDEprkmfrQbJM2j93kudGOhlMtqoNW3u_iALDPNaQ,8984 +holidays/countries/saint_lucia.py,sha256=eQAvIkDulpQe7W_OI-7hdgdMllR9zzEq7YnWWwFD2UU,3222 +holidays/countries/saint_martin.py,sha256=viZYplDJ_hbk3scK_BlaiuwPxTmVj5hMz5ZQjbI_4iw,1201 +holidays/countries/saint_pierre_and_miquelon.py,sha256=ZoGf0gAvdsrNBUHCcGr1eGnpKTzmraS2hc5YnN0QxIc,1217 +holidays/countries/saint_vincent_and_the_grenadines.py,sha256=VLx3fPvVzwQTy2pC4myNm4k7LYTaezUwDsPu0aouRH8,5479 +holidays/countries/samoa.py,sha256=YF0C9pAKahP7QS9Gkq8DEIjdL6KGOHyvfHeoNf1dz5g,2344 +holidays/countries/san_marino.py,sha256=BaWmz3ZgKMFHah5mnx1Mb7go_m-iTRTD4ACntDlhG7U,4067 +holidays/countries/sao_tome_and_principe.py,sha256=CeY2Ijjis0aDHGuxtdp-lFOFJUw0UncOm4A4kvs_uzU,4073 +holidays/countries/saudi_arabia.py,sha256=Cb2K8MpBRMoDcAveVGpUawEHIqfKexAuqZghfFukqPY,5011 +holidays/countries/senegal.py,sha256=MgX5kvdfwFWQnl2kc1qKFYxjUDgEoH93CUXfRD7LMOI,6671 +holidays/countries/serbia.py,sha256=HSerfR91eeFY2IqSaA_JFDOl7iykLcVKk2w9Q9sgYh8,2843 +holidays/countries/seychelles.py,sha256=NJcduAy2p-jwEkNil1hRl5izAZP-TJUPIcffPzHLjks,6883 +holidays/countries/sierra_leone.py,sha256=1rq4cHJ4RW0dnqG_6yXhmQkuLDcF75UeDrkJS41_4Gc,4837 +holidays/countries/singapore.py,sha256=FzKajp4yX2xIn-aYy8yOFZUb4bOerZKVGI7F7Vc88BY,10276 +holidays/countries/sint_maarten.py,sha256=vRAcncQ2lhrPyZ8JlAAy856RoJUquIJEsc8fRA6FaZM,4136 +holidays/countries/slovakia.py,sha256=phzXXMH-tjucNUa5Z_qSQeyCeYgGaEoWi_mYJcPF-pg,4221 +holidays/countries/slovenia.py,sha256=ofhSDvSKQW6DXxCuLCchAAAT24CUp8pkUqjytnzdyes,4837 +holidays/countries/solomon_islands.py,sha256=XXcZfAccPmzaaVoNaWSgKV1gSRDd3kui9va9qaMX4GM,9015 +holidays/countries/south_africa.py,sha256=2gMKcAkPk14uYRq15DOQ-zz8jIV3LpMTppIBRSuu6gg,5933 +holidays/countries/south_korea.py,sha256=Q_imGBe8HIwVZAKbYor84RW9T0FnRHrAEvj_mxcogOk,24512 +holidays/countries/spain.py,sha256=O_zdlqhyz0Svn030NDCfVGD9jHDoe7NLpotkyzbT_tU,29652 +holidays/countries/sri_lanka.py,sha256=ba3v6hncjr9kGaF3sjmtl0JK9opaG6l2eFSjjFV4-XQ,20299 +holidays/countries/suriname.py,sha256=9-UsXe7rnx8MLmSVQG1b6l8HGtaoxzyXj9BcX0uFceA,7488 +holidays/countries/svalbard_and_jan_mayen.py,sha256=Jq0_MoHGXs_NKoJdvv4D_cNZLT8RWo-vy5NedT9GASg,1123 +holidays/countries/sweden.py,sha256=Fo-CB0l3upY6shCL_eiEcvEobcZKxaHjEozoIqnrLY4,4203 +holidays/countries/switzerland.py,sha256=YBfJ0AMZb3scpvnSvOPSmkk4m8RvyeD__WNa79w5m00,17145 +holidays/countries/taiwan.py,sha256=BuRzqId9wHzzQNirz4iUJDSfrzqJuZ244ac3Bb5rmBU,18233 +holidays/countries/tanzania.py,sha256=Sirhpui7iml-aPmySixMt20m4MXFwmPoWVYU2BYLBn4,11363 +holidays/countries/thailand.py,sha256=LWCjZ1r-lRjwvoYZ5LDqrE4ASJv1YoT-W0EMcm-pcJY,60961 +holidays/countries/timor_leste.py,sha256=Kr_YmgDOsAB_YXb0UmugtPglOi1Yt2jsdzG3mazb8IA,24815 +holidays/countries/togo.py,sha256=L6ybYzHYufo_5nJkEoBBsHPq9A9yFU411PIhEgxUvGk,7290 +holidays/countries/tokelau.py,sha256=V3YqIdSgGH_aD-UfO_B8FMxYBSt8npQO02NfZQlkAMg,2078 +holidays/countries/tonga.py,sha256=nCGewL1qk0lf9sWX66q5HDl_JO7b_m6IH5q4Gq9-Hw8,10146 +holidays/countries/trinidad_and_tobago.py,sha256=8BRurz7R7-fBUoKTfFYkxK3dvicT_hL__1v4LBlP4vY,6908 +holidays/countries/tunisia.py,sha256=3MDTgfYmOX1oYk1ynJLRoWZ6fRAVtUsp2vXxeMXILQw,3074 +holidays/countries/turkey.py,sha256=MG2f45QFz8xi9IprYteAilRWxpI9e6AEyKY-svWdz7o,9771 +holidays/countries/turks_and_caicos_islands.py,sha256=jySGlOhdtp7Yl-wWdL3BbQAK_xasERfWkfiGAKtBrLk,5635 +holidays/countries/tuvalu.py,sha256=pBJYGSqPAPyk9euH9NEX5BBNWUcYTiry9A7bEaPQAcQ,6410 +holidays/countries/ukraine.py,sha256=MIy0-5kHq9qnuqXkwC5Huah9B8dLztTVw-CBJZGrBN0,16650 +holidays/countries/united_arab_emirates.py,sha256=KhoJJYm55hgdJU2hli6WRxfbfAA2OPW48TW9xfoKBc8,9736 +holidays/countries/united_kingdom.py,sha256=wGKClKJiordN_enA1VhOS23x7tSTtM5EzsVSGIfRCIw,7673 +holidays/countries/united_states.py,sha256=5CcnFSOziN159ml-fNLMipJHgkszwGnyZPFPwj0jGG8,54853 +holidays/countries/united_states_minor_outlying_islands.py,sha256=rl5UoQRLwcN7npZDcqeRPaB5Y7PshydRI_rjzSMbDec,1228 +holidays/countries/united_states_virgin_islands.py,sha256=u9jBUDZG9XcVBR72EPr5Vkmvsh7PngIFsImijJrQcKY,1192 +holidays/countries/uruguay.py,sha256=4OGQQ4IT-bu0wwwe-_9kBAnX-G4YemD_7w375ShotEM,6535 +holidays/countries/uzbekistan.py,sha256=IAm6Z6KHYPSppKFl3eBFj5jSw4MvHFyJ-LW9YJP8vpE,8450 +holidays/countries/vanuatu.py,sha256=KnXVG-8PhTGrp73jXBSQ3261rku_vu7lOdcJCtKOMrQ,3543 +holidays/countries/vatican_city.py,sha256=4afXzcsJsWjWENHuTgPKqG0-l0A3ah5FkR--Ef9cUEM,8196 +holidays/countries/venezuela.py,sha256=QCCt53734NVUgcAHRyNwtucgPQSB-CBGO_Un6NJA41s,4556 +holidays/countries/vietnam.py,sha256=-PSuQVdgvsWu_iBne2EaeTbE6YcxTsHhU1Nj1HfPk90,6566 +holidays/countries/wallis_and_futuna.py,sha256=ydAcsCxb0ezUZmSaGLkNOgtGNlbUQWuqtKi5GLCqtIE,1208 +holidays/countries/yemen.py,sha256=puKDnXJoT93iM0bdihZBu3JdyiFPsAYLAOrYQlGzSfs,7473 +holidays/countries/zambia.py,sha256=_8FpItIcUR706zpCVWxrUPcNUFEvph6O6jSWBdIVV98,4040 +holidays/countries/zimbabwe.py,sha256=pKtQxJZnZuGlSbhYOmjokbDOFV7EQGivByfqdA_WKeo,2842 +holidays/deprecations/__pycache__/v1_incompatibility.cpython-312.pyc,, +holidays/deprecations/v1_incompatibility.py,sha256=zYekWOcZB_NjQZg6w6tsNIcVTwLPrEPWQJQnjd4bF4o,1853 +holidays/financial/__init__.py,sha256=bQcGJ65bAnBIbiTMCzebHuI_0LsiDtspjBryfJIzCMA,875 +holidays/financial/__pycache__/__init__.cpython-312.pyc,, +holidays/financial/__pycache__/brasil_bolsa_balcao.cpython-312.pyc,, +holidays/financial/__pycache__/european_central_bank.cpython-312.pyc,, +holidays/financial/__pycache__/ice_futures_europe.cpython-312.pyc,, +holidays/financial/__pycache__/ny_stock_exchange.cpython-312.pyc,, +holidays/financial/brasil_bolsa_balcao.py,sha256=K95QMPmsbGSAS-6bDLS_QOxir-P4qFY_LdPf7lhgeYA,4925 +holidays/financial/european_central_bank.py,sha256=2u6zd12t0DHQB3RpPRM_lfZKkG5B3m7ZhQFuXFijXPA,2168 +holidays/financial/ice_futures_europe.py,sha256=aTOVWzjSDu4Y5XLSvGhWfqDBmecTiA0UCVxPqQcWrh4,1861 +holidays/financial/ny_stock_exchange.py,sha256=6hSGW_-pEXIlgb0lOO6DYcCVgb33see2yROWJRbdR0U,10896 +holidays/groups/__init__.py,sha256=7Fuo39UxhtKsWV31gMUZmFkyylJCkeXVtG_ThshKNT8,1379 +holidays/groups/__pycache__/__init__.cpython-312.pyc,, +holidays/groups/__pycache__/balinese_saka.cpython-312.pyc,, +holidays/groups/__pycache__/buddhist.cpython-312.pyc,, +holidays/groups/__pycache__/chinese.cpython-312.pyc,, +holidays/groups/__pycache__/christian.cpython-312.pyc,, +holidays/groups/__pycache__/custom.cpython-312.pyc,, +holidays/groups/__pycache__/eastern.cpython-312.pyc,, +holidays/groups/__pycache__/hebrew.cpython-312.pyc,, +holidays/groups/__pycache__/hindu.cpython-312.pyc,, +holidays/groups/__pycache__/international.cpython-312.pyc,, +holidays/groups/__pycache__/islamic.cpython-312.pyc,, +holidays/groups/__pycache__/mongolian.cpython-312.pyc,, +holidays/groups/__pycache__/persian.cpython-312.pyc,, +holidays/groups/__pycache__/sinhala.cpython-312.pyc,, +holidays/groups/__pycache__/thai.cpython-312.pyc,, +holidays/groups/balinese_saka.py,sha256=1hMUC-o6Aq4OLerPiHnClRoUaDq0iY89J8zZ6hInso4,1550 +holidays/groups/buddhist.py,sha256=qRleoAALM-CYkfgTcjIwfGCi1euVl1Pa8fjbfqvbsYc,2224 +holidays/groups/chinese.py,sha256=WClAZw8Qxi010fdyKXPCYGm8Qzf2UZkQqyEw_qA3SXs,10232 +holidays/groups/christian.py,sha256=Klh5jmD_TQQypOOPAR5MkMR-lwnShu524EWDQOpykxo,17285 +holidays/groups/custom.py,sha256=-J_3aP9fNOaekg0yy0N2hcocu3VCCnt5GhH31anb0uI,1966 +holidays/groups/eastern.py,sha256=-tfMyMdyWBrhigfUNcc9KWUhonCR-4Spy1T-Th9oPq8,1608 +holidays/groups/hebrew.py,sha256=bJBluUDSnw4ypCJ_-ujPhL0v_H5GzTOrbnfbEoRSqLw,5632 +holidays/groups/hindu.py,sha256=qFYx-Pe7mRndzd2eIF3SVGdbPrz5vOmuRxVYZeTgM9c,18346 +holidays/groups/international.py,sha256=JugC7H9meqI8yA61g-AQcJKAjj9Gw8EtyIi90YTJQWU,7932 +holidays/groups/islamic.py,sha256=6B1xmjWR7n7gZDgFZWhhJD96d4cpxiAe9HFTX1EEZDA,16113 +holidays/groups/mongolian.py,sha256=du_O2WVP5PiP7bpKrlnnnxIJy-4meco7mW3h9zuElK0,4119 +holidays/groups/persian.py,sha256=dlV0t6KCieKA5mq0D_SxEGSf5RORzGWpO8JNo9OnYn0,6590 +holidays/groups/sinhala.py,sha256=0amb0O5-6wgrsCjui1K1OQwt2bjZWBwbaz5zhvi9XDQ,7124 +holidays/groups/thai.py,sha256=aJxilGPwDKyoCK_7HjfMlkrstPo17KSBMzP3MEoC6bo,6777 +holidays/helpers.py,sha256=PPCLc-YhNrK2_-2Zdy-K0Ip3F6hzJILLC9GnR8jSPQs,1382 +holidays/holiday_base.py,sha256=gRuetNZhzhQqMbm3fl7JQwJhJ_oAgX4o9tmPHCtWLEw,54869 +holidays/ical.py,sha256=edR0dmrtpio2KhgZhzpna7xuUlhorzFcN2rPyvUut8U,8466 +holidays/locale/am/LC_MESSAGES/ET.mo,sha256=_O7Yyd07dmM-dQVI7x9U7QZeKR43jHm4uFaEDnkzV60,430 +holidays/locale/ar/LC_MESSAGES/AE.mo,sha256=CcSUP5y9rIlctZRrTGkrx-6AchU207UasVT_KY70uzs,428 +holidays/locale/ar/LC_MESSAGES/BH.mo,sha256=CcSUP5y9rIlctZRrTGkrx-6AchU207UasVT_KY70uzs,428 +holidays/locale/ar/LC_MESSAGES/CA.mo,sha256=rxZl40i3RIAzQ6vup1DS-g8U7pFJQqr6ybC9R4uO9Ug,2509 +holidays/locale/ar/LC_MESSAGES/DJ.mo,sha256=a_FlFv27rK-DKcyHQ-nRKWEeLprPx1_bCXgjavaw51o,1301 +holidays/locale/ar/LC_MESSAGES/DZ.mo,sha256=CcSUP5y9rIlctZRrTGkrx-6AchU207UasVT_KY70uzs,428 +holidays/locale/ar/LC_MESSAGES/EG.mo,sha256=CcSUP5y9rIlctZRrTGkrx-6AchU207UasVT_KY70uzs,428 +holidays/locale/ar/LC_MESSAGES/ET.mo,sha256=fIXu2E4ERZ_k7t-Ufrrmswsfp-FpVBu_MHJ-zoGHPA8,1999 +holidays/locale/ar/LC_MESSAGES/JO.mo,sha256=CBOy5tlaQWvVVAb4HyEUV4vz3oewk0tHGr-GMgUSshU,428 +holidays/locale/ar/LC_MESSAGES/KW.mo,sha256=CBOy5tlaQWvVVAb4HyEUV4vz3oewk0tHGr-GMgUSshU,428 +holidays/locale/ar/LC_MESSAGES/LB.mo,sha256=SLAjae00fYJzheDzGPzwzBcYsEUbPouqyS74IGw_krU,415 +holidays/locale/ar/LC_MESSAGES/LY.mo,sha256=nmhnOubL03MO_IoUVLQsQczv9oJBoYlHhuraR7njmh8,415 +holidays/locale/ar/LC_MESSAGES/MA.mo,sha256=CcSUP5y9rIlctZRrTGkrx-6AchU207UasVT_KY70uzs,428 +holidays/locale/ar/LC_MESSAGES/OM.mo,sha256=Eysu-trnqvbMY5jxYNyyYdGQNVdnDiQXnx4X5vxrOHk,427 +holidays/locale/ar/LC_MESSAGES/PS.mo,sha256=Mam67x7_S-SRc0SKB-dWfd5VdMWC-BXCU7VHEO6ebBo,416 +holidays/locale/ar/LC_MESSAGES/SA.mo,sha256=RZlCFlCZMNCgbYSUq8Y-LiYf1d_5ba1qJ_WJL_mdC2w,428 +holidays/locale/ar/LC_MESSAGES/TN.mo,sha256=CcSUP5y9rIlctZRrTGkrx-6AchU207UasVT_KY70uzs,428 +holidays/locale/ar/LC_MESSAGES/UA.mo,sha256=VgbDJ9yaljSrC4humw-hSh-d7njsUkSy94Y2-H0km04,2603 +holidays/locale/ar/LC_MESSAGES/YE.mo,sha256=8AiplqRygeNGgwoo9M0FXBh-xxsgc5dPT9JCDWs_foo,427 +holidays/locale/ar_QA/LC_MESSAGES/QA.mo,sha256=yfZC9CPnD3B7sOjwy7fDKMggPbKRpt_kZwoQn7PetRA,422 +holidays/locale/az/LC_MESSAGES/AZ.mo,sha256=cd7d2bAOPmNuO0g2TXvMA7wSfR9y2TFRcYWE16R_FEM,428 +holidays/locale/be/LC_MESSAGES/BY.mo,sha256=4mOfnAKZLWrEdN5eSsjl0tOznKQ3ecA7OhvwUc_zsns,430 +holidays/locale/bg/LC_MESSAGES/BG.mo,sha256=dNKuKggj_pdeCZfnQBfZqOcJGsbJm6sfTg0FIySEbUY,430 +holidays/locale/bs/LC_MESSAGES/BA.mo,sha256=VohPus2NuXdqkSDhs1gvx6v05Q-n_FKPJjlOj3IxwXQ,433 +holidays/locale/ca/LC_MESSAGES/AD.mo,sha256=5iVdiMIEOCCmDF4WUrloxO0S2yS_OQNxnJZ7Tp3uz-U,427 +holidays/locale/cnr/LC_MESSAGES/ME.mo,sha256=kYP6vXh8xWbFG6atpZuuuRyEPrBMe6e3-tqGmRLVd20,429 +holidays/locale/coa_CC/LC_MESSAGES/CC.mo,sha256=MqgRBvwk1p8H4lCfr0NSv6Gm_qS97tW_5dfEnKGvR8M,1376 +holidays/locale/cs/LC_MESSAGES/CZ.mo,sha256=vQE_f2BgRsDK1NWF2iQLGeJTN4kvEvKOYJ931L5xBwE,428 +holidays/locale/da/LC_MESSAGES/DK.mo,sha256=3v-juxEuZIyWyeLFrkyWc8YJh9bHNy75b4viY9xLgM4,430 +holidays/locale/da/LC_MESSAGES/FO.mo,sha256=iLsox7FLn-utaxN6rYq_hebqMOpbl6keSZJY25CEAE8,1165 +holidays/locale/da/LC_MESSAGES/GL.mo,sha256=VmLNuZNuSLrUSh9w507HG5aoxzaAUaggueqc02jjnfs,1163 +holidays/locale/de/LC_MESSAGES/AT.mo,sha256=VKz21lIRtcqvCt0iiIsfU9wVFANRre4_UMQsGnQZIw0,433 +holidays/locale/de/LC_MESSAGES/BE.mo,sha256=0mq6hUhokL_rIKxVOyuW5_CjIHFhGmtNSDvcYuspUkQ,1126 +holidays/locale/de/LC_MESSAGES/CH.mo,sha256=gNUFen2pMWlXvXN63dJHx94vPXoVTWBxK6zzmpxgTRE,431 +holidays/locale/de/LC_MESSAGES/CV.mo,sha256=m5N1av7GHhfJZzbEG5CYH5tjWckGKGUjBwGTYF4ZofI,3174 +holidays/locale/de/LC_MESSAGES/DE.mo,sha256=2CLfV9wAuKTmoBq0MlC8lHtqjN1Ol4XRTMOkJCnSnzc,433 +holidays/locale/de/LC_MESSAGES/LI.mo,sha256=y03yx4Wv20KEH6-n9Vwp2K9n08FWzMmVJ4UbmWDDiJ8,431 +holidays/locale/de/LC_MESSAGES/LU.mo,sha256=570ATcj399-Fxq3HtJesCXzOT1joP5il8nrHIUTCo_s,944 +holidays/locale/de/LC_MESSAGES/PL.mo,sha256=wTXbkwtEu5OCFQEctHpoOCGd347P2XO13xaq1M0L4YY,1990 +holidays/locale/el/LC_MESSAGES/CY.mo,sha256=yBBdP5XZikLzJ5rqNsr3b5kH20sPH2-I5u_GRTB8WhI,430 +holidays/locale/el/LC_MESSAGES/GR.mo,sha256=W_g6vg-PMpEy5DEYgDeFnchju8uzaAZEsRgUTXDxZps,430 +holidays/locale/en_AI/LC_MESSAGES/AI.mo,sha256=unoEwnlcIwwIthW1LYsvpsNErDVwFVcpCDYSqedAeFU,431 +holidays/locale/en_AU/LC_MESSAGES/AU.mo,sha256=tmRtUEl3D4-U2p-feFjGorTCSoHzHsJ54_QNrFPC_1U,435 +holidays/locale/en_BM/LC_MESSAGES/BM.mo,sha256=5JdgazpI60bhyon1x0lxts4wjQ7UdhjEccv8OivnsEE,421 +holidays/locale/en_BQ/LC_MESSAGES/BQ.mo,sha256=JYQ2BTDQzbXz095NR319IJImH6F_xUO7ru50bI9OWho,1216 +holidays/locale/en_CA/LC_MESSAGES/CA.mo,sha256=VvQth9ZJYWHHq6MSDt7TigOS2tbiWLGDd7FCq1QoPgU,436 +holidays/locale/en_CC/LC_MESSAGES/CC.mo,sha256=AluAUQjiS9nwUFvBVvAGNHsB5ThNuxvFPZ6kf7kc04M,446 +holidays/locale/en_CI/LC_MESSAGES/CI.mo,sha256=SmYxacdPQNa99ZprNA29Vbad-tkYAg2rjPwYmC1tad8,1725 +holidays/locale/en_CK/LC_MESSAGES/CK.mo,sha256=LtFQZ9KtuZzie1w8LOQyiYe2RqeoOUorX5TIL7irKgM,422 +holidays/locale/en_CX/LC_MESSAGES/CX.mo,sha256=Y3C8LbvY2bDTxJ5_ffFlx6q2Dx_8GjKRMg-dW2_0JmE,437 +holidays/locale/en_CY/LC_MESSAGES/CY.mo,sha256=2OZlHWw2poOp21Psj4VHep0ON7Cw28twwARsG8R7MM4,1669 +holidays/locale/en_ET/LC_MESSAGES/ET.mo,sha256=FBQhfHq_V4ea0s-r_XTiOe9LhOz7SYM0h1B1NejYWpo,1734 +holidays/locale/en_FM/LC_MESSAGES/FM.mo,sha256=79m9SrSxO9oB0SlnzstkBOX2IfW7WhKO9z7bUWwBfkk,421 +holidays/locale/en_GB/LC_MESSAGES/FK.mo,sha256=pYMsmaH-UYPTFtI9891LKD8eRZThybiaIcb8vaVxLpE,420 +holidays/locale/en_GB/LC_MESSAGES/GB.mo,sha256=qJAr_3fmg5ZrtLE1h1QbF7wygwfRO49gjj-qC4AXLDs,435 +holidays/locale/en_GB/LC_MESSAGES/GI.mo,sha256=vmRZPWXedFCbX-Ezk8FILwtLbwPApJhD1TALQy2U6Wc,422 +holidays/locale/en_GB/LC_MESSAGES/IM.mo,sha256=7DhOKtNSVM_LbzY2h6YPzFCoqZkBI22QjhUceXD6dvU,435 +holidays/locale/en_GB/LC_MESSAGES/KY.mo,sha256=sTMG1keBzu_Y1yKJ1H-xhax1WpQlLNrg__B-MuJiVnE,420 +holidays/locale/en_GB/LC_MESSAGES/TV.mo,sha256=YS0hvCWlDCvSVaPOeYTxamUu-ljf9fL7rNZ5sL4Zc4k,1494 +holidays/locale/en_GD/LC_MESSAGES/GD.mo,sha256=bHvuzmkf7QHbF1W7Z1tYHn2GOX4C4XkOYaRUss5oqjY,421 +holidays/locale/en_GY/LC_MESSAGES/GY.mo,sha256=6bMMeq8pC9ElG9k6pceLkNOIZxsUea4RW8WZvDbhC0g,421 +holidays/locale/en_HK/LC_MESSAGES/HK.mo,sha256=NX3Uk1kbnpcJMCH1nIrAndBq28z4mKBBoAyrRjhazB4,3464 +holidays/locale/en_IN/LC_MESSAGES/IN.mo,sha256=egpGOzOVAawpzumQh8JUjSrizF0rs-JWPlRpWZIZjuo,450 +holidays/locale/en_KE/LC_MESSAGES/KE.mo,sha256=fR-7LEqVidlv1pkZZ4bBVSbGleqPU-d6WLeyIvRfksU,433 +holidays/locale/en_LC/LC_MESSAGES/LC.mo,sha256=jzpxLYkf9em7TmiGjmLkY20fiohIzPzLRvR8KBC3-gA,431 +holidays/locale/en_MO/LC_MESSAGES/MO.mo,sha256=iRi1XQ06geXQai80-VWWJXg7jVaBtKHBAMGzKwNuAGk,4339 +holidays/locale/en_MS/LC_MESSAGES/MS.mo,sha256=qTddAnK3J_ZNLSyKlGOnIymS_4MW7-bBJJNocCv0JIk,422 +holidays/locale/en_MU/LC_MESSAGES/MU.mo,sha256=3QsHkknWiMl3Y6M5HoaxAxyCndxcEjXopdGpRZl7f2U,421 +holidays/locale/en_NA/LC_MESSAGES/NA.mo,sha256=LBEFnSOjPcXdLTRzUi-2AtmbUO3RpUzoa2-YMP8i5IU,409 +holidays/locale/en_NF/LC_MESSAGES/NF.mo,sha256=Rz4rgBFqnC0TW_3GgJvm4bqvXyIdNnlgKnSKV3Qg74Q,413 +holidays/locale/en_NR/LC_MESSAGES/NR.mo,sha256=J4L2xPOpXp1oRwaXqB5B4vU9ly7nVYYqdYq8Ru9R4fQ,423 +holidays/locale/en_NU/LC_MESSAGES/NU.mo,sha256=vKZo4f6V91fhb_-CMGm5561orhA4fjBKbg62rClZhNU,420 +holidays/locale/en_PH/LC_MESSAGES/PH.mo,sha256=27UwFnI2CSAqOx-2wFaz-YEDx2B8cCiRY28n_NFboKw,435 +holidays/locale/en_PK/LC_MESSAGES/PK.mo,sha256=S6HOEpBi1IWpKLh9RkCCIxhHhcOsoc7z1WatAk3KBm0,446 +holidays/locale/en_SC/LC_MESSAGES/SC.mo,sha256=ph-IFX1NAJ-v5GJ9Y2im9ADXcuMKR4y0fMw4EymtJ0s,438 +holidays/locale/en_SG/LC_MESSAGES/SG.mo,sha256=H3sUZFFFoeVtPGna52kplGdapK6hdkkR6_hgw9IGIRM,435 +holidays/locale/en_SL/LC_MESSAGES/SL.mo,sha256=831W25snQRS_tcDuTC0yz7szN2nraHiVoQwFPs_n6Pk,1162 +holidays/locale/en_TC/LC_MESSAGES/TC.mo,sha256=3HSMqY2oVG1OWZ2La17a0vKpQrPEuny5EguNTisro90,416 +holidays/locale/en_TK/LC_MESSAGES/TK.mo,sha256=aZbdswDHhucQtnkFSTuE2BeXbMxQDwEFgdUGu552lD4,413 +holidays/locale/en_TL/LC_MESSAGES/TL.mo,sha256=ZG52Ql2_oc6vMHiB_RIEGDorPVhO0-YZrMshPm2PvXQ,2987 +holidays/locale/en_TT/LC_MESSAGES/TT.mo,sha256=0ofF67o8iLSdufZyiyyUEnVcTWq8FFO638IqM0qzq4k,423 +holidays/locale/en_US/LC_MESSAGES/AD.mo,sha256=YkREZOSB6Pw_mEhWodJnzKUwsl-Fcice3Yh7reVTNkI,1944 +holidays/locale/en_US/LC_MESSAGES/AE.mo,sha256=6UCl8hemzn6bZEOKAomo87Rpy_tTNX3Rf_jzZfRBBBw,1320 +holidays/locale/en_US/LC_MESSAGES/AF.mo,sha256=lDdJ64OGb1lzsEi7GpdWYB1GHo1TL_R8uYlSqGS7Qzg,1372 +holidays/locale/en_US/LC_MESSAGES/AI.mo,sha256=WG-_8-2ahKQynCbf1aHa7ceulH2K_hHdX1pwzTfsavY,1784 +holidays/locale/en_US/LC_MESSAGES/AL.mo,sha256=PTVY0dlk3gqP5MRHtpMbE0Ew_QafAZdTsxOwXJyuV0s,1572 +holidays/locale/en_US/LC_MESSAGES/AM.mo,sha256=KgUkRTivoW2LwRiq5gjtLyvON6-x2pKFsuWbDzG_fcI,1536 +holidays/locale/en_US/LC_MESSAGES/AO.mo,sha256=o_doGFXD5ap4IYHPII3BHIdK99sc8giXdu9XBaJl7S8,1892 +holidays/locale/en_US/LC_MESSAGES/AR.mo,sha256=U_TOmuNxYM3tVqSZ7fZWtdSjglY7PK1tZmFxD9gTasc,7790 +holidays/locale/en_US/LC_MESSAGES/AS.mo,sha256=atsqriiTEonrf3s5Ikpft5tZb84sxKb9AZum-8gotU8,435 +holidays/locale/en_US/LC_MESSAGES/AT.mo,sha256=PRDYuqHb_4al0ig2jfA9juvgNuHARLmRCePANyp1FhY,1451 +holidays/locale/en_US/LC_MESSAGES/AU.mo,sha256=GTrQqhw1ClPnel7M9VMwjQJ40zBPODwDw0Bu9pJWZjE,2288 +holidays/locale/en_US/LC_MESSAGES/AW.mo,sha256=gwXqq4QKBWIu5FIzBsG9stlZrLWLG4HU0i4O8zhsFtQ,1156 +holidays/locale/en_US/LC_MESSAGES/AX.mo,sha256=PTZYBdfUdfDdmhjOVygvJ-fnRgVoJAaqIp6r0H2FoV8,436 +holidays/locale/en_US/LC_MESSAGES/AZ.mo,sha256=mOSkZIYkm5L5eJQ1Uwu9f2zhoNmSNcejFG5nDeFTFXE,2030 +holidays/locale/en_US/LC_MESSAGES/BA.mo,sha256=sVDOW5fA0_eX2YFLCz0GPvyPjvrxfGhZK-ycdrTkpgc,1721 +holidays/locale/en_US/LC_MESSAGES/BE.mo,sha256=ErBh6R6IeixT8VI-I5i8wOpjlpGxMLjgKi3hAvbk0tE,1118 +holidays/locale/en_US/LC_MESSAGES/BG.mo,sha256=0itpj7NRo8rjZfl91xFWoBRuGwh-9t4H4hnPPgDO6tg,1801 +holidays/locale/en_US/LC_MESSAGES/BH.mo,sha256=0fw5e1mT9YqY1EeN5TMrlt8VKy1Qt64vD_DLpLxkFWc,1090 +holidays/locale/en_US/LC_MESSAGES/BJ.mo,sha256=6kqQ6Xzkp-C38PXtalEl24vV5UGdjgsVhlEbuHPpL6g,1630 +holidays/locale/en_US/LC_MESSAGES/BL.mo,sha256=11h_PNcIOizEJ8ksLIAFm_kSal0oREgNE3bTp_VneQQ,432 +holidays/locale/en_US/LC_MESSAGES/BM.mo,sha256=2Rx_CGi0UhJ5GBL6wdxdaccUTFz0m1goQo6g29-TDCo,1338 +holidays/locale/en_US/LC_MESSAGES/BN.mo,sha256=w5o1vfvn4dHknjWruUrvFj2ue88QYxqW-i4LuW08PeI,1681 +holidays/locale/en_US/LC_MESSAGES/BO.mo,sha256=JwG92nsYXiS3y6-n-zE1TU-wRpbcX1vzrmbbfnJYnZY,1665 +holidays/locale/en_US/LC_MESSAGES/BQ.mo,sha256=3-eZs5KvCgyLlNgqDTAwSXYaTxYtYZmgD1rhQPv3rBw,1215 +holidays/locale/en_US/LC_MESSAGES/BR.mo,sha256=F4ZP3sH8uVAwTAYknG-6IVnPuPhfFFtZpn8onLjPlZY,4213 +holidays/locale/en_US/LC_MESSAGES/BVMF.mo,sha256=63lPldmETG0K1fcnm-w6jhYDxmxwpOoHbPf8iGiqPXE,1142 +holidays/locale/en_US/LC_MESSAGES/BY.mo,sha256=hvWuc-LISZxrqT2d-fuKzROHBMUhJKZwiFHjJdJatGA,2376 +holidays/locale/en_US/LC_MESSAGES/CA.mo,sha256=ne2spS4yehcta6UxP4ocbMnLcP2fdKpWPX5cXSr8M44,2130 +holidays/locale/en_US/LC_MESSAGES/CC.mo,sha256=08t1yXdzRhUPDNjIZqguEXulWbb23gbB24p2_0OUy1E,1364 +holidays/locale/en_US/LC_MESSAGES/CD.mo,sha256=QzfMCe1d7fBPrL4y30ds5mM-S6oXErwBDdqNFUtQm0U,1861 +holidays/locale/en_US/LC_MESSAGES/CF.mo,sha256=IByNuKdtsV141dI1I7_IMMfXfjXvUNu4OfJgTGwoLu4,1141 +holidays/locale/en_US/LC_MESSAGES/CG.mo,sha256=VKeouM5JE8UST1UPkS7Etu8osGurLGClh2_URoMTVRM,892 +holidays/locale/en_US/LC_MESSAGES/CH.mo,sha256=cZqgx5g0JcJ-cqm9zMKFbvHLiE7ZM0bQNapTfOqPGDA,1598 +holidays/locale/en_US/LC_MESSAGES/CI.mo,sha256=Lqf75oUHD7EbSG8kY9CDrV1Noykc3i1goGFmq7c9H9Y,1735 +holidays/locale/en_US/LC_MESSAGES/CK.mo,sha256=X1TYW1XeUV7HQyVqDyCeyAnUHsqLZIUJxVa3-iOaFPM,1615 +holidays/locale/en_US/LC_MESSAGES/CL.mo,sha256=gzkPg-EmWT0GN1Zxz4adjiWYFv2EfPn_jbf83tqMue8,2104 +holidays/locale/en_US/LC_MESSAGES/CN.mo,sha256=nAUthya34IOhT5gxTp_DpIsCYcoj8KlhAbrwxlxA3AM,1431 +holidays/locale/en_US/LC_MESSAGES/CO.mo,sha256=ym6sPVjXstGyR2I0AvFY8wEiVlKhkL3hhs1917vg5-I,1393 +holidays/locale/en_US/LC_MESSAGES/CR.mo,sha256=evi--fr7lSViYhFUQQZb9BibhyGbbWCGUjnElNElajo,1327 +holidays/locale/en_US/LC_MESSAGES/CU.mo,sha256=wu2ZaVWX0hRdpvOfyNN6_kJiEi0sIgAAtHhvxeVRrkc,1060 +holidays/locale/en_US/LC_MESSAGES/CV.mo,sha256=57pwxcpkDJTi5lVwrSfgq2AALYh9a9-KeAjSkFe04Ko,3187 +holidays/locale/en_US/LC_MESSAGES/CW.mo,sha256=qSpJk6wFu8a98Xu8Utu5KnVEJORT89HtmP_q9uEjYnE,1257 +holidays/locale/en_US/LC_MESSAGES/CX.mo,sha256=2uFgt9NbMlL_U-XmH5cwOeyjqDok6RCJN3lFPgLoQ2g,1171 +holidays/locale/en_US/LC_MESSAGES/CY.mo,sha256=a4uTQNX-SIqLpMdyLcHVBDU4BqttIi02pOzCqKV-Qsc,1680 +holidays/locale/en_US/LC_MESSAGES/CZ.mo,sha256=y2n4X2D7EYYr_lFXLhPHyZZJGptjaN8ddx4-n2XuTuQ,1583 +holidays/locale/en_US/LC_MESSAGES/DE.mo,sha256=zwmIojwqNLz1ycc9mRK38fCVPMmfUUJ4ZUKppAFpNws,1897 +holidays/locale/en_US/LC_MESSAGES/DJ.mo,sha256=bZGRU8kIBsHr8jmaryO4RvyDOw6T2urGmsAWxUf2YFE,1162 +holidays/locale/en_US/LC_MESSAGES/DK.mo,sha256=E07r4c-0HC9xsAiP9UNbzoDsKHI_wEc4qYzjF76lzdM,1102 +holidays/locale/en_US/LC_MESSAGES/DO.mo,sha256=NWp309F_-jK6ReSpQmQRIg0IWHa59UudhkQhfYc3u78,1045 +holidays/locale/en_US/LC_MESSAGES/DZ.mo,sha256=pHUTdfHyDvlH9IA15GI-7py_aII9uKc9apTSWDzhlJQ,1170 +holidays/locale/en_US/LC_MESSAGES/EC.mo,sha256=DEpYzQBUQKO6vT-nM6PdOl7mEKPm0jWtEpas31hj6wY,1014 +holidays/locale/en_US/LC_MESSAGES/EE.mo,sha256=cUprlfxmaBjd_BuiBEwL_YpkaJ8PTMnyIhX-Vjyn3_M,1009 +holidays/locale/en_US/LC_MESSAGES/EG.mo,sha256=u7uMTH1PBkm6iZsgpKKBhEqrBer9-0YmlOdhymN_2qU,1592 +holidays/locale/en_US/LC_MESSAGES/ES.mo,sha256=3zW9fRW2lBM90e0XLmP47ah0QS_hl4b3ocfvsiYvnUg,3289 +holidays/locale/en_US/LC_MESSAGES/ET.mo,sha256=LJnkhxo6JPPTtQpTFOQbmosAEEsN8zuT8qWHJQGQ61Y,1722 +holidays/locale/en_US/LC_MESSAGES/FI.mo,sha256=3t1Erb95WZqg1RLeUUsU7IqGhiDXMAON6LgdZQnRg1A,2995 +holidays/locale/en_US/LC_MESSAGES/FK.mo,sha256=gAutD-Fo2kDCZTIycYpYfZloFXWyqdXXC68ry9_OczM,1193 +holidays/locale/en_US/LC_MESSAGES/FM.mo,sha256=KD4H2E1VrEn5-T5ti5AYH3ZTuqbA9fuacNERquZpbDE,1783 +holidays/locale/en_US/LC_MESSAGES/FO.mo,sha256=lp9xy5KI36wFE6PqQc9W6l_LeY5tnfroGLN0XMGTZPg,1219 +holidays/locale/en_US/LC_MESSAGES/FR.mo,sha256=Qiwg7XV1Vk0vo1JAgkGCifxkFeUxEUprHp8SPRE_J24,1735 +holidays/locale/en_US/LC_MESSAGES/GB.mo,sha256=GkdNdDyGg83sFjthkyc5SYbeZb16NiRvzSFfzlfefOQ,1851 +holidays/locale/en_US/LC_MESSAGES/GD.mo,sha256=MfZcQg58H9Ogq7zgFeVtGkC5Cn1vY80nn4u666-pP7E,1218 +holidays/locale/en_US/LC_MESSAGES/GE.mo,sha256=kQXD4Zk6t_xJRjNIBGmssaOx0bJfG0CVkMg_cjx9BR4,1877 +holidays/locale/en_US/LC_MESSAGES/GF.mo,sha256=xdygrw6IOKYHkuqmhu5kGw1DtBXCLXHKxnyP834DLAc,432 +holidays/locale/en_US/LC_MESSAGES/GI.mo,sha256=se6IAAxlyZI6f8tYFwwqCoxU4SyHIr9dw5X8wu7ESIQ,1714 +holidays/locale/en_US/LC_MESSAGES/GL.mo,sha256=5kzm0TTD7yzTL37pp_Oxcw6YXuBiTXvmIKXC1ODhypk,1186 +holidays/locale/en_US/LC_MESSAGES/GN.mo,sha256=PY61TXgPs43L0CfGYbXVLchRUNGtjoiuF0juQ12Lsvs,1383 +holidays/locale/en_US/LC_MESSAGES/GP.mo,sha256=ZCuKXaz_M3_UrtD6myfdtwedYDduhDkmojRh1bOsh-Q,432 +holidays/locale/en_US/LC_MESSAGES/GQ.mo,sha256=QmMM1g7ARKmfdNGJupz-rTu5V1Fzj2WuOfV1edTYmyU,1434 +holidays/locale/en_US/LC_MESSAGES/GR.mo,sha256=BbD9Mn6hshbUJe5jnvT-iz6kTkHlXM8XMmHqaXYBE5Y,1426 +holidays/locale/en_US/LC_MESSAGES/GT.mo,sha256=EBUW5Mb2P4uuUiPp7Ypqk_q_ju54UenCTBfJF8d79rs,958 +holidays/locale/en_US/LC_MESSAGES/GU.mo,sha256=_pf18PewdLZtAijxqYG7fNcCdEUaC9Pva624WCQtHzQ,435 +holidays/locale/en_US/LC_MESSAGES/GY.mo,sha256=eW4O9XGc8G504UJ6R-2qZqh2W-yrx1GaTr44--t15I4,1311 +holidays/locale/en_US/LC_MESSAGES/HK.mo,sha256=c3pL3fJ2qbpcQJctRfESZ1wB2A014U0HgbTbn4_iaPQ,3352 +holidays/locale/en_US/LC_MESSAGES/HN.mo,sha256=4Z7SSA0ouubiQEYotriJrcbWHIlf7QEAzg9PjavBfVo,1000 +holidays/locale/en_US/LC_MESSAGES/HR.mo,sha256=I3w4fHYwQ7AnauSdt5LNdLnmVrpzu2_S7thdDrxFjvA,1392 +holidays/locale/en_US/LC_MESSAGES/HT.mo,sha256=G7IpKCJqDPSjLfTcD-1P3fuWtpk7cWgWYyPWbs0sWLA,1897 +holidays/locale/en_US/LC_MESSAGES/HU.mo,sha256=ldsFGH61mpo_RMAXyRytb6OaBkWrzHRgsXxzWGu2nag,1398 +holidays/locale/en_US/LC_MESSAGES/ID.mo,sha256=rthEf8WBjSOrMDGWa4shj934bGlr0JpOht6cKagnW0w,2881 +holidays/locale/en_US/LC_MESSAGES/IL.mo,sha256=vk92fgJoB4A6npAPHnYoncFl0k3_rFVkUHSWBAfsYpk,1399 +holidays/locale/en_US/LC_MESSAGES/IM.mo,sha256=bmK34YIuWzgUx6eUQQK1sG7j4tXp7LjTspS-QMSyRlQ,673 +holidays/locale/en_US/LC_MESSAGES/IN.mo,sha256=7AKBEIYPOv2bv5y82vuIxaufWDur4aYBT90yFHkbFLg,4110 +holidays/locale/en_US/LC_MESSAGES/IR.mo,sha256=zDo4SA0mM1yZPmtsRfd8RyPc5UjF8FmLrFdGB4-UgQA,2564 +holidays/locale/en_US/LC_MESSAGES/IS.mo,sha256=qdGHBpmJTrigEQI16Hpd9sCwCXofOHW4LN6pacoqFXQ,1250 +holidays/locale/en_US/LC_MESSAGES/JO.mo,sha256=hsZYIhQfxBDsvPa28eFcxXTPO2jCfrrQA5bISzx52E8,1176 +holidays/locale/en_US/LC_MESSAGES/JP.mo,sha256=S4yAfGSkjxtbXwocWxlqw1Sv3vDSmTuxZYbX_gpdR0E,1695 +holidays/locale/en_US/LC_MESSAGES/KE.mo,sha256=4PL7kPq9JmlNMrH1C0X9CUWBIVtrEcnwNSXmCDcmcpk,1796 +holidays/locale/en_US/LC_MESSAGES/KH.mo,sha256=0qzKXmsot4PJ683xC9cGO7RPfQx4iVvM_IxJOwt7gc0,4237 +holidays/locale/en_US/LC_MESSAGES/KR.mo,sha256=CfwnXuOA1c6zsPStl4PhXfKv4uXNbZm-xu988n68TaQ,3607 +holidays/locale/en_US/LC_MESSAGES/KW.mo,sha256=09OIjVK5N0HVCz6HOTPepMUpaxptxG8xgiqmOn_8OqI,1112 +holidays/locale/en_US/LC_MESSAGES/KY.mo,sha256=V4cNEMHzyn2akH0wHFSZnj8cdASX2ZZgZZG72vYnxNI,1563 +holidays/locale/en_US/LC_MESSAGES/KZ.mo,sha256=cWuk_8fZPIdG97WBWuR6W5IDBMAhJtMrTmtfT6URLIQ,1834 +holidays/locale/en_US/LC_MESSAGES/LA.mo,sha256=I1QQVOX0aNropRLA4tsRWZVStNenMSlcuFFFmX2n-H4,4096 +holidays/locale/en_US/LC_MESSAGES/LB.mo,sha256=QdPR_QY7dGUhqRPZ7aFkqzCFeeXnj4OX5bnMT61RtJU,2505 +holidays/locale/en_US/LC_MESSAGES/LC.mo,sha256=mQ8986rXSVplhbQc6WwQ3vY_4cS0kmDErvm6LTL1TWs,1056 +holidays/locale/en_US/LC_MESSAGES/LI.mo,sha256=jpFfNBZXox8rrdA3skU-mSbwNVKr6wtoehNdWJDJyCk,1408 +holidays/locale/en_US/LC_MESSAGES/LK.mo,sha256=MRzu9AqCjVMDZDfV2m-fJnlVFcaEyRJMlDA8HFYrEmQ,4183 +holidays/locale/en_US/LC_MESSAGES/LT.mo,sha256=YuGMVLX4y312SZZJAwe6Mzm4-zk8CdhsbbpyNGF-SIo,1501 +holidays/locale/en_US/LC_MESSAGES/LU.mo,sha256=XgwmhVwO65S5Iatc_glm6k4sSe3zk1PRql2pUwlnWck,935 +holidays/locale/en_US/LC_MESSAGES/LV.mo,sha256=f1CFuVi4XHc8j_KfR_lWWHZnh4E1K6A4vT0hSTh8tUE,1704 +holidays/locale/en_US/LC_MESSAGES/LY.mo,sha256=9U2iUSfnAx4-w7ZCFzGaYJ3zi6i-syXQt9ldoG7MGhQ,2067 +holidays/locale/en_US/LC_MESSAGES/MA.mo,sha256=it0WtkavQzKIC3fpCtuWe18rPVKz_k1G86iiKAWe39g,1375 +holidays/locale/en_US/LC_MESSAGES/MC.mo,sha256=nHT_7bRf3QFhoNJWygWPIsxzL1NaAFGo80b5IR3u7cA,1099 +holidays/locale/en_US/LC_MESSAGES/MD.mo,sha256=BHCu0IxMAjz7QtONrKGWx_GW87wxEpS2iEN6dOLRIlc,1444 +holidays/locale/en_US/LC_MESSAGES/ME.mo,sha256=tQQrDH9bqWgBoed7rsvat-iORYVCnKo9in_wT_S-Se4,1221 +holidays/locale/en_US/LC_MESSAGES/MF.mo,sha256=GcLlbORzLvgAB6QmfajPTYiSIR4MzrsYlUSp8ABqBRs,432 +holidays/locale/en_US/LC_MESSAGES/MG.mo,sha256=guhJAcKJRIVDn0KQcVyOymG2l8X_K_5lYJq1aIhbUVY,1230 +holidays/locale/en_US/LC_MESSAGES/MK.mo,sha256=VEaS5PNPwNxLGMO6-Jc62ekYIujqMrMz1r3Kw7nlmN8,2493 +holidays/locale/en_US/LC_MESSAGES/ML.mo,sha256=ZOvxhrI8LDDEx2t738OT0FBexQP2lM-GP2AYNraAXxg,1214 +holidays/locale/en_US/LC_MESSAGES/MN.mo,sha256=pqv50o2NBC1UOPjsd_pS0Br-ZX6LqSzhuVnwmoME5Z0,2691 +holidays/locale/en_US/LC_MESSAGES/MO.mo,sha256=j2HQE-DcAL8YCh4xQ8zDvCskFelcy4IP58dGIeZGUsg,4213 +holidays/locale/en_US/LC_MESSAGES/MP.mo,sha256=_pf18PewdLZtAijxqYG7fNcCdEUaC9Pva624WCQtHzQ,435 +holidays/locale/en_US/LC_MESSAGES/MQ.mo,sha256=dHrmibDCfRamaixzxjl9X25MCpsRV96WBVPHS4SI_w4,432 +holidays/locale/en_US/LC_MESSAGES/MS.mo,sha256=MVuIkF3s92Idym5UfbPY_ahvFGHrizfoiwQB-wJ04YI,1443 +holidays/locale/en_US/LC_MESSAGES/MT.mo,sha256=MiJDOO-0jM5GXP1UJZif1euvjLcpeBQHyf18mb1m2J0,1221 +holidays/locale/en_US/LC_MESSAGES/MU.mo,sha256=j5YP6dlP5Dm0c_DaPbLYwL3o3bxGOgxovQupjxxcZsU,1343 +holidays/locale/en_US/LC_MESSAGES/MX.mo,sha256=XbR6Qi2IBR_1moJbppE-NLG_-Yd2CNDnyzbSIRIMvGg,883 +holidays/locale/en_US/LC_MESSAGES/MY.mo,sha256=_Oi6sn19vuWulnErooBjDfMWOGVjts2T9ET9819iJXk,4353 +holidays/locale/en_US/LC_MESSAGES/MZ.mo,sha256=4E6puSHjsBhr0Oj5y5A5EBhMnyOxLlX2Va3E8Flv_6A,1053 +holidays/locale/en_US/LC_MESSAGES/NA.mo,sha256=MNSrPoZLqCjwfVf7sMQ1Ao3m4eEaT3MuQSRgyexPgVk,1807 +holidays/locale/en_US/LC_MESSAGES/NC.mo,sha256=dKhqZTEhV69NaOyWmQLkdN1e_vL7v0tq-WtwUloGIYE,432 +holidays/locale/en_US/LC_MESSAGES/NE.mo,sha256=UFQiAIXcMDfdb9HP7QbPf6qsy1oMACvx5m5MqxvUOUY,1586 +holidays/locale/en_US/LC_MESSAGES/NF.mo,sha256=XD6r_04rU55r74ZOgI25KHjOitsL8dboKjC6MhE1gpk,1127 +holidays/locale/en_US/LC_MESSAGES/NI.mo,sha256=9oggz_HgCEKw_Zfn7HIsatRz2GNWEYF92urR8tJ8aqo,1056 +holidays/locale/en_US/LC_MESSAGES/NL.mo,sha256=vLrGIOedvWcHQuBkHoyNg4L2WWg2aurp9PARUnr-5P0,980 +holidays/locale/en_US/LC_MESSAGES/NO.mo,sha256=nt22s-yh6jTnbcNo-fNr2gvxu_rqXfOog_Pc-ptOJNk,1025 +holidays/locale/en_US/LC_MESSAGES/NR.mo,sha256=dWq2CO4cN3kriEmXRWr8whutUsi5Eh1sXBMdu1QgqyI,1255 +holidays/locale/en_US/LC_MESSAGES/NU.mo,sha256=IFg3QheTidgtJx_HJTfafNUVxHsyIyeEB-AdAwDSd3c,1170 +holidays/locale/en_US/LC_MESSAGES/OM.mo,sha256=9ZxlrwceA52VDMbbDswmzRrBfp7ocT6ofFFfQ9Y4RwI,947 +holidays/locale/en_US/LC_MESSAGES/PA.mo,sha256=GqLFvgzUJuHZFm4CNPZZTcZcuUyML34LhrptPz9ZyL4,1361 +holidays/locale/en_US/LC_MESSAGES/PE.mo,sha256=nHu0lg4o7CnSzildmjI-24f5KGJ53wKt9u4STPrRlLs,1399 +holidays/locale/en_US/LC_MESSAGES/PF.mo,sha256=GDWfdB42SXViCtDmAzS_Rgh4es2GHj8V7iSmZos9hBQ,432 +holidays/locale/en_US/LC_MESSAGES/PH.mo,sha256=xsdw69UUh2-jL7Eke_NR3Kh3JVR3UbWbae25rE_BPDE,1810 +holidays/locale/en_US/LC_MESSAGES/PK.mo,sha256=vYUUT9IhJatuQrGiZtWwCAC2HmzPAG5-9hGqfXPaCuY,978 +holidays/locale/en_US/LC_MESSAGES/PL.mo,sha256=INio_XpGaI2CDdVvrtgnU6Vnokrh2wTFaaL4uH0ktlI,1949 +holidays/locale/en_US/LC_MESSAGES/PM.mo,sha256=F5xLQ4XkDNd47IdPBAh_38pt7KuuAxCJ6q369LZNEUQ,432 +holidays/locale/en_US/LC_MESSAGES/PR.mo,sha256=_pf18PewdLZtAijxqYG7fNcCdEUaC9Pva624WCQtHzQ,435 +holidays/locale/en_US/LC_MESSAGES/PS.mo,sha256=YuY_x2z0unA61EgY2K9oVD71SY9liepZaw6cRU_C5LI,1742 +holidays/locale/en_US/LC_MESSAGES/PT.mo,sha256=Npd3OeSi51Nl_AbxVX1eKy4ILsomA_5rH5pjDOE-T00,2906 +holidays/locale/en_US/LC_MESSAGES/PY.mo,sha256=Df69jSAaN5sHim4P0JhhP9HdM2AaGOENsHcm2JeDvWI,1296 +holidays/locale/en_US/LC_MESSAGES/QA.mo,sha256=fjwJvrZ_ijthjK-h0PYPyq0YN_qNiC5O9q1OhV-LZxs,919 +holidays/locale/en_US/LC_MESSAGES/RE.mo,sha256=LwsyAs-9oVCmbPW7OxMYPatQO5taavQFWetYUcAvZ9o,432 +holidays/locale/en_US/LC_MESSAGES/RO.mo,sha256=lKCdUWkHG4O2fEzXMlak1VZQYWASt93mRfPHyeMBnVc,1058 +holidays/locale/en_US/LC_MESSAGES/RS.mo,sha256=1FCraKtBFYKNT_ElVhRLgHR0Rkx3cS35zV3KHORv3Xg,1022 +holidays/locale/en_US/LC_MESSAGES/RU.mo,sha256=M1etTeJiQfxrFYLizEJ1MX6FK0Cx9x9oFhsmrDkVwtI,1846 +holidays/locale/en_US/LC_MESSAGES/SA.mo,sha256=QxyIZTwhBVh-Ge3BX9cJPhfGQYNJQdNSy_nm2hcufs4,946 +holidays/locale/en_US/LC_MESSAGES/SC.mo,sha256=yqPgYoQTczv-FFQmEvqMQEyUL4X0H5FnEbwRiESZ4lY,1642 +holidays/locale/en_US/LC_MESSAGES/SE.mo,sha256=1i-vS-pFwPU0B3bGtzb2hzhlM9tUUFnJG1eDg-phDEg,1297 +holidays/locale/en_US/LC_MESSAGES/SG.mo,sha256=Jy9DbI-gH8d9QMfFpEy0CSrUUO2H5sxX3GrUxf8VuFw,1191 +holidays/locale/en_US/LC_MESSAGES/SI.mo,sha256=AOC36ih_K7z4e42CFavZ1FhhUVxhITioo21Zz_NQxaM,1817 +holidays/locale/en_US/LC_MESSAGES/SJ.mo,sha256=tTpllb_O3r7DhR2R5f9w_bg28s5skb0lf0NKMUtoW6c,432 +holidays/locale/en_US/LC_MESSAGES/SK.mo,sha256=A1ZxWxYHtljylQcaNJBx2YbJMwkbNN474pgmGbAyn28,1821 +holidays/locale/en_US/LC_MESSAGES/SL.mo,sha256=uZF0xSK0198fpNHfuPJS16C3H5Bs1Pxn4qa84x_iXTA,1145 +holidays/locale/en_US/LC_MESSAGES/SM.mo,sha256=v9kxCJObMZra9gwb4Bh1U1T10MVryXi7zMZbf3LB_Vk,1647 +holidays/locale/en_US/LC_MESSAGES/SN.mo,sha256=W1-7UbvnEiiy69VKBZzKceS3Q_94bJri-kXCWpOc3qc,1393 +holidays/locale/en_US/LC_MESSAGES/SR.mo,sha256=TuqUiTJ_o-ibeXVoutG6uaXCXPQ_czsQnBXhwYvy2IA,1398 +holidays/locale/en_US/LC_MESSAGES/ST.mo,sha256=IfAavfWzo7uv80Z3w6UHYXMMP7E-BQSMMQWGKU-fY4g,1137 +holidays/locale/en_US/LC_MESSAGES/SV.mo,sha256=rnz4yxqmyq24lIOJS8LEPe3GOcfoIE_nAEADGme5-ww,1033 +holidays/locale/en_US/LC_MESSAGES/SX.mo,sha256=e3OKJzdlZP4F-KAk6XWvYerGcla3PsM2QN1R96__SOE,1157 +holidays/locale/en_US/LC_MESSAGES/TC.mo,sha256=2Q1NfXJV9yhcRiyYilntVFI_TzEWr1gV7MOpky1i2ko,1192 +holidays/locale/en_US/LC_MESSAGES/TF.mo,sha256=SGSpSxIDCIL7uYruzO3Mn-YvtTxBJyBJzf2cLpE6J20,433 +holidays/locale/en_US/LC_MESSAGES/TG.mo,sha256=lFggbBu3Xo61r8MpSeLO-mHIp1o980J9xj_0osO61xE,1239 +holidays/locale/en_US/LC_MESSAGES/TH.mo,sha256=PaN2uThN6IPNqfpM_ctaOWB6qcYIQxOGmjn73KJC3LY,10651 +holidays/locale/en_US/LC_MESSAGES/TK.mo,sha256=Ydmnz3moNtcRFtT97ILp2wGKVQNw2JNGNuk1GaK8dq0,667 +holidays/locale/en_US/LC_MESSAGES/TL.mo,sha256=XsBAtZiBbAyzt2taVxNK4qmYrd4tTiZypG5WqF35hfE,3020 +holidays/locale/en_US/LC_MESSAGES/TN.mo,sha256=8O76Wn55Zjs393R1SfiRb3yMUhzAnk1YM6S7NhODUGM,1335 +holidays/locale/en_US/LC_MESSAGES/TO.mo,sha256=Rryl72Y7q5CGVamnbpx2btzQ90yBoRP6Hz4i7n7ISqQ,1584 +holidays/locale/en_US/LC_MESSAGES/TR.mo,sha256=vkXXBCox_qFYCMxQ4Zfo9S9ApPJ4Pt175EpjYvygUqA,1322 +holidays/locale/en_US/LC_MESSAGES/TT.mo,sha256=xNEET5jq0hd2b8YMFUwwvRFGKl6vjdg24Uc7px1wgB0,1336 +holidays/locale/en_US/LC_MESSAGES/TV.mo,sha256=KfxugDrzWlYCRP3M-gFCKwQQu7fJBNFmQ-goxl2cwoI,1494 +holidays/locale/en_US/LC_MESSAGES/TW.mo,sha256=ujyehru2aARMxODIzMsFME3BJPmnaQRWF8wFdJwqAuQ,2295 +holidays/locale/en_US/LC_MESSAGES/TZ.mo,sha256=O3s1nYgUnh9JbFcN2NPqHkHN4wZPLULaoAY5Z8cXjKc,1796 +holidays/locale/en_US/LC_MESSAGES/UA.mo,sha256=zxtym184p_QppxkAHBvT2rdhAc2MVYTCjtfSedfTkBU,2353 +holidays/locale/en_US/LC_MESSAGES/UM.mo,sha256=sQ0spQ-jfp7BNjbO1k00nJMa1zJ4fVTOSiPjvKzm5wM,435 +holidays/locale/en_US/LC_MESSAGES/US.mo,sha256=yuJY5uVPwn81XjvUljdxHviSsM-YbzcZ3RFwPz5k1nQ,435 +holidays/locale/en_US/LC_MESSAGES/UY.mo,sha256=vtJ1DmAtQcd3Vo7KW7GFWA0hM-YzHUH3fU9Xra4ln8k,1664 +holidays/locale/en_US/LC_MESSAGES/UZ.mo,sha256=Bglgt9liHwqK15LqKOsmGfkrBtYB12m-7iybg-SC8co,1358 +holidays/locale/en_US/LC_MESSAGES/VA.mo,sha256=lbx6krs5kU_HmuKP0LzJ8Z0Zj98RUUyGTn30XepARDs,2264 +holidays/locale/en_US/LC_MESSAGES/VC.mo,sha256=SN5s9zGrlh7KPdGDHAf4e-ehZGI1z2cnirPZyc-EUCQ,1195 +holidays/locale/en_US/LC_MESSAGES/VE.mo,sha256=ZRc3Bam7LRG8uyvkMjar1xydTHCYAECxS0oBjiMp7H8,1324 +holidays/locale/en_US/LC_MESSAGES/VG.mo,sha256=so5_FLOY_o7ysaXiMt7wx955x6iX70xQE-c-wce6KR8,1868 +holidays/locale/en_US/LC_MESSAGES/VI.mo,sha256=sQ0spQ-jfp7BNjbO1k00nJMa1zJ4fVTOSiPjvKzm5wM,435 +holidays/locale/en_US/LC_MESSAGES/VN.mo,sha256=WrhiUY0jiCnD2UaqbmoLhOaRPhO_SFkTdmmUansFYyU,1443 +holidays/locale/en_US/LC_MESSAGES/WF.mo,sha256=7kA_9-Jb-zHKhtrsOlP6HrmHgWHbqIrVpbkQ6gtNdvw,432 +holidays/locale/en_US/LC_MESSAGES/YE.mo,sha256=QbpSYH2ii3AaUNAT-i0pIa84ny9nfdhl56giuEzSAlU,1330 +holidays/locale/en_US/LC_MESSAGES/YT.mo,sha256=oAGjK8prY724rH4e8NC1kZNSBqFHb78P_ZLifnlsQUs,432 +holidays/locale/en_VC/LC_MESSAGES/VC.mo,sha256=CrM8bi_uK5PZ7Dw8saGD96HY3dE_OZUnjsOSLOd0_1I,441 +holidays/locale/en_VG/LC_MESSAGES/VG.mo,sha256=6DzihFTm2ocy2U8MZyX0WUfKmwAUOGX_0qhiN26LoFk,421 +holidays/locale/es/LC_MESSAGES/AR.mo,sha256=Q4Wb2BKePsGsTjYHvnCl3x3OX9pNO8EKJ-ERi5D4RTQ,430 +holidays/locale/es/LC_MESSAGES/BO.mo,sha256=557mjX_06-3DiHGaqX_dEd-gISVy5ovYcLqJLGUMtj0,430 +holidays/locale/es/LC_MESSAGES/CL.mo,sha256=6CfqPXGSDBbpj4h6FH0zLKiE5_Mw59WoqJdyGrLiXco,433 +holidays/locale/es/LC_MESSAGES/CO.mo,sha256=ehMrGTBVkxXDFoTL-eb8AnECX9OAuGhvcChhBLAYvVo,430 +holidays/locale/es/LC_MESSAGES/CR.mo,sha256=rkHI09X8d9lxL1wR5eIBmYiDkf2S_r7ahj4F54kI4jw,431 +holidays/locale/es/LC_MESSAGES/CU.mo,sha256=FWfJ1U3pJD5hr7MtR2-G8-LJcrpiHmN91wWsFq810cE,433 +holidays/locale/es/LC_MESSAGES/CV.mo,sha256=1SEL_SkACEtzDjI7eSfE21RbhD2U-yFxG_Z3lo8ESi8,3400 +holidays/locale/es/LC_MESSAGES/DO.mo,sha256=DzEamFcrrWGxuhGKMT6DDk83ZipzIrvkiG6--Bj3xFU,433 +holidays/locale/es/LC_MESSAGES/EC.mo,sha256=mlvs-b-R1mGthyduAIDzpSWRlJBuIVF6RX3jRoinSfY,433 +holidays/locale/es/LC_MESSAGES/ES.mo,sha256=Q4gTtvbceqkBorXM32ZhKaLvT1rrL9MZ8bVMPNAycro,428 +holidays/locale/es/LC_MESSAGES/GQ.mo,sha256=QkVt9nI5n8Is8b1RkUW6VIUliFivAsZq_3WbhkHwdM8,414 +holidays/locale/es/LC_MESSAGES/GT.mo,sha256=hyoaT-GPyKi1GhlGQwPBOeWqt_NsPVNrXSLIm1HFLqA,437 +holidays/locale/es/LC_MESSAGES/HN.mo,sha256=neOvuZKK1_5k4GWl5FHd8HeXcP7G0MnWq1rRR8-u7-w,433 +holidays/locale/es/LC_MESSAGES/HT.mo,sha256=ZkhHszh2b2ChBrpdIpjN6ubJQqenxqTOm3j-KCK2-OA,1989 +holidays/locale/es/LC_MESSAGES/MX.mo,sha256=DzEamFcrrWGxuhGKMT6DDk83ZipzIrvkiG6--Bj3xFU,433 +holidays/locale/es/LC_MESSAGES/NI.mo,sha256=O_tYcRbUbGNtzQLGJ8o90DDAsMhWE1W8yszI6lauEkc,431 +holidays/locale/es/LC_MESSAGES/PA.mo,sha256=-Q_8gnIzdJHoFO5eDFUn_VvcrBRgnwDoCeL9iO7df8Q,427 +holidays/locale/es/LC_MESSAGES/PE.mo,sha256=WQaC6-xHH1kOTSroV3ktpkrcWQ2e7lzv_Kax84Xu3js,430 +holidays/locale/es/LC_MESSAGES/PY.mo,sha256=I-roDUua7dew7wrwNtAyQMpTF8nWIRxhl5ZrL28oBfs,433 +holidays/locale/es/LC_MESSAGES/SV.mo,sha256=DseSgL2YtiDCGuv5MESAhmV-VFgNNB3s0SqnQwVYPJA,427 +holidays/locale/es/LC_MESSAGES/UY.mo,sha256=Ws7cQuERnlHneFaAOFXCwkRaHSqFJPpkpJgsKxfUvXw,433 +holidays/locale/es/LC_MESSAGES/VE.mo,sha256=h0yWnDju6MUBJcK60OhEXUMWcMkLXL3wzXIruA94_t4,433 +holidays/locale/et/LC_MESSAGES/EE.mo,sha256=GneJe4GHe61pY_6aSR9woCUh3mcX9Fx1Ro8Mp_fWoSw,430 +holidays/locale/fa_AF/LC_MESSAGES/AF.mo,sha256=G0W4qeAFHUIU5PoM9YUw8Y4PceIDS9LMOWiK-or8N4U,430 +holidays/locale/fa_IR/LC_MESSAGES/IR.mo,sha256=_6-fBKH4UJ5UpYrN0U-QvZBsoAzngyyHlVVICsV6qGM,434 +holidays/locale/fi/LC_MESSAGES/AX.mo,sha256=F9x1YjEMOoofYabb8j7orntOxNrLO0yinj4fXdndIik,433 +holidays/locale/fi/LC_MESSAGES/FI.mo,sha256=r3Zk-40b5LseBdax1hkiMCHn03dxGq4ZbQRQJ0jYR8Q,433 +holidays/locale/fi/LC_MESSAGES/GL.mo,sha256=mLq2bjUthlCpEDnLzaOIm_ZlDFN_ASl3TMTImRl2qjA,1222 +holidays/locale/fil/LC_MESSAGES/PH.mo,sha256=ln3G-U914ZsV0vdLWInfb3zCw619difUdIf7IoE0W1I,1960 +holidays/locale/fo/LC_MESSAGES/FO.mo,sha256=lzBc3J7ad-ZZzEdyp8HV7HdR4LZI40Cj6d1iefiFY_A,403 +holidays/locale/fr/LC_MESSAGES/BE.mo,sha256=_gkwmI_1MXudwJI6lVUg2K-Z2eVEkU1bz9_cSWzwPTQ,1129 +holidays/locale/fr/LC_MESSAGES/BL.mo,sha256=SJzno78OVQ-LWvvd1uVU56bekYn5van5_lXcndLPNk4,429 +holidays/locale/fr/LC_MESSAGES/CA.mo,sha256=2hZzjNDDIQ5DxWs4C135h_3_acx2vQSIEhZexHias-Y,2317 +holidays/locale/fr/LC_MESSAGES/CD.mo,sha256=g5yR_bymGPr6uZ68oWN5ty4CY-NKEOjZueuERg1-X40,425 +holidays/locale/fr/LC_MESSAGES/CF.mo,sha256=bAsRhqQPlCsdfKunTpuTwv45i-ELxrQ9V-GVFzvMtko,425 +holidays/locale/fr/LC_MESSAGES/CG.mo,sha256=x4pujjHdGqIh5zhKUWfUbESVyKqciYTe6pSqr1oNB88,429 +holidays/locale/fr/LC_MESSAGES/CH.mo,sha256=x1uysYQ84Aq8o3Qf5T9TCIwhIH3EgHGqXgbutt6f6TQ,1622 +holidays/locale/fr/LC_MESSAGES/CI.mo,sha256=9Cgly1xnpkcKF5tXGm5fN5PUavwQEtG06He9sU56na8,415 +holidays/locale/fr/LC_MESSAGES/CV.mo,sha256=nHV8VaKmQLJlE7xiDo8y10idcCj6Cw59-EHa3-PeqEs,3615 +holidays/locale/fr/LC_MESSAGES/DJ.mo,sha256=-va2hBqCY8QmCBuFLwLP1AOxfUJyJ5jxdy4MNKIlRl4,430 +holidays/locale/fr/LC_MESSAGES/DZ.mo,sha256=74vAJZXIpYxFCKcBoq6YreBmlXXI50ilCJ1XEMzN9XE,1249 +holidays/locale/fr/LC_MESSAGES/FR.mo,sha256=OV8Vn48H1JhXe-RmrEDJo-DoAG8J-4m0Mh4fGQkfULA,430 +holidays/locale/fr/LC_MESSAGES/GF.mo,sha256=rtbfpRitbRI35CtyXe0_Gv0tFJ6hzAk4aQJmc9pZbC8,429 +holidays/locale/fr/LC_MESSAGES/GN.mo,sha256=IvD9_tXx0j9fC2y_eGrZ23puaFGzOOhFJe523E_QDpo,415 +holidays/locale/fr/LC_MESSAGES/GP.mo,sha256=LBMu8QQWLZFCDPdYeziy4W9SvHZ1mHkcs9z0BW0aWuE,429 +holidays/locale/fr/LC_MESSAGES/LU.mo,sha256=uSyiYJ9rIYMlVSyGsYuHTwzXYSxtUNAJIFsaxuFprt4,933 +holidays/locale/fr/LC_MESSAGES/MA.mo,sha256=2Rss1rG2V_IlJkegIyyRtjg_UVbGvZ9aG81bNG9rZSg,1458 +holidays/locale/fr/LC_MESSAGES/MC.mo,sha256=PYo0PwaQ2b6tjel6cnn7SJInfZVOYKdkGbZ31UcXmj8,430 +holidays/locale/fr/LC_MESSAGES/MF.mo,sha256=LC4FnJhzq_kHXhTMkP6uhcvgCZDGi1E5ltQ5liVw-Jc,429 +holidays/locale/fr/LC_MESSAGES/ML.mo,sha256=i81st-37W2r5BelWfAVR_GS-xUTPtxmz2LRzNv5H8wc,415 +holidays/locale/fr/LC_MESSAGES/MQ.mo,sha256=OML8he643iv12ls-JRqTiu2dVaeZbD2cRjafZB6nprg,429 +holidays/locale/fr/LC_MESSAGES/NC.mo,sha256=1aT8IODpA0QHVySV94R3WyJr4c72B7K6rgwhJeSuBJQ,429 +holidays/locale/fr/LC_MESSAGES/PF.mo,sha256=NP8_Q2RIm5sKnhBsqKn5p06FkSQk74vX22yhRgOLJ2A,429 +holidays/locale/fr/LC_MESSAGES/PM.mo,sha256=aCPrxtN0Loheg34NNKyowzowi60zybZuGSseGefKQWw,429 +holidays/locale/fr/LC_MESSAGES/RE.mo,sha256=2pEGEntldzdKUMbigQkfszZimACQHkfLQVkpVVp0UXs,429 +holidays/locale/fr/LC_MESSAGES/TF.mo,sha256=DT5HS-s_bb04Y7mGwXxPHdvycIASB2_2KLaPwX2g0VE,430 +holidays/locale/fr/LC_MESSAGES/TG.mo,sha256=76fQx7L6k4Q1vnx2gp2s4tWAzRrkpq7ZFw6RA5cHG7I,415 +holidays/locale/fr/LC_MESSAGES/WF.mo,sha256=_6vdAZomfC9DOqjo3EH8fkVZ8CTiXuvQMwespoxN-aM,429 +holidays/locale/fr/LC_MESSAGES/YT.mo,sha256=NgkfE6JqGOdoMLUYFP1Raq8SvYDY4p7x6-bfwY9W-D8,429 +holidays/locale/fr_BJ/LC_MESSAGES/BJ.mo,sha256=R4Sgxg_7eChjg8DboyGJ-phKeVNQLOEeEj20U4vVAGw,422 +holidays/locale/fr_HT/LC_MESSAGES/HT.mo,sha256=yupIDXObY8-zL7j7wqgzXFGz76LHVOOCOXF1KcrBAIQ,437 +holidays/locale/fr_NE/LC_MESSAGES/NE.mo,sha256=n6HiZ8iNqznPOVqB9eC9RYOeWNMSJ6e7clwK6Spn8Vo,420 +holidays/locale/fr_SN/LC_MESSAGES/SN.mo,sha256=Ii8v5Y4d3xrPtS59cYkI-TU_tR3-ktI2sU9qKuTlMvY,422 +holidays/locale/fy/LC_MESSAGES/NL.mo,sha256=DNetmRHafdXC693bZHj9wuFDBOgH_TpMlKtjgF98oRw,966 +holidays/locale/he/LC_MESSAGES/IL.mo,sha256=Lcv_LKOC60Di5sbGcRC-VzYJqhjYCP6vg3SJN1hZVag,428 +holidays/locale/hi/LC_MESSAGES/IN.mo,sha256=uOJp03sdgxy0wU7zZvsbR5FHAYUoj0Zm58cyy-dvRv8,5778 +holidays/locale/hr/LC_MESSAGES/HR.mo,sha256=IZKY0I7cG6eILQCHxENpuJ8h09Cwo1FGyfvRB5aQoJ0,428 +holidays/locale/ht/LC_MESSAGES/HT.mo,sha256=vIJNBpbTLFCMJdTkPtOyZ1ntsYpwjfpnV8THbIfOg10,1832 +holidays/locale/hu/LC_MESSAGES/HU.mo,sha256=IrMjkwGu93Q9rYW7zpvUN1LwTdcwf4R-u35rP-fcSIM,430 +holidays/locale/hy/LC_MESSAGES/AM.mo,sha256=IyHwiq8fshCmBWatrIQw8U2ujQfkSbBVr4szRyD-CLY,430 +holidays/locale/id/LC_MESSAGES/ID.mo,sha256=M760m09Eqe5kQElQd3Exf8WeenLDSbBWoWFTaBo3UoM,430 +holidays/locale/is/LC_MESSAGES/FO.mo,sha256=yxBj7ITfGAs0F5c9R5UEY1K28-tNwETGH294dlsPATM,1213 +holidays/locale/is/LC_MESSAGES/GL.mo,sha256=1FHeoJx35aAh_OdSSmbWoGQmG4J4OgJPV5MezZNhtIQ,1206 +holidays/locale/is/LC_MESSAGES/IS.mo,sha256=_mQLGcq7OaaXK_ymscrfC19Kp6vak8wBvRIk1ytC72k,431 +holidays/locale/it/LC_MESSAGES/CH.mo,sha256=lY52erCcDpB4me9Dk03EIl6bPSzxh55H3N5tnLYSGDk,1630 +holidays/locale/it/LC_MESSAGES/SM.mo,sha256=cLeCG3RBuMeXbtNfiBR5ipc8a4JkU7itARQGqoVZEdU,403 +holidays/locale/it/LC_MESSAGES/VA.mo,sha256=HWy3xacsig9e7f2ZjCxDVU4OSdQ7XOMURWcILwNEtoE,429 +holidays/locale/ja/LC_MESSAGES/JP.mo,sha256=w-p9jq4vDrHxNY13v4CfF2fRx1RNlF7YqPXfziC8IdY,430 +holidays/locale/ka/LC_MESSAGES/GE.mo,sha256=mzM8YBdLYkPo0yVbK68rhM-nh0GXO_F6r9ecDrjFDBw,432 +holidays/locale/kk/LC_MESSAGES/KZ.mo,sha256=p6HefOE54FY-IBhKkvBgmWd2XCjR-pgS934Rxr-iG2o,427 +holidays/locale/kl/LC_MESSAGES/GL.mo,sha256=EdoviTRaqtp6a2tlpg4ErHFbZxoqk1hp3yk00pPKONw,427 +holidays/locale/km/LC_MESSAGES/KH.mo,sha256=ohhr4xBIWtbrPha9-y_Kt8wvwNqmbZ3w_99yvvjg_yA,402 +holidays/locale/ko/LC_MESSAGES/KR.mo,sha256=leQRLZmBpFn2bHwLimmtdIE4Q828NafjgbQh0N5IDNg,430 +holidays/locale/lb/LC_MESSAGES/LU.mo,sha256=uetoMxTvtEiu8nbYo1o7LxA_G_YNgCWi3tY_uz79qDY,430 +holidays/locale/lo/LC_MESSAGES/LA.mo,sha256=dKsmPaEvGNiDWAlRCI2ySHPjY0SqTIF6qQh8pyiKfyE,400 +holidays/locale/lt/LC_MESSAGES/LT.mo,sha256=CCKgS6zPT19ouRrQtrs9qtZc7nfWDHXB_wCL0Kr4vEo,430 +holidays/locale/lv/LC_MESSAGES/LV.mo,sha256=7fenXAeWHb4Ke9CIm1IkebTiVlBUV8pVHoYDjZloWH8,430 +holidays/locale/mg/LC_MESSAGES/MG.mo,sha256=nzsqz5VBWTHAz1e_-EZSW3vfCz310qRuGc8X3-ywgCA,433 +holidays/locale/mk/LC_MESSAGES/MK.mo,sha256=cLsVPf4U4lrA3Ey8SXpxPlCF4aRJR4V-ItlqCW4hnMY,427 +holidays/locale/mn/LC_MESSAGES/MN.mo,sha256=G0a-E8iVmQD1Sg7vkmZXLFoldY1qTnGOGAAoj4Ult1A,446 +holidays/locale/ms/LC_MESSAGES/BN.mo,sha256=fbHjLo85gYa_jF0xTsYhIeyb7Rat3viT2jQQqYytxrM,402 +holidays/locale/ms_MY/LC_MESSAGES/MY.mo,sha256=R04vloPvyVojR6YpgcbD3zY9F2kf89VcvCVOqsBELNI,435 +holidays/locale/mt/LC_MESSAGES/MT.mo,sha256=WB9kcNnoMEcHLitg58F3jNwFktboTIPdV4kkngsgfGw,383 +holidays/locale/nl/LC_MESSAGES/AW.mo,sha256=TohmwlaOdS9cdivZGflkCJfvjXouMmyq02hfMuS1zk0,1153 +holidays/locale/nl/LC_MESSAGES/BE.mo,sha256=5wjgBh-PKcqNWjAGPNK944zWw7agroXaeEDqzIXKN6k,430 +holidays/locale/nl/LC_MESSAGES/BQ.mo,sha256=5rSDlwbufEdDULQVcGF25V7UaeorFk8GGThqIS9oYdQ,425 +holidays/locale/nl/LC_MESSAGES/CW.mo,sha256=ORy5cRUpUTZ09JSPUX1vRB_Zv2xutaPQ-7ZNlUT_-Ks,1285 +holidays/locale/nl/LC_MESSAGES/NL.mo,sha256=FwSMsrRTO9vvjG24so4vcgBLl1GMzrNSq0VoW2EyH2g,433 +holidays/locale/nl/LC_MESSAGES/SR.mo,sha256=xpJLB10q8pGxqh9iKVTM5d0_RePGbA-orzyp6XgP5-E,415 +holidays/locale/nl/LC_MESSAGES/SX.mo,sha256=oOvLw6iK5zErKmExFj1eHx0DUMAV82izdh_YVO2HBsg,413 +holidays/locale/no/LC_MESSAGES/FO.mo,sha256=-HNhHXDTcpO44YJVn0e-7kbxcFTc08WlQW1JfjvxUo0,1188 +holidays/locale/no/LC_MESSAGES/GL.mo,sha256=QZd9dKUanRF-lD1EfQ0Q2ksenLmbGB5kBXo4mrluAYI,1192 +holidays/locale/no/LC_MESSAGES/NO.mo,sha256=49zPq-pypIZsJB1S9wgHPW_jZFSPOxnJV8UJ-U4HrdQ,433 +holidays/locale/no/LC_MESSAGES/SJ.mo,sha256=Fzugf8gtFw7hOnulSG31RKkzqDP5ud75L2pmJEoZn5k,429 +holidays/locale/pap_AW/LC_MESSAGES/AW.mo,sha256=zet6M57QbRwwNSbNAwXzQfmfwGQez2lxeP6XQFg6C5o,422 +holidays/locale/pap_BQ/LC_MESSAGES/BQ.mo,sha256=7I-4cQajT52IoAJpt2TmHETDFS272rMbQZSyNem2tF8,1249 +holidays/locale/pap_CW/LC_MESSAGES/CW.mo,sha256=zPvagyIsemjWsFfkRbZUc5n7uQTmTYyPsEudbhn-crk,441 +holidays/locale/pl/LC_MESSAGES/PL.mo,sha256=SDiULczGDlBj-i2PbNVziEA4YDkNkUcigA8GgRnFz5g,428 +holidays/locale/ps_AF/LC_MESSAGES/AF.mo,sha256=iHAfq8CXO1RrjSjzbas9jhLLsYo0_29UIIUxOd-8W8I,1577 +holidays/locale/pt_AO/LC_MESSAGES/AO.mo,sha256=Ti6SErn-BJVf3b9IIdfSnckDZLbnmCPPKu4W2DZEt1U,436 +holidays/locale/pt_BR/LC_MESSAGES/BR.mo,sha256=SEAmkBdKSYyeVmsC13AJTXh4rZ4-NwcIXfKJlZmK4_8,433 +holidays/locale/pt_BR/LC_MESSAGES/BVMF.mo,sha256=2AnW6NKxdZwf65p6zUbkOVZc6QF__0P8kWxbcwEDRWg,433 +holidays/locale/pt_CV/LC_MESSAGES/CV.mo,sha256=KdiHvFmo8zRpFVWPuu8QVVrrvpCqiU9wFyROCJ6WcXs,431 +holidays/locale/pt_MO/LC_MESSAGES/MO.mo,sha256=HkOKarQjPuJVduHGeBTsxXCcQ2BQNmhK70w2y-GtVys,4427 +holidays/locale/pt_MZ/LC_MESSAGES/MZ.mo,sha256=4A9dy00kZfIPExrol-VBlKx7-E8VjUVBhcmqDLWOi-I,436 +holidays/locale/pt_PT/LC_MESSAGES/PT.mo,sha256=tJhFK03Khdbkuejnv577mMx43LXCWoy8THH9tgmECTY,441 +holidays/locale/pt_ST/LC_MESSAGES/ST.mo,sha256=QrLUiGE8Mnr6L4KUCXy9Ezib-p6RD5GxViWkw8gqfk8,422 +holidays/locale/pt_TL/LC_MESSAGES/TL.mo,sha256=SESK-AgIygDjyUxeklqhWiWiZ7NbmkG4-GkDhmOZSGc,436 +holidays/locale/ro/LC_MESSAGES/MD.mo,sha256=WbNGwDkhf-16qUWoOKao1fbZ9XbJZWZH-V1KFQ6H_s0,433 +holidays/locale/ro/LC_MESSAGES/RO.mo,sha256=HemRqDZn281eUiz2eVSN7OWLun4XyCURNNzuWreJTVo,433 +holidays/locale/ru/LC_MESSAGES/BY.mo,sha256=5m3OsRo2hmjj0DABl-CYtSTSGW-bai01iPkhGJ7VP-4,2767 +holidays/locale/ru/LC_MESSAGES/RU.mo,sha256=I8bga_PtzpdHI593sJZSkPoLS-mLe3wZlOai7Fo2ZDI,430 +holidays/locale/si_LK/LC_MESSAGES/LK.mo,sha256=lmHIlnZWgn8_gFDurEMvHhERX4cy_fJD4ESIEaSqFo4,435 +holidays/locale/sk/LC_MESSAGES/CZ.mo,sha256=Hyut-IN5ORknBuyuX92WnEep1MJIrbsz5QCHjq1LjtE,1668 +holidays/locale/sk/LC_MESSAGES/SK.mo,sha256=wtfRnXZaSgE4Yr3UB5D96pgmofnT11EKSC0vpsLYWE4,433 +holidays/locale/sl/LC_MESSAGES/SI.mo,sha256=kypEDpGqFPpJ4mNefm3Tu7BLZa_6l5f31OpZ7bdv9LQ,428 +holidays/locale/sq/LC_MESSAGES/AL.mo,sha256=EH1kt-ja_RXk0wlLYqqRRWQKNor4DfClaLKut-bB0zs,427 +holidays/locale/sr/LC_MESSAGES/BA.mo,sha256=7vJ7Mtn_FidAvaZAkL8X8kec1PW4oquFTfkcsScZbJI,2216 +holidays/locale/sr/LC_MESSAGES/RS.mo,sha256=WdJdzXhYV6xuzYwFfCiDWvKIpiybxRvz0W-YP60pvas,430 +holidays/locale/sv/LC_MESSAGES/FO.mo,sha256=5V2NLv12DNSu3C_Z0rOfj2CVJCedw78DCY6_W6mE3Nw,1179 +holidays/locale/sv/LC_MESSAGES/GL.mo,sha256=3t196kd4N1LUzWuQswkF2uXwuPvLZcb5LGK0PdgDC48,1178 +holidays/locale/sv/LC_MESSAGES/SE.mo,sha256=aZvYXAzjDwLRYLyKYq7o0hLFS1hXnl7r2NuJiAATOc4,433 +holidays/locale/sv_FI/LC_MESSAGES/AX.mo,sha256=4_IjbCy9Iymr0JDCFsXJfYKAOLWmMRmkw5SolLD5Drs,436 +holidays/locale/sv_FI/LC_MESSAGES/FI.mo,sha256=L8ged8pa4_5Tyn-6niWV2TKVl-bJNibuwDGIOx7LLos,2959 +holidays/locale/sw/LC_MESSAGES/KE.mo,sha256=b6_6KHPeXSRbeU2-3XPJwk5xHJB0srGBY0NHjzzxnUE,1897 +holidays/locale/sw/LC_MESSAGES/TZ.mo,sha256=nuO1_C2EdhbHtYaPHrhPGHC7eUqPrQpfWR4Nz0XK1zQ,430 +holidays/locale/ta_LK/LC_MESSAGES/LK.mo,sha256=7Ws9T8e2ZGb_ZwO8KKkapEX4qJtST9BcK-rlc7HkNlc,5686 +holidays/locale/tet/LC_MESSAGES/TL.mo,sha256=m-ruTCJNpFoBV704PLTpVw6RYwcBX60Ge3Ga1ARWtoU,3159 +holidays/locale/th/LC_MESSAGES/AE.mo,sha256=REKr9tqepAfdYft9JR2O0j0cbTgwiVtDB-hlU4WqXdY,1929 +holidays/locale/th/LC_MESSAGES/AS.mo,sha256=lilycJeJVx2B4a31ob49OyK1WJdp4OkLNcEUzzzIQSg,432 +holidays/locale/th/LC_MESSAGES/AU.mo,sha256=EpY5PgRD6vfsY8QehOawMEmcSrcTI52zENewNbrh01w,3860 +holidays/locale/th/LC_MESSAGES/AX.mo,sha256=Dt-PpzGUw31DlHFKp331qnKAkLIdwRlqvGuY97ojL08,433 +holidays/locale/th/LC_MESSAGES/BL.mo,sha256=JffAb1ZO_gpAic3uZgfCppJISCkQnr_Ybyp5hluFsKw,429 +holidays/locale/th/LC_MESSAGES/BN.mo,sha256=O-Etzj0R8eTOcC7les00CUySTPdL07BqY7WEaT93yEM,2664 +holidays/locale/th/LC_MESSAGES/BY.mo,sha256=rCuRuT4jMjYfh2fqeUiw74NmIzJeLUkHCHJaiPxtJwo,3325 +holidays/locale/th/LC_MESSAGES/CA.mo,sha256=hukhQW0bGNy9grkOAptKOFmb5W9KHAf-WlMLiZQCwBw,3566 +holidays/locale/th/LC_MESSAGES/CN.mo,sha256=qtUCCj1WTsL8kuAkUB_4xfeB-YJpMIfHkmTg7qaRjKE,1861 +holidays/locale/th/LC_MESSAGES/DE.mo,sha256=6TBktZ2JMuOSi2A1lCuoHQTZr_2aVObe1JmkSASyHBw,3200 +holidays/locale/th/LC_MESSAGES/FI.mo,sha256=fxXg2F20kr7efjoHLzONoIuv8N9OB5TvR5HegmMMNZg,4815 +holidays/locale/th/LC_MESSAGES/FR.mo,sha256=l4wGNaau9qw8OezFQa0KqQ1ME7u0EgPwgTQJDMBHCB4,2917 +holidays/locale/th/LC_MESSAGES/GB.mo,sha256=jmZ7cIM3RRknhj9hI8KrhyNfzTNSbwsjLMrkxAVzDRw,3636 +holidays/locale/th/LC_MESSAGES/GF.mo,sha256=2UNzGwpgMCya8IApDsImqGUPSlVqG6etTDpu1rYfap0,429 +holidays/locale/th/LC_MESSAGES/GP.mo,sha256=COwS1bkrjplBOjh4c8hazlrZQfdEE_JpVUxzgU4J5vA,429 +holidays/locale/th/LC_MESSAGES/GU.mo,sha256=XKgqBgbjDZ5UlEGZLUpiEButf5x2cmbVHbCkSlFI2tk,432 +holidays/locale/th/LC_MESSAGES/HK.mo,sha256=vktB89H5J2X4UXP3uO72k62LYHeDokwlWld0r-geSWo,5008 +holidays/locale/th/LC_MESSAGES/ID.mo,sha256=UyITHVkUwSvb1oP6o1dfhgrp9PYLxzFFplcc0WQtdMY,4818 +holidays/locale/th/LC_MESSAGES/IL.mo,sha256=HG5904Bx6HbFYmMk3Uuw2L9P_xEupzRzn6phQ124Eqc,2105 +holidays/locale/th/LC_MESSAGES/IM.mo,sha256=Jjx4Oe5ZQx12JcbxdMrQgtLVXF4qmnCVviFTzdkjch4,933 +holidays/locale/th/LC_MESSAGES/JP.mo,sha256=r2qrVowmeFgatVB-8ahXQOw6UOfhaii09U0XMOMAh-0,2794 +holidays/locale/th/LC_MESSAGES/KH.mo,sha256=DlnxVFts2oNIIDouVxTyW1jlMWKFm4YFWjW1MNaMQ_c,5977 +holidays/locale/th/LC_MESSAGES/KR.mo,sha256=P6mvsJpNFRCiUTelF9IXd_h1YeQUpFGyFnGutCCoJzM,5624 +holidays/locale/th/LC_MESSAGES/LA.mo,sha256=wD_AUMsxAYIefMR0uK1m7ZjgraqAmuMUBnSKcMPglFc,5322 +holidays/locale/th/LC_MESSAGES/MF.mo,sha256=6J1mIA4dydr1XVasmZJyn4Pqic-LySRBoIPQs-QsOJI,429 +holidays/locale/th/LC_MESSAGES/MO.mo,sha256=gQrIG5EnsmK__ISzrpnw6KKwPl2204U5sIhfeg9LeYc,6317 +holidays/locale/th/LC_MESSAGES/MP.mo,sha256=XKgqBgbjDZ5UlEGZLUpiEButf5x2cmbVHbCkSlFI2tk,432 +holidays/locale/th/LC_MESSAGES/MQ.mo,sha256=Xt7qaBbhQ0yW05pnzOj5tGn3I_D3NvsHEc552F8IbP0,429 +holidays/locale/th/LC_MESSAGES/MY.mo,sha256=LZEWgoXrIy6G9fi5oV3UcRMym07JU7PJIEhyq7W04Xw,7474 +holidays/locale/th/LC_MESSAGES/NC.mo,sha256=5Mg3i8dG76iDpPAeps7NxRn6-4Gz3W7Mpo9klTWV59M,429 +holidays/locale/th/LC_MESSAGES/NO.mo,sha256=iKO0WjOy39fv-WBDJJnAyP7ZgrfE4et20fTgY098Lp8,1563 +holidays/locale/th/LC_MESSAGES/PF.mo,sha256=kelKmzG_R2MAqyoh-1g4SdLgb65i30r0kz1t78z91ac,429 +holidays/locale/th/LC_MESSAGES/PH.mo,sha256=RjZu7ulUnL3FgJ1AZnTCA2uNeNBcmR1C0yjUlLGzHO0,2788 +holidays/locale/th/LC_MESSAGES/PM.mo,sha256=FWHtbGRLzB-rWhOPbH2vCt75foKn0a-WynMw6-YXzyQ,429 +holidays/locale/th/LC_MESSAGES/PR.mo,sha256=XKgqBgbjDZ5UlEGZLUpiEButf5x2cmbVHbCkSlFI2tk,432 +holidays/locale/th/LC_MESSAGES/RE.mo,sha256=8CndEHUEhQgqwdEiLUw0t7K8egzcKDpibpMzdLEe81I,429 +holidays/locale/th/LC_MESSAGES/RU.mo,sha256=6a7_HgbrFv-y0Mv718kz1fP2fkbTR6p-Tlm2AtMMTBA,2413 +holidays/locale/th/LC_MESSAGES/SE.mo,sha256=JRwQcA2Kr6ozRSUatpHvRcUrCPG8dCftVoQZ9OZ171Q,2082 +holidays/locale/th/LC_MESSAGES/SG.mo,sha256=u1cxM3cpsea4hUDW8mUtXGSDcwLpUI0w63FBdb8sqLY,1743 +holidays/locale/th/LC_MESSAGES/SJ.mo,sha256=7a4h0WmTfjW-qOftT7JyXrlv-vKixD6KziZQOUbzcQQ,429 +holidays/locale/th/LC_MESSAGES/TF.mo,sha256=FWHtbGRLzB-rWhOPbH2vCt75foKn0a-WynMw6-YXzyQ,429 +holidays/locale/th/LC_MESSAGES/TH.mo,sha256=LSevibLyyIFdiUpreWskGbbkFIvDjuxG3W_qyqe61D8,402 +holidays/locale/th/LC_MESSAGES/TL.mo,sha256=Uk04yfXZLIm9u-a7VbrIuHOsGbbnEcR2AdAfqsMjG6s,4531 +holidays/locale/th/LC_MESSAGES/TW.mo,sha256=PVGxGfS5ilx2UKQ6oBTgFD0az_zkHt_UzZqwlQzS1do,3529 +holidays/locale/th/LC_MESSAGES/UA.mo,sha256=8ad7nWyuclPOSYbxofwXoiGxvhG9z0aiiejAgYMCQ_A,3193 +holidays/locale/th/LC_MESSAGES/UM.mo,sha256=KaXXeYLwufedA9USvv4ukJHigapWxZz6SDqXPC3g79A,432 +holidays/locale/th/LC_MESSAGES/US.mo,sha256=BS6O9xnvTGRkL7yVck5EXHs7MYbV2DbT4wykNVrXbZI,10754 +holidays/locale/th/LC_MESSAGES/VA.mo,sha256=4tqksHuZO70KuputOiM7gtQ6Cwe4GKcgLVWzc3jdZgk,3787 +holidays/locale/th/LC_MESSAGES/VI.mo,sha256=KaXXeYLwufedA9USvv4ukJHigapWxZz6SDqXPC3g79A,432 +holidays/locale/th/LC_MESSAGES/VN.mo,sha256=PCd40u5PKh2eukzPJKa1pSo0rUbYh3JWEdAWYYZmCT0,1928 +holidays/locale/th/LC_MESSAGES/WF.mo,sha256=Bf74JR2MM7e9loCW3wVCOXMsW_W6d6oRkHqrLYerb-c,429 +holidays/locale/th/LC_MESSAGES/YT.mo,sha256=WOpw6nt8ewidRLlxkEiLVmoRHEbEkOagJ6ynNYZsTn4,429 +holidays/locale/tkl/LC_MESSAGES/TK.mo,sha256=MzBqjiR__wH63ntBsl82j-kdPghjBm0mlCD9c_4jbqU,691 +holidays/locale/to/LC_MESSAGES/TO.mo,sha256=6wKBpo50DPF8HdbKTH1Qox5LKqRiMJJPEn7z6X3kHYA,430 +holidays/locale/tr/LC_MESSAGES/TR.mo,sha256=K60WU1Ami9_LDW9AfHu8SvBUagkpZfB1gZEFg6LQ13s,400 +holidays/locale/tvl/LC_MESSAGES/TV.mo,sha256=236QRQe8nZCxL7CCHLNe8cuP0zBnOS9ffBjYQ0y2LD0,427 +holidays/locale/uk/LC_MESSAGES/AD.mo,sha256=iKY-PIOTfVDp479asZnwhyoiquvpLyzyXEhGVvIZH3g,2558 +holidays/locale/uk/LC_MESSAGES/AL.mo,sha256=hrfNgqggpblyPrTCznAIm3ywAuB1cUU3XVdhBjyUFd4,1906 +holidays/locale/uk/LC_MESSAGES/AO.mo,sha256=ju4nOEqNcuRQTHg6rCNxK93tgwuszda4Rw6PUZomd5A,2469 +holidays/locale/uk/LC_MESSAGES/AR.mo,sha256=wVchsfeUJxcbAFIjre_RuaNvCwylSCvgMK02axfuof8,9931 +holidays/locale/uk/LC_MESSAGES/AT.mo,sha256=A3cQVDb_JpBQ2eQZ4aw60_IVDk4oYsBHUI1V51hoyHI,1937 +holidays/locale/uk/LC_MESSAGES/AW.mo,sha256=NRaPM6wQdsqt0bDZy0P0BVqJgDQ8KJmVJhcibwPXz9A,1404 +holidays/locale/uk/LC_MESSAGES/AX.mo,sha256=-dojDgMZ7JHKatxy2DG-YZwR7z2tC_Yvblz0iUoNYMc,433 +holidays/locale/uk/LC_MESSAGES/AZ.mo,sha256=HSGv5w2Py8yz-RfkeVM5vw6J8PI78C5WMnwRcHN4SfI,2593 +holidays/locale/uk/LC_MESSAGES/BA.mo,sha256=Oxmp3n0MmV5ym8xFsFKB38cGhi4-EgtIPFvrUsKqm0o,2320 +holidays/locale/uk/LC_MESSAGES/BE.mo,sha256=EYqdY1DrKW6xGxl9j48yfMHxDxzvn5SEDOa9q2DBd6U,1412 +holidays/locale/uk/LC_MESSAGES/BG.mo,sha256=rXepj4hkIxrd-7itpEIHH76K5NmJ3yOEdA7ENqKII94,2251 +holidays/locale/uk/LC_MESSAGES/BL.mo,sha256=gidCoNEc14-uzRUFonnQnjFxFgDdACS5SBrohPD8p0g,429 +holidays/locale/uk/LC_MESSAGES/BO.mo,sha256=J9ZWuxYZiE05u92ONC_g55MAP9ycYsKvy7q5uI-HgA8,2208 +holidays/locale/uk/LC_MESSAGES/BR.mo,sha256=-tM6hiQVU7Fm2o2LDHyT95iUIQphTiHN3ofUm1kcFZg,5766 +holidays/locale/uk/LC_MESSAGES/BVMF.mo,sha256=2cDBRodRGhDuWMwOZLj3yp4nOLANo0u9Ko1wIaaxHwQ,1448 +holidays/locale/uk/LC_MESSAGES/CH.mo,sha256=5lkaSiG4w5YXxcNZ41TlkRzpBjIjFsEwMJVlfQIkGTM,2163 +holidays/locale/uk/LC_MESSAGES/CL.mo,sha256=Tmo4MdWIoNLAD0HZ7j36sAxj93ohElb9JwDTGEEusM4,2726 +holidays/locale/uk/LC_MESSAGES/CO.mo,sha256=q-Bp1t4EPg7-mG-UxWSmKwuD5_6M_ZU4Z5vySchCt3A,1793 +holidays/locale/uk/LC_MESSAGES/CR.mo,sha256=75Lx_IQBlb2PULyhUFOZsdrnxAR5xpBbMIjSS1yqWQU,1543 +holidays/locale/uk/LC_MESSAGES/CU.mo,sha256=-fpnKIz9l4YUFOaKFAAnfwW-cPj28viazMK5jwWNuIM,1257 +holidays/locale/uk/LC_MESSAGES/CW.mo,sha256=ZgHMBp0VprMZPzCjgfqIN3kR3GaHT51368zhg4iyLFg,1512 +holidays/locale/uk/LC_MESSAGES/CY.mo,sha256=5swmh6gWd3wtvw6fFjdOU00dE4lerOzdpMetwSwNWEs,1978 +holidays/locale/uk/LC_MESSAGES/CZ.mo,sha256=qOe0I6bwf1XH6ROHqlZ1IabXNW0p4XHddBXo6KzbPeU,2000 +holidays/locale/uk/LC_MESSAGES/DE.mo,sha256=tThHV28f3ruEEORsBlc8xo6_YhWZAtsv9g5mI_jkQGs,2440 +holidays/locale/uk/LC_MESSAGES/DK.mo,sha256=TrwmOo1Yjnf7zD2WnjR_m9FhTBCvcYo-1uqvWn6AFiQ,1328 +holidays/locale/uk/LC_MESSAGES/DO.mo,sha256=-kBxL-s2QIsArZ0wMWqJt6WPlxSq1WpbbHVxvweofRo,1251 +holidays/locale/uk/LC_MESSAGES/EC.mo,sha256=Do7GY72iJ1wWxEmZeJswaS4roPD2gr-D3EQ9nvDl0vM,1173 +holidays/locale/uk/LC_MESSAGES/EE.mo,sha256=IBY9tMz2lNHgR0SgVbSi7KKK4P9YChxrzVXEXWFhFOc,1177 +holidays/locale/uk/LC_MESSAGES/ES.mo,sha256=dbMxaMhsn64U08qmowxXnMQr6jU-0DwKi9pV7RDpAlw,4258 +holidays/locale/uk/LC_MESSAGES/FI.mo,sha256=YV4vgyj_-I8YMs6ucklwGWvEzuRihpPhw2OXRj6I_SI,3854 +holidays/locale/uk/LC_MESSAGES/FR.mo,sha256=IFbmW8mnqxdtAdQepesJNGcALW9h510sh-G8x0KG03Y,2204 +holidays/locale/uk/LC_MESSAGES/GE.mo,sha256=203m_36BkjkLk3_RP4mfRectYVHQQpGzFyUnJp-xKqk,2213 +holidays/locale/uk/LC_MESSAGES/GF.mo,sha256=knY-FTfZm0cx_w-wzV8EtEVOuBVltcWuj6hFC-e4SZY,429 +holidays/locale/uk/LC_MESSAGES/GL.mo,sha256=t_zeDMqR0snxtXnqImn9C4srv13cV1kDk3IpqrKTCKQ,1418 +holidays/locale/uk/LC_MESSAGES/GP.mo,sha256=DOfNa3czSHGG7YH61zjEIBE3B1Z-86L-5Q4TV2CVf4w,429 +holidays/locale/uk/LC_MESSAGES/GR.mo,sha256=8HZmG6YILQBP7gzwXz31dwi9yjDOB_XdsqJgcMIjkeQ,1670 +holidays/locale/uk/LC_MESSAGES/HN.mo,sha256=UPqumpyYUfMsqKwJIa0YKHlvBFnAmh_SbBq2uWDBk5w,1160 +holidays/locale/uk/LC_MESSAGES/HR.mo,sha256=su8wdlHDUeUMclLmkq1f0-ySkYafQYRZ_sNs_-wuxZM,1826 +holidays/locale/uk/LC_MESSAGES/HU.mo,sha256=s3DLAVOl7qjS2-mrHgicfLmRqlX0cXG5ii4VtLBFnwg,1717 +holidays/locale/uk/LC_MESSAGES/ID.mo,sha256=7o_emFk_jzpQdQE4a7tNy08rehcY7jFqftIz1p3P9xE,4168 +holidays/locale/uk/LC_MESSAGES/IL.mo,sha256=bivkwtdweuyOYf5bgBqOerb6OYOLQuH_kgE8a5EBWdQ,1558 +holidays/locale/uk/LC_MESSAGES/IS.mo,sha256=TvDnL4XXR_VgHJxENaLZf8DTYMzWIc_yDPehnb2jYN4,1477 +holidays/locale/uk/LC_MESSAGES/KZ.mo,sha256=deeKqGKAToC4Bz2Vn2FvwCuD0MicW9uTH-Irkv_EtR8,2187 +holidays/locale/uk/LC_MESSAGES/LI.mo,sha256=kKV6lNlSmheHK3LQr5fFaajgQmWzplWOxrEUVImSeAA,1805 +holidays/locale/uk/LC_MESSAGES/LT.mo,sha256=N-pPV997Fz_uXLmW8sOWwvoBfwS0vwutGUpCd8q-R5I,1860 +holidays/locale/uk/LC_MESSAGES/LU.mo,sha256=Aeq7QRWvLzsVwzKee4OdgvrGJ0Dy3f6HN0HfNqswVjw,1145 +holidays/locale/uk/LC_MESSAGES/LV.mo,sha256=DeNVbMKO-SixrK-mTgDvrMEm0s-FUmajuXTEaiXgpq4,2117 +holidays/locale/uk/LC_MESSAGES/MC.mo,sha256=Y43SbLMwbEpiXHG5mv5upDS9EjD4475buAVuhfCRmVQ,1372 +holidays/locale/uk/LC_MESSAGES/MD.mo,sha256=bVIdxF1Z_qyecZljQmViDvU40pvLHvmIdd30N3HoG4U,1723 +holidays/locale/uk/LC_MESSAGES/ME.mo,sha256=3Y5hSnFzJd8TLoHs6Q2kTEX-kGnMU8aZgGVL1SM4ykA,1473 +holidays/locale/uk/LC_MESSAGES/MF.mo,sha256=2JCgndaPAU4nPGKAN86iRcKn0QDvUWBlh9q1DusSot4,429 +holidays/locale/uk/LC_MESSAGES/MG.mo,sha256=MPpr_Bmj7CssGbHLoai7Vx-1ThTAGSuWoC1eBbH5F90,1474 +holidays/locale/uk/LC_MESSAGES/MK.mo,sha256=v6ofxraWavT2qRirwhvZJ3nRExxDoS71KJC300lDthI,3086 +holidays/locale/uk/LC_MESSAGES/MQ.mo,sha256=le9TDsTIbzVZVr9Jaa4ADTk1MsrS-7Yz3tbJyN4h3Lc,429 +holidays/locale/uk/LC_MESSAGES/MX.mo,sha256=w-jZBY_ak_6aKTp6a4sQYbrZC-8-ggR0xDU1kwZmla8,1016 +holidays/locale/uk/LC_MESSAGES/MZ.mo,sha256=Wlfe6gzi4DQLIJimD7vyk1wNG7SXdRtXkMczzkMcYM0,1306 +holidays/locale/uk/LC_MESSAGES/NA.mo,sha256=p1AoUZJlFv9KAIRzJKjKktrGZFEqKrjUT41DA2IiBQA,2235 +holidays/locale/uk/LC_MESSAGES/NC.mo,sha256=oDOus5AQN6Wk7FqQS0VyOhm1SqI0kpWg9nipJpgDBww,429 +holidays/locale/uk/LC_MESSAGES/NI.mo,sha256=-z57zfOBHrgZEj8yGcaY-1eEC2ylURPydCFT-ifbctE,1253 +holidays/locale/uk/LC_MESSAGES/NL.mo,sha256=CtaF41rcO-9jwOPBoFm1c__rwC3eDp41pAIXmua06Qo,1144 +holidays/locale/uk/LC_MESSAGES/NO.mo,sha256=qVt9pMmjvUc7kNDBWG7CtIEcP8_vtKla55Jsp5-GNvw,1192 +holidays/locale/uk/LC_MESSAGES/PA.mo,sha256=aYlr7eclpzye-310aWrg3GT-YK2RBZQiOaVcbAGXm4E,1739 +holidays/locale/uk/LC_MESSAGES/PE.mo,sha256=_FxAOuRptEQefBSv48J0amUC_8E9gpnhZQZTfkPnZWI,1730 +holidays/locale/uk/LC_MESSAGES/PF.mo,sha256=9QAG5LINjypTY18NJYLZ6I-zjXbzG0EVgVGdmzCC8FY,429 +holidays/locale/uk/LC_MESSAGES/PL.mo,sha256=vKMdR5pP9DdGomlSuworg5aeHETNviyDqRoln7wrPis,2399 +holidays/locale/uk/LC_MESSAGES/PM.mo,sha256=rXFGegMXCHOosqeIp1kAdaHjZROTJVWSm3UZdfRsdIw,429 +holidays/locale/uk/LC_MESSAGES/PT.mo,sha256=TvIYR9ykmMJ6PdbbrscymHtmOrEMk0bj46tiPrgbsHM,3690 +holidays/locale/uk/LC_MESSAGES/PY.mo,sha256=eUQSk6_AerNPP9FNoYsKt0Lv-9R8uBw9f_lH1xw5EzY,1588 +holidays/locale/uk/LC_MESSAGES/RE.mo,sha256=NHeo3BT0A8Chlgz2SfoMN8iX22eVmiZJX6VB5GeAWOg,429 +holidays/locale/uk/LC_MESSAGES/RO.mo,sha256=8rtxnqnu-karor_7vVX41vbHOeuaK_jG-oTKmLAbrv4,1279 +holidays/locale/uk/LC_MESSAGES/SE.mo,sha256=5IJbxFJL7qIrH0ZhwCO3mMSfcCbOl6QRYbF8LRQhgt4,1615 +holidays/locale/uk/LC_MESSAGES/SI.mo,sha256=NaX68n2Xnx0dobDEnQK_zJSFeFlwxMarf2LUxrn9YzI,2305 +holidays/locale/uk/LC_MESSAGES/SJ.mo,sha256=TLd7Cix1BBsvtk6IlM44GjhO48VWVPZhjDpV1l7Rw74,429 +holidays/locale/uk/LC_MESSAGES/SK.mo,sha256=X03JMa65Bn8ozFK-uuZjy0zPGuwrw_UD8OYD-2J57d4,2252 +holidays/locale/uk/LC_MESSAGES/SM.mo,sha256=bBFzb73vtInjjH6dqIRQi9-YeuHjEh6aO9Mh0j43KdM,2040 +holidays/locale/uk/LC_MESSAGES/SV.mo,sha256=Nsm8xdGeX_Ao2UfBTEQX-Hwi8FhTsvuOZO4nRYdCYDc,1205 +holidays/locale/uk/LC_MESSAGES/TF.mo,sha256=1tfKVnb_0-r63OqU0hCgxO6WpQmIhItR2MqL7Gp9OZE,428 +holidays/locale/uk/LC_MESSAGES/TH.mo,sha256=_IexOmRKUl2gRTVAucOYbU8q4RKV_T1KQMcOYIcgr_k,13418 +holidays/locale/uk/LC_MESSAGES/TR.mo,sha256=IpBacAnpzkwbRHSS9IygrGla8FZ5-EGYZgr1Wl83XkM,1645 +holidays/locale/uk/LC_MESSAGES/UA.mo,sha256=cM3bpK1pDc5fvb2opGwvVGopnfnXsm8sqfm2BWh0WV0,430 +holidays/locale/uk/LC_MESSAGES/UY.mo,sha256=aZ6sgtBEjqSDyqVm1P-vsBaLLcuxeaJfzcQXAGDLtos,2070 +holidays/locale/uk/LC_MESSAGES/UZ.mo,sha256=EXkobWjYgSheT84eIR8v5PlE-Q2JqmpeGyYyWBv6UBU,1654 +holidays/locale/uk/LC_MESSAGES/VE.mo,sha256=WiudRYlKH4R131yZ2hCcZjs4_tUvREvWnXjEDQod4jg,1621 +holidays/locale/uk/LC_MESSAGES/WF.mo,sha256=hCkjcYkhnJVFTiTAof7D0biQG6Z20Xkxh0CjAmbiWMo,429 +holidays/locale/uk/LC_MESSAGES/YT.mo,sha256=NoKACGEAlc_z42Hffj2G-6RzupmpgiyWhyrhyfjmcoQ,429 +holidays/locale/ur_PK/LC_MESSAGES/PK.mo,sha256=FPi-WEPKK3mZS7xPLMTwLbYHtVqrsnGUq5OMRIrnhWA,1057 +holidays/locale/uz/LC_MESSAGES/UZ.mo,sha256=vnu7utSRLe-RPwZlWIb1_Hk-l7sI0wNxI0arb5HN3Ac,428 +holidays/locale/vi/LC_MESSAGES/VN.mo,sha256=tqiI9HTxUz-SmYm17Ry35A0iyNe_vIJmTx51tDeF6uY,427 +holidays/locale/zh_CN/LC_MESSAGES/CN.mo,sha256=HUAHpUrjyj23ga2_2OIBcb-wKq7s2shR4LXZaymmP04,438 +holidays/locale/zh_CN/LC_MESSAGES/HK.mo,sha256=IjegtHeJElrqcutE9dfuOyzHw6qGsDS4FsZkjwwHe5w,2870 +holidays/locale/zh_CN/LC_MESSAGES/MO.mo,sha256=F0A20EmBvM162sxtVrO80EvEKBrsq33RajwPX7R7dDg,3543 +holidays/locale/zh_CN/LC_MESSAGES/TW.mo,sha256=Jga9Mfu3gadf58m3WMrsP7zA96da2ooMvvkqT5ARprw,2064 +holidays/locale/zh_HK/LC_MESSAGES/HK.mo,sha256=ET_ZICl1UGrqU5tgi_efO4H9DlZgam97_HCzMVqXMI0,435 +holidays/locale/zh_MO/LC_MESSAGES/MO.mo,sha256=zmmxUFDWqznW21Epl0-3TIVEbLWbi8aHW9zOE_VQE1w,435 +holidays/locale/zh_TW/LC_MESSAGES/CN.mo,sha256=dWq51at-GWXcmuakljTqNKuLAvD5LoIyVXpQ7YVICTo,1282 +holidays/locale/zh_TW/LC_MESSAGES/TW.mo,sha256=mI1ZaElVi0rMMWn5xP4RmP_omKa66HCJIIvmTv_P-co,434 +holidays/mixins/__init__.py,sha256=UjGVnrlUCugVdLqaGkqarBsDFrejuOip8p_TFHBWQ48,737 +holidays/mixins/__pycache__/__init__.cpython-312.pyc,, +holidays/mixins/__pycache__/child_entity.cpython-312.pyc,, +holidays/mixins/__pycache__/preferred_discretionary_holidays.cpython-312.pyc,, +holidays/mixins/child_entity.py,sha256=z3o1IzR2svriGdoCQDTVQx8oA02JYPa9yQMiVt_tswA,1602 +holidays/mixins/preferred_discretionary_holidays.py,sha256=ygaJRga0RSOgbHZMt1Hpw4-DbZOdFtYHTv5Pifka4MI,1113 +holidays/observed_holiday_base.py,sha256=oS1o498KfZPrQGD_0nzqZ_9mbeeP-H38CLmyYKR9Pk8,9321 +holidays/py.typed,sha256=EUaxvGLCfdycmOVEDt64l9fUKWuyPBxOEQWGfnMnrxE,171 +holidays/registry.py,sha256=kU05oPGyvIBVeQ9bUYcERHj4Y1Av-LZNpSt73Ib8ydk,15429 +holidays/utils.py,sha256=WgIHCWnPPE1pizbJHkWt054tObT3uN45_DBf3HAauCM,15587 +holidays/version.py,sha256=Y5BhnWZRYbpO3EYVxuF8T3GrGx8fPs17YhAb_9hNZW0,553 diff --git a/.venv/lib/python3.12/site-packages/holidays-0.77.dist-info/WHEEL b/.venv/lib/python3.12/site-packages/holidays-0.77.dist-info/WHEEL new file mode 100644 index 00000000..e7fa31b6 --- /dev/null +++ b/.venv/lib/python3.12/site-packages/holidays-0.77.dist-info/WHEEL @@ -0,0 +1,5 @@ +Wheel-Version: 1.0 +Generator: setuptools (80.9.0) +Root-Is-Purelib: true +Tag: py3-none-any + diff --git a/.venv/lib/python3.12/site-packages/holidays-0.77.dist-info/licenses/CONTRIBUTORS b/.venv/lib/python3.12/site-packages/holidays-0.77.dist-info/licenses/CONTRIBUTORS new file mode 100644 index 00000000..e7037eb1 --- /dev/null +++ b/.venv/lib/python3.12/site-packages/holidays-0.77.dist-info/licenses/CONTRIBUTORS @@ -0,0 +1,162 @@ +Aaron Picht +Aart Goossens +Abdelkhalek Boukli Hacene +Abheelash Mishra +Akos Furton +Alejandro Antunes +Aleksei Zhuchkov +Alexander Schulze +Alexandre Carvalho +Alexei Mikhailov +Anders Wenhaug +Andrei Klimenko +Andres Marrugo +Ankush Kapoor +Anon Kangpanich +Anthony Rose +Anton Daitche +Arjun Anandkumar +Arkadii Yakovets +Artem Tserekh +Ary Hauffe Neto +Bailey Thompson +Ben Collerson +Ben Letham +Benjamin Lucas Wacha +Bernhard M. Wiedemann +Carlos Rocha +Chanran Kim +Chris McKeague +Chris Turra +Christian Alexander +Colin Watson +Dan Gentry +Daniel Musketa +Daniël Niemeijer +David Hotham +Devaraj K +Diego Rosaperez +Diogo Rosa +Dorian Monnier +Douglas Franklin +Eden Juscelino +Edison Robles +Edward Betts +Eldar Mustafayev +Emmanuel Arias +Eugenio Panadero Maciá +Fabian Affolter +Felix Lee +Filip Bednárik +Firas Kafri +Gabriel L Martinez +Gabriel Trabanco +Giedrius Mauza +Gordon Inggs +Greg Rafferty +Győző Papp +Heikki Orsila +Henrik Sozzi +Hiroki Kawahara +Hugh McNamara +Hugo van Kemenade +Isabelle COWAN-BERGMAN +Jacky Han +Jacob Punter +Jaemin Kim +Jahir Fiquitiva +Jakob M. Kjær +Jan Pipek +Jason Jensen +Jeremy Chrimes +Jerry Agbesi +John Laswell +Joost van Driel +Jorge Cadena Argote +Jose Riha +Joshua Adelman +Joël van Amerongen +Julian Broudou +Jung Dong Ho +Justin Asfour +Kamil Leduchowski +Kate Golovanova +Kelsey Karin Hawley +Koert van der Veer +Koki Nomura +Kriti Birda +Laurent Comparet +Lucca Augusto +Maina Kamau +Malthe Borch +Marek Šuppa +Martin Becker +Martin Thurau +Matheus Oliveira +Maurizio Montel +Max Härtwig +Michael Thessel +Mike Borsetti +Mike Polyakovsky +Miroslav Šedivý +Monde Sinxi +Nalin Gupta +Nataliia Dmytriievska +Nate Harris +Nathan Ell +Nicholas Spagnoletti +Nico Albers +Olivier Iffrig +Ondřej Nový +Osayd Abdu +Oscar Romero +Pablo Merino +Panpakorn Siripanich +Patrick Nicholson +Paulo Orrock +Pavel Sofroniev +Pedro Baptista +Peter Zsak +Pieter van der Westhuizen +Piotr Staniów +Platon Supranovich +Prateekshit Jaiswal +Raphael Borg Ellul Vincenti +Raychel Mattheeuw +Reinaldo Ramos +Robert Frazier +Robert Schmidtke +Robert Tran +Robin Emeršič +Roshan Pradhan +Ryan McCrory +Sam Tregar +Samman Sarkar +Santiago Feliu +Sergi Almacellas Abellana +Sergio Mayoral Martinez +Serhii Murza +Shalom Donga +Shaurya Uppal +Sho Hirose +Shreyansh Pande +Shreyas Smarth +Simon Gurcke +Sindhura Kumbakonam Subramanian +Sugato Ray +Sylvain Pasche +Sylvia van Os +Søren Klintrup +Takeshi Osoekawa +Tasnim Nishat Islam +Tewodros Meshesha +Thomas Bøvith +Tommy Sparber +Tudor Văran +Victor Luna +Victor Miti +Ville Skyttä +Vilmos Prokaj +Vu Nhat Chuong +Wasif Shahzad +Youhei Sakurai diff --git a/.venv/lib/python3.12/site-packages/holidays-0.77.dist-info/licenses/LICENSE b/.venv/lib/python3.12/site-packages/holidays-0.77.dist-info/licenses/LICENSE new file mode 100644 index 00000000..e00f477c --- /dev/null +++ b/.venv/lib/python3.12/site-packages/holidays-0.77.dist-info/licenses/LICENSE @@ -0,0 +1,23 @@ +Copyright (c) Vacanza Team and individual contributors (see CONTRIBUTORS file) +Copyright (c) dr-prodigy , 2017-2023 +Copyright (c) ryanss , 2014-2017 + +All rights reserved. + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. diff --git a/.venv/lib/python3.12/site-packages/holidays-0.77.dist-info/top_level.txt b/.venv/lib/python3.12/site-packages/holidays-0.77.dist-info/top_level.txt new file mode 100644 index 00000000..a41943b6 --- /dev/null +++ b/.venv/lib/python3.12/site-packages/holidays-0.77.dist-info/top_level.txt @@ -0,0 +1 @@ +holidays diff --git a/.venv/lib/python3.12/site-packages/holidays/__init__.py b/.venv/lib/python3.12/site-packages/holidays/__init__.py new file mode 100644 index 00000000..d0ffe439 --- /dev/null +++ b/.venv/lib/python3.12/site-packages/holidays/__init__.py @@ -0,0 +1,22 @@ +# holidays +# -------- +# A fast, efficient Python library for generating country, province and state +# specific sets of holidays on the fly. It aims to make determining whether a +# specific date is a holiday as fast and flexible as possible. +# +# Authors: Vacanza Team and individual contributors (see CONTRIBUTORS file) +# dr-prodigy (c) 2017-2023 +# ryanss (c) 2014-2017 +# Website: https://github.com/vacanza/holidays +# License: MIT (see LICENSE file) + +# ruff: noqa: F403 + +from holidays.constants import * +from holidays.holiday_base import * +from holidays.registry import EntityLoader +from holidays.utils import * +from holidays.version import __version__ # noqa: F401 + +EntityLoader.load("countries", globals()) +EntityLoader.load("financial", globals()) diff --git a/.venv/lib/python3.12/site-packages/holidays/__pycache__/__init__.cpython-312.pyc b/.venv/lib/python3.12/site-packages/holidays/__pycache__/__init__.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..3f61e26301253050622f6897eb380362995bcb08 GIT binary patch literal 588 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 V)JNa~#^3w4;J*535}(Fl#xG$bQ0o8y literal 0 HcmV?d00001 diff --git a/.venv/lib/python3.12/site-packages/holidays/__pycache__/holiday_base.cpython-312.pyc b/.venv/lib/python3.12/site-packages/holidays/__pycache__/holiday_base.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..493680f421ef56c93b4a911851bdb7e718bf9ba4 GIT binary patch literal 61394 zcmeFa3sjufl_pv*pn!tn{SXNKyeR}opa*(Oh=-6YAz2_xLYARK6%sNp|5ZqWKw6Wy z+u*p{$nLaCv9pZRnu&DdZsYFEM44nJN+;=7ZueTLqHrkJFmvT@_g#~<=B|+~r>C8{ zcg_9wIsf_pzluVVlT6>c*7PrN>VKTaKIiPS&pvzav(I0rq$C+|eYWA{3nzYVF#H`o zh$~sSdAQ4DFkCmd4BZBo(PbJmb{pBRsoR8K^PqXi(rp=v>y9(hcgtY>P(pVCyN?^R z4kdOcvitbKq@m>Qb!o#<}JNAvWXDD2*ZcggO}?k(;u{0+ay zlbOY0VfR)RD+#F^@g+=h27ox6d@#Z$zy%g%FDO4^S2A_bLZp&F125%UW{xM_yV>^)e9v_6R^RR!H#xE# z=CHNJ>2)6-c-|dOZXX#Oa5=~KJ3a1jlJd|wHuMY1r^8_iC!ZVexcj_4gYJHB*rq(l z1LrSz9ma6{fM?L{9L1gWpw}%s&kedAmaxTz+{0E1y#qt;a3X~+_n_Aqw$kmy$gmqp z?0wF@3vO4>s5~<2mc8RBEaAM{>vdo8hLgRrbJ#QJ^bU*+BdXqKkVe6qC#ckL&_=C1yu`TTiyOK1FZP2s!OX4{)}EHu!v~KX>}ow8jz4x{|KWqp;f$8nwx$z@ zyLvjinvQq%oNjG89!?YQT02_U8#GB)&+v#mA)C2=kre~X;$ z$T``a=1zBK@Z8lhQk0aI?#w8-QkDF(+}RgQ-8pUz3cK&|DjO;>VF z?p~vVCxgE=8Qe+VQkt*30Qm}dGes`_#_qx>XtIzWCa!$-POY7*Kz)~q zyKUBKy4Jp!(p}*yLJuUn46b#Y_PGjOhJK4ndePEd=_+*F`c1B4+*i3u z+z$3^ah2k^8tKGy8J^d>%3m~e*C19cV$~ss3cTHbd%~VN(Z8-ryxpk8%0;XyJlE^; za^SfE&vgnM)p*{7T+)zB0^TYZD)M9XSpTA}do$tyN7-`?p0}V3i>sF9liVNgszW|o zS-G`%Pi+wI+JJYBt~GiH*%ymzBff0Y%&6#r;9$ejn}+Dfdmde@eOEkNd;QeKYQlDEBS6?{KxE zUyr)ls3f$S#dQF0kGb0M_G#BagvVWn&^w84w5u|Ho7}YwlWSFsqI6FoU8n0XQgpdo ztS64JUR7`dWl|ptOo?}OycpMgLcx?KJ{pnBQRMPWqQT{M9Yf1Jjlbg<1%>V=rG>1n zPNX|YO#vgSX?LEr(Dl){KvZlcdmez-T@a*BGqYD+9}qixp;RPWp%r{fzf9e zRuj%Vi+5)fsBD1eES{fzqWV0C63)8Lt8i;D$Gdv)?YSpx$6l1!Gi|tH?C$L}I4;OE z^E>}*uECHb;cAk4T?2jI-r7OT^3uq;idsuFsfuVsxr#v_=c}GwzkL#$Dh$rz#mj}ETM#jAO z@Vt8*xw8BezC_f+DZ8cN5iiS4RH814J$9j9lyIbdC56A zhI;Xc!_FZ$%TCEgL`MDGgZ*{V$qVjbX%v+cP04b0dN|ZIEJOCH&pC{`v#i`#MrF6h z<911i2M$O8(mygdIC7aXLN^RKy`CMsCe>&ez)Rdoow(_hyyK(poh-lT@BEubd_=?c z4~{s!y^`#vg26UW8BPhT(iMqvMNbZmis&2zyfVc>rJcj$3OG`g?Cu*mKMelEC7m1R zK#h3^2J0A;CG(#uN3SEQ2hfzx!OPBZ4*>9v$-}(j)ZhAA^(uWT5|2nj&MQEW2{+-R z+r`^*aKPgwutaB5Kb;#J7zCPlq+vuu<|7TTB+BLXp$A<4>TsDlrDY%2xVtUiRJ zVxm*o@MU?mps_)1K(yRiXM(6uZ_r?o6e1&yj-49>Q54mbszzk=O+U+|x_acC$1PuS zyQ-@R&^G6w$6X^~<-oEYM$VDRDUwJc2Fwa#qEs`IoG33jL6J0K0t%@S69$w

5Kp zMoxNbcnzY)BMlGr69%itE3*dI5rikC2O@t)Sp+S@L+`-wN}_b^Xy?IG8dZuy6*Ss! zos>lOi-$UfQxuJkfVi+W;sl0K73t9wMWY~;pME5529#6_yEMt@_X;z;IkE7WL2;2SW-GXl5;#!%rZT_TtS=>T~`1^PIp(UB+yT_l;( z5T0g8l*xz=rdB>h)6 zflC9fG3Ovg3`Qfz7+tHeA_eRU*^AL~3K*?dFrN*&L9?9a-8x#hXU`sq*6|uV14E-D zGOOXMn|oxJkeR{P!p6&ZF~Y1ER<*L9M#POvIhppU3b1tVVn?6 za8r&QYI-UV9Www9V0gf(0tC_>v)~$u=fAtMxd~9PY`W0k=iJ~V_$<`t9P_xPhK==G zv}&X6&jA+%0_dmASj{EoX-R1=dX9h?{14uKnOc zR31o~W-$(i$A-?iWnyU}c&aG!6&u(}w9)3;jrI6n84V<19bJS7O5G~!H`H&SBu^5# ze$%#XTedfD-n=C`XVzn#7l0SKAqj4TSllQ$btqp4L0FX@U=7zxI^36~)10MgagLYp z{%yYC?t3279mIAk2A?k9Gx|JtNZQk;%CjnNoe`MF_+CP-%?fIr<%Jz4b`Z=8@VjB7 zir=f(X7zET=Z1I>@IIgw5oU2}Ob=UhL!K&!ZUEQS)v@HGV4%HKNU60K zo^)J1YSXY$sZEU(-Ik9}1-7k5syyP9!OcsD$Iz#;^b`@(Lo%(P#&tv~X2A_8yAfHG zoOF6FAf0z)7|5`HK=xh$)FqDr07JZC3j@GCG$Idxa6dtjjWyCHN^@}7hN~Fe?YosQfwRp<~B&U7;sp7`)pU&D&ZTi#Y4YoS=L9Bz!8-fx-zu z(A&5zrtt1Uf(`@IwRwmOkzw47h&X zVu8sLz$l&@x#W&rhSCNxOHx|3x3_n691@#h7MJlctW%xU*jKpx3=J+__@~*_?W825jCz28}fNV#IB1+^}&o&8}N2&ptLW1A*caZD1o$OA?b2;XDw> zPPHM_28x+P<6Rz;tg^mgL&FvhI!#ZpqN7vzI3cc-iS_d@@cQkIjXR{OszWC_K$0>2bPfz& z!qjzW?A*Yho5{jjq2h9$bA!!4c(BA#qYNxTAnLbotLGUUMh}3lmz;FFTm&v~y7>ac ziCE3kN~LAMIqZy;e*1Px-_qKQ=?L_?XxU++-Rn#evQaM*U3{H zV+kUcyI<-N0KjLRpJ$C zaOC_zUk#`>QDoc1K{N2rDAbsg<~jkGvfk}E zhu3xbD9ZYq&=Yk-|5DDfG;(=Z>eZlk^s>w$47f1js$=(^7#gmTKBn|#=*dL&Zobg< z@HpWFWsMk)A9BjiyS=v!bzz%+0UFNIKlNap2>?CeI7WcO@m#hLwhC^nBOK4;httIH zR%+%6=k!kIfoyXLNv7r`aUNKH3%0)W(%`VHubbWe$Kba^}ykT&~ecddc zP)iHoiU(YA_%-1-9(h`3jq*0HFk&!FTD(~zPf;7RT8el#X%YENS-eny@e7dWiF@r= zjhW;v5N{E)P~2<3lSvbJz_%jpow!rJNa9)hm2;3H#`{<$3>#hXl#>cmvaZesZ;8lN z)Y-Fc(lVJ0j4AMzi*K$3lvg31v|qHdb<*;N;p=MKpsn?7Y(u{}MEr}@;!gW@B~IFq zOVZcP-Wu^%K!Sd<#BP~O2Kmfm@=cD7Bi;?76yzMEKSV2uU%+O2Y)(lcw)kcE7ZQkSBfiD7)=2mQ{+t%U+u0m@l{TV_>!)D@#O2q#p=D35iuI9lZGDBM6+wsgr_y) zDWaTA4L-!tFgXQJYTHes)Sk5>{iGRBDlSw1^{f-$BJ$4CMuwnuqP9pQscAH7qmIr= zqrecvEEX}*pRM9v`xSXJnzUbgFYa0lXF&m`Qjz+Ac&GhNrival8eYk^7{=2a+0Jty z-${JlhX!0e58a1&qF*-OMZTifU67p8rz($w#M7AGYE>C&l=?PEN(K@rtNltCbH;kHxA8z9>SKTB*mDZe_$7*BQ1&E6R}zTvZ_Fy zD^L!09>oe_>(<%^6y(xG-U3vtsmRWOu~9p@P=h#1QVU~6PLe|sO{y@${vn!+6PiDf zBk?CIp{~|gt!i47K|sK?3cU>bARmveJ@Gfcc{YMSTA5QP*KPny2wy}zKm(*5=)0hz z00~vlKH#;5=06Hjs&^Cg=A&pvH}u(VS+}GVjZzI87VqVe+Cef2l_lzxt(&&j)@ub* z@9@6Firzh3$=bdZGLHez1-$8(`I|QIf_)csOAS#1{f?|0R8+89IpWzl8%Ya?a|6Si z4d;4sEDeC*&?mf=u~5 zns`u!ItJoE+elg-P+6$u2fPq$l5(=DS5$O&2Lv6E%dyft;~ zLQPlHP~^b1h13@A;Y$PZ$S@6UGT`9NhvLYT#zPbex-8XvM;CcT)|Z@+mcu%l4-1$* z_dQRxEohSw83;tHPFhyMkOji=9n#^Zjsqu}4z$)thnstv4nyRD-y^M^op{%Y2Yg#XP-0-84xt+LQQB2VZGIXPrw zB?h36M_^EXnn=z$p;Q`j_dzx_;2DBSZd@84a1XlBaIj_bK=h5C0hJ-FL(}%jBhZ%X z`XM%!DFYRY z5VLk0V0I$RxP}yrLqH-Lk7!+?Ojq$uwEt5MC1lzwAB`Cx4x7fRE-WE-uiL03;7ZPg_RLqgwqMbTYx>O&9BAO^*_<$$V1*n=@Gd zFi8oc78(lzV-!#no^*HRL=tJGQBiOq6Bk*J>vIKcT1u9sQ2hf7p>6;g^wY>{aYF)E zPiovvoSHJ*5zrN_>2%q8c1RO-J6Sh9Iv(fEVEQD5^Da0&B&hO$Mvaj~NrKe&Dg7t%hLC0m95Yqr?KwUVC z0Y_Ywb5I3L-iGdTltEra^3AZdr-#gJdwS&UcrVkIfN;_?WUSgM%OkQ(YxuAkb_?Mo z*FZm}Hkv`gmWv|;!{H^k}&I)ICjCcnAStgL)faYAD*y1Gn~Q$1{4Fu=nWCUQ*d>0x#xJw2W@l%r>5aDVkz&u_Q@UF?Q| z!Sl|Ez75C5F_Fnb$K(;R#`bLJf~{RA6L_9+OlKSFE@AfCFgS2-1J|l;s)M@6 z1La-qD5gRPN7khhQ!pF zgn%_~(YoeAyup^Xlq@YIOLJXIUH3dud`)%u%%d0|Z zSxafffwbaKM)}8PV|vB?jGU#64S|deAIF)}HzM=Kol9HW7q+&~ZeGeP4`h}vWi~8i zHrzY+ae_JhxbdMmt|HZMEBQ3dkX7V!-8{6IxnaJ|zyDNV^Qq+=M<}Pr=UrO2F|cl< zzo_0{f8<{Oy;J_IXHe7J4Ad|^<3W<4sN`#B=T7+T)zcFQmecaCr(8=3jv!E99n-|lzEoZLrZT1)MxYM$j+4NCHVJHL7O9eH7f*Svt zS`=8f&xkO6A6m$qnfkzBPDw>o3(BW0uh>I5h4@KcE?a-A#oy3=uRK_GY}&GDEe=)f zqu=sSo`eV~;zx-tq5J%G`+i*dqw=8CP7&8GGwd1*W^Y0KB=lBd%96DxU@cm-N_fi7 zzkcWs4^6iK!(Q!}>F{lS-zI%*He|1Rh@oHz$Blqrk{MC!1M;gEg!o*@|1xeM;#WlO z5cV3qYCIvxk`pGe!}j?q&=ZK`IwNDN;(xCy+V3}sl&gyA69goaC{e`59uBkf06=MS z5tGC~muL$INGg<3Y=sbIiQESxId0Uia&#-+*B%M-g4a;VglByA*J z!=h0D2L=_&KVCpoWJjEQ9GS?S6p&Vk&yR^+Fso*>;%$@ML$5C&@DS!mlH8ArFVw_{J<;=R@>|9JPo^#)N;Tso$)meGdPZ4=5zq$UM35>x- z`_AQz0)Jt5FyoBhc7{Hc&BX=n6@F`ld>;AqsR)b*f|LFplBhQVxm7&_(7D9`RCbs; zSSw-2tQo5C+eTI!59OxR1Iz~&K7*)8)V#vqzDqTsiSMdm*`6`G`77hT`k5)ewUB`o zHp8$cV&GX3mBAK{hD|r{yfFrqmr}CJOByK`x_L)nZ|ADJ=u3zez7= z_Y%f~9v#Fzv!ZlSy>J z8mq!m-N2yn#5KQy_vKPHO}sELJc?~mdXs({uq$=}aSNbWpLC}E{Iipr91&^JY+bRM zexmI@`f^C*DXf)f)ztgsCjJD;N}>bAS%u_)B`4CtBq+M(i@DzG?UKjbSU&M}^NQAo zsTJF=f&C3MPh7@6ca41fD!ZAJ8ORx6sKOgws{9q!Jt&^?s{2(ck>@i_!>|-UaMoet zO*XjM`EzmV5r%qJP$bh9QvHr(}U_W#+TL}Jv|PE z%DjNDdMYE2E0VBb?={VM3s%N ztTP(MjTVDOG%l*DDuAV2I+B5TUBDDMA9u9LV~FlZ;2ldf3$N|bH8{w;Skm<{QH%U6 z;>cGhVth}J`vs*_Z=1D=BAgnPhO)&dU^9n2g@=g@T@hg7DVv{CZ=S+OBDFL(6fD|n zLz#K^i%OP?HZK-!p6*z-=gfM2&)w<@+8e%o{*L?ZbN&;jgIl}NSs&yUK8Q1{+w!T^ zke2o87iPZj=4QXNalR~A(0C_1Xy5C%?p@iLWR<`=a}nW7hL;jwN_r{zCEH6WFQvX@ zzmAQyGlq)_eML<5(kNo5q12!;RAmNe_5WfDZc3)iV5tmVnxNS=soDdqF-)4N6Txbk zpszMwR1rYL#g=!~;sM%zEe}=C?J_fFt!&aVYkJNw758$=%SkgS8Ztmboi&rB%_DfW zO(#vKV9PkH7hbgXnNGvK%9QDgrcMJv5wnaqR>qf6hJ}@p`m%j0{^gX(cvn38vSlXK zl|Xl%Ox#&XrF&7eSJ3JrbfEIuC?A}xn4-lpRzSL>Mv>jWG6Qf`hFeFbUyljIV zM}jK}DK^d6T*>&|Fllw!7);e#O=gnCtmR619s^h|oJoEpe75Q2X&Y;y)Tq)|Yau%; za|A7vz*>kw_p)dw4&!qQjNNLxop=O{2Oa}sL}e6o>!P5`jlyC3bRxrIjwSJ~%$3k`tiEi#Y`9`R zZMbZ7WOam77^8ZD3k`b0#-3l$kc!|aX+9$^>7k6^tLE#58FS2WZ}1YeU>9PjT%34k zFldXU8Ro=BvyYh3xF{tLL6AEQw~Za}{9@C?DHBNHIA-i6m*SpHvE+G%h;Y~ptFv$% zbI`&$T7pHodi5%2&aJx!okQnb&OH;3NIHu>FGQMqdg^vDRgY&6Zg|wcBl25~Y#>1q z>+eur;hV0x&EMSd_KtTh&AV?;eZTK+>Gv)Kiw=BhHaT(_LHz|0u&`;QKWxEXcrRnO zBN~^8ENk39!p&DLPt>>|p$x@LF4J&|Zorsa%(syk+PdauK1?(cIAbJ&gifM%jJm$1 zbez@!4oipp2Z;5H|AC7y7~Q>uANyCl(-#6cByIcR=gWpSCE-afn z87Qn>E-abba^py-PWW9}oLKRaRdz;;M{B)51l$e_?>aL538(h( z8bQ`cb{fhk;(hlzMX)okO+7B`VrPPg7{lrFc3nK$+4B@KkM6n>^vhD=hCtzlQ1$jZ z&n#3ozu7sL^~P!6p@(s1>Zy1~4)~X+j2*^%uD^ENTcf?^LyeF*qFadTV`J+9ZoV3i zu@(0?!lfHcmWWZNG9ojUs8OaaO=se1RB4RG3>%FoQ#HoKXXO&33>|J^WBIq=;c1ia(*C=2DkJoVLp(bHN_}3i7YY7uBA(IuDuw1w$ zR8cb@zfiIDZPWLg@5bMK;fIOe>sXemZsi7~`emtNZtU%pkW}`~q_>kWj@K4Ja=Ly; zB+}Tegfz)OnhZVCsINKFQ12;2o%#BTKj+4(%N>D7#E3CG3gPC-@MuQJ4DAsZ#il($ zpOX#4sjGkelQaRNgq4pw{XV^yn-bX zz0e3e6)F>fXQUp>BBJu)RHoz7Xav#F|0xKwg%G9}xkn>RZD_;pyLk&64uWFj+%mqM z|HgASjxHYS^mldp&paFGIvYIp+`Zq?rU7X#>zixdUh~c~^R2hf0>8}PYY!H-K1{F> z#v~{cg2PHnafK&fTDzW}aB7oS?{V$hFf~A&2c{@qKK+%@i-ZA>3x+ISnWjZY8Xq&P zt&Hw)1_=QL!v&*{{(&puc<%^o=RNY55MTa%%EB@RrJqbpf&4ZFtWk+3M~_D~6iJ-b zi!~&>_VJ4|JIQJlAjHdEh2II%bXt$r{U28i4@?)0iCLk{+@;K_KxWmgtYBuH-&XgJ z%l5So4Hxj~e(^@XtqAHMe^%`u_W9S;1aoTr_Bww<%YwZnl#@G~a36B{?rYt1=GS|s z+dhpqq-D--{mK`7&IS9rP;uq8)Yv3+9Xq>BW$XHf#%|)gf)0@4(#gTiN%sa(rd49SY^Io7=jO z@3{5MeADgIOSO9fwR;w8_l5G--psjS59O`9xh;^l{vRw>%HN9o*BEv-83SpJ$f*T_ zRQr6+{j5CS(LmPvP+p~f{jNaXu25dlT-8Ee^>SW;ujP%zxu&l{S5f$u?S}2m)L&ZS zDW`bkG-~9Ko-qnYO$+HIp^mOV+EZHYcXIER+;zt&V~x-CwWL@@JXw|gn7k+_uS2;?~y^HBSU z77OJSyy?A>{NF4IR0@J$8WK=S2CMRafAF-KaN$>;E@0lvX$6Kik`7dw|7BC!ffDl% zw-|B%!<|hwJp3qu9)6Uv9rr(ur~4n^8vaebyMrsqM` z6q}X9TO${A^IlIBr^Odz%UEjsYg{qCZ@Eg`vrj@dk{<{GTAp| z`*n;-m?-S@x<@6xbDEjOD7H)!Zh54R@tuxzCOO3n30qA!+kz!~VY`81}DR`HHdCDMB zVNm+}!zr}1gK0?*%M&IuI} zZKln9H}7^{FtcI0<-R@R)hjbs{FpCu^R8Kz(+hmfZ?)fOzd5j&zA==$=K7UuSFTT8 zo6>*kTTHK3K3%hXl(WuX()fMLoz5Se`tGUkrTQBW+#UBzPX}|3`_qnN?w)<&<#7ht z-eAr?f7-tLd4;~Q8@B0#A$#7dU!3{koN>|anCn7t>-4+N-G1)Q3yZY}?rwg+_5ds@ ze5PwjvzGgXMbk%?i%RF3=ElGI#kapW@BMkvuGu8yI+uMbDVVcq){KV06umQ)RlJl{ z709Z(mHB>F?Sllvy4|o9$SU^RB&KOt7qG9Jv&^}cDs~1ccHU_YR_qJfoBUSjh0yj9 ztT<71HWNIDo9l$__>I0UD&tT8UPxM}NUE$#jkOr$L|cpv&qI5ahmve+>l}LQma6c`J>_?W;N&;ym!L+jJxR5pF)x?>^*)kuQOoZ%N(>C64 zNTgos6k5fmPzd2odXg{5gC?#YgUWjnv4;O%TSve?LY>4!W6Aq8F`g#+cbOpQ%t_RV z1Y@mOwD_1dO;_g;KZf%5k=CPcI&rXzmE-0G&l@EExByhIb(<%)~do0wALBc{}tTNC9|lctL$ zA}8$^gA3DF^o8w*`(l5&NC+Br#m-q^8{7Kjh)ROT$EGqd)siY#DT8H((Qq0HrdP^@ za2u*8mDSN!#{DM5O*0yF+CTJeH0vSqa3nZC0BvtpRKR4!KLU?1G@Wq2s@yn~Z7b-d zx6HXD-M|nfNz5akQ?)OWRY&;>QM~fe=jc!W|I+MhHUFH7{Rm&Rq~z!Au4~GeYJO^8 zY{0=TfKhDWCqwS2zJN&s*4gCLQQ43nnz(}teZLNrlixrvu})F?!yq5V&eV~7F9>%F zCRK)wm5ddVy@>6|X8Z|LMld!t_@ErI01Ph zD{qf6z~C`IoR#+ghNSub9o5LMxH;j^ zZJ_t4=9)5pW!qiPUH83ufBBK%nht+f2Sq(<{FR5e`+uF?T4MNNN`7mD;U^`DtsBfg zsWVd8u&ymVa=n{?*wlv)-$C%W_3r<-W)x8-jHZq*M?4=4Q~`OC0xYUDn}}gIY$Cph zH<4I+4{xIF9w_R+B-}iPkCAo{xld~MP!MVN;M+V0dxuKDwQ?nkL;$l^r&*8jmbCPV zx-^!h(;)vYK01u@Ab#ZM5k#z0^VP|jNndNwUgEcw ztmJxC$Rxy%@=5_Ih2ATLfXXBvMqHe3(IdNEV|{2zVMgS}dk(0gd;1%_n8=AF5F*i^ z2`C|QUAAYl+E_0|xNV-BI`>5*;)7MoIH*xPV)2db`Sk+(FF>{bRsO5IAk~R+IlJq<3iYnI- zOEx1Ht&(Rv^0Y-|h{vcrA72+@aAUPqg2raKV*B<`WnEb9BzDNPD1D+(5lwsQ;Hbtq z9I-W}Dr|JfH56-&8cW$OB_!IOs)-u zcK_OKi)q{SncY_k%&%XxHDI=R_43T+*|D#D(QjSL##lIxNm%-*uHuTr4I66z3OAS_ z#Ct=m6$6pzNs|yt5zj4eg8`P2jD&!KlvmUx7R!u3S66&mBnY;!zJVE+;UWo4qAtyx zOL5I$7{@;-pgFg-3DMbJAXo`7Lpg|Xup5e7UWDWNaG;RPH}(*31AR5qI1+CoFH+z_ z;2~NA4o6{eevYST5sjMVUs2~DL<~?ct8K}ehn+9JET3ntbn|i<9h0~RG;_#v@&cf$S=iQlD&0$Gbere{!mxfMIe13d?3nb-9Fu# z4DXl`m_8L?qDwP)76VrNqJ_<|hBnqmpDQ1%chp{vMLsphL0aFbFqpK}(?xZ4&LO9e zi5zJji@LOlQjdG%%A}bnpFn*1CI#gP!tvbGpG+fNK0|>HH@K{g2@6-?LpVjDG28$% z3NymUDF$Zn41Y$LF@zYHf|FBc%Vu_h$z3Z!6xI25;y3MY+ZQ*s1*HSQ!uIJSAzS{E zO$yi`-1=t0+XaiY&B5Z9MO*7~R`pWWhCtSaZ^zG11vj<^v)ZOxKhohDwg+tvtlK=_ z8CZ zm1yxDneZhUA=QFJOa3nMlRu!~ECt_35W(p{h=tL%iV#ct@&Prsgv1bHS#7VT%wR81 zVZd7GJF#dj4N;TP&Yt(J(j!<4TFiXaNGDp&L@^gLQOpH90m%5G6-KHSB#OFP)Rvio z;LjC%l&RArmk(f)jO&PyMiTKOa`vzV!B>q>8H}v^&SIs9Y%%1K(5Mjsa6lwwRE943 zX8I%Jbt8ymzQr(Z`V%uO^33uNkky14o<=*cAA>k&h!jnA8|B}@EhB{r-^?eyaN;gH zxdBIu?3t+0&9Sf=#+o(4l1;?>Tk3{-h8>I1XEo;I5bsk6^> zv+>sE`J%g7!O}K=2~B?=lx+Kqjjb=Qm5gEI7vwhN5H?O>JTgWTJ6>3Uoa1MscmXjO zu)Si2{(HQM-V(!7{U?H{8DBrsCg^K>gPGWuR`$>W0PmMnER}3qDA@+1pY){ZILMDP zvSwSZAG~(Z=MH9-`7_Jsj{EIZerwfA>_NVKd=VmChiy3KA{Z|aBg5C!R5E8d*yOaC z9;t=cPHK4sclu2+=_{1b; zNtixsHt+(CNKoCu>q7jSe4m0SkmZwj86{nYGz4B7*mmCki{M*>C|3<1F&pyJ?<-j)2Vp;l=vf>*u}S`NDf& z2-=$ekCdF5)5~d@q!YNmRtl|^K8`bI=V0Gzdd5R@LTc)NOEaWq&Ybwl$p_iViAgK_ zk?@is-@nJrYW;}b0Z7poSe$x%iGGde^AYR1SZQOYyI>@ZuIMWw_Rx5$(^_mOL~OD0 zHS>+~wC|fU5-U4|?@ZTi29N5H72m0al-(B(XbS~)LI><+w=D14Z`%X*Mo`YwjHQ&4 zKuU?^tG#`%IwrnPA1qfbHZ1vn4SJTt-Ho&+?Z2hCP^G z^&kPS9?>uJsK{#l(qeek*k>9r^qJ10l}NXB-tfBVl>`g+FW@O=uRV(42V)N|^;z`w zlzGYmZ8b9-jy3u;MiKK@0d&(4$@f8D-iLB8Lnt!w$^kf@frkWf42JN@@HlC1lYZ0d z5Y)XS(2bD~ZNmZ=GeEv`aA+C%qK|UirT9msWddfY4TKMDFvk)1=V9wiI#RT6&=WR# zWGB9d1^1Gb{+*4dpQ z+q${rfURc9wkcrSG~fEZZ3l3$wAo04S4d|{KKmrmu;m#e1OC;drc6r&-$D`;Hs=2m zTdrsvN^Fb~BaC5G3@ZIEeu#82mWh+bOHd%L`VG5UVt+etglA0b64Dfl+5$yej0mV= zElRXKLLwIS3Z_VwAY5{CFPg>qF3)5WKl^8B&h&0+S{6WUcTVX|_?h@6$>B@+| zs451v@9=SI1FIe%Qz;l#zJMI@<1W(d9Cg9NVybvGu2U#RzIRwAb{=HM^w9~jl9;{7 z$&omhOCo>8>@XPBArY8%?&1o*fVtNzQfv#4OyNWk(Suv&6bsg$4m)4d?FLYc;gFl@ z?kEM+^rRT?hqG_UdJ<{RHCwOAY4mv?eYTOXR1~3OXzUc@4gyTZOccNh_`m7x|3m50 zI0TB3I(Zk)P zL&^4~nRduaWJcX!|3?ca4Yu>Pno>#emn*50sVKi>4g z<#i=DH@{>3<2_5II|HRV@3aR?TZ8M`{I){O3njIh$BO*o(3;ZFn(9vz<4WLzq6ieD zxO_=!2uKZnd&Be;f>2t?Qrd<<+J@z-^fK`qn^wYpB=}Dp?;Y zX+R#?IiH&0|KUNJA=j~#voVmfak}OA4}6rfmVQ>wKSUoGjUYBTk|~Wfp9^dS4`rM< zoWvVhk`#rVL_2ZCMqKioLf(t$p3*bm!O_&tQMMOo zB41B~BR(}yH$rHIZiJ#JEoats{o=KYL3^>^TFffXY?&jh4v9t(m;3M^5MTy2!A=nL zl3#jH&Dy>vh&q%QE)(ssr+tjWm`C}R0Z=rJmoa-)iYd5U#5NCSYdbnXe`3hG&%^TV z8^%A0{{s@h#oWRZJ006sX&krUE9n)ZE=`mGfsT0>zD}BH!8?)KME)p*x2?K~qJwa~ z24yRb6XhFw*!FSZL#j@G2T7TE7%j1gHs%2h%nLFfJGqB}OI75UyYUW6@9_-vK` z61P!eoZrK%sPzj`iwk_)+BWK2F30)Mp2>VA>!;_^UpqU~b<1+= z>Dvj@rsd4FzH>Lr7Beenj=$42U-q5q_p1H1`|rpLwfm<{_mfjzZJcT3_yM;#u+O@m znR~tQTBC3C>$|5d)5mA5A<_x*Awxq%TvR=Je)vT&P(T=C3oH`OHWD+XA&w4N(8L4k zp5|C=8M;bE5>W^?z^ZBzfo!ZCM8G7c%40RB*g(Z9wDze<%d>!PDsC!%irf*C>N)C~ zG|9EApoih2I@xH6MER?vQ56sqsKs#F<6=$5O~#8=EttxSla}W!Q`V`(sidjoDVuI; zwZWj%#)s5!GIEX4Mw3aC$s(^QVl!gZHugY>Iq9o4O^G$_uTnEZEEYiIBz~!FU6zZkwA?i^0Ojy#k>nkrY* z14)|X|3bk_6tFS-dvr&GG@L5D3HLBRXWZn0Wa?on5oDhkP9lp6<(-w?(_8BZJNCvo z7*15)!MPe?s+fTIFK6Ae*&b4*Nd)omOcX~<8bnv3qqGr$fmZGr5e%AfdZvW{sLC3R8d1q%W%bD1Y|N8bh<7<0DmFojpWwhyG z&JrRU(DFc5`G*Ci;Mw!nzLjtzVa~E7Z3;-6f_a;SVc{*5oJh-M4 z{<8ABjQ8^->=a=912$P@=W_$rrL5XOR_(2UpJ#3Rq|%W8oDuqwwbgtgeGSbYdm{Y? zzC^GR+H}cW(x}rV+b0F8sZ!TTvrbE*h$58fQkzm^Qi7=IQl*aoMY)8wYm)7%B_Ytn z^GO1Kq8XT8I^6=8*DJvhB~A}imZ8j62%>cQiu-ZRk%-7(RsKesF`*EPHCIx53bhB_ z%L%~57_%g{b27ImJqm~uYa$Rk;@fkC(e20#>`;;+C;#)#l9&NsotT;U%A^k#0kIts zS&%zppEly=y1@iZ(M8-vUz)`!ddkQd8zIUu$vIS2qK3kPmg*j%d`KcT52ON(9%aO! zzCVx3KIHPvkiBHuyJRnc;nK}b*tK*kYXMuAtaU5--`^hir1z8aqTx;^xV>=kOn^sj z%+fxPnonLsZ9qbUh&B9g4?b#{mGCjn`m)zG#+{KYtj^R;xS>J_V|g% zq^#4h3XEkap-wz8ZHq3kO}P`URi`2{Pt{F1w4`>j35bqHM2G%*b5Q)MbC8Uc3?@e| zgwf_8YAVc@oW){PjpiS~u#&1NA10B+a~R2fcy7wd$@x=c z$J{5g-h-csOJsD+4<}~leu#6>a4aQhaB)fK-pUYaHhg!tpb?nR8+-KcZ$u?zvT@BSQfuuwgEb#ktJq$ZxuU z%mvrviktHn#^5P}`8Yp^O2C1;TSH&$8*|I>b4$J#;ffxID=VgBYDQHK#RXms9Vmf= z3UF}17@WN;+sdNy;~UPA8!`UU$e7oI;|w*NN3GF9TBV>aAlHxQ$n`GwWldF6&X*Jg z>y#5KZP%$8b}*m+tU-{WXaVj+Qgnqb6XGK2SW5=B&062;M*(NMCJ&-rNoLNc7MI&Frkc?f)(y6)0{;`$c#lQ31K(X40on6>*vcDvrivFL-}C8Dw$ z37}djA?x+B>l?0ZSV%6O>$=tQ?vdL^7RtAiEGIjkT*)$XlZt?~V$oWq-oGEqcz}jD zBOqjCwz?kf?0U=_M%}ytF%9f8)j0x*l}iu^*oMF-rOPZ9{?IF!uotu(jIv3@ff%F~ zy0w@K8+OiI3<3imW~;E;n$gR*z*5o$B4i#nLs)u!i}%S+RMsK}@08yg-Pc_&}HI09Xezy8sS+h+M)} z#drRA1S0$`K22bOki#jt`NhaSiqPnQ$N`I%>1_5D&IC=_1wY5w7S6F zXSlt~m(ntfK>8JB6#-kt#|G3hw6}R_?=uT~$whT#Dm*U0Z?oB8D_^<5 zAk<=rkL^-$|3?;AvDR-_F)!kaIx8ZTazU94agg4`dj=?vxH05)7!25l^(ZEZ*yF0L$cI*SGQ87bXUuT4ZfthM)V^gib zDg!jx>4_Yny+RYX9yMKUgho~A7Qz2I!H*%DY=3p<%uauD5zQ^S@mf?4MP4YQbgpHo zY-gZsr@wU9ou)e%elYyq;ozPQ|L&vr#{Frh5eHsp*1>?@MJ%QsaWu2zxjh#^ioo9mY&R6oFcV9yF0Xln|^giv2uWUff_6UmPd6QfW} zlCI&D9>&kqN!X(Y@7=4M7^d@>E{sQLoy6pH7dYR*&pgsNMJk9ccJ3DrZy|*iPg6yD zYH*f31&;sW5w(z#=uTPJB4Ae#GnkDQ`!K7M$bC-SqrvwGsmP)L>`RUztzgnSVZ!Kc;NjO0{%qC*<0?|1JdIxT>Do4n#SX7Lem&f3u zboxrwqL!g9WrF(QR1KVTL-o@4Ivw$-Um#I8>(KJxs-B`{exA^Z4Ec$H(1BoSrS(4Y z8N!KF12_gt6wlAIqEitGCJ)?HG8|*h>tVyh&uOCby6E5*ETL$L1P22cKqG@lRMoq) zSBHO5fYJgPU#N}qtj@xGG==#V?*EhGc|IPmhZ$0$&K(Z~)84m4uuNqJI_5YBU1krH`jd!yDA zGa6-LxJd`2a0P>xYYr!HcUzGUy+CibgX%;w!lYrGu^n!Te5_Kqg!M@XpB9XbG1-xYiw z6=Invs`Jl74Wopewua%$Jm$kAzx;U*5kT7$(Tf~rILK3(&?9?e)uEsnAd$3)AIe5q zXtZ7a8L$dy&vfNCanJTI;RUlzV`xtr>D^DBk`(4FIf_FaRDD8A>X? znfG?ytCYDIr#)6A zzLn5unYT1r!ZxL{Oy^Dpd?U|~jfS(Bm%<(~F>!@_9}ORI(W;3Jr80yVN@h9NWn{vH z7(+@dFEpXTaE{CLk-H5RUr6>W0m=+Aj_*WD9%xpkHVZ}_8$&Mv%GT~8a znR~7L$#@LgLJV8;RKgUTXrW~8b+sTWXRHs^oQ;#*fxGb)8%uAGNY7o9t%*u+i%ic- zPiCo8BT{oG@s&}jh3Pfb3#GdfbSef_VX?+Q);u6ac`RR;Uh8UQWtKkMKWBSFxu(|o zG3}|8y@r*&HlplAR(8whEW0AI?A7Z0s6J-pnixb?8bq2Iohxb5gw0l}t-+UIG7m#_ zh6|TL%76WPN3!!J43)M4636REK3_ek=Sm8?PfVVU#iIGz1L-YJP6oFpI04M|eOO1; z;^01b1Re0={c6@IV#N$8CMH)p zvSiZSZ&Ji)NfyH^BuX=oD2=-TF=?BbVXX5ZvJ4xa4;wErd$uTZRwh5IYS*bTh!dbz zbH$LCWuh(~TIMrpHI8C@d)JN4zIvbYPSXz#eD}a&OZU%rotbZ$cFtzKa@xP^%=GEE zcPX;#^|i)`R-xIQwMsQ^)K*E>wTf}lq}DPeqJ~^5uLuU4(ROkRf(Sl`3kILKV%bzN zQn>Sqr8m6&?2Rtp({skz`dQ~6R=oYJQj7FVV>nSAf8jWWo=^-Z12UYX4H4{D7~r3i zbpvN2`vgD#Q=wp-Fww4{Pfo4Xcm&wiNR zFxU0X?zg*d!uwGJTq!0Nz$(v{F?)tgm5XbaiZ=y{HwBBgV86fzmD?9Hdjpl*Z*225 z_`Hxg`a4f9b)F4$o(*>PEbQ)iZNI;A`$A@~-_{#S$(+5skiyd(SJT{i_Fh+T_tQ$m z<9^$5ia4>5Qp_@sjJU8O;^aa~>4&9Ta2!Tf>IbD;u3edxeVgwT-plfLIGKCy-rzB( z|KPdc_H(b9{H0qyp@=v(6T(b*o64HKvXBCg(VwGI!4;L7T1Y92%HrdAL-D3h<1AT_ zIyYQvpWW}Xgfh!-W%=uxzHOdA9NgICckEwsvd2BO-O z)K6^&JI*cLJpasmyMOKOVCo*fbUWlUOtRRTF-u< z#1E6#wARJ{u);#&wv^V*@qZC-p)k+Zx+DHC$}JQ&=C>K*f0S;aa8p5BeEg5?77FXv zx7p&u$(RxdX9x@7-Bg^;fL*Hzpw~E&*A=$X(dl#-A$lXKNHpMK9+uGH@NwJ({Q0G7 z*6DDt6U8e*`A8|Eu1O=dGL=O5l_0TR)Fn9hN9lD0odtyz>wyiiw>7vdBw&Evhqf?) z(~iDSlMH;ZN56-CwR$)dT>orBIh=d1TeTdlgisD`0E=Bt`YPqbiQ1rL^xMrcSHdLP zMx>a6a6wrQ*);dblkwPSsfaspT0pMINBU8Sn% zwuB5?jlT*r$Br0>W`S|bw0W0sNOT3`BFTDbz{^)0H6-exdMhGN5m6I*imG$(K~K|! zd>p|nBEZe;O8=$aTYk=!{DNK^%M}F$o7keEs%73 zWKx&OMAH~&Aee%qRQxdtXr2!zQe(2MXW>=ljf^~F+mU1J*Oi&|g#F>Ij zqU6dL6Lu97>)NB3!>9-wiFLwOQZNb+Y7Dk)f8nM;@}}hs$zQs4etiCUfARicMzi16 zd>`He*v9m^oeQN0zFqa5n)hn{yl$zXHPFx+Y&Z~1X`eQQlCyk?u#}nK|D6Nx9k}Cs z?31|zAm zaWqJVS5i2loZ7xaU9}jw90K@tuw_!@Cd_e~N20f)PAioi0(`D*QDTcq>gp7e+z~ji zOYCE|Q?7_+=ChgS!T`2Mq2;k$9@c-?c_(0Gif;oUD^*whKWl;*>^5XNIxwT9?U6IujM)4AGfUz`OL)L}ejo{7WZqb+Di{LbL;h?nDtH=2nf?kbjjlgmimq(6jo zIu6!EIF;{3t9~GB1R|Q}!(cT#e-~gi3lw6L6R8r+1SDC|+`@HslwszcE`;zbpi$to$JBgli=d}u1|JZ}9k zB)%a+TtYkm6PI-1=Bp-EV6qO~Zj5~jrZ!iQw=coE3lvbqN5v6>6&PMUN8=Z{(mt;b z@gviK#yOVWdTxD%QHZg8mHYhSQkE^z9D;6Gdtd`OhGROkV=RT`<1~%uGUUc>ulyOu ze)!a#7iKpvWmW_-;mvrybpC~4<@Tk_9Y1_ZF|;bLG6E__kzPl_uo+h4GSMbMfoPD* zy$Zk${0I+fMn-{psfYJ*3Y0^f&Pp&RN*-So5}0E0twR+kd zg7+Q%+#F1;!ZW=2Wxl)}$6@%Ir`xBSXEQ@MgR1XZ;*y=6HBlU}mrh%7Wc^~su^+eI zEBo}tQg+HZa4p2>gwnR}_Y<9)C1J9Vac z6Im1Uc(wdDHCGZO0gkOy42daWAx!%`hEKl_z>m8bucO)m5!Zvh(V-5ly=0~;SC?Qq zl))O5P>q>m_YVNKwEk6kknJ3~JOE`Ec6i9FI9Cl_w(gW=r%*EV`p@Pt^RhqIss6oN#)O^U-tDs>~;Y2uOV=|Xm&{{=bnxqpk%vex2L8i*RpKO9%LJaGF!I9%IwglLiBq}Cfkh4xD zl2?vLrMYCpvO8xo5w<08;0nu<#NnVS!`=M3%FBC_^2mV?O3Y;?u2D+-8cO80EPFp! ziKU`MS6r+!m)6AGD>6XOkrVs9_oJ`PpObs z4|b0dKk%ehDr%mCFY`DGvMS1t}q6=0rBfi z-@4U@NmKI6Z5Z(KAqt*C&>^?e?EwThUa}knK<>bO*eciqZt}tA_dlbrY-=Fx-D7U- z9Z6A!1mRR@je1zubJI*L@IB#p%=n{j7gH$6|A7)8p;DO%0nOD6kyyZ2(TRx9ZABuD z2-MgAhS&!Q8a$X&Z#AshIKRuEzjr#7yqN8|wkMQUIQPumVgLRvh~KhG9vXzoeY%-x z-su>n0w4URRrzgI_tP_{OmH?)4c`Hn5Pxz%6Wwp4pKPlPBpw3f z&pxpkiq9H9`&;SMXP;Q`nwcZ~MPhDSVf6!`c`Uh)I5EnYep*2Yj{(pj$d_d(@gU20Ux9Iv&{^ok zuq#C_&Y1h!6ni@-Rt;o#r`xo~i-Z3Ih<4z%VVp}~mDwF@cdpV<=UG7y-B570(5K0MMV3@~RvKH-({dkPVM*sN#C0V)Dl8JUFgB!* z?a)IrMehlcp^E{e|10ke5-k-@Xy+>44oFuqLim9v%pfgnp-vLwRr0g~HIRH>et}{w zA_!ZU3+pHi58H7VxwnvS+%#ZNdd?!4tE+=9NVQu~WQW7pCJZELcJ0F13rtIoeTMYxaFSnOLRt6)#%X0k zBd#&#BN&H@kb^bl3yzm?jr8HLsH0SUJ5FF2#@J!UIePGR1K!GA6l|n`ExS+9T_=LD z<=n`~Am1vSMK8BdKzl92sh!;MfYKG=jLxxh7}?%2aL~#-c`LOH#q-zoST3j7q1*9tjI!GEOS?-7Kp zkg|=sW$!pYtRs~^oTT6Z1)orqWafc}uQTKqh#&ckzMZ8YjvjxH?#KZGchQzlcZC!b zQ6NzO^Du*4MnMGyOuYLXB_nSL@_GvXj2{0j1^v$b zmf8m94fOODba4?W_C}=rKsq^k{Z17tOeeSvDTbXn1H%5Y%26~@z zKfln|=S#YJV7hZQbLLdgQbL8oZ(rH9fgtWIj!)rBgm>FI*cb8RSSsSa7{ zJ}4-9W6RY;v*y|6YgPtPWvF)3t%Fpx@;UQd=bZHhD!e6R*}*ED>&sRuybcu(S?WVM zRg^qvsiG)ZWmns$QCL~XvMsc!@#>LTl1{A+6mAG)ZVXx)@fw=kGIEO@%3m9j%0fjY zp>?I9l8R8x#*Z^kn&OJ@+jD&h0lV}dj-EhH(z72Vuv@U8xepTAEjGjF`!cVkJV<7b zu)EBi^~?-CNMVnuhBTZ>Iy3da&K}ct@a8!d`0CS1L8U7x}sXr(SqKzWxJ>LQJ44nWbD3nRRwS2%*vU1SZ8?ZosG5jG2ZKjA^MiJ$zh8z3Jf< zhgN{bb7?l(E6v|&gQXy$J~jaT1DGwdN$^DMZ#V$RtLuwjVwDc_X)Ru9!48up0)07! z9%Z5B6nZopY8A|s6oGhCYFU0k4MTRkLD#vyRMD6P7qm9_#~PzQy;t&zgO{?Y5$UQL zbgfG#G(<4^0E*R$p|mR;K+G6-+%HbkYr3{V*r)6?2yO}E2S8l_P|A2=hlFtept0N` z_2s?$^WKp@mnJ{`+u^VD2BB3ctH9WxE&vJT0KD315{h3{lnTYlHVYbj7^6BLvrE_H zhTXAH{Mh}^mgf@w`j-b+ zyonF{S33XxahfGiI!ZA55v(YJQAc$A-j+0bR~orto;0;~3hyOrw<-*JT2*-FEQ8NY zMN9r0)oB4~lzE!?Z8?3C^83Pob8o6GRKsl$(y zNiJ)UO|GxP31mm45T+!0@`iNKBEW$ZnYNp{h z$45gn9Ow9#)pePnAecWCLEHtVUNB(rvm1wr+c1vZYY=CAJC@2oZXKO6kU}3YWkT4E z1|jBvB@@E%l_t(_Kq)4Fre;5tx#lzZ%@_23%jddbtKa%LH(az}_7sW09&o-}_=K`c zMg}Y6^btevc<6kAjc!Q%lbQqEh?s&ix-mfG7-Mu~XM8ZKWcW+ju^(b`!7D*OPIYTH zo*=N6xDH&N8=Hczkjxb(gLa$|gA=epT9}%(imp4pE50DKQA5Q7BM6y`~8TECc8E`JpMUAMZ$P1lxV*#i$ zgNVFZD;k_RE~=UwNP!(Vb^O5#jK?>ma-C7Dp(uNTNTG*-vt_E=7>7+B3t2O6O{gZ| z&uFSZIy$T&D8s6fXBuM{rYdF3c98M0rZki7`0r2;-vw+_bS#%jj1%+!RJ^ z7X%n9sP7s3ESintkdtj&nIkX33WevucWDTw)1UJUYNksEoTNS_TQqK7!O#*37fDnBn> zBG{A7C+4f!&r3P|J>e6ug|lHTd2I>(a4mT$3u?&=M=eZT;VRmC%{X0K*qgP{!yFV9 z2wtF!wOEk&gbayF57M44g9iF0PuK#ep+#eMF0eMAfY`%tq{Kfn+x$j$d_a!U{6HSf zhI!0uqqt}aRcEG!%gu{<(X?o0g3bcobbbS^;ZR*R-6wQ4UH2?<7x*C7`(6IGJjkIY z5oELrK!1H~%O+e9{Ki7R$22G5$ASGw5~2c^(sh*a$@W4@Ii(uF@BW3L2oaIYk02?6 z${@~|kcdB@J%e&gc5GaViVoXMDTn8Mm!Mu}opka4uWNG}?7F@z`~B>u)NMLjs4Mh6 zm=1{xxxCHp-a~E=BHxZUHRN7XmPvW3y((_+AZT+Uunx_I4QXSDo@P%g;Q|j%`7Vw5 zea`tV=lsad(YK3YU*XG8A`3y4;HAqb(5d=z6Pm454Q^(2k94)~9K{za=nqXE+}lxD z>UhY*Pbt{LZv zxd(T|z}3yQW*16ggL8Cd#_v4Bl!$LG=Wca+vZFBt^Gm)l-zPJh&fT$_O$yk%L{c@d z>1o)TsTeBSd|0SICLf!=<2d+S2E%V)dOSe6fwLZiJ>n}k4Y@s|xmB!6>~!FFO!UG5 zqfINlZzqS&M5k3`UoZLF;CM>KUlPjb3H$4(d@6Q0)|)D^1n%NjR^R0T^#O z6pE~*E=orDM-{2WkaY*)^;lFo-{({XadW2(nG;(|Pa>ETvoLIgQc@Zpj%L0N6@_b= zY=<$G>4`btL?C6E?8td$iLr(DY35;6KZY92na=H>y95Kj%u?CM9faKd4{8OoP&c=w z2HI_ll2z4_p5M(c9VI-k`)=2xk~U}>Bom=eY>l$5Q9AdeX}8?8`>}1$^TP1Qw(W|E zt8zl9xS?@L|Gc{P%jVn7(wRRE-5HXrw=e0JKD|+rtf~8Q-|c-5YuclluT1w$2%U#f z^<>@FFGp^VJgnOr?fL5Dy^{#ODjTcQK*Q`>>U&|UjA)2~>5S%&Vm9p5ts;BFrqYG5Xs)oDnXhYP$+Ti_q;8A7QYb{q^OW7VdnqE}bOAV5LwYnv- zr4=$krS{jwKQaRdcw1^BXKovA3NNZiCZR9dxLUR2VbzJR_r^Qoq2+;9?}@Mgu_A~e zmuyXLZ4B$fp)ah|59p?n4nMZNtL#A6ls#PKmRlEZUVK>5DV=%J)G0T0E?JTlRd0oT zYbg(3yz6~raYs+a_djeslB{oCIuh=JQO6fXd&U^{fNX4)&OS7@f-<=05HFpSx|eh? zioHC>z}x)ExnuojST~G68F2lBgC{lu(|SNxfOXFr?-tWqPBgrA&zd{~C}x`Mu_W&p z4}r7=sKGjY)lS#Mkv@DY-Va_RmXnY;3JM3?e+>Kk4-_qeZHKlk-9JP>IXAF^3t8hR zaZX(lTk)W9GdY`I(~_tC3cKxOb?^7rmX0Q^_9xal*$RoXM^+b+rcd5D`3GI1t|NAI zwd%lQ>%o@-SEZ`Cg>53D7>aY`Tp{OEa)=_J?r(t`XW*bq}34~BvV0ThCb2_MrGOBvWjrvsf)|P`{iO_WP$SS1Dkse0j=oH^1^XG zSymabNIy$dwaaB4idGHlJQ%;Yav;%tPVOAagaM;dJ3nIf@B=qd}HGx-QSqBrAjQJ z%a&L~8BNUYBq%boVlf4lkV9wEl;N^3G&vO;hax z%k#Wa%~^I`H~fpU{F5tr#YMye9&$!N2uJb9^^o(nM%2hq%_B`hH{F|%)PFKup zzT>ja8}{}N2Mv0w-1sxD_c@kwZ=_0c-L6YGw#mir>z1Us1cbmqq*t;>j@_J55z?{Q z=&0=8pRnzh%?GX5uWcE|1U z@nvtkPWB#Mu_wG>!Z?+vJSCT&zFrJOT~cRSY620XKjMnaf}KP*yQIOWmyn`yS9~_n z(jzzZCd|Duwg*cpgvYU$K;KAIG|M(mba%`i8;^UJwafj9_G5C(@r3QTY(BAqOdrU) z4>4fE8Q@5@6`BNB2D~Pktql)F#&3?QwOu#7*8A-Iws0dhZhv^;=8o4K`ClJ%U*`Gl MaLpTzAlp#?1zOI&!vFvP literal 0 HcmV?d00001 diff --git a/.venv/lib/python3.12/site-packages/holidays/__pycache__/ical.cpython-312.pyc b/.venv/lib/python3.12/site-packages/holidays/__pycache__/ical.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..9f0ed3a1e3b4ade7e0716444441d40587e3c943c GIT binary patch literal 9471 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 dG*WTJ`#L;utg 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 bI-8(7ACZZMt^`s08*`tLq<>9dsP^)IA#Vq1 literal 0 HcmV?d00001 diff --git a/.venv/lib/python3.12/site-packages/holidays/__pycache__/observed_holiday_base.cpython-312.pyc b/.venv/lib/python3.12/site-packages/holidays/__pycache__/observed_holiday_base.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..3163210c407132817ab1fa84d70d610ab28aac2e GIT binary patch literal 11376 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 U8(^Q=Pg)q)!j8`g-f0r{e_Ap|)Bpeg literal 0 HcmV?d00001 diff --git a/.venv/lib/python3.12/site-packages/holidays/__pycache__/registry.cpython-312.pyc b/.venv/lib/python3.12/site-packages/holidays/__pycache__/registry.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..0c0cf2a05ab2e0447aa797fe0fd6947dbdef2267 GIT binary patch literal 18899 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 literal 0 HcmV?d00001 diff --git a/.venv/lib/python3.12/site-packages/holidays/__pycache__/utils.cpython-312.pyc b/.venv/lib/python3.12/site-packages/holidays/__pycache__/utils.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..6c258278321733078813b5332e84208df2be9b94 GIT binary patch literal 16259 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 literal 0 HcmV?d00001 diff --git a/.venv/lib/python3.12/site-packages/holidays/calendars/__init__.py b/.venv/lib/python3.12/site-packages/holidays/calendars/__init__.py new file mode 100644 index 00000000..66e2c4bd --- /dev/null +++ b/.venv/lib/python3.12/site-packages/holidays/calendars/__init__.py @@ -0,0 +1,28 @@ +# holidays +# -------- +# A fast, efficient Python library for generating country, province and state +# specific sets of holidays on the fly. It aims to make determining whether a +# specific date is a holiday as fast and flexible as possible. +# +# Authors: Vacanza Team and individual contributors (see CONTRIBUTORS file) +# dr-prodigy (c) 2017-2023 +# ryanss (c) 2014-2017 +# Website: https://github.com/vacanza/holidays +# License: MIT (see LICENSE file) + +# ruff: noqa: F401 + +from holidays.calendars.balinese_saka import _BalineseSakaLunar +from holidays.calendars.buddhist import _BuddhistLunisolar, _CustomBuddhistHolidays +from holidays.calendars.chinese import _ChineseLunisolar, _CustomChineseHolidays +from holidays.calendars.custom import _CustomCalendar +from holidays.calendars.gregorian import GREGORIAN_CALENDAR +from holidays.calendars.hebrew import _HebrewLunisolar +from holidays.calendars.hindu import _CustomHinduHolidays, _HinduLunisolar +from holidays.calendars.islamic import _CustomIslamicHolidays, _IslamicLunar +from holidays.calendars.julian import JULIAN_CALENDAR +from holidays.calendars.julian_revised import JULIAN_REVISED_CALENDAR +from holidays.calendars.mongolian import _CustomMongolianHolidays, _MongolianLunisolar +from holidays.calendars.persian import _Persian +from holidays.calendars.sinhala import _SinhalaLunar, _CustomSinhalaHolidays +from holidays.calendars.thai import _ThaiLunisolar, KHMER_CALENDAR, THAI_CALENDAR diff --git a/.venv/lib/python3.12/site-packages/holidays/calendars/__pycache__/__init__.cpython-312.pyc b/.venv/lib/python3.12/site-packages/holidays/calendars/__pycache__/__init__.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..490c75b49c6877fbfb4707005fb829d85a288d58 GIT binary patch literal 1426 zcmZ`&%We}f6!j#1ByA^2leX!LK3NbXG6GaKAVg@RCM7LtQo8VFG|gBUxAsi1lcMkm z`~cs;x4??!NL3cB*j1`nzzW-$Oc9!nG}e6_pL^_k{Z-eefcSnJpPcJ)0Deek^u+?> z=9@4+0~^>H0aSyUChZuB(Kw9LF*v6DI2orCaDq<4N#&1`1Wm%Evd763orcrOo**++ zhq|&SNs6Xnnr2`|`3W*hvoK3@FsJ+^nWOV?UfEM*f#zXe+0$f^F2N67kZo*Bv1-Ixn+}1!pUC8{DM=NN4)_iRd>>`eu)`eB;xfUzL zWVC174(44E!Q3Mj^Yi9zk9R#f%2YgpZL7}(eAe7`6vr)kAwUO-5Uly>QN|+3wM980 zV!u(|f7_^*j?CRst$egsYKUmYte`W7K7^#A(p<2)f?c~eA{CU%{}(u_U**K2xD`Tm zGl&SVs+~S~SNpGUJ_t3+r`2Y8?^aXHUkvIWdTv{s-*Q9ZoEgS$b!dLVtRuz+P>9#f zCUzZ*46oTANeqG`rb66LnJ12gLmEHzrgB(rggSivq*AJe?or{szu^SkD7J!Y<;An0 zu_hOtWpUAOeOq5tW>^jpWDkV`-V$XZBgDfrcn-P_Ud6S__%#qD9 z5*KwSIvNHxE9+$?E=pBrI0-Cw7l04PgUv~rd5OwL$m)vOU<(qGm&>A9zJMFCf$u+SHKYN033e@$LxXF`4=_5$q)bl literal 0 HcmV?d00001 diff --git a/.venv/lib/python3.12/site-packages/holidays/calendars/__pycache__/balinese_saka.cpython-312.pyc b/.venv/lib/python3.12/site-packages/holidays/calendars/__pycache__/balinese_saka.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..a90d0cae68c1567446b041f26eea80af9ce404ce GIT binary patch literal 4307 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 HG{ye{C}N{9 literal 0 HcmV?d00001 diff --git a/.venv/lib/python3.12/site-packages/holidays/calendars/__pycache__/buddhist.cpython-312.pyc b/.venv/lib/python3.12/site-packages/holidays/calendars/__pycache__/buddhist.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..c33bab0d4394617c7a29f7b467b57adfcef2b880 GIT binary patch literal 14429 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 ayB5A_iM~~p>vCls?-(d9dE0_hMg9-WUj(24 literal 0 HcmV?d00001 diff --git a/.venv/lib/python3.12/site-packages/holidays/calendars/__pycache__/chinese.cpython-312.pyc b/.venv/lib/python3.12/site-packages/holidays/calendars/__pycache__/chinese.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..374c797f1c582e2143c1f48cc575d1e1daea7799 GIT binary patch literal 40565 zcmeI5d7M<$o%XBg2Aa(V5fyL&MTMx~f*Rx6?1(f74ML-q4OKt`-C%XI3Zlli?}>4V zMq@NVjgcfKAvI+d8>Rb4-qW_JBzb}V4W{Hb%hs^?5@ z?5b{UpH&cys7mKJz(gStFTHEF?=DKqNx zlV;9qoH2!y51cY*!K6#4<{M@>X@L8MU4t-H0n4h#(F$@OrR&Ae7zG<9{))wkAE!6;~$6mKe-_H)KO5!opM(0K&hoTIdoEia z3g|i>|4rZWchQ61e z>|hq^(!ge;?4SV^9E8!%VarvWiwZ6Zm!a%n9%_E*--xn<1t>dMh_ZvrQLe!vlpQQa z*+CP^4wj&NwJT6|a3#tPu0q*C9%Tntqe4x?Xq(w`U6-Pkg^?9du0s)J2g^}*u!4JL z2P$)1{S+oY_8nmM9pbh1DxfW#y>ri%Z4a!$5q3oa?6&!@ocCcj^>rt-5 z29zCaMA^Y6lpSnF`HEXmc5p4~xG?UmC_C7Oat*FSxvtw$c5pq)4sJlX1~;PY;KSXs z=q6aGK^W~v*s_b8QLgJPDA)B?lpWlL@)d7K*})wsJGc{N2X~?D;BKyH2lv1{i|$3a z2KS+Q1%LOW?BJs)JNOvN4jw>-tA){iyxYZtaL=TNPQ2$d~qVJ;y zhWq^klpXvKWd}d%o<%Rif`c&HSJ?6ue~fY+UPXB({R9>2Q1~gz4t|F6%=~$`gHD(o z>_K@Jy@s-by(l|)9c2e^pj?ArpzPpHlpX9t*}+?=aJ8qa?0{`XPs^xj88Iz2q-CVE zJbq}o#~vM;kkrjEvtWjz;-v$D(|%Mx(;L3a{pU z$}{$aV&C%JI+6XpTPLAh@3AP4e;mr!I~nEipMvuE$D=&{2`JCj(@}mFIs@hLpNaDL zC!$>Ivrr!Y*(i_y98{=vm|f?x<;Tc*D9_mQQLgs|s6Pp=FGTr@7oqH+9%ToUQFbr| zWd~DHy+Yq$(Ev8mvU|m|?!HLfOG;lpU-=*+DDHum5c*&&#za*K{4q4z5Aj zK?!9C?Wo`&jJAUDmVzE{RmsW;>{@6;TDu<(yb`Zq}xz-a68I%y#r+j zccSdzE|h1{-6%V_2W1EMqWs!(AIdej9~EY1;iD)!_!!C#9zcbwh0%VTExULSIgC|k0>8DWx!(Dy~<9M_6*8bd=_N~&!HxTbAArx8a$7(gU_Sv;02T&>_pkY7f^m2 zd=X^_UqaczizqwzGRigh3d%M8Dk?Y#qus@pU3?AYI(!{v2j4*1!8cK^!M9L$@NJaq z`W=+(x*KH&FQI(J@1pGBdnh~jKFSV$fU<)hqFmD-pf6}vh(U< zzwTG_>hgW*3$ycnDA#TP%Cm0}swViYL)rNdlxN>il${SldA=Wkvh(36-{+D1hT*w+ zG|V&QSd?eqXjG_Ocs1`=o_{AmJy%XdxpF6={46$>GrF$hU>^U;C|B+jRIf1V@hDer z0?Kpcbd<+`2Fl|<6Xo$wMEPoGpkn%oy(RzoQDb?$mY?(1t>eX z5aqdY5y}qgIj85!WSAXHLAe4`QFbs5We3wyb}$3wt6hS!gIOp$n2mA;8c?AEVYJHT zb}<+3s$Pb&gLx?C6CN8;ehyfGvV(;vJGdNW2a7nLtGXEGsy3lqgC!_CxB_JdSEB6T zDwG}MQGU);HV-uoqiu%U#Zr{(plogjMVK8dN7=y&lpU-@`HHJhcCZ>{2WwDvplt3M zw889PEy@noq3qxql&@Ao*+Dxh%%U*b4z^qeWpmHW4KUYrBgzgobvxJ$^K-x!lpS1) zvV*NC*I*mU4z5FaW^PA?x)zkp?cfHOuXZEK4nB;sgPTynK^W~v*s_b8QGP7kg0cf; zb33>V<{I3NvIAvv*WgZ=9o&WT74Js5uJ@o^*LzWRa39JJ?nl{yvbi063}y!ppu*!I zjP~Pf*~Nn>*YzRPq%d0_M%lq5DA!fl+zuXv*}-EdUs2iI4jzZu!4oLg;8Q5q;7ODn zd>S<{T-!x1w>|7T%#@EpnxK8Lb{=TWYKvbi0+ z0JDRgDAz#Q+>g93!aOs-gmO(^M7aiEMtK%}1!V_cMFj_8w7b}{3uSZH;p;Fz7QTUU zUB8KP4Zel4gKwkk;5#Tg*p0G-mr%aqcTslmJ(L|No4W=-fVl=gMA^ZQP~5J9qufXIvtDhV`VfdR3W^Y*OaSt0@T+#5#`FCg!1^uqFkkMD3AYS6!(tTBmJe_ zRUeP?bNB?5t8_Zb<39uC@t=wE_$Q)VrL#~q;e2PKT=jEMVV;HAbuL@>a30E)KOg0J zb^*!`E=2i?7oqH+9%ToUQJ!a0P_BUf(ryRSP|ia*4%VUU;2M-41tpYg+Kvh}4WsQ~%XL_fave6HJTo_<>|hhh z4mP8F#Vsg1xEAGEv=!wVY(v?>btpU7jpP`=_PQGOgej+p4yXXZChBf_}9iE<6Tg>ntPjk1I9bXR>h%nn{cofi6j7i9#f`c&HSJ<+PAEW$OcopTk{siTj`BRh~{0wCWKS$X?C&~`?pnS#GaNuXu zy)e(B*HNy)8z?*Y1=GIhzj*ujYfwceuJZsCACGHOvmyp!_IpWv?By!90uBqU>NDd+p#Fm>rZ* zcF>LrvoegfgDtyQPcPSD1I!LKqU>N3d+lH|%nr7oJd3VnuN`cKxvtw_c5ofcvuHcY z4z6df9ozu3gBwwH@L~44rZ>UL&oeyAKEl?(aL;e%2+yQjV0LgT%nojY`JUa5@)hr3 zuOAC{!aR%aLb(Qav)2ypf!V>mFgv&pW(W79Jc~ZcUOV_0%nlwv1qb2Yew-s*hX>)F znGd1t;9>UK!6PtV@e?pRcogOuJce=&KFMA?cpT=sK7q1>PqEhyo`iW8eHvy5Pr>Zq zX_Os&hP}Z-80}}_uImnz>-r2wxDL<4?BF?+9ej?xcJMsR4n7YHkA=buFgw_ZvV$+M z*ABi2a}B{?rm>qlt<*R)a6&!@o?qbU>zD6(C;p;Fv_y)=jzR6xY_!i6# zzK!w~zr$WXns>uIi(Z1c2H%C*!S_(1u7&Tj*A9LFvx6U^T!SC6*A8BW1qWfYufSc0 zAH!XTS5cmsKVh#QTR(-_!Ou{>;?LP@2c0lG*n_fz*VyYC?1kCE>o7Zb17-)mK)D8Q zveypw!R+8IRB*tndAJ(e)DulD(L9!D87+j7q8TMEBZTw{nvp@M6-2M>VKn7e^SbbA zKDg|%x;VJ}c_~)pK!F;`wQ6B#( z?DhD^!#vL>pgjK5Q6B#pC|BuBdU*U3VZPc~D3AYa_Imv1z{2>$>^he%dpHjjJn)zH z=s@e{c5org^Xwv&9n`be4kp7~fhj1@i>d6TqTI!4unz_`9c2eIP@ZR(pzL54J?vmM z%nlk*!9f`99FCY2&NLV9s$PZ)kCwtblpQpp{76}VvV(;vJGdO>D=zAGuoz|sO(@r3 z342|GD`0kTCCU!2LfJtcigt(&_B*T6iBN+>&MM+FCAv>j~O#d>-T4tIG2%rkQ% z%5~k;?O-#^4z{4|;98U&Y(?3@Hk6-Tu0z?uc9dt4*3IqU2AFGbBgzi6Zf*xR!GeP@ z+K;g1E8dLqW8oH*9cbO$GwC*%9o&wxgFCt%+zGRTyHLL3-6%V_2jy9GFUmEz4`m1U zqg+$1oBOf#F_;}ZfC{rHj8^OBcJUzGb$AHnIy{W>OnL<6x@z6r4jzTs!DA?2QS0WD zLWLfO*})SiJJ7nhul6L&4nB>tgQrk-@HEOb(7JhW5Jvl1xLxc(1sD9KJw6tmg}JWJ zq3qyuDA(Y5lpSc@+;x2cW(PY_cA#~0-?J~m?BGi%*Yrh{Yw%^19ef4lS@~5|cwB|i z?qbU>v~KPzejR29-$2=c*3JEB{uazN_%_Nj^E)Uz*p0FSt(&_B--X%1_fU4Ab@NG~ z20wuLk@rKC9sCI8n!bz*4#H?(Vas*+G0M*lucGWg>*jXwQ3s?1rPP7)!D*5MROMmfA(mfro+1b zuAuS6zedPY_)7+@9EZP`&~pE1HJ(W1_0PGY{yHEpgTgVf)j7j&Sa99N`1=m^f-pa6 zb%tL(+P~@W;t|WM3V%^NvhbIMUoWpI{MAjpn}!!h6#n|A+;im*3^a`_{7d0)IO1=M zM-~3Ecy#fY;<3ZoSLE*N-{pM@e@Cy;9QE6ds448{h~s|8{=dJers??KvHu^~KjwE{ z;UBre3BU7*f8vM}f9DbZ%n>JT{`I&6T|@GdSGKej+l!a3Z)<5^yQaC+(%Ltd+b_c{ zZBqI?#s0NY`e;eZI;q3Ou8|rbR+6fcYL^p)OCei&BxU|q2^QC@ubwJrH3|2El&7o?BsyR%}Fg1s(IYP~mYKE&Bp=P9-qtqO&<`^}{ zsu`tbw3_489Is{!&HfYAoT$x{XvPg{87nYO-~(z-*5)Zvr>YsR%?WBw)8^??XGonX zHBrs6%)4=YOZumDyqdGrOjR>m&0IB?(Tp2VxnXhKCnk&>? zNi(ib=>+NX)m*M7?8-}BO~Z*#m7bvHTs1S)%u%yI%|bOzYL=+EN=-A(xc((QF}e3S zQj^t$u}_n_L`{R5Mm39Qx@wn|KY`cPr&R1%UutVuR{n4wdviHGljy&9C(=Ba+nQUY zXWHavYt?gQT9w;cwKbRTK4x?7nW~0yy}FKj&l7z2B$5fA1%X#LaCU5bwKCo6NgmDSt0#apX3RF%ec z@Zj}N0rm+#2U@6JrI)GXr$aB4;isomv1FgfJysL-ja8d##`WGZY+)$PsCW-Xb!=W& z9KYp=1#PR_)^2R;;cd;W#Se|za>V#i^VhFix3<(#EOhT|XGgD7Ml~?q^&(!#yxv-gf|=sao8f$FLumsP!6T|M-W1G(x!ha9NR4V+L~ zqmlJ3PoS=v&Bf-@vhJ#}ue-_%sXY&+>P=Pc19`yYWGVgGRt?vjNPf0f$68h8IZmszP_<>UViSJ`HjcQ5rg3KfshYuG;~YG<3?2E} z(D4s-Jih(m?YGueKGXbi)JZ#Pb{@I2|E|%yrtdm;_q5LOvtFLJchua@+M|CtV)PSZ zcAT?g+|IK*$9`znq`f09y0z|?hade=;fak;wCvdU;`TSsY1(s6Q|H-BI>%hmdDYc> z4{yG8z`j98-jlyA|4?J+@gIEi`1AK1fBvq<-50$%dEuVP3p+1g(s^Zm@8qlZ9^bro z(9&Cby>;A}J3H>3a_jbo&bVXyjxjrHcFpQMZF*Gp;bF2YJF`^3JsP1*TV=z4LRW<#ghC;|BgI>37Cws$H<|TD9xk+;QLS!t+%)C=WMR4$A9oP9`XBl zi*rA5rcm=tuO4TW&xVDy>zA%6=G$7@I#$}yL7olYbI`eRqjbYu>UML~j*h)`6FX}s z{_(sV#wANP(^QxkTqrfKSlgCgy0+Pmmo4x8ond@>%=rhiFmgv>Z{3-lwP*e@r<(3t z>BBNnF}>absSuVs>)Edz~EQut^7dh#a%?u$`Os)?M6Ld+{IBjc(#W+|;$U6!OjM zJJz?h{nnZ!hfKvq=}w(aFY11d8LQv^^b1cu-_<{#Z(Unh&top%H87vQW_|M-?=+2|VF^L-R$tY801dbRF4 ztn&LQ%KHa~ZarUBVcc~>@>Lo6gATQ8OnTVCuF*9rJ?cG|8*`8^;>f37y2c*tsDoWG z{5siH-Oda6YWW-3&Z~LLveqKM(ii*+U(GXNSMQGX>(&%YdI}CN#`eo7IHM>sPbV@YpC6w*M3H>!#d+UNftY?!&9@t?l&|K>-}nb3|PLgL{q`62PH7M+^<% zupTfhfWv#b91*~gJx2@=U_=iX8Ng9JU5*amn4Tk!4PaEy5u*b*uKS3$j}Kr>H#l%Y z04MfzIVpg#Jx7cS-~&D22hiS<9m*n5Ws0Y;Pe2_=mBR2FtG=m6~NgBs>?Y6 ze6Z(;a|8HL4>&J?^Lx5n5Ws~!M_d%Z#Z^6|zAB(eWuyyDHk#6N)H_p+ruCo$(~V|i z&`hICGH903rDdek&o*kv95u&iZU$XuG%wR}zENZ5s0BvElrViYTQ4_SltGJ)nlfmK z(G_K+ab0P2RpzL?(bXB$Y_v4fahXveb5zl2c@KJLh0)4P#}*_0PSHL3)kbSFsMV+~ zgVq|Y%b;tFN@XNN?M5A$qt+X3$e@izn=&0Y8*RxPb*<6X4BBRNU8du9ql7^)A? zJ_jb1QJ7ywQ!+k-dO9AMV>CB&)MZBVGHAY0 zV+JiST9`qX8!aj$8Cq=AlsRgN(G?kVrO{QHj(MZ2Ge^q>Q+Ms1mnYmL@rj=ILEltJxAWuzOu-RR=#%=`*3X9p%_&}5@2Wu%T%jizOenr<{BgJv3Cl0mbKF6}|@ z%rT;t+8MN4_DbsO@(G{7at~9zTgYrgK zXHc`z(hOQ=R45}EDjF@%9JRt|Wd^kv@yDO;39#B|P3EXpqqZLO&RU~&J?OwSM*RBI z{an~?)KNwn*LtH3nWHuuZOWj{Mq4r+uQl45Icl5Hbs4nX=;E3lL-jR&eJmrr!b~=r zk~wOs(X`A_(~V|i&`hICG970bU79&+woyX{%`uwW)A60ljOJyIns3yYK?{r)X3*tE zi!x}jQBxV|MlUhCB6HN0MptD}-stK~$7Z9YnWL5&6*8!3v^>*sh0)5)Q7uNRGDod8 zT9Y}d)u=6l)*7wLbiBrh-?8KTdZ*opzgI_eV7<|XOvjBzn=(gjHrkRw*BWijplwFi zWzcq`i+gA0mw*2zjCK!VveA?bnrbvH({Z}djLcCpjV{TcSw@#;I?gs~$Q(7tXl~}H z%Z%n_j+$@O*n{3#V6-sP@p7X@Jx3i_Y}AxNON_3_biC5&s?1S&qpLHh*=T77Ei)=) zP|;|48EHnZFj|>8s>Ntk2CX()lj+!M)RsAFty0+_ zptm;~ZR(vHJXHB?U)`bcA5N0lD(^ce{7?G5b6Fofi*?ovKd=xrqB0GRs7!++y3?SZ z>_~%v$}|Wlr$N~y4Fbw(P+drafXXxos7!-^$}|Y5OoM=O8q`TigMi932q>pPje|4@ zD5pVnAq@g5(;%QS4FZnqu8-0nU`#hq8U$3PK|p011eDXD#z7hcl+&QbK^g>9ra?eC z4XO)i5Kx&00hMVGP?-h+m1z)AnFaynG^lZq1_7065D?R#2BI_wifK^2lm{W1jRI{ z(<=>v(liK4(;z6OL3LCb1f^*Z6w{!_r8EeNX;2-N20>{W1f^*Zl%_#Yng&5J4RZRB z20>{W1jRI{aVZUgVj9%AlmI20>{W1f^*Z6w{ziuQUis(;z6OL5)jk5ERp( zIw}o<(liK)X;2-N20>{W1f^*Zl%_#Yng&5>8U)2OsBtL`g3>eyifK^eQW^xMX%LjA zK~S0oL1`KUrD+fp)1bzsGzd!5ASk9mjZ0||6w{zODh-0tGzf}mP#u*9L1`KUrD+h9 zra@4e20<|m>hwy3pqK_VE~P2%41nonC1Wl%_#Yng&5>8U&?j5R|4tP)vgwm(n08ra{IP z(jX{JgP@oO)lq2>l%_#Yng&5>8U&?j5R|4tP)vimUrK|ZG!24c8q~Oy20<|ms-w~% zC{2T)G!25%Gzd!5ASk9monC1Wl%_#YOoJMi(jX|NL3LCb1f^*Z6w{zODh-0tGzd!5 zASg|PpfnAF(liK)X;9-*8U&?j5ERp(#-%g}ifK?Cl?Fj+8U&?j5R|4tP?`ooF%9bU zN`s&@4T54C)VP!eK`{-gqtYNKO@pAA2Gvn%5R|4tP?`ooX&MBjX%LjAK~PMC8kf=_ zC{2T)m2ujl+D5gO=hBOE|SQ_LcnKa13nXU4^-w%c~ID#~Icu0f8 zE7Rcc$}~7UO@n~SGzh3ngMi932&hbhfXXxos7!-^$}|Y5TpI*bra?eu8U$3PK|p01 z1XQL$KxG;PRHi{dWf}xjra?gE+904Z4FW3DAfPf00xHuWpfU{tD$^jKG7SPM(;%R7 zZ4gkI1_5ar1f^*Zl%_#Yng&5>8U&?j5ERp(9ydyZpfnAFVj9##Nof$2ra@4e20>{W z1f^*Zl%_#Yng&5>8U&?j5ERp(3@HtQ(liK4(;z5KgP=4Gg3>eyO4A@HO@pAA1~o3F zK~S0oL1`KUrD+h9ra@4e20>{W1f^*Zl%_#Yng&5>8U&?j5R|4tP?`ooX&MBjX%LjA zK~S0oL1`KU#WbiJtuzQq(;z5KgP=4Gg3>eyO4A@HO@p8`4T91%2ujl+C{2T)G!25% zGzd!5ASg|PpfnAF(liK4(;z5KgP=4Gg3>eyifK^g(AppeyO4A@HO@p8`4T91%2ujl+C{2T) zG!25%Gzd!5ASg|PpfnAF(liK4(;z5KgP=4Gg3>eyO4A@HO@p8`4T91%2ujl+C{2T) zmeyO4A@HO@p8`4T91%2ujl+C{2T)G!25%Gzd!5ASg|P zpfnAF(liK)X;4oJN`s&@4T54C)Qwge1f^*Zl%_#Yng&5>8U&?j5R|4tP?`ooX&MB@ zG$=z#gP=4Gg3>eyO4A@HO@p8`4T91%2ujl+D5gP;OKA|4ra@3lgSyd5gP=4Gg3>ey zO4A@HO@p8`4T91%2ujl+C{2T)mpPbzyA~P?-h+ zYbvXG!25% zGzd!5ASg|PpqK_ZeOMa=#WbjKX>Aacra@3lgBq9C20<|ms-xa13QE%;C{2T)G!25% zGzf}mP^Z`0ASg|PpqK_VF0BoMVj5IOtqp?GGzf}mP#q@|o8U)2OsM9MAf?^uf>9sZp zO4A@Hra^Vo+8`*VL3PwSML}sA1jRI{j(VpkC{2T)G!24c8r12vHV8`7ASk9monC8$ zpqK{LQEP*sG!24c8dOKE4T91%2ujl+C{2T)G!24c8r12vHVBGoP~+0tASg|PpqK{f z7}f?sF%7Dt-YE)7(;z6OL0wVr6a}Se5R|4tP)vh5z19XnX&MB@G^o>SZ4eaGpgL-8 z5R|4tP)vjBsCSBjVj5IOy;BsFra@4e20>{W1f^*Z6w@H54{L*eyO4A@HO@pAA26cL^4T91%2#RS?t7D5gPm)H_8% zX&MB@G^mdCWDQW720>{W1f^*Zl%_#YOoKYT)&@Z_4QgCk8w90k5ERp(I_jOGpqK{L zQSTH5rD+h9ra@4e20>{W1jRI{(`#)Il%_#YOoJMi)&@Z_4XUHwDGEx{ASk9mb<{gW zL1`KUrD+h9ra@4e20<|m>hxM01jRI{acON3l%_#YOoMa`Yl9%CLAw26@?YjGTqLBy zBT0jYg*13nWg0xHoCY;!hI~|a8k8^6AfPf00xH)A0hMcmfXXxos9YNaRHi{dWf}yO z)1bz|J4FGNX%JAkHVCL(8w6CQK|tl&AfPf00xHuWpmJ>xP?-h+`H^6mZmjbifK?Cl?Fj+8U&?j5R|4tP)vh5z19XnF%9bUN`s&@4T54CR7a&jP)vjB zs5A&l(;z6OL3LCb1f^*Zl%_#YOoKYT)&@ao8U)2O$mv5G1jRI{j!J`|G!24c8q~Oy z20<|ms-w~%C{2T)ml%_#YOoQsEGzf}mP#u*9 zL1`KU#WbjnN`s&@4T54C)KU7}ASk9mP9M@BC{2T)mL`6~5R|4tP)vh5z0x2kra^U78U&?j5ERp(Iw}ohwy3pqK{LQE3pAra@3lgLDjO5ERp(Iw}o< z(liK)X;4>G8U&?j5R|4tP)vh5z0x2kO@pAA26cL+K~PMC>ZmjbO4A@Hra^U78U)2O zsE$g5pfnAFVj9#@`rIHWO@pAA26cL^4T54Cq+>{fpfnAFVj5IOr9n_kgSw*9ASg|P zpqK{LQE3pAra@4e20<|m>hwy3pfnAFVj9%xl?FjE4XUHkASg|PpqK{LQE3nq)1W#k z4T91%2ujl+C{2T)m{W1jRI{j!J`|mZmjb zO4A@Hra>L0&kcfN8r12vHV8`7ASk9mbyOMz#WbjnN`s&@4T54CR7a&jP)vjBs5A&l z(;z6OK^>*FK~S0oK`{;L^jaGP#WbjnN`s&@4T54CR7a&jP)vjBs5A&l(;z6OL3LCb z1f^*Z6w{!N(&q+2F%9bUS{nqVX%H0CpgJlIf?^s}N2Nhfng&5J4bm~BLD0e0202M4 z)p2lUtGw^`fE*Ii;8CQ(Bi~;ejA>968Xe+#Wf~-zSEfNgWf}xjra{2_YlGodrfHBn zlcqsXOoPnK_tyryKW6;@v^J<&{QlaYzVb?ULf;~z`PHlEgTH^MwLzW!{k6e(qxCH^ z+~}AFb#wkuYlAx1`)h;oM(bN-xY02U>gK$^HW+Wt`)h-`6XEwevIf&6O@pAA2E+50 zkBVtfFTej^tqscKf8Dh~mE*t2+MsUq`)h;oX-MB9!y_%GLEW4`%-SGl$|OGKM`o+M z@1XEM>6cj>T+}D?Z8eqWDsNRn&ir;=?WrWmaV*vKe9_H&j>?Smx1Ff+khhN*cnYT- z%j#XvX)BGq$MV~Q`i`Z~7?u%x`W$p9zdw}2gAJw9#X-+kIoh5>-X1pKG=_N!OP6Cm z_;#*W@8h2sdO-i|n)0sxVXd{#p>Ox9?S06*)u;nfZy(mT_l&A1CLhS@-yQA#cX#pS z8J!CjztYfo#nqjcUcF~p^SfdH+lN;5o>aAiv+Cd7y?3vCx#Oj_&V@~#)0*~NyyV@0 z5A><(eby7pbj(>hiaTfQYWzaO?kSxUXY3h2Q%9Vo113H(Uk6Owv0cTM@ig}Wzq zo;iKbsWWuI#J4%%0*#4(cAd5R$d|{wbWG=E3p(o;>^X0tj<`Ta)K~4O)*oe*-N(_T`_+6@P4ZQ{Pm8IUsqc~IzuZl^eKoZn zf_THYkzKX=vVFd1zsTRG`TpNN{NE|~!fpPT$j0#aKkyhI|K}C$hZzlZXj<1hNx94g$^{|nlNPo4k( literal 0 HcmV?d00001 diff --git a/.venv/lib/python3.12/site-packages/holidays/calendars/__pycache__/custom.cpython-312.pyc b/.venv/lib/python3.12/site-packages/holidays/calendars/__pycache__/custom.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..6428125a9bb499064dbba49858ec4317fd0cd36f GIT binary patch literal 1631 zcmZuxU1%It6ux(UHoGBlQ<4~Bs=eA+7|~hVJP2kDhTT+yCJosYWuZ=IXKu2S%+9QH zXOm3WVv&G}L{Lz(Py`?P(2}ZsRDAJK@nu6r<2>q%zC{wW^+nH}%&ri6Va`4GoO935 zJ>QuhdV9MOtoxbwD!)ny{l*XNCCAL+1z>iNfL=l-+CV0zXjeSem2e~#Kq^vvTk6P# zKvoh)+Y{e~_;7d*n0LV+MI~&al3?PJXbL516D?p<+(?$>O|*tfi2_ojuwTp7neSF} zx=kHZ_liM{uK)WowQJNPhOIM37F>@ot6H-uF=8uXM3<~}-M3sv?d~S9=BcAsDI-S3 zvd#EztzNb*gXq5RS>?J9+GR>>ma|Cw3MH;*En1Fl6I1tfQg=*SfEe{D8O% zousKr?7Cwy*VduNc1e%}Woi^TOvmAJldn$A<|pS3XkBL|faC2s`~t|wcn2D`fqdN7 zH^e2bJ+XG<^KNXHM{P+ST_y-!l^SA08U`!AUq`0kcVaH_h$q%{^r@Hy8Ml4`Z9gF) zKiM|fk{js#LC~QFZU_x=H}(V#7iW!5qF~Mw9fL1I;426NY8vQr8q&cHzz$Ex#LLei z#PD`c1Al^dFh<*_Boqjri>p`>{{RaVVr}*oQiM=YpAE%j8ZeGULjG|x6}L(=mc6L2 z8=1MlsOVmG&U2Tj;j>K9s?q}WEXpPU0|B#GMqQ!KO2)RznOfjiTxU!@e<8yxpFUI5 zjb(k2GVo|yrXH|NyK%rpU{q^Cn943vhpyGUiFNe>z*aR4z@=$w)^_1Kn@~IUk3h!k zQ6Rsgd)H8FU}kT0yjl2)eS7}vmGAn$x%yE71os(#<9B+8@CRK(*y9H!5z2lYW+Rk% z;bHnj*s%Wr$PHyyhxrP-;(Wk~XxJ>2IOIdQtTW2OR5VRcH@N2W6Q(pR8c0oJ91t*Z zgk1A_fc5%;tdE=s%}2RiG4CXM69^Rd%fQTyshi4|>Mix|Q_uf6I{wqZ%w~RndcIY7 z{rfYU)6IcqqN(3V|4edwB-c8VZ#_J<*K={dZ@4-7VfsKugR}T3iTVb&R=3`6vd{82 zpS&}CH$C1;jvqn)n!3ah)8m9w!gM$9T`~ZJkrO_KnoAz1^<^0O>BiGeKnBX&0BmaX^3cN{zTCz*Rq zn#hq{#Djy_V%n-0vDIc(q_u=9@vy3pDplFHN|h>mz3N6+Jb=0n&6`y45|WrOiZBAhAc+-N z7GX}}9>5x<%SMC*ouC&Cf>AIDHG&z}U~_;KESj87(m!A;l3-V`3O1ous1xi$z0e>u z3Qa<@&?2-}WDQl>A#@A**&wtJ!Os;0>um{C-Sb!MO{)&pR*=vRD?22kq}!&+++zJ) zi0YcaKiGYRSz!}wg84Oj(+qmt3cJDxJ2g#H)h6u7+~VHQ;}YC9Jr4ACNi{-;WEOTy zZIT5uk`?cfY?uicq}uCxftTvw+YYTB*66%RYPhZwI=AK?MG6}btH5x zwfb2`JJllez-fMN@v!$Ia$ z_B)Iq83Q3Dj#X|EOTY!=V2p%7Tm(rOOw{;;BqS>lQC8~~Ls112pBxLzO305@R#K?L zOR{PpSc#LUzk&(y4Iv#g4q9mpx;sdzAPb?n?NYEtDS_tnWo~=_pz@JmmVv9r)B_i_ z>@)K~liIdCy)<44iV7c+`H!eaAHm#`%!>hVnBTAQ@9}Rr_!!}5a3Dr-W%6A*DbHhn zC=kMuW~fiI?BED>UbO^BED|G9C@O~48YNa?9W2=m%VZC9GCdE^|C{s&V-egR3eSqm z{{D$2e^4Zm2@;#bensy0h9cO5NeIg>FtsFy>^IC`}|9GdB$Us8gx=;1!+p?*1} z;Dhs`|B5(^Ww00yQSbZxVi-pyk;whC1kc7uNR0N)FR5mq0(K=FRz%VRZqO$4&?V7x zGqT#hvFyxSc4h`X9l1MlZ!GK0?{XF_hjO|@C6GZX6IG3i7+--cR3km9Pg4B!+*P8e z(}H*(nC(G?#DfBIWeDz|3pjQe5?bPxA&3bk!Om^BQL$AGW<}C~kQUSm7(4(0umZ9b zEC1I90HVAfwE|qVOaL@=%jz4@hy{3&j~-NleC4oJ5Qx>-`?b((ilG1>r8tV>Sy2gH z#brEfM;e%W#aIPpp{PF`2cXP4V7CgUe!%X03_`qR*Zp%bG9SkB3En9y{AdhfywuAd zib}jkgp|_0u;O==y&&|q2pk#_nl6As8gR0o@*LS$<%t70nZ^KegmlBGHv49=;)^Ol zU*!sXG~DFJuy&9NN1y}DG$3oshN-S-K=%5y^G3YLq1w81{pwU&T)mKaXKng(-)Fu; z&(ZwOqmMfCJ5J`UCrd`7)lfu6y`gAEjZJCsc2CB6d*_<*^SaOK3cT~-xjcXJ(L#RD znSA}3lBFt4_ENX>P=S=7s$0S$@#|owN?XAD9%k+!sMljeHA6UKz@$~)k{U4i$xObO#XBETQ#0u@%#=AkxG8=52KO+$USk3Z<7nG_afLJ>-Op;OHth~YSP6A~j1(>B1Pz|5MvKKf8-gcxh6{2IhE73Ju#Y6&TH`vlMRx_ zoYHSt?CC={PHZ$ar`#J>d)l=+oEm!Eyyw1d&6|DuVP}Cq@^Gfme0xX{ETx$ z?m_Lb)}RHol0r(g20}zueDI$GIiR8G)uL(FFd&A*6%m=70=3J~J3R?QgYbPNz7UTqUDmOX~C-qLb zRc_in1l;*4l{-5*3|HXtl4DfFIPG>{fd5BwTvIsf9sn)Zq{_J_pc{2vf}7H=Yib1M zrp|$?dqU;L2fZpcHvR!Qsj0~dQFTMEOCGfbN8{iK{YN#x?%wkr)kL=_FAkoc9QJre zT^_Y=dU(w1p7eRfM?Bu)LGTcM9m`owUmPt`+Fd$yDkG^(NM#}_vnbQUy#-WGLDRdD zm=q7=_Xxdm3S-#|eUW1r=3hGyv*Ss#BZnHEc0012zdxTxok=d~Np+><^kAkj@yv3tGX1Ea>6UAHzXH+F;rw>?mN1gG(5AS z-TQL;e)4t4rLQeQzT?tuZ~9_}Nx4!Bt3$btOJ7-pq^W2^wzg!=MnhM!?wLW)98Mo8 zA{a8VHe`>K=vUEhXABun5y6l>tPPKvv|+uwL??@T+nL(6#v+0t3#u?Y0y!Ag{o3#s zsYJg@$2jJ|i|*h3DI?dz?f$uL;Hd7)UABRfhA)rV1{uSD0YZYG A2LJ#7 literal 0 HcmV?d00001 diff --git a/.venv/lib/python3.12/site-packages/holidays/calendars/__pycache__/hebrew.cpython-312.pyc b/.venv/lib/python3.12/site-packages/holidays/calendars/__pycache__/hebrew.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..bb98c380694b06aeaf2104759c6ff502259e476c GIT binary patch literal 49481 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

uT-lD)%%HlvVwt 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 literal 0 HcmV?d00001 diff --git a/.venv/lib/python3.12/site-packages/holidays/calendars/__pycache__/islamic.cpython-312.pyc b/.venv/lib/python3.12/site-packages/holidays/calendars/__pycache__/islamic.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..6e4b765f676939563c646eed479a2cf191c1b53a GIT binary patch literal 123194 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 Y{;&Qm(|z5a{LZsq`HO4(OKz9{2f{}9e*gdg literal 0 HcmV?d00001 diff --git a/.venv/lib/python3.12/site-packages/holidays/calendars/__pycache__/julian.cpython-312.pyc b/.venv/lib/python3.12/site-packages/holidays/calendars/__pycache__/julian.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..b79ccea083b275a2a6c44aa20de8f8659fbe3fe5 GIT binary patch literal 238 zcmX@j%ge<81V8n=GAx)F7#@Q-Fu(|9eC7Z$rZc24L@`t{YBJs8_X_p#bo7gNcJy)e zb8!sv(_}0H>Sb8T@EN4zSH6Bmer~FMW=?uyRkD6SWpYMhQEos{epYI7NwI!NW^QV5 zYEfotv149hPGxasvA$keYF?RsPG*vRL1jrsex9+Op^<)ZW=X1UL1J=tVtQ&Z(8Qd~ zl*Gzn{p7@))V!3$qGJ85(wxl1JiUU-TO2mI`6;D2sdhzdK>IWHa^HWN5QtgV^ efbIZ!qnH;+d|+l|Wc(n-AZ>DyLA;0sC;|Yj#z>F= literal 0 HcmV?d00001 diff --git a/.venv/lib/python3.12/site-packages/holidays/calendars/__pycache__/mongolian.cpython-312.pyc b/.venv/lib/python3.12/site-packages/holidays/calendars/__pycache__/mongolian.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..c2471878575fdfb358388452bf6dc0582729567b GIT binary patch literal 11016 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 literal 0 HcmV?d00001 diff --git a/.venv/lib/python3.12/site-packages/holidays/calendars/__pycache__/persian.cpython-312.pyc b/.venv/lib/python3.12/site-packages/holidays/calendars/__pycache__/persian.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..404b3433fbfe5174acdf4af216ea6fe3f3ebb467 GIT binary patch literal 2496 zcma)8O>7%Q6rNr0+8f7i{!^N!Ws@dtj2b&>ODQN+GEHcKDwHONVv1H<&nDi)Uc0lK z6kCo|p$a8ExfN2ao}ylGl}m~^RGcbKMQ})3P{XQ7l@JFXkOBcAIPu>2rzt|BBl*qy znfK0TJU~UkD!~{xWA{AmDD#j%0iOEzlyi_)PQxf%Fkzz_!ZZQ12zz4KG&^B_d0xKK% z>Y7!dey|3zjiG?6XlD#&o4S>o^Q$nbk{Z{OhDCLz4oswzFr6}Im>E*1(o7wGb!d3- z(D2ZZnl*H0hyC0!;W!!lwMfLU!k5fhGhWMqVXVFEi`vCQ$9k>BhUd? z!f>va8O|KD;?+~+M}fQtep}5zZjih{g`Af_C+5in33+lc9tzWc%dS^|(Nrg)JL&~v z+O%xdv_LdeJ7dJnDbt|pNoGu^8Pv`TQFS$G=o!w3>jBF>u;p<`kCZWkGGt52jYu$; zayyb2kaQzaf!rn`(Uoi?ImOV;#^hD??@T0-P8kt1Ij!g7ku%wNLT9NnEInhy9Xm1! zK$tL?Y1mP~M%Fg%NO<0`<|9e-LL`%Q5^3vjc=%AnHXUOyqsM3UX~TwyNt5bXJ5oDR zJCdn%Gn~n~0n^s7A`MR>*HLS9c)NNJW{5>xCYuUr=_s&k4QqQx)|y7vl#wmalV=(s zgMv3=zffs}gG>0B+1{|KZWeTQTVB|oCfr<+vwARC0E6omoRt8y~ zg==6B)h*t-#m6oC>K3JLY2cR5y2Z~eEwnK&#Kn)q*)EJt1AO*cqChMU4K9dQcirRZ zE<13Q9jsd_yZAtE;{GCSUJxC`1s|YS^5P1f5)6Q6OODpjbe3a#8}RT|P}5U&&|1c& z3K$25)i-rEuQO^|A%w23PMd&;ZNAvnr$8MqcffvSJl`@jhnT-WN@Z+{xdU*>0?0*> zp={n z7A_z|e>VtqaM)>BV6L-{y=V0MV5z+Vgo7{8{OQ1>*8cU@{s)cyrS>nBM?=x|q3DB9 zbfazOlO4^Ao+rVULUid|vE}NAMQ7Q$ncrw`FI>E)6r5$Io;9V1;bnJyGg>NbISE&ufeN$n?Wjf`4`b_NAn;g`8EnVDMqXH{Y8RxuWCQy1 zA{BG+Nm`KeGWFoi0fb67|5QI9K7lY@A957Mfa*TFsc$V+)|?IQ&E^W{Ex ze*8f(s%}x0SNB}7WBlQR*O-)FMDit)y+A@D>xGHon-TIog$u*BvpyiM-*$B7aE!P@ z%9Z)2&_?J1l5kYe)LwnmG$*Z1*WT>ho;s-h%X}1q*yn(7Y;|@$>Nv38aiAnU>=<11 z|IoAxF%@Vl=u7V`3LCq-ix+RcTxc!m*E^Tvr8ic4R`ommw@y52mt zC_ir6ReWjLc-VAsO*zPcFdhoR7gV$Kl%Z+xJqJ|Kxg_!dO}jX!C#x2prqOg<(-
L=fLkICvBj&<3O&EUqwk)HUp%!^YYsp zO>LJ?ZAy~-`f}SQfvMEKh0|uBMebeRw@F|s4Xhry9o|BAbH866EWt{cR&74rJIts1 z$JQp#eSQ3Qv{d%To{Wclu7dX&|F!T`U9XePnAS8;-tDe^j>7fNQMleN4ueVs&sOCs rBb7rt&R&5{@K)IH;F3*`AP9eS5uxixvioOp_)qVkF!&n*!ZZ2@nKE?j literal 0 HcmV?d00001 diff --git a/.venv/lib/python3.12/site-packages/holidays/calendars/__pycache__/sinhala.cpython-312.pyc b/.venv/lib/python3.12/site-packages/holidays/calendars/__pycache__/sinhala.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..defef4fa23b8c7caf3caab9c992738c270853545 GIT binary patch literal 13330 zcmds8Yiu0Xb)J3ia(B60u9nN?LtKiKt#u@lCaH&=Sk6kMCD|55i=-bD+uPC3P#kL? z^z2eH6*^`M165PEQ5wKjkr-f$6s2JVpn?8i|LLcJ0>u(cBV}qgZqu~UKRQa#CcpZf zd+%~*NQrh0DR8@x&V1*dJNKUR-E;5Ey(9fYINTuN_uKw&&kXICq@R;g`*{Vp{bPW4 zBvn!!d8y!#9S*|IytCkvT@1VO?t(}5Fzn8I3qIM$uqW>?1mr-WL2f7nQ8`*@mYWMPIab&u?_&3P^YKE9+yd;A6RKZsRReNTZIIj4pxmy8 zv%JSCosiVno07WgeJA%`?qOwdl(lF+t>=BWDDRz5 zq+4&1l6IK>Qx(ln&gC^=x2ja=>OV7E(Mv@o4;;xJpDR~Nh2u(IE2@f-4wvZO<>B@{loX)%e!xRipPCbpXsS~DaVszYeojE>fy2j2tYq~~8kE6k+Y_Vh% zl)Qdf%U0%Q^P1^DmU${We&&UY89a7sEOR!)mC(r4*{R8sQ(S8poya^bEWT4ui^9{R zBd5j$9?LwJIn8l!?9@}I#!d;t_?d|_qEcvTY-H-$%s99BH&Mg0Xr4Qf<1BF*5Xx<5 zh!R1QWQQurPSqj1RHy7#U9v|OR(%4~Y8~077esItYXofx>mf^)YJ?5MvhCe)u0y2be_s zz-S*5zCyxJ5my6?D=1>{Xh9K!4~VxK0IH2wQ1BZ@8IK_XMD2%&TjoU!B|L&S5RV`M z#2HBfJuIRM3Pw6n#&e?!2%LktZXm<})B}V#fChosSmFxyAt{<5WdtO$0TQ07LqG6f z#KJ7HM&Y|hYZSTW1LC<60OGk31mgUMf%tevfOxJ&fq1UPfcSXEfq1SZfH)UPAntuT z5YM$vAkIb?5ND$sh>vFv5F1ZiksXkfcg$xk!p5+XjUn?>j93$kD=OOZXi>qe4~R1x z0OGk31mdF@2I9U&fcUJ70&yl{K%9v<5ce$s#F^7!y7D;3d!c01)pf2*i5|1M#en0HH5%5=DOVERCUzk4+p1tiqZA z;yfjRI8W_BwG}b88COj3M02dRBE~pRsE-_lq%mSXLxLGd%1q{`h%3(Giij1=gM8(_ z`G7d*0U+*q5C}}c%PL9FWg~gQ+ znHxbF_ah3#{fGhaxfuuI&w&IGAO9o}AOChBJ~umoIE!6C@D6=+1J%}zgjhEcY;+PV z>zL1|Ly_IM{O|$s%m@H+KY~DfM8ZIPjzoaCA5kFgM+~U;WNs6gmOvR_o033$MB0IB zPv$nkVi(GIUUviWyzT*FQR7Nk*GBw7Vs=1cW@#J!9GaZchu+{*+I_c94oTQ@ocC!Hv(y-9U!t{Yy#Ne`@y z6I^MGI@lO7pMlXnBz%R0pCYbK^^mq(J*;)9N3@jIt?fzTrBdsecG7j)t3L9kTkf^g z*^63xYIafQQPg?hu5Gy0ufqP|4)(9XzE9YZl0xssZi zEtQqZjFM87dAdC}mse;LmMUnKnUb2)%PCc#p4JSlSV>JAr9x_QM$xG|eWH|C4A!Pn zRO>D7JFUzp^GZ=kr{>BUS}3MQ74(!T>x%GUWKK&}N~y|>mYP;_6#%7@8ZXT&seLtn z(&SJ%r5M_#S7;0E7^PyVpu^MrJnQ?MLY=_jnbM_HE?+8ZDJ3KA^qN?aayQmrSsi7fWUPfTp!d_JJ z`*ABO;m?d>sJRl=CH{-0OCsJ3xE8I^R+opR7t0k*Q7t!tsR;wzD#Z&*Dp#5-R?web zz+SZg_SvxXF%R{1pCsM7MWP9lS^qI1521e|lpypILSaHT2+`(Tzey-Y=%<8em#LeC zItl$Vp(vq`2+?7L{xKn14D^2?)JW)Ogj|F^ArvR{uY~AeL;p8IU4(v42!EwpZ6vUh zmD1i@|4ya9An_k0{*%NnA&fm#se=R^7~EIRpyLhjv}f3;DbB``lhuHTp5by@CrFSuW!9=H4!oC~fym#ePY zAxrK0x@W;-getZ30%^f{-m&2MYsZhge=ZeqW`MTb7ah~i2`TL!Grif7%;e~V>EqYz zdtlD=o!5|C6~mwbH)F@ACMM6E&SoYj&*HRVV)BVo&zmk(F({t*yr#RX<)@7kP>hpw zLqscA^a8S4&9dA!gW7AD(?W5ol`^$UOI0fMyV?GkQbFt2^XHYzx&HC_9A->m+$g=G zWO{k6rfj0$Y2?3t5IaJ;E z=<2ccw#TnTK5FT_rY>Dt(w8s&-5WO!%WH?_>Y;B`dta=+{0HkT%9Y^FaO-!nf0Dg6 zx%BvroWUBG+nBqrdnz=w+0UA?wRC;k@s7hGz18BD-g?3<%}YOWU2>#7W5!ds!+4s+ zF%qXC(q3bXFlCu>h6F8e#yAN|S>qW9OAZ>(LdR*KB`vaLt#Wzy-BW|?uTpw^7q|XW z`tL8CA@St3%y*x^R$1TGdu8OKmIs!;`L}QU)f>o@?2X69*B%?MJ~LH)?uGTonC5$#x=5us zi{W$1h3qVz+ibR9ZnsltGroq-Z_}etBB>v?E)TCq2CDu6<9S%_mG{Pr zXsqTxb!of=VRO9coKA017T>oF|5p1q@8o{_vbr7_s``iSi~BNpPEWz@?nl)*W3DnY zXYs$w&i%Fu-=h4r@ZY-@>HXo0E8zb~)qmu^1i#nkiRIq)NPpGefB)R3_qFYAM+%y% z7cHJ|;e3nvkKw#=o?5zZbCX^R@8D-qxug{C?&lWsx9`87^zOOc&!(b&K`-hSN4KmY zTkU^Fo}Rm}jMD4#c26VNV(wR}q=U7orZ=wcm<;-U5=UHK;ZLUFkQ?sf5xmMU{Lu-b` zms?RrJ4&;u{t=fKn@#mkxuPU$`JgNArERR)RR6XsYBpQH@QSLmH#Zw=AA3b1z4w|; z_3ysoeiu$QOc#z6Ob`1yZP0d}y}+98bEQ(Azm3uRoWWiUUM8fFP)SUa&`De%Q6Nzw zK|30wOk$42B@*=7%%%o=i!-`OB|%$`az6-rQ~J~y^!PX0q~?~zC-J_vcyhzt+Ty+G z4_zr=J$6Oka6$WoX_+fC8y;vIUMUb3Rv+p9x*j0Cf$LO1NP4Jl50lAULnw1#(wtD?`(mU$*PSSVR^)Av=b-kPPJ$1c@^j@hcb`{aw zj5HG^mdm!nU-jdL#j%ay)})QYq~MSk^}uH55W3)yI17+na7guoq}w=zZsQQTjYH@* z4xtMUsl7P0XX6mM;E?)Hl3j2}_1j6eaR^;-NcFqOZsQQTjYH^n=MY`k83l()Z`B>& z7*4cVNrYxeL})e=Nw+2<>DELf-AW?qMB-J~)w5UTuMI6ZucfPvy&DlSSlJ|9uu0Lz zNVl>{x|L1Rt!$ERWs`I(o1|OWB;Cp;=~gyLXKZdG&O#$>zdC@LRd>tAU~8+DMralq zq1k98-AW_rwp@g6rIGBmT!e0AkLuIecOD7Ze@?`R`y7@vPZg=J<_f0 zk$(4F!~kz0u^%^7-McWMdL+CaRp?|?dr2gBfeH(|+1&7ps7uf}eRKJ^a8;8)pSR(#@NF=AfOe7Mi z_mIRd=i`}3-|6v8Bz$=u&q!(Od*c7q=gMbIXR=$T^F7YQ+B*()<7%zF<4`9aX!hp{ zblY?*&+tx(rwlxvD?YRQo_FRE(d#*sYJy)RH) zO@#ixd#>;|oMF6l^GxI<)^;qMM7+V@WyeCbtveQ~e=m0|)ZR`z7V6)+W1;#x?O3S( z=ijlQHOtEk?zL#bhQj)e<=)I@@^Pn!Gui+DK3CkHla8h18xmcY%lx`BxBC2b_3vN) zaI*T?Gi!&>-e%T~kjL}*vTH-aWo3w6R*zgC{jj$>KKbE8Ya>%@Uw!sA88;doo`;uu zHY8k@_pbO?cYV-!-CZ3RS$k;oHWhAo9iHK(392x>JhgIUb>xGi*N3Y^C)N&}qzc1S z;gO{rRd{512JTE=A6~_0&68_=r>MdsRAGqR#$|bQW#8)X2YuIjtAkIh?Z-Du6jFtO zr5IHhSdK5hw(5TGTdS37|M9i-2vr#PTrGTN7oQo$XSQ&Vhk0;WTRFKp`N7!rk?L?Q z%!B0QXEJ%WE`Cis7<59;PEc|Hn?IbKvEOYvGOGV0{&`2*X|{;}-XQ+@&PnkNdo1lT zUPEnTp2TGmTMlc!LuDl1Me}7kBzjZ2>GpFMsC+EF*No&!`8+DzgU*di zKYgFaw|b2qD|svPvwHD7J7_YKwXf)Xn_toUa_m1~@P8K2aR>W(LpxtGbfsvp(>Xd+ zV~2YDc#qDx42s;?Je^~wdj_3~8Br4KJg;f9n zBa>M(uw9K1Smj literal 0 HcmV?d00001 diff --git a/.venv/lib/python3.12/site-packages/holidays/calendars/__pycache__/thai.cpython-312.pyc b/.venv/lib/python3.12/site-packages/holidays/calendars/__pycache__/thai.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..6f841cce8bb0d00ee76da911a551f3532ee17f82 GIT binary patch literal 22813 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 literal 0 HcmV?d00001 diff --git a/.venv/lib/python3.12/site-packages/holidays/calendars/balinese_saka.py b/.venv/lib/python3.12/site-packages/holidays/calendars/balinese_saka.py new file mode 100644 index 00000000..c8afc5e3 --- /dev/null +++ b/.venv/lib/python3.12/site-packages/holidays/calendars/balinese_saka.py @@ -0,0 +1,112 @@ +# holidays +# -------- +# A fast, efficient Python library for generating country, province and state +# specific sets of holidays on the fly. It aims to make determining whether a +# specific date is a holiday as fast and flexible as possible. +# +# Authors: Vacanza Team and individual contributors (see CONTRIBUTORS file) +# dr-prodigy (c) 2017-2023 +# ryanss (c) 2014-2017 +# Website: https://github.com/vacanza/holidays +# License: MIT (see LICENSE file) + +from datetime import date +from typing import Optional + +from holidays.calendars.gregorian import MAR, APR + +NYEPI = "NYEPI" + + +class _BalineseSakaLunar: + """ + Balinese Saka lunar calendar. + + The Balinese saka calendar is one of two calendars used on the Indonesian island + of Bali. Unlike the 210-day pawukon calendar, it is based on the phases of the Moon, + and is approximately the same length as the tropical year (solar year, Gregorian year). + https://en.wikipedia.org/wiki/Balinese_saka_calendar + """ + + NYEPI_DATES = { + 1983: (MAR, 15), + 1984: (MAR, 4), + 1985: (MAR, 22), + 1986: (MAR, 12), + 1987: (MAR, 31), + 1988: (MAR, 19), + 1989: (MAR, 9), + 1990: (MAR, 27), + 1991: (MAR, 17), + 1992: (MAR, 5), + 1993: (MAR, 24), + 1994: (MAR, 12), + 1995: (APR, 1), + 1996: (MAR, 21), + 1997: (APR, 9), + 1998: (MAR, 29), + 1999: (MAR, 18), + 2000: (APR, 4), + 2001: (MAR, 25), + 2002: (APR, 13), + 2003: (APR, 2), + 2004: (MAR, 22), + 2005: (MAR, 11), + 2006: (MAR, 30), + 2007: (MAR, 19), + 2008: (MAR, 7), + 2009: (MAR, 26), + 2010: (MAR, 16), + 2011: (MAR, 5), + 2012: (MAR, 23), + 2013: (MAR, 12), + 2014: (MAR, 31), + 2015: (MAR, 21), + 2016: (MAR, 9), + 2017: (MAR, 28), + 2018: (MAR, 17), + 2019: (MAR, 7), + 2020: (MAR, 25), + 2021: (MAR, 14), + 2022: (MAR, 3), + 2023: (MAR, 22), + 2024: (MAR, 11), + 2025: (MAR, 29), + 2026: (MAR, 19), + 2027: (MAR, 8), + 2028: (MAR, 26), + 2029: (MAR, 15), + 2030: (MAR, 5), + 2031: (MAR, 24), + 2032: (MAR, 12), + 2033: (MAR, 31), + 2034: (MAR, 20), + 2035: (MAR, 10), + 2036: (MAR, 28), + 2037: (MAR, 17), + 2038: (MAR, 6), + 2039: (MAR, 25), + 2040: (MAR, 14), + 2041: (MAR, 3), + 2042: (MAR, 22), + 2043: (MAR, 11), + 2044: (MAR, 29), + 2045: (MAR, 19), + 2046: (MAR, 8), + 2047: (MAR, 27), + 2048: (MAR, 15), + 2049: (MAR, 5), + 2050: (MAR, 24), + } + + def _get_holiday(self, holiday: str, year: int) -> Optional[date]: + dt = getattr(self, f"{holiday}_DATES", {}).get(year, ()) + return date(year, *dt) if dt else None + + def nyepi_date(self, year: int) -> Optional[date]: + """ + Data References: + * [1983-2025](https://id.wikipedia.org/wiki/Indonesia_dalam_tahun_1983) + * [2020-2050](https://web.archive.org/web/20240718011857/https://www.balitrips.com/balinese-temples-ceremony) + """ + return self._get_holiday(NYEPI, year) diff --git a/.venv/lib/python3.12/site-packages/holidays/calendars/buddhist.py b/.venv/lib/python3.12/site-packages/holidays/calendars/buddhist.py new file mode 100644 index 00000000..62a605a1 --- /dev/null +++ b/.venv/lib/python3.12/site-packages/holidays/calendars/buddhist.py @@ -0,0 +1,444 @@ +# holidays +# -------- +# A fast, efficient Python library for generating country, province and state +# specific sets of holidays on the fly. It aims to make determining whether a +# specific date is a holiday as fast and flexible as possible. +# +# Authors: Vacanza Team and individual contributors (see CONTRIBUTORS file) +# dr-prodigy (c) 2017-2023 +# ryanss (c) 2014-2017 +# Website: https://github.com/vacanza/holidays +# License: MIT (see LICENSE file) + +from datetime import date +from typing import Optional + +from holidays.calendars.custom import _CustomCalendar +from holidays.calendars.gregorian import MAY, JUN + +VESAK = "VESAK" +VESAK_MAY = "VESAK_MAY" + + +class _BuddhistLunisolar: + VESAK_DATES = { + 1901: (JUN, 1), + 1902: (MAY, 22), + 1903: (MAY, 11), + 1904: (MAY, 29), + 1905: (MAY, 18), + 1906: (MAY, 8), + 1907: (MAY, 26), + 1908: (MAY, 14), + 1909: (JUN, 2), + 1910: (MAY, 23), + 1911: (MAY, 13), + 1912: (MAY, 31), + 1913: (MAY, 20), + 1914: (MAY, 9), + 1915: (MAY, 28), + 1916: (MAY, 16), + 1917: (JUN, 4), + 1918: (MAY, 24), + 1919: (MAY, 14), + 1920: (JUN, 1), + 1921: (MAY, 22), + 1922: (MAY, 11), + 1923: (MAY, 30), + 1924: (MAY, 18), + 1925: (MAY, 7), + 1926: (MAY, 26), + 1927: (MAY, 15), + 1928: (JUN, 2), + 1929: (MAY, 23), + 1930: (MAY, 13), + 1931: (MAY, 31), + 1932: (MAY, 20), + 1933: (MAY, 9), + 1934: (MAY, 27), + 1935: (MAY, 17), + 1936: (JUN, 4), + 1937: (MAY, 24), + 1938: (MAY, 14), + 1939: (JUN, 2), + 1940: (MAY, 21), + 1941: (MAY, 10), + 1942: (MAY, 29), + 1943: (MAY, 18), + 1944: (MAY, 7), + 1945: (MAY, 26), + 1946: (MAY, 15), + 1947: (JUN, 3), + 1948: (MAY, 23), + 1949: (MAY, 12), + 1950: (MAY, 31), + 1951: (MAY, 20), + 1952: (MAY, 8), + 1953: (MAY, 27), + 1954: (MAY, 17), + 1955: (JUN, 5), + 1956: (MAY, 24), + 1957: (MAY, 14), + 1958: (JUN, 2), + 1959: (MAY, 22), + 1960: (MAY, 10), + 1961: (MAY, 29), + 1962: (MAY, 18), + 1963: (MAY, 8), + 1964: (MAY, 26), + 1965: (MAY, 15), + 1966: (JUN, 3), + 1967: (MAY, 23), + 1968: (MAY, 11), + 1969: (MAY, 30), + 1970: (MAY, 19), + 1971: (MAY, 9), + 1972: (MAY, 27), + 1973: (MAY, 17), + 1974: (MAY, 6), + 1975: (MAY, 25), + 1976: (MAY, 13), + 1977: (JUN, 1), + 1978: (MAY, 21), + 1979: (MAY, 10), + 1980: (MAY, 28), + 1981: (MAY, 18), + 1982: (MAY, 8), + 1983: (MAY, 27), + 1984: (MAY, 15), + 1985: (JUN, 3), + 1986: (MAY, 23), + 1987: (MAY, 12), + 1988: (MAY, 30), + 1989: (MAY, 19), + 1990: (MAY, 9), + 1991: (MAY, 28), + 1992: (MAY, 17), + 1993: (JUN, 4), + 1994: (MAY, 25), + 1995: (MAY, 14), + 1996: (MAY, 31), + 1997: (MAY, 21), + 1998: (MAY, 10), + 1999: (MAY, 29), + 2000: (MAY, 18), + 2001: (MAY, 7), + 2002: (MAY, 26), + 2003: (MAY, 15), + 2004: (JUN, 2), + 2005: (MAY, 22), + 2006: (MAY, 12), + 2007: (MAY, 31), + 2008: (MAY, 19), + 2009: (MAY, 9), + 2010: (MAY, 28), + 2011: (MAY, 17), + 2012: (MAY, 5), + 2013: (MAY, 24), + 2014: (MAY, 13), + 2015: (JUN, 1), + 2016: (MAY, 21), + 2017: (MAY, 10), + 2018: (MAY, 29), + 2019: (MAY, 19), + 2020: (MAY, 7), + 2021: (MAY, 26), + 2022: (MAY, 15), + 2023: (JUN, 2), + 2024: (MAY, 22), + 2025: (MAY, 12), + 2026: (MAY, 31), + 2027: (MAY, 20), + 2028: (MAY, 9), + 2029: (MAY, 27), + 2030: (MAY, 16), + 2031: (JUN, 4), + 2032: (MAY, 23), + 2033: (MAY, 13), + 2034: (JUN, 1), + 2035: (MAY, 22), + 2036: (MAY, 10), + 2037: (MAY, 29), + 2038: (MAY, 18), + 2039: (MAY, 7), + 2040: (MAY, 25), + 2041: (MAY, 14), + 2042: (JUN, 2), + 2043: (MAY, 23), + 2044: (MAY, 12), + 2045: (MAY, 31), + 2046: (MAY, 20), + 2047: (MAY, 9), + 2048: (MAY, 27), + 2049: (MAY, 16), + 2050: (JUN, 4), + 2051: (MAY, 24), + 2052: (MAY, 13), + 2053: (JUN, 1), + 2054: (MAY, 22), + 2055: (MAY, 11), + 2056: (MAY, 29), + 2057: (MAY, 18), + 2058: (MAY, 7), + 2059: (MAY, 26), + 2060: (MAY, 14), + 2061: (JUN, 2), + 2062: (MAY, 23), + 2063: (MAY, 12), + 2064: (MAY, 30), + 2065: (MAY, 19), + 2066: (MAY, 8), + 2067: (MAY, 27), + 2068: (MAY, 16), + 2069: (MAY, 5), + 2070: (MAY, 24), + 2071: (MAY, 14), + 2072: (JUN, 1), + 2073: (MAY, 21), + 2074: (MAY, 10), + 2075: (MAY, 29), + 2076: (MAY, 17), + 2077: (MAY, 7), + 2078: (MAY, 26), + 2079: (MAY, 15), + 2080: (JUN, 2), + 2081: (MAY, 23), + 2082: (MAY, 12), + 2083: (MAY, 31), + 2084: (MAY, 19), + 2085: (MAY, 8), + 2086: (MAY, 27), + 2087: (MAY, 17), + 2088: (MAY, 5), + 2089: (MAY, 24), + 2090: (MAY, 14), + 2091: (JUN, 1), + 2092: (MAY, 20), + 2093: (MAY, 10), + 2094: (MAY, 28), + 2095: (MAY, 18), + 2096: (MAY, 7), + 2097: (MAY, 26), + 2098: (MAY, 15), + 2099: (JUN, 3), + 2100: (MAY, 23), + } + + VESAK_MAY_DATES = { + 1901: (MAY, 3), + 1902: (MAY, 22), + 1903: (MAY, 11), + 1904: (MAY, 29), + 1905: (MAY, 18), + 1906: (MAY, 8), + 1907: (MAY, 26), + 1908: (MAY, 14), + 1909: (MAY, 4), + 1910: (MAY, 23), + 1911: (MAY, 13), + 1912: (MAY, 1), + 1913: (MAY, 20), + 1914: (MAY, 9), + 1915: (MAY, 28), + 1916: (MAY, 16), + 1917: (MAY, 5), + 1918: (MAY, 24), + 1919: (MAY, 14), + 1920: (MAY, 3), + 1921: (MAY, 22), + 1922: (MAY, 11), + 1923: (MAY, 30), + 1924: (MAY, 18), + 1925: (MAY, 7), + 1926: (MAY, 26), + 1927: (MAY, 15), + 1928: (MAY, 4), + 1929: (MAY, 23), + 1930: (MAY, 13), + 1931: (MAY, 2), + 1932: (MAY, 20), + 1933: (MAY, 9), + 1934: (MAY, 27), + 1935: (MAY, 17), + 1936: (MAY, 5), + 1937: (MAY, 24), + 1938: (MAY, 14), + 1939: (MAY, 4), + 1940: (MAY, 21), + 1941: (MAY, 10), + 1942: (MAY, 29), + 1943: (MAY, 18), + 1944: (MAY, 7), + 1945: (MAY, 26), + 1946: (MAY, 15), + 1947: (MAY, 5), + 1948: (MAY, 23), + 1949: (MAY, 12), + 1950: (MAY, 1), + 1951: (MAY, 20), + 1952: (MAY, 8), + 1953: (MAY, 27), + 1954: (MAY, 17), + 1955: (MAY, 6), + 1956: (MAY, 24), + 1957: (MAY, 14), + 1958: (MAY, 3), + 1959: (MAY, 22), + 1960: (MAY, 10), + 1961: (MAY, 29), + 1962: (MAY, 18), + 1963: (MAY, 8), + 1964: (MAY, 26), + 1965: (MAY, 15), + 1966: (MAY, 5), + 1967: (MAY, 23), + 1968: (MAY, 11), + 1969: (MAY, 1), + 1970: (MAY, 19), + 1971: (MAY, 9), + 1972: (MAY, 27), + 1973: (MAY, 17), + 1974: (MAY, 6), + 1975: (MAY, 25), + 1976: (MAY, 13), + 1977: (MAY, 2), + 1978: (MAY, 21), + 1979: (MAY, 10), + 1980: (MAY, 28), + 1981: (MAY, 18), + 1982: (MAY, 8), + 1983: (MAY, 27), + 1984: (MAY, 15), + 1985: (MAY, 4), + 1986: (MAY, 23), + 1987: (MAY, 12), + 1988: (MAY, 30), + 1989: (MAY, 19), + 1990: (MAY, 9), + 1991: (MAY, 28), + 1992: (MAY, 17), + 1993: (MAY, 6), + 1994: (MAY, 25), + 1995: (MAY, 14), + 1996: (MAY, 2), + 1997: (MAY, 21), + 1998: (MAY, 10), + 1999: (MAY, 29), + 2000: (MAY, 18), + 2001: (MAY, 7), + 2002: (MAY, 26), + 2003: (MAY, 15), + 2004: (MAY, 3), + 2005: (MAY, 22), + 2006: (MAY, 12), + 2007: (MAY, 1), + 2008: (MAY, 19), + 2009: (MAY, 9), + 2010: (MAY, 28), + 2011: (MAY, 17), + 2012: (MAY, 5), + 2013: (MAY, 24), + 2014: (MAY, 13), + 2015: (MAY, 3), + 2016: (MAY, 21), + 2017: (MAY, 10), + 2018: (MAY, 29), + 2019: (MAY, 19), + 2020: (MAY, 7), + 2021: (MAY, 26), + 2022: (MAY, 15), + 2023: (MAY, 4), + 2024: (MAY, 22), + 2025: (MAY, 12), + 2026: (MAY, 1), + 2027: (MAY, 20), + 2028: (MAY, 9), + 2029: (MAY, 27), + 2030: (MAY, 16), + 2031: (MAY, 6), + 2032: (MAY, 23), + 2033: (MAY, 13), + 2034: (MAY, 3), + 2035: (MAY, 22), + 2036: (MAY, 10), + 2037: (MAY, 29), + 2038: (MAY, 18), + 2039: (MAY, 7), + 2040: (MAY, 25), + 2041: (MAY, 14), + 2042: (MAY, 4), + 2043: (MAY, 23), + 2044: (MAY, 12), + 2045: (MAY, 1), + 2046: (MAY, 20), + 2047: (MAY, 9), + 2048: (MAY, 27), + 2049: (MAY, 16), + 2050: (MAY, 5), + 2051: (MAY, 24), + 2052: (MAY, 13), + 2053: (MAY, 3), + 2054: (MAY, 22), + 2055: (MAY, 11), + 2056: (MAY, 29), + 2057: (MAY, 18), + 2058: (MAY, 7), + 2059: (MAY, 26), + 2060: (MAY, 14), + 2061: (MAY, 4), + 2062: (MAY, 23), + 2063: (MAY, 12), + 2064: (MAY, 1), + 2065: (MAY, 19), + 2066: (MAY, 8), + 2067: (MAY, 27), + 2068: (MAY, 16), + 2069: (MAY, 5), + 2070: (MAY, 24), + 2071: (MAY, 14), + 2072: (MAY, 2), + 2073: (MAY, 21), + 2074: (MAY, 10), + 2075: (MAY, 29), + 2076: (MAY, 17), + 2077: (MAY, 7), + 2078: (MAY, 26), + 2079: (MAY, 15), + 2080: (MAY, 4), + 2081: (MAY, 23), + 2082: (MAY, 12), + 2083: (MAY, 1), + 2084: (MAY, 19), + 2085: (MAY, 8), + 2086: (MAY, 27), + 2087: (MAY, 17), + 2088: (MAY, 5), + 2089: (MAY, 24), + 2090: (MAY, 14), + 2091: (MAY, 3), + 2092: (MAY, 20), + 2093: (MAY, 10), + 2094: (MAY, 28), + 2095: (MAY, 18), + 2096: (MAY, 7), + 2097: (MAY, 26), + 2098: (MAY, 15), + 2099: (MAY, 4), + 2100: (MAY, 23), + } + + def _get_holiday(self, holiday: str, year: int) -> tuple[Optional[date], bool]: + estimated_dates = getattr(self, f"{holiday}_DATES", {}) + exact_dates = getattr(self, f"{holiday}_DATES_{_CustomCalendar.CUSTOM_ATTR_POSTFIX}", {}) + dt = exact_dates.get(year, estimated_dates.get(year, ())) + return date(year, *dt) if dt else None, year not in exact_dates + + def vesak_date(self, year: int) -> tuple[Optional[date], bool]: + return self._get_holiday(VESAK, year) + + def vesak_may_date(self, year: int) -> tuple[Optional[date], bool]: + return self._get_holiday(VESAK_MAY, year) + + +class _CustomBuddhistHolidays(_CustomCalendar, _BuddhistLunisolar): + pass diff --git a/.venv/lib/python3.12/site-packages/holidays/calendars/chinese.py b/.venv/lib/python3.12/site-packages/holidays/calendars/chinese.py new file mode 100644 index 00000000..0e3205ef --- /dev/null +++ b/.venv/lib/python3.12/site-packages/holidays/calendars/chinese.py @@ -0,0 +1,1354 @@ +# holidays +# -------- +# A fast, efficient Python library for generating country, province and state +# specific sets of holidays on the fly. It aims to make determining whether a +# specific date is a holiday as fast and flexible as possible. +# +# Authors: Vacanza Team and individual contributors (see CONTRIBUTORS file) +# dr-prodigy (c) 2017-2023 +# ryanss (c) 2014-2017 +# Website: https://github.com/vacanza/holidays +# License: MIT (see LICENSE file) + +from datetime import date +from typing import Optional + +from holidays.calendars.custom import _CustomCalendar +from holidays.calendars.gregorian import JAN, FEB, MAR, APR, MAY, JUN, SEP, OCT, NOV + +CHINESE_CALENDAR = "CHINESE_CALENDAR" +KOREAN_CALENDAR = "KOREAN_CALENDAR" +VIETNAMESE_CALENDAR = "VIETNAMESE_CALENDAR" + +BUDDHA_BIRTHDAY = "BUDDHA_BIRTHDAY" +DOUBLE_NINTH = "DOUBLE_NINTH" +DRAGON_BOAT = "DRAGON_BOAT" +HUNG_KINGS = "HUNG_KINGS" +LUNAR_NEW_YEAR = "LUNAR_NEW_YEAR" +MID_AUTUMN = "MID_AUTUMN" + + +class _ChineseLunisolar: + BUDDHA_BIRTHDAY_DATES = { + 1901: (MAY, 25), + 1902: (MAY, 15), + 1903: (MAY, 4), + 1904: (MAY, 22), + 1905: (MAY, 11), + 1906: (MAY, 1), + 1907: (MAY, 19), + 1908: (MAY, 7), + 1909: (MAY, 26), + 1910: (MAY, 16), + 1911: (MAY, 6), + 1912: (MAY, 24), + 1913: (MAY, 13), + 1914: (MAY, 2), + 1915: (MAY, 21), + 1916: (MAY, 9), + 1917: (MAY, 28), + 1918: (MAY, 17), + 1919: (MAY, 7), + 1920: (MAY, 25), + 1921: (MAY, 15), + 1922: (MAY, 4), + 1923: (MAY, 23), + 1924: (MAY, 11), + 1925: (APR, 30), + 1926: (MAY, 19), + 1927: (MAY, 8), + 1928: (MAY, 26), + 1929: (MAY, 16), + 1930: (MAY, 6), + 1931: (MAY, 24), + 1932: (MAY, 13), + 1933: (MAY, 2), + 1934: (MAY, 20), + 1935: (MAY, 10), + 1936: (MAY, 28), + 1937: (MAY, 17), + 1938: (MAY, 7), + 1939: (MAY, 26), + 1940: (MAY, 14), + 1941: (MAY, 3), + 1942: (MAY, 22), + 1943: (MAY, 11), + 1944: (APR, 30), + 1945: (MAY, 19), + 1946: (MAY, 8), + 1947: (MAY, 27), + 1948: (MAY, 16), + 1949: (MAY, 5), + 1950: (MAY, 24), + 1951: (MAY, 13), + 1952: (MAY, 1), + 1953: (MAY, 20), + 1954: (MAY, 10), + 1955: (MAY, 29), + 1956: (MAY, 17), + 1957: (MAY, 7), + 1958: (MAY, 26), + 1959: (MAY, 15), + 1960: (MAY, 3), + 1961: (MAY, 22), + 1962: (MAY, 11), + 1963: (MAY, 1), + 1964: (MAY, 19), + 1965: (MAY, 8), + 1966: (MAY, 27), + 1967: (MAY, 16), + 1968: (MAY, 4), + 1969: (MAY, 23), + 1970: (MAY, 12), + 1971: (MAY, 2), + 1972: (MAY, 20), + 1973: (MAY, 10), + 1974: (APR, 29), + 1975: (MAY, 18), + 1976: (MAY, 6), + 1977: (MAY, 25), + 1978: (MAY, 14), + 1979: (MAY, 3), + 1980: (MAY, 21), + 1981: (MAY, 11), + 1982: (MAY, 1), + 1983: (MAY, 20), + 1984: (MAY, 8), + 1985: (MAY, 27), + 1986: (MAY, 16), + 1987: (MAY, 5), + 1988: (MAY, 23), + 1989: (MAY, 12), + 1990: (MAY, 2), + 1991: (MAY, 21), + 1992: (MAY, 10), + 1993: (MAY, 28), + 1994: (MAY, 18), + 1995: (MAY, 7), + 1996: (MAY, 24), + 1997: (MAY, 14), + 1998: (MAY, 3), + 1999: (MAY, 22), + 2000: (MAY, 11), + 2001: (APR, 30), + 2002: (MAY, 19), + 2003: (MAY, 8), + 2004: (MAY, 26), + 2005: (MAY, 15), + 2006: (MAY, 5), + 2007: (MAY, 24), + 2008: (MAY, 12), + 2009: (MAY, 2), + 2010: (MAY, 21), + 2011: (MAY, 10), + 2012: (APR, 28), + 2013: (MAY, 17), + 2014: (MAY, 6), + 2015: (MAY, 25), + 2016: (MAY, 14), + 2017: (MAY, 3), + 2018: (MAY, 22), + 2019: (MAY, 12), + 2020: (APR, 30), + 2021: (MAY, 19), + 2022: (MAY, 8), + 2023: (MAY, 26), + 2024: (MAY, 15), + 2025: (MAY, 5), + 2026: (MAY, 24), + 2027: (MAY, 13), + 2028: (MAY, 2), + 2029: (MAY, 20), + 2030: (MAY, 9), + 2031: (MAY, 28), + 2032: (MAY, 16), + 2033: (MAY, 6), + 2034: (MAY, 25), + 2035: (MAY, 15), + 2036: (MAY, 3), + 2037: (MAY, 22), + 2038: (MAY, 11), + 2039: (APR, 30), + 2040: (MAY, 18), + 2041: (MAY, 7), + 2042: (MAY, 26), + 2043: (MAY, 16), + 2044: (MAY, 5), + 2045: (MAY, 24), + 2046: (MAY, 13), + 2047: (MAY, 2), + 2048: (MAY, 20), + 2049: (MAY, 9), + 2050: (MAY, 28), + 2051: (MAY, 17), + 2052: (MAY, 6), + 2053: (MAY, 25), + 2054: (MAY, 15), + 2055: (MAY, 4), + 2056: (MAY, 22), + 2057: (MAY, 11), + 2058: (APR, 30), + 2059: (MAY, 19), + 2060: (MAY, 7), + 2061: (MAY, 26), + 2062: (MAY, 16), + 2063: (MAY, 5), + 2064: (MAY, 23), + 2065: (MAY, 12), + 2066: (MAY, 1), + 2067: (MAY, 20), + 2068: (MAY, 9), + 2069: (APR, 28), + 2070: (MAY, 17), + 2071: (MAY, 7), + 2072: (MAY, 25), + 2073: (MAY, 14), + 2074: (MAY, 3), + 2075: (MAY, 22), + 2076: (MAY, 10), + 2077: (APR, 30), + 2078: (MAY, 19), + 2079: (MAY, 8), + 2080: (MAY, 26), + 2081: (MAY, 16), + 2082: (MAY, 5), + 2083: (MAY, 24), + 2084: (MAY, 12), + 2085: (MAY, 1), + 2086: (MAY, 20), + 2087: (MAY, 10), + 2088: (APR, 28), + 2089: (MAY, 17), + 2090: (MAY, 7), + 2091: (MAY, 25), + 2092: (MAY, 13), + 2093: (MAY, 3), + 2094: (MAY, 21), + 2095: (MAY, 11), + 2096: (APR, 30), + 2097: (MAY, 19), + 2098: (MAY, 8), + 2099: (MAY, 27), + 2100: (MAY, 16), + } + + DOUBLE_NINTH_DATES = { + 1901: (OCT, 20), + 1902: (OCT, 10), + 1903: (OCT, 28), + 1904: (OCT, 17), + 1905: (OCT, 7), + 1906: (OCT, 26), + 1907: (OCT, 15), + 1908: (OCT, 3), + 1909: (OCT, 22), + 1910: (OCT, 11), + 1911: (OCT, 30), + 1912: (OCT, 18), + 1913: (OCT, 8), + 1914: (OCT, 27), + 1915: (OCT, 17), + 1916: (OCT, 5), + 1917: (OCT, 24), + 1918: (OCT, 13), + 1919: (NOV, 1), + 1920: (OCT, 20), + 1921: (OCT, 9), + 1922: (OCT, 28), + 1923: (OCT, 18), + 1924: (OCT, 7), + 1925: (OCT, 26), + 1926: (OCT, 15), + 1927: (OCT, 4), + 1928: (OCT, 21), + 1929: (OCT, 11), + 1930: (OCT, 30), + 1931: (OCT, 19), + 1932: (OCT, 8), + 1933: (OCT, 27), + 1934: (OCT, 16), + 1935: (OCT, 6), + 1936: (OCT, 23), + 1937: (OCT, 12), + 1938: (OCT, 31), + 1939: (OCT, 21), + 1940: (OCT, 9), + 1941: (OCT, 28), + 1942: (OCT, 18), + 1943: (OCT, 7), + 1944: (OCT, 25), + 1945: (OCT, 14), + 1946: (OCT, 3), + 1947: (OCT, 22), + 1948: (OCT, 11), + 1949: (OCT, 30), + 1950: (OCT, 19), + 1951: (OCT, 9), + 1952: (OCT, 27), + 1953: (OCT, 16), + 1954: (OCT, 5), + 1955: (OCT, 24), + 1956: (OCT, 12), + 1957: (OCT, 31), + 1958: (OCT, 21), + 1959: (OCT, 10), + 1960: (OCT, 28), + 1961: (OCT, 18), + 1962: (OCT, 7), + 1963: (OCT, 25), + 1964: (OCT, 14), + 1965: (OCT, 3), + 1966: (OCT, 22), + 1967: (OCT, 12), + 1968: (OCT, 30), + 1969: (OCT, 19), + 1970: (OCT, 8), + 1971: (OCT, 27), + 1972: (OCT, 15), + 1973: (OCT, 4), + 1974: (OCT, 23), + 1975: (OCT, 13), + 1976: (OCT, 31), + 1977: (OCT, 21), + 1978: (OCT, 10), + 1979: (OCT, 29), + 1980: (OCT, 17), + 1981: (OCT, 6), + 1982: (OCT, 25), + 1983: (OCT, 14), + 1984: (OCT, 3), + 1985: (OCT, 22), + 1986: (OCT, 12), + 1987: (OCT, 31), + 1988: (OCT, 19), + 1989: (OCT, 8), + 1990: (OCT, 26), + 1991: (OCT, 16), + 1992: (OCT, 4), + 1993: (OCT, 23), + 1994: (OCT, 13), + 1995: (NOV, 1), + 1996: (OCT, 20), + 1997: (OCT, 10), + 1998: (OCT, 28), + 1999: (OCT, 17), + 2000: (OCT, 6), + 2001: (OCT, 25), + 2002: (OCT, 14), + 2003: (OCT, 4), + 2004: (OCT, 22), + 2005: (OCT, 11), + 2006: (OCT, 30), + 2007: (OCT, 19), + 2008: (OCT, 7), + 2009: (OCT, 26), + 2010: (OCT, 16), + 2011: (OCT, 5), + 2012: (OCT, 23), + 2013: (OCT, 13), + 2014: (OCT, 2), + 2015: (OCT, 21), + 2016: (OCT, 9), + 2017: (OCT, 28), + 2018: (OCT, 17), + 2019: (OCT, 7), + 2020: (OCT, 25), + 2021: (OCT, 14), + 2022: (OCT, 4), + 2023: (OCT, 23), + 2024: (OCT, 11), + 2025: (OCT, 29), + 2026: (OCT, 18), + 2027: (OCT, 8), + 2028: (OCT, 26), + 2029: (OCT, 16), + 2030: (OCT, 5), + 2031: (OCT, 24), + 2032: (OCT, 12), + 2033: (OCT, 1), + 2034: (OCT, 20), + 2035: (OCT, 9), + 2036: (OCT, 27), + 2037: (OCT, 17), + 2038: (OCT, 7), + 2039: (OCT, 26), + 2040: (OCT, 14), + 2041: (OCT, 3), + 2042: (OCT, 22), + 2043: (OCT, 11), + 2044: (OCT, 29), + 2045: (OCT, 18), + 2046: (OCT, 8), + 2047: (OCT, 27), + 2048: (OCT, 16), + 2049: (OCT, 5), + 2050: (OCT, 24), + 2051: (OCT, 13), + 2052: (OCT, 30), + 2053: (OCT, 20), + 2054: (OCT, 9), + 2055: (OCT, 28), + 2056: (OCT, 17), + 2057: (OCT, 7), + 2058: (OCT, 25), + 2059: (OCT, 14), + 2060: (OCT, 2), + 2061: (OCT, 21), + 2062: (OCT, 11), + 2063: (OCT, 30), + 2064: (OCT, 18), + 2065: (OCT, 8), + 2066: (OCT, 27), + 2067: (OCT, 16), + 2068: (OCT, 4), + 2069: (OCT, 23), + 2070: (OCT, 12), + 2071: (OCT, 31), + 2072: (OCT, 20), + 2073: (OCT, 9), + 2074: (OCT, 28), + 2075: (OCT, 18), + 2076: (OCT, 6), + 2077: (OCT, 25), + 2078: (OCT, 14), + 2079: (OCT, 3), + 2080: (OCT, 21), + 2081: (OCT, 11), + 2082: (OCT, 30), + 2083: (OCT, 19), + 2084: (OCT, 8), + 2085: (OCT, 27), + 2086: (OCT, 16), + 2087: (OCT, 5), + 2088: (OCT, 22), + 2089: (OCT, 12), + 2090: (OCT, 31), + 2091: (OCT, 21), + 2092: (OCT, 9), + 2093: (OCT, 28), + 2094: (OCT, 17), + 2095: (OCT, 6), + 2096: (OCT, 24), + 2097: (OCT, 13), + 2098: (OCT, 3), + 2099: (OCT, 22), + 2100: (OCT, 12), + } + + DRAGON_BOAT_DATES = { + 1901: (JUN, 20), + 1902: (JUN, 10), + 1903: (MAY, 31), + 1904: (JUN, 18), + 1905: (JUN, 7), + 1906: (JUN, 26), + 1907: (JUN, 15), + 1908: (JUN, 3), + 1909: (JUN, 22), + 1910: (JUN, 11), + 1911: (JUN, 1), + 1912: (JUN, 19), + 1913: (JUN, 9), + 1914: (MAY, 29), + 1915: (JUN, 17), + 1916: (JUN, 5), + 1917: (JUN, 23), + 1918: (JUN, 13), + 1919: (JUN, 2), + 1920: (JUN, 20), + 1921: (JUN, 10), + 1922: (MAY, 31), + 1923: (JUN, 18), + 1924: (JUN, 6), + 1925: (JUN, 25), + 1926: (JUN, 14), + 1927: (JUN, 4), + 1928: (JUN, 22), + 1929: (JUN, 11), + 1930: (JUN, 1), + 1931: (JUN, 20), + 1932: (JUN, 8), + 1933: (MAY, 28), + 1934: (JUN, 16), + 1935: (JUN, 5), + 1936: (JUN, 23), + 1937: (JUN, 13), + 1938: (JUN, 2), + 1939: (JUN, 21), + 1940: (JUN, 10), + 1941: (MAY, 30), + 1942: (JUN, 18), + 1943: (JUN, 7), + 1944: (JUN, 25), + 1945: (JUN, 14), + 1946: (JUN, 4), + 1947: (JUN, 23), + 1948: (JUN, 11), + 1949: (JUN, 1), + 1950: (JUN, 19), + 1951: (JUN, 9), + 1952: (MAY, 28), + 1953: (JUN, 15), + 1954: (JUN, 5), + 1955: (JUN, 24), + 1956: (JUN, 13), + 1957: (JUN, 2), + 1958: (JUN, 21), + 1959: (JUN, 10), + 1960: (MAY, 29), + 1961: (JUN, 17), + 1962: (JUN, 6), + 1963: (JUN, 25), + 1964: (JUN, 14), + 1965: (JUN, 4), + 1966: (JUN, 23), + 1967: (JUN, 12), + 1968: (MAY, 31), + 1969: (JUN, 19), + 1970: (JUN, 8), + 1971: (MAY, 28), + 1972: (JUN, 15), + 1973: (JUN, 5), + 1974: (JUN, 24), + 1975: (JUN, 14), + 1976: (JUN, 2), + 1977: (JUN, 21), + 1978: (JUN, 10), + 1979: (MAY, 30), + 1980: (JUN, 17), + 1981: (JUN, 6), + 1982: (JUN, 25), + 1983: (JUN, 15), + 1984: (JUN, 4), + 1985: (JUN, 22), + 1986: (JUN, 11), + 1987: (MAY, 31), + 1988: (JUN, 18), + 1989: (JUN, 8), + 1990: (MAY, 28), + 1991: (JUN, 16), + 1992: (JUN, 5), + 1993: (JUN, 24), + 1994: (JUN, 13), + 1995: (JUN, 2), + 1996: (JUN, 20), + 1997: (JUN, 9), + 1998: (MAY, 30), + 1999: (JUN, 18), + 2000: (JUN, 6), + 2001: (JUN, 25), + 2002: (JUN, 15), + 2003: (JUN, 4), + 2004: (JUN, 22), + 2005: (JUN, 11), + 2006: (MAY, 31), + 2007: (JUN, 19), + 2008: (JUN, 8), + 2009: (MAY, 28), + 2010: (JUN, 16), + 2011: (JUN, 6), + 2012: (JUN, 23), + 2013: (JUN, 12), + 2014: (JUN, 2), + 2015: (JUN, 20), + 2016: (JUN, 9), + 2017: (MAY, 30), + 2018: (JUN, 18), + 2019: (JUN, 7), + 2020: (JUN, 25), + 2021: (JUN, 14), + 2022: (JUN, 3), + 2023: (JUN, 22), + 2024: (JUN, 10), + 2025: (MAY, 31), + 2026: (JUN, 19), + 2027: (JUN, 9), + 2028: (MAY, 28), + 2029: (JUN, 16), + 2030: (JUN, 5), + 2031: (JUN, 24), + 2032: (JUN, 12), + 2033: (JUN, 1), + 2034: (JUN, 20), + 2035: (JUN, 10), + 2036: (MAY, 30), + 2037: (JUN, 18), + 2038: (JUN, 7), + 2039: (MAY, 27), + 2040: (JUN, 14), + 2041: (JUN, 3), + 2042: (JUN, 22), + 2043: (JUN, 11), + 2044: (MAY, 31), + 2045: (JUN, 19), + 2046: (JUN, 8), + 2047: (MAY, 29), + 2048: (JUN, 15), + 2049: (JUN, 4), + 2050: (JUN, 23), + 2051: (JUN, 13), + 2052: (JUN, 1), + 2053: (JUN, 20), + 2054: (JUN, 10), + 2055: (MAY, 30), + 2056: (JUN, 17), + 2057: (JUN, 6), + 2058: (JUN, 25), + 2059: (JUN, 14), + 2060: (JUN, 3), + 2061: (JUN, 22), + 2062: (JUN, 11), + 2063: (JUN, 1), + 2064: (JUN, 19), + 2065: (JUN, 8), + 2066: (MAY, 28), + 2067: (JUN, 16), + 2068: (JUN, 4), + 2069: (JUN, 23), + 2070: (JUN, 13), + 2071: (JUN, 2), + 2072: (JUN, 20), + 2073: (JUN, 10), + 2074: (MAY, 30), + 2075: (JUN, 17), + 2076: (JUN, 6), + 2077: (JUN, 24), + 2078: (JUN, 14), + 2079: (JUN, 4), + 2080: (JUN, 22), + 2081: (JUN, 11), + 2082: (JUN, 1), + 2083: (JUN, 19), + 2084: (JUN, 7), + 2085: (MAY, 27), + 2086: (JUN, 15), + 2087: (JUN, 5), + 2088: (JUN, 23), + 2089: (JUN, 13), + 2090: (JUN, 2), + 2091: (JUN, 21), + 2092: (JUN, 9), + 2093: (MAY, 29), + 2094: (JUN, 17), + 2095: (JUN, 6), + 2096: (JUN, 24), + 2097: (JUN, 14), + 2098: (JUN, 4), + 2099: (JUN, 23), + 2100: (JUN, 12), + } + + HUNG_KINGS_DATES = { + 1901: (APR, 28), + 1902: (APR, 17), + 1903: (APR, 7), + 1904: (APR, 25), + 1905: (APR, 14), + 1906: (APR, 3), + 1907: (APR, 22), + 1908: (APR, 10), + 1909: (APR, 29), + 1910: (APR, 19), + 1911: (APR, 8), + 1912: (APR, 26), + 1913: (APR, 16), + 1914: (APR, 5), + 1915: (APR, 23), + 1916: (APR, 12), + 1917: (APR, 30), + 1918: (APR, 20), + 1919: (APR, 10), + 1920: (APR, 28), + 1921: (APR, 17), + 1922: (APR, 6), + 1923: (APR, 25), + 1924: (APR, 13), + 1925: (APR, 2), + 1926: (APR, 21), + 1927: (APR, 11), + 1928: (APR, 29), + 1929: (APR, 19), + 1930: (APR, 8), + 1931: (APR, 27), + 1932: (APR, 15), + 1933: (APR, 4), + 1934: (APR, 23), + 1935: (APR, 12), + 1936: (APR, 1), + 1937: (APR, 20), + 1938: (APR, 10), + 1939: (APR, 29), + 1940: (APR, 17), + 1941: (APR, 6), + 1942: (APR, 24), + 1943: (APR, 14), + 1944: (APR, 2), + 1945: (APR, 21), + 1946: (APR, 11), + 1947: (APR, 30), + 1948: (APR, 18), + 1949: (APR, 7), + 1950: (APR, 26), + 1951: (APR, 15), + 1952: (APR, 4), + 1953: (APR, 23), + 1954: (APR, 12), + 1955: (APR, 2), + 1956: (APR, 20), + 1957: (APR, 9), + 1958: (APR, 28), + 1959: (APR, 17), + 1960: (APR, 5), + 1961: (APR, 24), + 1962: (APR, 14), + 1963: (APR, 3), + 1964: (APR, 21), + 1965: (APR, 11), + 1966: (MAR, 31), + 1967: (APR, 19), + 1968: (APR, 7), + 1969: (APR, 26), + 1970: (APR, 15), + 1971: (APR, 5), + 1972: (APR, 23), + 1973: (APR, 12), + 1974: (APR, 2), + 1975: (APR, 21), + 1976: (APR, 9), + 1977: (APR, 27), + 1978: (APR, 16), + 1979: (APR, 6), + 1980: (APR, 24), + 1981: (APR, 14), + 1982: (APR, 3), + 1983: (APR, 22), + 1984: (APR, 10), + 1985: (APR, 29), + 1986: (APR, 18), + 1987: (APR, 7), + 1988: (APR, 25), + 1989: (APR, 15), + 1990: (APR, 5), + 1991: (APR, 24), + 1992: (APR, 12), + 1993: (APR, 1), + 1994: (APR, 20), + 1995: (APR, 9), + 1996: (APR, 27), + 1997: (APR, 16), + 1998: (APR, 6), + 1999: (APR, 25), + 2000: (APR, 14), + 2001: (APR, 3), + 2002: (APR, 22), + 2003: (APR, 11), + 2004: (APR, 28), + 2005: (APR, 18), + 2006: (APR, 7), + 2007: (APR, 26), + 2008: (APR, 15), + 2009: (APR, 5), + 2010: (APR, 23), + 2011: (APR, 12), + 2012: (MAR, 31), + 2013: (APR, 19), + 2014: (APR, 9), + 2015: (APR, 28), + 2016: (APR, 16), + 2017: (APR, 6), + 2018: (APR, 25), + 2019: (APR, 14), + 2020: (APR, 2), + 2021: (APR, 21), + 2022: (APR, 10), + 2023: (APR, 29), + 2024: (APR, 18), + 2025: (APR, 7), + 2026: (APR, 26), + 2027: (APR, 16), + 2028: (APR, 4), + 2029: (APR, 23), + 2030: (APR, 12), + 2031: (APR, 1), + 2032: (APR, 19), + 2033: (APR, 9), + 2034: (APR, 28), + 2035: (APR, 17), + 2036: (APR, 6), + 2037: (APR, 25), + 2038: (APR, 14), + 2039: (APR, 3), + 2040: (APR, 20), + 2041: (APR, 10), + 2042: (APR, 29), + 2043: (APR, 19), + 2044: (APR, 7), + 2045: (APR, 26), + 2046: (APR, 15), + 2047: (APR, 4), + 2048: (APR, 22), + 2049: (APR, 11), + 2050: (APR, 1), + 2051: (APR, 20), + 2052: (APR, 9), + 2053: (APR, 28), + 2054: (APR, 17), + 2055: (APR, 6), + 2056: (APR, 24), + 2057: (APR, 13), + 2058: (APR, 2), + 2059: (APR, 21), + 2060: (APR, 10), + 2061: (MAR, 31), + 2062: (APR, 19), + 2063: (APR, 8), + 2064: (APR, 26), + 2065: (APR, 15), + 2066: (APR, 4), + 2067: (APR, 23), + 2068: (APR, 11), + 2069: (APR, 1), + 2070: (APR, 20), + 2071: (APR, 9), + 2072: (APR, 27), + 2073: (APR, 16), + 2074: (APR, 5), + 2075: (APR, 24), + 2076: (APR, 13), + 2077: (APR, 2), + 2078: (APR, 21), + 2079: (APR, 11), + 2080: (MAR, 30), + 2081: (APR, 18), + 2082: (APR, 7), + 2083: (APR, 26), + 2084: (APR, 14), + 2085: (APR, 4), + 2086: (APR, 23), + 2087: (APR, 12), + 2088: (APR, 1), + 2089: (APR, 20), + 2090: (APR, 9), + 2091: (APR, 28), + 2092: (APR, 16), + 2093: (APR, 5), + 2094: (APR, 24), + 2095: (APR, 14), + 2096: (APR, 2), + 2097: (APR, 21), + 2098: (APR, 11), + 2099: (APR, 29), + 2100: (APR, 19), + } + + LUNAR_NEW_YEAR_DATES = { + 1901: (FEB, 19), + 1902: (FEB, 8), + 1903: (JAN, 29), + 1904: (FEB, 16), + 1905: (FEB, 4), + 1906: (JAN, 25), + 1907: (FEB, 13), + 1908: (FEB, 2), + 1909: (JAN, 22), + 1910: (FEB, 10), + 1911: (JAN, 30), + 1912: (FEB, 18), + 1913: (FEB, 6), + 1914: (JAN, 26), + 1915: (FEB, 14), + 1916: (FEB, 4), + 1917: (JAN, 23), + 1918: (FEB, 11), + 1919: (FEB, 1), + 1920: (FEB, 20), + 1921: (FEB, 8), + 1922: (JAN, 28), + 1923: (FEB, 16), + 1924: (FEB, 5), + 1925: (JAN, 24), + 1926: (FEB, 13), + 1927: (FEB, 2), + 1928: (JAN, 23), + 1929: (FEB, 10), + 1930: (JAN, 30), + 1931: (FEB, 17), + 1932: (FEB, 6), + 1933: (JAN, 26), + 1934: (FEB, 14), + 1935: (FEB, 4), + 1936: (JAN, 24), + 1937: (FEB, 11), + 1938: (JAN, 31), + 1939: (FEB, 19), + 1940: (FEB, 8), + 1941: (JAN, 27), + 1942: (FEB, 15), + 1943: (FEB, 5), + 1944: (JAN, 25), + 1945: (FEB, 13), + 1946: (FEB, 2), + 1947: (JAN, 22), + 1948: (FEB, 10), + 1949: (JAN, 29), + 1950: (FEB, 17), + 1951: (FEB, 6), + 1952: (JAN, 27), + 1953: (FEB, 14), + 1954: (FEB, 3), + 1955: (JAN, 24), + 1956: (FEB, 12), + 1957: (JAN, 31), + 1958: (FEB, 18), + 1959: (FEB, 8), + 1960: (JAN, 28), + 1961: (FEB, 15), + 1962: (FEB, 5), + 1963: (JAN, 25), + 1964: (FEB, 13), + 1965: (FEB, 2), + 1966: (JAN, 21), + 1967: (FEB, 9), + 1968: (JAN, 30), + 1969: (FEB, 17), + 1970: (FEB, 6), + 1971: (JAN, 27), + 1972: (FEB, 15), + 1973: (FEB, 3), + 1974: (JAN, 23), + 1975: (FEB, 11), + 1976: (JAN, 31), + 1977: (FEB, 18), + 1978: (FEB, 7), + 1979: (JAN, 28), + 1980: (FEB, 16), + 1981: (FEB, 5), + 1982: (JAN, 25), + 1983: (FEB, 13), + 1984: (FEB, 2), + 1985: (FEB, 20), + 1986: (FEB, 9), + 1987: (JAN, 29), + 1988: (FEB, 17), + 1989: (FEB, 6), + 1990: (JAN, 27), + 1991: (FEB, 15), + 1992: (FEB, 4), + 1993: (JAN, 23), + 1994: (FEB, 10), + 1995: (JAN, 31), + 1996: (FEB, 19), + 1997: (FEB, 7), + 1998: (JAN, 28), + 1999: (FEB, 16), + 2000: (FEB, 5), + 2001: (JAN, 24), + 2002: (FEB, 12), + 2003: (FEB, 1), + 2004: (JAN, 22), + 2005: (FEB, 9), + 2006: (JAN, 29), + 2007: (FEB, 18), + 2008: (FEB, 7), + 2009: (JAN, 26), + 2010: (FEB, 14), + 2011: (FEB, 3), + 2012: (JAN, 23), + 2013: (FEB, 10), + 2014: (JAN, 31), + 2015: (FEB, 19), + 2016: (FEB, 8), + 2017: (JAN, 28), + 2018: (FEB, 16), + 2019: (FEB, 5), + 2020: (JAN, 25), + 2021: (FEB, 12), + 2022: (FEB, 1), + 2023: (JAN, 22), + 2024: (FEB, 10), + 2025: (JAN, 29), + 2026: (FEB, 17), + 2027: (FEB, 6), + 2028: (JAN, 26), + 2029: (FEB, 13), + 2030: (FEB, 3), + 2031: (JAN, 23), + 2032: (FEB, 11), + 2033: (JAN, 31), + 2034: (FEB, 19), + 2035: (FEB, 8), + 2036: (JAN, 28), + 2037: (FEB, 15), + 2038: (FEB, 4), + 2039: (JAN, 24), + 2040: (FEB, 12), + 2041: (FEB, 1), + 2042: (JAN, 22), + 2043: (FEB, 10), + 2044: (JAN, 30), + 2045: (FEB, 17), + 2046: (FEB, 6), + 2047: (JAN, 26), + 2048: (FEB, 14), + 2049: (FEB, 2), + 2050: (JAN, 23), + 2051: (FEB, 11), + 2052: (FEB, 1), + 2053: (FEB, 19), + 2054: (FEB, 8), + 2055: (JAN, 28), + 2056: (FEB, 15), + 2057: (FEB, 4), + 2058: (JAN, 24), + 2059: (FEB, 12), + 2060: (FEB, 2), + 2061: (JAN, 21), + 2062: (FEB, 9), + 2063: (JAN, 29), + 2064: (FEB, 17), + 2065: (FEB, 5), + 2066: (JAN, 26), + 2067: (FEB, 14), + 2068: (FEB, 3), + 2069: (JAN, 23), + 2070: (FEB, 11), + 2071: (JAN, 31), + 2072: (FEB, 19), + 2073: (FEB, 7), + 2074: (JAN, 27), + 2075: (FEB, 15), + 2076: (FEB, 5), + 2077: (JAN, 24), + 2078: (FEB, 12), + 2079: (FEB, 2), + 2080: (JAN, 22), + 2081: (FEB, 9), + 2082: (JAN, 29), + 2083: (FEB, 17), + 2084: (FEB, 6), + 2085: (JAN, 26), + 2086: (FEB, 14), + 2087: (FEB, 3), + 2088: (JAN, 24), + 2089: (FEB, 10), + 2090: (JAN, 30), + 2091: (FEB, 18), + 2092: (FEB, 7), + 2093: (JAN, 27), + 2094: (FEB, 15), + 2095: (FEB, 5), + 2096: (JAN, 25), + 2097: (FEB, 12), + 2098: (FEB, 1), + 2099: (JAN, 21), + 2100: (FEB, 9), + } + + MID_AUTUMN_DATES = { + 1901: (SEP, 27), + 1902: (SEP, 16), + 1903: (OCT, 5), + 1904: (SEP, 24), + 1905: (SEP, 13), + 1906: (OCT, 2), + 1907: (SEP, 22), + 1908: (SEP, 10), + 1909: (SEP, 28), + 1910: (SEP, 18), + 1911: (OCT, 6), + 1912: (SEP, 25), + 1913: (SEP, 15), + 1914: (OCT, 4), + 1915: (SEP, 23), + 1916: (SEP, 12), + 1917: (SEP, 30), + 1918: (SEP, 19), + 1919: (OCT, 8), + 1920: (SEP, 26), + 1921: (SEP, 16), + 1922: (OCT, 5), + 1923: (SEP, 25), + 1924: (SEP, 13), + 1925: (OCT, 2), + 1926: (SEP, 21), + 1927: (SEP, 10), + 1928: (SEP, 28), + 1929: (SEP, 17), + 1930: (OCT, 6), + 1931: (SEP, 26), + 1932: (SEP, 15), + 1933: (OCT, 4), + 1934: (SEP, 23), + 1935: (SEP, 12), + 1936: (SEP, 30), + 1937: (SEP, 19), + 1938: (OCT, 8), + 1939: (SEP, 27), + 1940: (SEP, 16), + 1941: (OCT, 5), + 1942: (SEP, 24), + 1943: (SEP, 14), + 1944: (OCT, 1), + 1945: (SEP, 20), + 1946: (SEP, 10), + 1947: (SEP, 29), + 1948: (SEP, 17), + 1949: (OCT, 6), + 1950: (SEP, 26), + 1951: (SEP, 15), + 1952: (OCT, 3), + 1953: (SEP, 22), + 1954: (SEP, 11), + 1955: (SEP, 30), + 1956: (SEP, 19), + 1957: (SEP, 8), + 1958: (SEP, 27), + 1959: (SEP, 17), + 1960: (OCT, 5), + 1961: (SEP, 24), + 1962: (SEP, 13), + 1963: (OCT, 2), + 1964: (SEP, 20), + 1965: (SEP, 10), + 1966: (SEP, 29), + 1967: (SEP, 18), + 1968: (OCT, 6), + 1969: (SEP, 26), + 1970: (SEP, 15), + 1971: (OCT, 3), + 1972: (SEP, 22), + 1973: (SEP, 11), + 1974: (SEP, 30), + 1975: (SEP, 20), + 1976: (SEP, 8), + 1977: (SEP, 27), + 1978: (SEP, 17), + 1979: (OCT, 5), + 1980: (SEP, 23), + 1981: (SEP, 12), + 1982: (OCT, 1), + 1983: (SEP, 21), + 1984: (SEP, 10), + 1985: (SEP, 29), + 1986: (SEP, 18), + 1987: (OCT, 7), + 1988: (SEP, 25), + 1989: (SEP, 14), + 1990: (OCT, 3), + 1991: (SEP, 22), + 1992: (SEP, 11), + 1993: (SEP, 30), + 1994: (SEP, 20), + 1995: (SEP, 9), + 1996: (SEP, 27), + 1997: (SEP, 16), + 1998: (OCT, 5), + 1999: (SEP, 24), + 2000: (SEP, 12), + 2001: (OCT, 1), + 2002: (SEP, 21), + 2003: (SEP, 11), + 2004: (SEP, 28), + 2005: (SEP, 18), + 2006: (OCT, 6), + 2007: (SEP, 25), + 2008: (SEP, 14), + 2009: (OCT, 3), + 2010: (SEP, 22), + 2011: (SEP, 12), + 2012: (SEP, 30), + 2013: (SEP, 19), + 2014: (SEP, 8), + 2015: (SEP, 27), + 2016: (SEP, 15), + 2017: (OCT, 4), + 2018: (SEP, 24), + 2019: (SEP, 13), + 2020: (OCT, 1), + 2021: (SEP, 21), + 2022: (SEP, 10), + 2023: (SEP, 29), + 2024: (SEP, 17), + 2025: (OCT, 6), + 2026: (SEP, 25), + 2027: (SEP, 15), + 2028: (OCT, 3), + 2029: (SEP, 22), + 2030: (SEP, 12), + 2031: (OCT, 1), + 2032: (SEP, 19), + 2033: (SEP, 8), + 2034: (SEP, 27), + 2035: (SEP, 16), + 2036: (OCT, 4), + 2037: (SEP, 24), + 2038: (SEP, 13), + 2039: (OCT, 2), + 2040: (SEP, 20), + 2041: (SEP, 10), + 2042: (SEP, 28), + 2043: (SEP, 17), + 2044: (OCT, 5), + 2045: (SEP, 25), + 2046: (SEP, 15), + 2047: (OCT, 4), + 2048: (SEP, 22), + 2049: (SEP, 11), + 2050: (SEP, 30), + 2051: (SEP, 19), + 2052: (SEP, 7), + 2053: (SEP, 26), + 2054: (SEP, 16), + 2055: (OCT, 5), + 2056: (SEP, 24), + 2057: (SEP, 13), + 2058: (OCT, 2), + 2059: (SEP, 21), + 2060: (SEP, 9), + 2061: (SEP, 28), + 2062: (SEP, 17), + 2063: (OCT, 6), + 2064: (SEP, 25), + 2065: (SEP, 15), + 2066: (OCT, 3), + 2067: (SEP, 23), + 2068: (SEP, 11), + 2069: (SEP, 29), + 2070: (SEP, 19), + 2071: (SEP, 8), + 2072: (SEP, 26), + 2073: (SEP, 16), + 2074: (OCT, 5), + 2075: (SEP, 24), + 2076: (SEP, 12), + 2077: (OCT, 1), + 2078: (SEP, 20), + 2079: (SEP, 10), + 2080: (SEP, 28), + 2081: (SEP, 17), + 2082: (OCT, 6), + 2083: (SEP, 26), + 2084: (SEP, 14), + 2085: (OCT, 3), + 2086: (SEP, 22), + 2087: (SEP, 11), + 2088: (SEP, 29), + 2089: (SEP, 18), + 2090: (SEP, 8), + 2091: (SEP, 27), + 2092: (SEP, 16), + 2093: (OCT, 5), + 2094: (SEP, 24), + 2095: (SEP, 13), + 2096: (SEP, 30), + 2097: (SEP, 20), + 2098: (SEP, 9), + 2099: (SEP, 29), + 2100: (SEP, 18), + } + + KOREAN_CALENDAR_BUDDHA_BIRTHDAY_DATES = { + 1905: (MAY, 12), + 1908: (MAY, 8), + 1931: (MAY, 25), + 1968: (MAY, 5), + 2001: (MAY, 1), + 2012: (MAY, 28), + 2023: (MAY, 27), + } + + KOREAN_CALENDAR_LUNAR_NEW_YEAR_DATES = { + 1944: (JAN, 26), + 1954: (FEB, 4), + 1958: (FEB, 19), + 1966: (JAN, 22), + 1988: (FEB, 18), + 1997: (FEB, 8), + 2027: (FEB, 7), + 2028: (JAN, 27), + 2061: (JAN, 22), + 2089: (FEB, 11), + 2092: (FEB, 8), + } + + KOREAN_CALENDAR_MID_AUTUMN_DATES = { + 1909: (SEP, 29), + 1942: (SEP, 25), + 2040: (SEP, 21), + 2089: (SEP, 19), + 2096: (OCT, 1), + 2098: (SEP, 10), + } + + VIETNAMESE_CALENDAR_HUNG_KINGS_DATES = { + 1916: (APR, 11), + 1917: (APR, 1), + 1939: (APR, 28), + 1975: (APR, 20), + 2009: (APR, 4), + 2037: (APR, 24), + 2038: (APR, 13), + 2085: (APR, 3), + 2086: (APR, 22), + 2095: (APR, 13), + 2100: (APR, 18), + } + + VIETNAMESE_CALENDAR_LUNAR_NEW_YEAR_DATES = { + 1903: (JAN, 28), + 1916: (FEB, 3), + 1935: (FEB, 3), + 1965: (FEB, 1), + 1968: (JAN, 29), + 1969: (FEB, 16), + 1985: (JAN, 21), + 2007: (FEB, 17), + 2030: (FEB, 2), + 2053: (FEB, 18), + } + + def __init__(self, calendar: str = CHINESE_CALENDAR) -> None: + self.__verify_calendar(calendar) + self.__calendar = calendar + + @staticmethod + def __verify_calendar(calendar): + """Verify calendar type.""" + + supported_calendars = {CHINESE_CALENDAR, KOREAN_CALENDAR, VIETNAMESE_CALENDAR} + if calendar not in supported_calendars: + raise ValueError( + f"Unknown calendar name: {calendar}. " + f"Supported calendars: {', '.join(sorted(supported_calendars))}" + ) + + def _get_holiday(self, holiday: str, year: int, calendar=None) -> tuple[Optional[date], bool]: + calendar = calendar or self.__calendar + self.__verify_calendar(calendar) + custom_calendar_dates = getattr(self, f"{calendar}_{holiday}_DATES", {}) + estimated_dates = getattr(self, f"{holiday}_DATES", {}) + exact_dates = getattr(self, f"{holiday}_DATES_{_CustomCalendar.CUSTOM_ATTR_POSTFIX}", {}) + dt = exact_dates.get(year, custom_calendar_dates.get(year, estimated_dates.get(year, ()))) + return date(year, *dt) if dt else None, year not in exact_dates + + def buddha_birthday_date(self, year: int, calendar=None) -> tuple[Optional[date], bool]: + return self._get_holiday(BUDDHA_BIRTHDAY, year, calendar) + + def double_ninth_date(self, year: int) -> tuple[Optional[date], bool]: + return self._get_holiday(DOUBLE_NINTH, year) + + def dragon_boat_date(self, year: int) -> tuple[Optional[date], bool]: + return self._get_holiday(DRAGON_BOAT, year) + + def hung_kings_date(self, year: int, calendar=None) -> tuple[Optional[date], bool]: + return self._get_holiday(HUNG_KINGS, year, calendar) + + def lunar_new_year_date(self, year: int, calendar=None) -> tuple[Optional[date], bool]: + return self._get_holiday(LUNAR_NEW_YEAR, year, calendar) + + def mid_autumn_date(self, year: int, calendar=None) -> tuple[Optional[date], bool]: + return self._get_holiday(MID_AUTUMN, year, calendar) + + +class _CustomChineseHolidays(_CustomCalendar, _ChineseLunisolar): + pass diff --git a/.venv/lib/python3.12/site-packages/holidays/calendars/custom.py b/.venv/lib/python3.12/site-packages/holidays/calendars/custom.py new file mode 100644 index 00000000..004d874e --- /dev/null +++ b/.venv/lib/python3.12/site-packages/holidays/calendars/custom.py @@ -0,0 +1,34 @@ +# holidays +# -------- +# A fast, efficient Python library for generating country, province and state +# specific sets of holidays on the fly. It aims to make determining whether a +# specific date is a holiday as fast and flexible as possible. +# +# Authors: Vacanza Team and individual contributors (see CONTRIBUTORS file) +# dr-prodigy (c) 2017-2023 +# ryanss (c) 2014-2017 +# Website: https://github.com/vacanza/holidays +# License: MIT (see LICENSE file) + + +class _CustomCalendarType(type): + """Helper class for simple calendar customization. + + Renames child class public attributes keeping the original data under a new + name with a `CUSTOM_ATTR_POSTFIX` postfix. + + Allows for better readability of customized lunisolar calendar dates. + """ + + CUSTOM_ATTR_POSTFIX = "CUSTOM_CALENDAR" + + def __new__(cls, name, bases, namespace): + for attr in (key for key in tuple(namespace.keys()) if key[0] != "_"): + namespace[f"{attr}_{_CustomCalendar.CUSTOM_ATTR_POSTFIX}"] = namespace[attr] + del namespace[attr] + + return super().__new__(cls, name, bases, namespace) + + +class _CustomCalendar(metaclass=_CustomCalendarType): + pass diff --git a/.venv/lib/python3.12/site-packages/holidays/calendars/gregorian.py b/.venv/lib/python3.12/site-packages/holidays/calendars/gregorian.py new file mode 100644 index 00000000..424dd8fc --- /dev/null +++ b/.venv/lib/python3.12/site-packages/holidays/calendars/gregorian.py @@ -0,0 +1,95 @@ +# holidays +# -------- +# A fast, efficient Python library for generating country, province and state +# specific sets of holidays on the fly. It aims to make determining whether a +# specific date is a holiday as fast and flexible as possible. +# +# Authors: Vacanza Team and individual contributors (see CONTRIBUTORS file) +# dr-prodigy (c) 2017-2023 +# ryanss (c) 2014-2017 +# Website: https://github.com/vacanza/holidays +# License: MIT (see LICENSE file) + +from datetime import date + +GREGORIAN_CALENDAR = "GREGORIAN_CALENDAR" + +MON, TUE, WED, THU, FRI, SAT, SUN = range(7) +WEEKEND = (SAT, SUN) + +JAN, FEB, MAR, APR, MAY, JUN, JUL, AUG, SEP, OCT, NOV, DEC = range(1, 13) + +DAYS = {str(d) for d in range(1, 32)} +MONTHS = { + m: i + for i, m in enumerate( + ("jan", "feb", "mar", "apr", "may", "jun", "jul", "aug", "sep", "oct", "nov", "dec"), 1 + ) +} +WEEKDAYS = {w: i for i, w in enumerate(("mon", "tue", "wed", "thu", "fri", "sat", "sun"))} + + +# Holiday names. +CHRISTMAS = "christmas" +WINTER_SOLSTICE = "winter_solstice" + + +def _timedelta(dt: date, days: int = 0) -> date: + """ + Return date that is `days` days after (days > 0) or before (days < 0) specified date. + """ + + return date.fromordinal(dt.toordinal() + days) + + +def _get_nth_weekday_from(n: int, weekday: int, from_dt: date) -> date: + """ + Return date of a n-th weekday before a specific date + if n is negative. + Return date of n-th weekday after (including) a specific date + if n is positive. + Examples: 1st Monday, 2nd Saturday, etc). + """ + + return _timedelta( + from_dt, + ( + (n - 1) * 7 + (weekday - from_dt.weekday()) % 7 + if n > 0 + else (n + 1) * 7 - (from_dt.weekday() - weekday) % 7 + ), + ) + + +def _get_nth_weekday_of_month(n: int, weekday: int, month: int, year: int) -> date: + """ + Return date of n-th weekday of month for a specific year + (e.g. 1st Monday of Apr, 2nd Friday of June, etc). + If n is negative the countdown starts at the end of month + (i.e. -1 is last). + """ + + requested_year_month = (year, month) + + if n < 0: + month += 1 + if month > 12: + month = 1 + year += 1 + start_date = _timedelta(date(year, month, 1), -1) + else: + start_date = date(year, month, 1) + + dt = _get_nth_weekday_from(n, weekday, start_date) + dt_year_month = (dt.year, dt.month) + + if dt_year_month != requested_year_month: + raise ValueError(f"{dt_year_month} returned for {requested_year_month}") + + return dt + + +def _get_all_sundays(year): + first_sunday = _get_nth_weekday_of_month(1, SUN, JAN, year) + for n in range(0, (date(year, DEC, 31) - first_sunday).days + 1, 7): + yield _timedelta(first_sunday, n) diff --git a/.venv/lib/python3.12/site-packages/holidays/calendars/hebrew.py b/.venv/lib/python3.12/site-packages/holidays/calendars/hebrew.py new file mode 100644 index 00000000..05c9b5f5 --- /dev/null +++ b/.venv/lib/python3.12/site-packages/holidays/calendars/hebrew.py @@ -0,0 +1,1633 @@ +# holidays +# -------- +# A fast, efficient Python library for generating country, province and state +# specific sets of holidays on the fly. It aims to make determining whether a +# specific date is a holiday as fast and flexible as possible. +# +# Authors: Vacanza Team and individual contributors (see CONTRIBUTORS file) +# dr-prodigy (c) 2017-2023 +# ryanss (c) 2014-2017 +# Website: https://github.com/vacanza/holidays +# License: MIT (see LICENSE file) + +from datetime import date +from typing import Optional + +from holidays.calendars.gregorian import FEB, MAR, APR, MAY, JUN, JUL, AUG, SEP, OCT, NOV, DEC + +HANUKKAH = "HANUKKAH" +INDEPENDENCE_DAY = "INDEPENDENCE_DAY" +LAG_BAOMER = "LAG_BAOMER" +PASSOVER = "PASSOVER" +PURIM = "PURIM" +ROSH_HASHANAH = "ROSH_HASHANAH" +SHAVUOT = "SHAVUOT" +SUKKOT = "SUKKOT" +TISHA_BAV = "TISHA_BAV" +YOM_KIPPUR = "YOM_KIPPUR" + + +class _HebrewLunisolar: + HANUKKAH_DATES = { + 1947: (DEC, 8), + 1948: (DEC, 27), + 1949: (DEC, 16), + 1950: (DEC, 4), + 1951: (DEC, 24), + 1952: (DEC, 13), + 1953: (DEC, 2), + 1954: (DEC, 20), + 1955: (DEC, 10), + 1956: (NOV, 29), + 1957: (DEC, 18), + 1958: (DEC, 7), + 1959: (DEC, 26), + 1960: (DEC, 14), + 1961: (DEC, 3), + 1962: (DEC, 22), + 1963: (DEC, 11), + 1964: (NOV, 30), + 1965: (DEC, 19), + 1966: (DEC, 8), + 1967: (DEC, 27), + 1968: (DEC, 16), + 1969: (DEC, 5), + 1970: (DEC, 23), + 1971: (DEC, 13), + 1972: (DEC, 1), + 1973: (DEC, 20), + 1974: (DEC, 9), + 1975: (NOV, 29), + 1976: (DEC, 17), + 1977: (DEC, 5), + 1978: (DEC, 25), + 1979: (DEC, 15), + 1980: (DEC, 3), + 1981: (DEC, 21), + 1982: (DEC, 11), + 1983: (DEC, 1), + 1984: (DEC, 19), + 1985: (DEC, 8), + 1986: (DEC, 27), + 1987: (DEC, 16), + 1988: (DEC, 4), + 1989: (DEC, 23), + 1990: (DEC, 12), + 1991: (DEC, 2), + 1992: (DEC, 20), + 1993: (DEC, 9), + 1994: (NOV, 28), + 1995: (DEC, 18), + 1996: (DEC, 6), + 1997: (DEC, 24), + 1998: (DEC, 14), + 1999: (DEC, 4), + 2000: (DEC, 22), + 2001: (DEC, 10), + 2002: (NOV, 30), + 2003: (DEC, 20), + 2004: (DEC, 8), + 2005: (DEC, 26), + 2006: (DEC, 16), + 2007: (DEC, 5), + 2008: (DEC, 22), + 2009: (DEC, 12), + 2010: (DEC, 2), + 2011: (DEC, 21), + 2012: (DEC, 9), + 2013: (NOV, 28), + 2014: (DEC, 17), + 2015: (DEC, 7), + 2016: (DEC, 25), + 2017: (DEC, 13), + 2018: (DEC, 3), + 2019: (DEC, 23), + 2020: (DEC, 11), + 2021: (NOV, 29), + 2022: (DEC, 19), + 2023: (DEC, 8), + 2024: (DEC, 26), + 2025: (DEC, 15), + 2026: (DEC, 5), + 2027: (DEC, 25), + 2028: (DEC, 13), + 2029: (DEC, 2), + 2030: (DEC, 21), + 2031: (DEC, 10), + 2032: (NOV, 28), + 2033: (DEC, 17), + 2034: (DEC, 7), + 2035: (DEC, 26), + 2036: (DEC, 14), + 2037: (DEC, 3), + 2038: (DEC, 22), + 2039: (DEC, 12), + 2040: (NOV, 30), + 2041: (DEC, 18), + 2042: (DEC, 8), + 2043: (DEC, 27), + 2044: (DEC, 15), + 2045: (DEC, 4), + 2046: (DEC, 24), + 2047: (DEC, 13), + 2048: (NOV, 30), + 2049: (DEC, 20), + 2050: (DEC, 10), + 2051: (NOV, 29), + 2052: (DEC, 16), + 2053: (DEC, 6), + 2054: (DEC, 26), + 2055: (DEC, 15), + 2056: (DEC, 3), + 2057: (DEC, 22), + 2058: (DEC, 11), + 2059: (NOV, 30), + 2060: (DEC, 18), + 2061: (DEC, 8), + 2062: (DEC, 27), + 2063: (DEC, 16), + 2064: (DEC, 4), + 2065: (DEC, 23), + 2066: (DEC, 13), + 2067: (DEC, 2), + 2068: (DEC, 19), + 2069: (DEC, 9), + 2070: (NOV, 28), + 2071: (DEC, 17), + 2072: (DEC, 5), + 2073: (DEC, 25), + 2074: (DEC, 14), + 2075: (DEC, 2), + 2076: (DEC, 21), + 2077: (DEC, 11), + 2078: (NOV, 30), + 2079: (DEC, 18), + 2080: (DEC, 7), + 2081: (DEC, 27), + 2082: (DEC, 16), + 2083: (DEC, 5), + 2084: (DEC, 23), + 2085: (DEC, 12), + 2086: (DEC, 1), + 2087: (DEC, 20), + 2088: (DEC, 8), + 2089: (NOV, 28), + 2090: (DEC, 17), + 2091: (DEC, 6), + 2092: (DEC, 24), + 2093: (DEC, 14), + 2094: (DEC, 3), + 2095: (DEC, 21), + 2096: (DEC, 10), + 2097: (NOV, 30), + 2098: (DEC, 19), + 2099: (DEC, 7), + 2100: (DEC, 27), + } + + INDEPENDENCE_DAY_DATES = { + 1947: (APR, 25), + 1948: (MAY, 14), + 1949: (MAY, 4), + 1950: (APR, 22), + 1951: (MAY, 11), + 1952: (APR, 30), + 1953: (APR, 20), + 1954: (MAY, 8), + 1955: (APR, 27), + 1956: (APR, 16), + 1957: (MAY, 6), + 1958: (APR, 25), + 1959: (MAY, 13), + 1960: (MAY, 2), + 1961: (APR, 21), + 1962: (MAY, 9), + 1963: (APR, 29), + 1964: (APR, 17), + 1965: (MAY, 7), + 1966: (APR, 25), + 1967: (MAY, 15), + 1968: (MAY, 3), + 1969: (APR, 23), + 1970: (MAY, 11), + 1971: (APR, 30), + 1972: (APR, 19), + 1973: (MAY, 7), + 1974: (APR, 27), + 1975: (APR, 16), + 1976: (MAY, 5), + 1977: (APR, 23), + 1978: (MAY, 12), + 1979: (MAY, 2), + 1980: (APR, 21), + 1981: (MAY, 9), + 1982: (APR, 28), + 1983: (APR, 18), + 1984: (MAY, 7), + 1985: (APR, 26), + 1986: (MAY, 14), + 1987: (MAY, 4), + 1988: (APR, 22), + 1989: (MAY, 10), + 1990: (APR, 30), + 1991: (APR, 19), + 1992: (MAY, 8), + 1993: (APR, 26), + 1994: (APR, 16), + 1995: (MAY, 5), + 1996: (APR, 24), + 1997: (MAY, 12), + 1998: (MAY, 1), + 1999: (APR, 21), + 2000: (MAY, 10), + 2001: (APR, 28), + 2002: (APR, 17), + 2003: (MAY, 7), + 2004: (APR, 26), + 2005: (MAY, 14), + 2006: (MAY, 3), + 2007: (APR, 23), + 2008: (MAY, 10), + 2009: (APR, 29), + 2010: (APR, 19), + 2011: (MAY, 9), + 2012: (APR, 27), + 2013: (APR, 15), + 2014: (MAY, 5), + 2015: (APR, 24), + 2016: (MAY, 13), + 2017: (MAY, 1), + 2018: (APR, 20), + 2019: (MAY, 10), + 2020: (APR, 29), + 2021: (APR, 17), + 2022: (MAY, 6), + 2023: (APR, 26), + 2024: (MAY, 13), + 2025: (MAY, 3), + 2026: (APR, 22), + 2027: (MAY, 12), + 2028: (MAY, 1), + 2029: (APR, 20), + 2030: (MAY, 8), + 2031: (APR, 28), + 2032: (APR, 16), + 2033: (MAY, 4), + 2034: (APR, 24), + 2035: (MAY, 14), + 2036: (MAY, 2), + 2037: (APR, 20), + 2038: (MAY, 10), + 2039: (APR, 29), + 2040: (APR, 18), + 2041: (MAY, 6), + 2042: (APR, 25), + 2043: (MAY, 15), + 2044: (MAY, 2), + 2045: (APR, 22), + 2046: (MAY, 11), + 2047: (MAY, 1), + 2048: (APR, 18), + 2049: (MAY, 7), + 2050: (APR, 27), + 2051: (APR, 17), + 2052: (MAY, 4), + 2053: (APR, 23), + 2054: (MAY, 13), + 2055: (MAY, 3), + 2056: (APR, 21), + 2057: (MAY, 9), + 2058: (APR, 29), + 2059: (APR, 18), + 2060: (MAY, 5), + 2061: (APR, 25), + 2062: (MAY, 15), + 2063: (MAY, 4), + 2064: (APR, 21), + 2065: (MAY, 11), + 2066: (APR, 30), + 2067: (APR, 20), + 2068: (MAY, 7), + 2069: (APR, 26), + 2070: (APR, 16), + 2071: (MAY, 4), + 2072: (APR, 23), + 2073: (MAY, 12), + 2074: (MAY, 2), + 2075: (APR, 20), + 2076: (MAY, 8), + 2077: (APR, 28), + 2078: (APR, 18), + 2079: (MAY, 6), + 2080: (APR, 24), + 2081: (MAY, 14), + 2082: (MAY, 4), + 2083: (APR, 23), + 2084: (MAY, 10), + 2085: (APR, 30), + 2086: (APR, 19), + 2087: (MAY, 7), + 2088: (APR, 26), + 2089: (APR, 15), + 2090: (MAY, 5), + 2091: (APR, 23), + 2092: (MAY, 12), + 2093: (MAY, 1), + 2094: (APR, 21), + 2095: (MAY, 9), + 2096: (APR, 27), + 2097: (APR, 17), + 2098: (MAY, 7), + 2099: (APR, 25), + 2100: (MAY, 14), + } + + LAG_BAOMER_DATES = { + 1947: (MAY, 8), + 1948: (MAY, 27), + 1949: (MAY, 17), + 1950: (MAY, 5), + 1951: (MAY, 24), + 1952: (MAY, 13), + 1953: (MAY, 3), + 1954: (MAY, 21), + 1955: (MAY, 10), + 1956: (APR, 29), + 1957: (MAY, 19), + 1958: (MAY, 8), + 1959: (MAY, 26), + 1960: (MAY, 15), + 1961: (MAY, 4), + 1962: (MAY, 22), + 1963: (MAY, 12), + 1964: (APR, 30), + 1965: (MAY, 20), + 1966: (MAY, 8), + 1967: (MAY, 28), + 1968: (MAY, 16), + 1969: (MAY, 6), + 1970: (MAY, 24), + 1971: (MAY, 13), + 1972: (MAY, 2), + 1973: (MAY, 20), + 1974: (MAY, 10), + 1975: (APR, 29), + 1976: (MAY, 18), + 1977: (MAY, 6), + 1978: (MAY, 25), + 1979: (MAY, 15), + 1980: (MAY, 4), + 1981: (MAY, 22), + 1982: (MAY, 11), + 1983: (MAY, 1), + 1984: (MAY, 20), + 1985: (MAY, 9), + 1986: (MAY, 27), + 1987: (MAY, 17), + 1988: (MAY, 5), + 1989: (MAY, 23), + 1990: (MAY, 13), + 1991: (MAY, 2), + 1992: (MAY, 21), + 1993: (MAY, 9), + 1994: (APR, 29), + 1995: (MAY, 18), + 1996: (MAY, 7), + 1997: (MAY, 25), + 1998: (MAY, 14), + 1999: (MAY, 4), + 2000: (MAY, 23), + 2001: (MAY, 11), + 2002: (APR, 30), + 2003: (MAY, 20), + 2004: (MAY, 9), + 2005: (MAY, 27), + 2006: (MAY, 16), + 2007: (MAY, 6), + 2008: (MAY, 23), + 2009: (MAY, 12), + 2010: (MAY, 2), + 2011: (MAY, 22), + 2012: (MAY, 10), + 2013: (APR, 28), + 2014: (MAY, 18), + 2015: (MAY, 7), + 2016: (MAY, 26), + 2017: (MAY, 14), + 2018: (MAY, 3), + 2019: (MAY, 23), + 2020: (MAY, 12), + 2021: (APR, 30), + 2022: (MAY, 19), + 2023: (MAY, 9), + 2024: (MAY, 26), + 2025: (MAY, 16), + 2026: (MAY, 5), + 2027: (MAY, 25), + 2028: (MAY, 14), + 2029: (MAY, 3), + 2030: (MAY, 21), + 2031: (MAY, 11), + 2032: (APR, 29), + 2033: (MAY, 17), + 2034: (MAY, 7), + 2035: (MAY, 27), + 2036: (MAY, 15), + 2037: (MAY, 3), + 2038: (MAY, 23), + 2039: (MAY, 12), + 2040: (MAY, 1), + 2041: (MAY, 19), + 2042: (MAY, 8), + 2043: (MAY, 28), + 2044: (MAY, 15), + 2045: (MAY, 5), + 2046: (MAY, 24), + 2047: (MAY, 14), + 2048: (MAY, 1), + 2049: (MAY, 20), + 2050: (MAY, 10), + 2051: (APR, 30), + 2052: (MAY, 17), + 2053: (MAY, 6), + 2054: (MAY, 26), + 2055: (MAY, 16), + 2056: (MAY, 4), + 2057: (MAY, 22), + 2058: (MAY, 12), + 2059: (MAY, 1), + 2060: (MAY, 18), + 2061: (MAY, 8), + 2062: (MAY, 28), + 2063: (MAY, 17), + 2064: (MAY, 4), + 2065: (MAY, 24), + 2066: (MAY, 13), + 2067: (MAY, 3), + 2068: (MAY, 20), + 2069: (MAY, 9), + 2070: (APR, 29), + 2071: (MAY, 17), + 2072: (MAY, 6), + 2073: (MAY, 25), + 2074: (MAY, 15), + 2075: (MAY, 3), + 2076: (MAY, 21), + 2077: (MAY, 11), + 2078: (MAY, 1), + 2079: (MAY, 19), + 2080: (MAY, 7), + 2081: (MAY, 27), + 2082: (MAY, 17), + 2083: (MAY, 6), + 2084: (MAY, 23), + 2085: (MAY, 13), + 2086: (MAY, 2), + 2087: (MAY, 20), + 2088: (MAY, 9), + 2089: (APR, 28), + 2090: (MAY, 18), + 2091: (MAY, 6), + 2092: (MAY, 25), + 2093: (MAY, 14), + 2094: (MAY, 4), + 2095: (MAY, 22), + 2096: (MAY, 10), + 2097: (APR, 30), + 2098: (MAY, 20), + 2099: (MAY, 8), + 2100: (MAY, 27), + } + + PASSOVER_DATES = { + 1947: (APR, 5), + 1948: (APR, 24), + 1949: (APR, 14), + 1950: (APR, 2), + 1951: (APR, 21), + 1952: (APR, 10), + 1953: (MAR, 31), + 1954: (APR, 18), + 1955: (APR, 7), + 1956: (MAR, 27), + 1957: (APR, 16), + 1958: (APR, 5), + 1959: (APR, 23), + 1960: (APR, 12), + 1961: (APR, 1), + 1962: (APR, 19), + 1963: (APR, 9), + 1964: (MAR, 28), + 1965: (APR, 17), + 1966: (APR, 5), + 1967: (APR, 25), + 1968: (APR, 13), + 1969: (APR, 3), + 1970: (APR, 21), + 1971: (APR, 10), + 1972: (MAR, 30), + 1973: (APR, 17), + 1974: (APR, 7), + 1975: (MAR, 27), + 1976: (APR, 15), + 1977: (APR, 3), + 1978: (APR, 22), + 1979: (APR, 12), + 1980: (APR, 1), + 1981: (APR, 19), + 1982: (APR, 8), + 1983: (MAR, 29), + 1984: (APR, 17), + 1985: (APR, 6), + 1986: (APR, 24), + 1987: (APR, 14), + 1988: (APR, 2), + 1989: (APR, 20), + 1990: (APR, 10), + 1991: (MAR, 30), + 1992: (APR, 18), + 1993: (APR, 6), + 1994: (MAR, 27), + 1995: (APR, 15), + 1996: (APR, 4), + 1997: (APR, 22), + 1998: (APR, 11), + 1999: (APR, 1), + 2000: (APR, 20), + 2001: (APR, 8), + 2002: (MAR, 28), + 2003: (APR, 17), + 2004: (APR, 6), + 2005: (APR, 24), + 2006: (APR, 13), + 2007: (APR, 3), + 2008: (APR, 20), + 2009: (APR, 9), + 2010: (MAR, 30), + 2011: (APR, 19), + 2012: (APR, 7), + 2013: (MAR, 26), + 2014: (APR, 15), + 2015: (APR, 4), + 2016: (APR, 23), + 2017: (APR, 11), + 2018: (MAR, 31), + 2019: (APR, 20), + 2020: (APR, 9), + 2021: (MAR, 28), + 2022: (APR, 16), + 2023: (APR, 6), + 2024: (APR, 23), + 2025: (APR, 13), + 2026: (APR, 2), + 2027: (APR, 22), + 2028: (APR, 11), + 2029: (MAR, 31), + 2030: (APR, 18), + 2031: (APR, 8), + 2032: (MAR, 27), + 2033: (APR, 14), + 2034: (APR, 4), + 2035: (APR, 24), + 2036: (APR, 12), + 2037: (MAR, 31), + 2038: (APR, 20), + 2039: (APR, 9), + 2040: (MAR, 29), + 2041: (APR, 16), + 2042: (APR, 5), + 2043: (APR, 25), + 2044: (APR, 12), + 2045: (APR, 2), + 2046: (APR, 21), + 2047: (APR, 11), + 2048: (MAR, 29), + 2049: (APR, 17), + 2050: (APR, 7), + 2051: (MAR, 28), + 2052: (APR, 14), + 2053: (APR, 3), + 2054: (APR, 23), + 2055: (APR, 13), + 2056: (APR, 1), + 2057: (APR, 19), + 2058: (APR, 9), + 2059: (MAR, 29), + 2060: (APR, 15), + 2061: (APR, 5), + 2062: (APR, 25), + 2063: (APR, 14), + 2064: (APR, 1), + 2065: (APR, 21), + 2066: (APR, 10), + 2067: (MAR, 31), + 2068: (APR, 17), + 2069: (APR, 6), + 2070: (MAR, 27), + 2071: (APR, 14), + 2072: (APR, 3), + 2073: (APR, 22), + 2074: (APR, 12), + 2075: (MAR, 31), + 2076: (APR, 18), + 2077: (APR, 8), + 2078: (MAR, 29), + 2079: (APR, 16), + 2080: (APR, 4), + 2081: (APR, 24), + 2082: (APR, 14), + 2083: (APR, 3), + 2084: (APR, 20), + 2085: (APR, 10), + 2086: (MAR, 30), + 2087: (APR, 17), + 2088: (APR, 6), + 2089: (MAR, 26), + 2090: (APR, 15), + 2091: (APR, 3), + 2092: (APR, 22), + 2093: (APR, 11), + 2094: (APR, 1), + 2095: (APR, 19), + 2096: (APR, 7), + 2097: (MAR, 28), + 2098: (APR, 17), + 2099: (APR, 5), + 2100: (APR, 24), + } + + PURIM_DATES = { + 1947: (MAR, 6), + 1948: (MAR, 25), + 1949: (MAR, 15), + 1950: (MAR, 3), + 1951: (MAR, 22), + 1952: (MAR, 11), + 1953: (MAR, 1), + 1954: (MAR, 19), + 1955: (MAR, 8), + 1956: (FEB, 26), + 1957: (MAR, 17), + 1958: (MAR, 6), + 1959: (MAR, 24), + 1960: (MAR, 13), + 1961: (MAR, 2), + 1962: (MAR, 20), + 1963: (MAR, 10), + 1964: (FEB, 27), + 1965: (MAR, 18), + 1966: (MAR, 6), + 1967: (MAR, 26), + 1968: (MAR, 14), + 1969: (MAR, 4), + 1970: (MAR, 22), + 1971: (MAR, 11), + 1972: (FEB, 29), + 1973: (MAR, 18), + 1974: (MAR, 8), + 1975: (FEB, 25), + 1976: (MAR, 16), + 1977: (MAR, 4), + 1978: (MAR, 23), + 1979: (MAR, 13), + 1980: (MAR, 2), + 1981: (MAR, 20), + 1982: (MAR, 9), + 1983: (FEB, 27), + 1984: (MAR, 18), + 1985: (MAR, 7), + 1986: (MAR, 25), + 1987: (MAR, 15), + 1988: (MAR, 3), + 1989: (MAR, 21), + 1990: (MAR, 11), + 1991: (FEB, 28), + 1992: (MAR, 19), + 1993: (MAR, 7), + 1994: (FEB, 25), + 1995: (MAR, 16), + 1996: (MAR, 5), + 1997: (MAR, 23), + 1998: (MAR, 12), + 1999: (MAR, 2), + 2000: (MAR, 21), + 2001: (MAR, 9), + 2002: (FEB, 26), + 2003: (MAR, 18), + 2004: (MAR, 7), + 2005: (MAR, 25), + 2006: (MAR, 14), + 2007: (MAR, 4), + 2008: (MAR, 21), + 2009: (MAR, 10), + 2010: (FEB, 28), + 2011: (MAR, 20), + 2012: (MAR, 8), + 2013: (FEB, 24), + 2014: (MAR, 16), + 2015: (MAR, 5), + 2016: (MAR, 24), + 2017: (MAR, 12), + 2018: (MAR, 1), + 2019: (MAR, 21), + 2020: (MAR, 10), + 2021: (FEB, 26), + 2022: (MAR, 17), + 2023: (MAR, 7), + 2024: (MAR, 24), + 2025: (MAR, 14), + 2026: (MAR, 3), + 2027: (MAR, 23), + 2028: (MAR, 12), + 2029: (MAR, 1), + 2030: (MAR, 19), + 2031: (MAR, 9), + 2032: (FEB, 26), + 2033: (MAR, 15), + 2034: (MAR, 5), + 2035: (MAR, 25), + 2036: (MAR, 13), + 2037: (MAR, 1), + 2038: (MAR, 21), + 2039: (MAR, 10), + 2040: (FEB, 28), + 2041: (MAR, 17), + 2042: (MAR, 6), + 2043: (MAR, 26), + 2044: (MAR, 13), + 2045: (MAR, 3), + 2046: (MAR, 22), + 2047: (MAR, 12), + 2048: (FEB, 28), + 2049: (MAR, 18), + 2050: (MAR, 8), + 2051: (FEB, 26), + 2052: (MAR, 15), + 2053: (MAR, 4), + 2054: (MAR, 24), + 2055: (MAR, 14), + 2056: (MAR, 2), + 2057: (MAR, 20), + 2058: (MAR, 10), + 2059: (FEB, 27), + 2060: (MAR, 16), + 2061: (MAR, 6), + 2062: (MAR, 26), + 2063: (MAR, 15), + 2064: (MAR, 2), + 2065: (MAR, 22), + 2066: (MAR, 11), + 2067: (MAR, 1), + 2068: (MAR, 18), + 2069: (MAR, 7), + 2070: (FEB, 25), + 2071: (MAR, 15), + 2072: (MAR, 4), + 2073: (MAR, 23), + 2074: (MAR, 13), + 2075: (MAR, 1), + 2076: (MAR, 19), + 2077: (MAR, 9), + 2078: (FEB, 27), + 2079: (MAR, 17), + 2080: (MAR, 5), + 2081: (MAR, 25), + 2082: (MAR, 15), + 2083: (MAR, 4), + 2084: (MAR, 21), + 2085: (MAR, 11), + 2086: (FEB, 28), + 2087: (MAR, 18), + 2088: (MAR, 7), + 2089: (FEB, 24), + 2090: (MAR, 16), + 2091: (MAR, 4), + 2092: (MAR, 23), + 2093: (MAR, 12), + 2094: (MAR, 2), + 2095: (MAR, 20), + 2096: (MAR, 8), + 2097: (FEB, 26), + 2098: (MAR, 18), + 2099: (MAR, 6), + 2100: (MAR, 25), + } + + ROSH_HASHANAH_DATES = { + 1947: (SEP, 15), + 1948: (OCT, 4), + 1949: (SEP, 24), + 1950: (SEP, 12), + 1951: (OCT, 1), + 1952: (SEP, 20), + 1953: (SEP, 10), + 1954: (SEP, 28), + 1955: (SEP, 17), + 1956: (SEP, 6), + 1957: (SEP, 26), + 1958: (SEP, 15), + 1959: (OCT, 3), + 1960: (SEP, 22), + 1961: (SEP, 11), + 1962: (SEP, 29), + 1963: (SEP, 19), + 1964: (SEP, 7), + 1965: (SEP, 27), + 1966: (SEP, 15), + 1967: (OCT, 5), + 1968: (SEP, 23), + 1969: (SEP, 13), + 1970: (OCT, 1), + 1971: (SEP, 20), + 1972: (SEP, 9), + 1973: (SEP, 27), + 1974: (SEP, 17), + 1975: (SEP, 6), + 1976: (SEP, 25), + 1977: (SEP, 13), + 1978: (OCT, 2), + 1979: (SEP, 22), + 1980: (SEP, 11), + 1981: (SEP, 29), + 1982: (SEP, 18), + 1983: (SEP, 8), + 1984: (SEP, 27), + 1985: (SEP, 16), + 1986: (OCT, 4), + 1987: (SEP, 24), + 1988: (SEP, 12), + 1989: (SEP, 30), + 1990: (SEP, 20), + 1991: (SEP, 9), + 1992: (SEP, 28), + 1993: (SEP, 16), + 1994: (SEP, 6), + 1995: (SEP, 25), + 1996: (SEP, 14), + 1997: (OCT, 2), + 1998: (SEP, 21), + 1999: (SEP, 11), + 2000: (SEP, 30), + 2001: (SEP, 18), + 2002: (SEP, 7), + 2003: (SEP, 27), + 2004: (SEP, 16), + 2005: (OCT, 4), + 2006: (SEP, 23), + 2007: (SEP, 13), + 2008: (SEP, 30), + 2009: (SEP, 19), + 2010: (SEP, 9), + 2011: (SEP, 29), + 2012: (SEP, 17), + 2013: (SEP, 5), + 2014: (SEP, 25), + 2015: (SEP, 14), + 2016: (OCT, 3), + 2017: (SEP, 21), + 2018: (SEP, 10), + 2019: (SEP, 30), + 2020: (SEP, 19), + 2021: (SEP, 7), + 2022: (SEP, 26), + 2023: (SEP, 16), + 2024: (OCT, 3), + 2025: (SEP, 23), + 2026: (SEP, 12), + 2027: (OCT, 2), + 2028: (SEP, 21), + 2029: (SEP, 10), + 2030: (SEP, 28), + 2031: (SEP, 18), + 2032: (SEP, 6), + 2033: (SEP, 24), + 2034: (SEP, 14), + 2035: (OCT, 4), + 2036: (SEP, 22), + 2037: (SEP, 10), + 2038: (SEP, 30), + 2039: (SEP, 19), + 2040: (SEP, 8), + 2041: (SEP, 26), + 2042: (SEP, 15), + 2043: (OCT, 5), + 2044: (SEP, 22), + 2045: (SEP, 12), + 2046: (OCT, 1), + 2047: (SEP, 21), + 2048: (SEP, 8), + 2049: (SEP, 27), + 2050: (SEP, 17), + 2051: (SEP, 7), + 2052: (SEP, 24), + 2053: (SEP, 13), + 2054: (OCT, 3), + 2055: (SEP, 23), + 2056: (SEP, 11), + 2057: (SEP, 29), + 2058: (SEP, 19), + 2059: (SEP, 8), + 2060: (SEP, 25), + 2061: (SEP, 15), + 2062: (OCT, 5), + 2063: (SEP, 24), + 2064: (SEP, 11), + 2065: (OCT, 1), + 2066: (SEP, 20), + 2067: (SEP, 10), + 2068: (SEP, 27), + 2069: (SEP, 16), + 2070: (SEP, 6), + 2071: (SEP, 24), + 2072: (SEP, 13), + 2073: (OCT, 2), + 2074: (SEP, 22), + 2075: (SEP, 10), + 2076: (SEP, 28), + 2077: (SEP, 18), + 2078: (SEP, 8), + 2079: (SEP, 26), + 2080: (SEP, 14), + 2081: (OCT, 4), + 2082: (SEP, 24), + 2083: (SEP, 13), + 2084: (SEP, 30), + 2085: (SEP, 20), + 2086: (SEP, 9), + 2087: (SEP, 27), + 2088: (SEP, 16), + 2089: (SEP, 5), + 2090: (SEP, 25), + 2091: (SEP, 13), + 2092: (OCT, 2), + 2093: (SEP, 21), + 2094: (SEP, 11), + 2095: (SEP, 29), + 2096: (SEP, 17), + 2097: (SEP, 7), + 2098: (SEP, 27), + 2099: (SEP, 15), + 2100: (OCT, 4), + } + + SHAVUOT_DATES = { + 1947: (MAY, 25), + 1948: (JUN, 13), + 1949: (JUN, 3), + 1950: (MAY, 22), + 1951: (JUN, 10), + 1952: (MAY, 30), + 1953: (MAY, 20), + 1954: (JUN, 7), + 1955: (MAY, 27), + 1956: (MAY, 16), + 1957: (JUN, 5), + 1958: (MAY, 25), + 1959: (JUN, 12), + 1960: (JUN, 1), + 1961: (MAY, 21), + 1962: (JUN, 8), + 1963: (MAY, 29), + 1964: (MAY, 17), + 1965: (JUN, 6), + 1966: (MAY, 25), + 1967: (JUN, 14), + 1968: (JUN, 2), + 1969: (MAY, 23), + 1970: (JUN, 10), + 1971: (MAY, 30), + 1972: (MAY, 19), + 1973: (JUN, 6), + 1974: (MAY, 27), + 1975: (MAY, 16), + 1976: (JUN, 4), + 1977: (MAY, 23), + 1978: (JUN, 11), + 1979: (JUN, 1), + 1980: (MAY, 21), + 1981: (JUN, 8), + 1982: (MAY, 28), + 1983: (MAY, 18), + 1984: (JUN, 6), + 1985: (MAY, 26), + 1986: (JUN, 13), + 1987: (JUN, 3), + 1988: (MAY, 22), + 1989: (JUN, 9), + 1990: (MAY, 30), + 1991: (MAY, 19), + 1992: (JUN, 7), + 1993: (MAY, 26), + 1994: (MAY, 16), + 1995: (JUN, 4), + 1996: (MAY, 24), + 1997: (JUN, 11), + 1998: (MAY, 31), + 1999: (MAY, 21), + 2000: (JUN, 9), + 2001: (MAY, 28), + 2002: (MAY, 17), + 2003: (JUN, 6), + 2004: (MAY, 26), + 2005: (JUN, 13), + 2006: (JUN, 2), + 2007: (MAY, 23), + 2008: (JUN, 9), + 2009: (MAY, 29), + 2010: (MAY, 19), + 2011: (JUN, 8), + 2012: (MAY, 27), + 2013: (MAY, 15), + 2014: (JUN, 4), + 2015: (MAY, 24), + 2016: (JUN, 12), + 2017: (MAY, 31), + 2018: (MAY, 20), + 2019: (JUN, 9), + 2020: (MAY, 29), + 2021: (MAY, 17), + 2022: (JUN, 5), + 2023: (MAY, 26), + 2024: (JUN, 12), + 2025: (JUN, 2), + 2026: (MAY, 22), + 2027: (JUN, 11), + 2028: (MAY, 31), + 2029: (MAY, 20), + 2030: (JUN, 7), + 2031: (MAY, 28), + 2032: (MAY, 16), + 2033: (JUN, 3), + 2034: (MAY, 24), + 2035: (JUN, 13), + 2036: (JUN, 1), + 2037: (MAY, 20), + 2038: (JUN, 9), + 2039: (MAY, 29), + 2040: (MAY, 18), + 2041: (JUN, 5), + 2042: (MAY, 25), + 2043: (JUN, 14), + 2044: (JUN, 1), + 2045: (MAY, 22), + 2046: (JUN, 10), + 2047: (MAY, 31), + 2048: (MAY, 18), + 2049: (JUN, 6), + 2050: (MAY, 27), + 2051: (MAY, 17), + 2052: (JUN, 3), + 2053: (MAY, 23), + 2054: (JUN, 12), + 2055: (JUN, 2), + 2056: (MAY, 21), + 2057: (JUN, 8), + 2058: (MAY, 29), + 2059: (MAY, 18), + 2060: (JUN, 4), + 2061: (MAY, 25), + 2062: (JUN, 14), + 2063: (JUN, 3), + 2064: (MAY, 21), + 2065: (JUN, 10), + 2066: (MAY, 30), + 2067: (MAY, 20), + 2068: (JUN, 6), + 2069: (MAY, 26), + 2070: (MAY, 16), + 2071: (JUN, 3), + 2072: (MAY, 23), + 2073: (JUN, 11), + 2074: (JUN, 1), + 2075: (MAY, 20), + 2076: (JUN, 7), + 2077: (MAY, 28), + 2078: (MAY, 18), + 2079: (JUN, 5), + 2080: (MAY, 24), + 2081: (JUN, 13), + 2082: (JUN, 3), + 2083: (MAY, 23), + 2084: (JUN, 9), + 2085: (MAY, 30), + 2086: (MAY, 19), + 2087: (JUN, 6), + 2088: (MAY, 26), + 2089: (MAY, 15), + 2090: (JUN, 4), + 2091: (MAY, 23), + 2092: (JUN, 11), + 2093: (MAY, 31), + 2094: (MAY, 21), + 2095: (JUN, 8), + 2096: (MAY, 27), + 2097: (MAY, 17), + 2098: (JUN, 6), + 2099: (MAY, 25), + 2100: (JUN, 13), + } + + SUKKOT_DATES = { + 1947: (SEP, 29), + 1948: (OCT, 18), + 1949: (OCT, 8), + 1950: (SEP, 26), + 1951: (OCT, 15), + 1952: (OCT, 4), + 1953: (SEP, 24), + 1954: (OCT, 12), + 1955: (OCT, 1), + 1956: (SEP, 20), + 1957: (OCT, 10), + 1958: (SEP, 29), + 1959: (OCT, 17), + 1960: (OCT, 6), + 1961: (SEP, 25), + 1962: (OCT, 13), + 1963: (OCT, 3), + 1964: (SEP, 21), + 1965: (OCT, 11), + 1966: (SEP, 29), + 1967: (OCT, 19), + 1968: (OCT, 7), + 1969: (SEP, 27), + 1970: (OCT, 15), + 1971: (OCT, 4), + 1972: (SEP, 23), + 1973: (OCT, 11), + 1974: (OCT, 1), + 1975: (SEP, 20), + 1976: (OCT, 9), + 1977: (SEP, 27), + 1978: (OCT, 16), + 1979: (OCT, 6), + 1980: (SEP, 25), + 1981: (OCT, 13), + 1982: (OCT, 2), + 1983: (SEP, 22), + 1984: (OCT, 11), + 1985: (SEP, 30), + 1986: (OCT, 18), + 1987: (OCT, 8), + 1988: (SEP, 26), + 1989: (OCT, 14), + 1990: (OCT, 4), + 1991: (SEP, 23), + 1992: (OCT, 12), + 1993: (SEP, 30), + 1994: (SEP, 20), + 1995: (OCT, 9), + 1996: (SEP, 28), + 1997: (OCT, 16), + 1998: (OCT, 5), + 1999: (SEP, 25), + 2000: (OCT, 14), + 2001: (OCT, 2), + 2002: (SEP, 21), + 2003: (OCT, 11), + 2004: (SEP, 30), + 2005: (OCT, 18), + 2006: (OCT, 7), + 2007: (SEP, 27), + 2008: (OCT, 14), + 2009: (OCT, 3), + 2010: (SEP, 23), + 2011: (OCT, 13), + 2012: (OCT, 1), + 2013: (SEP, 19), + 2014: (OCT, 9), + 2015: (SEP, 28), + 2016: (OCT, 17), + 2017: (OCT, 5), + 2018: (SEP, 24), + 2019: (OCT, 14), + 2020: (OCT, 3), + 2021: (SEP, 21), + 2022: (OCT, 10), + 2023: (SEP, 30), + 2024: (OCT, 17), + 2025: (OCT, 7), + 2026: (SEP, 26), + 2027: (OCT, 16), + 2028: (OCT, 5), + 2029: (SEP, 24), + 2030: (OCT, 12), + 2031: (OCT, 2), + 2032: (SEP, 20), + 2033: (OCT, 8), + 2034: (SEP, 28), + 2035: (OCT, 18), + 2036: (OCT, 6), + 2037: (SEP, 24), + 2038: (OCT, 14), + 2039: (OCT, 3), + 2040: (SEP, 22), + 2041: (OCT, 10), + 2042: (SEP, 29), + 2043: (OCT, 19), + 2044: (OCT, 6), + 2045: (SEP, 26), + 2046: (OCT, 15), + 2047: (OCT, 5), + 2048: (SEP, 22), + 2049: (OCT, 11), + 2050: (OCT, 1), + 2051: (SEP, 21), + 2052: (OCT, 8), + 2053: (SEP, 27), + 2054: (OCT, 17), + 2055: (OCT, 7), + 2056: (SEP, 25), + 2057: (OCT, 13), + 2058: (OCT, 3), + 2059: (SEP, 22), + 2060: (OCT, 9), + 2061: (SEP, 29), + 2062: (OCT, 19), + 2063: (OCT, 8), + 2064: (SEP, 25), + 2065: (OCT, 15), + 2066: (OCT, 4), + 2067: (SEP, 24), + 2068: (OCT, 11), + 2069: (SEP, 30), + 2070: (SEP, 20), + 2071: (OCT, 8), + 2072: (SEP, 27), + 2073: (OCT, 16), + 2074: (OCT, 6), + 2075: (SEP, 24), + 2076: (OCT, 12), + 2077: (OCT, 2), + 2078: (SEP, 22), + 2079: (OCT, 10), + 2080: (SEP, 28), + 2081: (OCT, 18), + 2082: (OCT, 8), + 2083: (SEP, 27), + 2084: (OCT, 14), + 2085: (OCT, 4), + 2086: (SEP, 23), + 2087: (OCT, 11), + 2088: (SEP, 30), + 2089: (SEP, 19), + 2090: (OCT, 9), + 2091: (SEP, 27), + 2092: (OCT, 16), + 2093: (OCT, 5), + 2094: (SEP, 25), + 2095: (OCT, 13), + 2096: (OCT, 1), + 2097: (SEP, 21), + 2098: (OCT, 11), + 2099: (SEP, 29), + 2100: (OCT, 18), + } + + TISHA_BAV_DATES = { + 1947: (JUL, 26), + 1948: (AUG, 14), + 1949: (AUG, 4), + 1950: (JUL, 23), + 1951: (AUG, 11), + 1952: (JUL, 31), + 1953: (JUL, 21), + 1954: (AUG, 8), + 1955: (JUL, 28), + 1956: (JUL, 17), + 1957: (AUG, 6), + 1958: (JUL, 26), + 1959: (AUG, 13), + 1960: (AUG, 2), + 1961: (JUL, 22), + 1962: (AUG, 9), + 1963: (JUL, 30), + 1964: (JUL, 18), + 1965: (AUG, 7), + 1966: (JUL, 26), + 1967: (AUG, 15), + 1968: (AUG, 3), + 1969: (JUL, 24), + 1970: (AUG, 11), + 1971: (JUL, 31), + 1972: (JUL, 20), + 1973: (AUG, 7), + 1974: (JUL, 28), + 1975: (JUL, 17), + 1976: (AUG, 5), + 1977: (JUL, 24), + 1978: (AUG, 12), + 1979: (AUG, 2), + 1980: (JUL, 22), + 1981: (AUG, 9), + 1982: (JUL, 29), + 1983: (JUL, 19), + 1984: (AUG, 7), + 1985: (JUL, 27), + 1986: (AUG, 14), + 1987: (AUG, 4), + 1988: (JUL, 23), + 1989: (AUG, 10), + 1990: (JUL, 31), + 1991: (JUL, 20), + 1992: (AUG, 8), + 1993: (JUL, 27), + 1994: (JUL, 17), + 1995: (AUG, 5), + 1996: (JUL, 25), + 1997: (AUG, 12), + 1998: (AUG, 1), + 1999: (JUL, 22), + 2000: (AUG, 10), + 2001: (JUL, 29), + 2002: (JUL, 18), + 2003: (AUG, 7), + 2004: (JUL, 27), + 2005: (AUG, 14), + 2006: (AUG, 3), + 2007: (JUL, 24), + 2008: (AUG, 10), + 2009: (JUL, 30), + 2010: (JUL, 20), + 2011: (AUG, 9), + 2012: (JUL, 28), + 2013: (JUL, 16), + 2014: (AUG, 5), + 2015: (JUL, 25), + 2016: (AUG, 13), + 2017: (AUG, 1), + 2018: (JUL, 21), + 2019: (AUG, 10), + 2020: (JUL, 30), + 2021: (JUL, 18), + 2022: (AUG, 6), + 2023: (JUL, 27), + 2024: (AUG, 13), + 2025: (AUG, 3), + 2026: (JUL, 23), + 2027: (AUG, 12), + 2028: (AUG, 1), + 2029: (JUL, 21), + 2030: (AUG, 8), + 2031: (JUL, 29), + 2032: (JUL, 17), + 2033: (AUG, 4), + 2034: (JUL, 25), + 2035: (AUG, 14), + 2036: (AUG, 2), + 2037: (JUL, 21), + 2038: (AUG, 10), + 2039: (JUL, 30), + 2040: (JUL, 19), + 2041: (AUG, 6), + 2042: (JUL, 26), + 2043: (AUG, 15), + 2044: (AUG, 2), + 2045: (JUL, 23), + 2046: (AUG, 11), + 2047: (AUG, 1), + 2048: (JUL, 19), + 2049: (AUG, 7), + 2050: (JUL, 28), + 2051: (JUL, 18), + 2052: (AUG, 4), + 2053: (JUL, 24), + 2054: (AUG, 13), + 2055: (AUG, 3), + 2056: (JUL, 22), + 2057: (AUG, 9), + 2058: (JUL, 30), + 2059: (JUL, 19), + 2060: (AUG, 5), + 2061: (JUL, 26), + 2062: (AUG, 15), + 2063: (AUG, 4), + 2064: (JUL, 22), + 2065: (AUG, 11), + 2066: (JUL, 31), + 2067: (JUL, 21), + 2068: (AUG, 7), + 2069: (JUL, 27), + 2070: (JUL, 17), + 2071: (AUG, 4), + 2072: (JUL, 24), + 2073: (AUG, 12), + 2074: (AUG, 2), + 2075: (JUL, 21), + 2076: (AUG, 8), + 2077: (JUL, 29), + 2078: (JUL, 19), + 2079: (AUG, 6), + 2080: (JUL, 25), + 2081: (AUG, 14), + 2082: (AUG, 4), + 2083: (JUL, 24), + 2084: (AUG, 10), + 2085: (JUL, 31), + 2086: (JUL, 20), + 2087: (AUG, 7), + 2088: (JUL, 27), + 2089: (JUL, 16), + 2090: (AUG, 5), + 2091: (JUL, 24), + 2092: (AUG, 12), + 2093: (AUG, 1), + 2094: (JUL, 22), + 2095: (AUG, 9), + 2096: (JUL, 28), + 2097: (JUL, 18), + 2098: (AUG, 7), + 2099: (JUL, 26), + 2100: (AUG, 14), + } + + YOM_KIPPUR_DATES = { + 1947: (SEP, 24), + 1948: (OCT, 13), + 1949: (OCT, 3), + 1950: (SEP, 21), + 1951: (OCT, 10), + 1952: (SEP, 29), + 1953: (SEP, 19), + 1954: (OCT, 7), + 1955: (SEP, 26), + 1956: (SEP, 15), + 1957: (OCT, 5), + 1958: (SEP, 24), + 1959: (OCT, 12), + 1960: (OCT, 1), + 1961: (SEP, 20), + 1962: (OCT, 8), + 1963: (SEP, 28), + 1964: (SEP, 16), + 1965: (OCT, 6), + 1966: (SEP, 24), + 1967: (OCT, 14), + 1968: (OCT, 2), + 1969: (SEP, 22), + 1970: (OCT, 10), + 1971: (SEP, 29), + 1972: (SEP, 18), + 1973: (OCT, 6), + 1974: (SEP, 26), + 1975: (SEP, 15), + 1976: (OCT, 4), + 1977: (SEP, 22), + 1978: (OCT, 11), + 1979: (OCT, 1), + 1980: (SEP, 20), + 1981: (OCT, 8), + 1982: (SEP, 27), + 1983: (SEP, 17), + 1984: (OCT, 6), + 1985: (SEP, 25), + 1986: (OCT, 13), + 1987: (OCT, 3), + 1988: (SEP, 21), + 1989: (OCT, 9), + 1990: (SEP, 29), + 1991: (SEP, 18), + 1992: (OCT, 7), + 1993: (SEP, 25), + 1994: (SEP, 15), + 1995: (OCT, 4), + 1996: (SEP, 23), + 1997: (OCT, 11), + 1998: (SEP, 30), + 1999: (SEP, 20), + 2000: (OCT, 9), + 2001: (SEP, 27), + 2002: (SEP, 16), + 2003: (OCT, 6), + 2004: (SEP, 25), + 2005: (OCT, 13), + 2006: (OCT, 2), + 2007: (SEP, 22), + 2008: (OCT, 9), + 2009: (SEP, 28), + 2010: (SEP, 18), + 2011: (OCT, 8), + 2012: (SEP, 26), + 2013: (SEP, 14), + 2014: (OCT, 4), + 2015: (SEP, 23), + 2016: (OCT, 12), + 2017: (SEP, 30), + 2018: (SEP, 19), + 2019: (OCT, 9), + 2020: (SEP, 28), + 2021: (SEP, 16), + 2022: (OCT, 5), + 2023: (SEP, 25), + 2024: (OCT, 12), + 2025: (OCT, 2), + 2026: (SEP, 21), + 2027: (OCT, 11), + 2028: (SEP, 30), + 2029: (SEP, 19), + 2030: (OCT, 7), + 2031: (SEP, 27), + 2032: (SEP, 15), + 2033: (OCT, 3), + 2034: (SEP, 23), + 2035: (OCT, 13), + 2036: (OCT, 1), + 2037: (SEP, 19), + 2038: (OCT, 9), + 2039: (SEP, 28), + 2040: (SEP, 17), + 2041: (OCT, 5), + 2042: (SEP, 24), + 2043: (OCT, 14), + 2044: (OCT, 1), + 2045: (SEP, 21), + 2046: (OCT, 10), + 2047: (SEP, 30), + 2048: (SEP, 17), + 2049: (OCT, 6), + 2050: (SEP, 26), + 2051: (SEP, 16), + 2052: (OCT, 3), + 2053: (SEP, 22), + 2054: (OCT, 12), + 2055: (OCT, 2), + 2056: (SEP, 20), + 2057: (OCT, 8), + 2058: (SEP, 28), + 2059: (SEP, 17), + 2060: (OCT, 4), + 2061: (SEP, 24), + 2062: (OCT, 14), + 2063: (OCT, 3), + 2064: (SEP, 20), + 2065: (OCT, 10), + 2066: (SEP, 29), + 2067: (SEP, 19), + 2068: (OCT, 6), + 2069: (SEP, 25), + 2070: (SEP, 15), + 2071: (OCT, 3), + 2072: (SEP, 22), + 2073: (OCT, 11), + 2074: (OCT, 1), + 2075: (SEP, 19), + 2076: (OCT, 7), + 2077: (SEP, 27), + 2078: (SEP, 17), + 2079: (OCT, 5), + 2080: (SEP, 23), + 2081: (OCT, 13), + 2082: (OCT, 3), + 2083: (SEP, 22), + 2084: (OCT, 9), + 2085: (SEP, 29), + 2086: (SEP, 18), + 2087: (OCT, 6), + 2088: (SEP, 25), + 2089: (SEP, 14), + 2090: (OCT, 4), + 2091: (SEP, 22), + 2092: (OCT, 11), + 2093: (SEP, 30), + 2094: (SEP, 20), + 2095: (OCT, 8), + 2096: (SEP, 26), + 2097: (SEP, 16), + 2098: (OCT, 6), + 2099: (SEP, 24), + 2100: (OCT, 13), + } + + def _get_holiday(self, holiday: str, year: int) -> Optional[date]: + dt = getattr(self, f"{holiday}_DATES", {}).get(year, ()) + return date(year, *dt) if dt else None + + def hanukkah_date(self, year: int) -> set[Optional[date]]: + return {self._get_holiday(HANUKKAH, y) for y in (year - 1, year)} + + def israel_independence_date(self, year: int) -> Optional[date]: + return self._get_holiday(INDEPENDENCE_DAY, year) + + def lag_baomer_date(self, year: int) -> Optional[date]: + return self._get_holiday(LAG_BAOMER, year) + + def passover_date(self, year: int) -> Optional[date]: + return self._get_holiday(PASSOVER, year) + + def purim_date(self, year: int) -> Optional[date]: + return self._get_holiday(PURIM, year) + + def rosh_hashanah_date(self, year: int) -> Optional[date]: + return self._get_holiday(ROSH_HASHANAH, year) + + def shavuot_date(self, year: int) -> Optional[date]: + return self._get_holiday(SHAVUOT, year) + + def sukkot_date(self, year: int) -> Optional[date]: + return self._get_holiday(SUKKOT, year) + + def tisha_bav_date(self, year: int) -> Optional[date]: + return self._get_holiday(TISHA_BAV, year) + + def yom_kippur_date(self, year: int) -> Optional[date]: + return self._get_holiday(YOM_KIPPUR, year) diff --git a/.venv/lib/python3.12/site-packages/holidays/calendars/hindu.py b/.venv/lib/python3.12/site-packages/holidays/calendars/hindu.py new file mode 100644 index 00000000..58b2cb39 --- /dev/null +++ b/.venv/lib/python3.12/site-packages/holidays/calendars/hindu.py @@ -0,0 +1,1494 @@ +# holidays +# -------- +# A fast, efficient Python library for generating country, province and state +# specific sets of holidays on the fly. It aims to make determining whether a +# specific date is a holiday as fast and flexible as possible. +# +# Authors: Vacanza Team and individual contributors (see CONTRIBUTORS file) +# dr-prodigy (c) 2017-2023 +# ryanss (c) 2014-2017 +# Website: https://github.com/vacanza/holidays +# License: MIT (see LICENSE file) + +from collections.abc import Iterable +from datetime import date +from typing import Optional + +from holidays.calendars.custom import _CustomCalendar +from holidays.calendars.gregorian import JAN, FEB, MAR, APR, MAY, AUG, SEP, OCT, NOV, DEC +from holidays.helpers import _normalize_tuple + +BUDDHA_PURNIMA = "BUDDHA_PURNIMA" +CHHATH_PUJA = "CHHATH_PUJA" +DIWALI = "DIWALI" +DIWALI_INDIA = "DIWALI_INDIA" +DUSSEHRA = "DUSSEHRA" +GANESH_CHATURTHI = "GANESH_CHATURTHI" +GOVARDHAN_PUJA = "GOVARDHAN_PUJA" +GUDI_PADWA = "GUDI_PADWA" +GURU_GOBIND_SINGH_JAYANTI = "GURU_GOBIND_SINGH_JAYANTI" +GURU_NANAK_JAYANTI = "GURU_NANAK_JAYANTI" +GYALPO_LOSAR = "GYALPO_LOSAR" +HOLI = "HOLI" +JANMASHTAMI = "JANMASHTAMI" +MAHA_ASHTAMI = "MAHA_ASHTAMI" +MAHA_NAVAMI = "MAHA_NAVAMI" +MAHA_SHIVARATRI = "MAHA_SHIVARATRI" +MAHAVIR_JAYANTI = "MAHAVIR_JAYANTI" +MAKAR_SANKRANTI = "MAKAR_SANKRANTI" +ONAM = "ONAM" +PONGAL = "PONGAL" +RAKSHA_BANDHAN = "RAKSHA_BANDHAN" +RAM_NAVAMI = "RAM_NAVAMI" +SHARAD_NAVRATRI = "SHARAD_NAVRATRI" +SONAM_LOSAR = "SONAM_LOSAR" +TAMU_LOSAR = "TAMU_LOSAR" +THAIPUSAM = "THAIPUSAM" +VAISAKHI = "VAISAKHI" + + +class _HinduLunisolar: + # https://web.archive.org/web/20240804044401/https://www.timeanddate.com/holidays/india/buddha-purnima + BUDDHA_PURNIMA_DATES = { + 2001: (APR, 30), + 2002: (MAY, 19), + 2003: (MAY, 8), + 2004: (MAY, 26), + 2005: (MAY, 23), + 2006: (MAY, 13), + 2007: (MAY, 2), + 2008: (MAY, 20), + 2009: (MAY, 8), + 2010: (MAY, 27), + 2011: (MAY, 17), + 2012: (MAY, 6), + 2013: (MAY, 25), + 2014: (MAY, 14), + 2015: (MAY, 4), + 2016: (MAY, 21), + 2017: (MAY, 10), + 2018: (APR, 30), + 2019: (MAY, 18), + 2020: (MAY, 7), + 2021: (MAY, 26), + 2022: (MAY, 16), + 2023: (MAY, 5), + 2024: (MAY, 23), + 2025: (MAY, 12), + 2026: (MAY, 1), + 2027: (MAY, 20), + 2028: (MAY, 8), + 2029: (MAY, 27), + 2030: (MAY, 17), + 2031: (MAY, 7), + 2032: (MAY, 25), + 2033: (MAY, 14), + 2034: (MAY, 3), + 2035: (MAY, 22), + } + + # https://web.archive.org/web/20250404174934/https://www.timeanddate.com/holidays/india/chhat-puja + CHHATH_PUJA_DATES = { + 2001: (NOV, 21), + 2002: (NOV, 10), + 2003: (OCT, 30), + 2004: (NOV, 17), + 2005: (NOV, 7), + 2006: (OCT, 28), + 2007: (NOV, 16), + 2008: (NOV, 4), + 2009: (OCT, 24), + 2010: (NOV, 11), + 2011: (NOV, 1), + 2012: (NOV, 19), + 2013: (NOV, 8), + 2014: (OCT, 29), + 2015: (NOV, 17), + 2016: (NOV, 6), + 2017: (OCT, 26), + 2018: (NOV, 13), + 2019: (NOV, 2), + 2020: (NOV, 20), + 2021: (NOV, 10), + 2022: (OCT, 30), + 2023: (NOV, 19), + 2024: (NOV, 7), + 2025: (OCT, 28), + 2026: (NOV, 15), + 2027: (NOV, 4), + 2028: (OCT, 23), + 2029: (NOV, 11), + 2030: (NOV, 1), + 2031: (NOV, 20), + 2032: (NOV, 9), + 2033: (OCT, 29), + 2034: (NOV, 17), + 2035: (NOV, 6), + } + + DIWALI_DATES = { + 1901: (NOV, 9), + 1902: (OCT, 29), + 1903: (NOV, 17), + 1904: (NOV, 5), + 1905: (OCT, 26), + 1906: (NOV, 14), + 1907: (NOV, 4), + 1908: (OCT, 23), + 1909: (NOV, 11), + 1910: (OCT, 31), + 1911: (NOV, 19), + 1912: (NOV, 7), + 1913: (OCT, 27), + 1914: (NOV, 16), + 1915: (NOV, 5), + 1916: (OCT, 25), + 1917: (NOV, 13), + 1918: (NOV, 2), + 1919: (NOV, 20), + 1920: (NOV, 9), + 1921: (OCT, 29), + 1922: (NOV, 17), + 1923: (NOV, 6), + 1924: (OCT, 26), + 1925: (NOV, 14), + 1926: (NOV, 3), + 1927: (OCT, 23), + 1928: (NOV, 10), + 1929: (OCT, 30), + 1930: (NOV, 18), + 1931: (NOV, 8), + 1932: (OCT, 27), + 1933: (NOV, 16), + 1934: (NOV, 5), + 1935: (OCT, 25), + 1936: (NOV, 12), + 1937: (NOV, 1), + 1938: (NOV, 20), + 1939: (NOV, 9), + 1940: (OCT, 29), + 1941: (NOV, 17), + 1942: (NOV, 6), + 1943: (OCT, 27), + 1944: (NOV, 14), + 1945: (NOV, 3), + 1946: (OCT, 23), + 1947: (NOV, 11), + 1948: (OCT, 30), + 1949: (NOV, 18), + 1950: (NOV, 8), + 1951: (OCT, 28), + 1952: (NOV, 15), + 1953: (NOV, 5), + 1954: (OCT, 25), + 1955: (NOV, 12), + 1956: (NOV, 1), + 1957: (NOV, 20), + 1958: (NOV, 9), + 1959: (OCT, 30), + 1960: (NOV, 17), + 1961: (NOV, 6), + 1962: (OCT, 26), + 1963: (NOV, 14), + 1964: (NOV, 2), + 1965: (OCT, 22), + 1966: (NOV, 10), + 1967: (OCT, 31), + 1968: (NOV, 18), + 1969: (NOV, 8), + 1970: (OCT, 28), + 1971: (NOV, 16), + 1972: (NOV, 4), + 1973: (OCT, 24), + 1974: (NOV, 12), + 1975: (NOV, 1), + 1976: (NOV, 19), + 1977: (NOV, 9), + 1978: (OCT, 30), + 1979: (NOV, 18), + 1980: (NOV, 6), + 1981: (OCT, 26), + 1982: (NOV, 13), + 1983: (NOV, 3), + 1984: (OCT, 22), + 1985: (NOV, 10), + 1986: (OCT, 31), + 1987: (NOV, 19), + 1988: (NOV, 7), + 1989: (OCT, 27), + 1990: (NOV, 15), + 1991: (NOV, 4), + 1992: (OCT, 24), + 1993: (NOV, 12), + 1994: (NOV, 1), + 1995: (NOV, 20), + 1996: (NOV, 9), + 1997: (OCT, 29), + 1998: (NOV, 17), + 1999: (NOV, 6), + 2000: (OCT, 25), + 2001: (NOV, 13), + 2002: (NOV, 3), + 2003: (OCT, 23), + 2004: (NOV, 10), + 2005: (OCT, 31), + 2006: (NOV, 19), + 2007: (NOV, 8), + 2008: (OCT, 27), + 2009: (NOV, 15), + 2010: (NOV, 4), + 2011: (OCT, 25), + 2012: (NOV, 12), + 2013: (NOV, 1), + 2014: (NOV, 20), + 2015: (NOV, 10), + 2016: (OCT, 29), + 2017: (NOV, 16), + 2018: (NOV, 6), + 2019: (OCT, 26), + 2020: (NOV, 13), + 2021: (NOV, 3), + 2022: (OCT, 23), + 2023: (NOV, 11), + 2024: (OCT, 30), + 2025: (NOV, 18), + 2026: (NOV, 7), + 2027: (OCT, 27), + 2028: (NOV, 14), + 2029: (NOV, 4), + 2030: (OCT, 25), + 2031: (NOV, 13), + 2032: (NOV, 1), + 2033: (OCT, 21), + 2034: (NOV, 9), + 2035: (OCT, 29), + 2036: (NOV, 16), + 2037: (NOV, 5), + 2038: (OCT, 26), + 2039: (NOV, 14), + 2040: (NOV, 3), + 2041: (OCT, 23), + 2042: (NOV, 11), + 2043: (OCT, 31), + 2044: (NOV, 17), + 2045: (NOV, 7), + 2046: (OCT, 27), + 2047: (NOV, 15), + 2048: (NOV, 4), + 2049: (OCT, 25), + 2050: (NOV, 12), + 2051: (NOV, 1), + 2052: (NOV, 19), + 2053: (NOV, 8), + 2054: (OCT, 29), + 2055: (NOV, 17), + 2056: (NOV, 5), + 2057: (OCT, 26), + 2058: (NOV, 14), + 2059: (NOV, 3), + 2060: (OCT, 22), + 2061: (NOV, 10), + 2062: (OCT, 30), + 2063: (NOV, 18), + 2064: (NOV, 7), + 2065: (OCT, 27), + 2066: (NOV, 15), + 2067: (NOV, 5), + 2068: (OCT, 24), + 2069: (NOV, 12), + 2070: (NOV, 1), + 2071: (NOV, 20), + 2072: (NOV, 8), + 2073: (OCT, 29), + 2074: (NOV, 17), + 2075: (NOV, 6), + 2076: (OCT, 26), + 2077: (NOV, 14), + 2078: (NOV, 3), + 2079: (OCT, 23), + 2080: (NOV, 9), + 2081: (OCT, 30), + 2082: (NOV, 18), + 2083: (NOV, 8), + 2084: (OCT, 27), + 2085: (NOV, 15), + 2086: (NOV, 4), + 2087: (OCT, 24), + 2088: (NOV, 11), + 2089: (OCT, 31), + 2090: (NOV, 19), + 2091: (NOV, 9), + 2092: (OCT, 29), + 2093: (NOV, 17), + 2094: (NOV, 6), + 2095: (OCT, 26), + 2096: (NOV, 13), + 2097: (NOV, 2), + 2098: (OCT, 22), + 2099: (NOV, 10), + 2100: (OCT, 31), + } + + # https://web.archive.org/web/20250118190944/https://www.timeanddate.com/holidays/india/diwali + DIWALI_INDIA_DATES = { + 2001: (NOV, 14), + 2002: (NOV, 4), + 2003: (OCT, 25), + 2004: (NOV, 12), + 2005: (NOV, 1), + 2006: (OCT, 21), + 2007: (NOV, 9), + 2008: (OCT, 28), + 2009: (OCT, 17), + 2010: (NOV, 5), + 2011: (OCT, 26), + 2012: (NOV, 13), + 2013: (NOV, 3), + 2014: (OCT, 23), + 2015: (NOV, 11), + 2016: (OCT, 30), + 2017: (OCT, 19), + 2018: (NOV, 7), + 2019: (OCT, 27), + 2020: (NOV, 14), + 2021: (NOV, 4), + 2022: (OCT, 24), + 2023: (NOV, 12), + 2024: (OCT, 31), + 2025: (OCT, 20), + 2026: (NOV, 8), + 2027: (OCT, 29), + 2028: (OCT, 17), + 2029: (NOV, 5), + 2030: (OCT, 26), + 2031: (NOV, 14), + 2032: (NOV, 2), + 2033: (OCT, 22), + 2034: (NOV, 10), + 2035: (OCT, 30), + } + + # https://web.archive.org/web/20250118183534/https://www.timeanddate.com/holidays/india/dussehra + DUSSEHRA_DATES = { + 2001: (OCT, 26), + 2002: (OCT, 15), + 2003: (OCT, 5), + 2004: (OCT, 22), + 2005: (OCT, 12), + 2006: (OCT, 2), + 2007: (OCT, 21), + 2008: (OCT, 9), + 2009: (SEP, 28), + 2010: (OCT, 17), + 2011: (OCT, 6), + 2012: (OCT, 24), + 2013: (OCT, 13), + 2014: (OCT, 3), + 2015: (OCT, 22), + 2016: (OCT, 11), + 2017: (SEP, 30), + 2018: (OCT, 19), + 2019: (OCT, 8), + 2020: (OCT, 25), + 2021: (OCT, 15), + 2022: (OCT, 5), + 2023: (OCT, 24), + 2024: (OCT, 12), + 2025: (OCT, 2), + 2026: (OCT, 20), + 2027: (OCT, 9), + 2028: (SEP, 27), + 2029: (OCT, 16), + 2030: (OCT, 6), + 2031: (OCT, 25), + 2032: (OCT, 14), + 2033: (OCT, 3), + 2034: (OCT, 22), + 2035: (OCT, 11), + } + + # https://web.archive.org/web/20250219062212/https://www.timeanddate.com/holidays/india/ganesh-chaturthi + GANESH_CHATURTHI_DATES = { + 2001: (AUG, 22), + 2002: (SEP, 10), + 2003: (AUG, 31), + 2004: (SEP, 18), + 2005: (SEP, 7), + 2006: (AUG, 27), + 2007: (SEP, 15), + 2008: (SEP, 3), + 2009: (AUG, 23), + 2010: (SEP, 11), + 2011: (SEP, 1), + 2012: (SEP, 19), + 2013: (SEP, 9), + 2014: (AUG, 29), + 2015: (SEP, 17), + 2016: (SEP, 5), + 2017: (AUG, 25), + 2018: (SEP, 13), + 2019: (SEP, 2), + 2020: (AUG, 22), + 2021: (SEP, 10), + 2022: (AUG, 31), + 2023: (SEP, 19), + 2024: (SEP, 7), + 2025: (AUG, 27), + 2026: (SEP, 14), + 2027: (SEP, 4), + 2028: (AUG, 23), + 2029: (SEP, 11), + 2030: (SEP, 1), + 2031: (SEP, 20), + 2032: (SEP, 8), + 2033: (AUG, 28), + 2034: (SEP, 16), + 2035: (SEP, 5), + } + + # https://web.archive.org/web/20240917162551/https://www.timeanddate.com/holidays/india/govardhan-puja + GOVARDHAN_PUJA_DATES = { + 2001: (NOV, 15), + 2002: (NOV, 5), + 2003: (OCT, 26), + 2004: (NOV, 13), + 2005: (NOV, 2), + 2006: (OCT, 22), + 2007: (NOV, 10), + 2008: (OCT, 29), + 2009: (OCT, 18), + 2010: (NOV, 6), + 2011: (OCT, 27), + 2012: (NOV, 14), + 2013: (NOV, 4), + 2014: (OCT, 24), + 2015: (NOV, 12), + 2016: (OCT, 31), + 2017: (OCT, 20), + 2018: (NOV, 8), + 2019: (OCT, 28), + 2020: (NOV, 15), + 2021: (NOV, 5), + 2022: (OCT, 25), + 2023: (NOV, 13), + 2024: (NOV, 2), + 2025: (OCT, 22), + 2026: (NOV, 10), + 2027: (OCT, 30), + 2028: (OCT, 18), + 2029: (NOV, 6), + 2030: (OCT, 27), + 2031: (NOV, 15), + 2032: (NOV, 3), + 2033: (OCT, 23), + 2034: (NOV, 11), + 2035: (OCT, 31), + } + + # https://web.archive.org/web/20250331230057/https://www.timeanddate.com/holidays/india/gudi-padwa + GUDI_PADWA_DATES = { + 2001: (MAR, 26), + 2002: (APR, 13), + 2003: (APR, 2), + 2004: (MAR, 21), + 2005: (APR, 9), + 2006: (MAR, 30), + 2007: (MAR, 19), + 2008: (APR, 6), + 2009: (MAR, 27), + 2010: (MAR, 16), + 2011: (APR, 4), + 2012: (MAR, 23), + 2013: (APR, 11), + 2014: (MAR, 31), + 2015: (MAR, 21), + 2016: (APR, 8), + 2017: (MAR, 28), + 2018: (MAR, 18), + 2019: (APR, 6), + 2020: (MAR, 25), + 2021: (APR, 13), + 2022: (APR, 2), + 2023: (MAR, 22), + 2024: (APR, 9), + 2025: (MAR, 30), + 2026: (MAR, 19), + 2027: (APR, 7), + 2028: (MAR, 27), + 2029: (APR, 14), + 2030: (APR, 3), + 2031: (MAR, 24), + 2032: (APR, 11), + 2033: (MAR, 31), + 2034: (MAR, 21), + 2035: (APR, 9), + } + + # https://web.archive.org/web/20241231181629/https://www.timeanddate.com/holidays/india/guru-govind-singh-jayanti + GURU_GOBIND_SINGH_JAYANTI_DATES = { + 2001: (JAN, 2), + 2002: (JAN, 21), + 2003: (DEC, 29), + 2004: (NOV, 20), + 2005: (JAN, 5), + 2006: (JAN, 5), + 2007: (JAN, 5), + 2008: (JAN, 5), + 2009: (JAN, 5), + 2010: (JAN, 5), + 2011: (JAN, 5), + 2012: (JAN, 5), + 2013: (JAN, 18), + 2014: (JAN, 7), + 2015: (JAN, 5), + 2016: (JAN, 16), + 2017: ((JAN, 5), (DEC, 25)), + 2019: (JAN, 13), + 2020: (JAN, 2), + 2021: (JAN, 20), + 2022: ((JAN, 9), (DEC, 29)), + 2024: (JAN, 17), + 2025: ((JAN, 6), (DEC, 27)), + 2027: (JAN, 15), + 2028: (JAN, 4), + 2029: (JAN, 15), + 2030: ((JAN, 10), (DEC, 31)), + 2032: (JAN, 18), + 2033: (JAN, 7), + 2034: (JAN, 17), + 2035: (JAN, 16), + } + + # https://web.archive.org/web/20240521074207/https://www.timeanddate.com/holidays/india/guru-nanak-jayanti + GURU_NANAK_JAYANTI_DATES = { + 2001: (NOV, 30), + 2002: (NOV, 19), + 2003: (NOV, 8), + 2004: (NOV, 26), + 2005: (NOV, 15), + 2006: (NOV, 5), + 2007: (NOV, 24), + 2008: (NOV, 13), + 2009: (NOV, 2), + 2010: (NOV, 21), + 2011: (NOV, 10), + 2012: (NOV, 28), + 2013: (NOV, 17), + 2014: (NOV, 6), + 2015: (NOV, 25), + 2016: (NOV, 14), + 2017: (NOV, 4), + 2018: (NOV, 23), + 2019: (NOV, 12), + 2020: (NOV, 30), + 2021: (NOV, 19), + 2022: (NOV, 8), + 2023: (NOV, 27), + 2024: (NOV, 15), + 2025: (NOV, 5), + 2027: (NOV, 14), + 2028: (NOV, 2), + 2029: (NOV, 21), + 2030: (NOV, 10), + 2031: (NOV, 28), + 2032: (NOV, 17), + 2033: (NOV, 6), + 2034: (NOV, 25), + 2035: (NOV, 15), + } + + # https://web.archive.org/web/20240814073838/https://www.timeanddate.com/holidays/nepal/gyalpo-losar + # https://web.archive.org/web/20250322000610/https://www.ashesh.com.np/nepali-calendar/ + GYALPO_LOSAR_DATES = { + 2010: (FEB, 13), + 2011: (MAR, 5), + 2012: (FEB, 22), + 2013: (MAR, 12), + 2014: (MAR, 2), + 2015: (FEB, 19), + 2016: (MAR, 9), + 2017: (FEB, 27), + 2018: (FEB, 16), + 2019: (MAR, 7), + 2020: (FEB, 24), + 2021: (MAR, 14), + 2022: (MAR, 3), + 2023: (FEB, 21), + 2024: (MAR, 11), + 2025: (FEB, 28), + 2026: (FEB, 18), + 2027: (FEB, 7), + 2028: (FEB, 26), + 2029: (FEB, 14), + 2030: (MAR, 5), + 2031: (FEB, 22), + 2032: (FEB, 12), + 2033: (MAR, 2), + 2034: (FEB, 19), + 2035: (FEB, 9), + } + + # https://web.archive.org/web/20250410002117/https://www.timeanddate.com/holidays/india/holi + HOLI_DATES = { + 2001: (MAR, 10), + 2002: (MAR, 29), + 2003: (MAR, 18), + 2004: (MAR, 7), + 2005: (MAR, 26), + 2006: (MAR, 15), + 2007: (MAR, 4), + 2008: (MAR, 22), + 2009: (MAR, 11), + 2010: (MAR, 1), + 2011: (MAR, 20), + 2012: (MAR, 8), + 2013: (MAR, 27), + 2014: (MAR, 17), + 2015: (MAR, 6), + 2016: (MAR, 24), + 2017: (MAR, 13), + 2018: (MAR, 2), + 2019: (MAR, 21), + 2020: (MAR, 10), + 2021: (MAR, 29), + 2022: (MAR, 18), + 2023: (MAR, 8), + 2024: (MAR, 25), + 2025: (MAR, 14), + 2026: (MAR, 4), + 2027: (MAR, 22), + 2028: (MAR, 11), + 2029: (MAR, 1), + 2030: (MAR, 20), + 2031: (MAR, 9), + 2032: (MAR, 27), + 2033: (MAR, 16), + 2034: (MAR, 5), + 2035: (MAR, 24), + } + + # https://web.archive.org/web/20241205010833/https://www.timeanddate.com/holidays/india/janmashtami + JANMASHTAMI_DATES = { + 2001: (AUG, 12), + 2002: (AUG, 31), + 2003: (AUG, 20), + 2004: (SEP, 7), + 2005: (AUG, 27), + 2006: (AUG, 16), + 2007: (SEP, 4), + 2008: (AUG, 24), + 2009: (AUG, 14), + 2010: (SEP, 2), + 2011: (AUG, 22), + 2012: (AUG, 10), + 2013: (AUG, 28), + 2014: (AUG, 18), + 2015: (SEP, 5), + 2016: (AUG, 25), + 2017: (AUG, 15), + 2018: (SEP, 3), + 2019: (AUG, 24), + 2020: (AUG, 12), + 2021: (AUG, 30), + 2022: (AUG, 19), + 2023: (SEP, 7), + 2024: (AUG, 26), + 2025: (AUG, 16), + 2026: (SEP, 4), + 2027: (AUG, 25), + 2028: (AUG, 13), + 2029: (SEP, 1), + 2030: (AUG, 21), + 2031: (AUG, 10), + 2032: (AUG, 28), + 2033: (AUG, 17), + 2034: (SEP, 6), + 2035: (AUG, 26), + } + + # https://web.archive.org/web/20250113213218/https://www.timeanddate.com/holidays/india/maha-ashtami + MAHA_ASHTAMI_DATES = { + 2001: (OCT, 24), + 2002: (OCT, 13), + 2003: (OCT, 3), + 2004: (OCT, 21), + 2005: (OCT, 11), + 2006: (SEP, 30), + 2007: (OCT, 19), + 2008: (OCT, 7), + 2009: (SEP, 26), + 2010: (OCT, 15), + 2011: (OCT, 4), + 2012: (OCT, 22), + 2013: (OCT, 12), + 2014: (OCT, 2), + 2015: (OCT, 21), + 2016: (OCT, 9), + 2017: (SEP, 28), + 2018: (OCT, 17), + 2019: (OCT, 6), + 2020: (OCT, 23), + 2021: (OCT, 13), + 2022: (OCT, 3), + 2023: (OCT, 22), + 2024: (OCT, 11), + 2025: (SEP, 30), + 2026: (OCT, 19), + 2027: (OCT, 7), + 2028: (SEP, 26), + 2029: (OCT, 14), + 2030: (OCT, 4), + 2031: (OCT, 23), + 2032: (OCT, 12), + 2033: (OCT, 2), + 2034: (OCT, 20), + 2035: (OCT, 9), + } + + # https://web.archive.org/web/20241125173623/https://www.timeanddate.com/holidays/india/maha-navami + MAHA_NAVAMI_DATES = { + 2001: (OCT, 25), + 2002: (OCT, 14), + 2003: (OCT, 3), + 2004: (OCT, 21), + 2005: (OCT, 11), + 2006: (OCT, 1), + 2007: (OCT, 20), + 2008: (OCT, 8), + 2009: (SEP, 27), + 2010: (OCT, 16), + 2011: (OCT, 5), + 2012: (OCT, 23), + 2013: (OCT, 12), + 2014: (OCT, 2), + 2015: (OCT, 21), + 2016: (OCT, 10), + 2017: (SEP, 29), + 2018: (OCT, 17), + 2019: (OCT, 6), + 2020: (OCT, 24), + 2021: (OCT, 14), + 2022: (OCT, 4), + 2023: (OCT, 23), + 2024: (OCT, 11), + 2025: (OCT, 1), + 2026: (OCT, 19), + 2027: (OCT, 8), + 2028: (SEP, 26), + 2029: (OCT, 15), + 2030: (OCT, 5), + 2031: (OCT, 24), + 2032: (OCT, 13), + 2033: (OCT, 2), + 2034: (OCT, 21), + 2035: (OCT, 10), + } + + # https://web.archive.org/web/20250323040914/https://www.timeanddate.com/holidays/india/maha-shivaratri-shivaratri + MAHA_SHIVARATRI_DATES = { + 2001: (FEB, 21), + 2002: (MAR, 12), + 2003: (MAR, 1), + 2004: (FEB, 18), + 2005: (MAR, 8), + 2006: (FEB, 26), + 2007: (FEB, 16), + 2008: (MAR, 6), + 2009: (FEB, 23), + 2010: (FEB, 12), + 2011: (MAR, 2), + 2012: (FEB, 20), + 2013: (MAR, 10), + 2014: (FEB, 27), + 2015: (FEB, 17), + 2016: (MAR, 7), + 2017: (FEB, 24), + 2018: (FEB, 13), + 2019: (MAR, 4), + 2020: (FEB, 21), + 2021: (MAR, 11), + 2022: (MAR, 1), + 2023: (FEB, 18), + 2024: (MAR, 8), + 2025: (FEB, 26), + 2026: (FEB, 15), + 2027: (MAR, 6), + 2028: (FEB, 23), + 2029: (FEB, 11), + 2030: (MAR, 2), + 2031: (FEB, 20), + 2032: (MAR, 10), + 2033: (FEB, 27), + 2034: (FEB, 17), + 2035: (MAR, 8), + } + + # https://web.archive.org/web/20250121194712/https://www.timeanddate.com/holidays/india/mahavir-jayanti + MAHAVIR_JAYANTI_DATES = { + 2001: (APR, 6), + 2002: (APR, 25), + 2003: (APR, 15), + 2004: (APR, 3), + 2005: (APR, 22), + 2006: (APR, 11), + 2007: (MAR, 31), + 2008: (APR, 18), + 2009: (APR, 7), + 2010: (APR, 28), + 2011: (APR, 16), + 2012: (APR, 5), + 2013: (APR, 24), + 2014: (APR, 13), + 2015: (APR, 2), + 2016: (APR, 20), + 2017: (APR, 9), + 2018: (MAR, 29), + 2019: (APR, 17), + 2020: (APR, 6), + 2021: (APR, 25), + 2022: (APR, 14), + 2023: (APR, 4), + 2024: (APR, 21), + 2025: (APR, 10), + 2026: (MAR, 31), + 2027: (APR, 18), + 2028: (APR, 7), + 2029: (APR, 26), + 2030: (APR, 16), + 2031: (APR, 5), + 2032: (APR, 23), + 2033: (APR, 12), + 2034: (APR, 1), + 2035: (APR, 20), + } + + # https://web.archive.org/web/20250119043432/https://www.timeanddate.com/holidays/india/makar-sankranti + MAKAR_SANKRANTI_DATES = { + 2001: (JAN, 14), + 2002: (JAN, 14), + 2003: (JAN, 14), + 2004: (JAN, 15), + 2005: (JAN, 14), + 2006: (JAN, 14), + 2007: (JAN, 15), + 2008: (JAN, 15), + 2009: (JAN, 14), + 2010: (JAN, 14), + 2011: (JAN, 15), + 2012: (JAN, 15), + 2013: (JAN, 14), + 2014: (JAN, 14), + 2015: (JAN, 15), + 2016: (JAN, 15), + 2017: (JAN, 14), + 2018: (JAN, 14), + 2019: (JAN, 15), + 2020: (JAN, 15), + 2021: (JAN, 14), + 2022: (JAN, 14), + 2023: (JAN, 14), + 2024: (JAN, 14), + 2025: (JAN, 14), + 2026: (JAN, 14), + 2027: (JAN, 15), + 2028: (JAN, 15), + 2029: (JAN, 14), + 2030: (JAN, 14), + 2031: (JAN, 15), + 2032: (JAN, 15), + 2033: (JAN, 14), + 2034: (JAN, 14), + 2035: (JAN, 15), + } + + # https://web.archive.org/web/20241205101551/https://www.timeanddate.com/holidays/india/onam + ONAM_DATES = { + 2001: (AUG, 31), + 2002: (AUG, 21), + 2003: (SEP, 8), + 2004: (AUG, 28), + 2005: (SEP, 15), + 2006: (SEP, 5), + 2007: (AUG, 26), + 2008: (SEP, 12), + 2009: (SEP, 2), + 2010: (AUG, 23), + 2011: (SEP, 9), + 2012: (AUG, 29), + 2013: (AUG, 20), + 2014: (SEP, 6), + 2015: (AUG, 28), + 2016: (SEP, 13), + 2017: (SEP, 4), + 2018: (AUG, 24), + 2019: (SEP, 11), + 2020: (AUG, 31), + 2021: (AUG, 21), + 2022: (SEP, 8), + 2023: (AUG, 29), + 2024: (SEP, 15), + 2025: (SEP, 5), + 2026: (AUG, 26), + 2027: (SEP, 12), + 2028: (SEP, 1), + 2029: (AUG, 22), + 2030: (SEP, 9), + 2031: (AUG, 30), + 2032: (AUG, 20), + 2033: (SEP, 6), + 2034: (AUG, 28), + 2035: (SEP, 14), + } + + PONGAL_DATES = { + 2001: (JAN, 14), + 2002: (JAN, 14), + 2003: (JAN, 15), + 2004: (JAN, 15), + 2005: (JAN, 14), + 2006: (JAN, 14), + 2007: (JAN, 15), + 2008: (JAN, 15), + 2009: (JAN, 14), + 2010: (JAN, 14), + 2011: (JAN, 15), + 2012: (JAN, 15), + 2013: (JAN, 14), + 2014: (JAN, 14), + 2015: (JAN, 15), + 2016: (JAN, 15), + 2017: (JAN, 14), + 2018: (JAN, 14), + 2019: (JAN, 15), + 2020: (JAN, 15), + 2021: (JAN, 14), + 2022: (JAN, 14), + 2023: (JAN, 15), + 2024: (JAN, 15), + 2025: (JAN, 14), + 2026: (JAN, 14), + 2027: (JAN, 15), + 2028: (JAN, 15), + 2029: (JAN, 14), + 2030: (JAN, 14), + 2031: (JAN, 15), + 2032: (JAN, 15), + 2033: (JAN, 14), + 2034: (JAN, 14), + 2035: (JAN, 15), + } + + # https://web.archive.org/web/20240720191148/https://www.timeanddate.com/holidays/india/raksha-bandhan + RAKSHA_BANDHAN_DATES = { + 2001: (AUG, 4), + 2002: (AUG, 22), + 2003: (AUG, 12), + 2004: (AUG, 29), + 2005: (AUG, 19), + 2006: (AUG, 9), + 2007: (AUG, 28), + 2008: (AUG, 16), + 2009: (AUG, 5), + 2010: (AUG, 24), + 2011: (AUG, 13), + 2012: (AUG, 2), + 2013: (AUG, 20), + 2014: (AUG, 10), + 2015: (AUG, 29), + 2016: (AUG, 18), + 2017: (AUG, 7), + 2018: (AUG, 26), + 2019: (AUG, 15), + 2020: (AUG, 3), + 2021: (AUG, 22), + 2022: (AUG, 11), + 2023: (AUG, 30), + 2024: (AUG, 19), + 2025: (AUG, 9), + 2026: (AUG, 28), + 2027: (AUG, 17), + 2028: (AUG, 5), + 2029: (AUG, 23), + 2030: (AUG, 13), + 2031: (AUG, 2), + 2032: (AUG, 20), + 2033: (AUG, 10), + 2034: (AUG, 29), + 2035: (AUG, 18), + } + + # https://web.archive.org/web/20250403054153/https://www.timeanddate.com/holidays/india/rama-navami + RAM_NAVAMI_DATES = { + 2001: (APR, 2), + 2002: (APR, 21), + 2003: (APR, 11), + 2004: (MAR, 30), + 2005: (APR, 18), + 2006: (APR, 6), + 2007: (MAR, 26), + 2008: (APR, 13), + 2009: (APR, 3), + 2010: (MAR, 24), + 2011: (APR, 12), + 2012: (APR, 1), + 2013: (APR, 19), + 2014: (APR, 8), + 2015: (MAR, 28), + 2016: (APR, 15), + 2017: (APR, 4), + 2018: (MAR, 25), + 2019: (APR, 13), + 2020: (APR, 2), + 2021: (APR, 21), + 2022: (APR, 10), + 2023: (MAR, 30), + 2024: (APR, 17), + 2025: (APR, 6), + 2026: (MAR, 26), + 2027: (APR, 15), + 2028: (APR, 3), + 2029: (APR, 22), + 2030: (APR, 12), + 2031: (APR, 1), + 2032: (APR, 19), + 2033: (APR, 7), + 2034: (MAR, 28), + 2035: (APR, 16), + } + + # https://web.archive.org/web/20241202103625/https://www.timeanddate.com/holidays/india/navratri + SHARAD_NAVRATRI_DATES = { + 2001: (OCT, 17), + 2002: (OCT, 7), + 2003: (SEP, 26), + 2004: (OCT, 14), + 2005: (OCT, 4), + 2006: (SEP, 23), + 2007: (OCT, 12), + 2008: (SEP, 30), + 2009: (SEP, 19), + 2010: (OCT, 8), + 2011: (SEP, 28), + 2012: (OCT, 16), + 2013: (OCT, 5), + 2014: (SEP, 25), + 2015: (OCT, 13), + 2016: (OCT, 1), + 2017: (SEP, 21), + 2018: (OCT, 10), + 2019: (SEP, 29), + 2020: (OCT, 17), + 2021: (OCT, 7), + 2022: (SEP, 26), + 2023: (OCT, 15), + 2024: (OCT, 3), + 2025: (SEP, 22), + 2026: (OCT, 11), + 2027: (SEP, 30), + 2028: (SEP, 19), + 2029: (OCT, 8), + 2030: (SEP, 28), + 2031: (OCT, 17), + 2032: (OCT, 5), + 2033: (SEP, 24), + 2034: (OCT, 13), + 2035: (OCT, 2), + } + + # https://web.archive.org/web/20241007171215/https://www.timeanddate.com/holidays/nepal/sonam-losar + # https://web.archive.org/web/20250322000610/https://www.ashesh.com.np/nepali-calendar/ + SONAM_LOSAR_DATES = { + 2010: (JAN, 16), + 2011: (FEB, 4), + 2012: (JAN, 24), + 2013: (FEB, 11), + 2014: (JAN, 31), + 2015: (JAN, 21), + 2016: (FEB, 9), + 2017: (JAN, 28), + 2018: (JAN, 18), + 2019: (FEB, 5), + 2020: (JAN, 25), + 2021: (FEB, 12), + 2022: (FEB, 2), + 2023: (JAN, 22), + 2024: (FEB, 10), + 2025: (JAN, 30), + 2026: (JAN, 19), + 2027: (FEB, 7), + 2028: (FEB, 26), + 2029: (JAN, 15), + 2030: (FEB, 3), + 2031: (JAN, 24), + 2032: (FEB, 12), + 2033: (JAN, 31), + 2034: (JAN, 21), + 2035: (FEB, 9), + } + + # https://web.archive.org/web/20241207045124/https://www.hamropatro.com/posts/articles-Bishesh-Dinharu/articles-Bishesh-Dinharu-english-tamu-lhosar + TAMU_LOSAR_DATES = { + 2010: (DEC, 30), + 2011: (DEC, 30), + 2012: (DEC, 30), + 2013: (DEC, 30), + 2014: (DEC, 30), + 2015: (DEC, 30), + 2016: (DEC, 30), + 2017: (DEC, 30), + 2018: (DEC, 30), + 2019: (DEC, 31), + 2020: (DEC, 30), + 2021: (DEC, 30), + 2022: (DEC, 30), + 2023: (DEC, 31), + 2024: (DEC, 30), + 2025: (DEC, 30), + 2026: (DEC, 30), + 2027: (DEC, 30), + 2028: (DEC, 30), + 2029: (DEC, 30), + 2030: (DEC, 31), + 2031: (DEC, 31), + 2032: (DEC, 30), + } + + THAIPUSAM_DATES = { + 1901: (MAR, 5), + 1902: (FEB, 23), + 1903: (JAN, 14), + 1904: (MAR, 2), + 1905: (FEB, 19), + 1906: (JAN, 10), + 1907: (FEB, 27), + 1908: (FEB, 17), + 1909: (JAN, 7), + 1910: (FEB, 24), + 1911: (JAN, 15), + 1912: (MAR, 4), + 1913: (FEB, 21), + 1914: (JAN, 11), + 1915: (MAR, 1), + 1916: (FEB, 18), + 1917: (JAN, 8), + 1918: (FEB, 26), + 1919: (FEB, 15), + 1920: (MAR, 5), + 1921: (FEB, 23), + 1922: (JAN, 13), + 1923: (MAR, 2), + 1924: (FEB, 19), + 1925: (JAN, 9), + 1926: (FEB, 27), + 1927: (FEB, 17), + 1928: (JAN, 8), + 1929: (FEB, 24), + 1930: (JAN, 15), + 1931: (MAR, 4), + 1932: (FEB, 21), + 1933: (JAN, 11), + 1934: (FEB, 28), + 1935: (FEB, 18), + 1936: (JAN, 9), + 1937: (FEB, 26), + 1938: (FEB, 15), + 1939: (MAR, 6), + 1940: (FEB, 23), + 1941: (JAN, 12), + 1942: (MAR, 2), + 1943: (FEB, 19), + 1944: (JAN, 10), + 1945: (FEB, 27), + 1946: (FEB, 17), + 1947: (JAN, 7), + 1948: (FEB, 25), + 1949: (FEB, 13), + 1950: (MAR, 3), + 1951: (FEB, 21), + 1952: (JAN, 12), + 1953: (FEB, 28), + 1954: (FEB, 18), + 1955: (JAN, 9), + 1956: (FEB, 26), + 1957: (FEB, 15), + 1958: (MAR, 5), + 1959: (FEB, 22), + 1960: (JAN, 13), + 1961: (MAR, 2), + 1962: (FEB, 19), + 1963: (JAN, 10), + 1964: (FEB, 28), + 1965: (FEB, 16), + 1966: (JAN, 6), + 1967: (FEB, 24), + 1968: (FEB, 13), + 1969: (MAR, 3), + 1970: (FEB, 21), + 1971: (JAN, 12), + 1972: (FEB, 29), + 1973: (FEB, 18), + 1974: (JAN, 8), + 1975: (FEB, 26), + 1976: (FEB, 15), + 1977: (MAR, 5), + 1978: (FEB, 22), + 1979: (JAN, 13), + 1980: (MAR, 2), + 1981: (FEB, 19), + 1982: (JAN, 10), + 1983: (FEB, 28), + 1984: (FEB, 17), + 1985: (MAR, 6), + 1986: (FEB, 23), + 1987: (JAN, 14), + 1988: (MAR, 3), + 1989: (FEB, 21), + 1990: (JAN, 12), + 1991: (MAR, 1), + 1992: (FEB, 18), + 1993: (JAN, 8), + 1994: (FEB, 25), + 1995: (FEB, 14), + 1996: (MAR, 4), + 1997: (FEB, 22), + 1998: (JAN, 13), + 1999: (MAR, 3), + 2000: (FEB, 20), + 2001: (JAN, 9), + 2002: (FEB, 27), + 2003: (FEB, 16), + 2004: (JAN, 7), + 2005: (FEB, 23), + 2006: (FEB, 13), + 2007: (MAR, 4), + 2008: (FEB, 22), + 2009: (JAN, 11), + 2010: (MAR, 1), + 2011: (FEB, 18), + 2012: (JAN, 8), + 2013: (FEB, 25), + 2014: (FEB, 14), + 2015: (MAR, 5), + 2016: (FEB, 23), + 2017: (JAN, 13), + 2018: (MAR, 2), + 2019: (FEB, 20), + 2020: (JAN, 10), + 2021: (FEB, 26), + 2022: (FEB, 16), + 2023: (JAN, 7), + 2024: (FEB, 24), + 2025: (JAN, 14), + 2026: (MAR, 4), + 2027: (FEB, 21), + 2028: (JAN, 11), + 2029: (FEB, 28), + 2030: (FEB, 17), + 2031: (JAN, 8), + 2032: (FEB, 26), + 2033: (FEB, 14), + 2034: (MAR, 5), + 2035: (FEB, 23), + 2036: (JAN, 13), + 2037: (MAR, 2), + 2038: (FEB, 19), + 2039: (JAN, 9), + 2040: (FEB, 27), + 2041: (FEB, 15), + 2042: (JAN, 7), + 2043: (FEB, 24), + 2044: (FEB, 14), + 2045: (MAR, 4), + 2046: (FEB, 21), + 2047: (JAN, 11), + 2048: (FEB, 28), + 2049: (FEB, 17), + 2050: (JAN, 8), + 2051: (FEB, 26), + 2052: (FEB, 15), + 2053: (MAR, 5), + 2054: (FEB, 22), + 2055: (JAN, 13), + 2056: (MAR, 1), + 2057: (FEB, 18), + 2058: (JAN, 9), + 2059: (FEB, 27), + 2060: (FEB, 17), + 2061: (JAN, 6), + 2062: (FEB, 24), + 2063: (FEB, 13), + 2064: (MAR, 3), + 2065: (FEB, 20), + 2066: (JAN, 11), + 2067: (FEB, 28), + 2068: (FEB, 18), + 2069: (JAN, 8), + 2070: (FEB, 25), + 2071: (FEB, 15), + 2072: (MAR, 5), + 2073: (FEB, 22), + 2074: (JAN, 12), + 2075: (MAR, 2), + 2076: (FEB, 19), + 2077: (JAN, 9), + 2078: (FEB, 27), + 2079: (FEB, 16), + 2080: (JAN, 7), + 2081: (FEB, 23), + 2082: (FEB, 12), + 2083: (MAR, 3), + 2084: (FEB, 21), + 2085: (JAN, 11), + 2086: (FEB, 28), + 2087: (FEB, 18), + 2088: (JAN, 9), + 2089: (FEB, 25), + 2090: (FEB, 14), + 2091: (MAR, 5), + 2092: (FEB, 22), + 2093: (JAN, 12), + 2094: (MAR, 1), + 2095: (FEB, 19), + 2096: (JAN, 10), + 2097: (FEB, 27), + 2098: (FEB, 16), + 2099: (JAN, 6), + 2100: (FEB, 24), + } + + # https://web.archive.org/web/20250121194712/https://www.timeanddate.com/holidays/india/vaisakhi + VAISAKHI_DATES = { + 2001: (APR, 13), + 2002: (APR, 14), + 2003: (APR, 14), + 2004: (APR, 13), + 2005: (APR, 14), + 2006: (APR, 14), + 2007: (APR, 14), + 2008: (APR, 13), + 2009: (APR, 14), + 2010: (APR, 14), + 2011: (APR, 14), + 2012: (APR, 13), + 2013: (APR, 13), + 2014: (APR, 14), + 2015: (APR, 14), + 2016: (APR, 13), + 2017: (APR, 14), + 2018: (APR, 14), + 2019: (APR, 14), + 2020: (APR, 13), + 2021: (APR, 14), + 2022: (APR, 14), + 2023: (APR, 14), + 2024: (APR, 13), + 2025: (APR, 13), + 2026: (APR, 14), + 2027: (APR, 14), + 2028: (APR, 13), + 2029: (APR, 14), + 2030: (APR, 14), + 2031: (APR, 14), + 2032: (APR, 13), + 2033: (APR, 14), + 2034: (APR, 14), + 2035: (APR, 14), + } + + def _get_holiday(self, holiday: str, year: int) -> tuple[Optional[date], bool]: + estimated_dates = getattr(self, f"{holiday}_DATES", {}) + exact_dates = getattr(self, f"{holiday}_DATES_{_CustomCalendar.CUSTOM_ATTR_POSTFIX}", {}) + dt = exact_dates.get(year, estimated_dates.get(year, ())) + return date(year, *dt) if dt else None, year not in exact_dates + + def _get_holiday_set(self, holiday: str, year: int) -> Iterable[tuple[date, bool]]: + estimated_dates = getattr(self, f"{holiday}_DATES", {}) + exact_dates = getattr(self, f"{holiday}_DATES_{_CustomCalendar.CUSTOM_ATTR_POSTFIX}", {}) + for year in (year - 1, year): + for dt in _normalize_tuple(exact_dates.get(year, estimated_dates.get(year, ()))): + yield date(year, *dt), year not in exact_dates + + def buddha_purnima_date(self, year: int) -> tuple[Optional[date], bool]: + return self._get_holiday(BUDDHA_PURNIMA, year) + + def chhath_puja_date(self, year: int) -> tuple[Optional[date], bool]: + return self._get_holiday(CHHATH_PUJA, year) + + def diwali_date(self, year: int) -> tuple[Optional[date], bool]: + return self._get_holiday(DIWALI, year) + + def diwali_india_date(self, year: int) -> tuple[Optional[date], bool]: + return self._get_holiday(DIWALI_INDIA, year) + + def dussehra_date(self, year: int) -> tuple[Optional[date], bool]: + return self._get_holiday(DUSSEHRA, year) + + def ganesh_chaturthi_date(self, year: int) -> tuple[Optional[date], bool]: + return self._get_holiday(GANESH_CHATURTHI, year) + + def govardhan_puja_date(self, year: int) -> tuple[Optional[date], bool]: + return self._get_holiday(GOVARDHAN_PUJA, year) + + def gudi_padwa_date(self, year: int) -> tuple[Optional[date], bool]: + return self._get_holiday(GUDI_PADWA, year) + + def guru_gobind_singh_jayanti_date(self, year: int) -> Iterable[tuple[date, bool]]: + return self._get_holiday_set(GURU_GOBIND_SINGH_JAYANTI, year) + + def guru_nanak_jayanti_date(self, year: int) -> tuple[Optional[date], bool]: + return self._get_holiday(GURU_NANAK_JAYANTI, year) + + def gyalpo_losar_date(self, year: int) -> tuple[Optional[date], bool]: + return self._get_holiday(GYALPO_LOSAR, year) + + def holi_date(self, year: int) -> tuple[Optional[date], bool]: + return self._get_holiday(HOLI, year) + + def pongal_date(self, year: int) -> tuple[Optional[date], bool]: + return self._get_holiday(PONGAL, year) + + def janmashtami_date(self, year: int) -> tuple[Optional[date], bool]: + return self._get_holiday(JANMASHTAMI, year) + + def maha_ashtami_date(self, year: int) -> tuple[Optional[date], bool]: + return self._get_holiday(MAHA_ASHTAMI, year) + + def maha_navami_date(self, year: int) -> tuple[Optional[date], bool]: + return self._get_holiday(MAHA_NAVAMI, year) + + def maha_shivaratri_date(self, year: int) -> tuple[Optional[date], bool]: + return self._get_holiday(MAHA_SHIVARATRI, year) + + def mahavir_jayanti_date(self, year: int) -> tuple[Optional[date], bool]: + return self._get_holiday(MAHAVIR_JAYANTI, year) + + def makar_sankranti_date(self, year: int) -> tuple[Optional[date], bool]: + return self._get_holiday(MAKAR_SANKRANTI, year) + + def onam_date(self, year: int) -> tuple[Optional[date], bool]: + return self._get_holiday(ONAM, year) + + def raksha_bandhan_date(self, year: int) -> tuple[Optional[date], bool]: + return self._get_holiday(RAKSHA_BANDHAN, year) + + def ram_navami_date(self, year: int) -> tuple[Optional[date], bool]: + return self._get_holiday(RAM_NAVAMI, year) + + def sharad_navratri_date(self, year: int) -> tuple[Optional[date], bool]: + return self._get_holiday(SHARAD_NAVRATRI, year) + + def sonam_losar_date(self, year: int) -> tuple[Optional[date], bool]: + return self._get_holiday(SONAM_LOSAR, year) + + def tamu_losar_date(self, year: int) -> tuple[Optional[date], bool]: + return self._get_holiday(TAMU_LOSAR, year) + + def thaipusam_date(self, year: int) -> tuple[Optional[date], bool]: + return self._get_holiday(THAIPUSAM, year) + + def vaisakhi_date(self, year: int) -> tuple[Optional[date], bool]: + return self._get_holiday(VAISAKHI, year) + + +class _CustomHinduHolidays(_CustomCalendar, _HinduLunisolar): + pass diff --git a/.venv/lib/python3.12/site-packages/holidays/calendars/islamic.py b/.venv/lib/python3.12/site-packages/holidays/calendars/islamic.py new file mode 100644 index 00000000..807dbd04 --- /dev/null +++ b/.venv/lib/python3.12/site-packages/holidays/calendars/islamic.py @@ -0,0 +1,4043 @@ +# holidays +# -------- +# A fast, efficient Python library for generating country, province and state +# specific sets of holidays on the fly. It aims to make determining whether a +# specific date is a holiday as fast and flexible as possible. +# +# Authors: Vacanza Team and individual contributors (see CONTRIBUTORS file) +# dr-prodigy (c) 2017-2023 +# ryanss (c) 2014-2017 +# Website: https://github.com/vacanza/holidays +# License: MIT (see LICENSE file) + +from collections.abc import Iterable +from datetime import date + +from holidays.calendars.custom import _CustomCalendar +from holidays.calendars.gregorian import JAN, FEB, MAR, APR, MAY, JUN, JUL, AUG, SEP, OCT, NOV, DEC +from holidays.helpers import _normalize_tuple + +ALI_AL_RIDA_DEATH = "ALI_AL_RIDA_DEATH" +ALI_BIRTHDAY = "ALI_BIRTHDAY" +ALI_DEATH = "ALI_DEATH" +ARBAEEN = "ARBAEEN" +ASHURA = "ASHURA" +EID_AL_ADHA = "EID_AL_ADHA" +EID_AL_FITR = "EID_AL_FITR" +EID_AL_GHADIR = "EID_AL_GHADIR" +FATIMA_DEATH = "FATIMA_DEATH" +GRAND_MAGAL_OF_TOUBA = "GRAND_MAGAL_OF_TOUBA" +HARI_HOL_JOHOR = "HARI_HOL_JOHOR" +HASAN_AL_ASKARI_DEATH = "HASAN_AL_ASKARI_DEATH" +HIJRI_NEW_YEAR = "HIJRI_NEW_YEAR" +IMAM_MAHDI_BIRTHDAY = "IMAM_MAHDI_BIRTHDAY" +ISRA_AND_MIRAJ = "ISRA_AND_MIRAJ" +LAYLAT_AL_QADR = "LAYLAT_AL_QADR" +MALDIVES_EMBRACED_ISLAM_DAY = "MALDIVES_EMBRACED_ISLAM_DAY" +MAWLID = "MAWLID" +NUZUL_AL_QURAN = "NUZUL_AL_QURAN" +PROPHET_DEATH = "PROPHET_DEATH" +QUAMEE_DHUVAS = "QUAMEE_DHUVAS" +RAMADAN_BEGINNING = "RAMADAN_BEGINNING" +SADIQ_BIRTHDAY = "SADIQ_BIRTHDAY" +SADIQ_DEATH = "SADIQ_DEATH" +TASUA = "TASUA" + + +class _IslamicLunar: + ALI_AL_RIDA_DEATH_DATES = { + 1924: (SEP, 28), + 1925: (SEP, 18), + 1926: (SEP, 7), + 1927: (AUG, 27), + 1928: (AUG, 15), + 1929: (AUG, 5), + 1930: (JUL, 25), + 1931: (JUL, 16), + 1932: (JUL, 4), + 1933: (JUN, 23), + 1934: (JUN, 12), + 1935: (JUN, 2), + 1936: (MAY, 21), + 1937: (MAY, 10), + 1938: (APR, 29), + 1939: (APR, 20), + 1940: (APR, 8), + 1941: (MAR, 27), + 1942: (MAR, 17), + 1943: (MAR, 6), + 1944: (FEB, 23), + 1945: (FEB, 12), + 1946: (FEB, 1), + 1947: (JAN, 22), + 1948: ((JAN, 11), (DEC, 30)), + 1949: (DEC, 20), + 1950: (DEC, 10), + 1951: (NOV, 29), + 1952: (NOV, 18), + 1953: (NOV, 7), + 1954: (OCT, 27), + 1955: (OCT, 17), + 1956: (OCT, 5), + 1957: (SEP, 24), + 1958: (SEP, 14), + 1959: (SEP, 3), + 1960: (AUG, 22), + 1961: (AUG, 11), + 1962: (JUL, 31), + 1963: (JUL, 21), + 1964: (JUL, 9), + 1965: (JUN, 28), + 1966: (JUN, 19), + 1967: (JUN, 7), + 1968: (MAY, 27), + 1969: (MAY, 16), + 1970: (MAY, 6), + 1971: (APR, 25), + 1972: (APR, 13), + 1973: (APR, 3), + 1974: (MAR, 23), + 1975: (MAR, 12), + 1976: (FEB, 29), + 1977: (FEB, 18), + 1978: (FEB, 7), + 1979: (JAN, 28), + 1980: (JAN, 18), + 1981: ((JAN, 6), (DEC, 26)), + 1982: (DEC, 15), + 1983: (DEC, 4), + 1984: (NOV, 22), + 1985: (NOV, 12), + 1986: (NOV, 2), + 1987: (OCT, 22), + 1988: (OCT, 10), + 1989: (SEP, 29), + 1990: (SEP, 19), + 1991: (SEP, 8), + 1992: (AUG, 28), + 1993: (AUG, 17), + 1994: (AUG, 7), + 1995: (JUL, 27), + 1996: (JUL, 15), + 1997: (JUL, 4), + 1998: (JUN, 24), + 1999: (JUN, 14), + 2000: (JUN, 2), + 2001: (MAY, 23), + 2002: (MAY, 12), + 2003: (MAY, 1), + 2004: (APR, 19), + 2005: (APR, 9), + 2006: (MAR, 29), + 2007: (MAR, 19), + 2008: (MAR, 8), + 2009: (FEB, 25), + 2010: (FEB, 14), + 2011: (FEB, 3), + 2012: (JAN, 23), + 2013: (JAN, 12), + 2014: ((JAN, 1), (DEC, 22)), + 2015: (DEC, 11), + 2016: (NOV, 29), + 2017: (NOV, 18), + 2018: (NOV, 8), + 2019: (OCT, 28), + 2020: (OCT, 17), + 2021: (OCT, 6), + 2022: (SEP, 26), + 2023: (SEP, 15), + 2024: (SEP, 3), + 2025: (AUG, 23), + 2026: (AUG, 13), + 2027: (AUG, 2), + 2028: (JUL, 22), + 2029: (JUL, 12), + 2030: (JUL, 1), + 2031: (JUN, 20), + 2032: (JUN, 8), + 2033: (MAY, 28), + 2034: (MAY, 18), + 2035: (MAY, 8), + 2036: (APR, 26), + 2037: (APR, 16), + 2038: (APR, 5), + 2039: (MAR, 25), + 2040: (MAR, 13), + 2041: (MAR, 3), + 2042: (FEB, 20), + 2043: (FEB, 10), + 2044: (JAN, 30), + 2045: (JAN, 18), + 2046: ((JAN, 7), (DEC, 27)), + 2047: (DEC, 17), + 2048: (DEC, 6), + 2049: (NOV, 25), + 2050: (NOV, 14), + 2051: (NOV, 4), + 2052: (OCT, 23), + 2053: (OCT, 12), + 2054: (OCT, 1), + 2055: (SEP, 21), + 2056: (SEP, 10), + 2057: (AUG, 30), + 2058: (AUG, 19), + 2059: (AUG, 8), + 2060: (JUL, 27), + 2061: (JUL, 17), + 2062: (JUL, 7), + 2063: (JUN, 26), + 2064: (JUN, 15), + 2065: (JUN, 4), + 2066: (MAY, 24), + 2067: (MAY, 13), + 2068: (MAY, 2), + 2069: (APR, 21), + 2070: (APR, 11), + 2071: (APR, 1), + 2072: (MAR, 20), + 2073: (MAR, 9), + 2074: (FEB, 26), + 2075: (FEB, 15), + 2076: (FEB, 5), + 2077: (JAN, 25), + } + + ALI_BIRTHDAY_DATES = { + 1925: (FEB, 7), + 1926: (JAN, 27), + 1927: (JAN, 17), + 1928: ((JAN, 6), (DEC, 25)), + 1929: (DEC, 14), + 1930: (DEC, 3), + 1931: (NOV, 23), + 1932: (NOV, 12), + 1933: (NOV, 1), + 1934: (OCT, 22), + 1935: (OCT, 11), + 1936: (SEP, 29), + 1937: (SEP, 18), + 1938: (SEP, 7), + 1939: (AUG, 28), + 1940: (AUG, 17), + 1941: (AUG, 5), + 1942: (JUL, 26), + 1943: (JUL, 15), + 1944: (JUL, 3), + 1945: (JUN, 23), + 1946: (JUN, 12), + 1947: (JUN, 2), + 1948: (MAY, 21), + 1949: (MAY, 10), + 1950: (APR, 30), + 1951: (APR, 20), + 1952: (APR, 8), + 1953: (MAR, 29), + 1954: (MAR, 18), + 1955: (MAR, 7), + 1956: (FEB, 25), + 1957: (FEB, 13), + 1958: (FEB, 2), + 1959: (JAN, 23), + 1960: ((JAN, 12), (DEC, 31)), + 1961: (DEC, 21), + 1962: (DEC, 10), + 1963: (NOV, 29), + 1964: (NOV, 17), + 1965: (NOV, 6), + 1966: (OCT, 27), + 1967: (OCT, 16), + 1968: (OCT, 5), + 1969: (SEP, 24), + 1970: (SEP, 14), + 1971: (SEP, 3), + 1972: (AUG, 22), + 1973: (AUG, 11), + 1974: (AUG, 1), + 1975: (JUL, 22), + 1976: (JUL, 10), + 1977: (JUN, 29), + 1978: (JUN, 18), + 1979: (JUN, 8), + 1980: (MAY, 27), + 1981: (MAY, 17), + 1982: (MAY, 6), + 1983: (APR, 26), + 1984: (APR, 14), + 1985: (APR, 3), + 1986: (MAR, 23), + 1987: (MAR, 13), + 1988: (MAR, 1), + 1989: (FEB, 19), + 1990: (FEB, 8), + 1991: (JAN, 28), + 1992: (JAN, 17), + 1993: ((JAN, 6), (DEC, 26)), + 1994: (DEC, 15), + 1995: (DEC, 5), + 1996: (NOV, 24), + 1997: (NOV, 13), + 1998: (NOV, 2), + 1999: (OCT, 22), + 2000: (OCT, 10), + 2001: (SEP, 30), + 2002: (SEP, 20), + 2003: (SEP, 10), + 2004: (AUG, 29), + 2005: (AUG, 18), + 2006: (AUG, 7), + 2007: (JUL, 27), + 2008: (JUL, 16), + 2009: (JUL, 6), + 2010: (JUN, 25), + 2011: (JUN, 15), + 2012: (JUN, 3), + 2013: (MAY, 23), + 2014: (MAY, 12), + 2015: (MAY, 2), + 2016: (APR, 20), + 2017: (APR, 10), + 2018: (MAR, 30), + 2019: (MAR, 20), + 2020: (MAR, 8), + 2021: (FEB, 25), + 2022: (FEB, 14), + 2023: (FEB, 4), + 2024: (JAN, 25), + 2025: (JAN, 13), + 2026: ((JAN, 2), (DEC, 22)), + 2027: (DEC, 11), + 2028: (NOV, 30), + 2029: (NOV, 19), + 2030: (NOV, 9), + 2031: (OCT, 29), + 2032: (OCT, 18), + 2033: (OCT, 7), + 2034: (SEP, 26), + 2035: (SEP, 15), + 2036: (SEP, 4), + 2037: (AUG, 24), + 2038: (AUG, 14), + 2039: (AUG, 3), + 2040: (JUL, 22), + 2041: (JUL, 11), + 2042: (JUL, 1), + 2043: (JUN, 20), + 2044: (JUN, 9), + 2045: (MAY, 30), + 2046: (MAY, 19), + 2047: (MAY, 8), + 2048: (APR, 26), + 2049: (APR, 15), + 2050: (APR, 5), + 2051: (MAR, 26), + 2052: (MAR, 14), + 2053: (MAR, 4), + 2054: (FEB, 21), + 2055: (FEB, 10), + 2056: (JAN, 30), + 2057: (JAN, 18), + 2058: ((JAN, 8), (DEC, 29)), + 2059: (DEC, 18), + 2060: (DEC, 6), + 2061: (NOV, 25), + 2062: (NOV, 15), + 2063: (NOV, 4), + 2064: (OCT, 24), + 2065: (OCT, 13), + 2066: (OCT, 3), + 2067: (SEP, 22), + 2068: (SEP, 10), + 2069: (AUG, 30), + 2070: (AUG, 20), + 2071: (AUG, 9), + 2072: (JUL, 29), + 2073: (JUL, 18), + 2074: (JUL, 8), + 2075: (JUN, 27), + 2076: (JUN, 15), + 2077: (JUN, 4), + } + + ALI_DEATH_DATES = { + 1925: (APR, 16), + 1926: (APR, 4), + 1927: (MAR, 24), + 1928: (MAR, 13), + 1929: (MAR, 2), + 1930: (FEB, 20), + 1931: (FEB, 9), + 1932: (JAN, 29), + 1933: (JAN, 17), + 1934: ((JAN, 7), (DEC, 28)), + 1935: (DEC, 17), + 1936: (DEC, 5), + 1937: (NOV, 25), + 1938: (NOV, 13), + 1939: (NOV, 3), + 1940: (OCT, 23), + 1941: (OCT, 11), + 1942: (OCT, 1), + 1943: (SEP, 20), + 1944: (SEP, 8), + 1945: (AUG, 28), + 1946: (AUG, 18), + 1947: (AUG, 8), + 1948: (JUL, 27), + 1949: (JUL, 16), + 1950: (JUL, 7), + 1951: (JUN, 26), + 1952: (JUN, 14), + 1953: (JUN, 3), + 1954: (MAY, 24), + 1955: (MAY, 14), + 1956: (MAY, 2), + 1957: (APR, 21), + 1958: (APR, 10), + 1959: (MAR, 31), + 1960: (MAR, 19), + 1961: (MAR, 8), + 1962: (FEB, 25), + 1963: (FEB, 15), + 1964: (FEB, 4), + 1965: (JAN, 23), + 1966: (JAN, 12), + 1967: ((JAN, 2), (DEC, 22)), + 1968: (DEC, 11), + 1969: (NOV, 30), + 1970: (NOV, 21), + 1971: (NOV, 9), + 1972: (OCT, 28), + 1973: (OCT, 17), + 1974: (OCT, 7), + 1975: (SEP, 26), + 1976: (SEP, 15), + 1977: (SEP, 4), + 1978: (AUG, 25), + 1979: (AUG, 14), + 1980: (AUG, 2), + 1981: (JUL, 22), + 1982: (JUL, 12), + 1983: (JUL, 2), + 1984: (JUN, 20), + 1985: (JUN, 9), + 1986: (MAY, 29), + 1987: (MAY, 19), + 1988: (MAY, 7), + 1989: (APR, 27), + 1990: (APR, 16), + 1991: (APR, 6), + 1992: (MAR, 25), + 1993: (MAR, 14), + 1994: (MAR, 3), + 1995: (FEB, 20), + 1996: (FEB, 10), + 1997: (JAN, 30), + 1998: (JAN, 19), + 1999: ((JAN, 8), (DEC, 29)), + 2000: (DEC, 17), + 2001: (DEC, 6), + 2002: (NOV, 26), + 2003: (NOV, 15), + 2004: (NOV, 4), + 2005: (OCT, 24), + 2006: (OCT, 14), + 2007: (OCT, 3), + 2008: (SEP, 21), + 2009: (SEP, 11), + 2010: (AUG, 31), + 2011: (AUG, 21), + 2012: (AUG, 9), + 2013: (JUL, 29), + 2014: (JUL, 18), + 2015: (JUL, 8), + 2016: (JUN, 26), + 2017: (JUN, 16), + 2018: (JUN, 5), + 2019: (MAY, 26), + 2020: (MAY, 14), + 2021: (MAY, 3), + 2022: (APR, 22), + 2023: (APR, 12), + 2024: (MAR, 31), + 2025: (MAR, 21), + 2026: (MAR, 10), + 2027: (FEB, 28), + 2028: (FEB, 17), + 2029: (FEB, 5), + 2030: (JAN, 25), + 2031: (JAN, 15), + 2032: ((JAN, 4), (DEC, 24)), + 2033: (DEC, 13), + 2034: (DEC, 2), + 2035: (NOV, 21), + 2036: (NOV, 9), + 2037: (OCT, 30), + 2038: (OCT, 20), + 2039: (OCT, 9), + 2040: (SEP, 27), + 2041: (SEP, 17), + 2042: (SEP, 6), + 2043: (AUG, 26), + 2044: (AUG, 15), + 2045: (AUG, 4), + 2046: (JUL, 25), + 2047: (JUL, 14), + 2048: (JUL, 2), + 2049: (JUN, 22), + 2050: (JUN, 11), + 2051: (MAY, 31), + 2052: (MAY, 20), + 2053: (MAY, 10), + 2054: (APR, 29), + 2055: (APR, 18), + 2056: (APR, 6), + 2057: (MAR, 26), + 2058: (MAR, 16), + 2059: (MAR, 6), + 2060: (FEB, 23), + 2061: (FEB, 12), + 2062: (FEB, 1), + 2063: (JAN, 21), + 2064: ((JAN, 10), (DEC, 29)), + 2065: (DEC, 19), + 2066: (DEC, 9), + 2067: (NOV, 28), + 2068: (NOV, 16), + 2069: (NOV, 5), + 2070: (OCT, 25), + 2071: (OCT, 15), + 2072: (OCT, 3), + 2073: (SEP, 23), + 2074: (SEP, 12), + 2075: (SEP, 2), + 2076: (AUG, 21), + 2077: (AUG, 10), + } + + ARBAEEN_DATES = { + 1924: (SEP, 19), + 1925: (SEP, 9), + 1926: (AUG, 29), + 1927: (AUG, 18), + 1928: (AUG, 6), + 1929: (JUL, 27), + 1930: (JUL, 16), + 1931: (JUL, 6), + 1932: (JUN, 25), + 1933: (JUN, 14), + 1934: (JUN, 3), + 1935: (MAY, 23), + 1936: (MAY, 12), + 1937: (MAY, 1), + 1938: (APR, 20), + 1939: (APR, 10), + 1940: (MAR, 29), + 1941: (MAR, 18), + 1942: (MAR, 8), + 1943: (FEB, 25), + 1944: (FEB, 14), + 1945: (FEB, 3), + 1946: (JAN, 23), + 1947: (JAN, 13), + 1948: ((JAN, 2), (DEC, 21)), + 1949: (DEC, 11), + 1950: (DEC, 1), + 1951: (NOV, 20), + 1952: (NOV, 8), + 1953: (OCT, 28), + 1954: (OCT, 18), + 1955: (OCT, 8), + 1956: (SEP, 25), + 1957: (SEP, 15), + 1958: (SEP, 5), + 1959: (AUG, 24), + 1960: (AUG, 13), + 1961: (AUG, 2), + 1962: (JUL, 22), + 1963: (JUL, 11), + 1964: (JUN, 30), + 1965: (JUN, 19), + 1966: (JUN, 9), + 1967: (MAY, 29), + 1968: (MAY, 17), + 1969: (MAY, 7), + 1970: (APR, 27), + 1971: (APR, 16), + 1972: (APR, 4), + 1973: (MAR, 25), + 1974: (MAR, 14), + 1975: (MAR, 3), + 1976: (FEB, 20), + 1977: (FEB, 8), + 1978: (JAN, 29), + 1979: (JAN, 18), + 1980: ((JAN, 8), (DEC, 27)), + 1981: (DEC, 16), + 1982: (DEC, 5), + 1983: (NOV, 24), + 1984: (NOV, 13), + 1985: (NOV, 3), + 1986: (OCT, 23), + 1987: (OCT, 13), + 1988: (OCT, 1), + 1989: (SEP, 20), + 1990: (SEP, 9), + 1991: (AUG, 30), + 1992: (AUG, 18), + 1993: (AUG, 8), + 1994: (JUL, 28), + 1995: (JUL, 18), + 1996: (JUL, 6), + 1997: (JUN, 25), + 1998: (JUN, 14), + 1999: (JUN, 4), + 2000: (MAY, 24), + 2001: (MAY, 14), + 2002: (MAY, 3), + 2003: (APR, 22), + 2004: (APR, 10), + 2005: (MAR, 30), + 2006: (MAR, 20), + 2007: (MAR, 10), + 2008: (FEB, 27), + 2009: (FEB, 15), + 2010: (FEB, 4), + 2011: (JAN, 24), + 2012: (JAN, 14), + 2013: ((JAN, 2), (DEC, 23)), + 2014: (DEC, 12), + 2015: (DEC, 2), + 2016: (NOV, 20), + 2017: (NOV, 9), + 2018: (OCT, 29), + 2019: (OCT, 19), + 2020: (OCT, 7), + 2021: (SEP, 27), + 2022: (SEP, 16), + 2023: (SEP, 5), + 2024: (AUG, 24), + 2025: (AUG, 14), + 2026: (AUG, 3), + 2027: (JUL, 24), + 2028: (JUL, 13), + 2029: (JUL, 2), + 2030: (JUN, 21), + 2031: (JUN, 10), + 2032: (MAY, 29), + 2033: (MAY, 19), + 2034: (MAY, 9), + 2035: (APR, 28), + 2036: (APR, 17), + 2037: (APR, 6), + 2038: (MAR, 26), + 2039: (MAR, 15), + 2040: (MAR, 4), + 2041: (FEB, 21), + 2042: (FEB, 11), + 2043: (JAN, 31), + 2044: (JAN, 21), + 2045: ((JAN, 9), (DEC, 29)), + 2046: (DEC, 18), + 2047: (DEC, 8), + 2048: (NOV, 26), + 2049: (NOV, 16), + 2050: (NOV, 5), + 2051: (OCT, 25), + 2052: (OCT, 13), + 2053: (OCT, 2), + 2054: (SEP, 22), + 2055: (SEP, 12), + 2056: (AUG, 31), + 2057: (AUG, 20), + 2058: (AUG, 9), + 2059: (JUL, 30), + 2060: (JUL, 18), + 2061: (JUL, 8), + 2062: (JUN, 27), + 2063: (JUN, 17), + 2064: (JUN, 5), + 2065: (MAY, 25), + 2066: (MAY, 14), + 2067: (MAY, 4), + 2068: (APR, 22), + 2069: (APR, 12), + 2070: (APR, 2), + 2071: (MAR, 22), + 2072: (MAR, 10), + 2073: (FEB, 27), + 2074: (FEB, 16), + 2075: (FEB, 6), + 2076: (JAN, 26), + 2077: (JAN, 15), + } + + ASHURA_DATES = { + 1924: (AUG, 10), + 1925: (AUG, 1), + 1926: (JUL, 20), + 1927: (JUL, 10), + 1928: (JUN, 28), + 1929: (JUN, 17), + 1930: (JUN, 6), + 1931: (MAY, 28), + 1932: (MAY, 16), + 1933: (MAY, 5), + 1934: (APR, 24), + 1935: (APR, 14), + 1936: (APR, 2), + 1937: (MAR, 23), + 1938: (MAR, 11), + 1939: (MAR, 1), + 1940: (FEB, 18), + 1941: (FEB, 6), + 1942: (JAN, 27), + 1943: (JAN, 16), + 1944: ((JAN, 5), (DEC, 25)), + 1945: (DEC, 14), + 1946: (DEC, 4), + 1947: (NOV, 23), + 1948: (NOV, 11), + 1949: (NOV, 1), + 1950: (OCT, 22), + 1951: (OCT, 11), + 1952: (SEP, 30), + 1953: (SEP, 19), + 1954: (SEP, 8), + 1955: (AUG, 29), + 1956: (AUG, 17), + 1957: (AUG, 6), + 1958: (JUL, 27), + 1959: (JUL, 16), + 1960: (JUL, 4), + 1961: (JUN, 23), + 1962: (JUN, 12), + 1963: (JUN, 2), + 1964: (MAY, 21), + 1965: (MAY, 10), + 1966: (APR, 30), + 1967: (APR, 20), + 1968: (APR, 8), + 1969: (MAR, 28), + 1970: (MAR, 18), + 1971: (MAR, 7), + 1972: (FEB, 25), + 1973: (FEB, 13), + 1974: (FEB, 2), + 1975: (JAN, 22), + 1976: ((JAN, 11), (DEC, 31)), + 1977: (DEC, 20), + 1978: (DEC, 10), + 1979: (NOV, 29), + 1980: (NOV, 18), + 1981: (NOV, 6), + 1982: (OCT, 27), + 1983: (OCT, 16), + 1984: (OCT, 5), + 1985: (SEP, 24), + 1986: (SEP, 14), + 1987: (SEP, 3), + 1988: (AUG, 22), + 1989: (AUG, 11), + 1990: (AUG, 1), + 1991: (JUL, 21), + 1992: (JUL, 10), + 1993: (JUN, 30), + 1994: (JUN, 19), + 1995: (JUN, 8), + 1996: (MAY, 27), + 1997: (MAY, 16), + 1998: (MAY, 6), + 1999: (APR, 26), + 2000: (APR, 15), + 2001: (APR, 4), + 2002: (MAR, 24), + 2003: (MAR, 13), + 2004: (MAR, 1), + 2005: (FEB, 19), + 2006: (FEB, 9), + 2007: (JAN, 29), + 2008: (JAN, 19), + 2009: ((JAN, 7), (DEC, 27)), + 2010: (DEC, 16), + 2011: (DEC, 5), + 2012: (NOV, 24), + 2013: (NOV, 13), + 2014: (NOV, 3), + 2015: (OCT, 23), + 2016: (OCT, 11), + 2017: (SEP, 30), + 2018: (SEP, 20), + 2019: (SEP, 9), + 2020: (AUG, 29), + 2021: (AUG, 18), + 2022: (AUG, 8), + 2023: (JUL, 28), + 2024: (JUL, 16), + 2025: (JUL, 5), + 2026: (JUN, 25), + 2027: (JUN, 15), + 2028: (JUN, 3), + 2029: (MAY, 23), + 2030: (MAY, 12), + 2031: (MAY, 2), + 2032: (APR, 20), + 2033: (APR, 10), + 2034: (MAR, 30), + 2035: (MAR, 20), + 2036: (MAR, 8), + 2037: (FEB, 25), + 2038: (FEB, 14), + 2039: (FEB, 4), + 2040: (JAN, 24), + 2041: (JAN, 13), + 2042: ((JAN, 2), (DEC, 23)), + 2043: (DEC, 12), + 2044: (NOV, 30), + 2045: (NOV, 19), + 2046: (NOV, 9), + 2047: (OCT, 29), + 2048: (OCT, 18), + 2049: (OCT, 7), + 2050: (SEP, 26), + 2051: (SEP, 15), + 2052: (SEP, 4), + 2053: (AUG, 24), + 2054: (AUG, 14), + 2055: (AUG, 3), + 2056: (JUL, 23), + 2057: (JUL, 12), + 2058: (JUL, 1), + 2059: (JUN, 20), + 2060: (JUN, 9), + 2061: (MAY, 29), + 2062: (MAY, 19), + 2063: (MAY, 9), + 2064: (APR, 27), + 2065: (APR, 16), + 2066: (APR, 5), + 2067: (MAR, 25), + 2068: (MAR, 14), + 2069: (MAR, 4), + 2070: (FEB, 21), + 2071: (FEB, 10), + 2072: (JAN, 30), + 2073: (JAN, 18), + 2074: ((JAN, 8), (DEC, 28)), + 2075: (DEC, 18), + 2076: (DEC, 6), + } + + EID_AL_ADHA_DATES = { + 1925: (JUL, 2), + 1926: (JUN, 21), + 1927: (JUN, 10), + 1928: (MAY, 30), + 1929: (MAY, 19), + 1930: (MAY, 9), + 1931: (APR, 28), + 1932: (APR, 16), + 1933: (APR, 5), + 1934: (MAR, 26), + 1935: (MAR, 15), + 1936: (MAR, 4), + 1937: (FEB, 21), + 1938: (FEB, 10), + 1939: (JAN, 30), + 1940: (JAN, 20), + 1941: ((JAN, 8), (DEC, 28)), + 1942: (DEC, 18), + 1943: (DEC, 7), + 1944: (NOV, 25), + 1945: (NOV, 15), + 1946: (NOV, 4), + 1947: (OCT, 25), + 1948: (OCT, 13), + 1949: (OCT, 2), + 1950: (SEP, 23), + 1951: (SEP, 12), + 1952: (AUG, 31), + 1953: (AUG, 20), + 1954: (AUG, 9), + 1955: (JUL, 30), + 1956: (JUL, 19), + 1957: (JUL, 8), + 1958: (JUN, 27), + 1959: (JUN, 17), + 1960: (JUN, 4), + 1961: (MAY, 25), + 1962: (MAY, 14), + 1963: (MAY, 3), + 1964: (APR, 22), + 1965: (APR, 11), + 1966: (APR, 1), + 1967: (MAR, 21), + 1968: (MAR, 9), + 1969: (FEB, 27), + 1970: (FEB, 16), + 1971: (FEB, 6), + 1972: (JAN, 26), + 1973: (JAN, 14), + 1974: ((JAN, 3), (DEC, 24)), + 1975: (DEC, 13), + 1976: (DEC, 1), + 1977: (NOV, 21), + 1978: (NOV, 10), + 1979: (OCT, 31), + 1980: (OCT, 19), + 1981: (OCT, 8), + 1982: (SEP, 27), + 1983: (SEP, 17), + 1984: (SEP, 5), + 1985: (AUG, 26), + 1986: (AUG, 15), + 1987: (AUG, 4), + 1988: (JUL, 23), + 1989: (JUL, 13), + 1990: (JUL, 2), + 1991: (JUN, 22), + 1992: (JUN, 11), + 1993: (MAY, 31), + 1994: (MAY, 20), + 1995: (MAY, 9), + 1996: (APR, 27), + 1997: (APR, 17), + 1998: (APR, 7), + 1999: (MAR, 27), + 2000: (MAR, 16), + 2001: (MAR, 5), + 2002: (FEB, 22), + 2003: (FEB, 11), + 2004: (FEB, 1), + 2005: (JAN, 21), + 2006: ((JAN, 10), (DEC, 31)), + 2007: (DEC, 20), + 2008: (DEC, 8), + 2009: (NOV, 27), + 2010: (NOV, 16), + 2011: (NOV, 6), + 2012: (OCT, 26), + 2013: (OCT, 15), + 2014: (OCT, 4), + 2015: (SEP, 23), + 2016: (SEP, 11), + 2017: (SEP, 1), + 2018: (AUG, 21), + 2019: (AUG, 11), + 2020: (JUL, 31), + 2021: (JUL, 20), + 2022: (JUL, 9), + 2023: (JUN, 28), + 2024: (JUN, 16), + 2025: (JUN, 6), + 2026: (MAY, 27), + 2027: (MAY, 16), + 2028: (MAY, 5), + 2029: (APR, 24), + 2030: (APR, 13), + 2031: (APR, 2), + 2032: (MAR, 22), + 2033: (MAR, 11), + 2034: (MAR, 1), + 2035: (FEB, 18), + 2036: (FEB, 7), + 2037: (JAN, 26), + 2038: (JAN, 16), + 2039: ((JAN, 5), (DEC, 26)), + 2040: (DEC, 14), + 2041: (DEC, 4), + 2042: (NOV, 23), + 2043: (NOV, 12), + 2044: (OCT, 31), + 2045: (OCT, 21), + 2046: (OCT, 10), + 2047: (SEP, 30), + 2048: (SEP, 19), + 2049: (SEP, 8), + 2050: (AUG, 28), + 2051: (AUG, 17), + 2052: (AUG, 5), + 2053: (JUL, 26), + 2054: (JUL, 15), + 2055: (JUL, 5), + 2056: (JUN, 23), + 2057: (JUN, 12), + 2058: (JUN, 1), + 2059: (MAY, 22), + 2060: (MAY, 10), + 2061: (APR, 30), + 2062: (APR, 20), + 2063: (APR, 9), + 2064: (MAR, 28), + 2065: (MAR, 17), + 2066: (MAR, 6), + 2067: (FEB, 24), + 2068: (FEB, 13), + 2069: (FEB, 2), + 2070: (JAN, 22), + 2071: ((JAN, 11), (DEC, 31)), + 2072: (DEC, 20), + 2073: (DEC, 9), + 2074: (NOV, 29), + 2075: (NOV, 18), + 2076: (NOV, 7), + 2077: (OCT, 27), + } + + EID_AL_FITR_DATES = { + 1925: (APR, 24), + 1926: (APR, 14), + 1927: (APR, 3), + 1928: (MAR, 22), + 1929: (MAR, 12), + 1930: (MAR, 1), + 1931: (FEB, 19), + 1932: (FEB, 8), + 1933: (JAN, 27), + 1934: (JAN, 17), + 1935: ((JAN, 7), (DEC, 27)), + 1936: (DEC, 15), + 1937: (DEC, 4), + 1938: (NOV, 23), + 1939: (NOV, 12), + 1940: (NOV, 1), + 1941: (OCT, 21), + 1942: (OCT, 11), + 1943: (SEP, 30), + 1944: (SEP, 18), + 1945: (SEP, 7), + 1946: (AUG, 28), + 1947: (AUG, 18), + 1948: (AUG, 6), + 1949: (JUL, 26), + 1950: (JUL, 16), + 1951: (JUL, 6), + 1952: (JUN, 23), + 1953: (JUN, 13), + 1954: (JUN, 2), + 1955: (MAY, 23), + 1956: (MAY, 11), + 1957: (MAY, 1), + 1958: (APR, 20), + 1959: (APR, 10), + 1960: (MAR, 28), + 1961: (MAR, 18), + 1962: (MAR, 7), + 1963: (FEB, 24), + 1964: (FEB, 14), + 1965: (FEB, 2), + 1966: (JAN, 22), + 1967: (JAN, 12), + 1968: ((JAN, 1), (DEC, 21)), + 1969: (DEC, 10), + 1970: (NOV, 30), + 1971: (NOV, 19), + 1972: (NOV, 7), + 1973: (OCT, 27), + 1974: (OCT, 16), + 1975: (OCT, 6), + 1976: (SEP, 24), + 1977: (SEP, 14), + 1978: (SEP, 3), + 1979: (AUG, 23), + 1980: (AUG, 12), + 1981: (AUG, 1), + 1982: (JUL, 21), + 1983: (JUL, 11), + 1984: (JUN, 30), + 1985: (JUN, 19), + 1986: (JUN, 8), + 1987: (MAY, 28), + 1988: (MAY, 16), + 1989: (MAY, 6), + 1990: (APR, 26), + 1991: (APR, 15), + 1992: (APR, 4), + 1993: (MAR, 24), + 1994: (MAR, 13), + 1995: (MAR, 2), + 1996: (FEB, 19), + 1997: (FEB, 8), + 1998: (JAN, 29), + 1999: (JAN, 18), + 2000: ((JAN, 8), (DEC, 27)), + 2001: (DEC, 16), + 2002: (DEC, 5), + 2003: (NOV, 25), + 2004: (NOV, 14), + 2005: (NOV, 3), + 2006: (OCT, 23), + 2007: (OCT, 13), + 2008: (OCT, 1), + 2009: (SEP, 20), + 2010: (SEP, 10), + 2011: (AUG, 30), + 2012: (AUG, 19), + 2013: (AUG, 8), + 2014: (JUL, 28), + 2015: (JUL, 17), + 2016: (JUL, 6), + 2017: (JUN, 25), + 2018: (JUN, 15), + 2019: (JUN, 4), + 2020: (MAY, 24), + 2021: (MAY, 13), + 2022: (MAY, 2), + 2023: (APR, 21), + 2024: (APR, 10), + 2025: (MAR, 30), + 2026: (MAR, 20), + 2027: (MAR, 9), + 2028: (FEB, 26), + 2029: (FEB, 14), + 2030: (FEB, 4), + 2031: (JAN, 24), + 2032: (JAN, 14), + 2033: ((JAN, 2), (DEC, 23)), + 2034: (DEC, 12), + 2035: (DEC, 1), + 2036: (NOV, 19), + 2037: (NOV, 8), + 2038: (OCT, 29), + 2039: (OCT, 19), + 2040: (OCT, 7), + 2041: (SEP, 26), + 2042: (SEP, 15), + 2043: (SEP, 4), + 2044: (AUG, 24), + 2045: (AUG, 14), + 2046: (AUG, 3), + 2047: (JUL, 24), + 2048: (JUL, 12), + 2049: (JUL, 1), + 2050: (JUN, 20), + 2051: (JUN, 10), + 2052: (MAY, 29), + 2053: (MAY, 19), + 2054: (MAY, 9), + 2055: (APR, 28), + 2056: (APR, 16), + 2057: (APR, 5), + 2058: (MAR, 25), + 2059: (MAR, 15), + 2060: (MAR, 4), + 2061: (FEB, 21), + 2062: (FEB, 10), + 2063: (JAN, 30), + 2064: (JAN, 20), + 2065: ((JAN, 8), (DEC, 28)), + 2066: (DEC, 18), + 2067: (DEC, 8), + 2068: (NOV, 26), + 2069: (NOV, 15), + 2070: (NOV, 4), + 2071: (OCT, 24), + 2072: (OCT, 13), + 2073: (OCT, 2), + 2074: (SEP, 22), + 2075: (SEP, 11), + 2076: (AUG, 30), + 2077: (AUG, 19), + } + + EID_AL_GHADIR_DATES = { + 1925: (JUL, 10), + 1926: (JUN, 29), + 1927: (JUN, 18), + 1928: (JUN, 7), + 1929: (MAY, 27), + 1930: (MAY, 17), + 1931: (MAY, 6), + 1932: (APR, 24), + 1933: (APR, 13), + 1934: (APR, 3), + 1935: (MAR, 23), + 1936: (MAR, 12), + 1937: (MAR, 1), + 1938: (FEB, 18), + 1939: (FEB, 7), + 1940: (JAN, 28), + 1941: (JAN, 16), + 1942: ((JAN, 5), (DEC, 26)), + 1943: (DEC, 15), + 1944: (DEC, 3), + 1945: (NOV, 23), + 1946: (NOV, 12), + 1947: (NOV, 2), + 1948: (OCT, 21), + 1949: (OCT, 10), + 1950: (OCT, 1), + 1951: (SEP, 20), + 1952: (SEP, 8), + 1953: (AUG, 28), + 1954: (AUG, 17), + 1955: (AUG, 7), + 1956: (JUL, 27), + 1957: (JUL, 16), + 1958: (JUL, 5), + 1959: (JUN, 25), + 1960: (JUN, 12), + 1961: (JUN, 2), + 1962: (MAY, 22), + 1963: (MAY, 11), + 1964: (APR, 30), + 1965: (APR, 19), + 1966: (APR, 9), + 1967: (MAR, 29), + 1968: (MAR, 17), + 1969: (MAR, 7), + 1970: (FEB, 24), + 1971: (FEB, 14), + 1972: (FEB, 3), + 1973: (JAN, 22), + 1974: (JAN, 11), + 1975: ((JAN, 1), (DEC, 21)), + 1976: (DEC, 9), + 1977: (NOV, 29), + 1978: (NOV, 18), + 1979: (NOV, 8), + 1980: (OCT, 27), + 1981: (OCT, 16), + 1982: (OCT, 5), + 1983: (SEP, 25), + 1984: (SEP, 13), + 1985: (SEP, 3), + 1986: (AUG, 23), + 1987: (AUG, 12), + 1988: (JUL, 31), + 1989: (JUL, 21), + 1990: (JUL, 10), + 1991: (JUN, 30), + 1992: (JUN, 19), + 1993: (JUN, 8), + 1994: (MAY, 28), + 1995: (MAY, 17), + 1996: (MAY, 5), + 1997: (APR, 25), + 1998: (APR, 15), + 1999: (APR, 4), + 2000: (MAR, 24), + 2001: (MAR, 13), + 2002: (MAR, 2), + 2003: (FEB, 19), + 2004: (FEB, 9), + 2005: (JAN, 29), + 2006: (JAN, 18), + 2007: ((JAN, 8), (DEC, 28)), + 2008: (DEC, 16), + 2009: (DEC, 5), + 2010: (NOV, 24), + 2011: (NOV, 14), + 2012: (NOV, 3), + 2013: (OCT, 23), + 2014: (OCT, 12), + 2015: (OCT, 1), + 2016: (SEP, 19), + 2017: (SEP, 9), + 2018: (AUG, 29), + 2019: (AUG, 19), + 2020: (AUG, 8), + 2021: (JUL, 28), + 2022: (JUL, 17), + 2023: (JUL, 6), + 2024: (JUN, 24), + 2025: (JUN, 14), + 2026: (JUN, 4), + 2027: (MAY, 24), + 2028: (MAY, 13), + 2029: (MAY, 2), + 2030: (APR, 21), + 2031: (APR, 10), + 2032: (MAR, 30), + 2033: (MAR, 19), + 2034: (MAR, 9), + 2035: (FEB, 26), + 2036: (FEB, 15), + 2037: (FEB, 3), + 2038: (JAN, 24), + 2039: (JAN, 13), + 2040: ((JAN, 3), (DEC, 22)), + 2041: (DEC, 12), + 2042: (DEC, 1), + 2043: (NOV, 20), + 2044: (NOV, 8), + 2045: (OCT, 29), + 2046: (OCT, 18), + 2047: (OCT, 8), + 2048: (SEP, 27), + 2049: (SEP, 16), + 2050: (SEP, 5), + 2051: (AUG, 25), + 2052: (AUG, 13), + 2053: (AUG, 3), + 2054: (JUL, 23), + 2055: (JUL, 13), + 2056: (JUL, 1), + 2057: (JUN, 20), + 2058: (JUN, 9), + 2059: (MAY, 30), + 2060: (MAY, 18), + 2061: (MAY, 8), + 2062: (APR, 28), + 2063: (APR, 17), + 2064: (APR, 5), + 2065: (MAR, 25), + 2066: (MAR, 14), + 2067: (MAR, 4), + 2068: (FEB, 21), + 2069: (FEB, 10), + 2070: (JAN, 30), + 2071: (JAN, 19), + 2072: ((JAN, 8), (DEC, 28)), + 2073: (DEC, 17), + 2074: (DEC, 7), + 2075: (NOV, 26), + 2076: (NOV, 15), + 2077: (NOV, 4), + } + + FATIMA_DEATH_DATES = { + 1924: (DEC, 29), + 1925: (DEC, 19), + 1926: (DEC, 9), + 1927: (NOV, 27), + 1928: (NOV, 15), + 1929: (NOV, 5), + 1930: (OCT, 25), + 1931: (OCT, 15), + 1932: (OCT, 4), + 1933: (SEP, 23), + 1934: (SEP, 12), + 1935: (SEP, 1), + 1936: (AUG, 21), + 1937: (AUG, 10), + 1938: (JUL, 30), + 1939: (JUL, 20), + 1940: (JUL, 9), + 1941: (JUN, 27), + 1942: (JUN, 17), + 1943: (JUN, 6), + 1944: (MAY, 25), + 1945: (MAY, 15), + 1946: (MAY, 4), + 1947: (APR, 24), + 1948: (APR, 12), + 1949: (APR, 1), + 1950: (MAR, 22), + 1951: (MAR, 12), + 1952: (FEB, 28), + 1953: (FEB, 17), + 1954: (FEB, 6), + 1955: (JAN, 27), + 1956: (JAN, 17), + 1957: ((JAN, 4), (DEC, 24)), + 1958: (DEC, 15), + 1959: (DEC, 3), + 1960: (NOV, 22), + 1961: (NOV, 11), + 1962: (OCT, 31), + 1963: (OCT, 21), + 1964: (OCT, 9), + 1965: (SEP, 28), + 1966: (SEP, 18), + 1967: (SEP, 7), + 1968: (AUG, 27), + 1969: (AUG, 16), + 1970: (AUG, 6), + 1971: (JUL, 26), + 1972: (JUL, 14), + 1973: (JUL, 3), + 1974: (JUN, 23), + 1975: (JUN, 12), + 1976: (JUN, 1), + 1977: (MAY, 21), + 1978: (MAY, 10), + 1979: (APR, 29), + 1980: (APR, 18), + 1981: (APR, 7), + 1982: (MAR, 28), + 1983: (MAR, 17), + 1984: (MAR, 5), + 1985: (FEB, 22), + 1986: (FEB, 12), + 1987: (FEB, 1), + 1988: (JAN, 22), + 1989: ((JAN, 10), (DEC, 31)), + 1990: (DEC, 20), + 1991: (DEC, 9), + 1992: (NOV, 27), + 1993: (NOV, 16), + 1994: (NOV, 6), + 1995: (OCT, 27), + 1996: (OCT, 15), + 1997: (OCT, 4), + 1998: (SEP, 23), + 1999: (SEP, 13), + 2000: (SEP, 1), + 2001: (AUG, 22), + 2002: (AUG, 12), + 2003: (AUG, 1), + 2004: (JUL, 20), + 2005: (JUL, 9), + 2006: (JUN, 29), + 2007: (JUN, 18), + 2008: (JUN, 7), + 2009: (MAY, 27), + 2010: (MAY, 17), + 2011: (MAY, 6), + 2012: (APR, 24), + 2013: (APR, 13), + 2014: (APR, 3), + 2015: (MAR, 23), + 2016: (MAR, 12), + 2017: (MAR, 2), + 2018: (FEB, 19), + 2019: (FEB, 8), + 2020: (JAN, 28), + 2021: (JAN, 16), + 2022: ((JAN, 6), (DEC, 27)), + 2023: (DEC, 16), + 2024: (DEC, 4), + 2025: (NOV, 24), + 2026: (NOV, 13), + 2027: (NOV, 2), + 2028: (OCT, 21), + 2029: (OCT, 11), + 2030: (OCT, 1), + 2031: (SEP, 20), + 2032: (SEP, 8), + 2033: (AUG, 28), + 2034: (AUG, 17), + 2035: (AUG, 7), + 2036: (JUL, 26), + 2037: (JUL, 16), + 2038: (JUL, 5), + 2039: (JUN, 25), + 2040: (JUN, 13), + 2041: (JUN, 2), + 2042: (MAY, 22), + 2043: (MAY, 12), + 2044: (MAY, 1), + 2045: (APR, 20), + 2046: (APR, 9), + 2047: (MAR, 29), + 2048: (MAR, 18), + 2049: (MAR, 7), + 2050: (FEB, 25), + 2051: (FEB, 14), + 2052: (FEB, 4), + 2053: (JAN, 23), + 2054: (JAN, 12), + 2055: ((JAN, 1), (DEC, 21)), + 2056: (DEC, 10), + 2057: (NOV, 29), + 2058: (NOV, 19), + 2059: (NOV, 8), + 2060: (OCT, 27), + 2061: (OCT, 17), + 2062: (OCT, 6), + 2063: (SEP, 26), + 2064: (SEP, 14), + 2065: (SEP, 4), + 2066: (AUG, 24), + 2067: (AUG, 13), + 2068: (AUG, 1), + 2069: (JUL, 22), + 2070: (JUL, 11), + 2071: (JUL, 1), + 2072: (JUN, 19), + 2073: (JUN, 9), + 2074: (MAY, 29), + 2075: (MAY, 18), + 2076: (MAY, 6), + 2077: (APR, 26), + } + + GRAND_MAGAL_OF_TOUBA_DATES = { + 1924: (SEP, 17), + 1925: (SEP, 7), + 1926: (AUG, 27), + 1927: (AUG, 16), + 1928: (AUG, 4), + 1929: (JUL, 25), + 1930: (JUL, 14), + 1931: (JUL, 4), + 1932: (JUN, 23), + 1933: (JUN, 12), + 1934: (JUN, 1), + 1935: (MAY, 21), + 1936: (MAY, 10), + 1937: (APR, 29), + 1938: (APR, 18), + 1939: (APR, 8), + 1940: (MAR, 27), + 1941: (MAR, 16), + 1942: (MAR, 6), + 1943: (FEB, 23), + 1944: (FEB, 12), + 1945: (FEB, 1), + 1946: (JAN, 21), + 1947: ((JAN, 11), (DEC, 31)), + 1948: (DEC, 19), + 1949: (DEC, 9), + 1950: (NOV, 29), + 1951: (NOV, 18), + 1952: (NOV, 6), + 1953: (OCT, 26), + 1954: (OCT, 16), + 1955: (OCT, 6), + 1956: (SEP, 23), + 1957: (SEP, 13), + 1958: (SEP, 3), + 1959: (AUG, 22), + 1960: (AUG, 11), + 1961: (JUL, 31), + 1962: (JUL, 20), + 1963: (JUL, 9), + 1964: (JUN, 28), + 1965: (JUN, 17), + 1966: (JUN, 7), + 1967: (MAY, 27), + 1968: (MAY, 15), + 1969: (MAY, 5), + 1970: (APR, 25), + 1971: (APR, 14), + 1972: (APR, 2), + 1973: (MAR, 23), + 1974: (MAR, 12), + 1975: (MAR, 1), + 1976: (FEB, 18), + 1977: (FEB, 6), + 1978: (JAN, 27), + 1979: (JAN, 16), + 1980: ((JAN, 6), (DEC, 25)), + 1981: (DEC, 14), + 1982: (DEC, 3), + 1983: (NOV, 22), + 1984: (NOV, 11), + 1985: (NOV, 1), + 1986: (OCT, 21), + 1987: (OCT, 11), + 1988: (SEP, 29), + 1989: (SEP, 18), + 1990: (SEP, 7), + 1991: (AUG, 28), + 1992: (AUG, 16), + 1993: (AUG, 6), + 1994: (JUL, 26), + 1995: (JUL, 16), + 1996: (JUL, 4), + 1997: (JUN, 23), + 1998: (JUN, 12), + 1999: (JUN, 2), + 2000: (MAY, 22), + 2001: (MAY, 12), + 2002: (MAY, 1), + 2003: (APR, 20), + 2004: (APR, 8), + 2005: (MAR, 28), + 2006: (MAR, 18), + 2007: (MAR, 8), + 2008: (FEB, 25), + 2009: (FEB, 13), + 2010: (FEB, 2), + 2011: (JAN, 22), + 2012: ((JAN, 12), (DEC, 31)), + 2013: (DEC, 21), + 2014: (DEC, 10), + 2015: (NOV, 30), + 2016: (NOV, 18), + 2017: (NOV, 7), + 2018: (OCT, 27), + 2019: (OCT, 17), + 2020: (OCT, 5), + 2021: (SEP, 25), + 2022: (SEP, 14), + 2023: (SEP, 3), + 2024: (AUG, 22), + 2025: (AUG, 12), + 2026: (AUG, 1), + 2027: (JUL, 22), + 2028: (JUL, 11), + 2029: (JUN, 30), + 2030: (JUN, 19), + 2031: (JUN, 8), + 2032: (MAY, 27), + 2033: (MAY, 17), + 2034: (MAY, 7), + 2035: (APR, 26), + 2036: (APR, 15), + 2037: (APR, 4), + 2038: (MAR, 24), + 2039: (MAR, 13), + 2040: (MAR, 2), + 2041: (FEB, 19), + 2042: (FEB, 9), + 2043: (JAN, 29), + 2044: (JAN, 19), + 2045: ((JAN, 7), (DEC, 27)), + 2046: (DEC, 16), + 2047: (DEC, 6), + 2048: (NOV, 24), + 2049: (NOV, 14), + 2050: (NOV, 3), + 2051: (OCT, 23), + 2052: (OCT, 11), + 2053: (SEP, 30), + 2054: (SEP, 20), + 2055: (SEP, 10), + 2056: (AUG, 29), + 2057: (AUG, 18), + 2058: (AUG, 7), + 2059: (JUL, 28), + 2060: (JUL, 16), + 2061: (JUL, 6), + 2062: (JUN, 25), + 2063: (JUN, 15), + 2064: (JUN, 3), + 2065: (MAY, 23), + 2066: (MAY, 12), + 2067: (MAY, 2), + 2068: (APR, 20), + 2069: (APR, 10), + 2070: (MAR, 31), + 2071: (MAR, 20), + 2072: (MAR, 8), + 2073: (FEB, 25), + 2074: (FEB, 14), + 2075: (FEB, 4), + 2076: (JAN, 24), + 2077: (JAN, 13), + } + + HARI_HOL_JOHOR_DATES = { + 1924: (SEP, 5), + 1925: (AUG, 26), + 1926: (AUG, 15), + 1927: (AUG, 4), + 1928: (JUL, 23), + 1929: (JUL, 13), + 1930: (JUL, 2), + 1931: (JUN, 22), + 1932: (JUN, 11), + 1933: (MAY, 31), + 1934: (MAY, 20), + 1935: (MAY, 9), + 1936: (APR, 28), + 1937: (APR, 17), + 1938: (APR, 6), + 1939: (MAR, 27), + 1940: (MAR, 15), + 1941: (MAR, 4), + 1942: (FEB, 22), + 1943: (FEB, 11), + 1944: (JAN, 31), + 1945: (JAN, 20), + 1946: ((JAN, 9), (DEC, 30)), + 1947: (DEC, 19), + 1948: (DEC, 7), + 1949: (NOV, 27), + 1950: (NOV, 17), + 1951: (NOV, 6), + 1952: (OCT, 25), + 1953: (OCT, 14), + 1954: (OCT, 4), + 1955: (SEP, 24), + 1956: (SEP, 11), + 1957: (SEP, 1), + 1958: (AUG, 22), + 1959: (AUG, 10), + 1960: (JUL, 30), + 1961: (JUL, 19), + 1962: (JUL, 8), + 1963: (JUN, 27), + 1964: (JUN, 16), + 1965: (JUN, 5), + 1966: (MAY, 26), + 1967: (MAY, 15), + 1968: (MAY, 3), + 1969: (APR, 23), + 1970: (APR, 13), + 1971: (APR, 2), + 1972: (MAR, 21), + 1973: (MAR, 11), + 1974: (FEB, 28), + 1975: (FEB, 17), + 1976: (FEB, 6), + 1977: (JAN, 25), + 1978: (JAN, 15), + 1979: ((JAN, 4), (DEC, 25)), + 1980: (DEC, 13), + 1981: (DEC, 2), + 1982: (NOV, 21), + 1983: (NOV, 10), + 1984: (OCT, 30), + 1985: (OCT, 20), + 1986: (OCT, 9), + 1987: (SEP, 29), + 1988: (SEP, 17), + 1989: (SEP, 6), + 1990: (AUG, 26), + 1991: (AUG, 16), + 1992: (AUG, 4), + 1993: (JUL, 25), + 1994: (JUL, 14), + 1995: (JUL, 4), + 1996: (JUN, 22), + 1997: (JUN, 11), + 1998: (MAY, 31), + 1999: (MAY, 21), + 2000: (MAY, 10), + 2001: (APR, 30), + 2002: (APR, 19), + 2003: (APR, 8), + 2004: (MAR, 27), + 2005: (MAR, 16), + 2006: (MAR, 6), + 2007: (FEB, 24), + 2008: (FEB, 13), + 2009: (FEB, 1), + 2010: (JAN, 21), + 2011: ((JAN, 10), (DEC, 31)), + 2012: (DEC, 19), + 2013: (DEC, 9), + 2014: (NOV, 28), + 2015: (NOV, 18), + 2016: (NOV, 6), + 2017: (OCT, 26), + 2018: (OCT, 15), + 2019: (OCT, 5), + 2020: (SEP, 23), + 2021: (SEP, 13), + 2022: (SEP, 2), + 2023: (AUG, 22), + 2024: (AUG, 10), + 2025: (JUL, 31), + 2026: (JUL, 20), + 2027: (JUL, 10), + 2028: (JUN, 29), + 2029: (JUN, 18), + 2030: (JUN, 7), + 2031: (MAY, 27), + 2032: (MAY, 15), + 2033: (MAY, 5), + 2034: (APR, 25), + 2035: (APR, 14), + 2036: (APR, 3), + 2037: (MAR, 23), + 2038: (MAR, 12), + 2039: (MAR, 1), + 2040: (FEB, 19), + 2041: (FEB, 7), + 2042: (JAN, 28), + 2043: (JAN, 17), + 2044: ((JAN, 7), (DEC, 26)), + 2045: (DEC, 15), + 2046: (DEC, 4), + 2047: (NOV, 24), + 2048: (NOV, 12), + 2049: (NOV, 2), + 2050: (OCT, 22), + 2051: (OCT, 11), + 2052: (SEP, 29), + 2053: (SEP, 18), + 2054: (SEP, 8), + 2055: (AUG, 29), + 2056: (AUG, 17), + 2057: (AUG, 6), + 2058: (JUL, 26), + 2059: (JUL, 16), + 2060: (JUL, 4), + 2061: (JUN, 24), + 2062: (JUN, 13), + 2063: (JUN, 3), + 2064: (MAY, 22), + 2065: (MAY, 11), + 2066: (APR, 30), + 2067: (APR, 20), + 2068: (APR, 8), + 2069: (MAR, 29), + 2070: (MAR, 19), + 2071: (MAR, 8), + 2072: (FEB, 25), + 2073: (FEB, 13), + 2074: (FEB, 2), + 2075: (JAN, 23), + 2076: (JAN, 12), + 2077: (JAN, 1), + } + + HASAN_AL_ASKARI_DEATH_DATES = { + 1924: (OCT, 6), + 1925: (SEP, 26), + 1926: (SEP, 15), + 1927: (SEP, 4), + 1928: (AUG, 23), + 1929: (AUG, 13), + 1930: (AUG, 2), + 1931: (JUL, 24), + 1932: (JUL, 12), + 1933: (JUL, 1), + 1934: (JUN, 20), + 1935: (JUN, 10), + 1936: (MAY, 29), + 1937: (MAY, 18), + 1938: (MAY, 7), + 1939: (APR, 28), + 1940: (APR, 16), + 1941: (APR, 4), + 1942: (MAR, 25), + 1943: (MAR, 14), + 1944: (MAR, 2), + 1945: (FEB, 20), + 1946: (FEB, 9), + 1947: (JAN, 30), + 1948: (JAN, 19), + 1949: ((JAN, 7), (DEC, 28)), + 1950: (DEC, 18), + 1951: (DEC, 7), + 1952: (NOV, 26), + 1953: (NOV, 15), + 1954: (NOV, 4), + 1955: (OCT, 25), + 1956: (OCT, 13), + 1957: (OCT, 2), + 1958: (SEP, 22), + 1959: (SEP, 11), + 1960: (AUG, 30), + 1961: (AUG, 19), + 1962: (AUG, 8), + 1963: (JUL, 29), + 1964: (JUL, 17), + 1965: (JUL, 6), + 1966: (JUN, 27), + 1967: (JUN, 15), + 1968: (JUN, 4), + 1969: (MAY, 24), + 1970: (MAY, 14), + 1971: (MAY, 3), + 1972: (APR, 21), + 1973: (APR, 11), + 1974: (MAR, 31), + 1975: (MAR, 20), + 1976: (MAR, 8), + 1977: (FEB, 26), + 1978: (FEB, 15), + 1979: (FEB, 5), + 1980: (JAN, 26), + 1981: (JAN, 14), + 1982: ((JAN, 3), (DEC, 23)), + 1983: (DEC, 12), + 1984: (NOV, 30), + 1985: (NOV, 20), + 1986: (NOV, 10), + 1987: (OCT, 30), + 1988: (OCT, 18), + 1989: (OCT, 7), + 1990: (SEP, 27), + 1991: (SEP, 16), + 1992: (SEP, 5), + 1993: (AUG, 25), + 1994: (AUG, 15), + 1995: (AUG, 4), + 1996: (JUL, 23), + 1997: (JUL, 12), + 1998: (JUL, 2), + 1999: (JUN, 22), + 2000: (JUN, 10), + 2001: (MAY, 31), + 2002: (MAY, 20), + 2003: (MAY, 9), + 2004: (APR, 27), + 2005: (APR, 17), + 2006: (APR, 6), + 2007: (MAR, 27), + 2008: (MAR, 16), + 2009: (MAR, 5), + 2010: (FEB, 22), + 2011: (FEB, 11), + 2012: (JAN, 31), + 2013: (JAN, 20), + 2014: ((JAN, 9), (DEC, 30)), + 2015: (DEC, 19), + 2016: (DEC, 7), + 2017: (NOV, 26), + 2018: (NOV, 16), + 2019: (NOV, 5), + 2020: (OCT, 25), + 2021: (OCT, 14), + 2022: (OCT, 4), + 2023: (SEP, 23), + 2024: (SEP, 11), + 2025: (AUG, 31), + 2026: (AUG, 21), + 2027: (AUG, 10), + 2028: (JUL, 30), + 2029: (JUL, 20), + 2030: (JUL, 9), + 2031: (JUN, 28), + 2032: (JUN, 16), + 2033: (JUN, 5), + 2034: (MAY, 26), + 2035: (MAY, 16), + 2036: (MAY, 4), + 2037: (APR, 24), + 2038: (APR, 13), + 2039: (APR, 2), + 2040: (MAR, 21), + 2041: (MAR, 11), + 2042: (FEB, 28), + 2043: (FEB, 18), + 2044: (FEB, 7), + 2045: (JAN, 26), + 2046: (JAN, 15), + 2047: ((JAN, 4), (DEC, 25)), + 2048: (DEC, 14), + 2049: (DEC, 3), + 2050: (NOV, 22), + 2051: (NOV, 12), + 2052: (OCT, 31), + 2053: (OCT, 20), + 2054: (OCT, 9), + 2055: (SEP, 29), + 2056: (SEP, 18), + 2057: (SEP, 7), + 2058: (AUG, 27), + 2059: (AUG, 16), + 2060: (AUG, 4), + 2061: (JUL, 25), + 2062: (JUL, 15), + 2063: (JUL, 4), + 2064: (JUN, 23), + 2065: (JUN, 12), + 2066: (JUN, 1), + 2067: (MAY, 21), + 2068: (MAY, 10), + 2069: (APR, 29), + 2070: (APR, 19), + 2071: (APR, 9), + 2072: (MAR, 28), + 2073: (MAR, 17), + 2074: (MAR, 6), + 2075: (FEB, 23), + 2076: (FEB, 13), + 2077: (FEB, 2), + } + + HIJRI_NEW_YEAR_DATES = { + 1924: (AUG, 1), + 1925: (JUL, 23), + 1926: (JUL, 11), + 1927: (JUL, 1), + 1928: (JUN, 19), + 1929: (JUN, 8), + 1930: (MAY, 28), + 1931: (MAY, 19), + 1932: (MAY, 7), + 1933: (APR, 26), + 1934: (APR, 15), + 1935: (APR, 5), + 1936: (MAR, 24), + 1937: (MAR, 14), + 1938: (MAR, 2), + 1939: (FEB, 20), + 1940: (FEB, 9), + 1941: (JAN, 28), + 1942: (JAN, 18), + 1943: ((JAN, 7), (DEC, 27)), + 1944: (DEC, 16), + 1945: (DEC, 5), + 1946: (NOV, 25), + 1947: (NOV, 14), + 1948: (NOV, 2), + 1949: (OCT, 23), + 1950: (OCT, 13), + 1951: (OCT, 2), + 1952: (SEP, 21), + 1953: (SEP, 10), + 1954: (AUG, 30), + 1955: (AUG, 20), + 1956: (AUG, 8), + 1957: (JUL, 28), + 1958: (JUL, 18), + 1959: (JUL, 7), + 1960: (JUN, 25), + 1961: (JUN, 14), + 1962: (JUN, 3), + 1963: (MAY, 24), + 1964: (MAY, 12), + 1965: (MAY, 1), + 1966: (APR, 21), + 1967: (APR, 11), + 1968: (MAR, 30), + 1969: (MAR, 19), + 1970: (MAR, 9), + 1971: (FEB, 26), + 1972: (FEB, 16), + 1973: (FEB, 4), + 1974: (JAN, 24), + 1975: (JAN, 13), + 1976: ((JAN, 2), (DEC, 22)), + 1977: (DEC, 11), + 1978: (DEC, 1), + 1979: (NOV, 20), + 1980: (NOV, 9), + 1981: (OCT, 28), + 1982: (OCT, 18), + 1983: (OCT, 7), + 1984: (SEP, 26), + 1985: (SEP, 15), + 1986: (SEP, 5), + 1987: (AUG, 25), + 1988: (AUG, 13), + 1989: (AUG, 2), + 1990: (JUL, 23), + 1991: (JUL, 12), + 1992: (JUL, 1), + 1993: (JUN, 21), + 1994: (JUN, 10), + 1995: (MAY, 30), + 1996: (MAY, 18), + 1997: (MAY, 7), + 1998: (APR, 27), + 1999: (APR, 17), + 2000: (APR, 6), + 2001: (MAR, 26), + 2002: (MAR, 15), + 2003: (MAR, 4), + 2004: (FEB, 21), + 2005: (FEB, 10), + 2006: (JAN, 31), + 2007: (JAN, 20), + 2008: ((JAN, 10), (DEC, 29)), + 2009: (DEC, 18), + 2010: (DEC, 7), + 2011: (NOV, 26), + 2012: (NOV, 15), + 2013: (NOV, 4), + 2014: (OCT, 25), + 2015: (OCT, 14), + 2016: (OCT, 2), + 2017: (SEP, 21), + 2018: (SEP, 11), + 2019: (AUG, 31), + 2020: (AUG, 20), + 2021: (AUG, 9), + 2022: (JUL, 30), + 2023: (JUL, 19), + 2024: (JUL, 7), + 2025: (JUN, 26), + 2026: (JUN, 16), + 2027: (JUN, 6), + 2028: (MAY, 25), + 2029: (MAY, 14), + 2030: (MAY, 3), + 2031: (APR, 23), + 2032: (APR, 11), + 2033: (APR, 1), + 2034: (MAR, 21), + 2035: (MAR, 11), + 2036: (FEB, 28), + 2037: (FEB, 16), + 2038: (FEB, 5), + 2039: (JAN, 26), + 2040: (JAN, 15), + 2041: ((JAN, 4), (DEC, 24)), + 2042: (DEC, 14), + 2043: (DEC, 3), + 2044: (NOV, 21), + 2045: (NOV, 10), + 2046: (OCT, 31), + 2047: (OCT, 20), + 2048: (OCT, 9), + 2049: (SEP, 28), + 2050: (SEP, 17), + 2051: (SEP, 6), + 2052: (AUG, 26), + 2053: (AUG, 15), + 2054: (AUG, 5), + 2055: (JUL, 25), + 2056: (JUL, 14), + 2057: (JUL, 3), + 2058: (JUN, 22), + 2059: (JUN, 11), + 2060: (MAY, 31), + 2061: (MAY, 20), + 2062: (MAY, 10), + 2063: (APR, 30), + 2064: (APR, 18), + 2065: (APR, 7), + 2066: (MAR, 27), + 2067: (MAR, 16), + 2068: (MAR, 5), + 2069: (FEB, 23), + 2070: (FEB, 12), + 2071: (FEB, 1), + 2072: (JAN, 21), + 2073: ((JAN, 9), (DEC, 30)), + 2074: (DEC, 19), + 2075: (DEC, 9), + 2076: (NOV, 27), + } + + IMAM_MAHDI_BIRTHDAY_DATES = { + 1925: (MAR, 11), + 1926: (FEB, 28), + 1927: (FEB, 18), + 1928: (FEB, 7), + 1929: (JAN, 26), + 1930: (JAN, 15), + 1931: ((JAN, 4), (DEC, 25)), + 1932: (DEC, 13), + 1933: (DEC, 3), + 1934: (NOV, 22), + 1935: (NOV, 12), + 1936: (OCT, 31), + 1937: (OCT, 20), + 1938: (OCT, 9), + 1939: (SEP, 29), + 1940: (SEP, 17), + 1941: (SEP, 6), + 1942: (AUG, 27), + 1943: (AUG, 16), + 1944: (AUG, 4), + 1945: (JUL, 25), + 1946: (JUL, 14), + 1947: (JUL, 4), + 1948: (JUN, 22), + 1949: (JUN, 11), + 1950: (JUN, 1), + 1951: (MAY, 22), + 1952: (MAY, 9), + 1953: (APR, 29), + 1954: (APR, 18), + 1955: (APR, 8), + 1956: (MAR, 28), + 1957: (MAR, 17), + 1958: (MAR, 5), + 1959: (FEB, 24), + 1960: (FEB, 12), + 1961: (FEB, 1), + 1962: (JAN, 21), + 1963: ((JAN, 11), (DEC, 31)), + 1964: (DEC, 19), + 1965: (DEC, 8), + 1966: (NOV, 28), + 1967: (NOV, 17), + 1968: (NOV, 6), + 1969: (OCT, 26), + 1970: (OCT, 16), + 1971: (OCT, 5), + 1972: (SEP, 23), + 1973: (SEP, 12), + 1974: (SEP, 2), + 1975: (AUG, 22), + 1976: (AUG, 11), + 1977: (JUL, 31), + 1978: (JUL, 20), + 1979: (JUL, 9), + 1980: (JUN, 28), + 1981: (JUN, 17), + 1982: (JUN, 7), + 1983: (MAY, 27), + 1984: (MAY, 16), + 1985: (MAY, 5), + 1986: (APR, 24), + 1987: (APR, 13), + 1988: (APR, 2), + 1989: (MAR, 22), + 1990: (MAR, 12), + 1991: (MAR, 1), + 1992: (FEB, 18), + 1993: (FEB, 6), + 1994: (JAN, 26), + 1995: (JAN, 16), + 1996: ((JAN, 6), (DEC, 25)), + 1997: (DEC, 15), + 1998: (DEC, 4), + 1999: (NOV, 23), + 2000: (NOV, 11), + 2001: (OCT, 31), + 2002: (OCT, 21), + 2003: (OCT, 11), + 2004: (SEP, 29), + 2005: (SEP, 19), + 2006: (SEP, 8), + 2007: (AUG, 28), + 2008: (AUG, 16), + 2009: (AUG, 6), + 2010: (JUL, 27), + 2011: (JUL, 16), + 2012: (JUL, 5), + 2013: (JUN, 24), + 2014: (JUN, 13), + 2015: (JUN, 2), + 2016: (MAY, 22), + 2017: (MAY, 11), + 2018: (MAY, 1), + 2019: (APR, 20), + 2020: (APR, 8), + 2021: (MAR, 28), + 2022: (MAR, 18), + 2023: (MAR, 7), + 2024: (FEB, 25), + 2025: (FEB, 14), + 2026: (FEB, 3), + 2027: (JAN, 23), + 2028: ((JAN, 12), (DEC, 31)), + 2029: (DEC, 21), + 2030: (DEC, 10), + 2031: (NOV, 30), + 2032: (NOV, 18), + 2033: (NOV, 7), + 2034: (OCT, 27), + 2035: (OCT, 16), + 2036: (OCT, 5), + 2037: (SEP, 25), + 2038: (SEP, 14), + 2039: (SEP, 4), + 2040: (AUG, 23), + 2041: (AUG, 12), + 2042: (AUG, 1), + 2043: (JUL, 22), + 2044: (JUL, 10), + 2045: (JUN, 30), + 2046: (JUN, 19), + 2047: (JUN, 9), + 2048: (MAY, 28), + 2049: (MAY, 17), + 2050: (MAY, 6), + 2051: (APR, 26), + 2052: (APR, 15), + 2053: (APR, 4), + 2054: (MAR, 24), + 2055: (MAR, 13), + 2056: (MAR, 2), + 2057: (FEB, 19), + 2058: (FEB, 8), + 2059: (JAN, 29), + 2060: (JAN, 19), + 2061: ((JAN, 7), (DEC, 27)), + 2062: (DEC, 16), + 2063: (DEC, 6), + 2064: (NOV, 24), + 2065: (NOV, 14), + 2066: (NOV, 3), + 2067: (OCT, 24), + 2068: (OCT, 12), + 2069: (OCT, 1), + 2070: (SEP, 20), + 2071: (SEP, 9), + 2072: (AUG, 29), + 2073: (AUG, 19), + 2074: (AUG, 8), + 2075: (JUL, 28), + 2076: (JUL, 16), + 2077: (JUL, 5), + } + + ISRA_AND_MIRAJ_DATES = { + 1925: (FEB, 21), + 1926: (FEB, 10), + 1927: (JAN, 31), + 1928: (JAN, 20), + 1929: ((JAN, 8), (DEC, 28)), + 1930: (DEC, 17), + 1931: (DEC, 7), + 1932: (NOV, 26), + 1933: (NOV, 15), + 1934: (NOV, 5), + 1935: (OCT, 25), + 1936: (OCT, 13), + 1937: (OCT, 2), + 1938: (SEP, 21), + 1939: (SEP, 11), + 1940: (AUG, 31), + 1941: (AUG, 19), + 1942: (AUG, 9), + 1943: (JUL, 29), + 1944: (JUL, 17), + 1945: (JUL, 7), + 1946: (JUN, 26), + 1947: (JUN, 16), + 1948: (JUN, 4), + 1949: (MAY, 24), + 1950: (MAY, 14), + 1951: (MAY, 4), + 1952: (APR, 22), + 1953: (APR, 12), + 1954: (APR, 1), + 1955: (MAR, 21), + 1956: (MAR, 10), + 1957: (FEB, 27), + 1958: (FEB, 16), + 1959: (FEB, 6), + 1960: (JAN, 26), + 1961: (JAN, 14), + 1962: ((JAN, 4), (DEC, 24)), + 1963: (DEC, 13), + 1964: (DEC, 1), + 1965: (NOV, 20), + 1966: (NOV, 10), + 1967: (OCT, 30), + 1968: (OCT, 19), + 1969: (OCT, 8), + 1970: (SEP, 28), + 1971: (SEP, 17), + 1972: (SEP, 5), + 1973: (AUG, 25), + 1974: (AUG, 15), + 1975: (AUG, 5), + 1976: (JUL, 24), + 1977: (JUL, 13), + 1978: (JUL, 2), + 1979: (JUN, 22), + 1980: (JUN, 10), + 1981: (MAY, 31), + 1982: (MAY, 20), + 1983: (MAY, 10), + 1984: (APR, 28), + 1985: (APR, 17), + 1986: (APR, 6), + 1987: (MAR, 27), + 1988: (MAR, 15), + 1989: (MAR, 5), + 1990: (FEB, 22), + 1991: (FEB, 11), + 1992: (JAN, 31), + 1993: (JAN, 20), + 1994: ((JAN, 9), (DEC, 29)), + 1995: (DEC, 19), + 1996: (DEC, 8), + 1997: (NOV, 27), + 1998: (NOV, 16), + 1999: (NOV, 5), + 2000: (OCT, 24), + 2001: (OCT, 14), + 2002: (OCT, 4), + 2003: (SEP, 24), + 2004: (SEP, 12), + 2005: (SEP, 1), + 2006: (AUG, 21), + 2007: (AUG, 10), + 2008: (JUL, 30), + 2009: (JUL, 20), + 2010: (JUL, 9), + 2011: (JUN, 29), + 2012: (JUN, 17), + 2013: (JUN, 6), + 2014: (MAY, 26), + 2015: (MAY, 16), + 2016: (MAY, 4), + 2017: (APR, 24), + 2018: (APR, 13), + 2019: (APR, 3), + 2020: (MAR, 22), + 2021: (MAR, 11), + 2022: (FEB, 28), + 2023: (FEB, 18), + 2024: (FEB, 8), + 2025: (JAN, 27), + 2026: (JAN, 16), + 2027: ((JAN, 5), (DEC, 25)), + 2028: (DEC, 14), + 2029: (DEC, 3), + 2030: (NOV, 23), + 2031: (NOV, 12), + 2032: (NOV, 1), + 2033: (OCT, 21), + 2034: (OCT, 10), + 2035: (SEP, 29), + 2036: (SEP, 18), + 2037: (SEP, 7), + 2038: (AUG, 28), + 2039: (AUG, 17), + 2040: (AUG, 5), + 2041: (JUL, 25), + 2042: (JUL, 15), + 2043: (JUL, 4), + 2044: (JUN, 23), + 2045: (JUN, 13), + 2046: (JUN, 2), + 2047: (MAY, 22), + 2048: (MAY, 10), + 2049: (APR, 29), + 2050: (APR, 19), + 2051: (APR, 9), + 2052: (MAR, 28), + 2053: (MAR, 18), + 2054: (MAR, 7), + 2055: (FEB, 24), + 2056: (FEB, 13), + 2057: (FEB, 1), + 2058: (JAN, 22), + 2059: (JAN, 12), + 2060: ((JAN, 1), (DEC, 20)), + 2061: (DEC, 9), + 2062: (NOV, 29), + 2063: (NOV, 18), + 2064: (NOV, 7), + 2065: (OCT, 27), + 2066: (OCT, 17), + 2067: (OCT, 6), + 2068: (SEP, 24), + 2069: (SEP, 13), + 2070: (SEP, 3), + 2071: (AUG, 23), + 2072: (AUG, 12), + 2073: (AUG, 1), + 2074: (JUL, 22), + 2075: (JUL, 11), + 2076: (JUN, 29), + 2077: (JUN, 18), + } + + LAYLAT_AL_QADR_DATES = { + 1925: (APR, 22), + 1926: (APR, 10), + 1927: (MAR, 30), + 1928: (MAR, 19), + 1929: (MAR, 8), + 1930: (FEB, 26), + 1931: (FEB, 15), + 1932: (FEB, 4), + 1933: (JAN, 23), + 1934: (JAN, 13), + 1935: ((JAN, 3), (DEC, 23)), + 1936: (DEC, 11), + 1937: (DEC, 1), + 1938: (NOV, 19), + 1939: (NOV, 9), + 1940: (OCT, 29), + 1941: (OCT, 17), + 1942: (OCT, 7), + 1943: (SEP, 26), + 1944: (SEP, 14), + 1945: (SEP, 3), + 1946: (AUG, 24), + 1947: (AUG, 14), + 1948: (AUG, 2), + 1949: (JUL, 22), + 1950: (JUL, 13), + 1951: (JUL, 2), + 1952: (JUN, 20), + 1953: (JUN, 9), + 1954: (MAY, 30), + 1955: (MAY, 20), + 1956: (MAY, 8), + 1957: (APR, 27), + 1958: (APR, 16), + 1959: (APR, 6), + 1960: (MAR, 25), + 1961: (MAR, 14), + 1962: (MAR, 3), + 1963: (FEB, 21), + 1964: (FEB, 10), + 1965: (JAN, 29), + 1966: (JAN, 18), + 1967: ((JAN, 8), (DEC, 28)), + 1968: (DEC, 17), + 1969: (DEC, 6), + 1970: (NOV, 27), + 1971: (NOV, 15), + 1972: (NOV, 3), + 1973: (OCT, 23), + 1974: (OCT, 13), + 1975: (OCT, 2), + 1976: (SEP, 21), + 1977: (SEP, 10), + 1978: (AUG, 31), + 1979: (AUG, 20), + 1980: (AUG, 8), + 1981: (JUL, 28), + 1982: (JUL, 18), + 1983: (JUL, 8), + 1984: (JUN, 26), + 1985: (JUN, 15), + 1986: (JUN, 4), + 1987: (MAY, 25), + 1988: (MAY, 13), + 1989: (MAY, 3), + 1990: (APR, 22), + 1991: (APR, 12), + 1992: (MAR, 31), + 1993: (MAR, 20), + 1994: (MAR, 9), + 1995: (FEB, 26), + 1996: (FEB, 16), + 1997: (FEB, 5), + 1998: (JAN, 25), + 1999: (JAN, 14), + 2000: ((JAN, 4), (DEC, 23)), + 2001: (DEC, 12), + 2002: (DEC, 2), + 2003: (NOV, 21), + 2004: (NOV, 10), + 2005: (OCT, 30), + 2006: (OCT, 20), + 2007: (OCT, 9), + 2008: (SEP, 27), + 2009: (SEP, 17), + 2010: (SEP, 6), + 2011: (AUG, 27), + 2012: (AUG, 15), + 2013: (AUG, 4), + 2014: (JUL, 24), + 2015: (JUL, 14), + 2016: (JUL, 2), + 2017: (JUN, 22), + 2018: (JUN, 11), + 2019: (JUN, 1), + 2020: (MAY, 20), + 2021: (MAY, 9), + 2022: (APR, 28), + 2023: (APR, 18), + 2024: (APR, 6), + 2025: (MAR, 27), + 2026: (MAR, 16), + 2027: (MAR, 6), + 2028: (FEB, 23), + 2029: (FEB, 11), + 2030: (JAN, 31), + 2031: (JAN, 21), + 2032: ((JAN, 10), (DEC, 30)), + 2033: (DEC, 19), + 2034: (DEC, 8), + 2035: (NOV, 27), + 2036: (NOV, 15), + 2037: (NOV, 5), + 2038: (OCT, 26), + 2039: (OCT, 15), + 2040: (OCT, 3), + 2041: (SEP, 23), + 2042: (SEP, 12), + 2043: (SEP, 1), + 2044: (AUG, 21), + 2045: (AUG, 10), + 2046: (JUL, 31), + 2047: (JUL, 20), + 2048: (JUL, 8), + 2049: (JUN, 28), + 2050: (JUN, 17), + 2051: (JUN, 6), + 2052: (MAY, 26), + 2053: (MAY, 16), + 2054: (MAY, 5), + 2055: (APR, 24), + 2056: (APR, 12), + 2057: (APR, 1), + 2058: (MAR, 22), + 2059: (MAR, 12), + 2060: (FEB, 29), + 2061: (FEB, 18), + 2062: (FEB, 7), + 2063: (JAN, 27), + 2064: (JAN, 16), + 2065: ((JAN, 4), (DEC, 25)), + 2066: (DEC, 15), + 2067: (DEC, 4), + 2068: (NOV, 22), + 2069: (NOV, 11), + 2070: (OCT, 31), + 2071: (OCT, 21), + 2072: (OCT, 9), + 2073: (SEP, 29), + 2074: (SEP, 18), + 2075: (SEP, 8), + 2076: (AUG, 27), + 2077: (AUG, 16), + } + + MALDIVES_EMBRACED_ISLAM_DAY_DATES = { + 1924: (OCT, 29), + 1925: (OCT, 19), + 1926: (OCT, 8), + 1927: (SEP, 27), + 1928: (SEP, 15), + 1929: (SEP, 5), + 1930: (AUG, 25), + 1931: (AUG, 15), + 1932: (AUG, 4), + 1933: (JUL, 24), + 1934: (JUL, 13), + 1935: (JUL, 2), + 1936: (JUN, 21), + 1937: (JUN, 10), + 1938: (MAY, 30), + 1939: (MAY, 20), + 1940: (MAY, 9), + 1941: (APR, 27), + 1942: (APR, 17), + 1943: (APR, 6), + 1944: (MAR, 25), + 1945: (MAR, 15), + 1946: (MAR, 4), + 1947: (FEB, 22), + 1948: (FEB, 11), + 1949: (JAN, 30), + 1950: (JAN, 20), + 1951: ((JAN, 10), (DEC, 30)), + 1952: (DEC, 18), + 1953: (DEC, 7), + 1954: (NOV, 27), + 1955: (NOV, 17), + 1956: (NOV, 4), + 1957: (OCT, 24), + 1958: (OCT, 15), + 1959: (OCT, 3), + 1960: (SEP, 22), + 1961: (SEP, 11), + 1962: (AUG, 31), + 1963: (AUG, 20), + 1964: (AUG, 9), + 1965: (JUL, 29), + 1966: (JUL, 19), + 1967: (JUL, 8), + 1968: (JUN, 27), + 1969: (JUN, 16), + 1970: (JUN, 6), + 1971: (MAY, 26), + 1972: (MAY, 14), + 1973: (MAY, 4), + 1974: (APR, 23), + 1975: (APR, 12), + 1976: (MAR, 31), + 1977: (MAR, 20), + 1978: (MAR, 10), + 1979: (FEB, 27), + 1980: (FEB, 17), + 1981: (FEB, 5), + 1982: (JAN, 26), + 1983: (JAN, 15), + 1984: ((JAN, 4), (DEC, 23)), + 1985: (DEC, 13), + 1986: (DEC, 2), + 1987: (NOV, 22), + 1988: (NOV, 10), + 1989: (OCT, 30), + 1990: (OCT, 19), + 1991: (OCT, 8), + 1992: (SEP, 27), + 1993: (SEP, 17), + 1994: (SEP, 6), + 1995: (AUG, 27), + 1996: (AUG, 15), + 1997: (AUG, 4), + 1998: (JUL, 24), + 1999: (JUL, 14), + 2000: (JUL, 3), + 2001: (JUN, 22), + 2002: (JUN, 12), + 2003: (JUN, 1), + 2004: (MAY, 20), + 2005: (MAY, 9), + 2006: (APR, 29), + 2007: (APR, 18), + 2008: (APR, 7), + 2009: (MAR, 28), + 2010: (MAR, 17), + 2011: (MAR, 6), + 2012: (FEB, 23), + 2013: (FEB, 11), + 2014: (FEB, 1), + 2015: (JAN, 21), + 2016: ((JAN, 11), (DEC, 30)), + 2017: (DEC, 19), + 2018: (DEC, 8), + 2019: (NOV, 28), + 2020: (NOV, 16), + 2021: (NOV, 6), + 2022: (OCT, 26), + 2023: (OCT, 16), + 2024: (OCT, 4), + 2025: (SEP, 23), + 2026: (SEP, 12), + 2027: (SEP, 2), + 2028: (AUG, 22), + 2029: (AUG, 11), + 2030: (AUG, 1), + 2031: (JUL, 21), + 2032: (JUL, 9), + 2033: (JUN, 28), + 2034: (JUN, 17), + 2035: (JUN, 7), + 2036: (MAY, 27), + 2037: (MAY, 16), + 2038: (MAY, 5), + 2039: (APR, 24), + 2040: (APR, 13), + 2041: (APR, 2), + 2042: (MAR, 23), + 2043: (MAR, 12), + 2044: (MAR, 1), + 2045: (FEB, 18), + 2046: (FEB, 7), + 2047: (JAN, 27), + 2048: (JAN, 16), + 2049: ((JAN, 5), (DEC, 26)), + 2050: (DEC, 15), + 2051: (DEC, 4), + 2052: (NOV, 22), + 2053: (NOV, 11), + 2054: (NOV, 1), + 2055: (OCT, 21), + 2056: (OCT, 10), + 2057: (SEP, 30), + 2058: (SEP, 19), + 2059: (SEP, 8), + 2060: (AUG, 27), + 2061: (AUG, 16), + 2062: (AUG, 6), + 2063: (JUL, 27), + 2064: (JUL, 15), + 2065: (JUL, 5), + 2066: (JUN, 24), + 2067: (JUN, 13), + 2068: (JUN, 1), + 2069: (MAY, 22), + 2070: (MAY, 11), + 2071: (MAY, 1), + 2072: (APR, 19), + 2073: (APR, 9), + 2074: (MAR, 29), + 2075: (MAR, 18), + 2076: (MAR, 6), + 2077: (FEB, 24), + } + + MAWLID_DATES = { + 1924: (OCT, 10), + 1925: (SEP, 30), + 1926: (SEP, 19), + 1927: (SEP, 8), + 1928: (AUG, 27), + 1929: (AUG, 17), + 1930: (AUG, 6), + 1931: (JUL, 28), + 1932: (JUL, 16), + 1933: (JUL, 5), + 1934: (JUN, 24), + 1935: (JUN, 14), + 1936: (JUN, 2), + 1937: (MAY, 22), + 1938: (MAY, 11), + 1939: (MAY, 2), + 1940: (APR, 20), + 1941: (APR, 8), + 1942: (MAR, 29), + 1943: (MAR, 18), + 1944: (MAR, 6), + 1945: (FEB, 24), + 1946: (FEB, 13), + 1947: (FEB, 3), + 1948: (JAN, 23), + 1949: (JAN, 11), + 1950: ((JAN, 1), (DEC, 22)), + 1951: (DEC, 11), + 1952: (NOV, 30), + 1953: (NOV, 19), + 1954: (NOV, 8), + 1955: (OCT, 29), + 1956: (OCT, 17), + 1957: (OCT, 6), + 1958: (SEP, 26), + 1959: (SEP, 15), + 1960: (SEP, 3), + 1961: (AUG, 23), + 1962: (AUG, 12), + 1963: (AUG, 2), + 1964: (JUL, 21), + 1965: (JUL, 10), + 1966: (JUL, 1), + 1967: (JUN, 19), + 1968: (JUN, 8), + 1969: (MAY, 28), + 1970: (MAY, 18), + 1971: (MAY, 7), + 1972: (APR, 25), + 1973: (APR, 15), + 1974: (APR, 4), + 1975: (MAR, 24), + 1976: (MAR, 12), + 1977: (MAR, 2), + 1978: (FEB, 19), + 1979: (FEB, 9), + 1980: (JAN, 30), + 1981: (JAN, 18), + 1982: ((JAN, 7), (DEC, 27)), + 1983: (DEC, 16), + 1984: (DEC, 4), + 1985: (NOV, 24), + 1986: (NOV, 14), + 1987: (NOV, 3), + 1988: (OCT, 22), + 1989: (OCT, 11), + 1990: (OCT, 1), + 1991: (SEP, 20), + 1992: (SEP, 9), + 1993: (AUG, 29), + 1994: (AUG, 19), + 1995: (AUG, 8), + 1996: (JUL, 27), + 1997: (JUL, 16), + 1998: (JUL, 6), + 1999: (JUN, 26), + 2000: (JUN, 14), + 2001: (JUN, 4), + 2002: (MAY, 24), + 2003: (MAY, 13), + 2004: (MAY, 1), + 2005: (APR, 21), + 2006: (APR, 10), + 2007: (MAR, 31), + 2008: (MAR, 20), + 2009: (MAR, 9), + 2010: (FEB, 26), + 2011: (FEB, 15), + 2012: (FEB, 4), + 2013: (JAN, 24), + 2014: (JAN, 13), + 2015: ((JAN, 3), (DEC, 23)), + 2016: (DEC, 11), + 2017: (NOV, 30), + 2018: (NOV, 20), + 2019: (NOV, 9), + 2020: (OCT, 29), + 2021: (OCT, 18), + 2022: (OCT, 8), + 2023: (SEP, 27), + 2024: (SEP, 15), + 2025: (SEP, 4), + 2026: (AUG, 25), + 2027: (AUG, 14), + 2028: (AUG, 3), + 2029: (JUL, 24), + 2030: (JUL, 13), + 2031: (JUL, 2), + 2032: (JUN, 20), + 2033: (JUN, 9), + 2034: (MAY, 30), + 2035: (MAY, 20), + 2036: (MAY, 8), + 2037: (APR, 28), + 2038: (APR, 17), + 2039: (APR, 6), + 2040: (MAR, 25), + 2041: (MAR, 15), + 2042: (MAR, 4), + 2043: (FEB, 22), + 2044: (FEB, 11), + 2045: (JAN, 30), + 2046: (JAN, 19), + 2047: ((JAN, 8), (DEC, 29)), + 2048: (DEC, 18), + 2049: (DEC, 7), + 2050: (NOV, 26), + 2051: (NOV, 16), + 2052: (NOV, 4), + 2053: (OCT, 24), + 2054: (OCT, 13), + 2055: (OCT, 3), + 2056: (SEP, 22), + 2057: (SEP, 11), + 2058: (AUG, 31), + 2059: (AUG, 20), + 2060: (AUG, 8), + 2061: (JUL, 29), + 2062: (JUL, 19), + 2063: (JUL, 8), + 2064: (JUN, 27), + 2065: (JUN, 16), + 2066: (JUN, 5), + 2067: (MAY, 25), + 2068: (MAY, 14), + 2069: (MAY, 3), + 2070: (APR, 23), + 2071: (APR, 13), + 2072: (APR, 1), + 2073: (MAR, 21), + 2074: (MAR, 10), + 2075: (FEB, 27), + 2076: (FEB, 17), + 2077: (FEB, 6), + } + + NUZUL_AL_QURAN_DATES = { + 1925: (APR, 12), + 1926: (MAR, 31), + 1927: (MAR, 20), + 1928: (MAR, 9), + 1929: (FEB, 26), + 1930: (FEB, 16), + 1931: (FEB, 5), + 1932: (JAN, 25), + 1933: (JAN, 13), + 1934: ((JAN, 3), (DEC, 24)), + 1935: (DEC, 13), + 1936: (DEC, 1), + 1937: (NOV, 21), + 1938: (NOV, 9), + 1939: (OCT, 30), + 1940: (OCT, 19), + 1941: (OCT, 7), + 1942: (SEP, 27), + 1943: (SEP, 16), + 1944: (SEP, 4), + 1945: (AUG, 24), + 1946: (AUG, 14), + 1947: (AUG, 4), + 1948: (JUL, 23), + 1949: (JUL, 12), + 1950: (JUL, 3), + 1951: (JUN, 22), + 1952: (JUN, 10), + 1953: (MAY, 30), + 1954: (MAY, 20), + 1955: (MAY, 10), + 1956: (APR, 28), + 1957: (APR, 17), + 1958: (APR, 6), + 1959: (MAR, 27), + 1960: (MAR, 15), + 1961: (MAR, 4), + 1962: (FEB, 21), + 1963: (FEB, 11), + 1964: (JAN, 31), + 1965: (JAN, 19), + 1966: ((JAN, 8), (DEC, 29)), + 1967: (DEC, 18), + 1968: (DEC, 7), + 1969: (NOV, 26), + 1970: (NOV, 17), + 1971: (NOV, 5), + 1972: (OCT, 24), + 1973: (OCT, 13), + 1974: (OCT, 3), + 1975: (SEP, 22), + 1976: (SEP, 11), + 1977: (AUG, 31), + 1978: (AUG, 21), + 1979: (AUG, 10), + 1980: (JUL, 29), + 1981: (JUL, 18), + 1982: (JUL, 8), + 1983: (JUN, 28), + 1984: (JUN, 16), + 1985: (JUN, 5), + 1986: (MAY, 25), + 1987: (MAY, 15), + 1988: (MAY, 3), + 1989: (APR, 23), + 1990: (APR, 12), + 1991: (APR, 2), + 1992: (MAR, 21), + 1993: (MAR, 10), + 1994: (FEB, 27), + 1995: (FEB, 16), + 1996: (FEB, 6), + 1997: (JAN, 26), + 1998: (JAN, 15), + 1999: ((JAN, 4), (DEC, 25)), + 2000: (DEC, 13), + 2001: (DEC, 2), + 2002: (NOV, 22), + 2003: (NOV, 11), + 2004: (OCT, 31), + 2005: (OCT, 20), + 2006: (OCT, 10), + 2007: (SEP, 29), + 2008: (SEP, 17), + 2009: (SEP, 7), + 2010: (AUG, 27), + 2011: (AUG, 17), + 2012: (AUG, 5), + 2013: (JUL, 25), + 2014: (JUL, 14), + 2015: (JUL, 4), + 2016: (JUN, 22), + 2017: (JUN, 12), + 2018: (JUN, 1), + 2019: (MAY, 22), + 2020: (MAY, 10), + 2021: (APR, 29), + 2022: (APR, 18), + 2023: (APR, 8), + 2024: (MAR, 27), + 2025: (MAR, 17), + 2026: (MAR, 6), + 2027: (FEB, 24), + 2028: (FEB, 13), + 2029: (FEB, 1), + 2030: (JAN, 21), + 2031: ((JAN, 11), (DEC, 31)), + 2032: (DEC, 20), + 2033: (DEC, 9), + 2034: (NOV, 28), + 2035: (NOV, 17), + 2036: (NOV, 5), + 2037: (OCT, 26), + 2038: (OCT, 16), + 2039: (OCT, 5), + 2040: (SEP, 23), + 2041: (SEP, 13), + 2042: (SEP, 2), + 2043: (AUG, 22), + 2044: (AUG, 11), + 2045: (JUL, 31), + 2046: (JUL, 21), + 2047: (JUL, 10), + 2048: (JUN, 28), + 2049: (JUN, 18), + 2050: (JUN, 7), + 2051: (MAY, 27), + 2052: (MAY, 16), + 2053: (MAY, 6), + 2054: (APR, 25), + 2055: (APR, 14), + 2056: (APR, 2), + 2057: (MAR, 22), + 2058: (MAR, 12), + 2059: (MAR, 2), + 2060: (FEB, 19), + 2061: (FEB, 8), + 2062: (JAN, 28), + 2063: (JAN, 17), + 2064: ((JAN, 6), (DEC, 25)), + 2065: (DEC, 15), + 2066: (DEC, 5), + 2067: (NOV, 24), + 2068: (NOV, 12), + 2069: (NOV, 1), + 2070: (OCT, 21), + 2071: (OCT, 11), + 2072: (SEP, 29), + 2073: (SEP, 19), + 2074: (SEP, 8), + 2075: (AUG, 29), + 2076: (AUG, 17), + 2077: (AUG, 6), + } + + PROPHET_DEATH_DATES = { + 1924: (SEP, 27), + 1925: (SEP, 17), + 1926: (SEP, 6), + 1927: (AUG, 26), + 1928: (AUG, 14), + 1929: (AUG, 4), + 1930: (JUL, 24), + 1931: (JUL, 14), + 1932: (JUL, 3), + 1933: (JUN, 22), + 1934: (JUN, 11), + 1935: (MAY, 31), + 1936: (MAY, 20), + 1937: (MAY, 9), + 1938: (APR, 28), + 1939: (APR, 18), + 1940: (APR, 6), + 1941: (MAR, 26), + 1942: (MAR, 16), + 1943: (MAR, 5), + 1944: (FEB, 22), + 1945: (FEB, 11), + 1946: (JAN, 31), + 1947: (JAN, 21), + 1948: ((JAN, 10), (DEC, 29)), + 1949: (DEC, 19), + 1950: (DEC, 9), + 1951: (NOV, 28), + 1952: (NOV, 16), + 1953: (NOV, 5), + 1954: (OCT, 26), + 1955: (OCT, 16), + 1956: (OCT, 3), + 1957: (SEP, 23), + 1958: (SEP, 13), + 1959: (SEP, 1), + 1960: (AUG, 21), + 1961: (AUG, 10), + 1962: (JUL, 30), + 1963: (JUL, 19), + 1964: (JUL, 8), + 1965: (JUN, 27), + 1966: (JUN, 17), + 1967: (JUN, 6), + 1968: (MAY, 25), + 1969: (MAY, 15), + 1970: (MAY, 5), + 1971: (APR, 24), + 1972: (APR, 12), + 1973: (APR, 2), + 1974: (MAR, 22), + 1975: (MAR, 11), + 1976: (FEB, 28), + 1977: (FEB, 16), + 1978: (FEB, 6), + 1979: (JAN, 26), + 1980: (JAN, 16), + 1981: ((JAN, 4), (DEC, 24)), + 1982: (DEC, 13), + 1983: (DEC, 2), + 1984: (NOV, 21), + 1985: (NOV, 11), + 1986: (OCT, 31), + 1987: (OCT, 21), + 1988: (OCT, 9), + 1989: (SEP, 28), + 1990: (SEP, 17), + 1991: (SEP, 7), + 1992: (AUG, 26), + 1993: (AUG, 16), + 1994: (AUG, 5), + 1995: (JUL, 26), + 1996: (JUL, 14), + 1997: (JUL, 3), + 1998: (JUN, 22), + 1999: (JUN, 12), + 2000: (JUN, 1), + 2001: (MAY, 22), + 2002: (MAY, 11), + 2003: (APR, 30), + 2004: (APR, 18), + 2005: (APR, 7), + 2006: (MAR, 28), + 2007: (MAR, 18), + 2008: (MAR, 6), + 2009: (FEB, 23), + 2010: (FEB, 12), + 2011: (FEB, 1), + 2012: (JAN, 22), + 2013: ((JAN, 10), (DEC, 31)), + 2014: (DEC, 20), + 2015: (DEC, 10), + 2016: (NOV, 28), + 2017: (NOV, 17), + 2018: (NOV, 6), + 2019: (OCT, 27), + 2020: (OCT, 15), + 2021: (OCT, 5), + 2022: (SEP, 24), + 2023: (SEP, 13), + 2024: (SEP, 1), + 2025: (AUG, 22), + 2026: (AUG, 11), + 2027: (AUG, 1), + 2028: (JUL, 21), + 2029: (JUL, 10), + 2030: (JUN, 29), + 2031: (JUN, 18), + 2032: (JUN, 6), + 2033: (MAY, 27), + 2034: (MAY, 17), + 2035: (MAY, 6), + 2036: (APR, 25), + 2037: (APR, 14), + 2038: (APR, 3), + 2039: (MAR, 23), + 2040: (MAR, 12), + 2041: (MAR, 1), + 2042: (FEB, 19), + 2043: (FEB, 8), + 2044: (JAN, 29), + 2045: (JAN, 17), + 2046: ((JAN, 6), (DEC, 26)), + 2047: (DEC, 16), + 2048: (DEC, 4), + 2049: (NOV, 24), + 2050: (NOV, 13), + 2051: (NOV, 2), + 2052: (OCT, 21), + 2053: (OCT, 10), + 2054: (SEP, 30), + 2055: (SEP, 20), + 2056: (SEP, 8), + 2057: (AUG, 28), + 2058: (AUG, 17), + 2059: (AUG, 7), + 2060: (JUL, 26), + 2061: (JUL, 16), + 2062: (JUL, 5), + 2063: (JUN, 25), + 2064: (JUN, 13), + 2065: (JUN, 2), + 2066: (MAY, 22), + 2067: (MAY, 12), + 2068: (APR, 30), + 2069: (APR, 20), + 2070: (APR, 10), + 2071: (MAR, 30), + 2072: (MAR, 18), + 2073: (MAR, 7), + 2074: (FEB, 24), + 2075: (FEB, 14), + 2076: (FEB, 3), + 2077: (JAN, 23), + } + + QUAMEE_DHUVAS_DATES = { + 1924: (SEP, 29), + 1925: (SEP, 19), + 1926: (SEP, 8), + 1927: (AUG, 28), + 1928: (AUG, 16), + 1929: (AUG, 6), + 1930: (JUL, 26), + 1931: (JUL, 17), + 1932: (JUL, 5), + 1933: (JUN, 24), + 1934: (JUN, 13), + 1935: (JUN, 3), + 1936: (MAY, 22), + 1937: (MAY, 11), + 1938: (APR, 30), + 1939: (APR, 21), + 1940: (APR, 9), + 1941: (MAR, 28), + 1942: (MAR, 18), + 1943: (MAR, 7), + 1944: (FEB, 24), + 1945: (FEB, 13), + 1946: (FEB, 2), + 1947: (JAN, 23), + 1948: ((JAN, 12), (DEC, 31)), + 1949: (DEC, 21), + 1950: (DEC, 11), + 1951: (NOV, 30), + 1952: (NOV, 19), + 1953: (NOV, 8), + 1954: (OCT, 28), + 1955: (OCT, 18), + 1956: (OCT, 6), + 1957: (SEP, 25), + 1958: (SEP, 15), + 1959: (SEP, 4), + 1960: (AUG, 23), + 1961: (AUG, 12), + 1962: (AUG, 1), + 1963: (JUL, 22), + 1964: (JUL, 10), + 1965: (JUN, 29), + 1966: (JUN, 20), + 1967: (JUN, 8), + 1968: (MAY, 28), + 1969: (MAY, 17), + 1970: (MAY, 7), + 1971: (APR, 26), + 1972: (APR, 14), + 1973: (APR, 4), + 1974: (MAR, 24), + 1975: (MAR, 13), + 1976: (MAR, 1), + 1977: (FEB, 19), + 1978: (FEB, 8), + 1979: (JAN, 29), + 1980: (JAN, 19), + 1981: ((JAN, 7), (DEC, 27)), + 1982: (DEC, 16), + 1983: (DEC, 5), + 1984: (NOV, 23), + 1985: (NOV, 13), + 1986: (NOV, 3), + 1987: (OCT, 23), + 1988: (OCT, 11), + 1989: (SEP, 30), + 1990: (SEP, 20), + 1991: (SEP, 9), + 1992: (AUG, 29), + 1993: (AUG, 18), + 1994: (AUG, 8), + 1995: (JUL, 28), + 1996: (JUL, 16), + 1997: (JUL, 5), + 1998: (JUN, 25), + 1999: (JUN, 15), + 2000: (JUN, 3), + 2001: (MAY, 24), + 2002: (MAY, 13), + 2003: (MAY, 2), + 2004: (APR, 20), + 2005: (APR, 10), + 2006: (MAR, 30), + 2007: (MAR, 20), + 2008: (MAR, 9), + 2009: (FEB, 26), + 2010: (FEB, 15), + 2011: (FEB, 4), + 2012: (JAN, 24), + 2013: (JAN, 13), + 2014: ((JAN, 2), (DEC, 23)), + 2015: (DEC, 12), + 2016: (NOV, 30), + 2017: (NOV, 19), + 2018: (NOV, 9), + 2019: (OCT, 29), + 2020: (OCT, 18), + 2021: (OCT, 7), + 2022: (SEP, 27), + 2023: (SEP, 16), + 2024: (SEP, 4), + 2025: (AUG, 24), + 2026: (AUG, 14), + 2027: (AUG, 3), + 2028: (JUL, 23), + 2029: (JUL, 13), + 2030: (JUL, 2), + 2031: (JUN, 21), + 2032: (JUN, 9), + 2033: (MAY, 29), + 2034: (MAY, 19), + 2035: (MAY, 9), + 2036: (APR, 27), + 2037: (APR, 17), + 2038: (APR, 6), + 2039: (MAR, 26), + 2040: (MAR, 14), + 2041: (MAR, 4), + 2042: (FEB, 21), + 2043: (FEB, 11), + 2044: (JAN, 31), + 2045: (JAN, 19), + 2046: ((JAN, 8), (DEC, 28)), + 2047: (DEC, 18), + 2048: (DEC, 7), + 2049: (NOV, 26), + 2050: (NOV, 15), + 2051: (NOV, 5), + 2052: (OCT, 24), + 2053: (OCT, 13), + 2054: (OCT, 2), + 2055: (SEP, 22), + 2056: (SEP, 11), + 2057: (AUG, 31), + 2058: (AUG, 20), + 2059: (AUG, 9), + 2060: (JUL, 28), + 2061: (JUL, 18), + 2062: (JUL, 8), + 2063: (JUN, 27), + 2064: (JUN, 16), + 2065: (JUN, 5), + 2066: (MAY, 25), + 2067: (MAY, 14), + 2068: (MAY, 3), + 2069: (APR, 22), + 2070: (APR, 12), + 2071: (APR, 2), + 2072: (MAR, 21), + 2073: (MAR, 10), + 2074: (FEB, 27), + 2075: (FEB, 16), + 2076: (FEB, 6), + 2077: (JAN, 26), + } + + RAMADAN_BEGINNING_DATES = { + 1925: (MAR, 27), + 1926: (MAR, 15), + 1927: (MAR, 4), + 1928: (FEB, 22), + 1929: (FEB, 10), + 1930: (JAN, 31), + 1931: (JAN, 20), + 1932: ((JAN, 9), (DEC, 28)), + 1933: (DEC, 18), + 1934: (DEC, 8), + 1935: (NOV, 27), + 1936: (NOV, 15), + 1937: (NOV, 5), + 1938: (OCT, 24), + 1939: (OCT, 14), + 1940: (OCT, 3), + 1941: (SEP, 21), + 1942: (SEP, 11), + 1943: (AUG, 31), + 1944: (AUG, 19), + 1945: (AUG, 8), + 1946: (JUL, 29), + 1947: (JUL, 19), + 1948: (JUL, 7), + 1949: (JUN, 26), + 1950: (JUN, 17), + 1951: (JUN, 6), + 1952: (MAY, 25), + 1953: (MAY, 14), + 1954: (MAY, 4), + 1955: (APR, 24), + 1956: (APR, 12), + 1957: (APR, 1), + 1958: (MAR, 21), + 1959: (MAR, 11), + 1960: (FEB, 28), + 1961: (FEB, 16), + 1962: (FEB, 5), + 1963: (JAN, 26), + 1964: (JAN, 15), + 1965: ((JAN, 3), (DEC, 23)), + 1966: (DEC, 13), + 1967: (DEC, 2), + 1968: (NOV, 21), + 1969: (NOV, 10), + 1970: (NOV, 1), + 1971: (OCT, 20), + 1972: (OCT, 8), + 1973: (SEP, 27), + 1974: (SEP, 17), + 1975: (SEP, 6), + 1976: (AUG, 26), + 1977: (AUG, 15), + 1978: (AUG, 5), + 1979: (JUL, 25), + 1980: (JUL, 13), + 1981: (JUL, 2), + 1982: (JUN, 22), + 1983: (JUN, 12), + 1984: (MAY, 31), + 1985: (MAY, 20), + 1986: (MAY, 9), + 1987: (APR, 29), + 1988: (APR, 17), + 1989: (APR, 7), + 1990: (MAR, 27), + 1991: (MAR, 17), + 1992: (MAR, 5), + 1993: (FEB, 22), + 1994: (FEB, 11), + 1995: (JAN, 31), + 1996: (JAN, 21), + 1997: ((JAN, 10), (DEC, 30)), + 1998: (DEC, 19), + 1999: (DEC, 9), + 2000: (NOV, 27), + 2001: (NOV, 16), + 2002: (NOV, 6), + 2003: (OCT, 26), + 2004: (OCT, 15), + 2005: (OCT, 4), + 2006: (SEP, 24), + 2007: (SEP, 13), + 2008: (SEP, 1), + 2009: (AUG, 22), + 2010: (AUG, 11), + 2011: (AUG, 1), + 2012: (JUL, 20), + 2013: (JUL, 9), + 2014: (JUN, 28), + 2015: (JUN, 18), + 2016: (JUN, 6), + 2017: (MAY, 27), + 2018: (MAY, 16), + 2019: (MAY, 6), + 2020: (APR, 24), + 2021: (APR, 13), + 2022: (APR, 2), + 2023: (MAR, 23), + 2024: (MAR, 11), + 2025: (MAR, 1), + 2026: (FEB, 18), + 2027: (FEB, 8), + 2028: (JAN, 28), + 2029: (JAN, 16), + 2030: ((JAN, 5), (DEC, 26)), + 2031: (DEC, 15), + 2032: (DEC, 4), + 2033: (NOV, 23), + 2034: (NOV, 12), + 2035: (NOV, 1), + 2036: (OCT, 20), + 2037: (OCT, 10), + 2038: (SEP, 30), + 2039: (SEP, 19), + 2040: (SEP, 7), + 2041: (AUG, 28), + 2042: (AUG, 17), + 2043: (AUG, 6), + 2044: (JUL, 26), + 2045: (JUL, 15), + 2046: (JUL, 5), + 2047: (JUN, 24), + 2048: (JUN, 12), + 2049: (JUN, 2), + 2050: (MAY, 22), + 2051: (MAY, 11), + 2052: (APR, 30), + 2053: (APR, 20), + 2054: (APR, 9), + 2055: (MAR, 29), + 2056: (MAR, 17), + 2057: (MAR, 6), + 2058: (FEB, 24), + 2059: (FEB, 14), + 2060: (FEB, 3), + 2061: (JAN, 23), + 2062: (JAN, 12), + 2063: ((JAN, 1), (DEC, 21)), + 2064: (DEC, 9), + 2065: (NOV, 29), + 2066: (NOV, 19), + 2067: (NOV, 8), + 2068: (OCT, 27), + 2069: (OCT, 16), + 2070: (OCT, 5), + 2071: (SEP, 25), + 2072: (SEP, 13), + 2073: (SEP, 3), + 2074: (AUG, 23), + 2075: (AUG, 13), + 2076: (AUG, 1), + 2077: (JUL, 21), + } + + SADIQ_BIRTHDAY_DATES = { + 1924: (OCT, 15), + 1925: (OCT, 5), + 1926: (SEP, 24), + 1927: (SEP, 13), + 1928: (SEP, 1), + 1929: (AUG, 22), + 1930: (AUG, 11), + 1931: (AUG, 2), + 1932: (JUL, 21), + 1933: (JUL, 10), + 1934: (JUN, 29), + 1935: (JUN, 19), + 1936: (JUN, 7), + 1937: (MAY, 27), + 1938: (MAY, 16), + 1939: (MAY, 7), + 1940: (APR, 25), + 1941: (APR, 13), + 1942: (APR, 3), + 1943: (MAR, 23), + 1944: (MAR, 11), + 1945: (MAR, 1), + 1946: (FEB, 18), + 1947: (FEB, 8), + 1948: (JAN, 28), + 1949: (JAN, 16), + 1950: ((JAN, 6), (DEC, 27)), + 1951: (DEC, 16), + 1952: (DEC, 5), + 1953: (NOV, 24), + 1954: (NOV, 13), + 1955: (NOV, 3), + 1956: (OCT, 22), + 1957: (OCT, 11), + 1958: (OCT, 1), + 1959: (SEP, 20), + 1960: (SEP, 8), + 1961: (AUG, 28), + 1962: (AUG, 17), + 1963: (AUG, 7), + 1964: (JUL, 26), + 1965: (JUL, 15), + 1966: (JUL, 6), + 1967: (JUN, 24), + 1968: (JUN, 13), + 1969: (JUN, 2), + 1970: (MAY, 23), + 1971: (MAY, 12), + 1972: (APR, 30), + 1973: (APR, 20), + 1974: (APR, 9), + 1975: (MAR, 29), + 1976: (MAR, 17), + 1977: (MAR, 7), + 1978: (FEB, 24), + 1979: (FEB, 14), + 1980: (FEB, 4), + 1981: (JAN, 23), + 1982: (JAN, 12), + 1983: ((JAN, 1), (DEC, 21)), + 1984: (DEC, 9), + 1985: (NOV, 29), + 1986: (NOV, 19), + 1987: (NOV, 8), + 1988: (OCT, 27), + 1989: (OCT, 16), + 1990: (OCT, 6), + 1991: (SEP, 25), + 1992: (SEP, 14), + 1993: (SEP, 3), + 1994: (AUG, 24), + 1995: (AUG, 13), + 1996: (AUG, 1), + 1997: (JUL, 21), + 1998: (JUL, 11), + 1999: (JUL, 1), + 2000: (JUN, 19), + 2001: (JUN, 9), + 2002: (MAY, 29), + 2003: (MAY, 18), + 2004: (MAY, 6), + 2005: (APR, 26), + 2006: (APR, 15), + 2007: (APR, 5), + 2008: (MAR, 25), + 2009: (MAR, 14), + 2010: (MAR, 3), + 2011: (FEB, 20), + 2012: (FEB, 9), + 2013: (JAN, 29), + 2014: (JAN, 18), + 2015: ((JAN, 8), (DEC, 28)), + 2016: (DEC, 16), + 2017: (DEC, 5), + 2018: (NOV, 25), + 2019: (NOV, 14), + 2020: (NOV, 3), + 2021: (OCT, 23), + 2022: (OCT, 13), + 2023: (OCT, 2), + 2024: (SEP, 20), + 2025: (SEP, 9), + 2026: (AUG, 30), + 2027: (AUG, 19), + 2028: (AUG, 8), + 2029: (JUL, 29), + 2030: (JUL, 18), + 2031: (JUL, 7), + 2032: (JUN, 25), + 2033: (JUN, 14), + 2034: (JUN, 4), + 2035: (MAY, 25), + 2036: (MAY, 13), + 2037: (MAY, 3), + 2038: (APR, 22), + 2039: (APR, 11), + 2040: (MAR, 30), + 2041: (MAR, 20), + 2042: (MAR, 9), + 2043: (FEB, 27), + 2044: (FEB, 16), + 2045: (FEB, 4), + 2046: (JAN, 24), + 2047: (JAN, 13), + 2048: ((JAN, 3), (DEC, 23)), + 2049: (DEC, 12), + 2050: (DEC, 1), + 2051: (NOV, 21), + 2052: (NOV, 9), + 2053: (OCT, 29), + 2054: (OCT, 18), + 2055: (OCT, 8), + 2056: (SEP, 27), + 2057: (SEP, 16), + 2058: (SEP, 5), + 2059: (AUG, 25), + 2060: (AUG, 13), + 2061: (AUG, 3), + 2062: (JUL, 24), + 2063: (JUL, 13), + 2064: (JUL, 2), + 2065: (JUN, 21), + 2066: (JUN, 10), + 2067: (MAY, 30), + 2068: (MAY, 19), + 2069: (MAY, 8), + 2070: (APR, 28), + 2071: (APR, 18), + 2072: (APR, 6), + 2073: (MAR, 26), + 2074: (MAR, 15), + 2075: (MAR, 4), + 2076: (FEB, 22), + 2077: (FEB, 11), + } + + SADIQ_DEATH_DATES = { + 1925: (MAY, 18), + 1926: (MAY, 8), + 1927: (APR, 27), + 1928: (APR, 15), + 1929: (APR, 5), + 1930: (MAR, 25), + 1931: (MAR, 15), + 1932: (MAR, 3), + 1933: (FEB, 20), + 1934: (FEB, 10), + 1935: (JAN, 31), + 1936: (JAN, 20), + 1937: ((JAN, 8), (DEC, 28)), + 1938: (DEC, 17), + 1939: (DEC, 6), + 1940: (NOV, 25), + 1941: (NOV, 14), + 1942: (NOV, 4), + 1943: (OCT, 24), + 1944: (OCT, 12), + 1945: (OCT, 1), + 1946: (SEP, 21), + 1947: (SEP, 11), + 1948: (AUG, 30), + 1949: (AUG, 19), + 1950: (AUG, 9), + 1951: (JUL, 30), + 1952: (JUL, 17), + 1953: (JUL, 7), + 1954: (JUN, 26), + 1955: (JUN, 16), + 1956: (JUN, 4), + 1957: (MAY, 25), + 1958: (MAY, 14), + 1959: (MAY, 4), + 1960: (APR, 21), + 1961: (APR, 11), + 1962: (MAR, 31), + 1963: (MAR, 20), + 1964: (MAR, 9), + 1965: (FEB, 26), + 1966: (FEB, 15), + 1967: (FEB, 5), + 1968: (JAN, 25), + 1969: (JAN, 14), + 1970: ((JAN, 3), (DEC, 24)), + 1971: (DEC, 13), + 1972: (DEC, 1), + 1973: (NOV, 20), + 1974: (NOV, 9), + 1975: (OCT, 30), + 1976: (OCT, 18), + 1977: (OCT, 8), + 1978: (SEP, 27), + 1979: (SEP, 16), + 1980: (SEP, 5), + 1981: (AUG, 25), + 1982: (AUG, 14), + 1983: (AUG, 4), + 1984: (JUL, 24), + 1985: (JUL, 13), + 1986: (JUL, 2), + 1987: (JUN, 21), + 1988: (JUN, 9), + 1989: (MAY, 30), + 1990: (MAY, 20), + 1991: (MAY, 9), + 1992: (APR, 28), + 1993: (APR, 17), + 1994: (APR, 6), + 1995: (MAR, 26), + 1996: (MAR, 14), + 1997: (MAR, 4), + 1998: (FEB, 22), + 1999: (FEB, 11), + 2000: (FEB, 1), + 2001: (JAN, 20), + 2002: ((JAN, 9), (DEC, 29)), + 2003: (DEC, 19), + 2004: (DEC, 8), + 2005: (NOV, 27), + 2006: (NOV, 16), + 2007: (NOV, 6), + 2008: (OCT, 25), + 2009: (OCT, 14), + 2010: (OCT, 4), + 2011: (SEP, 23), + 2012: (SEP, 12), + 2013: (SEP, 1), + 2014: (AUG, 21), + 2015: (AUG, 10), + 2016: (JUL, 30), + 2017: (JUL, 19), + 2018: (JUL, 9), + 2019: (JUN, 28), + 2020: (JUN, 17), + 2021: (JUN, 6), + 2022: (MAY, 26), + 2023: (MAY, 15), + 2024: (MAY, 4), + 2025: (APR, 23), + 2026: (APR, 13), + 2027: (APR, 2), + 2028: (MAR, 21), + 2029: (MAR, 10), + 2030: (FEB, 28), + 2031: (FEB, 17), + 2032: (FEB, 7), + 2033: (JAN, 26), + 2034: (JAN, 16), + 2035: ((JAN, 5), (DEC, 25)), + 2036: (DEC, 13), + 2037: (DEC, 2), + 2038: (NOV, 22), + 2039: (NOV, 12), + 2040: (OCT, 31), + 2041: (OCT, 20), + 2042: (OCT, 9), + 2043: (SEP, 28), + 2044: (SEP, 17), + 2045: (SEP, 7), + 2046: (AUG, 27), + 2047: (AUG, 17), + 2048: (AUG, 5), + 2049: (JUL, 25), + 2050: (JUL, 14), + 2051: (JUL, 4), + 2052: (JUN, 22), + 2053: (JUN, 12), + 2054: (JUN, 2), + 2055: (MAY, 22), + 2056: (MAY, 10), + 2057: (APR, 29), + 2058: (APR, 18), + 2059: (APR, 8), + 2060: (MAR, 28), + 2061: (MAR, 17), + 2062: (MAR, 6), + 2063: (FEB, 23), + 2064: (FEB, 13), + 2065: (FEB, 1), + 2066: (JAN, 21), + 2067: (JAN, 11), + 2068: ((JAN, 1), (DEC, 20)), + 2069: (DEC, 9), + 2070: (NOV, 28), + 2071: (NOV, 17), + 2072: (NOV, 6), + 2073: (OCT, 26), + 2074: (OCT, 16), + 2075: (OCT, 5), + 2076: (SEP, 23), + 2077: (SEP, 12), + } + + TASUA_DATES = { + 1924: (AUG, 9), + 1925: (JUL, 31), + 1926: (JUL, 19), + 1927: (JUL, 9), + 1928: (JUN, 27), + 1929: (JUN, 16), + 1930: (JUN, 5), + 1931: (MAY, 27), + 1932: (MAY, 15), + 1933: (MAY, 4), + 1934: (APR, 23), + 1935: (APR, 13), + 1936: (APR, 1), + 1937: (MAR, 22), + 1938: (MAR, 10), + 1939: (FEB, 28), + 1940: (FEB, 17), + 1941: (FEB, 5), + 1942: (JAN, 26), + 1943: (JAN, 15), + 1944: ((JAN, 4), (DEC, 24)), + 1945: (DEC, 13), + 1946: (DEC, 3), + 1947: (NOV, 22), + 1948: (NOV, 10), + 1949: (OCT, 31), + 1950: (OCT, 21), + 1951: (OCT, 10), + 1952: (SEP, 29), + 1953: (SEP, 18), + 1954: (SEP, 7), + 1955: (AUG, 28), + 1956: (AUG, 16), + 1957: (AUG, 5), + 1958: (JUL, 26), + 1959: (JUL, 15), + 1960: (JUL, 3), + 1961: (JUN, 22), + 1962: (JUN, 11), + 1963: (JUN, 1), + 1964: (MAY, 20), + 1965: (MAY, 9), + 1966: (APR, 29), + 1967: (APR, 19), + 1968: (APR, 7), + 1969: (MAR, 27), + 1970: (MAR, 17), + 1971: (MAR, 6), + 1972: (FEB, 24), + 1973: (FEB, 12), + 1974: (FEB, 1), + 1975: (JAN, 21), + 1976: ((JAN, 10), (DEC, 30)), + 1977: (DEC, 19), + 1978: (DEC, 9), + 1979: (NOV, 28), + 1980: (NOV, 17), + 1981: (NOV, 5), + 1982: (OCT, 26), + 1983: (OCT, 15), + 1984: (OCT, 4), + 1985: (SEP, 23), + 1986: (SEP, 13), + 1987: (SEP, 2), + 1988: (AUG, 21), + 1989: (AUG, 10), + 1990: (JUL, 31), + 1991: (JUL, 20), + 1992: (JUL, 9), + 1993: (JUN, 29), + 1994: (JUN, 18), + 1995: (JUN, 7), + 1996: (MAY, 26), + 1997: (MAY, 15), + 1998: (MAY, 5), + 1999: (APR, 25), + 2000: (APR, 14), + 2001: (APR, 3), + 2002: (MAR, 23), + 2003: (MAR, 12), + 2004: (FEB, 29), + 2005: (FEB, 18), + 2006: (FEB, 8), + 2007: (JAN, 28), + 2008: (JAN, 18), + 2009: ((JAN, 6), (DEC, 26)), + 2010: (DEC, 15), + 2011: (DEC, 4), + 2012: (NOV, 23), + 2013: (NOV, 12), + 2014: (NOV, 2), + 2015: (OCT, 22), + 2016: (OCT, 10), + 2017: (SEP, 29), + 2018: (SEP, 19), + 2019: (SEP, 8), + 2020: (AUG, 28), + 2021: (AUG, 17), + 2022: (AUG, 7), + 2023: (JUL, 27), + 2024: (JUL, 15), + 2025: (JUL, 4), + 2026: (JUN, 24), + 2027: (JUN, 14), + 2028: (JUN, 2), + 2029: (MAY, 22), + 2030: (MAY, 11), + 2031: (MAY, 1), + 2032: (APR, 19), + 2033: (APR, 9), + 2034: (MAR, 29), + 2035: (MAR, 19), + 2036: (MAR, 7), + 2037: (FEB, 24), + 2038: (FEB, 13), + 2039: (FEB, 3), + 2040: (JAN, 23), + 2041: (JAN, 12), + 2042: ((JAN, 1), (DEC, 22)), + 2043: (DEC, 11), + 2044: (NOV, 29), + 2045: (NOV, 18), + 2046: (NOV, 8), + 2047: (OCT, 28), + 2048: (OCT, 17), + 2049: (OCT, 6), + 2050: (SEP, 25), + 2051: (SEP, 14), + 2052: (SEP, 3), + 2053: (AUG, 23), + 2054: (AUG, 13), + 2055: (AUG, 2), + 2056: (JUL, 22), + 2057: (JUL, 11), + 2058: (JUN, 30), + 2059: (JUN, 19), + 2060: (JUN, 8), + 2061: (MAY, 28), + 2062: (MAY, 18), + 2063: (MAY, 8), + 2064: (APR, 26), + 2065: (APR, 15), + 2066: (APR, 4), + 2067: (MAR, 24), + 2068: (MAR, 13), + 2069: (MAR, 3), + 2070: (FEB, 20), + 2071: (FEB, 9), + 2072: (JAN, 29), + 2073: (JAN, 17), + 2074: ((JAN, 7), (DEC, 27)), + 2075: (DEC, 17), + 2076: (DEC, 5), + } + + def _get_holiday(self, holiday: str, year: int) -> Iterable[tuple[date, bool]]: + estimated_dates = getattr(self, f"{holiday}_DATES", {}) + exact_dates = getattr(self, f"{holiday}_DATES_{_CustomCalendar.CUSTOM_ATTR_POSTFIX}", {}) + for year in (year - 1, year): + for dt in _normalize_tuple(exact_dates.get(year, estimated_dates.get(year, ()))): + yield date(year, *dt), year not in exact_dates + + def ali_al_rida_death_dates(self, year: int) -> Iterable[tuple[date, bool]]: + return self._get_holiday(ALI_AL_RIDA_DEATH, year) + + def ali_birthday_dates(self, year: int) -> Iterable[tuple[date, bool]]: + return self._get_holiday(ALI_BIRTHDAY, year) + + def ali_death_dates(self, year: int) -> Iterable[tuple[date, bool]]: + return self._get_holiday(ALI_DEATH, year) + + def arbaeen_dates(self, year: int) -> Iterable[tuple[date, bool]]: + return self._get_holiday(ARBAEEN, year) + + def ashura_dates(self, year: int) -> Iterable[tuple[date, bool]]: + return self._get_holiday(ASHURA, year) + + def eid_al_adha_dates(self, year: int) -> Iterable[tuple[date, bool]]: + return self._get_holiday(EID_AL_ADHA, year) + + def eid_al_fitr_dates(self, year: int) -> Iterable[tuple[date, bool]]: + return self._get_holiday(EID_AL_FITR, year) + + def eid_al_ghadir_dates(self, year: int) -> Iterable[tuple[date, bool]]: + return self._get_holiday(EID_AL_GHADIR, year) + + def fatima_death_dates(self, year: int) -> Iterable[tuple[date, bool]]: + return self._get_holiday(FATIMA_DEATH, year) + + def grand_magal_of_touba_dates(self, year: int) -> Iterable[tuple[date, bool]]: + return self._get_holiday(GRAND_MAGAL_OF_TOUBA, year) + + def hari_hol_johor_dates(self, year: int) -> Iterable[tuple[date, bool]]: + return self._get_holiday(HARI_HOL_JOHOR, year) + + def hasan_al_askari_death_dates(self, year: int) -> Iterable[tuple[date, bool]]: + return self._get_holiday(HASAN_AL_ASKARI_DEATH, year) + + def hijri_new_year_dates(self, year: int) -> Iterable[tuple[date, bool]]: + return self._get_holiday(HIJRI_NEW_YEAR, year) + + def imam_mahdi_birthday_dates(self, year: int) -> Iterable[tuple[date, bool]]: + return self._get_holiday(IMAM_MAHDI_BIRTHDAY, year) + + def isra_and_miraj_dates(self, year: int) -> Iterable[tuple[date, bool]]: + return self._get_holiday(ISRA_AND_MIRAJ, year) + + def laylat_al_qadr_dates(self, year: int) -> Iterable[tuple[date, bool]]: + return self._get_holiday(LAYLAT_AL_QADR, year) + + def maldives_embraced_islam_day_dates(self, year: int) -> Iterable[tuple[date, bool]]: + return self._get_holiday(MALDIVES_EMBRACED_ISLAM_DAY, year) + + def mawlid_dates(self, year: int) -> Iterable[tuple[date, bool]]: + return self._get_holiday(MAWLID, year) + + def nuzul_al_quran_dates(self, year: int) -> Iterable[tuple[date, bool]]: + return self._get_holiday(NUZUL_AL_QURAN, year) + + def prophet_death_dates(self, year: int) -> Iterable[tuple[date, bool]]: + return self._get_holiday(PROPHET_DEATH, year) + + def quamee_dhuvas_dates(self, year: int) -> Iterable[tuple[date, bool]]: + return self._get_holiday(QUAMEE_DHUVAS, year) + + def ramadan_beginning_dates(self, year: int) -> Iterable[tuple[date, bool]]: + return self._get_holiday(RAMADAN_BEGINNING, year) + + def sadiq_birthday_dates(self, year: int) -> Iterable[tuple[date, bool]]: + return self._get_holiday(SADIQ_BIRTHDAY, year) + + def sadiq_death_dates(self, year: int) -> Iterable[tuple[date, bool]]: + return self._get_holiday(SADIQ_DEATH, year) + + def tasua_dates(self, year: int) -> Iterable[tuple[date, bool]]: + return self._get_holiday(TASUA, year) + + +class _CustomIslamicHolidays(_CustomCalendar, _IslamicLunar): + pass diff --git a/.venv/lib/python3.12/site-packages/holidays/calendars/julian.py b/.venv/lib/python3.12/site-packages/holidays/calendars/julian.py new file mode 100644 index 00000000..5cb5db04 --- /dev/null +++ b/.venv/lib/python3.12/site-packages/holidays/calendars/julian.py @@ -0,0 +1,13 @@ +# holidays +# -------- +# A fast, efficient Python library for generating country, province and state +# specific sets of holidays on the fly. It aims to make determining whether a +# specific date is a holiday as fast and flexible as possible. +# +# Authors: Vacanza Team and individual contributors (see CONTRIBUTORS file) +# dr-prodigy (c) 2017-2023 +# ryanss (c) 2014-2017 +# Website: https://github.com/vacanza/holidays +# License: MIT (see LICENSE file) + +JULIAN_CALENDAR = "JULIAN_CALENDAR" diff --git a/.venv/lib/python3.12/site-packages/holidays/calendars/julian_revised.py b/.venv/lib/python3.12/site-packages/holidays/calendars/julian_revised.py new file mode 100644 index 00000000..4df80d46 --- /dev/null +++ b/.venv/lib/python3.12/site-packages/holidays/calendars/julian_revised.py @@ -0,0 +1,13 @@ +# holidays +# -------- +# A fast, efficient Python library for generating country, province and state +# specific sets of holidays on the fly. It aims to make determining whether a +# specific date is a holiday as fast and flexible as possible. +# +# Authors: Vacanza Team and individual contributors (see CONTRIBUTORS file) +# dr-prodigy (c) 2017-2023 +# ryanss (c) 2014-2017 +# Website: https://github.com/vacanza/holidays +# License: MIT (see LICENSE file) + +JULIAN_REVISED_CALENDAR = "JULIAN_REVISED_CALENDAR" diff --git a/.venv/lib/python3.12/site-packages/holidays/calendars/mongolian.py b/.venv/lib/python3.12/site-packages/holidays/calendars/mongolian.py new file mode 100644 index 00000000..44b2bdc5 --- /dev/null +++ b/.venv/lib/python3.12/site-packages/holidays/calendars/mongolian.py @@ -0,0 +1,342 @@ +# holidays +# -------- +# A fast, efficient Python library for generating country, province and state +# specific sets of holidays on the fly. It aims to make determining whether a +# specific date is a holiday as fast and flexible as possible. +# +# Authors: Vacanza Team and individual contributors (see CONTRIBUTORS file) +# dr-prodigy (c) 2017-2023 +# ryanss (c) 2014-2017 +# Website: https://github.com/vacanza/holidays +# License: MIT (see LICENSE file) + +from datetime import date +from typing import Optional + +from holidays.calendars.custom import _CustomCalendar +from holidays.calendars.gregorian import JAN, FEB, MAR, MAY, JUN, OCT, NOV, DEC + +BUDDHA_DAY = "BUDDHA_DAY" +GENGHIS_KHAN_DAY = "GENGHIS_KHAN_DAY" +TSAGAAN_SAR = "TSAGAAN_SAR" + + +class _MongolianLunisolar: + BUDDHA_DAY_DATES = { + 2004: (JUN, 3), + 2005: (MAY, 23), + 2006: (JUN, 11), + 2007: (MAY, 31), + 2008: (MAY, 20), + 2009: (JUN, 7), + 2010: (MAY, 27), + 2011: (MAY, 17), + 2012: (JUN, 4), + 2013: (MAY, 25), + 2014: (JUN, 13), + 2015: (JUN, 2), + 2016: (MAY, 21), + 2017: (JUN, 9), + 2018: (MAY, 29), + 2019: (MAY, 18), + 2020: (JUN, 5), + 2021: (MAY, 26), + 2022: (JUN, 14), + 2023: (JUN, 4), + 2024: (MAY, 23), + 2025: (JUN, 11), + 2026: (MAY, 31), + 2027: (MAY, 20), + 2028: (JUN, 7), + 2029: (MAY, 27), + 2030: (MAY, 17), + 2031: (JUN, 5), + 2032: (MAY, 25), + 2033: (JUN, 12), + 2034: (JUN, 2), + 2035: (MAY, 22), + 2036: (JUN, 8), + 2037: (MAY, 29), + 2038: (MAY, 18), + 2039: (JUN, 6), + 2040: (MAY, 26), + 2041: (JUN, 14), + 2042: (JUN, 3), + 2043: (MAY, 23), + 2044: (JUN, 10), + 2045: (MAY, 30), + 2046: (MAY, 20), + 2047: (JUN, 8), + 2048: (MAY, 27), + 2049: (MAY, 17), + 2050: (JUN, 5), + 2051: (MAY, 25), + 2052: (JUN, 12), + 2053: (JUN, 1), + 2054: (MAY, 21), + 2055: (JUN, 9), + 2056: (MAY, 29), + 2057: (MAY, 18), + 2058: (JUN, 6), + 2059: (MAY, 27), + 2060: (JUN, 14), + 2061: (JUN, 3), + 2062: (MAY, 23), + 2063: (JUN, 11), + 2064: (MAY, 30), + 2065: (MAY, 20), + 2066: (JUN, 8), + 2067: (MAY, 28), + 2068: (JUN, 15), + 2069: (JUN, 4), + 2070: (MAY, 24), + 2071: (JUN, 12), + 2072: (MAY, 31), + 2073: (MAY, 21), + 2074: (JUN, 9), + 2075: (MAY, 30), + 2076: (MAY, 18), + 2077: (JUN, 6), + 2078: (MAY, 26), + 2079: (JUN, 14), + 2080: (JUN, 2), + 2081: (MAY, 22), + 2082: (JUN, 10), + 2083: (MAY, 31), + 2084: (MAY, 20), + 2085: (JUN, 8), + 2086: (MAY, 28), + 2087: (JUN, 16), + 2088: (JUN, 4), + 2089: (MAY, 24), + 2090: (JUN, 12), + 2091: (JUN, 1), + 2092: (MAY, 21), + 2093: (JUN, 9), + 2094: (MAY, 30), + 2095: (MAY, 19), + 2096: (JUN, 6), + 2097: (MAY, 26), + 2098: (JUN, 13), + 2099: (JUN, 3), + 2100: (MAY, 23), + } + + GENGHIS_KHAN_DAY_DATES = { + 2004: (NOV, 13), + 2005: (NOV, 2), + 2006: (NOV, 21), + 2007: (NOV, 10), + 2008: (NOV, 28), + 2009: (NOV, 17), + 2010: (NOV, 7), + 2011: (NOV, 26), + 2012: (NOV, 14), + 2013: (NOV, 4), + 2014: (NOV, 23), + 2015: (NOV, 12), + 2016: (OCT, 31), + 2017: (NOV, 19), + 2018: (NOV, 8), + 2019: (NOV, 27), + 2020: (NOV, 16), + 2021: (NOV, 5), + 2022: (NOV, 24), + 2023: (NOV, 14), + 2024: (NOV, 2), + 2025: (NOV, 21), + 2026: (NOV, 10), + 2027: (NOV, 29), + 2028: (NOV, 17), + 2029: (NOV, 7), + 2030: (NOV, 26), + 2031: (NOV, 15), + 2032: (NOV, 4), + 2033: (NOV, 22), + 2034: (NOV, 11), + 2035: (NOV, 30), + 2036: (NOV, 18), + 2037: (NOV, 8), + 2038: (NOV, 27), + 2039: (NOV, 17), + 2040: (NOV, 5), + 2041: (NOV, 24), + 2042: (NOV, 13), + 2043: (NOV, 2), + 2044: (NOV, 20), + 2045: (NOV, 9), + 2046: (NOV, 28), + 2047: (NOV, 18), + 2048: (NOV, 7), + 2049: (NOV, 26), + 2050: (NOV, 15), + 2051: (NOV, 4), + 2052: (NOV, 22), + 2053: (NOV, 11), + 2054: (NOV, 30), + 2055: (NOV, 19), + 2056: (NOV, 8), + 2057: (NOV, 27), + 2058: (NOV, 17), + 2059: (NOV, 6), + 2060: (NOV, 24), + 2061: (NOV, 13), + 2062: (NOV, 2), + 2063: (NOV, 21), + 2064: (NOV, 9), + 2065: (NOV, 28), + 2066: (NOV, 18), + 2067: (NOV, 7), + 2068: (NOV, 25), + 2069: (NOV, 14), + 2070: (NOV, 3), + 2071: (NOV, 22), + 2072: (NOV, 11), + 2073: (NOV, 30), + 2074: (NOV, 19), + 2075: (NOV, 9), + 2076: (NOV, 27), + 2077: (NOV, 16), + 2078: (NOV, 5), + 2079: (NOV, 24), + 2080: (NOV, 12), + 2081: (NOV, 1), + 2082: (NOV, 21), + 2083: (NOV, 10), + 2084: (NOV, 28), + 2085: (NOV, 18), + 2086: (NOV, 7), + 2087: (NOV, 26), + 2088: (NOV, 14), + 2089: (NOV, 3), + 2090: (NOV, 22), + 2091: (NOV, 12), + 2092: (NOV, 30), + 2093: (NOV, 19), + 2094: (NOV, 9), + 2095: (NOV, 27), + 2096: (NOV, 15), + 2097: (NOV, 5), + 2098: (NOV, 23), + 2099: (NOV, 13), + 2100: (DEC, 2), + } + + TSAGAAN_SAR_DATES = { + 2004: (FEB, 21), + 2005: (FEB, 9), + 2006: (JAN, 30), + 2007: (FEB, 18), + 2008: (FEB, 8), + 2009: (FEB, 25), + 2010: (FEB, 14), + 2011: (FEB, 3), + 2012: (FEB, 22), + 2013: (FEB, 11), + 2014: (JAN, 31), + 2015: (FEB, 19), + 2016: (FEB, 9), + 2017: (FEB, 27), + 2018: (FEB, 16), + 2019: (FEB, 5), + 2020: (FEB, 24), + 2021: (FEB, 12), + 2022: (FEB, 2), + 2023: (FEB, 21), + 2024: (FEB, 10), + 2025: (MAR, 1), + 2026: (FEB, 18), + 2027: (FEB, 7), + 2028: (FEB, 26), + 2029: (FEB, 14), + 2030: (FEB, 3), + 2031: (FEB, 22), + 2032: (FEB, 12), + 2033: (JAN, 31), + 2034: (FEB, 19), + 2035: (FEB, 9), + 2036: (FEB, 28), + 2037: (FEB, 16), + 2038: (FEB, 5), + 2039: (FEB, 24), + 2040: (FEB, 13), + 2041: (FEB, 2), + 2042: (FEB, 21), + 2043: (FEB, 10), + 2044: (FEB, 29), + 2045: (FEB, 17), + 2046: (FEB, 6), + 2047: (FEB, 25), + 2048: (FEB, 14), + 2049: (FEB, 3), + 2050: (FEB, 22), + 2051: (FEB, 12), + 2052: (FEB, 1), + 2053: (FEB, 19), + 2054: (FEB, 8), + 2055: (FEB, 27), + 2056: (FEB, 16), + 2057: (FEB, 4), + 2058: (FEB, 23), + 2059: (FEB, 13), + 2060: (FEB, 3), + 2061: (FEB, 21), + 2062: (FEB, 10), + 2063: (MAR, 1), + 2064: (FEB, 18), + 2065: (FEB, 6), + 2066: (FEB, 25), + 2067: (FEB, 14), + 2068: (FEB, 4), + 2069: (FEB, 22), + 2070: (FEB, 12), + 2071: (FEB, 1), + 2072: (FEB, 19), + 2073: (FEB, 7), + 2074: (FEB, 26), + 2075: (FEB, 16), + 2076: (FEB, 5), + 2077: (FEB, 23), + 2078: (FEB, 13), + 2079: (FEB, 2), + 2080: (FEB, 21), + 2081: (FEB, 9), + 2082: (FEB, 28), + 2083: (FEB, 17), + 2084: (FEB, 7), + 2085: (FEB, 25), + 2086: (FEB, 14), + 2087: (FEB, 4), + 2088: (FEB, 23), + 2089: (FEB, 11), + 2090: (MAR, 2), + 2091: (FEB, 19), + 2092: (FEB, 8), + 2093: (FEB, 26), + 2094: (FEB, 16), + 2095: (FEB, 5), + 2096: (FEB, 24), + 2097: (FEB, 13), + 2098: (FEB, 2), + 2099: (FEB, 21), + 2100: (FEB, 10), + } + + def _get_holiday(self, holiday: str, year: int) -> tuple[Optional[date], bool]: + estimated_dates = getattr(self, f"{holiday}_DATES", {}) + exact_dates = getattr(self, f"{holiday}_DATES_{_CustomCalendar.CUSTOM_ATTR_POSTFIX}", {}) + dt = exact_dates.get(year, estimated_dates.get(year, ())) + return date(year, *dt) if dt else None, year not in exact_dates + + def buddha_day_date(self, year: int) -> tuple[Optional[date], bool]: + return self._get_holiday(BUDDHA_DAY, year) + + def genghis_khan_day_date(self, year: int) -> tuple[Optional[date], bool]: + return self._get_holiday(GENGHIS_KHAN_DAY, year) + + def tsagaan_sar_date(self, year: int) -> tuple[Optional[date], bool]: + return self._get_holiday(TSAGAAN_SAR, year) + + +class _CustomMongolianHolidays(_CustomCalendar, _MongolianLunisolar): + pass diff --git a/.venv/lib/python3.12/site-packages/holidays/calendars/persian.py b/.venv/lib/python3.12/site-packages/holidays/calendars/persian.py new file mode 100644 index 00000000..42b21ace --- /dev/null +++ b/.venv/lib/python3.12/site-packages/holidays/calendars/persian.py @@ -0,0 +1,64 @@ +# holidays +# -------- +# A fast, efficient Python library for generating country, province and state +# specific sets of holidays on the fly. It aims to make determining whether a +# specific date is a holiday as fast and flexible as possible. +# +# Authors: Vacanza Team and individual contributors (see CONTRIBUTORS file) +# dr-prodigy (c) 2017-2023 +# ryanss (c) 2014-2017 +# Website: https://github.com/vacanza/holidays +# License: MIT (see LICENSE file) + +from datetime import date +from typing import Optional + +from holidays.calendars.gregorian import _timedelta + + +class _Persian: + """ + Persian calendar (Solar Hijri) for 1901-2100 years. + + https://en.wikipedia.org/wiki/Solar_Hijri_calendar + """ + + START_YEAR = 1901 + END_YEAR = 2100 + + def is_leap_year(self, year: int) -> bool: + """ + Is Persian year that begins in the specified Gregorian year a leap year. + """ + return (year % 33) in {3, 7, 11, 16, 20, 24, 28, 32} + + def new_year_date(self, year: int) -> Optional[date]: + """ + Return Gregorian date of Persian new year (1 Farvardin) in a given Gregorian year. + """ + if year < _Persian.START_YEAR or year > _Persian.END_YEAR: + return None + + day = 21 + if ( + (year % 4 == 1 and year >= 2029) + or (year % 4 == 2 and year >= 2062) + or (year % 4 == 3 and year >= 2095) + or (year % 4 == 0 and 1996 <= year <= 2096) + ): + day = 20 + elif (year % 4 == 2 and year <= 1926) or (year % 4 == 3 and year <= 1959): + day = 22 + return date(year, 3, day) + + def persian_to_gregorian(self, year: int, j_month: int, j_day: int) -> Optional[date]: + """ + Return Gregorian date of Persian day and month in a given Gregorian year. + """ + start_date = self.new_year_date(year) + if not start_date: + return None + + m = j_month - 1 + delta = (31 * m if m < 6 else 186 + 30 * (m - 6)) + j_day - 1 + return _timedelta(start_date, delta) diff --git a/.venv/lib/python3.12/site-packages/holidays/calendars/sinhala.py b/.venv/lib/python3.12/site-packages/holidays/calendars/sinhala.py new file mode 100644 index 00000000..ee0b7484 --- /dev/null +++ b/.venv/lib/python3.12/site-packages/holidays/calendars/sinhala.py @@ -0,0 +1,414 @@ +# holidays +# -------- +# A fast, efficient Python library for generating country, province and state +# specific sets of holidays on the fly. It aims to make determining whether a +# specific date is a holiday as fast and flexible as possible. +# +# Authors: Vacanza Team and individual contributors (see CONTRIBUTORS file) +# dr-prodigy (c) 2017-2023 +# ryanss (c) 2014-2017 +# Website: https://github.com/vacanza/holidays +# License: MIT (see LICENSE file) + +from collections.abc import Iterable +from datetime import date +from typing import Optional + +from holidays.calendars.custom import _CustomCalendar +from holidays.calendars.gregorian import JAN, FEB, MAR, APR, MAY, JUN, JUL, AUG, SEP, OCT, NOV, DEC +from holidays.helpers import _normalize_tuple + +BAK_POYA = "BAK_POYA" +BINARA_POYA = "BINARA_POYA" +DURUTHU_POYA = "DURUTHU_POYA" +ESALA_POYA = "ESALA_POYA" +IL_POYA = "IL_POYA" +MEDIN_POYA = "MEDIN_POYA" +NAWAM_POYA = "NAWAM_POYA" +NIKINI_POYA = "NIKINI_POYA" +POSON_POYA = "POSON_POYA" +UNDUVAP_POYA = "UNDUVAP_POYA" +VAP_POYA = "VAP_POYA" +VESAK_POYA = "VESAK_POYA" + + +class _SinhalaLunar: + """ + Sinhala Lunar calendar for 2003-2025 years. + + Their Buddhist Uposatha day calculation method is different from Thai LuniSolar + and Buddhist (Mahayana) used in East Asia. + + Due to the fact that Poya (Uposatha) days are calculated astronomically + based on how close a particular day is closest to full moon at noon, and that + an extra month is added every 33 months interval, this is hardcoded for now. + + Adhi month dates are instead hardcoded in Sri Lanka country implementation. + """ + + START_YEAR = 2003 + END_YEAR = 2025 + + BAK_POYA_DATES = { + 2003: (APR, 16), + 2004: (APR, 5), + 2005: (APR, 23), + 2006: (APR, 13), + 2007: (APR, 2), + 2008: (APR, 19), + 2009: (APR, 9), + 2010: (MAR, 29), + 2011: (APR, 17), + 2012: (APR, 6), + 2013: (APR, 25), + 2014: (APR, 14), + 2015: (APR, 3), + 2016: (APR, 21), + 2017: (APR, 10), + 2018: (MAR, 31), + 2019: (APR, 19), + 2020: (APR, 7), + 2021: (APR, 26), + 2022: (APR, 16), + 2023: (APR, 5), + 2024: (APR, 23), + 2025: (APR, 12), + } + + BINARA_POYA_DATES = { + 2003: (SEP, 10), + 2004: (SEP, 28), + 2005: (SEP, 17), + 2006: (SEP, 7), + 2007: (SEP, 26), + 2008: (SEP, 14), + 2009: (SEP, 4), + 2010: (SEP, 22), + 2011: (SEP, 11), + 2012: (SEP, 29), + 2013: (SEP, 19), + 2014: (SEP, 8), + 2015: (SEP, 27), + 2016: (SEP, 16), + 2017: (SEP, 5), + 2018: (SEP, 24), + 2019: (SEP, 13), + 2020: (SEP, 1), + 2021: (SEP, 20), + 2022: (SEP, 10), + 2023: (SEP, 29), + 2024: (SEP, 17), + 2025: (SEP, 7), + } + + DURUTHU_POYA_DATES = { + 2003: (JAN, 17), + 2004: (JAN, 7), + 2005: (JAN, 24), + 2006: (JAN, 13), + 2007: (JAN, 3), + 2008: (JAN, 22), + 2009: ((JAN, 10), (DEC, 31)), + 2011: (JAN, 19), + 2012: (JAN, 8), + 2013: (JAN, 26), + 2014: (JAN, 15), + 2015: (JAN, 4), + 2016: (JAN, 23), + 2017: (JAN, 12), + 2018: (JAN, 1), + 2019: (JAN, 20), + 2020: (JAN, 10), + 2021: (JAN, 28), + 2022: (JAN, 17), + 2023: (JAN, 6), + 2024: (JAN, 25), + 2025: (JAN, 13), + } + + ESALA_POYA_DATES = { + 2003: (JUL, 13), + 2004: (JUL, 2), + 2005: (JUL, 21), + 2006: (JUL, 10), + 2007: (JUL, 29), + 2008: (JUL, 17), + 2009: (JUL, 6), + 2010: (JUL, 25), + 2011: (JUL, 14), + 2012: (JUL, 3), + 2013: (JUL, 22), + 2014: (JUL, 12), + 2015: (JUL, 31), + 2016: (JUL, 19), + 2017: (JUL, 8), + 2018: (JUL, 27), + 2019: (JUL, 16), + 2020: (JUL, 4), + 2021: (JUL, 23), + 2022: (JUL, 13), + 2023: (AUG, 1), + 2024: (JUL, 20), + 2025: (JUL, 10), + } + + IL_POYA_DATES = { + 2003: (NOV, 8), + 2004: (NOV, 26), + 2005: (NOV, 15), + 2006: (NOV, 5), + 2007: (NOV, 24), + 2008: (NOV, 12), + 2009: (NOV, 2), + 2010: (NOV, 21), + 2011: (NOV, 10), + 2012: (NOV, 27), + 2013: (NOV, 17), + 2014: (NOV, 6), + 2015: (NOV, 25), + 2016: (NOV, 14), + 2017: (NOV, 3), + 2018: (NOV, 22), + 2019: (NOV, 12), + 2020: (NOV, 29), + 2021: (NOV, 18), + 2022: (NOV, 7), + 2023: (NOV, 26), + 2024: (NOV, 15), + 2025: (NOV, 5), + } + + MEDIN_POYA_DATES = { + 2003: (MAR, 18), + 2004: (MAR, 6), + 2005: (MAR, 25), + 2006: (MAR, 14), + 2007: (MAR, 3), + 2008: (MAR, 21), + 2009: (MAR, 10), + 2010: (FEB, 28), + 2011: (MAR, 19), + 2012: (MAR, 7), + 2013: (MAR, 26), + 2014: (MAR, 16), + 2015: (MAR, 5), + 2016: (MAR, 22), + 2017: (MAR, 12), + 2018: (MAR, 1), + 2019: (MAR, 20), + 2020: (MAR, 9), + 2021: (MAR, 28), + 2022: (MAR, 17), + 2023: (MAR, 6), + 2024: (MAR, 24), + 2025: (MAR, 13), + } + + NAWAM_POYA_DATES = { + 2003: (FEB, 16), + 2004: (FEB, 5), + 2005: (FEB, 23), + 2006: (FEB, 12), + 2007: (FEB, 1), + 2008: (FEB, 20), + 2009: (FEB, 9), + 2010: (JAN, 29), + 2011: (FEB, 17), + 2012: (FEB, 7), + 2013: (FEB, 25), + 2014: (FEB, 14), + 2015: (FEB, 3), + 2016: (FEB, 22), + 2017: (FEB, 10), + 2018: (JAN, 31), + 2019: (FEB, 19), + 2020: (FEB, 8), + 2021: (FEB, 26), + 2022: (FEB, 16), + 2023: (FEB, 5), + 2024: (FEB, 23), + 2025: (FEB, 12), + } + + NIKINI_POYA_DATES = { + 2003: (AUG, 11), + 2004: (AUG, 29), + 2005: (AUG, 19), + 2006: (AUG, 9), + 2007: (AUG, 28), + 2008: (AUG, 16), + 2009: (AUG, 5), + 2010: (AUG, 24), + 2011: (AUG, 13), + 2012: (AUG, 1), + 2013: (AUG, 20), + 2014: (AUG, 10), + 2015: (AUG, 29), + 2016: (AUG, 17), + 2017: (AUG, 7), + 2018: (AUG, 25), + 2019: (AUG, 14), + 2020: (AUG, 3), + 2021: (AUG, 22), + 2022: (AUG, 11), + 2023: (AUG, 30), + 2024: (AUG, 19), + 2025: (AUG, 8), + } + + POSON_POYA_DATES = { + 2003: (JUN, 14), + 2004: (JUN, 2), + 2005: (JUN, 21), + 2006: (JUN, 11), + 2007: (JUN, 30), + 2008: (JUN, 18), + 2009: (JUN, 7), + 2010: (JUN, 25), + 2011: (JUN, 15), + 2012: (JUN, 4), + 2013: (JUN, 23), + 2014: (JUN, 12), + 2015: (JUN, 2), + 2016: (JUN, 19), + 2017: (JUN, 8), + 2018: (JUN, 27), + 2019: (JUN, 16), + 2020: (JUN, 5), + 2021: (JUN, 24), + 2022: (JUN, 14), + 2023: (JUN, 3), + 2024: (JUN, 21), + 2025: (JUN, 10), + } + + UNDUVAP_POYA_DATES = { + 2003: (DEC, 8), + 2004: (DEC, 26), + 2005: (DEC, 15), + 2006: (DEC, 4), + 2007: (DEC, 23), + 2008: (DEC, 12), + 2009: (DEC, 1), + 2010: (DEC, 20), + 2011: (DEC, 10), + 2012: (DEC, 27), + 2013: (DEC, 16), + 2014: (DEC, 6), + 2015: (DEC, 24), + 2016: (DEC, 13), + 2017: (DEC, 3), + 2018: (DEC, 22), + 2019: (DEC, 11), + 2020: (DEC, 29), + 2021: (DEC, 18), + 2022: (DEC, 7), + 2023: (DEC, 26), + 2024: (DEC, 14), + 2025: (DEC, 4), + } + + VAP_POYA_DATES = { + 2003: (OCT, 9), + 2004: (OCT, 27), + 2005: (OCT, 17), + 2006: (OCT, 6), + 2007: (OCT, 25), + 2008: (OCT, 14), + 2009: (OCT, 3), + 2010: (OCT, 22), + 2011: (OCT, 11), + 2012: (OCT, 29), + 2013: (OCT, 18), + 2014: (OCT, 8), + 2015: (OCT, 27), + 2016: (OCT, 15), + 2017: (OCT, 5), + 2018: (OCT, 24), + 2019: (OCT, 13), + 2020: (OCT, 30), + 2021: (OCT, 20), + 2022: (OCT, 9), + 2023: (OCT, 28), + 2024: (OCT, 17), + 2025: (OCT, 6), + } + + VESAK_POYA_DATES = { + 2003: (MAY, 15), + 2004: (MAY, 4), + 2005: (MAY, 23), + 2006: (MAY, 12), + 2007: (MAY, 1), + 2008: (MAY, 19), + 2009: (MAY, 8), + 2010: (MAY, 27), + 2011: (MAY, 17), + 2012: (MAY, 5), + 2013: (MAY, 24), + 2014: (MAY, 14), + 2015: (MAY, 3), + 2016: (MAY, 21), + 2017: (MAY, 10), + 2018: (APR, 29), + 2019: (MAY, 18), + 2020: (MAY, 7), + 2021: (MAY, 26), + 2022: (MAY, 15), + 2023: (MAY, 5), + 2024: (MAY, 23), + 2025: (MAY, 12), + } + + def _get_holiday(self, holiday: str, year: int) -> tuple[Optional[date], bool]: + estimated_dates = getattr(self, f"{holiday}_DATES", {}) + exact_dates = getattr(self, f"{holiday}_DATES_{_CustomCalendar.CUSTOM_ATTR_POSTFIX}", {}) + dt = exact_dates.get(year, estimated_dates.get(year, ())) + return date(year, *dt) if dt else None, year not in exact_dates + + def _get_holiday_set(self, holiday: str, year: int) -> Iterable[tuple[date, bool]]: + estimated_dates = getattr(self, f"{holiday}_DATES", {}) + exact_dates = getattr(self, f"{holiday}_DATES_{_CustomCalendar.CUSTOM_ATTR_POSTFIX}", {}) + for year in (year - 1, year): + for dt in _normalize_tuple(exact_dates.get(year, estimated_dates.get(year, ()))): + yield date(year, *dt), year not in exact_dates + + def bak_poya_date(self, year: int) -> tuple[Optional[date], bool]: + return self._get_holiday(BAK_POYA, year) + + def binara_poya_date(self, year: int) -> tuple[Optional[date], bool]: + return self._get_holiday(BINARA_POYA, year) + + def duruthu_poya_date(self, year: int) -> Iterable[tuple[date, bool]]: + return self._get_holiday_set(DURUTHU_POYA, year) + + def esala_poya_date(self, year: int) -> tuple[Optional[date], bool]: + return self._get_holiday(ESALA_POYA, year) + + def il_poya_date(self, year: int) -> tuple[Optional[date], bool]: + return self._get_holiday(IL_POYA, year) + + def medin_poya_date(self, year: int) -> tuple[Optional[date], bool]: + return self._get_holiday(MEDIN_POYA, year) + + def nawam_poya_date(self, year: int) -> tuple[Optional[date], bool]: + return self._get_holiday(NAWAM_POYA, year) + + def nikini_poya_date(self, year: int) -> tuple[Optional[date], bool]: + return self._get_holiday(NIKINI_POYA, year) + + def poson_poya_date(self, year: int) -> tuple[Optional[date], bool]: + return self._get_holiday(POSON_POYA, year) + + def unduvap_poya_date(self, year: int) -> tuple[Optional[date], bool]: + return self._get_holiday(UNDUVAP_POYA, year) + + def vap_poya_date(self, year: int) -> tuple[Optional[date], bool]: + return self._get_holiday(VAP_POYA, year) + + def vesak_poya_date(self, year: int) -> tuple[Optional[date], bool]: + return self._get_holiday(VESAK_POYA, year) + + +class _CustomSinhalaHolidays(_CustomCalendar, _SinhalaLunar): + pass diff --git a/.venv/lib/python3.12/site-packages/holidays/calendars/thai.py b/.venv/lib/python3.12/site-packages/holidays/calendars/thai.py new file mode 100644 index 00000000..f6855f09 --- /dev/null +++ b/.venv/lib/python3.12/site-packages/holidays/calendars/thai.py @@ -0,0 +1,799 @@ +# holidays +# -------- +# A fast, efficient Python library for generating country, province and state +# specific sets of holidays on the fly. It aims to make determining whether a +# specific date is a holiday as fast and flexible as possible. +# +# Authors: Vacanza Team and individual contributors (see CONTRIBUTORS file) +# dr-prodigy (c) 2017-2023 +# ryanss (c) 2014-2017 +# Website: https://github.com/vacanza/holidays +# License: MIT (see LICENSE file) + +from datetime import date +from functools import lru_cache +from typing import Optional + +from holidays.calendars.gregorian import _timedelta + +KHMER_CALENDAR = "KHMER_CALENDAR" +THAI_CALENDAR = "THAI_CALENDAR" + + +class _ThaiLunisolar: + """Thai Lunar Calendar Holidays. + + Works from 1913 (B.E. 2456/2455) onwards until 2157 (B.E. 2700), as we only have + Thai year-type data for cross-checking through that period. + + ## The basics of the Thai Lunar Calendar: + + 3-year types for calendar intercalation: + * Pakatimat (Normal Year): + Consists of 12 months, totaling 354 days. + * Athikawan (Extra-Day Year): + Adds one extra day to the 7th month, totaling 355 days for synodic month correction. + * Athikamat (Extra-Month Year): + Adds one extra 8th month, totaling 384 days for sidereal year correction. + + Months alternate between 30 (even months) and 29 (odd months) days. + + The waxing phase (Full Moon) lasts 15 days, while the waning phase (New Moon) lasts + 14 days for odd months (except Month 7 in Athikawan years), 15 days for even months. + + The second "Month 8" for Athikamat years is called "Month 8.8" + (read as "the latter 8th month"), with all observed holidays + delayed from the usual calendar by 30 days. + + Implemented Thai Lunar Calendar holiday methods: + * Magha Puja / Makha Bucha / Meak Bochea: + 15th Waxing Day (Full Moon) of Month 3 (On Month 4 for Athikamat Years). + `KHMER_CALENDAR` always falls on Month 3. + + * Vesak / Visakha Bucha / Visaka Bochea: + 15th Waxing Day (Full Moon) of Month 6 (On Month 7 for Athikamat Years). + `KHMER_CALENDAR` always falls on Month 6. + + * Cambodian Royal Ploughing Ceremony / Preah Neangkol: + 4th Waning Day of Month 6 (On Month 7 for Athikamat Years). + Defaults to `KHMER_CALENDAR` (its sole user). + + * Buddha's Cremation Day / Atthami Bucha: + 8th Waning Day of Month 6 (On Month 7 for Athikamat Years). + `KHMER_CALENDAR` always falls on Month 6. + + * Asalha Puja / Asarnha Bucha: + 15th Waxing Day (Full Moon) of Month 8 (On Month 8.8 for Athikamat Years). + + * Buddhist Lent Day / Wan Khao Phansa: + 1st Waning Day of Month 8 (On Month 8.8 for Athikamat Years). + + * Boun Haw Khao Padapdin / Boon Khao Padap Din: + 14th Waning Day (New Moon) of Month 9. + + * Boun Haw Khao Salark / Boon Khao Sak: + 15th Waxing Day (Full Moon) of Month 10. + + * Pchum Ben / Prachum Bandar: + 15th Waning Day (New Moon) of Month 10. + + * Ok Boun Suang Huea / Vientiane Boat Racing Festival: + 1st Waning Day (New Moon) of Month 11. + + * Loy Krathong / Boun That Louang / Bon Om Touk: + 15th Waxing Day (Full Moon) of Month 12. + + Other Thai Lunar Calendar holidays: + * Thai Royal Ploughing Ceremony / Raeknakhwan: + Court astrologers choose the auspicious dates based on the Thai Lunar Calendar, + but these dates do not follow a predictable pattern. + See the specific section in `thailand.py` for more details. + + * End of Buddhist Lent Day / Ok Phansa: + 15th Waxing Day (Full Moon) of Month 11 + (Currently calculated based on Asalha Puja / Asarnha Bucha method). + + Notes: + The following code is based on Ninenik Narkdee's PHP implementation, + and we're thankful for his work. + + References: + * + * + + Example: + + >>> from holidays.calendars.thai import _ThaiLunisolar + >>> thls = _ThaiLunisolar() + >>> print(thls.visakha_bucha_date(2010)) + 2010-05-28 + + """ + + # Athikawan (Extra-Day Year) list goes from 1914-2157 C.E. + # Copied off from 1757-2157 (B.E. 2300-2700) Thai Lunar Calendar + ATHIKAWAN_YEARS_GREGORIAN = { + 1914, + 1917, + 1925, + 1929, + 1933, + 1936, + 1945, + 1949, + 1952, + 1957, + 1963, + 1970, + 1973, + 1979, + 1987, + 1990, + 1997, + 2000, + 2006, + 2009, + 2016, + 2020, + 2025, + 2032, + 2035, + 2043, + 2046, + 2052, + 2055, + 2058, + 2067, + 2071, + 2076, + 2083, + 2086, + 2092, + 2097, + 2103, + 2109, + 2111, + 2117, + 2121, + 2126, + 2133, + 2136, + 2142, + 2147, + 2153, + } + + # Athikamat (Extra-Month Year) list goes from 1914-2157 C.E.: + # Copied off from 1757-2157 (B.E. 2300-2700) Thai Lunar Calendar + # Approx formula as follows: (common_era-78)-0.45222)%2.7118886 < 1 + ATHIKAMAT_YEARS_GREGORIAN = { + 1915, + 1918, + 1920, + 1923, + 1926, + 1928, + 1931, + 1934, + 1937, + 1939, + 1942, + 1944, + 1947, + 1950, + 1953, + 1956, + 1958, + 1961, + 1964, + 1966, + 1969, + 1972, + 1975, + 1977, + 1980, + 1983, + 1985, + 1988, + 1991, + 1994, + 1996, + 1999, + 2002, + 2004, + 2007, + 2010, + 2012, + 2015, + 2018, + 2021, + 2023, + 2026, + 2029, + 2031, + 2034, + 2037, + 2040, + 2042, + 2045, + 2048, + 2050, + 2053, + 2056, + 2059, + 2062, + 2064, + 2066, + 2069, + 2072, + 2074, + 2077, + 2080, + 2082, + 2085, + 2088, + 2091, + 2094, + 2096, + 2099, + 2101, + 2104, + 2107, + 2112, + 2114, + 2116, + 2119, + 2122, + 2124, + 2127, + 2130, + 2132, + 2135, + 2138, + 2141, + 2144, + 2146, + 2149, + 2151, + 2154, + 2157, + } + + # While Buddhist Holy Days have been observed since the 1900s + # Thailand's Public Holiday Act wasn't codified until 1914 (B.E. 2457) + # and that our array only goes up to B.E. 2700; We'll thus only populate + # the data for 1914-2157 (B.E. 2457-2700). + # Sources: หนังสือเวียนกรมการปกครอง กระทรวงมหาดไทย มท 0310.1/ว4 5 ก.พ. 2539 + START_DATE = date(1913, 11, 28) + START_YEAR = 1914 + END_YEAR = 2157 + + def __init__(self, calendar=THAI_CALENDAR) -> None: + self.__verify_calendar(calendar) + self.__calendar = calendar + + @staticmethod + def __is_khmer_calendar(calendar) -> bool: + """Check if the given calendar is the Khmer calendar. + + Args: + calendar: + The calendar identifier to check. + + Returns: + True if the calendar is `KHMER_CALENDAR`, False otherwise. + """ + return calendar == KHMER_CALENDAR + + @staticmethod + def __verify_calendar(calendar) -> None: + """Verify calendar type.""" + if calendar not in {KHMER_CALENDAR, THAI_CALENDAR}: + raise ValueError( + f"Unknown calendar name: {calendar}. Use `KHMER_CALENDAR` or `THAI_CALENDAR`." + ) + + @lru_cache + def _get_start_date(self, year: int) -> Optional[date]: + """Calculate the start date of that particular Thai Lunar Calendar Year. + + This usually falls in November or December of the previous Gregorian + year in question. Should the year be outside of working scope + (1914-2157: B.E 2457-2700), this will returns None instead. + + Args: + year: + The Gregorian year. + + Returns: + The start date of Thai Lunar Calendar for a Gregorian year. + """ + if year < _ThaiLunisolar.START_YEAR or year > _ThaiLunisolar.END_YEAR: + return None + + delta_days = 354 * (year - _ThaiLunisolar.START_YEAR) + for iter_year in range(_ThaiLunisolar.START_YEAR, year): + if iter_year in _ThaiLunisolar.ATHIKAMAT_YEARS_GREGORIAN: + delta_days += 30 + elif iter_year in _ThaiLunisolar.ATHIKAWAN_YEARS_GREGORIAN: + delta_days += 1 + + return _timedelta(_ThaiLunisolar.START_DATE, delta_days) + + def makha_bucha_date(self, year: int, calendar=None) -> Optional[date]: + """Calculate the estimated Gregorian date of Makha Bucha. + + Also known as "Magha Puja", "Makha Buxha" and "Meak Bochea". + This coincides with the 15th Waxing Day of Month 3 + in Thai Lunar Calendar, or Month 4 in Athikamat years. + + `KHMER_CALENDAR` will always use Month 3 regardless of year type. + + To calculate, we use the following time delta: + + * Athikamat: + 15th Waxing Day of Month 4 or 29[1] + 30[2] + 29[3] + 15[4] -1 = 102 + + * Athikawan: + 15th Waxing Day of Month 3 or 29[1] + 30[2] + 15[3] -1 = 73 + + * Pakatimat: + 15th Waxing Day of Month 3 or 29[1] + 30[2] + 15[3] -1 = 73 + + Args: + year: + The Gregorian year. + + calendar: + Calendar type, this defaults to THAI_CALENDAR. + + Returns: + Estimated Gregorian date of Makha Bucha. + Returns None if the Gregorian year input is invalid. + """ + calendar = calendar or self.__calendar + self.__verify_calendar(calendar) + + start_date = self._get_start_date(year) + if not start_date: + return None + + return _timedelta( + start_date, + +102 + if ( + year in _ThaiLunisolar.ATHIKAMAT_YEARS_GREGORIAN + and not self.__is_khmer_calendar(calendar) + ) + else +73, + ) + + def visakha_bucha_date(self, year: int, calendar=None) -> Optional[date]: + """Calculate the estimated Gregorian date of Visakha Bucha. + + Also known as "Vesak" and "Buddha Day". This coincides with + the 15th Waxing Day of Month 6 in Thai Lunar Calendar, or Month 7 in Athikamat years. + + `KHMER_CALENDAR` will always use Month 6 regardless of year type. + + To calculate, we use use the following time delta: + + * Athikamat: + 15th Waxing Day of Month 7 or 177[1-6] + 15[7] -1 = 191 + + * Athikawan: + 15th Waxing Day of Month 6 or 147[1-5] + 15[6] -1 = 161 + + * Pakatimat: + 15th Waxing Day of Month 6 or 147[1-5] + 15[6] -1 = 161 + + Args: + year: + The Gregorian year. + + calendar: + Calendar type, this defaults to THAI_CALENDAR. + + Returns: + Estimated Gregorian date of Visakha Bucha. + Returns None if the Gregorian year input is invalid. + """ + calendar = calendar or self.__calendar + self.__verify_calendar(calendar) + + start_date = self._get_start_date(year) + if not start_date: + return None + + return _timedelta( + start_date, + +191 + if ( + year in _ThaiLunisolar.ATHIKAMAT_YEARS_GREGORIAN + and not self.__is_khmer_calendar(calendar) + ) + else +161, + ) + + def preah_neangkoal_date(self, year: int) -> Optional[date]: + """Calculate the estimated Gregorian date of Preah Neangkoal. + + Also known as "Cambodian Royal Ploughing Ceremony". This always + coincides with the 4th Waning Day of Month 6 in Khmer Lunar Calendar. + + To calculate, we use use the following time delta: + + * Athikamat: + 4th Waning Day of Month 6 (Khmer Lunar Calendar) or 177[1-5] + 19[6] -1 = 165 + + * Athikawan: + 4th Waning Day of Month 6 or 147[1-5] + 19[6] -1 = 165 + + * Pakatimat: + 4th Waning Day of Month 6 or 147[1-5] + 19[6] -1 = 165 + + Or as in simpler terms: "Visakha Bucha" (Khmer Lunar Calendar) +4. + + Args: + year: + The Gregorian year. + + Returns: + Estimated Gregorian date of Preah Neangkoal. + """ + start_date = self._get_start_date(year) + if not start_date: + return None + + return _timedelta(start_date, +165) + + def atthami_bucha_date(self, year: int, calendar=None) -> Optional[date]: + """Calculate the estimated Gregorian date of Atthami Bucha. + + Also known as "Buddha's Cremation Day". This coincides with + the 8th Waning Day of Month 6 in Thai Lunar Calendar, or Month 7 in Athikamat years. + + `KHMER_CALENDAR` will always use Month 6 regardless of year type. + + To calculate, we use use the following time delta: + + * Athikamat: + 8th Waning Day of Month 7 or 177[1-6] + 23[7] -1 = 199 + + * Athikawan: + 8th Waning Day of Month 6 or 147[1-5] + 23[6] -1 = 169 + + * Pakatimat: + 8th Waning Day of Month 6 or 147[1-5] + 23[6] -1 = 169 + + Or as in simpler terms: "Visakha Bucha" +8 + + Args: + year: + The Gregorian year. + + calendar: + Calendar type, this defaults to THAI_CALENDAR. + + Returns: + Estimated Gregorian date of Atthami Bucha. + Returns None if the Gregorian year input is invalid. + """ + calendar = calendar or self.__calendar + self.__verify_calendar(calendar) + + start_date = self._get_start_date(year) + if not start_date: + return None + + return _timedelta( + start_date, + +199 + if ( + year in _ThaiLunisolar.ATHIKAMAT_YEARS_GREGORIAN + and not self.__is_khmer_calendar(calendar) + ) + else +169, + ) + + def asarnha_bucha_date(self, year: int) -> Optional[date]: + """Calculate the estimated Gregorian date of Asarnha Bucha. + + Also known as "Asalha Puja". This coincides with + the 15th Waxing Day of Month 8 in Thai Lunar Calendar, + or Month 8.8 in Athikamat years. + + Lao Start of Buddhist Lent start on this day (1-day earlier than Thai and Khmer ones). + + To calculate, we use the following time delta: + + * Athikamat: + 15th Waxing Day of Month 8/8 or 177[1-6] + 29[7] + 30[8] + 15[8.8] -1 = 250 + + * Athikawan: + 15th Waxing Day of Month 8 or 177[1-6] + 30[7] + 15[8] -1 = 221 + + * Pakatimat: + 15th Waxing Day of Month 8 or 177[1-6] + 29[7] + 15[8] -1 = 220 + + Args: + year: + The Gregorian year. + + Returns: + Estimated Gregorian date of Asarnha Bucha. + Returns None if the Gregorian year input is invalid. + """ + start_date = self._get_start_date(year) + if not start_date: + return None + + if year in _ThaiLunisolar.ATHIKAMAT_YEARS_GREGORIAN: + delta_days = +250 + elif year in _ThaiLunisolar.ATHIKAWAN_YEARS_GREGORIAN: + delta_days = +221 + else: + delta_days = +220 + return _timedelta(start_date, delta_days) + + def khao_phansa_date(self, year: int) -> Optional[date]: + """Calculate the estimated Gregorian date of Khao Phansa. + + Also known as "(Start of) Buddhist Lent" and "Start of Vassa". + This coincides with the 1st Waning Day of Month 8 + in Thai Lunar Calendar, or Month 8.8 in Athikamat years. + + To calculate, we use use the following time delta: + + * Athikamat: + 1st Waning Day of Month 8.8 or 177[1-6] + 29[7] + 30[8] + 16[8.8] -1 = 251 + + * Athikawan: + 1st Waning Day of Month 8 or 177[1-6] + 30[7] + 16[8] -1 = 222 + + * Pakatimat: + 1st Waning Day of Month 8 or 177[1-6] + 29[7] + 16[8] -1 = 221 + + Or as in simpler terms: "Asarnha Bucha" +1 + + Args: + year: + The Gregorian year. + + Returns: + Estimated Gregorian date of Khao Phansa. + Returns None if the Gregorian year input is invalid. + """ + start_date = self._get_start_date(year) + if not start_date: + return None + + if year in _ThaiLunisolar.ATHIKAMAT_YEARS_GREGORIAN: + delta_days = +251 + elif year in _ThaiLunisolar.ATHIKAWAN_YEARS_GREGORIAN: + delta_days = +222 + else: + delta_days = +221 + return _timedelta(start_date, delta_days) + + def boun_haw_khao_padapdin_date(self, year: int) -> Optional[date]: + """Calculate the estimated Gregorian date of Boun Haw Khao Padapdin. + + Also known as "Boon Khao Padap Din". + This coincides with the 14th Waning Day of Month 9 in Thai Lunar Calendar. + + To calculate, we use use the following time delta: + + * Athikamat: + 14th Waning Day of Month 9 or 236[1-8] + 30[8.8] + 29[9] -1 = 294 + + * Athikawan: + 14th Waning Day of Month 9 or 236[1-8] + 1[7] + 29[9] -1 = 265 + + * Pakatimat: + 14th Waning Day of Month 9 or 236[1-8] + 29[9] -1 = 264 + + Args: + year: + The Gregorian year. + + Returns: + Estimated Gregorian date of Boun Haw Khao Padapdin. + Returns None if the Gregorian year input is invalid. + """ + start_date = self._get_start_date(year) + if not start_date: + return None + + if year in _ThaiLunisolar.ATHIKAMAT_YEARS_GREGORIAN: + delta_days = +294 + elif year in _ThaiLunisolar.ATHIKAWAN_YEARS_GREGORIAN: + delta_days = +265 + else: + delta_days = +264 + return _timedelta(start_date, delta_days) + + def boun_haw_khao_salark_date(self, year: int) -> Optional[date]: + """Calculate the estimated Gregorian date of Boun Haw Khao Salark. + + Also known as "Boon Khao Sak". + This coincides with the 15th Waxing Day of Month 10 in Thai Lunar Calendar. + + To calculate, we use use the following time delta: + + * Athikamat: + 15th Waxing Day of Month 10 or 265[1-9] + 30[8.8] + 15[10] -1 = 309 + + * Athikawan: + 15th Waxing Day of Month 10 or 265[1-9] + 1[7] + 15[10] -1 = 280 + + * Pakatimat: + 15th Waxing Day of Month 10 or 265[1-9] + 15[10] -1 = 279 + + Args: + year: + The Gregorian year. + + Returns: + Estimated Gregorian date of Boun Haw Khao Salark. + Returns None if the Gregorian year input is invalid. + """ + start_date = self._get_start_date(year) + if not start_date: + return None + + if year in _ThaiLunisolar.ATHIKAMAT_YEARS_GREGORIAN: + delta_days = +309 + elif year in _ThaiLunisolar.ATHIKAWAN_YEARS_GREGORIAN: + delta_days = +280 + else: + delta_days = +279 + return _timedelta(start_date, delta_days) + + def pchum_ben_date(self, year: int) -> Optional[date]: + """Calculate the estimated Gregorian date of Pchum Ben. + + Also known as "Prachum Bandar". + This coincides with the 15th Waning Day of Month 10 in Thai Lunar Calendar. + + To calculate, we use use the following time delta: + + * Athikamat: + 15th Waning Day of Month 10 or 265[1-9] + 30[8.8] + 30[10] -1 = 324 + + * Athikawan: + 15th Waning Day of Month 10 or 265[1-9] + 1[7] + 30[10] -1 = 295 + + * Pakatimat: + 15th Waning Day of Month 10 or 265[1-9] + 30[10] -1 = 294 + + Args: + year: + The Gregorian year. + + Returns: + Estimated Gregorian date of Pchum Ben. + Returns None if the Gregorian year input is invalid. + """ + start_date = self._get_start_date(year) + if not start_date: + return None + + if year in _ThaiLunisolar.ATHIKAMAT_YEARS_GREGORIAN: + delta_days = +324 + elif year in _ThaiLunisolar.ATHIKAWAN_YEARS_GREGORIAN: + delta_days = +295 + else: + delta_days = +294 + return _timedelta(start_date, delta_days) + + def ok_phansa_date(self, year: int) -> Optional[date]: + """Calculate the estimated Gregorian date of Ok Phansa. + + Also known as "End of Buddhist Lent" and "End of Vassa". + This coincides with the 15th Waxing Day of Month 11 in Thai Lunar Calendar. + + To calculate, we use use the following time delta: + + * Athikamat: + 15th Waxing Day of Month 11 or 295[1-10] + 30[8.8] + 15[11] -1 = 339 + + * Athikawan: + 15th Waxing Day of Month 11 or 295[1-10] + 1[7] + 15[11] -1 = 310 + + * Pakatimat: + 15th Waxing Day of Month 11 or 295[1-10] + 15[11] -1 = 309 + + Args: + year: + The Gregorian year. + + Returns: + Estimated Gregorian date of Ok Phansa. + Returns None if the Gregorian year input is invalid. + """ + start_date = self._get_start_date(year) + if not start_date: + return None + + if year in _ThaiLunisolar.ATHIKAMAT_YEARS_GREGORIAN: + delta_days = +339 + elif year in _ThaiLunisolar.ATHIKAWAN_YEARS_GREGORIAN: + delta_days = +310 + else: + delta_days = +309 + return _timedelta(start_date, delta_days) + + def boun_suang_heua_date(self, year: int) -> Optional[date]: + """Calculate the estimated Gregorian date of Ok Boun Suang Huea. + + Boun Suang Huea Nakhone Luang Prabang, also known as "Vientiane Boat Racing Festival". + This coincides with the 1st Waning Day of Month 11 in Thai Lunar Calendar. + + To calculate, we use use the following time delta: + + * Athikamat: + 1st Waning Day of Month 11 or 295[1-10] + 30[8.8] + 16[11] -1 = 340 + + * Athikawan: + 1st Waning Day of Month 11 or 295[1-10] + 1[7] + 16[11] -1 = 311 + + * Pakatimat: + 1st Waning Day of Month 11 or 295[1-10] + 16[11] -1 = 310 + + Args: + year: + The Gregorian year. + + Returns: + Estimated Gregorian date of Boun Suang Huea. + Returns None if the Gregorian year input is invalid. + """ + start_date = self._get_start_date(year) + if not start_date: + return None + + if year in _ThaiLunisolar.ATHIKAMAT_YEARS_GREGORIAN: + delta_days = +340 + elif year in _ThaiLunisolar.ATHIKAWAN_YEARS_GREGORIAN: + delta_days = +311 + else: + delta_days = +310 + return _timedelta(start_date, delta_days) + + def loy_krathong_date(self, year: int) -> Optional[date]: + """Calculate the estimated Gregorian date of Loy Krathong. + + Also known as "Boun That Louang" and "Bon Om Touk". + This coincides with the 15th Waxing Day of Month 12 in Thai Lunar Calendar. + + To calculate, we use use the following time delta: + + * Athikamat: + 15th Waxing Day of Month 12 or 324[1-11] + 30[8.8] + 15[11] -1 = 368 + + * Athikawan: + 15th Waxing Day of Month 12 or 324[1-11] + 1[7] + 15[11] -1 = 339 + + * Pakatimat: + 15th Waxing Day of Month 12 or 324[1-11] + 15[11] -1 = 338 + + Args: + year: + The Gregorian year. + + Returns: + Estimated Gregorian date of Loy Krathong. + Returns None if the Gregorian year input is invalid. + """ + start_date = self._get_start_date(year) + if not start_date: + return None + + if year in _ThaiLunisolar.ATHIKAMAT_YEARS_GREGORIAN: + delta_days = +368 + elif year in _ThaiLunisolar.ATHIKAWAN_YEARS_GREGORIAN: + delta_days = +339 + else: + delta_days = +338 + return _timedelta(start_date, delta_days) diff --git a/.venv/lib/python3.12/site-packages/holidays/constants.py b/.venv/lib/python3.12/site-packages/holidays/constants.py new file mode 100644 index 00000000..aab5aa58 --- /dev/null +++ b/.venv/lib/python3.12/site-packages/holidays/constants.py @@ -0,0 +1,69 @@ +# holidays +# -------- +# A fast, efficient Python library for generating country, province and state +# specific sets of holidays on the fly. It aims to make determining whether a +# specific date is a holiday as fast and flexible as possible. +# +# Authors: Vacanza Team and individual contributors (see CONTRIBUTORS file) +# dr-prodigy (c) 2017-2023 +# ryanss (c) 2014-2017 +# Website: https://github.com/vacanza/holidays +# License: MIT (see LICENSE file) + +# ruff: noqa: F401 + +from holidays.calendars.gregorian import ( + JAN, + FEB, + MAR, + APR, + MAY, + JUN, + JUL, + AUG, + SEP, + OCT, + NOV, + DEC, + MON, + TUE, + WED, + THU, + FRI, + SAT, + SUN, + WEEKEND, +) + +HOLIDAY_NAME_DELIMITER = "; " # Holiday names separator. + +# Supported holiday categories. +ARMED_FORCES = "armed_forces" +BANK = "bank" +GOVERNMENT = "government" +HALF_DAY = "half_day" +MANDATORY = "mandatory" +OPTIONAL = "optional" +PUBLIC = "public" +SCHOOL = "school" +UNOFFICIAL = "unofficial" +WORKDAY = "workday" + +CATHOLIC = "catholic" +CHINESE = "chinese" +CHRISTIAN = "christian" +HEBREW = "hebrew" +HINDU = "hindu" +ISLAMIC = "islamic" +ORTHODOX = "orthodox" + +ALBANIAN = "albanian" +ARMENIAN = "armenian" +BOSNIAN = "bosnian" +ROMA = "roma" +SERBIAN = "serbian" +TURKISH = "turkish" +VLACH = "vlach" + +DEFAULT_START_YEAR = 1901 +DEFAULT_END_YEAR = 2100 diff --git a/.venv/lib/python3.12/site-packages/holidays/countries/__init__.py b/.venv/lib/python3.12/site-packages/holidays/countries/__init__.py new file mode 100644 index 00000000..5ff66a62 --- /dev/null +++ b/.venv/lib/python3.12/site-packages/holidays/countries/__init__.py @@ -0,0 +1,261 @@ +# holidays +# -------- +# A fast, efficient Python library for generating country, province and state +# specific sets of holidays on the fly. It aims to make determining whether a +# specific date is a holiday as fast and flexible as possible. +# +# Authors: Vacanza Team and individual contributors (see CONTRIBUTORS file) +# dr-prodigy (c) 2017-2023 +# ryanss (c) 2014-2017 +# Website: https://github.com/vacanza/holidays +# License: MIT (see LICENSE file) + +# ruff: noqa: F401 + +from holidays.countries.afghanistan import Afghanistan, AF, AFG +from holidays.countries.aland_islands import AlandIslands, AX, ALA, HolidaysAX +from holidays.countries.albania import Albania, AL, ALB +from holidays.countries.algeria import Algeria, DZ, DZA +from holidays.countries.american_samoa import AmericanSamoa, AS, ASM, HolidaysAS +from holidays.countries.andorra import Andorra, AD, AND +from holidays.countries.angola import Angola, AO, AGO +from holidays.countries.anguilla import Anguilla, AI, AIA +from holidays.countries.antigua_and_barbuda import AntiguaAndBarbuda, AG, ATG +from holidays.countries.argentina import Argentina, AR, ARG +from holidays.countries.armenia import Armenia, AM, ARM +from holidays.countries.aruba import Aruba, AW, ABW +from holidays.countries.australia import Australia, AU, AUS +from holidays.countries.austria import Austria, AT, AUT +from holidays.countries.azerbaijan import Azerbaijan, AZ, AZE +from holidays.countries.bahamas import Bahamas, BS, BHS +from holidays.countries.bahrain import Bahrain, BH, BAH +from holidays.countries.bangladesh import Bangladesh, BD, BGD +from holidays.countries.barbados import Barbados, BB, BRB +from holidays.countries.belarus import Belarus, BY, BLR +from holidays.countries.belgium import Belgium, BE, BEL +from holidays.countries.belize import Belize, BZ, BLZ +from holidays.countries.benin import Benin, BJ, BEN +from holidays.countries.bermuda import Bermuda, BM, BMU +from holidays.countries.bolivia import Bolivia, BO, BOL +from holidays.countries.bonaire_sint_eustatius_and_saba import BonaireSintEustatiusAndSaba, BQ, BES +from holidays.countries.bosnia_and_herzegovina import BosniaAndHerzegovina, BA, BIH +from holidays.countries.botswana import Botswana, BW, BWA +from holidays.countries.brazil import Brazil, BR, BRA +from holidays.countries.british_virgin_islands import BritishVirginIslands, VG, VGB +from holidays.countries.brunei import Brunei, BN, BRN +from holidays.countries.bulgaria import Bulgaria, BG, BLG +from holidays.countries.burkina_faso import BurkinaFaso, BF, BFA +from holidays.countries.burundi import Burundi, BI, BDI +from holidays.countries.cabo_verde import CaboVerde, CV, CPV +from holidays.countries.cambodia import Cambodia, KH, KHM +from holidays.countries.cameroon import Cameroon, CM, CMR +from holidays.countries.canada import Canada, CA, CAN +from holidays.countries.cayman_islands import CaymanIslands, KY, CYM +from holidays.countries.central_african_republic import CentralAfricanRepublic, CF, CAF +from holidays.countries.chad import Chad, TD, TCD +from holidays.countries.chile import Chile, CL, CHL +from holidays.countries.china import China, CN, CHN +from holidays.countries.christmas_island import ChristmasIsland, CX, CXR +from holidays.countries.cocos_islands import CocosIslands, CC, CCK +from holidays.countries.colombia import Colombia, CO, COL +from holidays.countries.congo import Congo, CG, COG +from holidays.countries.cook_islands import CookIslands, CK, COK +from holidays.countries.costa_rica import CostaRica, CR, CRI +from holidays.countries.croatia import Croatia, HR, HRV +from holidays.countries.cuba import Cuba, CU, CUB +from holidays.countries.curacao import Curacao, CW, CUW +from holidays.countries.cyprus import Cyprus, CY, CYP +from holidays.countries.czechia import Czechia, CZ, CZE +from holidays.countries.denmark import Denmark, DK, DNK +from holidays.countries.djibouti import Djibouti, DJ, DJI +from holidays.countries.dominica import Dominica, DM, DMA +from holidays.countries.dominican_republic import DominicanRepublic, DO, DOM +from holidays.countries.dr_congo import DRCongo, CD, COD +from holidays.countries.ecuador import Ecuador, EC, ECU +from holidays.countries.egypt import Egypt, EG, EGY +from holidays.countries.el_salvador import ElSalvador, SV, SLV +from holidays.countries.equatorial_guinea import EquatorialGuinea, GQ, GNQ +from holidays.countries.estonia import Estonia, EE, EST +from holidays.countries.eswatini import Eswatini, SZ, SZW, Swaziland +from holidays.countries.ethiopia import Ethiopia, ET, ETH +from holidays.countries.falkland_islands import FalklandIslands, FK, FLK +from holidays.countries.faroe_islands import FaroeIslands, FO, FRO +from holidays.countries.fiji import Fiji, FJ, FJI +from holidays.countries.finland import Finland, FI, FIN +from holidays.countries.france import France, FR, FRA +from holidays.countries.french_guiana import FrenchGuiana, GF, GUF, HolidaysGF +from holidays.countries.french_polynesia import FrenchPolynesia, PF, PYF, HolidaysPF +from holidays.countries.french_southern_territories import ( + FrenchSouthernTerritories, + TF, + ATF, + HolidaysTF, +) +from holidays.countries.gabon import Gabon, GA, GAB +from holidays.countries.georgia import Georgia, GE, GEO +from holidays.countries.germany import Germany, DE, DEU +from holidays.countries.ghana import Ghana, GH, GHA +from holidays.countries.gibraltar import Gibraltar, GI, GIB +from holidays.countries.greece import Greece, GR, GRC +from holidays.countries.greenland import Greenland, GL, GRL +from holidays.countries.grenada import Grenada, GD, GRD +from holidays.countries.guadeloupe import Guadeloupe, GP, GLP, HolidaysGP +from holidays.countries.guam import Guam, GU, GUM, HolidaysGU +from holidays.countries.guatemala import Guatemala, GT, GUA +from holidays.countries.guernsey import Guernsey, GG, GGY +from holidays.countries.guinea import Guinea, GN, GIN +from holidays.countries.guyana import Guyana, GY, GUY +from holidays.countries.haiti import Haiti, HT, HTI +from holidays.countries.honduras import Honduras, HN, HND +from holidays.countries.hongkong import HongKong, HK, HKG +from holidays.countries.hungary import Hungary, HU, HUN +from holidays.countries.iceland import Iceland, IS, ISL +from holidays.countries.india import India, IN, IND +from holidays.countries.indonesia import Indonesia, ID, IDN +from holidays.countries.iran import Iran, IR, IRN +from holidays.countries.ireland import Ireland, IE, IRL +from holidays.countries.isle_of_man import IsleOfMan, IM, IMN +from holidays.countries.israel import Israel, IL, ISR +from holidays.countries.italy import Italy, IT, ITA +from holidays.countries.ivory_coast import IvoryCoast, CI, CIV +from holidays.countries.jamaica import Jamaica, JM, JAM +from holidays.countries.japan import Japan, JP, JPN +from holidays.countries.jersey import Jersey, JE, JEY +from holidays.countries.jordan import Jordan, JO, JOR +from holidays.countries.kazakhstan import Kazakhstan, KZ, KAZ +from holidays.countries.kenya import Kenya, KE, KEN +from holidays.countries.kuwait import Kuwait, KW, KWT +from holidays.countries.kyrgyzstan import Kyrgyzstan, KG, KGZ +from holidays.countries.laos import Laos, LA, LAO +from holidays.countries.latvia import Latvia, LV, LVA +from holidays.countries.lebanon import Lebanon, LB, LBN +from holidays.countries.lesotho import Lesotho, LS, LSO +from holidays.countries.libya import Libya, LY, LBY +from holidays.countries.liechtenstein import Liechtenstein, LI, LIE +from holidays.countries.lithuania import Lithuania, LT, LTU +from holidays.countries.luxembourg import Luxembourg, LU, LUX +from holidays.countries.macau import Macau, MO, MAC +from holidays.countries.madagascar import Madagascar, MG, MDG +from holidays.countries.malawi import Malawi, MW, MWI +from holidays.countries.malaysia import Malaysia, MY, MYS +from holidays.countries.maldives import Maldives, MV, MDV +from holidays.countries.mali import Mali, ML, MLI +from holidays.countries.malta import Malta, MT, MLT +from holidays.countries.marshall_islands import MarshallIslands, MH, MHL, HolidaysMH +from holidays.countries.martinique import Martinique, MQ, MTQ, HolidaysMQ +from holidays.countries.mauritania import Mauritania, MR, MRT +from holidays.countries.mauritius import Mauritius, MU, MUS +from holidays.countries.mayotte import Mayotte, YT, MYT, HolidaysYT +from holidays.countries.mexico import Mexico, MX, MEX +from holidays.countries.micronesia import Micronesia, FM, FSM +from holidays.countries.moldova import Moldova, MD, MDA +from holidays.countries.monaco import Monaco, MC, MCO +from holidays.countries.mongolia import Mongolia, MN, MNG +from holidays.countries.montenegro import Montenegro, ME, MNE +from holidays.countries.montserrat import Montserrat, MS, MSR +from holidays.countries.morocco import Morocco, MA, MOR +from holidays.countries.mozambique import Mozambique, MZ, MOZ +from holidays.countries.namibia import Namibia, NA, NAM +from holidays.countries.nauru import Nauru, NR, NRU +from holidays.countries.nepal import Nepal, NP, NPL +from holidays.countries.netherlands import Netherlands, NL, NLD +from holidays.countries.new_caledonia import NewCaledonia, NC, NCL, HolidaysNC +from holidays.countries.new_zealand import NewZealand, NZ, NZL +from holidays.countries.nicaragua import Nicaragua, NI, NIC +from holidays.countries.niger import Niger, NE, NER +from holidays.countries.nigeria import Nigeria, NG, NGA +from holidays.countries.niue import Niue, NU, NIU +from holidays.countries.norfolk_island import NorfolkIsland, NF, NFK +from holidays.countries.north_macedonia import NorthMacedonia, MK, MKD +from holidays.countries.northern_mariana_islands import NorthernMarianaIslands, MP, MNP, HolidaysMP +from holidays.countries.norway import Norway, NO, NOR +from holidays.countries.oman import Oman, OM, OMN +from holidays.countries.pakistan import Pakistan, PK, PAK +from holidays.countries.palau import Palau, PW, PLW +from holidays.countries.palestine import Palestine, PS, PSE +from holidays.countries.panama import Panama, PA, PAN +from holidays.countries.papua_new_guinea import PapuaNewGuinea, PG, PNG +from holidays.countries.paraguay import Paraguay, PY, PRY +from holidays.countries.peru import Peru, PE, PER +from holidays.countries.philippines import Philippines, PH, PHL +from holidays.countries.poland import Poland, PL, POL +from holidays.countries.portugal import Portugal, PT, PRT +from holidays.countries.puerto_rico import PuertoRico, PR, PRI, HolidaysPR +from holidays.countries.qatar import Qatar, QA, QAT +from holidays.countries.reunion import Reunion, RE, REU, HolidaysRE +from holidays.countries.romania import Romania, RO, ROU +from holidays.countries.russia import Russia, RU, RUS +from holidays.countries.saint_barthelemy import SaintBarthelemy, BL, BLM, HolidaysBL +from holidays.countries.saint_kitts_and_nevis import SaintKittsAndNevis, KN, KNA +from holidays.countries.saint_lucia import SaintLucia, LC, LCA +from holidays.countries.saint_martin import SaintMartin, MF, MAF, HolidaysMF +from holidays.countries.saint_pierre_and_miquelon import ( + SaintPierreAndMiquelon, + PM, + SPM, + HolidaysPM, +) +from holidays.countries.saint_vincent_and_the_grenadines import ( + SaintVincentAndTheGrenadines, + VC, + VCT, +) +from holidays.countries.samoa import Samoa, WS, WSM +from holidays.countries.san_marino import SanMarino, SM, SMR +from holidays.countries.sao_tome_and_principe import SaoTomeAndPrincipe, ST, STP +from holidays.countries.saudi_arabia import SaudiArabia, SA, SAU +from holidays.countries.senegal import Senegal, SN, SEN +from holidays.countries.serbia import Serbia, RS, SRB +from holidays.countries.seychelles import Seychelles, SC, SYC +from holidays.countries.sierra_leone import SierraLeone, SL, SLE +from holidays.countries.singapore import Singapore, SG, SGP +from holidays.countries.sint_maarten import SintMaarten, SX, SXM +from holidays.countries.slovakia import Slovakia, SK, SVK +from holidays.countries.slovenia import Slovenia, SI, SVN +from holidays.countries.solomon_islands import SolomonIslands, SB, SLB +from holidays.countries.south_africa import SouthAfrica, ZA, ZAF +from holidays.countries.south_korea import SouthKorea, KR, KOR, Korea +from holidays.countries.spain import Spain, ES, ESP +from holidays.countries.sri_lanka import SriLanka, LK, LKA +from holidays.countries.suriname import Suriname, SR, SUR +from holidays.countries.svalbard_and_jan_mayen import SvalbardAndJanMayen, SJ, SJM, HolidaysSJ +from holidays.countries.sweden import Sweden, SE, SWE +from holidays.countries.switzerland import Switzerland, CH, CHE +from holidays.countries.taiwan import Taiwan, TW, TWN +from holidays.countries.tanzania import Tanzania, TZ, TZA +from holidays.countries.thailand import Thailand, TH, THA +from holidays.countries.timor_leste import TimorLeste, TL, TLS +from holidays.countries.togo import Togo, TG, TGO +from holidays.countries.tokelau import Tokelau, TK, TKL +from holidays.countries.tonga import Tonga, TO, TON +from holidays.countries.trinidad_and_tobago import TrinidadAndTobago, TT, TTO +from holidays.countries.tunisia import Tunisia, TN, TUN +from holidays.countries.turkey import Turkey, TR, TUR +from holidays.countries.turks_and_caicos_islands import TurksAndCaicosIslands, TC, TCA +from holidays.countries.tuvalu import Tuvalu, TV, TUV +from holidays.countries.ukraine import Ukraine, UA, UKR +from holidays.countries.united_arab_emirates import UnitedArabEmirates, AE, ARE +from holidays.countries.united_kingdom import UnitedKingdom, GB, GBR, UK +from holidays.countries.united_states import UnitedStates, US, USA +from holidays.countries.united_states_minor_outlying_islands import ( + UnitedStatesMinorOutlyingIslands, + UM, + UMI, + HolidaysUM, +) +from holidays.countries.united_states_virgin_islands import ( + UnitedStatesVirginIslands, + VI, + VIR, + HolidaysVI, +) +from holidays.countries.uruguay import Uruguay, UY, URY +from holidays.countries.uzbekistan import Uzbekistan, UZ, UZB +from holidays.countries.vanuatu import Vanuatu, VU, VTU +from holidays.countries.vatican_city import VaticanCity, VA, VAT +from holidays.countries.venezuela import Venezuela, VE, VEN +from holidays.countries.vietnam import Vietnam, VN, VNM +from holidays.countries.wallis_and_futuna import WallisAndFutuna, WF, WLF, HolidaysWF +from holidays.countries.yemen import Yemen, YE, YEM +from holidays.countries.zambia import Zambia, ZM, ZMB +from holidays.countries.zimbabwe import Zimbabwe, ZW, ZWE diff --git a/.venv/lib/python3.12/site-packages/holidays/countries/__pycache__/__init__.cpython-312.pyc b/.venv/lib/python3.12/site-packages/holidays/countries/__pycache__/__init__.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..dbf33955c11802296b8137d73f7a835c4cc40381 GIT binary patch literal 24405 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 QEbB_Qf8!y86*}Pm1^B4%KmY&$ literal 0 HcmV?d00001 diff --git a/.venv/lib/python3.12/site-packages/holidays/countries/__pycache__/aland_islands.cpython-312.pyc b/.venv/lib/python3.12/site-packages/holidays/countries/__pycache__/aland_islands.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..b7d5b66d6dda8aeb138a8bd3dfe85bdd3b90a222 GIT binary patch literal 1485 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 PW{s!)LoaBbZOi`v&CZ+v literal 0 HcmV?d00001 diff --git a/.venv/lib/python3.12/site-packages/holidays/countries/__pycache__/american_samoa.cpython-312.pyc b/.venv/lib/python3.12/site-packages/holidays/countries/__pycache__/american_samoa.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..b4791e5593240faee5dd28413aa9d85d6accbc6c GIT binary patch literal 1282 zcma)6O=}ZD7@o=It7(dswj#C2pddtWm$uSFDU~2nEwl=2FMAoroiQ1^A8}^Wx;<6s zK|FcWzaaf7{sCDL1W(?S#)F=GXOh?|9vsM%XP$T7cP8&g-c3z45Ud~G%kGOZLZ8iM zys9H|vIpcf;)vr2#W=v&@KRKYoxs7Ugf;3>^0p5~lqmQ#pKd zL1aSi`S;24;>ya6Mb}>83qjVpS=Q65o+lD_U+&7D;F7ti>Ud`7feW=RORGEnRsZxA zn#v@M`dn}z^!KsFbsM=TwS5`a5ZZ3li#nwViv^`cgVH$V{mAeprBC}T8d++T@-zgw zHhQ!&1uUj|Oo=3;@PV`!4V^KS(OfX~7M+;9|J?VwX)HV$b=X1ZJ;=i@Q}F|pJ`rK2 zy@xUuK4e+wcEX}uOYOOPBH8mI`N-?#SvO6V-NhwOL#c1{Sh&kNLPNx1k-Xtsz}tiO z+ged=YUTEFWt!E(G!T6e;0S#yl`HkHO>}PNaO3?fIo$d*J@|8MxhY5QCM4sSB33|uqhG`x{a7oE<>@2a?cJE9c20%mmBF$?43 zxv_jE6YYj(Y)1{G%zwqOayDc3C)tbt%x6(w8}{kCx&$6(!u2hHuMWoe`#i#{AJNT0 kwSh0Zy7VR*ARvQzj3-`g4iJ0|>Hsh1&+zNtjc)Vx3+c@?7XSbN literal 0 HcmV?d00001 diff --git a/.venv/lib/python3.12/site-packages/holidays/countries/__pycache__/andorra.cpython-312.pyc b/.venv/lib/python3.12/site-packages/holidays/countries/__pycache__/andorra.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..69b0e67d4eac62ef1171a6cf7da2213916a7f0b8 GIT binary patch literal 13064 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 PUXkee@OS7Lukrr?D(7`! literal 0 HcmV?d00001 diff --git a/.venv/lib/python3.12/site-packages/holidays/countries/__pycache__/angola.cpython-312.pyc b/.venv/lib/python3.12/site-packages/holidays/countries/__pycache__/angola.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..a8a1c1335b4bae33d0fdf26a3bc5fd4dc9e8139f GIT binary patch literal 8464 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 literal 0 HcmV?d00001 diff --git a/.venv/lib/python3.12/site-packages/holidays/countries/__pycache__/anguilla.cpython-312.pyc b/.venv/lib/python3.12/site-packages/holidays/countries/__pycache__/anguilla.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..086d69252168633cf3ef373ea803f3e161957176 GIT binary patch literal 8256 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 literal 0 HcmV?d00001 diff --git a/.venv/lib/python3.12/site-packages/holidays/countries/__pycache__/antigua_and_barbuda.cpython-312.pyc b/.venv/lib/python3.12/site-packages/holidays/countries/__pycache__/antigua_and_barbuda.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..9fc1866b797b191ffc5fc9a26b2a685a0a5080f7 GIT binary patch literal 7551 zcmcH;+in}jb(a@uMUlG87s;26<0xVx-j>wOcH_!7B~Hz_kjHDy8d+wd2IRBQIJpbOjcA| zfc{Ux+=xlBGLv%2Y|1UWQXbiz^2(l6+lR~oD|>HnsdgERmEt~R-e*%Cb4;+^?43~! zC0mqcRQZgA(?wa52Ee>Fl$TVQx8eMvZGf=P$HVhBT0j`78Kj?}eFA%hzcRmw_{+s~ zPRa0&DfpR;F~-NH#}hvuT{Mh>ej*ZCM(MDGGmFX+3Trq^`Vk>2j7MWaJQj85_B;ECu2OcG)f!XyCAB4# zPa{l33(XV?ngY92&4!Fc6pFT6F%QBvr*u%2K$Q~ri zl8D;NB5bD~(Lk644d5sxc#fuIkp!x0T~mtJps9r;=^?3Q!ND$AD`pq9q7kxBt`MAD zA^YTNwazK$WI<|pS-GYZkgQ17DFi)xJBZG4Cn~CF6BU7|XcK+SIt7!O(Rcv9q4H8D zqhVQsgOOiWj79z_jyA?8?I^;(jNM!ktAPkBWNub2>~IHqf6b|vtV&W~z#Tnj3{X=j)W+Ypqz@ZAl+tqo{? z#olI&+UQj$UNxYvGI#B9mNCd&`aBa8xIPWjaMBRQ3H2blzL%&Na-*6=&MI<7%9 zpwCVBD)S2u!>qCjQ22!XCCf4;Cg@6<0mld;F6K~>!$c;N6Tw{+LliL)0e2AC(I-M| zbEaVWbY#eAK`Q19Ok^~@da-~oWDp)5R$iv zYGhH%qll8rN-LSjgN9L70nnPGY`V1s2C0)@Y;U%OlMRH0yQYaaV zni>zsgov&fC{&O#*Q6}cfufb~L^4`YHOTCUWaSEU8>FplAzUcoeh_12=m{;ujx8cE zuD=buB0V-L7}>)g=_cl3^@I&!|sUD)8d z*13Zf?%-PF^V3!C*?j{W42rZB7X~NjfIlWC7HAk%zlH0Bg zft&S$lr@)a7;SHw-&-GXzGSWmV>=EV*M4MkAj{nH$iAlegDu0*g>2il{|78cxgCc# z%3(i@ZnsjbvCpCUxxcCzsr%vU2wat{t#Cu8o4meK2~^;aq>OHmtn* z-VPLcY82pp)cQ10m;?%kTQT6csd3rSYQ4{Cwe4)oTs``v404~dat7~=wyePRv|eu