From a95e711dbaf65ad9c025df9abe78ad71681d5893 Mon Sep 17 00:00:00 2001 From: adish-rmr Date: Mon, 1 Dec 2025 19:03:21 +0100 Subject: [PATCH] first big update --- .python-version | 1 + README.md | 15 +- app.py | 50 ++ echa_example.json | 1016 ++++++++++++++++++++++++++++++++++++ echa_example2.json | 947 +++++++++++++++++++++++++++++++++ functions.py | 193 +++++++ pages/echa.py | 352 +++++++++++++ pyproject.toml | 10 + report.py | 27 + requirements.txt | 3 + uv.lock | 1150 +++++++++++++++++++++++++++++++++++++++++ work/json_cleaning.py | 304 +++++++++++ 12 files changed, 4067 insertions(+), 1 deletion(-) create mode 100644 .python-version create mode 100644 app.py create mode 100644 echa_example.json create mode 100644 echa_example2.json create mode 100644 functions.py create mode 100644 pages/echa.py create mode 100644 pyproject.toml create mode 100644 report.py create mode 100644 requirements.txt create mode 100644 uv.lock create mode 100644 work/json_cleaning.py diff --git a/.python-version b/.python-version new file mode 100644 index 0000000..e4fba21 --- /dev/null +++ b/.python-version @@ -0,0 +1 @@ +3.12 diff --git a/README.md b/README.md index 758bbb4..1d75459 100644 --- a/README.md +++ b/README.md @@ -1 +1,14 @@ -# cosmoguard_frontend \ No newline at end of file +# cosmoguard_frontend + +This repository contains a small Streamlit frontend prototype for Cosmoguard (Alpha v1). + +**Run the Streamlit app** + +Install dependencies and run the app locally (PowerShell): + +```powershell +python -m pip install -r requirements.txt +streamlit run app.py +``` + +The home page shows a changelog, a feature list with statuses, and a simple reporter to submit bugs or feature requests (saved to `reports.txt`). diff --git a/app.py b/app.py new file mode 100644 index 0000000..f2ebc69 --- /dev/null +++ b/app.py @@ -0,0 +1,50 @@ +import streamlit as st +from datetime import datetime +import os + +st.set_page_config(page_title="LMB Suite Alpha v1", layout="centered") + +st.title("LMB Suite — Alpha v1") +st.markdown(""" +LMB Suite is an experimental frontend for cosmetic ingredient data tooling. +Use this simple home page to see the changelog, current feature status, +and to report bugs or request features. +""") + +st.header("Changelog") +with st.expander("Latest changes"): + st.write(""" + - 2025-11-23: Alpha front page created with changelog and features list. + - 2025-11-20: Initial scaffolding and basic feature flags added. + """) + +st.header("Features") +features = [ + ("ECHA (European Chemicals Agency)", "In Progress"), + ("CoSIng (Cosmetic Ingredients)", "In Progress"), + ("PubChem", "In Progress"), + ("Ingredient Parsing", "Planned"), + ("SED automatic AI calculation", "Planned"), + ("Complete PIF generation", "Planned") +] + +cols = st.columns([3,1]) +with cols[0]: + st.subheader("Feature") +with cols[1]: + st.subheader("Status") + +for name, status in features: + cols = st.columns([3,1]) + with cols[0]: + st.write(name) + with cols[1]: + if status.lower() == "complete": + st.success(status) + elif status.lower() == "in progress": + st.warning(status) + else: + st.info(status) + +st.markdown("---") +st.caption("LMB Suite Alpha v1 — Experimental.") \ No newline at end of file diff --git a/echa_example.json b/echa_example.json new file mode 100644 index 0000000..dd4144d --- /dev/null +++ b/echa_example.json @@ -0,0 +1,1016 @@ +{ + "_id": { + "$oid": "69125d116ea8d43efb44fe6f" + }, + "substance": { + "rmlCas": "50-00-0", + "rmlId": "100.000.002", + "rmlEc": "200-001-8", + "rmlName": "Formaldehyde" + }, + "dossier_info": { + "lastUpdatedDate": "2022-11-22", + "registrationStatus": "Active", + "registrationStatusChangedDate": "2010-09-29", + "registrationRole": "Lead (joint submission)", + "assetExternalId": "bb43878b-ef6e-4cce-98ef-4f2139c2a795", + "rootKey": "7eb45dd1-3f5f-4678-91a8-2f175ad4dced_f2ad84b1-ba83-4d5a-af24-6a7e855e1518" + }, + "index": { + "toxicological_information_link": "https://chem.echa.europa.eu/html-pages-prod/bb43878b-ef6e-4cce-98ef-4f2139c2a795/documents/285a60ee-1a95-461e-a0a0-c71ea7759e4f_f2ad84b1-ba83-4d5a-af24-6a7e855e1518.html", + "repeated_dose_toxicity_link": "https://chem.echa.europa.eu/html-pages-prod/bb43878b-ef6e-4cce-98ef-4f2139c2a795/documents/fd9e3bd7-96a4-46cc-b528-5e99f0264c27_f2ad84b1-ba83-4d5a-af24-6a7e855e1518.html", + "acute_toxicity_link": "https://chem.echa.europa.eu/html-pages-prod/bb43878b-ef6e-4cce-98ef-4f2139c2a795/documents/815cfb2f-9703-47c5-8dda-847e719e752d_f2ad84b1-ba83-4d5a-af24-6a7e855e1518.html" + }, + "toxicological_information": { + "sections": [ + { + "label": "Administrative data" + }, + { + "label": "Workers - Hazard via inhalation route", + "subsections": [ + { + "label": "Systemic effects", + "subsections": [ + { + "label": "Long term exposure", + "HazardAssessment": "DNEL (Derived No Effect Level)", + "StDose": { + "value": "9", + "unit": "mg/m³" + }, + "MostSensitiveEndpoint": "repeated dose toxicity", + "subsections": [ + { + "label": "DNEL related information", + "DerivationMethod": "ECHA REACH Guidance", + "AssessmentFactor": "1", + "DoseDescriptorStartingPoint": "NOAEC", + "StDose": { + "value": "18", + "unit": "mg/m³" + }, + "DoseDescriptorStartRTR": "NOAEC", + "StDoseRTR": { + "value": "9", + "unit": "mg/m³" + }, + "JustificationRTR": "Relevant dose-descriptor for the endpoint concerned: NOAEC systemic 15 ppm (18 mg/m³), chronic inhalation study in mice and rats (CIIT, 1981; Kerns et al., 1983; 6 h/d, 5 d/week for 24 months; cf. Section 7.5.3).The systemic NOAEC corresponds to a total body burden in rats of 18 mg/m³ x 0.29 m³/kg (for 6 h) = 5.2 mg/kg bw/d. This body burden is more than one order of magnitude lower than the systemic NOAEL of the drinking water study (82 mg/kg bw/d) in which systemic renal effects were related secondarily to reduced water intake. Thus, in the inhalation study any possible systemic effects would still be related to formaldehyde per se.Correction of starting point:For the total respiratory tract bioavailability in humans and rats is 100%; rapid metabolism in both species (see endpoint summary in Section 7.1). No correction necessary for absorption.Same route of exposure, no correction.Correction of exposure conditions (human exposure duration 8 h/day versus 6 h/day in the rat study). Factor 6/8 = 0.75.NOAEC 18 mg/m³ x 0.75 = 13.5mg/m³ (corrected NOAEC).Differences in respiratory volumes between experimental animals (at rest) and humans (light activity). In human at rest the respiratory volume is 6.7 m³ in 8 h and in workers 10 m³ in 8 h: Factor 6.7/10= 0.67. Corrected NOAEC 13.5 mg/m³ x 0.67= 9 mg/m³", + "DoseResponseAF": "1", + "DoseResponseJustif": "Assessment factor of 1 has been applied as the starting point for the DNEL calculation is a NOAEL.", + "DiffInDurationAF": "1", + "DiffInDurationJustif": "Assessment factor of 1 has been applied as chronic data is used.", + "InterspeciesAF": "1", + "InterspeciesJustif": "Systemic effects by inhalation, assessment factor of 1 can be applied as inhalation data is given as external concentration.", + "OthInterspeciesAF": "1", + "OthInterspeciesJustif": "The high and unspecific chemical reactivity will lead to the same toxicodynamic effects in all species and because of the highly conserved metabolism by FAD no additional toxicokinetic interspecies differences are to be expected. Assessment factor of 1 has been applied", + "IntraspeciesAF": "1", + "IntraspeciesJustif": "Default assessment factor of 1 for workers. Because by inhalation exposure formaldehyde toxicity is governed by direct chemical reaction with macromolecules and because detoxification is widely conserved without an indication for polymorphism in humans, an AF of 1 is appropriate.", + "DatabaseQualityAF": "", + "DatabaseJustif": "", + "OthUncertaintiesAF": "", + "OthUncertaintiesJustif": "" + }, + { + "label": "Explanation for hazard conclusion" + } + ] + }, + { + "label": "Acute/short term exposure", + "HazardAssessment": "no hazard identified", + "StDose": "", + "MostSensitiveEndpoint": "", + "subsections": [ + { + "label": "DNEL related information", + "DerivationMethod": "", + "OverallAssessmentFactor": "", + "Extrapolated": false, + "DoseDescriptorStartingPoint": "", + "StDose": "", + "DoseDescriptorStartRTR": "", + "StDoseRTR": "", + "DoseDescriptorJustificationRTR": "", + "DoseResponseAF": "", + "DoseResponseJustif": "", + "InterspeciesAF": "", + "InterspeciesJustif": "", + "OthInterspeciesAF": "", + "OthInterspeciesJustif": "", + "IntraspeciesAF": "", + "IntraspeciesJustifAF": "", + "DatabaseQualityDatabaseQualityAF": "", + "DatabaseQualityJustif": "", + "OthUncertaintiesAF": "", + "UncertaintiesJustif": "" + }, + { + "label": "Explanation for hazard conclusion" + } + ] + } + ] + }, + { + "label": "Local effects", + "subsections": [ + { + "label": "Long term exposure", + "HazardAssessment": "DNEL (Derived No Effect Level)", + "StDose": { + "value": "0.375", + "unit": "mg/m³" + }, + "MostSensitiveEndpoint": "repeated dose toxicity", + "subsections": [ + { + "label": "DNEL related information", + "DerivationMethod": "", + "AssessmentFactor": "", + "DoseDescriptorStart": "", + "StDose": "", + "DoseResponseAF": "", + "DoseResponseJustif": "", + "DiffInDurationAF": "", + "DiffInDurationJustif": "", + "InterspeciesAF": "", + "InterspeciesJustif": "", + "OthInterspeciesAF": "", + "OthInterspeciesJustif": "", + "IntraspeciesAF": "", + "IntraspeciesJustif": "", + "DatabaseQualityAF": "", + "DatabaseJustif": "", + "OthUncertaintiesAF": "", + "OthUncertaintiesJustif": "" + }, + { + "label": "Explanation for hazard conclusion" + } + ] + }, + { + "label": "Acute/short term exposure", + "HazardAssessment": "DNEL (Derived No Effect Level)", + "StDose": { + "value": "0.75", + "unit": "mg/m³" + }, + "MostSensitiveEndpoint": "repeated dose toxicity", + "subsections": [ + { + "label": "DNEL related information", + "DerivationMethod": "", + "OverallAssessmentFactor": "", + "Extrapolated": false, + "DoseDescriptorStart": "", + "StDose": "", + "DoseResponseAF": "", + "DoseResponseJustif": "", + "InterspeciesAF": "", + "InterspeciesJustif": "", + "OthInterspeciesAF": "", + "OthInterspeciesJustif": "", + "IntraspeciesAF": "", + "IntraspeciesJustifAF": "", + "DatabaseQualityDatabaseQualityAF": "", + "DatabaseQualityJustif": "", + "OthUncertaintiesAF": "", + "UncertaintiesJustif": "" + }, + { + "label": "Explanation for hazard conclusion" + } + ] + } + ] + } + ] + }, + { + "label": "Workers - Hazard via dermal route", + "subsections": [ + { + "label": "Systemic effects", + "subsections": [ + { + "label": "Long term exposure", + "HazardAssessment": "DNEL (Derived No Effect Level)", + "StDose": { + "value": "240", + "unit": "mg/kg bw/day" + }, + "MostSensitiveEndpoint": "repeated dose toxicity", + "subsections": [ + { + "label": "DNEL related information", + "DerivationMethod": "ECHA REACH Guidance", + "AssessmentFactor": "12", + "DoseDescriptorStartingPoint": "NOAEL", + "StDose": { + "value": "82", + "unit": "mg/kg bw/day" + }, + "DoseDescriptorStartRTR": "NOAEL", + "StDoseRTR": { + "value": "2,870", + "unit": "mg/kg bw/day" + }, + "JustificationRTR": "Relevant dose-descriptor for the endpoint concerned: NOAEL systemic 82 mg/kg bw/day with systemic renal toxicity attributed to reduced water intake, chronic drinking water study in rats (Til et al., 1989).Correction of starting point:Route of exposure (oral versus dermal exposure): the oral NOAEL of 82 mg/kg bw/day is converted to a dermal NOAEL by a factor of 100/4 (oral absorption rat 100 %/ dermal absorption monkey 4%) = 82 x 25 mg/kg bw/day = 2050 mg/kg bw/day.Although different exposure conditions were given (occupational exposure during 8 h shift in humans versus continuous exposure in rats for 24 h) no correction is necessary for daily exposure duration since in both species the effects are related to the daily body dose. In the drinking water study rats were exposed 7 d/week leading to a correction by 7/5 for the workplace: 2050 x 7/5 = 2870 mg/kg bw/d.", + "DoseResponseAF": "1", + "DoseResponseJustif": "An assessment factor of 1 has been applied as the starting point for the DNEL calculation is a NOAEL.", + "DiffInDurationAF": "1", + "DiffInDurationJustif": "An assessment factor of 1 has been applied as chronic data is used.", + "InterspeciesAF": "4", + "InterspeciesJustif": "An assessment factor of 4 has been applied as rat data is used. Allometric scaling is used because at high dose levels systemic toxicity may be governed by metabolic products like formic acid or acidosis.", + "OthInterspeciesAF": "", + "OthInterspeciesJustif": "", + "IntraspeciesAF": "3", + "IntraspeciesJustif": "Default ECETOC assessment factor of 3 for workers. The standard default assessment factor is used because at high dose levels systemic toxicity may not to be related to formaldehyde per se but to metabolic products.", + "DatabaseQualityAF": "", + "DatabaseJustif": "", + "OthUncertaintiesAF": "", + "OthUncertaintiesJustif": "" + }, + { + "label": "Explanation for hazard conclusion" + } + ] + }, + { + "label": "Acute/short term exposure", + "HazardAssessment": "no hazard identified", + "StDose": "", + "MostSensitiveEndpoint": "", + "subsections": [ + { + "label": "DNEL related information", + "DerivationMethod": "", + "OverallAssessmentFactor": "", + "Extrapolated": false, + "DoseDescriptorStartingPoint": "", + "StDose": "", + "DoseDescriptorStartRTR": "", + "StDoseRTR": "", + "DoseDescriptorJustificationRTR": "", + "DoseResponseAF": "", + "DoseResponseJustif": "", + "InterspeciesAF": "", + "InterspeciesJustif": "", + "OthInterspeciesAF": "", + "OthInterspeciesJustif": "", + "IntraspeciesAF": "", + "IntraspeciesJustifAF": "", + "DatabaseQualityDatabaseQualityAF": "", + "DatabaseQualityJustif": "", + "OthUncertaintiesAF": "", + "UncertaintiesJustif": "" + }, + { + "label": "Explanation for hazard conclusion" + } + ] + } + ] + }, + { + "label": "Local effects", + "subsections": [ + { + "label": "Long term exposure", + "HazardAssessment": "DNEL (Derived No Effect Level)", + "StDose": { + "value": "37", + "unit": "µg/cm²" + }, + "MostSensitiveEndpoint": "sensitisation (skin)", + "subsections": [ + { + "label": "DNEL related information", + "DerivationMethod": "ECHA REACH Guidance", + "AssessmentFactor": "1", + "DoseDescriptorStart": "NOAEC", + "StDose": { + "value": "37", + "unit": "other:" + }, + "DoseResponseAF": "1", + "DoseResponseJustif": "The starting point is the NOAEC; assessment factor 1.", + "DiffInDurationAF": "1", + "DiffInDurationJustif": "AF of 1 because the exposures were greater than in the standard HRIPT used for such volunteer studies (Basketter et al., 2008).", + "InterspeciesAF": "1", + "InterspeciesJustif": "not applicable", + "OthInterspeciesAF": "", + "OthInterspeciesJustif": "", + "IntraspeciesAF": "1", + "IntraspeciesJustif": "Volunteers with normal healthy skin were selected. Workers possibly exposed to formaldehyde will also have healthy skin. Therefore an AF of 1 is appropriate.", + "DatabaseQualityAF": "", + "DatabaseJustif": "", + "OthUncertaintiesAF": "", + "OthUncertaintiesJustif": "" + }, + { + "label": "Explanation for hazard conclusion" + } + ] + }, + { + "label": "Acute/short term exposure", + "HazardAssessment": "no hazard identified", + "StDose": "", + "MostSensitiveEndpoint": "", + "subsections": [ + { + "label": "DNEL related information", + "DerivationMethod": "", + "OverallAssessmentFactor": "", + "DoseDescriptorStart": "", + "StDose": "", + "DoseResponseAF": "", + "DoseResponseJustif": "", + "InterspeciesAF": "", + "InterspeciesJustif": "", + "OthInterspeciesAF": "", + "OthInterspeciesJustif": "", + "IntraspeciesAF": "", + "IntraspeciesJustifAF": "", + "DatabaseQualityDatabaseQualityAF": "", + "DatabaseQualityJustif": "", + "OthUncertaintiesAF": "", + "UncertaintiesJustif": "" + }, + { + "label": "Explanation for hazard conclusion" + } + ] + } + ] + } + ] + }, + { + "label": "Workers - Hazard for the eyes", + "subsections": [ + { + "label": "Local effects", + "Conclusion": "medium hazard (no threshold derived)" + } + ] + }, + { + "label": "Additional information - workers", + "DiscussionWorkers": "Toxicokinetics:Formaldehyde is a normal endogenous metabolite and has been found in all tissues investigated. Human exhaled air contains formaldehyde in concentrations in the order of 0.001–0.01 mg/m3, with an average value of about 0.005 mg/m3.Formaldehyde reacts at the site of first contact and/or is eliminated rapidly as formic acid in the urine or as CO2 in the expired air or it enters the carbon-1 pool in the body. Dermal absorption should differentiate between penetration through the skin possibly leading to systemic effects and penetration through and into the skin possibly leading to local effects. For monkeys, penetration through the skin was 4% and through + into skin 15%. In rats and guinea pigs, higher dermal absorptions were found. In humans 76% absorption was reported after inhalation exposure for the nasal passages (90% in rats) and almost complete absorption in the total respiratory tract of humans and rats (Overton et al., 2001). Therefore 100% systemic absorption is used for respiratory tract of rats and humans. Almost complete absorption was reported after oral exposure. Formaldehyde is rapidly metabolized (t1/2 ~ 1 min) by formaldehyde dehydrogenase (FAD). Since toxicity is a consequence of exposure to a very reactive parent compound that is not removed from the site of application allometric scaling is not appropriate (Guidance on information and chemical safety assessment; Chapter R.8; p. 31). FAD is highly conserved and is found in all tissues and species investigated as the most important scavenger for the highly toxic endogenous formaldehyde. In several investigations no polymorphism of FAD has been detected in humans. Therefore, no assessment factors for inter- and intraspecies variability are appropriate as long as formaldehyde is the toxic entity under consideration.Skin and eye irritation/corrosion:Aqueous solutions of formaldehyde like formalin (40%) induced skin corrosion in rabbits. Skin irritant effects are expected at concentrations > 3%. No studies according to current guidelines are available on eye irritation; however, formaldehyde has corrosive properties (no testing required). There is evidence that sensory eye irritation in humans due to exposure to gaseous formaldehyde is the most sensitive endpoint. From clinical studies with volunteers, it is concluded that the NOAEC for subjective and objective sensory eye irritation was 0.7 ppm in case of a constant exposure level or 0.4 ppm with four 15 min peaks of 0.8 ppm.Sensitisation:There is sufficient evidence for sensitizing properties of formaldehyde in the guinea pig maximisation test (GPMT), in the Buehler test in guinea pigs and in the mouse local lymph node assay (LLNA). The EC3 value (3-fold stimulation of proliferation as an index of the relative potency of a contact allergen) in the LLNA was 0.54% for an acetone solution of formaldehyde (corresponding to 135 μg/cm²; potency categorisation based on LLNA: strong sensitiser; for a solution in acetone the NOAEC for induction was calculated to be 0.06% corresponding to 15.3 µg/cm²). Formaldehyde is also a dermal allergen in humans. Anaphylaxis has been documented in case reports. The threshold in sensitized humans under exaggerated occluded test conditions was estimated to be 3 µg/cm². In non-sensitzised humans a threshold of 0.037% corresponding to 37 µg/cm² has been determined for induction of skin sensitization.A weight of evidence assessment does not indicate that formaldehyde may induce or exacerbate asthma or its related lung function.Repeated dose toxicity:There is evidence that formaldehyde induces toxic effects only at the site of first contact after oral, dermal or inhalation exposure. General signs of toxicity occur secondary to these local lesions. In chronic drinking water studies in rats, local effects in the forestomach and stomach were induced, the NOAEC is 0.020-0.026% formaldehyde in drinking water. For systemic effects the NOAEL is >= 82 mg/kg bw/day in males and 109 mg/kg bw/day in females. Studies on repeated dermal dose toxicity in compliance to current Guidelines are not available. Local effects in the upper respiratory tract were induced after repeated inhalation exposure in experimental animals. The most sensitive site in rodents and monkeys is the respiratory epithelium in the anterior part of the nasal cavity. At higher dose levels also the olfactory epithelium, larynx or trachea were affected, especially in monkeys. Rats are more sensitive than mice or hamsters. The LOAEC is 2 ppm in rats (2.4 mg/m³), 3 ppm in monkeys and 6 ppm in mice. The overall NOAEC in experimental animals for local effects is 1 ppm (1.2 mg/m³). The NOAEC for systemic effects in long-term inhalation studies in rats and mice is 15 ppm. As mentioned above the most sensitive endpoint in humans is sensory eye irritation by exposure to formaldehyde gas. In a controlled study with volunteers the NOAEC was 0.7 ppm at constant exposure conditions and 0.4 ppm with peaks of 0.8 ppm. These NOAECs pertained likewise to persons with high and low sensitivity for sensory irritation as determined by CO2 threshold.Mutagenicity:Genotoxicity in vitro:Gene and chromosome mutagenic activity of formaldehyde are well documented from in vitro studies and numerous studies on other endpoints suggested further evidence for genotoxicity of formaldehyde in vitro. Clastogenicity is the predominant mutagenic endpoint in mammalian cell systems. DNA-protein cross-links (DPC) as premutagenic lesion have been sufficiently investigated including threshold and repair. The threshold for DPC formation in cultured human lymphocytes is >10 μM (0.3 μg/mL), significant effects were reported at >=25 μM (0.75 μg/mL); DPC induced by concentrations up to 100 μM (3 μg/mL) are completely removed before lymphocytes start to replicate. There is some evidence that clastogenic effects are related to DPC formation.Genotoxicity in vivo:The available data in experimental animals demonstrated the genotoxic activity of formaldehyde at the site of first contact after oral exposure. Studies on local mutagenic effects in humans suggested increased micronucleus frequencies in nasal and buccal cells. However, these studies gave conflicting results and reliable test methods are not yet available. Therefore a final conclusion is not possible. Negative results with buccal cells were reported in a recent controlled clinical study after repeated exposure to <= 1ppm. The mechanism of clastogenicity might be related to DNA-protein cross-links and their repair. DNA-protein cross-links and DNA adducts at the site of first contact have been demonstrated after inhalation exposure in rats and monkeys. The most rigorous studies did not give evidence for systemic genotoxicity in experimental animals or in humans.Carcinogenicity:In a valid chronic oral study local effects were induced in the forestomach and stomach of rats at a concentration of 0.19% (NOAEC 0.02%) but no carcinogenic activity. In another drinking water study local carcinogenic effects were shown in rats, however, the validity was limited and the histopathological criteria for the papillomas described are unclear. Clear local carcinogenic effects were reported in the nasal cavity of rats after long-term inhalation exposure to ≥ 6ppm.In workers exposed to formaldehyde statistically increased risk for nasopharyngeal cancer has been especially reported in one study. But the relationship to formaldehyde has been challenged and the new discovery of more than 1000 additional cancer deaths that were not previously identified by the NCI needs to be evaluated for its relevance/impact on cancer risk.In an update including about 10 additional years of exposure only one additional NPC was observed, but at the lowest exposure category. Nevertheless, there was still a statistically significant increase for the tumor type. But the conclusion of the authors that formaldehyde is a human carcinogen for NPC has been challenged. A correlation between formaldehyde exposure and leukaemia, especially myeloid leukaemia, was seen in some studies but not all. However, this tumour type is considered biologically not plausible. Again, the evidence that formaldehyde exposure is causally associated with leukemia has been challenged by several authors.Generally, there is evidence for a threshold effect concerning tumor induction in the upper respiratory tract, based on the highly non-linear dose response relationship for tumor induction and effects related to carcinogenicity, like histopathological lesions, cell proliferation, DNA protein cross links or effects on the mucus apparatus. On this basis the substance has been classified in Cat 4 by German MAK commission as for the carcinogenic potential a non-genotoxic mode of action is of prime importance and genotoxic effects play no or at most a minor part (Greim 2000). RAC (2012) proposed not to classify formaldehyde as a human carcinogen.Reproductive toxicity:There is no evidence for effects on reproductive organs in experimental animals after oral or inhalation exposure. There is no evidence for adverse effects of formaldehyde on embryo and foetal development even at dose levels leading to local maternal toxicity.Derivation of DNELs - workerDerivation of DNELs for long-term exposure (additional information)Worker-DNEL long-term for dermal route-localDermal exposure of workers via skin contact to formaldehyde solutions. No reliable dose descriptor available for repeated dermal exposure. Limited data indicate that formaldehyde does not act as a complete carcinogen or as a promoter or initiator on the skin after topical application.Most sensitive endpoint skin sensitisation in humans. The worker DNEL long term should provide protection against induction of sensitization.There are three possible starting point for derivation of this DNEL.a.EC3 in the LLNAb.NOAEC in the LLNAc.NOAEC in human volunteers (Marzulli and Maibach, 1974)Ad a: starting point EC3 in the LLNAfour EC3 values with different solvents are reported:- 0.54% in acetone (Hilton et al., 1988)- 0.33% in dimethylformamide (Hilton et al., 1988)- 0.35% in acetone/olive oil (4;1) (Basketter et al., 2001)- 0.96% in acetone/olive oil (4;1) (De Jong et al., 2007)Workers will (almost) exclusively be exposed to an aqueous solution, that was not tested in the studies above. Dimethylformamide is known to strongly enhance dermal penetration and therefore would lead to clearly exaggerated conditions and dimethylformamide gives the same EC3 as acetone/olive oil (4:1) in one experiment while in another one a much higher EC3 was found. The hydrophilic solvent acetone is considered to better simulate an aqueous solution as compared to dimethylformamide. Therefore the EC3 value in acetone is taken for DNEL derivation (further justification is given in the enspoint summary for sensitization):0.54% corresponding to 135 µg/cm².Correction of starting pointSame bioavailability assumed in humans and animals, no correction. As the permeability of the skin of mice is higher than that of humans, this is a worst case assumption so no correction for absorptive differences between human and mouse skin is applicable.Same route of exposure, no correction.Difference in exposure conditions: De Jong et al.(2007) have shown that prolonged exposure as compared to the standard LLNA will lead to an increase of cell proliferation in the lymph node by a factor of 3. Therefore the EC3 will be divided by 3.Starting point: 0.54 : 3 = 0.18% corresponding to 135 µg/cm² : 3 = 45 µg/cm².Assessment factorsInterspecies differences: dermal sensitization is a consequence of local exposure to the very reactive parent chemical at the site of application. Therefore an AF for allometry is not appropriate. As the permeability of the skin of mice is higher than that of humans the AF for interspecies differences is 1.Intraspecies differences: because dermal sensitization is governed by direct chemical reaction with macromolecules and because detoxification is widely conserved without an indication for polymorphism in humans, an AF of 1 is appropriate.Differences in duration of exposure: this has been taken into consideration by correction of the starting point.Issues related to dose-response: the starting point for the DNEL calculation is a LOAEL (EC3) (threshold concentration);assessment factor 3.Overall assessment factor: 3DNEL worker chronic dermal local: 0.18 : 3 = 0.06% corresponding to 45 : 3 = 15μg/cm²Ad b: starting point NOAEC in the LLNAThe NOAEC in the LLNA was 0.04% in acetone/olive oil (4:1); this solvent gave an EC3 of 0.35% (Basketter et al., 2001). As stated above the results obtained with acetone (EC3 0.54%; Hilton et al., 1998) should be preferred leading to a solvent adjusted NOAEC of 0.06% for acetone corresponding to 15 µg/cm².Correction of starting pointSame bioavailability assumed in humans and animals, no correction. As the permeability of the skin of mice is higher than that of humans, this is a worst case assumption.Same route of exposure, no correction.Difference in exposure conditions: De Jong et al.(2007) have shown that prolonged exposure as compared to the standard LLNA will lead to an increase of cell proliferation in the lymph node by a factor of 3. Therefore the EC3 will be divided by 3.Starting point: 0.06 : 3 = 0.02% corresponding to 15 : 3 = 5 µg/cm².Assessment factorsInterspecies differences: dermal sensitization is a consequence of local exposure to the very reactive parent chemical at the site of application. Therefore an AF for allometry is not appropriate. As the permeability of the skin of mice is higher than that of humans the AF for interspecies differences is 1.Intraspecies differences: because dermal sensitization is governed by direct chemical reaction with macromolecules and because detoxification is widely conserved without an indication for polymorphism in humans, an AF of 1 is appropriate.Differences in duration of exposure: this has been taken into consideration by correction of the starting point.Issues related to dose-response: the starting point is the NOAEC; assessment factor 1.Overall assessment factor: 1DNEL worker chronic dermal local: 0.02% corresponding to 5μg/cm²Ad a + b: selection of DNELs based on LLNA:When comparing the results obtained for the DNELs derived from EC3 and NOAEC, preference should be given to the EC3 approach. EC3 values are more stable than NOAECs as the latter depend very much on the spacing of doses in each experiment. Specifically, the dose spacing in the Basketter et al. (2001) study between NOAEC (0.04%) and LOAEC (0.2% with a stimulation factor of 1.9) was quite high (factor of 5).Therefore, based on animal LLNA studies the DNEL derived from EC3 should be used:0.06% corresponding to 15μg/cm²Ad c: starting point NOAEC in human volunteersThe NOAEC for induction of sensitization in human volunteers (Marzulli and Maibach, 1974) is 0.037% corresponding to 37 µg/cm².Correction of starting pointRoute of exposure, no correction.Difference in exposure conditions: human volunteers were subjected to severe exposure conditions: for induction occlusive dressing over 48 or 72 h and 10 repeated applications at the same site within 3.5 weeks; elicitation under occlusive dressing over 72 h with 0.37% formaldehyde. Therefore no correction.Starting point: 0.037% corresponding to 37 µg/cm².Assessment factorsInterspecies differences: not applicableIntraspecies differences: volunteers with normal healthy skin were selected. Workers possibly exposed to formaldehyde will also have healthy skin. Therefore an AF of 1 is appropriate.Differences in duration of exposure: AF of 1 because the exposures were greater than in the standard HRIPT used for such volunteer studies (Basketter et al., 2008).Issues related to dose-response: the starting point is the NOAEC; assessment factor 1.Overall assessment factor: 1DNEL worker chronic dermal local: 0.037% corresponding to 37μg/cm²Ad a + b + c: selection of DNELs based on animal and human data:If human and animal data are available, generally data from humans as the most relevant species should be selected for DNEL derivation provided a rigorous study design was used and reliable results were obtained for humans. Exposure conditions, number of subjects and experience of the investigators do fulfill these conditions. Furthermore, it has to be taken into consideration that the permeability of mouse skin is higher than that of human skin. As expected, the DNELs derived from the LLNA are lower than that based on the investigation in humans on a µg/cm² basis.Therefore, the DNEL is based on human data:Worker-DNEL long-term for dermal route-local: 0.037% corresponding to 37μg/cm²Worker-DNEL long-term for inhalation route-localFormaldehyde is a carcinogen in the upper respiratory tract as has been shown by experiments in rats and mice, while the epidemiological evidence in this respect is not convincing (RAC, 2012). It is generally agreed in the science community that this effect is driven by local cytotoxicity followed by regenerative cell replication (RCP) (McGregor at al., 2006; MAK, 2000; SCOEL; 2015). RCP has been studied in the most sensitive rat and numerous studies have consistently shown a NOAEL of 2 ppm (Gelbke et al., 2014). Interspecies extrapolations have to take into account respiratory physiology which shows major differences when comparing rats on the one side, with non-human primates and humans on the other (DeSesso, 1993). Therefore, ideally RCP caused by cytotoxic irritation should be studied in humans. As this is not possible because of ethical reasons, sensory irritation should be taken as the more sensitive surrogate as compared to cytotoxic irritation. Numerous studies are available for sensory irritation and all have shown that eye irritation is a more sensitive parameter than irritation to the nose or the throat, the potential targets for formaldehyde carcinogenicity. Therefore, using sensory eye irritation as the starting point for risk assessment has a high, albeit not quantifiable, inbuilt margin of safety because of sensory instead of cytotoxic irritation and irritation to the eye instead of the upper respiratory tract. Studies in humans may either measure subjective ratings of sensory irritation, or objective parameters like eye blinking frequency or conjunctival redness. Subjective ratings depend on many potential confounders (like anxiety, expectation, or other psychological factors) and therefore preference must be given to studies measuring objective parameters.Such studies are now available (Lang et al., 2008; Mueller et al., 2013) showing no increase of objective signs of eye irritation at concentrations of 0.7 ppm over 4 h or at 0.4 ppm superimposed by 4 peaks of 0.8 ppm. For sensory irritation the is strong evidence that after exposure periods of 4 h an effect plateau has been reached (Brüning et al., 2014). This NOEL is well in line with former studies relying mainly on subjective reporting of sensory irritation. In total, a database for about 400 exposed volunteers has been published. As sensory irritation is a physiological effect (although taken here a surrogate for the adverse cytotoxic irritation) these concentrations represent a NOEL and not a NOAEL.For assessment of carcinogenicity, genotoxicity has also to be taken into consideration, although this effect is not considered to be the driver of carcinogenicity. The genotoxic effects of formaldehyde are formation of DPX as known since decades and DNA-adducts in the form of the N2-hydroxymethyl-dG adduct as more recently identified. NOAELs for these effects have not been established. Apart from species differences due to respiratory physiology, also the genotoxicity by endogenous formaldehyde, being present in every cell, has to be taken into account. A differentiation between genotoxicity caused by endogenous and exogenous formaldehyde has been achieved by inhalation of [14CD2]formaldehyde. After a single 6 h exposure to 0.7 ppm only 1% of the total DNA-adduct load is caused by the exogenous formaldehyde, the rest of 99% stem from endogenous formaldehyde. A highly non-linear dose response relation was observed, for example a 21.7-fold increase in exposure leads to a 286-fold increase in exogenous adducts. But these adducts have a biological half-life of about 7 days. At steady state after prolonged exposure the exogenous adducts will be by a factor of 5.5 higher than after a single exposure, as shown by inhalation at 2 ppm over 28 days. Extrapolation to the lowest experimental dose shows that after a prolonged exposure to 0.7 ppm (the lowest dose tested in this series of experiments) endogenous adducts will exceed the exogenous by a factor of 14 to 22. And due to the highly non-linear dose response relationship this factor will even be higher at lower concentrations and endogenous adducts will be far prevail. In addition, it was shown that the ratio of exogenous/endogenous adducts in primates is by a factor of ~5 lower than in rats, because of the different respiratory physiology and higher endogenous adducts in the primates. This finding strongly supports the former observation of Casanova et al. (1991) that DPX formation in rats is much higher than in monkeys. These data demonstrate that genotoxicity in rats is more pronounced than in primates.As cytotoxic irritation is the driver for carcinogenicity, the starting point for a carcinogenic risk assessment should be the NOEL of 0.7 ppm observed in controlled exposure studies with humans and the question of an appropriate assessment factor (AF) for intra-human variability has to be addressed. No guidance is given by ECHA (2012) for an AF to be applied to a NOEL for physiological sensory effects, but ECETOC (2010) proposes an AF of 1. This is supported by Brüning et al. (2014) who also proposed an AF of 1 for sensory irritation in controlled human exposure studies based on a detailed assessment of a recent database. The question remains whether the sensitivity of the volunteers in the studies of Lang et al. (2008) and Mueller et al. (2013) might have been lower than that of the target population, i.e. the workforce. Firstly, it was shown by Mueller that the NOEL was the same for subjects hypo- and hypersensitive for nasal irritation to CO2. In addition, the age of the subjects studied was <~40 years and is therefore at the lower end of that of the general workforce. It is known (Doty et al., 2004) that sensory irritation decreases with age. And finally, all volunteers were non-smokers (what will not be the case for the workforce) and smokers are less sensitive to nasal irritation (Doty et al., 2004). As both of these studies fulfill the quality criteria given by Brüning et al. (2014) an AF of 1 for the NOEL is appropriate. This AF of 1 would lead to a DNEL of 0.4 ppm with superimposed peaks of 0.8 ppm reflecting the variable workplace exposure situations.Finally the NOAELs observed in rats have to be discussed in relation to derivation of the DNEL. As the inhalation route is under consideration for rats and humans, the AF of 4 for correction of differences in metabolic rate is not to be applied. This leaves according to ECHA (2012) default AFs of 2.5 for toxicokinetic intra-species differences not related to metabolic rate (small part) and toxicodynamic differences (larger part) and for intra-human variability of 5 for workers. Both of these default AFs can be reduced considerably for 3 reasons: 1. The toxic action of formaldehyde depends on the molecule itself by simple adduction to DNA and proteins which is basically identical in all species and therefore without inter-species variability. 2. Detoxification is governed by ADH5, an enzyme highly efficient and conserved in all species. Especially for humans, it has been shown that polymorphism is not likely to play a role for detoxification of exogenous or endogenous formaldehyde (apart from Fanconi Anemia patients) provided that the endogenous pool is not depleted. This will not be the case at exposure concentrations <2 ppm (Andersen et al., 2010; Casanova et al. 1989). 3. For high quality sensory irritation studies or when based on a broad database, an AF of 1 is appropriate to address intraspecies variability for sensory irritation (Brüning et al., 2014).For such a situation with good evidence that the default AFs are over-conservative, no guidance is given by ECHA (2012). But it is admitted by ECHA that the database they considered is very scarce. This limitation is overcome by the systematic analysis of Brüning et al. (2014) proposing a total factor of 3 for extrapolating animal data to humans.This AF of 3 should then be applied to the NOAEL for RCP. An analysis of all related publications has consistently shown a NOAEL of 2 ppm (Gelbke et al., 2014). This would lead to a DNEL of 0.7 ppm.For histopathological lesions a NOAEL of 1 ppm was found for rats and monkeys. Monkeys were continuously exposed over 26 weeks (22 h/d, 7 d/week) (Rusch et al., 1983) without any exposure free time for repair of lesions in contrast to exposures at the workplace. Therefore, workplace exposure conditions would most probably lead to a higher NOAEL in monkeys. For the NOAEL of 1 ppm in rats it has to be taken into consideration that the lesions observed at the LOAEL (2 ppm) cannot be regarded as prestages to tumor development, neither by their histopathological features nor by their location (Gelbke et al., 2014). Applying the AF of 3 to the histopathological NOAEL would lead to a DNEL of 0.3 ppm. In summary, by application of the AFs proposed here, the following DNELs can be derived:- Sensory irritation in humans: 0.4 ppm (AF of 1)- RCP in rats: 0.7 ppm (AF of 3)- Histopathological lesion in rats and monkeys: 0.3 ppm (AF of 3)These alternatives for derivation of a DNEL all lead to very similar values. The scientifically most defensible DNEL is that derived from sensory irritation in humans because- Of the inbuilt margin of safety between sensory eye irritation and cytotoxic irritation to the upper respiratory tract- Such data obviates application of AFs, be it default or arbitrary AFs- The volunteers exposed were more sensitive to sensory irritation than the general workforce because of age and smoking statusThe AF of 1 is supported by the database analyzed by Brüning et al. (2014) and several published studies with about 400 exposed volunteers in total. Other factors supporting that this DNEL is sufficiently conservative are- The higher sensitivity of rats as compared to nonhuman primates with regard to formation of DNA adducts and DPX- The steep upward bent of the dose response curve at low concentrations for all decisive parameters (tumor incidence, cell proliferation, DPX formation, DNA adducts).On this basis, 0.3 ppm is taken as DNEL long-term, local, inhalation, workers.This DNEL will also protect the workforce from undue nuisance of odor and slight subjective irritation as has been reported by some of the volunteers, especially with a high PANAS score for negative affectivity and that have also been reported under control condition (0 ppm formaldehyde).This DNEL is supported by mathematical risk extrapolations from experimental animals to humans (Conolly et al., 2004; Andersen et al., 2101; Starr and Swenberg, 2013). It also corresponds to the OELs developed by MAK (2000), SCOEL (2015)., and the German AGS (2015), all using slightly different approaches." + }, + { + "label": "General Population - Hazard via inhalation route", + "subsections": [ + { + "label": "Systemic effects", + "subsections": [ + { + "label": "Long term exposure", + "HazardAssessment": "DNEL (Derived No Effect Level)", + "StDose": { + "value": "3.2", + "unit": "mg/m³" + }, + "MostSensitiveEndpoint": "repeated dose toxicity", + "subsections": [ + { + "label": "DNEL related information", + "DerivationMethod": "ECHA REACH Guidance", + "AssessmentFactor": "1", + "DoseDescriptorStartingPoint": "NOAEC", + "StDose": { + "value": "18", + "unit": "mg/m³" + }, + "DoseDescriptorStartRTR": "NOAEC", + "StDoseRTR": { + "value": "3.2", + "unit": "mg/m³" + }, + "JustificationRTR": "Relevant dose-descriptor for the endpoint concerned: NOAEC systemic 15 ppm (18 mg/m³), chronic inhalation study in mice and rats (CIIT, 1981; Kerns et al., 1983; 6 h/d, 5 d/week for 24 months; cf. Section 7.5.3). The systemic NOAEC corresponds to a total body burden in rats of 18 mg/m³ x 0.29 m³/kg (for 6 h) = 5.2 mg/kg bw/d. This body burden is more than one magnitude lower than the systemic NOAEL of the drinking water study in which systemic renal effects might have been caused by metabolites of formaldehyde. Thus, in the inhalation study any possible effects would still be related to formaldehyde per se.Correction of starting point:For the total respiratory tract bioavailability in humans and rats is 100%; rapid metabolism in both species (see endpoint summary in Section 7.1); no correction necessary for absorption.Same route of exposure, no correction.Correction of exposure conditions (human exposure duration 24 h/day and 7 d/week versus 6 h/day and 5 d/week in the rat study). Factor 6/24 x 5/7. NOAEC 18 mg/m³ x 0.25 x 5/7 = 3.2 mg/m³ (corrected NOAEC).No differences in respiratory volumes between experimental animals (at rest) and humans (at rest), no correction.", + "DoseResponseAF": "1", + "DoseResponseJustif": "Assessment factor of 1 has been applied as the starting point for the DNEL calculation is a NOAEL.", + "DiffInDurationAF": "1", + "DiffInDurationJustif": "Assessment factor of 1 has been applied as chronic data is used.", + "InterspeciesAF": "1", + "InterspeciesJustif": "Systemic effects by inhalation, assessment factor of 1 can be applied as inhalation data is given as external concentration.", + "OthInterspeciesAF": "", + "OthInterspeciesJustif": "", + "IntraspeciesAF": "1", + "IntraspeciesJustif": "Default assessment factor of 1 for general population. Because by inhalation exposure formaldehyde toxicity is governed by direct chemical reaction with marcomolecules and because detoxification is widely conserved without an indication for polymorphism in humans, an AF of 1 is appropriate.", + "DatabaseQualityAF": "", + "DatabaseJustif": "", + "OthUncertaintiesAF": "", + "OthUncertaintiesJustif": "" + }, + { + "label": "Explanation for hazard conclusion" + } + ] + }, + { + "label": "Acute/short term exposure", + "HazardAssessment": "no hazard identified", + "StDose": "", + "MostSensitiveEndpoint": "", + "subsections": [ + { + "label": "DNEL related information", + "DerivationMethod": "", + "OverallAssessmentFactor": "", + "Extrapolated": false, + "DoseDescriptorStartingPoint": "", + "StDose": "", + "DoseDescriptorStartRTR": "", + "StDoseRTR": "", + "DoseDescriptorJustificationRTR": "", + "DoseResponseAF": "", + "DoseResponseJustif": "", + "InterspeciesAF": "", + "InterspeciesJustif": "", + "OthInterspeciesAF": "", + "OthInterspeciesJustif": "", + "IntraspeciesAF": "", + "IntraspeciesJustifAF": "", + "DatabaseQualityDatabaseQualityAF": "", + "DatabaseQualityJustif": "", + "OthUncertaintiesAF": "", + "UncertaintiesJustif": "" + }, + { + "label": "Explanation for hazard conclusion" + } + ] + } + ] + }, + { + "label": "Local effects", + "subsections": [ + { + "label": "Long term exposure", + "HazardAssessment": "DNEL (Derived No Effect Level)", + "StDose": { + "value": "0.1", + "unit": "mg/m³" + }, + "MostSensitiveEndpoint": "repeated dose toxicity", + "subsections": [ + { + "label": "DNEL related information", + "DerivationMethod": "other:", + "AssessmentFactor": "3", + "DoseDescriptorStart": "", + "StDose": "", + "DoseResponseAF": "", + "DoseResponseJustif": "", + "DiffInDurationAF": "", + "DiffInDurationJustif": "", + "InterspeciesAF": "", + "InterspeciesJustif": "", + "OthInterspeciesAF": "", + "OthInterspeciesJustif": "", + "IntraspeciesAF": "", + "IntraspeciesJustif": "", + "DatabaseQualityAF": "", + "DatabaseJustif": "", + "OthUncertaintiesAF": "", + "OthUncertaintiesJustif": "" + }, + { + "label": "Explanation for hazard conclusion" + } + ] + }, + { + "label": "Acute/short term exposure", + "HazardAssessment": "no hazard identified", + "StDose": "", + "MostSensitiveEndpoint": "", + "subsections": [ + { + "label": "DNEL related information", + "DerivationMethod": "", + "OverallAssessmentFactor": "", + "Extrapolated": false, + "DoseDescriptorStart": "", + "StDose": "", + "DoseResponseAF": "", + "DoseResponseJustif": "", + "InterspeciesAF": "", + "InterspeciesJustif": "", + "OthInterspeciesAF": "", + "OthInterspeciesJustif": "", + "IntraspeciesAF": "", + "IntraspeciesJustifAF": "", + "DatabaseQualityDatabaseQualityAF": "", + "DatabaseQualityJustif": "", + "OthUncertaintiesAF": "", + "UncertaintiesJustif": "" + }, + { + "label": "Explanation for hazard conclusion" + } + ] + } + ] + } + ] + }, + { + "label": "General Population - Hazard via dermal route", + "subsections": [ + { + "label": "Systemic effects", + "subsections": [ + { + "label": "Long term exposure", + "HazardAssessment": "DNEL (Derived No Effect Level)", + "StDose": { + "value": "102", + "unit": "mg/kg bw/day" + }, + "MostSensitiveEndpoint": "repeated dose toxicity", + "subsections": [ + { + "label": "DNEL related information", + "DerivationMethod": "ECHA REACH Guidance", + "AssessmentFactor": "20", + "DoseDescriptorStartingPoint": "NOAEL", + "StDose": { + "value": "82", + "unit": "mg/kg bw/day" + }, + "DoseDescriptorStartRTR": "NOAEL", + "StDoseRTR": { + "value": "2,050", + "unit": "mg/kg bw/day" + }, + "JustificationRTR": "Relevant dose-descriptor for the endpoint concerned: NOAEL systemic 82 mg/kg bw/day with secondary renal toxicity due to reduced water intake, chronic drinking water study in rats (Til et al., 1989).Correction of starting point:Systemic bioavailability in humans via the dermal route is derived from monkey data with 4%. Route of exposure (oral versus dermal exposure): the oral NOAEL of 82 mg/kg bw/day is converted to a dermal NOAEL by a factor of 100/4 (oral absorption rat 100 %/ dermal absorption monkey 4%) = 82 x 25 mg/kg bw/day = 2050 mg/kg bw/day.No different exposure conditions, no difference in physical activity, no corrections.", + "DoseResponseAF": "1", + "DoseResponseJustif": "An assessment factor of 1 has been applied as the starting point for the DNEL calculation is a NOAEL.", + "DiffInDurationAF": "1", + "DiffInDurationJustif": "An assessment factor of 1 has been applied as chronic data is used.", + "InterspeciesAF": "4", + "InterspeciesJustif": "An assessment factor of 4 has been applied as rat data is used. Allometric scaling is used because at high dose levels systemic toxicity may be governed by metabolic products like formic acid or acidosis.", + "OthInterspeciesAF": "", + "OthInterspeciesJustif": "", + "IntraspeciesAF": "5", + "IntraspeciesJustif": "Default assessment factor of 5 (ECETOC 2003) is considered suitable for the general population. The standard default assessment factor is used because systemic renal toxicity is assumed not to be related to formaldehyde per se.", + "DatabaseQualityAF": "", + "DatabaseJustif": "", + "OthUncertaintiesAF": "", + "OthUncertaintiesJustif": "" + }, + { + "label": "Explanation for hazard conclusion" + } + ] + }, + { + "label": "Acute/short term exposure", + "HazardAssessment": "no hazard identified", + "StDose": "", + "MostSensitiveEndpoint": "", + "subsections": [ + { + "label": "DNEL related information", + "DerivationMethod": "", + "OverallAssessmentFactor": "", + "Extrapolated": false, + "DoseDescriptorStartingPoint": "", + "StDose": "", + "DoseDescriptorStartRTR": "", + "StDoseRTR": "", + "DoseDescriptorJustificationRTR": "", + "DoseResponseAF": "", + "DoseResponseJustif": "", + "InterspeciesAF": "", + "InterspeciesJustif": "", + "OthInterspeciesAF": "", + "OthInterspeciesJustif": "", + "IntraspeciesAF": "", + "IntraspeciesJustifAF": "", + "DatabaseQualityDatabaseQualityAF": "", + "DatabaseQualityJustif": "", + "OthUncertaintiesAF": "", + "UncertaintiesJustif": "" + }, + { + "label": "Explanation for hazard conclusion" + } + ] + } + ] + }, + { + "label": "Local effects", + "subsections": [ + { + "label": "Long term exposure", + "HazardAssessment": "DNEL (Derived No Effect Level)", + "StDose": { + "value": "12", + "unit": "µg/cm²" + }, + "MostSensitiveEndpoint": "sensitisation (skin)", + "subsections": [ + { + "label": "DNEL related information", + "DerivationMethod": "ECHA REACH Guidance", + "AssessmentFactor": "3", + "DoseDescriptorStart": "NOAEC", + "StDose": { + "value": "37", + "unit": "other:" + }, + "DoseResponseAF": "1", + "DoseResponseJustif": "The starting point is the NOAEC; assessment factor 1.", + "DiffInDurationAF": "1", + "DiffInDurationJustif": "AF of 1 because the exposures were greater than in the standard HRIPT used for such volunteer studies (Basketter et al., 2008).", + "InterspeciesAF": "", + "InterspeciesJustif": "not applicable", + "OthInterspeciesAF": "", + "OthInterspeciesJustif": "", + "IntraspeciesAF": "3", + "IntraspeciesJustif": "According to ECETOC (2010) an additional AF of 3 has to be used when extrapolating a worker DNEL to the general population. This AF will also take into account differences in skin integrity between workers and the general population, while metabolic differences need not be considered due to the highly conserved formaldehyde dehydrogenase without an indication for polymorphism.", + "DatabaseQualityAF": "", + "DatabaseJustif": "", + "OthUncertaintiesAF": "", + "OthUncertaintiesJustif": "" + }, + { + "label": "Explanation for hazard conclusion" + } + ] + }, + { + "label": "Acute/short term exposure", + "HazardAssessment": "no hazard identified", + "StDose": "", + "MostSensitiveEndpoint": "", + "subsections": [ + { + "label": "DNEL related information", + "DerivationMethod": "", + "OverallAssessmentFactor": "", + "DoseDescriptorStart": "", + "StDose": "", + "DoseResponseAF": "", + "DoseResponseJustif": "", + "InterspeciesAF": "", + "InterspeciesJustif": "", + "OthInterspeciesAF": "", + "OthInterspeciesJustif": "", + "IntraspeciesAF": "", + "IntraspeciesJustifAF": "", + "DatabaseQualityDatabaseQualityAF": "", + "DatabaseQualityJustif": "", + "OthUncertaintiesAF": "", + "UncertaintiesJustif": "" + }, + { + "label": "Explanation for hazard conclusion" + } + ] + } + ] + } + ] + }, + { + "label": "General Population - Hazard via oral route", + "subsections": [ + { + "label": "Systemic effects", + "subsections": [ + { + "label": "Long term exposure", + "HazardAssessment": "DNEL (Derived No Effect Level)", + "StDose": { + "value": "4.1", + "unit": "mg/kg bw/day" + }, + "MostSensitiveEndpoint": "repeated dose toxicity", + "subsections": [ + { + "label": "DNEL related information", + "DerivationMethod": "ECHA REACH Guidance", + "AssessmentFactor": "20", + "DoseDescriptorStartingPoint": "NOAEL", + "StDose": { + "value": "82", + "unit": "mg/kg bw/day" + }, + "DoseDescriptorStartRTR": "NOAEL", + "StDoseRTR": { + "value": "82", + "unit": "mg/kg bw/day" + }, + "JustificationRTR": "Relevant dose-descriptor for the endpoint concerned: NOAEL systemic >= 82 mg/kg bw/day with systemic renal toxicity at higher doses, chronic drinking water study in rats (Til et al., 1989).Correction of starting point:- Bioavailability in humans versus rat concerning oral route: no data are available for humans (rat: nearly complete absorption) but the same bioavailability is assumed, no correction.- Same route of exposure, no correction.- Similar exposure conditions in rats (drinking water) and humans (drinking water/food stuff). No correction necessary.", + "DoseResponseAF": "1", + "DoseResponseJustif": "An assessment factor of 1 has been applied as the starting point for the DNEL calculation is a NOAEL.", + "DiffInDurationAF": "1", + "DiffInDurationJustif": "An assessment factor of 1 has been applied as chronic data is used.", + "InterspeciesAF": "4", + "InterspeciesJustif": "An assessment factor of 4 has been applied as rat data is used. Allometric scaling is used because at high dose levels systemic toxicity may be governed by metabolic products like formic acid or acidosis.", + "OthInterspeciesAF": "", + "OthInterspeciesJustif": "", + "IntraspeciesAF": "5", + "IntraspeciesJustif": "Default assessment factor of 5 for general population. The standard default assessment factor is used because systemic renal toxicity may not be necessarily related to formaldehyde per se.", + "DatabaseQualityAF": "", + "DatabaseJustif": "", + "OthUncertaintiesAF": "", + "OthUncertaintiesJustif": "" + }, + { + "label": "Explanation for hazard conclusion" + } + ] + }, + { + "label": "Acute/short term exposure", + "HazardAssessment": "no hazard identified", + "StDose": "", + "MostSensitiveEndpoint": "", + "subsections": [ + { + "label": "DNEL related information", + "DerivationMethod": "", + "OverallAssessmentFactor": "", + "Extrapolated": false, + "DoseDescriptorStartingPoint": "", + "StDose": "", + "DoseDescriptorStartRTR": "", + "StDoseRTR": "", + "DoseDescriptorJustificationRTR": "", + "DoseResponseAF": "", + "DoseResponseJustif": "", + "InterspeciesAF": "", + "InterspeciesJustif": "", + "OthInterspeciesAF": "", + "OthInterspeciesJustif": "", + "IntraspeciesAF": "", + "IntraspeciesJustifAF": "", + "DatabaseQualityDatabaseQualityAF": "", + "DatabaseQualityJustif": "", + "OthUncertaintiesAF": "", + "UncertaintiesJustif": "" + }, + { + "label": "Explanation for hazard conclusion" + } + ] + } + ] + } + ] + }, + { + "label": "General Population - Hazard for the eyes", + "subsections": [ + { + "label": "Local effects", + "Conclusion": "medium hazard (no threshold derived)" + } + ] + }, + { + "label": "Additional information - General Population", + "DiscussionGenPop": "Endogenous sources of formaldehyde:In humans, as in other animals, formaldehyde is an essential metabolic intermediate in all cells. It is produced endogenously from serine, glycine, methionine and choline, and it is generated in the demethylation of N-, O- and S-methyl compounds. It is an essential intermediate in the biosynthesis of purines, thymidine and certain amino acids. Owing to its high reactivity at the site of contact and rapid metabolism, exposure of humans, monkeys or rats to formaldehyde by inhalation does not alter the concentration of formaldehyde in the blood from that endogenously present, which is about 2–3 mg/l for each of the three species. This concentration represents the total concentration of both free and reversibly bound endogenous formaldehyde in the blood. The absence of an increase after inhalation is explained by the fact that formaldehyde reacts rapidly at the site of contact. As a consequence of the endogenous formation, human exhaled air contains formaldehyde in concentrations in the order of 0.001–0.01 mg/m3, with an average value of about 0.005 mg/m3.Derivation of general population DNEL for long term inhalation (local):Time extrapolation from long term worker DNEL:Using the worker DNEL (long-term, local) of 0.3 ppm and a time extrapolation factor of 3 to account for 24 hour exposure of the general population, theDNEL for the general population for long term inhalationcan be calculated to0.3 ppm/3 =0.1 ppmWHO recommendation:After a very comprehensive review, theWorld Health Organization (WHO)established an indoor air quality guideline for short- and long-term exposures to FA of0.1 mg/m3(0.08 ppm) for all 30-min periods at lifelong exposure. This value was mainly based on the results of the Lang et al. (2008) study using an assessment factor of 5 and five other supporting studies on sensory irritation.Nielsen et al. reviewed the WHO guideline value in 2013 and 2017 (Nielsen et al. 2013, 2017) an found no recent and additional data or evidence questioning this value.Thus,the DNEL for the general population for long term inhalation exposureto formaldehyde is set to0.1 mg/m3with the provisions of the WHO guidance value.In the context of a restriction of formaldehyde and formaldehyde releasers, the sensory irritation studies of Lang et al. (2008) and Müller et al. (2014) were reevaluated (RAC & SEAC, Opinion on an Annex XV dossier proposing restrictions on formaldehyde and formaldehyde releasers, compiled version, adopted 13 March 2020 by RAC and 17 September 2020 by SEAC). In the view of RAC, RAC considers that the absence of a sensory irritation effect at formaldehyde concentrations below 1.24 mg/m³ (1 ppm) is uncertain. Due to high variability of the measured effect (large ranges, high standard deviations), the low numbers of volunteers (yielding low statistical power) and the additional uncertainties identified, false negative results at 0.62 mg/m³ (0.5 ppm) or lower cannot be excluded. The studies of Lang et al. (2008) and Mueller et al. (2013), thus, cannot be used to derive a DNEL, because the uncertainties are too high and the lack of observed effects cannot be considered as evidence for the absence of dose-related effects. As a consequence, RAC focused on endpoints other than sensory irritation to derive a DNEL for long term exposure of the general population.In the RAC & SEAC opinion (2020), RAC derived an indoor derived no effect level (DNEL) of 50 µg/m³ for formaldehyde and considered the WHO indoor guideline value of 100 µg/m³ as not sufficiently protective for the consumers. The RAC DNEL was based on studies in animals, i.e. rats and monkeys. Human data from sensory irritation studies were evaluated by RAC but not taken into account for derivation of the DNEL due to a lack of reliability and robustness of these data.RAC derived DNELs using different points of departure in rats and monkeys considered as precursor events to malignant tumour responses and the tumour response itself. Finally, RAC selected the DNEL derived from metaplasia/hyperplasia in monkeys, i.e. 50 µg/m³, as the most relevant.The following table displays DNELs based on different points of departure considered as precursor events to malignant tumour responses in comparison to the malignant tumour response:Precursor eventsDNA adduct formationCell proliferation in ratsMetaplasia/ hyperplasia in monkeysCytotoxicity, metaplasia/ hyperplasia and benign tumours in ratsMalignant tumours in rats for comparisonDNELs (mg/m³)0.03(0.01#)0.010.03*0.05**0.010.006# if corrected for sub-chronic exposure duration* POD NOAEC** POD LOAECDNELs were calculated from the no adverse effect concentration (NOAEC) from the respective endpoint with use of the default assessment factors (AF) as given by the ECHA Guidance R8 which were partly modified. As the genotoxic potential of formaldehyde is not expected to give rise to mutagenicity at low doses and the effects of DPX formation cannot be regarded as adverse per se, consequently, a DNEL derived based solely on genotoxicity results was considered inappropriate. The DNELs on the other endpoints in rats and monkeys include an- AF of 2.5 for inter- or intraspecies differences in sensitivity- AF of 3.16 for intraspecies variability which was reduced from the default AF of 10 due to the assumed lower variability of these endpoint in the general population.- AF of 2 to correct for exposure duration (only used for cell proliferation and cytotoxicity/metaplasia in rats)Although the rat DNELs on DNA adduct formation and cancer precursor effects were lower and may therefore be considered to be taken forward, RAC decided to take preference of a long-term DNEL and proposed a DNEL of 0.05 mg/m³ based on the LOAEC for hyperplasia/metaplasia in nasal turbinates in the study with monkeys (Rusch et al., 1983) and taking into account all additional DNELs derived based on studies on precursor events observed in rats, which were in a similar range.In the same document (RAC & SEAC 2020), as part of the socio-economic assessment SEAC estimated that the EU had a housing stock of about 250 million dwellings in 2015 with an estimated 0.7 % of the EU’s housing stock, or 1.75 million, coming from newly built/completed dwellings. In addition, according to section 2.5.2 of the Background Document, the average household in the EU had 2.3 members in 2016. Based on these numbers, SEAC assumed that 4 million individuals live in newly built dwellings each year (= 1.75 million dwellings built per year with 2.3 individuals per dwelling). This means that for the RAC proposal to break even, 6 522 nasopharyngeal cancer cases would have to be avoided among these 4 million individuals. In other words, 1 631 in 1 million (= 6 522 nasopharyngeal cancer cases in 4 million individuals) would have to suffer nasopharyngeal cancer for the RAC proposal to break even. However, according to IARC (2018) data, in 2018 the incidence rate of nasopharyngeal cancer in the EU was only 7.5 in 1 million (crude rate). This means that one would need to see a more than 217 times higher incidence rate than is actually observed for the RAC proposal to break even clearly implying that the RAC evaluations and DNELs are by far overconservative.Thus, RAC ended up with DNELs from rats in the range of 6 – 10 µg/m³. Interestingly, exhaled air of humans contains formaldehyde in concentrations in the order of 1 – 10 µg/m³, with an average of about 5 µg/m³, i.e. the formaldehyde concentration in human exhaled air is in the same concentration range as the RAC rat DNELs. Given the fact, that indoor concentrations of formaldehyde under typical living conditions in Europe are between 11 and 42 µg/m³ and usually below 30 µg/m³, these DNELs imply that we would all be at risk of developing effects in the respiratory system or tumors from indoor formaldehyde exposure. This is clearly not the case. This simple comparison and ‘reality check’ clearly shows that – though considering a threshold mode of action - the RAC DNELs from rats are clearly overconservative due to the formal use of assessment factors. Even the final DNEL of 50 µg/m³ from the monkey study is overconservative in that way, that the same AF of 2.5 was taken for inter- and intraspecies differences in sensitivity in rats and monkeys. However, it is evident that the sensitivity of monkeys better reflects human sensitivity than rats and therefore a lower AF in monkeys would be justified with which one would end up more or less with the WHO value.In summary, the RAC DNEL for indoor formaldehyde concentrations is non-realistically low and overconservative due to the formal use of mostly default assessment factors.In contrast, the WHO indoor guideline value was set to 100 µg/m³ in 2010 in a less formal but rather more pragmatic approach considering and evaluating over 150 publications on various endpoints. The WHO value is a 30 min time-weighted average concentration for every 30 min interval during the day lifelong. It will prevent effects on the respiratory tract as well as long term health such as nasopharyngeal cancer. The WHO indoor guideline value was reviewed again in 2013 and 2017 considering all relevant endpoints and all available publications. In neither of the reviews, there were any findings or effects, either acute (e.g. eye irritation) or long-term (e.g. cancer) in nature, published that questioned or contradicted the WHO guideline value. The recent studies included once more confirmed the non-linear dose response relationship of formaldehyde and that no health effects have been observed below this value.In addition, the German Committee on Indoor Air Guide Values of the German UBA established an indoor air guidance value for long term exposure in 2016 which is identical to the WHO guideline value, i.e. 100 µg/m³. A particular focus during the discussions in the German committee was the potential association between formaldehyde exposure and asthma in children. Therefore,“UBA (2016) performed a review of epidemiological studies investigating the association between formaldehyde exposure and the induction or exacerbation of asthma in children. On the basis of the available data, UBA concluded that there is no clear association between formaldehyde exposure in the indoor environment and asthma in children. It was stated that the above mentioned epidemiological studies (e.g. Krzyzanowski et al., 1990) suffer from small sample sizes (which was much larger than in the studies by Lang et al. (2008) and Mueller et al. (2013)), from implausible formaldehyde concentrations, and the fact that other substances or factors initiating asthma and asthma-like complaints were not adequately considered. Results derived from controlled human exposure studies as well as animal experiments support their opinion.”Thus, both the reviews of the WHO guidance value as well as the German guidance value clearly confirmed that the WHO value reflects a highly precautionary and conservative approach. There weren’t any findings or effects, either acute (e.g. eye irritation) or long-term (e.g. cancer) in nature, published that questioned or contradicted the WHO guideline value of 100 µg/m³ and thus, there would be no health benefits at all by lowering the indoor air guidance value to the RAC DNEL level of 50 µg/m³. Due to the formal use of mostly default assessment factors, the RAC DNEL for indoor formaldehyde concentrations is non-realistically low and overconservative and does not provide any health benefits or other added value as compared to the WHO guidance value." + } + ] + }, + "acute_toxicity": { + "sections": [ + { + "label": "Administrative data" + }, + { + "label": "Description of key information", + "KeyInformation": "LD50(oral, rat) = 640 mg/kg bw (similar to OECD TG 401, non-GLP)LC50(inhalation, rat, 4h) < 463 ppm (OECD TG 403, GLP), local effectsLD50(dermal) no data available, but not required as formaldehyde has corrosive properties.Migrated Data from field(s) Field \"Quality of whole database\" (Path: ENDPOINT_SUMMARY.AcuteToxicity.KeyValueForChemicalSafetyAssessment.AcuteToxicityViaOralRoute.EndpointConclusion.DataBaseQuality): similar to OECD TG 401, non-GLP, K2 Field \"Quality of whole database\" (Path: ENDPOINT_SUMMARY.AcuteToxicity.KeyValueForChemicalSafetyAssessment.AcuteToxicityViaInhalationRoute.EndpointConclusion.DBQuality): OECD TG 403, GLP, K1" + }, + { + "label": "Key value for assessment", + "subsections": [ + { + "label": "Acute toxicity: via oral route", + "LinkToRelevantStudyRecord": "001 | Key | Experimental study", + "EndpointConclusion": "adverse effect observed", + "EffectLevelUnit": "LD50", + "EffectLevelValue": "640mg/kg bw" + }, + { + "label": "Acute toxicity: via dermal route", + "LinkToRelevantStudyRecord": "", + "EndpointConclusion": "no information available", + "EffectLevelUnit": "", + "EffectLevelValue": "" + }, + { + "label": "Acute toxicity: via inhalation route", + "LinkToRelevantStudyRecord": "001 | Key | Experimental study", + "EndpointConclusion": "adverse effect observed", + "EffectLevelUnit": "LC50", + "EffectLevelValue": "<463ppm", + "PhysicalForm": "inhalation: vapour" + }, + { + "label": "Acute toxicity: other routes", + "LinkToRelevantStudyRecord": "" + } + ] + }, + { + "label": "Justification for classification or non-classification", + "JustifClassif": "According to EU Classification, Labelling and Packaging of Substances and Mixtures (CLP) Regulation (EC) No. 1272/2008, the substance has to be classified as Acute Tox Cat 3 (oral and dermal) H311, and H301 and for inhalation Cat 2, H330.", + "JustifClassif_STOTSE": "" + }, + { + "label": "Additional information", + "Discussion": "In acute toxicity studies local irritation is the main effect.Oral exposureIn the study of Tsuchiya et al. (1975; comparable to OECD 401 with acceptable restrictions (i.e., symptoms not described; no necropsy; purity of test substance not given) male Wistar rats (n = 6 - 16) were gavaged with formalin or paraformaldehyde solution in water at concentrations of 2 or 4 %. The range of LD50 values was between 460 and 832 mg/kg bw. There is no significant difference in acute toxicity between the paraformaldehyde and the formalin solution, nor any significant difference concerning the concentration (2 or 4% solutions). The mean oral LD50 value of five independent experiments is 640 mg/kg bw.In a study comparable to OECD Guideline No. 401 (with acceptable restrictions: clinical symptoms not described; no data on necropsy given; purity of test substance not given) male Wistar rats (n= 10 per dose) were gavaged with formaldehyde solution in water at a concentration of 2%. The post exposure period was 14 days. Rats died within the first 2 days after application. The authors calculated an LD50 of 800 mg/kg bw (Smyth et al., 1941).Further data on acute oral toxicity in humans:In a case report (Kochhar et al., 1986) severe oesophageal burns and superficial ulceration of the stomach has been observed in a subject after ingestion of ca. 45 mL of 37% aqueous solution of formaldehyde. Similar results were reported after a gulp of 40% formaldehyde solution (OECD 2002).A review on toxicity of ingested formalin in accidental, homicidal or suicidal attempts is available (Pandey et al., 2000). Ingestion of formaldehyde may cause burning in the mouth and oesophagus, nausea and vomiting of tissue and blood, coffee ground emesis, abdominal pain, and diarrhoea. Further it can cause liver and kidney damage, leading to jaundice, albuminuria, haematuria and anuria, acidosis and convulsions or central nervous system depression and lead to unconsciousness and death resulting from cardiovascular failure. The fatal dose in humans is about 60-90 mL formalin (no further details given).Inhalation exposureIn the study of Skog (1950; comparable to OECD 403 with acceptable restrictions) 8 rats per dose were exposed for 30 minutes to 600-1700 mg/m³ (9 dose groups; 3-week post exposure observation period). Rats became listless and showed lachrymation, secretion from the nose; whining and rattling sound of respiration; rats gasped (similar signs observed after s,c, injection); respiration troubles lasted for several days (oedema); last death as late as the 15th day after exposure (bronchitis in this rat). Histopathology (limited documentation on dose-relationship) revealed local effects (lung oedema) as well as effects in liver (hyperaemia, perivascular oedema, necrosis) and kidney (perivascular oedema) which might be regarded as secondary effects due to the severe lesions in respiratory tract.Conclusion: LC50 (30 min) rat = 1000 mg/m³ corresponding to 830 ppm.In a study comparable to OECD Guideline 403 (OECD, 2002; secondary literature and not assignable but reliability 2 given in OECD SIDS Formaldehyde) 6 -10 male rats per dose were exposed for 4 hours to concentrations between 230 and > 900 mg/m³ formaldehyde gas (21 dose groups); the post exposure observation period was not given. The symptoms (restlessness, excitation, laboured breathing, gasping and lateral position) suggested local effects in the respiratory tract. No mortality occurred at 280 - 430 mg/m³.Conclusion: LC50 (4 h) = 588 mg/m³ = 490 ppm in rats.In inhalation hazard tests (BASF AG, 1980 a,b, & 1981) atmospheres enriched with formaldehyde by passing air through 1% solution in water resulted in no mortality after an exposure period of 7 h but clinical signs suggesting local effects on the respiratory tract and the eyes; using the same experimental design but 2.5% formaldehyde solution in water lethal effects occurred after 7 h exposure but not after 3 h exposure. Using 5% aqueous solution all rats survived an exposure period of 1 h but 2/6 died after 3 h exposure and all rats died after an exposure period of 7 h.Morphological changes of the nasal epithelium in rats have been shown even at low concentrations (Bhalla et al., 1991). The exposure of rats to 10 ppm formaldehyde (12 mg/m³; n= 6) for 4 h resulted in morphological alteration of the epithelium in the nasal cavity. Light and electron microscopy showed ciliary destruction and cell separation in naso- and maxilloturbinates, cellular swelling (more prominent 24 h after exposure period compared to 1 h post exposure) throughout the turbinates, pores on the cell surfaces and between adjacent cells in the middle meatus, and mucous release of goblet cells in nasoturbinates.Swenberg et al. (1983a, see Section Repeated dose toxicity) exposed rats to 15 ppm for 1-9 days (6h/d). After 1 day of exposure, acute degeneration of the respiratory epithelium with edema and congestion was evident. Initial lesions were most severe on the tips of the maxilloturbinates and nasoturbinates.Time dependency of early histopathological lesions can be seen from a study primarily designed to investigate the time and concentration dependency of formaldehyde-induced effects on mucociliary function in rats (Morgan et al., 1986, details presented in Section Repeated dose toxicity). A single 6 h exposure to 15 ppm produced only minimal histopathological lesions (separation of epithelial cells, intravascular margination, local tissue infiltration) in the anterior nasal passages, the maxilloturbinates, the nasoturbinates and the lateral wall. The mucous flow rate was reduced but the effect was not significant.The histopathological alterations after short term exposure to formaldehyde are reflected by data for cell proliferation. Early experiments demonstrated that the different sensitivity of rats and mice for tumor induction is also reflected by cell proliferation as measured by pulse labeling with [3H]-thymidine. A single 6-h exposure to 15 ppm caused a 13-fold increase in cell proliferation in rats and an 8-fold increase in mice (Chang et al., 1983; see details in Section Repeated dose toxicity). The proliferative response was most pronounced in the basal cell layer. Rats showed early degeneration and sloughing of respiratory epithelial cells with evidence of early hyperplasia. Mice had only mild serous rhinitis and focal degeneration of the respiratory epithelium. With an optimization of the labeling procedure (pulse labeling 18 h post exposure) a transient increase in cell proliferation was seen in rats exposed to 0.5 or 2 ppm for just one day (Swenberg et al., 1986, see Section Repeated dose toxicity).In a series of experiments the time, concentration and location-dependency of formaldehyde exposure on mucociliary function in rats was studied (Morgan et al., 1986). After exposure the animals were sacrificed, the nasal mucosa was dissected and placed in a glass observation chamber mounted with a microscope and fiber optics illumination. In an acute exposure experiment male rats were exposed to 15 ppm over 10, 20, 45, 90 min and 6 h or to 2 ppm over 90 min or 6 h and the nasal mucociliary apparatus was evaluated directly after exposure. In addition, after exposure to 15 ppm over 90 min and 6 h a recovery period of 1 h was allowed for before observation of the mucociliary function. No effects were observed at 2 ppm. At 15 ppm the extent of formaldehyde-induced inhibition of mucociliary function was time-dependent, with increasing areas of mucostasis and ciliastasis being induced during the 6 h exposure period. The areas of inhibition of mucus flow exhibited the same site specificity as ciliastasis while being generally more extensive. The recovery period of 1 h led to recovery of mucociliary function especially in the more posterior areas of the affected regions. However, in areas of recovery mucus flow rate was still reduced indicating incomplete recovery of function. The regions of inhibition of mucociliary function generally correlated well with the distribution of formaldehyde-induced nasal squamous cell carcinomas.The concentration of formaldehyde producing a 50% decrease in respiratory rate (RD50) of rats after 10 min of exposure was 32 ppm (38 mg/m³). In mice, however, the same experimental designs resulted in a RD50 (10 min) of 4.9 ppm (5.9 mg/m³). These species differences might influence repeated dose toxicity (Chang et al., 1981).To determine the acute inhalation toxicity (single 4-hour exposure, whole body) of Formaldehyde as a vapor, a study was performed in male and female Wistar rats according to OECD-Guideline method 403, as well as EC and EPA guidelines under GLP (BASF 2015, key). The actual measured concentration was 463 ppm (analytical concentration). At 463 ppm all of five male and five female animals died. Lethality was observed on study day 1 or 2. Clinical signs of toxicity in animals comprised gasping, respiration sounds, breathing in stretched position, closed eyelid, red discharge and red encrusted nose, poor general condition, salivation, piloerection and yellow discoloured fur. Findings were observed from hour 1 of exposure until the death of the animals. The mean body weights of the animals surviving the exposure period decreased until death. During necropsy all animals showed dilated stomach, which were filled with gaseous content. The LC50 was < 463 ppm (analytical concentration).Further data on acute inhalation toxicity in humans:No effects on lung function parameters were found in controlled clinical studies in volunteers exposed for 5 h to up to 2 ppm (Andersen & Molhave, 1983) or exposed for 3 h to up to 3 ppm (3.6 mg/m³; Kulle et al., 1987). In a recent study Lang et al. (2008) exposed healthy volunteers over 4 h up to 0.5 ppm formaldehyde with 4 peaks of 1 ppm (15 min each) including cycle ergometry (80 Watt, 3 times, 15 min each). No effects were noted on nasal resistance and flow (active anterior rhinomanometry), pulmonary function by body plethysmography (airway resistance, peak expiratory flow, forced expiratory volume by 1 sec, maximum mid expiratory flow) or reaction time. Nasal resistance and flow rates measured by anterior active rhinometry as well as self-reported tear film break-up time were not affected in volunteers at 0.7 ppm or 0.4 ppm with peaks of 0.8 ppm (Mueller et al., 2013).Pulmonary effects in asthmatic people were examined with controlled exposure to formaldehyde in three independent studies (BfR, 2006). In these controlled clinical studies, formaldehyde-related increases in pulmonary dysfunction were not evident in asthmatics at concentrations of up to 3 ppm and an exposure period up to 3 hours.Lung function was reported to be affected at workplaces at formaldehyde concentrations higher than 1 ppm and exposure duration of 2 -3 h. But as summarized by Greim (2000) the validity of these studies is limited (no controlled exposure concentration, peak exposure, co-exposure not excluded) and they do not allow to draw any firm conclusion.Data on chemosensory irritation of eyes, nose and throat in humans are reported in the summary and discussion of Section Irritation and Corrosivity.IARC (2006) presented a summary on toxic effects in animals (see IUCLID Section 7.12) as well as a summary on toxic effects in humans (see IUCLID Section 7.10.3) including data on acute toxicity.Mueller et al. (2013, key) further refined the results obtained by Lang et al. (2008). 41 male volunteers (non-smokers, age ±9.9 years) were exposed in a randomised schedule to 0, 0.5, 0.7 ppm and to 0.3 ppm with 4 15 min peaks of 0.6 ppm and to 0.4 ppm with peaks of 0.8 ppm. During exposure 4 cycle ergometer units at 80 W were performed for 15 min. Subjective pain perception induced by nasal application of carbon dioxide served as indicator for sensitivity to sensory nasal irritation to define subjects hyper- and hyposensitive for irritation. The following parameters were examined before and after exposure: subjective rating of symptoms and complaints (Swedish Performance Evaluation System), conjunctival redness, eye-blinking frequency, self-reported tear film break-up time and nasal flow rates. In addition, the influence of personality factors on the volunteer’s subjective scoring was examined (Positive And Negative Affect Schedule; PANAS). No indications for subjective or objective indications of sensory irritation were obtained under these exposure conditions. There was a statistically significant differences for olfactory symptoms, especially for the ‘perception of impure air’ when comparing the subjective symptoms under formaldehyde exposure with zero exposure. These subjective complaints were more pronounced in hypersensitive subjects. When comparing the studies of Lang and Mueller, Lang et al. (2008) observed subjective symptoms of eye irritation already at 0.3 ppm while these effects were not found by Mueller et al. (2013, key) even at higher exposures. This is explained by Mueller et al. (2013) by the fact, that negative affectivity was significantly higher in the subjects exposed in the Lang study as compared to those of Mueller. The increased ‘perception of impure air’ was attributed by the authors impairment of well-being caused by situational and climatical conditions in the exposure chamber, because a statistically significant difference in symptom scores between FA exposures and control condition was missing, and hypersensitive subjects reported statistically significantly higher complaints even after exposure to 0 ppm. The NOAEC for sensory irritation was 0.7 ppm over 4 h and 0.4 ppm with peaks of 0.8 ppm.In the context of a restriction of formaldehyde and formaldehyde releasers, the sensory irritation studies of Lang et al. (2008) and Müller et al. (2014) were reevaluated (RAC & SEAC, Opinion on an Annex XV dossier proposing restrictions on formaldehyde and formaldehyde releasers, compiled version, adopted 13 March 2020 by RAC and 17 September 2020 by SEAC). In the view of RAC, such small numbers of volunteers and such a high variability of EBF in both studies do not allow a dose-related effect to be detected (unless the effect is sufficiently strong). Under these conditions (small size of samples, males only, very high variability of the test parameter, lack of data on continuous EBF monitoring during exposure) the lack of observed effects cannot be considered as evidence for the absence of dose-related effects. In addition to the uncertainties reported above, the variability of the results obtained might not reflect the variability of the general population, particularly of children, as indicated in a review by the JRC (2005). It is also noted that the respective exposure treatments in the studies by Lang et al. and Müller et al. were rather short (4 h) single exposure events (Lang et al., 2008). It is not known whether the threshold value for EBF would be different (i.e. lower) for formaldehyde, if exposure duration and/or frequency were expanded. Further weaknesses were identified in the Lang study: Data from male and female volunteers were pooled, although increased eye redness in females indicated a gender-specific difference.In conclusion on the study of Lang et al. (2008) and Mueller et al. (2013), RAC considers that the absence of a sensory irritation effect at formaldehyde concentrations below 1.24 mg/m³ (1 ppm) is uncertain. Due to high variability of the measured effect (large ranges, high standard deviations), the low numbers of volunteers (yielding low statistical power) and the additional uncertainties identified, false negative results at 0.62 mg/m³ (0.5 ppm) or lower cannot be excluded. The studies of Lang et al. (2008) and Mueller et al. (2013), thus, cannot be used to derive a DNEL, because the uncertainties are too high and the lack of observed effects cannot be considered as evidence for the absence of dose-related effects.In addition to the uncertainties reported above, the variability of the results obtained might not reflect the variability of the general population, particularly of children.As a consequence, two new sensory irritation studies were initiated with specifically addressing the shortcomings and deficiencies of the studies of Lang et al. and Müller et al..The importance to clearly differentiate between sensory irritation and olfaction was demonstrated by Berglund et al. (2012, key). 31 subjects (18–35 years old) were exposed to formaldehyde at concentrations varying between 6.36 and 1000 ppm corresponding to the Swedish TLV. Exposure was carried out in a hood exposure system and the volunteers took one sniff of the atmosphere over 3 sec (3 sniffs/min).P50absolute thresholds were for formaldehyde odor 110 ppb (range 23–505). For sensory irritation the P50 could not be calculated because too few subjects were studied and the exposure was limited to 1000 ppb. But all thresholds for irritation were higher than for odor.In a comprehensive review about factors that may influence olfaction Greenberg et al. (2013, key) concluded that perception of odor cannot be used as a surrogate marker for chemical exposure. Odor perception is affected by the psychological state and bias because odor is often negatives biased by association with health-related symptom.Some further studies in humans on self-reported symptoms during prolonged work with formaldehyde are mentioned here, although not related to single exposures. As far as subjective symptoms were recorded these studies are less reliable than those in volunteers under controlled exposure conditions. The major problems stem from factors like exposure to mixtures of unknown composition, peak exposures that were not controlled for, or recall bias to former exposures. Basically the main subjective symptoms were reported by students of a gross anatomy dissection course using a more detailed questionnaire (Mori et al., 2013, supporting). The symptoms were reversible 6 months after the course. Pre-existing allergies did not change during the course. Apart from subjective reportings, again the problem is exposure assessment. Exposure was reported to be about 0.2 ppm, but this was measured by area and not by personal sampling for 20 min after start of the course. Thereby personal peak exposures could not be accounted for.Some studies reported objective parameters associated with formaldehyde exposure. Neghab et al. (2011, supporting) carried out a cross sectional study with 70 workers of a melamine-formaldehyde producing factory including 24 non-exposed referents. In total 7 air samples were taken over 40 min. The frequency of some of the self-reported respiratory symptoms (e.g. cough, chest tightness, episodes of chest illness associated with cold) was significantly higher in the exposed population and pre- and post-shift parameters of pulmonary function showed significant decrements. A recovery of lung function capacity was observed following temporary cessation of exposure. Airborne formaldehyde exposures clearly exceeded current exposure limit values with 0.78 ppm (SD=0.4). Hisamitsu et al. (2011, supporting) investigated serum IgE levels, olfactory tests and nasal sensitivity to histamine in 41 medical students before, during and after an anatomy dissection course. Olfactory abnormalities and increased histamine sensitivity were observed during and immediately after the course, but the effects were reversible and disappeared after completion of the course. Formaldehyde concentrations ranged from 0.51-0.97 ppm (mean 0.67) in the center of the laboratory.", + "subsections": [ + { + "label": "Attached background material" + } + ] + } + ] + }, + "repeated_dose_toxicity": { + "sections": [ + { + "label": "Administrative data" + }, + { + "label": "Description of key information", + "KeyInformation": "There is evidence that formaldehyde induces toxic effects only at the site of contact after oral, dermal or inhalation exposure. Toxicity is not evident at remote sites such that general signs of toxicity occur only secondary to these local lesions. In spite of some recent studies describing effects after inhalation of formaldehyde far of the portal of entry, this assessment is still upheld after comparing these studies with key guideline studies of high validity.In chronic drinking water studies in rats local effects in the forestomach and stomach were induced, the NOAEC is 0.020-0.026% formaldehyde in drinking water. The NOAEL for systemic effects is 82 mg/kg bw/day in males and 109 mg/kg bw/day in females.Studies on repeated dermal dose toxicity in compliance to current Guidelines are not available.Local effects in the upper respiratory tract were induced after repeated inhalation exposure in experimental animals. The most sensitive site in rodents and monkeys following inhalation exposure is the respiratory epithelium in the anterior part of the nasal cavity. At higher exposure levels also the olfactory epithelium, larynx or trachea were affected. Rats are more sensitive than mice or hamsters. The LOAEC is 2 ppm in rats, 3 ppm in monkeys and 6 ppm in mice. The overall NOAEC for local effects in experimental animals is 1 ppm (1.2 mg/m³). The NOAEC for systemic effects not occurring at the site of first contact in long-term inhalation studies in rats and mice is 15 ppm.Migrated Data from field(s) Field \"Quality of whole database\" (Path: ENDPOINT_SUMMARY.RepeatedDoseToxicity.KeyValueForChemicalSafetyAssessment.RepeatedDoseToxicityViaOralRouteSystemicEffects.EndpointConclusion.DataBaseQuality): similar to OECD TG 453, K1" + }, + { + "label": "Key value for assessment", + "ToxicEffectType": "", + "EndpointConclusionSystemicEffectsOralRoute": "adverse effect observed", + "EndpointConclusionSystemicEffectsDermal": "", + "EndpointConclusionSystemicEffectsInhalation": "", + "subsections": [ + { + "label": "Short-term repeated dose toxicity – systemic effects", + "subsections": [ + { + "label": "Oral route", + "LinkToRelevantStudyRecord": "", + "EffectLevelUnit": "", + "EffectLevelValue": "", + "ExperimentalExposureTimePerWeek": "", + "Species": "", + "System": "", + "Organ": "" + }, + { + "label": "Dermal", + "LinkToRelevantStudyRecord": "", + "EffectLevelUnit": "", + "EffectLevelValue": "", + "ExperimentalExposureTimePerWeek": "", + "Species": "", + "System": "", + "Organ": "" + }, + { + "label": "Inhalation", + "LinkToRelevantStudyRecord": "001 | Key | Other result type", + "EffectLevelUnit": "NOAEC", + "EffectLevelValue": "1.2mg/m³", + "ExperimentalExposureTimePerWeek": "", + "Species": "", + "System": "", + "Organ": "" + } + ] + }, + { + "label": "Sub-chronic toxicity – systemic effects", + "subsections": [ + { + "label": "Oral route", + "LinkToRelevantStudyRecord": "", + "EffectLevelUnit": "", + "EffectLevelValue": "", + "ExperimentalExposureTimePerWeek": "", + "Species": "", + "System": "", + "Organ": "" + }, + { + "label": "Dermal", + "LinkToRelevantStudyRecord": "", + "EffectLevelUnit": "", + "EffectLevelValue": "", + "ExperimentalExposureTimePerWeek": "", + "Species": "", + "System": "", + "Organ": "" + }, + { + "label": "Inhalation", + "LinkToRelevantStudyRecord": "", + "EffectLevelUnit": "", + "EffectLevelValue": "", + "ExperimentalExposureTimePerWeek": "", + "Species": "", + "System": "", + "Organ": "" + } + ] + }, + { + "label": "Chronic toxicity – systemic effects", + "subsections": [ + { + "label": "Oral route", + "LinkToRelevantStudyRecord": "001 | Key | Experimental study003 | Supporting | Experimental study004 | Supporting | Experimental study", + "EffectLevelUnit": "NOAEL", + "EffectLevelValue": "82mg/kg bw/day", + "ExperimentalExposureTimePerWeek": { + "value": "168", + "unit": "hours/week" + }, + "Species": "rat", + "System": "gastrointestinal tract", + "Organ": "stomach" + }, + { + "label": "Dermal", + "LinkToRelevantStudyRecord": "", + "EffectLevelUnit": "", + "EffectLevelValue": "", + "ExperimentalExposureTimePerWeek": "", + "Species": "", + "System": "", + "Organ": "" + }, + { + "label": "Inhalation", + "LinkToRelevantStudyRecord": "", + "EffectLevelUnit": "", + "EffectLevelValue": "", + "ExperimentalExposureTimePerWeek": "", + "Species": "", + "System": "", + "Organ": "" + } + ] + }, + { + "label": "Repeated dose toxicity – local effects", + "subsections": [ + { + "label": "Dermal", + "LinkToRelevantStudyRecord": "", + "EndpointConclusion": "", + "EffectLevelUnit": "", + "EffectLevelValue": "", + "TestType": "", + "Species": "" + }, + { + "label": "Inhalation", + "LinkToRelevantStudyRecord": "", + "EndpointConclusion": "", + "EffectLevelUnit": "", + "EffectLevelValue": "", + "TestType": "", + "Species": "" + } + ] + }, + { + "label": "Repeated dose toxicity: other routes", + "LinkToRelevantStudyRecord": "" + } + ] + }, + { + "label": "Mode of Action Analysis / Human Relevance Framework", + "ModeOfActionAnalysis": "" + }, + { + "label": "Justification for classification or non-classification (Specific target organ toxicity-repeated exposure (STOT RE))", + "JustifClassif": "According to EU Classification, Labelling and Packaging of Substances and Mixtures (CLP) Regulation (EC) No. 1272/2008, classification and labelling is not needed for repeated dose toxicity. However, under consideration of the RAC (2012) proposal for classification and labelling, formaldehyde is classified as Carc. Cat 1B (H350) according to EU Classification, Labelling and Packaging of Substances and Mixtures (CLP) Regulation (EC) No. 1272/2008, Annex VI." + }, + { + "label": "Additional information", + "Discussion": "Repeated oral exposureIn a study comparable to OECD Guideline 453 (Til et al., 1989; combined chronic toxicity/ carcinogenicity study) 70 male and 70 female Wistar rats per dose (subgroups of 10 rats/sex/dose killed 12 or 18 months after start of exposure) received formaldehyde via the drinking water at dose levels of 0, 1.2, 15, 82 mg/kg bw/day (males) or 0, 1.8, 21, 109 mg/kg bw/day (females) for 105 weeks (concentration: 0, 20, 260, or 1900 mg/L or 0, 0.002, 0.026, 0.19%). At the high dose body weight gain was decreased in males & females as well as food and water consumption. Other parameters (except pathology) were not altered. Pathological alterations in the kidney, such as the renal papillary necrosis detected in high dose males and females, are attributed to a secondary effect arising from significantly reduced (~40%) water intake. Treatment related lesions were detected only in the forestomach (focal papillary epithelial hyperplasia, ulceration and hyperkeratosis) and the glandular stomach (chronic atrophic gastritis, ulceration and hyperplasia) of males and females in the high dose group. No gastric tumors were induced (see Section Carcinogenicity). In summary, oral exposure via the drinking water induced local effects in the stomach of rats at a concentration of 0.19% corresponding to 82 mg/kg bw/d in males and 109 mg/kg bw/d in females; the NOAEC is 0.026% corresponding to 15 mg/kg bw/d in males and 21 mg/kg bw/d in females.Very similar results were presented by Tobe et al. (1989; comparable to OECD Guideline 452 with acceptable restrictions). In this drinking water study 20 Wistar rats per dose per sex were exposed to 0, 0.020, 0.10, 0.50% formaldehyde in the drinking water (0, 10, 50, 300 mg/kg bw/day) for up to 24 months (no post exposure observation period; 6 rats per sex per dose sacrificed at each interim sacrifice after 12 and 18 month). In the high dose group, poor general state, reduction of body weight gain and both food and water consumption, increased mortality (ca. 50% after 12 months, no rat alive after 24 months), and changes in various clinical parameters were recorded. Histopathology revealed local effects in the stomach/forestomach of the high dose group. Lesions of the forestomach in males and females were squamous and basal cell hyperplasia, hyperkeratosis, erosions/ulcers, and submucosal cell infiltration. Glandular hyperplasia, erosions/ulcers, and submucosal cell infiltration in the glandular stomach were also found at the high dose level. A high incidence of renal papillary necrosis was also observed in male and female animals (about 50% versus 0-10% in the other groups). This finding is ascribed by the authors to the dehydration caused by the considerable decrease of liquid consumption (significant decrease in the high dose group, data presented in a graph revealed a range of 10-20 mL/rat/day versus 25-35 mL/rat/day in the control). No other treatment related lesions were reported. However, local effects were also detected at the mid dose level: administration of 0.10% resulted in forestomach hyperkeratosis in animals after 18 (1/6 males) and 24 months (1/8 females). According to the authors, the NOAEL was 10 mg/kg/d (NOAEC 0.02%).In a subacute study (Til et al., 1988) oral exposure of rats via the drinking water for 28 days induced local effects in the stomach at 125 mg/kg bw/day; the NOAEL was 25 mg/kg bw/day, however, no data are given on the formaldehyde concentration in the drinking water.There are several relatively new oral gavage studies the interpretation of which is hampered by several important drawbacks: detailed information is missing on the dosing solution, histopathology of the stomach, the primary portal of entry, was not carried out, and only one dose level of FA was used such that a dose response relationship cannot be assessed. Furthermore, the relatively steep rise in blood levels obtained by gavage leads to some uncertainty in risk assessment for humans exposed via food or liquid intake. Finally, the authors generally failed to discuss their observations in relation to other prominent studies in rodents, like e.g. the chronic study of Til et al. (1989). Therefore, the findings of these studies will only be summarized without going into details. These studies concentrated on effects by combined exposure to FA and other substances and here we will only report on the parts dealing solely with FA.Soni et al. (2013) described necrosis of the liver after daily exposure of male mice to 25 mg/kg bw/d over 8 weeks. The strain of mice and the source of FA are not given nor the FA concentrations or the dosing volume.Abd-Elhakim et al. (2016) observed in male Swiss mice alterations in the hematogram, leukogram and in immunological parameters at 25 mg/kg bw/d over 60 consecutive days. A 40% solution of FA (possibly formalin) was diluted in water to “working stock solutions” without giving further details. Taking into account the dosing volume of 0.1 ml/mouse (20-25 g initial weight) a FA concentration in the range of 6000 mg/l can be estimated being by a factor of ~3 higher than the highest drinking water concentration used by Til et al. (1989). Under consideration of the bolus application severe effects on the stomach are to be expected with unknown systemic sequelae and missing data in this respect is a severe deficiency.Mohamed et al. (2016) observed in Dawley Albino rats (3 months of age) adverse effects on biochemical liver and kidney parameters and histopathological alterations in these organs. The animals received 100 mg formalin/kg bw/d (concentration of FA not given) over 30 consecutive days. For a 40% formalin solution the dose would be 40 mg FA/kg bw/d. As the dosing volume was not specified the concentration of FA cannot be calculated.Conclusion on repeated oral exposure:The main effects in chronic drinking water studies with rats are local lesions in the forestomach and the glandular stomach at a concentration of 0.10% in the drinking water corresponding to 50 mg/kg bw/day (Tobe et al., 1989) or 0.19% corresponding to 82 mg/kg bw/day in males and 109 mg/kg bw/day in females (Til et al., 1989). In both studies the NOAEC for local effects is very similar: 0.026% formaldehyde in the drinking water corresponding to 15 mg/kg bw/day in males and 21 mg/kg bw/day in females (Til et al. 1989) or in the study of Tobe and coworkers (1989) 0.02% corresponding to 10 mg/kg bw/day. Til et al. (1989) as well as Tobe et al.(1989) reported an increased incidence in papillary necrosis of the kidney, but this effect was due to the reduced water intake and is only indirectly treatment related. The decrease in body weight is related to the reduced water & food consumption and/or is secondary to lesions of the stomach. The NOAEL for systemic effects is 82 mg/kg bw/day in males and 109 mg/kg bw/day in females (Til et al. 1989). The study of Tobe et al. (1989) is less suitable for final evaluation of systemic effects.Repeated dermal exposureStudies on repeated dermal dose toxicity in compliance to current Guidelines are not available. According to column 2 of REACH Annex VIII Section 8.6.1, the study does not need to be conducted as exposure to formaldehyde via inhalation is considered to be the main route of exposure.The available data on this endpoint are of limited validity due to restricted documentation and methodological shortcomings. In the study of Iversen (1986) the NOAEC for skin effects in mice was 200 μL of 1% formaldehyde applied twice weekly for 60 weeks; at a concentration of 10% formaldehyde hyperplasia of the epidermis was found and a few mice had small ulcers and scratches (no further data given on origin, whether self-inflicted or caused directly by formaldehyde) of the skin; no treatment related tumors at remote tissues were detected (limited documentation; histopathology of the lung, nasal mucosa, brain and all tumors only in the high dose group).In a subacute pilot study for an initiation/promotion study (Krivanek et al. 1983) daily dermal application of 100 μl 0.5% formaldehyde in acetone/water (50:50) solution resulted in reversible irritation of the skin in mice, no effects were detected at a concentration of 0.1%.Repeated inhalation exposureMonticello et al. (1991) presented an inhalation study in male F344 rats which is restricted to histopathology and autoradiography of the respiratory tract. Six rats per group were exposed 6 h/day for 1, 4, 9 days, or 6 weeks to 0, 0.7, 2, 6, 10, 15 ppm formaldehyde (whole body exposure was used in all studies described in detail in this section). Histopathology of the respiratory tract was performed and additionally, autoradiography of the nasal cavity (3H-thymidine injected 2 h prior to sacrifice for DNA labelling) for measurement of cell proliferation. No effects were detected at 0.7 and 2 ppm. At >= 6 ppm lesions of the respiratory epithelium in the nasal cavity were observed; no effects were noted in any other part of the respiratory tract. Effects in the nasal cavity were dose dependent and increased with exposure time. The lesions in nasal cavity exhibited an anterior-posterior severity gradient, more severe lesions were observed in the anterior part. In histoautoradiography significant effects were reported at a dose level of >= 6 ppm and exposure period >= 1 day. In conclusion, repeated inhalation exposure resulted in lesions of the respiratory epithelium in the nasal cavity of rats, the NOAEC was 2 ppm, an anterior-posterior severity gradient was shown and the lesions were associated with epithelial cell proliferation (Monticello et al.,1991).Swenberg et al. (1983a) exposed rats to 15 ppm for 1-9 days (6h/d). After 1 day of exposure, acute degeneration of the respiratory epithelium with edema and congestion was evident. This was followed by ulceration, necrosis, and an influx of inflammatory exudates at days 3-9. Early squamous metaplasia was detected after as little as 5 days of exposure. Five days of exposure followed by 2 days without exposure led to considerable regeneration. These initial lesions were most severe on the tip of the maxilloturbinatesand nasoturbinates. By comparing these acute toxicity data with changes observed after prolonged exposure the authors conclude that adaptive changes occur.In another short-term exposure study male rats were exposed for 1-4 days (6h/d) to 0.5, 2, or 6 ppm.At 0.5 or 2 ppm ultrastructural changes occurred at the cilia of the respiratory epithelial cells (blebbing of the membranes in some cilia) which are not considered to be an epithelial injury. At 6 ppm hypertrophy of the goblet and ciliated cells was noted after an exposure for 1, 2, or 4 days. Non-keratinysed squamous cells were seen as early 4 days after exposure to 6 ppm and at 1 and 2 days after exposure 15 ppm. Neutrophil infiltration was observed after an exposure to 6 ppm (Monteiro-Riviere & Popp, 1986).Time dependency of early histopathological lesions can be seen from a study primarily designed to investigate the time and concentration dependency of formaldehyde-induced effects on mucociliary function in rats (Morgan et al., 1986). A single 6 h exposure to 15 ppm produced only minimal histopathological lesions in the anterior nasal passages. After 2 days of exposure, epithelial damage and inflammation were more severe with a more posterior extension and cellular proliferation with early squamous metaplasia after 4 days. After 9 days of exposure (6 h/d; 5 d/w) epithelial degeneration was severe with ulceration in some parts of the nasoturbinate. Similar but less severe changes were found at 6 ppm and no epithelial lesions in rats exposed to 0.5 or 2 ppm.Cell proliferation in the middle portion of respiratory mucosa after a few days of exposure was investigated by Swenberg et al. (1986). A transient increase in cell proliferation was seen in rats exposed to 0.5 or 2 ppm for just one day. This increase disappeared after 3 and 9 days of exposure. At 6 ppm rats had a massive increase in labelling index after a single 6-h exposure, a lesser response after 3 exposures that returned to nearly the control rate after 9 exposures.A sub-chronic inhalation study in Wistar rats was performed according to current guideline (OECD 413) with acceptable restrictions (haematology without blood clotting parameter & limited clinical chemistry; no ophthalmological examination). Ten male (m) and 10 female (f) rats were exposed for 13 weeks to 0, 1, 10, or 20 ppm formaldehyde (6 h/day for 5 days per week). At the high dose uncoordinated locomotion and excitation (m&f), growth retardation (m&f), decreased total protein and increased serum enzyme activity (ASAT, ALAT, and ALP in m; considered not to be ahepatotoxic effect because there were no effects on liver weight and no histopathological effects in the liver), squamous metaplasia of thelarynx (m) and olfactory epithelium (m&f), focal epithelial thinning (m&f) and keratinisation (m) of olfactory epithelium, and diffuse squamous metaplasia of nasal respiratory epithelium (m&f) were observed. At 10 ppm (LOAEC) focal squamous metaplasia, hyperplasia, and keratinization as well as epithelial disarrangement were seen in the nasal respiratory epithelium of males and females. No effects were detected in other organs. In summary, local effects in the respiratory epithelium of the nasal cavity were induced at 10 ppm (LOAEC) and at the higher dose of 20 ppm also in the olfactory epithelium and larynx. The NOAEC in this study is 1 ppm (NCF 1984).In the study of Wilmer et al. (1989) it was shown that exposure concentration is more important than exposure duration. The study is limited to toxic effects in the nasal cavity of male Wistar rats after inhalation exposure. Rats were exposed a) continuously: 8 h/day, 5 days per week or b) intermittently: daily 8 x 30 min exposure separated by 30 min non-exposure periods, 5 days per week for 13 weeks in a) and b). Effects were studied by histopathology and histoautoradiography after thymidine-labelling. Intermittent exposure to a concentration of 4 ppm (product of concentration [4 ppm] x time [4 h/day] is 16 ppm x h/day) but not 2 ppm resulted in treatment related effects in the respiratory epithelium confined to the nasal cavity of rats which included: increased degree and incidence of epithelial disarrangement, squamous metaplasia with and without keratinisation, and basal cell hyperplasia. No effects were seen with continuous exposure to 1 or 2 ppm although the product of concentration (2 ppm) x time (8 h/day) is the same than with interrupted exposure to 4 ppm (16 ppm x h/day) suggesting that the concentration rather than the 'dose' is responsible for the effects. No significant, treatment related effects were found on cell proliferation. The authors suggested a NOAEC of 2 ppm for effects on the nasal epithelium.The predominance of exposure concentration over cumulative dose can also be derived from a comparison of effects in rats observed after 6 months with different exposure schedules. Striking differences in the pathological response to 15 ppm formaldehyde (6h/d, 5d/week corresponding to 450 ppm x h/week) in comparison to 3 ppm (22h/d, 7d/week corresponding to 462 ppm x h/week). The first exposure scenario corresponded to that of Kerns et al. (1983) and the latter to that of Rusch et al. (1983). Although the exposure-time product was comparable, much less toxicity was observed by exposure to 3 ppm indicating that the concentration is more important than the total dose for the observed nasal injury.Similar findings were also noted after short-term exposure when investigating the influence on cell proliferation by exposing rats to either 3 ppm x 12 h, 6 ppm x 6 h, or 12 ppm x 3 h (each concentration x time product = 36 ppm x h) over 3 or 10 days. In the most anterior part of the nose where mucociliary clearance is minimal, the total dose was more important than the concentration concerning cell proliferation. In contrast, at level II, where mucociliary clearance is prominent and where most of the tumors originate, cell proliferation was concentration dependent. Cell proliferation rates after 3 days of exposure (suggested combination of hyperplasia due to thickening of the epithelium and compensatory proliferation for cell death)were clearly higher than after 10 days of exposure (only compensatory proliferation; Swenberg et al., 1983b). These latter findings indicate to an adaptation as initial cell proliferation rates diminish with prolongation of exposure.Mice are less sensitive than rats. Early experiments demonstrated that the enhanced sensitivity of rats compared to mice for tumor induction is also reflected by increased cell proliferation as measured by pulse labelling with [3H]-thymidine. A single 6-h exposure to 15 ppm caused a 13-fold increase in cell proliferation in rats and only an 8-fold increase in mice. The labelling index was further increased to 23-fold when rats were exposed to 15 ppm for 5 days, but only a small additional increase was noted for mice (Chang et al., 1983).In a sub-chronic inhalation study 10 male and 10 female B6C3F1 mice per group were exposed 6 h/day, 5 days per week for 13 weeks to 0, 2, 4, 10, 20, or 40 ppm formaldehyde. Lesions of the anterior part of the nasal cavity (squamous metaplasia [m&f] and rhinitis [m]) were reported at >= 10 ppm. Severity and site of lesions (also more posterior parts of the nasal cavity) increased with rising concentrations. Higher dose levels of >= 20 ppm in males & females also affected the larynx and trachea; lesions of the bronchus occurred at 40 ppm. No effects of toxicological relevance were detected at 4 ppm (distant site tissues not examined). Comparison with rat studies (see NCF, 1984 or Wilmer et al., 1989; or direct comparison by CIIT 1981) revealed that mice are less sensitive than rats. Conclusion: Inhalation exposure for 13 weeks induced local effects in the anterior nasal cavity of mice at 10 ppm, higher dose levels induced also effects in more proximal parts of the upper respiratory tract; the NOAEC was 4 ppm (Maronpot et al., 1986).Rusch et al.(1983) compared toxic effects after inhalation exposure in 3 different species: rat, hamster, and monkey. The study was restricted to effects on the respiratory tract. F344 rats (20 m and 20 f per dose); Syrian golden hamster (10 m and 10 f per dose), and monkeys (Cynomolgus; 6 males per dose) were exposed to 0, 0.2, 1, or 3 ppm, 22 h per day, 7 days per week for 26 weeks. Rats revealed no treatment related effects at 0.2 and 1 ppm. At 3 ppm clinical symptoms were not reported but body weight was decreased in males. This level induced also effects in the epithelium of nasoturbinates in males and females including increased incidence in squamous metaplasia and hyperplasia at the middle section level of the nasoturbinates. The LOAEC was 3 ppm and the NOAEC was 1 ppm. Very similar results were found in monkeys. This species revealed no treatment related effects at 0.2 and 1 ppm. At 3 ppm clinical symptoms were reported. This level induced also effects in the nasoturbinates: squamous metaplasia and hyperplasia. No effects were detected in other tissues of the respiratory tract. In contrast, Syrian golden hamsters revealed no treatment related effects in any studied respiratory tract tissue (lung, trachea, nasal cavity) even at a level of 3 ppm. Hamsters seem to be a less sensitive animal model for formaldehyde exposure compared to rats.Supporting evidence for a NOAEC of 1 ppm in rats came also from a study using transmission electron microscopy (SOCMA, 1980) after exposure for 26 weeks to 0 or 1 ppm (5 rats per sex, 22 h/day, 5 days/week). Rats exposed to 1 ppm did not show any ultrastructural alterations of the nasal epithelium, tracheal epithelium or epithelium of terminal bronchioles (SOCMA 1980).In a long-term inhalation study restricted to the investigation of effects in the nasal cavity 90-147 male F344 rats per dose were exposed to 0, 0.7, 2, 6, 10, 15 ppm formaldehyde gas 6 h/day, 5 days per week for 24 months. Rats exposed to 0.7 or 2 ppm did not show any histopathological changes in the nasal cavity and no effects on cell proliferation index. Nonneoplastic effects were detected at a dose level of 6 ppm (mixed cell infiltrate, squamous metaplasia, hyperplasia in the anterior part of the nasal cavity) as well as a minimal carcinogenic response (incidence 1/90 versus 0/90 in control). A sharp increase in tumor incidences in the nasal cavity (mainly squamous cell carcinoma) was reported at 10 and 15 ppm. Dose dependent increases on cell proliferation were detected also only at >=10 ppm. In conclusion, inhalation exposure for 2 years induced local effects in the nasal cavity of male F344 rats at a dose level of 6 ppm and clearly carcinogenic effects at 10 ppm; the NOAEC was 2 ppm (Monticello et al., 1996).In the inhalation study of Kamata et al. (1997; reliable with acceptable restrictions concerning local effects) 32 male F344 rats per dose were exposed to 0, 0.3, 2.2, or 15 ppm formaldehyde 6 h/day, 5 days per week for 28 months; 5 rats per dose were sacrificed after 12, 18, or 24 months of exposure (no post exposure observation period). Rats exposed to 0.3 ppm for 28 months did not show any histopathological changes in the nasal cavity. At 2.2 ppm a significant increase was noted in the incidence of squamous cell metaplasia with and without hyperplasia but no carcinogenic effects. Clear carcinogenic effects were noted at a level of 15 ppm but only in the nasal cavity; no tumors were found in non-site-of-contact tissues. There is some evidence that this study is less suitable for deriving a LOAEL (more variable exposure concentrations than in other studies). In summary, inhalation exposure for 28 months induced rats non-neoplastic effects in the respiratory epithelium of the nasal cavity at ≥ 2.2 ppm and neoplastic effects at 15 ppm.In a long-term study comparable to OECD guideline 453 with acceptable restrictions (no histopathology of sternum, larynx and pharynx) the inhalation exposure of male and female F344 rats for 2 years at dose levels of 0, 2, 6, 15 ppm (120 rats per sex per dose; 24 months exposure, 6 h per day, 5 days per week; post exposure period 6 months; interim sacrifices) resulted exclusively in local effects of the nasal cavity and of the proximal trachea in males and females. Only non-neoplastic effects were reported in the high dose group in the proximal trachea but a high incidence in squamous cell carcinomas of the nasal cavity was observed. Carcinogenic effects in the mid dose group (squamous cell carcinomas in nasal cavity) are not of statistical significance but possibly of toxicological relevance. Non-neoplastic effects in the mid dose group like dysplasia and squamous cell metaplasia in the nasal cavity are considered to be treatment related since these effects occurred in more posterior parts or the nasal cavity. At 2 ppm purulent rhinitis, epithelial dysplasia, and squamous metaplasia were present in the anterior part of the nasal cavity. Dysplasia occurred earlier than metaplasia. Generally the location of the histopathological lesions moved from the anterior parts of the nose to more posterior sites with increasing exposure duration and concentration. There is some evidence that effects at the low dose level are less suitable for derivation of a LOAEC due to more variable exposure concentrations than in other studies particularly at the 2 ppm exposure level. In conclusion, clearly carcinogenic effects in the nasal cavity of rats were reported after inhalation exposure to 15 ppm formaldehyde for up to 2 years; local effects in the nasal cavity were found even at a level of 2 ppm. The exposure period of 24 months was followed by 3 months without exposure. At month 27 there was a significant decrease in the incidence of squamous metaplasia at all exposure concentrations regressing predominantly from the more posterior parts of the nose to the anterior sections (CIIT, 1981; Kerns et al. 1983).In this study also B6C3F1 mice were exposed using the same experimental design. Formaldehyde exposure resulted only in local effects in the nasal cavity (males and females), predominantly in the respiratory epithelium; no tumors were seen in other organs. Rhinitis, dysplasia, squamous metaplasia were induced, but also atrophy of olfactory epithelium with increasing exposure periods. Except for reduced body weight no further effects were detected. The NOAEC was 2 ppm and the LOAEC 6 ppm. In contrast to rats only a few tumors were detected in the nasal cavity at 15 ppm. Generally the lesions in mice were less severe than in rats.At 27 months (after a 3 months observation period without exposure) dysplastic epithelial lesions were only present in the 15 ppm group. Squamous metaplasia was not present at this time interval and the low- and intermediate-exposure groups were free of treatment-related effects (CIIT, 1981; Kerns et al. 1983).The NOAEC for systemic effects in these long-term inhalation studies in rats and mice is 15 ppm.Recently a subacute inhalation study in rats at exposure concentrations of 0, 0.7, 2, and 6 ppm up to 3 weeks (6 h/d; 5 d/week) was reported with focus on effects in the nasal cavity including genomic signatures (Andersen et al., 2008). Neither cell proliferation nor histopathological alterations were found in nasal cavity at 0.7 ppm. At 2 ppm a few animals exhibited epithelial hyperplasia that occurred in all animals exposed to 6 ppm. A significantly increased cell proliferation was only found at 6 ppm at the end of the first week (day 5) but not at the end of week 3. This is in line with former studies showing that cell proliferation decreases as exposure duration increases. Microarray analysis was conducted on respiratory epithelium of those nasal sites that receive a high formaldehyde flux corresponding to regions with a high tumor incidence in chronic studies. In microarray studies, no genes were altered at 0.7 ppm. At 2 ppm 15 genes were changed on day 5; 28 genes were changed at 6 ppm on day 5. No genes were changed at 2 ppm at day 15. The majority of changes was observed at 6 ppm. The pattern of gene changes at 2 and 6 ppm, with transient squamous metaplasia at day 5, indicated tissue adaptation and reduced tissue sensitivity by day 15 (compare with Swenberg 1983 a/b & 1986). In an acute part of this study rats were exposed to 15 ppm; in addition a group was included receiving a formaldehyde solution by nasal instillation (40 µLper nostril, 400 mM solution). Both instillation of 400 mM and inhalation of 15 ppm formaldehyde altered many more genes than were affected at 6 ppm. Three times more genes were affected by instillation than by inhalation exposure to 15 ppm. U-shaped dose responses were noted in the acute study for many genes that were also altered at 2 ppm on day 5. On the basis of cellular component gene ontology benchmark dose analysis, the most sensitive changes were for genes associated with extracellular components and plasma membrane. Generally,genomic markers provide, at best, only modestly more sensitive measures of tissue response compared with histology.A summary of other reviewed data on repeated inhalation toxicity is presented in a supporting data record (BfR, 2006).A literature search after the last IUCLID update was carried out up to May 2022.Gelbke et al. (2014, key) assessed the NOAELs/LOAELs for the nose of rats after inhalation for histopathological lesions, cell proliferation, and the formation of polypoid adenomas. A new statistical analysis combined with a detailed review of the studies showed that the LOAEL is >2 ppm for cell proliferation and polypoid adenomas. Polypoid adenomas cannot be considered as pre-stages to the development of squamous cell carcinomas, the predominant tumor type in rats and mice after inhalation of formaldehyde. The NOAEL for histopathological lesions in the upper respiratory tract is 1 ppm but lesions observed at 2 ppm are not pre-stages to tumor development. It is noted that descriptions of histopathological lesions, including polypoid adenomas, in former studies often are insufficient and sometimes do not allow a final decision.Immunological effectsThese investigations warrant a separate consideration because of the known skin sensitisation by formaldehyde and its alleged implication in respiratory sensitisation. In addition, Rager et al. (2014, see Section Genetic toxicity in vitro) analysed miRNA profiles and noted transcriptional changes of mRNAs involved in the immune/inflammation system in response to changes of miRNAs.Sapmaz et al. (2015, supporting) studied the effect of formaldehyde inhalation on humoral immunity in rats (5 and 10 ppm, 8 h/d, 5 d/week over 4 weeks). Exposure significantly increased IgA, IgM, and complement 3 levels in blood and decreased IgG dose dependently starting already at 5 ppm. These findings would need to be supported by an independent experiment.Conclusions on repeated inhalation exposure toxicity:Local effects in the upper respiratory tract were induced after repeated inhalation exposure in experimental animals. It has been shown in rats, mice, and monkeys that the respiratory epithelium in the nasal cavity is the most sensitive site. In rats and monkeys squamous metaplasia and hyperplasia were reported, in mice rhinitis, dysplasia and squamous metaplasia.The LOAEC is 3 ppm in monkeys (NOAEC 1 ppm) and 6 ppm in mice (NOAEC 4 ppm). In rats, however, the LOAEC was considered to be 2 ppm (CIIT, 1981; Kamata et al., 1997), although this dose level was the NOAEC in other studies (Monticello et al., 1991; Wilmer et al., 1989; Monticello et al., 1996). These contradictory results most probably related to differences in the accuracy of constant exposure concentrations because formaldehyde induced lesions are predominantly concentration dependent and thereby fluctuations in concentration may become important, such as observed in the CIIT study.Using the same experimental design mice are less sensitive than rats (CIIT, 1981); this might be related to the lower RD50 value in mice compared to rats (Section Actute Toxicity: inhalation) leading to a decreased minute volume for mice.In chronic studies with rats as well as in subacute studies with only a few days duration (measuring cell proliferation; see supporting data record BfR, 2006) or weeks duration (measuring epithelial lesions; see data above) the NOAEC was the same range as that in long term studies. Effects were noted in the respiratory epithelium at a concentration of 2 ppm. At dose levels above the LOAEL the severity of the lesion in respiratory epithelium increased with the concentration and the duration of the exposure period (cf. Monticello et al., 1991).However, studies in rats (using the constant concentration x exposure duration) revealed that the concentration rather than the “total dose” is responsible for the effects (Wilmer et al., 1989). At high dose levels (10-20 ppm) no complete reversibility of lesions in the nasal cavity was reported in rats after 13 weeks of exposure and a post exposure observation period of up to 126 weeks (Feron et al., 1988; see supporting data record BfR, 2006). Not only the anterior part of the nasal cavity but also more proximal parts of the upper respiratory tract were affected with increasing formaldehyde concentrations in rats and mice (e.g. CIIT, 1981; Maronpot et al., 1986): olfactory epithelium, larynx, trachea, and bronchus. Increase in toxicity and severity is not linear but shows a sharp increase at 6-10 ppm. By microarray analysis no significant gene changes were observed at 0.7 ppm and minimal changes at 2 ppm only on day 5 that had returned to control level at day 15.The majority of changes were found at 6 ppm (highest exposure level for repeated exposure). However, authors concluded that genomic markers provide, at best, only modestly more sensitive measures of tissue response compared with histology (Andersen et al., 2008).Related to the studies described above the overall NOAEC for non-neoplastic tissue changes based on chronic studies with rats, mice, hamsters and monkeys is 1 ppm. corresponding to 1.2 mg/m³.A detailed review of former studies in rats confirmed that the NOAEL for regenerative cell proliferation is between 2 and 6 ppm and for histopathological lesions 1 ppm. Lesions observed at 2 ppm are not prestages to tumor development. Also the polypoid adenomas observed in some inhalation studies are not prestages to squamous cell carcinomas, the most prominent tumor type observed in the nose.In the recent literature several non-guideline studies report lesions in the lower respiratory tract, in other organs apart from the respiratory tract, or claim indications for immunological effects. The evidence reported in these studies has to be weighed against findings in former guideline studies up to 2 years of exposure with large number of experimental animals, none of which gave indications for lesions apart from the nose. Therefore, by weighting the validity of the different studies, the conclusion is still upheld that formaldehyde inhalation will only lead to lesions in the upper respiratory tract.Studies reporting immunological effects may warrant a separate evaluation because of the known skin sensitising properties of formaldehyde and indications that formaldehyde inhalation may lead to transcriptional changes by miRNA involved in the immune system. However, the majority of these non-guideline studies had to be disregarded due to missing dose response relationships, investigation of tissues far of the portal of entry, irrelevant exposure routes, or unclear exposure concentrations.Effects in humans occupationally exposed via inhalation (supporting data record BfR, 2006): There is some evidence from a number of studies that formaldehyde exposure may also induce squamous cell metaplasia and hyperplasia in the respiratory epithelium of the nasal cavity in long-term exposed humans. However, the data base is not sufficient for conclusions on dose or time response relationships. None of the studies were conducted with sufficient methodological accuracy and no firm conclusion can be drawn (WHO, 2002; BfR, 2006).Chronic respiratory effects of indoor formaldehyde exposures reported by  Krzyzanowski et al. 1990 were amongst other publications reviewed by the German UBA. Recently, German UBA (2016) performed a comprehensive review of epidemiological studies investigating the association between formaldehyde exposure and the induction or exacerbation of asthma in children including several of the studies mentioned above. UBA concluded that there is no clear association between formaldehyde exposure in the indoor environment and asthma in children. It was stated that the above mentioned epidemiological studies (e.g. Krzyzanowski et al., 1990; Annesi-Maesano et al. 2012 etc.) suffer from small sample size, implausible formaldehyde concentrations, and the fact that other substances or factors initiating asthma and asthma-like complaints were not adequately considered. Results derived from controlled human exposure studies as well as animal experiments support their opinion. It should also be noted that the Krzyzanowski et al. (1990) findings are inherently limited by the cross-sectional nature of their study and found that the study design is not sufficiently described in the published report.In the literature search up to April 20, 2015, following the last IUCLID update an epidemiological study was identified unrelated to potential cancer risks. Pinkerton et al. (2013, supporting) assessed mortality from amyotrophic lateral sclerosis (ALS) in a cohort of formaldehyde exposed garment workers that had already been studies for cancer incidence rates by Pinkerton et al. (2004), and Meyers et al. (2013). In their introduction they referred to two former studies related to ALS. The large American Cancer Society’s Cancer Prevention Study II cohort comprised about 1 million subjects with 22 exposed cases and 1120 unexposed. The rate ratio for self-reported formaldehyde exposure was 2.47 (95% CI 1.58, 3.86). The rate ratios were strongly associated with exposure duration. Reliance on self-reported exposure was a mojor limitation with no information on exposure frequency or intensity (Weisskopf et al., 2009). In a case control study with 109 cases and 253 controls, formaldehyde exposure inferred from occupation was not associated with ALS (Fang F, Quiulan P, Ye W, Bumer MK, Umbach DM,Sandler DP,et al. Work place exposures and the risk of amyotrophic lateral sclerosis. Environ Health Perspect,2009;117:1387-92). The study of Pinkerton et al. (2013) comprised 11098 employees exposed to formaldehyde for at least for 3 months. In the early 1980s the overall geometric mean formaldehyde concentration was 0.15 ppm. In total 8 ALS cases were observed with a SMR of 0.89 (95% CI 0.38, 1.75). No association for ALS with formaldehyde exposure was found when analysed for year of first exposure, duration of exposure, or time since first exposure. The main limitations of this study are the small number of cases and the low exposure levels.", + "subsections": [ + { + "label": "Attached background material" + } + ] + } + ] + } +} \ No newline at end of file diff --git a/echa_example2.json b/echa_example2.json new file mode 100644 index 0000000..a2de720 --- /dev/null +++ b/echa_example2.json @@ -0,0 +1,947 @@ +{ + "_id": { + "$oid": "6923609db2339f52631f60fd" + }, + "substance": { + "rmlCas": "56-81-5", + "rmlId": "100.000.263", + "rmlEc": "200-289-5", + "rmlName": "Glycerol" + }, + "dossier_info": { + "lastUpdatedDate": "2022-09-14", + "registrationStatus": "Active", + "registrationStatusChangedDate": "2010-08-23", + "registrationRole": "Lead (joint submission)", + "assetExternalId": "3b5de1db-9033-4e96-9022-c68ca931d367", + "rootKey": "IUC5-6e7c951c-5670-46f1-adba-006d4fa0d3f2_fa0793fe-428d-4286-b96d-4b97c5dc72fe" + }, + "index": { + "toxicological_information_link": "https://chem.echa.europa.eu/html-pages-prod/3b5de1db-9033-4e96-9022-c68ca931d367/documents/aec04834-0acf-4132-b6c8-9273ad6c6bbd_fa0793fe-428d-4286-b96d-4b97c5dc72fe.html", + "repeated_dose_toxicity_link": "https://chem.echa.europa.eu/html-pages-prod/3b5de1db-9033-4e96-9022-c68ca931d367/documents/IUC5-6a907739-cd5e-4fcf-9949-e31a6ed6fde5_fa0793fe-428d-4286-b96d-4b97c5dc72fe.html", + "acute_toxicity_link": "https://chem.echa.europa.eu/html-pages-prod/3b5de1db-9033-4e96-9022-c68ca931d367/documents/IUC5-600a9e6c-7f74-4855-97e8-92c31ebbeec2_fa0793fe-428d-4286-b96d-4b97c5dc72fe.html" + }, + "toxicological_information": { + "sections": [ + { + "label": "Administrative data" + }, + { + "label": "Workers - Hazard via inhalation route", + "subsections": [ + { + "label": "Systemic effects", + "subsections": [ + { + "label": "Long term exposure", + "HazardAssessment": "no hazard identified", + "StDose": "", + "MostSensitiveEndpoint": "", + "subsections": [ + { + "label": "DNEL related information", + "DerivationMethod": "", + "AssessmentFactor": "", + "DoseDescriptorStartingPoint": "", + "StDose": "", + "DoseDescriptorStartRTR": "", + "StDoseRTR": "", + "JustificationRTR": "", + "DoseResponseAF": "", + "DoseResponseJustif": "", + "DiffInDurationAF": "", + "DiffInDurationJustif": "", + "InterspeciesAF": "", + "InterspeciesJustif": "", + "OthInterspeciesAF": "", + "OthInterspeciesJustif": "", + "IntraspeciesAF": "", + "IntraspeciesJustif": "", + "DatabaseQualityAF": "", + "DatabaseJustif": "", + "OthUncertaintiesAF": "", + "OthUncertaintiesJustif": "" + }, + { + "label": "Explanation for hazard conclusion" + } + ] + }, + { + "label": "Acute/short term exposure", + "HazardAssessment": "no hazard identified", + "StDose": "", + "MostSensitiveEndpoint": "", + "subsections": [ + { + "label": "DNEL related information", + "DerivationMethod": "", + "OverallAssessmentFactor": "", + "Extrapolated": false, + "DoseDescriptorStartingPoint": "", + "StDose": "", + "DoseDescriptorStartRTR": "", + "StDoseRTR": "", + "DoseDescriptorJustificationRTR": "", + "DoseResponseAF": "", + "DoseResponseJustif": "", + "InterspeciesAF": "", + "InterspeciesJustif": "", + "OthInterspeciesAF": "", + "OthInterspeciesJustif": "", + "IntraspeciesAF": "", + "IntraspeciesJustifAF": "", + "DatabaseQualityDatabaseQualityAF": "", + "DatabaseQualityJustif": "", + "OthUncertaintiesAF": "", + "UncertaintiesJustif": "" + }, + { + "label": "Explanation for hazard conclusion" + } + ] + } + ] + }, + { + "label": "Local effects", + "subsections": [ + { + "label": "Long term exposure", + "HazardAssessment": "no hazard identified", + "StDose": "", + "MostSensitiveEndpoint": "", + "subsections": [ + { + "label": "DNEL related information", + "DerivationMethod": "", + "AssessmentFactor": "", + "DoseDescriptorStart": "", + "StDose": "", + "DoseResponseAF": "", + "DoseResponseJustif": "", + "DiffInDurationAF": "", + "DiffInDurationJustif": "", + "InterspeciesAF": "", + "InterspeciesJustif": "", + "OthInterspeciesAF": "", + "OthInterspeciesJustif": "", + "IntraspeciesAF": "", + "IntraspeciesJustif": "", + "DatabaseQualityAF": "", + "DatabaseJustif": "", + "OthUncertaintiesAF": "", + "OthUncertaintiesJustif": "" + }, + { + "label": "Explanation for hazard conclusion" + } + ] + }, + { + "label": "Acute/short term exposure", + "HazardAssessment": "no hazard identified", + "StDose": "", + "MostSensitiveEndpoint": "", + "subsections": [ + { + "label": "DNEL related information", + "DerivationMethod": "", + "OverallAssessmentFactor": "", + "Extrapolated": false, + "DoseDescriptorStart": "", + "StDose": "", + "DoseResponseAF": "", + "DoseResponseJustif": "", + "InterspeciesAF": "", + "InterspeciesJustif": "", + "OthInterspeciesAF": "", + "OthInterspeciesJustif": "", + "IntraspeciesAF": "", + "IntraspeciesJustifAF": "", + "DatabaseQualityDatabaseQualityAF": "", + "DatabaseQualityJustif": "", + "OthUncertaintiesAF": "", + "UncertaintiesJustif": "" + }, + { + "label": "Explanation for hazard conclusion" + } + ] + } + ] + } + ] + }, + { + "label": "Workers - Hazard via dermal route", + "subsections": [ + { + "label": "Systemic effects", + "subsections": [ + { + "label": "Long term exposure", + "HazardAssessment": "no hazard identified", + "StDose": "", + "MostSensitiveEndpoint": "", + "subsections": [ + { + "label": "DNEL related information", + "DerivationMethod": "", + "AssessmentFactor": "", + "DoseDescriptorStartingPoint": "", + "StDose": "", + "DoseDescriptorStartRTR": "", + "StDoseRTR": "", + "JustificationRTR": "", + "DoseResponseAF": "", + "DoseResponseJustif": "", + "DiffInDurationAF": "", + "DiffInDurationJustif": "", + "InterspeciesAF": "", + "InterspeciesJustif": "", + "OthInterspeciesAF": "", + "OthInterspeciesJustif": "", + "IntraspeciesAF": "", + "IntraspeciesJustif": "", + "DatabaseQualityAF": "", + "DatabaseJustif": "", + "OthUncertaintiesAF": "", + "OthUncertaintiesJustif": "" + }, + { + "label": "Explanation for hazard conclusion" + } + ] + }, + { + "label": "Acute/short term exposure", + "HazardAssessment": "no hazard identified", + "StDose": "", + "MostSensitiveEndpoint": "", + "subsections": [ + { + "label": "DNEL related information", + "DerivationMethod": "", + "OverallAssessmentFactor": "", + "Extrapolated": false, + "DoseDescriptorStartingPoint": "", + "StDose": "", + "DoseDescriptorStartRTR": "", + "StDoseRTR": "", + "DoseDescriptorJustificationRTR": "", + "DoseResponseAF": "", + "DoseResponseJustif": "", + "InterspeciesAF": "", + "InterspeciesJustif": "", + "OthInterspeciesAF": "", + "OthInterspeciesJustif": "", + "IntraspeciesAF": "", + "IntraspeciesJustifAF": "", + "DatabaseQualityDatabaseQualityAF": "", + "DatabaseQualityJustif": "", + "OthUncertaintiesAF": "", + "UncertaintiesJustif": "" + }, + { + "label": "Explanation for hazard conclusion" + } + ] + } + ] + }, + { + "label": "Local effects", + "subsections": [ + { + "label": "Long term exposure", + "HazardAssessment": "no hazard identified", + "StDose": "", + "MostSensitiveEndpoint": "", + "subsections": [ + { + "label": "DNEL related information", + "DerivationMethod": "", + "AssessmentFactor": "", + "DoseDescriptorStart": "", + "StDose": "", + "DoseResponseAF": "", + "DoseResponseJustif": "", + "DiffInDurationAF": "", + "DiffInDurationJustif": "", + "InterspeciesAF": "", + "InterspeciesJustif": "", + "OthInterspeciesAF": "", + "OthInterspeciesJustif": "", + "IntraspeciesAF": "", + "IntraspeciesJustif": "", + "DatabaseQualityAF": "", + "DatabaseJustif": "", + "OthUncertaintiesAF": "", + "OthUncertaintiesJustif": "" + }, + { + "label": "Explanation for hazard conclusion" + } + ] + }, + { + "label": "Acute/short term exposure", + "HazardAssessment": "no hazard identified", + "StDose": "", + "MostSensitiveEndpoint": "", + "subsections": [ + { + "label": "DNEL related information", + "DerivationMethod": "", + "OverallAssessmentFactor": "", + "DoseDescriptorStart": "", + "StDose": "", + "DoseResponseAF": "", + "DoseResponseJustif": "", + "InterspeciesAF": "", + "InterspeciesJustif": "", + "OthInterspeciesAF": "", + "OthInterspeciesJustif": "", + "IntraspeciesAF": "", + "IntraspeciesJustifAF": "", + "DatabaseQualityDatabaseQualityAF": "", + "DatabaseQualityJustif": "", + "OthUncertaintiesAF": "", + "UncertaintiesJustif": "" + }, + { + "label": "Explanation for hazard conclusion" + } + ] + } + ] + } + ] + }, + { + "label": "Workers - Hazard for the eyes", + "subsections": [ + { + "label": "Local effects", + "Conclusion": "no hazard identified" + } + ] + }, + { + "label": "Additional information - workers", + "DiscussionWorkers": "All NOAEL values are above the limit dose given in the OECD Test Guidelines thus derivation of DNELs is not justified.The only effect below a limit dose was the metaplasia of the squamous epithelium of the larynx seen in rats at 662 mg/m3 which was only minimal to slight, and thus is not interpreted as adverse." + }, + { + "label": "General Population - Hazard via inhalation route", + "subsections": [ + { + "label": "Systemic effects", + "subsections": [ + { + "label": "Long term exposure", + "HazardAssessment": "no hazard identified", + "StDose": "", + "MostSensitiveEndpoint": "", + "subsections": [ + { + "label": "DNEL related information", + "DerivationMethod": "", + "AssessmentFactor": "", + "DoseDescriptorStartingPoint": "", + "StDose": "", + "DoseDescriptorStartRTR": "", + "StDoseRTR": "", + "JustificationRTR": "", + "DoseResponseAF": "", + "DoseResponseJustif": "", + "DiffInDurationAF": "", + "DiffInDurationJustif": "", + "InterspeciesAF": "", + "InterspeciesJustif": "", + "OthInterspeciesAF": "", + "OthInterspeciesJustif": "", + "IntraspeciesAF": "", + "IntraspeciesJustif": "", + "DatabaseQualityAF": "", + "DatabaseJustif": "", + "OthUncertaintiesAF": "", + "OthUncertaintiesJustif": "" + }, + { + "label": "Explanation for hazard conclusion" + } + ] + }, + { + "label": "Acute/short term exposure", + "HazardAssessment": "no hazard identified", + "StDose": "", + "MostSensitiveEndpoint": "", + "subsections": [ + { + "label": "DNEL related information", + "DerivationMethod": "", + "OverallAssessmentFactor": "", + "Extrapolated": false, + "DoseDescriptorStartingPoint": "", + "StDose": "", + "DoseDescriptorStartRTR": "", + "StDoseRTR": "", + "DoseDescriptorJustificationRTR": "", + "DoseResponseAF": "", + "DoseResponseJustif": "", + "InterspeciesAF": "", + "InterspeciesJustif": "", + "OthInterspeciesAF": "", + "OthInterspeciesJustif": "", + "IntraspeciesAF": "", + "IntraspeciesJustifAF": "", + "DatabaseQualityDatabaseQualityAF": "", + "DatabaseQualityJustif": "", + "OthUncertaintiesAF": "", + "UncertaintiesJustif": "" + }, + { + "label": "Explanation for hazard conclusion" + } + ] + } + ] + }, + { + "label": "Local effects", + "subsections": [ + { + "label": "Long term exposure", + "HazardAssessment": "no hazard identified", + "StDose": "", + "MostSensitiveEndpoint": "", + "subsections": [ + { + "label": "DNEL related information", + "DerivationMethod": "", + "AssessmentFactor": "", + "DoseDescriptorStart": "", + "StDose": "", + "DoseResponseAF": "", + "DoseResponseJustif": "", + "DiffInDurationAF": "", + "DiffInDurationJustif": "", + "InterspeciesAF": "", + "InterspeciesJustif": "", + "OthInterspeciesAF": "", + "OthInterspeciesJustif": "", + "IntraspeciesAF": "", + "IntraspeciesJustif": "", + "DatabaseQualityAF": "", + "DatabaseJustif": "", + "OthUncertaintiesAF": "", + "OthUncertaintiesJustif": "" + }, + { + "label": "Explanation for hazard conclusion" + } + ] + }, + { + "label": "Acute/short term exposure", + "HazardAssessment": "no hazard identified", + "StDose": "", + "MostSensitiveEndpoint": "", + "subsections": [ + { + "label": "DNEL related information", + "DerivationMethod": "", + "OverallAssessmentFactor": "", + "Extrapolated": false, + "DoseDescriptorStart": "", + "StDose": "", + "DoseResponseAF": "", + "DoseResponseJustif": "", + "InterspeciesAF": "", + "InterspeciesJustif": "", + "OthInterspeciesAF": "", + "OthInterspeciesJustif": "", + "IntraspeciesAF": "", + "IntraspeciesJustifAF": "", + "DatabaseQualityDatabaseQualityAF": "", + "DatabaseQualityJustif": "", + "OthUncertaintiesAF": "", + "UncertaintiesJustif": "" + }, + { + "label": "Explanation for hazard conclusion" + } + ] + } + ] + } + ] + }, + { + "label": "General Population - Hazard via dermal route", + "subsections": [ + { + "label": "Systemic effects", + "subsections": [ + { + "label": "Long term exposure", + "HazardAssessment": "no hazard identified", + "StDose": "", + "MostSensitiveEndpoint": "", + "subsections": [ + { + "label": "DNEL related information", + "DerivationMethod": "", + "AssessmentFactor": "", + "DoseDescriptorStartingPoint": "", + "StDose": "", + "DoseDescriptorStartRTR": "", + "StDoseRTR": "", + "JustificationRTR": "", + "DoseResponseAF": "", + "DoseResponseJustif": "", + "DiffInDurationAF": "", + "DiffInDurationJustif": "", + "InterspeciesAF": "", + "InterspeciesJustif": "", + "OthInterspeciesAF": "", + "OthInterspeciesJustif": "", + "IntraspeciesAF": "", + "IntraspeciesJustif": "", + "DatabaseQualityAF": "", + "DatabaseJustif": "", + "OthUncertaintiesAF": "", + "OthUncertaintiesJustif": "" + }, + { + "label": "Explanation for hazard conclusion" + } + ] + }, + { + "label": "Acute/short term exposure", + "HazardAssessment": "no hazard identified", + "StDose": "", + "MostSensitiveEndpoint": "", + "subsections": [ + { + "label": "DNEL related information", + "DerivationMethod": "", + "OverallAssessmentFactor": "", + "Extrapolated": false, + "DoseDescriptorStartingPoint": "", + "StDose": "", + "DoseDescriptorStartRTR": "", + "StDoseRTR": "", + "DoseDescriptorJustificationRTR": "", + "DoseResponseAF": "", + "DoseResponseJustif": "", + "InterspeciesAF": "", + "InterspeciesJustif": "", + "OthInterspeciesAF": "", + "OthInterspeciesJustif": "", + "IntraspeciesAF": "", + "IntraspeciesJustifAF": "", + "DatabaseQualityDatabaseQualityAF": "", + "DatabaseQualityJustif": "", + "OthUncertaintiesAF": "", + "UncertaintiesJustif": "" + }, + { + "label": "Explanation for hazard conclusion" + } + ] + } + ] + }, + { + "label": "Local effects", + "subsections": [ + { + "label": "Long term exposure", + "HazardAssessment": "no hazard identified", + "StDose": "", + "MostSensitiveEndpoint": "", + "subsections": [ + { + "label": "DNEL related information", + "DerivationMethod": "", + "AssessmentFactor": "", + "DoseDescriptorStart": "", + "StDose": "", + "DoseResponseAF": "", + "DoseResponseJustif": "", + "DiffInDurationAF": "", + "DiffInDurationJustif": "", + "InterspeciesAF": "", + "InterspeciesJustif": "", + "OthInterspeciesAF": "", + "OthInterspeciesJustif": "", + "IntraspeciesAF": "", + "IntraspeciesJustif": "", + "DatabaseQualityAF": "", + "DatabaseJustif": "", + "OthUncertaintiesAF": "", + "OthUncertaintiesJustif": "" + }, + { + "label": "Explanation for hazard conclusion" + } + ] + }, + { + "label": "Acute/short term exposure", + "HazardAssessment": "no hazard identified", + "StDose": "", + "MostSensitiveEndpoint": "", + "subsections": [ + { + "label": "DNEL related information", + "DerivationMethod": "", + "OverallAssessmentFactor": "", + "DoseDescriptorStart": "", + "StDose": "", + "DoseResponseAF": "", + "DoseResponseJustif": "", + "InterspeciesAF": "", + "InterspeciesJustif": "", + "OthInterspeciesAF": "", + "OthInterspeciesJustif": "", + "IntraspeciesAF": "", + "IntraspeciesJustifAF": "", + "DatabaseQualityDatabaseQualityAF": "", + "DatabaseQualityJustif": "", + "OthUncertaintiesAF": "", + "UncertaintiesJustif": "" + }, + { + "label": "Explanation for hazard conclusion" + } + ] + } + ] + } + ] + }, + { + "label": "General Population - Hazard via oral route", + "subsections": [ + { + "label": "Systemic effects", + "subsections": [ + { + "label": "Long term exposure", + "HazardAssessment": "no hazard identified", + "StDose": "", + "MostSensitiveEndpoint": "", + "subsections": [ + { + "label": "DNEL related information", + "DerivationMethod": "", + "AssessmentFactor": "", + "DoseDescriptorStartingPoint": "", + "StDose": "", + "DoseDescriptorStartRTR": "", + "StDoseRTR": "", + "JustificationRTR": "", + "DoseResponseAF": "", + "DoseResponseJustif": "", + "DiffInDurationAF": "", + "DiffInDurationJustif": "", + "InterspeciesAF": "", + "InterspeciesJustif": "", + "OthInterspeciesAF": "", + "OthInterspeciesJustif": "", + "IntraspeciesAF": "", + "IntraspeciesJustif": "", + "DatabaseQualityAF": "", + "DatabaseJustif": "", + "OthUncertaintiesAF": "", + "OthUncertaintiesJustif": "" + }, + { + "label": "Explanation for hazard conclusion" + } + ] + }, + { + "label": "Acute/short term exposure", + "HazardAssessment": "no hazard identified", + "StDose": "", + "MostSensitiveEndpoint": "", + "subsections": [ + { + "label": "DNEL related information", + "DerivationMethod": "", + "OverallAssessmentFactor": "", + "Extrapolated": false, + "DoseDescriptorStartingPoint": "", + "StDose": "", + "DoseDescriptorStartRTR": "", + "StDoseRTR": "", + "DoseDescriptorJustificationRTR": "", + "DoseResponseAF": "", + "DoseResponseJustif": "", + "InterspeciesAF": "", + "InterspeciesJustif": "", + "OthInterspeciesAF": "", + "OthInterspeciesJustif": "", + "IntraspeciesAF": "", + "IntraspeciesJustifAF": "", + "DatabaseQualityDatabaseQualityAF": "", + "DatabaseQualityJustif": "", + "OthUncertaintiesAF": "", + "UncertaintiesJustif": "" + }, + { + "label": "Explanation for hazard conclusion" + } + ] + } + ] + } + ] + }, + { + "label": "General Population - Hazard for the eyes", + "subsections": [ + { + "label": "Local effects", + "Conclusion": "no hazard identified" + } + ] + }, + { + "label": "Additional information - General Population", + "DiscussionGenPop": "All NOAEL values are above the limit dose given in the OECD Test Guidelines thus derivation of DNELs is not justified.The only effect below a limit dose was the metaplasia of the squamous epithelium of the larynx seen in rats at 662 mg/m3 which was only minimal to slight, and thus is not interpreted as adverse." + } + ] + }, + "acute_toxicity": { + "sections": [ + { + "label": "Administrative data" + }, + { + "label": "Description of key information", + "KeyInformation": "The acute oral LD50 was determined in three species, rat, mice and guinea pigs. In all three species the oral LD50 was >/= 11,500 mg/kg.The acute dermal toxicity of glycerin was examined in guinea pigs.The dermal LD50 was determined to be 45 ml/kg (56,750 mg/kg) in guinea pigs.In an inhalation study, rats were exposed to aerosol from test material at targeted concentrations of 1.0,2.0,or4.0mg glycerol/L for 6 hours. The 4 h inhalation LC50 was determined to be above 5.85 mg/L in rats." + }, + { + "label": "Key value for assessment", + "subsections": [ + { + "label": "Acute toxicity: via oral route", + "LinkToRelevantStudyRecord": "", + "EndpointConclusion": "no adverse effect observed", + "EffectLevelUnit": "LD50", + "EffectLevelValue": "11,500mg/kg bw" + }, + { + "label": "Acute toxicity: via dermal route", + "LinkToRelevantStudyRecord": "", + "EndpointConclusion": "no adverse effect observed", + "EffectLevelUnit": "LD50", + "EffectLevelValue": "56,750mg/kg bw" + }, + { + "label": "Acute toxicity: via inhalation route", + "LinkToRelevantStudyRecord": "", + "EndpointConclusion": "no adverse effect observed", + "EffectLevelUnit": "LC50", + "EffectLevelValue": ">5.85mg/L", + "PhysicalForm": "inhalation: aerosol" + }, + { + "label": "Acute toxicity: other routes", + "LinkToRelevantStudyRecord": "" + } + ] + }, + { + "label": "Justification for classification or non-classification", + "JustifClassif": "There is no justification for classification based on data from available studies.", + "JustifClassif_STOTSE": "" + }, + { + "label": "Additional information", + "Discussion": "Glycerol is essentially non-toxic following acute administration.In the available evaluations performed by official bodies (MAK 2007, OECD 2002, EFSA 2017) a number of additional acute toxicity studies were evaluated and summarised.All considered glycerol to be of low acute toxicity to mammals. The range of acute oral LD50 values derived from studies in experimental animals is between >4,000 and < 38,000 mg/kg, with the majority of values being between 23,000 and 38,000 mg/kg. For acute dermal toxicity a single LD50 of >18,700 mg/kg for rabbits was summarised by the OECD. The low level of acute toxicity in rodents is further supported by the results of the Danish (Q)SAR Database (LD50 rat oral 7500 mg/kg, LD50 mouse oral 13,000 mg/kg). There was no new relevant information identified up to and including 2021 (most recent literature research).(Q)SAR predicted profile for glycerol CAS -Nr 56-81-5, Danish (Q)SAR Database, http://qsar.food.dtu.dk Date: 09-02-2021Glycerin [MAK Value Documentation in German language, 2007]Re-evaluation of glycerol (E 422) as a food additive, EFSA Journal 2017;15(3):4720Glycerol, CAS Number 56-81-5, OECD SIDS Initial Assessment Report For SIAM 14 Paris, France, 26-28 March 2002", + "subsections": [ + { + "label": "Attached background material" + } + ] + } + ] + }, + "repeated_dose_toxicity": { + "sections": [ + { + "label": "Administrative data" + }, + { + "label": "Description of key information", + "KeyInformation": "In the best available dietary study, groups of 22 rats (Long-Evans)/sex/treatment received 5, 10 and 20% glycerol (natural or synthetic) in their diet (males 2000, 4000 and 8000 mg/kg bw; females 2500, 5000 and 10000 mg/kg bw) for 2 years. Although the results were not described in detail, based on this limited dietary study it can be concluded that no adverse effects were observed at up to 10,000 mg/kg bw.The effect of glycerine following administration for 90 days in a subchronic toxicity study was examined.  Rats fed 5 or 20% glycerine in the diet for 90 days gained weight at a faster rate than control animals. There were no adverse treatment related effects noted in male or female rats fed 5% glycerine in the diet.  In the male rats which received 20 percent glycerine, there was an increase in the final liver/body weight ratio and upon microscopic examination generalized cloudy swelling and hypertrophy of the parenchymal cells was observed. The only effect in the female rats on this level was some generalized cloudy selling upon microscopic examination of the liver.  A 5% glycerol in the diet corresponded to 4580 and 6450 mg/kg/day for male and female rats, respectively, after 4 weeks and a 20% glycerol in the diet corresponded to 18,750 and 25,800 mg/kg/day for male and female rats, respectively, after 4 weeks.A number of other studies have been incorporated in the dossier. These studies are considered less reliable indicators of the systemic effects of glycerol following repeated administration, mainly because of limited toxicity assessments and/or deficient experimental design. The effects they do report are consistent with those observed in the key studies and as such they may contribute to the overall assessment of toxicity of glycerol.The effects following repeated dermal application of glycerin was examined. There were no effects noted in rabbits dosed 8 hours/day, 5 days/week for 45 weeks with dose levels as high as 4.0 ml/kg.  Using a density of 1.2611 g/cm3 at 20 °C, a dose of 4.0 ml/kg corresponds to 5040 mg/kg/day.The subchronic toxicity of glycerol was examined following aerosol exposure. The NOAEC for local and systemic toxicity was 622 mg/m3.Migrated Data from field(s) Field \"Quality of whole database\" (Path: ENDPOINT_SUMMARY.RepeatedDoseToxicity.KeyValueForChemicalSafetyAssessment.RepeatedDoseToxicityInhalationLocalEffects.EndpointConclusion.DataBaseQuality): The available information meets the information requirements under REACH Field \"Quality of whole database\" (Path: ENDPOINT_SUMMARY.RepeatedDoseToxicity.KeyValueForChemicalSafetyAssessment.RepeatedDoseToxicityInhalationSystemicEffects.EndpointConclusion.DataBaseQuality): The available information meets the information requirements under REACH" + }, + { + "label": "Key value for assessment", + "ToxicEffectType": "", + "EndpointConclusionSystemicEffectsOralRoute": "no adverse effect observed", + "EndpointConclusionSystemicEffectsDermal": "no adverse effect observed", + "EndpointConclusionSystemicEffectsInhalation": "", + "subsections": [ + { + "label": "Short-term repeated dose toxicity – systemic effects", + "subsections": [ + { + "label": "Oral route", + "LinkToRelevantStudyRecord": "", + "EffectLevelUnit": "", + "EffectLevelValue": "", + "ExperimentalExposureTimePerWeek": "", + "Species": "", + "System": "", + "Organ": "" + }, + { + "label": "Dermal", + "LinkToRelevantStudyRecord": "", + "EffectLevelUnit": "", + "EffectLevelValue": "", + "ExperimentalExposureTimePerWeek": "", + "Species": "", + "System": "", + "Organ": "" + }, + { + "label": "Inhalation", + "LinkToRelevantStudyRecord": "", + "EffectLevelUnit": "", + "EffectLevelValue": "", + "ExperimentalExposureTimePerWeek": "", + "Species": "", + "System": "", + "Organ": "" + } + ] + }, + { + "label": "Sub-chronic toxicity – systemic effects", + "subsections": [ + { + "label": "Oral route", + "LinkToRelevantStudyRecord": "", + "EffectLevelUnit": "", + "EffectLevelValue": "", + "ExperimentalExposureTimePerWeek": "", + "Species": "", + "System": "", + "Organ": "" + }, + { + "label": "Dermal", + "LinkToRelevantStudyRecord": "", + "EffectLevelUnit": "NOAEL", + "EffectLevelValue": "5,040mg/kg bw/day", + "ExperimentalExposureTimePerWeek": "", + "Species": "rabbit", + "System": "", + "Organ": "" + }, + { + "label": "Inhalation", + "LinkToRelevantStudyRecord": "001 | Key | Experimental study", + "EffectLevelUnit": "NOAEC", + "EffectLevelValue": "622mg/m³", + "ExperimentalExposureTimePerWeek": "", + "Species": "rat", + "System": "", + "Organ": "" + } + ] + }, + { + "label": "Chronic toxicity – systemic effects", + "subsections": [ + { + "label": "Oral route", + "LinkToRelevantStudyRecord": "002 | Key | Experimental study001 | Key | Experimental study", + "EffectLevelUnit": "NOAEL", + "EffectLevelValue": "10,000mg/kg bw/day", + "ExperimentalExposureTimePerWeek": "", + "Species": "rat", + "System": "", + "Organ": "" + }, + { + "label": "Dermal", + "LinkToRelevantStudyRecord": "", + "EffectLevelUnit": "", + "EffectLevelValue": "", + "ExperimentalExposureTimePerWeek": "", + "Species": "", + "System": "", + "Organ": "" + }, + { + "label": "Inhalation", + "LinkToRelevantStudyRecord": "", + "EffectLevelUnit": "", + "EffectLevelValue": "", + "ExperimentalExposureTimePerWeek": "", + "Species": "", + "System": "", + "Organ": "" + } + ] + }, + { + "label": "Repeated dose toxicity – local effects", + "subsections": [ + { + "label": "Dermal", + "LinkToRelevantStudyRecord": "", + "EndpointConclusion": "", + "EffectLevelUnit": "", + "EffectLevelValue": "", + "TestType": "", + "Species": "" + }, + { + "label": "Inhalation", + "LinkToRelevantStudyRecord": "003 | Other | Other result type001 | Key | Experimental study", + "EndpointConclusion": "no adverse effect observed", + "EffectLevelUnit": "NOAEC", + "EffectLevelValue": "662mg/m³", + "TestType": "subchronic", + "Species": "rat" + } + ] + }, + { + "label": "Repeated dose toxicity: other routes", + "LinkToRelevantStudyRecord": "" + } + ] + }, + { + "label": "Mode of Action Analysis / Human Relevance Framework", + "ModeOfActionAnalysis": "" + }, + { + "label": "Justification for classification or non-classification (Specific target organ toxicity-repeated exposure (STOT RE))", + "JustifClassif": "There is no justification for classification based on data from available studies." + }, + { + "label": "Additional information", + "Discussion": "Study via the dietary, dermal and respiratory route demonstrate the low level of concern about glycerol.In the available evaluations performed by official bodies (MAK 2007, OECD 2002, EFSA 2017) a number of additional repeated dose toxicity studies were evaluated and summarised.Repeated dose toxicity oralIn the OECD SIDS document the study reported by Hine et al. was identified as the most relevant key study. This study is included in the REACH dossier in detail as RSS.A number of other studies have been incorporated in a table in the OECD SIDS document. These studies are considered less reliable indicators of the systemic effects of glycerol following repeated administration, mainly because of limited toxicity assessments and/or deficient experimental design. The effects they do report are consistent with those observed in the key studies and as such they may contribute to the overall assessment of toxicity of glycerol.EFSA conclusion: Short-term or subchronic studies were not performed according to current test guidelines. In a subchronic toxicity study (in drinking water) in rats, the effects reported were observed with doses in the range of the LD50 for glycerol. The Panel considered that the local irritating effects of glycerol in the gastrointestinal tract reported in some gavage studies in rat (100% glycerol at 2,800 mg/kg bw per day, the lowest dose tested (Staples et al., 1967)), and dogs (100% glycerol at 5,600 mg/kg bw per day (Staples et al., 1967)) was likely due to the hygroscopic and osmotic effects of glycerol.From the available chronic toxicity and carcinogenicity studies, glycerol was not carcinogenic in mice and rats and did not show evidence of adverse effects in a 2-year chronic toxicity study. The Panel noted that no adverse effects were reported in rats receiving doses up to 10,000 mg/kg bw per day for 1 year, the highest dose tested. The Panel also noted that there was no increase in the tumours incidences in rats receiving doses up to 5,000 mg/kg bw per day for 2 years, the highest dose tested.The Panel considered that none of the animal studies available identified an adverse effect for glycerol.Repeated dose toxicity inhalationThe key studies identified and evaluated by the OECD are compiled as RSS in the dossier (Renne 1992). Based on an increased incidence of “minimal” to “mild” squamous metaplasia of the epiglottis, the NOAEC for local irritant effects to the upper respiratory tract was derived at 165 mg/m3 and 662 mg/m3 for systemic effects.The German Commission for the Investigation of Health Hazards of Chemical Compounds in the Work Area has re-evaluated glycerol [56-81-5]in 2016, considering the endpoints irritation of the respiratory tract.Based on the results of an expert workshop, the NOAEC value for local toxicity was re-evaluated. Because the metaplasia of the squamous epithelium of the larynx seen in rats at 662 mg/m3 with glycerol aerosol was only minimal to slight, is not interpreted as adverse (Kaufmann et al. 2009). Furthermore it has been taken into account, that the response does not increase with the exposure duration.The NOAEC in rats for local and systemic effects after 13-week exposure is 662 mg/m3.Glycerin [MAK Value Documentation in German language, 2007]The MAK Collection for Occupational Health and Safety 2017, Vol 2, No 2Re-evaluation of glycerol (E 422) as a food additive, EFSA Journal 2017;15(3):4720Glycerol, CAS Number 56-81-5, OECD SIDS Initial Assessment Report For SIAM 14 Paris, France, 26-28 March 2002Kaufmann W, Bader R, Ernst H, Harada T, Hardisty J, Kittel B, Kolling A, Pino M, Renne R, Rittinghausen S, Schulte A, Wöhrmann T, Rosenbruch M (2009) 1st International ESTP Expert Workshop: “Larynx squamous metaplasia”. A re-consideration of morphology and diagnostic approaches in rodent studies and its relevance for human risk assessment. Exp Toxicol Pathol 61: 591–603", + "subsections": [ + { + "label": "Attached background material" + } + ] + } + ] + } +} \ No newline at end of file diff --git a/functions.py b/functions.py new file mode 100644 index 0000000..0926a3e --- /dev/null +++ b/functions.py @@ -0,0 +1,193 @@ +import json +from typing import Any, Dict, List, Union +import requests +import pandas as pd + + +def remove_empty_values(data: Any) -> Any: + """ + Rimuove ricorsivamente tutte le chiavi con valori vuoti (stringa vuota, None, False, liste/dict vuoti). + + Args: + data: Il dato da pulire (può essere dict, list o valore primitivo) + + Returns: + Il dato pulito senza valori vuoti + """ + if isinstance(data, dict): + # Filtra il dizionario rimuovendo chiavi con valori vuoti + cleaned = {} + for key, value in data.items(): + # Ricorsivamente pulisci il valore + cleaned_value = remove_empty_values(value) + + # Aggiungi solo se il valore non è vuoto + if cleaned_value not in [None, "", [], {}, False]: + cleaned[key] = cleaned_value + + return cleaned if cleaned else None + + elif isinstance(data, list): + # Pulisci ogni elemento della lista + cleaned = [] + for item in data: + cleaned_item = remove_empty_values(item) + if cleaned_item not in [None, "", [], {}, False]: + cleaned.append(cleaned_item) + return cleaned if cleaned else None + + else: + # Per valori primitivi, ritorna il valore se non è vuoto + if data in [None, "", False]: + return None + return data + + +def transform_labels_to_keys(data: Any) -> Any: + """ + Trasforma ricorsivamente le 'label' in chiavi del dizionario. + + Args: + data: Il dato da trasformare + + Returns: + Il dato trasformato con le label come chiavi + """ + if isinstance(data, dict): + # Se c'è una label, usala come chiave principale + if 'label' in data: + label = data['label'] + # Crea una copia del dizionario senza la label + new_dict = {k: v for k, v in data.items() if k != 'label'} + + # Se ci sono subsections, trasformale ricorsivamente + if 'subsections' in new_dict: + subsections = new_dict.pop('subsections') + # Trasforma ogni subsection + for subsection in subsections: + transformed_sub = transform_labels_to_keys(subsection) + if isinstance(transformed_sub, dict): + new_dict.update(transformed_sub) + + # Trasforma ricorsivamente tutti gli altri valori + for key, value in list(new_dict.items()): + new_dict[key] = transform_labels_to_keys(value) + + # Ritorna con la label come chiave principale + return {label: new_dict if new_dict else {}} + + else: + # Se non c'è label, trasforma ricorsivamente tutti i valori + result = {} + for key, value in data.items(): + if key == 'subsections' and isinstance(value, list): + # Gestisci le subsections senza label nel dizionario padre + for subsection in value: + transformed = transform_labels_to_keys(subsection) + if isinstance(transformed, dict): + result.update(transformed) + elif key == 'sections' and isinstance(value, list): + # Gestisci le sections trasformandole in un dizionario + sections_dict = {} + for section in value: + transformed = transform_labels_to_keys(section) + if isinstance(transformed, dict): + sections_dict.update(transformed) + result[key] = sections_dict + else: + result[key] = transform_labels_to_keys(value) + return result + + elif isinstance(data, list): + # Trasforma ogni elemento della lista + return [transform_labels_to_keys(item) for item in data] + + else: + # Ritorna il valore così com'è + return data + + +def clean_and_transform_json(json_data: Union[str, dict], keep_false: bool = False) -> dict: + """ + Funzione principale che pulisce e trasforma il JSON. + + Args: + json_data: Il JSON come stringa o dizionario + keep_false: Se True, mantiene i valori False (default: False li rimuove) + + Returns: + Il JSON pulito e trasformato + """ + # Se è una stringa, parsala + if isinstance(json_data, str): + data = json.loads(json_data) + else: + data = json_data + + # Step 1: Rimuovi i valori vuoti + if not keep_false: + cleaned_data = remove_empty_values(data) + else: + # Versione alternativa che mantiene False + def remove_empty_keep_false(d): + if isinstance(d, dict): + cleaned = {} + for key, value in d.items(): + cleaned_value = remove_empty_keep_false(value) + if cleaned_value not in [None, "", [], {}]: + cleaned[key] = cleaned_value + return cleaned if cleaned else None + elif isinstance(d, list): + cleaned = [] + for item in d: + cleaned_item = remove_empty_keep_false(item) + if cleaned_item not in [None, "", [], {}]: + cleaned.append(cleaned_item) + return cleaned if cleaned else None + else: + if d in [None, ""]: + return None + return d + + cleaned_data = remove_empty_keep_false(data) + + # Step 2: Trasforma le label in chiavi + if cleaned_data: + transformed_data = transform_labels_to_keys(cleaned_data) + else: + transformed_data = {} + + return transformed_data + + +def api_req(query: str) -> Dict[str, Any]: + url = 'https://api.cosmoguard.it/api/v1/echa/search' + response = requests.post(url, json={'cas': query}) + data = response.json() + if data['success'] == True: + results = data['data'] + if results: + substance_info = data['data']['substance'] + last_update = data['data']['dossier_info']['lastUpdatedDate'] + tox = data['data']['index']['toxicological_information_link'] + rpt = data['data']['index']['repeated_dose_toxicity_link'] + act = data['data']['index']['acute_toxicity_link'] + toxicological_information = data['data']['toxicological_information'] + repeated_dose_toxicity = data['data']['repeated_dose_toxicity'] + acute_toxicity = data['data']['acute_toxicity'] + return { + 'substance_info': substance_info, + 'last_update': last_update, + 'toxicological_information': toxicological_information, + 'repeated_dose_toxicity': repeated_dose_toxicity, + 'acute_toxicity': acute_toxicity, + 'link': { + 'toxicological_information': tox, + 'repeated_dose_toxicity': rpt, + 'acute_toxicity': act + } + } + else: + return {'error': 'No results found for the given CAS number.'} + else: + return data['error'] \ No newline at end of file diff --git a/pages/echa.py b/pages/echa.py new file mode 100644 index 0000000..d3424e1 --- /dev/null +++ b/pages/echa.py @@ -0,0 +1,352 @@ +import streamlit as st +import json +import os +from typing import Any +import requests +import pandas as pd + +from functions import clean_and_transform_json, api_req + +st.set_page_config(page_title="Echa Toxicological Reports", layout="centered") + +st.title("Echa Toxicological Reports") + +result = {} + +# Single-ingredient input +query = st.text_input("Search by CAS", value="50-00-0") + +if st.button("Search"): + with st.spinner("Fetching data..."): + try: + result = api_req(query) + if 'error' in result: + st.error(result['error']) + else: + st.success(f"Data fetched successfully! Last updated: {result['last_update']}") + + data = clean_and_transform_json(result) + + tab1, tab2, tab3 = st.tabs(["Toxicological Information", "Repeated Dose Toxicity", "Acute Toxicity"]) + + with tab1: + st.header("Toxicological Information") + table_data = [] + txi = data['toxicological_information'] + + for section_name, section_data in txi['sections'].items(): + if section_name == "Administrative data": + continue + elif "Additional information" in section_name: + continue + elif "eyes" in section_name.lower(): + population = 'Workers' if 'Workers' in section_name else 'General Population' + table_data.append({ + 'Population': population, + 'Exposure Route': 'Eyes', + 'Effect Type': 'Local effects', + 'Exposure Duration': '-', + 'Hazard Assessment': section_data['Local effects'].get('Conclusion', 'N/A') + }) + else: + # Determine population and route + population = 'Workers' if 'Workers' in section_name else 'General Population' + + if 'inhalation' in section_name.lower(): + route = 'Inhalation' + elif 'dermal' in section_name.lower(): + route = 'Dermal' + elif 'oral' in section_name.lower(): + route = 'Oral' + else: + route = 'Unknown' + + # Process nested data + for effect_type, effect_data in section_data.items(): + if isinstance(effect_data, dict): + for exposure_duration, exposure_data in effect_data.items(): + if isinstance(exposure_data, dict) and 'HazardAssessment' in exposure_data: + table_data.append({ + 'Population': population, + 'Exposure Route': route, + 'Effect Type': effect_type, + 'Exposure Duration': exposure_duration, + 'Hazard Assessment': exposure_data.get('HazardAssessment', 'N/A') + }) + + # Create DataFrame + df = pd.DataFrame(table_data) + + # Display the main table + st.subheader("📊 Complete Hazard Assessment Overview") + st.dataframe(df, use_container_width=True, height=500) + + # Display summary metrics + col1, col2, col3, col4 = st.columns(4) + with col1: + st.metric("Total Assessments", len(df)) + with col2: + st.metric("Workers Assessments", len(df[df['Population'] == 'Workers'])) + with col3: + st.metric("General Population", len(df[df['Population'] == 'General Population'])) + with col4: + st.metric("Unique Routes", df['Exposure Route'].nunique()) + + # Display additional information + st.markdown("---") + st.subheader("📝 Additional Information") + + col1, col2 = st.columns(2) + with col1: + st.markdown("**Workers:**") + st.info(txi['sections']['Additional information - workers']['DiscussionWorkers']) + + with col2: + st.markdown("**General Population:**") + st.info(txi['sections']['Additional information - General Population']['DiscussionGenPop']) + + # Option to download the data as CSV + st.markdown("---") + csv = df.to_csv(index=False) + st.download_button( + label="📥 Download as CSV", + data=csv, + file_name='hazard_assessment_data.csv', + mime='text/csv' + ) + + with tab2: + st.header("Repeated Dose Toxicity") + table_data = [] + + key_values = data['repeated_dose_toxicity']['sections']['Key value for assessment'] + + # Process Sub-chronic toxicity - systemic effects + subchronic = key_values.get('Sub-chronic toxicity – systemic effects', {}) + for route, route_data in subchronic.items(): + if route_data and isinstance(route_data, dict): + table_data.append({ + 'Toxicity Type': 'Sub-chronic', + 'Effect Type': 'Systemic effects', + 'Route': route, + 'Effect Level': route_data.get('EffectLevelUnit', '-'), + 'Value': route_data.get('EffectLevelValue', '-'), + 'Species': route_data.get('Species', '-'), + 'Study Reference': route_data.get('LinkToRelevantStudyRecord', '-')[:50] + '...' if route_data.get('LinkToRelevantStudyRecord', '') and len(route_data.get('LinkToRelevantStudyRecord', '')) > 50 else route_data.get('LinkToRelevantStudyRecord', '-') + }) + + # Process Chronic toxicity - systemic effects + chronic = key_values.get('Chronic toxicity – systemic effects', {}) + for route, route_data in chronic.items(): + if route_data and isinstance(route_data, dict): + table_data.append({ + 'Toxicity Type': 'Chronic', + 'Effect Type': 'Systemic effects', + 'Route': route, + 'Effect Level': route_data.get('EffectLevelUnit', '-'), + 'Value': route_data.get('EffectLevelValue', '-'), + 'Species': route_data.get('Species', '-'), + 'Study Reference': route_data.get('LinkToRelevantStudyRecord', '-')[:50] + '...' if route_data.get('LinkToRelevantStudyRecord', '') and len(route_data.get('LinkToRelevantStudyRecord', '')) > 50 else route_data.get('LinkToRelevantStudyRecord', '-') + }) + + # Process Repeated dose toxicity - local effects + local_effects = key_values.get('Repeated dose toxicity – local effects', {}) + for route, route_data in local_effects.items(): + if route_data and isinstance(route_data, dict): + table_data.append({ + 'Toxicity Type': route_data.get('TestType', 'Repeated dose').capitalize() if route_data.get('TestType') else 'Repeated dose', + 'Effect Type': 'Local effects', + 'Route': route, + 'Effect Level': route_data.get('EffectLevelUnit', '-'), + 'Value': route_data.get('EffectLevelValue', '-'), + 'Species': route_data.get('Species', '-'), + 'Study Reference': route_data.get('LinkToRelevantStudyRecord', '-')[:50] + '...' if route_data.get('LinkToRelevantStudyRecord', '') and len(route_data.get('LinkToRelevantStudyRecord', '')) > 50 else route_data.get('LinkToRelevantStudyRecord', '-') + }) + + # Add endpoint conclusions + conclusions_data = [] + if key_values.get('EndpointConclusionSystemicEffectsOralRoute'): + conclusions_data.append({ + 'Route': 'Oral', + 'Effect Type': 'Systemic effects', + 'Conclusion': key_values.get('EndpointConclusionSystemicEffectsOralRoute') + }) + if key_values.get('EndpointConclusionSystemicEffectsDermal'): + conclusions_data.append({ + 'Route': 'Dermal', + 'Effect Type': 'Systemic effects', + 'Conclusion': key_values.get('EndpointConclusionSystemicEffectsDermal') + }) + + # Create DataFrames + df_toxicity = pd.DataFrame(table_data) if table_data else pd.DataFrame() + df_conclusions = pd.DataFrame(conclusions_data) if conclusions_data else pd.DataFrame() + + # Display the main toxicity table + st.subheader("📊 Toxicity Study Results") + if not df_toxicity.empty: + st.dataframe(df_toxicity, use_container_width=True, height=400) + else: + st.info("No toxicity data available") + + # Display summary metrics + col1, col2, col3, col4 = st.columns(4) + with col1: + st.metric("Total Studies", len(df_toxicity) if not df_toxicity.empty else 0) + with col2: + unique_routes = df_toxicity['Route'].nunique() if not df_toxicity.empty else 0 + st.metric("Routes Tested", unique_routes) + with col3: + unique_species = df_toxicity['Species'].nunique() if not df_toxicity.empty else 0 + st.metric("Species Tested", unique_species) + with col4: + st.metric("Classification", "Not required") + + # Display endpoint conclusions + if not df_conclusions.empty: + st.markdown("---") + st.subheader("🎯 Endpoint Conclusions") + st.dataframe(df_conclusions, use_container_width=True, hide_index=True) + + # Display key information + st.markdown("---") + st.subheader("📋 Key Study Information") + key_info = data['repeated_dose_toxicity']['sections']['Description of key information']['KeyInformation'] + # Split the key information into paragraphs for better readability + key_info_paragraphs = key_info.split('.') + key_info_formatted = '. '.join([p.strip() for p in key_info_paragraphs if p.strip()]) + st.info(key_info_formatted[:1000] + "..." if len(key_info_formatted) > 1000 else key_info_formatted) + + # Display classification justification + st.markdown("---") + st.subheader("⚖️ Classification Justification") + justif = data['repeated_dose_toxicity']['sections']['Justification for classification or non-classification (Specific target organ toxicity-repeated exposure (STOT RE))'] + st.success(justif.get('JustifClassif', 'No information available')) + + # Display additional discussion (truncated) + st.markdown("---") + st.subheader("📝 Additional Discussion") + discussion = data['repeated_dose_toxicity']['sections']['Additional information'].get('Discussion', '') + if discussion: + # Show first 500 characters of discussion + with st.expander("Click to expand full discussion"): + st.text_area("", discussion, height=300, disabled=True) + + # Option to download the data as CSV + st.markdown("---") + if not df_toxicity.empty: + csv = df_toxicity.to_csv(index=False) + st.download_button( + label="📥 Download Toxicity Data as CSV", + data=csv, + file_name='repeated_dose_toxicity_data.csv', + mime='text/csv' + ) + + with tab3: + st.header("Acute Toxicity") + table_data = [] + + key_values = data['acute_toxicity']['sections']['Key value for assessment'] + + # Process each route of exposure + for route_name, route_data in key_values.items(): + if route_data and isinstance(route_data, dict) and 'EffectLevelUnit' in route_data: + # Extract route type + if 'oral' in route_name: + route = 'Oral' + species = 'Rat, Mice, Guinea pig' # From key information + elif 'dermal' in route_name: + route = 'Dermal' + species = 'Guinea pig' + elif 'inhalation' in route_name: + route = 'Inhalation' + species = 'Rat' + else: + route = 'Other' + species = '-' + + table_data.append({ + 'Route of Exposure': route, + 'Effect Level': route_data.get('EffectLevelUnit', '-'), + 'Value': route_data.get('EffectLevelValue', '-'), + 'Physical Form': route_data.get('PhysicalForm', '-'), + 'Species': species, + 'Endpoint Conclusion': route_data.get('EndpointConclusion', '-') + }) + + # Create DataFrame + df_toxicity = pd.DataFrame(table_data) + + # Display the main toxicity table + st.subheader("📊 Acute Toxicity Study Results") + st.dataframe( + df_toxicity, + use_container_width=True, + height=200, + column_config={ + "Route of Exposure": st.column_config.TextColumn("Route", width="small"), + "Effect Level": st.column_config.TextColumn("Parameter", width="small"), + "Value": st.column_config.TextColumn("Value", width="medium"), + "Physical Form": st.column_config.TextColumn("Form", width="medium"), + "Species": st.column_config.TextColumn("Test Species", width="medium"), + "Endpoint Conclusion": st.column_config.TextColumn("Conclusion", width="large") + } + ) + + # Display summary metrics + col1, col2, col3, col4 = st.columns(4) + with col1: + st.metric("Routes Tested", len(df_toxicity)) + with col2: + st.metric("Oral LD50", "11,500 mg/kg bw") + with col3: + st.metric("Dermal LD50", "56,750 mg/kg bw") + with col4: + st.metric("Inhalation LC50", ">5.85 mg/L") + + # Display key information + st.markdown("---") + st.subheader("📋 Key Study Information") + key_info = data['acute_toxicity']['sections']['Description of key information']['KeyInformation'] + + # Format the key information for better readability + key_info_formatted = key_info.replace(".", ".\n").replace("The acute", "\n• The acute").replace("In an", "\n• In an") + st.info(key_info_formatted) + + # Display classification justification + st.markdown("---") + st.subheader("⚖️ Classification Justification") + justif = data['acute_toxicity']['sections']['Justification for classification or non-classification'] + st.success(justif.get('JustifClassif', 'No information available')) + + # Display additional discussion + st.markdown("---") + st.subheader("📝 Additional Information & Discussion") + discussion = data['acute_toxicity']['sections']['Additional information'].get('Discussion', '') + + if discussion: + # Parse discussion to highlight key points + discussion_parts = discussion.split('.') + + # Display main conclusion + st.info("💡 **Main Conclusion:** " + discussion_parts[0] + ".") + + # Display full discussion in expander + with st.expander("Click to view full discussion and references"): + # Format the discussion for better readability + formatted_discussion = discussion.replace(".", ".\n\n") + st.text_area("", formatted_discussion, height=400, disabled=True) + + # Option to download the data as CSV + st.markdown("---") + csv = df_toxicity.to_csv(index=False) + st.download_button( + label="📥 Download Acute Toxicity Data as CSV", + data=csv, + file_name='acute_toxicity_data.csv', + mime='text/csv' + ) + + except Exception as e: + st.error(f"An error occurred: {e}") \ No newline at end of file diff --git a/pyproject.toml b/pyproject.toml new file mode 100644 index 0000000..cc36d9d --- /dev/null +++ b/pyproject.toml @@ -0,0 +1,10 @@ +[project] +name = "cosmoguard-frontend" +version = "0.1.0" +description = "Add your description here" +readme = "README.md" +requires-python = ">=3.12" +dependencies = [ + "marimo>=0.18.0", + "streamlit>=1.51.0", +] diff --git a/report.py b/report.py new file mode 100644 index 0000000..b6ba977 --- /dev/null +++ b/report.py @@ -0,0 +1,27 @@ +import streamlit as st +from datetime import datetime +import os + +st.header("Report a bug or request a feature") +st.write("Use the box below to submit a short report. Submissions are saved locally to `reports.txt`.") + +report_type = st.selectbox("Type", ["Bug", "Feature request", "Other"]) +report_email = st.text_input("Your name (optional)") +report_text = st.text_area("Describe the issue or request", height=160) + +if st.button("Submit report"): + if not report_text.strip(): + st.error("Please enter a description before submitting.") + else: + timestamp = datetime.utcnow().isoformat() + "Z" + entry = f"[{timestamp}]\t{report_type}\t{report_email}\t{report_text.replace('\n', ' ')}\n" + try: + base = os.path.dirname(__file__) + path = os.path.join(base, "reports.txt") + with open(path, "a", encoding="utf-8") as f: + f.write(entry) + st.success("Thanks — your report was saved.") + st.write("Saved to:", path) + st.markdown("---") + except Exception as e: + st.error(f"Could not save report: {e}") \ No newline at end of file diff --git a/requirements.txt b/requirements.txt new file mode 100644 index 0000000..f08239d --- /dev/null +++ b/requirements.txt @@ -0,0 +1,3 @@ + +streamlit>=1.0 +requests>=2.0 diff --git a/uv.lock b/uv.lock new file mode 100644 index 0000000..1420dab --- /dev/null +++ b/uv.lock @@ -0,0 +1,1150 @@ +version = 1 +requires-python = ">=3.12" + +[[package]] +name = "altair" +version = "5.5.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "jinja2" }, + { name = "jsonschema" }, + { name = "narwhals" }, + { name = "packaging" }, + { name = "typing-extensions", marker = "python_full_version < '3.14'" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/16/b1/f2969c7bdb8ad8bbdda031687defdce2c19afba2aa2c8e1d2a17f78376d8/altair-5.5.0.tar.gz", hash = "sha256:d960ebe6178c56de3855a68c47b516be38640b73fb3b5111c2a9ca90546dd73d", size = 705305 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/aa/f3/0b6ced594e51cc95d8c1fc1640d3623770d01e4969d29c0bd09945fafefa/altair-5.5.0-py3-none-any.whl", hash = "sha256:91a310b926508d560fe0148d02a194f38b824122641ef528113d029fcd129f8c", size = 731200 }, +] + +[[package]] +name = "anyio" +version = "4.11.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "idna" }, + { name = "sniffio" }, + { name = "typing-extensions", marker = "python_full_version < '3.13'" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/c6/78/7d432127c41b50bccba979505f272c16cbcadcc33645d5fa3a738110ae75/anyio-4.11.0.tar.gz", hash = "sha256:82a8d0b81e318cc5ce71a5f1f8b5c4e63619620b63141ef8c995fa0db95a57c4", size = 219094 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/15/b3/9b1a8074496371342ec1e796a96f99c82c945a339cd81a8e73de28b4cf9e/anyio-4.11.0-py3-none-any.whl", hash = "sha256:0287e96f4d26d4149305414d4e3bc32f0dcd0862365a4bddea19d7a1ec38c4fc", size = 109097 }, +] + +[[package]] +name = "attrs" +version = "25.4.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/6b/5c/685e6633917e101e5dcb62b9dd76946cbb57c26e133bae9e0cd36033c0a9/attrs-25.4.0.tar.gz", hash = "sha256:16d5969b87f0859ef33a48b35d55ac1be6e42ae49d5e853b597db70c35c57e11", size = 934251 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/3a/2a/7cc015f5b9f5db42b7d48157e23356022889fc354a2813c15934b7cb5c0e/attrs-25.4.0-py3-none-any.whl", hash = "sha256:adcf7e2a1fb3b36ac48d97835bb6d8ade15b8dcce26aba8bf1d14847b57a3373", size = 67615 }, +] + +[[package]] +name = "blinker" +version = "1.9.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/21/28/9b3f50ce0e048515135495f198351908d99540d69bfdc8c1d15b73dc55ce/blinker-1.9.0.tar.gz", hash = "sha256:b4ce2265a7abece45e7cc896e98dbebe6cead56bcf805a3d23136d145f5445bf", size = 22460 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/10/cb/f2ad4230dc2eb1a74edf38f1a38b9b52277f75bef262d8908e60d957e13c/blinker-1.9.0-py3-none-any.whl", hash = "sha256:ba0efaa9080b619ff2f3459d1d500c57bddea4a6b424b60a91141db6fd2f08bc", size = 8458 }, +] + +[[package]] +name = "cachetools" +version = "6.2.2" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/fb/44/ca1675be2a83aeee1886ab745b28cda92093066590233cc501890eb8417a/cachetools-6.2.2.tar.gz", hash = "sha256:8e6d266b25e539df852251cfd6f990b4bc3a141db73b939058d809ebd2590fc6", size = 31571 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/e6/46/eb6eca305c77a4489affe1c5d8f4cae82f285d9addd8de4ec084a7184221/cachetools-6.2.2-py3-none-any.whl", hash = "sha256:6c09c98183bf58560c97b2abfcedcbaf6a896a490f534b031b661d3723b45ace", size = 11503 }, +] + +[[package]] +name = "certifi" +version = "2025.11.12" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/a2/8c/58f469717fa48465e4a50c014a0400602d3c437d7c0c468e17ada824da3a/certifi-2025.11.12.tar.gz", hash = "sha256:d8ab5478f2ecd78af242878415affce761ca6bc54a22a27e026d7c25357c3316", size = 160538 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/70/7d/9bc192684cea499815ff478dfcdc13835ddf401365057044fb721ec6bddb/certifi-2025.11.12-py3-none-any.whl", hash = "sha256:97de8790030bbd5c2d96b7ec782fc2f7820ef8dba6db909ccf95449f2d062d4b", size = 159438 }, +] + +[[package]] +name = "charset-normalizer" +version = "3.4.4" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/13/69/33ddede1939fdd074bce5434295f38fae7136463422fe4fd3e0e89b98062/charset_normalizer-3.4.4.tar.gz", hash = "sha256:94537985111c35f28720e43603b8e7b43a6ecfb2ce1d3058bbe955b73404e21a", size = 129418 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/f3/85/1637cd4af66fa687396e757dec650f28025f2a2f5a5531a3208dc0ec43f2/charset_normalizer-3.4.4-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:0a98e6759f854bd25a58a73fa88833fba3b7c491169f86ce1180c948ab3fd394", size = 208425 }, + { url = "https://files.pythonhosted.org/packages/9d/6a/04130023fef2a0d9c62d0bae2649b69f7b7d8d24ea5536feef50551029df/charset_normalizer-3.4.4-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:b5b290ccc2a263e8d185130284f8501e3e36c5e02750fc6b6bdeb2e9e96f1e25", size = 148162 }, + { url = "https://files.pythonhosted.org/packages/78/29/62328d79aa60da22c9e0b9a66539feae06ca0f5a4171ac4f7dc285b83688/charset_normalizer-3.4.4-cp312-cp312-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:74bb723680f9f7a6234dcf67aea57e708ec1fbdf5699fb91dfd6f511b0a320ef", size = 144558 }, + { url = "https://files.pythonhosted.org/packages/86/bb/b32194a4bf15b88403537c2e120b817c61cd4ecffa9b6876e941c3ee38fe/charset_normalizer-3.4.4-cp312-cp312-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:f1e34719c6ed0b92f418c7c780480b26b5d9c50349e9a9af7d76bf757530350d", size = 161497 }, + { url = "https://files.pythonhosted.org/packages/19/89/a54c82b253d5b9b111dc74aca196ba5ccfcca8242d0fb64146d4d3183ff1/charset_normalizer-3.4.4-cp312-cp312-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:2437418e20515acec67d86e12bf70056a33abdacb5cb1655042f6538d6b085a8", size = 159240 }, + { url = "https://files.pythonhosted.org/packages/c0/10/d20b513afe03acc89ec33948320a5544d31f21b05368436d580dec4e234d/charset_normalizer-3.4.4-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:11d694519d7f29d6cd09f6ac70028dba10f92f6cdd059096db198c283794ac86", size = 153471 }, + { url = "https://files.pythonhosted.org/packages/61/fa/fbf177b55bdd727010f9c0a3c49eefa1d10f960e5f09d1d887bf93c2e698/charset_normalizer-3.4.4-cp312-cp312-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:ac1c4a689edcc530fc9d9aa11f5774b9e2f33f9a0c6a57864e90908f5208d30a", size = 150864 }, + { url = "https://files.pythonhosted.org/packages/05/12/9fbc6a4d39c0198adeebbde20b619790e9236557ca59fc40e0e3cebe6f40/charset_normalizer-3.4.4-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:21d142cc6c0ec30d2efee5068ca36c128a30b0f2c53c1c07bd78cb6bc1d3be5f", size = 150647 }, + { url = "https://files.pythonhosted.org/packages/ad/1f/6a9a593d52e3e8c5d2b167daf8c6b968808efb57ef4c210acb907c365bc4/charset_normalizer-3.4.4-cp312-cp312-musllinux_1_2_armv7l.whl", hash = "sha256:5dbe56a36425d26d6cfb40ce79c314a2e4dd6211d51d6d2191c00bed34f354cc", size = 145110 }, + { url = "https://files.pythonhosted.org/packages/30/42/9a52c609e72471b0fc54386dc63c3781a387bb4fe61c20231a4ebcd58bdd/charset_normalizer-3.4.4-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:5bfbb1b9acf3334612667b61bd3002196fe2a1eb4dd74d247e0f2a4d50ec9bbf", size = 162839 }, + { url = "https://files.pythonhosted.org/packages/c4/5b/c0682bbf9f11597073052628ddd38344a3d673fda35a36773f7d19344b23/charset_normalizer-3.4.4-cp312-cp312-musllinux_1_2_riscv64.whl", hash = "sha256:d055ec1e26e441f6187acf818b73564e6e6282709e9bcb5b63f5b23068356a15", size = 150667 }, + { url = "https://files.pythonhosted.org/packages/e4/24/a41afeab6f990cf2daf6cb8c67419b63b48cf518e4f56022230840c9bfb2/charset_normalizer-3.4.4-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:af2d8c67d8e573d6de5bc30cdb27e9b95e49115cd9baad5ddbd1a6207aaa82a9", size = 160535 }, + { url = "https://files.pythonhosted.org/packages/2a/e5/6a4ce77ed243c4a50a1fecca6aaaab419628c818a49434be428fe24c9957/charset_normalizer-3.4.4-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:780236ac706e66881f3b7f2f32dfe90507a09e67d1d454c762cf642e6e1586e0", size = 154816 }, + { url = "https://files.pythonhosted.org/packages/a8/ef/89297262b8092b312d29cdb2517cb1237e51db8ecef2e9af5edbe7b683b1/charset_normalizer-3.4.4-cp312-cp312-win32.whl", hash = "sha256:5833d2c39d8896e4e19b689ffc198f08ea58116bee26dea51e362ecc7cd3ed26", size = 99694 }, + { url = "https://files.pythonhosted.org/packages/3d/2d/1e5ed9dd3b3803994c155cd9aacb60c82c331bad84daf75bcb9c91b3295e/charset_normalizer-3.4.4-cp312-cp312-win_amd64.whl", hash = "sha256:a79cfe37875f822425b89a82333404539ae63dbdddf97f84dcbc3d339aae9525", size = 107131 }, + { url = "https://files.pythonhosted.org/packages/d0/d9/0ed4c7098a861482a7b6a95603edce4c0d9db2311af23da1fb2b75ec26fc/charset_normalizer-3.4.4-cp312-cp312-win_arm64.whl", hash = "sha256:376bec83a63b8021bb5c8ea75e21c4ccb86e7e45ca4eb81146091b56599b80c3", size = 100390 }, + { url = "https://files.pythonhosted.org/packages/97/45/4b3a1239bbacd321068ea6e7ac28875b03ab8bc0aa0966452db17cd36714/charset_normalizer-3.4.4-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:e1f185f86a6f3403aa2420e815904c67b2f9ebc443f045edd0de921108345794", size = 208091 }, + { url = "https://files.pythonhosted.org/packages/7d/62/73a6d7450829655a35bb88a88fca7d736f9882a27eacdca2c6d505b57e2e/charset_normalizer-3.4.4-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:6b39f987ae8ccdf0d2642338faf2abb1862340facc796048b604ef14919e55ed", size = 147936 }, + { url = "https://files.pythonhosted.org/packages/89/c5/adb8c8b3d6625bef6d88b251bbb0d95f8205831b987631ab0c8bb5d937c2/charset_normalizer-3.4.4-cp313-cp313-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:3162d5d8ce1bb98dd51af660f2121c55d0fa541b46dff7bb9b9f86ea1d87de72", size = 144180 }, + { url = "https://files.pythonhosted.org/packages/91/ed/9706e4070682d1cc219050b6048bfd293ccf67b3d4f5a4f39207453d4b99/charset_normalizer-3.4.4-cp313-cp313-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:81d5eb2a312700f4ecaa977a8235b634ce853200e828fbadf3a9c50bab278328", size = 161346 }, + { url = "https://files.pythonhosted.org/packages/d5/0d/031f0d95e4972901a2f6f09ef055751805ff541511dc1252ba3ca1f80cf5/charset_normalizer-3.4.4-cp313-cp313-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:5bd2293095d766545ec1a8f612559f6b40abc0eb18bb2f5d1171872d34036ede", size = 158874 }, + { url = "https://files.pythonhosted.org/packages/f5/83/6ab5883f57c9c801ce5e5677242328aa45592be8a00644310a008d04f922/charset_normalizer-3.4.4-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:a8a8b89589086a25749f471e6a900d3f662d1d3b6e2e59dcecf787b1cc3a1894", size = 153076 }, + { url = "https://files.pythonhosted.org/packages/75/1e/5ff781ddf5260e387d6419959ee89ef13878229732732ee73cdae01800f2/charset_normalizer-3.4.4-cp313-cp313-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:bc7637e2f80d8530ee4a78e878bce464f70087ce73cf7c1caf142416923b98f1", size = 150601 }, + { url = "https://files.pythonhosted.org/packages/d7/57/71be810965493d3510a6ca79b90c19e48696fb1ff964da319334b12677f0/charset_normalizer-3.4.4-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:f8bf04158c6b607d747e93949aa60618b61312fe647a6369f88ce2ff16043490", size = 150376 }, + { url = "https://files.pythonhosted.org/packages/e5/d5/c3d057a78c181d007014feb7e9f2e65905a6c4ef182c0ddf0de2924edd65/charset_normalizer-3.4.4-cp313-cp313-musllinux_1_2_armv7l.whl", hash = "sha256:554af85e960429cf30784dd47447d5125aaa3b99a6f0683589dbd27e2f45da44", size = 144825 }, + { url = "https://files.pythonhosted.org/packages/e6/8c/d0406294828d4976f275ffbe66f00266c4b3136b7506941d87c00cab5272/charset_normalizer-3.4.4-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:74018750915ee7ad843a774364e13a3db91682f26142baddf775342c3f5b1133", size = 162583 }, + { url = "https://files.pythonhosted.org/packages/d7/24/e2aa1f18c8f15c4c0e932d9287b8609dd30ad56dbe41d926bd846e22fb8d/charset_normalizer-3.4.4-cp313-cp313-musllinux_1_2_riscv64.whl", hash = "sha256:c0463276121fdee9c49b98908b3a89c39be45d86d1dbaa22957e38f6321d4ce3", size = 150366 }, + { url = "https://files.pythonhosted.org/packages/e4/5b/1e6160c7739aad1e2df054300cc618b06bf784a7a164b0f238360721ab86/charset_normalizer-3.4.4-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:362d61fd13843997c1c446760ef36f240cf81d3ebf74ac62652aebaf7838561e", size = 160300 }, + { url = "https://files.pythonhosted.org/packages/7a/10/f882167cd207fbdd743e55534d5d9620e095089d176d55cb22d5322f2afd/charset_normalizer-3.4.4-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:9a26f18905b8dd5d685d6d07b0cdf98a79f3c7a918906af7cc143ea2e164c8bc", size = 154465 }, + { url = "https://files.pythonhosted.org/packages/89/66/c7a9e1b7429be72123441bfdbaf2bc13faab3f90b933f664db506dea5915/charset_normalizer-3.4.4-cp313-cp313-win32.whl", hash = "sha256:9b35f4c90079ff2e2edc5b26c0c77925e5d2d255c42c74fdb70fb49b172726ac", size = 99404 }, + { url = "https://files.pythonhosted.org/packages/c4/26/b9924fa27db384bdcd97ab83b4f0a8058d96ad9626ead570674d5e737d90/charset_normalizer-3.4.4-cp313-cp313-win_amd64.whl", hash = "sha256:b435cba5f4f750aa6c0a0d92c541fb79f69a387c91e61f1795227e4ed9cece14", size = 107092 }, + { url = "https://files.pythonhosted.org/packages/af/8f/3ed4bfa0c0c72a7ca17f0380cd9e4dd842b09f664e780c13cff1dcf2ef1b/charset_normalizer-3.4.4-cp313-cp313-win_arm64.whl", hash = "sha256:542d2cee80be6f80247095cc36c418f7bddd14f4a6de45af91dfad36d817bba2", size = 100408 }, + { url = "https://files.pythonhosted.org/packages/2a/35/7051599bd493e62411d6ede36fd5af83a38f37c4767b92884df7301db25d/charset_normalizer-3.4.4-cp314-cp314-macosx_10_13_universal2.whl", hash = "sha256:da3326d9e65ef63a817ecbcc0df6e94463713b754fe293eaa03da99befb9a5bd", size = 207746 }, + { url = "https://files.pythonhosted.org/packages/10/9a/97c8d48ef10d6cd4fcead2415523221624bf58bcf68a802721a6bc807c8f/charset_normalizer-3.4.4-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:8af65f14dc14a79b924524b1e7fffe304517b2bff5a58bf64f30b98bbc5079eb", size = 147889 }, + { url = "https://files.pythonhosted.org/packages/10/bf/979224a919a1b606c82bd2c5fa49b5c6d5727aa47b4312bb27b1734f53cd/charset_normalizer-3.4.4-cp314-cp314-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:74664978bb272435107de04e36db5a9735e78232b85b77d45cfb38f758efd33e", size = 143641 }, + { url = "https://files.pythonhosted.org/packages/ba/33/0ad65587441fc730dc7bd90e9716b30b4702dc7b617e6ba4997dc8651495/charset_normalizer-3.4.4-cp314-cp314-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:752944c7ffbfdd10c074dc58ec2d5a8a4cd9493b314d367c14d24c17684ddd14", size = 160779 }, + { url = "https://files.pythonhosted.org/packages/67/ed/331d6b249259ee71ddea93f6f2f0a56cfebd46938bde6fcc6f7b9a3d0e09/charset_normalizer-3.4.4-cp314-cp314-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:d1f13550535ad8cff21b8d757a3257963e951d96e20ec82ab44bc64aeb62a191", size = 159035 }, + { url = "https://files.pythonhosted.org/packages/67/ff/f6b948ca32e4f2a4576aa129d8bed61f2e0543bf9f5f2b7fc3758ed005c9/charset_normalizer-3.4.4-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:ecaae4149d99b1c9e7b88bb03e3221956f68fd6d50be2ef061b2381b61d20838", size = 152542 }, + { url = "https://files.pythonhosted.org/packages/16/85/276033dcbcc369eb176594de22728541a925b2632f9716428c851b149e83/charset_normalizer-3.4.4-cp314-cp314-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:cb6254dc36b47a990e59e1068afacdcd02958bdcce30bb50cc1700a8b9d624a6", size = 149524 }, + { url = "https://files.pythonhosted.org/packages/9e/f2/6a2a1f722b6aba37050e626530a46a68f74e63683947a8acff92569f979a/charset_normalizer-3.4.4-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:c8ae8a0f02f57a6e61203a31428fa1d677cbe50c93622b4149d5c0f319c1d19e", size = 150395 }, + { url = "https://files.pythonhosted.org/packages/60/bb/2186cb2f2bbaea6338cad15ce23a67f9b0672929744381e28b0592676824/charset_normalizer-3.4.4-cp314-cp314-musllinux_1_2_armv7l.whl", hash = "sha256:47cc91b2f4dd2833fddaedd2893006b0106129d4b94fdb6af1f4ce5a9965577c", size = 143680 }, + { url = "https://files.pythonhosted.org/packages/7d/a5/bf6f13b772fbb2a90360eb620d52ed8f796f3c5caee8398c3b2eb7b1c60d/charset_normalizer-3.4.4-cp314-cp314-musllinux_1_2_ppc64le.whl", hash = "sha256:82004af6c302b5d3ab2cfc4cc5f29db16123b1a8417f2e25f9066f91d4411090", size = 162045 }, + { url = "https://files.pythonhosted.org/packages/df/c5/d1be898bf0dc3ef9030c3825e5d3b83f2c528d207d246cbabe245966808d/charset_normalizer-3.4.4-cp314-cp314-musllinux_1_2_riscv64.whl", hash = "sha256:2b7d8f6c26245217bd2ad053761201e9f9680f8ce52f0fcd8d0755aeae5b2152", size = 149687 }, + { url = "https://files.pythonhosted.org/packages/a5/42/90c1f7b9341eef50c8a1cb3f098ac43b0508413f33affd762855f67a410e/charset_normalizer-3.4.4-cp314-cp314-musllinux_1_2_s390x.whl", hash = "sha256:799a7a5e4fb2d5898c60b640fd4981d6a25f1c11790935a44ce38c54e985f828", size = 160014 }, + { url = "https://files.pythonhosted.org/packages/76/be/4d3ee471e8145d12795ab655ece37baed0929462a86e72372fd25859047c/charset_normalizer-3.4.4-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:99ae2cffebb06e6c22bdc25801d7b30f503cc87dbd283479e7b606f70aff57ec", size = 154044 }, + { url = "https://files.pythonhosted.org/packages/b0/6f/8f7af07237c34a1defe7defc565a9bc1807762f672c0fde711a4b22bf9c0/charset_normalizer-3.4.4-cp314-cp314-win32.whl", hash = "sha256:f9d332f8c2a2fcbffe1378594431458ddbef721c1769d78e2cbc06280d8155f9", size = 99940 }, + { url = "https://files.pythonhosted.org/packages/4b/51/8ade005e5ca5b0d80fb4aff72a3775b325bdc3d27408c8113811a7cbe640/charset_normalizer-3.4.4-cp314-cp314-win_amd64.whl", hash = "sha256:8a6562c3700cce886c5be75ade4a5db4214fda19fede41d9792d100288d8f94c", size = 107104 }, + { url = "https://files.pythonhosted.org/packages/da/5f/6b8f83a55bb8278772c5ae54a577f3099025f9ade59d0136ac24a0df4bde/charset_normalizer-3.4.4-cp314-cp314-win_arm64.whl", hash = "sha256:de00632ca48df9daf77a2c65a484531649261ec9f25489917f09e455cb09ddb2", size = 100743 }, + { url = "https://files.pythonhosted.org/packages/0a/4c/925909008ed5a988ccbb72dcc897407e5d6d3bd72410d69e051fc0c14647/charset_normalizer-3.4.4-py3-none-any.whl", hash = "sha256:7a32c560861a02ff789ad905a2fe94e3f840803362c84fecf1851cb4cf3dc37f", size = 53402 }, +] + +[[package]] +name = "click" +version = "8.3.1" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "colorama", marker = "sys_platform == 'win32'" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/3d/fa/656b739db8587d7b5dfa22e22ed02566950fbfbcdc20311993483657a5c0/click-8.3.1.tar.gz", hash = "sha256:12ff4785d337a1bb490bb7e9c2b1ee5da3112e94a8622f26a6c77f5d2fc6842a", size = 295065 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/98/78/01c019cdb5d6498122777c1a43056ebb3ebfeef2076d9d026bfe15583b2b/click-8.3.1-py3-none-any.whl", hash = "sha256:981153a64e25f12d547d3426c367a4857371575ee7ad18df2a6183ab0545b2a6", size = 108274 }, +] + +[[package]] +name = "colorama" +version = "0.4.6" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/d8/53/6f443c9a4a8358a93a6792e2acffb9d9d5cb0a5cfd8802644b7b1c9a02e4/colorama-0.4.6.tar.gz", hash = "sha256:08695f5cb7ed6e0531a20572697297273c47b8cae5a63ffc6d6ed5c201be6e44", size = 27697 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/d1/d6/3965ed04c63042e047cb6a3e6ed1a63a35087b6a609aa3a15ed8ac56c221/colorama-0.4.6-py2.py3-none-any.whl", hash = "sha256:4f1d9991f5acc0ca119f9d443620b77f9d6b33703e51011c16baf57afb285fc6", size = 25335 }, +] + +[[package]] +name = "cosmoguard-frontend" +version = "0.1.0" +source = { virtual = "." } +dependencies = [ + { name = "marimo" }, + { name = "streamlit" }, +] + +[package.metadata] +requires-dist = [ + { name = "marimo", specifier = ">=0.18.0" }, + { name = "streamlit", specifier = ">=1.51.0" }, +] + +[[package]] +name = "docutils" +version = "0.22.3" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/d9/02/111134bfeb6e6c7ac4c74594e39a59f6c0195dc4846afbeac3cba60f1927/docutils-0.22.3.tar.gz", hash = "sha256:21486ae730e4ca9f622677b1412b879af1791efcfba517e4c6f60be543fc8cdd", size = 2290153 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/11/a8/c6a4b901d17399c77cd81fb001ce8961e9f5e04d3daf27e8925cb012e163/docutils-0.22.3-py3-none-any.whl", hash = "sha256:bd772e4aca73aff037958d44f2be5229ded4c09927fcf8690c577b66234d6ceb", size = 633032 }, +] + +[[package]] +name = "gitdb" +version = "4.0.12" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "smmap" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/72/94/63b0fc47eb32792c7ba1fe1b694daec9a63620db1e313033d18140c2320a/gitdb-4.0.12.tar.gz", hash = "sha256:5ef71f855d191a3326fcfbc0d5da835f26b13fbcba60c32c21091c349ffdb571", size = 394684 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/a0/61/5c78b91c3143ed5c14207f463aecfc8f9dbb5092fb2869baf37c273b2705/gitdb-4.0.12-py3-none-any.whl", hash = "sha256:67073e15955400952c6565cc3e707c554a4eea2e428946f7a4c162fab9bd9bcf", size = 62794 }, +] + +[[package]] +name = "gitpython" +version = "3.1.45" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "gitdb" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/9a/c8/dd58967d119baab745caec2f9d853297cec1989ec1d63f677d3880632b88/gitpython-3.1.45.tar.gz", hash = "sha256:85b0ee964ceddf211c41b9f27a49086010a190fd8132a24e21f362a4b36a791c", size = 215076 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/01/61/d4b89fec821f72385526e1b9d9a3a0385dda4a72b206d28049e2c7cd39b8/gitpython-3.1.45-py3-none-any.whl", hash = "sha256:8908cb2e02fb3b93b7eb0f2827125cb699869470432cc885f019b8fd0fccff77", size = 208168 }, +] + +[[package]] +name = "h11" +version = "0.16.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/01/ee/02a2c011bdab74c6fb3c75474d40b3052059d95df7e73351460c8588d963/h11-0.16.0.tar.gz", hash = "sha256:4e35b956cf45792e4caa5885e69fba00bdbc6ffafbfa020300e549b208ee5ff1", size = 101250 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/04/4b/29cac41a4d98d144bf5f6d33995617b185d14b22401f75ca86f384e87ff1/h11-0.16.0-py3-none-any.whl", hash = "sha256:63cf8bbe7522de3bf65932fda1d9c2772064ffb3dae62d55932da54b31cb6c86", size = 37515 }, +] + +[[package]] +name = "idna" +version = "3.11" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/6f/6d/0703ccc57f3a7233505399edb88de3cbd678da106337b9fcde432b65ed60/idna-3.11.tar.gz", hash = "sha256:795dafcc9c04ed0c1fb032c2aa73654d8e8c5023a7df64a53f39190ada629902", size = 194582 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/0e/61/66938bbb5fc52dbdf84594873d5b51fb1f7c7794e9c0f5bd885f30bc507b/idna-3.11-py3-none-any.whl", hash = "sha256:771a87f49d9defaf64091e6e6fe9c18d4833f140bd19464795bc32d966ca37ea", size = 71008 }, +] + +[[package]] +name = "itsdangerous" +version = "2.2.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/9c/cb/8ac0172223afbccb63986cc25049b154ecfb5e85932587206f42317be31d/itsdangerous-2.2.0.tar.gz", hash = "sha256:e0050c0b7da1eea53ffaf149c0cfbb5c6e2e2b69c4bef22c81fa6eb73e5f6173", size = 54410 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/04/96/92447566d16df59b2a776c0fb82dbc4d9e07cd95062562af01e408583fc4/itsdangerous-2.2.0-py3-none-any.whl", hash = "sha256:c6242fc49e35958c8b15141343aa660db5fc54d4f13a1db01a3f5891b98700ef", size = 16234 }, +] + +[[package]] +name = "jedi" +version = "0.19.2" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "parso" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/72/3a/79a912fbd4d8dd6fbb02bf69afd3bb72cf0c729bb3063c6f4498603db17a/jedi-0.19.2.tar.gz", hash = "sha256:4770dc3de41bde3966b02eb84fbcf557fb33cce26ad23da12c742fb50ecb11f0", size = 1231287 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/c0/5a/9cac0c82afec3d09ccd97c8b6502d48f165f9124db81b4bcb90b4af974ee/jedi-0.19.2-py2.py3-none-any.whl", hash = "sha256:a8ef22bde8490f57fe5c7681a3c83cb58874daf72b4784de3cce5b6ef6edb5b9", size = 1572278 }, +] + +[[package]] +name = "jinja2" +version = "3.1.6" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "markupsafe" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/df/bf/f7da0350254c0ed7c72f3e33cef02e048281fec7ecec5f032d4aac52226b/jinja2-3.1.6.tar.gz", hash = "sha256:0137fb05990d35f1275a587e9aee6d56da821fc83491a0fb838183be43f66d6d", size = 245115 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/62/a1/3d680cbfd5f4b8f15abc1d571870c5fc3e594bb582bc3b64ea099db13e56/jinja2-3.1.6-py3-none-any.whl", hash = "sha256:85ece4451f492d0c13c5dd7c13a64681a86afae63a5f347908daf103ce6d2f67", size = 134899 }, +] + +[[package]] +name = "jsonschema" +version = "4.25.1" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "attrs" }, + { name = "jsonschema-specifications" }, + { name = "referencing" }, + { name = "rpds-py" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/74/69/f7185de793a29082a9f3c7728268ffb31cb5095131a9c139a74078e27336/jsonschema-4.25.1.tar.gz", hash = "sha256:e4a9655ce0da0c0b67a085847e00a3a51449e1157f4f75e9fb5aa545e122eb85", size = 357342 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/bf/9c/8c95d856233c1f82500c2450b8c68576b4cf1c871db3afac5c34ff84e6fd/jsonschema-4.25.1-py3-none-any.whl", hash = "sha256:3fba0169e345c7175110351d456342c364814cfcf3b964ba4587f22915230a63", size = 90040 }, +] + +[[package]] +name = "jsonschema-specifications" +version = "2025.9.1" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "referencing" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/19/74/a633ee74eb36c44aa6d1095e7cc5569bebf04342ee146178e2d36600708b/jsonschema_specifications-2025.9.1.tar.gz", hash = "sha256:b540987f239e745613c7a9176f3edb72b832a4ac465cf02712288397832b5e8d", size = 32855 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/41/45/1a4ed80516f02155c51f51e8cedb3c1902296743db0bbc66608a0db2814f/jsonschema_specifications-2025.9.1-py3-none-any.whl", hash = "sha256:98802fee3a11ee76ecaca44429fda8a41bff98b00a0f2838151b113f210cc6fe", size = 18437 }, +] + +[[package]] +name = "loro" +version = "1.8.2" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/da/7b/35ac8d942be584c8f5c9b991a31a5a8a33144d406fbfb5c791bb94222f0c/loro-1.8.2.tar.gz", hash = "sha256:d22dc17cbec652ed8bf627f801a0a32e27a87b4476a2ab96f45a02d163d733ae", size = 67766 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/03/6c/08cca29c757148f1013948f4f9469a57dc146b0bb0f0fba3d5b0c2e50ea6/loro-1.8.2-cp312-cp312-macosx_10_12_x86_64.whl", hash = "sha256:d1df0d790eed380afdca28ebe8f4ae42688b8683522e81ccf9fffca7f76f210c", size = 3119329 }, + { url = "https://files.pythonhosted.org/packages/5e/ab/cd53107088533c2f32136230bcde58026cf4c16700dc63e93b33e45ee7c4/loro-1.8.2-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:764e51163fd3f94835703746ae8a0eefbef9016536e0141ec5ae22da498d0d89", size = 2908530 }, + { url = "https://files.pythonhosted.org/packages/d1/01/5262a02499ae2f47e5a2e545757eb515758eab14a21a9b5e5721b7214b0e/loro-1.8.2-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:fc7bed8f95a7b9d2c4d3be54355b176c75efc72a4de160c951a0e2759c562b0d", size = 3136916 }, + { url = "https://files.pythonhosted.org/packages/69/56/e0371fe0d7306e23d1555571db19ba10acad3c30ae1ba37af323e4c53953/loro-1.8.2-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:75a29b80640e845ffe71e0f9262c38605fee3ac47fb46f701273587f97bff56b", size = 3213049 }, + { url = "https://files.pythonhosted.org/packages/9d/34/348bc856c01def9ef16b574820329a625b69bd15983e26285f5eca91338a/loro-1.8.2-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:ca7b0370c1bfa2480d2a38a7cf4478584895bee0287ae3109d3b5f44f908d783", size = 3588230 }, + { url = "https://files.pythonhosted.org/packages/42/2f/c7f93ceff1aa10768d4dbe0ce6a8288e93cb71a963fff7f3ad1e93fe3da2/loro-1.8.2-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:3f93478c1cce48bb3675b853770b181d650ec6715d38c91ccc713f914d5f2530", size = 3311038 }, + { url = "https://files.pythonhosted.org/packages/db/4c/1880a46296339f6b22774c276480fa2e28d030cd9b22cdcd83f49b4d074e/loro-1.8.2-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:971ed7f9e6415df35fdecb175bffdf2b684f0ce98b13980e9ab716b88f81cf5d", size = 3200383 }, + { url = "https://files.pythonhosted.org/packages/8e/03/5fb9f70ed68d5404778b3fe736d32446b7dc7e5f8f4ac9e5c02c6d823011/loro-1.8.2-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:0955b19affabff721668d1902fd0e2fa55349e19c47e2fe206049ce216614c86", size = 3542736 }, + { url = "https://files.pythonhosted.org/packages/4a/7a/24ea8d3364aa9f1989b3c872d26e19f75ef2547122c86f94ee8488882c47/loro-1.8.2-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:2d7cdbff67d74360fc32fed92383b96b1d5fa744195fb3c676858e69c5344a8a", size = 3317330 }, + { url = "https://files.pythonhosted.org/packages/88/86/821ef7ae135389197221d628e6669598d0a1adde436a36b47f06dce0af46/loro-1.8.2-cp312-cp312-musllinux_1_2_armv7l.whl", hash = "sha256:9147f43f7e39503e8dc4c753172b073bccc61d1fcf142ed4e049f271f1b03d22", size = 3477573 }, + { url = "https://files.pythonhosted.org/packages/79/3f/db1c663e4d18ccc07fba3e33a1136e04d35d5ed58c79a38218a88dca73dc/loro-1.8.2-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:2af01673ee899fd6930c652a708a703d4e66f340f748d20ed0ba1afe8e6fa29e", size = 3522001 }, + { url = "https://files.pythonhosted.org/packages/92/c6/ed8a65d5367f9050474b2ca495d1f673c050ab6046209b7c1100e2543fa4/loro-1.8.2-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:050156868ea84e1b2b811fd75b8b30c65748f88e3facc3cfcf29df1214f5d38e", size = 3422105 }, + { url = "https://files.pythonhosted.org/packages/f7/01/05ea9746f252ca66d90f13bac0f1b263ffe4cb589db8cafc55d3ce6b059b/loro-1.8.2-cp312-cp312-win32.whl", hash = "sha256:32a45cb8828c9fd3d1d650b7b04358940b21218f03ec83eb7043162fe8495132", size = 2614076 }, + { url = "https://files.pythonhosted.org/packages/11/a2/3a9ccd4c8b4aea64526e71b789f7969acf8c9695239265e0469385702802/loro-1.8.2-cp312-cp312-win_amd64.whl", hash = "sha256:09b26f0cc601d3b9b10283e840b21cf4a9dc4a7c554f936e79d484abeec8b0c4", size = 2771893 }, + { url = "https://files.pythonhosted.org/packages/8a/cb/a1e04f8a754a84e5614691d6c3bfe60c2c0b145906180e0965c838fe4a99/loro-1.8.2-cp313-cp313-macosx_10_12_x86_64.whl", hash = "sha256:1fbb612dad91a29a1c1930da4e70ac39c8d9bf254835e02b49a961f87c8bcab8", size = 3118777 }, + { url = "https://files.pythonhosted.org/packages/f8/81/2d1d7c621b34ac2f16116257956acec8c89c4db54b4c69a3f2b4c04473dd/loro-1.8.2-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:ddcd12efd7070768074e5d8ae2cb20dc64ee6148fc42725f94ec9975398a6068", size = 2907708 }, + { url = "https://files.pythonhosted.org/packages/cf/22/d4a3b310f1d24ea13763d4a955bfe2d0e7b19def688f36acfb4bfedccb9c/loro-1.8.2-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8e45bd2b699c1fe46612600d5309ee1a547c800bd75c63b5d34fbff2e93ce7d0", size = 3136961 }, + { url = "https://files.pythonhosted.org/packages/3c/86/141cae20c24828859071817b677126e7777cef30baaca6c39d89a25537d5/loro-1.8.2-cp313-cp313-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:c80a74d11be97c3bc0853b736a476ba3592875ec9044bd5f9632ad0d232d6a7b", size = 3212741 }, + { url = "https://files.pythonhosted.org/packages/29/06/d6448b7fdf56468832429b42f2121f5adb6c79855f42662a1b97c977f093/loro-1.8.2-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:856b16af33c9374d1ac3ec05169a49af888e4ed6c35c922df589e328286fa0fb", size = 3588711 }, + { url = "https://files.pythonhosted.org/packages/3f/79/72fe346187197862b40e2e2af2c6af19ae61110bde8b69a773018c18cdd2/loro-1.8.2-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:58f189140e1d4546952784a46a31916f39b0bdceec87d45ca2457cf16da82de3", size = 3311449 }, + { url = "https://files.pythonhosted.org/packages/8b/fb/2ea45e6e5635c12751e42b552e272d2e7acc08a0d39ca363eca656ad1157/loro-1.8.2-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1039a12ae997c0b4ec8f147f8dc5d542d48bdc4a02374deb4019ff22b6012a04", size = 3200241 }, + { url = "https://files.pythonhosted.org/packages/58/1c/c60ad1c6efed6adc17402a6d8ea22f5571c2f31bbceaf27f017769687c6c/loro-1.8.2-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:e00fc2aecf14108b424f9566cfa469ff8e914208d72b146dca6a1c475377110e", size = 3542571 }, + { url = "https://files.pythonhosted.org/packages/4c/a5/ee981e6072056c562b69137e7b0b8bd77f16eda61cd9f7bb2a5827b86a4e/loro-1.8.2-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:257a673bb67e2d60ac50b8d19556f340f4e59afbd355a2290e0786756c8b41c9", size = 3316938 }, + { url = "https://files.pythonhosted.org/packages/c2/f1/2c3f039d11c6e4868097e586f176eb818ffa7c8a6f144c8f520752b22efb/loro-1.8.2-cp313-cp313-musllinux_1_2_armv7l.whl", hash = "sha256:5b95219f68dcaf506d2c2b67aed1f523ae33886a921696156fd7bca2f6b88c77", size = 3477852 }, + { url = "https://files.pythonhosted.org/packages/84/28/c5fa1f1335d866c9b8ca88e9e3a6148e3e923c95a6d065fd9b168b18576d/loro-1.8.2-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:ab60cd92c2b773529a4e7a1ad1fe4f6b5e869b8ab62686723a83ae5d00841c0f", size = 3521660 }, + { url = "https://files.pythonhosted.org/packages/82/85/76d7dbaac05408c560f0620b66cc01490606fdd39ae309a24cdb7adfd793/loro-1.8.2-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:e98d1e9f164777d883fb037f68941627e91bce180860a272e0297ec258ffe32c", size = 3422136 }, + { url = "https://files.pythonhosted.org/packages/f6/9c/88ab3f33b995bf11a80f27def78795445d0bd8fdbdc6272f20d08edee5fa/loro-1.8.2-cp313-cp313-win32.whl", hash = "sha256:ff83c1d4a8d12c0df48c8f29bf948aed6c94e62bcbae13d41fd963af2ecf0d8c", size = 2613680 }, + { url = "https://files.pythonhosted.org/packages/79/68/2677ca414034f27a62fac7a504e776ba94167f9fb66c1c619b29ba6faa37/loro-1.8.2-cp313-cp313-win_amd64.whl", hash = "sha256:1c2f8a9b0d76ac17d926eca013ed9d5281be9cd6d94130886f20c67089a43f94", size = 2771659 }, + { url = "https://files.pythonhosted.org/packages/e5/1c/87f54a03b9dcbc0861df9c7c1aaee39638994e895fb14e9fa6c74670e5a1/loro-1.8.2-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d5d4ed382d0431b4ad709dd07cecf80135bd8e4672788172f6af245744549187", size = 3132834 }, + { url = "https://files.pythonhosted.org/packages/33/3f/63f9ed0f9836c63bb3dc19517b50607876f153c5d328730a7529619c4602/loro-1.8.2-cp313-cp313t-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:00681946c6a445eb2ee5aae887e2ddf431fe81aa78e01eeb91cb4ef98ef8277c", size = 3208564 }, + { url = "https://files.pythonhosted.org/packages/3f/99/309a716171e6f9224a1f614419bb875e9f40c1879a8a95ca2312e7f33f67/loro-1.8.2-cp313-cp313t-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:b5ab40ae72c5913ccca0c5a3e5fbebfc5baec8129d5bc93f51da1718e56c9a2a", size = 3584869 }, + { url = "https://files.pythonhosted.org/packages/65/a6/70467495ab274fbefb81c15a1bb3ec824d61b5ebd6f5ef6abe0f873fc52b/loro-1.8.2-cp313-cp313t-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:c6545d4339f22e0fc897970f77015b636bc84c883c0631b1ad7d04839e3e4094", size = 3303725 }, + { url = "https://files.pythonhosted.org/packages/c4/d5/a1e535b037f413623eea932e2c72387993198836312e4125d24fcd0d515c/loro-1.8.2-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:6931e44ca9e1afec359bf4c21443bd2e484fac112e1604024f1e5b93bc247854", size = 3311368 }, + { url = "https://files.pythonhosted.org/packages/41/72/7db5794a30fbf1ff3e39066e22a1fd07938ac5d50e465933418d1541be17/loro-1.8.2-cp313-cp313t-musllinux_1_2_armv7l.whl", hash = "sha256:7516dfc3ead095e78d814921a4e16ba90d61d93c1a37189b5ea9fd5683dc3b0f", size = 3473187 }, + { url = "https://files.pythonhosted.org/packages/e5/0d/57c893a6cc0aae52a15fa2e86d1cd2b2dc28387f02acce3fbb573ac918df/loro-1.8.2-cp313-cp313t-musllinux_1_2_i686.whl", hash = "sha256:8d27ece1d1440cf1135f94be9c6b753ac810534a3d86118bd3d2a11272456bd2", size = 3517606 }, + { url = "https://files.pythonhosted.org/packages/28/ff/0c1182d06ade73cb408448ff279423e8da9fe09c8ac8b0c2affbe7d937c1/loro-1.8.2-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:79d7c309447339f72edbb468edb998f0a0dbd1c3bea70c92897f9baae02b7c79", size = 3420002 }, + { url = "https://files.pythonhosted.org/packages/ab/3f/62667497c325e6af2d7a3761a92ffbb18bcf62857dd28a47e9d170da6e61/loro-1.8.2-cp314-cp314-macosx_10_12_x86_64.whl", hash = "sha256:9febfc1ff026af58ddff2038245cfc8725be50a322352c6ca4fa4c2c3fd7ed66", size = 3098742 }, + { url = "https://files.pythonhosted.org/packages/40/c8/d1aefd4ffdc3820b4af0d56742d4dc24deb0f88967c431c0b5b00f404592/loro-1.8.2-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:6e299f5db4ee3eb83492129e6e6735bf8e0d1227e7fe9181783a53307b0ca154", size = 2902853 }, + { url = "https://files.pythonhosted.org/packages/82/f8/4faff4ac6962c41fcc6ee380f4dcacc8307aa0afd34cf3f389f19b54ac53/loro-1.8.2-cp314-cp314-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2b01db2448b143c5b417eb75ac96c383239647c0cd0c539735020413a8e5de3c", size = 3187824 }, + { url = "https://files.pythonhosted.org/packages/46/47/8380740e034e0de2e6663f9b5e3ff3a6c9e9a1017cd18303b790be2d3a76/loro-1.8.2-cp314-cp314-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:9e497def0e9877778aa1ff0181667bae8f52116c9adafaeb46927abbf3e9ad69", size = 3532937 }, + { url = "https://files.pythonhosted.org/packages/f4/ee/51ea23aca3a0ac99172dde3920a941738bdef1dc02fd23895b4e18b4745c/loro-1.8.2-cp314-cp314-win32.whl", hash = "sha256:aeaa61b14ec5826088b815a99d206f3b45a65c2c36f804954ac0d961b399a661", size = 2603096 }, + { url = "https://files.pythonhosted.org/packages/5f/c9/9173500b4b54a13c1cd558eb42b95c552598ac18357aa9fbda9faf3e9af8/loro-1.8.2-cp314-cp314-win_amd64.whl", hash = "sha256:45999b244e33c83601999b8eb239373667ab465ab00d8afdfad0f432a759a27f", size = 2757675 }, +] + +[[package]] +name = "marimo" +version = "0.18.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "click" }, + { name = "docutils" }, + { name = "itsdangerous" }, + { name = "jedi" }, + { name = "loro", marker = "python_full_version < '3.14'" }, + { name = "markdown" }, + { name = "msgspec-m" }, + { name = "narwhals" }, + { name = "packaging" }, + { name = "psutil" }, + { name = "pygments" }, + { name = "pymdown-extensions" }, + { name = "pyyaml" }, + { name = "starlette" }, + { name = "tomlkit" }, + { name = "uvicorn" }, + { name = "websockets" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/69/91/7648bc680f6c583bc93bcc0034f835609d3f4ef89082f52d5022388b1a46/marimo-0.18.0.tar.gz", hash = "sha256:7a6ccd943cf817c56e8e35b7daeb67240b398d27f2f8a0647ef62c7b7e57ef27", size = 33493100 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/d8/e5/414212416fbd0769014c6a6660bfeaaecca69baf5ecef3125204ffacc8bc/marimo-0.18.0-py3-none-any.whl", hash = "sha256:3cd46b889294edf9af57dbf9d4239b4c262ac8b26ca131278d910b991af78f1e", size = 34007479 }, +] + +[[package]] +name = "markdown" +version = "3.10" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/7d/ab/7dd27d9d863b3376fcf23a5a13cb5d024aed1db46f963f1b5735ae43b3be/markdown-3.10.tar.gz", hash = "sha256:37062d4f2aa4b2b6b32aefb80faa300f82cc790cb949a35b8caede34f2b68c0e", size = 364931 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/70/81/54e3ce63502cd085a0c556652a4e1b919c45a446bd1e5300e10c44c8c521/markdown-3.10-py3-none-any.whl", hash = "sha256:b5b99d6951e2e4948d939255596523444c0e677c669700b1d17aa4a8a464cb7c", size = 107678 }, +] + +[[package]] +name = "markupsafe" +version = "3.0.3" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/7e/99/7690b6d4034fffd95959cbe0c02de8deb3098cc577c67bb6a24fe5d7caa7/markupsafe-3.0.3.tar.gz", hash = "sha256:722695808f4b6457b320fdc131280796bdceb04ab50fe1795cd540799ebe1698", size = 80313 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/5a/72/147da192e38635ada20e0a2e1a51cf8823d2119ce8883f7053879c2199b5/markupsafe-3.0.3-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:d53197da72cc091b024dd97249dfc7794d6a56530370992a5e1a08983ad9230e", size = 11615 }, + { url = "https://files.pythonhosted.org/packages/9a/81/7e4e08678a1f98521201c3079f77db69fb552acd56067661f8c2f534a718/markupsafe-3.0.3-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:1872df69a4de6aead3491198eaf13810b565bdbeec3ae2dc8780f14458ec73ce", size = 12020 }, + { url = "https://files.pythonhosted.org/packages/1e/2c/799f4742efc39633a1b54a92eec4082e4f815314869865d876824c257c1e/markupsafe-3.0.3-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:3a7e8ae81ae39e62a41ec302f972ba6ae23a5c5396c8e60113e9066ef893da0d", size = 24332 }, + { url = "https://files.pythonhosted.org/packages/3c/2e/8d0c2ab90a8c1d9a24f0399058ab8519a3279d1bd4289511d74e909f060e/markupsafe-3.0.3-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:d6dd0be5b5b189d31db7cda48b91d7e0a9795f31430b7f271219ab30f1d3ac9d", size = 22947 }, + { url = "https://files.pythonhosted.org/packages/2c/54/887f3092a85238093a0b2154bd629c89444f395618842e8b0c41783898ea/markupsafe-3.0.3-cp312-cp312-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:94c6f0bb423f739146aec64595853541634bde58b2135f27f61c1ffd1cd4d16a", size = 21962 }, + { url = "https://files.pythonhosted.org/packages/c9/2f/336b8c7b6f4a4d95e91119dc8521402461b74a485558d8f238a68312f11c/markupsafe-3.0.3-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:be8813b57049a7dc738189df53d69395eba14fb99345e0a5994914a3864c8a4b", size = 23760 }, + { url = "https://files.pythonhosted.org/packages/32/43/67935f2b7e4982ffb50a4d169b724d74b62a3964bc1a9a527f5ac4f1ee2b/markupsafe-3.0.3-cp312-cp312-musllinux_1_2_riscv64.whl", hash = "sha256:83891d0e9fb81a825d9a6d61e3f07550ca70a076484292a70fde82c4b807286f", size = 21529 }, + { url = "https://files.pythonhosted.org/packages/89/e0/4486f11e51bbba8b0c041098859e869e304d1c261e59244baa3d295d47b7/markupsafe-3.0.3-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:77f0643abe7495da77fb436f50f8dab76dbc6e5fd25d39589a0f1fe6548bfa2b", size = 23015 }, + { url = "https://files.pythonhosted.org/packages/2f/e1/78ee7a023dac597a5825441ebd17170785a9dab23de95d2c7508ade94e0e/markupsafe-3.0.3-cp312-cp312-win32.whl", hash = "sha256:d88b440e37a16e651bda4c7c2b930eb586fd15ca7406cb39e211fcff3bf3017d", size = 14540 }, + { url = "https://files.pythonhosted.org/packages/aa/5b/bec5aa9bbbb2c946ca2733ef9c4ca91c91b6a24580193e891b5f7dbe8e1e/markupsafe-3.0.3-cp312-cp312-win_amd64.whl", hash = "sha256:26a5784ded40c9e318cfc2bdb30fe164bdb8665ded9cd64d500a34fb42067b1c", size = 15105 }, + { url = "https://files.pythonhosted.org/packages/e5/f1/216fc1bbfd74011693a4fd837e7026152e89c4bcf3e77b6692fba9923123/markupsafe-3.0.3-cp312-cp312-win_arm64.whl", hash = "sha256:35add3b638a5d900e807944a078b51922212fb3dedb01633a8defc4b01a3c85f", size = 13906 }, + { url = "https://files.pythonhosted.org/packages/38/2f/907b9c7bbba283e68f20259574b13d005c121a0fa4c175f9bed27c4597ff/markupsafe-3.0.3-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:e1cf1972137e83c5d4c136c43ced9ac51d0e124706ee1c8aa8532c1287fa8795", size = 11622 }, + { url = "https://files.pythonhosted.org/packages/9c/d9/5f7756922cdd676869eca1c4e3c0cd0df60ed30199ffd775e319089cb3ed/markupsafe-3.0.3-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:116bb52f642a37c115f517494ea5feb03889e04df47eeff5b130b1808ce7c219", size = 12029 }, + { url = "https://files.pythonhosted.org/packages/00/07/575a68c754943058c78f30db02ee03a64b3c638586fba6a6dd56830b30a3/markupsafe-3.0.3-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:133a43e73a802c5562be9bbcd03d090aa5a1fe899db609c29e8c8d815c5f6de6", size = 24374 }, + { url = "https://files.pythonhosted.org/packages/a9/21/9b05698b46f218fc0e118e1f8168395c65c8a2c750ae2bab54fc4bd4e0e8/markupsafe-3.0.3-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:ccfcd093f13f0f0b7fdd0f198b90053bf7b2f02a3927a30e63f3ccc9df56b676", size = 22980 }, + { url = "https://files.pythonhosted.org/packages/7f/71/544260864f893f18b6827315b988c146b559391e6e7e8f7252839b1b846a/markupsafe-3.0.3-cp313-cp313-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:509fa21c6deb7a7a273d629cf5ec029bc209d1a51178615ddf718f5918992ab9", size = 21990 }, + { url = "https://files.pythonhosted.org/packages/c2/28/b50fc2f74d1ad761af2f5dcce7492648b983d00a65b8c0e0cb457c82ebbe/markupsafe-3.0.3-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:a4afe79fb3de0b7097d81da19090f4df4f8d3a2b3adaa8764138aac2e44f3af1", size = 23784 }, + { url = "https://files.pythonhosted.org/packages/ed/76/104b2aa106a208da8b17a2fb72e033a5a9d7073c68f7e508b94916ed47a9/markupsafe-3.0.3-cp313-cp313-musllinux_1_2_riscv64.whl", hash = "sha256:795e7751525cae078558e679d646ae45574b47ed6e7771863fcc079a6171a0fc", size = 21588 }, + { url = "https://files.pythonhosted.org/packages/b5/99/16a5eb2d140087ebd97180d95249b00a03aa87e29cc224056274f2e45fd6/markupsafe-3.0.3-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:8485f406a96febb5140bfeca44a73e3ce5116b2501ac54fe953e488fb1d03b12", size = 23041 }, + { url = "https://files.pythonhosted.org/packages/19/bc/e7140ed90c5d61d77cea142eed9f9c303f4c4806f60a1044c13e3f1471d0/markupsafe-3.0.3-cp313-cp313-win32.whl", hash = "sha256:bdd37121970bfd8be76c5fb069c7751683bdf373db1ed6c010162b2a130248ed", size = 14543 }, + { url = "https://files.pythonhosted.org/packages/05/73/c4abe620b841b6b791f2edc248f556900667a5a1cf023a6646967ae98335/markupsafe-3.0.3-cp313-cp313-win_amd64.whl", hash = "sha256:9a1abfdc021a164803f4d485104931fb8f8c1efd55bc6b748d2f5774e78b62c5", size = 15113 }, + { url = "https://files.pythonhosted.org/packages/f0/3a/fa34a0f7cfef23cf9500d68cb7c32dd64ffd58a12b09225fb03dd37d5b80/markupsafe-3.0.3-cp313-cp313-win_arm64.whl", hash = "sha256:7e68f88e5b8799aa49c85cd116c932a1ac15caaa3f5db09087854d218359e485", size = 13911 }, + { url = "https://files.pythonhosted.org/packages/e4/d7/e05cd7efe43a88a17a37b3ae96e79a19e846f3f456fe79c57ca61356ef01/markupsafe-3.0.3-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:218551f6df4868a8d527e3062d0fb968682fe92054e89978594c28e642c43a73", size = 11658 }, + { url = "https://files.pythonhosted.org/packages/99/9e/e412117548182ce2148bdeacdda3bb494260c0b0184360fe0d56389b523b/markupsafe-3.0.3-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:3524b778fe5cfb3452a09d31e7b5adefeea8c5be1d43c4f810ba09f2ceb29d37", size = 12066 }, + { url = "https://files.pythonhosted.org/packages/bc/e6/fa0ffcda717ef64a5108eaa7b4f5ed28d56122c9a6d70ab8b72f9f715c80/markupsafe-3.0.3-cp313-cp313t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:4e885a3d1efa2eadc93c894a21770e4bc67899e3543680313b09f139e149ab19", size = 25639 }, + { url = "https://files.pythonhosted.org/packages/96/ec/2102e881fe9d25fc16cb4b25d5f5cde50970967ffa5dddafdb771237062d/markupsafe-3.0.3-cp313-cp313t-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:8709b08f4a89aa7586de0aadc8da56180242ee0ada3999749b183aa23df95025", size = 23569 }, + { url = "https://files.pythonhosted.org/packages/4b/30/6f2fce1f1f205fc9323255b216ca8a235b15860c34b6798f810f05828e32/markupsafe-3.0.3-cp313-cp313t-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:b8512a91625c9b3da6f127803b166b629725e68af71f8184ae7e7d54686a56d6", size = 23284 }, + { url = "https://files.pythonhosted.org/packages/58/47/4a0ccea4ab9f5dcb6f79c0236d954acb382202721e704223a8aafa38b5c8/markupsafe-3.0.3-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:9b79b7a16f7fedff2495d684f2b59b0457c3b493778c9eed31111be64d58279f", size = 24801 }, + { url = "https://files.pythonhosted.org/packages/6a/70/3780e9b72180b6fecb83a4814d84c3bf4b4ae4bf0b19c27196104149734c/markupsafe-3.0.3-cp313-cp313t-musllinux_1_2_riscv64.whl", hash = "sha256:12c63dfb4a98206f045aa9563db46507995f7ef6d83b2f68eda65c307c6829eb", size = 22769 }, + { url = "https://files.pythonhosted.org/packages/98/c5/c03c7f4125180fc215220c035beac6b9cb684bc7a067c84fc69414d315f5/markupsafe-3.0.3-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:8f71bc33915be5186016f675cd83a1e08523649b0e33efdb898db577ef5bb009", size = 23642 }, + { url = "https://files.pythonhosted.org/packages/80/d6/2d1b89f6ca4bff1036499b1e29a1d02d282259f3681540e16563f27ebc23/markupsafe-3.0.3-cp313-cp313t-win32.whl", hash = "sha256:69c0b73548bc525c8cb9a251cddf1931d1db4d2258e9599c28c07ef3580ef354", size = 14612 }, + { url = "https://files.pythonhosted.org/packages/2b/98/e48a4bfba0a0ffcf9925fe2d69240bfaa19c6f7507b8cd09c70684a53c1e/markupsafe-3.0.3-cp313-cp313t-win_amd64.whl", hash = "sha256:1b4b79e8ebf6b55351f0d91fe80f893b4743f104bff22e90697db1590e47a218", size = 15200 }, + { url = "https://files.pythonhosted.org/packages/0e/72/e3cc540f351f316e9ed0f092757459afbc595824ca724cbc5a5d4263713f/markupsafe-3.0.3-cp313-cp313t-win_arm64.whl", hash = "sha256:ad2cf8aa28b8c020ab2fc8287b0f823d0a7d8630784c31e9ee5edea20f406287", size = 13973 }, + { url = "https://files.pythonhosted.org/packages/33/8a/8e42d4838cd89b7dde187011e97fe6c3af66d8c044997d2183fbd6d31352/markupsafe-3.0.3-cp314-cp314-macosx_10_13_x86_64.whl", hash = "sha256:eaa9599de571d72e2daf60164784109f19978b327a3910d3e9de8c97b5b70cfe", size = 11619 }, + { url = "https://files.pythonhosted.org/packages/b5/64/7660f8a4a8e53c924d0fa05dc3a55c9cee10bbd82b11c5afb27d44b096ce/markupsafe-3.0.3-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:c47a551199eb8eb2121d4f0f15ae0f923d31350ab9280078d1e5f12b249e0026", size = 12029 }, + { url = "https://files.pythonhosted.org/packages/da/ef/e648bfd021127bef5fa12e1720ffed0c6cbb8310c8d9bea7266337ff06de/markupsafe-3.0.3-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:f34c41761022dd093b4b6896d4810782ffbabe30f2d443ff5f083e0cbbb8c737", size = 24408 }, + { url = "https://files.pythonhosted.org/packages/41/3c/a36c2450754618e62008bf7435ccb0f88053e07592e6028a34776213d877/markupsafe-3.0.3-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:457a69a9577064c05a97c41f4e65148652db078a3a509039e64d3467b9e7ef97", size = 23005 }, + { url = "https://files.pythonhosted.org/packages/bc/20/b7fdf89a8456b099837cd1dc21974632a02a999ec9bf7ca3e490aacd98e7/markupsafe-3.0.3-cp314-cp314-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:e8afc3f2ccfa24215f8cb28dcf43f0113ac3c37c2f0f0806d8c70e4228c5cf4d", size = 22048 }, + { url = "https://files.pythonhosted.org/packages/9a/a7/591f592afdc734f47db08a75793a55d7fbcc6902a723ae4cfbab61010cc5/markupsafe-3.0.3-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:ec15a59cf5af7be74194f7ab02d0f59a62bdcf1a537677ce67a2537c9b87fcda", size = 23821 }, + { url = "https://files.pythonhosted.org/packages/7d/33/45b24e4f44195b26521bc6f1a82197118f74df348556594bd2262bda1038/markupsafe-3.0.3-cp314-cp314-musllinux_1_2_riscv64.whl", hash = "sha256:0eb9ff8191e8498cca014656ae6b8d61f39da5f95b488805da4bb029cccbfbaf", size = 21606 }, + { url = "https://files.pythonhosted.org/packages/ff/0e/53dfaca23a69fbfbbf17a4b64072090e70717344c52eaaaa9c5ddff1e5f0/markupsafe-3.0.3-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:2713baf880df847f2bece4230d4d094280f4e67b1e813eec43b4c0e144a34ffe", size = 23043 }, + { url = "https://files.pythonhosted.org/packages/46/11/f333a06fc16236d5238bfe74daccbca41459dcd8d1fa952e8fbd5dccfb70/markupsafe-3.0.3-cp314-cp314-win32.whl", hash = "sha256:729586769a26dbceff69f7a7dbbf59ab6572b99d94576a5592625d5b411576b9", size = 14747 }, + { url = "https://files.pythonhosted.org/packages/28/52/182836104b33b444e400b14f797212f720cbc9ed6ba34c800639d154e821/markupsafe-3.0.3-cp314-cp314-win_amd64.whl", hash = "sha256:bdc919ead48f234740ad807933cdf545180bfbe9342c2bb451556db2ed958581", size = 15341 }, + { url = "https://files.pythonhosted.org/packages/6f/18/acf23e91bd94fd7b3031558b1f013adfa21a8e407a3fdb32745538730382/markupsafe-3.0.3-cp314-cp314-win_arm64.whl", hash = "sha256:5a7d5dc5140555cf21a6fefbdbf8723f06fcd2f63ef108f2854de715e4422cb4", size = 14073 }, + { url = "https://files.pythonhosted.org/packages/3c/f0/57689aa4076e1b43b15fdfa646b04653969d50cf30c32a102762be2485da/markupsafe-3.0.3-cp314-cp314t-macosx_10_13_x86_64.whl", hash = "sha256:1353ef0c1b138e1907ae78e2f6c63ff67501122006b0f9abad68fda5f4ffc6ab", size = 11661 }, + { url = "https://files.pythonhosted.org/packages/89/c3/2e67a7ca217c6912985ec766c6393b636fb0c2344443ff9d91404dc4c79f/markupsafe-3.0.3-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:1085e7fbddd3be5f89cc898938f42c0b3c711fdcb37d75221de2666af647c175", size = 12069 }, + { url = "https://files.pythonhosted.org/packages/f0/00/be561dce4e6ca66b15276e184ce4b8aec61fe83662cce2f7d72bd3249d28/markupsafe-3.0.3-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:1b52b4fb9df4eb9ae465f8d0c228a00624de2334f216f178a995ccdcf82c4634", size = 25670 }, + { url = "https://files.pythonhosted.org/packages/50/09/c419f6f5a92e5fadde27efd190eca90f05e1261b10dbd8cbcb39cd8ea1dc/markupsafe-3.0.3-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:fed51ac40f757d41b7c48425901843666a6677e3e8eb0abcff09e4ba6e664f50", size = 23598 }, + { url = "https://files.pythonhosted.org/packages/22/44/a0681611106e0b2921b3033fc19bc53323e0b50bc70cffdd19f7d679bb66/markupsafe-3.0.3-cp314-cp314t-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:f190daf01f13c72eac4efd5c430a8de82489d9cff23c364c3ea822545032993e", size = 23261 }, + { url = "https://files.pythonhosted.org/packages/5f/57/1b0b3f100259dc9fffe780cfb60d4be71375510e435efec3d116b6436d43/markupsafe-3.0.3-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:e56b7d45a839a697b5eb268c82a71bd8c7f6c94d6fd50c3d577fa39a9f1409f5", size = 24835 }, + { url = "https://files.pythonhosted.org/packages/26/6a/4bf6d0c97c4920f1597cc14dd720705eca0bf7c787aebc6bb4d1bead5388/markupsafe-3.0.3-cp314-cp314t-musllinux_1_2_riscv64.whl", hash = "sha256:f3e98bb3798ead92273dc0e5fd0f31ade220f59a266ffd8a4f6065e0a3ce0523", size = 22733 }, + { url = "https://files.pythonhosted.org/packages/14/c7/ca723101509b518797fedc2fdf79ba57f886b4aca8a7d31857ba3ee8281f/markupsafe-3.0.3-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:5678211cb9333a6468fb8d8be0305520aa073f50d17f089b5b4b477ea6e67fdc", size = 23672 }, + { url = "https://files.pythonhosted.org/packages/fb/df/5bd7a48c256faecd1d36edc13133e51397e41b73bb77e1a69deab746ebac/markupsafe-3.0.3-cp314-cp314t-win32.whl", hash = "sha256:915c04ba3851909ce68ccc2b8e2cd691618c4dc4c4232fb7982bca3f41fd8c3d", size = 14819 }, + { url = "https://files.pythonhosted.org/packages/1a/8a/0402ba61a2f16038b48b39bccca271134be00c5c9f0f623208399333c448/markupsafe-3.0.3-cp314-cp314t-win_amd64.whl", hash = "sha256:4faffd047e07c38848ce017e8725090413cd80cbc23d86e55c587bf979e579c9", size = 15426 }, + { url = "https://files.pythonhosted.org/packages/70/bc/6f1c2f612465f5fa89b95bead1f44dcb607670fd42891d8fdcd5d039f4f4/markupsafe-3.0.3-cp314-cp314t-win_arm64.whl", hash = "sha256:32001d6a8fc98c8cb5c947787c5d08b0a50663d139f1305bac5885d98d9b40fa", size = 14146 }, +] + +[[package]] +name = "msgspec-m" +version = "0.19.3" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/3b/f4/74f6ae9084690280a59b6dc6de52189b21303c505a188ef435a7eafe371e/msgspec_m-0.19.3.tar.gz", hash = "sha256:074d56f17de25e6c0f4184ecff9c163de0f612a9956260df4342f3f51d959c41", size = 319640 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/75/ae/e13adb80e3d6639e1b80048f38de477abb8db8c77e1ee3b5b23acc8ade62/msgspec_m-0.19.3-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:811145e8db3939e429da2ad4830ec34a1e411b538246d74ff3a3893022581abc", size = 219448 }, + { url = "https://files.pythonhosted.org/packages/f0/20/70a2256a3823c807e52fa6a790f5506eb0e0403eb4af8e0db5583fe7ebeb/msgspec_m-0.19.3-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:cff8e7f9e77383975e842b6c12413728716629b86ab5013df06fa5fc75fef3c6", size = 226219 }, + { url = "https://files.pythonhosted.org/packages/97/cf/dfd632aff5d92bf96a769e8161d44f1a1abb76f13b5aae01eded709f829d/msgspec_m-0.19.3-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:78327d975db6219b668a763e0cae5d233a40420e5e99c0d682c0801dae9b572a", size = 214686 }, + { url = "https://files.pythonhosted.org/packages/ba/cb/048a96efd70be8ec8a310cfb4fa0b934e14d672b4a40145ab7d75d13be5b/msgspec_m-0.19.3-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:5d2a75ae25770aff3e962c960a9d5cded31d40d515ed2ae8d13bf0053a0fb782", size = 221849 }, + { url = "https://files.pythonhosted.org/packages/5f/bb/36ef65159d106dd6b294b300dfa66dafbc407585e6ee9afe9cb684ffe959/msgspec_m-0.19.3-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:8d65b906742858ef327f0be155adaf0276e904129aa350794e596eef944cc6a7", size = 217106 }, + { url = "https://files.pythonhosted.org/packages/54/d4/f715aae677cf9f4771e903744260b07f103e2b7cf6c544bc1f006c61dd2c/msgspec_m-0.19.3-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:310393f144e05c380cf5466f988bee19b922a735877f8f6635e506ec03da5cce", size = 225426 }, + { url = "https://files.pythonhosted.org/packages/b7/08/f2d143ca3c25ad7907e043408d4efd46af60b4942b59ddc7b351f3623455/msgspec_m-0.19.3-cp312-cp312-win_amd64.whl", hash = "sha256:2173c441951d3a55269b612826e64272c4bb1e3f18085165b6eb43ce15fa5c29", size = 188161 }, + { url = "https://files.pythonhosted.org/packages/c0/a3/a2d08e39ad2aa48d448cfdcad7161cd32cdd00d1a9cc1c98a49819468755/msgspec_m-0.19.3-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:87bccfbecd0943ac12d4b51181dd8cc53bbcd68440b12624d4c5ed349c7213fe", size = 219549 }, + { url = "https://files.pythonhosted.org/packages/66/01/83a968ecc7474db9112eb0b52ba71281bf2a164b1de7e56ab7a2bc5da6dc/msgspec_m-0.19.3-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:900edb76d8f3f63bd0dae3be211cf71d9a9ff9c10bc538718c23dc99dae39f20", size = 226236 }, + { url = "https://files.pythonhosted.org/packages/37/49/1679085328698406c147832390b76f82799c3586df82fb01c0a40fdc6501/msgspec_m-0.19.3-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:57839618ea750037ccb95523bfaa4f8a12b2230de8685d306f0a09b3f583dc69", size = 214680 }, + { url = "https://files.pythonhosted.org/packages/eb/e9/19927c79400c98ccb3be7418382d43b2c575ce88b904fc74ab69f71af852/msgspec_m-0.19.3-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:9c0286b736d8b3dff224dca88c084e8d08dae59cf821e0ef771e382e95847f22", size = 221978 }, + { url = "https://files.pythonhosted.org/packages/31/d5/f76914c1b831c7621e7f0d53fa6d8140c0e674c715d1a584df0b3263d00f/msgspec_m-0.19.3-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:7b263ca3dd507707a7a2bc82c09746d0dd5a5596e9cdb70ee140ee3eb651084f", size = 217129 }, + { url = "https://files.pythonhosted.org/packages/0f/7e/31c42a50d6dab3dc6983fd2fbdb4fb6cdf61e04a6083f6a274d9bef7bc8a/msgspec_m-0.19.3-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:a9f3a4d009aa40de6c19b588f631832be1a2b24a2f8ddd9bd36d890ec5a42740", size = 225536 }, + { url = "https://files.pythonhosted.org/packages/d5/38/90468da9a3af38a72d7bc4751ec62a1c812cdeb391b1f70d280c93561d1a/msgspec_m-0.19.3-cp313-cp313-win_amd64.whl", hash = "sha256:97ee5d0006ced20bb02be38aaa67ba34968f324e80ca2de2f501051f52add0fa", size = 188057 }, + { url = "https://files.pythonhosted.org/packages/8c/8e/df8788b514499712d0af7e69309782952e51e188fe80b192f4e93261c8bb/msgspec_m-0.19.3-cp314-cp314-macosx_10_15_x86_64.whl", hash = "sha256:775e3d605a02204f6496cba94c95c29cb015829bdce0c09b17ee59d81465a008", size = 219652 }, + { url = "https://files.pythonhosted.org/packages/59/6f/44466fad5d0e0238f2f9c0e2fdb5babfb8372b9e3a8216bc9d87d03ba3bd/msgspec_m-0.19.3-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:6439f840cd671076bbc28aa2812642aa80f35dde6895bbcc0582e67a43c411c8", size = 225795 }, + { url = "https://files.pythonhosted.org/packages/ee/77/9d22fa4ac8c3bb7aba2f0f8283eae481dff32ff022f79d428538a063f989/msgspec_m-0.19.3-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:c1c0d96afe7963213d23d39f43aa6c7a5ba8a395ed586ac38b1c356bddc18572", size = 214223 }, + { url = "https://files.pythonhosted.org/packages/07/da/cdfb19f0718d6baefb669b299e4a4baea6f88412c362203784c7f28b1906/msgspec_m-0.19.3-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:0a59c864d4062ebfb88bcbb6117f48695518be8c9d57fb883fb4f736e325cf6d", size = 221428 }, + { url = "https://files.pythonhosted.org/packages/67/b2/644dfb8c56e04caf5509e08c394b19f3e4b1cf6f3de2245d51a975243245/msgspec_m-0.19.3-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:b66484e6427c00e4c18b86ebf8dcf8948f7c7d9e9a8ffed0b79c9bae222a7370", size = 216765 }, + { url = "https://files.pythonhosted.org/packages/67/33/1a01022f2324384a984990a560f48df4c030b20ad343a8b75c5fb1fba03e/msgspec_m-0.19.3-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:54b674576c74b886f5553d14e059f4f2ce0afef2193f217ae95d7ecb3c2468eb", size = 224549 }, + { url = "https://files.pythonhosted.org/packages/46/ac/54ce237335c3288b96d2e00d38448db295bac1307aa115ba86fdf976963e/msgspec_m-0.19.3-cp314-cp314-win_amd64.whl", hash = "sha256:257ec1679ccad3f799bebcc06aece2d16cb864487ffe60008de938310024acc2", size = 192109 }, + { url = "https://files.pythonhosted.org/packages/be/a5/2b815e42c397ee7ebddb713459348971e320bf4a5bf76138fddde7938aa7/msgspec_m-0.19.3-cp314-cp314t-macosx_10_15_x86_64.whl", hash = "sha256:e2a42a0e14a78459d63ca9d084446c65026688294dbf57444469a0923d8bbcc9", size = 218260 }, + { url = "https://files.pythonhosted.org/packages/a8/95/50142e4129d5479bd04d9fc3c7a540afac62f536a578c9fedd45446a68c0/msgspec_m-0.19.3-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:3162adfd97d017cd8804c5f339184a169ba8d4f4a5ddec84def52b2828fa5bc7", size = 224162 }, + { url = "https://files.pythonhosted.org/packages/df/17/db9e5358d60f28fa7c9c330fe7c34c360bc9c186de671d757cd495ddb64d/msgspec_m-0.19.3-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:247c8075ea22d1d22fbff4259c2b3c12d41029728147b70804f591997efe0a88", size = 213067 }, + { url = "https://files.pythonhosted.org/packages/18/a1/1f26838070450369ccc0bc0f94bc97b920cdab4ba3451a0a6e92bf1f8543/msgspec_m-0.19.3-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:d7138397e6edcbe60bf51deeda0e49713b6eeab9397f17a3d91e9b436b35b0c1", size = 220767 }, + { url = "https://files.pythonhosted.org/packages/4b/09/a59f16d32868f04beffa9771296c75f266e6320fa82c2a63968baa59bf43/msgspec_m-0.19.3-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:2b032f7c4102266a134954060b4e8d9e5329444ea0eb98befc97ed602ab00cc7", size = 214854 }, + { url = "https://files.pythonhosted.org/packages/8a/0b/37d660fb997f5a5889cf96c68996431859059e283fa4bac2f02cd3e9b321/msgspec_m-0.19.3-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:618b4de4ad867fa3701c2d7fb0f8961397ccc61e053115ddf8605e3795376af6", size = 223432 }, + { url = "https://files.pythonhosted.org/packages/52/96/ba7fed5297556f6cba1199d21c3e2e26ece78c36548985d82ca1ecf7f87b/msgspec_m-0.19.3-cp314-cp314t-win_amd64.whl", hash = "sha256:41891410a28b66d28ff89e00cfbd68f80bc54c2c61ba3393ec01662125561f18", size = 204288 }, +] + +[[package]] +name = "narwhals" +version = "2.12.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/93/f8/e1c28f24b641871c14ccae7ba6381f3c7827789a06e947ce975ae8a9075a/narwhals-2.12.0.tar.gz", hash = "sha256:075b6d56f3a222613793e025744b129439ecdff9292ea6615dd983af7ba6ea44", size = 590404 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/0b/9a/c6f79de7ba3a0a8473129936b7b90aa461d3d46fec6f1627672b1dccf4e9/narwhals-2.12.0-py3-none-any.whl", hash = "sha256:baeba5d448a30b04c299a696bd9ee5ff73e4742143e06c49ca316b46539a7cbb", size = 425014 }, +] + +[[package]] +name = "numpy" +version = "2.3.5" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/76/65/21b3bc86aac7b8f2862db1e808f1ea22b028e30a225a34a5ede9bf8678f2/numpy-2.3.5.tar.gz", hash = "sha256:784db1dcdab56bf0517743e746dfb0f885fc68d948aba86eeec2cba234bdf1c0", size = 20584950 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/44/37/e669fe6cbb2b96c62f6bbedc6a81c0f3b7362f6a59230b23caa673a85721/numpy-2.3.5-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:74ae7b798248fe62021dbf3c914245ad45d1a6b0cb4a29ecb4b31d0bfbc4cc3e", size = 16733873 }, + { url = "https://files.pythonhosted.org/packages/c5/65/df0db6c097892c9380851ab9e44b52d4f7ba576b833996e0080181c0c439/numpy-2.3.5-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:ee3888d9ff7c14604052b2ca5535a30216aa0a58e948cdd3eeb8d3415f638769", size = 12259838 }, + { url = "https://files.pythonhosted.org/packages/5b/e1/1ee06e70eb2136797abe847d386e7c0e830b67ad1d43f364dd04fa50d338/numpy-2.3.5-cp312-cp312-macosx_14_0_arm64.whl", hash = "sha256:612a95a17655e213502f60cfb9bf9408efdc9eb1d5f50535cc6eb365d11b42b5", size = 5088378 }, + { url = "https://files.pythonhosted.org/packages/6d/9c/1ca85fb86708724275103b81ec4cf1ac1d08f465368acfc8da7ab545bdae/numpy-2.3.5-cp312-cp312-macosx_14_0_x86_64.whl", hash = "sha256:3101e5177d114a593d79dd79658650fe28b5a0d8abeb8ce6f437c0e6df5be1a4", size = 6628559 }, + { url = "https://files.pythonhosted.org/packages/74/78/fcd41e5a0ce4f3f7b003da85825acddae6d7ecb60cf25194741b036ca7d6/numpy-2.3.5-cp312-cp312-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:8b973c57ff8e184109db042c842423ff4f60446239bd585a5131cc47f06f789d", size = 14250702 }, + { url = "https://files.pythonhosted.org/packages/b6/23/2a1b231b8ff672b4c450dac27164a8b2ca7d9b7144f9c02d2396518352eb/numpy-2.3.5-cp312-cp312-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:0d8163f43acde9a73c2a33605353a4f1bc4798745a8b1d73183b28e5b435ae28", size = 16606086 }, + { url = "https://files.pythonhosted.org/packages/a0/c5/5ad26fbfbe2012e190cc7d5003e4d874b88bb18861d0829edc140a713021/numpy-2.3.5-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:51c1e14eb1e154ebd80e860722f9e6ed6ec89714ad2db2d3aa33c31d7c12179b", size = 16025985 }, + { url = "https://files.pythonhosted.org/packages/d2/fa/dd48e225c46c819288148d9d060b047fd2a6fb1eb37eae25112ee4cb4453/numpy-2.3.5-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:b46b4ec24f7293f23adcd2d146960559aaf8020213de8ad1909dba6c013bf89c", size = 18542976 }, + { url = "https://files.pythonhosted.org/packages/05/79/ccbd23a75862d95af03d28b5c6901a1b7da4803181513d52f3b86ed9446e/numpy-2.3.5-cp312-cp312-win32.whl", hash = "sha256:3997b5b3c9a771e157f9aae01dd579ee35ad7109be18db0e85dbdbe1de06e952", size = 6285274 }, + { url = "https://files.pythonhosted.org/packages/2d/57/8aeaf160312f7f489dea47ab61e430b5cb051f59a98ae68b7133ce8fa06a/numpy-2.3.5-cp312-cp312-win_amd64.whl", hash = "sha256:86945f2ee6d10cdfd67bcb4069c1662dd711f7e2a4343db5cecec06b87cf31aa", size = 12782922 }, + { url = "https://files.pythonhosted.org/packages/78/a6/aae5cc2ca78c45e64b9ef22f089141d661516856cf7c8a54ba434576900d/numpy-2.3.5-cp312-cp312-win_arm64.whl", hash = "sha256:f28620fe26bee16243be2b7b874da327312240a7cdc38b769a697578d2100013", size = 10194667 }, + { url = "https://files.pythonhosted.org/packages/db/69/9cde09f36da4b5a505341180a3f2e6fadc352fd4d2b7096ce9778db83f1a/numpy-2.3.5-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:d0f23b44f57077c1ede8c5f26b30f706498b4862d3ff0a7298b8411dd2f043ff", size = 16728251 }, + { url = "https://files.pythonhosted.org/packages/79/fb/f505c95ceddd7027347b067689db71ca80bd5ecc926f913f1a23e65cf09b/numpy-2.3.5-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:aa5bc7c5d59d831d9773d1170acac7893ce3a5e130540605770ade83280e7188", size = 12254652 }, + { url = "https://files.pythonhosted.org/packages/78/da/8c7738060ca9c31b30e9301ee0cf6c5ffdbf889d9593285a1cead337f9a5/numpy-2.3.5-cp313-cp313-macosx_14_0_arm64.whl", hash = "sha256:ccc933afd4d20aad3c00bcef049cb40049f7f196e0397f1109dba6fed63267b0", size = 5083172 }, + { url = "https://files.pythonhosted.org/packages/a4/b4/ee5bb2537fb9430fd2ef30a616c3672b991a4129bb1c7dcc42aa0abbe5d7/numpy-2.3.5-cp313-cp313-macosx_14_0_x86_64.whl", hash = "sha256:afaffc4393205524af9dfa400fa250143a6c3bc646c08c9f5e25a9f4b4d6a903", size = 6622990 }, + { url = "https://files.pythonhosted.org/packages/95/03/dc0723a013c7d7c19de5ef29e932c3081df1c14ba582b8b86b5de9db7f0f/numpy-2.3.5-cp313-cp313-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:9c75442b2209b8470d6d5d8b1c25714270686f14c749028d2199c54e29f20b4d", size = 14248902 }, + { url = "https://files.pythonhosted.org/packages/f5/10/ca162f45a102738958dcec8023062dad0cbc17d1ab99d68c4e4a6c45fb2b/numpy-2.3.5-cp313-cp313-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:11e06aa0af8c0f05104d56450d6093ee639e15f24ecf62d417329d06e522e017", size = 16597430 }, + { url = "https://files.pythonhosted.org/packages/2a/51/c1e29be863588db58175175f057286900b4b3327a1351e706d5e0f8dd679/numpy-2.3.5-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:ed89927b86296067b4f81f108a2271d8926467a8868e554eaf370fc27fa3ccaf", size = 16024551 }, + { url = "https://files.pythonhosted.org/packages/83/68/8236589d4dbb87253d28259d04d9b814ec0ecce7cb1c7fed29729f4c3a78/numpy-2.3.5-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:51c55fe3451421f3a6ef9a9c1439e82101c57a2c9eab9feb196a62b1a10b58ce", size = 18533275 }, + { url = "https://files.pythonhosted.org/packages/40/56/2932d75b6f13465239e3b7b7e511be27f1b8161ca2510854f0b6e521c395/numpy-2.3.5-cp313-cp313-win32.whl", hash = "sha256:1978155dd49972084bd6ef388d66ab70f0c323ddee6f693d539376498720fb7e", size = 6277637 }, + { url = "https://files.pythonhosted.org/packages/0c/88/e2eaa6cffb115b85ed7c7c87775cb8bcf0816816bc98ca8dbfa2ee33fe6e/numpy-2.3.5-cp313-cp313-win_amd64.whl", hash = "sha256:00dc4e846108a382c5869e77c6ed514394bdeb3403461d25a829711041217d5b", size = 12779090 }, + { url = "https://files.pythonhosted.org/packages/8f/88/3f41e13a44ebd4034ee17baa384acac29ba6a4fcc2aca95f6f08ca0447d1/numpy-2.3.5-cp313-cp313-win_arm64.whl", hash = "sha256:0472f11f6ec23a74a906a00b48a4dcf3849209696dff7c189714511268d103ae", size = 10194710 }, + { url = "https://files.pythonhosted.org/packages/13/cb/71744144e13389d577f867f745b7df2d8489463654a918eea2eeb166dfc9/numpy-2.3.5-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:414802f3b97f3c1eef41e530aaba3b3c1620649871d8cb38c6eaff034c2e16bd", size = 16827292 }, + { url = "https://files.pythonhosted.org/packages/71/80/ba9dc6f2a4398e7f42b708a7fdc841bb638d353be255655498edbf9a15a8/numpy-2.3.5-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:5ee6609ac3604fa7780e30a03e5e241a7956f8e2fcfe547d51e3afa5247ac47f", size = 12378897 }, + { url = "https://files.pythonhosted.org/packages/2e/6d/db2151b9f64264bcceccd51741aa39b50150de9b602d98ecfe7e0c4bff39/numpy-2.3.5-cp313-cp313t-macosx_14_0_arm64.whl", hash = "sha256:86d835afea1eaa143012a2d7a3f45a3adce2d7adc8b4961f0b362214d800846a", size = 5207391 }, + { url = "https://files.pythonhosted.org/packages/80/ae/429bacace5ccad48a14c4ae5332f6aa8ab9f69524193511d60ccdfdc65fa/numpy-2.3.5-cp313-cp313t-macosx_14_0_x86_64.whl", hash = "sha256:30bc11310e8153ca664b14c5f1b73e94bd0503681fcf136a163de856f3a50139", size = 6721275 }, + { url = "https://files.pythonhosted.org/packages/74/5b/1919abf32d8722646a38cd527bc3771eb229a32724ee6ba340ead9b92249/numpy-2.3.5-cp313-cp313t-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:1062fde1dcf469571705945b0f221b73928f34a20c904ffb45db101907c3454e", size = 14306855 }, + { url = "https://files.pythonhosted.org/packages/a5/87/6831980559434973bebc30cd9c1f21e541a0f2b0c280d43d3afd909b66d0/numpy-2.3.5-cp313-cp313t-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:ce581db493ea1a96c0556360ede6607496e8bf9b3a8efa66e06477267bc831e9", size = 16657359 }, + { url = "https://files.pythonhosted.org/packages/dd/91/c797f544491ee99fd00495f12ebb7802c440c1915811d72ac5b4479a3356/numpy-2.3.5-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:cc8920d2ec5fa99875b670bb86ddeb21e295cb07aa331810d9e486e0b969d946", size = 16093374 }, + { url = "https://files.pythonhosted.org/packages/74/a6/54da03253afcbe7a72785ec4da9c69fb7a17710141ff9ac5fcb2e32dbe64/numpy-2.3.5-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:9ee2197ef8c4f0dfe405d835f3b6a14f5fee7782b5de51ba06fb65fc9b36e9f1", size = 18594587 }, + { url = "https://files.pythonhosted.org/packages/80/e9/aff53abbdd41b0ecca94285f325aff42357c6b5abc482a3fcb4994290b18/numpy-2.3.5-cp313-cp313t-win32.whl", hash = "sha256:70b37199913c1bd300ff6e2693316c6f869c7ee16378faf10e4f5e3275b299c3", size = 6405940 }, + { url = "https://files.pythonhosted.org/packages/d5/81/50613fec9d4de5480de18d4f8ef59ad7e344d497edbef3cfd80f24f98461/numpy-2.3.5-cp313-cp313t-win_amd64.whl", hash = "sha256:b501b5fa195cc9e24fe102f21ec0a44dffc231d2af79950b451e0d99cea02234", size = 12920341 }, + { url = "https://files.pythonhosted.org/packages/bb/ab/08fd63b9a74303947f34f0bd7c5903b9c5532c2d287bead5bdf4c556c486/numpy-2.3.5-cp313-cp313t-win_arm64.whl", hash = "sha256:a80afd79f45f3c4a7d341f13acbe058d1ca8ac017c165d3fa0d3de6bc1a079d7", size = 10262507 }, + { url = "https://files.pythonhosted.org/packages/ba/97/1a914559c19e32d6b2e233cf9a6a114e67c856d35b1d6babca571a3e880f/numpy-2.3.5-cp314-cp314-macosx_10_15_x86_64.whl", hash = "sha256:bf06bc2af43fa8d32d30fae16ad965663e966b1a3202ed407b84c989c3221e82", size = 16735706 }, + { url = "https://files.pythonhosted.org/packages/57/d4/51233b1c1b13ecd796311216ae417796b88b0616cfd8a33ae4536330748a/numpy-2.3.5-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:052e8c42e0c49d2575621c158934920524f6c5da05a1d3b9bab5d8e259e045f0", size = 12264507 }, + { url = "https://files.pythonhosted.org/packages/45/98/2fe46c5c2675b8306d0b4a3ec3494273e93e1226a490f766e84298576956/numpy-2.3.5-cp314-cp314-macosx_14_0_arm64.whl", hash = "sha256:1ed1ec893cff7040a02c8aa1c8611b94d395590d553f6b53629a4461dc7f7b63", size = 5093049 }, + { url = "https://files.pythonhosted.org/packages/ce/0e/0698378989bb0ac5f1660c81c78ab1fe5476c1a521ca9ee9d0710ce54099/numpy-2.3.5-cp314-cp314-macosx_14_0_x86_64.whl", hash = "sha256:2dcd0808a421a482a080f89859a18beb0b3d1e905b81e617a188bd80422d62e9", size = 6626603 }, + { url = "https://files.pythonhosted.org/packages/5e/a6/9ca0eecc489640615642a6cbc0ca9e10df70df38c4d43f5a928ff18d8827/numpy-2.3.5-cp314-cp314-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:727fd05b57df37dc0bcf1a27767a3d9a78cbbc92822445f32cc3436ba797337b", size = 14262696 }, + { url = "https://files.pythonhosted.org/packages/c8/f6/07ec185b90ec9d7217a00eeeed7383b73d7e709dae2a9a021b051542a708/numpy-2.3.5-cp314-cp314-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:fffe29a1ef00883599d1dc2c51aa2e5d80afe49523c261a74933df395c15c520", size = 16597350 }, + { url = "https://files.pythonhosted.org/packages/75/37/164071d1dde6a1a84c9b8e5b414fa127981bad47adf3a6b7e23917e52190/numpy-2.3.5-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:8f7f0e05112916223d3f438f293abf0727e1181b5983f413dfa2fefc4098245c", size = 16040190 }, + { url = "https://files.pythonhosted.org/packages/08/3c/f18b82a406b04859eb026d204e4e1773eb41c5be58410f41ffa511d114ae/numpy-2.3.5-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:2e2eb32ddb9ccb817d620ac1d8dae7c3f641c1e5f55f531a33e8ab97960a75b8", size = 18536749 }, + { url = "https://files.pythonhosted.org/packages/40/79/f82f572bf44cf0023a2fe8588768e23e1592585020d638999f15158609e1/numpy-2.3.5-cp314-cp314-win32.whl", hash = "sha256:66f85ce62c70b843bab1fb14a05d5737741e74e28c7b8b5a064de10142fad248", size = 6335432 }, + { url = "https://files.pythonhosted.org/packages/a3/2e/235b4d96619931192c91660805e5e49242389742a7a82c27665021db690c/numpy-2.3.5-cp314-cp314-win_amd64.whl", hash = "sha256:e6a0bc88393d65807d751a614207b7129a310ca4fe76a74e5c7da5fa5671417e", size = 12919388 }, + { url = "https://files.pythonhosted.org/packages/07/2b/29fd75ce45d22a39c61aad74f3d718e7ab67ccf839ca8b60866054eb15f8/numpy-2.3.5-cp314-cp314-win_arm64.whl", hash = "sha256:aeffcab3d4b43712bb7a60b65f6044d444e75e563ff6180af8f98dd4b905dfd2", size = 10476651 }, + { url = "https://files.pythonhosted.org/packages/17/e1/f6a721234ebd4d87084cfa68d081bcba2f5cfe1974f7de4e0e8b9b2a2ba1/numpy-2.3.5-cp314-cp314t-macosx_10_15_x86_64.whl", hash = "sha256:17531366a2e3a9e30762c000f2c43a9aaa05728712e25c11ce1dbe700c53ad41", size = 16834503 }, + { url = "https://files.pythonhosted.org/packages/5c/1c/baf7ffdc3af9c356e1c135e57ab7cf8d247931b9554f55c467efe2c69eff/numpy-2.3.5-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:d21644de1b609825ede2f48be98dfde4656aefc713654eeee280e37cadc4e0ad", size = 12381612 }, + { url = "https://files.pythonhosted.org/packages/74/91/f7f0295151407ddc9ba34e699013c32c3c91944f9b35fcf9281163dc1468/numpy-2.3.5-cp314-cp314t-macosx_14_0_arm64.whl", hash = "sha256:c804e3a5aba5460c73955c955bdbd5c08c354954e9270a2c1565f62e866bdc39", size = 5210042 }, + { url = "https://files.pythonhosted.org/packages/2e/3b/78aebf345104ec50dd50a4d06ddeb46a9ff5261c33bcc58b1c4f12f85ec2/numpy-2.3.5-cp314-cp314t-macosx_14_0_x86_64.whl", hash = "sha256:cc0a57f895b96ec78969c34f682c602bf8da1a0270b09bc65673df2e7638ec20", size = 6724502 }, + { url = "https://files.pythonhosted.org/packages/02/c6/7c34b528740512e57ef1b7c8337ab0b4f0bddf34c723b8996c675bc2bc91/numpy-2.3.5-cp314-cp314t-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:900218e456384ea676e24ea6a0417f030a3b07306d29d7ad843957b40a9d8d52", size = 14308962 }, + { url = "https://files.pythonhosted.org/packages/80/35/09d433c5262bc32d725bafc619e095b6a6651caf94027a03da624146f655/numpy-2.3.5-cp314-cp314t-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:09a1bea522b25109bf8e6f3027bd810f7c1085c64a0c7ce050c1676ad0ba010b", size = 16655054 }, + { url = "https://files.pythonhosted.org/packages/7a/ab/6a7b259703c09a88804fa2430b43d6457b692378f6b74b356155283566ac/numpy-2.3.5-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:04822c00b5fd0323c8166d66c701dc31b7fbd252c100acd708c48f763968d6a3", size = 16091613 }, + { url = "https://files.pythonhosted.org/packages/c2/88/330da2071e8771e60d1038166ff9d73f29da37b01ec3eb43cb1427464e10/numpy-2.3.5-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:d6889ec4ec662a1a37eb4b4fb26b6100841804dac55bd9df579e326cdc146227", size = 18591147 }, + { url = "https://files.pythonhosted.org/packages/51/41/851c4b4082402d9ea860c3626db5d5df47164a712cb23b54be028b184c1c/numpy-2.3.5-cp314-cp314t-win32.whl", hash = "sha256:93eebbcf1aafdf7e2ddd44c2923e2672e1010bddc014138b229e49725b4d6be5", size = 6479806 }, + { url = "https://files.pythonhosted.org/packages/90/30/d48bde1dfd93332fa557cff1972fbc039e055a52021fbef4c2c4b1eefd17/numpy-2.3.5-cp314-cp314t-win_amd64.whl", hash = "sha256:c8a9958e88b65c3b27e22ca2a076311636850b612d6bbfb76e8d156aacde2aaf", size = 13105760 }, + { url = "https://files.pythonhosted.org/packages/2d/fd/4b5eb0b3e888d86aee4d198c23acec7d214baaf17ea93c1adec94c9518b9/numpy-2.3.5-cp314-cp314t-win_arm64.whl", hash = "sha256:6203fdf9f3dc5bdaed7319ad8698e685c7a3be10819f41d32a0723e611733b42", size = 10545459 }, +] + +[[package]] +name = "packaging" +version = "25.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/a1/d4/1fc4078c65507b51b96ca8f8c3ba19e6a61c8253c72794544580a7b6c24d/packaging-25.0.tar.gz", hash = "sha256:d443872c98d677bf60f6a1f2f8c1cb748e8fe762d2bf9d3148b5599295b0fc4f", size = 165727 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/20/12/38679034af332785aac8774540895e234f4d07f7545804097de4b666afd8/packaging-25.0-py3-none-any.whl", hash = "sha256:29572ef2b1f17581046b3a2227d5c611fb25ec70ca1ba8554b24b0e69331a484", size = 66469 }, +] + +[[package]] +name = "pandas" +version = "2.3.3" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "numpy" }, + { name = "python-dateutil" }, + { name = "pytz" }, + { name = "tzdata" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/33/01/d40b85317f86cf08d853a4f495195c73815fdf205eef3993821720274518/pandas-2.3.3.tar.gz", hash = "sha256:e05e1af93b977f7eafa636d043f9f94c7ee3ac81af99c13508215942e64c993b", size = 4495223 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/9c/fb/231d89e8637c808b997d172b18e9d4a4bc7bf31296196c260526055d1ea0/pandas-2.3.3-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:6d21f6d74eb1725c2efaa71a2bfc661a0689579b58e9c0ca58a739ff0b002b53", size = 11597846 }, + { url = "https://files.pythonhosted.org/packages/5c/bd/bf8064d9cfa214294356c2d6702b716d3cf3bb24be59287a6a21e24cae6b/pandas-2.3.3-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:3fd2f887589c7aa868e02632612ba39acb0b8948faf5cc58f0850e165bd46f35", size = 10729618 }, + { url = "https://files.pythonhosted.org/packages/57/56/cf2dbe1a3f5271370669475ead12ce77c61726ffd19a35546e31aa8edf4e/pandas-2.3.3-cp312-cp312-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:ecaf1e12bdc03c86ad4a7ea848d66c685cb6851d807a26aa245ca3d2017a1908", size = 11737212 }, + { url = "https://files.pythonhosted.org/packages/e5/63/cd7d615331b328e287d8233ba9fdf191a9c2d11b6af0c7a59cfcec23de68/pandas-2.3.3-cp312-cp312-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:b3d11d2fda7eb164ef27ffc14b4fcab16a80e1ce67e9f57e19ec0afaf715ba89", size = 12362693 }, + { url = "https://files.pythonhosted.org/packages/a6/de/8b1895b107277d52f2b42d3a6806e69cfef0d5cf1d0ba343470b9d8e0a04/pandas-2.3.3-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:a68e15f780eddf2b07d242e17a04aa187a7ee12b40b930bfdd78070556550e98", size = 12771002 }, + { url = "https://files.pythonhosted.org/packages/87/21/84072af3187a677c5893b170ba2c8fbe450a6ff911234916da889b698220/pandas-2.3.3-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:371a4ab48e950033bcf52b6527eccb564f52dc826c02afd9a1bc0ab731bba084", size = 13450971 }, + { url = "https://files.pythonhosted.org/packages/86/41/585a168330ff063014880a80d744219dbf1dd7a1c706e75ab3425a987384/pandas-2.3.3-cp312-cp312-win_amd64.whl", hash = "sha256:a16dcec078a01eeef8ee61bf64074b4e524a2a3f4b3be9326420cabe59c4778b", size = 10992722 }, + { url = "https://files.pythonhosted.org/packages/cd/4b/18b035ee18f97c1040d94debd8f2e737000ad70ccc8f5513f4eefad75f4b/pandas-2.3.3-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:56851a737e3470de7fa88e6131f41281ed440d29a9268dcbf0002da5ac366713", size = 11544671 }, + { url = "https://files.pythonhosted.org/packages/31/94/72fac03573102779920099bcac1c3b05975c2cb5f01eac609faf34bed1ca/pandas-2.3.3-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:bdcd9d1167f4885211e401b3036c0c8d9e274eee67ea8d0758a256d60704cfe8", size = 10680807 }, + { url = "https://files.pythonhosted.org/packages/16/87/9472cf4a487d848476865321de18cc8c920b8cab98453ab79dbbc98db63a/pandas-2.3.3-cp313-cp313-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:e32e7cc9af0f1cc15548288a51a3b681cc2a219faa838e995f7dc53dbab1062d", size = 11709872 }, + { url = "https://files.pythonhosted.org/packages/15/07/284f757f63f8a8d69ed4472bfd85122bd086e637bf4ed09de572d575a693/pandas-2.3.3-cp313-cp313-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:318d77e0e42a628c04dc56bcef4b40de67918f7041c2b061af1da41dcff670ac", size = 12306371 }, + { url = "https://files.pythonhosted.org/packages/33/81/a3afc88fca4aa925804a27d2676d22dcd2031c2ebe08aabd0ae55b9ff282/pandas-2.3.3-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:4e0a175408804d566144e170d0476b15d78458795bb18f1304fb94160cabf40c", size = 12765333 }, + { url = "https://files.pythonhosted.org/packages/8d/0f/b4d4ae743a83742f1153464cf1a8ecfafc3ac59722a0b5c8602310cb7158/pandas-2.3.3-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:93c2d9ab0fc11822b5eece72ec9587e172f63cff87c00b062f6e37448ced4493", size = 13418120 }, + { url = "https://files.pythonhosted.org/packages/4f/c7/e54682c96a895d0c808453269e0b5928a07a127a15704fedb643e9b0a4c8/pandas-2.3.3-cp313-cp313-win_amd64.whl", hash = "sha256:f8bfc0e12dc78f777f323f55c58649591b2cd0c43534e8355c51d3fede5f4dee", size = 10993991 }, + { url = "https://files.pythonhosted.org/packages/f9/ca/3f8d4f49740799189e1395812f3bf23b5e8fc7c190827d55a610da72ce55/pandas-2.3.3-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:75ea25f9529fdec2d2e93a42c523962261e567d250b0013b16210e1d40d7c2e5", size = 12048227 }, + { url = "https://files.pythonhosted.org/packages/0e/5a/f43efec3e8c0cc92c4663ccad372dbdff72b60bdb56b2749f04aa1d07d7e/pandas-2.3.3-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:74ecdf1d301e812db96a465a525952f4dde225fdb6d8e5a521d47e1f42041e21", size = 11411056 }, + { url = "https://files.pythonhosted.org/packages/46/b1/85331edfc591208c9d1a63a06baa67b21d332e63b7a591a5ba42a10bb507/pandas-2.3.3-cp313-cp313t-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:6435cb949cb34ec11cc9860246ccb2fdc9ecd742c12d3304989017d53f039a78", size = 11645189 }, + { url = "https://files.pythonhosted.org/packages/44/23/78d645adc35d94d1ac4f2a3c4112ab6f5b8999f4898b8cdf01252f8df4a9/pandas-2.3.3-cp313-cp313t-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:900f47d8f20860de523a1ac881c4c36d65efcb2eb850e6948140fa781736e110", size = 12121912 }, + { url = "https://files.pythonhosted.org/packages/53/da/d10013df5e6aaef6b425aa0c32e1fc1f3e431e4bcabd420517dceadce354/pandas-2.3.3-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:a45c765238e2ed7d7c608fc5bc4a6f88b642f2f01e70c0c23d2224dd21829d86", size = 12712160 }, + { url = "https://files.pythonhosted.org/packages/bd/17/e756653095a083d8a37cbd816cb87148debcfcd920129b25f99dd8d04271/pandas-2.3.3-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:c4fc4c21971a1a9f4bdb4c73978c7f7256caa3e62b323f70d6cb80db583350bc", size = 13199233 }, + { url = "https://files.pythonhosted.org/packages/04/fd/74903979833db8390b73b3a8a7d30d146d710bd32703724dd9083950386f/pandas-2.3.3-cp314-cp314-macosx_10_13_x86_64.whl", hash = "sha256:ee15f284898e7b246df8087fc82b87b01686f98ee67d85a17b7ab44143a3a9a0", size = 11540635 }, + { url = "https://files.pythonhosted.org/packages/21/00/266d6b357ad5e6d3ad55093a7e8efc7dd245f5a842b584db9f30b0f0a287/pandas-2.3.3-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:1611aedd912e1ff81ff41c745822980c49ce4a7907537be8692c8dbc31924593", size = 10759079 }, + { url = "https://files.pythonhosted.org/packages/ca/05/d01ef80a7a3a12b2f8bbf16daba1e17c98a2f039cbc8e2f77a2c5a63d382/pandas-2.3.3-cp314-cp314-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:6d2cefc361461662ac48810cb14365a365ce864afe85ef1f447ff5a1e99ea81c", size = 11814049 }, + { url = "https://files.pythonhosted.org/packages/15/b2/0e62f78c0c5ba7e3d2c5945a82456f4fac76c480940f805e0b97fcbc2f65/pandas-2.3.3-cp314-cp314-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:ee67acbbf05014ea6c763beb097e03cd629961c8a632075eeb34247120abcb4b", size = 12332638 }, + { url = "https://files.pythonhosted.org/packages/c5/33/dd70400631b62b9b29c3c93d2feee1d0964dc2bae2e5ad7a6c73a7f25325/pandas-2.3.3-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:c46467899aaa4da076d5abc11084634e2d197e9460643dd455ac3db5856b24d6", size = 12886834 }, + { url = "https://files.pythonhosted.org/packages/d3/18/b5d48f55821228d0d2692b34fd5034bb185e854bdb592e9c640f6290e012/pandas-2.3.3-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:6253c72c6a1d990a410bc7de641d34053364ef8bcd3126f7e7450125887dffe3", size = 13409925 }, + { url = "https://files.pythonhosted.org/packages/a6/3d/124ac75fcd0ecc09b8fdccb0246ef65e35b012030defb0e0eba2cbbbe948/pandas-2.3.3-cp314-cp314-win_amd64.whl", hash = "sha256:1b07204a219b3b7350abaae088f451860223a52cfb8a6c53358e7948735158e5", size = 11109071 }, + { url = "https://files.pythonhosted.org/packages/89/9c/0e21c895c38a157e0faa1fb64587a9226d6dd46452cac4532d80c3c4a244/pandas-2.3.3-cp314-cp314t-macosx_10_13_x86_64.whl", hash = "sha256:2462b1a365b6109d275250baaae7b760fd25c726aaca0054649286bcfbb3e8ec", size = 12048504 }, + { url = "https://files.pythonhosted.org/packages/d7/82/b69a1c95df796858777b68fbe6a81d37443a33319761d7c652ce77797475/pandas-2.3.3-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:0242fe9a49aa8b4d78a4fa03acb397a58833ef6199e9aa40a95f027bb3a1b6e7", size = 11410702 }, + { url = "https://files.pythonhosted.org/packages/f9/88/702bde3ba0a94b8c73a0181e05144b10f13f29ebfc2150c3a79062a8195d/pandas-2.3.3-cp314-cp314t-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:a21d830e78df0a515db2b3d2f5570610f5e6bd2e27749770e8bb7b524b89b450", size = 11634535 }, + { url = "https://files.pythonhosted.org/packages/a4/1e/1bac1a839d12e6a82ec6cb40cda2edde64a2013a66963293696bbf31fbbb/pandas-2.3.3-cp314-cp314t-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:2e3ebdb170b5ef78f19bfb71b0dc5dc58775032361fa188e814959b74d726dd5", size = 12121582 }, + { url = "https://files.pythonhosted.org/packages/44/91/483de934193e12a3b1d6ae7c8645d083ff88dec75f46e827562f1e4b4da6/pandas-2.3.3-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:d051c0e065b94b7a3cea50eb1ec32e912cd96dba41647eb24104b6c6c14c5788", size = 12699963 }, + { url = "https://files.pythonhosted.org/packages/70/44/5191d2e4026f86a2a109053e194d3ba7a31a2d10a9c2348368c63ed4e85a/pandas-2.3.3-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:3869faf4bd07b3b66a9f462417d0ca3a9df29a9f6abd5d0d0dbab15dac7abe87", size = 13202175 }, +] + +[[package]] +name = "parso" +version = "0.8.5" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/d4/de/53e0bcf53d13e005bd8c92e7855142494f41171b34c2536b86187474184d/parso-0.8.5.tar.gz", hash = "sha256:034d7354a9a018bdce352f48b2a8a450f05e9d6ee85db84764e9b6bd96dafe5a", size = 401205 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/16/32/f8e3c85d1d5250232a5d3477a2a28cc291968ff175caeadaf3cc19ce0e4a/parso-0.8.5-py2.py3-none-any.whl", hash = "sha256:646204b5ee239c396d040b90f9e272e9a8017c630092bf59980beb62fd033887", size = 106668 }, +] + +[[package]] +name = "pillow" +version = "12.0.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/5a/b0/cace85a1b0c9775a9f8f5d5423c8261c858760e2466c79b2dd184638b056/pillow-12.0.0.tar.gz", hash = "sha256:87d4f8125c9988bfbed67af47dd7a953e2fc7b0cc1e7800ec6d2080d490bb353", size = 47008828 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/2c/90/4fcce2c22caf044e660a198d740e7fbc14395619e3cb1abad12192c0826c/pillow-12.0.0-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:53561a4ddc36facb432fae7a9d8afbfaf94795414f5cdc5fc52f28c1dca90371", size = 5249377 }, + { url = "https://files.pythonhosted.org/packages/fd/e0/ed960067543d080691d47d6938ebccbf3976a931c9567ab2fbfab983a5dd/pillow-12.0.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:71db6b4c1653045dacc1585c1b0d184004f0d7e694c7b34ac165ca70c0838082", size = 4650343 }, + { url = "https://files.pythonhosted.org/packages/e7/a1/f81fdeddcb99c044bf7d6faa47e12850f13cee0849537a7d27eeab5534d4/pillow-12.0.0-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:2fa5f0b6716fc88f11380b88b31fe591a06c6315e955c096c35715788b339e3f", size = 6232981 }, + { url = "https://files.pythonhosted.org/packages/88/e1/9098d3ce341a8750b55b0e00c03f1630d6178f38ac191c81c97a3b047b44/pillow-12.0.0-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:82240051c6ca513c616f7f9da06e871f61bfd7805f566275841af15015b8f98d", size = 8041399 }, + { url = "https://files.pythonhosted.org/packages/a7/62/a22e8d3b602ae8cc01446d0c57a54e982737f44b6f2e1e019a925143771d/pillow-12.0.0-cp312-cp312-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:55f818bd74fe2f11d4d7cbc65880a843c4075e0ac7226bc1a23261dbea531953", size = 6347740 }, + { url = "https://files.pythonhosted.org/packages/4f/87/424511bdcd02c8d7acf9f65caa09f291a519b16bd83c3fb3374b3d4ae951/pillow-12.0.0-cp312-cp312-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:b87843e225e74576437fd5b6a4c2205d422754f84a06942cfaf1dc32243e45a8", size = 7040201 }, + { url = "https://files.pythonhosted.org/packages/dc/4d/435c8ac688c54d11755aedfdd9f29c9eeddf68d150fe42d1d3dbd2365149/pillow-12.0.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:c607c90ba67533e1b2355b821fef6764d1dd2cbe26b8c1005ae84f7aea25ff79", size = 6462334 }, + { url = "https://files.pythonhosted.org/packages/2b/f2/ad34167a8059a59b8ad10bc5c72d4d9b35acc6b7c0877af8ac885b5f2044/pillow-12.0.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:21f241bdd5080a15bc86d3466a9f6074a9c2c2b314100dd896ac81ee6db2f1ba", size = 7134162 }, + { url = "https://files.pythonhosted.org/packages/0c/b1/a7391df6adacf0a5c2cf6ac1cf1fcc1369e7d439d28f637a847f8803beb3/pillow-12.0.0-cp312-cp312-win32.whl", hash = "sha256:dd333073e0cacdc3089525c7df7d39b211bcdf31fc2824e49d01c6b6187b07d0", size = 6298769 }, + { url = "https://files.pythonhosted.org/packages/a2/0b/d87733741526541c909bbf159e338dcace4f982daac6e5a8d6be225ca32d/pillow-12.0.0-cp312-cp312-win_amd64.whl", hash = "sha256:9fe611163f6303d1619bbcb653540a4d60f9e55e622d60a3108be0d5b441017a", size = 7001107 }, + { url = "https://files.pythonhosted.org/packages/bc/96/aaa61ce33cc98421fb6088af2a03be4157b1e7e0e87087c888e2370a7f45/pillow-12.0.0-cp312-cp312-win_arm64.whl", hash = "sha256:7dfb439562f234f7d57b1ac6bc8fe7f838a4bd49c79230e0f6a1da93e82f1fad", size = 2436012 }, + { url = "https://files.pythonhosted.org/packages/62/f2/de993bb2d21b33a98d031ecf6a978e4b61da207bef02f7b43093774c480d/pillow-12.0.0-cp313-cp313-ios_13_0_arm64_iphoneos.whl", hash = "sha256:0869154a2d0546545cde61d1789a6524319fc1897d9ee31218eae7a60ccc5643", size = 4045493 }, + { url = "https://files.pythonhosted.org/packages/0e/b6/bc8d0c4c9f6f111a783d045310945deb769b806d7574764234ffd50bc5ea/pillow-12.0.0-cp313-cp313-ios_13_0_arm64_iphonesimulator.whl", hash = "sha256:a7921c5a6d31b3d756ec980f2f47c0cfdbce0fc48c22a39347a895f41f4a6ea4", size = 4120461 }, + { url = "https://files.pythonhosted.org/packages/5d/57/d60d343709366a353dc56adb4ee1e7d8a2cc34e3fbc22905f4167cfec119/pillow-12.0.0-cp313-cp313-ios_13_0_x86_64_iphonesimulator.whl", hash = "sha256:1ee80a59f6ce048ae13cda1abf7fbd2a34ab9ee7d401c46be3ca685d1999a399", size = 3576912 }, + { url = "https://files.pythonhosted.org/packages/a4/a4/a0a31467e3f83b94d37568294b01d22b43ae3c5d85f2811769b9c66389dd/pillow-12.0.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:c50f36a62a22d350c96e49ad02d0da41dbd17ddc2e29750dbdba4323f85eb4a5", size = 5249132 }, + { url = "https://files.pythonhosted.org/packages/83/06/48eab21dd561de2914242711434c0c0eb992ed08ff3f6107a5f44527f5e9/pillow-12.0.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:5193fde9a5f23c331ea26d0cf171fbf67e3f247585f50c08b3e205c7aeb4589b", size = 4650099 }, + { url = "https://files.pythonhosted.org/packages/fc/bd/69ed99fd46a8dba7c1887156d3572fe4484e3f031405fcc5a92e31c04035/pillow-12.0.0-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:bde737cff1a975b70652b62d626f7785e0480918dece11e8fef3c0cf057351c3", size = 6230808 }, + { url = "https://files.pythonhosted.org/packages/ea/94/8fad659bcdbf86ed70099cb60ae40be6acca434bbc8c4c0d4ef356d7e0de/pillow-12.0.0-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:a6597ff2b61d121172f5844b53f21467f7082f5fb385a9a29c01414463f93b07", size = 8037804 }, + { url = "https://files.pythonhosted.org/packages/20/39/c685d05c06deecfd4e2d1950e9a908aa2ca8bc4e6c3b12d93b9cafbd7837/pillow-12.0.0-cp313-cp313-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:0b817e7035ea7f6b942c13aa03bb554fc44fea70838ea21f8eb31c638326584e", size = 6345553 }, + { url = "https://files.pythonhosted.org/packages/38/57/755dbd06530a27a5ed74f8cb0a7a44a21722ebf318edbe67ddbd7fb28f88/pillow-12.0.0-cp313-cp313-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:f4f1231b7dec408e8670264ce63e9c71409d9583dd21d32c163e25213ee2a344", size = 7037729 }, + { url = "https://files.pythonhosted.org/packages/ca/b6/7e94f4c41d238615674d06ed677c14883103dce1c52e4af16f000338cfd7/pillow-12.0.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:6e51b71417049ad6ab14c49608b4a24d8fb3fe605e5dfabfe523b58064dc3d27", size = 6459789 }, + { url = "https://files.pythonhosted.org/packages/9c/14/4448bb0b5e0f22dd865290536d20ec8a23b64e2d04280b89139f09a36bb6/pillow-12.0.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:d120c38a42c234dc9a8c5de7ceaaf899cf33561956acb4941653f8bdc657aa79", size = 7130917 }, + { url = "https://files.pythonhosted.org/packages/dd/ca/16c6926cc1c015845745d5c16c9358e24282f1e588237a4c36d2b30f182f/pillow-12.0.0-cp313-cp313-win32.whl", hash = "sha256:4cc6b3b2efff105c6a1656cfe59da4fdde2cda9af1c5e0b58529b24525d0a098", size = 6302391 }, + { url = "https://files.pythonhosted.org/packages/6d/2a/dd43dcfd6dae9b6a49ee28a8eedb98c7d5ff2de94a5d834565164667b97b/pillow-12.0.0-cp313-cp313-win_amd64.whl", hash = "sha256:4cf7fed4b4580601c4345ceb5d4cbf5a980d030fd5ad07c4d2ec589f95f09905", size = 7007477 }, + { url = "https://files.pythonhosted.org/packages/77/f0/72ea067f4b5ae5ead653053212af05ce3705807906ba3f3e8f58ddf617e6/pillow-12.0.0-cp313-cp313-win_arm64.whl", hash = "sha256:9f0b04c6b8584c2c193babcccc908b38ed29524b29dd464bc8801bf10d746a3a", size = 2435918 }, + { url = "https://files.pythonhosted.org/packages/f5/5e/9046b423735c21f0487ea6cb5b10f89ea8f8dfbe32576fe052b5ba9d4e5b/pillow-12.0.0-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:7fa22993bac7b77b78cae22bad1e2a987ddf0d9015c63358032f84a53f23cdc3", size = 5251406 }, + { url = "https://files.pythonhosted.org/packages/12/66/982ceebcdb13c97270ef7a56c3969635b4ee7cd45227fa707c94719229c5/pillow-12.0.0-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:f135c702ac42262573fe9714dfe99c944b4ba307af5eb507abef1667e2cbbced", size = 4653218 }, + { url = "https://files.pythonhosted.org/packages/16/b3/81e625524688c31859450119bf12674619429cab3119eec0e30a7a1029cb/pillow-12.0.0-cp313-cp313t-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:c85de1136429c524e55cfa4e033b4a7940ac5c8ee4d9401cc2d1bf48154bbc7b", size = 6266564 }, + { url = "https://files.pythonhosted.org/packages/98/59/dfb38f2a41240d2408096e1a76c671d0a105a4a8471b1871c6902719450c/pillow-12.0.0-cp313-cp313t-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:38df9b4bfd3db902c9c2bd369bcacaf9d935b2fff73709429d95cc41554f7b3d", size = 8069260 }, + { url = "https://files.pythonhosted.org/packages/dc/3d/378dbea5cd1874b94c312425ca77b0f47776c78e0df2df751b820c8c1d6c/pillow-12.0.0-cp313-cp313t-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:7d87ef5795da03d742bf49439f9ca4d027cde49c82c5371ba52464aee266699a", size = 6379248 }, + { url = "https://files.pythonhosted.org/packages/84/b0/d525ef47d71590f1621510327acec75ae58c721dc071b17d8d652ca494d8/pillow-12.0.0-cp313-cp313t-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:aff9e4d82d082ff9513bdd6acd4f5bd359f5b2c870907d2b0a9c5e10d40c88fe", size = 7066043 }, + { url = "https://files.pythonhosted.org/packages/61/2c/aced60e9cf9d0cde341d54bf7932c9ffc33ddb4a1595798b3a5150c7ec4e/pillow-12.0.0-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:8d8ca2b210ada074d57fcee40c30446c9562e542fc46aedc19baf758a93532ee", size = 6490915 }, + { url = "https://files.pythonhosted.org/packages/ef/26/69dcb9b91f4e59f8f34b2332a4a0a951b44f547c4ed39d3e4dcfcff48f89/pillow-12.0.0-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:99a7f72fb6249302aa62245680754862a44179b545ded638cf1fef59befb57ef", size = 7157998 }, + { url = "https://files.pythonhosted.org/packages/61/2b/726235842220ca95fa441ddf55dd2382b52ab5b8d9c0596fe6b3f23dafe8/pillow-12.0.0-cp313-cp313t-win32.whl", hash = "sha256:4078242472387600b2ce8d93ade8899c12bf33fa89e55ec89fe126e9d6d5d9e9", size = 6306201 }, + { url = "https://files.pythonhosted.org/packages/c0/3d/2afaf4e840b2df71344ababf2f8edd75a705ce500e5dc1e7227808312ae1/pillow-12.0.0-cp313-cp313t-win_amd64.whl", hash = "sha256:2c54c1a783d6d60595d3514f0efe9b37c8808746a66920315bfd34a938d7994b", size = 7013165 }, + { url = "https://files.pythonhosted.org/packages/6f/75/3fa09aa5cf6ed04bee3fa575798ddf1ce0bace8edb47249c798077a81f7f/pillow-12.0.0-cp313-cp313t-win_arm64.whl", hash = "sha256:26d9f7d2b604cd23aba3e9faf795787456ac25634d82cd060556998e39c6fa47", size = 2437834 }, + { url = "https://files.pythonhosted.org/packages/54/2a/9a8c6ba2c2c07b71bec92cf63e03370ca5e5f5c5b119b742bcc0cde3f9c5/pillow-12.0.0-cp314-cp314-ios_13_0_arm64_iphoneos.whl", hash = "sha256:beeae3f27f62308f1ddbcfb0690bf44b10732f2ef43758f169d5e9303165d3f9", size = 4045531 }, + { url = "https://files.pythonhosted.org/packages/84/54/836fdbf1bfb3d66a59f0189ff0b9f5f666cee09c6188309300df04ad71fa/pillow-12.0.0-cp314-cp314-ios_13_0_arm64_iphonesimulator.whl", hash = "sha256:d4827615da15cd59784ce39d3388275ec093ae3ee8d7f0c089b76fa87af756c2", size = 4120554 }, + { url = "https://files.pythonhosted.org/packages/0d/cd/16aec9f0da4793e98e6b54778a5fbce4f375c6646fe662e80600b8797379/pillow-12.0.0-cp314-cp314-ios_13_0_x86_64_iphonesimulator.whl", hash = "sha256:3e42edad50b6909089750e65c91aa09aaf1e0a71310d383f11321b27c224ed8a", size = 3576812 }, + { url = "https://files.pythonhosted.org/packages/f6/b7/13957fda356dc46339298b351cae0d327704986337c3c69bb54628c88155/pillow-12.0.0-cp314-cp314-macosx_10_15_x86_64.whl", hash = "sha256:e5d8efac84c9afcb40914ab49ba063d94f5dbdf5066db4482c66a992f47a3a3b", size = 5252689 }, + { url = "https://files.pythonhosted.org/packages/fc/f5/eae31a306341d8f331f43edb2e9122c7661b975433de5e447939ae61c5da/pillow-12.0.0-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:266cd5f2b63ff316d5a1bba46268e603c9caf5606d44f38c2873c380950576ad", size = 4650186 }, + { url = "https://files.pythonhosted.org/packages/86/62/2a88339aa40c4c77e79108facbd307d6091e2c0eb5b8d3cf4977cfca2fe6/pillow-12.0.0-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:58eea5ebe51504057dd95c5b77d21700b77615ab0243d8152793dc00eb4faf01", size = 6230308 }, + { url = "https://files.pythonhosted.org/packages/c7/33/5425a8992bcb32d1cb9fa3dd39a89e613d09a22f2c8083b7bf43c455f760/pillow-12.0.0-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:f13711b1a5ba512d647a0e4ba79280d3a9a045aaf7e0cc6fbe96b91d4cdf6b0c", size = 8039222 }, + { url = "https://files.pythonhosted.org/packages/d8/61/3f5d3b35c5728f37953d3eec5b5f3e77111949523bd2dd7f31a851e50690/pillow-12.0.0-cp314-cp314-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:6846bd2d116ff42cba6b646edf5bf61d37e5cbd256425fa089fee4ff5c07a99e", size = 6346657 }, + { url = "https://files.pythonhosted.org/packages/3a/be/ee90a3d79271227e0f0a33c453531efd6ed14b2e708596ba5dd9be948da3/pillow-12.0.0-cp314-cp314-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:c98fa880d695de164b4135a52fd2e9cd7b7c90a9d8ac5e9e443a24a95ef9248e", size = 7038482 }, + { url = "https://files.pythonhosted.org/packages/44/34/a16b6a4d1ad727de390e9bd9f19f5f669e079e5826ec0f329010ddea492f/pillow-12.0.0-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:fa3ed2a29a9e9d2d488b4da81dcb54720ac3104a20bf0bd273f1e4648aff5af9", size = 6461416 }, + { url = "https://files.pythonhosted.org/packages/b6/39/1aa5850d2ade7d7ba9f54e4e4c17077244ff7a2d9e25998c38a29749eb3f/pillow-12.0.0-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:d034140032870024e6b9892c692fe2968493790dd57208b2c37e3fb35f6df3ab", size = 7131584 }, + { url = "https://files.pythonhosted.org/packages/bf/db/4fae862f8fad0167073a7733973bfa955f47e2cac3dc3e3e6257d10fab4a/pillow-12.0.0-cp314-cp314-win32.whl", hash = "sha256:1b1b133e6e16105f524a8dec491e0586d072948ce15c9b914e41cdadd209052b", size = 6400621 }, + { url = "https://files.pythonhosted.org/packages/2b/24/b350c31543fb0107ab2599464d7e28e6f856027aadda995022e695313d94/pillow-12.0.0-cp314-cp314-win_amd64.whl", hash = "sha256:8dc232e39d409036af549c86f24aed8273a40ffa459981146829a324e0848b4b", size = 7142916 }, + { url = "https://files.pythonhosted.org/packages/0f/9b/0ba5a6fd9351793996ef7487c4fdbde8d3f5f75dbedc093bb598648fddf0/pillow-12.0.0-cp314-cp314-win_arm64.whl", hash = "sha256:d52610d51e265a51518692045e372a4c363056130d922a7351429ac9f27e70b0", size = 2523836 }, + { url = "https://files.pythonhosted.org/packages/f5/7a/ceee0840aebc579af529b523d530840338ecf63992395842e54edc805987/pillow-12.0.0-cp314-cp314t-macosx_10_15_x86_64.whl", hash = "sha256:1979f4566bb96c1e50a62d9831e2ea2d1211761e5662afc545fa766f996632f6", size = 5255092 }, + { url = "https://files.pythonhosted.org/packages/44/76/20776057b4bfd1aef4eeca992ebde0f53a4dce874f3ae693d0ec90a4f79b/pillow-12.0.0-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:b2e4b27a6e15b04832fe9bf292b94b5ca156016bbc1ea9c2c20098a0320d6cf6", size = 4653158 }, + { url = "https://files.pythonhosted.org/packages/82/3f/d9ff92ace07be8836b4e7e87e6a4c7a8318d47c2f1463ffcf121fc57d9cb/pillow-12.0.0-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:fb3096c30df99fd01c7bf8e544f392103d0795b9f98ba71a8054bcbf56b255f1", size = 6267882 }, + { url = "https://files.pythonhosted.org/packages/9f/7a/4f7ff87f00d3ad33ba21af78bfcd2f032107710baf8280e3722ceec28cda/pillow-12.0.0-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:7438839e9e053ef79f7112c881cef684013855016f928b168b81ed5835f3e75e", size = 8071001 }, + { url = "https://files.pythonhosted.org/packages/75/87/fcea108944a52dad8cca0715ae6247e271eb80459364a98518f1e4f480c1/pillow-12.0.0-cp314-cp314t-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:5d5c411a8eaa2299322b647cd932586b1427367fd3184ffbb8f7a219ea2041ca", size = 6380146 }, + { url = "https://files.pythonhosted.org/packages/91/52/0d31b5e571ef5fd111d2978b84603fce26aba1b6092f28e941cb46570745/pillow-12.0.0-cp314-cp314t-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:d7e091d464ac59d2c7ad8e7e08105eaf9dafbc3883fd7265ffccc2baad6ac925", size = 7067344 }, + { url = "https://files.pythonhosted.org/packages/7b/f4/2dd3d721f875f928d48e83bb30a434dee75a2531bca839bb996bb0aa5a91/pillow-12.0.0-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:792a2c0be4dcc18af9d4a2dfd8a11a17d5e25274a1062b0ec1c2d79c76f3e7f8", size = 6491864 }, + { url = "https://files.pythonhosted.org/packages/30/4b/667dfcf3d61fc309ba5a15b141845cece5915e39b99c1ceab0f34bf1d124/pillow-12.0.0-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:afbefa430092f71a9593a99ab6a4e7538bc9eabbf7bf94f91510d3503943edc4", size = 7158911 }, + { url = "https://files.pythonhosted.org/packages/a2/2f/16cabcc6426c32218ace36bf0d55955e813f2958afddbf1d391849fee9d1/pillow-12.0.0-cp314-cp314t-win32.whl", hash = "sha256:3830c769decf88f1289680a59d4f4c46c72573446352e2befec9a8512104fa52", size = 6408045 }, + { url = "https://files.pythonhosted.org/packages/35/73/e29aa0c9c666cf787628d3f0dcf379f4791fba79f4936d02f8b37165bdf8/pillow-12.0.0-cp314-cp314t-win_amd64.whl", hash = "sha256:905b0365b210c73afb0ebe9101a32572152dfd1c144c7e28968a331b9217b94a", size = 7148282 }, + { url = "https://files.pythonhosted.org/packages/c1/70/6b41bdcddf541b437bbb9f47f94d2db5d9ddef6c37ccab8c9107743748a4/pillow-12.0.0-cp314-cp314t-win_arm64.whl", hash = "sha256:99353a06902c2e43b43e8ff74ee65a7d90307d82370604746738a1e0661ccca7", size = 2525630 }, +] + +[[package]] +name = "protobuf" +version = "6.33.1" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/0a/03/a1440979a3f74f16cab3b75b0da1a1a7f922d56a8ddea96092391998edc0/protobuf-6.33.1.tar.gz", hash = "sha256:97f65757e8d09870de6fd973aeddb92f85435607235d20b2dfed93405d00c85b", size = 443432 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/06/f1/446a9bbd2c60772ca36556bac8bfde40eceb28d9cc7838755bc41e001d8f/protobuf-6.33.1-cp310-abi3-win32.whl", hash = "sha256:f8d3fdbc966aaab1d05046d0240dd94d40f2a8c62856d41eaa141ff64a79de6b", size = 425593 }, + { url = "https://files.pythonhosted.org/packages/a6/79/8780a378c650e3df849b73de8b13cf5412f521ca2ff9b78a45c247029440/protobuf-6.33.1-cp310-abi3-win_amd64.whl", hash = "sha256:923aa6d27a92bf44394f6abf7ea0500f38769d4b07f4be41cb52bd8b1123b9ed", size = 436883 }, + { url = "https://files.pythonhosted.org/packages/cd/93/26213ff72b103ae55bb0d73e7fb91ea570ef407c3ab4fd2f1f27cac16044/protobuf-6.33.1-cp39-abi3-macosx_10_9_universal2.whl", hash = "sha256:fe34575f2bdde76ac429ec7b570235bf0c788883e70aee90068e9981806f2490", size = 427522 }, + { url = "https://files.pythonhosted.org/packages/c2/32/df4a35247923393aa6b887c3b3244a8c941c32a25681775f96e2b418f90e/protobuf-6.33.1-cp39-abi3-manylinux2014_aarch64.whl", hash = "sha256:f8adba2e44cde2d7618996b3fc02341f03f5bc3f2748be72dc7b063319276178", size = 324445 }, + { url = "https://files.pythonhosted.org/packages/8e/d0/d796e419e2ec93d2f3fa44888861c3f88f722cde02b7c3488fcc6a166820/protobuf-6.33.1-cp39-abi3-manylinux2014_s390x.whl", hash = "sha256:0f4cf01222c0d959c2b399142deb526de420be8236f22c71356e2a544e153c53", size = 339161 }, + { url = "https://files.pythonhosted.org/packages/1d/2a/3c5f05a4af06649547027d288747f68525755de692a26a7720dced3652c0/protobuf-6.33.1-cp39-abi3-manylinux2014_x86_64.whl", hash = "sha256:8fd7d5e0eb08cd5b87fd3df49bc193f5cfd778701f47e11d127d0afc6c39f1d1", size = 323171 }, + { url = "https://files.pythonhosted.org/packages/08/b4/46310463b4f6ceef310f8348786f3cff181cea671578e3d9743ba61a459e/protobuf-6.33.1-py3-none-any.whl", hash = "sha256:d595a9fd694fdeb061a62fbe10eb039cc1e444df81ec9bb70c7fc59ebcb1eafa", size = 170477 }, +] + +[[package]] +name = "psutil" +version = "7.1.3" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/e1/88/bdd0a41e5857d5d703287598cbf08dad90aed56774ea52ae071bae9071b6/psutil-7.1.3.tar.gz", hash = "sha256:6c86281738d77335af7aec228328e944b30930899ea760ecf33a4dba66be5e74", size = 489059 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/bd/93/0c49e776b8734fef56ec9c5c57f923922f2cf0497d62e0f419465f28f3d0/psutil-7.1.3-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:0005da714eee687b4b8decd3d6cc7c6db36215c9e74e5ad2264b90c3df7d92dc", size = 239751 }, + { url = "https://files.pythonhosted.org/packages/6f/8d/b31e39c769e70780f007969815195a55c81a63efebdd4dbe9e7a113adb2f/psutil-7.1.3-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:19644c85dcb987e35eeeaefdc3915d059dac7bd1167cdcdbf27e0ce2df0c08c0", size = 240368 }, + { url = "https://files.pythonhosted.org/packages/62/61/23fd4acc3c9eebbf6b6c78bcd89e5d020cfde4acf0a9233e9d4e3fa698b4/psutil-7.1.3-cp313-cp313t-manylinux2010_x86_64.manylinux_2_12_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:95ef04cf2e5ba0ab9eaafc4a11eaae91b44f4ef5541acd2ee91d9108d00d59a7", size = 287134 }, + { url = "https://files.pythonhosted.org/packages/30/1c/f921a009ea9ceb51aa355cb0cc118f68d354db36eae18174bab63affb3e6/psutil-7.1.3-cp313-cp313t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:1068c303be3a72f8e18e412c5b2a8f6d31750fb152f9cb106b54090296c9d251", size = 289904 }, + { url = "https://files.pythonhosted.org/packages/a6/82/62d68066e13e46a5116df187d319d1724b3f437ddd0f958756fc052677f4/psutil-7.1.3-cp313-cp313t-win_amd64.whl", hash = "sha256:18349c5c24b06ac5612c0428ec2a0331c26443d259e2a0144a9b24b4395b58fa", size = 249642 }, + { url = "https://files.pythonhosted.org/packages/df/ad/c1cd5fe965c14a0392112f68362cfceb5230819dbb5b1888950d18a11d9f/psutil-7.1.3-cp313-cp313t-win_arm64.whl", hash = "sha256:c525ffa774fe4496282fb0b1187725793de3e7c6b29e41562733cae9ada151ee", size = 245518 }, + { url = "https://files.pythonhosted.org/packages/2e/bb/6670bded3e3236eb4287c7bcdc167e9fae6e1e9286e437f7111caed2f909/psutil-7.1.3-cp314-cp314t-macosx_10_15_x86_64.whl", hash = "sha256:b403da1df4d6d43973dc004d19cee3b848e998ae3154cc8097d139b77156c353", size = 239843 }, + { url = "https://files.pythonhosted.org/packages/b8/66/853d50e75a38c9a7370ddbeefabdd3d3116b9c31ef94dc92c6729bc36bec/psutil-7.1.3-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:ad81425efc5e75da3f39b3e636293360ad8d0b49bed7df824c79764fb4ba9b8b", size = 240369 }, + { url = "https://files.pythonhosted.org/packages/41/bd/313aba97cb5bfb26916dc29cf0646cbe4dd6a89ca69e8c6edce654876d39/psutil-7.1.3-cp314-cp314t-manylinux2010_x86_64.manylinux_2_12_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:8f33a3702e167783a9213db10ad29650ebf383946e91bc77f28a5eb083496bc9", size = 288210 }, + { url = "https://files.pythonhosted.org/packages/c2/fa/76e3c06e760927a0cfb5705eb38164254de34e9bd86db656d4dbaa228b04/psutil-7.1.3-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:fac9cd332c67f4422504297889da5ab7e05fd11e3c4392140f7370f4208ded1f", size = 291182 }, + { url = "https://files.pythonhosted.org/packages/0f/1d/5774a91607035ee5078b8fd747686ebec28a962f178712de100d00b78a32/psutil-7.1.3-cp314-cp314t-win_amd64.whl", hash = "sha256:3792983e23b69843aea49c8f5b8f115572c5ab64c153bada5270086a2123c7e7", size = 250466 }, + { url = "https://files.pythonhosted.org/packages/00/ca/e426584bacb43a5cb1ac91fae1937f478cd8fbe5e4ff96574e698a2c77cd/psutil-7.1.3-cp314-cp314t-win_arm64.whl", hash = "sha256:31d77fcedb7529f27bb3a0472bea9334349f9a04160e8e6e5020f22c59893264", size = 245756 }, + { url = "https://files.pythonhosted.org/packages/ef/94/46b9154a800253e7ecff5aaacdf8ebf43db99de4a2dfa18575b02548654e/psutil-7.1.3-cp36-abi3-macosx_10_9_x86_64.whl", hash = "sha256:2bdbcd0e58ca14996a42adf3621a6244f1bb2e2e528886959c72cf1e326677ab", size = 238359 }, + { url = "https://files.pythonhosted.org/packages/68/3a/9f93cff5c025029a36d9a92fef47220ab4692ee7f2be0fba9f92813d0cb8/psutil-7.1.3-cp36-abi3-macosx_11_0_arm64.whl", hash = "sha256:bc31fa00f1fbc3c3802141eede66f3a2d51d89716a194bf2cd6fc68310a19880", size = 239171 }, + { url = "https://files.pythonhosted.org/packages/ce/b1/5f49af514f76431ba4eea935b8ad3725cdeb397e9245ab919dbc1d1dc20f/psutil-7.1.3-cp36-abi3-manylinux2010_x86_64.manylinux_2_12_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:3bb428f9f05c1225a558f53e30ccbad9930b11c3fc206836242de1091d3e7dd3", size = 263261 }, + { url = "https://files.pythonhosted.org/packages/e0/95/992c8816a74016eb095e73585d747e0a8ea21a061ed3689474fabb29a395/psutil-7.1.3-cp36-abi3-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:56d974e02ca2c8eb4812c3f76c30e28836fffc311d55d979f1465c1feeb2b68b", size = 264635 }, + { url = "https://files.pythonhosted.org/packages/55/4c/c3ed1a622b6ae2fd3c945a366e64eb35247a31e4db16cf5095e269e8eb3c/psutil-7.1.3-cp37-abi3-win_amd64.whl", hash = "sha256:f39c2c19fe824b47484b96f9692932248a54c43799a84282cfe58d05a6449efd", size = 247633 }, + { url = "https://files.pythonhosted.org/packages/c9/ad/33b2ccec09bf96c2b2ef3f9a6f66baac8253d7565d8839e024a6b905d45d/psutil-7.1.3-cp37-abi3-win_arm64.whl", hash = "sha256:bd0d69cee829226a761e92f28140bec9a5ee9d5b4fb4b0cc589068dbfff559b1", size = 244608 }, +] + +[[package]] +name = "pyarrow" +version = "21.0.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/ef/c2/ea068b8f00905c06329a3dfcd40d0fcc2b7d0f2e355bdb25b65e0a0e4cd4/pyarrow-21.0.0.tar.gz", hash = "sha256:5051f2dccf0e283ff56335760cbc8622cf52264d67e359d5569541ac11b6d5bc", size = 1133487 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/ca/d4/d4f817b21aacc30195cf6a46ba041dd1be827efa4a623cc8bf39a1c2a0c0/pyarrow-21.0.0-cp312-cp312-macosx_12_0_arm64.whl", hash = "sha256:3a302f0e0963db37e0a24a70c56cf91a4faa0bca51c23812279ca2e23481fccd", size = 31160305 }, + { url = "https://files.pythonhosted.org/packages/a2/9c/dcd38ce6e4b4d9a19e1d36914cb8e2b1da4e6003dd075474c4cfcdfe0601/pyarrow-21.0.0-cp312-cp312-macosx_12_0_x86_64.whl", hash = "sha256:b6b27cf01e243871390474a211a7922bfbe3bda21e39bc9160daf0da3fe48876", size = 32684264 }, + { url = "https://files.pythonhosted.org/packages/4f/74/2a2d9f8d7a59b639523454bec12dba35ae3d0a07d8ab529dc0809f74b23c/pyarrow-21.0.0-cp312-cp312-manylinux_2_28_aarch64.whl", hash = "sha256:e72a8ec6b868e258a2cd2672d91f2860ad532d590ce94cdf7d5e7ec674ccf03d", size = 41108099 }, + { url = "https://files.pythonhosted.org/packages/ad/90/2660332eeb31303c13b653ea566a9918484b6e4d6b9d2d46879a33ab0622/pyarrow-21.0.0-cp312-cp312-manylinux_2_28_x86_64.whl", hash = "sha256:b7ae0bbdc8c6674259b25bef5d2a1d6af5d39d7200c819cf99e07f7dfef1c51e", size = 42829529 }, + { url = "https://files.pythonhosted.org/packages/33/27/1a93a25c92717f6aa0fca06eb4700860577d016cd3ae51aad0e0488ac899/pyarrow-21.0.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:58c30a1729f82d201627c173d91bd431db88ea74dcaa3885855bc6203e433b82", size = 43367883 }, + { url = "https://files.pythonhosted.org/packages/05/d9/4d09d919f35d599bc05c6950095e358c3e15148ead26292dfca1fb659b0c/pyarrow-21.0.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:072116f65604b822a7f22945a7a6e581cfa28e3454fdcc6939d4ff6090126623", size = 45133802 }, + { url = "https://files.pythonhosted.org/packages/71/30/f3795b6e192c3ab881325ffe172e526499eb3780e306a15103a2764916a2/pyarrow-21.0.0-cp312-cp312-win_amd64.whl", hash = "sha256:cf56ec8b0a5c8c9d7021d6fd754e688104f9ebebf1bf4449613c9531f5346a18", size = 26203175 }, + { url = "https://files.pythonhosted.org/packages/16/ca/c7eaa8e62db8fb37ce942b1ea0c6d7abfe3786ca193957afa25e71b81b66/pyarrow-21.0.0-cp313-cp313-macosx_12_0_arm64.whl", hash = "sha256:e99310a4ebd4479bcd1964dff9e14af33746300cb014aa4a3781738ac63baf4a", size = 31154306 }, + { url = "https://files.pythonhosted.org/packages/ce/e8/e87d9e3b2489302b3a1aea709aaca4b781c5252fcb812a17ab6275a9a484/pyarrow-21.0.0-cp313-cp313-macosx_12_0_x86_64.whl", hash = "sha256:d2fe8e7f3ce329a71b7ddd7498b3cfac0eeb200c2789bd840234f0dc271a8efe", size = 32680622 }, + { url = "https://files.pythonhosted.org/packages/84/52/79095d73a742aa0aba370c7942b1b655f598069489ab387fe47261a849e1/pyarrow-21.0.0-cp313-cp313-manylinux_2_28_aarch64.whl", hash = "sha256:f522e5709379d72fb3da7785aa489ff0bb87448a9dc5a75f45763a795a089ebd", size = 41104094 }, + { url = "https://files.pythonhosted.org/packages/89/4b/7782438b551dbb0468892a276b8c789b8bbdb25ea5c5eb27faadd753e037/pyarrow-21.0.0-cp313-cp313-manylinux_2_28_x86_64.whl", hash = "sha256:69cbbdf0631396e9925e048cfa5bce4e8c3d3b41562bbd70c685a8eb53a91e61", size = 42825576 }, + { url = "https://files.pythonhosted.org/packages/b3/62/0f29de6e0a1e33518dec92c65be0351d32d7ca351e51ec5f4f837a9aab91/pyarrow-21.0.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:731c7022587006b755d0bdb27626a1a3bb004bb56b11fb30d98b6c1b4718579d", size = 43368342 }, + { url = "https://files.pythonhosted.org/packages/90/c7/0fa1f3f29cf75f339768cc698c8ad4ddd2481c1742e9741459911c9ac477/pyarrow-21.0.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:dc56bc708f2d8ac71bd1dcb927e458c93cec10b98eb4120206a4091db7b67b99", size = 45131218 }, + { url = "https://files.pythonhosted.org/packages/01/63/581f2076465e67b23bc5a37d4a2abff8362d389d29d8105832e82c9c811c/pyarrow-21.0.0-cp313-cp313-win_amd64.whl", hash = "sha256:186aa00bca62139f75b7de8420f745f2af12941595bbbfa7ed3870ff63e25636", size = 26087551 }, + { url = "https://files.pythonhosted.org/packages/c9/ab/357d0d9648bb8241ee7348e564f2479d206ebe6e1c47ac5027c2e31ecd39/pyarrow-21.0.0-cp313-cp313t-macosx_12_0_arm64.whl", hash = "sha256:a7a102574faa3f421141a64c10216e078df467ab9576684d5cd696952546e2da", size = 31290064 }, + { url = "https://files.pythonhosted.org/packages/3f/8a/5685d62a990e4cac2043fc76b4661bf38d06efed55cf45a334b455bd2759/pyarrow-21.0.0-cp313-cp313t-macosx_12_0_x86_64.whl", hash = "sha256:1e005378c4a2c6db3ada3ad4c217b381f6c886f0a80d6a316fe586b90f77efd7", size = 32727837 }, + { url = "https://files.pythonhosted.org/packages/fc/de/c0828ee09525c2bafefd3e736a248ebe764d07d0fd762d4f0929dbc516c9/pyarrow-21.0.0-cp313-cp313t-manylinux_2_28_aarch64.whl", hash = "sha256:65f8e85f79031449ec8706b74504a316805217b35b6099155dd7e227eef0d4b6", size = 41014158 }, + { url = "https://files.pythonhosted.org/packages/6e/26/a2865c420c50b7a3748320b614f3484bfcde8347b2639b2b903b21ce6a72/pyarrow-21.0.0-cp313-cp313t-manylinux_2_28_x86_64.whl", hash = "sha256:3a81486adc665c7eb1a2bde0224cfca6ceaba344a82a971ef059678417880eb8", size = 42667885 }, + { url = "https://files.pythonhosted.org/packages/0a/f9/4ee798dc902533159250fb4321267730bc0a107d8c6889e07c3add4fe3a5/pyarrow-21.0.0-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:fc0d2f88b81dcf3ccf9a6ae17f89183762c8a94a5bdcfa09e05cfe413acf0503", size = 43276625 }, + { url = "https://files.pythonhosted.org/packages/5a/da/e02544d6997037a4b0d22d8e5f66bc9315c3671371a8b18c79ade1cefe14/pyarrow-21.0.0-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:6299449adf89df38537837487a4f8d3bd91ec94354fdd2a7d30bc11c48ef6e79", size = 44951890 }, + { url = "https://files.pythonhosted.org/packages/e5/4e/519c1bc1876625fe6b71e9a28287c43ec2f20f73c658b9ae1d485c0c206e/pyarrow-21.0.0-cp313-cp313t-win_amd64.whl", hash = "sha256:222c39e2c70113543982c6b34f3077962b44fca38c0bd9e68bb6781534425c10", size = 26371006 }, +] + +[[package]] +name = "pydeck" +version = "0.9.1" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "jinja2" }, + { name = "numpy" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/a1/ca/40e14e196864a0f61a92abb14d09b3d3da98f94ccb03b49cf51688140dab/pydeck-0.9.1.tar.gz", hash = "sha256:f74475ae637951d63f2ee58326757f8d4f9cd9f2a457cf42950715003e2cb605", size = 3832240 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/ab/4c/b888e6cf58bd9db9c93f40d1c6be8283ff49d88919231afe93a6bcf61626/pydeck-0.9.1-py2.py3-none-any.whl", hash = "sha256:b3f75ba0d273fc917094fa61224f3f6076ca8752b93d46faf3bcfd9f9d59b038", size = 6900403 }, +] + +[[package]] +name = "pygments" +version = "2.19.2" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/b0/77/a5b8c569bf593b0140bde72ea885a803b82086995367bf2037de0159d924/pygments-2.19.2.tar.gz", hash = "sha256:636cb2477cec7f8952536970bc533bc43743542f70392ae026374600add5b887", size = 4968631 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/c7/21/705964c7812476f378728bdf590ca4b771ec72385c533964653c68e86bdc/pygments-2.19.2-py3-none-any.whl", hash = "sha256:86540386c03d588bb81d44bc3928634ff26449851e99741617ecb9037ee5ec0b", size = 1225217 }, +] + +[[package]] +name = "pymdown-extensions" +version = "10.17.1" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "markdown" }, + { name = "pyyaml" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/e7/d9/a987e4d549c6c82353fce5fa5f650229bb60ea4c0d1684a2714a509aef58/pymdown_extensions-10.17.1.tar.gz", hash = "sha256:60d05fe55e7fb5a1e4740fc575facad20dc6ee3a748e8d3d36ba44142e75ce03", size = 845207 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/81/40/b2d7b9fdccc63e48ae4dbd363b6b89eb7ac346ea49ed667bb71f92af3021/pymdown_extensions-10.17.1-py3-none-any.whl", hash = "sha256:1f160209c82eecbb5d8a0d8f89a4d9bd6bdcbde9a8537761844cfc57ad5cd8a6", size = 266310 }, +] + +[[package]] +name = "python-dateutil" +version = "2.9.0.post0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "six" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/66/c0/0c8b6ad9f17a802ee498c46e004a0eb49bc148f2fd230864601a86dcf6db/python-dateutil-2.9.0.post0.tar.gz", hash = "sha256:37dd54208da7e1cd875388217d5e00ebd4179249f90fb72437e91a35459a0ad3", size = 342432 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/ec/57/56b9bcc3c9c6a792fcbaf139543cee77261f3651ca9da0c93f5c1221264b/python_dateutil-2.9.0.post0-py2.py3-none-any.whl", hash = "sha256:a8b2bc7bffae282281c8140a97d3aa9c14da0b136dfe83f850eea9a5f7470427", size = 229892 }, +] + +[[package]] +name = "pytz" +version = "2025.2" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/f8/bf/abbd3cdfb8fbc7fb3d4d38d320f2441b1e7cbe29be4f23797b4a2b5d8aac/pytz-2025.2.tar.gz", hash = "sha256:360b9e3dbb49a209c21ad61809c7fb453643e048b38924c765813546746e81c3", size = 320884 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/81/c4/34e93fe5f5429d7570ec1fa436f1986fb1f00c3e0f43a589fe2bbcd22c3f/pytz-2025.2-py2.py3-none-any.whl", hash = "sha256:5ddf76296dd8c44c26eb8f4b6f35488f3ccbf6fbbd7adee0b7262d43f0ec2f00", size = 509225 }, +] + +[[package]] +name = "pyyaml" +version = "6.0.3" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/05/8e/961c0007c59b8dd7729d542c61a4d537767a59645b82a0b521206e1e25c2/pyyaml-6.0.3.tar.gz", hash = "sha256:d76623373421df22fb4cf8817020cbb7ef15c725b9d5e45f17e189bfc384190f", size = 130960 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/d1/33/422b98d2195232ca1826284a76852ad5a86fe23e31b009c9886b2d0fb8b2/pyyaml-6.0.3-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:7f047e29dcae44602496db43be01ad42fc6f1cc0d8cd6c83d342306c32270196", size = 182063 }, + { url = "https://files.pythonhosted.org/packages/89/a0/6cf41a19a1f2f3feab0e9c0b74134aa2ce6849093d5517a0c550fe37a648/pyyaml-6.0.3-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:fc09d0aa354569bc501d4e787133afc08552722d3ab34836a80547331bb5d4a0", size = 173973 }, + { url = "https://files.pythonhosted.org/packages/ed/23/7a778b6bd0b9a8039df8b1b1d80e2e2ad78aa04171592c8a5c43a56a6af4/pyyaml-6.0.3-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:9149cad251584d5fb4981be1ecde53a1ca46c891a79788c0df828d2f166bda28", size = 775116 }, + { url = "https://files.pythonhosted.org/packages/65/30/d7353c338e12baef4ecc1b09e877c1970bd3382789c159b4f89d6a70dc09/pyyaml-6.0.3-cp312-cp312-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:5fdec68f91a0c6739b380c83b951e2c72ac0197ace422360e6d5a959d8d97b2c", size = 844011 }, + { url = "https://files.pythonhosted.org/packages/8b/9d/b3589d3877982d4f2329302ef98a8026e7f4443c765c46cfecc8858c6b4b/pyyaml-6.0.3-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:ba1cc08a7ccde2d2ec775841541641e4548226580ab850948cbfda66a1befcdc", size = 807870 }, + { url = "https://files.pythonhosted.org/packages/05/c0/b3be26a015601b822b97d9149ff8cb5ead58c66f981e04fedf4e762f4bd4/pyyaml-6.0.3-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:8dc52c23056b9ddd46818a57b78404882310fb473d63f17b07d5c40421e47f8e", size = 761089 }, + { url = "https://files.pythonhosted.org/packages/be/8e/98435a21d1d4b46590d5459a22d88128103f8da4c2d4cb8f14f2a96504e1/pyyaml-6.0.3-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:41715c910c881bc081f1e8872880d3c650acf13dfa8214bad49ed4cede7c34ea", size = 790181 }, + { url = "https://files.pythonhosted.org/packages/74/93/7baea19427dcfbe1e5a372d81473250b379f04b1bd3c4c5ff825e2327202/pyyaml-6.0.3-cp312-cp312-win32.whl", hash = "sha256:96b533f0e99f6579b3d4d4995707cf36df9100d67e0c8303a0c55b27b5f99bc5", size = 137658 }, + { url = "https://files.pythonhosted.org/packages/86/bf/899e81e4cce32febab4fb42bb97dcdf66bc135272882d1987881a4b519e9/pyyaml-6.0.3-cp312-cp312-win_amd64.whl", hash = "sha256:5fcd34e47f6e0b794d17de1b4ff496c00986e1c83f7ab2fb8fcfe9616ff7477b", size = 154003 }, + { url = "https://files.pythonhosted.org/packages/1a/08/67bd04656199bbb51dbed1439b7f27601dfb576fb864099c7ef0c3e55531/pyyaml-6.0.3-cp312-cp312-win_arm64.whl", hash = "sha256:64386e5e707d03a7e172c0701abfb7e10f0fb753ee1d773128192742712a98fd", size = 140344 }, + { url = "https://files.pythonhosted.org/packages/d1/11/0fd08f8192109f7169db964b5707a2f1e8b745d4e239b784a5a1dd80d1db/pyyaml-6.0.3-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:8da9669d359f02c0b91ccc01cac4a67f16afec0dac22c2ad09f46bee0697eba8", size = 181669 }, + { url = "https://files.pythonhosted.org/packages/b1/16/95309993f1d3748cd644e02e38b75d50cbc0d9561d21f390a76242ce073f/pyyaml-6.0.3-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:2283a07e2c21a2aa78d9c4442724ec1eb15f5e42a723b99cb3d822d48f5f7ad1", size = 173252 }, + { url = "https://files.pythonhosted.org/packages/50/31/b20f376d3f810b9b2371e72ef5adb33879b25edb7a6d072cb7ca0c486398/pyyaml-6.0.3-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:ee2922902c45ae8ccada2c5b501ab86c36525b883eff4255313a253a3160861c", size = 767081 }, + { url = "https://files.pythonhosted.org/packages/49/1e/a55ca81e949270d5d4432fbbd19dfea5321eda7c41a849d443dc92fd1ff7/pyyaml-6.0.3-cp313-cp313-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:a33284e20b78bd4a18c8c2282d549d10bc8408a2a7ff57653c0cf0b9be0afce5", size = 841159 }, + { url = "https://files.pythonhosted.org/packages/74/27/e5b8f34d02d9995b80abcef563ea1f8b56d20134d8f4e5e81733b1feceb2/pyyaml-6.0.3-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:0f29edc409a6392443abf94b9cf89ce99889a1dd5376d94316ae5145dfedd5d6", size = 801626 }, + { url = "https://files.pythonhosted.org/packages/f9/11/ba845c23988798f40e52ba45f34849aa8a1f2d4af4b798588010792ebad6/pyyaml-6.0.3-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:f7057c9a337546edc7973c0d3ba84ddcdf0daa14533c2065749c9075001090e6", size = 753613 }, + { url = "https://files.pythonhosted.org/packages/3d/e0/7966e1a7bfc0a45bf0a7fb6b98ea03fc9b8d84fa7f2229e9659680b69ee3/pyyaml-6.0.3-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:eda16858a3cab07b80edaf74336ece1f986ba330fdb8ee0d6c0d68fe82bc96be", size = 794115 }, + { url = "https://files.pythonhosted.org/packages/de/94/980b50a6531b3019e45ddeada0626d45fa85cbe22300844a7983285bed3b/pyyaml-6.0.3-cp313-cp313-win32.whl", hash = "sha256:d0eae10f8159e8fdad514efdc92d74fd8d682c933a6dd088030f3834bc8e6b26", size = 137427 }, + { url = "https://files.pythonhosted.org/packages/97/c9/39d5b874e8b28845e4ec2202b5da735d0199dbe5b8fb85f91398814a9a46/pyyaml-6.0.3-cp313-cp313-win_amd64.whl", hash = "sha256:79005a0d97d5ddabfeeea4cf676af11e647e41d81c9a7722a193022accdb6b7c", size = 154090 }, + { url = "https://files.pythonhosted.org/packages/73/e8/2bdf3ca2090f68bb3d75b44da7bbc71843b19c9f2b9cb9b0f4ab7a5a4329/pyyaml-6.0.3-cp313-cp313-win_arm64.whl", hash = "sha256:5498cd1645aa724a7c71c8f378eb29ebe23da2fc0d7a08071d89469bf1d2defb", size = 140246 }, + { url = "https://files.pythonhosted.org/packages/9d/8c/f4bd7f6465179953d3ac9bc44ac1a8a3e6122cf8ada906b4f96c60172d43/pyyaml-6.0.3-cp314-cp314-macosx_10_13_x86_64.whl", hash = "sha256:8d1fab6bb153a416f9aeb4b8763bc0f22a5586065f86f7664fc23339fc1c1fac", size = 181814 }, + { url = "https://files.pythonhosted.org/packages/bd/9c/4d95bb87eb2063d20db7b60faa3840c1b18025517ae857371c4dd55a6b3a/pyyaml-6.0.3-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:34d5fcd24b8445fadc33f9cf348c1047101756fd760b4dacb5c3e99755703310", size = 173809 }, + { url = "https://files.pythonhosted.org/packages/92/b5/47e807c2623074914e29dabd16cbbdd4bf5e9b2db9f8090fa64411fc5382/pyyaml-6.0.3-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:501a031947e3a9025ed4405a168e6ef5ae3126c59f90ce0cd6f2bfc477be31b7", size = 766454 }, + { url = "https://files.pythonhosted.org/packages/02/9e/e5e9b168be58564121efb3de6859c452fccde0ab093d8438905899a3a483/pyyaml-6.0.3-cp314-cp314-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:b3bc83488de33889877a0f2543ade9f70c67d66d9ebb4ac959502e12de895788", size = 836355 }, + { url = "https://files.pythonhosted.org/packages/88/f9/16491d7ed2a919954993e48aa941b200f38040928474c9e85ea9e64222c3/pyyaml-6.0.3-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:c458b6d084f9b935061bc36216e8a69a7e293a2f1e68bf956dcd9e6cbcd143f5", size = 794175 }, + { url = "https://files.pythonhosted.org/packages/dd/3f/5989debef34dc6397317802b527dbbafb2b4760878a53d4166579111411e/pyyaml-6.0.3-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:7c6610def4f163542a622a73fb39f534f8c101d690126992300bf3207eab9764", size = 755228 }, + { url = "https://files.pythonhosted.org/packages/d7/ce/af88a49043cd2e265be63d083fc75b27b6ed062f5f9fd6cdc223ad62f03e/pyyaml-6.0.3-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:5190d403f121660ce8d1d2c1bb2ef1bd05b5f68533fc5c2ea899bd15f4399b35", size = 789194 }, + { url = "https://files.pythonhosted.org/packages/23/20/bb6982b26a40bb43951265ba29d4c246ef0ff59c9fdcdf0ed04e0687de4d/pyyaml-6.0.3-cp314-cp314-win_amd64.whl", hash = "sha256:4a2e8cebe2ff6ab7d1050ecd59c25d4c8bd7e6f400f5f82b96557ac0abafd0ac", size = 156429 }, + { url = "https://files.pythonhosted.org/packages/f4/f4/a4541072bb9422c8a883ab55255f918fa378ecf083f5b85e87fc2b4eda1b/pyyaml-6.0.3-cp314-cp314-win_arm64.whl", hash = "sha256:93dda82c9c22deb0a405ea4dc5f2d0cda384168e466364dec6255b293923b2f3", size = 143912 }, + { url = "https://files.pythonhosted.org/packages/7c/f9/07dd09ae774e4616edf6cda684ee78f97777bdd15847253637a6f052a62f/pyyaml-6.0.3-cp314-cp314t-macosx_10_13_x86_64.whl", hash = "sha256:02893d100e99e03eda1c8fd5c441d8c60103fd175728e23e431db1b589cf5ab3", size = 189108 }, + { url = "https://files.pythonhosted.org/packages/4e/78/8d08c9fb7ce09ad8c38ad533c1191cf27f7ae1effe5bb9400a46d9437fcf/pyyaml-6.0.3-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:c1ff362665ae507275af2853520967820d9124984e0f7466736aea23d8611fba", size = 183641 }, + { url = "https://files.pythonhosted.org/packages/7b/5b/3babb19104a46945cf816d047db2788bcaf8c94527a805610b0289a01c6b/pyyaml-6.0.3-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:6adc77889b628398debc7b65c073bcb99c4a0237b248cacaf3fe8a557563ef6c", size = 831901 }, + { url = "https://files.pythonhosted.org/packages/8b/cc/dff0684d8dc44da4d22a13f35f073d558c268780ce3c6ba1b87055bb0b87/pyyaml-6.0.3-cp314-cp314t-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:a80cb027f6b349846a3bf6d73b5e95e782175e52f22108cfa17876aaeff93702", size = 861132 }, + { url = "https://files.pythonhosted.org/packages/b1/5e/f77dc6b9036943e285ba76b49e118d9ea929885becb0a29ba8a7c75e29fe/pyyaml-6.0.3-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:00c4bdeba853cc34e7dd471f16b4114f4162dc03e6b7afcc2128711f0eca823c", size = 839261 }, + { url = "https://files.pythonhosted.org/packages/ce/88/a9db1376aa2a228197c58b37302f284b5617f56a5d959fd1763fb1675ce6/pyyaml-6.0.3-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:66e1674c3ef6f541c35191caae2d429b967b99e02040f5ba928632d9a7f0f065", size = 805272 }, + { url = "https://files.pythonhosted.org/packages/da/92/1446574745d74df0c92e6aa4a7b0b3130706a4142b2d1a5869f2eaa423c6/pyyaml-6.0.3-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:16249ee61e95f858e83976573de0f5b2893b3677ba71c9dd36b9cf8be9ac6d65", size = 829923 }, + { url = "https://files.pythonhosted.org/packages/f0/7a/1c7270340330e575b92f397352af856a8c06f230aa3e76f86b39d01b416a/pyyaml-6.0.3-cp314-cp314t-win_amd64.whl", hash = "sha256:4ad1906908f2f5ae4e5a8ddfce73c320c2a1429ec52eafd27138b7f1cbe341c9", size = 174062 }, + { url = "https://files.pythonhosted.org/packages/f1/12/de94a39c2ef588c7e6455cfbe7343d3b2dc9d6b6b2f40c4c6565744c873d/pyyaml-6.0.3-cp314-cp314t-win_arm64.whl", hash = "sha256:ebc55a14a21cb14062aa4162f906cd962b28e2e9ea38f9b4391244cd8de4ae0b", size = 149341 }, +] + +[[package]] +name = "referencing" +version = "0.37.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "attrs" }, + { name = "rpds-py" }, + { name = "typing-extensions", marker = "python_full_version < '3.13'" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/22/f5/df4e9027acead3ecc63e50fe1e36aca1523e1719559c499951bb4b53188f/referencing-0.37.0.tar.gz", hash = "sha256:44aefc3142c5b842538163acb373e24cce6632bd54bdb01b21ad5863489f50d8", size = 78036 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/2c/58/ca301544e1fa93ed4f80d724bf5b194f6e4b945841c5bfd555878eea9fcb/referencing-0.37.0-py3-none-any.whl", hash = "sha256:381329a9f99628c9069361716891d34ad94af76e461dcb0335825aecc7692231", size = 26766 }, +] + +[[package]] +name = "requests" +version = "2.32.5" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "certifi" }, + { name = "charset-normalizer" }, + { name = "idna" }, + { name = "urllib3" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/c9/74/b3ff8e6c8446842c3f5c837e9c3dfcfe2018ea6ecef224c710c85ef728f4/requests-2.32.5.tar.gz", hash = "sha256:dbba0bac56e100853db0ea71b82b4dfd5fe2bf6d3754a8893c3af500cec7d7cf", size = 134517 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/1e/db/4254e3eabe8020b458f1a747140d32277ec7a271daf1d235b70dc0b4e6e3/requests-2.32.5-py3-none-any.whl", hash = "sha256:2462f94637a34fd532264295e186976db0f5d453d1cdd31473c85a6a161affb6", size = 64738 }, +] + +[[package]] +name = "rpds-py" +version = "0.29.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/98/33/23b3b3419b6a3e0f559c7c0d2ca8fc1b9448382b25245033788785921332/rpds_py-0.29.0.tar.gz", hash = "sha256:fe55fe686908f50154d1dc599232016e50c243b438c3b7432f24e2895b0e5359", size = 69359 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/3c/50/bc0e6e736d94e420df79be4deb5c9476b63165c87bb8f19ef75d100d21b3/rpds_py-0.29.0-cp312-cp312-macosx_10_12_x86_64.whl", hash = "sha256:a0891cfd8db43e085c0ab93ab7e9b0c8fee84780d436d3b266b113e51e79f954", size = 376000 }, + { url = "https://files.pythonhosted.org/packages/3e/3a/46676277160f014ae95f24de53bed0e3b7ea66c235e7de0b9df7bd5d68ba/rpds_py-0.29.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:3897924d3f9a0361472d884051f9a2460358f9a45b1d85a39a158d2f8f1ad71c", size = 360575 }, + { url = "https://files.pythonhosted.org/packages/75/ba/411d414ed99ea1afdd185bbabeeaac00624bd1e4b22840b5e9967ade6337/rpds_py-0.29.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2a21deb8e0d1571508c6491ce5ea5e25669b1dd4adf1c9d64b6314842f708b5d", size = 392159 }, + { url = "https://files.pythonhosted.org/packages/8f/b1/e18aa3a331f705467a48d0296778dc1fea9d7f6cf675bd261f9a846c7e90/rpds_py-0.29.0-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:9efe71687d6427737a0a2de9ca1c0a216510e6cd08925c44162be23ed7bed2d5", size = 410602 }, + { url = "https://files.pythonhosted.org/packages/2f/6c/04f27f0c9f2299274c76612ac9d2c36c5048bb2c6c2e52c38c60bf3868d9/rpds_py-0.29.0-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:40f65470919dc189c833e86b2c4bd21bd355f98436a2cef9e0a9a92aebc8e57e", size = 515808 }, + { url = "https://files.pythonhosted.org/packages/83/56/a8412aa464fb151f8bc0d91fb0bb888adc9039bd41c1c6ba8d94990d8cf8/rpds_py-0.29.0-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:def48ff59f181130f1a2cb7c517d16328efac3ec03951cca40c1dc2049747e83", size = 416015 }, + { url = "https://files.pythonhosted.org/packages/04/4c/f9b8a05faca3d9e0a6397c90d13acb9307c9792b2bff621430c58b1d6e76/rpds_py-0.29.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ad7bd570be92695d89285a4b373006930715b78d96449f686af422debb4d3949", size = 395325 }, + { url = "https://files.pythonhosted.org/packages/34/60/869f3bfbf8ed7b54f1ad9a5543e0fdffdd40b5a8f587fe300ee7b4f19340/rpds_py-0.29.0-cp312-cp312-manylinux_2_31_riscv64.whl", hash = "sha256:5a572911cd053137bbff8e3a52d31c5d2dba51d3a67ad902629c70185f3f2181", size = 410160 }, + { url = "https://files.pythonhosted.org/packages/91/aa/e5b496334e3aba4fe4c8a80187b89f3c1294c5c36f2a926da74338fa5a73/rpds_py-0.29.0-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:d583d4403bcbf10cffc3ab5cee23d7643fcc960dff85973fd3c2d6c86e8dbb0c", size = 425309 }, + { url = "https://files.pythonhosted.org/packages/85/68/4e24a34189751ceb6d66b28f18159922828dd84155876551f7ca5b25f14f/rpds_py-0.29.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:070befbb868f257d24c3bb350dbd6e2f645e83731f31264b19d7231dd5c396c7", size = 574644 }, + { url = "https://files.pythonhosted.org/packages/8c/cf/474a005ea4ea9c3b4f17b6108b6b13cebfc98ebaff11d6e1b193204b3a93/rpds_py-0.29.0-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:fc935f6b20b0c9f919a8ff024739174522abd331978f750a74bb68abd117bd19", size = 601605 }, + { url = "https://files.pythonhosted.org/packages/f4/b1/c56f6a9ab8c5f6bb5c65c4b5f8229167a3a525245b0773f2c0896686b64e/rpds_py-0.29.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:8c5a8ecaa44ce2d8d9d20a68a2483a74c07f05d72e94a4dff88906c8807e77b0", size = 564593 }, + { url = "https://files.pythonhosted.org/packages/b3/13/0494cecce4848f68501e0a229432620b4b57022388b071eeff95f3e1e75b/rpds_py-0.29.0-cp312-cp312-win32.whl", hash = "sha256:ba5e1aeaf8dd6d8f6caba1f5539cddda87d511331714b7b5fc908b6cfc3636b7", size = 223853 }, + { url = "https://files.pythonhosted.org/packages/1f/6a/51e9aeb444a00cdc520b032a28b07e5f8dc7bc328b57760c53e7f96997b4/rpds_py-0.29.0-cp312-cp312-win_amd64.whl", hash = "sha256:b5f6134faf54b3cb83375db0f113506f8b7770785be1f95a631e7e2892101977", size = 239895 }, + { url = "https://files.pythonhosted.org/packages/d1/d4/8bce56cdad1ab873e3f27cb31c6a51d8f384d66b022b820525b879f8bed1/rpds_py-0.29.0-cp312-cp312-win_arm64.whl", hash = "sha256:b016eddf00dca7944721bf0cd85b6af7f6c4efaf83ee0b37c4133bd39757a8c7", size = 230321 }, + { url = "https://files.pythonhosted.org/packages/fd/d9/c5de60d9d371bbb186c3e9bf75f4fc5665e11117a25a06a6b2e0afb7380e/rpds_py-0.29.0-cp313-cp313-macosx_10_12_x86_64.whl", hash = "sha256:1585648d0760b88292eecab5181f5651111a69d90eff35d6b78aa32998886a61", size = 375710 }, + { url = "https://files.pythonhosted.org/packages/b3/b3/0860cdd012291dc21272895ce107f1e98e335509ba986dd83d72658b82b9/rpds_py-0.29.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:521807963971a23996ddaf764c682b3e46459b3c58ccd79fefbe16718db43154", size = 360582 }, + { url = "https://files.pythonhosted.org/packages/92/8a/a18c2f4a61b3407e56175f6aab6deacdf9d360191a3d6f38566e1eaf7266/rpds_py-0.29.0-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0a8896986efaa243ab713c69e6491a4138410f0fe36f2f4c71e18bd5501e8014", size = 391172 }, + { url = "https://files.pythonhosted.org/packages/fd/49/e93354258508c50abc15cdcd5fcf7ac4117f67bb6233ad7859f75e7372a0/rpds_py-0.29.0-cp313-cp313-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:1d24564a700ef41480a984c5ebed62b74e6ce5860429b98b1fede76049e953e6", size = 409586 }, + { url = "https://files.pythonhosted.org/packages/5a/8d/a27860dae1c19a6bdc901f90c81f0d581df1943355802961a57cdb5b6cd1/rpds_py-0.29.0-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:e6596b93c010d386ae46c9fba9bfc9fc5965fa8228edeac51576299182c2e31c", size = 516339 }, + { url = "https://files.pythonhosted.org/packages/fc/ad/a75e603161e79b7110c647163d130872b271c6b28712c803c65d492100f7/rpds_py-0.29.0-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:5cc58aac218826d054c7da7f95821eba94125d88be673ff44267bb89d12a5866", size = 416201 }, + { url = "https://files.pythonhosted.org/packages/b9/42/555b4ee17508beafac135c8b450816ace5a96194ce97fefc49d58e5652ea/rpds_py-0.29.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:de73e40ebc04dd5d9556f50180395322193a78ec247e637e741c1b954810f295", size = 395095 }, + { url = "https://files.pythonhosted.org/packages/cd/f0/c90b671b9031e800ec45112be42ea9f027f94f9ac25faaac8770596a16a1/rpds_py-0.29.0-cp313-cp313-manylinux_2_31_riscv64.whl", hash = "sha256:295ce5ac7f0cf69a651ea75c8f76d02a31f98e5698e82a50a5f4d4982fbbae3b", size = 410077 }, + { url = "https://files.pythonhosted.org/packages/3d/80/9af8b640b81fe21e6f718e9dec36c0b5f670332747243130a5490f292245/rpds_py-0.29.0-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:1ea59b23ea931d494459c8338056fe7d93458c0bf3ecc061cd03916505369d55", size = 424548 }, + { url = "https://files.pythonhosted.org/packages/e4/0b/b5647446e991736e6a495ef510e6710df91e880575a586e763baeb0aa770/rpds_py-0.29.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:f49d41559cebd608042fdcf54ba597a4a7555b49ad5c1c0c03e0af82692661cd", size = 573661 }, + { url = "https://files.pythonhosted.org/packages/f7/b3/1b1c9576839ff583d1428efbf59f9ee70498d8ce6c0b328ac02f1e470879/rpds_py-0.29.0-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:05a2bd42768ea988294ca328206efbcc66e220d2d9b7836ee5712c07ad6340ea", size = 600937 }, + { url = "https://files.pythonhosted.org/packages/6c/7b/b6cfca2f9fee4c4494ce54f7fb1b9f578867495a9aa9fc0d44f5f735c8e0/rpds_py-0.29.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:33ca7bdfedd83339ca55da3a5e1527ee5870d4b8369456b5777b197756f3ca22", size = 564496 }, + { url = "https://files.pythonhosted.org/packages/b9/fb/ba29ec7f0f06eb801bac5a23057a9ff7670623b5e8013bd59bec4aa09de8/rpds_py-0.29.0-cp313-cp313-win32.whl", hash = "sha256:20c51ae86a0bb9accc9ad4e6cdeec58d5ebb7f1b09dd4466331fc65e1766aae7", size = 223126 }, + { url = "https://files.pythonhosted.org/packages/3c/6b/0229d3bed4ddaa409e6d90b0ae967ed4380e4bdd0dad6e59b92c17d42457/rpds_py-0.29.0-cp313-cp313-win_amd64.whl", hash = "sha256:6410e66f02803600edb0b1889541f4b5cc298a5ccda0ad789cc50ef23b54813e", size = 239771 }, + { url = "https://files.pythonhosted.org/packages/e4/38/d2868f058b164f8efd89754d85d7b1c08b454f5c07ac2e6cc2e9bd4bd05b/rpds_py-0.29.0-cp313-cp313-win_arm64.whl", hash = "sha256:56838e1cd9174dc23c5691ee29f1d1be9eab357f27efef6bded1328b23e1ced2", size = 229994 }, + { url = "https://files.pythonhosted.org/packages/52/91/5de91c5ec7d41759beec9b251630824dbb8e32d20c3756da1a9a9d309709/rpds_py-0.29.0-cp313-cp313t-macosx_10_12_x86_64.whl", hash = "sha256:37d94eadf764d16b9a04307f2ab1d7af6dc28774bbe0535c9323101e14877b4c", size = 365886 }, + { url = "https://files.pythonhosted.org/packages/85/7c/415d8c1b016d5f47ecec5145d9d6d21002d39dce8761b30f6c88810b455a/rpds_py-0.29.0-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:d472cf73efe5726a067dce63eebe8215b14beabea7c12606fd9994267b3cfe2b", size = 355262 }, + { url = "https://files.pythonhosted.org/packages/3d/14/bf83e2daa4f980e4dc848aed9299792a8b84af95e12541d9e7562f84a6ef/rpds_py-0.29.0-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:72fdfd5ff8992e4636621826371e3ac5f3e3b8323e9d0e48378e9c13c3dac9d0", size = 384826 }, + { url = "https://files.pythonhosted.org/packages/33/b8/53330c50a810ae22b4fbba5e6cf961b68b9d72d9bd6780a7c0a79b070857/rpds_py-0.29.0-cp313-cp313t-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:2549d833abdf8275c901313b9e8ff8fba57e50f6a495035a2a4e30621a2f7cc4", size = 394234 }, + { url = "https://files.pythonhosted.org/packages/cc/32/01e2e9645cef0e584f518cfde4567563e57db2257244632b603f61b40e50/rpds_py-0.29.0-cp313-cp313t-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:4448dad428f28a6a767c3e3b80cde3446a22a0efbddaa2360f4bb4dc836d0688", size = 520008 }, + { url = "https://files.pythonhosted.org/packages/98/c3/0d1b95a81affae2b10f950782e33a1fd2edd6ce2a479966cac98c9a66f57/rpds_py-0.29.0-cp313-cp313t-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:115f48170fd4296a33938d8c11f697f5f26e0472e43d28f35624764173a60e4d", size = 409569 }, + { url = "https://files.pythonhosted.org/packages/fa/60/aa3b8678f3f009f675b99174fa2754302a7fbfe749162e8043d111de2d88/rpds_py-0.29.0-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8e5bb73ffc029820f4348e9b66b3027493ae00bca6629129cd433fd7a76308ee", size = 385188 }, + { url = "https://files.pythonhosted.org/packages/92/02/5546c1c8aa89c18d40c1fcffdcc957ba730dee53fb7c3ca3a46f114761d2/rpds_py-0.29.0-cp313-cp313t-manylinux_2_31_riscv64.whl", hash = "sha256:b1581fcde18fcdf42ea2403a16a6b646f8eb1e58d7f90a0ce693da441f76942e", size = 398587 }, + { url = "https://files.pythonhosted.org/packages/6c/e0/ad6eeaf47e236eba052fa34c4073078b9e092bd44da6bbb35aaae9580669/rpds_py-0.29.0-cp313-cp313t-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:16e9da2bda9eb17ea318b4c335ec9ac1818e88922cbe03a5743ea0da9ecf74fb", size = 416641 }, + { url = "https://files.pythonhosted.org/packages/1a/93/0acedfd50ad9cdd3879c615a6dc8c5f1ce78d2fdf8b87727468bb5bb4077/rpds_py-0.29.0-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:28fd300326dd21198f311534bdb6d7e989dd09b3418b3a91d54a0f384c700967", size = 566683 }, + { url = "https://files.pythonhosted.org/packages/62/53/8c64e0f340a9e801459fc6456821abc15b3582cb5dc3932d48705a9d9ac7/rpds_py-0.29.0-cp313-cp313t-musllinux_1_2_i686.whl", hash = "sha256:2aba991e041d031c7939e1358f583ae405a7bf04804ca806b97a5c0e0af1ea5e", size = 592730 }, + { url = "https://files.pythonhosted.org/packages/85/ef/3109b6584f8c4b0d2490747c916df833c127ecfa82be04d9a40a376f2090/rpds_py-0.29.0-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:7f437026dbbc3f08c99cc41a5b2570c6e1a1ddbe48ab19a9b814254128d4ea7a", size = 557361 }, + { url = "https://files.pythonhosted.org/packages/ff/3b/61586475e82d57f01da2c16edb9115a618afe00ce86fe1b58936880b15af/rpds_py-0.29.0-cp313-cp313t-win32.whl", hash = "sha256:6e97846e9800a5d0fe7be4d008f0c93d0feeb2700da7b1f7528dabafb31dfadb", size = 211227 }, + { url = "https://files.pythonhosted.org/packages/3b/3a/12dc43f13594a54ea0c9d7e9d43002116557330e3ad45bc56097ddf266e2/rpds_py-0.29.0-cp313-cp313t-win_amd64.whl", hash = "sha256:f49196aec7c4b406495f60e6f947ad71f317a765f956d74bbd83996b9edc0352", size = 225248 }, + { url = "https://files.pythonhosted.org/packages/89/b1/0b1474e7899371d9540d3bbb2a499a3427ae1fc39c998563fe9035a1073b/rpds_py-0.29.0-cp314-cp314-macosx_10_12_x86_64.whl", hash = "sha256:394d27e4453d3b4d82bb85665dc1fcf4b0badc30fc84282defed71643b50e1a1", size = 363731 }, + { url = "https://files.pythonhosted.org/packages/28/12/3b7cf2068d0a334ed1d7b385a9c3c8509f4c2bcba3d4648ea71369de0881/rpds_py-0.29.0-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:55d827b2ae95425d3be9bc9a5838b6c29d664924f98146557f7715e331d06df8", size = 354343 }, + { url = "https://files.pythonhosted.org/packages/eb/73/5afcf8924bc02a749416eda64e17ac9c9b28f825f4737385295a0e99b0c1/rpds_py-0.29.0-cp314-cp314-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:fc31a07ed352e5462d3ee1b22e89285f4ce97d5266f6d1169da1142e78045626", size = 385406 }, + { url = "https://files.pythonhosted.org/packages/c8/37/5db736730662508535221737a21563591b6f43c77f2e388951c42f143242/rpds_py-0.29.0-cp314-cp314-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:c4695dd224212f6105db7ea62197144230b808d6b2bba52238906a2762f1d1e7", size = 396162 }, + { url = "https://files.pythonhosted.org/packages/70/0d/491c1017d14f62ce7bac07c32768d209a50ec567d76d9f383b4cfad19b80/rpds_py-0.29.0-cp314-cp314-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:fcae1770b401167f8b9e1e3f566562e6966ffa9ce63639916248a9e25fa8a244", size = 517719 }, + { url = "https://files.pythonhosted.org/packages/d7/25/b11132afcb17cd5d82db173f0c8dab270ffdfaba43e5ce7a591837ae9649/rpds_py-0.29.0-cp314-cp314-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:90f30d15f45048448b8da21c41703b31c61119c06c216a1bf8c245812a0f0c17", size = 409498 }, + { url = "https://files.pythonhosted.org/packages/0f/7d/e6543cedfb2e6403a1845710a5ab0e0ccf8fc288e0b5af9a70bfe2c12053/rpds_py-0.29.0-cp314-cp314-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:44a91e0ab77bdc0004b43261a4b8cd6d6b451e8d443754cfda830002b5745b32", size = 382743 }, + { url = "https://files.pythonhosted.org/packages/75/11/a4ebc9f654293ae9fefb83b2b6be7f3253e85ea42a5db2f77d50ad19aaeb/rpds_py-0.29.0-cp314-cp314-manylinux_2_31_riscv64.whl", hash = "sha256:4aa195e5804d32c682e453b34474f411ca108e4291c6a0f824ebdc30a91c973c", size = 400317 }, + { url = "https://files.pythonhosted.org/packages/52/18/97677a60a81c7f0e5f64e51fb3f8271c5c8fcabf3a2df18e97af53d7c2bf/rpds_py-0.29.0-cp314-cp314-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:7971bdb7bf4ee0f7e6f67fa4c7fbc6019d9850cc977d126904392d363f6f8318", size = 416979 }, + { url = "https://files.pythonhosted.org/packages/f0/69/28ab391a9968f6c746b2a2db181eaa4d16afaa859fedc9c2f682d19f7e18/rpds_py-0.29.0-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:8ae33ad9ce580c7a47452c3b3f7d8a9095ef6208e0a0c7e4e2384f9fc5bf8212", size = 567288 }, + { url = "https://files.pythonhosted.org/packages/3b/d3/0c7afdcdb830eee94f5611b64e71354ffe6ac8df82d00c2faf2bfffd1d4e/rpds_py-0.29.0-cp314-cp314-musllinux_1_2_i686.whl", hash = "sha256:c661132ab2fb4eeede2ef69670fd60da5235209874d001a98f1542f31f2a8a94", size = 593157 }, + { url = "https://files.pythonhosted.org/packages/e2/ac/a0fcbc2feed4241cf26d32268c195eb88ddd4bd862adfc9d4b25edfba535/rpds_py-0.29.0-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:bb78b3a0d31ac1bde132c67015a809948db751cb4e92cdb3f0b242e430b6ed0d", size = 554741 }, + { url = "https://files.pythonhosted.org/packages/0f/f1/fcc24137c470df8588674a677f33719d5800ec053aaacd1de8a5d5d84d9e/rpds_py-0.29.0-cp314-cp314-win32.whl", hash = "sha256:f475f103488312e9bd4000bc890a95955a07b2d0b6e8884aef4be56132adbbf1", size = 215508 }, + { url = "https://files.pythonhosted.org/packages/7b/c7/1d169b2045512eac019918fc1021ea07c30e84a4343f9f344e3e0aa8c788/rpds_py-0.29.0-cp314-cp314-win_amd64.whl", hash = "sha256:b9cf2359a4fca87cfb6801fae83a76aedf66ee1254a7a151f1341632acf67f1b", size = 228125 }, + { url = "https://files.pythonhosted.org/packages/be/36/0cec88aaba70ec4a6e381c444b0d916738497d27f0c30406e3d9fcbd3bc2/rpds_py-0.29.0-cp314-cp314-win_arm64.whl", hash = "sha256:9ba8028597e824854f0f1733d8b964e914ae3003b22a10c2c664cb6927e0feb9", size = 221992 }, + { url = "https://files.pythonhosted.org/packages/b1/fa/a2e524631717c9c0eb5d90d30f648cfba6b731047821c994acacb618406c/rpds_py-0.29.0-cp314-cp314t-macosx_10_12_x86_64.whl", hash = "sha256:e71136fd0612556b35c575dc2726ae04a1669e6a6c378f2240312cf5d1a2ab10", size = 366425 }, + { url = "https://files.pythonhosted.org/packages/a2/a4/6d43ebe0746ff694a30233f63f454aed1677bd50ab7a59ff6b2bb5ac61f2/rpds_py-0.29.0-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:76fe96632d53f3bf0ea31ede2f53bbe3540cc2736d4aec3b3801b0458499ef3a", size = 355282 }, + { url = "https://files.pythonhosted.org/packages/fa/a7/52fd8270e0320b09eaf295766ae81dd175f65394687906709b3e75c71d06/rpds_py-0.29.0-cp314-cp314t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9459a33f077130dbb2c7c3cea72ee9932271fb3126404ba2a2661e4fe9eb7b79", size = 384968 }, + { url = "https://files.pythonhosted.org/packages/f4/7d/e6bc526b7a14e1ef80579a52c1d4ad39260a058a51d66c6039035d14db9d/rpds_py-0.29.0-cp314-cp314t-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:5c9546cfdd5d45e562cc0444b6dddc191e625c62e866bf567a2c69487c7ad28a", size = 394714 }, + { url = "https://files.pythonhosted.org/packages/c0/3f/f0ade3954e7db95c791e7eaf978aa7e08a756d2046e8bdd04d08146ed188/rpds_py-0.29.0-cp314-cp314t-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:12597d11d97b8f7e376c88929a6e17acb980e234547c92992f9f7c058f1a7310", size = 520136 }, + { url = "https://files.pythonhosted.org/packages/87/b3/07122ead1b97009715ab9d4082be6d9bd9546099b2b03fae37c3116f72be/rpds_py-0.29.0-cp314-cp314t-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:28de03cf48b8a9e6ec10318f2197b83946ed91e2891f651a109611be4106ac4b", size = 409250 }, + { url = "https://files.pythonhosted.org/packages/c9/c6/dcbee61fd1dc892aedcb1b489ba661313101aa82ec84b1a015d4c63ebfda/rpds_py-0.29.0-cp314-cp314t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:fd7951c964069039acc9d67a8ff1f0a7f34845ae180ca542b17dc1456b1f1808", size = 384940 }, + { url = "https://files.pythonhosted.org/packages/47/11/914ecb6f3574cf9bf8b38aced4063e0f787d6e1eb30b181a7efbc6c1da9a/rpds_py-0.29.0-cp314-cp314t-manylinux_2_31_riscv64.whl", hash = "sha256:c07d107b7316088f1ac0177a7661ca0c6670d443f6fe72e836069025e6266761", size = 399392 }, + { url = "https://files.pythonhosted.org/packages/f5/fd/2f4bd9433f58f816434bb934313584caa47dbc6f03ce5484df8ac8980561/rpds_py-0.29.0-cp314-cp314t-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:1de2345af363d25696969befc0c1688a6cb5e8b1d32b515ef84fc245c6cddba3", size = 416796 }, + { url = "https://files.pythonhosted.org/packages/79/a5/449f0281af33efa29d5c71014399d74842342ae908d8cd38260320167692/rpds_py-0.29.0-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:00e56b12d2199ca96068057e1ae7f9998ab6e99cda82431afafd32f3ec98cca9", size = 566843 }, + { url = "https://files.pythonhosted.org/packages/ab/32/0a6a1ccee2e37fcb1b7ba9afde762b77182dbb57937352a729c6cd3cf2bb/rpds_py-0.29.0-cp314-cp314t-musllinux_1_2_i686.whl", hash = "sha256:3919a3bbecee589300ed25000b6944174e07cd20db70552159207b3f4bbb45b8", size = 593956 }, + { url = "https://files.pythonhosted.org/packages/4a/3d/eb820f95dce4306f07a495ede02fb61bef36ea201d9137d4fcd5ab94ec1e/rpds_py-0.29.0-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:e7fa2ccc312bbd91e43aa5e0869e46bc03278a3dddb8d58833150a18b0f0283a", size = 557288 }, + { url = "https://files.pythonhosted.org/packages/e9/f8/b8ff786f40470462a252918e0836e0db903c28e88e3eec66bc4a7856ee5d/rpds_py-0.29.0-cp314-cp314t-win32.whl", hash = "sha256:97c817863ffc397f1e6a6e9d2d89fe5408c0a9922dac0329672fb0f35c867ea5", size = 211382 }, + { url = "https://files.pythonhosted.org/packages/c9/7f/1a65ae870bc9d0576aebb0c501ea5dccf1ae2178fe2821042150ebd2e707/rpds_py-0.29.0-cp314-cp314t-win_amd64.whl", hash = "sha256:2023473f444752f0f82a58dfcbee040d0a1b3d1b3c2ec40e884bd25db6d117d2", size = 225919 }, +] + +[[package]] +name = "six" +version = "1.17.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/94/e7/b2c673351809dca68a0e064b6af791aa332cf192da575fd474ed7d6f16a2/six-1.17.0.tar.gz", hash = "sha256:ff70335d468e7eb6ec65b95b99d3a2836546063f63acc5171de367e834932a81", size = 34031 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/b7/ce/149a00dd41f10bc29e5921b496af8b574d8413afcd5e30dfa0ed46c2cc5e/six-1.17.0-py2.py3-none-any.whl", hash = "sha256:4721f391ed90541fddacab5acf947aa0d3dc7d27b2e1e8eda2be8970586c3274", size = 11050 }, +] + +[[package]] +name = "smmap" +version = "5.0.2" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/44/cd/a040c4b3119bbe532e5b0732286f805445375489fceaec1f48306068ee3b/smmap-5.0.2.tar.gz", hash = "sha256:26ea65a03958fa0c8a1c7e8c7a58fdc77221b8910f6be2131affade476898ad5", size = 22329 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/04/be/d09147ad1ec7934636ad912901c5fd7667e1c858e19d355237db0d0cd5e4/smmap-5.0.2-py3-none-any.whl", hash = "sha256:b30115f0def7d7531d22a0fb6502488d879e75b260a9db4d0819cfb25403af5e", size = 24303 }, +] + +[[package]] +name = "sniffio" +version = "1.3.1" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/a2/87/a6771e1546d97e7e041b6ae58d80074f81b7d5121207425c964ddf5cfdbd/sniffio-1.3.1.tar.gz", hash = "sha256:f4324edc670a0f49750a81b895f35c3adb843cca46f0530f79fc1babb23789dc", size = 20372 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/e9/44/75a9c9421471a6c4805dbf2356f7c181a29c1879239abab1ea2cc8f38b40/sniffio-1.3.1-py3-none-any.whl", hash = "sha256:2f6da418d1f1e0fddd844478f41680e794e6051915791a034ff65e5f100525a2", size = 10235 }, +] + +[[package]] +name = "starlette" +version = "0.50.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "anyio" }, + { name = "typing-extensions", marker = "python_full_version < '3.13'" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/ba/b8/73a0e6a6e079a9d9cfa64113d771e421640b6f679a52eeb9b32f72d871a1/starlette-0.50.0.tar.gz", hash = "sha256:a2a17b22203254bcbc2e1f926d2d55f3f9497f769416b3190768befe598fa3ca", size = 2646985 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/d9/52/1064f510b141bd54025f9b55105e26d1fa970b9be67ad766380a3c9b74b0/starlette-0.50.0-py3-none-any.whl", hash = "sha256:9e5391843ec9b6e472eed1365a78c8098cfceb7a74bfd4d6b1c0c0095efb3bca", size = 74033 }, +] + +[[package]] +name = "streamlit" +version = "1.51.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "altair" }, + { name = "blinker" }, + { name = "cachetools" }, + { name = "click" }, + { name = "gitpython" }, + { name = "numpy" }, + { name = "packaging" }, + { name = "pandas" }, + { name = "pillow" }, + { name = "protobuf" }, + { name = "pyarrow" }, + { name = "pydeck" }, + { name = "requests" }, + { name = "tenacity" }, + { name = "toml" }, + { name = "tornado" }, + { name = "typing-extensions" }, + { name = "watchdog", marker = "sys_platform != 'darwin'" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/59/6d/327ddd5fc35fcf2aeecb4040668337f5565a1c6c95b1e892b8bfd4bb9031/streamlit-1.51.0.tar.gz", hash = "sha256:1e742a9c0b698f466c6f5bf58d333beda5a1fbe8de660743976791b5c1446ef6", size = 9742904 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/39/60/868371b6482ccd9ef423c6f62650066cf8271fdb2ee84f192695ad6b7a96/streamlit-1.51.0-py3-none-any.whl", hash = "sha256:4008b029f71401ce54946bb09a6a3e36f4f7652cbb48db701224557738cfda38", size = 10171702 }, +] + +[[package]] +name = "tenacity" +version = "9.1.2" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/0a/d4/2b0cd0fe285e14b36db076e78c93766ff1d529d70408bd1d2a5a84f1d929/tenacity-9.1.2.tar.gz", hash = "sha256:1169d376c297e7de388d18b4481760d478b0e99a777cad3a9c86e556f4b697cb", size = 48036 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/e5/30/643397144bfbfec6f6ef821f36f33e57d35946c44a2352d3c9f0ae847619/tenacity-9.1.2-py3-none-any.whl", hash = "sha256:f77bf36710d8b73a50b2dd155c97b870017ad21afe6ab300326b0371b3b05138", size = 28248 }, +] + +[[package]] +name = "toml" +version = "0.10.2" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/be/ba/1f744cdc819428fc6b5084ec34d9b30660f6f9daaf70eead706e3203ec3c/toml-0.10.2.tar.gz", hash = "sha256:b3bda1d108d5dd99f4a20d24d9c348e91c4db7ab1b749200bded2f839ccbe68f", size = 22253 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/44/6f/7120676b6d73228c96e17f1f794d8ab046fc910d781c8d151120c3f1569e/toml-0.10.2-py2.py3-none-any.whl", hash = "sha256:806143ae5bfb6a3c6e736a764057db0e6a0e05e338b5630894a5f779cabb4f9b", size = 16588 }, +] + +[[package]] +name = "tomlkit" +version = "0.13.3" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/cc/18/0bbf3884e9eaa38819ebe46a7bd25dcd56b67434402b66a58c4b8e552575/tomlkit-0.13.3.tar.gz", hash = "sha256:430cf247ee57df2b94ee3fbe588e71d362a941ebb545dec29b53961d61add2a1", size = 185207 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/bd/75/8539d011f6be8e29f339c42e633aae3cb73bffa95dd0f9adec09b9c58e85/tomlkit-0.13.3-py3-none-any.whl", hash = "sha256:c89c649d79ee40629a9fda55f8ace8c6a1b42deb912b2a8fd8d942ddadb606b0", size = 38901 }, +] + +[[package]] +name = "tornado" +version = "6.5.2" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/09/ce/1eb500eae19f4648281bb2186927bb062d2438c2e5093d1360391afd2f90/tornado-6.5.2.tar.gz", hash = "sha256:ab53c8f9a0fa351e2c0741284e06c7a45da86afb544133201c5cc8578eb076a0", size = 510821 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/f6/48/6a7529df2c9cc12efd2e8f5dd219516184d703b34c06786809670df5b3bd/tornado-6.5.2-cp39-abi3-macosx_10_9_universal2.whl", hash = "sha256:2436822940d37cde62771cff8774f4f00b3c8024fe482e16ca8387b8a2724db6", size = 442563 }, + { url = "https://files.pythonhosted.org/packages/f2/b5/9b575a0ed3e50b00c40b08cbce82eb618229091d09f6d14bce80fc01cb0b/tornado-6.5.2-cp39-abi3-macosx_10_9_x86_64.whl", hash = "sha256:583a52c7aa94ee046854ba81d9ebb6c81ec0fd30386d96f7640c96dad45a03ef", size = 440729 }, + { url = "https://files.pythonhosted.org/packages/1b/4e/619174f52b120efcf23633c817fd3fed867c30bff785e2cd5a53a70e483c/tornado-6.5.2-cp39-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b0fe179f28d597deab2842b86ed4060deec7388f1fd9c1b4a41adf8af058907e", size = 444295 }, + { url = "https://files.pythonhosted.org/packages/95/fa/87b41709552bbd393c85dd18e4e3499dcd8983f66e7972926db8d96aa065/tornado-6.5.2-cp39-abi3-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:b186e85d1e3536d69583d2298423744740986018e393d0321df7340e71898882", size = 443644 }, + { url = "https://files.pythonhosted.org/packages/f9/41/fb15f06e33d7430ca89420283a8762a4e6b8025b800ea51796ab5e6d9559/tornado-6.5.2-cp39-abi3-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e792706668c87709709c18b353da1f7662317b563ff69f00bab83595940c7108", size = 443878 }, + { url = "https://files.pythonhosted.org/packages/11/92/fe6d57da897776ad2e01e279170ea8ae726755b045fe5ac73b75357a5a3f/tornado-6.5.2-cp39-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:06ceb1300fd70cb20e43b1ad8aaee0266e69e7ced38fa910ad2e03285009ce7c", size = 444549 }, + { url = "https://files.pythonhosted.org/packages/9b/02/c8f4f6c9204526daf3d760f4aa555a7a33ad0e60843eac025ccfd6ff4a93/tornado-6.5.2-cp39-abi3-musllinux_1_2_i686.whl", hash = "sha256:74db443e0f5251be86cbf37929f84d8c20c27a355dd452a5cfa2aada0d001ec4", size = 443973 }, + { url = "https://files.pythonhosted.org/packages/ae/2d/f5f5707b655ce2317190183868cd0f6822a1121b4baeae509ceb9590d0bd/tornado-6.5.2-cp39-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:b5e735ab2889d7ed33b32a459cac490eda71a1ba6857b0118de476ab6c366c04", size = 443954 }, + { url = "https://files.pythonhosted.org/packages/e8/59/593bd0f40f7355806bf6573b47b8c22f8e1374c9b6fd03114bd6b7a3dcfd/tornado-6.5.2-cp39-abi3-win32.whl", hash = "sha256:c6f29e94d9b37a95013bb669616352ddb82e3bfe8326fccee50583caebc8a5f0", size = 445023 }, + { url = "https://files.pythonhosted.org/packages/c7/2a/f609b420c2f564a748a2d80ebfb2ee02a73ca80223af712fca591386cafb/tornado-6.5.2-cp39-abi3-win_amd64.whl", hash = "sha256:e56a5af51cc30dd2cae649429af65ca2f6571da29504a07995175df14c18f35f", size = 445427 }, + { url = "https://files.pythonhosted.org/packages/5e/4f/e1f65e8f8c76d73658b33d33b81eed4322fb5085350e4328d5c956f0c8f9/tornado-6.5.2-cp39-abi3-win_arm64.whl", hash = "sha256:d6c33dc3672e3a1f3618eb63b7ef4683a7688e7b9e6e8f0d9aa5726360a004af", size = 444456 }, +] + +[[package]] +name = "typing-extensions" +version = "4.15.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/72/94/1a15dd82efb362ac84269196e94cf00f187f7ed21c242792a923cdb1c61f/typing_extensions-4.15.0.tar.gz", hash = "sha256:0cea48d173cc12fa28ecabc3b837ea3cf6f38c6d1136f85cbaaf598984861466", size = 109391 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/18/67/36e9267722cc04a6b9f15c7f3441c2363321a3ea07da7ae0c0707beb2a9c/typing_extensions-4.15.0-py3-none-any.whl", hash = "sha256:f0fa19c6845758ab08074a0cfa8b7aecb71c999ca73d62883bc25cc018c4e548", size = 44614 }, +] + +[[package]] +name = "tzdata" +version = "2025.2" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/95/32/1a225d6164441be760d75c2c42e2780dc0873fe382da3e98a2e1e48361e5/tzdata-2025.2.tar.gz", hash = "sha256:b60a638fcc0daffadf82fe0f57e53d06bdec2f36c4df66280ae79bce6bd6f2b9", size = 196380 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/5c/23/c7abc0ca0a1526a0774eca151daeb8de62ec457e77262b66b359c3c7679e/tzdata-2025.2-py2.py3-none-any.whl", hash = "sha256:1a403fada01ff9221ca8044d701868fa132215d84beb92242d9acd2147f667a8", size = 347839 }, +] + +[[package]] +name = "urllib3" +version = "2.5.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/15/22/9ee70a2574a4f4599c47dd506532914ce044817c7752a79b6a51286319bc/urllib3-2.5.0.tar.gz", hash = "sha256:3fc47733c7e419d4bc3f6b3dc2b4f890bb743906a30d56ba4a5bfa4bbff92760", size = 393185 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/a7/c2/fe1e52489ae3122415c51f387e221dd0773709bad6c6cdaa599e8a2c5185/urllib3-2.5.0-py3-none-any.whl", hash = "sha256:e6b01673c0fa6a13e374b50871808eb3bf7046c4b125b216f6bf1cc604cff0dc", size = 129795 }, +] + +[[package]] +name = "uvicorn" +version = "0.38.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "click" }, + { name = "h11" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/cb/ce/f06b84e2697fef4688ca63bdb2fdf113ca0a3be33f94488f2cadb690b0cf/uvicorn-0.38.0.tar.gz", hash = "sha256:fd97093bdd120a2609fc0d3afe931d4d4ad688b6e75f0f929fde1bc36fe0e91d", size = 80605 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/ee/d9/d88e73ca598f4f6ff671fb5fde8a32925c2e08a637303a1d12883c7305fa/uvicorn-0.38.0-py3-none-any.whl", hash = "sha256:48c0afd214ceb59340075b4a052ea1ee91c16fbc2a9b1469cca0e54566977b02", size = 68109 }, +] + +[[package]] +name = "watchdog" +version = "6.0.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/db/7d/7f3d619e951c88ed75c6037b246ddcf2d322812ee8ea189be89511721d54/watchdog-6.0.0.tar.gz", hash = "sha256:9ddf7c82fda3ae8e24decda1338ede66e1c99883db93711d8fb941eaa2d8c282", size = 131220 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/a9/c7/ca4bf3e518cb57a686b2feb4f55a1892fd9a3dd13f470fca14e00f80ea36/watchdog-6.0.0-py3-none-manylinux2014_aarch64.whl", hash = "sha256:7607498efa04a3542ae3e05e64da8202e58159aa1fa4acddf7678d34a35d4f13", size = 79079 }, + { url = "https://files.pythonhosted.org/packages/5c/51/d46dc9332f9a647593c947b4b88e2381c8dfc0942d15b8edc0310fa4abb1/watchdog-6.0.0-py3-none-manylinux2014_armv7l.whl", hash = "sha256:9041567ee8953024c83343288ccc458fd0a2d811d6a0fd68c4c22609e3490379", size = 79078 }, + { url = "https://files.pythonhosted.org/packages/d4/57/04edbf5e169cd318d5f07b4766fee38e825d64b6913ca157ca32d1a42267/watchdog-6.0.0-py3-none-manylinux2014_i686.whl", hash = "sha256:82dc3e3143c7e38ec49d61af98d6558288c415eac98486a5c581726e0737c00e", size = 79076 }, + { url = "https://files.pythonhosted.org/packages/ab/cc/da8422b300e13cb187d2203f20b9253e91058aaf7db65b74142013478e66/watchdog-6.0.0-py3-none-manylinux2014_ppc64.whl", hash = "sha256:212ac9b8bf1161dc91bd09c048048a95ca3a4c4f5e5d4a7d1b1a7d5752a7f96f", size = 79077 }, + { url = "https://files.pythonhosted.org/packages/2c/3b/b8964e04ae1a025c44ba8e4291f86e97fac443bca31de8bd98d3263d2fcf/watchdog-6.0.0-py3-none-manylinux2014_ppc64le.whl", hash = "sha256:e3df4cbb9a450c6d49318f6d14f4bbc80d763fa587ba46ec86f99f9e6876bb26", size = 79078 }, + { url = "https://files.pythonhosted.org/packages/62/ae/a696eb424bedff7407801c257d4b1afda455fe40821a2be430e173660e81/watchdog-6.0.0-py3-none-manylinux2014_s390x.whl", hash = "sha256:2cce7cfc2008eb51feb6aab51251fd79b85d9894e98ba847408f662b3395ca3c", size = 79077 }, + { url = "https://files.pythonhosted.org/packages/b5/e8/dbf020b4d98251a9860752a094d09a65e1b436ad181faf929983f697048f/watchdog-6.0.0-py3-none-manylinux2014_x86_64.whl", hash = "sha256:20ffe5b202af80ab4266dcd3e91aae72bf2da48c0d33bdb15c66658e685e94e2", size = 79078 }, + { url = "https://files.pythonhosted.org/packages/07/f6/d0e5b343768e8bcb4cda79f0f2f55051bf26177ecd5651f84c07567461cf/watchdog-6.0.0-py3-none-win32.whl", hash = "sha256:07df1fdd701c5d4c8e55ef6cf55b8f0120fe1aef7ef39a1c6fc6bc2e606d517a", size = 79065 }, + { url = "https://files.pythonhosted.org/packages/db/d9/c495884c6e548fce18a8f40568ff120bc3a4b7b99813081c8ac0c936fa64/watchdog-6.0.0-py3-none-win_amd64.whl", hash = "sha256:cbafb470cf848d93b5d013e2ecb245d4aa1c8fd0504e863ccefa32445359d680", size = 79070 }, + { url = "https://files.pythonhosted.org/packages/33/e8/e40370e6d74ddba47f002a32919d91310d6074130fe4e17dabcafc15cbf1/watchdog-6.0.0-py3-none-win_ia64.whl", hash = "sha256:a1914259fa9e1454315171103c6a30961236f508b9b623eae470268bbcc6a22f", size = 79067 }, +] + +[[package]] +name = "websockets" +version = "15.0.1" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/21/e6/26d09fab466b7ca9c7737474c52be4f76a40301b08362eb2dbc19dcc16c1/websockets-15.0.1.tar.gz", hash = "sha256:82544de02076bafba038ce055ee6412d68da13ab47f0c60cab827346de828dee", size = 177016 } +wheels = [ + { url = "https://files.pythonhosted.org/packages/51/6b/4545a0d843594f5d0771e86463606a3988b5a09ca5123136f8a76580dd63/websockets-15.0.1-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:3e90baa811a5d73f3ca0bcbf32064d663ed81318ab225ee4f427ad4e26e5aff3", size = 175437 }, + { url = "https://files.pythonhosted.org/packages/f4/71/809a0f5f6a06522af902e0f2ea2757f71ead94610010cf570ab5c98e99ed/websockets-15.0.1-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:592f1a9fe869c778694f0aa806ba0374e97648ab57936f092fd9d87f8bc03665", size = 173096 }, + { url = "https://files.pythonhosted.org/packages/3d/69/1a681dd6f02180916f116894181eab8b2e25b31e484c5d0eae637ec01f7c/websockets-15.0.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:0701bc3cfcb9164d04a14b149fd74be7347a530ad3bbf15ab2c678a2cd3dd9a2", size = 173332 }, + { url = "https://files.pythonhosted.org/packages/a6/02/0073b3952f5bce97eafbb35757f8d0d54812b6174ed8dd952aa08429bcc3/websockets-15.0.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e8b56bdcdb4505c8078cb6c7157d9811a85790f2f2b3632c7d1462ab5783d215", size = 183152 }, + { url = "https://files.pythonhosted.org/packages/74/45/c205c8480eafd114b428284840da0b1be9ffd0e4f87338dc95dc6ff961a1/websockets-15.0.1-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:0af68c55afbd5f07986df82831c7bff04846928ea8d1fd7f30052638788bc9b5", size = 182096 }, + { url = "https://files.pythonhosted.org/packages/14/8f/aa61f528fba38578ec553c145857a181384c72b98156f858ca5c8e82d9d3/websockets-15.0.1-cp312-cp312-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:64dee438fed052b52e4f98f76c5790513235efaa1ef7f3f2192c392cd7c91b65", size = 182523 }, + { url = "https://files.pythonhosted.org/packages/ec/6d/0267396610add5bc0d0d3e77f546d4cd287200804fe02323797de77dbce9/websockets-15.0.1-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:d5f6b181bb38171a8ad1d6aa58a67a6aa9d4b38d0f8c5f496b9e42561dfc62fe", size = 182790 }, + { url = "https://files.pythonhosted.org/packages/02/05/c68c5adbf679cf610ae2f74a9b871ae84564462955d991178f95a1ddb7dd/websockets-15.0.1-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:5d54b09eba2bada6011aea5375542a157637b91029687eb4fdb2dab11059c1b4", size = 182165 }, + { url = "https://files.pythonhosted.org/packages/29/93/bb672df7b2f5faac89761cb5fa34f5cec45a4026c383a4b5761c6cea5c16/websockets-15.0.1-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:3be571a8b5afed347da347bfcf27ba12b069d9d7f42cb8c7028b5e98bbb12597", size = 182160 }, + { url = "https://files.pythonhosted.org/packages/ff/83/de1f7709376dc3ca9b7eeb4b9a07b4526b14876b6d372a4dc62312bebee0/websockets-15.0.1-cp312-cp312-win32.whl", hash = "sha256:c338ffa0520bdb12fbc527265235639fb76e7bc7faafbb93f6ba80d9c06578a9", size = 176395 }, + { url = "https://files.pythonhosted.org/packages/7d/71/abf2ebc3bbfa40f391ce1428c7168fb20582d0ff57019b69ea20fa698043/websockets-15.0.1-cp312-cp312-win_amd64.whl", hash = "sha256:fcd5cf9e305d7b8338754470cf69cf81f420459dbae8a3b40cee57417f4614a7", size = 176841 }, + { url = "https://files.pythonhosted.org/packages/cb/9f/51f0cf64471a9d2b4d0fc6c534f323b664e7095640c34562f5182e5a7195/websockets-15.0.1-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:ee443ef070bb3b6ed74514f5efaa37a252af57c90eb33b956d35c8e9c10a1931", size = 175440 }, + { url = "https://files.pythonhosted.org/packages/8a/05/aa116ec9943c718905997412c5989f7ed671bc0188ee2ba89520e8765d7b/websockets-15.0.1-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:5a939de6b7b4e18ca683218320fc67ea886038265fd1ed30173f5ce3f8e85675", size = 173098 }, + { url = "https://files.pythonhosted.org/packages/ff/0b/33cef55ff24f2d92924923c99926dcce78e7bd922d649467f0eda8368923/websockets-15.0.1-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:746ee8dba912cd6fc889a8147168991d50ed70447bf18bcda7039f7d2e3d9151", size = 173329 }, + { url = "https://files.pythonhosted.org/packages/31/1d/063b25dcc01faa8fada1469bdf769de3768b7044eac9d41f734fd7b6ad6d/websockets-15.0.1-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:595b6c3969023ecf9041b2936ac3827e4623bfa3ccf007575f04c5a6aa318c22", size = 183111 }, + { url = "https://files.pythonhosted.org/packages/93/53/9a87ee494a51bf63e4ec9241c1ccc4f7c2f45fff85d5bde2ff74fcb68b9e/websockets-15.0.1-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:3c714d2fc58b5ca3e285461a4cc0c9a66bd0e24c5da9911e30158286c9b5be7f", size = 182054 }, + { url = "https://files.pythonhosted.org/packages/ff/b2/83a6ddf56cdcbad4e3d841fcc55d6ba7d19aeb89c50f24dd7e859ec0805f/websockets-15.0.1-cp313-cp313-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0f3c1e2ab208db911594ae5b4f79addeb3501604a165019dd221c0bdcabe4db8", size = 182496 }, + { url = "https://files.pythonhosted.org/packages/98/41/e7038944ed0abf34c45aa4635ba28136f06052e08fc2168520bb8b25149f/websockets-15.0.1-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:229cf1d3ca6c1804400b0a9790dc66528e08a6a1feec0d5040e8b9eb14422375", size = 182829 }, + { url = "https://files.pythonhosted.org/packages/e0/17/de15b6158680c7623c6ef0db361da965ab25d813ae54fcfeae2e5b9ef910/websockets-15.0.1-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:756c56e867a90fb00177d530dca4b097dd753cde348448a1012ed6c5131f8b7d", size = 182217 }, + { url = "https://files.pythonhosted.org/packages/33/2b/1f168cb6041853eef0362fb9554c3824367c5560cbdaad89ac40f8c2edfc/websockets-15.0.1-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:558d023b3df0bffe50a04e710bc87742de35060580a293c2a984299ed83bc4e4", size = 182195 }, + { url = "https://files.pythonhosted.org/packages/86/eb/20b6cdf273913d0ad05a6a14aed4b9a85591c18a987a3d47f20fa13dcc47/websockets-15.0.1-cp313-cp313-win32.whl", hash = "sha256:ba9e56e8ceeeedb2e080147ba85ffcd5cd0711b89576b83784d8605a7df455fa", size = 176393 }, + { url = "https://files.pythonhosted.org/packages/1b/6c/c65773d6cab416a64d191d6ee8a8b1c68a09970ea6909d16965d26bfed1e/websockets-15.0.1-cp313-cp313-win_amd64.whl", hash = "sha256:e09473f095a819042ecb2ab9465aee615bd9c2028e4ef7d933600a8401c79561", size = 176837 }, + { url = "https://files.pythonhosted.org/packages/fa/a8/5b41e0da817d64113292ab1f8247140aac61cbf6cfd085d6a0fa77f4984f/websockets-15.0.1-py3-none-any.whl", hash = "sha256:f7a866fbc1e97b5c617ee4116daaa09b722101d4a3c170c787450ba409f9736f", size = 169743 }, +] diff --git a/work/json_cleaning.py b/work/json_cleaning.py new file mode 100644 index 0000000..6cb1073 --- /dev/null +++ b/work/json_cleaning.py @@ -0,0 +1,304 @@ +import marimo + +__generated_with = "0.18.0" +app = marimo.App(width="medium") + + +@app.cell +def _(): + import marimo as mo + import requests + return mo, requests + + +@app.cell +def _(): + url = 'https://api.cosmoguard.it/api/v1/echa/search' + return (url,) + + +@app.cell +def _(requests, url): + response = requests.post(url, json={'cas': '50-00-0'}) + data = response.json() + return (data,) + + +@app.cell +def _(data, mo): + if data['success'] == True: + results = data['data'] + if results: + substance_info = data['data']['substance'] + last_update = data['data']['dossier_info']['lastUpdatedDate'] + tox = data['data']['index']['toxicological_information_link'] + rpt = data['data']['index']['repeated_dose_toxicity_link'] + act = data['data']['index']['acute_toxicity_link'] + toxicological_information = data['data']['toxicological_information'] + repeated_dose_toxicity = data['data']['repeated_dose_toxicity'] + acute_toxicity = data['data']['acute_toxicity'] + else: + mo.alert('No results found for the given CAS number.') + return ( + acute_toxicity, + repeated_dose_toxicity, + substance_info, + toxicological_information, + ) + + +@app.cell +def _(Any, Dict, requests): + def api_req(query: str) -> Dict[str, Any]: + url = 'https://api.cosmoguard.it/api/v1/echa/search' + response = requests.post(url, json={'cas': query}) + data = response.json() + if data['success'] == True: + results = data['data'] + if results: + substance_info = data['data']['substance'] + last_update = data['data']['dossier_info']['lastUpdatedDate'] + tox = data['data']['index']['toxicological_information_link'] + rpt = data['data']['index']['repeated_dose_toxicity_link'] + act = data['data']['index']['acute_toxicity_link'] + toxicological_information = data['data']['toxicological_information'] + repeated_dose_toxicity = data['data']['repeated_dose_toxicity'] + acute_toxicity = data['data']['acute_toxicity'] + return { + 'substance_info': substance_info, + 'last_update': last_update, + 'toxicological_information': toxicological_information, + 'repeated_dose_toxicity': repeated_dose_toxicity, + 'acute_toxicity': acute_toxicity, + 'link': { + 'toxicological_information': tox, + 'repeated_dose_toxicity': rpt, + 'acute_toxicity': act + } + } + else: + return {'error': 'No results found for the given CAS number.'} + else: + return data['error'] + return + + +@app.cell +def _(substance_info): + substance_info + return + + +@app.cell +def _(toxicological_information): + txi = toxicological_information + txi + return (txi,) + + +@app.cell +def _(txi): + txi_content = { + txi['sections'][1]['label']: { + txi['sections'][1]['subsections'][0]['label']: { + 'HazardAssessment': txi['sections'][1]['subsections'][0]['subsections'][0]['HazardAssessment'] + } + + } + + } + return (txi_content,) + + +@app.cell +def _(txi_content): + txi_content + return + + +@app.cell +def _(): + import json + from typing import Any, Dict, List, Union + + + def remove_empty_values(data: Any) -> Any: + """ + Rimuove ricorsivamente tutte le chiavi con valori vuoti (stringa vuota, None, False, liste/dict vuoti). + + Args: + data: Il dato da pulire (può essere dict, list o valore primitivo) + + Returns: + Il dato pulito senza valori vuoti + """ + if isinstance(data, dict): + # Filtra il dizionario rimuovendo chiavi con valori vuoti + cleaned = {} + for key, value in data.items(): + # Ricorsivamente pulisci il valore + cleaned_value = remove_empty_values(value) + + # Aggiungi solo se il valore non è vuoto + if cleaned_value not in [None, "", [], {}, False]: + cleaned[key] = cleaned_value + + return cleaned if cleaned else None + + elif isinstance(data, list): + # Pulisci ogni elemento della lista + cleaned = [] + for item in data: + cleaned_item = remove_empty_values(item) + if cleaned_item not in [None, "", [], {}, False]: + cleaned.append(cleaned_item) + return cleaned if cleaned else None + + else: + # Per valori primitivi, ritorna il valore se non è vuoto + if data in [None, "", False]: + return None + return data + + + def transform_labels_to_keys(data: Any) -> Any: + """ + Trasforma ricorsivamente le 'label' in chiavi del dizionario. + + Args: + data: Il dato da trasformare + + Returns: + Il dato trasformato con le label come chiavi + """ + if isinstance(data, dict): + # Se c'è una label, usala come chiave principale + if 'label' in data: + label = data['label'] + # Crea una copia del dizionario senza la label + new_dict = {k: v for k, v in data.items() if k != 'label'} + + # Se ci sono subsections, trasformale ricorsivamente + if 'subsections' in new_dict: + subsections = new_dict.pop('subsections') + # Trasforma ogni subsection + for subsection in subsections: + transformed_sub = transform_labels_to_keys(subsection) + if isinstance(transformed_sub, dict): + new_dict.update(transformed_sub) + + # Trasforma ricorsivamente tutti gli altri valori + for key, value in list(new_dict.items()): + new_dict[key] = transform_labels_to_keys(value) + + # Ritorna con la label come chiave principale + return {label: new_dict if new_dict else {}} + + else: + # Se non c'è label, trasforma ricorsivamente tutti i valori + result = {} + for key, value in data.items(): + if key == 'subsections' and isinstance(value, list): + # Gestisci le subsections senza label nel dizionario padre + for subsection in value: + transformed = transform_labels_to_keys(subsection) + if isinstance(transformed, dict): + result.update(transformed) + elif key == 'sections' and isinstance(value, list): + # Gestisci le sections trasformandole in un dizionario + sections_dict = {} + for section in value: + transformed = transform_labels_to_keys(section) + if isinstance(transformed, dict): + sections_dict.update(transformed) + result[key] = sections_dict + else: + result[key] = transform_labels_to_keys(value) + return result + + elif isinstance(data, list): + # Trasforma ogni elemento della lista + return [transform_labels_to_keys(item) for item in data] + + else: + # Ritorna il valore così com'è + return data + + + def clean_and_transform_json(json_data: Union[str, dict], keep_false: bool = False) -> dict: + """ + Funzione principale che pulisce e trasforma il JSON. + + Args: + json_data: Il JSON come stringa o dizionario + keep_false: Se True, mantiene i valori False (default: False li rimuove) + + Returns: + Il JSON pulito e trasformato + """ + # Se è una stringa, parsala + if isinstance(json_data, str): + data = json.loads(json_data) + else: + data = json_data + + # Step 1: Rimuovi i valori vuoti + if not keep_false: + cleaned_data = remove_empty_values(data) + else: + # Versione alternativa che mantiene False + def remove_empty_keep_false(d): + if isinstance(d, dict): + cleaned = {} + for key, value in d.items(): + cleaned_value = remove_empty_keep_false(value) + if cleaned_value not in [None, "", [], {}]: + cleaned[key] = cleaned_value + return cleaned if cleaned else None + elif isinstance(d, list): + cleaned = [] + for item in d: + cleaned_item = remove_empty_keep_false(item) + if cleaned_item not in [None, "", [], {}]: + cleaned.append(cleaned_item) + return cleaned if cleaned else None + else: + if d in [None, ""]: + return None + return d + + cleaned_data = remove_empty_keep_false(data) + + # Step 2: Trasforma le label in chiavi + if cleaned_data: + transformed_data = transform_labels_to_keys(cleaned_data) + else: + transformed_data = {} + + return transformed_data + return Any, Dict, clean_and_transform_json + + +@app.cell +def _(clean_and_transform_json, txi): + txi_cleaned = clean_and_transform_json(txi) + txi_cleaned + return + + +@app.cell +def _(clean_and_transform_json, repeated_dose_toxicity): + rp_cl = clean_and_transform_json(repeated_dose_toxicity) + rp_cl + return + + +@app.cell +def _(acute_toxicity, clean_and_transform_json): + act_s = clean_and_transform_json(acute_toxicity) + act_s + return + + +if __name__ == "__main__": + app.run()