From 2d0fa096dcf08a9fdaf7d1c7b832f29d8b3b1c68 Mon Sep 17 00:00:00 2001 From: Ryan Greer Date: Wed, 24 Sep 2025 14:55:21 -0600 Subject: [PATCH 01/27] abstract design dev notebook --- notebooks/abstract_design_notebook.ipynb | 217 ++++++++++++++ tests/test_files/abstract_design.xml | 347 +++++++++++++++++++++++ 2 files changed, 564 insertions(+) create mode 100644 notebooks/abstract_design_notebook.ipynb create mode 100644 tests/test_files/abstract_design.xml diff --git a/notebooks/abstract_design_notebook.ipynb b/notebooks/abstract_design_notebook.ipynb new file mode 100644 index 0000000..a2d3f0c --- /dev/null +++ b/notebooks/abstract_design_notebook.ipynb @@ -0,0 +1,217 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "id": "2499b3fc", + "metadata": {}, + "source": [ + "## Assembly Plan with Plasmid Selection from Abstract Design" + ] + }, + { + "cell_type": "markdown", + "id": "321ccfb6", + "metadata": {}, + "source": [ + "Assumptions: \n", + "- user selects MoClo with BsaI restriction enzyme\n", + "- user creates abstract design in SBOLCanvas without including a circular backbone glpyh/component\n", + "- user selects desired backbone ahead of time, in this case: https://synbiohub.org/user/ryangreer/gonzaloplasmids/module1/1\n" + ] + }, + { + "cell_type": "code", + "execution_count": 1, + "id": "1128c6d8", + "metadata": {}, + "outputs": [], + "source": [ + "import sbol2build as s2b\n", + "import sbol2" + ] + }, + { + "cell_type": "markdown", + "id": "5fbe41e5", + "metadata": {}, + "source": [ + "#### Pull Collection of Plasmids from SBH" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "cb0d22be", + "metadata": {}, + "outputs": [], + "source": [ + "plasmid_collection = sbol2.Document()\n", + "\n", + "sbh = sbol2.PartShop('https://synbiohub.org')\n", + "sbh.pull('https://synbiohub.org/user/ryangreer/gonzaloplasmids/gonzaloplasmids_collection/1/c4869067a3286b13552d65bfe9387a81e92f2972/share', plasmid_collection)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "d04664fb", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Module: module4\n", + "Top Component: term_25\n", + "Contains:\n", + "\tScar_F_4\n", + "\tB0015_3\n", + "\tScar_D_2\n", + "\tCir_qxow_5\n", + "\n", + "\n", + "Module: module3\n", + "Top Component: GFP_Plas_3\n", + "Contains:\n", + "\tScar_C_2\n", + "\tCir_qxow_5\n", + "\tGFP_3\n", + "\tScar_D_4\n", + "\n", + "\n", + "Module: module5\n", + "Top Component: pro_25\n", + "Contains:\n", + "\tScar_A_2\n", + "\tCir_qxow_5\n", + "\tScar_B_4\n", + "\tJ23101_3\n", + "\n", + "\n", + "Module: module1\n", + "Top Component: UJHDBOTD_3\n", + "Contains:\n", + "\tScar_F_4\n", + "\tScar_A_2\n", + "\tCir_qxow_5\n", + "\tRFP_cassette_3\n", + "\n", + "\n", + "Module: module2\n", + "Top Component: rbs_3\n", + "Contains:\n", + "\tB0034_3\n", + "\tScar_B_2\n", + "\tCir_qxow_5\n", + "\tScar_C_4\n", + "\n", + "\n" + ] + } + ], + "source": [ + "for md in plasmid_collection.moduleDefinitions:\n", + " print(f\"Plasmid: {md.displayId}\")\n", + " for fc in md.functionalComponents:\n", + " print(f\"Top Component: {fc.displayId}\")\n", + " definition = plasmid_collection.getComponentDefinition(fc.definition)\n", + "\n", + " print(\"Contains:\")\n", + " for component in definition.components:\n", + " print(f\"\\t{component.displayId}\")\n", + "\n", + "\n", + " print(\"\\n\")" + ] + }, + { + "cell_type": "markdown", + "id": "a833fa55", + "metadata": {}, + "source": [ + "### Import Abstract Design from Local" + ] + }, + { + "cell_type": "code", + "execution_count": 19, + "id": "6b750df6", + "metadata": {}, + "outputs": [], + "source": [ + "abstract_design = sbol2.Document()\n", + "abstract_design.read('tests/test_files/abstract_design.xml')" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "0d3ef9ab", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Plasmid: module1\n", + "Top Component: cYYPhACA_2\n", + "Contains:\n", + "\tB0034_2\n", + "\tGFP_3\n", + "\tB0015_4\n", + "\tJ23101_1\n", + "\n", + "\n" + ] + } + ], + "source": [ + "for md in abstract_design.moduleDefinitions:\n", + " print(f\"Plasmid: {md.displayId}\")\n", + " for fc in md.functionalComponents:\n", + " print(f\"Top Component: {fc.displayId}\")\n", + " definition = abstract_design.getComponentDefinition(fc.definition)\n", + "\n", + " print(\"Contains:\")\n", + " for component in definition.components:\n", + " print(f\"\\t{component.displayId}\")\n", + "\n", + "\n", + " print(\"\\n\")" + ] + }, + { + "cell_type": "markdown", + "id": "4b49cfe1", + "metadata": {}, + "source": [ + "Algorithm:\n", + "1) grab abstract design (no backbone in sbolcanvas)\n", + "2) grab collections of plasmid (circular roles?)\n", + "3) take user backbone selection as constraint on first part fusion site (informs plasmid selection)\n", + "4) repeat with all subsequent plasmids\n" + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python (buildplanner)", + "language": "python", + "name": "buildplanner" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.13.7" + } + }, + "nbformat": 4, + "nbformat_minor": 5 +} diff --git a/tests/test_files/abstract_design.xml b/tests/test_files/abstract_design.xml new file mode 100644 index 0000000..3f634b8 --- /dev/null +++ b/tests/test_files/abstract_design.xml @@ -0,0 +1,347 @@ + + + + + basic_TU + + + + cYYPhACA_28 + + + + + + + + + J23101 + 1 + J23101 + + + + + + + + + GFP + 1 + GFP + + + + + + + + + B0015 + 1 + B0015 + + + + + + + + + cYYPhACA + 1 + + + + + + + GFP_3 + 1 + + + + + + + + B0015_4 + 1 + + + + + + + + J23101_1 + 1 + + + + + + + + B0034_2 + 1 + + + + + + + + cYYPhACAAnnotation2 + 1 + + + + location2 + 1 + 57 + 773 + + + + + + + + + + cYYPhACAAnnotation0 + 1 + + + + location0 + 1 + 1 + 35 + + + + + + + + + + cYYPhACAAnnotation1 + 1 + + + + location1 + 1 + 36 + 56 + + + + + + + + + + cYYPhACAAnnotation3 + 1 + + + + location3 + 1 + 774 + 902 + + + + + + + + + + cYYPhACAConstraint1 + 1 + + + + + + + + + cYYPhACAConstraint3 + 1 + + + + + + + + + cYYPhACAConstraint2 + 1 + + + + + + + + + + B0034 + 1 + B0034 + + + + + + + + + GFP_sequence + 1 + + + gtgagcaagggcgaggagctgttcaccggggtggtgcccatcctggtcgagctggacggcgacgtaaacggccacaagttcagcgtgtccggcgagggcgagggcgatgccacctacggcaagctgaccctgaagttcatctgcaccaccggcaagctgcccgtgccctggcccaccctcgtgaccaccttcagctacggcgtgcagtgcttcagccgctaccccgaccacatgaagcagcacgacttcttcaagtccgccatgcccgaaggctacgtccaggagcgcaccatcttcttcaaggacgacggcaactacaagacccgcgccgaggtgaagttcgagggcgacaccctggtgaaccgcatcgagctgaagggcatcgacttcaaggaggacggcaacatcctggggcacaagctggagtacaactacaacagccacaacgtctatatcatggccgacaagcagaagaacggcatcaaggtgaacttcaagatccgccacaacatcgaggacggcagcgtgcagctcgccgaccactaccagcagaacacccccatcggcgacggccccgtgctgctgcccgacaaccactacctgagcacccagtccgccctgagcaaagaccccaacgagaagcgcgatcacatggtcctgctggagttcgtgaccgccgccgggatcactcacggcatggacgagctgtacaagtaa + + + + + J23101_sequence + 1 + + + tttacagctagctcagtcctaggtattatgctagc + + + + + cYYPhACA_sequence + tttacagctagctcagtcctaggtattatgctagcagagaaagaggagaaatactagtgagcaagggcgaggagctgttcaccggggtggtgcccatcctggtcgagctggacggcgacgtaaacggccacaagttcagcgtgtccggcgagggcgagggcgatgccacctacggcaagctgaccctgaagttcatctgcaccaccggcaagctgcccgtgccctggcccaccctcgtgaccaccttcagctacggcgtgcagtgcttcagccgctaccccgaccacatgaagcagcacgacttcttcaagtccgccatgcccgaaggctacgtccaggagcgcaccatcttcttcaaggacgacggcaactacaagacccgcgccgaggtgaagttcgagggcgacaccctggtgaaccgcatcgagctgaagggcatcgacttcaaggaggacggcaacatcctggggcacaagctggagtacaactacaacagccacaacgtctatatcatggccgacaagcagaagaacggcatcaaggtgaacttcaagatccgccacaacatcgaggacggcagcgtgcagctcgccgaccactaccagcagaacacccccatcggcgacggccccgtgctgctgcccgacaaccactacctgagcacccagtccgccctgagcaaagaccccaacgagaagcgcgatcacatggtcctgctggagttcgtgaccgccgccgggatcactcacggcatggacgagctgtacaagtaa + + + + + B0034_sequence + 1 + + + agagaaagaggagaaatacta + + + + + B0015_sequence + 1 + + + ccaggcatcaaataaaacgaaaggctcagtcgaaagactgggcctttcgttttatctgttgtttgtcggtgaacgctctctactagagtcacactggctcaccttcgggtgggcctttctgcgtttata + + + + + J23101_Layout + + + + + basic_TU_Layout + + + + 720.0 + 339.0 + 200.0 + 100.0 + cYYPhACA_28 + + + + + + + GFP_Layout + + + + + cYYPhACA_Layout + + + + 720.0 + 339.0 + 200.0 + 100.0 + container + + + + + 0.0 + 50.0 + 200.0 + 1.0 + backbone + + + + + 0.0 + 0.0 + 50.0 + 100.0 + J23101_1 + + + + + + 50.0 + 0.0 + 50.0 + 100.0 + B0034_2 + + + + + + 100.0 + 0.0 + 50.0 + 100.0 + GFP_3 + + + + + + 150.0 + 0.0 + 50.0 + 100.0 + B0015_4 + + + + + + + B0015_Layout + + + + + B0034_Layout + + + From 7fa127277e77a633fec9b02112406423681231d0 Mon Sep 17 00:00:00 2001 From: Ryan Greer Date: Tue, 30 Sep 2025 19:24:21 -0600 Subject: [PATCH 02/27] ordering of parts + scar identification --- notebooks/abstract_design_notebook.ipynb | 291 ++++++++++++++++++++--- 1 file changed, 258 insertions(+), 33 deletions(-) diff --git a/notebooks/abstract_design_notebook.ipynb b/notebooks/abstract_design_notebook.ipynb index a2d3f0c..3172c49 100644 --- a/notebooks/abstract_design_notebook.ipynb +++ b/notebooks/abstract_design_notebook.ipynb @@ -21,13 +21,14 @@ }, { "cell_type": "code", - "execution_count": 1, + "execution_count": 2, "id": "1128c6d8", "metadata": {}, "outputs": [], "source": [ "import sbol2build as s2b\n", - "import sbol2" + "import sbol2\n", + "from typing import List" ] }, { @@ -40,7 +41,7 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 3, "id": "cb0d22be", "metadata": {}, "outputs": [], @@ -53,7 +54,7 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 4, "id": "d04664fb", "metadata": {}, "outputs": [ @@ -61,49 +62,49 @@ "name": "stdout", "output_type": "stream", "text": [ - "Module: module4\n", - "Top Component: term_25\n", - "Contains:\n", - "\tScar_F_4\n", - "\tB0015_3\n", - "\tScar_D_2\n", - "\tCir_qxow_5\n", - "\n", - "\n", - "Module: module3\n", + "Plasmid: module3\n", "Top Component: GFP_Plas_3\n", "Contains:\n", - "\tScar_C_2\n", "\tCir_qxow_5\n", + "\tScar_C_2\n", "\tGFP_3\n", "\tScar_D_4\n", "\n", "\n", - "Module: module5\n", - "Top Component: pro_25\n", + "Plasmid: module4\n", + "Top Component: term_25\n", "Contains:\n", - "\tScar_A_2\n", "\tCir_qxow_5\n", - "\tScar_B_4\n", - "\tJ23101_3\n", + "\tScar_F_4\n", + "\tScar_D_2\n", + "\tB0015_3\n", "\n", "\n", - "Module: module1\n", + "Plasmid: module1\n", "Top Component: UJHDBOTD_3\n", "Contains:\n", "\tScar_F_4\n", + "\tRFP_cassette_3\n", "\tScar_A_2\n", "\tCir_qxow_5\n", - "\tRFP_cassette_3\n", "\n", "\n", - "Module: module2\n", + "Plasmid: module5\n", + "Top Component: pro_25\n", + "Contains:\n", + "\tJ23101_3\n", + "\tScar_A_2\n", + "\tCir_qxow_5\n", + "\tScar_B_4\n", + "\n", + "\n", + "Plasmid: module2\n", "Top Component: rbs_3\n", "Contains:\n", - "\tB0034_3\n", + "\tScar_C_4\n", "\tScar_B_2\n", "\tCir_qxow_5\n", - "\tScar_C_4\n", + "\tB0034_3\n", "\n", "\n" ] @@ -134,7 +135,7 @@ }, { "cell_type": "code", - "execution_count": 19, + "execution_count": 15, "id": "6b750df6", "metadata": {}, "outputs": [], @@ -145,7 +146,7 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 6, "id": "0d3ef9ab", "metadata": {}, "outputs": [ @@ -153,13 +154,22 @@ "name": "stdout", "output_type": "stream", "text": [ - "Plasmid: module1\n", - "Top Component: cYYPhACA_2\n", + "Plasmid: basic_TU\n", + "Top Component: cYYPhACA_28\n", "Contains:\n", - "\tB0034_2\n", - "\tGFP_3\n", "\tB0015_4\n", + "\tGFP_3\n", + "\tB0034_2\n", "\tJ23101_1\n", + "SequenceConstraints:\n", + "\thttp://sbols.org/v2#precedes, subject: https://sbolcanvas.org/cYYPhACA/GFP_3/1, object: https://sbolcanvas.org/cYYPhACA/B0015_4/1\n", + "\thttp://sbols.org/v2#precedes, subject: https://sbolcanvas.org/cYYPhACA/B0034_2/1, object: https://sbolcanvas.org/cYYPhACA/GFP_3/1\n", + "\thttp://sbols.org/v2#precedes, subject: https://sbolcanvas.org/cYYPhACA/J23101_1/1, object: https://sbolcanvas.org/cYYPhACA/B0034_2/1\n", + "Annotations:\n", + "\thttps://sbolcanvas.org/cYYPhACA/B0034_2/1, (36, 56)\n", + "\thttps://sbolcanvas.org/cYYPhACA/B0015_4/1, (774, 902)\n", + "\thttps://sbolcanvas.org/cYYPhACA/GFP_3/1, (57, 773)\n", + "\thttps://sbolcanvas.org/cYYPhACA/J23101_1/1, (1, 35)\n", "\n", "\n" ] @@ -176,6 +186,15 @@ " for component in definition.components:\n", " print(f\"\\t{component.displayId}\")\n", "\n", + " print(\"SequenceConstraints:\")\n", + " for constraint in definition.sequenceConstraints:\n", + " print(f\"\\t{constraint.restriction}, subject: {constraint.subject}, object: {constraint.object}\")\n", + "\n", + " print(\"Annotations:\")\n", + " for annotation in definition.sequenceAnnotations:\n", + " range = annotation.locations.getRange()\n", + " print(f\"\\t{annotation.component}, ({range.start}, {range.end})\")\n", + "\n", "\n", " print(\"\\n\")" ] @@ -188,9 +207,215 @@ "Algorithm:\n", "1) grab abstract design (no backbone in sbolcanvas)\n", "2) grab collections of plasmid (circular roles?)\n", - "3) take user backbone selection as constraint on first part fusion site (informs plasmid selection)\n", - "4) repeat with all subsequent plasmids\n" + "3) sort components within \n", + "4) take user backbone selection as constraint on first part fusion site (informs plasmid selection)\n", + "5) repeat with all subsequent plasmids\n" + ] + }, + { + "cell_type": "markdown", + "id": "54455b84", + "metadata": {}, + "source": [ + "#### Sort Components in Design With Precedes SequenceConstraints" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "5882f697", + "metadata": {}, + "outputs": [ + { + "ename": "_IncompleteInputError", + "evalue": "incomplete input (2856891416.py, line 2)", + "output_type": "error", + "traceback": [ + " \u001b[36mCell\u001b[39m\u001b[36m \u001b[39m\u001b[32mIn[7]\u001b[39m\u001b[32m, line 2\u001b[39m\n\u001b[31m \u001b[39m\n ^\n\u001b[31m_IncompleteInputError\u001b[39m\u001b[31m:\u001b[39m incomplete input\n" + ] + } + ], + "source": [ + "def get_component_URI(component: sbol2.component) -> str:\n", + " " + ] + }, + { + "cell_type": "markdown", + "id": "a70b4203", + "metadata": {}, + "source": [ + "look into .getInSequentialOrder" ] + }, + { + "cell_type": "code", + "execution_count": 27, + "id": "0047b82b", + "metadata": {}, + "outputs": [], + "source": [ + "def get_design_component_order(design: sbol2.ComponentDefinition, doc: sbol2.document) -> List[sbol2.ComponentDefinition]:\n", + " \"\"\"\n", + " Determine and return the ordered list of components in a design based on 'precedes' constraints.\n", + "\n", + " This function sorts the components of a given SBOL `ComponentDefinition` by analyzing its\n", + " `sequenceConstraints`. Each constraint defines a directional relationship (subject precedes object)\n", + " between two components. The function reconstructs the full linear order of components by iteratively\n", + " inserting subjects before their corresponding objects (or vice versa) until all components are placed\n", + " according to the defined constraints.\n", + "\n", + " Args:\n", + " design (sbol2.ComponentDefinition): component definition of abstract design\n", + "\n", + " Returns:\n", + " List[sbol2.ComponentDefinition]: list of components ordered according to the 'precedes'\n", + " relationships defined in the sequence constraints.\n", + " \"\"\"\n", + " constraint_list = list(design.sequenceConstraints)\n", + " ordered_component_list = []\n", + " \n", + " ordered_component_list.extend([constraint_list[0].subject, constraint_list[0].object])\n", + "\n", + " i = 1\n", + " while len(ordered_component_list) < len(constraint_list)+1:\n", + " if i >= len(constraint_list): \n", + " i = 1\n", + "\n", + " subject = constraint_list[i].subject\n", + " object = constraint_list[i].object\n", + " \n", + " if object in ordered_component_list and subject not in ordered_component_list:\n", + " objectIndex = ordered_component_list.index(object)\n", + " ordered_component_list.insert(objectIndex, subject)\n", + " elif subject in ordered_component_list and object not in ordered_component_list:\n", + " subjectIndex = ordered_component_list.index(subject)\n", + " ordered_component_list.insert(subjectIndex+1, object)\n", + "\n", + " i += 1\n", + "\n", + " return ordered_component_list" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "5fbef90e", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "https://sbolcanvas.org/cYYPhACA/J23101_1/1\n", + "https://sbolcanvas.org/cYYPhACA/B0034_2/1\n", + "https://sbolcanvas.org/cYYPhACA/GFP_3/1\n", + "https://sbolcanvas.org/cYYPhACA/B0015_4/1\n" + ] + } + ], + "source": [ + "orderedComponentURIList = get_design_component_order(definition, abstract_design)\n", + "orderedDefinitionList = []\n", + "\n", + "for URI in orderedComponentURIList: \n", + " for comp in definition.components: \n", + " if str(comp) == URI:\n", + " print(comp)\n", + " part_def = abstract_design.getComponentDefinition(comp.definition)\n", + " orderedDefinitionList.append(part_def)\n" + ] + }, + { + "cell_type": "markdown", + "id": "3bc61969", + "metadata": {}, + "source": [ + "## Finding plasmids containing parts of interest" + ] + }, + { + "cell_type": "markdown", + "id": "42049a3f", + "metadata": {}, + "source": [ + "Define Fusion Site Constants" + ] + }, + { + "cell_type": "code", + "execution_count": 56, + "id": "5151f78b", + "metadata": {}, + "outputs": [], + "source": [ + "FUSION_SITES = {\n", + " \"A\": \"GGAG\",\n", + " \"B\": \"TACT\",\n", + " \"C\": \"AATG\",\n", + " \"D\": \"AGGT\",\n", + " \"E\": \"GCTT\",\n", + " \"F\": \"CGCT\",\n", + " \"G\": \"TGCC\",\n", + " \"H\": \"ACTA\",\n", + "}" + ] + }, + { + "cell_type": "code", + "execution_count": 66, + "id": "b2ecab32", + "metadata": {}, + "outputs": [], + "source": [ + "def get_fusion_sites(plasmid: sbol2.ComponentDefinition, doc: sbol2.Document) -> str:\n", + " fusion_sites = []\n", + " for component in plasmid.components:\n", + " definition = doc.getComponentDefinition(component.definition)\n", + " if (\"http://identifiers.org/so/SO:0001953\" in definition.roles):\n", + " fusion_sites.append(definition.name)\n", + "\n", + " return fusion_sites" + ] + }, + { + "cell_type": "code", + "execution_count": 67, + "id": "6e6d6be1", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "found: https://synbiohub.org/user/ryangreer/gonzaloplasmids/J23101/1 in https://synbiohub.org/user/ryangreer/gonzaloplasmids/module5/1 with ['Scar_A', 'Scar_B']\n", + "found: https://synbiohub.org/user/ryangreer/gonzaloplasmids/B0034/1 in https://synbiohub.org/user/ryangreer/gonzaloplasmids/module2/1 with ['Scar_C', 'Scar_B']\n", + "found: https://synbiohub.org/user/ryangreer/gonzaloplasmids/GFP/1 in https://synbiohub.org/user/ryangreer/gonzaloplasmids/module3/1 with ['Scar_C', 'Scar_D']\n", + "found: https://synbiohub.org/user/ryangreer/gonzaloplasmids/B0015/1 in https://synbiohub.org/user/ryangreer/gonzaloplasmids/module4/1 with ['Scar_F', 'Scar_D']\n" + ] + } + ], + "source": [ + "plasmid_list = {}\n", + "for part in orderedDefinitionList:\n", + " for plasmid in plasmid_collection.moduleDefinitions:\n", + " toplevel_URI = plasmid.functionalComponents[0].definition\n", + " toplevel_definition = plasmid_collection.getComponentDefinition(toplevel_URI)\n", + "\n", + " for component in toplevel_definition.components:\n", + " if component.definition == str(part):\n", + " fusion_sites = get_fusion_sites(toplevel_definition, plasmid_collection)\n", + " print(f\"found: {component.definition} in {plasmid} with {fusion_sites}\")\n", + " plasmid_list[part.displayId] = component.definition" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "d5b4077e", + "metadata": {}, + "outputs": [], + "source": [] } ], "metadata": { From 789cb7446dcaa53d5de82988307c0e0ac995e64e Mon Sep 17 00:00:00 2001 From: Ryan Greer Date: Fri, 3 Oct 2025 02:53:20 -0600 Subject: [PATCH 03/27] moclo plasmid class + site verification & matching logic --- notebooks/abstract_design_notebook.ipynb | 282 +++++++++++++++++++---- 1 file changed, 231 insertions(+), 51 deletions(-) diff --git a/notebooks/abstract_design_notebook.ipynb b/notebooks/abstract_design_notebook.ipynb index 3172c49..f12173f 100644 --- a/notebooks/abstract_design_notebook.ipynb +++ b/notebooks/abstract_design_notebook.ipynb @@ -21,7 +21,7 @@ }, { "cell_type": "code", - "execution_count": 2, + "execution_count": 108, "id": "1128c6d8", "metadata": {}, "outputs": [], @@ -41,7 +41,7 @@ }, { "cell_type": "code", - "execution_count": 3, + "execution_count": 109, "id": "cb0d22be", "metadata": {}, "outputs": [], @@ -54,7 +54,7 @@ }, { "cell_type": "code", - "execution_count": 4, + "execution_count": 110, "id": "d04664fb", "metadata": {}, "outputs": [ @@ -62,15 +62,6 @@ "name": "stdout", "output_type": "stream", "text": [ - "Plasmid: module3\n", - "Top Component: GFP_Plas_3\n", - "Contains:\n", - "\tCir_qxow_5\n", - "\tScar_C_2\n", - "\tGFP_3\n", - "\tScar_D_4\n", - "\n", - "\n", "Plasmid: module4\n", "Top Component: term_25\n", "Contains:\n", @@ -89,6 +80,15 @@ "\tCir_qxow_5\n", "\n", "\n", + "Plasmid: module2\n", + "Top Component: rbs_3\n", + "Contains:\n", + "\tScar_C_4\n", + "\tScar_B_2\n", + "\tCir_qxow_5\n", + "\tB0034_3\n", + "\n", + "\n", "Plasmid: module5\n", "Top Component: pro_25\n", "Contains:\n", @@ -98,13 +98,13 @@ "\tScar_B_4\n", "\n", "\n", - "Plasmid: module2\n", - "Top Component: rbs_3\n", + "Plasmid: module3\n", + "Top Component: GFP_Plas_3\n", "Contains:\n", - "\tScar_C_4\n", - "\tScar_B_2\n", "\tCir_qxow_5\n", - "\tB0034_3\n", + "\tScar_C_2\n", + "\tGFP_3\n", + "\tScar_D_4\n", "\n", "\n" ] @@ -135,7 +135,7 @@ }, { "cell_type": "code", - "execution_count": 15, + "execution_count": 111, "id": "6b750df6", "metadata": {}, "outputs": [], @@ -146,7 +146,7 @@ }, { "cell_type": "code", - "execution_count": 6, + "execution_count": 112, "id": "0d3ef9ab", "metadata": {}, "outputs": [ @@ -220,26 +220,6 @@ "#### Sort Components in Design With Precedes SequenceConstraints" ] }, - { - "cell_type": "code", - "execution_count": null, - "id": "5882f697", - "metadata": {}, - "outputs": [ - { - "ename": "_IncompleteInputError", - "evalue": "incomplete input (2856891416.py, line 2)", - "output_type": "error", - "traceback": [ - " \u001b[36mCell\u001b[39m\u001b[36m \u001b[39m\u001b[32mIn[7]\u001b[39m\u001b[32m, line 2\u001b[39m\n\u001b[31m \u001b[39m\n ^\n\u001b[31m_IncompleteInputError\u001b[39m\u001b[31m:\u001b[39m incomplete input\n" - ] - } - ], - "source": [ - "def get_component_URI(component: sbol2.component) -> str:\n", - " " - ] - }, { "cell_type": "markdown", "id": "a70b4203", @@ -250,7 +230,7 @@ }, { "cell_type": "code", - "execution_count": 27, + "execution_count": 113, "id": "0047b82b", "metadata": {}, "outputs": [], @@ -299,7 +279,7 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 114, "id": "5fbef90e", "metadata": {}, "outputs": [ @@ -344,7 +324,7 @@ }, { "cell_type": "code", - "execution_count": 56, + "execution_count": 115, "id": "5151f78b", "metadata": {}, "outputs": [], @@ -363,24 +343,62 @@ }, { "cell_type": "code", - "execution_count": 66, + "execution_count": 190, "id": "b2ecab32", "metadata": {}, "outputs": [], "source": [ - "def get_fusion_sites(plasmid: sbol2.ComponentDefinition, doc: sbol2.Document) -> str:\n", + "def get_fusion_sites(plasmid: sbol2.ComponentDefinition, doc: sbol2.Document) -> List[sbol2.ComponentDefinition]:\n", " fusion_sites = []\n", " for component in plasmid.components:\n", " definition = doc.getComponentDefinition(component.definition)\n", " if (\"http://identifiers.org/so/SO:0001953\" in definition.roles):\n", - " fusion_sites.append(definition.name)\n", + " fusion_sites.append(definition)\n", "\n", " return fusion_sites" ] }, { "cell_type": "code", - "execution_count": 67, + "execution_count": 274, + "id": "d38dba31", + "metadata": {}, + "outputs": [], + "source": [ + "class MocloPlasmid:\n", + " def __init__(self, name: str, definition: sbol2.ComponentDefinition, doc: sbol2.document):\n", + " self.definition = definition\n", + " self.fusion_sites = self.match_fusion_sites(doc)\n", + " self.name = name + \"\".join(f\"_{s}\" for s in self.fusion_sites)\n", + "\n", + "\n", + " def match_fusion_sites(self, doc: sbol2.document) -> List[str]:\n", + " fusion_site_definitions = get_fusion_sites(self.definition, doc)\n", + " fusion_sites = []\n", + " for site in fusion_site_definitions:\n", + " sequence_obj = doc.getSequence(site.sequences[0])\n", + " sequence = sequence_obj.elements\n", + "\n", + " for key, seq in FUSION_SITES.items():\n", + " if seq == sequence.upper():\n", + " fusion_sites.append(key)\n", + " print(f\"{site.name}, {sequence}, {key}\")\n", + "\n", + " fusion_sites.sort()\n", + " return fusion_sites\n", + "\n", + " def __repr__(self):\n", + " return (\n", + " f\"MocloPlasmid:\\n\"\n", + " f\" Name: {self.name}\\n\"\n", + " f\" Definition: {self.definition.identity}\\n\"\n", + " f\" Fusion Sites: {self.fusion_sites or 'Not found'}\"\n", + " )" + ] + }, + { + "cell_type": "code", + "execution_count": 275, "id": "6e6d6be1", "metadata": {}, "outputs": [ @@ -389,14 +407,22 @@ "output_type": "stream", "text": [ "found: https://synbiohub.org/user/ryangreer/gonzaloplasmids/J23101/1 in https://synbiohub.org/user/ryangreer/gonzaloplasmids/module5/1 with ['Scar_A', 'Scar_B']\n", + "Scar_A, GGAG, A\n", + "Scar_B, TACT, B\n", "found: https://synbiohub.org/user/ryangreer/gonzaloplasmids/B0034/1 in https://synbiohub.org/user/ryangreer/gonzaloplasmids/module2/1 with ['Scar_C', 'Scar_B']\n", + "Scar_C, aatg, C\n", + "Scar_B, TACT, B\n", "found: https://synbiohub.org/user/ryangreer/gonzaloplasmids/GFP/1 in https://synbiohub.org/user/ryangreer/gonzaloplasmids/module3/1 with ['Scar_C', 'Scar_D']\n", - "found: https://synbiohub.org/user/ryangreer/gonzaloplasmids/B0015/1 in https://synbiohub.org/user/ryangreer/gonzaloplasmids/module4/1 with ['Scar_F', 'Scar_D']\n" + "Scar_C, aatg, C\n", + "Scar_D, gctt, E\n", + "found: https://synbiohub.org/user/ryangreer/gonzaloplasmids/B0015/1 in https://synbiohub.org/user/ryangreer/gonzaloplasmids/module4/1 with ['Scar_F', 'Scar_D']\n", + "Scar_F, cgct, F\n", + "Scar_D, gctt, E\n" ] } ], "source": [ - "plasmid_list = {}\n", + "plasmid_dict = {}\n", "for part in orderedDefinitionList:\n", " for plasmid in plasmid_collection.moduleDefinitions:\n", " toplevel_URI = plasmid.functionalComponents[0].definition\n", @@ -404,16 +430,170 @@ "\n", " for component in toplevel_definition.components:\n", " if component.definition == str(part):\n", - " fusion_sites = get_fusion_sites(toplevel_definition, plasmid_collection)\n", + " fusion_sites = [site.name for site in get_fusion_sites(toplevel_definition, plasmid_collection)]\n", " print(f\"found: {component.definition} in {plasmid} with {fusion_sites}\")\n", - " plasmid_list[part.displayId] = component.definition" + " plasmid_dict.setdefault(part.displayId, [])\n", + "\n", + " componentName = plasmid_collection.getComponentDefinition(component.definition).name\n", + "\n", + "\n", + " plasmid_dict[part.displayId].append(\n", + " MocloPlasmid(componentName, toplevel_definition, plasmid_collection)\n", + " )" ] }, { "cell_type": "code", - "execution_count": null, + "execution_count": 276, "id": "d5b4077e", "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "J23101\n", + "[MocloPlasmid:\n", + " Name: J23101_A_B\n", + " Definition: https://synbiohub.org/user/ryangreer/gonzaloplasmids/pro/1\n", + " Fusion Sites: ['A', 'B']]\n", + "B0034\n", + "[MocloPlasmid:\n", + " Name: B0034_B_C\n", + " Definition: https://synbiohub.org/user/ryangreer/gonzaloplasmids/rbs/1\n", + " Fusion Sites: ['B', 'C']]\n", + "GFP\n", + "[MocloPlasmid:\n", + " Name: GFP_C_E\n", + " Definition: https://synbiohub.org/user/ryangreer/gonzaloplasmids/GFP_Plas/1\n", + " Fusion Sites: ['C', 'E']]\n", + "B0015\n", + "[MocloPlasmid:\n", + " Name: B0015_E_F\n", + " Definition: https://synbiohub.org/user/ryangreer/gonzaloplasmids/term/1\n", + " Fusion Sites: ['E', 'F']]\n" + ] + } + ], + "source": [ + "for key,value in plasmid_dict.items():\n", + " print(key)\n", + " print(value)" + ] + }, + { + "cell_type": "markdown", + "id": "317041bd", + "metadata": {}, + "source": [ + "### Get Selected Backbone and Check Compatibility\n", + "- what is best way to keep track of fusion sites? need to be confirmed using dictionary of moclo sites\n", + "- is it even necessary? perhaps we can match on uri for fusion sites within a collection\n", + " - this would not work with plasmids from multiple collections \n", + "\n", + "##### Plasmid Class\n", + "- Attributes: ComponentDefinition, Fusion Sites" + ] + }, + { + "cell_type": "code", + "execution_count": 277, + "id": "53224c58", + "metadata": {}, + "outputs": [], + "source": [ + "backbone_doc = sbol2.Document()\n", + "sbh.pull(\"https://synbiohub.org/user/ryangreer/gonzaloplasmids/module1/1/9d94ff284e1963ad6a2b00e99520ee5437994370/share\", backbone_doc)" + ] + }, + { + "cell_type": "code", + "execution_count": 278, + "id": "3de46538", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Scar_A, GGAG, A\n", + "Scar_F, cgct, F\n" + ] + } + ], + "source": [ + "backbone_URI = backbone_doc.moduleDefinitions[0].functionalComponents[0].definition\n", + "backbone_definition = backbone_doc.getComponentDefinition(backbone_URI)\n", + "\n", + "backbone = MocloPlasmid(\"cir_backbone\", backbone_definition, backbone_doc)" + ] + }, + { + "cell_type": "markdown", + "id": "c6da5dc8", + "metadata": {}, + "source": [ + "## Iterate Through Plasmid Dict to Find Matching Sites" + ] + }, + { + "cell_type": "code", + "execution_count": 284, + "id": "44cbf535", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "matched J23101_A_B with cir_backbone_A_F!\n", + "matched B0034_B_C with J23101_A_B!\n", + "matched GFP_C_E with B0034_B_C!\n", + "matched B0015_E_F with GFP_C_E!\n", + "Final List! [MocloPlasmid:\n", + " Name: J23101_A_B\n", + " Definition: https://synbiohub.org/user/ryangreer/gonzaloplasmids/pro/1\n", + " Fusion Sites: ['A', 'B'], MocloPlasmid:\n", + " Name: B0034_B_C\n", + " Definition: https://synbiohub.org/user/ryangreer/gonzaloplasmids/rbs/1\n", + " Fusion Sites: ['B', 'C'], MocloPlasmid:\n", + " Name: GFP_C_E\n", + " Definition: https://synbiohub.org/user/ryangreer/gonzaloplasmids/GFP_Plas/1\n", + " Fusion Sites: ['C', 'E'], MocloPlasmid:\n", + " Name: B0015_E_F\n", + " Definition: https://synbiohub.org/user/ryangreer/gonzaloplasmids/term/1\n", + " Fusion Sites: ['E', 'F']] MocloPlasmid:\n", + " Name: cir_backbone_A_F\n", + " Definition: https://synbiohub.org/user/ryangreer/gonzaloplasmids/UJHDBOTD/1\n", + " Fusion Sites: ['A', 'F']\n" + ] + } + ], + "source": [ + "selected_plasmids = []\n", + "match_to = backbone\n", + "match_idx = 0\n", + "\n", + "for i, key in enumerate(plasmid_dict):\n", + " # print(key, match_to)\n", + " # print(i, plasmid_dict[key])\n", + "\n", + " for plasmid in plasmid_dict[key]:\n", + " if plasmid.fusion_sites[0] == match_to.fusion_sites[match_idx]:\n", + " print(f\"matched {plasmid.name} with {match_to.name}!\")\n", + " selected_plasmids.append(plasmid)\n", + " match_to = plasmid\n", + " match_idx = 1\n", + " break\n", + "\n", + "print(\"Final List!\", selected_plasmids, backbone)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "a254b888", + "metadata": {}, "outputs": [], "source": [] } From 1380268b78555a683e4ab51117d56d6bb65e3fad Mon Sep 17 00:00:00 2001 From: Ryan Greer Date: Fri, 3 Oct 2025 14:49:37 -0600 Subject: [PATCH 04/27] cleaning up notebook --- notebooks/abstract_design_notebook.ipynb | 160 ++++++++++++----------- 1 file changed, 87 insertions(+), 73 deletions(-) diff --git a/notebooks/abstract_design_notebook.ipynb b/notebooks/abstract_design_notebook.ipynb index f12173f..2bb1a7c 100644 --- a/notebooks/abstract_design_notebook.ipynb +++ b/notebooks/abstract_design_notebook.ipynb @@ -16,12 +16,13 @@ "Assumptions: \n", "- user selects MoClo with BsaI restriction enzyme\n", "- user creates abstract design in SBOLCanvas without including a circular backbone glpyh/component\n", - "- user selects desired backbone ahead of time, in this case: https://synbiohub.org/user/ryangreer/gonzaloplasmids/module1/1\n" + "- user selects desired backbone ahead of time, in this case: https://synbiohub.org/user/ryangreer/gonzaloplasmids/module1/1\n", + "- all plasmids have defined fusion sites, marked with role: http://identifiers.org/so/SO:0001953\n" ] }, { "cell_type": "code", - "execution_count": 108, + "execution_count": 287, "id": "1128c6d8", "metadata": {}, "outputs": [], @@ -41,7 +42,7 @@ }, { "cell_type": "code", - "execution_count": 109, + "execution_count": 288, "id": "cb0d22be", "metadata": {}, "outputs": [], @@ -54,7 +55,7 @@ }, { "cell_type": "code", - "execution_count": 110, + "execution_count": 289, "id": "d04664fb", "metadata": {}, "outputs": [ @@ -62,13 +63,13 @@ "name": "stdout", "output_type": "stream", "text": [ - "Plasmid: module4\n", - "Top Component: term_25\n", + "Plasmid: module3\n", + "Top Component: GFP_Plas_3\n", "Contains:\n", "\tCir_qxow_5\n", - "\tScar_F_4\n", - "\tScar_D_2\n", - "\tB0015_3\n", + "\tScar_C_2\n", + "\tGFP_3\n", + "\tScar_D_4\n", "\n", "\n", "Plasmid: module1\n", @@ -80,15 +81,6 @@ "\tCir_qxow_5\n", "\n", "\n", - "Plasmid: module2\n", - "Top Component: rbs_3\n", - "Contains:\n", - "\tScar_C_4\n", - "\tScar_B_2\n", - "\tCir_qxow_5\n", - "\tB0034_3\n", - "\n", - "\n", "Plasmid: module5\n", "Top Component: pro_25\n", "Contains:\n", @@ -98,13 +90,22 @@ "\tScar_B_4\n", "\n", "\n", - "Plasmid: module3\n", - "Top Component: GFP_Plas_3\n", + "Plasmid: module2\n", + "Top Component: rbs_3\n", "Contains:\n", + "\tScar_C_4\n", + "\tScar_B_2\n", "\tCir_qxow_5\n", - "\tScar_C_2\n", - "\tGFP_3\n", - "\tScar_D_4\n", + "\tB0034_3\n", + "\n", + "\n", + "Plasmid: module4\n", + "Top Component: term_25\n", + "Contains:\n", + "\tCir_qxow_5\n", + "\tScar_F_4\n", + "\tScar_D_2\n", + "\tB0015_3\n", "\n", "\n" ] @@ -135,7 +136,7 @@ }, { "cell_type": "code", - "execution_count": 111, + "execution_count": 290, "id": "6b750df6", "metadata": {}, "outputs": [], @@ -146,7 +147,7 @@ }, { "cell_type": "code", - "execution_count": 112, + "execution_count": 291, "id": "0d3ef9ab", "metadata": {}, "outputs": [ @@ -230,7 +231,7 @@ }, { "cell_type": "code", - "execution_count": 113, + "execution_count": 292, "id": "0047b82b", "metadata": {}, "outputs": [], @@ -279,7 +280,28 @@ }, { "cell_type": "code", - "execution_count": 114, + "execution_count": 307, + "id": "23e9e4be", + "metadata": {}, + "outputs": [ + { + "data": { + "text/plain": [ + "['J23101_1', 'B0034_2', 'GFP_3', 'B0015_4']" + ] + }, + "execution_count": 307, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "[c.displayId for c in definition.getInSequentialOrder()]" + ] + }, + { + "cell_type": "code", + "execution_count": 293, "id": "5fbef90e", "metadata": {}, "outputs": [ @@ -324,7 +346,7 @@ }, { "cell_type": "code", - "execution_count": 115, + "execution_count": 294, "id": "5151f78b", "metadata": {}, "outputs": [], @@ -343,12 +365,12 @@ }, { "cell_type": "code", - "execution_count": 190, + "execution_count": null, "id": "b2ecab32", "metadata": {}, "outputs": [], "source": [ - "def get_fusion_sites(plasmid: sbol2.ComponentDefinition, doc: sbol2.Document) -> List[sbol2.ComponentDefinition]:\n", + "def extract_fusion_sites(plasmid: sbol2.ComponentDefinition, doc: sbol2.Document) -> List[sbol2.ComponentDefinition]:\n", " fusion_sites = []\n", " for component in plasmid.components:\n", " definition = doc.getComponentDefinition(component.definition)\n", @@ -358,9 +380,17 @@ " return fusion_sites" ] }, + { + "cell_type": "markdown", + "id": "9948caf3", + "metadata": {}, + "source": [ + "# Establish MocloPlasmid Class" + ] + }, { "cell_type": "code", - "execution_count": 274, + "execution_count": null, "id": "d38dba31", "metadata": {}, "outputs": [], @@ -373,7 +403,7 @@ "\n", "\n", " def match_fusion_sites(self, doc: sbol2.document) -> List[str]:\n", - " fusion_site_definitions = get_fusion_sites(self.definition, doc)\n", + " fusion_site_definitions = extract_fusion_sites(self.definition, doc)\n", " fusion_sites = []\n", " for site in fusion_site_definitions:\n", " sequence_obj = doc.getSequence(site.sequences[0])\n", @@ -382,12 +412,11 @@ " for key, seq in FUSION_SITES.items():\n", " if seq == sequence.upper():\n", " fusion_sites.append(key)\n", - " print(f\"{site.name}, {sequence}, {key}\")\n", "\n", " fusion_sites.sort()\n", " return fusion_sites\n", "\n", - " def __repr__(self):\n", + " def __repr__(self) -> str:\n", " return (\n", " f\"MocloPlasmid:\\n\"\n", " f\" Name: {self.name}\\n\"\n", @@ -396,9 +425,18 @@ " )" ] }, + { + "cell_type": "markdown", + "id": "5dac9970", + "metadata": {}, + "source": [ + "### Construct Plasmid Dictionary by identifying plasmids containing abstract design parts\n", + "- where key = name of component in plasmid and value = list of MocloPlasmid Objects" + ] + }, { "cell_type": "code", - "execution_count": 275, + "execution_count": null, "id": "6e6d6be1", "metadata": {}, "outputs": [ @@ -407,17 +445,9 @@ "output_type": "stream", "text": [ "found: https://synbiohub.org/user/ryangreer/gonzaloplasmids/J23101/1 in https://synbiohub.org/user/ryangreer/gonzaloplasmids/module5/1 with ['Scar_A', 'Scar_B']\n", - "Scar_A, GGAG, A\n", - "Scar_B, TACT, B\n", "found: https://synbiohub.org/user/ryangreer/gonzaloplasmids/B0034/1 in https://synbiohub.org/user/ryangreer/gonzaloplasmids/module2/1 with ['Scar_C', 'Scar_B']\n", - "Scar_C, aatg, C\n", - "Scar_B, TACT, B\n", "found: https://synbiohub.org/user/ryangreer/gonzaloplasmids/GFP/1 in https://synbiohub.org/user/ryangreer/gonzaloplasmids/module3/1 with ['Scar_C', 'Scar_D']\n", - "Scar_C, aatg, C\n", - "Scar_D, gctt, E\n", - "found: https://synbiohub.org/user/ryangreer/gonzaloplasmids/B0015/1 in https://synbiohub.org/user/ryangreer/gonzaloplasmids/module4/1 with ['Scar_F', 'Scar_D']\n", - "Scar_F, cgct, F\n", - "Scar_D, gctt, E\n" + "found: https://synbiohub.org/user/ryangreer/gonzaloplasmids/B0015/1 in https://synbiohub.org/user/ryangreer/gonzaloplasmids/module4/1 with ['Scar_F', 'Scar_D']\n" ] } ], @@ -430,7 +460,7 @@ "\n", " for component in toplevel_definition.components:\n", " if component.definition == str(part):\n", - " fusion_sites = [site.name for site in get_fusion_sites(toplevel_definition, plasmid_collection)]\n", + " fusion_sites = [site.name for site in extract_fusion_sites(toplevel_definition, plasmid_collection)]\n", " print(f\"found: {component.definition} in {plasmid} with {fusion_sites}\")\n", " plasmid_dict.setdefault(part.displayId, [])\n", "\n", @@ -444,7 +474,7 @@ }, { "cell_type": "code", - "execution_count": 276, + "execution_count": 298, "id": "d5b4077e", "metadata": {}, "outputs": [ @@ -486,18 +516,12 @@ "id": "317041bd", "metadata": {}, "source": [ - "### Get Selected Backbone and Check Compatibility\n", - "- what is best way to keep track of fusion sites? need to be confirmed using dictionary of moclo sites\n", - "- is it even necessary? perhaps we can match on uri for fusion sites within a collection\n", - " - this would not work with plasmids from multiple collections \n", - "\n", - "##### Plasmid Class\n", - "- Attributes: ComponentDefinition, Fusion Sites" + "### Get Selected Backbone and Check Compatibility" ] }, { "cell_type": "code", - "execution_count": 277, + "execution_count": 299, "id": "53224c58", "metadata": {}, "outputs": [], @@ -508,7 +532,7 @@ }, { "cell_type": "code", - "execution_count": 278, + "execution_count": 300, "id": "3de46538", "metadata": {}, "outputs": [ @@ -538,7 +562,7 @@ }, { "cell_type": "code", - "execution_count": 284, + "execution_count": 304, "id": "44cbf535", "metadata": {}, "outputs": [ @@ -546,10 +570,11 @@ "name": "stdout", "output_type": "stream", "text": [ - "matched J23101_A_B with cir_backbone_A_F!\n", - "matched B0034_B_C with J23101_A_B!\n", - "matched GFP_C_E with B0034_B_C!\n", - "matched B0015_E_F with GFP_C_E!\n", + "matched J23101_A_B with cir_backbone_A_F on fusion site A!\n", + "matched B0034_B_C with J23101_A_B on fusion site B!\n", + "matched GFP_C_E with B0034_B_C on fusion site C!\n", + "matched B0015_E_F with GFP_C_E on fusion site E!\n", + "\n", "Final List! [MocloPlasmid:\n", " Name: J23101_A_B\n", " Definition: https://synbiohub.org/user/ryangreer/gonzaloplasmids/pro/1\n", @@ -575,27 +600,16 @@ "match_idx = 0\n", "\n", "for i, key in enumerate(plasmid_dict):\n", - " # print(key, match_to)\n", - " # print(i, plasmid_dict[key])\n", - "\n", " for plasmid in plasmid_dict[key]:\n", " if plasmid.fusion_sites[0] == match_to.fusion_sites[match_idx]:\n", - " print(f\"matched {plasmid.name} with {match_to.name}!\")\n", + " print(f\"matched {plasmid.name} with {match_to.name} on fusion site {plasmid.fusion_sites[0]}!\")\n", " selected_plasmids.append(plasmid)\n", " match_to = plasmid\n", " match_idx = 1\n", " break\n", "\n", - "print(\"Final List!\", selected_plasmids, backbone)" + "print(\"\\nFinal List!\", selected_plasmids, backbone)" ] - }, - { - "cell_type": "code", - "execution_count": null, - "id": "a254b888", - "metadata": {}, - "outputs": [], - "source": [] } ], "metadata": { From c009a1504ca511c7e8bb5caab2607fc44b17050c Mon Sep 17 00:00:00 2001 From: Ryan Greer Date: Tue, 7 Oct 2025 22:55:01 -0600 Subject: [PATCH 05/27] notebook to file --- notebooks/abstract_design_notebook.ipynb | 28 ++++++-- src/sbol2build/abstract_translator.py | 82 ++++++++++++++++++++++++ src/sbol2build/constants.py | 10 +++ 3 files changed, 115 insertions(+), 5 deletions(-) create mode 100644 src/sbol2build/abstract_translator.py create mode 100644 src/sbol2build/constants.py diff --git a/notebooks/abstract_design_notebook.ipynb b/notebooks/abstract_design_notebook.ipynb index 2bb1a7c..0603033 100644 --- a/notebooks/abstract_design_notebook.ipynb +++ b/notebooks/abstract_design_notebook.ipynb @@ -280,28 +280,45 @@ }, { "cell_type": "code", - "execution_count": 307, + "execution_count": null, "id": "23e9e4be", "metadata": {}, "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "https://sbolcanvas.org/cYYPhACA/J23101_1/1\n", + "https://sbolcanvas.org/cYYPhACA/B0034_2/1\n", + "https://sbolcanvas.org/cYYPhACA/GFP_3/1\n", + "https://sbolcanvas.org/cYYPhACA/B0015_4/1\n" + ] + }, { "data": { "text/plain": [ - "['J23101_1', 'B0034_2', 'GFP_3', 'B0015_4']" + "[,\n", + " ,\n", + " ,\n", + " ]" ] }, - "execution_count": 307, + "execution_count": 322, "metadata": {}, "output_type": "execute_result" } ], "source": [ - "[c.displayId for c in definition.getInSequentialOrder()]" + "def extract_design_parts(design: sbol2.ComponentDefinition, doc: sbol2.Document) -> List[sbol2.ComponentDefinition]:\n", + " component_list = [c for c in design.getInSequentialOrder()]\n", + " return [doc.getComponentDefinition(component.definition) for component in component_list]\n", + "\n", + "extract_design_parts(definition, abstract_design)" ] }, { "cell_type": "code", - "execution_count": 293, + "execution_count": null, "id": "5fbef90e", "metadata": {}, "outputs": [ @@ -318,6 +335,7 @@ ], "source": [ "orderedComponentURIList = get_design_component_order(definition, abstract_design)\n", + "print(orderedComponentURIList)\n", "orderedDefinitionList = []\n", "\n", "for URI in orderedComponentURIList: \n", diff --git a/src/sbol2build/abstract_translator.py b/src/sbol2build/abstract_translator.py new file mode 100644 index 0000000..71e5395 --- /dev/null +++ b/src/sbol2build/abstract_translator.py @@ -0,0 +1,82 @@ +import sbol2 +from typing import Dict, List +from constants import FUSION_SITES + +class MocloPlasmid: + def __init__(self, name: str, definition: sbol2.ComponentDefinition, doc: sbol2.document): + self.definition = definition + self.fusion_sites = self.match_fusion_sites(doc) + self.name = name + "".join(f"_{s}" for s in self.fusion_sites) + + + def match_fusion_sites(self, doc: sbol2.document) -> List[str]: + fusion_site_definitions = extract_fusion_sites(self.definition, doc) + fusion_sites = [] + for site in fusion_site_definitions: + sequence_obj = doc.getSequence(site.sequences[0]) + sequence = sequence_obj.elements + + for key, seq in FUSION_SITES.items(): + if seq == sequence.upper(): + fusion_sites.append(key) + + fusion_sites.sort() + return fusion_sites + + def __repr__(self) -> str: + return ( + f"MocloPlasmid:\n" + f" Name: {self.name}\n" + f" Definition: {self.definition.identity}\n" + f" Fusion Sites: {self.fusion_sites or 'Not found'}" + ) + +def extract_fusion_sites(plasmid: sbol2.ComponentDefinition, doc: sbol2.Document) -> List[sbol2.ComponentDefinition]: + fusion_sites = [] + for component in plasmid.components: + definition = doc.getComponentDefinition(component.definition) + if ("http://identifiers.org/so/SO:0001953" in definition.roles): + fusion_sites.append(definition) + + return fusion_sites + +def extract_design_parts(design: sbol2.ComponentDefinition, doc: sbol2.Document) -> List[sbol2.ComponentDefinition]: + component_list = [c for c in design.getInSequentialOrder()] + return [doc.getComponentDefinition(component.definition) for component in component_list] + +def extract_toplevel_definition(doc: sbol2.Document) -> sbol2.ComponentDefinition: + module = doc.moduleDefinitions[0] + functional_component = module.functionalComponents[0] + + return doc.getComponentDefinition(functional_component.definition) + +def construct_plasmid_dict(part_list: List[sbol2.ComponentDefinition], plasmid_collection: sbol2.Document) -> Dict[str, List[MocloPlasmid]]: + plasmid_dict = {} + for part in part_list: + for plasmid in plasmid_collection.moduleDefinitions: + toplevel_URI = plasmid.functionalComponents[0].definition + toplevel_definition = plasmid_collection.getComponentDefinition(toplevel_URI) + + for component in toplevel_definition.components: + if component.definition == str(part): + fusion_sites = [site.name for site in extract_fusion_sites(toplevel_definition, plasmid_collection)] + print(f"found: {component.definition} in {plasmid} with {fusion_sites}") #TODO switch to logger for backend tracing? + plasmid_dict.setdefault(part.displayId, []) + + componentName = plasmid_collection.getComponentDefinition(component.definition).name + + + plasmid_dict[part.displayId].append( + MocloPlasmid(componentName, toplevel_definition, plasmid_collection) + ) + + return plasmid_dict + +# TODO potenitally replace each componentdefinition with a SBH URI, or extract definitions from SBH before calling +def translate_abstract_to_plasmids(abstract_design_doc: sbol2.Document, plasmid_collection: sbol2.Document, backbone_doc: sbol2.Document): + abstract_design_def = extract_toplevel_definition(abstract_design_doc) + backbone_def = extract_toplevel_definition(backbone_doc) + + ordered_part_definitions = extract_design_parts(abstract_design_def) + plasmid_dict = construct_plasmid_dict(ordered_part_definitions, plasmid_collection) + \ No newline at end of file diff --git a/src/sbol2build/constants.py b/src/sbol2build/constants.py new file mode 100644 index 0000000..e2dd996 --- /dev/null +++ b/src/sbol2build/constants.py @@ -0,0 +1,10 @@ +FUSION_SITES = { + "A": "GGAG", + "B": "TACT", + "C": "AATG", + "D": "AGGT", + "E": "GCTT", + "F": "CGCT", + "G": "TGCC", + "H": "ACTA", +} \ No newline at end of file From 5c3d9ef5d634315c0e61f2f51f40a33f276e2bb5 Mon Sep 17 00:00:00 2001 From: Ryan Greer Date: Wed, 8 Oct 2025 13:34:35 -0600 Subject: [PATCH 06/27] abstract design translator working in package --- notebooks/test_notebook.ipynb | 160 +++++++++++++++++--------- src/sbol2build/__init__.py | 1 - src/sbol2build/abstract_translator.py | 27 ++++- src/sbol2build/sbol2build.py | 8 +- 4 files changed, 133 insertions(+), 63 deletions(-) diff --git a/notebooks/test_notebook.ipynb b/notebooks/test_notebook.ipynb index b7138e0..0a01c12 100644 --- a/notebooks/test_notebook.ipynb +++ b/notebooks/test_notebook.ipynb @@ -2,49 +2,7 @@ "cells": [ { "cell_type": "code", - "execution_count": 1, - "metadata": {}, - "outputs": [ - { - "name": "stdout", - "output_type": "stream", - "text": [ - "Requirement already satisfied: sbol2build in /opt/miniconda3/lib/python3.12/site-packages (0.0b1)\n", - "Requirement already satisfied: sbol2 in /opt/miniconda3/lib/python3.12/site-packages (from sbol2build) (1.4.1)\n", - "Requirement already satisfied: biopython in /opt/miniconda3/lib/python3.12/site-packages (from sbol2build) (1.84)\n", - "Requirement already satisfied: pydna in /opt/miniconda3/lib/python3.12/site-packages (from sbol2build) (5.4.0)\n", - "Requirement already satisfied: numpy in /opt/miniconda3/lib/python3.12/site-packages (from biopython->sbol2build) (2.2.2)\n", - "Requirement already satisfied: appdirs>=1.4.4 in /opt/miniconda3/lib/python3.12/site-packages (from pydna->sbol2build) (1.4.4)\n", - "Requirement already satisfied: networkx>=2.8.8 in /opt/miniconda3/lib/python3.12/site-packages (from pydna->sbol2build) (3.4.2)\n", - "Requirement already satisfied: prettytable>=3.5.0 in /opt/miniconda3/lib/python3.12/site-packages (from pydna->sbol2build) (3.12.0)\n", - "Requirement already satisfied: pydivsufsort>=0.0.14 in /opt/miniconda3/lib/python3.12/site-packages (from pydna->sbol2build) (0.0.18)\n", - "Requirement already satisfied: pyfiglet==0.8.post1 in /opt/miniconda3/lib/python3.12/site-packages (from pydna->sbol2build) (0.8.post1)\n", - "Requirement already satisfied: seguid>=0.0.5 in /opt/miniconda3/lib/python3.12/site-packages (from pydna->sbol2build) (0.1.0)\n", - "Requirement already satisfied: rdflib>=5.0 in /opt/miniconda3/lib/python3.12/site-packages (from sbol2->sbol2build) (7.1.3)\n", - "Requirement already satisfied: python-dateutil in /opt/miniconda3/lib/python3.12/site-packages (from sbol2->sbol2build) (2.9.0.post0)\n", - "Requirement already satisfied: deprecated in /opt/miniconda3/lib/python3.12/site-packages (from sbol2->sbol2build) (1.2.15)\n", - "Requirement already satisfied: lxml in /opt/miniconda3/lib/python3.12/site-packages (from sbol2->sbol2build) (5.3.0)\n", - "Requirement already satisfied: requests in /opt/miniconda3/lib/python3.12/site-packages (from sbol2->sbol2build) (2.32.3)\n", - "Requirement already satisfied: urllib3 in /opt/miniconda3/lib/python3.12/site-packages (from sbol2->sbol2build) (2.2.3)\n", - "Requirement already satisfied: packaging>=20.0 in /opt/miniconda3/lib/python3.12/site-packages (from sbol2->sbol2build) (24.1)\n", - "Requirement already satisfied: wcwidth in /opt/miniconda3/lib/python3.12/site-packages (from prettytable>=3.5.0->pydna->sbol2build) (0.2.5)\n", - "Requirement already satisfied: wheel in /opt/miniconda3/lib/python3.12/site-packages (from pydivsufsort>=0.0.14->pydna->sbol2build) (0.44.0)\n", - "Requirement already satisfied: pyparsing<4,>=2.1.0 in /opt/miniconda3/lib/python3.12/site-packages (from rdflib>=5.0->sbol2->sbol2build) (2.4.7)\n", - "Requirement already satisfied: wrapt<2,>=1.10 in /opt/miniconda3/lib/python3.12/site-packages (from deprecated->sbol2->sbol2build) (1.17.2)\n", - "Requirement already satisfied: six>=1.5 in /opt/miniconda3/lib/python3.12/site-packages (from python-dateutil->sbol2->sbol2build) (1.16.0)\n", - "Requirement already satisfied: charset-normalizer<4,>=2 in /opt/miniconda3/lib/python3.12/site-packages (from requests->sbol2->sbol2build) (3.3.2)\n", - "Requirement already satisfied: idna<4,>=2.5 in /opt/miniconda3/lib/python3.12/site-packages (from requests->sbol2->sbol2build) (3.7)\n", - "Requirement already satisfied: certifi>=2017.4.17 in /opt/miniconda3/lib/python3.12/site-packages (from requests->sbol2->sbol2build) (2024.8.30)\n" - ] - } - ], - "source": [ - "!pip install sbol2build" - ] - }, - { - "cell_type": "code", - "execution_count": 1, + "execution_count": 4, "metadata": {}, "outputs": [], "source": [ @@ -53,7 +11,7 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 5, "metadata": {}, "outputs": [], "source": [ @@ -62,16 +20,16 @@ }, { "cell_type": "code", - "execution_count": 3, + "execution_count": 6, "metadata": {}, "outputs": [ { "data": { "text/plain": [ - "" + "" ] }, - "execution_count": 3, + "execution_count": 6, "metadata": {}, "output_type": "execute_result" } @@ -82,16 +40,28 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 7, "metadata": {}, - "outputs": [], + "outputs": [ + { + "ename": "AttributeError", + "evalue": "module 'sbol2build' has no attribute 'dna_componentdefinition_with_sequence'", + "output_type": "error", + "traceback": [ + "\u001b[31m---------------------------------------------------------------------------\u001b[39m", + "\u001b[31mAttributeError\u001b[39m Traceback (most recent call last)", + "\u001b[36mCell\u001b[39m\u001b[36m \u001b[39m\u001b[32mIn[7]\u001b[39m\u001b[32m, line 1\u001b[39m\n\u001b[32m----> \u001b[39m\u001b[32m1\u001b[39m pro = \u001b[43ms2b\u001b[49m\u001b[43m.\u001b[49m\u001b[43mdna_componentdefinition_with_sequence\u001b[49m(\u001b[33m'\u001b[39m\u001b[33mpromoter\u001b[39m\u001b[33m'\u001b[39m, \u001b[33m'\u001b[39m\u001b[33macgt\u001b[39m\u001b[33m'\u001b[39m)\n", + "\u001b[31mAttributeError\u001b[39m: module 'sbol2build' has no attribute 'dna_componentdefinition_with_sequence'" + ] + } + ], "source": [ "pro = s2b.dna_componentdefinition_with_sequence('promoter', 'acgt')" ] }, { "cell_type": "code", - "execution_count": 5, + "execution_count": null, "metadata": {}, "outputs": [ { @@ -112,7 +82,7 @@ }, { "cell_type": "code", - "execution_count": 7, + "execution_count": null, "metadata": {}, "outputs": [ { @@ -130,6 +100,88 @@ "pro[1].elements" ] }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Abstract Translator Test Case (in style of api call)" + ] + }, + { + "cell_type": "code", + "execution_count": 1, + "metadata": {}, + "outputs": [], + "source": [ + "import sys, os, sbol2\n", + "sys.path.insert(0, os.path.abspath(os.path.join(os.getcwd(), \"..\", \"src\")))\n", + "from sbol2build.abstract_translator import translate_abstract_to_plasmids\n" + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "found: https://synbiohub.org/user/ryangreer/gonzaloplasmids/J23101/1 in https://synbiohub.org/user/ryangreer/gonzaloplasmids/module5/1 with ['Scar_A', 'Scar_B']\n", + "found: https://synbiohub.org/user/ryangreer/gonzaloplasmids/B0034/1 in https://synbiohub.org/user/ryangreer/gonzaloplasmids/module2/1 with ['Scar_C', 'Scar_B']\n", + "found: https://synbiohub.org/user/ryangreer/gonzaloplasmids/GFP/1 in https://synbiohub.org/user/ryangreer/gonzaloplasmids/module3/1 with ['Scar_C', 'Scar_D']\n", + "found: https://synbiohub.org/user/ryangreer/gonzaloplasmids/B0015/1 in https://synbiohub.org/user/ryangreer/gonzaloplasmids/module4/1 with ['Scar_D', 'Scar_F']\n", + "matched J23101_A_B with UJHDBOTD_A_F on fusion site A!\n", + "matched B0034_B_C with J23101_A_B on fusion site B!\n", + "matched GFP_C_E with B0034_B_C on fusion site C!\n", + "matched B0015_E_F with GFP_C_E on fusion site E!\n" + ] + } + ], + "source": [ + "plasmid_collection = sbol2.Document()\n", + "sbh = sbol2.PartShop('https://synbiohub.org')\n", + "# sbh.pull('https://synbiohub.org/user/Gon/CIDARMoCloPlasmidKit/CIDARMoCloPlasmidKit_collection/1/893dd0b07a2eb4b9d0a70be6307d2af4c4a7c132/share', plasmid_collection)\n", + "sbh.pull('https://synbiohub.org/user/ryangreer/gonzaloplasmids/gonzaloplasmids_collection/1/c4869067a3286b13552d65bfe9387a81e92f2972/share', plasmid_collection)\n", + "\n", + "abstract_design_doc = sbol2.Document()\n", + "abstract_design_doc.read('tests/test_files/abstract_design.xml')\n", + "\n", + "backbone_doc = sbol2.Document()\n", + "sbh.pull(\"https://synbiohub.org/user/ryangreer/gonzaloplasmids/module1/1/9d94ff284e1963ad6a2b00e99520ee5437994370/share\", backbone_doc)\n", + "\n", + "list = translate_abstract_to_plasmids(abstract_design_doc, plasmid_collection, backbone_doc)" + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "[MocloPlasmid:\n", + " Name: J23101_A_B\n", + " Definition: https://synbiohub.org/user/ryangreer/gonzaloplasmids/pro/1\n", + " Fusion Sites: ['A', 'B'], MocloPlasmid:\n", + " Name: B0034_B_C\n", + " Definition: https://synbiohub.org/user/ryangreer/gonzaloplasmids/rbs/1\n", + " Fusion Sites: ['B', 'C'], MocloPlasmid:\n", + " Name: GFP_C_E\n", + " Definition: https://synbiohub.org/user/ryangreer/gonzaloplasmids/GFP_Plas/1\n", + " Fusion Sites: ['C', 'E'], MocloPlasmid:\n", + " Name: B0015_E_F\n", + " Definition: https://synbiohub.org/user/ryangreer/gonzaloplasmids/term/1\n", + " Fusion Sites: ['E', 'F']]\n" + ] + } + ], + "source": [ + "print(list)" + ] + }, { "cell_type": "code", "execution_count": null, @@ -140,9 +192,9 @@ ], "metadata": { "kernelspec": { - "display_name": "base", + "display_name": "Python (buildplanner)", "language": "python", - "name": "python3" + "name": "buildplanner" }, "language_info": { "codemirror_mode": { @@ -154,7 +206,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.12.7" + "version": "3.13.7" } }, "nbformat": 4, diff --git a/src/sbol2build/__init__.py b/src/sbol2build/__init__.py index c543485..e69de29 100644 --- a/src/sbol2build/__init__.py +++ b/src/sbol2build/__init__.py @@ -1 +0,0 @@ -from .sbol2build import * \ No newline at end of file diff --git a/src/sbol2build/abstract_translator.py b/src/sbol2build/abstract_translator.py index 71e5395..22f1a1f 100644 --- a/src/sbol2build/abstract_translator.py +++ b/src/sbol2build/abstract_translator.py @@ -1,6 +1,6 @@ import sbol2 from typing import Dict, List -from constants import FUSION_SITES +from .constants import FUSION_SITES class MocloPlasmid: def __init__(self, name: str, definition: sbol2.ComponentDefinition, doc: sbol2.document): @@ -70,13 +70,32 @@ def construct_plasmid_dict(part_list: List[sbol2.ComponentDefinition], plasmid_c MocloPlasmid(componentName, toplevel_definition, plasmid_collection) ) - return plasmid_dict + return plasmid_dict + +def get_compatibile_plasmids(plasmid_dict: Dict[str, List[MocloPlasmid]], backbone: MocloPlasmid): + selected_plasmids = [] + match_to = backbone + match_idx = 0 + + for i, key in enumerate(plasmid_dict): + for plasmid in plasmid_dict[key]: + if plasmid.fusion_sites[0] == match_to.fusion_sites[match_idx]: + print(f"matched {plasmid.name} with {match_to.name} on fusion site {plasmid.fusion_sites[0]}!") + selected_plasmids.append(plasmid) + match_to = plasmid + match_idx = 1 + break + + return selected_plasmids # TODO potenitally replace each componentdefinition with a SBH URI, or extract definitions from SBH before calling def translate_abstract_to_plasmids(abstract_design_doc: sbol2.Document, plasmid_collection: sbol2.Document, backbone_doc: sbol2.Document): abstract_design_def = extract_toplevel_definition(abstract_design_doc) backbone_def = extract_toplevel_definition(backbone_doc) - ordered_part_definitions = extract_design_parts(abstract_design_def) + ordered_part_definitions = extract_design_parts(abstract_design_def, abstract_design_doc) + plasmid_dict = construct_plasmid_dict(ordered_part_definitions, plasmid_collection) - \ No newline at end of file + backbone_plasmid = MocloPlasmid(backbone_def.displayId, backbone_def, backbone_doc) + + return get_compatibile_plasmids(plasmid_dict, backbone_plasmid) \ No newline at end of file diff --git a/src/sbol2build/sbol2build.py b/src/sbol2build/sbol2build.py index 1bf755f..16c57ff 100644 --- a/src/sbol2build/sbol2build.py +++ b/src/sbol2build/sbol2build.py @@ -194,13 +194,13 @@ def part_digestion(reactant:sbol2.ModuleDefinition, restriction_enzymes:List[sbo if len(digested_reactant)<2 or len(digested_reactant)>3: - raise NotImplementedError(f'Not supported number of products. Found{len(digested_reactant)}') + raise ValueError(f'Not supported number of products. Found{len(digested_reactant)}') #TODO select them based on content rather than size. elif circular and len(digested_reactant)==2: part_extract, backbone = sorted(digested_reactant, key=len) elif linear and len(digested_reactant)==3: prefix, part_extract, suffix = digested_reactant - else: raise NotImplementedError('The reactant has no valid topology type') + else: raise ValueError('The reactant has no valid topology type') # Compute the length of single strand sticky ends or fusion sites product_5_prime_ss_strand, product_5_prime_ss_end = part_extract.seq.five_prime_end() @@ -370,13 +370,13 @@ def backbone_digestion(reactant:sbol2.ModuleDefinition, restriction_enzymes:List if len(digested_reactant)<2 or len(digested_reactant)>3: - raise NotImplementedError(f'Not supported number of products. Found{len(digested_reactant)}') + raise ValueError(f'Not supported number of products. Found{len(digested_reactant)}') #TODO make more specific for buildplanner #TODO select them based on content rather than size. elif circular and len(digested_reactant)==2: part_extract, backbone = sorted(digested_reactant, key=len) elif linear and len(digested_reactant)==3: prefix, part_extract, suffix = digested_reactant - else: raise NotImplementedError('The reactant has no valid topology type') + else: raise ValueError('The reactant has no valid topology type') # Compute the length of single strand sticky ends or fusion sites product_5_prime_ss_strand, product_5_prime_ss_end = backbone.seq.five_prime_end() From 085bb0958e97effc6596b12435713b1a55d7bcad Mon Sep 17 00:00:00 2001 From: Ryan Greer Date: Wed, 8 Oct 2025 15:35:16 -0600 Subject: [PATCH 07/27] adapted logic for componentdefinition plasmids instead of those contained in moduledefinitions --- src/sbol2build/abstract_translator.py | 25 ++++++++++++------------- 1 file changed, 12 insertions(+), 13 deletions(-) diff --git a/src/sbol2build/abstract_translator.py b/src/sbol2build/abstract_translator.py index 22f1a1f..e7bbb08 100644 --- a/src/sbol2build/abstract_translator.py +++ b/src/sbol2build/abstract_translator.py @@ -53,22 +53,21 @@ def extract_toplevel_definition(doc: sbol2.Document) -> sbol2.ComponentDefinitio def construct_plasmid_dict(part_list: List[sbol2.ComponentDefinition], plasmid_collection: sbol2.Document) -> Dict[str, List[MocloPlasmid]]: plasmid_dict = {} for part in part_list: - for plasmid in plasmid_collection.moduleDefinitions: - toplevel_URI = plasmid.functionalComponents[0].definition - toplevel_definition = plasmid_collection.getComponentDefinition(toplevel_URI) + for plasmid in plasmid_collection.componentDefinitions: + if 'http://identifiers.org/so/SO:0000637' in plasmid.roles: + print(plasmid, plasmid.roles) + for component in plasmid.components: + if component.definition == str(part): #TODO make sure this is not a composite plasmid, i.e. plasmid just contains singular part of interest + fusion_sites = [site.name for site in extract_fusion_sites(plasmid, plasmid_collection)] + print(f"found: {component.definition} in {plasmid} with {fusion_sites}") #TODO switch to logger for backend tracing? + plasmid_dict.setdefault(part.displayId, []) - for component in toplevel_definition.components: - if component.definition == str(part): - fusion_sites = [site.name for site in extract_fusion_sites(toplevel_definition, plasmid_collection)] - print(f"found: {component.definition} in {plasmid} with {fusion_sites}") #TODO switch to logger for backend tracing? - plasmid_dict.setdefault(part.displayId, []) + componentName = plasmid_collection.getComponentDefinition(component.definition).name - componentName = plasmid_collection.getComponentDefinition(component.definition).name - - plasmid_dict[part.displayId].append( - MocloPlasmid(componentName, toplevel_definition, plasmid_collection) - ) + plasmid_dict[part.displayId].append( + MocloPlasmid(componentName, plasmid, plasmid_collection) + ) return plasmid_dict From 498bd516400dfd659e2577847af9673c68a9f815 Mon Sep 17 00:00:00 2001 From: Ryan Greer Date: Mon, 13 Oct 2025 15:11:15 -0600 Subject: [PATCH 08/27] digest parameter type adjustment + ruff linting --- notebooks/test_notebook.ipynb | 100 ++- src/sbol2build/abstract_translator.py | 79 ++- src/sbol2build/sbol2build.py | 861 ++++++++++++++++++-------- 3 files changed, 719 insertions(+), 321 deletions(-) diff --git a/notebooks/test_notebook.ipynb b/notebooks/test_notebook.ipynb index 0a01c12..ab6b55d 100644 --- a/notebooks/test_notebook.ipynb +++ b/notebooks/test_notebook.ipynb @@ -56,7 +56,7 @@ } ], "source": [ - "pro = s2b.dna_componentdefinition_with_sequence('promoter', 'acgt')" + "pro = s2b.dna_componentdefinition_with_sequence(\"promoter\", \"acgt\")" ] }, { @@ -113,44 +113,64 @@ "metadata": {}, "outputs": [], "source": [ - "import sys, os, sbol2\n", + "import sys\n", + "import os\n", + "import sbol2\n", + "\n", "sys.path.insert(0, os.path.abspath(os.path.join(os.getcwd(), \"..\", \"src\")))\n", - "from sbol2build.abstract_translator import translate_abstract_to_plasmids\n" + "from sbol2build.abstract_translator import translate_abstract_to_plasmids" ] }, { "cell_type": "code", - "execution_count": 2, + "execution_count": null, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ - "found: https://synbiohub.org/user/ryangreer/gonzaloplasmids/J23101/1 in https://synbiohub.org/user/ryangreer/gonzaloplasmids/module5/1 with ['Scar_A', 'Scar_B']\n", - "found: https://synbiohub.org/user/ryangreer/gonzaloplasmids/B0034/1 in https://synbiohub.org/user/ryangreer/gonzaloplasmids/module2/1 with ['Scar_C', 'Scar_B']\n", - "found: https://synbiohub.org/user/ryangreer/gonzaloplasmids/GFP/1 in https://synbiohub.org/user/ryangreer/gonzaloplasmids/module3/1 with ['Scar_C', 'Scar_D']\n", - "found: https://synbiohub.org/user/ryangreer/gonzaloplasmids/B0015/1 in https://synbiohub.org/user/ryangreer/gonzaloplasmids/module4/1 with ['Scar_D', 'Scar_F']\n", - "matched J23101_A_B with UJHDBOTD_A_F on fusion site A!\n", - "matched B0034_B_C with J23101_A_B on fusion site B!\n", - "matched GFP_C_E with B0034_B_C on fusion site C!\n", - "matched B0015_E_F with GFP_C_E on fusion site E!\n" + "found: https://synbiohub.org/user/Gon/CIDARMoCloParts/J23100/1 in https://synbiohub.org/user/Gon/CIDARMoCloPlasmidKit/pJ23100_EB/1 with ['Fusion_Site_B', 'Fusion_Site_E']\n", + "found: https://synbiohub.org/user/Gon/CIDARMoCloParts/J23100/1 in https://synbiohub.org/user/Gon/CIDARMoCloPlasmidKit/pJ23100_AB/1 with ['Fusion_Site_A', 'Fusion_Site_B']\n", + "found: https://synbiohub.org/user/Gon/CIDARMoCloParts/J23100/1 in https://synbiohub.org/user/Gon/CIDARMoCloPlasmidKit/pJ23100_GB/1 with ['Fusion_Site_G', 'Fusion_Site_B']\n", + "found: https://synbiohub.org/user/Gon/CIDARMoCloParts/J23100/1 in https://synbiohub.org/user/Gon/CIDARMoCloPlasmidKit/pJ23100_FB/1 with ['Fusion_Site_F', 'Fusion_Site_B']\n", + "found: https://synbiohub.org/user/Gon/CIDARMoCloParts/B0034/1 in https://synbiohub.org/user/Gon/CIDARMoCloPlasmidKit/pB0034_BC/1 with ['Fusion_Site_C', 'Fusion_Site_B']\n", + "found: https://synbiohub.org/user/Gon/CIDARMoCloParts/E0030_yfp/1 in https://synbiohub.org/user/Gon/CIDARMoCloPlasmidKit/pE0030_CD/1 with ['Fusion_Site_C', 'Fusion_Site_D']\n", + "found: https://synbiohub.org/user/Gon/CIDARMoCloParts/B0015/1 in https://synbiohub.org/user/Gon/CIDARMoCloPlasmidKit/pB0015_DG/1 with ['Fusion_Site_D', 'Fusion_Site_G']\n", + "found: https://synbiohub.org/user/Gon/CIDARMoCloParts/B0015/1 in https://synbiohub.org/user/Gon/CIDARMoCloPlasmidKit/pB0015_DH/1 with ['Fusion_Site_H', 'Fusion_Site_D']\n", + "found: https://synbiohub.org/user/Gon/CIDARMoCloParts/B0015/1 in https://synbiohub.org/user/Gon/CIDARMoCloPlasmidKit/pB0015_DF/1 with ['Fusion_Site_F', 'Fusion_Site_D']\n", + "found: https://synbiohub.org/user/Gon/CIDARMoCloParts/B0015/1 in https://synbiohub.org/user/Gon/CIDARMoCloPlasmidKit/pB0015_DE/1 with ['Fusion_Site_E', 'Fusion_Site_D']\n", + "matched J23100_A_B with UJHDBOTD_A_F on fusion site A!\n", + "matched B0034_B_C with J23100_A_B on fusion site B!\n", + "matched E0030_yfp_C_D with B0034_B_C on fusion site C!\n", + "matched B0015_D_G with E0030_yfp_C_D on fusion site D!\n" ] } ], "source": [ "plasmid_collection = sbol2.Document()\n", - "sbh = sbol2.PartShop('https://synbiohub.org')\n", - "# sbh.pull('https://synbiohub.org/user/Gon/CIDARMoCloPlasmidKit/CIDARMoCloPlasmidKit_collection/1/893dd0b07a2eb4b9d0a70be6307d2af4c4a7c132/share', plasmid_collection)\n", - "sbh.pull('https://synbiohub.org/user/ryangreer/gonzaloplasmids/gonzaloplasmids_collection/1/c4869067a3286b13552d65bfe9387a81e92f2972/share', plasmid_collection)\n", + "sbh = sbol2.PartShop(\"https://synbiohub.org\")\n", + "sbh.pull(\n", + " \"https://synbiohub.org/user/Gon/CIDARMoCloPlasmidKit/CIDARMoCloPlasmidKit_collection/1/893dd0b07a2eb4b9d0a70be6307d2af4c4a7c132/share\",\n", + " plasmid_collection,\n", + ")\n", + "sbh.pull(\n", + " \"https://synbiohub.org/user/Gon/CIDARMoCloParts/CIDARMoCloParts_collection/1/038feff5f9c6c9b35cc95586ed6b14ec9bd3fea5/share\",\n", + " plasmid_collection,\n", + ")\n", "\n", "abstract_design_doc = sbol2.Document()\n", - "abstract_design_doc.read('tests/test_files/abstract_design.xml')\n", + "abstract_design_doc.read(\"tests/test_files/moclo_parts_circuit.xml\")\n", "\n", "backbone_doc = sbol2.Document()\n", - "sbh.pull(\"https://synbiohub.org/user/ryangreer/gonzaloplasmids/module1/1/9d94ff284e1963ad6a2b00e99520ee5437994370/share\", backbone_doc)\n", + "sbh.pull(\n", + " \"https://synbiohub.org/user/ryangreer/gonzaloplasmids/module1/1/9d94ff284e1963ad6a2b00e99520ee5437994370/share\",\n", + " backbone_doc,\n", + ")\n", "\n", - "list = translate_abstract_to_plasmids(abstract_design_doc, plasmid_collection, backbone_doc)" + "list = translate_abstract_to_plasmids(\n", + " abstract_design_doc, plasmid_collection, backbone_doc\n", + ")" ] }, { @@ -163,23 +183,47 @@ "output_type": "stream", "text": [ "[MocloPlasmid:\n", - " Name: J23101_A_B\n", - " Definition: https://synbiohub.org/user/ryangreer/gonzaloplasmids/pro/1\n", + " Name: J23100_A_B\n", + " Definition: https://synbiohub.org/user/Gon/CIDARMoCloPlasmidKit/pJ23100_AB/1\n", " Fusion Sites: ['A', 'B'], MocloPlasmid:\n", " Name: B0034_B_C\n", - " Definition: https://synbiohub.org/user/ryangreer/gonzaloplasmids/rbs/1\n", + " Definition: https://synbiohub.org/user/Gon/CIDARMoCloPlasmidKit/pB0034_BC/1\n", " Fusion Sites: ['B', 'C'], MocloPlasmid:\n", - " Name: GFP_C_E\n", - " Definition: https://synbiohub.org/user/ryangreer/gonzaloplasmids/GFP_Plas/1\n", - " Fusion Sites: ['C', 'E'], MocloPlasmid:\n", - " Name: B0015_E_F\n", - " Definition: https://synbiohub.org/user/ryangreer/gonzaloplasmids/term/1\n", - " Fusion Sites: ['E', 'F']]\n" + " Name: E0030_yfp_C_D\n", + " Definition: https://synbiohub.org/user/Gon/CIDARMoCloPlasmidKit/pE0030_CD/1\n", + " Fusion Sites: ['C', 'D'], MocloPlasmid:\n", + " Name: B0015_D_G\n", + " Definition: https://synbiohub.org/user/Gon/CIDARMoCloPlasmidKit/pB0015_DG/1\n", + " Fusion Sites: ['D', 'G']]\n", + "Design........................0\n", + "Build.........................0\n", + "Test..........................0\n", + "Analysis......................0\n", + "ComponentDefinition...........82\n", + "ModuleDefinition..............13\n", + "Model.........................0\n", + "Sequence......................74\n", + "Collection....................2\n", + "Activity......................0\n", + "Plan..........................0\n", + "Agent.........................0\n", + "Attachment....................0\n", + "CombinatorialDerivation.......0\n", + "Implementation................0\n", + "SampleRoster..................0\n", + "Experiment....................0\n", + "ExperimentalData..............0\n", + "Annotation Objects............50\n", + "---\n", + "Total: .........................221\n", + "\n" ] } ], "source": [ - "print(list)" + "print(list)\n", + "\n", + "print(plasmid_collection)" ] }, { diff --git a/src/sbol2build/abstract_translator.py b/src/sbol2build/abstract_translator.py index e7bbb08..6c0535a 100644 --- a/src/sbol2build/abstract_translator.py +++ b/src/sbol2build/abstract_translator.py @@ -2,13 +2,15 @@ from typing import Dict, List from .constants import FUSION_SITES + class MocloPlasmid: - def __init__(self, name: str, definition: sbol2.ComponentDefinition, doc: sbol2.document): + def __init__( + self, name: str, definition: sbol2.ComponentDefinition, doc: sbol2.document + ): self.definition = definition self.fusion_sites = self.match_fusion_sites(doc) self.name = name + "".join(f"_{s}" for s in self.fusion_sites) - def match_fusion_sites(self, doc: sbol2.document) -> List[str]: fusion_site_definitions = extract_fusion_sites(self.definition, doc) fusion_sites = [] @@ -30,19 +32,28 @@ def __repr__(self) -> str: f" Definition: {self.definition.identity}\n" f" Fusion Sites: {self.fusion_sites or 'Not found'}" ) - -def extract_fusion_sites(plasmid: sbol2.ComponentDefinition, doc: sbol2.Document) -> List[sbol2.ComponentDefinition]: + + +def extract_fusion_sites( + plasmid: sbol2.ComponentDefinition, doc: sbol2.Document +) -> List[sbol2.ComponentDefinition]: fusion_sites = [] for component in plasmid.components: definition = doc.getComponentDefinition(component.definition) - if ("http://identifiers.org/so/SO:0001953" in definition.roles): + if "http://identifiers.org/so/SO:0001953" in definition.roles: fusion_sites.append(definition) return fusion_sites -def extract_design_parts(design: sbol2.ComponentDefinition, doc: sbol2.Document) -> List[sbol2.ComponentDefinition]: + +def extract_design_parts( + design: sbol2.ComponentDefinition, doc: sbol2.Document +) -> List[sbol2.ComponentDefinition]: component_list = [c for c in design.getInSequentialOrder()] - return [doc.getComponentDefinition(component.definition) for component in component_list] + return [ + doc.getComponentDefinition(component.definition) for component in component_list + ] + def extract_toplevel_definition(doc: sbol2.Document) -> sbol2.ComponentDefinition: module = doc.moduleDefinitions[0] @@ -50,28 +61,43 @@ def extract_toplevel_definition(doc: sbol2.Document) -> sbol2.ComponentDefinitio return doc.getComponentDefinition(functional_component.definition) -def construct_plasmid_dict(part_list: List[sbol2.ComponentDefinition], plasmid_collection: sbol2.Document) -> Dict[str, List[MocloPlasmid]]: + +def construct_plasmid_dict( + part_list: List[sbol2.ComponentDefinition], plasmid_collection: sbol2.Document +) -> Dict[str, List[MocloPlasmid]]: plasmid_dict = {} for part in part_list: for plasmid in plasmid_collection.componentDefinitions: - if 'http://identifiers.org/so/SO:0000637' in plasmid.roles: - print(plasmid, plasmid.roles) + if "http://identifiers.org/so/SO:0000637" in plasmid.roles: for component in plasmid.components: - if component.definition == str(part): #TODO make sure this is not a composite plasmid, i.e. plasmid just contains singular part of interest - fusion_sites = [site.name for site in extract_fusion_sites(plasmid, plasmid_collection)] - print(f"found: {component.definition} in {plasmid} with {fusion_sites}") #TODO switch to logger for backend tracing? + if ( + component.definition == str(part) + ): # TODO make sure this is not a composite plasmid, i.e. plasmid just contains singular part of interest + fusion_sites = [ + site.name + for site in extract_fusion_sites( + plasmid, plasmid_collection + ) + ] + print( + f"found: {component.definition} in {plasmid} with {fusion_sites}" + ) # TODO switch to logger for backend tracing? plasmid_dict.setdefault(part.displayId, []) - componentName = plasmid_collection.getComponentDefinition(component.definition).name - + componentName = plasmid_collection.getComponentDefinition( + component.definition + ).name plasmid_dict[part.displayId].append( MocloPlasmid(componentName, plasmid, plasmid_collection) ) return plasmid_dict - -def get_compatibile_plasmids(plasmid_dict: Dict[str, List[MocloPlasmid]], backbone: MocloPlasmid): + + +def get_compatibile_plasmids( + plasmid_dict: Dict[str, List[MocloPlasmid]], backbone: MocloPlasmid +): selected_plasmids = [] match_to = backbone match_idx = 0 @@ -79,7 +105,9 @@ def get_compatibile_plasmids(plasmid_dict: Dict[str, List[MocloPlasmid]], backbo for i, key in enumerate(plasmid_dict): for plasmid in plasmid_dict[key]: if plasmid.fusion_sites[0] == match_to.fusion_sites[match_idx]: - print(f"matched {plasmid.name} with {match_to.name} on fusion site {plasmid.fusion_sites[0]}!") + print( + f"matched {plasmid.name} with {match_to.name} on fusion site {plasmid.fusion_sites[0]}!" + ) selected_plasmids.append(plasmid) match_to = plasmid match_idx = 1 @@ -87,14 +115,21 @@ def get_compatibile_plasmids(plasmid_dict: Dict[str, List[MocloPlasmid]], backbo return selected_plasmids + # TODO potenitally replace each componentdefinition with a SBH URI, or extract definitions from SBH before calling -def translate_abstract_to_plasmids(abstract_design_doc: sbol2.Document, plasmid_collection: sbol2.Document, backbone_doc: sbol2.Document): +def translate_abstract_to_plasmids( + abstract_design_doc: sbol2.Document, + plasmid_collection: sbol2.Document, + backbone_doc: sbol2.Document, +): abstract_design_def = extract_toplevel_definition(abstract_design_doc) backbone_def = extract_toplevel_definition(backbone_doc) - ordered_part_definitions = extract_design_parts(abstract_design_def, abstract_design_doc) - + ordered_part_definitions = extract_design_parts( + abstract_design_def, abstract_design_doc + ) + plasmid_dict = construct_plasmid_dict(ordered_part_definitions, plasmid_collection) backbone_plasmid = MocloPlasmid(backbone_def.displayId, backbone_def, backbone_doc) - return get_compatibile_plasmids(plasmid_dict, backbone_plasmid) \ No newline at end of file + return get_compatibile_plasmids(plasmid_dict, backbone_plasmid) diff --git a/src/sbol2build/sbol2build.py b/src/sbol2build/sbol2build.py index 16c57ff..263033b 100644 --- a/src/sbol2build/sbol2build.py +++ b/src/sbol2build/sbol2build.py @@ -5,28 +5,31 @@ from itertools import product from typing import List, Union, Tuple -sbol2.Config.setHomespace('https://SBOL2Build.org') +sbol2.Config.setHomespace("https://SBOL2Build.org") sbol2.Config.setOption(sbol2.ConfigOptions.SBOL_COMPLIANT_URIS, True) sbol2.Config.setOption(sbol2.ConfigOptions.SBOL_TYPED_URIS, False) -def rebase_restriction_enzyme(name:str, **kwargs) -> sbol2.ComponentDefinition: + +def rebase_restriction_enzyme(name: str, **kwargs) -> sbol2.ComponentDefinition: """Creates an ComponentDefinition Restriction Enzyme Component from rebase. :param name: Name of the SBOL ExternallyDefined, used by PyDNA. Case sensitive, follow standard restriction enzyme nomenclature, i.e. 'BsaI' :param kwargs: Keyword arguments of any other ComponentDefinition attribute. :return: A ComponentDefinition object. """ - check_enzyme = Restriction.__dict__[name] - definition=f'http://rebase.neb.com/rebase/enz/{name}.html' # TODO: replace with getting the URI from Enzyme when REBASE identifiers become available in biopython 1.8 + definition = f"http://rebase.neb.com/rebase/enz/{name}.html" # TODO: replace with getting the URI from Enzyme when REBASE identifiers become available in biopython 1.8 cd = sbol2.ComponentDefinition(name) cd.types = sbol2.BIOPAX_PROTEIN cd.name = name cd.roles = ["http://identifiers.org/obi/OBI:0000732"] cd.wasDerivedFrom = definition - cd.description = f'Restriction enzyme {name} from REBASE.' + cd.description = f"Restriction enzyme {name} from REBASE." return cd -def dna_componentdefinition_with_sequence(identity: str, sequence: str, **kwargs) -> Tuple[sbol2.ComponentDefinition, sbol2.Sequence]: + +def dna_componentdefinition_with_sequence( + identity: str, sequence: str, **kwargs +) -> Tuple[sbol2.ComponentDefinition, sbol2.Sequence]: """Creates a DNA ComponentDefinition and its Sequence. :param identity: The identity of the Component. The identity of Sequence is also identity with the suffix '_seq'. @@ -34,128 +37,198 @@ def dna_componentdefinition_with_sequence(identity: str, sequence: str, **kwargs :param kwargs: Keyword arguments of any other Component attribute. :return: A tuple of ComponentDefinition and Sequence. """ - comp_seq = sbol2.Sequence(f'{identity}_seq', elements=sequence, encoding=sbol2.SBOL_ENCODING_IUPAC) + comp_seq = sbol2.Sequence( + f"{identity}_seq", elements=sequence, encoding=sbol2.SBOL_ENCODING_IUPAC + ) dna_comp = sbol2.ComponentDefinition(identity, sbol2.BIOPAX_DNA, **kwargs) dna_comp.sequences = [comp_seq] return dna_comp, comp_seq -def part_in_backbone_from_sbol(identity: Union[str, None], sbol_comp: sbol2.ComponentDefinition, part_location: List[int], part_roles:List[str], fusion_site_length:int, document: sbol2.Document, linear:bool=False, **kwargs) -> Tuple[sbol2.ComponentDefinition, sbol2.Sequence]: + +def part_in_backbone_from_sbol( + identity: Union[str, None], + sbol_comp: sbol2.ComponentDefinition, + part_location: List[int], + part_roles: List[str], + fusion_site_length: int, + document: sbol2.Document, + linear: bool = False, + **kwargs, +) -> Tuple[sbol2.ComponentDefinition, sbol2.Sequence]: """Restructures a plasmid ComponentDefinition to follow the part-in-backbone pattern with scars following BP011. - It overwrites the SBOL2 ComponentDefinition provided. - A part inserted into a backbone is represented by a Component that includes both the part insert + It overwrites the SBOL2 ComponentDefinition provided. + A part inserted into a backbone is represented by a Component that includes both the part insert as a feature that is a SubComponent and the backbone as another SubComponent. - For more information about BP011 visit https://github.com/SynBioDex/SBOL-examples/tree/main/SBOL/best-practices/BP011 + For more information about BP011 visit https://github.com/SynBioDex/SBOL-examples/tree/main/SBOL/best-practices/BP011 :param identity: The identity of the Component, is its a String it build a new SBOL Component, if None it adds on top of the input. The identity of Sequence is also identity with the suffix '_seq'. :param sbol_comp: The SBOL2 Component that will be used to create the part in backbone Component and Sequence. :param part_location: List of 2 integers that indicates the start and the end of the unitary part. Note that the index of the first location is 1, as is typical practice in biology, rather than 0, as is typical practice in computer science. :param part_roles: List of strings that indicates the roles to add on the part. :param fusion_site_length: Integer of the length of the fusion sites (eg. BsaI fusion site lenght is 4, SapI fusion site lenght is 3) - :param linear: Boolean than indicates if the backbone is linear, defaults to False (cicular topology). + :param linear: Boolean than indicates if the backbone is linear, defaults to False (cicular topology). :param kwargs: Keyword arguments of any other Component attribute. :return: ModuleDefinition in the form that sbolcanvas would output """ if len(part_location) != 2: - raise ValueError('The part_location only accepts 2 int values in a list.') - if len(sbol_comp.sequences)!=1: - raise ValueError(f'The reactant needs to have precisely one sequence. The input reactant has {len(sbol_comp.sequences)} sequences') - sequence = document.find(sbol_comp.sequences[0]).elements - if identity == None: - part_in_backbone_component = sbol_comp - part_in_backbone_seq = document.find(sbol_comp.sequences[0]).elements + raise ValueError("The part_location only accepts 2 int values in a list.") + if len(sbol_comp.sequences) != 1: + raise ValueError( + f"The reactant needs to have precisely one sequence. The input reactant has {len(sbol_comp.sequences)} sequences" + ) + sequence = document.find(sbol_comp.sequences[0]).elements + if identity is None: + part_in_backbone_component = sbol_comp + part_in_backbone_seq = document.find(sbol_comp.sequences[0]).elements part_in_backbone_component.sequences = [part_in_backbone_seq] else: - part_in_backbone_component, part_in_backbone_seq = dna_componentdefinition_with_sequence(identity, sequence, **kwargs) + part_in_backbone_component, part_in_backbone_seq = ( + dna_componentdefinition_with_sequence(identity, sequence, **kwargs) + ) # double stranded - part_in_backbone_component.addRole('http://identifiers.org/so/SO:0000985') - for part_role in part_roles: + part_in_backbone_component.addRole("http://identifiers.org/so/SO:0000985") + for part_role in part_roles: part_in_backbone_component.addRole(part_role) - # creating part annotation - part_location_comp = sbol2.Range( start=part_location[0], end=part_location[1]) - insertion_site_location1 = sbol2.Range( uri="insertloc1", start=part_location[0], end=part_location[0]+fusion_site_length) #order 1 - insertion_site_location2 = sbol2.Range( uri="insertloc2", start=part_location[1]-fusion_site_length, end=part_location[1]) #order 3 - - part_sequence_annotation = sbol2.SequenceAnnotation('part_sequence_annotation') + # creating part annotation + part_location_comp = sbol2.Range(start=part_location[0], end=part_location[1]) + insertion_site_location1 = sbol2.Range( + uri="insertloc1", + start=part_location[0], + end=part_location[0] + fusion_site_length, + ) # order 1 + insertion_site_location2 = sbol2.Range( + uri="insertloc2", + start=part_location[1] - fusion_site_length, + end=part_location[1], + ) # order 3 + + part_sequence_annotation = sbol2.SequenceAnnotation("part_sequence_annotation") part_sequence_annotation.roles = part_roles part_sequence_annotation.locations.add(part_location_comp) - part_sequence_annotation.addRole('https://identifiers.org/SO:0000915') #engineered insert - insertion_sites_annotation = sbol2.SequenceAnnotation('insertion_sites_annotation') + part_sequence_annotation.addRole( + "https://identifiers.org/SO:0000915" + ) # engineered insert + insertion_sites_annotation = sbol2.SequenceAnnotation("insertion_sites_annotation") insertion_sites_annotation.locations.add(insertion_site_location1) insertion_sites_annotation.locations.add(insertion_site_location2) - - insertion_sites_annotation.roles = ['https://identifiers.org/so/SO:0000366'] #insertion site + + insertion_sites_annotation.roles = [ + "https://identifiers.org/so/SO:0000366" + ] # insertion site if linear: - part_in_backbone_component.addRole('http://identifiers.org/so/SO:0000987') #linear - part_in_backbone_component.addRole('http://identifiers.org/so/SO:0000804') #engineered region + part_in_backbone_component.addRole( + "http://identifiers.org/so/SO:0000987" + ) # linear + part_in_backbone_component.addRole( + "http://identifiers.org/so/SO:0000804" + ) # engineered region # creating backbone feature - open_backbone_location1 = sbol2.Range(start=1, end=part_location[0]+fusion_site_length-1) #order 1 - open_backbone_location2 = sbol2.Range(start=part_location[1]-fusion_site_length, end=len(sequence)) #order 3 - open_backbone_annotation = sbol2.SequenceAnnotation(locations=[open_backbone_location1, open_backbone_location2]) - else: - part_in_backbone_component.addRole('http://identifiers.org/so/SO:0000988') #circular - part_in_backbone_component.addRole('https://identifiers.org/so/SO:0000755') #plasmid vector + open_backbone_location1 = sbol2.Range( + start=1, end=part_location[0] + fusion_site_length - 1 + ) # order 1 + open_backbone_location2 = sbol2.Range( + start=part_location[1] - fusion_site_length, end=len(sequence) + ) # order 3 + open_backbone_annotation = sbol2.SequenceAnnotation( + locations=[open_backbone_location1, open_backbone_location2] + ) + else: + part_in_backbone_component.addRole( + "http://identifiers.org/so/SO:0000988" + ) # circular + part_in_backbone_component.addRole( + "https://identifiers.org/so/SO:0000755" + ) # plasmid vector # creating backbone feature - open_backbone_location1 = sbol2.Range( uri="backboneloc1", start=1, end=part_location[0]+fusion_site_length-1 ) #order 2 - open_backbone_location2 = sbol2.Range( uri="backboneloc2", start=part_location[1]-fusion_site_length, end=len(sequence)) #order 1 - open_backbone_annotation = sbol2.SequenceAnnotation('open_backbone_annotation') + open_backbone_location1 = sbol2.Range( + uri="backboneloc1", start=1, end=part_location[0] + fusion_site_length - 1 + ) # order 2 + open_backbone_location2 = sbol2.Range( + uri="backboneloc2", + start=part_location[1] - fusion_site_length, + end=len(sequence), + ) # order 1 + open_backbone_annotation = sbol2.SequenceAnnotation("open_backbone_annotation") open_backbone_annotation.locations.add(open_backbone_location1) open_backbone_annotation.locations.add(open_backbone_location2) - + part_in_backbone_component.sequenceAnnotations.add(part_sequence_annotation) part_in_backbone_component.sequenceAnnotations.add(insertion_sites_annotation) - part_in_backbone_component.sequenceAnnotations.add(open_backbone_annotation) + part_in_backbone_component.sequenceAnnotations.add(open_backbone_annotation) # use sequenceconstrait with precedes # backbone_dropout_meets = sbol3.Constraint(restriction='http://sbols.org/v3#meets', subject=part_sequence_annotation, object=open_backbone_annotation) #???? - backbone_dropout_meets = sbol2.sequenceconstraint.SequenceConstraint(uri='backbone_dropout_meets', restriction=sbol2.SBOL_RESTRICTION_PRECEDES) #might need to add uri as param 2 + backbone_dropout_meets = sbol2.sequenceconstraint.SequenceConstraint( + uri="backbone_dropout_meets", restriction=sbol2.SBOL_RESTRICTION_PRECEDES + ) # might need to add uri as param 2 backbone_dropout_meets.subject = part_sequence_annotation backbone_dropout_meets.object = open_backbone_annotation - + part_in_backbone_component.sequenceConstraints.add(backbone_dropout_meets) - #TODO: Add a branch to create a component without overwriting the WHOLE input component - #removing repeated types and roles + # TODO: Add a branch to create a component without overwriting the WHOLE input component + # removing repeated types and roles part_in_backbone_component.types = set(part_in_backbone_component.types) part_in_backbone_component.roles = set(part_in_backbone_component.roles) return part_in_backbone_component, part_in_backbone_seq + # helper function def is_circular(obj: sbol2.ComponentDefinition) -> bool: """Check if an SBOL Component or Feature is circular. :param obj: design to be checked :return: true if circular - """ - return any(n==sbol2.SO_CIRCULAR for n in obj.types) - -def part_digestion(reactant:sbol2.ModuleDefinition, restriction_enzymes:List[sbol2.ComponentDefinition], assembly_plan:sbol2.ModuleDefinition, document: sbol2.Document, **kwargs)-> Tuple[List[Tuple[sbol2.ComponentDefinition, sbol2.Sequence]], sbol2.ModuleDefinition]: - """Runs a simulated digestion on the top level sequence in the reactant ModuleDefinition with the given restriciton enzymes, creating a extracted part ComponentDefinition, a digestion Interaction, and converts existing scars to 5' and 3' overhangs. + """ + return any(n == sbol2.SO_CIRCULAR for n in obj.types) + + +def part_digestion( + reactant: Union[sbol2.ComponentDefinition, sbol2.ModuleDefinition], + restriction_enzymes: List[sbol2.ComponentDefinition], + assembly_plan: sbol2.ModuleDefinition, + document: sbol2.Document, + **kwargs, +) -> Tuple[ + List[Tuple[sbol2.ComponentDefinition, sbol2.Sequence]], sbol2.ModuleDefinition +]: + """Runs a simulated digestion on the top level sequence in the reactant ComponentDefinition or ModuleDefinition with the given restriciton enzymes, creating a extracted part ComponentDefinition, a digestion Interaction, and converts existing scars to 5' and 3' overhangs. The product ComponentDefinition is assumed the open backbone in this case. Written for use with the SBOL2.3 output of https://sbolcanvas.org - :param reactant: DNA to be digested as SBOL ModuleDefinition, usually a part_in_backbone. + :param reactant: DNA to be digested as SBOL ComponentDefinition or ModuleDefinition, usually a part_in_backbone. ComponentDefinition is the best-practice type for plasmids.. :param restriction_enzymes: Restriction enzymes as :class:`sbol2.ComponentDefinition` (generate with :func:`rebase_restriction_enzyme`). :param assembly_plan: SBOL ModuleDefinition to contain the functional components, interactions, and participations :param document: original SBOL2 document to be used to extract referenced objects. :return: A tuple of a list ComponentDefinitions and Sequences, and an assembly plan ModuleDefinition. """ - # extract component definition from module - reactant_displayId = reactant.functionalComponents[0].displayId - reactant_def_URI = reactant.functionalComponents[0].definition - reactant_component_definition = document.getComponentDefinition(reactant_def_URI) + if type(reactant) is sbol2.ModuleDefinition: + # extract component definition from module + reactant_displayId = reactant.functionalComponents[0].displayId + reactant_def_URI = reactant.functionalComponents[0].definition + reactant_component_definition = document.getComponentDefinition( + reactant_def_URI + ) + else: + reactant_displayId = reactant.displayId + reactant_component_definition = reactant if sbol2.BIOPAX_DNA not in reactant_component_definition.types: - raise TypeError(f'The reactant should has a DNA type. Types found {reactant.types}.') - if len(reactant_component_definition.sequences)!=1: - raise ValueError(f'The reactant needs to have precisely one sequence. The input reactant has {len(reactant.sequences)} sequences') - participations=[] - extracts_list=[] - restriction_enzymes_pydna=[] - + raise TypeError( + f"The reactant should has a DNA type. Types found {reactant.types}." + ) + if len(reactant_component_definition.sequences) != 1: + raise ValueError( + f"The reactant needs to have precisely one sequence. The input reactant has {len(reactant.sequences)} sequences" + ) + participations = [] + extracts_list = [] + restriction_enzymes_pydna = [] + for re in restriction_enzymes: enzyme = Restriction.__dict__[re.name] restriction_enzymes_pydna.append(enzyme) @@ -166,109 +239,156 @@ def part_digestion(reactant:sbol2.ModuleDefinition, restriction_enzymes:List[sbo enzyme_in_module = False for comp in assembly_plan.functionalComponents: - if (comp.displayId == enzyme_component.displayID): + if comp.displayId == enzyme_component.displayID: enzyme_component = comp enzyme_in_module = True if not enzyme_in_module: assembly_plan.functionalComponents.add(enzyme_component) - - modifier_participation = sbol2.Participation(uri='restriction') + + modifier_participation = sbol2.Participation(uri="restriction") modifier_participation.participant = enzyme_component - modifier_participation.roles = ['http://identifiers.org/biomodels.sbo/SBO:0000019'] + modifier_participation.roles = [ + "http://identifiers.org/biomodels.sbo/SBO:0000019" + ] participations.append(modifier_participation) - # Inform topology to PyDNA, if not found assuming linear. + # Inform topology to PyDNA, if not found assuming linear. if is_circular(reactant_component_definition): - circular=True - linear=False - else: - circular=False - linear=True - + circular = True + linear = False + else: + circular = False + linear = True + reactant_seq = reactant_component_definition.sequences[0] reactant_seq = document.getSequence(reactant_seq).elements # Dseqrecord is from PyDNA package with reactant sequence ds_reactant = Dseqrecord(reactant_seq, circular=circular) - digested_reactant = ds_reactant.cut(restriction_enzymes_pydna) #TODO see if ds_reactant.cut is working, causing problems downstream - - - if len(digested_reactant)<2 or len(digested_reactant)>3: - raise ValueError(f'Not supported number of products. Found{len(digested_reactant)}') - #TODO select them based on content rather than size. - elif circular and len(digested_reactant)==2: + digested_reactant = ds_reactant.cut( + restriction_enzymes_pydna + ) # TODO see if ds_reactant.cut is working, causing problems downstream + + if len(digested_reactant) < 2 or len(digested_reactant) > 3: + raise ValueError( + f"Not supported number of products. Found{len(digested_reactant)}" + ) + # TODO select them based on content rather than size. + elif circular and len(digested_reactant) == 2: part_extract, backbone = sorted(digested_reactant, key=len) - elif linear and len(digested_reactant)==3: + elif linear and len(digested_reactant) == 3: prefix, part_extract, suffix = digested_reactant - else: raise ValueError('The reactant has no valid topology type') + else: + raise ValueError("The reactant has no valid topology type") # Compute the length of single strand sticky ends or fusion sites - product_5_prime_ss_strand, product_5_prime_ss_end = part_extract.seq.five_prime_end() - product_3_prime_ss_strand, product_3_prime_ss_end = part_extract.seq.three_prime_end() + product_5_prime_ss_strand, product_5_prime_ss_end = ( + part_extract.seq.five_prime_end() + ) + product_3_prime_ss_strand, product_3_prime_ss_end = ( + part_extract.seq.three_prime_end() + ) product_sequence = str(part_extract.seq) - prod_component_definition, prod_seq = dna_componentdefinition_with_sequence(identity=f'{reactant.functionalComponents[0].displayId}_extracted_part', sequence=product_sequence, **kwargs) + prod_component_definition, prod_seq = dna_componentdefinition_with_sequence( + identity=f"{reactant.functionalComponents[0].displayId}_extracted_part", + sequence=product_sequence, + **kwargs, + ) prod_component_definition.wasDerivedFrom = reactant_component_definition.identity extracts_list.append((prod_component_definition, prod_seq)) # five prime overhang - five_prime_oh_definition = sbol2.ComponentDefinition(uri=f"{reactant_displayId}_five_prime_oh") # TODO: ensure circular type is preserved for sbh visualization - five_prime_oh_definition.addRole('http://identifiers.org/so/SO:0001932') - five_prime_oh_location = sbol2.Range(uri="five_prime_oh_location", start=1, end=len(product_5_prime_ss_end)) - five_prime_oh_component = sbol2.Component(uri=f"{reactant_displayId}_five_prime_oh_component") + five_prime_oh_definition = sbol2.ComponentDefinition( + uri=f"{reactant_displayId}_five_prime_oh" + ) # TODO: ensure circular type is preserved for sbh visualization + five_prime_oh_definition.addRole("http://identifiers.org/so/SO:0001932") + five_prime_oh_location = sbol2.Range( + uri="five_prime_oh_location", start=1, end=len(product_5_prime_ss_end) + ) + five_prime_oh_component = sbol2.Component( + uri=f"{reactant_displayId}_five_prime_oh_component" + ) five_prime_oh_component.definition = five_prime_oh_definition five_prime_overhang_annotation = sbol2.SequenceAnnotation(uri="five_prime_overhang") five_prime_overhang_annotation.locations.add(five_prime_oh_location) # extracted part => point straight to part from sbolcanvas - part_location = sbol2.Range(uri=f"{reactant_displayId}_part_location", start=len(product_5_prime_ss_end)+1, end=len(product_sequence)-len(product_3_prime_ss_end)) + part_location = sbol2.Range( + uri=f"{reactant_displayId}_part_location", + start=len(product_5_prime_ss_end) + 1, + end=len(product_sequence) - len(product_3_prime_ss_end), + ) part_extract_annotation = sbol2.SequenceAnnotation(uri=f"{reactant_displayId}_part") part_extract_annotation.locations.add(part_location) # three prime overhang - three_prime_oh_definition = sbol2.ComponentDefinition(uri=f"{reactant_displayId}_three_prime_oh") - three_prime_oh_definition.addRole('http://identifiers.org/so/SO:0001933') - three_prime_oh_location = sbol2.Range(uri="three_prime_oh_location", start=len(product_sequence)-len(product_3_prime_ss_end)+1, end=len(product_sequence)) - three_prime_oh_component = sbol2.Component(uri=f"{reactant_displayId}_three_prime_oh_component") + three_prime_oh_definition = sbol2.ComponentDefinition( + uri=f"{reactant_displayId}_three_prime_oh" + ) + three_prime_oh_definition.addRole("http://identifiers.org/so/SO:0001933") + three_prime_oh_location = sbol2.Range( + uri="three_prime_oh_location", + start=len(product_sequence) - len(product_3_prime_ss_end) + 1, + end=len(product_sequence), + ) + three_prime_oh_component = sbol2.Component( + uri=f"{reactant_displayId}_three_prime_oh_component" + ) three_prime_oh_component.definition = three_prime_oh_definition - three_prime_overhang_annotation = sbol2.SequenceAnnotation(uri="three_prime_overhang") + three_prime_overhang_annotation = sbol2.SequenceAnnotation( + uri="three_prime_overhang" + ) three_prime_overhang_annotation.locations.add(three_prime_oh_location) - prod_component_definition.components = [five_prime_oh_component, three_prime_oh_component] + prod_component_definition.components = [ + five_prime_oh_component, + three_prime_oh_component, + ] three_prime_overhang_annotation.component = three_prime_oh_component five_prime_overhang_annotation.component = five_prime_oh_component original_part_def_URI = "" - #enccode ontologies of overhangs + # enccode ontologies of overhangs for definition in document.componentDefinitions: for seqURI in definition.sequences: seq = document.getSequence(seqURI) if seq.elements.lower() == Seq(product_3_prime_ss_end).reverse_complement(): three_prime_oh_definition.wasDerivedFrom = definition.identity - three_prime_sequence = sbol2.Sequence(uri=f"{three_prime_oh_definition.displayId}_sequence", elements= seq.elements) + three_prime_sequence = sbol2.Sequence( + uri=f"{three_prime_oh_definition.displayId}_sequence", + elements=seq.elements, + ) three_prime_sequence.wasDerivedFrom = seq.identity three_prime_oh_definition.sequences = [three_prime_sequence] - three_prime_oh_definition.types.append("http://identifiers.org/so/SO:0000984") # single-stranded for overhangs - + three_prime_oh_definition.types.append( + "http://identifiers.org/so/SO:0000984" + ) # single-stranded for overhangs + extracts_list.append((three_prime_oh_definition, three_prime_sequence)) - extracts_list.append((definition, seq)) #add scars to list + extracts_list.append((definition, seq)) # add scars to list - elif seq.elements.lower() == product_sequence[4:-4]: + elif seq.elements.lower() == product_sequence[4:-4]: original_part_def_URI = definition.identity extracts_list.append((definition, seq)) elif seq.elements.lower() == product_5_prime_ss_end: five_prime_oh_definition.wasDerivedFrom = definition.identity - five_prime_sequence = sbol2.Sequence(uri=f"{five_prime_oh_definition.displayId}_sequence", elements= seq.elements) + five_prime_sequence = sbol2.Sequence( + uri=f"{five_prime_oh_definition.displayId}_sequence", + elements=seq.elements, + ) five_prime_sequence.wasDerivedFrom = seq.identity five_prime_oh_definition.sequences = [five_prime_sequence] - five_prime_oh_definition.types.append("http://identifiers.org/so/SO:0000984") # single-stranded for overhangs + five_prime_oh_definition.types.append( + "http://identifiers.org/so/SO:0000984" + ) # single-stranded for overhangs extracts_list.append((five_prime_oh_definition, five_prime_sequence)) extracts_list.append((definition, seq)) - #find + add original component to product def & annotation - for comp in reactant_component_definition.components: + # find + add original component to product def & annotation + for comp in reactant_component_definition.components: if comp.definition == original_part_def_URI: prod_component_definition.components.add(comp) part_extract_annotation.component = comp @@ -276,10 +396,12 @@ def part_digestion(reactant:sbol2.ModuleDefinition, restriction_enzymes:List[sbo prod_component_definition.sequenceAnnotations.add(three_prime_overhang_annotation) prod_component_definition.sequenceAnnotations.add(five_prime_overhang_annotation) prod_component_definition.sequenceAnnotations.add(part_extract_annotation) - prod_component_definition.addRole('https://identifiers.org/so/SO:0000915') #engineered insert - prod_component_definition.addType('http://identifiers.org/so/SO:0000987') #linear + prod_component_definition.addRole( + "https://identifiers.org/so/SO:0000915" + ) # engineered insert + prod_component_definition.addType("http://identifiers.org/so/SO:0000987") # linear - #Add reference to part in backbone + # Add reference to part in backbone reactant_component = sbol2.FunctionalComponent(uri=f"{reactant_displayId}_reactant") reactant_component.definition = reactant_component_definition assembly_plan.functionalComponents.add(reactant_component) @@ -289,8 +411,10 @@ def part_digestion(reactant:sbol2.ModuleDefinition, restriction_enzymes:List[sbo reactant_participation.participant = reactant_component reactant_participation.roles = [sbol2.SBO_REACTANT] participations.append(reactant_participation) - - prod_component = sbol2.FunctionalComponent(uri=f"{reactant_displayId}_digestion_product") + + prod_component = sbol2.FunctionalComponent( + uri=f"{reactant_displayId}_digestion_product" + ) prod_component.definition = prod_component_definition assembly_plan.functionalComponents.add(prod_component) @@ -298,40 +422,64 @@ def part_digestion(reactant:sbol2.ModuleDefinition, restriction_enzymes:List[sbo product_participation.participant = prod_component product_participation.roles = [sbol2.SBO_PRODUCT] participations.append(product_participation) - + # Make Interaction - interaction = sbol2.Interaction(uri=f"{reactant_displayId}_digestion_interaction", interaction_type='http://identifiers.org/biomodels.sbo/SBO:0000178') + interaction = sbol2.Interaction( + uri=f"{reactant_displayId}_digestion_interaction", + interaction_type="http://identifiers.org/biomodels.sbo/SBO:0000178", + ) interaction.participations = participations assembly_plan.interactions.add(interaction) - + return extracts_list, assembly_plan -def backbone_digestion(reactant:sbol2.ModuleDefinition, restriction_enzymes:List[sbol2.ComponentDefinition], assembly_plan:sbol2.ModuleDefinition, document: sbol2.Document, **kwargs)-> Tuple[List[Tuple[sbol2.ComponentDefinition, sbol2.Sequence]], sbol2.ModuleDefinition]: - """Runs a simulated digestion on the top level sequence in the reactant ModuleDefinition with the given restriciton enzymes, creating an open backbone ComponentDefinition, a digestion Interaction, and converts existing scars to 5' and 3' overhangs. + +def backbone_digestion( + reactant: Union[sbol2.ComponentDefinition, sbol2.ModuleDefinition], + restriction_enzymes: List[sbol2.ComponentDefinition], + assembly_plan: sbol2.ModuleDefinition, + document: sbol2.Document, + **kwargs, +) -> Tuple[ + List[Tuple[sbol2.ComponentDefinition, sbol2.Sequence]], sbol2.ModuleDefinition +]: + """Runs a simulated digestion on the top level sequence in the reactant ComponentDefinition or ModuleDefinition with the given restriciton enzymes, creating an open backbone ComponentDefinition, a digestion Interaction, and converts existing scars to 5' and 3' overhangs. The product ComponentDefinition is assumed the open backbone in this case. Written for use with the SBOL2.3 output of https://sbolcanvas.org - :param reactant: DNA to be digested as SBOL ModuleDefinition, usually a part_in_backbone. + :param reactant: DNA to be digested as SBOL ComponentDefinition or ModuleDefinition, usually a part_in_backbone. ComponentDefinition is the best-practice type for plasmids. :param restriction_enzymes: Restriction enzymes as :class:`sbol2.ComponentDefinition` (generate with :func:`rebase_restriction_enzyme`). :param assembly_plan: SBOL ModuleDefinition to contain the functional components, interactions, and participations :param document: original SBOL2 document to be used to extract referenced objects. :return: A tuple of a list ComponentDefinitions and Sequences, and an assembly plan ModuleDefinition. """ - # extract component definition from module - reactant_displayId = reactant.functionalComponents[0].displayId - reactant_def_URI = reactant.functionalComponents[0].definition - reactant_component_definition = document.getComponentDefinition(reactant_def_URI) + if type(reactant) is sbol2.ModuleDefinition: + # extract component definition from module + reactant_displayId = reactant.functionalComponents[0].displayId + reactant_def_URI = reactant.functionalComponents[0].definition + reactant_component_definition = document.getComponentDefinition( + reactant_def_URI + ) + else: + reactant_displayId = reactant.displayId + reactant_component_definition = reactant if sbol2.BIOPAX_DNA not in reactant_component_definition.types: - raise TypeError(f'The reactant should has a DNA type. Types founded {reactant.types}.') - if len(reactant_component_definition.sequences)!=1: # TODO review if true for MD, maybe for MD it will be 5 - raise ValueError(f'The reactant needs to have precisely one sequence. The input reactant has {len(reactant.sequences)} sequences') - participations=[] - extracts_list=[] - restriction_enzymes_pydna=[] - + raise TypeError( + f"The reactant should has a DNA type. Types founded {reactant.types}." + ) + if ( + len(reactant_component_definition.sequences) != 1 + ): # TODO review if true for MD, maybe for MD it will be 5 + raise ValueError( + f"The reactant needs to have precisely one sequence. The input reactant has {len(reactant.sequences)} sequences" + ) + participations = [] + extracts_list = [] + restriction_enzymes_pydna = [] + for re in restriction_enzymes: enzyme = Restriction.__dict__[re.name] restriction_enzymes_pydna.append(enzyme) @@ -342,112 +490,159 @@ def backbone_digestion(reactant:sbol2.ModuleDefinition, restriction_enzymes:List enzyme_in_module = False for comp in assembly_plan.functionalComponents: - if (comp.displayId == enzyme_component.displayID): + if comp.displayId == enzyme_component.displayID: enzyme_component = comp enzyme_in_module = True if not enzyme_in_module: assembly_plan.functionalComponents.add(enzyme_component) - - modifier_participation = sbol2.Participation(uri='restriction') + + modifier_participation = sbol2.Participation(uri="restriction") modifier_participation.participant = enzyme_component - modifier_participation.roles = ['http://identifiers.org/biomodels.sbo/SBO:0000019'] # modifier + modifier_participation.roles = [ + "http://identifiers.org/biomodels.sbo/SBO:0000019" + ] # modifier participations.append(modifier_participation) - # Inform topology to PyDNA, if not found assuming linear. + # Inform topology to PyDNA, if not found assuming linear. if is_circular(reactant_component_definition): - circular=True - linear=False - else: - circular=False - linear=True - + circular = True + linear = False + else: + circular = False + linear = True + reactant_seq = reactant_component_definition.sequences[0] reactant_seq = document.getSequence(reactant_seq).elements # Dseqrecord is from PyDNA package with reactant sequence ds_reactant = Dseqrecord(reactant_seq, circular=circular) - digested_reactant = ds_reactant.cut(restriction_enzymes_pydna) #TODO see if ds_reactant.cut is working, causing problems downstream - - - if len(digested_reactant)<2 or len(digested_reactant)>3: - raise ValueError(f'Not supported number of products. Found{len(digested_reactant)}') #TODO make more specific for buildplanner - #TODO select them based on content rather than size. - elif circular and len(digested_reactant)==2: + digested_reactant = ds_reactant.cut( + restriction_enzymes_pydna + ) # TODO see if ds_reactant.cut is working, causing problems downstream + + if len(digested_reactant) < 2 or len(digested_reactant) > 3: + raise ValueError( + f"Not supported number of products. Found{len(digested_reactant)}" + ) # TODO make more specific for buildplanner + # TODO select them based on content rather than size. + elif circular and len(digested_reactant) == 2: part_extract, backbone = sorted(digested_reactant, key=len) - elif linear and len(digested_reactant)==3: + elif linear and len(digested_reactant) == 3: prefix, part_extract, suffix = digested_reactant - else: raise ValueError('The reactant has no valid topology type') + else: + raise ValueError("The reactant has no valid topology type") # Compute the length of single strand sticky ends or fusion sites product_5_prime_ss_strand, product_5_prime_ss_end = backbone.seq.five_prime_end() product_3_prime_ss_strand, product_3_prime_ss_end = backbone.seq.three_prime_end() product_sequence = str(backbone.seq) - prod_backbone_definition, prod_seq = dna_componentdefinition_with_sequence(identity=f'{reactant_component_definition.displayId}_extracted_backbone', sequence=product_sequence, **kwargs) + prod_backbone_definition, prod_seq = dna_componentdefinition_with_sequence( + identity=f"{reactant_component_definition.displayId}_extracted_backbone", + sequence=product_sequence, + **kwargs, + ) prod_backbone_definition.wasDerivedFrom = reactant_component_definition.identity extracts_list.append((prod_backbone_definition, prod_seq)) # five prime overhang - five_prime_oh_definition = sbol2.ComponentDefinition(uri=f"{reactant_displayId}_five_prime_oh") # TODO: ensure circular type is preserved for sbh visualization - five_prime_oh_definition.addRole('http://identifiers.org/so/SO:0001932') #overhang 5 prime - five_prime_oh_location = sbol2.Range(uri="five_prime_oh_location", start=1, end=len(product_5_prime_ss_end)) - five_prime_oh_component = sbol2.Component(uri=f"{reactant_displayId}_five_prime_oh_component") + five_prime_oh_definition = sbol2.ComponentDefinition( + uri=f"{reactant_displayId}_five_prime_oh" + ) # TODO: ensure circular type is preserved for sbh visualization + five_prime_oh_definition.addRole( + "http://identifiers.org/so/SO:0001932" + ) # overhang 5 prime + five_prime_oh_location = sbol2.Range( + uri="five_prime_oh_location", start=1, end=len(product_5_prime_ss_end) + ) + five_prime_oh_component = sbol2.Component( + uri=f"{reactant_displayId}_five_prime_oh_component" + ) five_prime_oh_component.definition = five_prime_oh_definition five_prime_overhang_annotation = sbol2.SequenceAnnotation(uri="five_prime_overhang") five_prime_overhang_annotation.locations.add(five_prime_oh_location) # extracted backbone => point straight to backbone from sbolcanvas - backbone_location = sbol2.Range(uri=f"{reactant_displayId}_backbone_location", start=len(product_5_prime_ss_end)+1, end=len(product_sequence)-len(product_3_prime_ss_end)) - backbone_extract_annotation = sbol2.SequenceAnnotation(uri=f"{reactant_displayId}_backbone") + backbone_location = sbol2.Range( + uri=f"{reactant_displayId}_backbone_location", + start=len(product_5_prime_ss_end) + 1, + end=len(product_sequence) - len(product_3_prime_ss_end), + ) + backbone_extract_annotation = sbol2.SequenceAnnotation( + uri=f"{reactant_displayId}_backbone" + ) backbone_extract_annotation.locations.add(backbone_location) - + # three prime overhang - three_prime_oh_definition = sbol2.ComponentDefinition(uri=f"{reactant_displayId}_three_prime_oh") - three_prime_oh_definition.addRole('http://identifiers.org/so/SO:0001933') #overhang 3 prime - three_prime_oh_location = sbol2.Range(uri="three_prime_oh_location", start=len(product_sequence)-len(product_3_prime_ss_end)+1, end=len(product_sequence)) - three_prime_oh_component = sbol2.Component(uri=f"{reactant_displayId}_three_prime_oh_component") + three_prime_oh_definition = sbol2.ComponentDefinition( + uri=f"{reactant_displayId}_three_prime_oh" + ) + three_prime_oh_definition.addRole( + "http://identifiers.org/so/SO:0001933" + ) # overhang 3 prime + three_prime_oh_location = sbol2.Range( + uri="three_prime_oh_location", + start=len(product_sequence) - len(product_3_prime_ss_end) + 1, + end=len(product_sequence), + ) + three_prime_oh_component = sbol2.Component( + uri=f"{reactant_displayId}_three_prime_oh_component" + ) three_prime_oh_component.definition = three_prime_oh_definition - three_prime_overhang_annotation = sbol2.SequenceAnnotation(uri="three_prime_overhang") + three_prime_overhang_annotation = sbol2.SequenceAnnotation( + uri="three_prime_overhang" + ) three_prime_overhang_annotation.locations.add(three_prime_oh_location) - anno_component_dict = {} - - prod_backbone_definition.components = [five_prime_oh_component, three_prime_oh_component] + prod_backbone_definition.components = [ + five_prime_oh_component, + three_prime_oh_component, + ] three_prime_overhang_annotation.component = three_prime_oh_component five_prime_overhang_annotation.component = five_prime_oh_component # check these lines original_backbone_def_URI = "" - #enccode ontologies of overhangs + # enccode ontologies of overhangs for definition in document.componentDefinitions: for seqURI in definition.sequences: seq = document.getSequence(seqURI) if seq.elements.lower() == Seq(product_3_prime_ss_end).reverse_complement(): three_prime_oh_definition.wasDerivedFrom = definition.identity - three_prime_sequence = sbol2.Sequence(uri=f"{three_prime_oh_definition.displayId}_sequence", elements= seq.elements) + three_prime_sequence = sbol2.Sequence( + uri=f"{three_prime_oh_definition.displayId}_sequence", + elements=seq.elements, + ) three_prime_sequence.wasDerivedFrom = seq.identity three_prime_oh_definition.sequences = [three_prime_sequence] - three_prime_oh_definition.types.append("http://identifiers.org/so/SO:0000984") # single-stranded for overhangs - + three_prime_oh_definition.types.append( + "http://identifiers.org/so/SO:0000984" + ) # single-stranded for overhangs + extracts_list.append((three_prime_oh_definition, three_prime_sequence)) - extracts_list.append((definition, seq)) #add scars to list + extracts_list.append((definition, seq)) # add scars to list - elif seq.elements.lower() == product_sequence[4:-4]: + elif seq.elements.lower() == product_sequence[4:-4]: original_backbone_def_URI = definition.identity extracts_list.append((definition, seq)) elif seq.elements.lower() == product_5_prime_ss_end: five_prime_oh_definition.wasDerivedFrom = definition.identity - five_prime_sequence = sbol2.Sequence(uri=f"{five_prime_oh_definition.displayId}_sequence", elements= seq.elements) + five_prime_sequence = sbol2.Sequence( + uri=f"{five_prime_oh_definition.displayId}_sequence", + elements=seq.elements, + ) five_prime_sequence.wasDerivedFrom = seq.identity five_prime_oh_definition.sequences = [five_prime_sequence] - five_prime_oh_definition.types.append("http://identifiers.org/so/SO:0000984") # single-stranded for overhangs + five_prime_oh_definition.types.append( + "http://identifiers.org/so/SO:0000984" + ) # single-stranded for overhangs extracts_list.append((five_prime_oh_definition, five_prime_sequence)) extracts_list.append((definition, seq)) - #find + add original component to product def & annotation - for comp in reactant_component_definition.components: + # find + add original component to product def & annotation + for comp in reactant_component_definition.components: if comp.definition == original_backbone_def_URI: prod_backbone_definition.components.add(comp) backbone_extract_annotation.component = comp @@ -455,35 +650,47 @@ def backbone_digestion(reactant:sbol2.ModuleDefinition, restriction_enzymes:List prod_backbone_definition.sequenceAnnotations.add(three_prime_overhang_annotation) prod_backbone_definition.sequenceAnnotations.add(five_prime_overhang_annotation) prod_backbone_definition.sequenceAnnotations.add(backbone_extract_annotation) - prod_backbone_definition.addRole('https://identifiers.org/so/SO:0000755') + prod_backbone_definition.addRole("https://identifiers.org/so/SO:0000755") - #Add reference to part in backbone - reactant_component = sbol2.FunctionalComponent(uri=f'{reactant_component_definition.displayId}_backbone_reactant') + # Add reference to part in backbone + reactant_component = sbol2.FunctionalComponent( + uri=f"{reactant_component_definition.displayId}_backbone_reactant" + ) reactant_component.definition = reactant_component_definition assembly_plan.functionalComponents.add(reactant_component) # Create reactant Participation. - reactant_participation = sbol2.Participation(uri=f'{reactant_component_definition.displayId}_backbone_reactant') + reactant_participation = sbol2.Participation( + uri=f"{reactant_component_definition.displayId}_backbone_reactant" + ) reactant_participation.participant = reactant_component reactant_participation.roles = [sbol2.SBO_REACTANT] participations.append(reactant_participation) - - prod_component = sbol2.FunctionalComponent(uri=f'{reactant_component_definition.displayId}_backbone_digestion_product') + + prod_component = sbol2.FunctionalComponent( + uri=f"{reactant_component_definition.displayId}_backbone_digestion_product" + ) prod_component.definition = prod_backbone_definition assembly_plan.functionalComponents.add(prod_component) - product_participation = sbol2.Participation(uri=f'{reactant_component_definition.displayId}_backbone_product') + product_participation = sbol2.Participation( + uri=f"{reactant_component_definition.displayId}_backbone_product" + ) product_participation.participant = prod_component product_participation.roles = [sbol2.SBO_PRODUCT] participations.append(product_participation) - + # Make Interaction - interaction = sbol2.Interaction(uri=f"{reactant_component_definition.displayId}_digestion_interaction", interaction_type='http://identifiers.org/biomodels.sbo/SBO:0000178') + interaction = sbol2.Interaction( + uri=f"{reactant_component_definition.displayId}_digestion_interaction", + interaction_type="http://identifiers.org/biomodels.sbo/SBO:0000178", + ) interaction.participations = participations assembly_plan.interactions.add(interaction) - + return extracts_list, assembly_plan + def number_to_suffix(n): """Helper function for generating scar suffixes of the form: :math:`S=(A,B,C,…,Z,AA,AB,AC,…,AZ,BA,BB,…, S_n)` @@ -492,22 +699,28 @@ def number_to_suffix(n): """ suffix = "" while n > 0: - n -= 1 - remainder = n % 26 - suffix = chr(ord('A') + remainder) + suffix - n = n // 26 + n -= 1 + remainder = n % 26 + suffix = chr(ord("A") + remainder) + suffix + n = n // 26 return suffix -def ligation(reactants:List[sbol2.ComponentDefinition], assembly_plan: sbol2.ModuleDefinition, document: sbol2.Document, ligase: sbol2.ComponentDefinition=None)->List[Tuple[sbol2.ComponentDefinition, sbol2.Sequence]]: + +def ligation( + reactants: List[sbol2.ComponentDefinition], + assembly_plan: sbol2.ModuleDefinition, + document: sbol2.Document, + ligase: sbol2.ComponentDefinition = None, +) -> List[Tuple[sbol2.ComponentDefinition, sbol2.Sequence]]: """Ligates Components using base complementarity and creates product Components and a ligation Interaction. - :param reactants: DNA parts to be ligated as SBOL ModuleDefinition. + :param reactants: DNA parts to be ligated as SBOL ModuleDefinition. :param assembly_plan: SBOL ModuleDefinition to contain the functional components, interactions, and participants :param document: SBOL2 document containing all reactant ComponentDefinitions. :param ligase: as SBOL ComponentDefinition, optional (defaults to T4 ligase) :return: List of all composites generated, in the form of tuples of ComponentDefinition and Sequence. """ - if ligase == None: + if ligase is None: ligase = sbol2.ComponentDefinition(uri="T4_Ligase") ligase.name = "T4_Ligase" ligase.types = sbol2.BIOPAX_PROTEIN @@ -518,73 +731,112 @@ def ligation(reactants:List[sbol2.ComponentDefinition], assembly_plan: sbol2.Mod ligase_component.roles = ["http://identifiers.org/ncit/NCIT:C16796"] assembly_plan.functionalComponents.add(ligase_component) - modifier_participation = sbol2.Participation(uri='ligation') + modifier_participation = sbol2.Participation(uri="ligation") modifier_participation.participant = ligase_component - modifier_participation.roles = ['http://identifiers.org/biomodels.sbo/SBO:0000019'] # modifier + modifier_participation.roles = [ + "http://identifiers.org/biomodels.sbo/SBO:0000019" + ] # modifier # Create a dictionary that maps each first and last 4 letters to a list of strings that have those letters. reactant_parts = [] fusion_sites_set = set() for reactant in reactants: - fusion_site_3prime_length = reactant.sequenceAnnotations[0].locations[0].end - reactant.sequenceAnnotations[0].locations[0].start - fusion_site_5prime_length = reactant.sequenceAnnotations[1].locations[0].end - reactant.sequenceAnnotations[1].locations[0].start + fusion_site_3prime_length = ( + reactant.sequenceAnnotations[0].locations[0].end + - reactant.sequenceAnnotations[0].locations[0].start + ) + fusion_site_5prime_length = ( + reactant.sequenceAnnotations[1].locations[0].end + - reactant.sequenceAnnotations[1].locations[0].start + ) if fusion_site_3prime_length == fusion_site_5prime_length: - fusion_site_length = fusion_site_3prime_length + 1 # if the fusion site is 4 bp long, the start will be 1 and end 4, 4-1 = 3, so we add 1 to get 4. + fusion_site_length = ( + fusion_site_3prime_length + 1 + ) # if the fusion site is 4 bp long, the start will be 1 and end 4, 4-1 = 3, so we add 1 to get 4. fusion_sites_set.add(fusion_site_length) if len(fusion_sites_set) > 1: - raise ValueError(f'Fusion sites of different length within different parts. Check {reactant.identity} ') + raise ValueError( + f"Fusion sites of different length within different parts. Check {reactant.identity} " + ) else: - raise ValueError(f'Fusion sites of different length within the same part. Check {reactant.identity}') - if 'https://identifiers.org/so/SO:0000755' in reactant.roles: + raise ValueError( + f"Fusion sites of different length within the same part. Check {reactant.identity}" + ) + if "https://identifiers.org/so/SO:0000755" in reactant.roles: reactant_parts.append(reactant) - elif 'https://identifiers.org/so/SO:0000915' in reactant.roles: + elif "https://identifiers.org/so/SO:0000915" in reactant.roles: reactant_parts.append(reactant) else: - raise ValueError(f'Part {reactant.identity} does not have a valid role') - + raise ValueError(f"Part {reactant.identity} does not have a valid role") + # remove the backbones if any from the reactants, to create the composite groups = {} for reactant in reactant_parts: reactant_seq = reactant.sequences[0] - first_four_letters = document.getSequence(reactant_seq).elements[:fusion_site_length].lower() - last_four_letters = document.getSequence(reactant_seq).elements[-fusion_site_length:].lower() - part_syntax = f'{first_four_letters}_{last_four_letters}' + first_four_letters = ( + document.getSequence(reactant_seq).elements[:fusion_site_length].lower() + ) + last_four_letters = ( + document.getSequence(reactant_seq).elements[-fusion_site_length:].lower() + ) + part_syntax = f"{first_four_letters}_{last_four_letters}" if part_syntax not in groups: groups[part_syntax] = [] groups[part_syntax].append(reactant) - else: groups[part_syntax].append(reactant) + else: + groups[part_syntax].append(reactant) # groups is a dictionary of lists of parts that have the same first and last 4 letters # list_of_combinations_per_assembly is a list of tuples of parts that can be ligated together - list_of_parts_per_combination = list(product(*groups.values())) #cartesian product + list_of_parts_per_combination = list(product(*groups.values())) # cartesian product # create list_of_composites_per_assembly from list_of_combinations_per_assembly list_of_composites_per_assembly = [] for combination in list_of_parts_per_combination: - list_of_parts_per_composite = [combination[0]] + list_of_parts_per_composite = [combination[0]] insert_sequence_uri = combination[0].sequences[0] insert_sequence = document.getSequence(insert_sequence_uri).elements remaining_parts = list(combination[1:]) it = 1 - while remaining_parts: - remaining_parts_before = len(remaining_parts) + while remaining_parts: + remaining_parts_before = len(remaining_parts) for part in remaining_parts: # match insert sequence 5' to part 3' part_sequence_uri = part.sequences[0] - if document.getSequence(part_sequence_uri).elements[:fusion_site_length].lower() == insert_sequence[-fusion_site_length:].lower(): - insert_sequence = insert_sequence[:-fusion_site_length] + document.getSequence(part_sequence_uri).elements - list_of_parts_per_composite.append(part) #add sequence annotation here, index based on insert_sequence + if ( + document.getSequence(part_sequence_uri) + .elements[:fusion_site_length] + .lower() + == insert_sequence[-fusion_site_length:].lower() + ): + insert_sequence = ( + insert_sequence[:-fusion_site_length] + + document.getSequence(part_sequence_uri).elements + ) + list_of_parts_per_composite.append( + part + ) # add sequence annotation here, index based on insert_sequence remaining_parts.remove(part) # match insert sequence 3' to part 5' - elif document.getSequence(part_sequence_uri).elements[-fusion_site_length:].lower() == insert_sequence[:fusion_site_length].lower(): - insert_sequence = document.getSequence(part_sequence_uri).elements + insert_sequence[fusion_site_length:] + elif ( + document.getSequence(part_sequence_uri) + .elements[-fusion_site_length:] + .lower() + == insert_sequence[:fusion_site_length].lower() + ): + insert_sequence = ( + document.getSequence(part_sequence_uri).elements + + insert_sequence[fusion_site_length:] + ) list_of_parts_per_composite.insert(0, part) remaining_parts.remove(part) remaining_parts_after = len(remaining_parts) - + if remaining_parts_before == remaining_parts_after: it += 1 - if it > 5: #5 was chosen arbitrarily to avoid infinite loops + if it > 5: # 5 was chosen arbitrarily to avoid infinite loops print(groups) - raise ValueError('No match found, check the parts and their fusion sites') + raise ValueError( + "No match found, check the parts and their fusion sites" + ) list_of_composites_per_assembly.append(list_of_parts_per_composite) # transform list_of_parts_per_assembly into list of composites @@ -594,11 +846,12 @@ def ligation(reactants:List[sbol2.ComponentDefinition], assembly_plan: sbol2.Mod participations.append(modifier_participation) # TODO: use componentinstances to append "subcomponents" to each definition that is a composite component. all composites share the "subcomponents" - for composite in list_of_composites_per_assembly: # a composite of the form [A,B,C] + for composite in list_of_composites_per_assembly: # a composite of the form [A,B,C] # calculate sequence composite_sequence_str = "" - composite_name = "" - prev_three_prime = composite[len(composite)-1].components[1].definition # componentdefinitionuri + prev_three_prime = ( + composite[len(composite) - 1].components[1].definition + ) # componentdefinitionuri prev_three_prime_definition = document.getComponentDefinition(prev_three_prime) scar_index = 1 anno_list = [] @@ -606,81 +859,126 @@ def ligation(reactants:List[sbol2.ComponentDefinition], assembly_plan: sbol2.Mod part_extract_definitions = [] for part_extract in composite: part_extract_sequence_uri = part_extract.sequences[0] - part_extract_sequence = document.getSequence(part_extract_sequence_uri).elements + part_extract_sequence = document.getSequence( + part_extract_sequence_uri + ).elements temp_extract_components = [] - reactant_component = sbol2.FunctionalComponent(uri=f"{part_extract.displayId}_reactant") - reactant_component.definition = part_extract # TODO do not make new components, instead derive product functionalcomponents from the assembly_plan moduledefinition to add to the ligation interaction/participation + reactant_component = sbol2.FunctionalComponent( + uri=f"{part_extract.displayId}_reactant" + ) + reactant_component.definition = part_extract # TODO do not make new components, instead derive product functionalcomponents from the assembly_plan moduledefinition to add to the ligation interaction/participation for fc in assembly_plan.functionalComponents: if fc.definition == reactant_component.definition: - reactant_component = fc + reactant_component = fc - reactant_participation = sbol2.Participation(uri=f'{part_extract.displayId}_ligation') + reactant_participation = sbol2.Participation( + uri=f"{part_extract.displayId}_ligation" + ) reactant_participation.participant = reactant_component reactant_participation.roles = [sbol2.SBO_REACTANT] participations.append(reactant_participation) for comp in part_extract.components: - if "http://identifiers.org/so/SO:0001932" in document.getComponentDefinition(comp.definition).roles: #five prime - scar_definition = sbol2.ComponentDefinition(uri=f"Ligation_Scar_{number_to_suffix(scar_index)}") - scar_sequence = sbol2.Sequence(uri=f"Ligation_Scar_{number_to_suffix(scar_index)}_sequence", elements=document.getSequence(prev_three_prime_definition.sequences[0]).elements) + if ( + "http://identifiers.org/so/SO:0001932" + in document.getComponentDefinition(comp.definition).roles + ): # five prime + scar_definition = sbol2.ComponentDefinition( + uri=f"Ligation_Scar_{number_to_suffix(scar_index)}" + ) + scar_sequence = sbol2.Sequence( + uri=f"Ligation_Scar_{number_to_suffix(scar_index)}_sequence", + elements=document.getSequence( + prev_three_prime_definition.sequences[0] + ).elements, + ) scar_definition.sequences = [scar_sequence] scar_definition.wasDerivedFrom = [comp.definition, prev_three_prime] scar_definition.roles = ["http://identifiers.org/so/SO:0001953"] temp_extract_components.append(scar_definition.identity) - + document.add(scar_definition) document.add(scar_sequence) - scar_location = sbol2.Range(uri=f"Ligation_Scar_{number_to_suffix(scar_index)}_location", start= len(composite_sequence_str)+1, end=len(composite_sequence_str)+fusion_site_length) - scar_anno = sbol2.SequenceAnnotation(uri=f"Ligation_Scar_{number_to_suffix(scar_index)}_annotation") + scar_location = sbol2.Range( + uri=f"Ligation_Scar_{number_to_suffix(scar_index)}_location", + start=len(composite_sequence_str) + 1, + end=len(composite_sequence_str) + fusion_site_length, + ) + scar_anno = sbol2.SequenceAnnotation( + uri=f"Ligation_Scar_{number_to_suffix(scar_index)}_annotation" + ) scar_anno.locations.add(scar_location) anno_list.append(scar_anno) scar_index += 1 - elif "http://identifiers.org/so/SO:0001933" in document.getComponentDefinition(comp.definition).roles: #three prime + elif ( + "http://identifiers.org/so/SO:0001933" + in document.getComponentDefinition(comp.definition).roles + ): # three prime prev_three_prime = comp.definition - prev_three_prime_definition = document.getComponentDefinition(prev_three_prime) + prev_three_prime_definition = document.getComponentDefinition( + prev_three_prime + ) else: temp_extract_components.append(comp.definition) - comp_location = sbol2.Range(uri=f"{comp.displayId}_location", start= len(composite_sequence_str)+fusion_site_length+1, end=len(composite_sequence_str)+len(part_extract_sequence[:-4])) #TODO check if seq len is correct - comp_anno = sbol2.SequenceAnnotation(uri=f"{comp.displayId}_annotation") + comp_location = sbol2.Range( + uri=f"{comp.displayId}_location", + start=len(composite_sequence_str) + fusion_site_length + 1, + end=len(composite_sequence_str) + + len(part_extract_sequence[:-4]), + ) # TODO check if seq len is correct + comp_anno = sbol2.SequenceAnnotation( + uri=f"{comp.displayId}_annotation" + ) comp_anno.locations.add(comp_location) anno_list.append(comp_anno) part_extract_definitions.extend(temp_extract_components) - composite_sequence_str = composite_sequence_str + part_extract_sequence[:-fusion_site_length] #needs a version for linear - + composite_sequence_str = ( + composite_sequence_str + part_extract_sequence[:-fusion_site_length] + ) # needs a version for linear # create dna component and sequence - composite_component_definition, composite_seq = dna_componentdefinition_with_sequence(f'composite_{composite_number}', composite_sequence_str) - composite_component_definition.name = f'composite_{composite_number}' - composite_component_definition.addRole('http://identifiers.org/so/SO:0000804') #engineered region - composite_component_definition.addType('http://identifiers.org/so/SO:0000988') - - part_extract_components = [] - + composite_component_definition, composite_seq = ( + dna_componentdefinition_with_sequence( + f"composite_{composite_number}", composite_sequence_str + ) + ) + composite_component_definition.name = f"composite_{composite_number}" + composite_component_definition.addRole( + "http://identifiers.org/so/SO:0000804" + ) # engineered region + composite_component_definition.addType("http://identifiers.org/so/SO:0000988") for i, definition in enumerate(part_extract_definitions): def_object = document.getComponentDefinition(definition) comp = sbol2.Component(uri=def_object.displayId) comp.definition = definition composite_component_definition.components.add(comp) - - anno_list[i].component = comp + + anno_list[i].component = comp composite_component_definition.sequenceAnnotations = anno_list - prod_functional_component = sbol2.FunctionalComponent(uri=f"{composite_component_definition.name}") + prod_functional_component = sbol2.FunctionalComponent( + uri=f"{composite_component_definition.name}" + ) prod_functional_component.definition = composite_component_definition assembly_plan.functionalComponents.add(prod_functional_component) - product_participation = sbol2.Participation(uri=f"{composite_component_definition.name}_product") + product_participation = sbol2.Participation( + uri=f"{composite_component_definition.name}_product" + ) product_participation.participant = prod_functional_component product_participation.roles = [sbol2.SBO_PRODUCT] participations.append(product_participation) - + # Make Interaction - interaction = sbol2.Interaction(uri=f"{composite_component_definition.name}_ligation_interaction", interaction_type='http://identifiers.org/biomodels.sbo/SBO:0000695') + interaction = sbol2.Interaction( + uri=f"{composite_component_definition.name}_ligation_interaction", + interaction_type="http://identifiers.org/biomodels.sbo/SBO:0000695", + ) interaction.participations = participations assembly_plan.interactions.add(interaction) @@ -688,7 +986,11 @@ def ligation(reactants:List[sbol2.ComponentDefinition], assembly_plan: sbol2.Mod composite_number += 1 return products_list -def append_extracts_to_doc(extract_tuples: List[Tuple[sbol2.ComponentDefinition, sbol2.Sequence]], doc: sbol2.Document): + +def append_extracts_to_doc( + extract_tuples: List[Tuple[sbol2.ComponentDefinition, sbol2.Sequence]], + doc: sbol2.Document, +): """Helper function for batch adding :class:`sbol2.ComponentDefinition` and :class:`sbol2.Sequence` to an :class:`sbol2.Document` :param extract_tuples: list of tuples of :class:`sbol2.ComponentDefinition` and :class:`sbol2.Sequence` @@ -699,27 +1001,36 @@ def append_extracts_to_doc(extract_tuples: List[Tuple[sbol2.ComponentDefinition, print("adding: " + extract.displayId) doc.add(extract) doc.add(sequence) - except Exception as e: - if '' in str(e): + except Exception as e: + if "" in str(e): pass else: raise e -class golden_gate_assembly_plan(): + +class golden_gate_assembly_plan: """Creates an Assembly Plan. :param name: Name of the assembly plan ModuleDefinition. - :param parts_in_backbone: Parts in backbone to be assembled. - :param plasmid_acceptor_backbone: Backbone in which parts are inserted on the assembly. + :param parts_in_backbone: Parts in backbone to be assembled. + :param plasmid_acceptor_backbone: Backbone in which parts are inserted on the assembly. :param restriction_enzyme: Restriction enzyme name used by PyDNA. Case sensitive, follow standard restriction enzyme nomenclature, i.e. 'BsaI' :param document: SBOL Document where the assembly plan will be created. """ - def __init__(self, name: str, parts_in_backbone: List[sbol2.Document], plasmid_acceptor_backbone: sbol2.Document, restriction_enzyme: str, document: sbol2.Document): + + def __init__( + self, + name: str, + parts_in_backbone: List[sbol2.Document], + plasmid_acceptor_backbone: sbol2.Document, + restriction_enzyme: str, + document: sbol2.Document, + ): self.name = name self.parts_in_backbone = parts_in_backbone self.backbone = plasmid_acceptor_backbone self.restriction_enzyme = rebase_restriction_enzyme(restriction_enzyme) - self.extracted_parts = [] #list of tuples [ComponentDefinition, Sequence] + self.extracted_parts = [] # list of tuples [ComponentDefinition, Sequence] self.document = document self.assembly_plan = sbol2.ModuleDefinition(name) @@ -731,25 +1042,33 @@ def run(self) -> List[Tuple[sbol2.ComponentDefinition, sbol2.Sequence]]: """Runs full assembly simulation. `document` parameter of golden_gate_assembly_plan object is updated by reference to include assembly plan ModuleDefinition and all related information. - - Runs :func:`part_digestion` for all `parts_in_backbone` and :func:`backbone_digestion` for `plasmid_acceptor_backbone` with `restriction_enzyme`. Then runs :func:`ligation` with these parts to form composites. + + Runs :func:`part_digestion` for all `parts_in_backbone` and :func:`backbone_digestion` for `plasmid_acceptor_backbone` with `restriction_enzyme`. Then runs :func:`ligation` with these parts to form composites. :return: List of all composites generated, in the form of tuples of ComponentDefinition and Sequence. """ for part_doc in self.parts_in_backbone: - md = part_doc.getModuleDefinition('https://sbolcanvas.org/module1') #change to toplevel or some other index? - extracts_tuple_list, _ = part_digestion(md, [self.restriction_enzyme], self.assembly_plan, part_doc) #make sure assembly plan is pass-by-reference + md = part_doc.getModuleDefinition( + "https://sbolcanvas.org/module1" + ) # change to toplevel or some other index? + extracts_tuple_list, _ = part_digestion( + md, [self.restriction_enzyme], self.assembly_plan, part_doc + ) # make sure assembly plan is pass-by-reference append_extracts_to_doc(extracts_tuple_list, self.document) self.extracted_parts.append(extracts_tuple_list[0][0]) - md = self.backbone.getModuleDefinition('https://sbolcanvas.org/module1') - extracts_tuple_list, _ = backbone_digestion(md, [self.restriction_enzyme], self.assembly_plan, self.backbone) - + md = self.backbone.getModuleDefinition("https://sbolcanvas.org/module1") + extracts_tuple_list, _ = backbone_digestion( + md, [self.restriction_enzyme], self.assembly_plan, self.backbone + ) + append_extracts_to_doc(extracts_tuple_list, self.document) self.extracted_parts.append(extracts_tuple_list[0][0]) - self.composites = ligation(self.extracted_parts, self.assembly_plan, self.document) + self.composites = ligation( + self.extracted_parts, self.assembly_plan, self.document + ) append_extracts_to_doc(self.composites, self.document) From 3d4340732a538ac26506cf5a3ebbfc1173325edf Mon Sep 17 00:00:00 2001 From: Ryan Greer Date: Mon, 13 Oct 2025 15:53:15 -0600 Subject: [PATCH 09/27] package build fix --- src/sbol2build/__init__.py | 1 + 1 file changed, 1 insertion(+) diff --git a/src/sbol2build/__init__.py b/src/sbol2build/__init__.py index e69de29..c31ac6d 100644 --- a/src/sbol2build/__init__.py +++ b/src/sbol2build/__init__.py @@ -0,0 +1 @@ +from .sbol2build import * # noqa: F403 From 78c64fb3174be701fa6b85e4173cd6fe06e3ec97 Mon Sep 17 00:00:00 2001 From: Ryan Greer Date: Tue, 14 Oct 2025 00:18:23 -0600 Subject: [PATCH 10/27] precommit, uv, and gitignore --- .gitignore | 32 + .pre-commit-config.yaml | 9 + pyproject.toml | 5 + uv.lock | 2370 +++++++++++++++++++++++++++++++++++++++ 4 files changed, 2416 insertions(+) create mode 100644 .gitignore create mode 100644 .pre-commit-config.yaml create mode 100644 uv.lock diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..d24e574 --- /dev/null +++ b/.gitignore @@ -0,0 +1,32 @@ + +.vscode/*.env +*.venv +.env +venv/ +__pycache__/ + +dist/ +build/ +*.egg-info/ +src/sbol2build.egg-info/ +docs/_build/ + +*.pyc +*.pyo +*.pyd +*.so +*.dll +*.o +*.a + +# --- Pre-commit / dependency management --- +# .pre-commit-config.yaml +# uv.lock + +notebooks/tutorial_notebook.ipynb +untracked_examples/ + +tests/__pycache__/ + +.DS_Store +Thumbs.db diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml new file mode 100644 index 0000000..e56bb19 --- /dev/null +++ b/.pre-commit-config.yaml @@ -0,0 +1,9 @@ +repos: + - repo: https://github.com/astral-sh/ruff-pre-commit + rev: v0.11.8 + hooks: + # Ruff Linter + - id: ruff + args: [ --fix ] + + - id: ruff-format \ No newline at end of file diff --git a/pyproject.toml b/pyproject.toml index 3191b7d..cb6c38b 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -38,3 +38,8 @@ test = [ [project.urls] "Homepage" = "https://github.com/MyersResearchGroup/SBOL2Build" "Bug Tracker" = "https://github.com/MyersResearchGroup/SBOL2Build/issues" + +[dependency-groups] +dev = [ + "ruff>=0.14.0", +] diff --git a/uv.lock b/uv.lock new file mode 100644 index 0000000..8309d65 --- /dev/null +++ b/uv.lock @@ -0,0 +1,2370 @@ +version = 1 +revision = 3 +requires-python = ">=3.7" +resolution-markers = [ + "python_full_version >= '3.12'", + "python_full_version == '3.11.*'", + "python_full_version == '3.10.*'", + "python_full_version == '3.9.*'", + "python_full_version >= '3.8.1' and python_full_version < '3.9'", + "python_full_version >= '3.8' and python_full_version < '3.8.1'", + "python_full_version < '3.8'", +] + +[[package]] +name = "appdirs" +version = "1.4.4" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/d7/d8/05696357e0311f5b5c316d7b95f46c669dd9c15aaeecbb48c7d0aeb88c40/appdirs-1.4.4.tar.gz", hash = "sha256:7d5d0167b2b1ba821647616af46a749d1c653740dd0d2415100fe26e27afdf41", size = 13470, upload-time = "2020-05-11T07:59:51.037Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/3b/00/2344469e2084fb287c2e0b57b72910309874c3245463acd6cf5e3db69324/appdirs-1.4.4-py2.py3-none-any.whl", hash = "sha256:a841dacd6b99318a741b166adb07e19ee71a274450e68237b4650ca1055ab128", size = 9566, upload-time = "2020-05-11T07:59:49.499Z" }, +] + +[[package]] +name = "atomicwrites" +version = "1.4.1" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/87/c6/53da25344e3e3a9c01095a89f16dbcda021c609ddb42dd6d7c0528236fb2/atomicwrites-1.4.1.tar.gz", hash = "sha256:81b2c9071a49367a7f770170e5eec8cb66567cfbbc8c73d20ce5ca4a8d71cf11", size = 14227, upload-time = "2022-07-08T18:31:40.459Z" } + +[[package]] +name = "attrs" +version = "24.2.0" +source = { registry = "https://pypi.org/simple" } +resolution-markers = [ + "python_full_version < '3.8'", +] +dependencies = [ + { name = "importlib-metadata", marker = "python_full_version < '3.8'" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/fc/0f/aafca9af9315aee06a89ffde799a10a582fe8de76c563ee80bbcdc08b3fb/attrs-24.2.0.tar.gz", hash = "sha256:5cfb1b9148b5b086569baec03f20d7b6bf3bcacc9a42bebf87ffaaca362f6346", size = 792678, upload-time = "2024-08-06T14:37:38.364Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/6a/21/5b6702a7f963e95456c0de2d495f67bf5fd62840ac655dc451586d23d39a/attrs-24.2.0-py3-none-any.whl", hash = "sha256:81921eb96de3191c8258c199618104dd27ac608d9366f5e35d011eae1867ede2", size = 63001, upload-time = "2024-08-06T14:37:36.958Z" }, +] + +[[package]] +name = "attrs" +version = "25.3.0" +source = { registry = "https://pypi.org/simple" } +resolution-markers = [ + "python_full_version >= '3.8.1' and python_full_version < '3.9'", + "python_full_version >= '3.8' and python_full_version < '3.8.1'", +] +sdist = { url = "https://files.pythonhosted.org/packages/5a/b0/1367933a8532ee6ff8d63537de4f1177af4bff9f3e829baf7331f595bb24/attrs-25.3.0.tar.gz", hash = "sha256:75d7cefc7fb576747b2c81b4442d4d4a1ce0900973527c011d1030fd3bf4af1b", size = 812032, upload-time = "2025-03-13T11:10:22.779Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/77/06/bb80f5f86020c4551da315d78b3ab75e8228f89f0162f2c3a819e407941a/attrs-25.3.0-py3-none-any.whl", hash = "sha256:427318ce031701fea540783410126f03899a97ffc6f61596ad581ac2e40e3bc3", size = 63815, upload-time = "2025-03-13T11:10:21.14Z" }, +] + +[[package]] +name = "attrs" +version = "25.4.0" +source = { registry = "https://pypi.org/simple" } +resolution-markers = [ + "python_full_version >= '3.12'", + "python_full_version == '3.11.*'", + "python_full_version == '3.10.*'", + "python_full_version == '3.9.*'", +] +sdist = { url = "https://files.pythonhosted.org/packages/6b/5c/685e6633917e101e5dcb62b9dd76946cbb57c26e133bae9e0cd36033c0a9/attrs-25.4.0.tar.gz", hash = "sha256:16d5969b87f0859ef33a48b35d55ac1be6e42ae49d5e853b597db70c35c57e11", size = 934251, upload-time = "2025-10-06T13:54:44.725Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/3a/2a/7cc015f5b9f5db42b7d48157e23356022889fc354a2813c15934b7cb5c0e/attrs-25.4.0-py3-none-any.whl", hash = "sha256:adcf7e2a1fb3b36ac48d97835bb6d8ade15b8dcce26aba8bf1d14847b57a3373", size = 67615, upload-time = "2025-10-06T13:54:43.17Z" }, +] + +[[package]] +name = "biopython" +version = "1.81" +source = { registry = "https://pypi.org/simple" } +resolution-markers = [ + "python_full_version < '3.8'", +] +dependencies = [ + { name = "numpy", version = "1.21.6", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.8'" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/ad/a4/237edd5f5e5b68d9543c79bcd695ef881e6317fbd0eae1b1e53e694f9d54/biopython-1.81.tar.gz", hash = "sha256:2cf38112b6d8415ad39d6a611988cd11fb5f33eb09346666a87263beba9614e0", size = 19324875, upload-time = "2023-02-13T04:10:21.291Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/e0/c6/bec6fbc01dfa4157b51c2e3a3c6f253caceac61054c282444106764e9595/biopython-1.81-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:ef7c79b65b0b3f3c7dc59e20a7f8ae5758d8e852cb8b9cace590dc5617e348ba", size = 2683271, upload-time = "2023-02-13T04:13:58.199Z" }, + { url = "https://files.pythonhosted.org/packages/65/51/05d02d400ee0b45fc7f01ab71d9db0e06cfa8af891fd88557d3e489fd97e/biopython-1.81-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6ebfbce0d91796c7aef422ee9dffe8827e07e5abaa94545e006f1f20e965c80b", size = 3083081, upload-time = "2023-02-13T04:14:01.145Z" }, + { url = "https://files.pythonhosted.org/packages/fd/77/0c757459d236dd739c42933f5238a3a6a220fcf0028972a5ea73f20d847e/biopython-1.81-cp310-cp310-win32.whl", hash = "sha256:919a2c583cabf9c96d2ae4e1245a6b0376932fb342aca302a0fc198b71ab3275", size = 2685297, upload-time = "2023-02-13T04:14:04.008Z" }, + { url = "https://files.pythonhosted.org/packages/79/63/ca137b04388f4eadd721a585a64288fb0f197033507d5145039e4f606862/biopython-1.81-cp310-cp310-win_amd64.whl", hash = "sha256:b37c0d24191e5c96ca02415a5188551980c83a0d518bbc4ffe3c9a5d1fe0ee81", size = 2719957, upload-time = "2023-02-13T04:14:06.841Z" }, + { url = "https://files.pythonhosted.org/packages/36/a8/83ffdd52b1bd8ee1170754d11dc07cc3a8231e4d83b01a27b6adcdfaa558/biopython-1.81-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:7a168709694e10b338718c18d967edd5b56c237dc88642c22275796007a70000", size = 2683387, upload-time = "2023-02-13T04:14:09.379Z" }, + { url = "https://files.pythonhosted.org/packages/0a/8f/3a661b3752863d2f530823384e7c97d202f0d444f80bb0ac89f5b4057fa1/biopython-1.81-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a51d9c1d1b4b634447535da74a644fae59bc234fbbf9001e2dc6b6fbabb98019", size = 3092759, upload-time = "2023-02-13T04:14:12.355Z" }, + { url = "https://files.pythonhosted.org/packages/46/ac/29bb0133b236ed62cf7a64e943835c3c4f86baa183e3a6bddee51869d802/biopython-1.81-cp311-cp311-win32.whl", hash = "sha256:2f9cfaf16d55ab80d514e7aebe5710dabe4e4ff47ede851031202e33b3249da3", size = 2685229, upload-time = "2023-02-13T04:14:14.997Z" }, + { url = "https://files.pythonhosted.org/packages/a1/85/d2de45fb662d52622acbad029ff61ea7b99f95d8946eb85928c1c7b434c3/biopython-1.81-cp311-cp311-win_amd64.whl", hash = "sha256:e41b55edcfd448630e77bf4de66a7235324a8a149621499891da6bd1d5085b9a", size = 2719909, upload-time = "2023-02-13T04:14:18.093Z" }, + { url = "https://files.pythonhosted.org/packages/b5/e5/ba20863f471056ccb6c05bc77615779d30671841facd447501814b91683c/biopython-1.81-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:175fcddc9f22a070aa6db54755d60c4b31090cc39f5f5f4b0a9a5d1ae3b45cd7", size = 2684482, upload-time = "2023-10-24T19:36:19.77Z" }, + { url = "https://files.pythonhosted.org/packages/f1/0f/ea29e2f922523f9c05e4d28a659f3828f9dfedc92f41d2770c6b43e930d9/biopython-1.81-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9ec149487f3d1e0cf2b52b6071641c161ed545b0855ff51a71506152e14fc5bb", size = 3105796, upload-time = "2023-10-24T19:36:28.846Z" }, + { url = "https://files.pythonhosted.org/packages/42/2e/ed34bd53e402e27221e9b0e75ab7b4aad263ab4abc6646eff7444558f813/biopython-1.81-cp312-cp312-win32.whl", hash = "sha256:daeab15274bbcc0455cbd378636e14f53bc7c5b1f383e77021d7222e72cc3418", size = 2686376, upload-time = "2023-10-24T19:36:35.442Z" }, + { url = "https://files.pythonhosted.org/packages/53/dc/95a8a6021d3b49f3ab977486b20e8e588e887c9e016a2174a1c026c4ae7f/biopython-1.81-cp312-cp312-win_amd64.whl", hash = "sha256:22f5741aca91af0a76c0d5617e58e554fd3374bbd16e0c0ac1facf45b107313b", size = 2720296, upload-time = "2023-10-24T19:36:40.763Z" }, + { url = "https://files.pythonhosted.org/packages/94/f8/0ec87dce37d15f135d30fe753bb90a4877ff3db8ffb58d9954536011c01c/biopython-1.81-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:3b36ba1bf6395c09a365c53530c9d71f3617763fa2c1d452b3d8948368c0f1de", size = 2682213, upload-time = "2023-02-13T04:14:20.854Z" }, + { url = "https://files.pythonhosted.org/packages/6c/4a/0f3429d1b7072b7e7b0c55e0c3765a3656c4ce2e8854c6fdb30b325fd39c/biopython-1.81-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7c5c07123ff5f44c9e6b5369df854a38afd3c0c50ef58498a0ae8f7eb799f3e8", size = 3044653, upload-time = "2023-02-13T04:14:23.26Z" }, + { url = "https://files.pythonhosted.org/packages/f3/8f/237301d528cb8c6506adb90d06a3e5509d09a6fa8aa16ede9328f4d3b1c4/biopython-1.81-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:97cbdbed01b2512471f36c74b91658d1dfbdcbf39bc038f6ce5a41c3e60a8fc6", size = 3010026, upload-time = "2023-02-13T04:14:25.762Z" }, + { url = "https://files.pythonhosted.org/packages/bb/8e/bc92a7bb0cd18f987a69b155138fb7f1e08e2fa7fbe407c184e147e11880/biopython-1.81-cp37-cp37m-win32.whl", hash = "sha256:35506e39822c52d11cf09a3951e82375ca1bb9303960b4286acf02c9a6f6c4cc", size = 2685624, upload-time = "2023-02-13T04:14:28.618Z" }, + { url = "https://files.pythonhosted.org/packages/f2/12/66bc9e4506edd7c778980ea0bc5597bc125288bc6573c78031017571ca0b/biopython-1.81-cp37-cp37m-win_amd64.whl", hash = "sha256:793c42a376cd63f62f8a088ce39b7dc6b5c55e4e9031d887c434de1595bfa4b8", size = 2719319, upload-time = "2023-02-13T04:14:31.443Z" }, + { url = "https://files.pythonhosted.org/packages/bb/39/423f35bf49d94e9a17c9f04a9fa81aa215ece3b2ca60b68febae60ec87aa/biopython-1.81-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:11d673698b3d0d6589292ea951fb62cb24ea27d273eca0d08dbbd956690f97f5", size = 2683224, upload-time = "2023-02-13T04:14:34.037Z" }, + { url = "https://files.pythonhosted.org/packages/15/0c/fbc084480b5b4b7fa0734e65a1ed674c16b8629c74e41d246b7a0ea76343/biopython-1.81-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:655df416936662c0c8a06a549cb25e1560e1fea5067d850f34fb714b8a3fae6c", size = 3092003, upload-time = "2023-02-13T04:14:36.477Z" }, + { url = "https://files.pythonhosted.org/packages/88/01/d6dd8a34c3a1dc8e1c12f27a7aadb13f069f50c6458fcb69260772897f52/biopython-1.81-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:762c6c43a8486b5fcd07f136a3217b87d24755618b9ea9da1f17124ff44c2ad6", size = 3055776, upload-time = "2023-02-13T04:14:39.487Z" }, + { url = "https://files.pythonhosted.org/packages/37/c7/220fdbb3a0c129f65718f6f5344f88ff78c251d71e4707c44881d7d28f0c/biopython-1.81-cp38-cp38-win32.whl", hash = "sha256:ee51bb1cd7decffd24da6b76d5e01b7e2fd818ab85cf0c180226cbb5793a3abd", size = 2685273, upload-time = "2023-02-13T04:14:42.001Z" }, + { url = "https://files.pythonhosted.org/packages/67/f0/327622cf6c1af9a5ee9e853af0895d0f8c3d10df496e200a0914830bc1fa/biopython-1.81-cp38-cp38-win_amd64.whl", hash = "sha256:ccd729249fd5f586dd4c2a3507c2ea2456825d7e615e97c07c409c850eaf4594", size = 2719894, upload-time = "2023-02-13T04:14:44.802Z" }, + { url = "https://files.pythonhosted.org/packages/23/df/eb9622a9bc3ef1af460e174af547dcf84200fc6a275e381ac274b57914e2/biopython-1.81-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:9ba33244f0eff830beaa7240065bdb5095d96fded6599b76bbb9ddab45cd2bbd", size = 2683260, upload-time = "2023-02-13T04:14:47.571Z" }, + { url = "https://files.pythonhosted.org/packages/c7/f9/b617b085d3d54a44adebb611d54dad7a65ce9d215882f0a63d798cdf47a8/biopython-1.81-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8bb0c690c7368f255ed45236bf0f5464b476b8c083c8f634533921af78278261", size = 3081779, upload-time = "2023-02-13T04:14:50.633Z" }, + { url = "https://files.pythonhosted.org/packages/3d/99/be029ebd012340c32d16a2ebbadc6149c6192e5b359b0072a5f394e3a003/biopython-1.81-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:65b93b513ce9dd7b2ce058720eadf42cd03f312db3409356efeb93123d1320aa", size = 3045125, upload-time = "2023-02-13T04:14:53.216Z" }, + { url = "https://files.pythonhosted.org/packages/1c/db/10d3c1455692119c90999dab0fa63e234be314805cd61e4cd6efee933b98/biopython-1.81-cp39-cp39-win32.whl", hash = "sha256:811796f8d222aa3869a50e31e54ce62b69106b47cd8bb06934867c0d843297b5", size = 2685264, upload-time = "2023-02-13T04:14:56.047Z" }, + { url = "https://files.pythonhosted.org/packages/b7/1e/5fcdf870beec4591d79c82d691de22a2ea742abf282390d4bb386e89dbdb/biopython-1.81-cp39-cp39-win_amd64.whl", hash = "sha256:b09efcb4733c8770f25eab5fe555a96a08f5ab9e1bc36939e08ebf2ffbf3e0f1", size = 2719899, upload-time = "2023-02-13T04:14:59.099Z" }, +] + +[[package]] +name = "biopython" +version = "1.83" +source = { registry = "https://pypi.org/simple" } +resolution-markers = [ + "python_full_version >= '3.8.1' and python_full_version < '3.9'", + "python_full_version >= '3.8' and python_full_version < '3.8.1'", +] +dependencies = [ + { name = "numpy", version = "1.23.5", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version == '3.8.*'" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/cc/d4/3d8848191a7a37187704c382e6dfda4d6a47d05a14cd64f004c55a3cd5a1/biopython-1.83.tar.gz", hash = "sha256:78e6bfb78de63034037afd35fe77cb6e0a9e5b62706becf78a7d922b16ed83f7", size = 19431530, upload-time = "2024-01-10T12:25:28.048Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/f3/72/121580953f63a20870d7e6ce1bd0bb86fb916b034870189b61cbc8f6e096/biopython-1.83-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:e2cc737906d8de47eedbc4476f711b960c16a65daa8cdd021875398c81999a09", size = 2689906, upload-time = "2024-01-10T12:25:43.026Z" }, + { url = "https://files.pythonhosted.org/packages/9a/ea/45c6239aa17ce0994ee5deb6d847e22c9f75723612c67a258957e63e0a5b/biopython-1.83-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:741abad84165e4caf0c80e485054135f51c21177e50ac6fcc502a45a6e8f7311", size = 2676869, upload-time = "2024-02-26T13:47:12.275Z" }, + { url = "https://files.pythonhosted.org/packages/1f/24/54402fd6343a688a59f83aab37234ae2716dc7ed0ed8c33cef02727acfc3/biopython-1.83-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2df408be9816dd98c28fe181ea93fb6e0d375bf1763ad9ed503ac30bb2df5b1a", size = 3101912, upload-time = "2024-01-10T12:25:49.786Z" }, + { url = "https://files.pythonhosted.org/packages/8c/6a/f38bc09251404d546cc7011ef27353531ceba5f29f25be35e66706e24a13/biopython-1.83-cp310-cp310-win32.whl", hash = "sha256:a0c1c70789c7e2a26563db5ba533fb9fea0cc1f2c7bc7ad240146cb223ba44a3", size = 2689413, upload-time = "2024-01-10T12:25:55.772Z" }, + { url = "https://files.pythonhosted.org/packages/0c/09/4b5ad1d3f08c040ad4809e937d4d469eebb05f93a4fb7a85a9e7e40ccde8/biopython-1.83-cp310-cp310-win_amd64.whl", hash = "sha256:56f03f43c183acb88c082bc31e5f047fcc6d0aceb5270fbd29c31ab769795b86", size = 2725216, upload-time = "2024-01-10T12:26:01.086Z" }, + { url = "https://files.pythonhosted.org/packages/44/a1/53fdaf58f677a54dca2cf23d4a6dafc3c55478416f602738308fda2a107f/biopython-1.83-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:a01dfdad7210f2fd5c4f36606278f91dbfdda6dac02347206d13cc618e79fe32", size = 2690083, upload-time = "2024-01-10T12:26:06.269Z" }, + { url = "https://files.pythonhosted.org/packages/7e/40/0543d137e4a45b0e5d3a7c5ce9b607e687d9e5b715eadfdae34de8d6906a/biopython-1.83-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:3686ff61df3f24ecf6f23826e4fe5172c5e5f745099bc8fbb176f5304582f88f", size = 2676975, upload-time = "2024-02-26T13:47:18.835Z" }, + { url = "https://files.pythonhosted.org/packages/2a/38/3b971995c8bb2fad0b9809a61c8099fb1b2e579236e4c94fb0797825e171/biopython-1.83-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c756c0b81702c705141c87c2805203df01c6d4cf290e8cefd48cbc61a3c85b82", size = 3113769, upload-time = "2024-01-10T12:26:11.343Z" }, + { url = "https://files.pythonhosted.org/packages/f1/91/0759c7476a157887d68a1b286de4f1a7ec387cabdbf022e78d6c9a1010a9/biopython-1.83-cp311-cp311-win32.whl", hash = "sha256:0496f2a6e6e060d8ff0f34784ad15ed342b10cfe282020efe168286f0c14c479", size = 2689340, upload-time = "2024-01-10T12:26:15.995Z" }, + { url = "https://files.pythonhosted.org/packages/b8/c8/18570a63e8b6fe99a856698d500fb326f0ce247d2b70d8d631d4abcb5c9c/biopython-1.83-cp311-cp311-win_amd64.whl", hash = "sha256:8552cc467429b555c604b84fc174c33923bf7e4c735774eda505f1d5a9c2feab", size = 2725183, upload-time = "2024-01-10T12:26:21.15Z" }, + { url = "https://files.pythonhosted.org/packages/82/fd/176b5198f3d31d089c66a2ae6236b4f9ba311e251a3cc6df9708fc31f4ad/biopython-1.83-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:0d5ce14755a6b49dea4743cf6929570afe5becb66ad222194984c7bf04218f86", size = 2690888, upload-time = "2024-01-10T12:26:25.95Z" }, + { url = "https://files.pythonhosted.org/packages/29/86/cc72bc4aef2607e28520793dbb3878191428605900247d23c3e68102803a/biopython-1.83-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:29708772651d930e808cd24c519fd4f39b2e719668944c0aa1eaf0b1deef9f48", size = 2677167, upload-time = "2024-02-26T13:47:24.769Z" }, + { url = "https://files.pythonhosted.org/packages/13/82/f279caa7647d4afde960ae466cab1f44257d39ca26ecf4deecd086f23290/biopython-1.83-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0b35aa095de0fa8339b70664797d0e83322a1a9d512e2fd52d4e872df5189f56", size = 3127122, upload-time = "2024-01-10T12:26:31.016Z" }, + { url = "https://files.pythonhosted.org/packages/53/18/ece4454497a2e14042deba6ec4ad4e0328d01035527a752c6db5e2244dd2/biopython-1.83-cp312-cp312-win32.whl", hash = "sha256:118425a210cb3d184c7a78154c5646089366faf124cd46c6056ca7f9302b94ad", size = 2690448, upload-time = "2024-01-10T12:26:35.525Z" }, + { url = "https://files.pythonhosted.org/packages/8a/32/ad3f07c3dfc20a8f168f897b6d2312647ee3e598e0cd1270304897049126/biopython-1.83-cp312-cp312-win_amd64.whl", hash = "sha256:ca94e8ea8907de841a515af55acb1922a9de99b3144c738a193f2a75e4726078", size = 2725541, upload-time = "2024-01-10T12:26:40.218Z" }, + { url = "https://files.pythonhosted.org/packages/43/e5/30dc0f967b2792bedff350d4a87e30c3cbbe0e4cb2608b7e6241056d6db9/biopython-1.83-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:e37884fe39e4560bf5934a4ec4ba7f7fe0e7c091053d03d05b20a70557167717", size = 2689881, upload-time = "2024-01-10T12:26:45.027Z" }, + { url = "https://files.pythonhosted.org/packages/bd/5f/7494b759be0478cb2779a5e26db0ff6356eeab051ced65496ff7af16137c/biopython-1.83-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:4cc011346bc8af264e3d3ea98c665b6ebe20e503f1dd50ee7e0bc913941b4c6e", size = 2676864, upload-time = "2024-02-26T13:47:29.893Z" }, + { url = "https://files.pythonhosted.org/packages/05/2f/4ad16933096030e76046659f40b381869e46c4a26f4735969240d2c0adee/biopython-1.83-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:fd9bc6fef3f6a10043635a75e1a77c9dce877375140e81059c67c73d4ce65c4c", size = 3111259, upload-time = "2024-01-10T12:26:51.006Z" }, + { url = "https://files.pythonhosted.org/packages/70/4a/6f9653c962ed59c3b166ffcd12336f4c6188b080d21a1aacc959efc3b151/biopython-1.83-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:2c3584122a5daca25b3914a32c52785b051c11518cd5e111e9e89ee04a6234fe", size = 3073513, upload-time = "2024-01-10T12:26:56.753Z" }, + { url = "https://files.pythonhosted.org/packages/13/2f/e344b9d250a9f6f7d9b07e543ee05bc0d4e53c5fab140a9a1b7d4225389f/biopython-1.83-cp38-cp38-win32.whl", hash = "sha256:641c1a860705d6740eb16c6147b2b730b05a8f5974db804c14d5faa8a1446085", size = 2689412, upload-time = "2024-01-10T12:27:01.309Z" }, + { url = "https://files.pythonhosted.org/packages/2a/3c/10f22f3599acdf12b2a7a687589e3722b521147fe0e7846bd11f294eaf90/biopython-1.83-cp38-cp38-win_amd64.whl", hash = "sha256:94b68e550619e1b6e3784ed8cecb62f201d70d8b87d3a90365291f065ab42bd9", size = 2725178, upload-time = "2024-01-10T12:27:06.186Z" }, + { url = "https://files.pythonhosted.org/packages/a7/a9/1b1eb46b43541c7d5fd627022915ff80a5d3ba860fdf206a665b3d3d9077/biopython-1.83-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:81d1e2515b380e1876720ba79dbf50f8ef3a38cc38ba5953ef61ec20d0934ee2", size = 2689915, upload-time = "2024-01-10T12:27:11.456Z" }, + { url = "https://files.pythonhosted.org/packages/61/55/4e60b4b75520761ce78fe685a0a4fd18488e8fdaf5230328339176ac98ed/biopython-1.83-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:30fa323694ee640978888d0c8c4f61f951d119ccec52b1dd5fe0668cfffb6648", size = 2676879, upload-time = "2024-02-26T13:47:34.66Z" }, + { url = "https://files.pythonhosted.org/packages/30/b0/73fc250af13256c1c1db1edd17f2786fb02dda4c141d809b0d4159c6bbf1/biopython-1.83-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ec82350c24cdcf34a8d4a5f189d0ff7dc025658098a60e6f0e681d24b6a1414e", size = 3100642, upload-time = "2024-01-10T12:27:16.517Z" }, + { url = "https://files.pythonhosted.org/packages/98/ed/5a342a9a3fe84a2b7699881331bb6e7296fb6332ec4c0a705ff82c9b8dde/biopython-1.83-cp39-cp39-win32.whl", hash = "sha256:e914f7161b3831d7c58db33cc5c7ca64b42c9877c5a776a8313e7a5fd494f8de", size = 2689415, upload-time = "2024-01-10T12:27:21.629Z" }, + { url = "https://files.pythonhosted.org/packages/f1/27/be0ea2b3b5a03976e122376954c3b0f761a5ba55f107ee3b050725bf1c1e/biopython-1.83-cp39-cp39-win_amd64.whl", hash = "sha256:aae1b156a76907c2abfe9d141776b0aead65695ea914eaecdf12bd1e8991f869", size = 2725199, upload-time = "2024-01-10T12:27:26.191Z" }, +] + +[[package]] +name = "biopython" +version = "1.85" +source = { registry = "https://pypi.org/simple" } +resolution-markers = [ + "python_full_version >= '3.12'", + "python_full_version == '3.11.*'", + "python_full_version == '3.10.*'", + "python_full_version == '3.9.*'", +] +dependencies = [ + { name = "numpy", version = "2.0.2", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version == '3.9.*'" }, + { name = "numpy", version = "2.2.6", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version == '3.10.*'" }, + { name = "numpy", version = "2.3.3", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.11'" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/db/ca/1d5fab0fedaf5c2f376d9746d447cdce04241c433602c3861693361ce54c/biopython-1.85.tar.gz", hash = "sha256:5dafab74059de4e78f49f6b5684eddae6e7ce46f09cfa059c1d1339e8b1ea0a6", size = 19909902, upload-time = "2025-01-15T15:06:51.997Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/79/de/79824470fdc5c2aedeb1bab637d24eab654a7e9fbb7070f779fd944fd1ca/biopython-1.85-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:a6308053a61f3bdbb11504ece4cf24e264c6f1d6fad278f7e59e6b84b0d9a7b4", size = 2787511, upload-time = "2025-01-15T15:11:56.656Z" }, + { url = "https://files.pythonhosted.org/packages/4b/d6/3c90df2ebc4f2a522235f4391392253e528f19f5fb6a52396a2316e17064/biopython-1.85-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:434dd23e972b0c89e128f2ebbd16b38075d609184f4f1fd16368035f923019c2", size = 2765456, upload-time = "2025-01-15T15:12:05.177Z" }, + { url = "https://files.pythonhosted.org/packages/ff/d7/34233c4ee906b088b199eb2af9c4107384a547d44b5960257ef2bf2cc3c8/biopython-1.85-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9a08d082e85778259a83501063871e00ba57336136403b75050eea14d523c00a", size = 3225137, upload-time = "2025-01-15T15:12:15.847Z" }, + { url = "https://files.pythonhosted.org/packages/ae/6b/e7a5ae49ef7e8f81720593db22e884c1c8e3504e0e235da0395758a5c7d0/biopython-1.85-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d93464e629950e4df87d810125dc4e904538a4344b924f340908ea5bc95db986", size = 3245258, upload-time = "2025-01-15T15:12:21.012Z" }, + { url = "https://files.pythonhosted.org/packages/68/2c/0035656dbe51ac0bbe81321172b43c37b38408f8d136abaac443e9f44b62/biopython-1.85-cp310-cp310-win32.whl", hash = "sha256:f2f45ab3f1e43fdaa697fd753148999090298623278097c19c2c3c0ba134e57c", size = 2786505, upload-time = "2025-01-15T15:12:26.545Z" }, + { url = "https://files.pythonhosted.org/packages/32/a4/f20d5830dbd8654c13e763daef429fa32ef0b2b09749ac427d045cc81976/biopython-1.85-cp310-cp310-win_amd64.whl", hash = "sha256:7c8326cd2825ba166abecaf72843b9b15823affd6cec04fde65f0d2526767da4", size = 2820961, upload-time = "2025-01-15T15:12:32.364Z" }, + { url = "https://files.pythonhosted.org/packages/c3/73/c3a1323a3fe0d07212b09c04fb903e2cbb98aebfbb58e55e8717473e1bc0/biopython-1.85-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:db8822adab0cd75a6e6ae845acf312addd8eab5f9b731c191454b961fc2c2cdc", size = 2787585, upload-time = "2025-01-15T15:12:36.927Z" }, + { url = "https://files.pythonhosted.org/packages/ff/cf/299524e896fa49beb7588143e1509cce4848572215ebafb8eea83a861820/biopython-1.85-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:8e2bbe58cc1a592b239ef6d68396745d3fbfaafc668ce38283871d8ff070dbab", size = 2765608, upload-time = "2025-01-15T15:12:43.853Z" }, + { url = "https://files.pythonhosted.org/packages/b1/dd/be3e95b72a35ee6d52c84412e15af828951e5c69175080d4619985fd54ce/biopython-1.85-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5916eb56df7ecd4a3babc07a48d4894c40cfb45dc18ccda1c148d0131017ce04", size = 3237552, upload-time = "2025-01-15T15:12:49.046Z" }, + { url = "https://files.pythonhosted.org/packages/25/9c/612821b946930b6caa5d795cfe4169ed6a522562eced9776914be7efaf21/biopython-1.85-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b0cec8833bf3036049129944ee5382dd576dac9670c3814ff2314b52aa94f199", size = 3257287, upload-time = "2025-01-15T15:12:56.168Z" }, + { url = "https://files.pythonhosted.org/packages/a1/77/316e51dd42fd8225429574a268bdc627ce4f42067a3976c4c8c457a42023/biopython-1.85-cp311-cp311-win32.whl", hash = "sha256:cf88a4c8d8af13138be115949639a5e4a201618185a72ff09adbe175b7946b28", size = 2786411, upload-time = "2025-01-15T15:13:02.754Z" }, + { url = "https://files.pythonhosted.org/packages/f2/11/3c4e8c049b91998bbbd51ddebc6f790b1aa66211babfbf5ff008a72fb1f9/biopython-1.85-cp311-cp311-win_amd64.whl", hash = "sha256:d3c99db65d57ae4fc5034e42ac6cd8ddce069e664903f04c8a4f684d7609d6fa", size = 2820912, upload-time = "2025-01-15T15:13:10.499Z" }, + { url = "https://files.pythonhosted.org/packages/a3/25/e46f05359df7f0049c3adc5eaeb9aee0f5fbde1d959d05c78eb1de8f4d12/biopython-1.85-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:cc5b981b9e3060db7c355b6145dfe3ce0b6572e1601b31211f6d742b10543874", size = 2789327, upload-time = "2025-01-15T15:13:17.086Z" }, + { url = "https://files.pythonhosted.org/packages/54/5b/8b3b029c94c63ab4c1781d141615b4a837e658422381d460c5573d5d8262/biopython-1.85-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:6fe47d704c2d3afac99aeb461219ec5f00273120d2d99835dc0a9a617f520141", size = 2765805, upload-time = "2025-01-15T15:13:26.92Z" }, + { url = "https://files.pythonhosted.org/packages/69/0a/9a8a38eff03c4607b9cec8d0e08c76b346b1cee1f77bc6d00efebfc7ec83/biopython-1.85-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e54e495239e623660ad367498c2f7a1a294b1997ba603f2ceafb36fd18f0eba6", size = 3249276, upload-time = "2025-01-15T15:13:36.639Z" }, + { url = "https://files.pythonhosted.org/packages/b4/0d/b7a0f10f5100dcf51ae36ba31490169bfa45617323bd82af43e1fb0098fb/biopython-1.85-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d024ad48997ad53d53a77da24b072aaba8a550bd816af8f2e7e606a9918a3b43", size = 3268869, upload-time = "2025-01-15T15:13:44.009Z" }, + { url = "https://files.pythonhosted.org/packages/07/51/646a4b7bdb4c1153786a70d33588ed09178bfcdda0542dfdc976294f4312/biopython-1.85-cp312-cp312-win32.whl", hash = "sha256:6985e17a2911defcbd30275a12f5ed5de2765e4bc91a60439740d572fdbfdf43", size = 2787011, upload-time = "2025-01-15T15:13:48.958Z" }, + { url = "https://files.pythonhosted.org/packages/c1/84/c583fa2ac6e7d392d24ebdc5c99e95e517507de22cf143efb6cf1fc93ff5/biopython-1.85-cp312-cp312-win_amd64.whl", hash = "sha256:d6f8efb2db03f2ec115c5e8c764dbadf635e0c9ecd4c0e91fc8216c1b62f85f5", size = 2820972, upload-time = "2025-01-15T15:13:54.475Z" }, + { url = "https://files.pythonhosted.org/packages/c3/3f/65814bf221f0bfdd2633830e573ac8594794686f54110571dce98cc32fd3/biopython-1.85-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:bae6f17262f20e9587d419ba5683e9dc93a31ee1858b98fa0cff203694d5b786", size = 2789844, upload-time = "2025-01-15T15:14:01.171Z" }, + { url = "https://files.pythonhosted.org/packages/be/61/1443ce34226e261c20ae4a154b2bab72c109cf31415c92c54c1aada36b00/biopython-1.85-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:b1e4918e6399ab0183dd863527fec18b53b7c61b6f0ef95db84b4adfa430ce75", size = 2765767, upload-time = "2025-01-15T15:14:07.096Z" }, + { url = "https://files.pythonhosted.org/packages/53/51/bec4c763c704e2715691bb087cfab5907804a1bbef5873588698cece1a30/biopython-1.85-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:86e487b6fe0f20a2b0138cb53f3d4dc26a7e4060ac4cb6fb1d19e194d445ef46", size = 3248867, upload-time = "2025-01-15T15:14:12.822Z" }, + { url = "https://files.pythonhosted.org/packages/9e/a4/552f20253a7c95988067c4955831bd17dd9b864fd5c215d15c2f63f2d415/biopython-1.85-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:327184048b5a50634ae0970119bcb8a35b76d7cefb2658a01f772915f2fb7686", size = 3268479, upload-time = "2025-01-15T15:14:20.414Z" }, + { url = "https://files.pythonhosted.org/packages/97/f4/6dfc6ef3e0997f792f93893551d4a9bf7f6052a70d34f4e1b1e5e4a359f6/biopython-1.85-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:66b08905fb1b3f5194f908aaf04bbad474c4e3eaebad6d9f889a04e64dd1faf4", size = 3192338, upload-time = "2025-01-15T15:14:26.843Z" }, + { url = "https://files.pythonhosted.org/packages/9d/8c/73da6588fab3a7d734118f21ac619c0a949f51d3cf7b1b8343d175c33460/biopython-1.85-cp313-cp313-win32.whl", hash = "sha256:5a236ab1e2797c7dcf1577d80fdaafabead2908bc338eaed0aa1509dab769fef", size = 2787017, upload-time = "2025-01-15T15:14:33.802Z" }, + { url = "https://files.pythonhosted.org/packages/60/ff/fe8f03ac0ccc7219e0959010750c6ac1a5b1411c91c7f4ec3a37d8313673/biopython-1.85-cp313-cp313-win_amd64.whl", hash = "sha256:1b61593765e9ebdb71d73307d55fd4b46eb976608d329ae6803c084d90ed34c7", size = 2821012, upload-time = "2025-01-15T15:14:40.825Z" }, + { url = "https://files.pythonhosted.org/packages/b3/04/9bdf0003913803d3d2239785f0f53875694dd441bd5e1a8c1581cab37747/biopython-1.85-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:d76e44b46f555da2e72ac36e757efd327f7f5f690e9f00ede6f723b48538b6d5", size = 2787519, upload-time = "2025-01-15T15:14:45.867Z" }, + { url = "https://files.pythonhosted.org/packages/a4/9b/bef7dd17980eb4625c3c69411d3273e9b45d83dc7e2f1c63719607fa1026/biopython-1.85-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:8469095907a17f156c76b6644829227efdf4996164f7726e6f4ca15039329776", size = 2765442, upload-time = "2025-01-15T15:14:51.469Z" }, + { url = "https://files.pythonhosted.org/packages/94/49/20f55dcfcc5487d84a6a4c84b59bcfb7ae2610f7370847b07e63e0f79cc6/biopython-1.85-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:cffc15ac46688cd4cf662b24d03037234ce00b571df67be45a942264f101f990", size = 3223396, upload-time = "2025-01-15T15:14:56.519Z" }, + { url = "https://files.pythonhosted.org/packages/80/5a/6ba0066b7f38b9e7a085f2fc4c171a25ebfa64202aab0965961621f561e1/biopython-1.85-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9a630b3804f6c3fcae2f9b7485d7a05425e143fc570f25babbc5a4b3d3db00d7", size = 3243475, upload-time = "2025-01-15T15:15:01.798Z" }, + { url = "https://files.pythonhosted.org/packages/90/1d/a38a9a61abd4a917fb9b95698971914d722e75027885bdb957b0fe757cd5/biopython-1.85-cp39-cp39-win32.whl", hash = "sha256:0ffb03cd982cb3a79326b84e789f2093880175c44eea10f3030c632f98de24f6", size = 2786482, upload-time = "2025-01-15T15:15:06.532Z" }, + { url = "https://files.pythonhosted.org/packages/4a/46/9cb732167a3ce4fd40920d1bec444d1739aaf18b58190f2fab8692fcaba5/biopython-1.85-cp39-cp39-win_amd64.whl", hash = "sha256:8208bf2d87ade066fafe9a63a2eb77486c233bc1bdda2cbf721ebee54715f1bf", size = 2820941, upload-time = "2025-01-15T15:15:12.311Z" }, +] + +[[package]] +name = "certifi" +version = "2025.10.5" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/4c/5b/b6ce21586237c77ce67d01dc5507039d444b630dd76611bbca2d8e5dcd91/certifi-2025.10.5.tar.gz", hash = "sha256:47c09d31ccf2acf0be3f701ea53595ee7e0b8fa08801c6624be771df09ae7b43", size = 164519, upload-time = "2025-10-05T04:12:15.808Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/e4/37/af0d2ef3967ac0d6113837b44a4f0bfe1328c2b9763bd5b1744520e5cfed/certifi-2025.10.5-py3-none-any.whl", hash = "sha256:0f212c2744a9bb6de0c56639a6f68afe01ecd92d91f14ae897c4fe7bbeeef0de", size = 163286, upload-time = "2025-10-05T04:12:14.03Z" }, +] + +[[package]] +name = "charset-normalizer" +version = "3.4.3" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/83/2d/5fd176ceb9b2fc619e63405525573493ca23441330fcdaee6bef9460e924/charset_normalizer-3.4.3.tar.gz", hash = "sha256:6fce4b8500244f6fcb71465d4a4930d132ba9ab8e71a7859e6a5d59851068d14", size = 122371, upload-time = "2025-08-09T07:57:28.46Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/d6/98/f3b8013223728a99b908c9344da3aa04ee6e3fa235f19409033eda92fb78/charset_normalizer-3.4.3-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:fb7f67a1bfa6e40b438170ebdc8158b78dc465a5a67b6dde178a46987b244a72", size = 207695, upload-time = "2025-08-09T07:55:36.452Z" }, + { url = "https://files.pythonhosted.org/packages/21/40/5188be1e3118c82dcb7c2a5ba101b783822cfb413a0268ed3be0468532de/charset_normalizer-3.4.3-cp310-cp310-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:cc9370a2da1ac13f0153780040f465839e6cccb4a1e44810124b4e22483c93fe", size = 147153, upload-time = "2025-08-09T07:55:38.467Z" }, + { url = "https://files.pythonhosted.org/packages/37/60/5d0d74bc1e1380f0b72c327948d9c2aca14b46a9efd87604e724260f384c/charset_normalizer-3.4.3-cp310-cp310-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:07a0eae9e2787b586e129fdcbe1af6997f8d0e5abaa0bc98c0e20e124d67e601", size = 160428, upload-time = "2025-08-09T07:55:40.072Z" }, + { url = "https://files.pythonhosted.org/packages/85/9a/d891f63722d9158688de58d050c59dc3da560ea7f04f4c53e769de5140f5/charset_normalizer-3.4.3-cp310-cp310-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:74d77e25adda8581ffc1c720f1c81ca082921329452eba58b16233ab1842141c", size = 157627, upload-time = "2025-08-09T07:55:41.706Z" }, + { url = "https://files.pythonhosted.org/packages/65/1a/7425c952944a6521a9cfa7e675343f83fd82085b8af2b1373a2409c683dc/charset_normalizer-3.4.3-cp310-cp310-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:d0e909868420b7049dafd3a31d45125b31143eec59235311fc4c57ea26a4acd2", size = 152388, upload-time = "2025-08-09T07:55:43.262Z" }, + { url = "https://files.pythonhosted.org/packages/f0/c9/a2c9c2a355a8594ce2446085e2ec97fd44d323c684ff32042e2a6b718e1d/charset_normalizer-3.4.3-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:c6f162aabe9a91a309510d74eeb6507fab5fff92337a15acbe77753d88d9dcf0", size = 150077, upload-time = "2025-08-09T07:55:44.903Z" }, + { url = "https://files.pythonhosted.org/packages/3b/38/20a1f44e4851aa1c9105d6e7110c9d020e093dfa5836d712a5f074a12bf7/charset_normalizer-3.4.3-cp310-cp310-musllinux_1_2_ppc64le.whl", hash = "sha256:4ca4c094de7771a98d7fbd67d9e5dbf1eb73efa4f744a730437d8a3a5cf994f0", size = 161631, upload-time = "2025-08-09T07:55:46.346Z" }, + { url = "https://files.pythonhosted.org/packages/a4/fa/384d2c0f57edad03d7bec3ebefb462090d8905b4ff5a2d2525f3bb711fac/charset_normalizer-3.4.3-cp310-cp310-musllinux_1_2_s390x.whl", hash = "sha256:02425242e96bcf29a49711b0ca9f37e451da7c70562bc10e8ed992a5a7a25cc0", size = 159210, upload-time = "2025-08-09T07:55:47.539Z" }, + { url = "https://files.pythonhosted.org/packages/33/9e/eca49d35867ca2db336b6ca27617deed4653b97ebf45dfc21311ce473c37/charset_normalizer-3.4.3-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:78deba4d8f9590fe4dae384aeff04082510a709957e968753ff3c48399f6f92a", size = 153739, upload-time = "2025-08-09T07:55:48.744Z" }, + { url = "https://files.pythonhosted.org/packages/2a/91/26c3036e62dfe8de8061182d33be5025e2424002125c9500faff74a6735e/charset_normalizer-3.4.3-cp310-cp310-win32.whl", hash = "sha256:d79c198e27580c8e958906f803e63cddb77653731be08851c7df0b1a14a8fc0f", size = 99825, upload-time = "2025-08-09T07:55:50.305Z" }, + { url = "https://files.pythonhosted.org/packages/e2/c6/f05db471f81af1fa01839d44ae2a8bfeec8d2a8b4590f16c4e7393afd323/charset_normalizer-3.4.3-cp310-cp310-win_amd64.whl", hash = "sha256:c6e490913a46fa054e03699c70019ab869e990270597018cef1d8562132c2669", size = 107452, upload-time = "2025-08-09T07:55:51.461Z" }, + { url = "https://files.pythonhosted.org/packages/7f/b5/991245018615474a60965a7c9cd2b4efbaabd16d582a5547c47ee1c7730b/charset_normalizer-3.4.3-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:b256ee2e749283ef3ddcff51a675ff43798d92d746d1a6e4631bf8c707d22d0b", size = 204483, upload-time = "2025-08-09T07:55:53.12Z" }, + { url = "https://files.pythonhosted.org/packages/c7/2a/ae245c41c06299ec18262825c1569c5d3298fc920e4ddf56ab011b417efd/charset_normalizer-3.4.3-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:13faeacfe61784e2559e690fc53fa4c5ae97c6fcedb8eb6fb8d0a15b475d2c64", size = 145520, upload-time = "2025-08-09T07:55:54.712Z" }, + { url = "https://files.pythonhosted.org/packages/3a/a4/b3b6c76e7a635748c4421d2b92c7b8f90a432f98bda5082049af37ffc8e3/charset_normalizer-3.4.3-cp311-cp311-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:00237675befef519d9af72169d8604a067d92755e84fe76492fef5441db05b91", size = 158876, upload-time = "2025-08-09T07:55:56.024Z" }, + { url = "https://files.pythonhosted.org/packages/e2/e6/63bb0e10f90a8243c5def74b5b105b3bbbfb3e7bb753915fe333fb0c11ea/charset_normalizer-3.4.3-cp311-cp311-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:585f3b2a80fbd26b048a0be90c5aae8f06605d3c92615911c3a2b03a8a3b796f", size = 156083, upload-time = "2025-08-09T07:55:57.582Z" }, + { url = "https://files.pythonhosted.org/packages/87/df/b7737ff046c974b183ea9aa111b74185ac8c3a326c6262d413bd5a1b8c69/charset_normalizer-3.4.3-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:0e78314bdc32fa80696f72fa16dc61168fda4d6a0c014e0380f9d02f0e5d8a07", size = 150295, upload-time = "2025-08-09T07:55:59.147Z" }, + { url = "https://files.pythonhosted.org/packages/61/f1/190d9977e0084d3f1dc169acd060d479bbbc71b90bf3e7bf7b9927dec3eb/charset_normalizer-3.4.3-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:96b2b3d1a83ad55310de8c7b4a2d04d9277d5591f40761274856635acc5fcb30", size = 148379, upload-time = "2025-08-09T07:56:00.364Z" }, + { url = "https://files.pythonhosted.org/packages/4c/92/27dbe365d34c68cfe0ca76f1edd70e8705d82b378cb54ebbaeabc2e3029d/charset_normalizer-3.4.3-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:939578d9d8fd4299220161fdd76e86c6a251987476f5243e8864a7844476ba14", size = 160018, upload-time = "2025-08-09T07:56:01.678Z" }, + { url = "https://files.pythonhosted.org/packages/99/04/baae2a1ea1893a01635d475b9261c889a18fd48393634b6270827869fa34/charset_normalizer-3.4.3-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:fd10de089bcdcd1be95a2f73dbe6254798ec1bda9f450d5828c96f93e2536b9c", size = 157430, upload-time = "2025-08-09T07:56:02.87Z" }, + { url = "https://files.pythonhosted.org/packages/2f/36/77da9c6a328c54d17b960c89eccacfab8271fdaaa228305330915b88afa9/charset_normalizer-3.4.3-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:1e8ac75d72fa3775e0b7cb7e4629cec13b7514d928d15ef8ea06bca03ef01cae", size = 151600, upload-time = "2025-08-09T07:56:04.089Z" }, + { url = "https://files.pythonhosted.org/packages/64/d4/9eb4ff2c167edbbf08cdd28e19078bf195762e9bd63371689cab5ecd3d0d/charset_normalizer-3.4.3-cp311-cp311-win32.whl", hash = "sha256:6cf8fd4c04756b6b60146d98cd8a77d0cdae0e1ca20329da2ac85eed779b6849", size = 99616, upload-time = "2025-08-09T07:56:05.658Z" }, + { url = "https://files.pythonhosted.org/packages/f4/9c/996a4a028222e7761a96634d1820de8a744ff4327a00ada9c8942033089b/charset_normalizer-3.4.3-cp311-cp311-win_amd64.whl", hash = "sha256:31a9a6f775f9bcd865d88ee350f0ffb0e25936a7f930ca98995c05abf1faf21c", size = 107108, upload-time = "2025-08-09T07:56:07.176Z" }, + { url = "https://files.pythonhosted.org/packages/e9/5e/14c94999e418d9b87682734589404a25854d5f5d0408df68bc15b6ff54bb/charset_normalizer-3.4.3-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:e28e334d3ff134e88989d90ba04b47d84382a828c061d0d1027b1b12a62b39b1", size = 205655, upload-time = "2025-08-09T07:56:08.475Z" }, + { url = "https://files.pythonhosted.org/packages/7d/a8/c6ec5d389672521f644505a257f50544c074cf5fc292d5390331cd6fc9c3/charset_normalizer-3.4.3-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:0cacf8f7297b0c4fcb74227692ca46b4a5852f8f4f24b3c766dd94a1075c4884", size = 146223, upload-time = "2025-08-09T07:56:09.708Z" }, + { url = "https://files.pythonhosted.org/packages/fc/eb/a2ffb08547f4e1e5415fb69eb7db25932c52a52bed371429648db4d84fb1/charset_normalizer-3.4.3-cp312-cp312-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:c6fd51128a41297f5409deab284fecbe5305ebd7e5a1f959bee1c054622b7018", size = 159366, upload-time = "2025-08-09T07:56:11.326Z" }, + { url = "https://files.pythonhosted.org/packages/82/10/0fd19f20c624b278dddaf83b8464dcddc2456cb4b02bb902a6da126b87a1/charset_normalizer-3.4.3-cp312-cp312-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:3cfb2aad70f2c6debfbcb717f23b7eb55febc0bb23dcffc0f076009da10c6392", size = 157104, upload-time = "2025-08-09T07:56:13.014Z" }, + { url = "https://files.pythonhosted.org/packages/16/ab/0233c3231af734f5dfcf0844aa9582d5a1466c985bbed6cedab85af9bfe3/charset_normalizer-3.4.3-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:1606f4a55c0fd363d754049cdf400175ee96c992b1f8018b993941f221221c5f", size = 151830, upload-time = "2025-08-09T07:56:14.428Z" }, + { url = "https://files.pythonhosted.org/packages/ae/02/e29e22b4e02839a0e4a06557b1999d0a47db3567e82989b5bb21f3fbbd9f/charset_normalizer-3.4.3-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:027b776c26d38b7f15b26a5da1044f376455fb3766df8fc38563b4efbc515154", size = 148854, upload-time = "2025-08-09T07:56:16.051Z" }, + { url = "https://files.pythonhosted.org/packages/05/6b/e2539a0a4be302b481e8cafb5af8792da8093b486885a1ae4d15d452bcec/charset_normalizer-3.4.3-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:42e5088973e56e31e4fa58eb6bd709e42fc03799c11c42929592889a2e54c491", size = 160670, upload-time = "2025-08-09T07:56:17.314Z" }, + { url = "https://files.pythonhosted.org/packages/31/e7/883ee5676a2ef217a40ce0bffcc3d0dfbf9e64cbcfbdf822c52981c3304b/charset_normalizer-3.4.3-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:cc34f233c9e71701040d772aa7490318673aa7164a0efe3172b2981218c26d93", size = 158501, upload-time = "2025-08-09T07:56:18.641Z" }, + { url = "https://files.pythonhosted.org/packages/c1/35/6525b21aa0db614cf8b5792d232021dca3df7f90a1944db934efa5d20bb1/charset_normalizer-3.4.3-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:320e8e66157cc4e247d9ddca8e21f427efc7a04bbd0ac8a9faf56583fa543f9f", size = 153173, upload-time = "2025-08-09T07:56:20.289Z" }, + { url = "https://files.pythonhosted.org/packages/50/ee/f4704bad8201de513fdc8aac1cabc87e38c5818c93857140e06e772b5892/charset_normalizer-3.4.3-cp312-cp312-win32.whl", hash = "sha256:fb6fecfd65564f208cbf0fba07f107fb661bcd1a7c389edbced3f7a493f70e37", size = 99822, upload-time = "2025-08-09T07:56:21.551Z" }, + { url = "https://files.pythonhosted.org/packages/39/f5/3b3836ca6064d0992c58c7561c6b6eee1b3892e9665d650c803bd5614522/charset_normalizer-3.4.3-cp312-cp312-win_amd64.whl", hash = "sha256:86df271bf921c2ee3818f0522e9a5b8092ca2ad8b065ece5d7d9d0e9f4849bcc", size = 107543, upload-time = "2025-08-09T07:56:23.115Z" }, + { url = "https://files.pythonhosted.org/packages/65/ca/2135ac97709b400c7654b4b764daf5c5567c2da45a30cdd20f9eefe2d658/charset_normalizer-3.4.3-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:14c2a87c65b351109f6abfc424cab3927b3bdece6f706e4d12faaf3d52ee5efe", size = 205326, upload-time = "2025-08-09T07:56:24.721Z" }, + { url = "https://files.pythonhosted.org/packages/71/11/98a04c3c97dd34e49c7d247083af03645ca3730809a5509443f3c37f7c99/charset_normalizer-3.4.3-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:41d1fc408ff5fdfb910200ec0e74abc40387bccb3252f3f27c0676731df2b2c8", size = 146008, upload-time = "2025-08-09T07:56:26.004Z" }, + { url = "https://files.pythonhosted.org/packages/60/f5/4659a4cb3c4ec146bec80c32d8bb16033752574c20b1252ee842a95d1a1e/charset_normalizer-3.4.3-cp313-cp313-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:1bb60174149316da1c35fa5233681f7c0f9f514509b8e399ab70fea5f17e45c9", size = 159196, upload-time = "2025-08-09T07:56:27.25Z" }, + { url = "https://files.pythonhosted.org/packages/86/9e/f552f7a00611f168b9a5865a1414179b2c6de8235a4fa40189f6f79a1753/charset_normalizer-3.4.3-cp313-cp313-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:30d006f98569de3459c2fc1f2acde170b7b2bd265dc1943e87e1a4efe1b67c31", size = 156819, upload-time = "2025-08-09T07:56:28.515Z" }, + { url = "https://files.pythonhosted.org/packages/7e/95/42aa2156235cbc8fa61208aded06ef46111c4d3f0de233107b3f38631803/charset_normalizer-3.4.3-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:416175faf02e4b0810f1f38bcb54682878a4af94059a1cd63b8747244420801f", size = 151350, upload-time = "2025-08-09T07:56:29.716Z" }, + { url = "https://files.pythonhosted.org/packages/c2/a9/3865b02c56f300a6f94fc631ef54f0a8a29da74fb45a773dfd3dcd380af7/charset_normalizer-3.4.3-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:6aab0f181c486f973bc7262a97f5aca3ee7e1437011ef0c2ec04b5a11d16c927", size = 148644, upload-time = "2025-08-09T07:56:30.984Z" }, + { url = "https://files.pythonhosted.org/packages/77/d9/cbcf1a2a5c7d7856f11e7ac2d782aec12bdfea60d104e60e0aa1c97849dc/charset_normalizer-3.4.3-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:fdabf8315679312cfa71302f9bd509ded4f2f263fb5b765cf1433b39106c3cc9", size = 160468, upload-time = "2025-08-09T07:56:32.252Z" }, + { url = "https://files.pythonhosted.org/packages/f6/42/6f45efee8697b89fda4d50580f292b8f7f9306cb2971d4b53f8914e4d890/charset_normalizer-3.4.3-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:bd28b817ea8c70215401f657edef3a8aa83c29d447fb0b622c35403780ba11d5", size = 158187, upload-time = "2025-08-09T07:56:33.481Z" }, + { url = "https://files.pythonhosted.org/packages/70/99/f1c3bdcfaa9c45b3ce96f70b14f070411366fa19549c1d4832c935d8e2c3/charset_normalizer-3.4.3-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:18343b2d246dc6761a249ba1fb13f9ee9a2bcd95decc767319506056ea4ad4dc", size = 152699, upload-time = "2025-08-09T07:56:34.739Z" }, + { url = "https://files.pythonhosted.org/packages/a3/ad/b0081f2f99a4b194bcbb1934ef3b12aa4d9702ced80a37026b7607c72e58/charset_normalizer-3.4.3-cp313-cp313-win32.whl", hash = "sha256:6fb70de56f1859a3f71261cbe41005f56a7842cc348d3aeb26237560bfa5e0ce", size = 99580, upload-time = "2025-08-09T07:56:35.981Z" }, + { url = "https://files.pythonhosted.org/packages/9a/8f/ae790790c7b64f925e5c953b924aaa42a243fb778fed9e41f147b2a5715a/charset_normalizer-3.4.3-cp313-cp313-win_amd64.whl", hash = "sha256:cf1ebb7d78e1ad8ec2a8c4732c7be2e736f6e5123a4146c5b89c9d1f585f8cef", size = 107366, upload-time = "2025-08-09T07:56:37.339Z" }, + { url = "https://files.pythonhosted.org/packages/8e/91/b5a06ad970ddc7a0e513112d40113e834638f4ca1120eb727a249fb2715e/charset_normalizer-3.4.3-cp314-cp314-macosx_10_13_universal2.whl", hash = "sha256:3cd35b7e8aedeb9e34c41385fda4f73ba609e561faedfae0a9e75e44ac558a15", size = 204342, upload-time = "2025-08-09T07:56:38.687Z" }, + { url = "https://files.pythonhosted.org/packages/ce/ec/1edc30a377f0a02689342f214455c3f6c2fbedd896a1d2f856c002fc3062/charset_normalizer-3.4.3-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:b89bc04de1d83006373429975f8ef9e7932534b8cc9ca582e4db7d20d91816db", size = 145995, upload-time = "2025-08-09T07:56:40.048Z" }, + { url = "https://files.pythonhosted.org/packages/17/e5/5e67ab85e6d22b04641acb5399c8684f4d37caf7558a53859f0283a650e9/charset_normalizer-3.4.3-cp314-cp314-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:2001a39612b241dae17b4687898843f254f8748b796a2e16f1051a17078d991d", size = 158640, upload-time = "2025-08-09T07:56:41.311Z" }, + { url = "https://files.pythonhosted.org/packages/f1/e5/38421987f6c697ee3722981289d554957c4be652f963d71c5e46a262e135/charset_normalizer-3.4.3-cp314-cp314-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:8dcfc373f888e4fb39a7bc57e93e3b845e7f462dacc008d9749568b1c4ece096", size = 156636, upload-time = "2025-08-09T07:56:43.195Z" }, + { url = "https://files.pythonhosted.org/packages/a0/e4/5a075de8daa3ec0745a9a3b54467e0c2967daaaf2cec04c845f73493e9a1/charset_normalizer-3.4.3-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:18b97b8404387b96cdbd30ad660f6407799126d26a39ca65729162fd810a99aa", size = 150939, upload-time = "2025-08-09T07:56:44.819Z" }, + { url = "https://files.pythonhosted.org/packages/02/f7/3611b32318b30974131db62b4043f335861d4d9b49adc6d57c1149cc49d4/charset_normalizer-3.4.3-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:ccf600859c183d70eb47e05a44cd80a4ce77394d1ac0f79dbd2dd90a69a3a049", size = 148580, upload-time = "2025-08-09T07:56:46.684Z" }, + { url = "https://files.pythonhosted.org/packages/7e/61/19b36f4bd67f2793ab6a99b979b4e4f3d8fc754cbdffb805335df4337126/charset_normalizer-3.4.3-cp314-cp314-musllinux_1_2_ppc64le.whl", hash = "sha256:53cd68b185d98dde4ad8990e56a58dea83a4162161b1ea9272e5c9182ce415e0", size = 159870, upload-time = "2025-08-09T07:56:47.941Z" }, + { url = "https://files.pythonhosted.org/packages/06/57/84722eefdd338c04cf3030ada66889298eaedf3e7a30a624201e0cbe424a/charset_normalizer-3.4.3-cp314-cp314-musllinux_1_2_s390x.whl", hash = "sha256:30a96e1e1f865f78b030d65241c1ee850cdf422d869e9028e2fc1d5e4db73b92", size = 157797, upload-time = "2025-08-09T07:56:49.756Z" }, + { url = "https://files.pythonhosted.org/packages/72/2a/aff5dd112b2f14bcc3462c312dce5445806bfc8ab3a7328555da95330e4b/charset_normalizer-3.4.3-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:d716a916938e03231e86e43782ca7878fb602a125a91e7acb8b5112e2e96ac16", size = 152224, upload-time = "2025-08-09T07:56:51.369Z" }, + { url = "https://files.pythonhosted.org/packages/b7/8c/9839225320046ed279c6e839d51f028342eb77c91c89b8ef2549f951f3ec/charset_normalizer-3.4.3-cp314-cp314-win32.whl", hash = "sha256:c6dbd0ccdda3a2ba7c2ecd9d77b37f3b5831687d8dc1b6ca5f56a4880cc7b7ce", size = 100086, upload-time = "2025-08-09T07:56:52.722Z" }, + { url = "https://files.pythonhosted.org/packages/ee/7a/36fbcf646e41f710ce0a563c1c9a343c6edf9be80786edeb15b6f62e17db/charset_normalizer-3.4.3-cp314-cp314-win_amd64.whl", hash = "sha256:73dc19b562516fc9bcf6e5d6e596df0b4eb98d87e4f79f3ae71840e6ed21361c", size = 107400, upload-time = "2025-08-09T07:56:55.172Z" }, + { url = "https://files.pythonhosted.org/packages/22/82/63a45bfc36f73efe46731a3a71cb84e2112f7e0b049507025ce477f0f052/charset_normalizer-3.4.3-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:0f2be7e0cf7754b9a30eb01f4295cc3d4358a479843b31f328afd210e2c7598c", size = 198805, upload-time = "2025-08-09T07:56:56.496Z" }, + { url = "https://files.pythonhosted.org/packages/0c/52/8b0c6c3e53f7e546a5e49b9edb876f379725914e1130297f3b423c7b71c5/charset_normalizer-3.4.3-cp38-cp38-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:c60e092517a73c632ec38e290eba714e9627abe9d301c8c8a12ec32c314a2a4b", size = 142862, upload-time = "2025-08-09T07:56:57.751Z" }, + { url = "https://files.pythonhosted.org/packages/59/c0/a74f3bd167d311365e7973990243f32c35e7a94e45103125275b9e6c479f/charset_normalizer-3.4.3-cp38-cp38-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:252098c8c7a873e17dd696ed98bbe91dbacd571da4b87df3736768efa7a792e4", size = 155104, upload-time = "2025-08-09T07:56:58.984Z" }, + { url = "https://files.pythonhosted.org/packages/1a/79/ae516e678d6e32df2e7e740a7be51dc80b700e2697cb70054a0f1ac2c955/charset_normalizer-3.4.3-cp38-cp38-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:3653fad4fe3ed447a596ae8638b437f827234f01a8cd801842e43f3d0a6b281b", size = 152598, upload-time = "2025-08-09T07:57:00.201Z" }, + { url = "https://files.pythonhosted.org/packages/00/bd/ef9c88464b126fa176f4ef4a317ad9b6f4d30b2cffbc43386062367c3e2c/charset_normalizer-3.4.3-cp38-cp38-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:8999f965f922ae054125286faf9f11bc6932184b93011d138925a1773830bbe9", size = 147391, upload-time = "2025-08-09T07:57:01.441Z" }, + { url = "https://files.pythonhosted.org/packages/7a/03/cbb6fac9d3e57f7e07ce062712ee80d80a5ab46614684078461917426279/charset_normalizer-3.4.3-cp38-cp38-musllinux_1_2_aarch64.whl", hash = "sha256:d95bfb53c211b57198bb91c46dd5a2d8018b3af446583aab40074bf7988401cb", size = 145037, upload-time = "2025-08-09T07:57:02.638Z" }, + { url = "https://files.pythonhosted.org/packages/64/d1/f9d141c893ef5d4243bc75c130e95af8fd4bc355beff06e9b1e941daad6e/charset_normalizer-3.4.3-cp38-cp38-musllinux_1_2_ppc64le.whl", hash = "sha256:5b413b0b1bfd94dbf4023ad6945889f374cd24e3f62de58d6bb102c4d9ae534a", size = 156425, upload-time = "2025-08-09T07:57:03.898Z" }, + { url = "https://files.pythonhosted.org/packages/c5/35/9c99739250742375167bc1b1319cd1cec2bf67438a70d84b2e1ec4c9daa3/charset_normalizer-3.4.3-cp38-cp38-musllinux_1_2_s390x.whl", hash = "sha256:b5e3b2d152e74e100a9e9573837aba24aab611d39428ded46f4e4022ea7d1942", size = 153734, upload-time = "2025-08-09T07:57:05.549Z" }, + { url = "https://files.pythonhosted.org/packages/50/10/c117806094d2c956ba88958dab680574019abc0c02bcf57b32287afca544/charset_normalizer-3.4.3-cp38-cp38-musllinux_1_2_x86_64.whl", hash = "sha256:a2d08ac246bb48479170408d6c19f6385fa743e7157d716e144cad849b2dd94b", size = 148551, upload-time = "2025-08-09T07:57:06.823Z" }, + { url = "https://files.pythonhosted.org/packages/61/c5/dc3ba772489c453621ffc27e8978a98fe7e41a93e787e5e5bde797f1dddb/charset_normalizer-3.4.3-cp38-cp38-win32.whl", hash = "sha256:ec557499516fc90fd374bf2e32349a2887a876fbf162c160e3c01b6849eaf557", size = 98459, upload-time = "2025-08-09T07:57:08.031Z" }, + { url = "https://files.pythonhosted.org/packages/05/35/bb59b1cd012d7196fc81c2f5879113971efc226a63812c9cf7f89fe97c40/charset_normalizer-3.4.3-cp38-cp38-win_amd64.whl", hash = "sha256:5d8d01eac18c423815ed4f4a2ec3b439d654e55ee4ad610e153cf02faf67ea40", size = 105887, upload-time = "2025-08-09T07:57:09.401Z" }, + { url = "https://files.pythonhosted.org/packages/c2/ca/9a0983dd5c8e9733565cf3db4df2b0a2e9a82659fd8aa2a868ac6e4a991f/charset_normalizer-3.4.3-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:70bfc5f2c318afece2f5838ea5e4c3febada0be750fcf4775641052bbba14d05", size = 207520, upload-time = "2025-08-09T07:57:11.026Z" }, + { url = "https://files.pythonhosted.org/packages/39/c6/99271dc37243a4f925b09090493fb96c9333d7992c6187f5cfe5312008d2/charset_normalizer-3.4.3-cp39-cp39-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:23b6b24d74478dc833444cbd927c338349d6ae852ba53a0d02a2de1fce45b96e", size = 147307, upload-time = "2025-08-09T07:57:12.4Z" }, + { url = "https://files.pythonhosted.org/packages/e4/69/132eab043356bba06eb333cc2cc60c6340857d0a2e4ca6dc2b51312886b3/charset_normalizer-3.4.3-cp39-cp39-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:34a7f768e3f985abdb42841e20e17b330ad3aaf4bb7e7aeeb73db2e70f077b99", size = 160448, upload-time = "2025-08-09T07:57:13.712Z" }, + { url = "https://files.pythonhosted.org/packages/04/9a/914d294daa4809c57667b77470533e65def9c0be1ef8b4c1183a99170e9d/charset_normalizer-3.4.3-cp39-cp39-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:fb731e5deb0c7ef82d698b0f4c5bb724633ee2a489401594c5c88b02e6cb15f7", size = 157758, upload-time = "2025-08-09T07:57:14.979Z" }, + { url = "https://files.pythonhosted.org/packages/b0/a8/6f5bcf1bcf63cb45625f7c5cadca026121ff8a6c8a3256d8d8cd59302663/charset_normalizer-3.4.3-cp39-cp39-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:257f26fed7d7ff59921b78244f3cd93ed2af1800ff048c33f624c87475819dd7", size = 152487, upload-time = "2025-08-09T07:57:16.332Z" }, + { url = "https://files.pythonhosted.org/packages/c4/72/d3d0e9592f4e504f9dea08b8db270821c909558c353dc3b457ed2509f2fb/charset_normalizer-3.4.3-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:1ef99f0456d3d46a50945c98de1774da86f8e992ab5c77865ea8b8195341fc19", size = 150054, upload-time = "2025-08-09T07:57:17.576Z" }, + { url = "https://files.pythonhosted.org/packages/20/30/5f64fe3981677fe63fa987b80e6c01042eb5ff653ff7cec1b7bd9268e54e/charset_normalizer-3.4.3-cp39-cp39-musllinux_1_2_ppc64le.whl", hash = "sha256:2c322db9c8c89009a990ef07c3bcc9f011a3269bc06782f916cd3d9eed7c9312", size = 161703, upload-time = "2025-08-09T07:57:20.012Z" }, + { url = "https://files.pythonhosted.org/packages/e1/ef/dd08b2cac9284fd59e70f7d97382c33a3d0a926e45b15fc21b3308324ffd/charset_normalizer-3.4.3-cp39-cp39-musllinux_1_2_s390x.whl", hash = "sha256:511729f456829ef86ac41ca78c63a5cb55240ed23b4b737faca0eb1abb1c41bc", size = 159096, upload-time = "2025-08-09T07:57:21.329Z" }, + { url = "https://files.pythonhosted.org/packages/45/8c/dcef87cfc2b3f002a6478f38906f9040302c68aebe21468090e39cde1445/charset_normalizer-3.4.3-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:88ab34806dea0671532d3f82d82b85e8fc23d7b2dd12fa837978dad9bb392a34", size = 153852, upload-time = "2025-08-09T07:57:22.608Z" }, + { url = "https://files.pythonhosted.org/packages/63/86/9cbd533bd37883d467fcd1bd491b3547a3532d0fbb46de2b99feeebf185e/charset_normalizer-3.4.3-cp39-cp39-win32.whl", hash = "sha256:16a8770207946ac75703458e2c743631c79c59c5890c80011d536248f8eaa432", size = 99840, upload-time = "2025-08-09T07:57:23.883Z" }, + { url = "https://files.pythonhosted.org/packages/ce/d6/7e805c8e5c46ff9729c49950acc4ee0aeb55efb8b3a56687658ad10c3216/charset_normalizer-3.4.3-cp39-cp39-win_amd64.whl", hash = "sha256:d22dbedd33326a4a5190dd4fe9e9e693ef12160c77382d9e87919bce54f3d4ca", size = 107438, upload-time = "2025-08-09T07:57:25.287Z" }, + { url = "https://files.pythonhosted.org/packages/8a/1f/f041989e93b001bc4e44bb1669ccdcf54d3f00e628229a85b08d330615c5/charset_normalizer-3.4.3-py3-none-any.whl", hash = "sha256:ce571ab16d890d23b5c278547ba694193a45011ff86a9162a71307ed9f86759a", size = 53175, upload-time = "2025-08-09T07:57:26.864Z" }, +] + +[[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, upload-time = "2022-10-25T02:36:22.414Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/d1/d6/3965ed04c63042e047cb6a3e6ed1a63a35087b6a609aa3a15ed8ac56c221/colorama-0.4.6-py2.py3-none-any.whl", hash = "sha256:4f1d9991f5acc0ca119f9d443620b77f9d6b33703e51011c16baf57afb285fc6", size = 25335, upload-time = "2022-10-25T02:36:20.889Z" }, +] + +[[package]] +name = "coverage" +version = "7.2.7" +source = { registry = "https://pypi.org/simple" } +resolution-markers = [ + "python_full_version < '3.8'", +] +sdist = { url = "https://files.pythonhosted.org/packages/45/8b/421f30467e69ac0e414214856798d4bc32da1336df745e49e49ae5c1e2a8/coverage-7.2.7.tar.gz", hash = "sha256:924d94291ca674905fe9481f12294eb11f2d3d3fd1adb20314ba89e94f44ed59", size = 762575, upload-time = "2023-05-29T20:08:50.273Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/01/24/be01e62a7bce89bcffe04729c540382caa5a06bee45ae42136c93e2499f5/coverage-7.2.7-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:d39b5b4f2a66ccae8b7263ac3c8170994b65266797fb96cbbfd3fb5b23921db8", size = 200724, upload-time = "2023-05-29T20:07:03.422Z" }, + { url = "https://files.pythonhosted.org/packages/3d/80/7060a445e1d2c9744b683dc935248613355657809d6c6b2716cdf4ca4766/coverage-7.2.7-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:6d040ef7c9859bb11dfeb056ff5b3872436e3b5e401817d87a31e1750b9ae2fb", size = 201024, upload-time = "2023-05-29T20:07:05.694Z" }, + { url = "https://files.pythonhosted.org/packages/b8/9d/926fce7e03dbfc653104c2d981c0fa71f0572a9ebd344d24c573bd6f7c4f/coverage-7.2.7-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ba90a9563ba44a72fda2e85302c3abc71c5589cea608ca16c22b9804262aaeb6", size = 229528, upload-time = "2023-05-29T20:07:07.307Z" }, + { url = "https://files.pythonhosted.org/packages/d1/3a/67f5d18f911abf96857f6f7e4df37ca840e38179e2cc9ab6c0b9c3380f19/coverage-7.2.7-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:e7d9405291c6928619403db1d10bd07888888ec1abcbd9748fdaa971d7d661b2", size = 227842, upload-time = "2023-05-29T20:07:09.331Z" }, + { url = "https://files.pythonhosted.org/packages/b4/bd/1b2331e3a04f4cc9b7b332b1dd0f3a1261dfc4114f8479bebfcc2afee9e8/coverage-7.2.7-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:31563e97dae5598556600466ad9beea39fb04e0229e61c12eaa206e0aa202063", size = 228717, upload-time = "2023-05-29T20:07:11.38Z" }, + { url = "https://files.pythonhosted.org/packages/2b/86/3dbf9be43f8bf6a5ca28790a713e18902b2d884bc5fa9512823a81dff601/coverage-7.2.7-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:ebba1cd308ef115925421d3e6a586e655ca5a77b5bf41e02eb0e4562a111f2d1", size = 234632, upload-time = "2023-05-29T20:07:13.376Z" }, + { url = "https://files.pythonhosted.org/packages/91/e8/469ed808a782b9e8305a08bad8c6fa5f8e73e093bda6546c5aec68275bff/coverage-7.2.7-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:cb017fd1b2603ef59e374ba2063f593abe0fc45f2ad9abdde5b4d83bd922a353", size = 232875, upload-time = "2023-05-29T20:07:15.093Z" }, + { url = "https://files.pythonhosted.org/packages/29/8f/4fad1c2ba98104425009efd7eaa19af9a7c797e92d40cd2ec026fa1f58cb/coverage-7.2.7-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:d62a5c7dad11015c66fbb9d881bc4caa5b12f16292f857842d9d1871595f4495", size = 234094, upload-time = "2023-05-29T20:07:17.013Z" }, + { url = "https://files.pythonhosted.org/packages/94/4e/d4e46a214ae857be3d7dc5de248ba43765f60daeb1ab077cb6c1536c7fba/coverage-7.2.7-cp310-cp310-win32.whl", hash = "sha256:ee57190f24fba796e36bb6d3aa8a8783c643d8fa9760c89f7a98ab5455fbf818", size = 203184, upload-time = "2023-05-29T20:07:18.69Z" }, + { url = "https://files.pythonhosted.org/packages/1f/e9/d6730247d8dec2a3dddc520ebe11e2e860f0f98cee3639e23de6cf920255/coverage-7.2.7-cp310-cp310-win_amd64.whl", hash = "sha256:f75f7168ab25dd93110c8a8117a22450c19976afbc44234cbf71481094c1b850", size = 204096, upload-time = "2023-05-29T20:07:20.153Z" }, + { url = "https://files.pythonhosted.org/packages/c6/fa/529f55c9a1029c840bcc9109d5a15ff00478b7ff550a1ae361f8745f8ad5/coverage-7.2.7-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:06a9a2be0b5b576c3f18f1a241f0473575c4a26021b52b2a85263a00f034d51f", size = 200895, upload-time = "2023-05-29T20:07:21.963Z" }, + { url = "https://files.pythonhosted.org/packages/67/d7/cd8fe689b5743fffac516597a1222834c42b80686b99f5b44ef43ccc2a43/coverage-7.2.7-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:5baa06420f837184130752b7c5ea0808762083bf3487b5038d68b012e5937dbe", size = 201120, upload-time = "2023-05-29T20:07:23.765Z" }, + { url = "https://files.pythonhosted.org/packages/8c/95/16eed713202406ca0a37f8ac259bbf144c9d24f9b8097a8e6ead61da2dbb/coverage-7.2.7-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:fdec9e8cbf13a5bf63290fc6013d216a4c7232efb51548594ca3631a7f13c3a3", size = 233178, upload-time = "2023-05-29T20:07:25.281Z" }, + { url = "https://files.pythonhosted.org/packages/c1/49/4d487e2ad5d54ed82ac1101e467e8994c09d6123c91b2a962145f3d262c2/coverage-7.2.7-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:52edc1a60c0d34afa421c9c37078817b2e67a392cab17d97283b64c5833f427f", size = 230754, upload-time = "2023-05-29T20:07:27.044Z" }, + { url = "https://files.pythonhosted.org/packages/a7/cd/3ce94ad9d407a052dc2a74fbeb1c7947f442155b28264eb467ee78dea812/coverage-7.2.7-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:63426706118b7f5cf6bb6c895dc215d8a418d5952544042c8a2d9fe87fcf09cb", size = 232558, upload-time = "2023-05-29T20:07:28.743Z" }, + { url = "https://files.pythonhosted.org/packages/8f/a8/12cc7b261f3082cc299ab61f677f7e48d93e35ca5c3c2f7241ed5525ccea/coverage-7.2.7-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:afb17f84d56068a7c29f5fa37bfd38d5aba69e3304af08ee94da8ed5b0865833", size = 241509, upload-time = "2023-05-29T20:07:30.434Z" }, + { url = "https://files.pythonhosted.org/packages/04/fa/43b55101f75a5e9115259e8be70ff9279921cb6b17f04c34a5702ff9b1f7/coverage-7.2.7-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:48c19d2159d433ccc99e729ceae7d5293fbffa0bdb94952d3579983d1c8c9d97", size = 239924, upload-time = "2023-05-29T20:07:32.065Z" }, + { url = "https://files.pythonhosted.org/packages/68/5f/d2bd0f02aa3c3e0311986e625ccf97fdc511b52f4f1a063e4f37b624772f/coverage-7.2.7-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:0e1f928eaf5469c11e886fe0885ad2bf1ec606434e79842a879277895a50942a", size = 240977, upload-time = "2023-05-29T20:07:34.184Z" }, + { url = "https://files.pythonhosted.org/packages/ba/92/69c0722882643df4257ecc5437b83f4c17ba9e67f15dc6b77bad89b6982e/coverage-7.2.7-cp311-cp311-win32.whl", hash = "sha256:33d6d3ea29d5b3a1a632b3c4e4f4ecae24ef170b0b9ee493883f2df10039959a", size = 203168, upload-time = "2023-05-29T20:07:35.869Z" }, + { url = "https://files.pythonhosted.org/packages/b1/96/c12ed0dfd4ec587f3739f53eb677b9007853fd486ccb0e7d5512a27bab2e/coverage-7.2.7-cp311-cp311-win_amd64.whl", hash = "sha256:5b7540161790b2f28143191f5f8ec02fb132660ff175b7747b95dcb77ac26562", size = 204185, upload-time = "2023-05-29T20:07:37.39Z" }, + { url = "https://files.pythonhosted.org/packages/ff/d5/52fa1891d1802ab2e1b346d37d349cb41cdd4fd03f724ebbf94e80577687/coverage-7.2.7-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:f2f67fe12b22cd130d34d0ef79206061bfb5eda52feb6ce0dba0644e20a03cf4", size = 201020, upload-time = "2023-05-29T20:07:38.724Z" }, + { url = "https://files.pythonhosted.org/packages/24/df/6765898d54ea20e3197a26d26bb65b084deefadd77ce7de946b9c96dfdc5/coverage-7.2.7-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a342242fe22407f3c17f4b499276a02b01e80f861f1682ad1d95b04018e0c0d4", size = 233994, upload-time = "2023-05-29T20:07:40.274Z" }, + { url = "https://files.pythonhosted.org/packages/15/81/b108a60bc758b448c151e5abceed027ed77a9523ecbc6b8a390938301841/coverage-7.2.7-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:171717c7cb6b453aebac9a2ef603699da237f341b38eebfee9be75d27dc38e01", size = 231358, upload-time = "2023-05-29T20:07:41.998Z" }, + { url = "https://files.pythonhosted.org/packages/61/90/c76b9462f39897ebd8714faf21bc985b65c4e1ea6dff428ea9dc711ed0dd/coverage-7.2.7-cp312-cp312-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:49969a9f7ffa086d973d91cec8d2e31080436ef0fb4a359cae927e742abfaaa6", size = 233316, upload-time = "2023-05-29T20:07:43.539Z" }, + { url = "https://files.pythonhosted.org/packages/04/d6/8cba3bf346e8b1a4fb3f084df7d8cea25a6b6c56aaca1f2e53829be17e9e/coverage-7.2.7-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:b46517c02ccd08092f4fa99f24c3b83d8f92f739b4657b0f146246a0ca6a831d", size = 240159, upload-time = "2023-05-29T20:07:44.982Z" }, + { url = "https://files.pythonhosted.org/packages/6e/ea/4a252dc77ca0605b23d477729d139915e753ee89e4c9507630e12ad64a80/coverage-7.2.7-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:a3d33a6b3eae87ceaefa91ffdc130b5e8536182cd6dfdbfc1aa56b46ff8c86de", size = 238127, upload-time = "2023-05-29T20:07:46.522Z" }, + { url = "https://files.pythonhosted.org/packages/9f/5c/d9760ac497c41f9c4841f5972d0edf05d50cad7814e86ee7d133ec4a0ac8/coverage-7.2.7-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:976b9c42fb2a43ebf304fa7d4a310e5f16cc99992f33eced91ef6f908bd8f33d", size = 239833, upload-time = "2023-05-29T20:07:47.992Z" }, + { url = "https://files.pythonhosted.org/packages/69/8c/26a95b08059db1cbb01e4b0e6d40f2e9debb628c6ca86b78f625ceaf9bab/coverage-7.2.7-cp312-cp312-win32.whl", hash = "sha256:8de8bb0e5ad103888d65abef8bca41ab93721647590a3f740100cd65c3b00511", size = 203463, upload-time = "2023-05-29T20:07:49.939Z" }, + { url = "https://files.pythonhosted.org/packages/b7/00/14b00a0748e9eda26e97be07a63cc911108844004687321ddcc213be956c/coverage-7.2.7-cp312-cp312-win_amd64.whl", hash = "sha256:9e31cb64d7de6b6f09702bb27c02d1904b3aebfca610c12772452c4e6c21a0d3", size = 204347, upload-time = "2023-05-29T20:07:51.909Z" }, + { url = "https://files.pythonhosted.org/packages/80/d7/67937c80b8fd4c909fdac29292bc8b35d9505312cff6bcab41c53c5b1df6/coverage-7.2.7-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:58c2ccc2f00ecb51253cbe5d8d7122a34590fac9646a960d1430d5b15321d95f", size = 200580, upload-time = "2023-05-29T20:07:54.076Z" }, + { url = "https://files.pythonhosted.org/packages/7a/05/084864fa4bbf8106f44fb72a56e67e0cd372d3bf9d893be818338c81af5d/coverage-7.2.7-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d22656368f0e6189e24722214ed8d66b8022db19d182927b9a248a2a8a2f67eb", size = 226237, upload-time = "2023-05-29T20:07:56.28Z" }, + { url = "https://files.pythonhosted.org/packages/67/a2/6fa66a50e6e894286d79a3564f42bd54a9bd27049dc0a63b26d9924f0aa3/coverage-7.2.7-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:a895fcc7b15c3fc72beb43cdcbdf0ddb7d2ebc959edac9cef390b0d14f39f8a9", size = 224256, upload-time = "2023-05-29T20:07:58.189Z" }, + { url = "https://files.pythonhosted.org/packages/e2/c0/73f139794c742840b9ab88e2e17fe14a3d4668a166ff95d812ac66c0829d/coverage-7.2.7-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e84606b74eb7de6ff581a7915e2dab7a28a0517fbe1c9239eb227e1354064dcd", size = 225550, upload-time = "2023-05-29T20:08:00.383Z" }, + { url = "https://files.pythonhosted.org/packages/03/ec/6f30b4e0c96ce03b0e64aec46b4af2a8c49b70d1b5d0d69577add757b946/coverage-7.2.7-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:0a5f9e1dbd7fbe30196578ca36f3fba75376fb99888c395c5880b355e2875f8a", size = 232440, upload-time = "2023-05-29T20:08:02.495Z" }, + { url = "https://files.pythonhosted.org/packages/22/c1/2f6c1b6f01a0996c9e067a9c780e1824351dbe17faae54388a4477e6d86f/coverage-7.2.7-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:419bfd2caae268623dd469eff96d510a920c90928b60f2073d79f8fe2bbc5959", size = 230897, upload-time = "2023-05-29T20:08:04.382Z" }, + { url = "https://files.pythonhosted.org/packages/8d/d6/53e999ec1bf7498ca4bc5f3b8227eb61db39068d2de5dcc359dec5601b5a/coverage-7.2.7-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:2aee274c46590717f38ae5e4650988d1af340fe06167546cc32fe2f58ed05b02", size = 232024, upload-time = "2023-05-29T20:08:06.031Z" }, + { url = "https://files.pythonhosted.org/packages/e9/40/383305500d24122dbed73e505a4d6828f8f3356d1f68ab6d32c781754b81/coverage-7.2.7-cp37-cp37m-win32.whl", hash = "sha256:61b9a528fb348373c433e8966535074b802c7a5d7f23c4f421e6c6e2f1697a6f", size = 203293, upload-time = "2023-05-29T20:08:07.598Z" }, + { url = "https://files.pythonhosted.org/packages/0e/bc/7e3a31534fabb043269f14fb64e2bb2733f85d4cf39e5bbc71357c57553a/coverage-7.2.7-cp37-cp37m-win_amd64.whl", hash = "sha256:b1c546aca0ca4d028901d825015dc8e4d56aac4b541877690eb76490f1dc8ed0", size = 204040, upload-time = "2023-05-29T20:08:09.919Z" }, + { url = "https://files.pythonhosted.org/packages/c6/fc/be19131010930a6cf271da48202c8cc1d3f971f68c02fb2d3a78247f43dc/coverage-7.2.7-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:54b896376ab563bd38453cecb813c295cf347cf5906e8b41d340b0321a5433e5", size = 200689, upload-time = "2023-05-29T20:08:11.594Z" }, + { url = "https://files.pythonhosted.org/packages/28/d7/9a8de57d87f4bbc6f9a6a5ded1eaac88a89bf71369bb935dac3c0cf2893e/coverage-7.2.7-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:3d376df58cc111dc8e21e3b6e24606b5bb5dee6024f46a5abca99124b2229ef5", size = 200986, upload-time = "2023-05-29T20:08:13.228Z" }, + { url = "https://files.pythonhosted.org/packages/c8/e4/e6182e4697665fb594a7f4e4f27cb3a4dd00c2e3d35c5c706765de8c7866/coverage-7.2.7-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5e330fc79bd7207e46c7d7fd2bb4af2963f5f635703925543a70b99574b0fea9", size = 230648, upload-time = "2023-05-29T20:08:15.11Z" }, + { url = "https://files.pythonhosted.org/packages/7b/e3/f552d5871943f747165b92a924055c5d6daa164ae659a13f9018e22f3990/coverage-7.2.7-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:1e9d683426464e4a252bf70c3498756055016f99ddaec3774bf368e76bbe02b6", size = 228511, upload-time = "2023-05-29T20:08:16.877Z" }, + { url = "https://files.pythonhosted.org/packages/44/55/49f65ccdd4dfd6d5528e966b28c37caec64170c725af32ab312889d2f857/coverage-7.2.7-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8d13c64ee2d33eccf7437961b6ea7ad8673e2be040b4f7fd4fd4d4d28d9ccb1e", size = 229852, upload-time = "2023-05-29T20:08:18.47Z" }, + { url = "https://files.pythonhosted.org/packages/0d/31/340428c238eb506feb96d4fb5c9ea614db1149517f22cc7ab8c6035ef6d9/coverage-7.2.7-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:b7aa5f8a41217360e600da646004f878250a0d6738bcdc11a0a39928d7dc2050", size = 235578, upload-time = "2023-05-29T20:08:20.298Z" }, + { url = "https://files.pythonhosted.org/packages/dd/ce/97c1dd6592c908425622fe7f31c017d11cf0421729b09101d4de75bcadc8/coverage-7.2.7-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:8fa03bce9bfbeeef9f3b160a8bed39a221d82308b4152b27d82d8daa7041fee5", size = 234079, upload-time = "2023-05-29T20:08:22.365Z" }, + { url = "https://files.pythonhosted.org/packages/de/a3/5a98dc9e239d0dc5f243ef5053d5b1bdcaa1dee27a691dfc12befeccf878/coverage-7.2.7-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:245167dd26180ab4c91d5e1496a30be4cd721a5cf2abf52974f965f10f11419f", size = 234991, upload-time = "2023-05-29T20:08:24.974Z" }, + { url = "https://files.pythonhosted.org/packages/4a/fb/78986d3022e5ccf2d4370bc43a5fef8374f092b3c21d32499dee8e30b7b6/coverage-7.2.7-cp38-cp38-win32.whl", hash = "sha256:d2c2db7fd82e9b72937969bceac4d6ca89660db0a0967614ce2481e81a0b771e", size = 203160, upload-time = "2023-05-29T20:08:26.701Z" }, + { url = "https://files.pythonhosted.org/packages/c3/1c/6b3c9c363fb1433c79128e0d692863deb761b1b78162494abb9e5c328bc0/coverage-7.2.7-cp38-cp38-win_amd64.whl", hash = "sha256:2e07b54284e381531c87f785f613b833569c14ecacdcb85d56b25c4622c16c3c", size = 204085, upload-time = "2023-05-29T20:08:28.146Z" }, + { url = "https://files.pythonhosted.org/packages/88/da/495944ebf0ad246235a6bd523810d9f81981f9b81c6059ba1f56e943abe0/coverage-7.2.7-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:537891ae8ce59ef63d0123f7ac9e2ae0fc8b72c7ccbe5296fec45fd68967b6c9", size = 200725, upload-time = "2023-05-29T20:08:29.851Z" }, + { url = "https://files.pythonhosted.org/packages/ca/0c/3dfeeb1006c44b911ee0ed915350db30325d01808525ae7cc8d57643a2ce/coverage-7.2.7-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:06fb182e69f33f6cd1d39a6c597294cff3143554b64b9825d1dc69d18cc2fff2", size = 201022, upload-time = "2023-05-29T20:08:31.429Z" }, + { url = "https://files.pythonhosted.org/packages/61/af/5964b8d7d9a5c767785644d9a5a63cacba9a9c45cc42ba06d25895ec87be/coverage-7.2.7-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:201e7389591af40950a6480bd9edfa8ed04346ff80002cec1a66cac4549c1ad7", size = 229102, upload-time = "2023-05-29T20:08:32.982Z" }, + { url = "https://files.pythonhosted.org/packages/d9/1d/cd467fceb62c371f9adb1d739c92a05d4e550246daa90412e711226bd320/coverage-7.2.7-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:f6951407391b639504e3b3be51b7ba5f3528adbf1a8ac3302b687ecababf929e", size = 227441, upload-time = "2023-05-29T20:08:35.044Z" }, + { url = "https://files.pythonhosted.org/packages/fe/57/e4f8ad64d84ca9e759d783a052795f62a9f9111585e46068845b1cb52c2b/coverage-7.2.7-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6f48351d66575f535669306aa7d6d6f71bc43372473b54a832222803eb956fd1", size = 228265, upload-time = "2023-05-29T20:08:36.861Z" }, + { url = "https://files.pythonhosted.org/packages/88/8b/b0d9fe727acae907fa7f1c8194ccb6fe9d02e1c3e9001ecf74c741f86110/coverage-7.2.7-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:b29019c76039dc3c0fd815c41392a044ce555d9bcdd38b0fb60fb4cd8e475ba9", size = 234217, upload-time = "2023-05-29T20:08:38.837Z" }, + { url = "https://files.pythonhosted.org/packages/66/2e/c99fe1f6396d93551aa352c75410686e726cd4ea104479b9af1af22367ce/coverage-7.2.7-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:81c13a1fc7468c40f13420732805a4c38a105d89848b7c10af65a90beff25250", size = 232466, upload-time = "2023-05-29T20:08:40.768Z" }, + { url = "https://files.pythonhosted.org/packages/bb/e9/88747b40c8fb4a783b40222510ce6d66170217eb05d7f46462c36b4fa8cc/coverage-7.2.7-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:975d70ab7e3c80a3fe86001d8751f6778905ec723f5b110aed1e450da9d4b7f2", size = 233669, upload-time = "2023-05-29T20:08:42.944Z" }, + { url = "https://files.pythonhosted.org/packages/b1/d5/a8e276bc005e42114468d4fe03e0a9555786bc51cbfe0d20827a46c1565a/coverage-7.2.7-cp39-cp39-win32.whl", hash = "sha256:7ee7d9d4822c8acc74a5e26c50604dff824710bc8de424904c0982e25c39c6cb", size = 203199, upload-time = "2023-05-29T20:08:44.734Z" }, + { url = "https://files.pythonhosted.org/packages/a9/0c/4a848ae663b47f1195abcb09a951751dd61f80b503303b9b9d768e0fd321/coverage-7.2.7-cp39-cp39-win_amd64.whl", hash = "sha256:eb393e5ebc85245347950143969b241d08b52b88a3dc39479822e073a1a8eb27", size = 204109, upload-time = "2023-05-29T20:08:46.417Z" }, + { url = "https://files.pythonhosted.org/packages/67/fb/b3b1d7887e1ea25a9608b0776e480e4bbc303ca95a31fd585555ec4fff5a/coverage-7.2.7-pp37.pp38.pp39-none-any.whl", hash = "sha256:b7b4c971f05e6ae490fef852c218b0e79d4e52f79ef0c8475566584a8fb3e01d", size = 193207, upload-time = "2023-05-29T20:08:48.153Z" }, +] + +[package.optional-dependencies] +toml = [ + { name = "tomli", version = "2.0.1", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.8'" }, +] + +[[package]] +name = "coverage" +version = "7.6.1" +source = { registry = "https://pypi.org/simple" } +resolution-markers = [ + "python_full_version >= '3.8.1' and python_full_version < '3.9'", + "python_full_version >= '3.8' and python_full_version < '3.8.1'", +] +sdist = { url = "https://files.pythonhosted.org/packages/f7/08/7e37f82e4d1aead42a7443ff06a1e406aabf7302c4f00a546e4b320b994c/coverage-7.6.1.tar.gz", hash = "sha256:953510dfb7b12ab69d20135a0662397f077c59b1e6379a768e97c59d852ee51d", size = 798791, upload-time = "2024-08-04T19:45:30.9Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/7e/61/eb7ce5ed62bacf21beca4937a90fe32545c91a3c8a42a30c6616d48fc70d/coverage-7.6.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:b06079abebbc0e89e6163b8e8f0e16270124c154dc6e4a47b413dd538859af16", size = 206690, upload-time = "2024-08-04T19:43:07.695Z" }, + { url = "https://files.pythonhosted.org/packages/7d/73/041928e434442bd3afde5584bdc3f932fb4562b1597629f537387cec6f3d/coverage-7.6.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:cf4b19715bccd7ee27b6b120e7e9dd56037b9c0681dcc1adc9ba9db3d417fa36", size = 207127, upload-time = "2024-08-04T19:43:10.15Z" }, + { url = "https://files.pythonhosted.org/packages/c7/c8/6ca52b5147828e45ad0242388477fdb90df2c6cbb9a441701a12b3c71bc8/coverage-7.6.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e61c0abb4c85b095a784ef23fdd4aede7a2628478e7baba7c5e3deba61070a02", size = 235654, upload-time = "2024-08-04T19:43:12.405Z" }, + { url = "https://files.pythonhosted.org/packages/d5/da/9ac2b62557f4340270942011d6efeab9833648380109e897d48ab7c1035d/coverage-7.6.1-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:fd21f6ae3f08b41004dfb433fa895d858f3f5979e7762d052b12aef444e29afc", size = 233598, upload-time = "2024-08-04T19:43:14.078Z" }, + { url = "https://files.pythonhosted.org/packages/53/23/9e2c114d0178abc42b6d8d5281f651a8e6519abfa0ef460a00a91f80879d/coverage-7.6.1-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8f59d57baca39b32db42b83b2a7ba6f47ad9c394ec2076b084c3f029b7afca23", size = 234732, upload-time = "2024-08-04T19:43:16.632Z" }, + { url = "https://files.pythonhosted.org/packages/0f/7e/a0230756fb133343a52716e8b855045f13342b70e48e8ad41d8a0d60ab98/coverage-7.6.1-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:a1ac0ae2b8bd743b88ed0502544847c3053d7171a3cff9228af618a068ed9c34", size = 233816, upload-time = "2024-08-04T19:43:19.049Z" }, + { url = "https://files.pythonhosted.org/packages/28/7c/3753c8b40d232b1e5eeaed798c875537cf3cb183fb5041017c1fdb7ec14e/coverage-7.6.1-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:e6a08c0be454c3b3beb105c0596ebdc2371fab6bb90c0c0297f4e58fd7e1012c", size = 232325, upload-time = "2024-08-04T19:43:21.246Z" }, + { url = "https://files.pythonhosted.org/packages/57/e3/818a2b2af5b7573b4b82cf3e9f137ab158c90ea750a8f053716a32f20f06/coverage-7.6.1-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:f5796e664fe802da4f57a168c85359a8fbf3eab5e55cd4e4569fbacecc903959", size = 233418, upload-time = "2024-08-04T19:43:22.945Z" }, + { url = "https://files.pythonhosted.org/packages/c8/fb/4532b0b0cefb3f06d201648715e03b0feb822907edab3935112b61b885e2/coverage-7.6.1-cp310-cp310-win32.whl", hash = "sha256:7bb65125fcbef8d989fa1dd0e8a060999497629ca5b0efbca209588a73356232", size = 209343, upload-time = "2024-08-04T19:43:25.121Z" }, + { url = "https://files.pythonhosted.org/packages/5a/25/af337cc7421eca1c187cc9c315f0a755d48e755d2853715bfe8c418a45fa/coverage-7.6.1-cp310-cp310-win_amd64.whl", hash = "sha256:3115a95daa9bdba70aea750db7b96b37259a81a709223c8448fa97727d546fe0", size = 210136, upload-time = "2024-08-04T19:43:26.851Z" }, + { url = "https://files.pythonhosted.org/packages/ad/5f/67af7d60d7e8ce61a4e2ddcd1bd5fb787180c8d0ae0fbd073f903b3dd95d/coverage-7.6.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:7dea0889685db8550f839fa202744652e87c60015029ce3f60e006f8c4462c93", size = 206796, upload-time = "2024-08-04T19:43:29.115Z" }, + { url = "https://files.pythonhosted.org/packages/e1/0e/e52332389e057daa2e03be1fbfef25bb4d626b37d12ed42ae6281d0a274c/coverage-7.6.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:ed37bd3c3b063412f7620464a9ac1314d33100329f39799255fb8d3027da50d3", size = 207244, upload-time = "2024-08-04T19:43:31.285Z" }, + { url = "https://files.pythonhosted.org/packages/aa/cd/766b45fb6e090f20f8927d9c7cb34237d41c73a939358bc881883fd3a40d/coverage-7.6.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d85f5e9a5f8b73e2350097c3756ef7e785f55bd71205defa0bfdaf96c31616ff", size = 239279, upload-time = "2024-08-04T19:43:33.581Z" }, + { url = "https://files.pythonhosted.org/packages/70/6c/a9ccd6fe50ddaf13442a1e2dd519ca805cbe0f1fcd377fba6d8339b98ccb/coverage-7.6.1-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:9bc572be474cafb617672c43fe989d6e48d3c83af02ce8de73fff1c6bb3c198d", size = 236859, upload-time = "2024-08-04T19:43:35.301Z" }, + { url = "https://files.pythonhosted.org/packages/14/6f/8351b465febb4dbc1ca9929505202db909c5a635c6fdf33e089bbc3d7d85/coverage-7.6.1-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0c0420b573964c760df9e9e86d1a9a622d0d27f417e1a949a8a66dd7bcee7bc6", size = 238549, upload-time = "2024-08-04T19:43:37.578Z" }, + { url = "https://files.pythonhosted.org/packages/68/3c/289b81fa18ad72138e6d78c4c11a82b5378a312c0e467e2f6b495c260907/coverage-7.6.1-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:1f4aa8219db826ce6be7099d559f8ec311549bfc4046f7f9fe9b5cea5c581c56", size = 237477, upload-time = "2024-08-04T19:43:39.92Z" }, + { url = "https://files.pythonhosted.org/packages/ed/1c/aa1efa6459d822bd72c4abc0b9418cf268de3f60eeccd65dc4988553bd8d/coverage-7.6.1-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:fc5a77d0c516700ebad189b587de289a20a78324bc54baee03dd486f0855d234", size = 236134, upload-time = "2024-08-04T19:43:41.453Z" }, + { url = "https://files.pythonhosted.org/packages/fb/c8/521c698f2d2796565fe9c789c2ee1ccdae610b3aa20b9b2ef980cc253640/coverage-7.6.1-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:b48f312cca9621272ae49008c7f613337c53fadca647d6384cc129d2996d1133", size = 236910, upload-time = "2024-08-04T19:43:43.037Z" }, + { url = "https://files.pythonhosted.org/packages/7d/30/033e663399ff17dca90d793ee8a2ea2890e7fdf085da58d82468b4220bf7/coverage-7.6.1-cp311-cp311-win32.whl", hash = "sha256:1125ca0e5fd475cbbba3bb67ae20bd2c23a98fac4e32412883f9bcbaa81c314c", size = 209348, upload-time = "2024-08-04T19:43:44.787Z" }, + { url = "https://files.pythonhosted.org/packages/20/05/0d1ccbb52727ccdadaa3ff37e4d2dc1cd4d47f0c3df9eb58d9ec8508ca88/coverage-7.6.1-cp311-cp311-win_amd64.whl", hash = "sha256:8ae539519c4c040c5ffd0632784e21b2f03fc1340752af711f33e5be83a9d6c6", size = 210230, upload-time = "2024-08-04T19:43:46.707Z" }, + { url = "https://files.pythonhosted.org/packages/7e/d4/300fc921dff243cd518c7db3a4c614b7e4b2431b0d1145c1e274fd99bd70/coverage-7.6.1-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:95cae0efeb032af8458fc27d191f85d1717b1d4e49f7cb226cf526ff28179778", size = 206983, upload-time = "2024-08-04T19:43:49.082Z" }, + { url = "https://files.pythonhosted.org/packages/e1/ab/6bf00de5327ecb8db205f9ae596885417a31535eeda6e7b99463108782e1/coverage-7.6.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:5621a9175cf9d0b0c84c2ef2b12e9f5f5071357c4d2ea6ca1cf01814f45d2391", size = 207221, upload-time = "2024-08-04T19:43:52.15Z" }, + { url = "https://files.pythonhosted.org/packages/92/8f/2ead05e735022d1a7f3a0a683ac7f737de14850395a826192f0288703472/coverage-7.6.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:260933720fdcd75340e7dbe9060655aff3af1f0c5d20f46b57f262ab6c86a5e8", size = 240342, upload-time = "2024-08-04T19:43:53.746Z" }, + { url = "https://files.pythonhosted.org/packages/0f/ef/94043e478201ffa85b8ae2d2c79b4081e5a1b73438aafafccf3e9bafb6b5/coverage-7.6.1-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:07e2ca0ad381b91350c0ed49d52699b625aab2b44b65e1b4e02fa9df0e92ad2d", size = 237371, upload-time = "2024-08-04T19:43:55.993Z" }, + { url = "https://files.pythonhosted.org/packages/1f/0f/c890339dd605f3ebc269543247bdd43b703cce6825b5ed42ff5f2d6122c7/coverage-7.6.1-cp312-cp312-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c44fee9975f04b33331cb8eb272827111efc8930cfd582e0320613263ca849ca", size = 239455, upload-time = "2024-08-04T19:43:57.618Z" }, + { url = "https://files.pythonhosted.org/packages/d1/04/7fd7b39ec7372a04efb0f70c70e35857a99b6a9188b5205efb4c77d6a57a/coverage-7.6.1-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:877abb17e6339d96bf08e7a622d05095e72b71f8afd8a9fefc82cf30ed944163", size = 238924, upload-time = "2024-08-04T19:44:00.012Z" }, + { url = "https://files.pythonhosted.org/packages/ed/bf/73ce346a9d32a09cf369f14d2a06651329c984e106f5992c89579d25b27e/coverage-7.6.1-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:3e0cadcf6733c09154b461f1ca72d5416635e5e4ec4e536192180d34ec160f8a", size = 237252, upload-time = "2024-08-04T19:44:01.713Z" }, + { url = "https://files.pythonhosted.org/packages/86/74/1dc7a20969725e917b1e07fe71a955eb34bc606b938316bcc799f228374b/coverage-7.6.1-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:c3c02d12f837d9683e5ab2f3d9844dc57655b92c74e286c262e0fc54213c216d", size = 238897, upload-time = "2024-08-04T19:44:03.898Z" }, + { url = "https://files.pythonhosted.org/packages/b6/e9/d9cc3deceb361c491b81005c668578b0dfa51eed02cd081620e9a62f24ec/coverage-7.6.1-cp312-cp312-win32.whl", hash = "sha256:e05882b70b87a18d937ca6768ff33cc3f72847cbc4de4491c8e73880766718e5", size = 209606, upload-time = "2024-08-04T19:44:05.532Z" }, + { url = "https://files.pythonhosted.org/packages/47/c8/5a2e41922ea6740f77d555c4d47544acd7dc3f251fe14199c09c0f5958d3/coverage-7.6.1-cp312-cp312-win_amd64.whl", hash = "sha256:b5d7b556859dd85f3a541db6a4e0167b86e7273e1cdc973e5b175166bb634fdb", size = 210373, upload-time = "2024-08-04T19:44:07.079Z" }, + { url = "https://files.pythonhosted.org/packages/8c/f9/9aa4dfb751cb01c949c990d136a0f92027fbcc5781c6e921df1cb1563f20/coverage-7.6.1-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:a4acd025ecc06185ba2b801f2de85546e0b8ac787cf9d3b06e7e2a69f925b106", size = 207007, upload-time = "2024-08-04T19:44:09.453Z" }, + { url = "https://files.pythonhosted.org/packages/b9/67/e1413d5a8591622a46dd04ff80873b04c849268831ed5c304c16433e7e30/coverage-7.6.1-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:a6d3adcf24b624a7b778533480e32434a39ad8fa30c315208f6d3e5542aeb6e9", size = 207269, upload-time = "2024-08-04T19:44:11.045Z" }, + { url = "https://files.pythonhosted.org/packages/14/5b/9dec847b305e44a5634d0fb8498d135ab1d88330482b74065fcec0622224/coverage-7.6.1-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d0c212c49b6c10e6951362f7c6df3329f04c2b1c28499563d4035d964ab8e08c", size = 239886, upload-time = "2024-08-04T19:44:12.83Z" }, + { url = "https://files.pythonhosted.org/packages/7b/b7/35760a67c168e29f454928f51f970342d23cf75a2bb0323e0f07334c85f3/coverage-7.6.1-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:6e81d7a3e58882450ec4186ca59a3f20a5d4440f25b1cff6f0902ad890e6748a", size = 237037, upload-time = "2024-08-04T19:44:15.393Z" }, + { url = "https://files.pythonhosted.org/packages/f7/95/d2fd31f1d638df806cae59d7daea5abf2b15b5234016a5ebb502c2f3f7ee/coverage-7.6.1-cp313-cp313-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:78b260de9790fd81e69401c2dc8b17da47c8038176a79092a89cb2b7d945d060", size = 239038, upload-time = "2024-08-04T19:44:17.466Z" }, + { url = "https://files.pythonhosted.org/packages/6e/bd/110689ff5752b67924efd5e2aedf5190cbbe245fc81b8dec1abaffba619d/coverage-7.6.1-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:a78d169acd38300060b28d600344a803628c3fd585c912cacc9ea8790fe96862", size = 238690, upload-time = "2024-08-04T19:44:19.336Z" }, + { url = "https://files.pythonhosted.org/packages/d3/a8/08d7b38e6ff8df52331c83130d0ab92d9c9a8b5462f9e99c9f051a4ae206/coverage-7.6.1-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:2c09f4ce52cb99dd7505cd0fc8e0e37c77b87f46bc9c1eb03fe3bc9991085388", size = 236765, upload-time = "2024-08-04T19:44:20.994Z" }, + { url = "https://files.pythonhosted.org/packages/d6/6a/9cf96839d3147d55ae713eb2d877f4d777e7dc5ba2bce227167d0118dfe8/coverage-7.6.1-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:6878ef48d4227aace338d88c48738a4258213cd7b74fd9a3d4d7582bb1d8a155", size = 238611, upload-time = "2024-08-04T19:44:22.616Z" }, + { url = "https://files.pythonhosted.org/packages/74/e4/7ff20d6a0b59eeaab40b3140a71e38cf52547ba21dbcf1d79c5a32bba61b/coverage-7.6.1-cp313-cp313-win32.whl", hash = "sha256:44df346d5215a8c0e360307d46ffaabe0f5d3502c8a1cefd700b34baf31d411a", size = 209671, upload-time = "2024-08-04T19:44:24.418Z" }, + { url = "https://files.pythonhosted.org/packages/35/59/1812f08a85b57c9fdb6d0b383d779e47b6f643bc278ed682859512517e83/coverage-7.6.1-cp313-cp313-win_amd64.whl", hash = "sha256:8284cf8c0dd272a247bc154eb6c95548722dce90d098c17a883ed36e67cdb129", size = 210368, upload-time = "2024-08-04T19:44:26.276Z" }, + { url = "https://files.pythonhosted.org/packages/9c/15/08913be1c59d7562a3e39fce20661a98c0a3f59d5754312899acc6cb8a2d/coverage-7.6.1-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:d3296782ca4eab572a1a4eca686d8bfb00226300dcefdf43faa25b5242ab8a3e", size = 207758, upload-time = "2024-08-04T19:44:29.028Z" }, + { url = "https://files.pythonhosted.org/packages/c4/ae/b5d58dff26cade02ada6ca612a76447acd69dccdbb3a478e9e088eb3d4b9/coverage-7.6.1-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:502753043567491d3ff6d08629270127e0c31d4184c4c8d98f92c26f65019962", size = 208035, upload-time = "2024-08-04T19:44:30.673Z" }, + { url = "https://files.pythonhosted.org/packages/b8/d7/62095e355ec0613b08dfb19206ce3033a0eedb6f4a67af5ed267a8800642/coverage-7.6.1-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6a89ecca80709d4076b95f89f308544ec8f7b4727e8a547913a35f16717856cb", size = 250839, upload-time = "2024-08-04T19:44:32.412Z" }, + { url = "https://files.pythonhosted.org/packages/7c/1e/c2967cb7991b112ba3766df0d9c21de46b476d103e32bb401b1b2adf3380/coverage-7.6.1-cp313-cp313t-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:a318d68e92e80af8b00fa99609796fdbcdfef3629c77c6283566c6f02c6d6704", size = 246569, upload-time = "2024-08-04T19:44:34.547Z" }, + { url = "https://files.pythonhosted.org/packages/8b/61/a7a6a55dd266007ed3b1df7a3386a0d760d014542d72f7c2c6938483b7bd/coverage-7.6.1-cp313-cp313t-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:13b0a73a0896988f053e4fbb7de6d93388e6dd292b0d87ee51d106f2c11b465b", size = 248927, upload-time = "2024-08-04T19:44:36.313Z" }, + { url = "https://files.pythonhosted.org/packages/c8/fa/13a6f56d72b429f56ef612eb3bc5ce1b75b7ee12864b3bd12526ab794847/coverage-7.6.1-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:4421712dbfc5562150f7554f13dde997a2e932a6b5f352edcce948a815efee6f", size = 248401, upload-time = "2024-08-04T19:44:38.155Z" }, + { url = "https://files.pythonhosted.org/packages/75/06/0429c652aa0fb761fc60e8c6b291338c9173c6aa0f4e40e1902345b42830/coverage-7.6.1-cp313-cp313t-musllinux_1_2_i686.whl", hash = "sha256:166811d20dfea725e2e4baa71fffd6c968a958577848d2131f39b60043400223", size = 246301, upload-time = "2024-08-04T19:44:39.883Z" }, + { url = "https://files.pythonhosted.org/packages/52/76/1766bb8b803a88f93c3a2d07e30ffa359467810e5cbc68e375ebe6906efb/coverage-7.6.1-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:225667980479a17db1048cb2bf8bfb39b8e5be8f164b8f6628b64f78a72cf9d3", size = 247598, upload-time = "2024-08-04T19:44:41.59Z" }, + { url = "https://files.pythonhosted.org/packages/66/8b/f54f8db2ae17188be9566e8166ac6df105c1c611e25da755738025708d54/coverage-7.6.1-cp313-cp313t-win32.whl", hash = "sha256:170d444ab405852903b7d04ea9ae9b98f98ab6d7e63e1115e82620807519797f", size = 210307, upload-time = "2024-08-04T19:44:43.301Z" }, + { url = "https://files.pythonhosted.org/packages/9f/b0/e0dca6da9170aefc07515cce067b97178cefafb512d00a87a1c717d2efd5/coverage-7.6.1-cp313-cp313t-win_amd64.whl", hash = "sha256:b9f222de8cded79c49bf184bdbc06630d4c58eec9459b939b4a690c82ed05657", size = 211453, upload-time = "2024-08-04T19:44:45.677Z" }, + { url = "https://files.pythonhosted.org/packages/81/d0/d9e3d554e38beea5a2e22178ddb16587dbcbe9a1ef3211f55733924bf7fa/coverage-7.6.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:6db04803b6c7291985a761004e9060b2bca08da6d04f26a7f2294b8623a0c1a0", size = 206674, upload-time = "2024-08-04T19:44:47.694Z" }, + { url = "https://files.pythonhosted.org/packages/38/ea/cab2dc248d9f45b2b7f9f1f596a4d75a435cb364437c61b51d2eb33ceb0e/coverage-7.6.1-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:f1adfc8ac319e1a348af294106bc6a8458a0f1633cc62a1446aebc30c5fa186a", size = 207101, upload-time = "2024-08-04T19:44:49.32Z" }, + { url = "https://files.pythonhosted.org/packages/ca/6f/f82f9a500c7c5722368978a5390c418d2a4d083ef955309a8748ecaa8920/coverage-7.6.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a95324a9de9650a729239daea117df21f4b9868ce32e63f8b650ebe6cef5595b", size = 236554, upload-time = "2024-08-04T19:44:51.631Z" }, + { url = "https://files.pythonhosted.org/packages/a6/94/d3055aa33d4e7e733d8fa309d9adf147b4b06a82c1346366fc15a2b1d5fa/coverage-7.6.1-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:b43c03669dc4618ec25270b06ecd3ee4fa94c7f9b3c14bae6571ca00ef98b0d3", size = 234440, upload-time = "2024-08-04T19:44:53.464Z" }, + { url = "https://files.pythonhosted.org/packages/e4/6e/885bcd787d9dd674de4a7d8ec83faf729534c63d05d51d45d4fa168f7102/coverage-7.6.1-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8929543a7192c13d177b770008bc4e8119f2e1f881d563fc6b6305d2d0ebe9de", size = 235889, upload-time = "2024-08-04T19:44:55.165Z" }, + { url = "https://files.pythonhosted.org/packages/f4/63/df50120a7744492710854860783d6819ff23e482dee15462c9a833cc428a/coverage-7.6.1-cp38-cp38-musllinux_1_2_aarch64.whl", hash = "sha256:a09ece4a69cf399510c8ab25e0950d9cf2b42f7b3cb0374f95d2e2ff594478a6", size = 235142, upload-time = "2024-08-04T19:44:57.269Z" }, + { url = "https://files.pythonhosted.org/packages/3a/5d/9d0acfcded2b3e9ce1c7923ca52ccc00c78a74e112fc2aee661125b7843b/coverage-7.6.1-cp38-cp38-musllinux_1_2_i686.whl", hash = "sha256:9054a0754de38d9dbd01a46621636689124d666bad1936d76c0341f7d71bf569", size = 233805, upload-time = "2024-08-04T19:44:59.033Z" }, + { url = "https://files.pythonhosted.org/packages/c4/56/50abf070cb3cd9b1dd32f2c88f083aab561ecbffbcd783275cb51c17f11d/coverage-7.6.1-cp38-cp38-musllinux_1_2_x86_64.whl", hash = "sha256:0dbde0f4aa9a16fa4d754356a8f2e36296ff4d83994b2c9d8398aa32f222f989", size = 234655, upload-time = "2024-08-04T19:45:01.398Z" }, + { url = "https://files.pythonhosted.org/packages/25/ee/b4c246048b8485f85a2426ef4abab88e48c6e80c74e964bea5cd4cd4b115/coverage-7.6.1-cp38-cp38-win32.whl", hash = "sha256:da511e6ad4f7323ee5702e6633085fb76c2f893aaf8ce4c51a0ba4fc07580ea7", size = 209296, upload-time = "2024-08-04T19:45:03.819Z" }, + { url = "https://files.pythonhosted.org/packages/5c/1c/96cf86b70b69ea2b12924cdf7cabb8ad10e6130eab8d767a1099fbd2a44f/coverage-7.6.1-cp38-cp38-win_amd64.whl", hash = "sha256:3f1156e3e8f2872197af3840d8ad307a9dd18e615dc64d9ee41696f287c57ad8", size = 210137, upload-time = "2024-08-04T19:45:06.25Z" }, + { url = "https://files.pythonhosted.org/packages/19/d3/d54c5aa83268779d54c86deb39c1c4566e5d45c155369ca152765f8db413/coverage-7.6.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:abd5fd0db5f4dc9289408aaf34908072f805ff7792632250dcb36dc591d24255", size = 206688, upload-time = "2024-08-04T19:45:08.358Z" }, + { url = "https://files.pythonhosted.org/packages/a5/fe/137d5dca72e4a258b1bc17bb04f2e0196898fe495843402ce826a7419fe3/coverage-7.6.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:547f45fa1a93154bd82050a7f3cddbc1a7a4dd2a9bf5cb7d06f4ae29fe94eaf8", size = 207120, upload-time = "2024-08-04T19:45:11.526Z" }, + { url = "https://files.pythonhosted.org/packages/78/5b/a0a796983f3201ff5485323b225d7c8b74ce30c11f456017e23d8e8d1945/coverage-7.6.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:645786266c8f18a931b65bfcefdbf6952dd0dea98feee39bd188607a9d307ed2", size = 235249, upload-time = "2024-08-04T19:45:13.202Z" }, + { url = "https://files.pythonhosted.org/packages/4e/e1/76089d6a5ef9d68f018f65411fcdaaeb0141b504587b901d74e8587606ad/coverage-7.6.1-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:9e0b2df163b8ed01d515807af24f63de04bebcecbd6c3bfeff88385789fdf75a", size = 233237, upload-time = "2024-08-04T19:45:14.961Z" }, + { url = "https://files.pythonhosted.org/packages/9a/6f/eef79b779a540326fee9520e5542a8b428cc3bfa8b7c8f1022c1ee4fc66c/coverage-7.6.1-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:609b06f178fe8e9f89ef676532760ec0b4deea15e9969bf754b37f7c40326dbc", size = 234311, upload-time = "2024-08-04T19:45:16.924Z" }, + { url = "https://files.pythonhosted.org/packages/75/e1/656d65fb126c29a494ef964005702b012f3498db1a30dd562958e85a4049/coverage-7.6.1-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:702855feff378050ae4f741045e19a32d57d19f3e0676d589df0575008ea5004", size = 233453, upload-time = "2024-08-04T19:45:18.672Z" }, + { url = "https://files.pythonhosted.org/packages/68/6a/45f108f137941a4a1238c85f28fd9d048cc46b5466d6b8dda3aba1bb9d4f/coverage-7.6.1-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:2bdb062ea438f22d99cba0d7829c2ef0af1d768d1e4a4f528087224c90b132cb", size = 231958, upload-time = "2024-08-04T19:45:20.63Z" }, + { url = "https://files.pythonhosted.org/packages/9b/e7/47b809099168b8b8c72ae311efc3e88c8d8a1162b3ba4b8da3cfcdb85743/coverage-7.6.1-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:9c56863d44bd1c4fe2abb8a4d6f5371d197f1ac0ebdee542f07f35895fc07f36", size = 232938, upload-time = "2024-08-04T19:45:23.062Z" }, + { url = "https://files.pythonhosted.org/packages/52/80/052222ba7058071f905435bad0ba392cc12006380731c37afaf3fe749b88/coverage-7.6.1-cp39-cp39-win32.whl", hash = "sha256:6e2cd258d7d927d09493c8df1ce9174ad01b381d4729a9d8d4e38670ca24774c", size = 209352, upload-time = "2024-08-04T19:45:25.042Z" }, + { url = "https://files.pythonhosted.org/packages/b8/d8/1b92e0b3adcf384e98770a00ca095da1b5f7b483e6563ae4eb5e935d24a1/coverage-7.6.1-cp39-cp39-win_amd64.whl", hash = "sha256:06a737c882bd26d0d6ee7269b20b12f14a8704807a01056c80bb881a4b2ce6ca", size = 210153, upload-time = "2024-08-04T19:45:27.079Z" }, + { url = "https://files.pythonhosted.org/packages/a5/2b/0354ed096bca64dc8e32a7cbcae28b34cb5ad0b1fe2125d6d99583313ac0/coverage-7.6.1-pp38.pp39.pp310-none-any.whl", hash = "sha256:e9a6e0eb86070e8ccaedfbd9d38fec54864f3125ab95419970575b42af7541df", size = 198926, upload-time = "2024-08-04T19:45:28.875Z" }, +] + +[package.optional-dependencies] +toml = [ + { name = "tomli", version = "2.3.0", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version == '3.8.*'" }, +] + +[[package]] +name = "coverage" +version = "7.10.7" +source = { registry = "https://pypi.org/simple" } +resolution-markers = [ + "python_full_version >= '3.12'", + "python_full_version == '3.11.*'", + "python_full_version == '3.10.*'", + "python_full_version == '3.9.*'", +] +sdist = { url = "https://files.pythonhosted.org/packages/51/26/d22c300112504f5f9a9fd2297ce33c35f3d353e4aeb987c8419453b2a7c2/coverage-7.10.7.tar.gz", hash = "sha256:f4ab143ab113be368a3e9b795f9cd7906c5ef407d6173fe9675a902e1fffc239", size = 827704, upload-time = "2025-09-21T20:03:56.815Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/e5/6c/3a3f7a46888e69d18abe3ccc6fe4cb16cccb1e6a2f99698931dafca489e6/coverage-7.10.7-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:fc04cc7a3db33664e0c2d10eb8990ff6b3536f6842c9590ae8da4c614b9ed05a", size = 217987, upload-time = "2025-09-21T20:00:57.218Z" }, + { url = "https://files.pythonhosted.org/packages/03/94/952d30f180b1a916c11a56f5c22d3535e943aa22430e9e3322447e520e1c/coverage-7.10.7-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:e201e015644e207139f7e2351980feb7040e6f4b2c2978892f3e3789d1c125e5", size = 218388, upload-time = "2025-09-21T20:01:00.081Z" }, + { url = "https://files.pythonhosted.org/packages/50/2b/9e0cf8ded1e114bcd8b2fd42792b57f1c4e9e4ea1824cde2af93a67305be/coverage-7.10.7-cp310-cp310-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:240af60539987ced2c399809bd34f7c78e8abe0736af91c3d7d0e795df633d17", size = 245148, upload-time = "2025-09-21T20:01:01.768Z" }, + { url = "https://files.pythonhosted.org/packages/19/20/d0384ac06a6f908783d9b6aa6135e41b093971499ec488e47279f5b846e6/coverage-7.10.7-cp310-cp310-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:8421e088bc051361b01c4b3a50fd39a4b9133079a2229978d9d30511fd05231b", size = 246958, upload-time = "2025-09-21T20:01:03.355Z" }, + { url = "https://files.pythonhosted.org/packages/60/83/5c283cff3d41285f8eab897651585db908a909c572bdc014bcfaf8a8b6ae/coverage-7.10.7-cp310-cp310-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:6be8ed3039ae7f7ac5ce058c308484787c86e8437e72b30bf5e88b8ea10f3c87", size = 248819, upload-time = "2025-09-21T20:01:04.968Z" }, + { url = "https://files.pythonhosted.org/packages/60/22/02eb98fdc5ff79f423e990d877693e5310ae1eab6cb20ae0b0b9ac45b23b/coverage-7.10.7-cp310-cp310-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:e28299d9f2e889e6d51b1f043f58d5f997c373cc12e6403b90df95b8b047c13e", size = 245754, upload-time = "2025-09-21T20:01:06.321Z" }, + { url = "https://files.pythonhosted.org/packages/b4/bc/25c83bcf3ad141b32cd7dc45485ef3c01a776ca3aa8ef0a93e77e8b5bc43/coverage-7.10.7-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:c4e16bd7761c5e454f4efd36f345286d6f7c5fa111623c355691e2755cae3b9e", size = 246860, upload-time = "2025-09-21T20:01:07.605Z" }, + { url = "https://files.pythonhosted.org/packages/3c/b7/95574702888b58c0928a6e982038c596f9c34d52c5e5107f1eef729399b5/coverage-7.10.7-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:b1c81d0e5e160651879755c9c675b974276f135558cf4ba79fee7b8413a515df", size = 244877, upload-time = "2025-09-21T20:01:08.829Z" }, + { url = "https://files.pythonhosted.org/packages/47/b6/40095c185f235e085df0e0b158f6bd68cc6e1d80ba6c7721dc81d97ec318/coverage-7.10.7-cp310-cp310-musllinux_1_2_riscv64.whl", hash = "sha256:606cc265adc9aaedcc84f1f064f0e8736bc45814f15a357e30fca7ecc01504e0", size = 245108, upload-time = "2025-09-21T20:01:10.527Z" }, + { url = "https://files.pythonhosted.org/packages/c8/50/4aea0556da7a4b93ec9168420d170b55e2eb50ae21b25062513d020c6861/coverage-7.10.7-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:10b24412692df990dbc34f8fb1b6b13d236ace9dfdd68df5b28c2e39cafbba13", size = 245752, upload-time = "2025-09-21T20:01:11.857Z" }, + { url = "https://files.pythonhosted.org/packages/6a/28/ea1a84a60828177ae3b100cb6723838523369a44ec5742313ed7db3da160/coverage-7.10.7-cp310-cp310-win32.whl", hash = "sha256:b51dcd060f18c19290d9b8a9dd1e0181538df2ce0717f562fff6cf74d9fc0b5b", size = 220497, upload-time = "2025-09-21T20:01:13.459Z" }, + { url = "https://files.pythonhosted.org/packages/fc/1a/a81d46bbeb3c3fd97b9602ebaa411e076219a150489bcc2c025f151bd52d/coverage-7.10.7-cp310-cp310-win_amd64.whl", hash = "sha256:3a622ac801b17198020f09af3eaf45666b344a0d69fc2a6ffe2ea83aeef1d807", size = 221392, upload-time = "2025-09-21T20:01:14.722Z" }, + { url = "https://files.pythonhosted.org/packages/d2/5d/c1a17867b0456f2e9ce2d8d4708a4c3a089947d0bec9c66cdf60c9e7739f/coverage-7.10.7-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:a609f9c93113be646f44c2a0256d6ea375ad047005d7f57a5c15f614dc1b2f59", size = 218102, upload-time = "2025-09-21T20:01:16.089Z" }, + { url = "https://files.pythonhosted.org/packages/54/f0/514dcf4b4e3698b9a9077f084429681bf3aad2b4a72578f89d7f643eb506/coverage-7.10.7-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:65646bb0359386e07639c367a22cf9b5bf6304e8630b565d0626e2bdf329227a", size = 218505, upload-time = "2025-09-21T20:01:17.788Z" }, + { url = "https://files.pythonhosted.org/packages/20/f6/9626b81d17e2a4b25c63ac1b425ff307ecdeef03d67c9a147673ae40dc36/coverage-7.10.7-cp311-cp311-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:5f33166f0dfcce728191f520bd2692914ec70fac2713f6bf3ce59c3deacb4699", size = 248898, upload-time = "2025-09-21T20:01:19.488Z" }, + { url = "https://files.pythonhosted.org/packages/b0/ef/bd8e719c2f7417ba03239052e099b76ea1130ac0cbb183ee1fcaa58aaff3/coverage-7.10.7-cp311-cp311-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:35f5e3f9e455bb17831876048355dca0f758b6df22f49258cb5a91da23ef437d", size = 250831, upload-time = "2025-09-21T20:01:20.817Z" }, + { url = "https://files.pythonhosted.org/packages/a5/b6/bf054de41ec948b151ae2b79a55c107f5760979538f5fb80c195f2517718/coverage-7.10.7-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:4da86b6d62a496e908ac2898243920c7992499c1712ff7c2b6d837cc69d9467e", size = 252937, upload-time = "2025-09-21T20:01:22.171Z" }, + { url = "https://files.pythonhosted.org/packages/0f/e5/3860756aa6f9318227443c6ce4ed7bf9e70bb7f1447a0353f45ac5c7974b/coverage-7.10.7-cp311-cp311-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:6b8b09c1fad947c84bbbc95eca841350fad9cbfa5a2d7ca88ac9f8d836c92e23", size = 249021, upload-time = "2025-09-21T20:01:23.907Z" }, + { url = "https://files.pythonhosted.org/packages/26/0f/bd08bd042854f7fd07b45808927ebcce99a7ed0f2f412d11629883517ac2/coverage-7.10.7-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:4376538f36b533b46f8971d3a3e63464f2c7905c9800db97361c43a2b14792ab", size = 250626, upload-time = "2025-09-21T20:01:25.721Z" }, + { url = "https://files.pythonhosted.org/packages/8e/a7/4777b14de4abcc2e80c6b1d430f5d51eb18ed1d75fca56cbce5f2db9b36e/coverage-7.10.7-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:121da30abb574f6ce6ae09840dae322bef734480ceafe410117627aa54f76d82", size = 248682, upload-time = "2025-09-21T20:01:27.105Z" }, + { url = "https://files.pythonhosted.org/packages/34/72/17d082b00b53cd45679bad682fac058b87f011fd8b9fe31d77f5f8d3a4e4/coverage-7.10.7-cp311-cp311-musllinux_1_2_riscv64.whl", hash = "sha256:88127d40df529336a9836870436fc2751c339fbaed3a836d42c93f3e4bd1d0a2", size = 248402, upload-time = "2025-09-21T20:01:28.629Z" }, + { url = "https://files.pythonhosted.org/packages/81/7a/92367572eb5bdd6a84bfa278cc7e97db192f9f45b28c94a9ca1a921c3577/coverage-7.10.7-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:ba58bbcd1b72f136080c0bccc2400d66cc6115f3f906c499013d065ac33a4b61", size = 249320, upload-time = "2025-09-21T20:01:30.004Z" }, + { url = "https://files.pythonhosted.org/packages/2f/88/a23cc185f6a805dfc4fdf14a94016835eeb85e22ac3a0e66d5e89acd6462/coverage-7.10.7-cp311-cp311-win32.whl", hash = "sha256:972b9e3a4094b053a4e46832b4bc829fc8a8d347160eb39d03f1690316a99c14", size = 220536, upload-time = "2025-09-21T20:01:32.184Z" }, + { url = "https://files.pythonhosted.org/packages/fe/ef/0b510a399dfca17cec7bc2f05ad8bd78cf55f15c8bc9a73ab20c5c913c2e/coverage-7.10.7-cp311-cp311-win_amd64.whl", hash = "sha256:a7b55a944a7f43892e28ad4bc0561dfd5f0d73e605d1aa5c3c976b52aea121d2", size = 221425, upload-time = "2025-09-21T20:01:33.557Z" }, + { url = "https://files.pythonhosted.org/packages/51/7f/023657f301a276e4ba1850f82749bc136f5a7e8768060c2e5d9744a22951/coverage-7.10.7-cp311-cp311-win_arm64.whl", hash = "sha256:736f227fb490f03c6488f9b6d45855f8e0fd749c007f9303ad30efab0e73c05a", size = 220103, upload-time = "2025-09-21T20:01:34.929Z" }, + { url = "https://files.pythonhosted.org/packages/13/e4/eb12450f71b542a53972d19117ea5a5cea1cab3ac9e31b0b5d498df1bd5a/coverage-7.10.7-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:7bb3b9ddb87ef7725056572368040c32775036472d5a033679d1fa6c8dc08417", size = 218290, upload-time = "2025-09-21T20:01:36.455Z" }, + { url = "https://files.pythonhosted.org/packages/37/66/593f9be12fc19fb36711f19a5371af79a718537204d16ea1d36f16bd78d2/coverage-7.10.7-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:18afb24843cbc175687225cab1138c95d262337f5473512010e46831aa0c2973", size = 218515, upload-time = "2025-09-21T20:01:37.982Z" }, + { url = "https://files.pythonhosted.org/packages/66/80/4c49f7ae09cafdacc73fbc30949ffe77359635c168f4e9ff33c9ebb07838/coverage-7.10.7-cp312-cp312-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:399a0b6347bcd3822be369392932884b8216d0944049ae22925631a9b3d4ba4c", size = 250020, upload-time = "2025-09-21T20:01:39.617Z" }, + { url = "https://files.pythonhosted.org/packages/a6/90/a64aaacab3b37a17aaedd83e8000142561a29eb262cede42d94a67f7556b/coverage-7.10.7-cp312-cp312-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:314f2c326ded3f4b09be11bc282eb2fc861184bc95748ae67b360ac962770be7", size = 252769, upload-time = "2025-09-21T20:01:41.341Z" }, + { url = "https://files.pythonhosted.org/packages/98/2e/2dda59afd6103b342e096f246ebc5f87a3363b5412609946c120f4e7750d/coverage-7.10.7-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:c41e71c9cfb854789dee6fc51e46743a6d138b1803fab6cb860af43265b42ea6", size = 253901, upload-time = "2025-09-21T20:01:43.042Z" }, + { url = "https://files.pythonhosted.org/packages/53/dc/8d8119c9051d50f3119bb4a75f29f1e4a6ab9415cd1fa8bf22fcc3fb3b5f/coverage-7.10.7-cp312-cp312-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:bc01f57ca26269c2c706e838f6422e2a8788e41b3e3c65e2f41148212e57cd59", size = 250413, upload-time = "2025-09-21T20:01:44.469Z" }, + { url = "https://files.pythonhosted.org/packages/98/b3/edaff9c5d79ee4d4b6d3fe046f2b1d799850425695b789d491a64225d493/coverage-7.10.7-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:a6442c59a8ac8b85812ce33bc4d05bde3fb22321fa8294e2a5b487c3505f611b", size = 251820, upload-time = "2025-09-21T20:01:45.915Z" }, + { url = "https://files.pythonhosted.org/packages/11/25/9a0728564bb05863f7e513e5a594fe5ffef091b325437f5430e8cfb0d530/coverage-7.10.7-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:78a384e49f46b80fb4c901d52d92abe098e78768ed829c673fbb53c498bef73a", size = 249941, upload-time = "2025-09-21T20:01:47.296Z" }, + { url = "https://files.pythonhosted.org/packages/e0/fd/ca2650443bfbef5b0e74373aac4df67b08180d2f184b482c41499668e258/coverage-7.10.7-cp312-cp312-musllinux_1_2_riscv64.whl", hash = "sha256:5e1e9802121405ede4b0133aa4340ad8186a1d2526de5b7c3eca519db7bb89fb", size = 249519, upload-time = "2025-09-21T20:01:48.73Z" }, + { url = "https://files.pythonhosted.org/packages/24/79/f692f125fb4299b6f963b0745124998ebb8e73ecdfce4ceceb06a8c6bec5/coverage-7.10.7-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:d41213ea25a86f69efd1575073d34ea11aabe075604ddf3d148ecfec9e1e96a1", size = 251375, upload-time = "2025-09-21T20:01:50.529Z" }, + { url = "https://files.pythonhosted.org/packages/5e/75/61b9bbd6c7d24d896bfeec57acba78e0f8deac68e6baf2d4804f7aae1f88/coverage-7.10.7-cp312-cp312-win32.whl", hash = "sha256:77eb4c747061a6af8d0f7bdb31f1e108d172762ef579166ec84542f711d90256", size = 220699, upload-time = "2025-09-21T20:01:51.941Z" }, + { url = "https://files.pythonhosted.org/packages/ca/f3/3bf7905288b45b075918d372498f1cf845b5b579b723c8fd17168018d5f5/coverage-7.10.7-cp312-cp312-win_amd64.whl", hash = "sha256:f51328ffe987aecf6d09f3cd9d979face89a617eacdaea43e7b3080777f647ba", size = 221512, upload-time = "2025-09-21T20:01:53.481Z" }, + { url = "https://files.pythonhosted.org/packages/5c/44/3e32dbe933979d05cf2dac5e697c8599cfe038aaf51223ab901e208d5a62/coverage-7.10.7-cp312-cp312-win_arm64.whl", hash = "sha256:bda5e34f8a75721c96085903c6f2197dc398c20ffd98df33f866a9c8fd95f4bf", size = 220147, upload-time = "2025-09-21T20:01:55.2Z" }, + { url = "https://files.pythonhosted.org/packages/9a/94/b765c1abcb613d103b64fcf10395f54d69b0ef8be6a0dd9c524384892cc7/coverage-7.10.7-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:981a651f543f2854abd3b5fcb3263aac581b18209be49863ba575de6edf4c14d", size = 218320, upload-time = "2025-09-21T20:01:56.629Z" }, + { url = "https://files.pythonhosted.org/packages/72/4f/732fff31c119bb73b35236dd333030f32c4bfe909f445b423e6c7594f9a2/coverage-7.10.7-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:73ab1601f84dc804f7812dc297e93cd99381162da39c47040a827d4e8dafe63b", size = 218575, upload-time = "2025-09-21T20:01:58.203Z" }, + { url = "https://files.pythonhosted.org/packages/87/02/ae7e0af4b674be47566707777db1aa375474f02a1d64b9323e5813a6cdd5/coverage-7.10.7-cp313-cp313-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:a8b6f03672aa6734e700bbcd65ff050fd19cddfec4b031cc8cf1c6967de5a68e", size = 249568, upload-time = "2025-09-21T20:01:59.748Z" }, + { url = "https://files.pythonhosted.org/packages/a2/77/8c6d22bf61921a59bce5471c2f1f7ac30cd4ac50aadde72b8c48d5727902/coverage-7.10.7-cp313-cp313-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:10b6ba00ab1132a0ce4428ff68cf50a25efd6840a42cdf4239c9b99aad83be8b", size = 252174, upload-time = "2025-09-21T20:02:01.192Z" }, + { url = "https://files.pythonhosted.org/packages/b1/20/b6ea4f69bbb52dac0aebd62157ba6a9dddbfe664f5af8122dac296c3ee15/coverage-7.10.7-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:c79124f70465a150e89340de5963f936ee97097d2ef76c869708c4248c63ca49", size = 253447, upload-time = "2025-09-21T20:02:02.701Z" }, + { url = "https://files.pythonhosted.org/packages/f9/28/4831523ba483a7f90f7b259d2018fef02cb4d5b90bc7c1505d6e5a84883c/coverage-7.10.7-cp313-cp313-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:69212fbccdbd5b0e39eac4067e20a4a5256609e209547d86f740d68ad4f04911", size = 249779, upload-time = "2025-09-21T20:02:04.185Z" }, + { url = "https://files.pythonhosted.org/packages/a7/9f/4331142bc98c10ca6436d2d620c3e165f31e6c58d43479985afce6f3191c/coverage-7.10.7-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:7ea7c6c9d0d286d04ed3541747e6597cbe4971f22648b68248f7ddcd329207f0", size = 251604, upload-time = "2025-09-21T20:02:06.034Z" }, + { url = "https://files.pythonhosted.org/packages/ce/60/bda83b96602036b77ecf34e6393a3836365481b69f7ed7079ab85048202b/coverage-7.10.7-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:b9be91986841a75042b3e3243d0b3cb0b2434252b977baaf0cd56e960fe1e46f", size = 249497, upload-time = "2025-09-21T20:02:07.619Z" }, + { url = "https://files.pythonhosted.org/packages/5f/af/152633ff35b2af63977edd835d8e6430f0caef27d171edf2fc76c270ef31/coverage-7.10.7-cp313-cp313-musllinux_1_2_riscv64.whl", hash = "sha256:b281d5eca50189325cfe1f365fafade89b14b4a78d9b40b05ddd1fc7d2a10a9c", size = 249350, upload-time = "2025-09-21T20:02:10.34Z" }, + { url = "https://files.pythonhosted.org/packages/9d/71/d92105d122bd21cebba877228990e1646d862e34a98bb3374d3fece5a794/coverage-7.10.7-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:99e4aa63097ab1118e75a848a28e40d68b08a5e19ce587891ab7fd04475e780f", size = 251111, upload-time = "2025-09-21T20:02:12.122Z" }, + { url = "https://files.pythonhosted.org/packages/a2/9e/9fdb08f4bf476c912f0c3ca292e019aab6712c93c9344a1653986c3fd305/coverage-7.10.7-cp313-cp313-win32.whl", hash = "sha256:dc7c389dce432500273eaf48f410b37886be9208b2dd5710aaf7c57fd442c698", size = 220746, upload-time = "2025-09-21T20:02:13.919Z" }, + { url = "https://files.pythonhosted.org/packages/b1/b1/a75fd25df44eab52d1931e89980d1ada46824c7a3210be0d3c88a44aaa99/coverage-7.10.7-cp313-cp313-win_amd64.whl", hash = "sha256:cac0fdca17b036af3881a9d2729a850b76553f3f716ccb0360ad4dbc06b3b843", size = 221541, upload-time = "2025-09-21T20:02:15.57Z" }, + { url = "https://files.pythonhosted.org/packages/14/3a/d720d7c989562a6e9a14b2c9f5f2876bdb38e9367126d118495b89c99c37/coverage-7.10.7-cp313-cp313-win_arm64.whl", hash = "sha256:4b6f236edf6e2f9ae8fcd1332da4e791c1b6ba0dc16a2dc94590ceccb482e546", size = 220170, upload-time = "2025-09-21T20:02:17.395Z" }, + { url = "https://files.pythonhosted.org/packages/bb/22/e04514bf2a735d8b0add31d2b4ab636fc02370730787c576bb995390d2d5/coverage-7.10.7-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:a0ec07fd264d0745ee396b666d47cef20875f4ff2375d7c4f58235886cc1ef0c", size = 219029, upload-time = "2025-09-21T20:02:18.936Z" }, + { url = "https://files.pythonhosted.org/packages/11/0b/91128e099035ece15da3445d9015e4b4153a6059403452d324cbb0a575fa/coverage-7.10.7-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:dd5e856ebb7bfb7672b0086846db5afb4567a7b9714b8a0ebafd211ec7ce6a15", size = 219259, upload-time = "2025-09-21T20:02:20.44Z" }, + { url = "https://files.pythonhosted.org/packages/8b/51/66420081e72801536a091a0c8f8c1f88a5c4bf7b9b1bdc6222c7afe6dc9b/coverage-7.10.7-cp313-cp313t-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:f57b2a3c8353d3e04acf75b3fed57ba41f5c0646bbf1d10c7c282291c97936b4", size = 260592, upload-time = "2025-09-21T20:02:22.313Z" }, + { url = "https://files.pythonhosted.org/packages/5d/22/9b8d458c2881b22df3db5bb3e7369e63d527d986decb6c11a591ba2364f7/coverage-7.10.7-cp313-cp313t-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:1ef2319dd15a0b009667301a3f84452a4dc6fddfd06b0c5c53ea472d3989fbf0", size = 262768, upload-time = "2025-09-21T20:02:24.287Z" }, + { url = "https://files.pythonhosted.org/packages/f7/08/16bee2c433e60913c610ea200b276e8eeef084b0d200bdcff69920bd5828/coverage-7.10.7-cp313-cp313t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:83082a57783239717ceb0ad584de3c69cf581b2a95ed6bf81ea66034f00401c0", size = 264995, upload-time = "2025-09-21T20:02:26.133Z" }, + { url = "https://files.pythonhosted.org/packages/20/9d/e53eb9771d154859b084b90201e5221bca7674ba449a17c101a5031d4054/coverage-7.10.7-cp313-cp313t-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:50aa94fb1fb9a397eaa19c0d5ec15a5edd03a47bf1a3a6111a16b36e190cff65", size = 259546, upload-time = "2025-09-21T20:02:27.716Z" }, + { url = "https://files.pythonhosted.org/packages/ad/b0/69bc7050f8d4e56a89fb550a1577d5d0d1db2278106f6f626464067b3817/coverage-7.10.7-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:2120043f147bebb41c85b97ac45dd173595ff14f2a584f2963891cbcc3091541", size = 262544, upload-time = "2025-09-21T20:02:29.216Z" }, + { url = "https://files.pythonhosted.org/packages/ef/4b/2514b060dbd1bc0aaf23b852c14bb5818f244c664cb16517feff6bb3a5ab/coverage-7.10.7-cp313-cp313t-musllinux_1_2_i686.whl", hash = "sha256:2fafd773231dd0378fdba66d339f84904a8e57a262f583530f4f156ab83863e6", size = 260308, upload-time = "2025-09-21T20:02:31.226Z" }, + { url = "https://files.pythonhosted.org/packages/54/78/7ba2175007c246d75e496f64c06e94122bdb914790a1285d627a918bd271/coverage-7.10.7-cp313-cp313t-musllinux_1_2_riscv64.whl", hash = "sha256:0b944ee8459f515f28b851728ad224fa2d068f1513ef6b7ff1efafeb2185f999", size = 258920, upload-time = "2025-09-21T20:02:32.823Z" }, + { url = "https://files.pythonhosted.org/packages/c0/b3/fac9f7abbc841409b9a410309d73bfa6cfb2e51c3fada738cb607ce174f8/coverage-7.10.7-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:4b583b97ab2e3efe1b3e75248a9b333bd3f8b0b1b8e5b45578e05e5850dfb2c2", size = 261434, upload-time = "2025-09-21T20:02:34.86Z" }, + { url = "https://files.pythonhosted.org/packages/ee/51/a03bec00d37faaa891b3ff7387192cef20f01604e5283a5fabc95346befa/coverage-7.10.7-cp313-cp313t-win32.whl", hash = "sha256:2a78cd46550081a7909b3329e2266204d584866e8d97b898cd7fb5ac8d888b1a", size = 221403, upload-time = "2025-09-21T20:02:37.034Z" }, + { url = "https://files.pythonhosted.org/packages/53/22/3cf25d614e64bf6d8e59c7c669b20d6d940bb337bdee5900b9ca41c820bb/coverage-7.10.7-cp313-cp313t-win_amd64.whl", hash = "sha256:33a5e6396ab684cb43dc7befa386258acb2d7fae7f67330ebb85ba4ea27938eb", size = 222469, upload-time = "2025-09-21T20:02:39.011Z" }, + { url = "https://files.pythonhosted.org/packages/49/a1/00164f6d30d8a01c3c9c48418a7a5be394de5349b421b9ee019f380df2a0/coverage-7.10.7-cp313-cp313t-win_arm64.whl", hash = "sha256:86b0e7308289ddde73d863b7683f596d8d21c7d8664ce1dee061d0bcf3fbb4bb", size = 220731, upload-time = "2025-09-21T20:02:40.939Z" }, + { url = "https://files.pythonhosted.org/packages/23/9c/5844ab4ca6a4dd97a1850e030a15ec7d292b5c5cb93082979225126e35dd/coverage-7.10.7-cp314-cp314-macosx_10_13_x86_64.whl", hash = "sha256:b06f260b16ead11643a5a9f955bd4b5fd76c1a4c6796aeade8520095b75de520", size = 218302, upload-time = "2025-09-21T20:02:42.527Z" }, + { url = "https://files.pythonhosted.org/packages/f0/89/673f6514b0961d1f0e20ddc242e9342f6da21eaba3489901b565c0689f34/coverage-7.10.7-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:212f8f2e0612778f09c55dd4872cb1f64a1f2b074393d139278ce902064d5b32", size = 218578, upload-time = "2025-09-21T20:02:44.468Z" }, + { url = "https://files.pythonhosted.org/packages/05/e8/261cae479e85232828fb17ad536765c88dd818c8470aca690b0ac6feeaa3/coverage-7.10.7-cp314-cp314-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:3445258bcded7d4aa630ab8296dea4d3f15a255588dd535f980c193ab6b95f3f", size = 249629, upload-time = "2025-09-21T20:02:46.503Z" }, + { url = "https://files.pythonhosted.org/packages/82/62/14ed6546d0207e6eda876434e3e8475a3e9adbe32110ce896c9e0c06bb9a/coverage-7.10.7-cp314-cp314-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:bb45474711ba385c46a0bfe696c695a929ae69ac636cda8f532be9e8c93d720a", size = 252162, upload-time = "2025-09-21T20:02:48.689Z" }, + { url = "https://files.pythonhosted.org/packages/ff/49/07f00db9ac6478e4358165a08fb41b469a1b053212e8a00cb02f0d27a05f/coverage-7.10.7-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:813922f35bd800dca9994c5971883cbc0d291128a5de6b167c7aa697fcf59360", size = 253517, upload-time = "2025-09-21T20:02:50.31Z" }, + { url = "https://files.pythonhosted.org/packages/a2/59/c5201c62dbf165dfbc91460f6dbbaa85a8b82cfa6131ac45d6c1bfb52deb/coverage-7.10.7-cp314-cp314-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:93c1b03552081b2a4423091d6fb3787265b8f86af404cff98d1b5342713bdd69", size = 249632, upload-time = "2025-09-21T20:02:51.971Z" }, + { url = "https://files.pythonhosted.org/packages/07/ae/5920097195291a51fb00b3a70b9bbd2edbfe3c84876a1762bd1ef1565ebc/coverage-7.10.7-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:cc87dd1b6eaf0b848eebb1c86469b9f72a1891cb42ac7adcfbce75eadb13dd14", size = 251520, upload-time = "2025-09-21T20:02:53.858Z" }, + { url = "https://files.pythonhosted.org/packages/b9/3c/a815dde77a2981f5743a60b63df31cb322c944843e57dbd579326625a413/coverage-7.10.7-cp314-cp314-musllinux_1_2_i686.whl", hash = "sha256:39508ffda4f343c35f3236fe8d1a6634a51f4581226a1262769d7f970e73bffe", size = 249455, upload-time = "2025-09-21T20:02:55.807Z" }, + { url = "https://files.pythonhosted.org/packages/aa/99/f5cdd8421ea656abefb6c0ce92556709db2265c41e8f9fc6c8ae0f7824c9/coverage-7.10.7-cp314-cp314-musllinux_1_2_riscv64.whl", hash = "sha256:925a1edf3d810537c5a3abe78ec5530160c5f9a26b1f4270b40e62cc79304a1e", size = 249287, upload-time = "2025-09-21T20:02:57.784Z" }, + { url = "https://files.pythonhosted.org/packages/c3/7a/e9a2da6a1fc5d007dd51fca083a663ab930a8c4d149c087732a5dbaa0029/coverage-7.10.7-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:2c8b9a0636f94c43cd3576811e05b89aa9bc2d0a85137affc544ae5cb0e4bfbd", size = 250946, upload-time = "2025-09-21T20:02:59.431Z" }, + { url = "https://files.pythonhosted.org/packages/ef/5b/0b5799aa30380a949005a353715095d6d1da81927d6dbed5def2200a4e25/coverage-7.10.7-cp314-cp314-win32.whl", hash = "sha256:b7b8288eb7cdd268b0304632da8cb0bb93fadcfec2fe5712f7b9cc8f4d487be2", size = 221009, upload-time = "2025-09-21T20:03:01.324Z" }, + { url = "https://files.pythonhosted.org/packages/da/b0/e802fbb6eb746de006490abc9bb554b708918b6774b722bb3a0e6aa1b7de/coverage-7.10.7-cp314-cp314-win_amd64.whl", hash = "sha256:1ca6db7c8807fb9e755d0379ccc39017ce0a84dcd26d14b5a03b78563776f681", size = 221804, upload-time = "2025-09-21T20:03:03.4Z" }, + { url = "https://files.pythonhosted.org/packages/9e/e8/71d0c8e374e31f39e3389bb0bd19e527d46f00ea8571ec7ec8fd261d8b44/coverage-7.10.7-cp314-cp314-win_arm64.whl", hash = "sha256:097c1591f5af4496226d5783d036bf6fd6cd0cbc132e071b33861de756efb880", size = 220384, upload-time = "2025-09-21T20:03:05.111Z" }, + { url = "https://files.pythonhosted.org/packages/62/09/9a5608d319fa3eba7a2019addeacb8c746fb50872b57a724c9f79f146969/coverage-7.10.7-cp314-cp314t-macosx_10_13_x86_64.whl", hash = "sha256:a62c6ef0d50e6de320c270ff91d9dd0a05e7250cac2a800b7784bae474506e63", size = 219047, upload-time = "2025-09-21T20:03:06.795Z" }, + { url = "https://files.pythonhosted.org/packages/f5/6f/f58d46f33db9f2e3647b2d0764704548c184e6f5e014bef528b7f979ef84/coverage-7.10.7-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:9fa6e4dd51fe15d8738708a973470f67a855ca50002294852e9571cdbd9433f2", size = 219266, upload-time = "2025-09-21T20:03:08.495Z" }, + { url = "https://files.pythonhosted.org/packages/74/5c/183ffc817ba68e0b443b8c934c8795553eb0c14573813415bd59941ee165/coverage-7.10.7-cp314-cp314t-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:8fb190658865565c549b6b4706856d6a7b09302c797eb2cf8e7fe9dabb043f0d", size = 260767, upload-time = "2025-09-21T20:03:10.172Z" }, + { url = "https://files.pythonhosted.org/packages/0f/48/71a8abe9c1ad7e97548835e3cc1adbf361e743e9d60310c5f75c9e7bf847/coverage-7.10.7-cp314-cp314t-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:affef7c76a9ef259187ef31599a9260330e0335a3011732c4b9effa01e1cd6e0", size = 262931, upload-time = "2025-09-21T20:03:11.861Z" }, + { url = "https://files.pythonhosted.org/packages/84/fd/193a8fb132acfc0a901f72020e54be5e48021e1575bb327d8ee1097a28fd/coverage-7.10.7-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:6e16e07d85ca0cf8bafe5f5d23a0b850064e8e945d5677492b06bbe6f09cc699", size = 265186, upload-time = "2025-09-21T20:03:13.539Z" }, + { url = "https://files.pythonhosted.org/packages/b1/8f/74ecc30607dd95ad50e3034221113ccb1c6d4e8085cc761134782995daae/coverage-7.10.7-cp314-cp314t-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:03ffc58aacdf65d2a82bbeb1ffe4d01ead4017a21bfd0454983b88ca73af94b9", size = 259470, upload-time = "2025-09-21T20:03:15.584Z" }, + { url = "https://files.pythonhosted.org/packages/0f/55/79ff53a769f20d71b07023ea115c9167c0bb56f281320520cf64c5298a96/coverage-7.10.7-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:1b4fd784344d4e52647fd7857b2af5b3fbe6c239b0b5fa63e94eb67320770e0f", size = 262626, upload-time = "2025-09-21T20:03:17.673Z" }, + { url = "https://files.pythonhosted.org/packages/88/e2/dac66c140009b61ac3fc13af673a574b00c16efdf04f9b5c740703e953c0/coverage-7.10.7-cp314-cp314t-musllinux_1_2_i686.whl", hash = "sha256:0ebbaddb2c19b71912c6f2518e791aa8b9f054985a0769bdb3a53ebbc765c6a1", size = 260386, upload-time = "2025-09-21T20:03:19.36Z" }, + { url = "https://files.pythonhosted.org/packages/a2/f1/f48f645e3f33bb9ca8a496bc4a9671b52f2f353146233ebd7c1df6160440/coverage-7.10.7-cp314-cp314t-musllinux_1_2_riscv64.whl", hash = "sha256:a2d9a3b260cc1d1dbdb1c582e63ddcf5363426a1a68faa0f5da28d8ee3c722a0", size = 258852, upload-time = "2025-09-21T20:03:21.007Z" }, + { url = "https://files.pythonhosted.org/packages/bb/3b/8442618972c51a7affeead957995cfa8323c0c9bcf8fa5a027421f720ff4/coverage-7.10.7-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:a3cc8638b2480865eaa3926d192e64ce6c51e3d29c849e09d5b4ad95efae5399", size = 261534, upload-time = "2025-09-21T20:03:23.12Z" }, + { url = "https://files.pythonhosted.org/packages/b2/dc/101f3fa3a45146db0cb03f5b4376e24c0aac818309da23e2de0c75295a91/coverage-7.10.7-cp314-cp314t-win32.whl", hash = "sha256:67f8c5cbcd3deb7a60b3345dffc89a961a484ed0af1f6f73de91705cc6e31235", size = 221784, upload-time = "2025-09-21T20:03:24.769Z" }, + { url = "https://files.pythonhosted.org/packages/4c/a1/74c51803fc70a8a40d7346660379e144be772bab4ac7bb6e6b905152345c/coverage-7.10.7-cp314-cp314t-win_amd64.whl", hash = "sha256:e1ed71194ef6dea7ed2d5cb5f7243d4bcd334bfb63e59878519be558078f848d", size = 222905, upload-time = "2025-09-21T20:03:26.93Z" }, + { url = "https://files.pythonhosted.org/packages/12/65/f116a6d2127df30bcafbceef0302d8a64ba87488bf6f73a6d8eebf060873/coverage-7.10.7-cp314-cp314t-win_arm64.whl", hash = "sha256:7fe650342addd8524ca63d77b2362b02345e5f1a093266787d210c70a50b471a", size = 220922, upload-time = "2025-09-21T20:03:28.672Z" }, + { url = "https://files.pythonhosted.org/packages/a3/ad/d1c25053764b4c42eb294aae92ab617d2e4f803397f9c7c8295caa77a260/coverage-7.10.7-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:fff7b9c3f19957020cac546c70025331113d2e61537f6e2441bc7657913de7d3", size = 217978, upload-time = "2025-09-21T20:03:30.362Z" }, + { url = "https://files.pythonhosted.org/packages/52/2f/b9f9daa39b80ece0b9548bbb723381e29bc664822d9a12c2135f8922c22b/coverage-7.10.7-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:bc91b314cef27742da486d6839b677b3f2793dfe52b51bbbb7cf736d5c29281c", size = 218370, upload-time = "2025-09-21T20:03:32.147Z" }, + { url = "https://files.pythonhosted.org/packages/dd/6e/30d006c3b469e58449650642383dddf1c8fb63d44fdf92994bfd46570695/coverage-7.10.7-cp39-cp39-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:567f5c155eda8df1d3d439d40a45a6a5f029b429b06648235f1e7e51b522b396", size = 244802, upload-time = "2025-09-21T20:03:33.919Z" }, + { url = "https://files.pythonhosted.org/packages/b0/49/8a070782ce7e6b94ff6a0b6d7c65ba6bc3091d92a92cef4cd4eb0767965c/coverage-7.10.7-cp39-cp39-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:2af88deffcc8a4d5974cf2d502251bc3b2db8461f0b66d80a449c33757aa9f40", size = 246625, upload-time = "2025-09-21T20:03:36.09Z" }, + { url = "https://files.pythonhosted.org/packages/6a/92/1c1c5a9e8677ce56d42b97bdaca337b2d4d9ebe703d8c174ede52dbabd5f/coverage-7.10.7-cp39-cp39-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:c7315339eae3b24c2d2fa1ed7d7a38654cba34a13ef19fbcb9425da46d3dc594", size = 248399, upload-time = "2025-09-21T20:03:38.342Z" }, + { url = "https://files.pythonhosted.org/packages/c0/54/b140edee7257e815de7426d5d9846b58505dffc29795fff2dfb7f8a1c5a0/coverage-7.10.7-cp39-cp39-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:912e6ebc7a6e4adfdbb1aec371ad04c68854cd3bf3608b3514e7ff9062931d8a", size = 245142, upload-time = "2025-09-21T20:03:40.591Z" }, + { url = "https://files.pythonhosted.org/packages/e4/9e/6d6b8295940b118e8b7083b29226c71f6154f7ff41e9ca431f03de2eac0d/coverage-7.10.7-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:f49a05acd3dfe1ce9715b657e28d138578bc40126760efb962322c56e9ca344b", size = 246284, upload-time = "2025-09-21T20:03:42.355Z" }, + { url = "https://files.pythonhosted.org/packages/db/e5/5e957ca747d43dbe4d9714358375c7546cb3cb533007b6813fc20fce37ad/coverage-7.10.7-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:cce2109b6219f22ece99db7644b9622f54a4e915dad65660ec435e89a3ea7cc3", size = 244353, upload-time = "2025-09-21T20:03:44.218Z" }, + { url = "https://files.pythonhosted.org/packages/9a/45/540fc5cc92536a1b783b7ef99450bd55a4b3af234aae35a18a339973ce30/coverage-7.10.7-cp39-cp39-musllinux_1_2_riscv64.whl", hash = "sha256:f3c887f96407cea3916294046fc7dab611c2552beadbed4ea901cbc6a40cc7a0", size = 244430, upload-time = "2025-09-21T20:03:46.065Z" }, + { url = "https://files.pythonhosted.org/packages/75/0b/8287b2e5b38c8fe15d7e3398849bb58d382aedc0864ea0fa1820e8630491/coverage-7.10.7-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:635adb9a4507c9fd2ed65f39693fa31c9a3ee3a8e6dc64df033e8fdf52a7003f", size = 245311, upload-time = "2025-09-21T20:03:48.19Z" }, + { url = "https://files.pythonhosted.org/packages/0c/1d/29724999984740f0c86d03e6420b942439bf5bd7f54d4382cae386a9d1e9/coverage-7.10.7-cp39-cp39-win32.whl", hash = "sha256:5a02d5a850e2979b0a014c412573953995174743a3f7fa4ea5a6e9a3c5617431", size = 220500, upload-time = "2025-09-21T20:03:50.024Z" }, + { url = "https://files.pythonhosted.org/packages/43/11/4b1e6b129943f905ca54c339f343877b55b365ae2558806c1be4f7476ed5/coverage-7.10.7-cp39-cp39-win_amd64.whl", hash = "sha256:c134869d5ffe34547d14e174c866fd8fe2254918cc0a95e99052903bc1543e07", size = 221408, upload-time = "2025-09-21T20:03:51.803Z" }, + { url = "https://files.pythonhosted.org/packages/ec/16/114df1c291c22cac3b0c127a73e0af5c12ed7bbb6558d310429a0ae24023/coverage-7.10.7-py3-none-any.whl", hash = "sha256:f7941f6f2fe6dd6807a1208737b8a0cbcf1cc6d7b07d24998ad2d63590868260", size = 209952, upload-time = "2025-09-21T20:03:53.918Z" }, +] + +[package.optional-dependencies] +toml = [ + { name = "tomli", version = "2.3.0", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.9' and python_full_version <= '3.11'" }, +] + +[[package]] +name = "deprecated" +version = "1.2.18" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "wrapt", version = "1.16.0", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.8'" }, + { name = "wrapt", version = "1.17.3", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.8'" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/98/97/06afe62762c9a8a86af0cfb7bfdab22a43ad17138b07af5b1a58442690a2/deprecated-1.2.18.tar.gz", hash = "sha256:422b6f6d859da6f2ef57857761bfb392480502a64c3028ca9bbe86085d72115d", size = 2928744, upload-time = "2025-01-27T10:46:25.7Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/6e/c6/ac0b6c1e2d138f1002bcf799d330bd6d85084fece321e662a14223794041/Deprecated-1.2.18-py2.py3-none-any.whl", hash = "sha256:bd5011788200372a32418f888e326a09ff80d0214bd961147cfed01b5c018eec", size = 9998, upload-time = "2025-01-27T10:46:09.186Z" }, +] + +[[package]] +name = "idna" +version = "3.10" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/f1/70/7703c29685631f5a7590aa73f1f1d3fa9a380e654b86af429e0934a32f7d/idna-3.10.tar.gz", hash = "sha256:12f65c9b470abda6dc35cf8e63cc574b1c52b11df2c86030af0ac09b01b13ea9", size = 190490, upload-time = "2024-09-15T18:07:39.745Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/76/c6/c88e154df9c4e1a2a66ccf0005a88dfb2650c1dffb6f5ce603dfbd452ce3/idna-3.10-py3-none-any.whl", hash = "sha256:946d195a0d259cbba61165e88e65941f16e9b36ea6ddb97f00452bae8b1287d3", size = 70442, upload-time = "2024-09-15T18:07:37.964Z" }, +] + +[[package]] +name = "importlib-metadata" +version = "6.7.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "typing-extensions", marker = "python_full_version < '3.8'" }, + { name = "zipp", marker = "python_full_version < '3.8'" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/a3/82/f6e29c8d5c098b6be61460371c2c5591f4a335923639edec43b3830650a4/importlib_metadata-6.7.0.tar.gz", hash = "sha256:1aaf550d4f73e5d6783e7acb77aec43d49da8017410afae93822cc9cca98c4d4", size = 53569, upload-time = "2023-06-18T21:44:35.024Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/ff/94/64287b38c7de4c90683630338cf28f129decbba0a44f0c6db35a873c73c4/importlib_metadata-6.7.0-py3-none-any.whl", hash = "sha256:cb52082e659e97afc5dac71e79de97d8681de3aa07ff18578330904a9d18e5b5", size = 22934, upload-time = "2023-06-18T21:44:33.441Z" }, +] + +[[package]] +name = "isodate" +version = "0.6.1" +source = { registry = "https://pypi.org/simple" } +resolution-markers = [ + "python_full_version >= '3.8' and python_full_version < '3.8.1'", +] +dependencies = [ + { name = "six", marker = "python_full_version >= '3.8' and python_full_version < '3.8.1'" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/db/7a/c0a56c7d56c7fa723988f122fa1f1ccf8c5c4ccc48efad0d214b49e5b1af/isodate-0.6.1.tar.gz", hash = "sha256:48c5881de7e8b0a0d648cb024c8062dc84e7b840ed81e864c7614fd3c127bde9", size = 28443, upload-time = "2021-12-13T20:28:31.525Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/b6/85/7882d311924cbcfc70b1890780763e36ff0b140c7e51c110fc59a532f087/isodate-0.6.1-py2.py3-none-any.whl", hash = "sha256:0751eece944162659049d35f4f549ed815792b38793f07cf73381c1c87cbed96", size = 41722, upload-time = "2021-12-13T20:28:29.073Z" }, +] + +[[package]] +name = "isodate" +version = "0.7.2" +source = { registry = "https://pypi.org/simple" } +resolution-markers = [ + "python_full_version == '3.10.*'", + "python_full_version == '3.9.*'", + "python_full_version >= '3.8.1' and python_full_version < '3.9'", + "python_full_version < '3.8'", +] +sdist = { url = "https://files.pythonhosted.org/packages/54/4d/e940025e2ce31a8ce1202635910747e5a87cc3a6a6bb2d00973375014749/isodate-0.7.2.tar.gz", hash = "sha256:4cd1aa0f43ca76f4a6c6c0292a85f40b35ec2e43e315b59f06e6d32171a953e6", size = 29705, upload-time = "2024-10-08T23:04:11.5Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/15/aa/0aca39a37d3c7eb941ba736ede56d689e7be91cab5d9ca846bde3999eba6/isodate-0.7.2-py3-none-any.whl", hash = "sha256:28009937d8031054830160fce6d409ed342816b543597cece116d966c6d99e15", size = 22320, upload-time = "2024-10-08T23:04:09.501Z" }, +] + +[[package]] +name = "lxml" +version = "5.4.0" +source = { registry = "https://pypi.org/simple" } +resolution-markers = [ + "python_full_version < '3.8'", +] +sdist = { url = "https://files.pythonhosted.org/packages/76/3d/14e82fc7c8fb1b7761f7e748fd47e2ec8276d137b6acfe5a4bb73853e08f/lxml-5.4.0.tar.gz", hash = "sha256:d12832e1dbea4be280b22fd0ea7c9b87f0d8fc51ba06e92dc62d52f804f78ebd", size = 3679479, upload-time = "2025-04-23T01:50:29.322Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/f5/1f/a3b6b74a451ceb84b471caa75c934d2430a4d84395d38ef201d539f38cd1/lxml-5.4.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:e7bc6df34d42322c5289e37e9971d6ed114e3776b45fa879f734bded9d1fea9c", size = 8076838, upload-time = "2025-04-23T01:44:29.325Z" }, + { url = "https://files.pythonhosted.org/packages/36/af/a567a55b3e47135b4d1f05a1118c24529104c003f95851374b3748139dc1/lxml-5.4.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:6854f8bd8a1536f8a1d9a3655e6354faa6406621cf857dc27b681b69860645c7", size = 4381827, upload-time = "2025-04-23T01:44:33.345Z" }, + { url = "https://files.pythonhosted.org/packages/50/ba/4ee47d24c675932b3eb5b6de77d0f623c2db6dc466e7a1f199792c5e3e3a/lxml-5.4.0-cp310-cp310-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:696ea9e87442467819ac22394ca36cb3d01848dad1be6fac3fb612d3bd5a12cf", size = 5204098, upload-time = "2025-04-23T01:44:35.809Z" }, + { url = "https://files.pythonhosted.org/packages/f2/0f/b4db6dfebfefe3abafe360f42a3d471881687fd449a0b86b70f1f2683438/lxml-5.4.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6ef80aeac414f33c24b3815ecd560cee272786c3adfa5f31316d8b349bfade28", size = 4930261, upload-time = "2025-04-23T01:44:38.271Z" }, + { url = "https://files.pythonhosted.org/packages/0b/1f/0bb1bae1ce056910f8db81c6aba80fec0e46c98d77c0f59298c70cd362a3/lxml-5.4.0-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:3b9c2754cef6963f3408ab381ea55f47dabc6f78f4b8ebb0f0b25cf1ac1f7609", size = 5529621, upload-time = "2025-04-23T01:44:40.921Z" }, + { url = "https://files.pythonhosted.org/packages/21/f5/e7b66a533fc4a1e7fa63dd22a1ab2ec4d10319b909211181e1ab3e539295/lxml-5.4.0-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:7a62cc23d754bb449d63ff35334acc9f5c02e6dae830d78dab4dd12b78a524f4", size = 4983231, upload-time = "2025-04-23T01:44:43.871Z" }, + { url = "https://files.pythonhosted.org/packages/11/39/a38244b669c2d95a6a101a84d3c85ba921fea827e9e5483e93168bf1ccb2/lxml-5.4.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8f82125bc7203c5ae8633a7d5d20bcfdff0ba33e436e4ab0abc026a53a8960b7", size = 5084279, upload-time = "2025-04-23T01:44:46.632Z" }, + { url = "https://files.pythonhosted.org/packages/db/64/48cac242347a09a07740d6cee7b7fd4663d5c1abd65f2e3c60420e231b27/lxml-5.4.0-cp310-cp310-manylinux_2_28_aarch64.whl", hash = "sha256:b67319b4aef1a6c56576ff544b67a2a6fbd7eaee485b241cabf53115e8908b8f", size = 4927405, upload-time = "2025-04-23T01:44:49.843Z" }, + { url = "https://files.pythonhosted.org/packages/98/89/97442835fbb01d80b72374f9594fe44f01817d203fa056e9906128a5d896/lxml-5.4.0-cp310-cp310-manylinux_2_28_ppc64le.whl", hash = "sha256:a8ef956fce64c8551221f395ba21d0724fed6b9b6242ca4f2f7beb4ce2f41997", size = 5550169, upload-time = "2025-04-23T01:44:52.791Z" }, + { url = "https://files.pythonhosted.org/packages/f1/97/164ca398ee654eb21f29c6b582685c6c6b9d62d5213abc9b8380278e9c0a/lxml-5.4.0-cp310-cp310-manylinux_2_28_s390x.whl", hash = "sha256:0a01ce7d8479dce84fc03324e3b0c9c90b1ece9a9bb6a1b6c9025e7e4520e78c", size = 5062691, upload-time = "2025-04-23T01:44:56.108Z" }, + { url = "https://files.pythonhosted.org/packages/d0/bc/712b96823d7feb53482d2e4f59c090fb18ec7b0d0b476f353b3085893cda/lxml-5.4.0-cp310-cp310-manylinux_2_28_x86_64.whl", hash = "sha256:91505d3ddebf268bb1588eb0f63821f738d20e1e7f05d3c647a5ca900288760b", size = 5133503, upload-time = "2025-04-23T01:44:59.222Z" }, + { url = "https://files.pythonhosted.org/packages/d4/55/a62a39e8f9da2a8b6002603475e3c57c870cd9c95fd4b94d4d9ac9036055/lxml-5.4.0-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:a3bcdde35d82ff385f4ede021df801b5c4a5bcdfb61ea87caabcebfc4945dc1b", size = 4999346, upload-time = "2025-04-23T01:45:02.088Z" }, + { url = "https://files.pythonhosted.org/packages/ea/47/a393728ae001b92bb1a9e095e570bf71ec7f7fbae7688a4792222e56e5b9/lxml-5.4.0-cp310-cp310-musllinux_1_2_ppc64le.whl", hash = "sha256:aea7c06667b987787c7d1f5e1dfcd70419b711cdb47d6b4bb4ad4b76777a0563", size = 5627139, upload-time = "2025-04-23T01:45:04.582Z" }, + { url = "https://files.pythonhosted.org/packages/5e/5f/9dcaaad037c3e642a7ea64b479aa082968de46dd67a8293c541742b6c9db/lxml-5.4.0-cp310-cp310-musllinux_1_2_s390x.whl", hash = "sha256:a7fb111eef4d05909b82152721a59c1b14d0f365e2be4c742a473c5d7372f4f5", size = 5465609, upload-time = "2025-04-23T01:45:07.649Z" }, + { url = "https://files.pythonhosted.org/packages/a7/0a/ebcae89edf27e61c45023005171d0ba95cb414ee41c045ae4caf1b8487fd/lxml-5.4.0-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:43d549b876ce64aa18b2328faff70f5877f8c6dede415f80a2f799d31644d776", size = 5192285, upload-time = "2025-04-23T01:45:10.456Z" }, + { url = "https://files.pythonhosted.org/packages/42/ad/cc8140ca99add7d85c92db8b2354638ed6d5cc0e917b21d36039cb15a238/lxml-5.4.0-cp310-cp310-win32.whl", hash = "sha256:75133890e40d229d6c5837b0312abbe5bac1c342452cf0e12523477cd3aa21e7", size = 3477507, upload-time = "2025-04-23T01:45:12.474Z" }, + { url = "https://files.pythonhosted.org/packages/e9/39/597ce090da1097d2aabd2f9ef42187a6c9c8546d67c419ce61b88b336c85/lxml-5.4.0-cp310-cp310-win_amd64.whl", hash = "sha256:de5b4e1088523e2b6f730d0509a9a813355b7f5659d70eb4f319c76beea2e250", size = 3805104, upload-time = "2025-04-23T01:45:15.104Z" }, + { url = "https://files.pythonhosted.org/packages/81/2d/67693cc8a605a12e5975380d7ff83020dcc759351b5a066e1cced04f797b/lxml-5.4.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:98a3912194c079ef37e716ed228ae0dcb960992100461b704aea4e93af6b0bb9", size = 8083240, upload-time = "2025-04-23T01:45:18.566Z" }, + { url = "https://files.pythonhosted.org/packages/73/53/b5a05ab300a808b72e848efd152fe9c022c0181b0a70b8bca1199f1bed26/lxml-5.4.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:0ea0252b51d296a75f6118ed0d8696888e7403408ad42345d7dfd0d1e93309a7", size = 4387685, upload-time = "2025-04-23T01:45:21.387Z" }, + { url = "https://files.pythonhosted.org/packages/d8/cb/1a3879c5f512bdcd32995c301886fe082b2edd83c87d41b6d42d89b4ea4d/lxml-5.4.0-cp311-cp311-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:b92b69441d1bd39f4940f9eadfa417a25862242ca2c396b406f9272ef09cdcaa", size = 4991164, upload-time = "2025-04-23T01:45:23.849Z" }, + { url = "https://files.pythonhosted.org/packages/f9/94/bbc66e42559f9d04857071e3b3d0c9abd88579367fd2588a4042f641f57e/lxml-5.4.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:20e16c08254b9b6466526bc1828d9370ee6c0d60a4b64836bc3ac2917d1e16df", size = 4746206, upload-time = "2025-04-23T01:45:26.361Z" }, + { url = "https://files.pythonhosted.org/packages/66/95/34b0679bee435da2d7cae895731700e519a8dfcab499c21662ebe671603e/lxml-5.4.0-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:7605c1c32c3d6e8c990dd28a0970a3cbbf1429d5b92279e37fda05fb0c92190e", size = 5342144, upload-time = "2025-04-23T01:45:28.939Z" }, + { url = "https://files.pythonhosted.org/packages/e0/5d/abfcc6ab2fa0be72b2ba938abdae1f7cad4c632f8d552683ea295d55adfb/lxml-5.4.0-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:ecf4c4b83f1ab3d5a7ace10bafcb6f11df6156857a3c418244cef41ca9fa3e44", size = 4825124, upload-time = "2025-04-23T01:45:31.361Z" }, + { url = "https://files.pythonhosted.org/packages/5a/78/6bd33186c8863b36e084f294fc0a5e5eefe77af95f0663ef33809cc1c8aa/lxml-5.4.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0cef4feae82709eed352cd7e97ae062ef6ae9c7b5dbe3663f104cd2c0e8d94ba", size = 4876520, upload-time = "2025-04-23T01:45:34.191Z" }, + { url = "https://files.pythonhosted.org/packages/3b/74/4d7ad4839bd0fc64e3d12da74fc9a193febb0fae0ba6ebd5149d4c23176a/lxml-5.4.0-cp311-cp311-manylinux_2_28_aarch64.whl", hash = "sha256:df53330a3bff250f10472ce96a9af28628ff1f4efc51ccba351a8820bca2a8ba", size = 4765016, upload-time = "2025-04-23T01:45:36.7Z" }, + { url = "https://files.pythonhosted.org/packages/24/0d/0a98ed1f2471911dadfc541003ac6dd6879fc87b15e1143743ca20f3e973/lxml-5.4.0-cp311-cp311-manylinux_2_28_ppc64le.whl", hash = "sha256:aefe1a7cb852fa61150fcb21a8c8fcea7b58c4cb11fbe59c97a0a4b31cae3c8c", size = 5362884, upload-time = "2025-04-23T01:45:39.291Z" }, + { url = "https://files.pythonhosted.org/packages/48/de/d4f7e4c39740a6610f0f6959052b547478107967362e8424e1163ec37ae8/lxml-5.4.0-cp311-cp311-manylinux_2_28_s390x.whl", hash = "sha256:ef5a7178fcc73b7d8c07229e89f8eb45b2908a9238eb90dcfc46571ccf0383b8", size = 4902690, upload-time = "2025-04-23T01:45:42.386Z" }, + { url = "https://files.pythonhosted.org/packages/07/8c/61763abd242af84f355ca4ef1ee096d3c1b7514819564cce70fd18c22e9a/lxml-5.4.0-cp311-cp311-manylinux_2_28_x86_64.whl", hash = "sha256:d2ed1b3cb9ff1c10e6e8b00941bb2e5bb568b307bfc6b17dffbbe8be5eecba86", size = 4944418, upload-time = "2025-04-23T01:45:46.051Z" }, + { url = "https://files.pythonhosted.org/packages/f9/c5/6d7e3b63e7e282619193961a570c0a4c8a57fe820f07ca3fe2f6bd86608a/lxml-5.4.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:72ac9762a9f8ce74c9eed4a4e74306f2f18613a6b71fa065495a67ac227b3056", size = 4827092, upload-time = "2025-04-23T01:45:48.943Z" }, + { url = "https://files.pythonhosted.org/packages/71/4a/e60a306df54680b103348545706a98a7514a42c8b4fbfdcaa608567bb065/lxml-5.4.0-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:f5cb182f6396706dc6cc1896dd02b1c889d644c081b0cdec38747573db88a7d7", size = 5418231, upload-time = "2025-04-23T01:45:51.481Z" }, + { url = "https://files.pythonhosted.org/packages/27/f2/9754aacd6016c930875854f08ac4b192a47fe19565f776a64004aa167521/lxml-5.4.0-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:3a3178b4873df8ef9457a4875703488eb1622632a9cee6d76464b60e90adbfcd", size = 5261798, upload-time = "2025-04-23T01:45:54.146Z" }, + { url = "https://files.pythonhosted.org/packages/38/a2/0c49ec6941428b1bd4f280650d7b11a0f91ace9db7de32eb7aa23bcb39ff/lxml-5.4.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:e094ec83694b59d263802ed03a8384594fcce477ce484b0cbcd0008a211ca751", size = 4988195, upload-time = "2025-04-23T01:45:56.685Z" }, + { url = "https://files.pythonhosted.org/packages/7a/75/87a3963a08eafc46a86c1131c6e28a4de103ba30b5ae903114177352a3d7/lxml-5.4.0-cp311-cp311-win32.whl", hash = "sha256:4329422de653cdb2b72afa39b0aa04252fca9071550044904b2e7036d9d97fe4", size = 3474243, upload-time = "2025-04-23T01:45:58.863Z" }, + { url = "https://files.pythonhosted.org/packages/fa/f9/1f0964c4f6c2be861c50db380c554fb8befbea98c6404744ce243a3c87ef/lxml-5.4.0-cp311-cp311-win_amd64.whl", hash = "sha256:fd3be6481ef54b8cfd0e1e953323b7aa9d9789b94842d0e5b142ef4bb7999539", size = 3815197, upload-time = "2025-04-23T01:46:01.096Z" }, + { url = "https://files.pythonhosted.org/packages/f8/4c/d101ace719ca6a4ec043eb516fcfcb1b396a9fccc4fcd9ef593df34ba0d5/lxml-5.4.0-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:b5aff6f3e818e6bdbbb38e5967520f174b18f539c2b9de867b1e7fde6f8d95a4", size = 8127392, upload-time = "2025-04-23T01:46:04.09Z" }, + { url = "https://files.pythonhosted.org/packages/11/84/beddae0cec4dd9ddf46abf156f0af451c13019a0fa25d7445b655ba5ccb7/lxml-5.4.0-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:942a5d73f739ad7c452bf739a62a0f83e2578afd6b8e5406308731f4ce78b16d", size = 4415103, upload-time = "2025-04-23T01:46:07.227Z" }, + { url = "https://files.pythonhosted.org/packages/d0/25/d0d93a4e763f0462cccd2b8a665bf1e4343dd788c76dcfefa289d46a38a9/lxml-5.4.0-cp312-cp312-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:460508a4b07364d6abf53acaa0a90b6d370fafde5693ef37602566613a9b0779", size = 5024224, upload-time = "2025-04-23T01:46:10.237Z" }, + { url = "https://files.pythonhosted.org/packages/31/ce/1df18fb8f7946e7f3388af378b1f34fcf253b94b9feedb2cec5969da8012/lxml-5.4.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:529024ab3a505fed78fe3cc5ddc079464e709f6c892733e3f5842007cec8ac6e", size = 4769913, upload-time = "2025-04-23T01:46:12.757Z" }, + { url = "https://files.pythonhosted.org/packages/4e/62/f4a6c60ae7c40d43657f552f3045df05118636be1165b906d3423790447f/lxml-5.4.0-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:7ca56ebc2c474e8f3d5761debfd9283b8b18c76c4fc0967b74aeafba1f5647f9", size = 5290441, upload-time = "2025-04-23T01:46:16.037Z" }, + { url = "https://files.pythonhosted.org/packages/9e/aa/04f00009e1e3a77838c7fc948f161b5d2d5de1136b2b81c712a263829ea4/lxml-5.4.0-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:a81e1196f0a5b4167a8dafe3a66aa67c4addac1b22dc47947abd5d5c7a3f24b5", size = 4820165, upload-time = "2025-04-23T01:46:19.137Z" }, + { url = "https://files.pythonhosted.org/packages/c9/1f/e0b2f61fa2404bf0f1fdf1898377e5bd1b74cc9b2cf2c6ba8509b8f27990/lxml-5.4.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:00b8686694423ddae324cf614e1b9659c2edb754de617703c3d29ff568448df5", size = 4932580, upload-time = "2025-04-23T01:46:21.963Z" }, + { url = "https://files.pythonhosted.org/packages/24/a2/8263f351b4ffe0ed3e32ea7b7830f845c795349034f912f490180d88a877/lxml-5.4.0-cp312-cp312-manylinux_2_28_aarch64.whl", hash = "sha256:c5681160758d3f6ac5b4fea370495c48aac0989d6a0f01bb9a72ad8ef5ab75c4", size = 4759493, upload-time = "2025-04-23T01:46:24.316Z" }, + { url = "https://files.pythonhosted.org/packages/05/00/41db052f279995c0e35c79d0f0fc9f8122d5b5e9630139c592a0b58c71b4/lxml-5.4.0-cp312-cp312-manylinux_2_28_ppc64le.whl", hash = "sha256:2dc191e60425ad70e75a68c9fd90ab284df64d9cd410ba8d2b641c0c45bc006e", size = 5324679, upload-time = "2025-04-23T01:46:27.097Z" }, + { url = "https://files.pythonhosted.org/packages/1d/be/ee99e6314cdef4587617d3b3b745f9356d9b7dd12a9663c5f3b5734b64ba/lxml-5.4.0-cp312-cp312-manylinux_2_28_s390x.whl", hash = "sha256:67f779374c6b9753ae0a0195a892a1c234ce8416e4448fe1e9f34746482070a7", size = 4890691, upload-time = "2025-04-23T01:46:30.009Z" }, + { url = "https://files.pythonhosted.org/packages/ad/36/239820114bf1d71f38f12208b9c58dec033cbcf80101cde006b9bde5cffd/lxml-5.4.0-cp312-cp312-manylinux_2_28_x86_64.whl", hash = "sha256:79d5bfa9c1b455336f52343130b2067164040604e41f6dc4d8313867ed540079", size = 4955075, upload-time = "2025-04-23T01:46:32.33Z" }, + { url = "https://files.pythonhosted.org/packages/d4/e1/1b795cc0b174efc9e13dbd078a9ff79a58728a033142bc6d70a1ee8fc34d/lxml-5.4.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:3d3c30ba1c9b48c68489dc1829a6eede9873f52edca1dda900066542528d6b20", size = 4838680, upload-time = "2025-04-23T01:46:34.852Z" }, + { url = "https://files.pythonhosted.org/packages/72/48/3c198455ca108cec5ae3662ae8acd7fd99476812fd712bb17f1b39a0b589/lxml-5.4.0-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:1af80c6316ae68aded77e91cd9d80648f7dd40406cef73df841aa3c36f6907c8", size = 5391253, upload-time = "2025-04-23T01:46:37.608Z" }, + { url = "https://files.pythonhosted.org/packages/d6/10/5bf51858971c51ec96cfc13e800a9951f3fd501686f4c18d7d84fe2d6352/lxml-5.4.0-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:4d885698f5019abe0de3d352caf9466d5de2baded00a06ef3f1216c1a58ae78f", size = 5261651, upload-time = "2025-04-23T01:46:40.183Z" }, + { url = "https://files.pythonhosted.org/packages/2b/11/06710dd809205377da380546f91d2ac94bad9ff735a72b64ec029f706c85/lxml-5.4.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:aea53d51859b6c64e7c51d522c03cc2c48b9b5d6172126854cc7f01aa11f52bc", size = 5024315, upload-time = "2025-04-23T01:46:43.333Z" }, + { url = "https://files.pythonhosted.org/packages/f5/b0/15b6217834b5e3a59ebf7f53125e08e318030e8cc0d7310355e6edac98ef/lxml-5.4.0-cp312-cp312-win32.whl", hash = "sha256:d90b729fd2732df28130c064aac9bb8aff14ba20baa4aee7bd0795ff1187545f", size = 3486149, upload-time = "2025-04-23T01:46:45.684Z" }, + { url = "https://files.pythonhosted.org/packages/91/1e/05ddcb57ad2f3069101611bd5f5084157d90861a2ef460bf42f45cced944/lxml-5.4.0-cp312-cp312-win_amd64.whl", hash = "sha256:1dc4ca99e89c335a7ed47d38964abcb36c5910790f9bd106f2a8fa2ee0b909d2", size = 3817095, upload-time = "2025-04-23T01:46:48.521Z" }, + { url = "https://files.pythonhosted.org/packages/87/cb/2ba1e9dd953415f58548506fa5549a7f373ae55e80c61c9041b7fd09a38a/lxml-5.4.0-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:773e27b62920199c6197130632c18fb7ead3257fce1ffb7d286912e56ddb79e0", size = 8110086, upload-time = "2025-04-23T01:46:52.218Z" }, + { url = "https://files.pythonhosted.org/packages/b5/3e/6602a4dca3ae344e8609914d6ab22e52ce42e3e1638c10967568c5c1450d/lxml-5.4.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:ce9c671845de9699904b1e9df95acfe8dfc183f2310f163cdaa91a3535af95de", size = 4404613, upload-time = "2025-04-23T01:46:55.281Z" }, + { url = "https://files.pythonhosted.org/packages/4c/72/bf00988477d3bb452bef9436e45aeea82bb40cdfb4684b83c967c53909c7/lxml-5.4.0-cp313-cp313-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:9454b8d8200ec99a224df8854786262b1bd6461f4280064c807303c642c05e76", size = 5012008, upload-time = "2025-04-23T01:46:57.817Z" }, + { url = "https://files.pythonhosted.org/packages/92/1f/93e42d93e9e7a44b2d3354c462cd784dbaaf350f7976b5d7c3f85d68d1b1/lxml-5.4.0-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:cccd007d5c95279e529c146d095f1d39ac05139de26c098166c4beb9374b0f4d", size = 4760915, upload-time = "2025-04-23T01:47:00.745Z" }, + { url = "https://files.pythonhosted.org/packages/45/0b/363009390d0b461cf9976a499e83b68f792e4c32ecef092f3f9ef9c4ba54/lxml-5.4.0-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:0fce1294a0497edb034cb416ad3e77ecc89b313cff7adbee5334e4dc0d11f422", size = 5283890, upload-time = "2025-04-23T01:47:04.702Z" }, + { url = "https://files.pythonhosted.org/packages/19/dc/6056c332f9378ab476c88e301e6549a0454dbee8f0ae16847414f0eccb74/lxml-5.4.0-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:24974f774f3a78ac12b95e3a20ef0931795ff04dbb16db81a90c37f589819551", size = 4812644, upload-time = "2025-04-23T01:47:07.833Z" }, + { url = "https://files.pythonhosted.org/packages/ee/8a/f8c66bbb23ecb9048a46a5ef9b495fd23f7543df642dabeebcb2eeb66592/lxml-5.4.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:497cab4d8254c2a90bf988f162ace2ddbfdd806fce3bda3f581b9d24c852e03c", size = 4921817, upload-time = "2025-04-23T01:47:10.317Z" }, + { url = "https://files.pythonhosted.org/packages/04/57/2e537083c3f381f83d05d9b176f0d838a9e8961f7ed8ddce3f0217179ce3/lxml-5.4.0-cp313-cp313-manylinux_2_28_aarch64.whl", hash = "sha256:e794f698ae4c5084414efea0f5cc9f4ac562ec02d66e1484ff822ef97c2cadff", size = 4753916, upload-time = "2025-04-23T01:47:12.823Z" }, + { url = "https://files.pythonhosted.org/packages/d8/80/ea8c4072109a350848f1157ce83ccd9439601274035cd045ac31f47f3417/lxml-5.4.0-cp313-cp313-manylinux_2_28_ppc64le.whl", hash = "sha256:2c62891b1ea3094bb12097822b3d44b93fc6c325f2043c4d2736a8ff09e65f60", size = 5289274, upload-time = "2025-04-23T01:47:15.916Z" }, + { url = "https://files.pythonhosted.org/packages/b3/47/c4be287c48cdc304483457878a3f22999098b9a95f455e3c4bda7ec7fc72/lxml-5.4.0-cp313-cp313-manylinux_2_28_s390x.whl", hash = "sha256:142accb3e4d1edae4b392bd165a9abdee8a3c432a2cca193df995bc3886249c8", size = 4874757, upload-time = "2025-04-23T01:47:19.793Z" }, + { url = "https://files.pythonhosted.org/packages/2f/04/6ef935dc74e729932e39478e44d8cfe6a83550552eaa072b7c05f6f22488/lxml-5.4.0-cp313-cp313-manylinux_2_28_x86_64.whl", hash = "sha256:1a42b3a19346e5601d1b8296ff6ef3d76038058f311902edd574461e9c036982", size = 4947028, upload-time = "2025-04-23T01:47:22.401Z" }, + { url = "https://files.pythonhosted.org/packages/cb/f9/c33fc8daa373ef8a7daddb53175289024512b6619bc9de36d77dca3df44b/lxml-5.4.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:4291d3c409a17febf817259cb37bc62cb7eb398bcc95c1356947e2871911ae61", size = 4834487, upload-time = "2025-04-23T01:47:25.513Z" }, + { url = "https://files.pythonhosted.org/packages/8d/30/fc92bb595bcb878311e01b418b57d13900f84c2b94f6eca9e5073ea756e6/lxml-5.4.0-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:4f5322cf38fe0e21c2d73901abf68e6329dc02a4994e483adbcf92b568a09a54", size = 5381688, upload-time = "2025-04-23T01:47:28.454Z" }, + { url = "https://files.pythonhosted.org/packages/43/d1/3ba7bd978ce28bba8e3da2c2e9d5ae3f8f521ad3f0ca6ea4788d086ba00d/lxml-5.4.0-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:0be91891bdb06ebe65122aa6bf3fc94489960cf7e03033c6f83a90863b23c58b", size = 5242043, upload-time = "2025-04-23T01:47:31.208Z" }, + { url = "https://files.pythonhosted.org/packages/ee/cd/95fa2201041a610c4d08ddaf31d43b98ecc4b1d74b1e7245b1abdab443cb/lxml-5.4.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:15a665ad90054a3d4f397bc40f73948d48e36e4c09f9bcffc7d90c87410e478a", size = 5021569, upload-time = "2025-04-23T01:47:33.805Z" }, + { url = "https://files.pythonhosted.org/packages/2d/a6/31da006fead660b9512d08d23d31e93ad3477dd47cc42e3285f143443176/lxml-5.4.0-cp313-cp313-win32.whl", hash = "sha256:d5663bc1b471c79f5c833cffbc9b87d7bf13f87e055a5c86c363ccd2348d7e82", size = 3485270, upload-time = "2025-04-23T01:47:36.133Z" }, + { url = "https://files.pythonhosted.org/packages/fc/14/c115516c62a7d2499781d2d3d7215218c0731b2c940753bf9f9b7b73924d/lxml-5.4.0-cp313-cp313-win_amd64.whl", hash = "sha256:bcb7a1096b4b6b24ce1ac24d4942ad98f983cd3810f9711bcd0293f43a9d8b9f", size = 3814606, upload-time = "2025-04-23T01:47:39.028Z" }, + { url = "https://files.pythonhosted.org/packages/5f/65/6cc97ec78bc395af6127850614223568b1808505960e26b8126336d804b2/lxml-5.4.0-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:795f61bcaf8770e1b37eec24edf9771b307df3af74d1d6f27d812e15a9ff3872", size = 4400563, upload-time = "2025-04-23T01:48:02.853Z" }, + { url = "https://files.pythonhosted.org/packages/99/3f/863f7f5446edbf0edb16fa1f8de8ed825b1fdb01b766598203a15f1c6b32/lxml-5.4.0-cp37-cp37m-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:29f451a4b614a7b5b6c2e043d7b64a15bd8304d7e767055e8ab68387a8cacf4e", size = 5045095, upload-time = "2025-04-23T01:48:05.416Z" }, + { url = "https://files.pythonhosted.org/packages/31/34/96b69cea212bc930408820d11ff247d39c7631c9a20fa533328b518a0780/lxml-5.4.0-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:891f7f991a68d20c75cb13c5c9142b2a3f9eb161f1f12a9489c82172d1f133c0", size = 4767094, upload-time = "2025-05-07T08:14:22.387Z" }, + { url = "https://files.pythonhosted.org/packages/06/9b/9a78fd2cdfd6594bece1f54bd82c63409270252e728235c8f4585a8a86c3/lxml-5.4.0-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4aa412a82e460571fad592d0f93ce9935a20090029ba08eca05c614f99b0cc92", size = 4906101, upload-time = "2025-04-23T01:48:07.985Z" }, + { url = "https://files.pythonhosted.org/packages/d4/76/c32533364bbaf348441c08460b4cf433accde608737c65c6443096cbefd8/lxml-5.4.0-cp37-cp37m-manylinux_2_28_aarch64.whl", hash = "sha256:ac7ba71f9561cd7d7b55e1ea5511543c0282e2b6450f122672a2694621d63b7e", size = 4752438, upload-time = "2025-05-07T08:14:32.003Z" }, + { url = "https://files.pythonhosted.org/packages/4a/fb/0fc9e195929e7ca0f4a0c70b17e25104eb311648f437e70e04bb0381db21/lxml-5.4.0-cp37-cp37m-manylinux_2_28_x86_64.whl", hash = "sha256:c5d32f5284012deaccd37da1e2cd42f081feaa76981f0eaa474351b68df813c5", size = 4947162, upload-time = "2025-04-23T01:48:10.566Z" }, + { url = "https://files.pythonhosted.org/packages/d6/4e/b8c7e2d86a7ccd367aab8ab1d24c5caac37205ddf5b99610caeaa9809ed0/lxml-5.4.0-cp37-cp37m-musllinux_1_2_aarch64.whl", hash = "sha256:ce31158630a6ac85bddd6b830cffd46085ff90498b397bd0a259f59d27a12188", size = 4830106, upload-time = "2025-05-07T08:14:37.097Z" }, + { url = "https://files.pythonhosted.org/packages/c8/e7/6ad7178994f9a67dbe0a93a99a43c21f157c9bc4d106f495f6696c693d3c/lxml-5.4.0-cp37-cp37m-musllinux_1_2_x86_64.whl", hash = "sha256:31e63621e073e04697c1b2d23fcb89991790eef370ec37ce4d5d469f40924ed6", size = 5001558, upload-time = "2025-04-23T01:48:13.202Z" }, + { url = "https://files.pythonhosted.org/packages/50/56/fcef28dd6e03b997b7ee7efbb26591463047ebc02009ab9b454d677dc44f/lxml-5.4.0-cp37-cp37m-win32.whl", hash = "sha256:be2ba4c3c5b7900246a8f866580700ef0d538f2ca32535e991027bdaba944063", size = 3456815, upload-time = "2025-04-23T01:48:16.17Z" }, + { url = "https://files.pythonhosted.org/packages/78/60/bac0ea0babefd9d48ba06331c4b2bb24027de0b9f231f5dccf22abf64207/lxml-5.4.0-cp37-cp37m-win_amd64.whl", hash = "sha256:09846782b1ef650b321484ad429217f5154da4d6e786636c38e434fa32e94e49", size = 3774236, upload-time = "2025-04-23T01:48:19.011Z" }, + { url = "https://files.pythonhosted.org/packages/d2/2f/18df18629d0b28ed00a1903033c627249ee002231c0c272cbb616a54dc61/lxml-5.4.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:eaf24066ad0b30917186420d51e2e3edf4b0e2ea68d8cd885b14dc8afdcf6556", size = 4439701, upload-time = "2025-04-23T01:48:22.016Z" }, + { url = "https://files.pythonhosted.org/packages/a0/95/2a31efe19c8d6e4b7bdbcd1a9a6e0a2cb28472c9ea4c29b0e170c6bc7b08/lxml-5.4.0-cp38-cp38-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:2b31a3a77501d86d8ade128abb01082724c0dfd9524f542f2f07d693c9f1175f", size = 5109242, upload-time = "2025-04-23T01:48:25.128Z" }, + { url = "https://files.pythonhosted.org/packages/d8/f9/afc3d28beb7125b09bc54b5e7194b4e1bf9f75e8a0ba3f357adc1f6c6f86/lxml-5.4.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0e108352e203c7afd0eb91d782582f00a0b16a948d204d4dec8565024fafeea5", size = 4831235, upload-time = "2025-04-23T01:48:27.645Z" }, + { url = "https://files.pythonhosted.org/packages/94/a7/31be3410d202bcd7fb3f21efd2fb868e07eff5c83d7db26e2c76aa1d72fb/lxml-5.4.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a11a96c3b3f7551c8a8109aa65e8594e551d5a84c76bf950da33d0fb6dfafab7", size = 4986329, upload-time = "2025-04-23T01:48:30.212Z" }, + { url = "https://files.pythonhosted.org/packages/b6/72/ff7408e60fa972b5a34e719ecfa3fe292ec72868a703d7eb5fe92eae7183/lxml-5.4.0-cp38-cp38-manylinux_2_28_aarch64.whl", hash = "sha256:ca755eebf0d9e62d6cb013f1261e510317a41bf4650f22963474a663fdfe02aa", size = 4819967, upload-time = "2025-04-23T01:48:33.319Z" }, + { url = "https://files.pythonhosted.org/packages/03/b4/17df5c25d95198ffac5f8fc2a04586c2e8d1c1b7d9e77a8b7e016772f4ea/lxml-5.4.0-cp38-cp38-manylinux_2_28_x86_64.whl", hash = "sha256:4cd915c0fb1bed47b5e6d6edd424ac25856252f09120e3e8ba5154b6b921860e", size = 5030259, upload-time = "2025-04-23T01:48:36.536Z" }, + { url = "https://files.pythonhosted.org/packages/93/ab/3ddf099739ee9ffaf75c6367d4ea9512f1a7b0c72b6d2d37330c8fd23a02/lxml-5.4.0-cp38-cp38-musllinux_1_2_aarch64.whl", hash = "sha256:226046e386556a45ebc787871d6d2467b32c37ce76c2680f5c608e25823ffc84", size = 4895573, upload-time = "2025-04-23T01:48:39.541Z" }, + { url = "https://files.pythonhosted.org/packages/3e/e2/e6b880194eb24bd55fb48989ce4f653ec4cb31dbe3deeda16957601f71f3/lxml-5.4.0-cp38-cp38-musllinux_1_2_x86_64.whl", hash = "sha256:b108134b9667bcd71236c5a02aad5ddd073e372fb5d48ea74853e009fe38acb6", size = 5084328, upload-time = "2025-04-23T01:48:42.816Z" }, + { url = "https://files.pythonhosted.org/packages/c2/1a/16467b52c9b5fea958b2173b3fb03be295f308520c9fda1556099641b14e/lxml-5.4.0-cp38-cp38-win32.whl", hash = "sha256:1320091caa89805df7dcb9e908add28166113dcd062590668514dbd510798c88", size = 3484259, upload-time = "2025-04-23T01:48:45.774Z" }, + { url = "https://files.pythonhosted.org/packages/7a/c2/1365fd76b35a9a03a7ac4a0ce8372b4f792bd64c9d226532fe4ff6923cb4/lxml-5.4.0-cp38-cp38-win_amd64.whl", hash = "sha256:073eb6dcdf1f587d9b88c8c93528b57eccda40209cf9be549d469b942b41d70b", size = 3814595, upload-time = "2025-04-23T01:48:48.095Z" }, + { url = "https://files.pythonhosted.org/packages/1e/04/acd238222ea25683e43ac7113facc380b3aaf77c53e7d88c4f544cef02ca/lxml-5.4.0-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:bda3ea44c39eb74e2488297bb39d47186ed01342f0022c8ff407c250ac3f498e", size = 8082189, upload-time = "2025-04-23T01:48:51.829Z" }, + { url = "https://files.pythonhosted.org/packages/d6/4e/cc7fe9ccb9999cc648492ce970b63c657606aefc7d0fba46b17aa2ba93fb/lxml-5.4.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:9ceaf423b50ecfc23ca00b7f50b64baba85fb3fb91c53e2c9d00bc86150c7e40", size = 4384950, upload-time = "2025-04-23T01:48:54.464Z" }, + { url = "https://files.pythonhosted.org/packages/56/bf/acd219c489346d0243a30769b9d446b71e5608581db49a18c8d91a669e19/lxml-5.4.0-cp39-cp39-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:664cdc733bc87449fe781dbb1f309090966c11cc0c0cd7b84af956a02a8a4729", size = 5209823, upload-time = "2025-04-23T01:48:57.192Z" }, + { url = "https://files.pythonhosted.org/packages/57/51/ec31cd33175c09aa7b93d101f56eed43d89e15504455d884d021df7166a7/lxml-5.4.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:67ed8a40665b84d161bae3181aa2763beea3747f748bca5874b4af4d75998f87", size = 4931808, upload-time = "2025-04-23T01:48:59.811Z" }, + { url = "https://files.pythonhosted.org/packages/e5/68/865d229f191514da1777125598d028dc88a5ea300d68c30e1f120bfd01bd/lxml-5.4.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9b4a3bd174cc9cdaa1afbc4620c049038b441d6ba07629d89a83b408e54c35cd", size = 5086067, upload-time = "2025-04-23T01:49:02.887Z" }, + { url = "https://files.pythonhosted.org/packages/82/01/4c958c5848b4e263cd9e83dff6b49f975a5a0854feb1070dfe0bdcdf70a0/lxml-5.4.0-cp39-cp39-manylinux_2_28_aarch64.whl", hash = "sha256:b0989737a3ba6cf2a16efb857fb0dfa20bc5c542737fddb6d893fde48be45433", size = 4929026, upload-time = "2025-04-23T01:49:05.624Z" }, + { url = "https://files.pythonhosted.org/packages/55/31/5327d8af74d7f35e645b40ae6658761e1fee59ebecaa6a8d295e495c2ca9/lxml-5.4.0-cp39-cp39-manylinux_2_28_x86_64.whl", hash = "sha256:dc0af80267edc68adf85f2a5d9be1cdf062f973db6790c1d065e45025fa26140", size = 5134245, upload-time = "2025-04-23T01:49:08.918Z" }, + { url = "https://files.pythonhosted.org/packages/6f/c9/204eba2400beb0016dacc2c5335ecb1e37f397796683ffdb7f471e86bddb/lxml-5.4.0-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:639978bccb04c42677db43c79bdaa23785dc7f9b83bfd87570da8207872f1ce5", size = 5001020, upload-time = "2025-04-23T01:49:11.643Z" }, + { url = "https://files.pythonhosted.org/packages/07/53/979165f50a853dab1cf3b9e53105032d55f85c5993f94afc4d9a61a22877/lxml-5.4.0-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:5a99d86351f9c15e4a901fc56404b485b1462039db59288b203f8c629260a142", size = 5192346, upload-time = "2025-04-23T01:49:14.868Z" }, + { url = "https://files.pythonhosted.org/packages/17/2b/f37b5ae28949143f863ba3066b30eede6107fc9a503bd0d01677d4e2a1e0/lxml-5.4.0-cp39-cp39-win32.whl", hash = "sha256:3e6d5557989cdc3ebb5302bbdc42b439733a841891762ded9514e74f60319ad6", size = 3478275, upload-time = "2025-04-23T01:49:17.249Z" }, + { url = "https://files.pythonhosted.org/packages/9a/d5/b795a183680126147665a8eeda8e802c180f2f7661aa9a550bba5bcdae63/lxml-5.4.0-cp39-cp39-win_amd64.whl", hash = "sha256:a8c9b7f16b63e65bbba889acb436a1034a82d34fa09752d754f88d708eca80e1", size = 3806275, upload-time = "2025-04-23T01:49:19.635Z" }, + { url = "https://files.pythonhosted.org/packages/c6/b0/e4d1cbb8c078bc4ae44de9c6a79fec4e2b4151b1b4d50af71d799e76b177/lxml-5.4.0-pp310-pypy310_pp73-macosx_10_15_x86_64.whl", hash = "sha256:1b717b00a71b901b4667226bba282dd462c42ccf618ade12f9ba3674e1fabc55", size = 3892319, upload-time = "2025-04-23T01:49:22.069Z" }, + { url = "https://files.pythonhosted.org/packages/5b/aa/e2bdefba40d815059bcb60b371a36fbfcce970a935370e1b367ba1cc8f74/lxml-5.4.0-pp310-pypy310_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:27a9ded0f0b52098ff89dd4c418325b987feed2ea5cc86e8860b0f844285d740", size = 4211614, upload-time = "2025-04-23T01:49:24.599Z" }, + { url = "https://files.pythonhosted.org/packages/3c/5f/91ff89d1e092e7cfdd8453a939436ac116db0a665e7f4be0cd8e65c7dc5a/lxml-5.4.0-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4b7ce10634113651d6f383aa712a194179dcd496bd8c41e191cec2099fa09de5", size = 4306273, upload-time = "2025-04-23T01:49:27.355Z" }, + { url = "https://files.pythonhosted.org/packages/be/7c/8c3f15df2ca534589717bfd19d1e3482167801caedfa4d90a575facf68a6/lxml-5.4.0-pp310-pypy310_pp73-manylinux_2_28_aarch64.whl", hash = "sha256:53370c26500d22b45182f98847243efb518d268374a9570409d2e2276232fd37", size = 4208552, upload-time = "2025-04-23T01:49:29.949Z" }, + { url = "https://files.pythonhosted.org/packages/7d/d8/9567afb1665f64d73fc54eb904e418d1138d7f011ed00647121b4dd60b38/lxml-5.4.0-pp310-pypy310_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:c6364038c519dffdbe07e3cf42e6a7f8b90c275d4d1617a69bb59734c1a2d571", size = 4331091, upload-time = "2025-04-23T01:49:32.842Z" }, + { url = "https://files.pythonhosted.org/packages/f1/ab/fdbbd91d8d82bf1a723ba88ec3e3d76c022b53c391b0c13cad441cdb8f9e/lxml-5.4.0-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:b12cb6527599808ada9eb2cd6e0e7d3d8f13fe7bbb01c6311255a15ded4c7ab4", size = 3487862, upload-time = "2025-04-23T01:49:36.296Z" }, + { url = "https://files.pythonhosted.org/packages/c5/93/1208b3b4e8e112b1eb91a0fcc15c24abc0b153eb66a44cf181db2ecfb408/lxml-5.4.0-pp37-pypy37_pp73-macosx_10_9_x86_64.whl", hash = "sha256:5f11a1526ebd0dee85e7b1e39e39a0cc0d9d03fb527f56d8457f6df48a10dc0c", size = 3893281, upload-time = "2025-04-23T01:49:38.679Z" }, + { url = "https://files.pythonhosted.org/packages/07/a7/6e5d107e9ffd6802ea405bfba20a0fc68587d47d0651dacbcdadbc68cf5c/lxml-5.4.0-pp37-pypy37_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:48b4afaf38bf79109bb060d9016fad014a9a48fb244e11b94f74ae366a64d252", size = 4229916, upload-time = "2025-04-23T01:49:41.138Z" }, + { url = "https://files.pythonhosted.org/packages/a9/63/7e4e577993fb3fc43179e2a3b4a5b2540ffac38892b6b5eb9e9676cb8ce0/lxml-5.4.0-pp37-pypy37_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:de6f6bb8a7840c7bf216fb83eec4e2f79f7325eca8858167b68708b929ab2172", size = 4336363, upload-time = "2025-04-23T01:49:43.687Z" }, + { url = "https://files.pythonhosted.org/packages/82/17/868d11c87115301da662a0939e2e0a9d0fffc2152c83c50d7c137e3b7077/lxml-5.4.0-pp37-pypy37_pp73-manylinux_2_28_aarch64.whl", hash = "sha256:5cca36a194a4eb4e2ed6be36923d3cffd03dcdf477515dea687185506583d4c9", size = 4223704, upload-time = "2025-04-23T01:49:46.257Z" }, + { url = "https://files.pythonhosted.org/packages/66/3b/8a3098b45fc619256d1275ab36d88a4bec34e35383a0001972a714bad53b/lxml-5.4.0-pp37-pypy37_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:b7c86884ad23d61b025989d99bfdd92a7351de956e01c61307cb87035960bcb1", size = 4354513, upload-time = "2025-04-23T01:49:49.351Z" }, + { url = "https://files.pythonhosted.org/packages/78/51/f3bb6239b32475db2b41a0ccf252063f8f40a05f6602e203895aff2da642/lxml-5.4.0-pp37-pypy37_pp73-win_amd64.whl", hash = "sha256:53d9469ab5460402c19553b56c3648746774ecd0681b1b27ea74d5d8a3ef5590", size = 3489629, upload-time = "2025-04-23T01:49:52.249Z" }, + { url = "https://files.pythonhosted.org/packages/b9/61/08ef39c34841750f3ba4c7a7b69a0adef131b1863d5547bbd3a8508c6e8e/lxml-5.4.0-pp38-pypy38_pp73-macosx_10_9_x86_64.whl", hash = "sha256:56dbdbab0551532bb26c19c914848d7251d73edb507c3079d6805fa8bba5b706", size = 3893294, upload-time = "2025-04-23T01:49:55.237Z" }, + { url = "https://files.pythonhosted.org/packages/8e/79/4194b498e7e936d1d958e89451292f371764e5dd3b2cba5c99f34a94ec87/lxml-5.4.0-pp38-pypy38_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:14479c2ad1cb08b62bb941ba8e0e05938524ee3c3114644df905d2331c76cd57", size = 4219875, upload-time = "2025-04-23T01:49:57.91Z" }, + { url = "https://files.pythonhosted.org/packages/3b/65/30be662dff12cfb38cd54a83b007864672717a0fa9d026452fb7933a3aec/lxml-5.4.0-pp38-pypy38_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:32697d2ea994e0db19c1df9e40275ffe84973e4232b5c274f47e7c1ec9763cdd", size = 4309450, upload-time = "2025-04-23T01:50:01.203Z" }, + { url = "https://files.pythonhosted.org/packages/c2/f9/dbba21a5ed4b2e7d96dedd9a9eb6da0aa3730964965b02e412b58c8539e9/lxml-5.4.0-pp38-pypy38_pp73-manylinux_2_28_aarch64.whl", hash = "sha256:24f6df5f24fc3385f622c0c9d63fe34604893bc1a5bdbb2dbf5870f85f9a404a", size = 4213198, upload-time = "2025-04-23T01:50:04.563Z" }, + { url = "https://files.pythonhosted.org/packages/06/de/96e9fd26038b74306967f854bfad25ed9f9f2a3150361bc0562f770a17c9/lxml-5.4.0-pp38-pypy38_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:151d6c40bc9db11e960619d2bf2ec5829f0aaffb10b41dcf6ad2ce0f3c0b2325", size = 4331737, upload-time = "2025-04-23T01:50:07.749Z" }, + { url = "https://files.pythonhosted.org/packages/61/21/dbf79a9c96172111c546f7ec9cab1fb4ab7a49fec42a62021840293d1468/lxml-5.4.0-pp38-pypy38_pp73-win_amd64.whl", hash = "sha256:4025bf2884ac4370a3243c5aa8d66d3cb9e15d3ddd0af2d796eccc5f0244390e", size = 3489930, upload-time = "2025-04-23T01:50:10.253Z" }, + { url = "https://files.pythonhosted.org/packages/ad/fb/d19b67e4bb63adc20574ba3476cf763b3514df1a37551084b890254e4b15/lxml-5.4.0-pp39-pypy39_pp73-macosx_10_15_x86_64.whl", hash = "sha256:9459e6892f59ecea2e2584ee1058f5d8f629446eab52ba2305ae13a32a059530", size = 3891034, upload-time = "2025-04-23T01:50:12.71Z" }, + { url = "https://files.pythonhosted.org/packages/c9/5d/6e1033ee0cdb2f9bc93164f9df14e42cb5bbf1bbed3bf67f687de2763104/lxml-5.4.0-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:47fb24cc0f052f0576ea382872b3fc7e1f7e3028e53299ea751839418ade92a6", size = 4207420, upload-time = "2025-04-23T01:50:15.281Z" }, + { url = "https://files.pythonhosted.org/packages/f3/4b/23ac79efc32d913259d66672c5f93daac7750a3d97cdc1c1a9a5d1c1b46c/lxml-5.4.0-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:50441c9de951a153c698b9b99992e806b71c1f36d14b154592580ff4a9d0d877", size = 4305106, upload-time = "2025-04-23T01:50:17.823Z" }, + { url = "https://files.pythonhosted.org/packages/a4/7a/fe558bee63a62f7a75a52111c0a94556c1c1bdcf558cd7d52861de558759/lxml-5.4.0-pp39-pypy39_pp73-manylinux_2_28_aarch64.whl", hash = "sha256:ab339536aa798b1e17750733663d272038bf28069761d5be57cb4a9b0137b4f8", size = 4205587, upload-time = "2025-04-23T01:50:20.899Z" }, + { url = "https://files.pythonhosted.org/packages/ed/5b/3207e6bd8d67c952acfec6bac9d1fa0ee353202e7c40b335ebe00879ab7d/lxml-5.4.0-pp39-pypy39_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:9776af1aad5a4b4a1317242ee2bea51da54b2a7b7b48674be736d463c999f37d", size = 4329077, upload-time = "2025-04-23T01:50:23.996Z" }, + { url = "https://files.pythonhosted.org/packages/a1/25/d381abcfd00102d3304aa191caab62f6e3bcbac93ee248771db6be153dfd/lxml-5.4.0-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:63e7968ff83da2eb6fdda967483a7a023aa497d85ad8f05c3ad9b1f2e8c84987", size = 3486416, upload-time = "2025-04-23T01:50:26.388Z" }, +] + +[[package]] +name = "lxml" +version = "6.0.2" +source = { registry = "https://pypi.org/simple" } +resolution-markers = [ + "python_full_version >= '3.12'", + "python_full_version == '3.11.*'", + "python_full_version == '3.10.*'", + "python_full_version == '3.9.*'", + "python_full_version >= '3.8.1' and python_full_version < '3.9'", + "python_full_version >= '3.8' and python_full_version < '3.8.1'", +] +sdist = { url = "https://files.pythonhosted.org/packages/aa/88/262177de60548e5a2bfc46ad28232c9e9cbde697bd94132aeb80364675cb/lxml-6.0.2.tar.gz", hash = "sha256:cd79f3367bd74b317dda655dc8fcfa304d9eb6e4fb06b7168c5cf27f96e0cd62", size = 4073426, upload-time = "2025-09-22T04:04:59.287Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/db/8a/f8192a08237ef2fb1b19733f709db88a4c43bc8ab8357f01cb41a27e7f6a/lxml-6.0.2-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:e77dd455b9a16bbd2a5036a63ddbd479c19572af81b624e79ef422f929eef388", size = 8590589, upload-time = "2025-09-22T04:00:10.51Z" }, + { url = "https://files.pythonhosted.org/packages/12/64/27bcd07ae17ff5e5536e8d88f4c7d581b48963817a13de11f3ac3329bfa2/lxml-6.0.2-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:5d444858b9f07cefff6455b983aea9a67f7462ba1f6cbe4a21e8bf6791bf2153", size = 4629671, upload-time = "2025-09-22T04:00:15.411Z" }, + { url = "https://files.pythonhosted.org/packages/02/5a/a7d53b3291c324e0b6e48f3c797be63836cc52156ddf8f33cd72aac78866/lxml-6.0.2-cp310-cp310-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:f952dacaa552f3bb8834908dddd500ba7d508e6ea6eb8c52eb2d28f48ca06a31", size = 4999961, upload-time = "2025-09-22T04:00:17.619Z" }, + { url = "https://files.pythonhosted.org/packages/f5/55/d465e9b89df1761674d8672bb3e4ae2c47033b01ec243964b6e334c6743f/lxml-6.0.2-cp310-cp310-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:71695772df6acea9f3c0e59e44ba8ac50c4f125217e84aab21074a1a55e7e5c9", size = 5157087, upload-time = "2025-09-22T04:00:19.868Z" }, + { url = "https://files.pythonhosted.org/packages/62/38/3073cd7e3e8dfc3ba3c3a139e33bee3a82de2bfb0925714351ad3d255c13/lxml-6.0.2-cp310-cp310-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:17f68764f35fd78d7c4cc4ef209a184c38b65440378013d24b8aecd327c3e0c8", size = 5067620, upload-time = "2025-09-22T04:00:21.877Z" }, + { url = "https://files.pythonhosted.org/packages/4a/d3/1e001588c5e2205637b08985597827d3827dbaaece16348c8822bfe61c29/lxml-6.0.2-cp310-cp310-manylinux_2_26_i686.manylinux_2_28_i686.whl", hash = "sha256:058027e261afed589eddcfe530fcc6f3402d7fd7e89bfd0532df82ebc1563dba", size = 5406664, upload-time = "2025-09-22T04:00:23.714Z" }, + { url = "https://files.pythonhosted.org/packages/20/cf/cab09478699b003857ed6ebfe95e9fb9fa3d3c25f1353b905c9b73cfb624/lxml-6.0.2-cp310-cp310-manylinux_2_26_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:a8ffaeec5dfea5881d4c9d8913a32d10cfe3923495386106e4a24d45300ef79c", size = 5289397, upload-time = "2025-09-22T04:00:25.544Z" }, + { url = "https://files.pythonhosted.org/packages/a3/84/02a2d0c38ac9a8b9f9e5e1bbd3f24b3f426044ad618b552e9549ee91bd63/lxml-6.0.2-cp310-cp310-manylinux_2_31_armv7l.whl", hash = "sha256:f2e3b1a6bb38de0bc713edd4d612969dd250ca8b724be8d460001a387507021c", size = 4772178, upload-time = "2025-09-22T04:00:27.602Z" }, + { url = "https://files.pythonhosted.org/packages/56/87/e1ceadcc031ec4aa605fe95476892d0b0ba3b7f8c7dcdf88fdeff59a9c86/lxml-6.0.2-cp310-cp310-manylinux_2_38_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:d6690ec5ec1cce0385cb20896b16be35247ac8c2046e493d03232f1c2414d321", size = 5358148, upload-time = "2025-09-22T04:00:29.323Z" }, + { url = "https://files.pythonhosted.org/packages/fe/13/5bb6cf42bb228353fd4ac5f162c6a84fd68a4d6f67c1031c8cf97e131fc6/lxml-6.0.2-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:f2a50c3c1d11cad0ebebbac357a97b26aa79d2bcaf46f256551152aa85d3a4d1", size = 5112035, upload-time = "2025-09-22T04:00:31.061Z" }, + { url = "https://files.pythonhosted.org/packages/e4/e2/ea0498552102e59834e297c5c6dff8d8ded3db72ed5e8aad77871476f073/lxml-6.0.2-cp310-cp310-musllinux_1_2_armv7l.whl", hash = "sha256:3efe1b21c7801ffa29a1112fab3b0f643628c30472d507f39544fd48e9549e34", size = 4799111, upload-time = "2025-09-22T04:00:33.11Z" }, + { url = "https://files.pythonhosted.org/packages/6a/9e/8de42b52a73abb8af86c66c969b3b4c2a96567b6ac74637c037d2e3baa60/lxml-6.0.2-cp310-cp310-musllinux_1_2_riscv64.whl", hash = "sha256:59c45e125140b2c4b33920d21d83681940ca29f0b83f8629ea1a2196dc8cfe6a", size = 5351662, upload-time = "2025-09-22T04:00:35.237Z" }, + { url = "https://files.pythonhosted.org/packages/28/a2/de776a573dfb15114509a37351937c367530865edb10a90189d0b4b9b70a/lxml-6.0.2-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:452b899faa64f1805943ec1c0c9ebeaece01a1af83e130b69cdefeda180bb42c", size = 5314973, upload-time = "2025-09-22T04:00:37.086Z" }, + { url = "https://files.pythonhosted.org/packages/50/a0/3ae1b1f8964c271b5eec91db2043cf8c6c0bce101ebb2a633b51b044db6c/lxml-6.0.2-cp310-cp310-win32.whl", hash = "sha256:1e786a464c191ca43b133906c6903a7e4d56bef376b75d97ccbb8ec5cf1f0a4b", size = 3611953, upload-time = "2025-09-22T04:00:39.224Z" }, + { url = "https://files.pythonhosted.org/packages/d1/70/bd42491f0634aad41bdfc1e46f5cff98825fb6185688dc82baa35d509f1a/lxml-6.0.2-cp310-cp310-win_amd64.whl", hash = "sha256:dacf3c64ef3f7440e3167aa4b49aa9e0fb99e0aa4f9ff03795640bf94531bcb0", size = 4032695, upload-time = "2025-09-22T04:00:41.402Z" }, + { url = "https://files.pythonhosted.org/packages/d2/d0/05c6a72299f54c2c561a6c6cbb2f512e047fca20ea97a05e57931f194ac4/lxml-6.0.2-cp310-cp310-win_arm64.whl", hash = "sha256:45f93e6f75123f88d7f0cfd90f2d05f441b808562bf0bc01070a00f53f5028b5", size = 3680051, upload-time = "2025-09-22T04:00:43.525Z" }, + { url = "https://files.pythonhosted.org/packages/77/d5/becbe1e2569b474a23f0c672ead8a29ac50b2dc1d5b9de184831bda8d14c/lxml-6.0.2-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:13e35cbc684aadf05d8711a5d1b5857c92e5e580efa9a0d2be197199c8def607", size = 8634365, upload-time = "2025-09-22T04:00:45.672Z" }, + { url = "https://files.pythonhosted.org/packages/28/66/1ced58f12e804644426b85d0bb8a4478ca77bc1761455da310505f1a3526/lxml-6.0.2-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:3b1675e096e17c6fe9c0e8c81434f5736c0739ff9ac6123c87c2d452f48fc938", size = 4650793, upload-time = "2025-09-22T04:00:47.783Z" }, + { url = "https://files.pythonhosted.org/packages/11/84/549098ffea39dfd167e3f174b4ce983d0eed61f9d8d25b7bf2a57c3247fc/lxml-6.0.2-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:8ac6e5811ae2870953390452e3476694196f98d447573234592d30488147404d", size = 4944362, upload-time = "2025-09-22T04:00:49.845Z" }, + { url = "https://files.pythonhosted.org/packages/ac/bd/f207f16abf9749d2037453d56b643a7471d8fde855a231a12d1e095c4f01/lxml-6.0.2-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:5aa0fc67ae19d7a64c3fe725dc9a1bb11f80e01f78289d05c6f62545affec438", size = 5083152, upload-time = "2025-09-22T04:00:51.709Z" }, + { url = "https://files.pythonhosted.org/packages/15/ae/bd813e87d8941d52ad5b65071b1affb48da01c4ed3c9c99e40abb266fbff/lxml-6.0.2-cp311-cp311-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:de496365750cc472b4e7902a485d3f152ecf57bd3ba03ddd5578ed8ceb4c5964", size = 5023539, upload-time = "2025-09-22T04:00:53.593Z" }, + { url = "https://files.pythonhosted.org/packages/02/cd/9bfef16bd1d874fbe0cb51afb00329540f30a3283beb9f0780adbb7eec03/lxml-6.0.2-cp311-cp311-manylinux_2_26_i686.manylinux_2_28_i686.whl", hash = "sha256:200069a593c5e40b8f6fc0d84d86d970ba43138c3e68619ffa234bc9bb806a4d", size = 5344853, upload-time = "2025-09-22T04:00:55.524Z" }, + { url = "https://files.pythonhosted.org/packages/b8/89/ea8f91594bc5dbb879734d35a6f2b0ad50605d7fb419de2b63d4211765cc/lxml-6.0.2-cp311-cp311-manylinux_2_26_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:7d2de809c2ee3b888b59f995625385f74629707c9355e0ff856445cdcae682b7", size = 5225133, upload-time = "2025-09-22T04:00:57.269Z" }, + { url = "https://files.pythonhosted.org/packages/b9/37/9c735274f5dbec726b2db99b98a43950395ba3d4a1043083dba2ad814170/lxml-6.0.2-cp311-cp311-manylinux_2_31_armv7l.whl", hash = "sha256:b2c3da8d93cf5db60e8858c17684c47d01fee6405e554fb55018dd85fc23b178", size = 4677944, upload-time = "2025-09-22T04:00:59.052Z" }, + { url = "https://files.pythonhosted.org/packages/20/28/7dfe1ba3475d8bfca3878365075abe002e05d40dfaaeb7ec01b4c587d533/lxml-6.0.2-cp311-cp311-manylinux_2_38_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:442de7530296ef5e188373a1ea5789a46ce90c4847e597856570439621d9c553", size = 5284535, upload-time = "2025-09-22T04:01:01.335Z" }, + { url = "https://files.pythonhosted.org/packages/e7/cf/5f14bc0de763498fc29510e3532bf2b4b3a1c1d5d0dff2e900c16ba021ef/lxml-6.0.2-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:2593c77efde7bfea7f6389f1ab249b15ed4aa5bc5cb5131faa3b843c429fbedb", size = 5067343, upload-time = "2025-09-22T04:01:03.13Z" }, + { url = "https://files.pythonhosted.org/packages/1c/b0/bb8275ab5472f32b28cfbbcc6db7c9d092482d3439ca279d8d6fa02f7025/lxml-6.0.2-cp311-cp311-musllinux_1_2_armv7l.whl", hash = "sha256:3e3cb08855967a20f553ff32d147e14329b3ae70ced6edc2f282b94afbc74b2a", size = 4725419, upload-time = "2025-09-22T04:01:05.013Z" }, + { url = "https://files.pythonhosted.org/packages/25/4c/7c222753bc72edca3b99dbadba1b064209bc8ed4ad448af990e60dcce462/lxml-6.0.2-cp311-cp311-musllinux_1_2_riscv64.whl", hash = "sha256:2ed6c667fcbb8c19c6791bbf40b7268ef8ddf5a96940ba9404b9f9a304832f6c", size = 5275008, upload-time = "2025-09-22T04:01:07.327Z" }, + { url = "https://files.pythonhosted.org/packages/6c/8c/478a0dc6b6ed661451379447cdbec77c05741a75736d97e5b2b729687828/lxml-6.0.2-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:b8f18914faec94132e5b91e69d76a5c1d7b0c73e2489ea8929c4aaa10b76bbf7", size = 5248906, upload-time = "2025-09-22T04:01:09.452Z" }, + { url = "https://files.pythonhosted.org/packages/2d/d9/5be3a6ab2784cdf9accb0703b65e1b64fcdd9311c9f007630c7db0cfcce1/lxml-6.0.2-cp311-cp311-win32.whl", hash = "sha256:6605c604e6daa9e0d7f0a2137bdc47a2e93b59c60a65466353e37f8272f47c46", size = 3610357, upload-time = "2025-09-22T04:01:11.102Z" }, + { url = "https://files.pythonhosted.org/packages/e2/7d/ca6fb13349b473d5732fb0ee3eec8f6c80fc0688e76b7d79c1008481bf1f/lxml-6.0.2-cp311-cp311-win_amd64.whl", hash = "sha256:e5867f2651016a3afd8dd2c8238baa66f1e2802f44bc17e236f547ace6647078", size = 4036583, upload-time = "2025-09-22T04:01:12.766Z" }, + { url = "https://files.pythonhosted.org/packages/ab/a2/51363b5ecd3eab46563645f3a2c3836a2fc67d01a1b87c5017040f39f567/lxml-6.0.2-cp311-cp311-win_arm64.whl", hash = "sha256:4197fb2534ee05fd3e7afaab5d8bfd6c2e186f65ea7f9cd6a82809c887bd1285", size = 3680591, upload-time = "2025-09-22T04:01:14.874Z" }, + { url = "https://files.pythonhosted.org/packages/f3/c8/8ff2bc6b920c84355146cd1ab7d181bc543b89241cfb1ebee824a7c81457/lxml-6.0.2-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:a59f5448ba2ceccd06995c95ea59a7674a10de0810f2ce90c9006f3cbc044456", size = 8661887, upload-time = "2025-09-22T04:01:17.265Z" }, + { url = "https://files.pythonhosted.org/packages/37/6f/9aae1008083bb501ef63284220ce81638332f9ccbfa53765b2b7502203cf/lxml-6.0.2-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:e8113639f3296706fbac34a30813929e29247718e88173ad849f57ca59754924", size = 4667818, upload-time = "2025-09-22T04:01:19.688Z" }, + { url = "https://files.pythonhosted.org/packages/f1/ca/31fb37f99f37f1536c133476674c10b577e409c0a624384147653e38baf2/lxml-6.0.2-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:a8bef9b9825fa8bc816a6e641bb67219489229ebc648be422af695f6e7a4fa7f", size = 4950807, upload-time = "2025-09-22T04:01:21.487Z" }, + { url = "https://files.pythonhosted.org/packages/da/87/f6cb9442e4bada8aab5ae7e1046264f62fdbeaa6e3f6211b93f4c0dd97f1/lxml-6.0.2-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:65ea18d710fd14e0186c2f973dc60bb52039a275f82d3c44a0e42b43440ea534", size = 5109179, upload-time = "2025-09-22T04:01:23.32Z" }, + { url = "https://files.pythonhosted.org/packages/c8/20/a7760713e65888db79bbae4f6146a6ae5c04e4a204a3c48896c408cd6ed2/lxml-6.0.2-cp312-cp312-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:c371aa98126a0d4c739ca93ceffa0fd7a5d732e3ac66a46e74339acd4d334564", size = 5023044, upload-time = "2025-09-22T04:01:25.118Z" }, + { url = "https://files.pythonhosted.org/packages/a2/b0/7e64e0460fcb36471899f75831509098f3fd7cd02a3833ac517433cb4f8f/lxml-6.0.2-cp312-cp312-manylinux_2_26_i686.manylinux_2_28_i686.whl", hash = "sha256:700efd30c0fa1a3581d80a748157397559396090a51d306ea59a70020223d16f", size = 5359685, upload-time = "2025-09-22T04:01:27.398Z" }, + { url = "https://files.pythonhosted.org/packages/b9/e1/e5df362e9ca4e2f48ed6411bd4b3a0ae737cc842e96877f5bf9428055ab4/lxml-6.0.2-cp312-cp312-manylinux_2_26_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:c33e66d44fe60e72397b487ee92e01da0d09ba2d66df8eae42d77b6d06e5eba0", size = 5654127, upload-time = "2025-09-22T04:01:29.629Z" }, + { url = "https://files.pythonhosted.org/packages/c6/d1/232b3309a02d60f11e71857778bfcd4acbdb86c07db8260caf7d008b08f8/lxml-6.0.2-cp312-cp312-manylinux_2_26_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:90a345bbeaf9d0587a3aaffb7006aa39ccb6ff0e96a57286c0cb2fd1520ea192", size = 5253958, upload-time = "2025-09-22T04:01:31.535Z" }, + { url = "https://files.pythonhosted.org/packages/35/35/d955a070994725c4f7d80583a96cab9c107c57a125b20bb5f708fe941011/lxml-6.0.2-cp312-cp312-manylinux_2_31_armv7l.whl", hash = "sha256:064fdadaf7a21af3ed1dcaa106b854077fbeada827c18f72aec9346847cd65d0", size = 4711541, upload-time = "2025-09-22T04:01:33.801Z" }, + { url = "https://files.pythonhosted.org/packages/1e/be/667d17363b38a78c4bd63cfd4b4632029fd68d2c2dc81f25ce9eb5224dd5/lxml-6.0.2-cp312-cp312-manylinux_2_38_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:fbc74f42c3525ac4ffa4b89cbdd00057b6196bcefe8bce794abd42d33a018092", size = 5267426, upload-time = "2025-09-22T04:01:35.639Z" }, + { url = "https://files.pythonhosted.org/packages/ea/47/62c70aa4a1c26569bc958c9ca86af2bb4e1f614e8c04fb2989833874f7ae/lxml-6.0.2-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:6ddff43f702905a4e32bc24f3f2e2edfe0f8fde3277d481bffb709a4cced7a1f", size = 5064917, upload-time = "2025-09-22T04:01:37.448Z" }, + { url = "https://files.pythonhosted.org/packages/bd/55/6ceddaca353ebd0f1908ef712c597f8570cc9c58130dbb89903198e441fd/lxml-6.0.2-cp312-cp312-musllinux_1_2_armv7l.whl", hash = "sha256:6da5185951d72e6f5352166e3da7b0dc27aa70bd1090b0eb3f7f7212b53f1bb8", size = 4788795, upload-time = "2025-09-22T04:01:39.165Z" }, + { url = "https://files.pythonhosted.org/packages/cf/e8/fd63e15da5e3fd4c2146f8bbb3c14e94ab850589beab88e547b2dbce22e1/lxml-6.0.2-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:57a86e1ebb4020a38d295c04fc79603c7899e0df71588043eb218722dabc087f", size = 5676759, upload-time = "2025-09-22T04:01:41.506Z" }, + { url = "https://files.pythonhosted.org/packages/76/47/b3ec58dc5c374697f5ba37412cd2728f427d056315d124dd4b61da381877/lxml-6.0.2-cp312-cp312-musllinux_1_2_riscv64.whl", hash = "sha256:2047d8234fe735ab77802ce5f2297e410ff40f5238aec569ad7c8e163d7b19a6", size = 5255666, upload-time = "2025-09-22T04:01:43.363Z" }, + { url = "https://files.pythonhosted.org/packages/19/93/03ba725df4c3d72afd9596eef4a37a837ce8e4806010569bedfcd2cb68fd/lxml-6.0.2-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:6f91fd2b2ea15a6800c8e24418c0775a1694eefc011392da73bc6cef2623b322", size = 5277989, upload-time = "2025-09-22T04:01:45.215Z" }, + { url = "https://files.pythonhosted.org/packages/c6/80/c06de80bfce881d0ad738576f243911fccf992687ae09fd80b734712b39c/lxml-6.0.2-cp312-cp312-win32.whl", hash = "sha256:3ae2ce7d6fedfb3414a2b6c5e20b249c4c607f72cb8d2bb7cc9c6ec7c6f4e849", size = 3611456, upload-time = "2025-09-22T04:01:48.243Z" }, + { url = "https://files.pythonhosted.org/packages/f7/d7/0cdfb6c3e30893463fb3d1e52bc5f5f99684a03c29a0b6b605cfae879cd5/lxml-6.0.2-cp312-cp312-win_amd64.whl", hash = "sha256:72c87e5ee4e58a8354fb9c7c84cbf95a1c8236c127a5d1b7683f04bed8361e1f", size = 4011793, upload-time = "2025-09-22T04:01:50.042Z" }, + { url = "https://files.pythonhosted.org/packages/ea/7b/93c73c67db235931527301ed3785f849c78991e2e34f3fd9a6663ffda4c5/lxml-6.0.2-cp312-cp312-win_arm64.whl", hash = "sha256:61cb10eeb95570153e0c0e554f58df92ecf5109f75eacad4a95baa709e26c3d6", size = 3672836, upload-time = "2025-09-22T04:01:52.145Z" }, + { url = "https://files.pythonhosted.org/packages/53/fd/4e8f0540608977aea078bf6d79f128e0e2c2bba8af1acf775c30baa70460/lxml-6.0.2-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:9b33d21594afab46f37ae58dfadd06636f154923c4e8a4d754b0127554eb2e77", size = 8648494, upload-time = "2025-09-22T04:01:54.242Z" }, + { url = "https://files.pythonhosted.org/packages/5d/f4/2a94a3d3dfd6c6b433501b8d470a1960a20ecce93245cf2db1706adf6c19/lxml-6.0.2-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:6c8963287d7a4c5c9a432ff487c52e9c5618667179c18a204bdedb27310f022f", size = 4661146, upload-time = "2025-09-22T04:01:56.282Z" }, + { url = "https://files.pythonhosted.org/packages/25/2e/4efa677fa6b322013035d38016f6ae859d06cac67437ca7dc708a6af7028/lxml-6.0.2-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:1941354d92699fb5ffe6ed7b32f9649e43c2feb4b97205f75866f7d21aa91452", size = 4946932, upload-time = "2025-09-22T04:01:58.989Z" }, + { url = "https://files.pythonhosted.org/packages/ce/0f/526e78a6d38d109fdbaa5049c62e1d32fdd70c75fb61c4eadf3045d3d124/lxml-6.0.2-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:bb2f6ca0ae2d983ded09357b84af659c954722bbf04dea98030064996d156048", size = 5100060, upload-time = "2025-09-22T04:02:00.812Z" }, + { url = "https://files.pythonhosted.org/packages/81/76/99de58d81fa702cc0ea7edae4f4640416c2062813a00ff24bd70ac1d9c9b/lxml-6.0.2-cp313-cp313-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:eb2a12d704f180a902d7fa778c6d71f36ceb7b0d317f34cdc76a5d05aa1dd1df", size = 5019000, upload-time = "2025-09-22T04:02:02.671Z" }, + { url = "https://files.pythonhosted.org/packages/b5/35/9e57d25482bc9a9882cb0037fdb9cc18f4b79d85df94fa9d2a89562f1d25/lxml-6.0.2-cp313-cp313-manylinux_2_26_i686.manylinux_2_28_i686.whl", hash = "sha256:6ec0e3f745021bfed19c456647f0298d60a24c9ff86d9d051f52b509663feeb1", size = 5348496, upload-time = "2025-09-22T04:02:04.904Z" }, + { url = "https://files.pythonhosted.org/packages/a6/8e/cb99bd0b83ccc3e8f0f528e9aa1f7a9965dfec08c617070c5db8d63a87ce/lxml-6.0.2-cp313-cp313-manylinux_2_26_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:846ae9a12d54e368933b9759052d6206a9e8b250291109c48e350c1f1f49d916", size = 5643779, upload-time = "2025-09-22T04:02:06.689Z" }, + { url = "https://files.pythonhosted.org/packages/d0/34/9e591954939276bb679b73773836c6684c22e56d05980e31d52a9a8deb18/lxml-6.0.2-cp313-cp313-manylinux_2_26_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:ef9266d2aa545d7374938fb5c484531ef5a2ec7f2d573e62f8ce722c735685fd", size = 5244072, upload-time = "2025-09-22T04:02:08.587Z" }, + { url = "https://files.pythonhosted.org/packages/8d/27/b29ff065f9aaca443ee377aff699714fcbffb371b4fce5ac4ca759e436d5/lxml-6.0.2-cp313-cp313-manylinux_2_31_armv7l.whl", hash = "sha256:4077b7c79f31755df33b795dc12119cb557a0106bfdab0d2c2d97bd3cf3dffa6", size = 4718675, upload-time = "2025-09-22T04:02:10.783Z" }, + { url = "https://files.pythonhosted.org/packages/2b/9f/f756f9c2cd27caa1a6ef8c32ae47aadea697f5c2c6d07b0dae133c244fbe/lxml-6.0.2-cp313-cp313-manylinux_2_38_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:a7c5d5e5f1081955358533be077166ee97ed2571d6a66bdba6ec2f609a715d1a", size = 5255171, upload-time = "2025-09-22T04:02:12.631Z" }, + { url = "https://files.pythonhosted.org/packages/61/46/bb85ea42d2cb1bd8395484fd72f38e3389611aa496ac7772da9205bbda0e/lxml-6.0.2-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:8f8d0cbd0674ee89863a523e6994ac25fd5be9c8486acfc3e5ccea679bad2679", size = 5057175, upload-time = "2025-09-22T04:02:14.718Z" }, + { url = "https://files.pythonhosted.org/packages/95/0c/443fc476dcc8e41577f0af70458c50fe299a97bb6b7505bb1ae09aa7f9ac/lxml-6.0.2-cp313-cp313-musllinux_1_2_armv7l.whl", hash = "sha256:2cbcbf6d6e924c28f04a43f3b6f6e272312a090f269eff68a2982e13e5d57659", size = 4785688, upload-time = "2025-09-22T04:02:16.957Z" }, + { url = "https://files.pythonhosted.org/packages/48/78/6ef0b359d45bb9697bc5a626e1992fa5d27aa3f8004b137b2314793b50a0/lxml-6.0.2-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:dfb874cfa53340009af6bdd7e54ebc0d21012a60a4e65d927c2e477112e63484", size = 5660655, upload-time = "2025-09-22T04:02:18.815Z" }, + { url = "https://files.pythonhosted.org/packages/ff/ea/e1d33808f386bc1339d08c0dcada6e4712d4ed8e93fcad5f057070b7988a/lxml-6.0.2-cp313-cp313-musllinux_1_2_riscv64.whl", hash = "sha256:fb8dae0b6b8b7f9e96c26fdd8121522ce5de9bb5538010870bd538683d30e9a2", size = 5247695, upload-time = "2025-09-22T04:02:20.593Z" }, + { url = "https://files.pythonhosted.org/packages/4f/47/eba75dfd8183673725255247a603b4ad606f4ae657b60c6c145b381697da/lxml-6.0.2-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:358d9adae670b63e95bc59747c72f4dc97c9ec58881d4627fe0120da0f90d314", size = 5269841, upload-time = "2025-09-22T04:02:22.489Z" }, + { url = "https://files.pythonhosted.org/packages/76/04/5c5e2b8577bc936e219becb2e98cdb1aca14a4921a12995b9d0c523502ae/lxml-6.0.2-cp313-cp313-win32.whl", hash = "sha256:e8cd2415f372e7e5a789d743d133ae474290a90b9023197fd78f32e2dc6873e2", size = 3610700, upload-time = "2025-09-22T04:02:24.465Z" }, + { url = "https://files.pythonhosted.org/packages/fe/0a/4643ccc6bb8b143e9f9640aa54e38255f9d3b45feb2cbe7ae2ca47e8782e/lxml-6.0.2-cp313-cp313-win_amd64.whl", hash = "sha256:b30d46379644fbfc3ab81f8f82ae4de55179414651f110a1514f0b1f8f6cb2d7", size = 4010347, upload-time = "2025-09-22T04:02:26.286Z" }, + { url = "https://files.pythonhosted.org/packages/31/ef/dcf1d29c3f530577f61e5fe2f1bd72929acf779953668a8a47a479ae6f26/lxml-6.0.2-cp313-cp313-win_arm64.whl", hash = "sha256:13dcecc9946dca97b11b7c40d29fba63b55ab4170d3c0cf8c0c164343b9bfdcf", size = 3671248, upload-time = "2025-09-22T04:02:27.918Z" }, + { url = "https://files.pythonhosted.org/packages/03/15/d4a377b385ab693ce97b472fe0c77c2b16ec79590e688b3ccc71fba19884/lxml-6.0.2-cp314-cp314-macosx_10_13_universal2.whl", hash = "sha256:b0c732aa23de8f8aec23f4b580d1e52905ef468afb4abeafd3fec77042abb6fe", size = 8659801, upload-time = "2025-09-22T04:02:30.113Z" }, + { url = "https://files.pythonhosted.org/packages/c8/e8/c128e37589463668794d503afaeb003987373c5f94d667124ffd8078bbd9/lxml-6.0.2-cp314-cp314-macosx_10_13_x86_64.whl", hash = "sha256:4468e3b83e10e0317a89a33d28f7aeba1caa4d1a6fd457d115dd4ffe90c5931d", size = 4659403, upload-time = "2025-09-22T04:02:32.119Z" }, + { url = "https://files.pythonhosted.org/packages/00/ce/74903904339decdf7da7847bb5741fc98a5451b42fc419a86c0c13d26fe2/lxml-6.0.2-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:abd44571493973bad4598a3be7e1d807ed45aa2adaf7ab92ab7c62609569b17d", size = 4966974, upload-time = "2025-09-22T04:02:34.155Z" }, + { url = "https://files.pythonhosted.org/packages/1f/d3/131dec79ce61c5567fecf82515bd9bc36395df42501b50f7f7f3bd065df0/lxml-6.0.2-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:370cd78d5855cfbffd57c422851f7d3864e6ae72d0da615fca4dad8c45d375a5", size = 5102953, upload-time = "2025-09-22T04:02:36.054Z" }, + { url = "https://files.pythonhosted.org/packages/3a/ea/a43ba9bb750d4ffdd885f2cd333572f5bb900cd2408b67fdda07e85978a0/lxml-6.0.2-cp314-cp314-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:901e3b4219fa04ef766885fb40fa516a71662a4c61b80c94d25336b4934b71c0", size = 5055054, upload-time = "2025-09-22T04:02:38.154Z" }, + { url = "https://files.pythonhosted.org/packages/60/23/6885b451636ae286c34628f70a7ed1fcc759f8d9ad382d132e1c8d3d9bfd/lxml-6.0.2-cp314-cp314-manylinux_2_26_i686.manylinux_2_28_i686.whl", hash = "sha256:a4bf42d2e4cf52c28cc1812d62426b9503cdb0c87a6de81442626aa7d69707ba", size = 5352421, upload-time = "2025-09-22T04:02:40.413Z" }, + { url = "https://files.pythonhosted.org/packages/48/5b/fc2ddfc94ddbe3eebb8e9af6e3fd65e2feba4967f6a4e9683875c394c2d8/lxml-6.0.2-cp314-cp314-manylinux_2_26_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:b2c7fdaa4d7c3d886a42534adec7cfac73860b89b4e5298752f60aa5984641a0", size = 5673684, upload-time = "2025-09-22T04:02:42.288Z" }, + { url = "https://files.pythonhosted.org/packages/29/9c/47293c58cc91769130fbf85531280e8cc7868f7fbb6d92f4670071b9cb3e/lxml-6.0.2-cp314-cp314-manylinux_2_26_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:98a5e1660dc7de2200b00d53fa00bcd3c35a3608c305d45a7bbcaf29fa16e83d", size = 5252463, upload-time = "2025-09-22T04:02:44.165Z" }, + { url = "https://files.pythonhosted.org/packages/9b/da/ba6eceb830c762b48e711ded880d7e3e89fc6c7323e587c36540b6b23c6b/lxml-6.0.2-cp314-cp314-manylinux_2_31_armv7l.whl", hash = "sha256:dc051506c30b609238d79eda75ee9cab3e520570ec8219844a72a46020901e37", size = 4698437, upload-time = "2025-09-22T04:02:46.524Z" }, + { url = "https://files.pythonhosted.org/packages/a5/24/7be3f82cb7990b89118d944b619e53c656c97dc89c28cfb143fdb7cd6f4d/lxml-6.0.2-cp314-cp314-manylinux_2_38_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:8799481bbdd212470d17513a54d568f44416db01250f49449647b5ab5b5dccb9", size = 5269890, upload-time = "2025-09-22T04:02:48.812Z" }, + { url = "https://files.pythonhosted.org/packages/1b/bd/dcfb9ea1e16c665efd7538fc5d5c34071276ce9220e234217682e7d2c4a5/lxml-6.0.2-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:9261bb77c2dab42f3ecd9103951aeca2c40277701eb7e912c545c1b16e0e4917", size = 5097185, upload-time = "2025-09-22T04:02:50.746Z" }, + { url = "https://files.pythonhosted.org/packages/21/04/a60b0ff9314736316f28316b694bccbbabe100f8483ad83852d77fc7468e/lxml-6.0.2-cp314-cp314-musllinux_1_2_armv7l.whl", hash = "sha256:65ac4a01aba353cfa6d5725b95d7aed6356ddc0a3cd734de00124d285b04b64f", size = 4745895, upload-time = "2025-09-22T04:02:52.968Z" }, + { url = "https://files.pythonhosted.org/packages/d6/bd/7d54bd1846e5a310d9c715921c5faa71cf5c0853372adf78aee70c8d7aa2/lxml-6.0.2-cp314-cp314-musllinux_1_2_ppc64le.whl", hash = "sha256:b22a07cbb82fea98f8a2fd814f3d1811ff9ed76d0fc6abc84eb21527596e7cc8", size = 5695246, upload-time = "2025-09-22T04:02:54.798Z" }, + { url = "https://files.pythonhosted.org/packages/fd/32/5643d6ab947bc371da21323acb2a6e603cedbe71cb4c99c8254289ab6f4e/lxml-6.0.2-cp314-cp314-musllinux_1_2_riscv64.whl", hash = "sha256:d759cdd7f3e055d6bc8d9bec3ad905227b2e4c785dc16c372eb5b5e83123f48a", size = 5260797, upload-time = "2025-09-22T04:02:57.058Z" }, + { url = "https://files.pythonhosted.org/packages/33/da/34c1ec4cff1eea7d0b4cd44af8411806ed943141804ac9c5d565302afb78/lxml-6.0.2-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:945da35a48d193d27c188037a05fec5492937f66fb1958c24fc761fb9d40d43c", size = 5277404, upload-time = "2025-09-22T04:02:58.966Z" }, + { url = "https://files.pythonhosted.org/packages/82/57/4eca3e31e54dc89e2c3507e1cd411074a17565fa5ffc437c4ae0a00d439e/lxml-6.0.2-cp314-cp314-win32.whl", hash = "sha256:be3aaa60da67e6153eb15715cc2e19091af5dc75faef8b8a585aea372507384b", size = 3670072, upload-time = "2025-09-22T04:03:38.05Z" }, + { url = "https://files.pythonhosted.org/packages/e3/e0/c96cf13eccd20c9421ba910304dae0f619724dcf1702864fd59dd386404d/lxml-6.0.2-cp314-cp314-win_amd64.whl", hash = "sha256:fa25afbadead523f7001caf0c2382afd272c315a033a7b06336da2637d92d6ed", size = 4080617, upload-time = "2025-09-22T04:03:39.835Z" }, + { url = "https://files.pythonhosted.org/packages/d5/5d/b3f03e22b3d38d6f188ef044900a9b29b2fe0aebb94625ce9fe244011d34/lxml-6.0.2-cp314-cp314-win_arm64.whl", hash = "sha256:063eccf89df5b24e361b123e257e437f9e9878f425ee9aae3144c77faf6da6d8", size = 3754930, upload-time = "2025-09-22T04:03:41.565Z" }, + { url = "https://files.pythonhosted.org/packages/5e/5c/42c2c4c03554580708fc738d13414801f340c04c3eff90d8d2d227145275/lxml-6.0.2-cp314-cp314t-macosx_10_13_universal2.whl", hash = "sha256:6162a86d86893d63084faaf4ff937b3daea233e3682fb4474db07395794fa80d", size = 8910380, upload-time = "2025-09-22T04:03:01.645Z" }, + { url = "https://files.pythonhosted.org/packages/bf/4f/12df843e3e10d18d468a7557058f8d3733e8b6e12401f30b1ef29360740f/lxml-6.0.2-cp314-cp314t-macosx_10_13_x86_64.whl", hash = "sha256:414aaa94e974e23a3e92e7ca5b97d10c0cf37b6481f50911032c69eeb3991bba", size = 4775632, upload-time = "2025-09-22T04:03:03.814Z" }, + { url = "https://files.pythonhosted.org/packages/e4/0c/9dc31e6c2d0d418483cbcb469d1f5a582a1cd00a1f4081953d44051f3c50/lxml-6.0.2-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:48461bd21625458dd01e14e2c38dd0aea69addc3c4f960c30d9f59d7f93be601", size = 4975171, upload-time = "2025-09-22T04:03:05.651Z" }, + { url = "https://files.pythonhosted.org/packages/e7/2b/9b870c6ca24c841bdd887504808f0417aa9d8d564114689266f19ddf29c8/lxml-6.0.2-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:25fcc59afc57d527cfc78a58f40ab4c9b8fd096a9a3f964d2781ffb6eb33f4ed", size = 5110109, upload-time = "2025-09-22T04:03:07.452Z" }, + { url = "https://files.pythonhosted.org/packages/bf/0c/4f5f2a4dd319a178912751564471355d9019e220c20d7db3fb8307ed8582/lxml-6.0.2-cp314-cp314t-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:5179c60288204e6ddde3f774a93350177e08876eaf3ab78aa3a3649d43eb7d37", size = 5041061, upload-time = "2025-09-22T04:03:09.297Z" }, + { url = "https://files.pythonhosted.org/packages/12/64/554eed290365267671fe001a20d72d14f468ae4e6acef1e179b039436967/lxml-6.0.2-cp314-cp314t-manylinux_2_26_i686.manylinux_2_28_i686.whl", hash = "sha256:967aab75434de148ec80597b75062d8123cadf2943fb4281f385141e18b21338", size = 5306233, upload-time = "2025-09-22T04:03:11.651Z" }, + { url = "https://files.pythonhosted.org/packages/7a/31/1d748aa275e71802ad9722df32a7a35034246b42c0ecdd8235412c3396ef/lxml-6.0.2-cp314-cp314t-manylinux_2_26_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:d100fcc8930d697c6561156c6810ab4a508fb264c8b6779e6e61e2ed5e7558f9", size = 5604739, upload-time = "2025-09-22T04:03:13.592Z" }, + { url = "https://files.pythonhosted.org/packages/8f/41/2c11916bcac09ed561adccacceaedd2bf0e0b25b297ea92aab99fd03d0fa/lxml-6.0.2-cp314-cp314t-manylinux_2_26_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:2ca59e7e13e5981175b8b3e4ab84d7da57993eeff53c07764dcebda0d0e64ecd", size = 5225119, upload-time = "2025-09-22T04:03:15.408Z" }, + { url = "https://files.pythonhosted.org/packages/99/05/4e5c2873d8f17aa018e6afde417c80cc5d0c33be4854cce3ef5670c49367/lxml-6.0.2-cp314-cp314t-manylinux_2_31_armv7l.whl", hash = "sha256:957448ac63a42e2e49531b9d6c0fa449a1970dbc32467aaad46f11545be9af1d", size = 4633665, upload-time = "2025-09-22T04:03:17.262Z" }, + { url = "https://files.pythonhosted.org/packages/0f/c9/dcc2da1bebd6275cdc723b515f93edf548b82f36a5458cca3578bc899332/lxml-6.0.2-cp314-cp314t-manylinux_2_38_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:b7fc49c37f1786284b12af63152fe1d0990722497e2d5817acfe7a877522f9a9", size = 5234997, upload-time = "2025-09-22T04:03:19.14Z" }, + { url = "https://files.pythonhosted.org/packages/9c/e2/5172e4e7468afca64a37b81dba152fc5d90e30f9c83c7c3213d6a02a5ce4/lxml-6.0.2-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:e19e0643cc936a22e837f79d01a550678da8377d7d801a14487c10c34ee49c7e", size = 5090957, upload-time = "2025-09-22T04:03:21.436Z" }, + { url = "https://files.pythonhosted.org/packages/a5/b3/15461fd3e5cd4ddcb7938b87fc20b14ab113b92312fc97afe65cd7c85de1/lxml-6.0.2-cp314-cp314t-musllinux_1_2_armv7l.whl", hash = "sha256:1db01e5cf14345628e0cbe71067204db658e2fb8e51e7f33631f5f4735fefd8d", size = 4764372, upload-time = "2025-09-22T04:03:23.27Z" }, + { url = "https://files.pythonhosted.org/packages/05/33/f310b987c8bf9e61c4dd8e8035c416bd3230098f5e3cfa69fc4232de7059/lxml-6.0.2-cp314-cp314t-musllinux_1_2_ppc64le.whl", hash = "sha256:875c6b5ab39ad5291588aed6925fac99d0097af0dd62f33c7b43736043d4a2ec", size = 5634653, upload-time = "2025-09-22T04:03:25.767Z" }, + { url = "https://files.pythonhosted.org/packages/70/ff/51c80e75e0bc9382158133bdcf4e339b5886c6ee2418b5199b3f1a61ed6d/lxml-6.0.2-cp314-cp314t-musllinux_1_2_riscv64.whl", hash = "sha256:cdcbed9ad19da81c480dfd6dd161886db6096083c9938ead313d94b30aadf272", size = 5233795, upload-time = "2025-09-22T04:03:27.62Z" }, + { url = "https://files.pythonhosted.org/packages/56/4d/4856e897df0d588789dd844dbed9d91782c4ef0b327f96ce53c807e13128/lxml-6.0.2-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:80dadc234ebc532e09be1975ff538d154a7fa61ea5031c03d25178855544728f", size = 5257023, upload-time = "2025-09-22T04:03:30.056Z" }, + { url = "https://files.pythonhosted.org/packages/0f/85/86766dfebfa87bea0ab78e9ff7a4b4b45225df4b4d3b8cc3c03c5cd68464/lxml-6.0.2-cp314-cp314t-win32.whl", hash = "sha256:da08e7bb297b04e893d91087df19638dc7a6bb858a954b0cc2b9f5053c922312", size = 3911420, upload-time = "2025-09-22T04:03:32.198Z" }, + { url = "https://files.pythonhosted.org/packages/fe/1a/b248b355834c8e32614650b8008c69ffeb0ceb149c793961dd8c0b991bb3/lxml-6.0.2-cp314-cp314t-win_amd64.whl", hash = "sha256:252a22982dca42f6155125ac76d3432e548a7625d56f5a273ee78a5057216eca", size = 4406837, upload-time = "2025-09-22T04:03:34.027Z" }, + { url = "https://files.pythonhosted.org/packages/92/aa/df863bcc39c5e0946263454aba394de8a9084dbaff8ad143846b0d844739/lxml-6.0.2-cp314-cp314t-win_arm64.whl", hash = "sha256:bb4c1847b303835d89d785a18801a883436cdfd5dc3d62947f9c49e24f0f5a2c", size = 3822205, upload-time = "2025-09-22T04:03:36.249Z" }, + { url = "https://files.pythonhosted.org/packages/5d/09/4d693ed4c8a407ceda14683bdbb6fcb6b72c7343382a06fe9d94ff18bdf1/lxml-6.0.2-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:a656ca105115f6b766bba324f23a67914d9c728dafec57638e2b92a9dcd76c62", size = 4728519, upload-time = "2025-09-22T04:03:43.425Z" }, + { url = "https://files.pythonhosted.org/packages/5e/f9/096e3a62d48438fbe2b70bb0e94d9652dfa5ac7b1ecf56c68a3c5143c2d5/lxml-6.0.2-cp38-cp38-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:c54d83a2188a10ebdba573f16bd97135d06c9ef60c3dc495315c7a28c80a263f", size = 5071718, upload-time = "2025-09-22T04:03:45.327Z" }, + { url = "https://files.pythonhosted.org/packages/54/0f/67d09bf12edcdbc308c0a66ad9d769aeb5c7742f35646ccede1771efafa3/lxml-6.0.2-cp38-cp38-manylinux_2_26_i686.manylinux_2_28_i686.whl", hash = "sha256:1ea99340b3c729beea786f78c38f60f4795622f36e305d9c9be402201efdc3b7", size = 5373536, upload-time = "2025-09-22T04:03:47.651Z" }, + { url = "https://files.pythonhosted.org/packages/4e/f0/49a595035c6b329840452fe9c163b3b7e0b330d542e687a318ea2a21f6e6/lxml-6.0.2-cp38-cp38-manylinux_2_26_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:af85529ae8d2a453feee4c780d9406a5e3b17cee0dd75c18bd31adcd584debc3", size = 5218910, upload-time = "2025-09-22T04:03:50.677Z" }, + { url = "https://files.pythonhosted.org/packages/c8/f1/3bfa59b1397206624d8debddb23882cf09099901de15562028f7676916d4/lxml-6.0.2-cp38-cp38-musllinux_1_2_x86_64.whl", hash = "sha256:fe659f6b5d10fb5a17f00a50eb903eb277a71ee35df4615db573c069bcf967ac", size = 5249954, upload-time = "2025-09-22T04:03:52.908Z" }, + { url = "https://files.pythonhosted.org/packages/62/b3/59a1126e6d94cd95c37745599f252a634455b7bfd78b344177d32c870eff/lxml-6.0.2-cp38-cp38-win32.whl", hash = "sha256:5921d924aa5468c939d95c9814fa9f9b5935a6ff4e679e26aaf2951f74043512", size = 3626977, upload-time = "2025-09-22T04:03:54.679Z" }, + { url = "https://files.pythonhosted.org/packages/e3/b0/f9a25749c3c076b2dcf1df6f427adb0cdcf387fe307d2b153b6f13cbb033/lxml-6.0.2-cp38-cp38-win_amd64.whl", hash = "sha256:0aa7070978f893954008ab73bb9e3c24a7c56c054e00566a21b553dc18105fca", size = 4043166, upload-time = "2025-09-22T04:03:56.486Z" }, + { url = "https://files.pythonhosted.org/packages/38/66/dd13c74fad495957374c8a81c932f4874d3dca5aa0db9e4369f06a399718/lxml-6.0.2-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:2c8458c2cdd29589a8367c09c8f030f1d202be673f0ca224ec18590b3b9fb694", size = 8602363, upload-time = "2025-09-22T04:03:58.698Z" }, + { url = "https://files.pythonhosted.org/packages/5e/f4/edb9d47dce464b5dd044d35775ee794364935b93ab6226c95e199118890d/lxml-6.0.2-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:3fee0851639d06276e6b387f1c190eb9d7f06f7f53514e966b26bae46481ec90", size = 4634995, upload-time = "2025-09-22T04:04:01.122Z" }, + { url = "https://files.pythonhosted.org/packages/66/f2/d80c97b6ed83a99bc24b2b29919d5e618af5322df6d3aa61064093712309/lxml-6.0.2-cp39-cp39-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:b2142a376b40b6736dfc214fd2902409e9e3857eff554fed2d3c60f097e62a62", size = 5003737, upload-time = "2025-09-22T04:04:02.98Z" }, + { url = "https://files.pythonhosted.org/packages/d5/f1/18b750f79f8889b9109b24749f23ac137870b4f685edc4be54be0ff2c730/lxml-6.0.2-cp39-cp39-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:a6b5b39cc7e2998f968f05309e666103b53e2edd01df8dc51b90d734c0825444", size = 5160821, upload-time = "2025-09-22T04:04:04.854Z" }, + { url = "https://files.pythonhosted.org/packages/cf/88/2b6a415dbad411c3e9c092128eb7db06054d2d9460aa56676d17ee4f4fd5/lxml-6.0.2-cp39-cp39-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:d4aec24d6b72ee457ec665344a29acb2d35937d5192faebe429ea02633151aad", size = 5070959, upload-time = "2025-09-22T04:04:07.042Z" }, + { url = "https://files.pythonhosted.org/packages/7c/d0/5354afaa0f2e53625e5f96f6bd049a4875c3ab79d96d6c4871dd1f4a98c4/lxml-6.0.2-cp39-cp39-manylinux_2_26_i686.manylinux_2_28_i686.whl", hash = "sha256:b42f4d86b451c2f9d06ffb4f8bbc776e04df3ba070b9fe2657804b1b40277c48", size = 5410267, upload-time = "2025-09-22T04:04:10.458Z" }, + { url = "https://files.pythonhosted.org/packages/51/63/10dea35a01291dc529fa9d6ba204ea627a1c77b7fbb180d404f6cc4dd2fd/lxml-6.0.2-cp39-cp39-manylinux_2_26_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:6cdaefac66e8b8f30e37a9b4768a391e1f8a16a7526d5bc77a7928408ef68e93", size = 5292990, upload-time = "2025-09-22T04:04:12.405Z" }, + { url = "https://files.pythonhosted.org/packages/37/58/51ef422d8bec58db600b3552e5f2d870ec01ffacf11d98689c42ffdcbf7f/lxml-6.0.2-cp39-cp39-manylinux_2_31_armv7l.whl", hash = "sha256:b738f7e648735714bbb82bdfd030203360cfeab7f6e8a34772b3c8c8b820568c", size = 4776318, upload-time = "2025-09-22T04:04:14.22Z" }, + { url = "https://files.pythonhosted.org/packages/77/97/3f797820e82e3a58a19bc51068b40f3b9ab7d0934ba6e5ba6b147b618319/lxml-6.0.2-cp39-cp39-manylinux_2_38_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:daf42de090d59db025af61ce6bdb2521f0f102ea0e6ea310f13c17610a97da4c", size = 5360191, upload-time = "2025-09-22T04:04:16.236Z" }, + { url = "https://files.pythonhosted.org/packages/e2/14/a9306a8ab122e2f5dfbf4f71fb09beeadca26b0c275708432bbc33f40edc/lxml-6.0.2-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:66328dabea70b5ba7e53d94aa774b733cf66686535f3bc9250a7aab53a91caaf", size = 5116114, upload-time = "2025-09-22T04:04:18.594Z" }, + { url = "https://files.pythonhosted.org/packages/ea/23/2118a1685277b9fa8726ec7ee903db55aa300dcea3d406a220cbe3710953/lxml-6.0.2-cp39-cp39-musllinux_1_2_armv7l.whl", hash = "sha256:e237b807d68a61fc3b1e845407e27e5eb8ef69bc93fe8505337c1acb4ee300b6", size = 4801704, upload-time = "2025-09-22T04:04:20.466Z" }, + { url = "https://files.pythonhosted.org/packages/4e/e8/d5be34da2059dc9a4ff8643fd6ad3f8234a27b2a44831b7fff58c4dbb3e3/lxml-6.0.2-cp39-cp39-musllinux_1_2_riscv64.whl", hash = "sha256:ac02dc29fd397608f8eb15ac1610ae2f2f0154b03f631e6d724d9e2ad4ee2c84", size = 5355451, upload-time = "2025-09-22T04:04:22.417Z" }, + { url = "https://files.pythonhosted.org/packages/61/84/5aebc8e150d5bf488815ea2d8798c7ff509cc37b5725caa3c1f11bdd3245/lxml-6.0.2-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:817ef43a0c0b4a77bd166dc9a09a555394105ff3374777ad41f453526e37f9cb", size = 5318630, upload-time = "2025-09-22T04:04:24.301Z" }, + { url = "https://files.pythonhosted.org/packages/35/04/629ae603c1c17fb7adc9df2bc21aa5ac96afb84001700b13c1f038f3118c/lxml-6.0.2-cp39-cp39-win32.whl", hash = "sha256:bc532422ff26b304cfb62b328826bd995c96154ffd2bac4544f37dbb95ecaa8f", size = 3614032, upload-time = "2025-09-22T04:04:26.158Z" }, + { url = "https://files.pythonhosted.org/packages/71/de/07b7b1249acbecbf48f7e42c3ce87a657af6ff38e30f12a1ad81f16010f2/lxml-6.0.2-cp39-cp39-win_amd64.whl", hash = "sha256:995e783eb0374c120f528f807443ad5a83a656a8624c467ea73781fc5f8a8304", size = 4035311, upload-time = "2025-09-22T04:04:28.413Z" }, + { url = "https://files.pythonhosted.org/packages/60/e3/02c4c55b281606f3c8e118300e16a9fcf5f3462cc46ce740ed0b82fc3f1b/lxml-6.0.2-cp39-cp39-win_arm64.whl", hash = "sha256:08b9d5e803c2e4725ae9e8559ee880e5328ed61aa0935244e0515d7d9dbec0aa", size = 3683462, upload-time = "2025-09-22T04:04:30.399Z" }, + { url = "https://files.pythonhosted.org/packages/e7/9c/780c9a8fce3f04690b374f72f41306866b0400b9d0fdf3e17aaa37887eed/lxml-6.0.2-pp310-pypy310_pp73-macosx_10_15_x86_64.whl", hash = "sha256:e748d4cf8fef2526bb2a589a417eba0c8674e29ffcb570ce2ceca44f1e567bf6", size = 3939264, upload-time = "2025-09-22T04:04:32.892Z" }, + { url = "https://files.pythonhosted.org/packages/f5/5a/1ab260c00adf645d8bf7dec7f920f744b032f69130c681302821d5debea6/lxml-6.0.2-pp310-pypy310_pp73-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:4ddb1049fa0579d0cbd00503ad8c58b9ab34d1254c77bc6a5576d96ec7853dba", size = 4216435, upload-time = "2025-09-22T04:04:34.907Z" }, + { url = "https://files.pythonhosted.org/packages/f2/37/565f3b3d7ffede22874b6d86be1a1763d00f4ea9fc5b9b6ccb11e4ec8612/lxml-6.0.2-pp310-pypy310_pp73-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:cb233f9c95f83707dae461b12b720c1af9c28c2d19208e1be03387222151daf5", size = 4325913, upload-time = "2025-09-22T04:04:37.205Z" }, + { url = "https://files.pythonhosted.org/packages/22/ec/f3a1b169b2fb9d03467e2e3c0c752ea30e993be440a068b125fc7dd248b0/lxml-6.0.2-pp310-pypy310_pp73-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:bc456d04db0515ce3320d714a1eac7a97774ff0849e7718b492d957da4631dd4", size = 4269357, upload-time = "2025-09-22T04:04:39.322Z" }, + { url = "https://files.pythonhosted.org/packages/77/a2/585a28fe3e67daa1cf2f06f34490d556d121c25d500b10082a7db96e3bcd/lxml-6.0.2-pp310-pypy310_pp73-manylinux_2_26_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:2613e67de13d619fd283d58bda40bff0ee07739f624ffee8b13b631abf33083d", size = 4412295, upload-time = "2025-09-22T04:04:41.647Z" }, + { url = "https://files.pythonhosted.org/packages/7b/d9/a57dd8bcebd7c69386c20263830d4fa72d27e6b72a229ef7a48e88952d9a/lxml-6.0.2-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:24a8e756c982c001ca8d59e87c80c4d9dcd4d9b44a4cbeb8d9be4482c514d41d", size = 3516913, upload-time = "2025-09-22T04:04:43.602Z" }, + { url = "https://files.pythonhosted.org/packages/0b/11/29d08bc103a62c0eba8016e7ed5aeebbf1e4312e83b0b1648dd203b0e87d/lxml-6.0.2-pp311-pypy311_pp73-macosx_10_15_x86_64.whl", hash = "sha256:1c06035eafa8404b5cf475bb37a9f6088b0aca288d4ccc9d69389750d5543700", size = 3949829, upload-time = "2025-09-22T04:04:45.608Z" }, + { url = "https://files.pythonhosted.org/packages/12/b3/52ab9a3b31e5ab8238da241baa19eec44d2ab426532441ee607165aebb52/lxml-6.0.2-pp311-pypy311_pp73-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:c7d13103045de1bdd6fe5d61802565f1a3537d70cd3abf596aa0af62761921ee", size = 4226277, upload-time = "2025-09-22T04:04:47.754Z" }, + { url = "https://files.pythonhosted.org/packages/a0/33/1eaf780c1baad88224611df13b1c2a9dfa460b526cacfe769103ff50d845/lxml-6.0.2-pp311-pypy311_pp73-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:0a3c150a95fbe5ac91de323aa756219ef9cf7fde5a3f00e2281e30f33fa5fa4f", size = 4330433, upload-time = "2025-09-22T04:04:49.907Z" }, + { url = "https://files.pythonhosted.org/packages/7a/c1/27428a2ff348e994ab4f8777d3a0ad510b6b92d37718e5887d2da99952a2/lxml-6.0.2-pp311-pypy311_pp73-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:60fa43be34f78bebb27812ed90f1925ec99560b0fa1decdb7d12b84d857d31e9", size = 4272119, upload-time = "2025-09-22T04:04:51.801Z" }, + { url = "https://files.pythonhosted.org/packages/f0/d0/3020fa12bcec4ab62f97aab026d57c2f0cfd480a558758d9ca233bb6a79d/lxml-6.0.2-pp311-pypy311_pp73-manylinux_2_26_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:21c73b476d3cfe836be731225ec3421fa2f048d84f6df6a8e70433dff1376d5a", size = 4417314, upload-time = "2025-09-22T04:04:55.024Z" }, + { url = "https://files.pythonhosted.org/packages/6c/77/d7f491cbc05303ac6801651aabeb262d43f319288c1ea96c66b1d2692ff3/lxml-6.0.2-pp311-pypy311_pp73-win_amd64.whl", hash = "sha256:27220da5be049e936c3aca06f174e8827ca6445a4353a1995584311487fc4e3e", size = 3518768, upload-time = "2025-09-22T04:04:57.097Z" }, +] + +[[package]] +name = "more-itertools" +version = "9.1.0" +source = { registry = "https://pypi.org/simple" } +resolution-markers = [ + "python_full_version < '3.8'", +] +sdist = { url = "https://files.pythonhosted.org/packages/2e/d0/bea165535891bd1dcb5152263603e902c0ec1f4c9a2e152cc4adff6b3a38/more-itertools-9.1.0.tar.gz", hash = "sha256:cabaa341ad0389ea83c17a94566a53ae4c9d07349861ecb14dc6d0345cf9ac5d", size = 107389, upload-time = "2023-02-27T14:43:11.571Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/85/01/e2678ee4e0d7eed4fd6be9e5b043fff9d22d245d06c8c91def8ced664189/more_itertools-9.1.0-py3-none-any.whl", hash = "sha256:d2bc7f02446e86a68911e58ded76d6561eea00cddfb2a91e7019bbb586c799f3", size = 54207, upload-time = "2023-02-27T14:43:09.651Z" }, +] + +[[package]] +name = "more-itertools" +version = "10.5.0" +source = { registry = "https://pypi.org/simple" } +resolution-markers = [ + "python_full_version >= '3.8.1' and python_full_version < '3.9'", + "python_full_version >= '3.8' and python_full_version < '3.8.1'", +] +sdist = { url = "https://files.pythonhosted.org/packages/51/78/65922308c4248e0eb08ebcbe67c95d48615cc6f27854b6f2e57143e9178f/more-itertools-10.5.0.tar.gz", hash = "sha256:5482bfef7849c25dc3c6dd53a6173ae4795da2a41a80faea6700d9f5846c5da6", size = 121020, upload-time = "2024-09-05T15:28:22.081Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/48/7e/3a64597054a70f7c86eb0a7d4fc315b8c1ab932f64883a297bdffeb5f967/more_itertools-10.5.0-py3-none-any.whl", hash = "sha256:037b0d3203ce90cca8ab1defbbdac29d5f993fc20131f3664dc8d6acfa872aef", size = 60952, upload-time = "2024-09-05T15:28:20.141Z" }, +] + +[[package]] +name = "more-itertools" +version = "10.8.0" +source = { registry = "https://pypi.org/simple" } +resolution-markers = [ + "python_full_version >= '3.12'", + "python_full_version == '3.11.*'", + "python_full_version == '3.10.*'", + "python_full_version == '3.9.*'", +] +sdist = { url = "https://files.pythonhosted.org/packages/ea/5d/38b681d3fce7a266dd9ab73c66959406d565b3e85f21d5e66e1181d93721/more_itertools-10.8.0.tar.gz", hash = "sha256:f638ddf8a1a0d134181275fb5d58b086ead7c6a72429ad725c67503f13ba30bd", size = 137431, upload-time = "2025-09-02T15:23:11.018Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/a4/8e/469e5a4a2f5855992e425f3cb33804cc07bf18d48f2db061aec61ce50270/more_itertools-10.8.0-py3-none-any.whl", hash = "sha256:52d4362373dcf7c52546bc4af9a86ee7c4579df9a8dc268be0a2f949d376cc9b", size = 69667, upload-time = "2025-09-02T15:23:09.635Z" }, +] + +[[package]] +name = "networkx" +version = "2.6.3" +source = { registry = "https://pypi.org/simple" } +resolution-markers = [ + "python_full_version < '3.8'", +] +sdist = { url = "https://files.pythonhosted.org/packages/97/ae/7497bc5e1c84af95e585e3f98585c9f06c627fac6340984c4243053e8f44/networkx-2.6.3.tar.gz", hash = "sha256:c0946ed31d71f1b732b5aaa6da5a0388a345019af232ce2f49c766e2d6795c51", size = 1844862, upload-time = "2021-09-09T22:09:42.029Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/e9/93/aa6613aa70d6eb4868e667068b5a11feca9645498fd31b954b6c4bb82fa5/networkx-2.6.3-py3-none-any.whl", hash = "sha256:80b6b89c77d1dfb64a4c7854981b60aeea6360ac02c6d4e4913319e0a313abef", size = 1927288, upload-time = "2021-09-09T22:09:39.016Z" }, +] + +[[package]] +name = "networkx" +version = "3.1" +source = { registry = "https://pypi.org/simple" } +resolution-markers = [ + "python_full_version >= '3.8.1' and python_full_version < '3.9'", + "python_full_version >= '3.8' and python_full_version < '3.8.1'", +] +sdist = { url = "https://files.pythonhosted.org/packages/fd/a1/47b974da1a73f063c158a1f4cc33ed0abf7c04f98a19050e80c533c31f0c/networkx-3.1.tar.gz", hash = "sha256:de346335408f84de0eada6ff9fafafff9bcda11f0a0dfaa931133debb146ab61", size = 2021691, upload-time = "2023-04-04T20:07:56.693Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/a8/05/9d4f9b78ead6b2661d6e8ea772e111fc4a9fbd866ad0c81906c11206b55e/networkx-3.1-py3-none-any.whl", hash = "sha256:4f33f68cb2afcf86f28a45f43efc27a9386b535d567d2127f8f61d51dec58d36", size = 2072251, upload-time = "2023-04-04T20:07:53.63Z" }, +] + +[[package]] +name = "networkx" +version = "3.2.1" +source = { registry = "https://pypi.org/simple" } +resolution-markers = [ + "python_full_version == '3.9.*'", +] +sdist = { url = "https://files.pythonhosted.org/packages/c4/80/a84676339aaae2f1cfdf9f418701dd634aef9cc76f708ef55c36ff39c3ca/networkx-3.2.1.tar.gz", hash = "sha256:9f1bb5cf3409bf324e0a722c20bdb4c20ee39bf1c30ce8ae499c8502b0b5e0c6", size = 2073928, upload-time = "2023-10-28T08:41:39.364Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/d5/f0/8fbc882ca80cf077f1b246c0e3c3465f7f415439bdea6b899f6b19f61f70/networkx-3.2.1-py3-none-any.whl", hash = "sha256:f18c69adc97877c42332c170849c96cefa91881c99a7cb3e95b7c659ebdc1ec2", size = 1647772, upload-time = "2023-10-28T08:41:36.945Z" }, +] + +[[package]] +name = "networkx" +version = "3.4.2" +source = { registry = "https://pypi.org/simple" } +resolution-markers = [ + "python_full_version == '3.10.*'", +] +sdist = { url = "https://files.pythonhosted.org/packages/fd/1d/06475e1cd5264c0b870ea2cc6fdb3e37177c1e565c43f56ff17a10e3937f/networkx-3.4.2.tar.gz", hash = "sha256:307c3669428c5362aab27c8a1260aa8f47c4e91d3891f48be0141738d8d053e1", size = 2151368, upload-time = "2024-10-21T12:39:38.695Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/b9/54/dd730b32ea14ea797530a4479b2ed46a6fb250f682a9cfb997e968bf0261/networkx-3.4.2-py3-none-any.whl", hash = "sha256:df5d4365b724cf81b8c6a7312509d0c22386097011ad1abe274afd5e9d3bbc5f", size = 1723263, upload-time = "2024-10-21T12:39:36.247Z" }, +] + +[[package]] +name = "networkx" +version = "3.5" +source = { registry = "https://pypi.org/simple" } +resolution-markers = [ + "python_full_version >= '3.12'", + "python_full_version == '3.11.*'", +] +sdist = { url = "https://files.pythonhosted.org/packages/6c/4f/ccdb8ad3a38e583f214547fd2f7ff1fc160c43a75af88e6aec213404b96a/networkx-3.5.tar.gz", hash = "sha256:d4c6f9cf81f52d69230866796b82afbccdec3db7ae4fbd1b65ea750feed50037", size = 2471065, upload-time = "2025-05-29T11:35:07.804Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/eb/8d/776adee7bbf76365fdd7f2552710282c79a4ead5d2a46408c9043a2b70ba/networkx-3.5-py3-none-any.whl", hash = "sha256:0030d386a9a06dee3565298b4a734b68589749a544acbb6c412dc9e2489ec6ec", size = 2034406, upload-time = "2025-05-29T11:35:04.961Z" }, +] + +[[package]] +name = "numpy" +version = "1.21.6" +source = { registry = "https://pypi.org/simple" } +resolution-markers = [ + "python_full_version < '3.8'", +] +sdist = { url = "https://files.pythonhosted.org/packages/45/b7/de7b8e67f2232c26af57c205aaad29fe17754f793404f59c8a730c7a191a/numpy-1.21.6.zip", hash = "sha256:ecb55251139706669fdec2ff073c98ef8e9a84473e51e716211b41aa0f18e656", size = 10274544, upload-time = "2022-04-12T15:23:55.653Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/ff/c6/05ae3c7f75b596e1bb3d78131c331eada9376a03d1af9801bd40e4675023/numpy-1.21.6-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:8737609c3bbdd48e380d463134a35ffad3b22dc56295eff6f79fd85bd0eeeb25", size = 27203123, upload-time = "2022-04-12T14:48:15.695Z" }, + { url = "https://files.pythonhosted.org/packages/4a/72/a3379f83172f1431d7949138373e3a24beed68184c9362dab1b4d465be26/numpy-1.21.6-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:fdffbfb6832cd0b300995a2b08b8f6fa9f6e856d562800fea9182316d99c4e8e", size = 16965603, upload-time = "2022-04-12T14:48:41.371Z" }, + { url = "https://files.pythonhosted.org/packages/26/e7/4a6f579af8186372b03e8480e47df309520d91cfead8759b64dd5ac62688/numpy-1.21.6-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:3820724272f9913b597ccd13a467cc492a0da6b05df26ea09e78b171a0bb9da6", size = 12364595, upload-time = "2022-04-12T14:49:01.002Z" }, + { url = "https://files.pythonhosted.org/packages/57/ba/d8cbdfd507b541bb247beff24d9d7304ac8ffc379cf585701187d45d4512/numpy-1.21.6-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f17e562de9edf691a42ddb1eb4a5541c20dd3f9e65b09ded2beb0799c0cf29bb", size = 13019278, upload-time = "2022-04-12T14:49:20.896Z" }, + { url = "https://files.pythonhosted.org/packages/6f/7b/036000a55680e6c7eb81502b0aa27ce0ed65d4d8805613909967d9f8baf6/numpy-1.21.6-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5f30427731561ce75d7048ac254dbe47a2ba576229250fb60f0fb74db96501a1", size = 15906004, upload-time = "2022-04-12T14:49:44.734Z" }, + { url = "https://files.pythonhosted.org/packages/b0/77/ff8bbe56ff6cbbdbdb8a641c67cee61e29b2e8bfbb18732c2e1d2961fe4d/numpy-1.21.6-cp310-cp310-win32.whl", hash = "sha256:d4bf4d43077db55589ffc9009c0ba0a94fa4908b9586d6ccce2e0b164c86303c", size = 11706182, upload-time = "2022-04-12T14:50:03.227Z" }, + { url = "https://files.pythonhosted.org/packages/ec/03/93702ca9c4bd61791e46c80ff1f24943febb2317484cf7e8207688bbbd95/numpy-1.21.6-cp310-cp310-win_amd64.whl", hash = "sha256:d136337ae3cc69aa5e447e78d8e1514be8c3ec9b54264e680cf0b4bd9011574f", size = 14008913, upload-time = "2022-04-12T14:50:24.392Z" }, + { url = "https://files.pythonhosted.org/packages/32/dd/43d8b2b2ebf424f6555271a4c9f5b50dc3cc0aafa66c72b4d36863f71358/numpy-1.21.6-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:6aaf96c7f8cebc220cdfc03f1d5a31952f027dda050e5a703a0d1c396075e3e7", size = 16894122, upload-time = "2022-04-12T14:50:50.66Z" }, + { url = "https://files.pythonhosted.org/packages/06/78/b184f13f5461812a17a90b380d70a93fa3532460f0af9d72b0d93d8bc4ff/numpy-1.21.6-cp37-cp37m-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:67c261d6c0a9981820c3a149d255a76918278a6b03b6a036800359aba1256d46", size = 13670697, upload-time = "2022-04-12T14:51:11.878Z" }, + { url = "https://files.pythonhosted.org/packages/6d/ad/ff3b21ebfe79a4d25b4a4f8e5cf9fd44a204adb6b33c09010f566f51027a/numpy-1.21.6-cp37-cp37m-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:a6be4cb0ef3b8c9250c19cc122267263093eee7edd4e3fa75395dfda8c17a8e2", size = 15702369, upload-time = "2022-04-12T14:51:35.292Z" }, + { url = "https://files.pythonhosted.org/packages/b7/0d/86662f93102e42545cdf031da4fddf0ace9030ec67478932a628afc5973b/numpy-1.21.6-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7c4068a8c44014b2d55f3c3f574c376b2494ca9cc73d2f1bd692382b6dffe3db", size = 12974170, upload-time = "2022-04-12T14:51:55.493Z" }, + { url = "https://files.pythonhosted.org/packages/cd/eb/f6f3258e7b0e0cc5c327778312bf4ee4978c8514aa28e97119ee206f6e60/numpy-1.21.6-cp37-cp37m-win32.whl", hash = "sha256:7c7e5fa88d9ff656e067876e4736379cc962d185d5cd808014a8a928d529ef4e", size = 11680505, upload-time = "2022-04-12T14:52:14.056Z" }, + { url = "https://files.pythonhosted.org/packages/97/9f/da37cc4a188a1d5d203d65ab28d6504e17594b5342e0c1dc5610ee6f4535/numpy-1.21.6-cp37-cp37m-win_amd64.whl", hash = "sha256:bcb238c9c96c00d3085b264e5c1a1207672577b93fa666c3b14a45240b14123a", size = 13969236, upload-time = "2022-04-12T14:52:35.45Z" }, + { url = "https://files.pythonhosted.org/packages/b5/e2/b2df1f664d644e690b40179fc0a07c163c6decf986c7adee8a85a094e8ce/numpy-1.21.6-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:82691fda7c3f77c90e62da69ae60b5ac08e87e775b09813559f8901a88266552", size = 27127297, upload-time = "2022-04-12T14:53:15Z" }, + { url = "https://files.pythonhosted.org/packages/5b/d4/be63d2bed7d10f443dee42469623326b6bc51c9e5cd096ebb7227bca456f/numpy-1.21.6-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:643843bcc1c50526b3a71cd2ee561cf0d8773f062c8cbaf9ffac9fdf573f83ab", size = 16926225, upload-time = "2022-04-12T14:53:40.562Z" }, + { url = "https://files.pythonhosted.org/packages/0d/21/036363516c06737135ee58741e9c0af4899348ce3c5f5e04379240edd090/numpy-1.21.6-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:357768c2e4451ac241465157a3e929b265dfac85d9214074985b1786244f2ef3", size = 12329630, upload-time = "2022-04-12T14:53:59.949Z" }, + { url = "https://files.pythonhosted.org/packages/6a/52/a1dcf14b8e81d49c14112663290ee2ed545bd04988170138284a613bd926/numpy-1.21.6-cp38-cp38-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:9f411b2c3f3d76bba0865b35a425157c5dcf54937f82bbeb3d3c180789dd66a6", size = 13719672, upload-time = "2022-04-12T14:54:20.7Z" }, + { url = "https://files.pythonhosted.org/packages/d5/43/e88bb1fb7d040ae8e0e06e749341b13f57701aab11fe9d71c99af6202c5c/numpy-1.21.6-cp38-cp38-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:4aa48afdce4660b0076a00d80afa54e8a97cd49f457d68a4342d188a09451c1a", size = 15749422, upload-time = "2022-04-12T14:54:44.87Z" }, + { url = "https://files.pythonhosted.org/packages/86/c7/3f68d0a8dcc9458879c614707e6ffaf64a108664cfbba9702d3ba7ca4c82/numpy-1.21.6-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d6a96eef20f639e6a97d23e57dd0c1b1069a7b4fd7027482a4c5c451cd7732f4", size = 13026205, upload-time = "2022-04-12T14:55:05.182Z" }, + { url = "https://files.pythonhosted.org/packages/6f/47/453023bd298f8b0be092d8a8bdd4b21f87a8c639ecb724a94cd75e23d216/numpy-1.21.6-cp38-cp38-win32.whl", hash = "sha256:5c3c8def4230e1b959671eb959083661b4a0d2e9af93ee339c7dada6759a9470", size = 11707551, upload-time = "2022-04-12T14:55:23.823Z" }, + { url = "https://files.pythonhosted.org/packages/48/5f/db4550e1c68206814a577ebd92c0dd082f3628fd7fc96725d44a521b0c92/numpy-1.21.6-cp38-cp38-win_amd64.whl", hash = "sha256:bf2ec4b75d0e9356edea834d1de42b31fe11f726a81dfb2c2112bc1eaa508fcf", size = 14009785, upload-time = "2022-04-12T14:55:45.084Z" }, + { url = "https://files.pythonhosted.org/packages/83/eb/a6a0d7fc8e718776c5c710692ea027607104710cba813c4b869182179334/numpy-1.21.6-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:4391bd07606be175aafd267ef9bea87cf1b8210c787666ce82073b05f202add1", size = 27202394, upload-time = "2022-04-12T14:56:24.193Z" }, + { url = "https://files.pythonhosted.org/packages/4c/62/07402945bd5d5cf515a5f0cbc7263abf02ec0ddf3b19fbdc4af7537cd4d0/numpy-1.21.6-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:67f21981ba2f9d7ba9ade60c9e8cbaa8cf8e9ae51673934480e45cf55e953673", size = 16965163, upload-time = "2022-04-12T14:56:50.429Z" }, + { url = "https://files.pythonhosted.org/packages/44/56/041e886b4a8da813b7ec297c270fb3582d2ae8b7f33e106eb5c7a5e9184c/numpy-1.21.6-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:ee5ec40fdd06d62fe5d4084bef4fd50fd4bb6bfd2bf519365f569dc470163ab0", size = 12364236, upload-time = "2022-04-12T14:57:09.317Z" }, + { url = "https://files.pythonhosted.org/packages/61/f4/f01a8989e53a437ad660ab86c91514bec3d5067393e4a844b259f5a103de/numpy-1.21.6-cp39-cp39-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:1dbe1c91269f880e364526649a52eff93ac30035507ae980d2fed33aaee633ac", size = 13721583, upload-time = "2022-04-12T14:57:30.408Z" }, + { url = "https://files.pythonhosted.org/packages/e7/f2/0bdcf2c40ef144cbbc9e0947eea831a145a98b0e5f8438fc09cf7fda0b35/numpy-1.21.6-cp39-cp39-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:d9caa9d5e682102453d96a0ee10c7241b72859b01a941a397fd965f23b3e016b", size = 15734025, upload-time = "2022-04-12T14:57:54.442Z" }, + { url = "https://files.pythonhosted.org/packages/76/7f/830cf169eede1b855538f962e3a70c31755db6423652695b813ed04ff54e/numpy-1.21.6-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:58459d3bad03343ac4b1b42ed14d571b8743dc80ccbf27444f266729df1d6f5b", size = 13020515, upload-time = "2022-04-12T14:58:14.213Z" }, + { url = "https://files.pythonhosted.org/packages/1b/b5/7178d5a22427a9195ac69d6ec150415734f7a7a19d1142f82b89ead1dac4/numpy-1.21.6-cp39-cp39-win32.whl", hash = "sha256:7f5ae4f304257569ef3b948810816bc87c9146e8c446053539947eedeaa32786", size = 11706846, upload-time = "2022-04-12T14:58:32.433Z" }, + { url = "https://files.pythonhosted.org/packages/4d/04/bcd62448f2e772bc90a73ba21bacaa19817ae9905ae639969462862bd071/numpy-1.21.6-cp39-cp39-win_amd64.whl", hash = "sha256:e31f0bb5928b793169b87e3d1e070f2342b22d5245c755e2b81caa29756246c3", size = 14008965, upload-time = "2022-04-12T14:58:53.527Z" }, + { url = "https://files.pythonhosted.org/packages/2e/5a/6f3e280a10de48395053a559bfcb3b2221b74b57d062c1d6307fc965f549/numpy-1.21.6-pp37-pypy37_pp73-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:dd1c8f6bd65d07d3810b90d02eba7997e32abbdf1277a481d698969e921a3be0", size = 15159527, upload-time = "2022-04-12T14:59:16.193Z" }, +] + +[[package]] +name = "numpy" +version = "1.23.5" +source = { registry = "https://pypi.org/simple" } +resolution-markers = [ + "python_full_version >= '3.8.1' and python_full_version < '3.9'", + "python_full_version >= '3.8' and python_full_version < '3.8.1'", +] +sdist = { url = "https://files.pythonhosted.org/packages/42/38/775b43da55fa7473015eddc9a819571517d9a271a9f8134f68fb9be2f212/numpy-1.23.5.tar.gz", hash = "sha256:1b1766d6f397c18153d40015ddfc79ddb715cabadc04d2d228d4e5a8bc4ded1a", size = 10731755, upload-time = "2022-11-20T01:31:41.068Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/0f/ae/dad4b8e7c65494cbbd1c063de114efaf9acd0f5f6171f044f0d4b6299787/numpy-1.23.5-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:9c88793f78fca17da0145455f0d7826bcb9f37da4764af27ac945488116efe63", size = 18118138, upload-time = "2022-11-20T01:21:22.661Z" }, + { url = "https://files.pythonhosted.org/packages/4d/39/d33202cc56c21123a50c6d5e160d00c18ff685ab864dbd4bf80dd40a7af9/numpy-1.23.5-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:e9f4c4e51567b616be64e05d517c79a8a22f3606499941d97bb76f2ca59f982d", size = 13350465, upload-time = "2022-11-20T01:21:43.839Z" }, + { url = "https://files.pythonhosted.org/packages/67/6b/d7c93d458d16464da9b3f560a20c363a19e242ebbb019bd1e1d797523851/numpy-1.23.5-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7903ba8ab592b82014713c491f6c5d3a1cde5b4a3bf116404e08f5b52f6daf43", size = 13946528, upload-time = "2022-11-20T01:22:04.839Z" }, + { url = "https://files.pythonhosted.org/packages/e4/f3/679b3a042a127de0d7c84874913c3e23bb84646eb3bc6ecab3f8c872edc9/numpy-1.23.5-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5e05b1c973a9f858c74367553e236f287e749465f773328c8ef31abe18f691e1", size = 17059657, upload-time = "2022-11-20T01:22:30.262Z" }, + { url = "https://files.pythonhosted.org/packages/af/92/8efba008b9bda66456a1844a0e133dc76c08c5fb68c67a674f046211db29/numpy-1.23.5-cp310-cp310-win32.whl", hash = "sha256:522e26bbf6377e4d76403826ed689c295b0b238f46c28a7251ab94716da0b280", size = 12197097, upload-time = "2022-11-20T01:22:49.117Z" }, + { url = "https://files.pythonhosted.org/packages/6a/03/ae6c3c307f9c5c7516de3df3e764ebb1de33e54e197f0370992138433ef4/numpy-1.23.5-cp310-cp310-win_amd64.whl", hash = "sha256:dbee87b469018961d1ad79b1a5d50c0ae850000b639bcb1b694e9981083243b6", size = 14647128, upload-time = "2022-11-20T01:23:11.326Z" }, + { url = "https://files.pythonhosted.org/packages/6e/7f/94797cfe0263a30805f3074e535adfde02b885ac43d1e4dac85f82213b0b/numpy-1.23.5-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:ce571367b6dfe60af04e04a1834ca2dc5f46004ac1cc756fb95319f64c095a96", size = 18089545, upload-time = "2022-11-20T01:23:38.331Z" }, + { url = "https://files.pythonhosted.org/packages/b8/d0/e6a2cb9a3f3e863a43e50949e9ae704be70baf398fd5af59355f65c8740a/numpy-1.23.5-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:56e454c7833e94ec9769fa0f86e6ff8e42ee38ce0ce1fa4cbb747ea7e06d56aa", size = 13323710, upload-time = "2022-11-20T01:23:59.294Z" }, + { url = "https://files.pythonhosted.org/packages/2b/1a/9ac00116d3a64b5ea031fdb2ff071062a6e2140553fa0770b5f007b84252/numpy-1.23.5-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5039f55555e1eab31124a5768898c9e22c25a65c1e0037f4d7c495a45778c9f2", size = 13941957, upload-time = "2022-11-20T01:24:20.119Z" }, + { url = "https://files.pythonhosted.org/packages/e8/ad/b935c7421657a032fd2a5332eed098f3b9993a155afceb1daa280ff6611f/numpy-1.23.5-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:58f545efd1108e647604a1b5aa809591ccd2540f468a880bedb97247e72db387", size = 17056806, upload-time = "2022-11-20T01:24:45.574Z" }, + { url = "https://files.pythonhosted.org/packages/9b/55/a2669debe264b1f22a8133734595128e40b96a8066e17e53e8d160168e41/numpy-1.23.5-cp311-cp311-win32.whl", hash = "sha256:b2a9ab7c279c91974f756c84c365a669a887efa287365a8e2c418f8b3ba73fb0", size = 12190498, upload-time = "2022-11-20T01:25:04.859Z" }, + { url = "https://files.pythonhosted.org/packages/19/0d/b8c34e4baf258d77a8592bdce45183e9a12874c167f5966c7dd467b74ea9/numpy-1.23.5-cp311-cp311-win_amd64.whl", hash = "sha256:0cbe9848fad08baf71de1a39e12d1b6310f1d5b2d0ea4de051058e6e1076852d", size = 14638838, upload-time = "2022-11-20T01:25:26.972Z" }, + { url = "https://files.pythonhosted.org/packages/d2/55/b9b4bfb9d1d828d7d3192c4059e7b4a7d755ba2e1618089af4be77c152d1/numpy-1.23.5-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:f063b69b090c9d918f9df0a12116029e274daf0181df392839661c4c7ec9018a", size = 18092253, upload-time = "2022-11-20T01:25:54.016Z" }, + { url = "https://files.pythonhosted.org/packages/63/d4/3f0d610a2006434f2b7b2e0c80291368d59b0a03bb3e1911fdb9476232d4/numpy-1.23.5-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:0aaee12d8883552fadfc41e96b4c82ee7d794949e2a7c3b3a7201e968c7ecab9", size = 13325345, upload-time = "2022-11-20T01:26:14.346Z" }, + { url = "https://files.pythonhosted.org/packages/bf/d1/1017fe3f5d65c4fe054a793f18f940d913868bb2846a02d3f6244a829a30/numpy-1.23.5-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:92c8c1e89a1f5028a4c6d9e3ccbe311b6ba53694811269b992c0b224269e2398", size = 13987596, upload-time = "2022-11-20T01:26:35.621Z" }, + { url = "https://files.pythonhosted.org/packages/c6/4f/63f6f16d3f44a764a3b66c6233e133baf912e198a93e14c39ee991f587d0/numpy-1.23.5-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d208a0f8729f3fb790ed18a003f3a57895b989b40ea4dce4717e9cf4af62c6bb", size = 17091210, upload-time = "2022-11-20T01:27:01.067Z" }, + { url = "https://files.pythonhosted.org/packages/b9/0e/10ab011eaebeed29d28ad710d0a3ab2654c06a2800e178e8f2f3a5947ad4/numpy-1.23.5-cp38-cp38-win32.whl", hash = "sha256:06005a2ef6014e9956c09ba07654f9837d9e26696a0470e42beedadb78c11b07", size = 12223450, upload-time = "2022-11-20T01:27:19.599Z" }, + { url = "https://files.pythonhosted.org/packages/4c/42/6274f92514fbefcb1caa66d56d82ac7ac89f7652c0cef1e159a4b79e09f1/numpy-1.23.5-cp38-cp38-win_amd64.whl", hash = "sha256:ca51fcfcc5f9354c45f400059e88bc09215fb71a48d3768fb80e357f3b457e1e", size = 14672878, upload-time = "2022-11-20T01:27:41.958Z" }, + { url = "https://files.pythonhosted.org/packages/8c/7a/171d3b4a54de835c8f95181dd2885607c0e04adca55ef99d9de559b4c9ba/numpy-1.23.5-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:8969bfd28e85c81f3f94eb4a66bc2cf1dbdc5c18efc320af34bffc54d6b1e38f", size = 18130711, upload-time = "2022-11-20T01:28:08.751Z" }, + { url = "https://files.pythonhosted.org/packages/9e/9d/ff17c357f7144301da85f8c03d56593cfd2904e9ce89f86c8eefaa96d2d5/numpy-1.23.5-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:a7ac231a08bb37f852849bbb387a20a57574a97cfc7b6cabb488a4fc8be176de", size = 13359547, upload-time = "2022-11-20T01:28:29.506Z" }, + { url = "https://files.pythonhosted.org/packages/5d/a1/cdac656aed8bc04dc86296490f8dbef68474c3294cc31af30f2bd0ec06de/numpy-1.23.5-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:bf837dc63ba5c06dc8797c398db1e223a466c7ece27a1f7b5232ba3466aafe3d", size = 13977687, upload-time = "2022-11-20T01:28:50.682Z" }, + { url = "https://files.pythonhosted.org/packages/4c/b9/038abd6fbd67b05b03cb1af590cfc02b7f1e5a37af7ac6a868f5093c29f5/numpy-1.23.5-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:33161613d2269025873025b33e879825ec7b1d831317e68f4f2f0f84ed14c719", size = 17083286, upload-time = "2022-11-20T01:29:16.382Z" }, + { url = "https://files.pythonhosted.org/packages/d5/95/f311e6fdaabe24f909eeb6d5482e3adef27fa8389cb8a84823ae560bf480/numpy-1.23.5-cp39-cp39-win32.whl", hash = "sha256:af1da88f6bc3d2338ebbf0e22fe487821ea4d8e89053e25fa59d1d79786e7481", size = 12222601, upload-time = "2022-11-20T01:29:35.13Z" }, + { url = "https://files.pythonhosted.org/packages/08/36/6589c7d5fc4fecda63de4453fefff7c58f6de2b1bb7dfbe7fa807bf85c46/numpy-1.23.5-cp39-cp39-win_amd64.whl", hash = "sha256:09b7847f7e83ca37c6e627682f145856de331049013853f344f37b0c9690e3df", size = 14671927, upload-time = "2022-11-20T01:29:56.962Z" }, + { url = "https://files.pythonhosted.org/packages/25/7b/3b587a62aa54ad7ecf90eabfc77cf78e96d3df1d0e8c31fc534ad3ca6e17/numpy-1.23.5-pp38-pypy38_pp73-macosx_10_9_x86_64.whl", hash = "sha256:abdde9f795cf292fb9651ed48185503a2ff29be87770c3b8e2a14b0cd7aa16f8", size = 17527821, upload-time = "2022-11-20T01:30:23.274Z" }, + { url = "https://files.pythonhosted.org/packages/0f/3d/25e99f2191cce5029310c41cf9a34b5107d4475477bbce2f6d2e68c1c93b/numpy-1.23.5-pp38-pypy38_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f9a909a8bae284d46bbfdefbdd4a262ba19d3bc9921b1e76126b1d21c3c34135", size = 16473100, upload-time = "2022-11-20T01:30:49.209Z" }, + { url = "https://files.pythonhosted.org/packages/3f/ce/04d7772671d8d3a14e426d7560047821c4e2d29ee2b5cfa252601412083b/numpy-1.23.5-pp38-pypy38_pp73-win_amd64.whl", hash = "sha256:01dd17cbb340bf0fc23981e52e1d18a9d4050792e8fb8363cecbf066a84b827d", size = 14530083, upload-time = "2022-11-20T01:31:11.377Z" }, +] + +[[package]] +name = "numpy" +version = "2.0.2" +source = { registry = "https://pypi.org/simple" } +resolution-markers = [ + "python_full_version == '3.9.*'", +] +sdist = { url = "https://files.pythonhosted.org/packages/a9/75/10dd1f8116a8b796cb2c737b674e02d02e80454bda953fa7e65d8c12b016/numpy-2.0.2.tar.gz", hash = "sha256:883c987dee1880e2a864ab0dc9892292582510604156762362d9326444636e78", size = 18902015, upload-time = "2024-08-26T20:19:40.945Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/21/91/3495b3237510f79f5d81f2508f9f13fea78ebfdf07538fc7444badda173d/numpy-2.0.2-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:51129a29dbe56f9ca83438b706e2e69a39892b5eda6cedcb6b0c9fdc9b0d3ece", size = 21165245, upload-time = "2024-08-26T20:04:14.625Z" }, + { url = "https://files.pythonhosted.org/packages/05/33/26178c7d437a87082d11019292dce6d3fe6f0e9026b7b2309cbf3e489b1d/numpy-2.0.2-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:f15975dfec0cf2239224d80e32c3170b1d168335eaedee69da84fbe9f1f9cd04", size = 13738540, upload-time = "2024-08-26T20:04:36.784Z" }, + { url = "https://files.pythonhosted.org/packages/ec/31/cc46e13bf07644efc7a4bf68df2df5fb2a1a88d0cd0da9ddc84dc0033e51/numpy-2.0.2-cp310-cp310-macosx_14_0_arm64.whl", hash = "sha256:8c5713284ce4e282544c68d1c3b2c7161d38c256d2eefc93c1d683cf47683e66", size = 5300623, upload-time = "2024-08-26T20:04:46.491Z" }, + { url = "https://files.pythonhosted.org/packages/6e/16/7bfcebf27bb4f9d7ec67332ffebee4d1bf085c84246552d52dbb548600e7/numpy-2.0.2-cp310-cp310-macosx_14_0_x86_64.whl", hash = "sha256:becfae3ddd30736fe1889a37f1f580e245ba79a5855bff5f2a29cb3ccc22dd7b", size = 6901774, upload-time = "2024-08-26T20:04:58.173Z" }, + { url = "https://files.pythonhosted.org/packages/f9/a3/561c531c0e8bf082c5bef509d00d56f82e0ea7e1e3e3a7fc8fa78742a6e5/numpy-2.0.2-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2da5960c3cf0df7eafefd806d4e612c5e19358de82cb3c343631188991566ccd", size = 13907081, upload-time = "2024-08-26T20:05:19.098Z" }, + { url = "https://files.pythonhosted.org/packages/fa/66/f7177ab331876200ac7563a580140643d1179c8b4b6a6b0fc9838de2a9b8/numpy-2.0.2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:496f71341824ed9f3d2fd36cf3ac57ae2e0165c143b55c3a035ee219413f3318", size = 19523451, upload-time = "2024-08-26T20:05:47.479Z" }, + { url = "https://files.pythonhosted.org/packages/25/7f/0b209498009ad6453e4efc2c65bcdf0ae08a182b2b7877d7ab38a92dc542/numpy-2.0.2-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:a61ec659f68ae254e4d237816e33171497e978140353c0c2038d46e63282d0c8", size = 19927572, upload-time = "2024-08-26T20:06:17.137Z" }, + { url = "https://files.pythonhosted.org/packages/3e/df/2619393b1e1b565cd2d4c4403bdd979621e2c4dea1f8532754b2598ed63b/numpy-2.0.2-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:d731a1c6116ba289c1e9ee714b08a8ff882944d4ad631fd411106a30f083c326", size = 14400722, upload-time = "2024-08-26T20:06:39.16Z" }, + { url = "https://files.pythonhosted.org/packages/22/ad/77e921b9f256d5da36424ffb711ae79ca3f451ff8489eeca544d0701d74a/numpy-2.0.2-cp310-cp310-win32.whl", hash = "sha256:984d96121c9f9616cd33fbd0618b7f08e0cfc9600a7ee1d6fd9b239186d19d97", size = 6472170, upload-time = "2024-08-26T20:06:50.361Z" }, + { url = "https://files.pythonhosted.org/packages/10/05/3442317535028bc29cf0c0dd4c191a4481e8376e9f0db6bcf29703cadae6/numpy-2.0.2-cp310-cp310-win_amd64.whl", hash = "sha256:c7b0be4ef08607dd04da4092faee0b86607f111d5ae68036f16cc787e250a131", size = 15905558, upload-time = "2024-08-26T20:07:13.881Z" }, + { url = "https://files.pythonhosted.org/packages/8b/cf/034500fb83041aa0286e0fb16e7c76e5c8b67c0711bb6e9e9737a717d5fe/numpy-2.0.2-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:49ca4decb342d66018b01932139c0961a8f9ddc7589611158cb3c27cbcf76448", size = 21169137, upload-time = "2024-08-26T20:07:45.345Z" }, + { url = "https://files.pythonhosted.org/packages/4a/d9/32de45561811a4b87fbdee23b5797394e3d1504b4a7cf40c10199848893e/numpy-2.0.2-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:11a76c372d1d37437857280aa142086476136a8c0f373b2e648ab2c8f18fb195", size = 13703552, upload-time = "2024-08-26T20:08:06.666Z" }, + { url = "https://files.pythonhosted.org/packages/c1/ca/2f384720020c7b244d22508cb7ab23d95f179fcfff33c31a6eeba8d6c512/numpy-2.0.2-cp311-cp311-macosx_14_0_arm64.whl", hash = "sha256:807ec44583fd708a21d4a11d94aedf2f4f3c3719035c76a2bbe1fe8e217bdc57", size = 5298957, upload-time = "2024-08-26T20:08:15.83Z" }, + { url = "https://files.pythonhosted.org/packages/0e/78/a3e4f9fb6aa4e6fdca0c5428e8ba039408514388cf62d89651aade838269/numpy-2.0.2-cp311-cp311-macosx_14_0_x86_64.whl", hash = "sha256:8cafab480740e22f8d833acefed5cc87ce276f4ece12fdaa2e8903db2f82897a", size = 6905573, upload-time = "2024-08-26T20:08:27.185Z" }, + { url = "https://files.pythonhosted.org/packages/a0/72/cfc3a1beb2caf4efc9d0b38a15fe34025230da27e1c08cc2eb9bfb1c7231/numpy-2.0.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a15f476a45e6e5a3a79d8a14e62161d27ad897381fecfa4a09ed5322f2085669", size = 13914330, upload-time = "2024-08-26T20:08:48.058Z" }, + { url = "https://files.pythonhosted.org/packages/ba/a8/c17acf65a931ce551fee11b72e8de63bf7e8a6f0e21add4c937c83563538/numpy-2.0.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:13e689d772146140a252c3a28501da66dfecd77490b498b168b501835041f951", size = 19534895, upload-time = "2024-08-26T20:09:16.536Z" }, + { url = "https://files.pythonhosted.org/packages/ba/86/8767f3d54f6ae0165749f84648da9dcc8cd78ab65d415494962c86fac80f/numpy-2.0.2-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:9ea91dfb7c3d1c56a0e55657c0afb38cf1eeae4544c208dc465c3c9f3a7c09f9", size = 19937253, upload-time = "2024-08-26T20:09:46.263Z" }, + { url = "https://files.pythonhosted.org/packages/df/87/f76450e6e1c14e5bb1eae6836478b1028e096fd02e85c1c37674606ab752/numpy-2.0.2-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:c1c9307701fec8f3f7a1e6711f9089c06e6284b3afbbcd259f7791282d660a15", size = 14414074, upload-time = "2024-08-26T20:10:08.483Z" }, + { url = "https://files.pythonhosted.org/packages/5c/ca/0f0f328e1e59f73754f06e1adfb909de43726d4f24c6a3f8805f34f2b0fa/numpy-2.0.2-cp311-cp311-win32.whl", hash = "sha256:a392a68bd329eafac5817e5aefeb39038c48b671afd242710b451e76090e81f4", size = 6470640, upload-time = "2024-08-26T20:10:19.732Z" }, + { url = "https://files.pythonhosted.org/packages/eb/57/3a3f14d3a759dcf9bf6e9eda905794726b758819df4663f217d658a58695/numpy-2.0.2-cp311-cp311-win_amd64.whl", hash = "sha256:286cd40ce2b7d652a6f22efdfc6d1edf879440e53e76a75955bc0c826c7e64dc", size = 15910230, upload-time = "2024-08-26T20:10:43.413Z" }, + { url = "https://files.pythonhosted.org/packages/45/40/2e117be60ec50d98fa08c2f8c48e09b3edea93cfcabd5a9ff6925d54b1c2/numpy-2.0.2-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:df55d490dea7934f330006d0f81e8551ba6010a5bf035a249ef61a94f21c500b", size = 20895803, upload-time = "2024-08-26T20:11:13.916Z" }, + { url = "https://files.pythonhosted.org/packages/46/92/1b8b8dee833f53cef3e0a3f69b2374467789e0bb7399689582314df02651/numpy-2.0.2-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:8df823f570d9adf0978347d1f926b2a867d5608f434a7cff7f7908c6570dcf5e", size = 13471835, upload-time = "2024-08-26T20:11:34.779Z" }, + { url = "https://files.pythonhosted.org/packages/7f/19/e2793bde475f1edaea6945be141aef6c8b4c669b90c90a300a8954d08f0a/numpy-2.0.2-cp312-cp312-macosx_14_0_arm64.whl", hash = "sha256:9a92ae5c14811e390f3767053ff54eaee3bf84576d99a2456391401323f4ec2c", size = 5038499, upload-time = "2024-08-26T20:11:43.902Z" }, + { url = "https://files.pythonhosted.org/packages/e3/ff/ddf6dac2ff0dd50a7327bcdba45cb0264d0e96bb44d33324853f781a8f3c/numpy-2.0.2-cp312-cp312-macosx_14_0_x86_64.whl", hash = "sha256:a842d573724391493a97a62ebbb8e731f8a5dcc5d285dfc99141ca15a3302d0c", size = 6633497, upload-time = "2024-08-26T20:11:55.09Z" }, + { url = "https://files.pythonhosted.org/packages/72/21/67f36eac8e2d2cd652a2e69595a54128297cdcb1ff3931cfc87838874bd4/numpy-2.0.2-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c05e238064fc0610c840d1cf6a13bf63d7e391717d247f1bf0318172e759e692", size = 13621158, upload-time = "2024-08-26T20:12:14.95Z" }, + { url = "https://files.pythonhosted.org/packages/39/68/e9f1126d757653496dbc096cb429014347a36b228f5a991dae2c6b6cfd40/numpy-2.0.2-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0123ffdaa88fa4ab64835dcbde75dcdf89c453c922f18dced6e27c90d1d0ec5a", size = 19236173, upload-time = "2024-08-26T20:12:44.049Z" }, + { url = "https://files.pythonhosted.org/packages/d1/e9/1f5333281e4ebf483ba1c888b1d61ba7e78d7e910fdd8e6499667041cc35/numpy-2.0.2-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:96a55f64139912d61de9137f11bf39a55ec8faec288c75a54f93dfd39f7eb40c", size = 19634174, upload-time = "2024-08-26T20:13:13.634Z" }, + { url = "https://files.pythonhosted.org/packages/71/af/a469674070c8d8408384e3012e064299f7a2de540738a8e414dcfd639996/numpy-2.0.2-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:ec9852fb39354b5a45a80bdab5ac02dd02b15f44b3804e9f00c556bf24b4bded", size = 14099701, upload-time = "2024-08-26T20:13:34.851Z" }, + { url = "https://files.pythonhosted.org/packages/d0/3d/08ea9f239d0e0e939b6ca52ad403c84a2bce1bde301a8eb4888c1c1543f1/numpy-2.0.2-cp312-cp312-win32.whl", hash = "sha256:671bec6496f83202ed2d3c8fdc486a8fc86942f2e69ff0e986140339a63bcbe5", size = 6174313, upload-time = "2024-08-26T20:13:45.653Z" }, + { url = "https://files.pythonhosted.org/packages/b2/b5/4ac39baebf1fdb2e72585c8352c56d063b6126be9fc95bd2bb5ef5770c20/numpy-2.0.2-cp312-cp312-win_amd64.whl", hash = "sha256:cfd41e13fdc257aa5778496b8caa5e856dc4896d4ccf01841daee1d96465467a", size = 15606179, upload-time = "2024-08-26T20:14:08.786Z" }, + { url = "https://files.pythonhosted.org/packages/43/c1/41c8f6df3162b0c6ffd4437d729115704bd43363de0090c7f913cfbc2d89/numpy-2.0.2-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:9059e10581ce4093f735ed23f3b9d283b9d517ff46009ddd485f1747eb22653c", size = 21169942, upload-time = "2024-08-26T20:14:40.108Z" }, + { url = "https://files.pythonhosted.org/packages/39/bc/fd298f308dcd232b56a4031fd6ddf11c43f9917fbc937e53762f7b5a3bb1/numpy-2.0.2-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:423e89b23490805d2a5a96fe40ec507407b8ee786d66f7328be214f9679df6dd", size = 13711512, upload-time = "2024-08-26T20:15:00.985Z" }, + { url = "https://files.pythonhosted.org/packages/96/ff/06d1aa3eeb1c614eda245c1ba4fb88c483bee6520d361641331872ac4b82/numpy-2.0.2-cp39-cp39-macosx_14_0_arm64.whl", hash = "sha256:2b2955fa6f11907cf7a70dab0d0755159bca87755e831e47932367fc8f2f2d0b", size = 5306976, upload-time = "2024-08-26T20:15:10.876Z" }, + { url = "https://files.pythonhosted.org/packages/2d/98/121996dcfb10a6087a05e54453e28e58694a7db62c5a5a29cee14c6e047b/numpy-2.0.2-cp39-cp39-macosx_14_0_x86_64.whl", hash = "sha256:97032a27bd9d8988b9a97a8c4d2c9f2c15a81f61e2f21404d7e8ef00cb5be729", size = 6906494, upload-time = "2024-08-26T20:15:22.055Z" }, + { url = "https://files.pythonhosted.org/packages/15/31/9dffc70da6b9bbf7968f6551967fc21156207366272c2a40b4ed6008dc9b/numpy-2.0.2-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1e795a8be3ddbac43274f18588329c72939870a16cae810c2b73461c40718ab1", size = 13912596, upload-time = "2024-08-26T20:15:42.452Z" }, + { url = "https://files.pythonhosted.org/packages/b9/14/78635daab4b07c0930c919d451b8bf8c164774e6a3413aed04a6d95758ce/numpy-2.0.2-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f26b258c385842546006213344c50655ff1555a9338e2e5e02a0756dc3e803dd", size = 19526099, upload-time = "2024-08-26T20:16:11.048Z" }, + { url = "https://files.pythonhosted.org/packages/26/4c/0eeca4614003077f68bfe7aac8b7496f04221865b3a5e7cb230c9d055afd/numpy-2.0.2-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:5fec9451a7789926bcf7c2b8d187292c9f93ea30284802a0ab3f5be8ab36865d", size = 19932823, upload-time = "2024-08-26T20:16:40.171Z" }, + { url = "https://files.pythonhosted.org/packages/f1/46/ea25b98b13dccaebddf1a803f8c748680d972e00507cd9bc6dcdb5aa2ac1/numpy-2.0.2-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:9189427407d88ff25ecf8f12469d4d39d35bee1db5d39fc5c168c6f088a6956d", size = 14404424, upload-time = "2024-08-26T20:17:02.604Z" }, + { url = "https://files.pythonhosted.org/packages/c8/a6/177dd88d95ecf07e722d21008b1b40e681a929eb9e329684d449c36586b2/numpy-2.0.2-cp39-cp39-win32.whl", hash = "sha256:905d16e0c60200656500c95b6b8dca5d109e23cb24abc701d41c02d74c6b3afa", size = 6476809, upload-time = "2024-08-26T20:17:13.553Z" }, + { url = "https://files.pythonhosted.org/packages/ea/2b/7fc9f4e7ae5b507c1a3a21f0f15ed03e794c1242ea8a242ac158beb56034/numpy-2.0.2-cp39-cp39-win_amd64.whl", hash = "sha256:a3f4ab0caa7f053f6797fcd4e1e25caee367db3112ef2b6ef82d749530768c73", size = 15911314, upload-time = "2024-08-26T20:17:36.72Z" }, + { url = "https://files.pythonhosted.org/packages/8f/3b/df5a870ac6a3be3a86856ce195ef42eec7ae50d2a202be1f5a4b3b340e14/numpy-2.0.2-pp39-pypy39_pp73-macosx_10_9_x86_64.whl", hash = "sha256:7f0a0c6f12e07fa94133c8a67404322845220c06a9e80e85999afe727f7438b8", size = 21025288, upload-time = "2024-08-26T20:18:07.732Z" }, + { url = "https://files.pythonhosted.org/packages/2c/97/51af92f18d6f6f2d9ad8b482a99fb74e142d71372da5d834b3a2747a446e/numpy-2.0.2-pp39-pypy39_pp73-macosx_14_0_x86_64.whl", hash = "sha256:312950fdd060354350ed123c0e25a71327d3711584beaef30cdaa93320c392d4", size = 6762793, upload-time = "2024-08-26T20:18:19.125Z" }, + { url = "https://files.pythonhosted.org/packages/12/46/de1fbd0c1b5ccaa7f9a005b66761533e2f6a3e560096682683a223631fe9/numpy-2.0.2-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:26df23238872200f63518dd2aa984cfca675d82469535dc7162dc2ee52d9dd5c", size = 19334885, upload-time = "2024-08-26T20:18:47.237Z" }, + { url = "https://files.pythonhosted.org/packages/cc/dc/d330a6faefd92b446ec0f0dfea4c3207bb1fef3c4771d19cf4543efd2c78/numpy-2.0.2-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:a46288ec55ebbd58947d31d72be2c63cbf839f0a63b49cb755022310792a3385", size = 15828784, upload-time = "2024-08-26T20:19:11.19Z" }, +] + +[[package]] +name = "numpy" +version = "2.2.6" +source = { registry = "https://pypi.org/simple" } +resolution-markers = [ + "python_full_version == '3.10.*'", +] +sdist = { url = "https://files.pythonhosted.org/packages/76/21/7d2a95e4bba9dc13d043ee156a356c0a8f0c6309dff6b21b4d71a073b8a8/numpy-2.2.6.tar.gz", hash = "sha256:e29554e2bef54a90aa5cc07da6ce955accb83f21ab5de01a62c8478897b264fd", size = 20276440, upload-time = "2025-05-17T22:38:04.611Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/9a/3e/ed6db5be21ce87955c0cbd3009f2803f59fa08df21b5df06862e2d8e2bdd/numpy-2.2.6-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:b412caa66f72040e6d268491a59f2c43bf03eb6c96dd8f0307829feb7fa2b6fb", size = 21165245, upload-time = "2025-05-17T21:27:58.555Z" }, + { url = "https://files.pythonhosted.org/packages/22/c2/4b9221495b2a132cc9d2eb862e21d42a009f5a60e45fc44b00118c174bff/numpy-2.2.6-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:8e41fd67c52b86603a91c1a505ebaef50b3314de0213461c7a6e99c9a3beff90", size = 14360048, upload-time = "2025-05-17T21:28:21.406Z" }, + { url = "https://files.pythonhosted.org/packages/fd/77/dc2fcfc66943c6410e2bf598062f5959372735ffda175b39906d54f02349/numpy-2.2.6-cp310-cp310-macosx_14_0_arm64.whl", hash = "sha256:37e990a01ae6ec7fe7fa1c26c55ecb672dd98b19c3d0e1d1f326fa13cb38d163", size = 5340542, upload-time = "2025-05-17T21:28:30.931Z" }, + { url = "https://files.pythonhosted.org/packages/7a/4f/1cb5fdc353a5f5cc7feb692db9b8ec2c3d6405453f982435efc52561df58/numpy-2.2.6-cp310-cp310-macosx_14_0_x86_64.whl", hash = "sha256:5a6429d4be8ca66d889b7cf70f536a397dc45ba6faeb5f8c5427935d9592e9cf", size = 6878301, upload-time = "2025-05-17T21:28:41.613Z" }, + { url = "https://files.pythonhosted.org/packages/eb/17/96a3acd228cec142fcb8723bd3cc39c2a474f7dcf0a5d16731980bcafa95/numpy-2.2.6-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:efd28d4e9cd7d7a8d39074a4d44c63eda73401580c5c76acda2ce969e0a38e83", size = 14297320, upload-time = "2025-05-17T21:29:02.78Z" }, + { url = "https://files.pythonhosted.org/packages/b4/63/3de6a34ad7ad6646ac7d2f55ebc6ad439dbbf9c4370017c50cf403fb19b5/numpy-2.2.6-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:fc7b73d02efb0e18c000e9ad8b83480dfcd5dfd11065997ed4c6747470ae8915", size = 16801050, upload-time = "2025-05-17T21:29:27.675Z" }, + { url = "https://files.pythonhosted.org/packages/07/b6/89d837eddef52b3d0cec5c6ba0456c1bf1b9ef6a6672fc2b7873c3ec4e2e/numpy-2.2.6-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:74d4531beb257d2c3f4b261bfb0fc09e0f9ebb8842d82a7b4209415896adc680", size = 15807034, upload-time = "2025-05-17T21:29:51.102Z" }, + { url = "https://files.pythonhosted.org/packages/01/c8/dc6ae86e3c61cfec1f178e5c9f7858584049b6093f843bca541f94120920/numpy-2.2.6-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:8fc377d995680230e83241d8a96def29f204b5782f371c532579b4f20607a289", size = 18614185, upload-time = "2025-05-17T21:30:18.703Z" }, + { url = "https://files.pythonhosted.org/packages/5b/c5/0064b1b7e7c89137b471ccec1fd2282fceaae0ab3a9550f2568782d80357/numpy-2.2.6-cp310-cp310-win32.whl", hash = "sha256:b093dd74e50a8cba3e873868d9e93a85b78e0daf2e98c6797566ad8044e8363d", size = 6527149, upload-time = "2025-05-17T21:30:29.788Z" }, + { url = "https://files.pythonhosted.org/packages/a3/dd/4b822569d6b96c39d1215dbae0582fd99954dcbcf0c1a13c61783feaca3f/numpy-2.2.6-cp310-cp310-win_amd64.whl", hash = "sha256:f0fd6321b839904e15c46e0d257fdd101dd7f530fe03fd6359c1ea63738703f3", size = 12904620, upload-time = "2025-05-17T21:30:48.994Z" }, + { url = "https://files.pythonhosted.org/packages/da/a8/4f83e2aa666a9fbf56d6118faaaf5f1974d456b1823fda0a176eff722839/numpy-2.2.6-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:f9f1adb22318e121c5c69a09142811a201ef17ab257a1e66ca3025065b7f53ae", size = 21176963, upload-time = "2025-05-17T21:31:19.36Z" }, + { url = "https://files.pythonhosted.org/packages/b3/2b/64e1affc7972decb74c9e29e5649fac940514910960ba25cd9af4488b66c/numpy-2.2.6-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:c820a93b0255bc360f53eca31a0e676fd1101f673dda8da93454a12e23fc5f7a", size = 14406743, upload-time = "2025-05-17T21:31:41.087Z" }, + { url = "https://files.pythonhosted.org/packages/4a/9f/0121e375000b5e50ffdd8b25bf78d8e1a5aa4cca3f185d41265198c7b834/numpy-2.2.6-cp311-cp311-macosx_14_0_arm64.whl", hash = "sha256:3d70692235e759f260c3d837193090014aebdf026dfd167834bcba43e30c2a42", size = 5352616, upload-time = "2025-05-17T21:31:50.072Z" }, + { url = "https://files.pythonhosted.org/packages/31/0d/b48c405c91693635fbe2dcd7bc84a33a602add5f63286e024d3b6741411c/numpy-2.2.6-cp311-cp311-macosx_14_0_x86_64.whl", hash = "sha256:481b49095335f8eed42e39e8041327c05b0f6f4780488f61286ed3c01368d491", size = 6889579, upload-time = "2025-05-17T21:32:01.712Z" }, + { url = "https://files.pythonhosted.org/packages/52/b8/7f0554d49b565d0171eab6e99001846882000883998e7b7d9f0d98b1f934/numpy-2.2.6-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b64d8d4d17135e00c8e346e0a738deb17e754230d7e0810ac5012750bbd85a5a", size = 14312005, upload-time = "2025-05-17T21:32:23.332Z" }, + { url = "https://files.pythonhosted.org/packages/b3/dd/2238b898e51bd6d389b7389ffb20d7f4c10066d80351187ec8e303a5a475/numpy-2.2.6-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ba10f8411898fc418a521833e014a77d3ca01c15b0c6cdcce6a0d2897e6dbbdf", size = 16821570, upload-time = "2025-05-17T21:32:47.991Z" }, + { url = "https://files.pythonhosted.org/packages/83/6c/44d0325722cf644f191042bf47eedad61c1e6df2432ed65cbe28509d404e/numpy-2.2.6-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:bd48227a919f1bafbdda0583705e547892342c26fb127219d60a5c36882609d1", size = 15818548, upload-time = "2025-05-17T21:33:11.728Z" }, + { url = "https://files.pythonhosted.org/packages/ae/9d/81e8216030ce66be25279098789b665d49ff19eef08bfa8cb96d4957f422/numpy-2.2.6-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:9551a499bf125c1d4f9e250377c1ee2eddd02e01eac6644c080162c0c51778ab", size = 18620521, upload-time = "2025-05-17T21:33:39.139Z" }, + { url = "https://files.pythonhosted.org/packages/6a/fd/e19617b9530b031db51b0926eed5345ce8ddc669bb3bc0044b23e275ebe8/numpy-2.2.6-cp311-cp311-win32.whl", hash = "sha256:0678000bb9ac1475cd454c6b8c799206af8107e310843532b04d49649c717a47", size = 6525866, upload-time = "2025-05-17T21:33:50.273Z" }, + { url = "https://files.pythonhosted.org/packages/31/0a/f354fb7176b81747d870f7991dc763e157a934c717b67b58456bc63da3df/numpy-2.2.6-cp311-cp311-win_amd64.whl", hash = "sha256:e8213002e427c69c45a52bbd94163084025f533a55a59d6f9c5b820774ef3303", size = 12907455, upload-time = "2025-05-17T21:34:09.135Z" }, + { url = "https://files.pythonhosted.org/packages/82/5d/c00588b6cf18e1da539b45d3598d3557084990dcc4331960c15ee776ee41/numpy-2.2.6-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:41c5a21f4a04fa86436124d388f6ed60a9343a6f767fced1a8a71c3fbca038ff", size = 20875348, upload-time = "2025-05-17T21:34:39.648Z" }, + { url = "https://files.pythonhosted.org/packages/66/ee/560deadcdde6c2f90200450d5938f63a34b37e27ebff162810f716f6a230/numpy-2.2.6-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:de749064336d37e340f640b05f24e9e3dd678c57318c7289d222a8a2f543e90c", size = 14119362, upload-time = "2025-05-17T21:35:01.241Z" }, + { url = "https://files.pythonhosted.org/packages/3c/65/4baa99f1c53b30adf0acd9a5519078871ddde8d2339dc5a7fde80d9d87da/numpy-2.2.6-cp312-cp312-macosx_14_0_arm64.whl", hash = "sha256:894b3a42502226a1cac872f840030665f33326fc3dac8e57c607905773cdcde3", size = 5084103, upload-time = "2025-05-17T21:35:10.622Z" }, + { url = "https://files.pythonhosted.org/packages/cc/89/e5a34c071a0570cc40c9a54eb472d113eea6d002e9ae12bb3a8407fb912e/numpy-2.2.6-cp312-cp312-macosx_14_0_x86_64.whl", hash = "sha256:71594f7c51a18e728451bb50cc60a3ce4e6538822731b2933209a1f3614e9282", size = 6625382, upload-time = "2025-05-17T21:35:21.414Z" }, + { url = "https://files.pythonhosted.org/packages/f8/35/8c80729f1ff76b3921d5c9487c7ac3de9b2a103b1cd05e905b3090513510/numpy-2.2.6-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f2618db89be1b4e05f7a1a847a9c1c0abd63e63a1607d892dd54668dd92faf87", size = 14018462, upload-time = "2025-05-17T21:35:42.174Z" }, + { url = "https://files.pythonhosted.org/packages/8c/3d/1e1db36cfd41f895d266b103df00ca5b3cbe965184df824dec5c08c6b803/numpy-2.2.6-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:fd83c01228a688733f1ded5201c678f0c53ecc1006ffbc404db9f7a899ac6249", size = 16527618, upload-time = "2025-05-17T21:36:06.711Z" }, + { url = "https://files.pythonhosted.org/packages/61/c6/03ed30992602c85aa3cd95b9070a514f8b3c33e31124694438d88809ae36/numpy-2.2.6-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:37c0ca431f82cd5fa716eca9506aefcabc247fb27ba69c5062a6d3ade8cf8f49", size = 15505511, upload-time = "2025-05-17T21:36:29.965Z" }, + { url = "https://files.pythonhosted.org/packages/b7/25/5761d832a81df431e260719ec45de696414266613c9ee268394dd5ad8236/numpy-2.2.6-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:fe27749d33bb772c80dcd84ae7e8df2adc920ae8297400dabec45f0dedb3f6de", size = 18313783, upload-time = "2025-05-17T21:36:56.883Z" }, + { url = "https://files.pythonhosted.org/packages/57/0a/72d5a3527c5ebffcd47bde9162c39fae1f90138c961e5296491ce778e682/numpy-2.2.6-cp312-cp312-win32.whl", hash = "sha256:4eeaae00d789f66c7a25ac5f34b71a7035bb474e679f410e5e1a94deb24cf2d4", size = 6246506, upload-time = "2025-05-17T21:37:07.368Z" }, + { url = "https://files.pythonhosted.org/packages/36/fa/8c9210162ca1b88529ab76b41ba02d433fd54fecaf6feb70ef9f124683f1/numpy-2.2.6-cp312-cp312-win_amd64.whl", hash = "sha256:c1f9540be57940698ed329904db803cf7a402f3fc200bfe599334c9bd84a40b2", size = 12614190, upload-time = "2025-05-17T21:37:26.213Z" }, + { url = "https://files.pythonhosted.org/packages/f9/5c/6657823f4f594f72b5471f1db1ab12e26e890bb2e41897522d134d2a3e81/numpy-2.2.6-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:0811bb762109d9708cca4d0b13c4f67146e3c3b7cf8d34018c722adb2d957c84", size = 20867828, upload-time = "2025-05-17T21:37:56.699Z" }, + { url = "https://files.pythonhosted.org/packages/dc/9e/14520dc3dadf3c803473bd07e9b2bd1b69bc583cb2497b47000fed2fa92f/numpy-2.2.6-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:287cc3162b6f01463ccd86be154f284d0893d2b3ed7292439ea97eafa8170e0b", size = 14143006, upload-time = "2025-05-17T21:38:18.291Z" }, + { url = "https://files.pythonhosted.org/packages/4f/06/7e96c57d90bebdce9918412087fc22ca9851cceaf5567a45c1f404480e9e/numpy-2.2.6-cp313-cp313-macosx_14_0_arm64.whl", hash = "sha256:f1372f041402e37e5e633e586f62aa53de2eac8d98cbfb822806ce4bbefcb74d", size = 5076765, upload-time = "2025-05-17T21:38:27.319Z" }, + { url = "https://files.pythonhosted.org/packages/73/ed/63d920c23b4289fdac96ddbdd6132e9427790977d5457cd132f18e76eae0/numpy-2.2.6-cp313-cp313-macosx_14_0_x86_64.whl", hash = "sha256:55a4d33fa519660d69614a9fad433be87e5252f4b03850642f88993f7b2ca566", size = 6617736, upload-time = "2025-05-17T21:38:38.141Z" }, + { url = "https://files.pythonhosted.org/packages/85/c5/e19c8f99d83fd377ec8c7e0cf627a8049746da54afc24ef0a0cb73d5dfb5/numpy-2.2.6-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f92729c95468a2f4f15e9bb94c432a9229d0d50de67304399627a943201baa2f", size = 14010719, upload-time = "2025-05-17T21:38:58.433Z" }, + { url = "https://files.pythonhosted.org/packages/19/49/4df9123aafa7b539317bf6d342cb6d227e49f7a35b99c287a6109b13dd93/numpy-2.2.6-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1bc23a79bfabc5d056d106f9befb8d50c31ced2fbc70eedb8155aec74a45798f", size = 16526072, upload-time = "2025-05-17T21:39:22.638Z" }, + { url = "https://files.pythonhosted.org/packages/b2/6c/04b5f47f4f32f7c2b0e7260442a8cbcf8168b0e1a41ff1495da42f42a14f/numpy-2.2.6-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:e3143e4451880bed956e706a3220b4e5cf6172ef05fcc397f6f36a550b1dd868", size = 15503213, upload-time = "2025-05-17T21:39:45.865Z" }, + { url = "https://files.pythonhosted.org/packages/17/0a/5cd92e352c1307640d5b6fec1b2ffb06cd0dabe7d7b8227f97933d378422/numpy-2.2.6-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:b4f13750ce79751586ae2eb824ba7e1e8dba64784086c98cdbbcc6a42112ce0d", size = 18316632, upload-time = "2025-05-17T21:40:13.331Z" }, + { url = "https://files.pythonhosted.org/packages/f0/3b/5cba2b1d88760ef86596ad0f3d484b1cbff7c115ae2429678465057c5155/numpy-2.2.6-cp313-cp313-win32.whl", hash = "sha256:5beb72339d9d4fa36522fc63802f469b13cdbe4fdab4a288f0c441b74272ebfd", size = 6244532, upload-time = "2025-05-17T21:43:46.099Z" }, + { url = "https://files.pythonhosted.org/packages/cb/3b/d58c12eafcb298d4e6d0d40216866ab15f59e55d148a5658bb3132311fcf/numpy-2.2.6-cp313-cp313-win_amd64.whl", hash = "sha256:b0544343a702fa80c95ad5d3d608ea3599dd54d4632df855e4c8d24eb6ecfa1c", size = 12610885, upload-time = "2025-05-17T21:44:05.145Z" }, + { url = "https://files.pythonhosted.org/packages/6b/9e/4bf918b818e516322db999ac25d00c75788ddfd2d2ade4fa66f1f38097e1/numpy-2.2.6-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:0bca768cd85ae743b2affdc762d617eddf3bcf8724435498a1e80132d04879e6", size = 20963467, upload-time = "2025-05-17T21:40:44Z" }, + { url = "https://files.pythonhosted.org/packages/61/66/d2de6b291507517ff2e438e13ff7b1e2cdbdb7cb40b3ed475377aece69f9/numpy-2.2.6-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:fc0c5673685c508a142ca65209b4e79ed6740a4ed6b2267dbba90f34b0b3cfda", size = 14225144, upload-time = "2025-05-17T21:41:05.695Z" }, + { url = "https://files.pythonhosted.org/packages/e4/25/480387655407ead912e28ba3a820bc69af9adf13bcbe40b299d454ec011f/numpy-2.2.6-cp313-cp313t-macosx_14_0_arm64.whl", hash = "sha256:5bd4fc3ac8926b3819797a7c0e2631eb889b4118a9898c84f585a54d475b7e40", size = 5200217, upload-time = "2025-05-17T21:41:15.903Z" }, + { url = "https://files.pythonhosted.org/packages/aa/4a/6e313b5108f53dcbf3aca0c0f3e9c92f4c10ce57a0a721851f9785872895/numpy-2.2.6-cp313-cp313t-macosx_14_0_x86_64.whl", hash = "sha256:fee4236c876c4e8369388054d02d0e9bb84821feb1a64dd59e137e6511a551f8", size = 6712014, upload-time = "2025-05-17T21:41:27.321Z" }, + { url = "https://files.pythonhosted.org/packages/b7/30/172c2d5c4be71fdf476e9de553443cf8e25feddbe185e0bd88b096915bcc/numpy-2.2.6-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e1dda9c7e08dc141e0247a5b8f49cf05984955246a327d4c48bda16821947b2f", size = 14077935, upload-time = "2025-05-17T21:41:49.738Z" }, + { url = "https://files.pythonhosted.org/packages/12/fb/9e743f8d4e4d3c710902cf87af3512082ae3d43b945d5d16563f26ec251d/numpy-2.2.6-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f447e6acb680fd307f40d3da4852208af94afdfab89cf850986c3ca00562f4fa", size = 16600122, upload-time = "2025-05-17T21:42:14.046Z" }, + { url = "https://files.pythonhosted.org/packages/12/75/ee20da0e58d3a66f204f38916757e01e33a9737d0b22373b3eb5a27358f9/numpy-2.2.6-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:389d771b1623ec92636b0786bc4ae56abafad4a4c513d36a55dce14bd9ce8571", size = 15586143, upload-time = "2025-05-17T21:42:37.464Z" }, + { url = "https://files.pythonhosted.org/packages/76/95/bef5b37f29fc5e739947e9ce5179ad402875633308504a52d188302319c8/numpy-2.2.6-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:8e9ace4a37db23421249ed236fdcdd457d671e25146786dfc96835cd951aa7c1", size = 18385260, upload-time = "2025-05-17T21:43:05.189Z" }, + { url = "https://files.pythonhosted.org/packages/09/04/f2f83279d287407cf36a7a8053a5abe7be3622a4363337338f2585e4afda/numpy-2.2.6-cp313-cp313t-win32.whl", hash = "sha256:038613e9fb8c72b0a41f025a7e4c3f0b7a1b5d768ece4796b674c8f3fe13efff", size = 6377225, upload-time = "2025-05-17T21:43:16.254Z" }, + { url = "https://files.pythonhosted.org/packages/67/0e/35082d13c09c02c011cf21570543d202ad929d961c02a147493cb0c2bdf5/numpy-2.2.6-cp313-cp313t-win_amd64.whl", hash = "sha256:6031dd6dfecc0cf9f668681a37648373bddd6421fff6c66ec1624eed0180ee06", size = 12771374, upload-time = "2025-05-17T21:43:35.479Z" }, + { url = "https://files.pythonhosted.org/packages/9e/3b/d94a75f4dbf1ef5d321523ecac21ef23a3cd2ac8b78ae2aac40873590229/numpy-2.2.6-pp310-pypy310_pp73-macosx_10_15_x86_64.whl", hash = "sha256:0b605b275d7bd0c640cad4e5d30fa701a8d59302e127e5f79138ad62762c3e3d", size = 21040391, upload-time = "2025-05-17T21:44:35.948Z" }, + { url = "https://files.pythonhosted.org/packages/17/f4/09b2fa1b58f0fb4f7c7963a1649c64c4d315752240377ed74d9cd878f7b5/numpy-2.2.6-pp310-pypy310_pp73-macosx_14_0_x86_64.whl", hash = "sha256:7befc596a7dc9da8a337f79802ee8adb30a552a94f792b9c9d18c840055907db", size = 6786754, upload-time = "2025-05-17T21:44:47.446Z" }, + { url = "https://files.pythonhosted.org/packages/af/30/feba75f143bdc868a1cc3f44ccfa6c4b9ec522b36458e738cd00f67b573f/numpy-2.2.6-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ce47521a4754c8f4593837384bd3424880629f718d87c5d44f8ed763edd63543", size = 16643476, upload-time = "2025-05-17T21:45:11.871Z" }, + { url = "https://files.pythonhosted.org/packages/37/48/ac2a9584402fb6c0cd5b5d1a91dcf176b15760130dd386bbafdbfe3640bf/numpy-2.2.6-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:d042d24c90c41b54fd506da306759e06e568864df8ec17ccc17e9e884634fd00", size = 12812666, upload-time = "2025-05-17T21:45:31.426Z" }, +] + +[[package]] +name = "numpy" +version = "2.3.3" +source = { registry = "https://pypi.org/simple" } +resolution-markers = [ + "python_full_version >= '3.12'", + "python_full_version == '3.11.*'", +] +sdist = { url = "https://files.pythonhosted.org/packages/d0/19/95b3d357407220ed24c139018d2518fab0a61a948e68286a25f1a4d049ff/numpy-2.3.3.tar.gz", hash = "sha256:ddc7c39727ba62b80dfdbedf400d1c10ddfa8eefbd7ec8dcb118be8b56d31029", size = 20576648, upload-time = "2025-09-09T16:54:12.543Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/7a/45/e80d203ef6b267aa29b22714fb558930b27960a0c5ce3c19c999232bb3eb/numpy-2.3.3-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:0ffc4f5caba7dfcbe944ed674b7eef683c7e94874046454bb79ed7ee0236f59d", size = 21259253, upload-time = "2025-09-09T15:56:02.094Z" }, + { url = "https://files.pythonhosted.org/packages/52/18/cf2c648fccf339e59302e00e5f2bc87725a3ce1992f30f3f78c9044d7c43/numpy-2.3.3-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:e7e946c7170858a0295f79a60214424caac2ffdb0063d4d79cb681f9aa0aa569", size = 14450980, upload-time = "2025-09-09T15:56:05.926Z" }, + { url = "https://files.pythonhosted.org/packages/93/fb/9af1082bec870188c42a1c239839915b74a5099c392389ff04215dcee812/numpy-2.3.3-cp311-cp311-macosx_14_0_arm64.whl", hash = "sha256:cd4260f64bc794c3390a63bf0728220dd1a68170c169088a1e0dfa2fde1be12f", size = 5379709, upload-time = "2025-09-09T15:56:07.95Z" }, + { url = "https://files.pythonhosted.org/packages/75/0f/bfd7abca52bcbf9a4a65abc83fe18ef01ccdeb37bfb28bbd6ad613447c79/numpy-2.3.3-cp311-cp311-macosx_14_0_x86_64.whl", hash = "sha256:f0ddb4b96a87b6728df9362135e764eac3cfa674499943ebc44ce96c478ab125", size = 6913923, upload-time = "2025-09-09T15:56:09.443Z" }, + { url = "https://files.pythonhosted.org/packages/79/55/d69adad255e87ab7afda1caf93ca997859092afeb697703e2f010f7c2e55/numpy-2.3.3-cp311-cp311-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:afd07d377f478344ec6ca2b8d4ca08ae8bd44706763d1efb56397de606393f48", size = 14589591, upload-time = "2025-09-09T15:56:11.234Z" }, + { url = "https://files.pythonhosted.org/packages/10/a2/010b0e27ddeacab7839957d7a8f00e91206e0c2c47abbb5f35a2630e5387/numpy-2.3.3-cp311-cp311-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:bc92a5dedcc53857249ca51ef29f5e5f2f8c513e22cfb90faeb20343b8c6f7a6", size = 16938714, upload-time = "2025-09-09T15:56:14.637Z" }, + { url = "https://files.pythonhosted.org/packages/1c/6b/12ce8ede632c7126eb2762b9e15e18e204b81725b81f35176eac14dc5b82/numpy-2.3.3-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:7af05ed4dc19f308e1d9fc759f36f21921eb7bbfc82843eeec6b2a2863a0aefa", size = 16370592, upload-time = "2025-09-09T15:56:17.285Z" }, + { url = "https://files.pythonhosted.org/packages/b4/35/aba8568b2593067bb6a8fe4c52babb23b4c3b9c80e1b49dff03a09925e4a/numpy-2.3.3-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:433bf137e338677cebdd5beac0199ac84712ad9d630b74eceeb759eaa45ddf30", size = 18884474, upload-time = "2025-09-09T15:56:20.943Z" }, + { url = "https://files.pythonhosted.org/packages/45/fa/7f43ba10c77575e8be7b0138d107e4f44ca4a1ef322cd16980ea3e8b8222/numpy-2.3.3-cp311-cp311-win32.whl", hash = "sha256:eb63d443d7b4ffd1e873f8155260d7f58e7e4b095961b01c91062935c2491e57", size = 6599794, upload-time = "2025-09-09T15:56:23.258Z" }, + { url = "https://files.pythonhosted.org/packages/0a/a2/a4f78cb2241fe5664a22a10332f2be886dcdea8784c9f6a01c272da9b426/numpy-2.3.3-cp311-cp311-win_amd64.whl", hash = "sha256:ec9d249840f6a565f58d8f913bccac2444235025bbb13e9a4681783572ee3caa", size = 13088104, upload-time = "2025-09-09T15:56:25.476Z" }, + { url = "https://files.pythonhosted.org/packages/79/64/e424e975adbd38282ebcd4891661965b78783de893b381cbc4832fb9beb2/numpy-2.3.3-cp311-cp311-win_arm64.whl", hash = "sha256:74c2a948d02f88c11a3c075d9733f1ae67d97c6bdb97f2bb542f980458b257e7", size = 10460772, upload-time = "2025-09-09T15:56:27.679Z" }, + { url = "https://files.pythonhosted.org/packages/51/5d/bb7fc075b762c96329147799e1bcc9176ab07ca6375ea976c475482ad5b3/numpy-2.3.3-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:cfdd09f9c84a1a934cde1eec2267f0a43a7cd44b2cca4ff95b7c0d14d144b0bf", size = 20957014, upload-time = "2025-09-09T15:56:29.966Z" }, + { url = "https://files.pythonhosted.org/packages/6b/0e/c6211bb92af26517acd52125a237a92afe9c3124c6a68d3b9f81b62a0568/numpy-2.3.3-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:cb32e3cf0f762aee47ad1ddc6672988f7f27045b0783c887190545baba73aa25", size = 14185220, upload-time = "2025-09-09T15:56:32.175Z" }, + { url = "https://files.pythonhosted.org/packages/22/f2/07bb754eb2ede9073f4054f7c0286b0d9d2e23982e090a80d478b26d35ca/numpy-2.3.3-cp312-cp312-macosx_14_0_arm64.whl", hash = "sha256:396b254daeb0a57b1fe0ecb5e3cff6fa79a380fa97c8f7781a6d08cd429418fe", size = 5113918, upload-time = "2025-09-09T15:56:34.175Z" }, + { url = "https://files.pythonhosted.org/packages/81/0a/afa51697e9fb74642f231ea36aca80fa17c8fb89f7a82abd5174023c3960/numpy-2.3.3-cp312-cp312-macosx_14_0_x86_64.whl", hash = "sha256:067e3d7159a5d8f8a0b46ee11148fc35ca9b21f61e3c49fbd0a027450e65a33b", size = 6647922, upload-time = "2025-09-09T15:56:36.149Z" }, + { url = "https://files.pythonhosted.org/packages/5d/f5/122d9cdb3f51c520d150fef6e87df9279e33d19a9611a87c0d2cf78a89f4/numpy-2.3.3-cp312-cp312-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:1c02d0629d25d426585fb2e45a66154081b9fa677bc92a881ff1d216bc9919a8", size = 14281991, upload-time = "2025-09-09T15:56:40.548Z" }, + { url = "https://files.pythonhosted.org/packages/51/64/7de3c91e821a2debf77c92962ea3fe6ac2bc45d0778c1cbe15d4fce2fd94/numpy-2.3.3-cp312-cp312-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:d9192da52b9745f7f0766531dcfa978b7763916f158bb63bdb8a1eca0068ab20", size = 16641643, upload-time = "2025-09-09T15:56:43.343Z" }, + { url = "https://files.pythonhosted.org/packages/30/e4/961a5fa681502cd0d68907818b69f67542695b74e3ceaa513918103b7e80/numpy-2.3.3-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:cd7de500a5b66319db419dc3c345244404a164beae0d0937283b907d8152e6ea", size = 16056787, upload-time = "2025-09-09T15:56:46.141Z" }, + { url = "https://files.pythonhosted.org/packages/99/26/92c912b966e47fbbdf2ad556cb17e3a3088e2e1292b9833be1dfa5361a1a/numpy-2.3.3-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:93d4962d8f82af58f0b2eb85daaf1b3ca23fe0a85d0be8f1f2b7bb46034e56d7", size = 18579598, upload-time = "2025-09-09T15:56:49.844Z" }, + { url = "https://files.pythonhosted.org/packages/17/b6/fc8f82cb3520768718834f310c37d96380d9dc61bfdaf05fe5c0b7653e01/numpy-2.3.3-cp312-cp312-win32.whl", hash = "sha256:5534ed6b92f9b7dca6c0a19d6df12d41c68b991cef051d108f6dbff3babc4ebf", size = 6320800, upload-time = "2025-09-09T15:56:52.499Z" }, + { url = "https://files.pythonhosted.org/packages/32/ee/de999f2625b80d043d6d2d628c07d0d5555a677a3cf78fdf868d409b8766/numpy-2.3.3-cp312-cp312-win_amd64.whl", hash = "sha256:497d7cad08e7092dba36e3d296fe4c97708c93daf26643a1ae4b03f6294d30eb", size = 12786615, upload-time = "2025-09-09T15:56:54.422Z" }, + { url = "https://files.pythonhosted.org/packages/49/6e/b479032f8a43559c383acb20816644f5f91c88f633d9271ee84f3b3a996c/numpy-2.3.3-cp312-cp312-win_arm64.whl", hash = "sha256:ca0309a18d4dfea6fc6262a66d06c26cfe4640c3926ceec90e57791a82b6eee5", size = 10195936, upload-time = "2025-09-09T15:56:56.541Z" }, + { url = "https://files.pythonhosted.org/packages/7d/b9/984c2b1ee61a8b803bf63582b4ac4242cf76e2dbd663efeafcb620cc0ccb/numpy-2.3.3-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:f5415fb78995644253370985342cd03572ef8620b934da27d77377a2285955bf", size = 20949588, upload-time = "2025-09-09T15:56:59.087Z" }, + { url = "https://files.pythonhosted.org/packages/a6/e4/07970e3bed0b1384d22af1e9912527ecbeb47d3b26e9b6a3bced068b3bea/numpy-2.3.3-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:d00de139a3324e26ed5b95870ce63be7ec7352171bc69a4cf1f157a48e3eb6b7", size = 14177802, upload-time = "2025-09-09T15:57:01.73Z" }, + { url = "https://files.pythonhosted.org/packages/35/c7/477a83887f9de61f1203bad89cf208b7c19cc9fef0cebef65d5a1a0619f2/numpy-2.3.3-cp313-cp313-macosx_14_0_arm64.whl", hash = "sha256:9dc13c6a5829610cc07422bc74d3ac083bd8323f14e2827d992f9e52e22cd6a6", size = 5106537, upload-time = "2025-09-09T15:57:03.765Z" }, + { url = "https://files.pythonhosted.org/packages/52/47/93b953bd5866a6f6986344d045a207d3f1cfbad99db29f534ea9cee5108c/numpy-2.3.3-cp313-cp313-macosx_14_0_x86_64.whl", hash = "sha256:d79715d95f1894771eb4e60fb23f065663b2298f7d22945d66877aadf33d00c7", size = 6640743, upload-time = "2025-09-09T15:57:07.921Z" }, + { url = "https://files.pythonhosted.org/packages/23/83/377f84aaeb800b64c0ef4de58b08769e782edcefa4fea712910b6f0afd3c/numpy-2.3.3-cp313-cp313-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:952cfd0748514ea7c3afc729a0fc639e61655ce4c55ab9acfab14bda4f402b4c", size = 14278881, upload-time = "2025-09-09T15:57:11.349Z" }, + { url = "https://files.pythonhosted.org/packages/9a/a5/bf3db6e66c4b160d6ea10b534c381a1955dfab34cb1017ea93aa33c70ed3/numpy-2.3.3-cp313-cp313-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:5b83648633d46f77039c29078751f80da65aa64d5622a3cd62aaef9d835b6c93", size = 16636301, upload-time = "2025-09-09T15:57:14.245Z" }, + { url = "https://files.pythonhosted.org/packages/a2/59/1287924242eb4fa3f9b3a2c30400f2e17eb2707020d1c5e3086fe7330717/numpy-2.3.3-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:b001bae8cea1c7dfdb2ae2b017ed0a6f2102d7a70059df1e338e307a4c78a8ae", size = 16053645, upload-time = "2025-09-09T15:57:16.534Z" }, + { url = "https://files.pythonhosted.org/packages/e6/93/b3d47ed882027c35e94ac2320c37e452a549f582a5e801f2d34b56973c97/numpy-2.3.3-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:8e9aced64054739037d42fb84c54dd38b81ee238816c948c8f3ed134665dcd86", size = 18578179, upload-time = "2025-09-09T15:57:18.883Z" }, + { url = "https://files.pythonhosted.org/packages/20/d9/487a2bccbf7cc9d4bfc5f0f197761a5ef27ba870f1e3bbb9afc4bbe3fcc2/numpy-2.3.3-cp313-cp313-win32.whl", hash = "sha256:9591e1221db3f37751e6442850429b3aabf7026d3b05542d102944ca7f00c8a8", size = 6312250, upload-time = "2025-09-09T15:57:21.296Z" }, + { url = "https://files.pythonhosted.org/packages/1b/b5/263ebbbbcede85028f30047eab3d58028d7ebe389d6493fc95ae66c636ab/numpy-2.3.3-cp313-cp313-win_amd64.whl", hash = "sha256:f0dadeb302887f07431910f67a14d57209ed91130be0adea2f9793f1a4f817cf", size = 12783269, upload-time = "2025-09-09T15:57:23.034Z" }, + { url = "https://files.pythonhosted.org/packages/fa/75/67b8ca554bbeaaeb3fac2e8bce46967a5a06544c9108ec0cf5cece559b6c/numpy-2.3.3-cp313-cp313-win_arm64.whl", hash = "sha256:3c7cf302ac6e0b76a64c4aecf1a09e51abd9b01fc7feee80f6c43e3ab1b1dbc5", size = 10195314, upload-time = "2025-09-09T15:57:25.045Z" }, + { url = "https://files.pythonhosted.org/packages/11/d0/0d1ddec56b162042ddfafeeb293bac672de9b0cfd688383590090963720a/numpy-2.3.3-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:eda59e44957d272846bb407aad19f89dc6f58fecf3504bd144f4c5cf81a7eacc", size = 21048025, upload-time = "2025-09-09T15:57:27.257Z" }, + { url = "https://files.pythonhosted.org/packages/36/9e/1996ca6b6d00415b6acbdd3c42f7f03ea256e2c3f158f80bd7436a8a19f3/numpy-2.3.3-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:823d04112bc85ef5c4fda73ba24e6096c8f869931405a80aa8b0e604510a26bc", size = 14301053, upload-time = "2025-09-09T15:57:30.077Z" }, + { url = "https://files.pythonhosted.org/packages/05/24/43da09aa764c68694b76e84b3d3f0c44cb7c18cdc1ba80e48b0ac1d2cd39/numpy-2.3.3-cp313-cp313t-macosx_14_0_arm64.whl", hash = "sha256:40051003e03db4041aa325da2a0971ba41cf65714e65d296397cc0e32de6018b", size = 5229444, upload-time = "2025-09-09T15:57:32.733Z" }, + { url = "https://files.pythonhosted.org/packages/bc/14/50ffb0f22f7218ef8af28dd089f79f68289a7a05a208db9a2c5dcbe123c1/numpy-2.3.3-cp313-cp313t-macosx_14_0_x86_64.whl", hash = "sha256:6ee9086235dd6ab7ae75aba5662f582a81ced49f0f1c6de4260a78d8f2d91a19", size = 6738039, upload-time = "2025-09-09T15:57:34.328Z" }, + { url = "https://files.pythonhosted.org/packages/55/52/af46ac0795e09657d45a7f4db961917314377edecf66db0e39fa7ab5c3d3/numpy-2.3.3-cp313-cp313t-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:94fcaa68757c3e2e668ddadeaa86ab05499a70725811e582b6a9858dd472fb30", size = 14352314, upload-time = "2025-09-09T15:57:36.255Z" }, + { url = "https://files.pythonhosted.org/packages/a7/b1/dc226b4c90eb9f07a3fff95c2f0db3268e2e54e5cce97c4ac91518aee71b/numpy-2.3.3-cp313-cp313t-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:da1a74b90e7483d6ce5244053399a614b1d6b7bc30a60d2f570e5071f8959d3e", size = 16701722, upload-time = "2025-09-09T15:57:38.622Z" }, + { url = "https://files.pythonhosted.org/packages/9d/9d/9d8d358f2eb5eced14dba99f110d83b5cd9a4460895230f3b396ad19a323/numpy-2.3.3-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:2990adf06d1ecee3b3dcbb4977dfab6e9f09807598d647f04d385d29e7a3c3d3", size = 16132755, upload-time = "2025-09-09T15:57:41.16Z" }, + { url = "https://files.pythonhosted.org/packages/b6/27/b3922660c45513f9377b3fb42240bec63f203c71416093476ec9aa0719dc/numpy-2.3.3-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:ed635ff692483b8e3f0fcaa8e7eb8a75ee71aa6d975388224f70821421800cea", size = 18651560, upload-time = "2025-09-09T15:57:43.459Z" }, + { url = "https://files.pythonhosted.org/packages/5b/8e/3ab61a730bdbbc201bb245a71102aa609f0008b9ed15255500a99cd7f780/numpy-2.3.3-cp313-cp313t-win32.whl", hash = "sha256:a333b4ed33d8dc2b373cc955ca57babc00cd6f9009991d9edc5ddbc1bac36bcd", size = 6442776, upload-time = "2025-09-09T15:57:45.793Z" }, + { url = "https://files.pythonhosted.org/packages/1c/3a/e22b766b11f6030dc2decdeff5c2fb1610768055603f9f3be88b6d192fb2/numpy-2.3.3-cp313-cp313t-win_amd64.whl", hash = "sha256:4384a169c4d8f97195980815d6fcad04933a7e1ab3b530921c3fef7a1c63426d", size = 12927281, upload-time = "2025-09-09T15:57:47.492Z" }, + { url = "https://files.pythonhosted.org/packages/7b/42/c2e2bc48c5e9b2a83423f99733950fbefd86f165b468a3d85d52b30bf782/numpy-2.3.3-cp313-cp313t-win_arm64.whl", hash = "sha256:75370986cc0bc66f4ce5110ad35aae6d182cc4ce6433c40ad151f53690130bf1", size = 10265275, upload-time = "2025-09-09T15:57:49.647Z" }, + { url = "https://files.pythonhosted.org/packages/6b/01/342ad585ad82419b99bcf7cebe99e61da6bedb89e213c5fd71acc467faee/numpy-2.3.3-cp314-cp314-macosx_10_13_x86_64.whl", hash = "sha256:cd052f1fa6a78dee696b58a914b7229ecfa41f0a6d96dc663c1220a55e137593", size = 20951527, upload-time = "2025-09-09T15:57:52.006Z" }, + { url = "https://files.pythonhosted.org/packages/ef/d8/204e0d73fc1b7a9ee80ab1fe1983dd33a4d64a4e30a05364b0208e9a241a/numpy-2.3.3-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:414a97499480067d305fcac9716c29cf4d0d76db6ebf0bf3cbce666677f12652", size = 14186159, upload-time = "2025-09-09T15:57:54.407Z" }, + { url = "https://files.pythonhosted.org/packages/22/af/f11c916d08f3a18fb8ba81ab72b5b74a6e42ead4c2846d270eb19845bf74/numpy-2.3.3-cp314-cp314-macosx_14_0_arm64.whl", hash = "sha256:50a5fe69f135f88a2be9b6ca0481a68a136f6febe1916e4920e12f1a34e708a7", size = 5114624, upload-time = "2025-09-09T15:57:56.5Z" }, + { url = "https://files.pythonhosted.org/packages/fb/11/0ed919c8381ac9d2ffacd63fd1f0c34d27e99cab650f0eb6f110e6ae4858/numpy-2.3.3-cp314-cp314-macosx_14_0_x86_64.whl", hash = "sha256:b912f2ed2b67a129e6a601e9d93d4fa37bef67e54cac442a2f588a54afe5c67a", size = 6642627, upload-time = "2025-09-09T15:57:58.206Z" }, + { url = "https://files.pythonhosted.org/packages/ee/83/deb5f77cb0f7ba6cb52b91ed388b47f8f3c2e9930d4665c600408d9b90b9/numpy-2.3.3-cp314-cp314-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:9e318ee0596d76d4cb3d78535dc005fa60e5ea348cd131a51e99d0bdbe0b54fe", size = 14296926, upload-time = "2025-09-09T15:58:00.035Z" }, + { url = "https://files.pythonhosted.org/packages/77/cc/70e59dcb84f2b005d4f306310ff0a892518cc0c8000a33d0e6faf7ca8d80/numpy-2.3.3-cp314-cp314-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:ce020080e4a52426202bdb6f7691c65bb55e49f261f31a8f506c9f6bc7450421", size = 16638958, upload-time = "2025-09-09T15:58:02.738Z" }, + { url = "https://files.pythonhosted.org/packages/b6/5a/b2ab6c18b4257e099587d5b7f903317bd7115333ad8d4ec4874278eafa61/numpy-2.3.3-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:e6687dc183aa55dae4a705b35f9c0f8cb178bcaa2f029b241ac5356221d5c021", size = 16071920, upload-time = "2025-09-09T15:58:05.029Z" }, + { url = "https://files.pythonhosted.org/packages/b8/f1/8b3fdc44324a259298520dd82147ff648979bed085feeacc1250ef1656c0/numpy-2.3.3-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:d8f3b1080782469fdc1718c4ed1d22549b5fb12af0d57d35e992158a772a37cf", size = 18577076, upload-time = "2025-09-09T15:58:07.745Z" }, + { url = "https://files.pythonhosted.org/packages/f0/a1/b87a284fb15a42e9274e7fcea0dad259d12ddbf07c1595b26883151ca3b4/numpy-2.3.3-cp314-cp314-win32.whl", hash = "sha256:cb248499b0bc3be66ebd6578b83e5acacf1d6cb2a77f2248ce0e40fbec5a76d0", size = 6366952, upload-time = "2025-09-09T15:58:10.096Z" }, + { url = "https://files.pythonhosted.org/packages/70/5f/1816f4d08f3b8f66576d8433a66f8fa35a5acfb3bbd0bf6c31183b003f3d/numpy-2.3.3-cp314-cp314-win_amd64.whl", hash = "sha256:691808c2b26b0f002a032c73255d0bd89751425f379f7bcd22d140db593a96e8", size = 12919322, upload-time = "2025-09-09T15:58:12.138Z" }, + { url = "https://files.pythonhosted.org/packages/8c/de/072420342e46a8ea41c324a555fa90fcc11637583fb8df722936aed1736d/numpy-2.3.3-cp314-cp314-win_arm64.whl", hash = "sha256:9ad12e976ca7b10f1774b03615a2a4bab8addce37ecc77394d8e986927dc0dfe", size = 10478630, upload-time = "2025-09-09T15:58:14.64Z" }, + { url = "https://files.pythonhosted.org/packages/d5/df/ee2f1c0a9de7347f14da5dd3cd3c3b034d1b8607ccb6883d7dd5c035d631/numpy-2.3.3-cp314-cp314t-macosx_10_13_x86_64.whl", hash = "sha256:9cc48e09feb11e1db00b320e9d30a4151f7369afb96bd0e48d942d09da3a0d00", size = 21047987, upload-time = "2025-09-09T15:58:16.889Z" }, + { url = "https://files.pythonhosted.org/packages/d6/92/9453bdc5a4e9e69cf4358463f25e8260e2ffc126d52e10038b9077815989/numpy-2.3.3-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:901bf6123879b7f251d3631967fd574690734236075082078e0571977c6a8e6a", size = 14301076, upload-time = "2025-09-09T15:58:20.343Z" }, + { url = "https://files.pythonhosted.org/packages/13/77/1447b9eb500f028bb44253105bd67534af60499588a5149a94f18f2ca917/numpy-2.3.3-cp314-cp314t-macosx_14_0_arm64.whl", hash = "sha256:7f025652034199c301049296b59fa7d52c7e625017cae4c75d8662e377bf487d", size = 5229491, upload-time = "2025-09-09T15:58:22.481Z" }, + { url = "https://files.pythonhosted.org/packages/3d/f9/d72221b6ca205f9736cb4b2ce3b002f6e45cd67cd6a6d1c8af11a2f0b649/numpy-2.3.3-cp314-cp314t-macosx_14_0_x86_64.whl", hash = "sha256:533ca5f6d325c80b6007d4d7fb1984c303553534191024ec6a524a4c92a5935a", size = 6737913, upload-time = "2025-09-09T15:58:24.569Z" }, + { url = "https://files.pythonhosted.org/packages/3c/5f/d12834711962ad9c46af72f79bb31e73e416ee49d17f4c797f72c96b6ca5/numpy-2.3.3-cp314-cp314t-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:0edd58682a399824633b66885d699d7de982800053acf20be1eaa46d92009c54", size = 14352811, upload-time = "2025-09-09T15:58:26.416Z" }, + { url = "https://files.pythonhosted.org/packages/a1/0d/fdbec6629d97fd1bebed56cd742884e4eead593611bbe1abc3eb40d304b2/numpy-2.3.3-cp314-cp314t-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:367ad5d8fbec5d9296d18478804a530f1191e24ab4d75ab408346ae88045d25e", size = 16702689, upload-time = "2025-09-09T15:58:28.831Z" }, + { url = "https://files.pythonhosted.org/packages/9b/09/0a35196dc5575adde1eb97ddfbc3e1687a814f905377621d18ca9bc2b7dd/numpy-2.3.3-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:8f6ac61a217437946a1fa48d24c47c91a0c4f725237871117dea264982128097", size = 16133855, upload-time = "2025-09-09T15:58:31.349Z" }, + { url = "https://files.pythonhosted.org/packages/7a/ca/c9de3ea397d576f1b6753eaa906d4cdef1bf97589a6d9825a349b4729cc2/numpy-2.3.3-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:179a42101b845a816d464b6fe9a845dfaf308fdfc7925387195570789bb2c970", size = 18652520, upload-time = "2025-09-09T15:58:33.762Z" }, + { url = "https://files.pythonhosted.org/packages/fd/c2/e5ed830e08cd0196351db55db82f65bc0ab05da6ef2b72a836dcf1936d2f/numpy-2.3.3-cp314-cp314t-win32.whl", hash = "sha256:1250c5d3d2562ec4174bce2e3a1523041595f9b651065e4a4473f5f48a6bc8a5", size = 6515371, upload-time = "2025-09-09T15:58:36.04Z" }, + { url = "https://files.pythonhosted.org/packages/47/c7/b0f6b5b67f6788a0725f744496badbb604d226bf233ba716683ebb47b570/numpy-2.3.3-cp314-cp314t-win_amd64.whl", hash = "sha256:b37a0b2e5935409daebe82c1e42274d30d9dd355852529eab91dab8dcca7419f", size = 13112576, upload-time = "2025-09-09T15:58:37.927Z" }, + { url = "https://files.pythonhosted.org/packages/06/b9/33bba5ff6fb679aa0b1f8a07e853f002a6b04b9394db3069a1270a7784ca/numpy-2.3.3-cp314-cp314t-win_arm64.whl", hash = "sha256:78c9f6560dc7e6b3990e32df7ea1a50bbd0e2a111e05209963f5ddcab7073b0b", size = 10545953, upload-time = "2025-09-09T15:58:40.576Z" }, + { url = "https://files.pythonhosted.org/packages/b8/f2/7e0a37cfced2644c9563c529f29fa28acbd0960dde32ece683aafa6f4949/numpy-2.3.3-pp311-pypy311_pp73-macosx_10_15_x86_64.whl", hash = "sha256:1e02c7159791cd481e1e6d5ddd766b62a4d5acf8df4d4d1afe35ee9c5c33a41e", size = 21131019, upload-time = "2025-09-09T15:58:42.838Z" }, + { url = "https://files.pythonhosted.org/packages/1a/7e/3291f505297ed63831135a6cc0f474da0c868a1f31b0dd9a9f03a7a0d2ed/numpy-2.3.3-pp311-pypy311_pp73-macosx_11_0_arm64.whl", hash = "sha256:dca2d0fc80b3893ae72197b39f69d55a3cd8b17ea1b50aa4c62de82419936150", size = 14376288, upload-time = "2025-09-09T15:58:45.425Z" }, + { url = "https://files.pythonhosted.org/packages/bf/4b/ae02e985bdeee73d7b5abdefeb98aef1207e96d4c0621ee0cf228ddfac3c/numpy-2.3.3-pp311-pypy311_pp73-macosx_14_0_arm64.whl", hash = "sha256:99683cbe0658f8271b333a1b1b4bb3173750ad59c0c61f5bbdc5b318918fffe3", size = 5305425, upload-time = "2025-09-09T15:58:48.6Z" }, + { url = "https://files.pythonhosted.org/packages/8b/eb/9df215d6d7250db32007941500dc51c48190be25f2401d5b2b564e467247/numpy-2.3.3-pp311-pypy311_pp73-macosx_14_0_x86_64.whl", hash = "sha256:d9d537a39cc9de668e5cd0e25affb17aec17b577c6b3ae8a3d866b479fbe88d0", size = 6819053, upload-time = "2025-09-09T15:58:50.401Z" }, + { url = "https://files.pythonhosted.org/packages/57/62/208293d7d6b2a8998a4a1f23ac758648c3c32182d4ce4346062018362e29/numpy-2.3.3-pp311-pypy311_pp73-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:8596ba2f8af5f93b01d97563832686d20206d303024777f6dfc2e7c7c3f1850e", size = 14420354, upload-time = "2025-09-09T15:58:52.704Z" }, + { url = "https://files.pythonhosted.org/packages/ed/0c/8e86e0ff7072e14a71b4c6af63175e40d1e7e933ce9b9e9f765a95b4e0c3/numpy-2.3.3-pp311-pypy311_pp73-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:e1ec5615b05369925bd1125f27df33f3b6c8bc10d788d5999ecd8769a1fa04db", size = 16760413, upload-time = "2025-09-09T15:58:55.027Z" }, + { url = "https://files.pythonhosted.org/packages/af/11/0cc63f9f321ccf63886ac203336777140011fb669e739da36d8db3c53b98/numpy-2.3.3-pp311-pypy311_pp73-win_amd64.whl", hash = "sha256:2e267c7da5bf7309670523896df97f93f6e469fb931161f483cd6882b3b1a5dc", size = 12971844, upload-time = "2025-09-09T15:58:57.359Z" }, +] + +[[package]] +name = "packaging" +version = "24.0" +source = { registry = "https://pypi.org/simple" } +resolution-markers = [ + "python_full_version < '3.8'", +] +sdist = { url = "https://files.pythonhosted.org/packages/ee/b5/b43a27ac7472e1818c4bafd44430e69605baefe1f34440593e0332ec8b4d/packaging-24.0.tar.gz", hash = "sha256:eb82c5e3e56209074766e6885bb04b8c38a0c015d0a30036ebe7ece34c9989e9", size = 147882, upload-time = "2024-03-10T09:39:28.33Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/49/df/1fceb2f8900f8639e278b056416d49134fb8d84c5942ffaa01ad34782422/packaging-24.0-py3-none-any.whl", hash = "sha256:2ddfb553fdf02fb784c234c7ba6ccc288296ceabec964ad2eae3777778130bc5", size = 53488, upload-time = "2024-03-10T09:39:25.947Z" }, +] + +[[package]] +name = "packaging" +version = "25.0" +source = { registry = "https://pypi.org/simple" } +resolution-markers = [ + "python_full_version >= '3.12'", + "python_full_version == '3.11.*'", + "python_full_version == '3.10.*'", + "python_full_version == '3.9.*'", + "python_full_version >= '3.8.1' and python_full_version < '3.9'", + "python_full_version >= '3.8' and python_full_version < '3.8.1'", +] +sdist = { url = "https://files.pythonhosted.org/packages/a1/d4/1fc4078c65507b51b96ca8f8c3ba19e6a61c8253c72794544580a7b6c24d/packaging-25.0.tar.gz", hash = "sha256:d443872c98d677bf60f6a1f2f8c1cb748e8fe762d2bf9d3148b5599295b0fc4f", size = 165727, upload-time = "2025-04-19T11:48:59.673Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/20/12/38679034af332785aac8774540895e234f4d07f7545804097de4b666afd8/packaging-25.0-py3-none-any.whl", hash = "sha256:29572ef2b1f17581046b3a2227d5c611fb25ec70ca1ba8554b24b0e69331a484", size = 66469, upload-time = "2025-04-19T11:48:57.875Z" }, +] + +[[package]] +name = "pluggy" +version = "0.13.1" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "importlib-metadata", marker = "python_full_version < '3.8'" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/f8/04/7a8542bed4b16a65c2714bf76cf5a0b026157da7f75e87cc88774aa10b14/pluggy-0.13.1.tar.gz", hash = "sha256:15b2acde666561e1298d71b523007ed7364de07029219b604cf808bfa1c765b0", size = 57962, upload-time = "2019-11-21T20:42:37.118Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/a0/28/85c7aa31b80d150b772fbe4a229487bc6644da9ccb7e427dd8cc60cb8a62/pluggy-0.13.1-py2.py3-none-any.whl", hash = "sha256:966c145cd83c96502c3c3868f50408687b38434af77734af1e9ca461a4081d2d", size = 18077, upload-time = "2019-11-21T20:42:34.957Z" }, +] + +[[package]] +name = "prettytable" +version = "3.7.0" +source = { registry = "https://pypi.org/simple" } +resolution-markers = [ + "python_full_version < '3.8'", +] +dependencies = [ + { name = "importlib-metadata", marker = "python_full_version < '3.8'" }, + { name = "wcwidth", marker = "python_full_version < '3.8'" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/95/8d/f6b4448e386eb1382a99cbceabe3899f3aa431992582cc90496843548303/prettytable-3.7.0.tar.gz", hash = "sha256:ef8334ee40b7ec721651fc4d37ecc7bb2ef55fde5098d994438f0dfdaa385c0c", size = 47169, upload-time = "2023-04-11T03:32:11.695Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/7a/cd/bec5850e23eb005c6fe30fe4c26bafd9a07b3d2524771f22a0fa01270078/prettytable-3.7.0-py3-none-any.whl", hash = "sha256:f4aaf2ed6e6062a82fd2e6e5289bbbe705ec2788fe401a3a1f62a1cea55526d2", size = 27508, upload-time = "2023-04-10T09:05:16.908Z" }, +] + +[[package]] +name = "prettytable" +version = "3.11.0" +source = { registry = "https://pypi.org/simple" } +resolution-markers = [ + "python_full_version >= '3.8.1' and python_full_version < '3.9'", + "python_full_version >= '3.8' and python_full_version < '3.8.1'", +] +dependencies = [ + { name = "wcwidth", marker = "python_full_version == '3.8.*'" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/28/57/0a642bec16d5736b9baaac7e830bedccd10341dc2858075c34d5aec5c8b6/prettytable-3.11.0.tar.gz", hash = "sha256:7e23ca1e68bbfd06ba8de98bf553bf3493264c96d5e8a615c0471025deeba722", size = 57527, upload-time = "2024-08-12T13:29:59.315Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/d9/5a/bfdc26c0e19156992b1dc9de47f0b2e8992fe43db9981d814f860bdce2b3/prettytable-3.11.0-py3-none-any.whl", hash = "sha256:aa17083feb6c71da11a68b2c213b04675c4af4ce9c541762632ca3f2cb3546dd", size = 28734, upload-time = "2024-08-12T13:29:31.981Z" }, +] + +[[package]] +name = "prettytable" +version = "3.16.0" +source = { registry = "https://pypi.org/simple" } +resolution-markers = [ + "python_full_version >= '3.12'", + "python_full_version == '3.11.*'", + "python_full_version == '3.10.*'", + "python_full_version == '3.9.*'", +] +dependencies = [ + { name = "wcwidth", marker = "python_full_version >= '3.9'" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/99/b1/85e18ac92afd08c533603e3393977b6bc1443043115a47bb094f3b98f94f/prettytable-3.16.0.tar.gz", hash = "sha256:3c64b31719d961bf69c9a7e03d0c1e477320906a98da63952bc6698d6164ff57", size = 66276, upload-time = "2025-03-24T19:39:04.008Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/02/c7/5613524e606ea1688b3bdbf48aa64bafb6d0a4ac3750274c43b6158a390f/prettytable-3.16.0-py3-none-any.whl", hash = "sha256:b5eccfabb82222f5aa46b798ff02a8452cf530a352c31bddfa29be41242863aa", size = 33863, upload-time = "2025-03-24T19:39:02.359Z" }, +] + +[[package]] +name = "py" +version = "1.11.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/98/ff/fec109ceb715d2a6b4c4a85a61af3b40c723a961e8828319fbcb15b868dc/py-1.11.0.tar.gz", hash = "sha256:51c75c4126074b472f746a24399ad32f6053d1b34b68d2fa41e558e6f4a98719", size = 207796, upload-time = "2021-11-04T17:17:01.377Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/f6/f0/10642828a8dfb741e5f3fbaac830550a518a775c7fff6f04a007259b0548/py-1.11.0-py2.py3-none-any.whl", hash = "sha256:607c53218732647dff4acdfcd50cb62615cedf612e72d1724fb1a0cc6405b378", size = 98708, upload-time = "2021-11-04T17:17:00.152Z" }, +] + +[[package]] +name = "pydivsufsort" +version = "0.0.14" +source = { registry = "https://pypi.org/simple" } +resolution-markers = [ + "python_full_version >= '3.8.1' and python_full_version < '3.9'", + "python_full_version >= '3.8' and python_full_version < '3.8.1'", +] +dependencies = [ + { name = "numpy", version = "1.23.5", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version == '3.8.*'" }, + { name = "wheel", marker = "python_full_version == '3.8.*'" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/88/d2/3ed374803b836883abb1e897fc4baa0125512d9093d0edc40d11912d01a4/pydivsufsort-0.0.14.tar.gz", hash = "sha256:83272e77a5740cb54de6d73d6e8480497b7628384bc1e0adc7cad905fba72d01", size = 300498, upload-time = "2024-01-27T22:18:30.422Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/9f/ae/b4d1ebbcd0b764159fada1a912501e716a8f24d752927ad56e74ab13d970/pydivsufsort-0.0.14-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:77b65dd5a9b1dd7d192e57ebee53242a2c07865d7f3708a6a9c6f3ba576269c5", size = 316338, upload-time = "2024-01-27T22:24:19.032Z" }, + { url = "https://files.pythonhosted.org/packages/35/2c/82151a9383787444809ad92f6fb1ed001c136cd83e25f21507d9df7e97b7/pydivsufsort-0.0.14-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:37495d019e6ded3bf55d4d83b2e54f05a8bd171f8740661c384f1016021bf982", size = 280333, upload-time = "2024-01-27T22:24:20.695Z" }, + { url = "https://files.pythonhosted.org/packages/16/91/3d02c49f14ac56da7790c54ace4497d382dd62605a4b7b3f280c8e42bc12/pydivsufsort-0.0.14-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:43816ec3cea58f99275c4e0420bbd3bc7306a723d8e957a278d85fbb0e745388", size = 1906101, upload-time = "2024-01-27T22:18:33.701Z" }, + { url = "https://files.pythonhosted.org/packages/19/69/20efc6dfacab0ff3d77a90734a3923e23db9bf0f6d16be9fbe93ee59085b/pydivsufsort-0.0.14-cp310-cp310-win32.whl", hash = "sha256:279f10b8b5cc1bef3bc4a8c1b114108594eb8cc32b481f89f3e1664e6da48644", size = 223463, upload-time = "2024-01-27T22:23:52.712Z" }, + { url = "https://files.pythonhosted.org/packages/c8/e7/9bdc13c3cfbc1c13cbd45f3cda297097bb29934d02d7303562ee05cafb94/pydivsufsort-0.0.14-cp310-cp310-win_amd64.whl", hash = "sha256:d7988df0a5338e821b23e95da8606f7983cacb957f4fd8cbd02f86d5cfc80d82", size = 266518, upload-time = "2024-01-27T22:22:26.889Z" }, + { url = "https://files.pythonhosted.org/packages/c4/65/76629b76f1bccfb6e5a411f0d1f25fa00a9689ed64416ee7cc902cff9501/pydivsufsort-0.0.14-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:a14520282c3d754871d3c1926dd64d02e72f0f0d3eb975db0355a3efbb372ec0", size = 315522, upload-time = "2024-01-27T22:24:21.721Z" }, + { url = "https://files.pythonhosted.org/packages/af/37/f3a39eacdaf63763dd02baf164160b1dc81af60460c2b3d217a253764bb2/pydivsufsort-0.0.14-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:3a75ed2c6b2f65c7e2ceaca4974bb474b9dd907ce79bb3ec0fd50af386f444f4", size = 279710, upload-time = "2024-01-27T22:24:22.742Z" }, + { url = "https://files.pythonhosted.org/packages/31/86/2ce81e32ee26b9ef4fb37cc4df47f3c19c4c6564ca127d1da4a5a129b454/pydivsufsort-0.0.14-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:aad177629b0502260ef49fa87c7155c520e5028e7bef13001c52c6563c335777", size = 1942796, upload-time = "2024-01-27T22:18:35.237Z" }, + { url = "https://files.pythonhosted.org/packages/41/8f/356f758bd2d49ef12be89dcc678fbd03457a17208cd250c3dc37b13f479c/pydivsufsort-0.0.14-cp311-cp311-win32.whl", hash = "sha256:cfaff98c35d74c0d15042b1d0b2fe9451f451af855cd1fbd0a93ebdafc7cef7c", size = 223709, upload-time = "2024-01-27T22:23:54.395Z" }, + { url = "https://files.pythonhosted.org/packages/a8/c0/986fccfbdb698620ed5ba829e092bcb6129565095920c8a7d3e34f98d936/pydivsufsort-0.0.14-cp311-cp311-win_amd64.whl", hash = "sha256:f85e94af3f676ecd2c9c39d4c35b2fdd0e912f68965cce641c86290d85f13ed8", size = 267760, upload-time = "2024-01-27T22:22:28.225Z" }, + { url = "https://files.pythonhosted.org/packages/96/c9/21c1c60e0ba01321097423b2661d3f4da85b3c069e8ff9620af94fa4fafe/pydivsufsort-0.0.14-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:968522a601f27a080c07d09ca80a6e880468df2a4226f1aad633a7eeb11e4b5e", size = 307312, upload-time = "2024-01-27T22:24:24.066Z" }, + { url = "https://files.pythonhosted.org/packages/cf/fc/fc7255b57ad36e7a1ae17a8772daf3928889f1ea56169adc17f11e2d24de/pydivsufsort-0.0.14-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:f7f25c5953c2f855d16d04f7814e57fef41dfa7e37cdcd0d2aa51eed37a9a9c6", size = 281513, upload-time = "2024-01-27T22:24:25.092Z" }, + { url = "https://files.pythonhosted.org/packages/11/ee/10e5b5fa6bd2c4bdb8f86a1673dfaed518930f51eed5b01a5a2c7128d15d/pydivsufsort-0.0.14-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:87bafd4ce3c8899f45500f7ddddae93a55abaf5fba5e8c2fb8ba411b69a873b4", size = 1941559, upload-time = "2024-01-27T22:18:37.188Z" }, + { url = "https://files.pythonhosted.org/packages/ee/ca/dc29cb6bced0dcb35f50d4f3f777a34d8baf501d2387e71da1f453a0bb41/pydivsufsort-0.0.14-cp312-cp312-win32.whl", hash = "sha256:6a1691d51ba869b0f29799b19cf5e9b7793e5187c89cb758945b4fa22fc518d1", size = 220561, upload-time = "2024-01-27T22:23:56.111Z" }, + { url = "https://files.pythonhosted.org/packages/04/03/7583252877d258ad3efbd72a312bb4d6e69efa6fcd8dbaa695baf563a3e5/pydivsufsort-0.0.14-cp312-cp312-win_amd64.whl", hash = "sha256:9740416f8bcd06f43c056b24368077fed488c0bb99ac90e4d0ae5f8029259177", size = 260404, upload-time = "2024-01-27T22:22:29.369Z" }, + { url = "https://files.pythonhosted.org/packages/1e/8e/2dad9d540fa450282e4f78f7c8777cf9316f922847b16f2d2f79e980890a/pydivsufsort-0.0.14-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:3a5d65a478d2e0313aca8dd9eaa0c680be11d2857b350c5685b9680d404382e2", size = 309196, upload-time = "2024-01-27T22:24:27.811Z" }, + { url = "https://files.pythonhosted.org/packages/a8/cd/1e36ce13475ed60a8d2db96d0b9d9ebc572761154b6fe21d4476a480c8b2/pydivsufsort-0.0.14-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:532a919cf428740b2adb2c4b1afd5d8b900041e2fe7fc8cc4c029daf3c1309a5", size = 1738212, upload-time = "2024-01-27T22:18:41.04Z" }, + { url = "https://files.pythonhosted.org/packages/ab/7f/ef7022cbe1e01e5a8b58bf24e0be853706f1480edc2ea6abe02c11cf0c3c/pydivsufsort-0.0.14-cp37-cp37m-win32.whl", hash = "sha256:7e7340e1681db1a256000538f0837ffbc7082a56dbc34248c85f6d7ad859c667", size = 220466, upload-time = "2024-01-27T22:23:58.754Z" }, + { url = "https://files.pythonhosted.org/packages/52/70/43f1d1fbe7b7e5e04e1a2f7fa1c50b19e2174bfffbccfb64970860662566/pydivsufsort-0.0.14-cp37-cp37m-win_amd64.whl", hash = "sha256:d6be090e1e959beeb3a94f0de2465783eae354bf032d45dc9f105ab04f5bfaa2", size = 259800, upload-time = "2024-01-27T22:22:32.625Z" }, + { url = "https://files.pythonhosted.org/packages/a2/59/6de89e1d136bd61d3c3b90db8461eee22a7b91600671b0b10b76c367a27b/pydivsufsort-0.0.14-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:e9e1ba270bb62c2595f749a9a06433c3ac0e5fd2a6faa3eb185db627c83b79b8", size = 314056, upload-time = "2024-01-27T22:24:29.078Z" }, + { url = "https://files.pythonhosted.org/packages/70/a0/6a58aa908be44b71ba2c106ffc93357fd03aaa23cf512bf53426fe2d809e/pydivsufsort-0.0.14-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:bb3baabcbdfa327959e8720c083fda07607b7b22e923f4e7e6262a8c703db236", size = 278619, upload-time = "2024-01-27T22:24:30.733Z" }, + { url = "https://files.pythonhosted.org/packages/16/0a/571c4965cac9eac1878be4c9323255777b6b6098975d0674f9cfd3e870e9/pydivsufsort-0.0.14-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9834281e425a9b19fbfd809779c31da807f29d37794aa70180b2d998446d0451", size = 1961955, upload-time = "2024-01-27T22:18:43.617Z" }, + { url = "https://files.pythonhosted.org/packages/3c/38/b8b1d2035544bd7a2707fe8a2e67e636b6a3e162078cb2bcbec7843a5b79/pydivsufsort-0.0.14-cp38-cp38-win32.whl", hash = "sha256:6fcbad6c22c4dda3d2b11f7845ad47c200713f9aee415ff892cf5b02abca740d", size = 225613, upload-time = "2024-01-27T22:23:59.842Z" }, + { url = "https://files.pythonhosted.org/packages/a2/da/569abfb0c759f0155e3e8d8f2e2ce4e1b50138c615993915e4188e2af4c6/pydivsufsort-0.0.14-cp38-cp38-win_amd64.whl", hash = "sha256:5af7565bfbb0304287875a834d62df2c4b374cc45653d124b80f05bd7fab96ce", size = 268595, upload-time = "2024-01-27T22:22:34.365Z" }, + { url = "https://files.pythonhosted.org/packages/24/d3/aebc63679aa6040f8434b1ce09cf9ac6119296a8a41823e0b2276e4db6b1/pydivsufsort-0.0.14-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:0cb9d880cb088b3c36a12aeb2fad0357613f257cce07c166c64f29407220ce7e", size = 316851, upload-time = "2024-01-27T22:24:31.773Z" }, + { url = "https://files.pythonhosted.org/packages/6b/27/a3d2de5a148d23f37c3c94a9d9c0dad3643a413db9fa0266bdda39c3e7df/pydivsufsort-0.0.14-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:43e1c6157a1821ce5be3beb5866defea53e8eb498fe06b4c5c896b44840ad723", size = 280845, upload-time = "2024-01-27T22:24:33.299Z" }, + { url = "https://files.pythonhosted.org/packages/d7/5c/e320e19020f854757f735c820f9d4117697a032bd76bbac2de5e0ccb2534/pydivsufsort-0.0.14-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b0d4c480fca182596730f141e5deb5866d14cf9e30ab73e517d15ba4dc9e1971", size = 1908549, upload-time = "2024-01-27T22:18:45.614Z" }, + { url = "https://files.pythonhosted.org/packages/01/80/a8e852153989a4fd05d8fbdba31bbd74e1f275e81128cf5f3d6dfec87e85/pydivsufsort-0.0.14-cp39-cp39-win32.whl", hash = "sha256:c5f669517110c098164911750ea769c2b201d99453816c46006d9ebd01934673", size = 223935, upload-time = "2024-01-27T22:24:01.428Z" }, + { url = "https://files.pythonhosted.org/packages/bb/89/9f18cd262f1487e8b3e946d1569dae2ca9be9c072e2206a9a79c42d24c15/pydivsufsort-0.0.14-cp39-cp39-win_amd64.whl", hash = "sha256:8a4492523b3dc9a9a12585a6170b917b27fa2bd1b8780e9d4243f92260eee23c", size = 266835, upload-time = "2024-01-27T22:22:35.754Z" }, +] + +[[package]] +name = "pydivsufsort" +version = "0.0.18" +source = { registry = "https://pypi.org/simple" } +resolution-markers = [ + "python_full_version >= '3.12'", + "python_full_version == '3.11.*'", + "python_full_version == '3.10.*'", + "python_full_version == '3.9.*'", +] +dependencies = [ + { name = "numpy", version = "2.0.2", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version == '3.9.*'" }, + { name = "numpy", version = "2.2.6", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version == '3.10.*'" }, + { name = "numpy", version = "2.3.3", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.11'" }, + { name = "wheel", marker = "python_full_version >= '3.9'" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/ce/aa/a4168a2077288071dc9183768e14fb35893606231eebbf1b156663c95df2/pydivsufsort-0.0.18.tar.gz", hash = "sha256:e23ff06abbd8e34e812c66a38cb6c853f55a3f15fccaa001e339752f34865e77", size = 360071, upload-time = "2024-09-26T01:04:37.053Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/f9/74/ffb311f8d5f157d5b2048d84ac3a3a5127001a7bb94f759b6f69520ab819/pydivsufsort-0.0.18-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:40474ee2f071fb16b33082596b35638c2c17eb37d9c0efced8b31394d6e0cacd", size = 397218, upload-time = "2024-09-26T00:19:44.161Z" }, + { url = "https://files.pythonhosted.org/packages/0a/26/0daff9c93f1543e1ebfbeeb10ee6b3bd21694af8fa72b060789b303c18de/pydivsufsort-0.0.18-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:37c660abe0f126111e8e251391a8efc88dcbb726342e18ac230c0ba79f81c1c2", size = 355600, upload-time = "2024-09-26T00:19:45.845Z" }, + { url = "https://files.pythonhosted.org/packages/ff/9c/2113375bef83d3b30f631fa7d5feea45fb6d22440a99e0e0f37492ecb30b/pydivsufsort-0.0.18-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7bb76f97f1a6143b0c54b1fcf771977b0a0c8f16b85dcde295ddce20a0f7535a", size = 2822811, upload-time = "2024-09-26T01:04:39.469Z" }, + { url = "https://files.pythonhosted.org/packages/ab/ea/13f8177a13bccd61b9305b13462a0163d43d10d40d93fec2e526d648f94c/pydivsufsort-0.0.18-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a370a2807833f8dc53f3a457ba5ad247ae948a4aa629ec6d3edc44a62e8546bd", size = 2866051, upload-time = "2024-09-26T01:04:41.25Z" }, + { url = "https://files.pythonhosted.org/packages/c1/14/ef9e23be0e3b6b8babb67161e4bd13bd6eb39a1154b01a12a159af3bff27/pydivsufsort-0.0.18-cp310-cp310-win32.whl", hash = "sha256:19a6c06e73f89402e3cf3c882c19b847536be9168e2bab102053be8e74439e5e", size = 293799, upload-time = "2024-09-26T00:26:21.18Z" }, + { url = "https://files.pythonhosted.org/packages/ce/7c/4aded88173aa7026d02b24253394a3722aa38f7c7b40d0e6fa0a6de10df6/pydivsufsort-0.0.18-cp310-cp310-win_amd64.whl", hash = "sha256:2f7f013edaa94fa07891619977dcf0a363fa4b7b0d00ed953c4bb58d8c5232ab", size = 351862, upload-time = "2024-09-26T00:21:45.916Z" }, + { url = "https://files.pythonhosted.org/packages/f2/f1/34a9648719ea1a5697ad45731bad4f3f7e06872695b4bb8966271455bde8/pydivsufsort-0.0.18-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:2cd51b1c5cfe2ab88a7628d4f26f5a5d843bf563aa9865cdaca5ad364fbd59f3", size = 397797, upload-time = "2024-09-26T00:19:47.423Z" }, + { url = "https://files.pythonhosted.org/packages/72/f1/2c40c95bbe78059d632fd59cc75e40b82f03d33c7868fc27972ec2e5d1c3/pydivsufsort-0.0.18-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:4c301ba012b185a0ad0dcbafa6d405b94b3b3d2c9b04d686633bb8d436ef08a2", size = 355392, upload-time = "2024-09-26T00:19:48.754Z" }, + { url = "https://files.pythonhosted.org/packages/8a/23/99f62a0f90653d70ad122bcbe304c8b7362587f1f2c59745230d0853d0f8/pydivsufsort-0.0.18-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a862ae27f527c5fadcf181bc486901d080a28af21e764d36519ade205c2b4af7", size = 2832814, upload-time = "2024-09-26T01:04:43.026Z" }, + { url = "https://files.pythonhosted.org/packages/ed/e0/6b3b61780fccb02a5d8a74a37768f44c3fab9a3dd866928ebfb165327435/pydivsufsort-0.0.18-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ce5731dfea69dadc17b91420251a5a060c6ab21e166ec2bb2d3fe3ad9cb80a3f", size = 2848992, upload-time = "2024-09-26T01:04:44.757Z" }, + { url = "https://files.pythonhosted.org/packages/ed/ee/9630fd2b36e0c966ab4e528d8c9b5ef5c9c8f9ff492b1b17e43d3198f1ed/pydivsufsort-0.0.18-cp311-cp311-win32.whl", hash = "sha256:63b01c2cf6c8d91f0820f153332fa911be564bd2e54cff510cd5a7d3d4a124e8", size = 293765, upload-time = "2024-09-26T00:26:22.559Z" }, + { url = "https://files.pythonhosted.org/packages/9a/3e/9d49200f8ddaaebd5e126cd923af516de6c000b18c57962bd3afb1c4626b/pydivsufsort-0.0.18-cp311-cp311-win_amd64.whl", hash = "sha256:acd3bfe375706f4cba391340e6ad947fc470447de777acd34b1d3a448eb07977", size = 354257, upload-time = "2024-09-26T00:21:47.037Z" }, + { url = "https://files.pythonhosted.org/packages/5e/ba/765da9cf9d053a1c815dca6ce34f9d47f61725264fe7689d32208e7106a5/pydivsufsort-0.0.18-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:31ec5e6f8aa64500c81b27e6c750d06412a1fc7c506413923f67e8d9241492d0", size = 399274, upload-time = "2024-09-26T00:19:49.872Z" }, + { url = "https://files.pythonhosted.org/packages/9b/b1/4a626bb8aced9aee973eaebb1bac814c53d81983cee54eaa1c549af18b21/pydivsufsort-0.0.18-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:754c665aab78793b329b7d94ed82e03b50d0166f733e26236eeb0410dd328520", size = 359151, upload-time = "2024-09-26T00:19:50.932Z" }, + { url = "https://files.pythonhosted.org/packages/a4/ae/6acb3a8a4c239e2cf5029631a597920217cf1f279fe1066003dfb8cd90c2/pydivsufsort-0.0.18-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2a5e7437408ab94c4829a39a3d1dd826de4ebfde4ddc5a9accf4718519d1e453", size = 2831689, upload-time = "2024-09-26T01:04:46.274Z" }, + { url = "https://files.pythonhosted.org/packages/b0/dc/8afbc81320a5185cc76e07fc4102f171854db44fc499c39751dbb36fabb1/pydivsufsort-0.0.18-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:87364bf7d70876dc7f8d92c61c2c3fe025be520a666b9714d808ecd9eb42ec99", size = 2909957, upload-time = "2024-09-26T01:04:48.19Z" }, + { url = "https://files.pythonhosted.org/packages/2f/70/e921d50c766356a929b1c663d608916fc4c015698c03c81e90db51242f84/pydivsufsort-0.0.18-cp312-cp312-win32.whl", hash = "sha256:c0d8ccab13628e2d09e1fe314bc95746817de78b902d5a5fc0da445d5427c1d2", size = 284952, upload-time = "2024-09-26T00:26:25.109Z" }, + { url = "https://files.pythonhosted.org/packages/01/99/b93c3318c9a08888c81e427e05e9b3a31010299988e15999b07d76465189/pydivsufsort-0.0.18-cp312-cp312-win_amd64.whl", hash = "sha256:5f7678c020b24eda861ec9771b7239b24551c17bb21a55a350ecafc36b733780", size = 344554, upload-time = "2024-09-26T00:21:48.056Z" }, + { url = "https://files.pythonhosted.org/packages/34/e4/e8348caf813eaffc0619356453290c8b3f27298b16d59f0bd2b2b62b1de6/pydivsufsort-0.0.18-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:8951fa16d4ac757409ec69d7edca867719b1b25462602f351c95e67f218a5cb5", size = 395851, upload-time = "2024-09-26T00:19:52.068Z" }, + { url = "https://files.pythonhosted.org/packages/91/e1/2673fa17b7e20f32207ea492f433363760a1d4c960cf241857a17beb4b88/pydivsufsort-0.0.18-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:702970e4b8601d7a2f0e46deaea4313913ec0aa145c949aca35cfe3d6b7727cd", size = 356797, upload-time = "2024-09-26T00:19:53.196Z" }, + { url = "https://files.pythonhosted.org/packages/f3/2a/d19203b926d3b1a13ce9dd580a1708abaa82ff0a3b3ead697c37389534fe/pydivsufsort-0.0.18-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0f05a12a412030de8a6912966a0e492eae90e8cfec79060e7211ef39fd1813f8", size = 2816932, upload-time = "2024-09-26T01:04:50.002Z" }, + { url = "https://files.pythonhosted.org/packages/19/34/e733fbf731ac384116a5cfa6c7370aa86ab5cade43ff0ea335caabd13980/pydivsufsort-0.0.18-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:907383c28615d2d563f76fd2f75dc978fccc1f9150fd82fb2d9f0e44ff8dae59", size = 2881565, upload-time = "2024-09-26T01:04:51.508Z" }, + { url = "https://files.pythonhosted.org/packages/57/21/d4b721f3219f12e518d0e5b665f0fee69cd2161b474535babb6464783eb9/pydivsufsort-0.0.18-cp313-cp313-win32.whl", hash = "sha256:3d0db2bdca91c8f4645d2e6a9e5515001dea19223afef15adde5f752b74e95ff", size = 282957, upload-time = "2024-09-26T00:26:26.511Z" }, + { url = "https://files.pythonhosted.org/packages/9e/79/65908503eeb34c44cc0dd70f14b6c59809af9f9696b397e8a6a76b785a91/pydivsufsort-0.0.18-cp313-cp313-win_amd64.whl", hash = "sha256:3341a023a6a0d27b0c944f48ee9e1f980e3bbfdca7f1cd9494cfd400ff8e631a", size = 346477, upload-time = "2024-09-26T00:21:49.549Z" }, + { url = "https://files.pythonhosted.org/packages/06/9a/03460d12866bfb6d27a422a4f0cf5663546096ca27bdd95d77983acbb084/pydivsufsort-0.0.18-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:b7499e2a9360a877da158628777292a3a6ce6f3a3d1bfc7b5d8c64a52d0e6439", size = 397438, upload-time = "2024-09-26T00:19:54.877Z" }, + { url = "https://files.pythonhosted.org/packages/fa/89/60ab739f105c9fc59dbec6652ad16fbd47b94afcecc4d08d830518043733/pydivsufsort-0.0.18-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:cf657a1807076dbe9ea7769626de12690f764cde29febe139bc00eafb44e6b43", size = 355796, upload-time = "2024-09-26T00:19:55.969Z" }, + { url = "https://files.pythonhosted.org/packages/0b/9a/6071477cf4b468c428d9c9d2ed6a74b5d03f84607a814c725df7d2caa135/pydivsufsort-0.0.18-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4dea097a48a3157a4750ef696eed4d24c8b02109071f7971aa8613467e591827", size = 2825231, upload-time = "2024-09-26T01:04:53.001Z" }, + { url = "https://files.pythonhosted.org/packages/39/8b/235f82a725d756b71ae3d1bbe815cca787afe1a80162e26ad44f2e56bf86/pydivsufsort-0.0.18-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a99950bceae8b56379c8c85fb0b6b8eebf9f7b67a613ff88fe751bfd54a32e93", size = 2866770, upload-time = "2024-09-26T01:04:54.888Z" }, + { url = "https://files.pythonhosted.org/packages/b9/c5/8dc3777db95d1f10d7584705d917714825b79292351f74f24f5ba75fbdff/pydivsufsort-0.0.18-cp39-cp39-win32.whl", hash = "sha256:2304c6c4ba9b4c18257dd945cad0b50fc4f56b3c0aeb96ba7fa628f247458351", size = 293929, upload-time = "2024-09-26T00:26:28.002Z" }, + { url = "https://files.pythonhosted.org/packages/1d/89/795fceb4042f9cbf4ff2527e359b0535cfa69d4b03d2c7db353b482db886/pydivsufsort-0.0.18-cp39-cp39-win_amd64.whl", hash = "sha256:782f3800c905525c93abbc4635831cc815c5e78f4fe58f5011c1cda7ffbb6694", size = 351736, upload-time = "2024-09-26T00:21:50.847Z" }, +] + +[[package]] +name = "pydna" +version = "5.0.0" +source = { registry = "https://pypi.org/simple" } +resolution-markers = [ + "python_full_version < '3.8'", +] +dependencies = [ + { name = "appdirs", marker = "python_full_version < '3.8'" }, + { name = "biopython", version = "1.81", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.8'" }, + { name = "networkx", version = "2.6.3", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.8'" }, + { name = "prettytable", version = "3.7.0", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.8'" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/74/52/5f83c479af9468dde6bb78a18b9f0d74eeef2b539a088dcacca978719051/pydna-5.0.0.tar.gz", hash = "sha256:685fb6321f51f0503d7732b11649bbcb6bf3a254b396fc8abc1f1b8d0b65f664", size = 19322625, upload-time = "2022-12-01T13:13:09.407Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/2d/6d/909f612ecc76befabcb711e49dcceae8d01c1cbec78e621ea6515fcb3607/pydna-5.0.0-py3-none-any.whl", hash = "sha256:ccf48529824a075143b8c4a2b10af64f4fe3041956aae5f5d292fb165324ac8f", size = 115065, upload-time = "2022-12-01T13:13:05.449Z" }, +] + +[[package]] +name = "pydna" +version = "5.4.0" +source = { registry = "https://pypi.org/simple" } +resolution-markers = [ + "python_full_version >= '3.8.1' and python_full_version < '3.9'", + "python_full_version >= '3.8' and python_full_version < '3.8.1'", +] +dependencies = [ + { name = "appdirs", marker = "python_full_version == '3.8.*'" }, + { name = "biopython", version = "1.83", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version == '3.8.*'" }, + { name = "networkx", version = "3.1", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version == '3.8.*'" }, + { name = "numpy", version = "1.23.5", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version == '3.8.*'" }, + { name = "prettytable", version = "3.11.0", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version == '3.8.*'" }, + { name = "pydivsufsort", version = "0.0.14", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version == '3.8.*'" }, + { name = "pyfiglet", marker = "python_full_version == '3.8.*'" }, + { name = "seguid", marker = "python_full_version == '3.8.*'" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/aa/ef/f390b016dbb7c1ea7607d77026d550019cb81a04918d1526c61801638f55/pydna-5.4.0.tar.gz", hash = "sha256:90be61c79907a91cd705c7607f5bac77871cc4a848c4dd88ade9529aedc10373", size = 113893, upload-time = "2025-01-23T17:09:44.208Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/7b/49/157ee596196610922e0b681df4c58494c2a566aa4949d68ac9ac3c3ba384/pydna-5.4.0-py3-none-any.whl", hash = "sha256:d0b3ade1b7d3af36d8ed3d413e2e0a3ffd316b19bf196f1738ca2280027e289b", size = 129052, upload-time = "2025-01-23T17:09:42.338Z" }, +] + +[[package]] +name = "pydna" +version = "5.5.3" +source = { registry = "https://pypi.org/simple" } +resolution-markers = [ + "python_full_version >= '3.12'", + "python_full_version == '3.11.*'", + "python_full_version == '3.10.*'", + "python_full_version == '3.9.*'", +] +dependencies = [ + { name = "appdirs", marker = "python_full_version >= '3.9'" }, + { name = "biopython", version = "1.85", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.9'" }, + { name = "networkx", version = "3.2.1", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version == '3.9.*'" }, + { name = "networkx", version = "3.4.2", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version == '3.10.*'" }, + { name = "networkx", version = "3.5", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.11'" }, + { name = "numpy", version = "2.0.2", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version == '3.9.*'" }, + { name = "numpy", version = "2.2.6", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version == '3.10.*'" }, + { name = "numpy", version = "2.3.3", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.11'" }, + { name = "prettytable", version = "3.16.0", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.9'" }, + { name = "pydivsufsort", version = "0.0.18", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.9'" }, + { name = "pyfiglet", marker = "python_full_version >= '3.9'" }, + { name = "regex", marker = "python_full_version >= '3.9'" }, + { name = "seguid", marker = "python_full_version >= '3.9'" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/61/52/8165f6493e214549369c42af0b075787e0a89bd6940e0093ac15b4385749/pydna-5.5.3.tar.gz", hash = "sha256:20c420e316e6a24023ff28ca49b52500d7c258ce56db609e510b54c315e2d7d4", size = 136734, upload-time = "2025-09-11T05:37:19.032Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/28/d5/fd51af04d301974d8c06120a68e203ff2537eb05d424ca2458181dbab9c4/pydna-5.5.3-py3-none-any.whl", hash = "sha256:d4bef7c345938c474512a5466c895e7a226efd9da7090f9320f1f0de967ae291", size = 148138, upload-time = "2025-09-11T05:37:17.172Z" }, +] + +[[package]] +name = "pyfiglet" +version = "0.8.post1" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/f9/02/48293654fb2e4fdeb4d927f00a380230a832744b6c9af757373a72d018d1/pyfiglet-0.8.post1.tar.gz", hash = "sha256:c6c2321755d09267b438ec7b936825a4910fec696292139e664ca8670e103639", size = 634618, upload-time = "2019-02-05T13:50:20.006Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/33/07/fcfdd7a2872f5b348953de35acce1544dab0c1e8368dca54279b1cde5c15/pyfiglet-0.8.post1-py2.py3-none-any.whl", hash = "sha256:d555bcea17fbeaf70eaefa48bb119352487e629c9b56f30f383e2c62dd67a01c", size = 865831, upload-time = "2019-02-05T13:50:22.689Z" }, +] + +[[package]] +name = "pyparsing" +version = "3.1.4" +source = { registry = "https://pypi.org/simple" } +resolution-markers = [ + "python_full_version >= '3.8.1' and python_full_version < '3.9'", + "python_full_version >= '3.8' and python_full_version < '3.8.1'", + "python_full_version < '3.8'", +] +sdist = { url = "https://files.pythonhosted.org/packages/83/08/13f3bce01b2061f2bbd582c9df82723de943784cf719a35ac886c652043a/pyparsing-3.1.4.tar.gz", hash = "sha256:f86ec8d1a83f11977c9a6ea7598e8c27fc5cddfa5b07ea2241edbbde1d7bc032", size = 900231, upload-time = "2024-08-25T15:00:47.416Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/e5/0c/0e3c05b1c87bb6a1c76d281b0f35e78d2d80ac91b5f8f524cebf77f51049/pyparsing-3.1.4-py3-none-any.whl", hash = "sha256:a6a7ee4235a3f944aa1fa2249307708f893fe5717dc603503c6c7969c070fb7c", size = 104100, upload-time = "2024-08-25T15:00:45.361Z" }, +] + +[[package]] +name = "pyparsing" +version = "3.2.5" +source = { registry = "https://pypi.org/simple" } +resolution-markers = [ + "python_full_version >= '3.12'", + "python_full_version == '3.11.*'", + "python_full_version == '3.10.*'", + "python_full_version == '3.9.*'", +] +sdist = { url = "https://files.pythonhosted.org/packages/f2/a5/181488fc2b9d093e3972d2a472855aae8a03f000592dbfce716a512b3359/pyparsing-3.2.5.tar.gz", hash = "sha256:2df8d5b7b2802ef88e8d016a2eb9c7aeaa923529cd251ed0fe4608275d4105b6", size = 1099274, upload-time = "2025-09-21T04:11:06.277Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/10/5e/1aa9a93198c6b64513c9d7752de7422c06402de6600a8767da1524f9570b/pyparsing-3.2.5-py3-none-any.whl", hash = "sha256:e38a4f02064cf41fe6593d328d0512495ad1f3d8a91c4f73fc401b3079a59a5e", size = 113890, upload-time = "2025-09-21T04:11:04.117Z" }, +] + +[[package]] +name = "pytest" +version = "4.6.11" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "atomicwrites" }, + { name = "attrs", version = "24.2.0", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.8'" }, + { name = "attrs", version = "25.3.0", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version == '3.8.*'" }, + { name = "attrs", version = "25.4.0", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.9'" }, + { name = "colorama", marker = "sys_platform == 'win32'" }, + { name = "importlib-metadata", marker = "python_full_version < '3.8'" }, + { name = "more-itertools", version = "9.1.0", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.8'" }, + { name = "more-itertools", version = "10.5.0", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version == '3.8.*'" }, + { name = "more-itertools", version = "10.8.0", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.9'" }, + { name = "packaging", version = "24.0", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.8'" }, + { name = "packaging", version = "25.0", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.8'" }, + { name = "pluggy" }, + { name = "py" }, + { name = "six" }, + { name = "wcwidth" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/db/a0/7728776e507c0a89a2673f3d109f1d4d4a1b1fce6933e283007c88725369/pytest-4.6.11.tar.gz", hash = "sha256:50fa82392f2120cc3ec2ca0a75ee615be4c479e66669789771f1758332be4353", size = 952305, upload-time = "2020-06-05T12:09:17.15Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/70/c7/e8cb4a537ee4fc497ac80a606a667fd1832f28ad3ddbfa25bf30473eae13/pytest-4.6.11-py2.py3-none-any.whl", hash = "sha256:a00a7d79cbbdfa9d21e7d0298392a8dd4123316bfac545075e6f8f24c94d8c97", size = 231624, upload-time = "2020-06-05T12:09:15.65Z" }, +] + +[[package]] +name = "pytest-cov" +version = "4.1.0" +source = { registry = "https://pypi.org/simple" } +resolution-markers = [ + "python_full_version < '3.8'", +] +dependencies = [ + { name = "coverage", version = "7.2.7", source = { registry = "https://pypi.org/simple" }, extra = ["toml"], marker = "python_full_version < '3.8'" }, + { name = "pytest", marker = "python_full_version < '3.8'" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/7a/15/da3df99fd551507694a9b01f512a2f6cf1254f33601605843c3775f39460/pytest-cov-4.1.0.tar.gz", hash = "sha256:3904b13dfbfec47f003b8e77fd5b589cd11904a21ddf1ab38a64f204d6a10ef6", size = 63245, upload-time = "2023-05-24T18:44:56.845Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/a7/4b/8b78d126e275efa2379b1c2e09dc52cf70df16fc3b90613ef82531499d73/pytest_cov-4.1.0-py3-none-any.whl", hash = "sha256:6ba70b9e97e69fcc3fb45bfeab2d0a138fb65c4d0d6a41ef33983ad114be8c3a", size = 21949, upload-time = "2023-05-24T18:44:54.079Z" }, +] + +[[package]] +name = "pytest-cov" +version = "5.0.0" +source = { registry = "https://pypi.org/simple" } +resolution-markers = [ + "python_full_version >= '3.8.1' and python_full_version < '3.9'", + "python_full_version >= '3.8' and python_full_version < '3.8.1'", +] +dependencies = [ + { name = "coverage", version = "7.6.1", source = { registry = "https://pypi.org/simple" }, extra = ["toml"], marker = "python_full_version == '3.8.*'" }, + { name = "pytest", marker = "python_full_version == '3.8.*'" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/74/67/00efc8d11b630c56f15f4ad9c7f9223f1e5ec275aaae3fa9118c6a223ad2/pytest-cov-5.0.0.tar.gz", hash = "sha256:5837b58e9f6ebd335b0f8060eecce69b662415b16dc503883a02f45dfeb14857", size = 63042, upload-time = "2024-03-24T20:16:34.856Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/78/3a/af5b4fa5961d9a1e6237b530eb87dd04aea6eb83da09d2a4073d81b54ccf/pytest_cov-5.0.0-py3-none-any.whl", hash = "sha256:4f0764a1219df53214206bf1feea4633c3b558a2925c8b59f144f682861ce652", size = 21990, upload-time = "2024-03-24T20:16:32.444Z" }, +] + +[[package]] +name = "pytest-cov" +version = "6.2.0" +source = { registry = "https://pypi.org/simple" } +resolution-markers = [ + "python_full_version >= '3.12'", + "python_full_version == '3.11.*'", + "python_full_version == '3.10.*'", + "python_full_version == '3.9.*'", +] +dependencies = [ + { name = "coverage", version = "7.10.7", source = { registry = "https://pypi.org/simple" }, extra = ["toml"], marker = "python_full_version >= '3.9'" }, + { name = "pytest", marker = "python_full_version >= '3.9'" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/88/17/139b134cb36e496a62780b2ff19ea47fd834f2d180a32e6dd9210f4a8a77/pytest_cov-6.2.0.tar.gz", hash = "sha256:9a4331e087a0f5074dc1e19fe0485a07a462b346cbb91e2ac903ec5504abce10", size = 68872, upload-time = "2025-06-11T21:55:02.68Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/aa/66/a38138fbf711b2b93592dfd7303bba561f6bc05f85361a0388c105ceb727/pytest_cov-6.2.0-py3-none-any.whl", hash = "sha256:bd19301caf600ead1169db089ed0ad7b8f2b962214330a696b8c85a0b497b2ff", size = 24448, upload-time = "2025-06-11T21:55:00.938Z" }, +] + +[[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, upload-time = "2024-03-01T18:36:20.211Z" } +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, upload-time = "2024-03-01T18:36:18.57Z" }, +] + +[[package]] +name = "rdflib" +version = "6.2.0" +source = { registry = "https://pypi.org/simple" } +resolution-markers = [ + "python_full_version < '3.8'", +] +dependencies = [ + { name = "importlib-metadata", marker = "python_full_version < '3.8'" }, + { name = "isodate", version = "0.7.2", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.8'" }, + { name = "pyparsing", version = "3.1.4", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.8'" }, + { name = "setuptools", marker = "python_full_version < '3.8'" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/fc/8d/2d1c8a08471b4333657c98a3048642095f844f10cd1d4e28f9b08725c7bd/rdflib-6.2.0.tar.gz", hash = "sha256:62dc3c86d1712db0f55785baf8047f63731fa59b2682be03219cb89262065942", size = 4755909, upload-time = "2022-07-26T15:43:59.891Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/50/fb/a0f8b6ab6598b49871a48a189dc1942fb0b0543ab4c84f689486233ef1ec/rdflib-6.2.0-py3-none-any.whl", hash = "sha256:85c34a86dfc517a41e5f2425a41a0aceacc23983462b32e68610b9fad1383bca", size = 500261, upload-time = "2022-07-26T15:43:56.513Z" }, +] + +[[package]] +name = "rdflib" +version = "6.3.2" +source = { registry = "https://pypi.org/simple" } +resolution-markers = [ + "python_full_version >= '3.8' and python_full_version < '3.8.1'", +] +dependencies = [ + { name = "isodate", version = "0.6.1", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.8' and python_full_version < '3.8.1'" }, + { name = "pyparsing", version = "3.1.4", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.8' and python_full_version < '3.8.1'" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/c8/28/4d1f27c5d73f58e567ca1a14a4eab7d7978a09c4e117687f9f6c216d3366/rdflib-6.3.2.tar.gz", hash = "sha256:72af591ff704f4caacea7ecc0c5a9056b8553e0489dd4f35a9bc52dbd41522e0", size = 4749592, upload-time = "2023-03-26T11:52:54.891Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/af/92/d7fb1d7fb70c9f7003fa50b7a3880ebcb311cc3f8552b3595e7c8f75aeeb/rdflib-6.3.2-py3-none-any.whl", hash = "sha256:36b4e74a32aa1e4fa7b8719876fb192f19ecd45ff932ea5ebbd2e417a0247e63", size = 528122, upload-time = "2023-03-26T11:52:52.393Z" }, +] + +[[package]] +name = "rdflib" +version = "7.2.1" +source = { registry = "https://pypi.org/simple" } +resolution-markers = [ + "python_full_version >= '3.12'", + "python_full_version == '3.11.*'", + "python_full_version == '3.10.*'", + "python_full_version == '3.9.*'", + "python_full_version >= '3.8.1' and python_full_version < '3.9'", +] +dependencies = [ + { name = "isodate", version = "0.7.2", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.8.1' and python_full_version < '3.11'" }, + { name = "pyparsing", version = "3.1.4", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.8.1' and python_full_version < '3.9'" }, + { name = "pyparsing", version = "3.2.5", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.9'" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/8d/99/d2fec85e5f6bdfe4367dea143119cb4469bf48710487939df0abf7e22003/rdflib-7.2.1.tar.gz", hash = "sha256:cf9b7fa25234e8925da8b1fb09700f8349b5f0f100e785fb4260e737308292ac", size = 4873802, upload-time = "2025-09-19T02:33:36.492Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/31/98/7fa830bb4b9da21905683a5352aa0a01a1f3082328ae976aad341e980c23/rdflib-7.2.1-py3-none-any.whl", hash = "sha256:1a175bc1386a167a42fbfaba003bfa05c164a2a3ca3cb9c0c97f9c9638ca6ac2", size = 565423, upload-time = "2025-09-19T02:33:30.889Z" }, +] + +[[package]] +name = "regex" +version = "2024.11.6" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/8e/5f/bd69653fbfb76cf8604468d3b4ec4c403197144c7bfe0e6a5fc9e02a07cb/regex-2024.11.6.tar.gz", hash = "sha256:7ab159b063c52a0333c884e4679f8d7a85112ee3078fe3d9004b2dd875585519", size = 399494, upload-time = "2024-11-06T20:12:31.635Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/95/3c/4651f6b130c6842a8f3df82461a8950f923925db8b6961063e82744bddcc/regex-2024.11.6-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:ff590880083d60acc0433f9c3f713c51f7ac6ebb9adf889c79a261ecf541aa91", size = 482674, upload-time = "2024-11-06T20:08:57.575Z" }, + { url = "https://files.pythonhosted.org/packages/15/51/9f35d12da8434b489c7b7bffc205c474a0a9432a889457026e9bc06a297a/regex-2024.11.6-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:658f90550f38270639e83ce492f27d2c8d2cd63805c65a13a14d36ca126753f0", size = 287684, upload-time = "2024-11-06T20:08:59.787Z" }, + { url = "https://files.pythonhosted.org/packages/bd/18/b731f5510d1b8fb63c6b6d3484bfa9a59b84cc578ac8b5172970e05ae07c/regex-2024.11.6-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:164d8b7b3b4bcb2068b97428060b2a53be050085ef94eca7f240e7947f1b080e", size = 284589, upload-time = "2024-11-06T20:09:01.896Z" }, + { url = "https://files.pythonhosted.org/packages/78/a2/6dd36e16341ab95e4c6073426561b9bfdeb1a9c9b63ab1b579c2e96cb105/regex-2024.11.6-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d3660c82f209655a06b587d55e723f0b813d3a7db2e32e5e7dc64ac2a9e86fde", size = 782511, upload-time = "2024-11-06T20:09:04.062Z" }, + { url = "https://files.pythonhosted.org/packages/1b/2b/323e72d5d2fd8de0d9baa443e1ed70363ed7e7b2fb526f5950c5cb99c364/regex-2024.11.6-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:d22326fcdef5e08c154280b71163ced384b428343ae16a5ab2b3354aed12436e", size = 821149, upload-time = "2024-11-06T20:09:06.237Z" }, + { url = "https://files.pythonhosted.org/packages/90/30/63373b9ea468fbef8a907fd273e5c329b8c9535fee36fc8dba5fecac475d/regex-2024.11.6-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:f1ac758ef6aebfc8943560194e9fd0fa18bcb34d89fd8bd2af18183afd8da3a2", size = 809707, upload-time = "2024-11-06T20:09:07.715Z" }, + { url = "https://files.pythonhosted.org/packages/f2/98/26d3830875b53071f1f0ae6d547f1d98e964dd29ad35cbf94439120bb67a/regex-2024.11.6-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:997d6a487ff00807ba810e0f8332c18b4eb8d29463cfb7c820dc4b6e7562d0cf", size = 781702, upload-time = "2024-11-06T20:09:10.101Z" }, + { url = "https://files.pythonhosted.org/packages/87/55/eb2a068334274db86208ab9d5599ffa63631b9f0f67ed70ea7c82a69bbc8/regex-2024.11.6-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:02a02d2bb04fec86ad61f3ea7f49c015a0681bf76abb9857f945d26159d2968c", size = 771976, upload-time = "2024-11-06T20:09:11.566Z" }, + { url = "https://files.pythonhosted.org/packages/74/c0/be707bcfe98254d8f9d2cff55d216e946f4ea48ad2fd8cf1428f8c5332ba/regex-2024.11.6-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:f02f93b92358ee3f78660e43b4b0091229260c5d5c408d17d60bf26b6c900e86", size = 697397, upload-time = "2024-11-06T20:09:13.119Z" }, + { url = "https://files.pythonhosted.org/packages/49/dc/bb45572ceb49e0f6509f7596e4ba7031f6819ecb26bc7610979af5a77f45/regex-2024.11.6-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:06eb1be98df10e81ebaded73fcd51989dcf534e3c753466e4b60c4697a003b67", size = 768726, upload-time = "2024-11-06T20:09:14.85Z" }, + { url = "https://files.pythonhosted.org/packages/5a/db/f43fd75dc4c0c2d96d0881967897926942e935d700863666f3c844a72ce6/regex-2024.11.6-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:040df6fe1a5504eb0f04f048e6d09cd7c7110fef851d7c567a6b6e09942feb7d", size = 775098, upload-time = "2024-11-06T20:09:16.504Z" }, + { url = "https://files.pythonhosted.org/packages/99/d7/f94154db29ab5a89d69ff893159b19ada89e76b915c1293e98603d39838c/regex-2024.11.6-cp310-cp310-musllinux_1_2_ppc64le.whl", hash = "sha256:fdabbfc59f2c6edba2a6622c647b716e34e8e3867e0ab975412c5c2f79b82da2", size = 839325, upload-time = "2024-11-06T20:09:18.698Z" }, + { url = "https://files.pythonhosted.org/packages/f7/17/3cbfab1f23356fbbf07708220ab438a7efa1e0f34195bf857433f79f1788/regex-2024.11.6-cp310-cp310-musllinux_1_2_s390x.whl", hash = "sha256:8447d2d39b5abe381419319f942de20b7ecd60ce86f16a23b0698f22e1b70008", size = 843277, upload-time = "2024-11-06T20:09:21.725Z" }, + { url = "https://files.pythonhosted.org/packages/7e/f2/48b393b51900456155de3ad001900f94298965e1cad1c772b87f9cfea011/regex-2024.11.6-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:da8f5fc57d1933de22a9e23eec290a0d8a5927a5370d24bda9a6abe50683fe62", size = 773197, upload-time = "2024-11-06T20:09:24.092Z" }, + { url = "https://files.pythonhosted.org/packages/45/3f/ef9589aba93e084cd3f8471fded352826dcae8489b650d0b9b27bc5bba8a/regex-2024.11.6-cp310-cp310-win32.whl", hash = "sha256:b489578720afb782f6ccf2840920f3a32e31ba28a4b162e13900c3e6bd3f930e", size = 261714, upload-time = "2024-11-06T20:09:26.36Z" }, + { url = "https://files.pythonhosted.org/packages/42/7e/5f1b92c8468290c465fd50c5318da64319133231415a8aa6ea5ab995a815/regex-2024.11.6-cp310-cp310-win_amd64.whl", hash = "sha256:5071b2093e793357c9d8b2929dfc13ac5f0a6c650559503bb81189d0a3814519", size = 274042, upload-time = "2024-11-06T20:09:28.762Z" }, + { url = "https://files.pythonhosted.org/packages/58/58/7e4d9493a66c88a7da6d205768119f51af0f684fe7be7bac8328e217a52c/regex-2024.11.6-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:5478c6962ad548b54a591778e93cd7c456a7a29f8eca9c49e4f9a806dcc5d638", size = 482669, upload-time = "2024-11-06T20:09:31.064Z" }, + { url = "https://files.pythonhosted.org/packages/34/4c/8f8e631fcdc2ff978609eaeef1d6994bf2f028b59d9ac67640ed051f1218/regex-2024.11.6-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:2c89a8cc122b25ce6945f0423dc1352cb9593c68abd19223eebbd4e56612c5b7", size = 287684, upload-time = "2024-11-06T20:09:32.915Z" }, + { url = "https://files.pythonhosted.org/packages/c5/1b/f0e4d13e6adf866ce9b069e191f303a30ab1277e037037a365c3aad5cc9c/regex-2024.11.6-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:94d87b689cdd831934fa3ce16cc15cd65748e6d689f5d2b8f4f4df2065c9fa20", size = 284589, upload-time = "2024-11-06T20:09:35.504Z" }, + { url = "https://files.pythonhosted.org/packages/25/4d/ab21047f446693887f25510887e6820b93f791992994f6498b0318904d4a/regex-2024.11.6-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1062b39a0a2b75a9c694f7a08e7183a80c63c0d62b301418ffd9c35f55aaa114", size = 792121, upload-time = "2024-11-06T20:09:37.701Z" }, + { url = "https://files.pythonhosted.org/packages/45/ee/c867e15cd894985cb32b731d89576c41a4642a57850c162490ea34b78c3b/regex-2024.11.6-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:167ed4852351d8a750da48712c3930b031f6efdaa0f22fa1933716bfcd6bf4a3", size = 831275, upload-time = "2024-11-06T20:09:40.371Z" }, + { url = "https://files.pythonhosted.org/packages/b3/12/b0f480726cf1c60f6536fa5e1c95275a77624f3ac8fdccf79e6727499e28/regex-2024.11.6-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:2d548dafee61f06ebdb584080621f3e0c23fff312f0de1afc776e2a2ba99a74f", size = 818257, upload-time = "2024-11-06T20:09:43.059Z" }, + { url = "https://files.pythonhosted.org/packages/bf/ce/0d0e61429f603bac433910d99ef1a02ce45a8967ffbe3cbee48599e62d88/regex-2024.11.6-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f2a19f302cd1ce5dd01a9099aaa19cae6173306d1302a43b627f62e21cf18ac0", size = 792727, upload-time = "2024-11-06T20:09:48.19Z" }, + { url = "https://files.pythonhosted.org/packages/e4/c1/243c83c53d4a419c1556f43777ccb552bccdf79d08fda3980e4e77dd9137/regex-2024.11.6-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:bec9931dfb61ddd8ef2ebc05646293812cb6b16b60cf7c9511a832b6f1854b55", size = 780667, upload-time = "2024-11-06T20:09:49.828Z" }, + { url = "https://files.pythonhosted.org/packages/c5/f4/75eb0dd4ce4b37f04928987f1d22547ddaf6c4bae697623c1b05da67a8aa/regex-2024.11.6-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:9714398225f299aa85267fd222f7142fcb5c769e73d7733344efc46f2ef5cf89", size = 776963, upload-time = "2024-11-06T20:09:51.819Z" }, + { url = "https://files.pythonhosted.org/packages/16/5d/95c568574e630e141a69ff8a254c2f188b4398e813c40d49228c9bbd9875/regex-2024.11.6-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:202eb32e89f60fc147a41e55cb086db2a3f8cb82f9a9a88440dcfc5d37faae8d", size = 784700, upload-time = "2024-11-06T20:09:53.982Z" }, + { url = "https://files.pythonhosted.org/packages/8e/b5/f8495c7917f15cc6fee1e7f395e324ec3e00ab3c665a7dc9d27562fd5290/regex-2024.11.6-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:4181b814e56078e9b00427ca358ec44333765f5ca1b45597ec7446d3a1ef6e34", size = 848592, upload-time = "2024-11-06T20:09:56.222Z" }, + { url = "https://files.pythonhosted.org/packages/1c/80/6dd7118e8cb212c3c60b191b932dc57db93fb2e36fb9e0e92f72a5909af9/regex-2024.11.6-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:068376da5a7e4da51968ce4c122a7cd31afaaec4fccc7856c92f63876e57b51d", size = 852929, upload-time = "2024-11-06T20:09:58.642Z" }, + { url = "https://files.pythonhosted.org/packages/11/9b/5a05d2040297d2d254baf95eeeb6df83554e5e1df03bc1a6687fc4ba1f66/regex-2024.11.6-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:ac10f2c4184420d881a3475fb2c6f4d95d53a8d50209a2500723d831036f7c45", size = 781213, upload-time = "2024-11-06T20:10:00.867Z" }, + { url = "https://files.pythonhosted.org/packages/26/b7/b14e2440156ab39e0177506c08c18accaf2b8932e39fb092074de733d868/regex-2024.11.6-cp311-cp311-win32.whl", hash = "sha256:c36f9b6f5f8649bb251a5f3f66564438977b7ef8386a52460ae77e6070d309d9", size = 261734, upload-time = "2024-11-06T20:10:03.361Z" }, + { url = "https://files.pythonhosted.org/packages/80/32/763a6cc01d21fb3819227a1cc3f60fd251c13c37c27a73b8ff4315433a8e/regex-2024.11.6-cp311-cp311-win_amd64.whl", hash = "sha256:02e28184be537f0e75c1f9b2f8847dc51e08e6e171c6bde130b2687e0c33cf60", size = 274052, upload-time = "2024-11-06T20:10:05.179Z" }, + { url = "https://files.pythonhosted.org/packages/ba/30/9a87ce8336b172cc232a0db89a3af97929d06c11ceaa19d97d84fa90a8f8/regex-2024.11.6-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:52fb28f528778f184f870b7cf8f225f5eef0a8f6e3778529bdd40c7b3920796a", size = 483781, upload-time = "2024-11-06T20:10:07.07Z" }, + { url = "https://files.pythonhosted.org/packages/01/e8/00008ad4ff4be8b1844786ba6636035f7ef926db5686e4c0f98093612add/regex-2024.11.6-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:fdd6028445d2460f33136c55eeb1f601ab06d74cb3347132e1c24250187500d9", size = 288455, upload-time = "2024-11-06T20:10:09.117Z" }, + { url = "https://files.pythonhosted.org/packages/60/85/cebcc0aff603ea0a201667b203f13ba75d9fc8668fab917ac5b2de3967bc/regex-2024.11.6-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:805e6b60c54bf766b251e94526ebad60b7de0c70f70a4e6210ee2891acb70bf2", size = 284759, upload-time = "2024-11-06T20:10:11.155Z" }, + { url = "https://files.pythonhosted.org/packages/94/2b/701a4b0585cb05472a4da28ee28fdfe155f3638f5e1ec92306d924e5faf0/regex-2024.11.6-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b85c2530be953a890eaffde05485238f07029600e8f098cdf1848d414a8b45e4", size = 794976, upload-time = "2024-11-06T20:10:13.24Z" }, + { url = "https://files.pythonhosted.org/packages/4b/bf/fa87e563bf5fee75db8915f7352e1887b1249126a1be4813837f5dbec965/regex-2024.11.6-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:bb26437975da7dc36b7efad18aa9dd4ea569d2357ae6b783bf1118dabd9ea577", size = 833077, upload-time = "2024-11-06T20:10:15.37Z" }, + { url = "https://files.pythonhosted.org/packages/a1/56/7295e6bad94b047f4d0834e4779491b81216583c00c288252ef625c01d23/regex-2024.11.6-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:abfa5080c374a76a251ba60683242bc17eeb2c9818d0d30117b4486be10c59d3", size = 823160, upload-time = "2024-11-06T20:10:19.027Z" }, + { url = "https://files.pythonhosted.org/packages/fb/13/e3b075031a738c9598c51cfbc4c7879e26729c53aa9cca59211c44235314/regex-2024.11.6-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:70b7fa6606c2881c1db9479b0eaa11ed5dfa11c8d60a474ff0e095099f39d98e", size = 796896, upload-time = "2024-11-06T20:10:21.85Z" }, + { url = "https://files.pythonhosted.org/packages/24/56/0b3f1b66d592be6efec23a795b37732682520b47c53da5a32c33ed7d84e3/regex-2024.11.6-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:0c32f75920cf99fe6b6c539c399a4a128452eaf1af27f39bce8909c9a3fd8cbe", size = 783997, upload-time = "2024-11-06T20:10:24.329Z" }, + { url = "https://files.pythonhosted.org/packages/f9/a1/eb378dada8b91c0e4c5f08ffb56f25fcae47bf52ad18f9b2f33b83e6d498/regex-2024.11.6-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:982e6d21414e78e1f51cf595d7f321dcd14de1f2881c5dc6a6e23bbbbd68435e", size = 781725, upload-time = "2024-11-06T20:10:28.067Z" }, + { url = "https://files.pythonhosted.org/packages/83/f2/033e7dec0cfd6dda93390089864732a3409246ffe8b042e9554afa9bff4e/regex-2024.11.6-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:a7c2155f790e2fb448faed6dd241386719802296ec588a8b9051c1f5c481bc29", size = 789481, upload-time = "2024-11-06T20:10:31.612Z" }, + { url = "https://files.pythonhosted.org/packages/83/23/15d4552ea28990a74e7696780c438aadd73a20318c47e527b47a4a5a596d/regex-2024.11.6-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:149f5008d286636e48cd0b1dd65018548944e495b0265b45e1bffecce1ef7f39", size = 852896, upload-time = "2024-11-06T20:10:34.054Z" }, + { url = "https://files.pythonhosted.org/packages/e3/39/ed4416bc90deedbfdada2568b2cb0bc1fdb98efe11f5378d9892b2a88f8f/regex-2024.11.6-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:e5364a4502efca094731680e80009632ad6624084aff9a23ce8c8c6820de3e51", size = 860138, upload-time = "2024-11-06T20:10:36.142Z" }, + { url = "https://files.pythonhosted.org/packages/93/2d/dd56bb76bd8e95bbce684326302f287455b56242a4f9c61f1bc76e28360e/regex-2024.11.6-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:0a86e7eeca091c09e021db8eb72d54751e527fa47b8d5787caf96d9831bd02ad", size = 787692, upload-time = "2024-11-06T20:10:38.394Z" }, + { url = "https://files.pythonhosted.org/packages/0b/55/31877a249ab7a5156758246b9c59539abbeba22461b7d8adc9e8475ff73e/regex-2024.11.6-cp312-cp312-win32.whl", hash = "sha256:32f9a4c643baad4efa81d549c2aadefaeba12249b2adc5af541759237eee1c54", size = 262135, upload-time = "2024-11-06T20:10:40.367Z" }, + { url = "https://files.pythonhosted.org/packages/38/ec/ad2d7de49a600cdb8dd78434a1aeffe28b9d6fc42eb36afab4a27ad23384/regex-2024.11.6-cp312-cp312-win_amd64.whl", hash = "sha256:a93c194e2df18f7d264092dc8539b8ffb86b45b899ab976aa15d48214138e81b", size = 273567, upload-time = "2024-11-06T20:10:43.467Z" }, + { url = "https://files.pythonhosted.org/packages/90/73/bcb0e36614601016552fa9344544a3a2ae1809dc1401b100eab02e772e1f/regex-2024.11.6-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:a6ba92c0bcdf96cbf43a12c717eae4bc98325ca3730f6b130ffa2e3c3c723d84", size = 483525, upload-time = "2024-11-06T20:10:45.19Z" }, + { url = "https://files.pythonhosted.org/packages/0f/3f/f1a082a46b31e25291d830b369b6b0c5576a6f7fb89d3053a354c24b8a83/regex-2024.11.6-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:525eab0b789891ac3be914d36893bdf972d483fe66551f79d3e27146191a37d4", size = 288324, upload-time = "2024-11-06T20:10:47.177Z" }, + { url = "https://files.pythonhosted.org/packages/09/c9/4e68181a4a652fb3ef5099e077faf4fd2a694ea6e0f806a7737aff9e758a/regex-2024.11.6-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:086a27a0b4ca227941700e0b31425e7a28ef1ae8e5e05a33826e17e47fbfdba0", size = 284617, upload-time = "2024-11-06T20:10:49.312Z" }, + { url = "https://files.pythonhosted.org/packages/fc/fd/37868b75eaf63843165f1d2122ca6cb94bfc0271e4428cf58c0616786dce/regex-2024.11.6-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:bde01f35767c4a7899b7eb6e823b125a64de314a8ee9791367c9a34d56af18d0", size = 795023, upload-time = "2024-11-06T20:10:51.102Z" }, + { url = "https://files.pythonhosted.org/packages/c4/7c/d4cd9c528502a3dedb5c13c146e7a7a539a3853dc20209c8e75d9ba9d1b2/regex-2024.11.6-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:b583904576650166b3d920d2bcce13971f6f9e9a396c673187f49811b2769dc7", size = 833072, upload-time = "2024-11-06T20:10:52.926Z" }, + { url = "https://files.pythonhosted.org/packages/4f/db/46f563a08f969159c5a0f0e722260568425363bea43bb7ae370becb66a67/regex-2024.11.6-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:1c4de13f06a0d54fa0d5ab1b7138bfa0d883220965a29616e3ea61b35d5f5fc7", size = 823130, upload-time = "2024-11-06T20:10:54.828Z" }, + { url = "https://files.pythonhosted.org/packages/db/60/1eeca2074f5b87df394fccaa432ae3fc06c9c9bfa97c5051aed70e6e00c2/regex-2024.11.6-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3cde6e9f2580eb1665965ce9bf17ff4952f34f5b126beb509fee8f4e994f143c", size = 796857, upload-time = "2024-11-06T20:10:56.634Z" }, + { url = "https://files.pythonhosted.org/packages/10/db/ac718a08fcee981554d2f7bb8402f1faa7e868c1345c16ab1ebec54b0d7b/regex-2024.11.6-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:0d7f453dca13f40a02b79636a339c5b62b670141e63efd511d3f8f73fba162b3", size = 784006, upload-time = "2024-11-06T20:10:59.369Z" }, + { url = "https://files.pythonhosted.org/packages/c2/41/7da3fe70216cea93144bf12da2b87367590bcf07db97604edeea55dac9ad/regex-2024.11.6-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:59dfe1ed21aea057a65c6b586afd2a945de04fc7db3de0a6e3ed5397ad491b07", size = 781650, upload-time = "2024-11-06T20:11:02.042Z" }, + { url = "https://files.pythonhosted.org/packages/a7/d5/880921ee4eec393a4752e6ab9f0fe28009435417c3102fc413f3fe81c4e5/regex-2024.11.6-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:b97c1e0bd37c5cd7902e65f410779d39eeda155800b65fc4d04cc432efa9bc6e", size = 789545, upload-time = "2024-11-06T20:11:03.933Z" }, + { url = "https://files.pythonhosted.org/packages/dc/96/53770115e507081122beca8899ab7f5ae28ae790bfcc82b5e38976df6a77/regex-2024.11.6-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:f9d1e379028e0fc2ae3654bac3cbbef81bf3fd571272a42d56c24007979bafb6", size = 853045, upload-time = "2024-11-06T20:11:06.497Z" }, + { url = "https://files.pythonhosted.org/packages/31/d3/1372add5251cc2d44b451bd94f43b2ec78e15a6e82bff6a290ef9fd8f00a/regex-2024.11.6-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:13291b39131e2d002a7940fb176e120bec5145f3aeb7621be6534e46251912c4", size = 860182, upload-time = "2024-11-06T20:11:09.06Z" }, + { url = "https://files.pythonhosted.org/packages/ed/e3/c446a64984ea9f69982ba1a69d4658d5014bc7a0ea468a07e1a1265db6e2/regex-2024.11.6-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:4f51f88c126370dcec4908576c5a627220da6c09d0bff31cfa89f2523843316d", size = 787733, upload-time = "2024-11-06T20:11:11.256Z" }, + { url = "https://files.pythonhosted.org/packages/2b/f1/e40c8373e3480e4f29f2692bd21b3e05f296d3afebc7e5dcf21b9756ca1c/regex-2024.11.6-cp313-cp313-win32.whl", hash = "sha256:63b13cfd72e9601125027202cad74995ab26921d8cd935c25f09c630436348ff", size = 262122, upload-time = "2024-11-06T20:11:13.161Z" }, + { url = "https://files.pythonhosted.org/packages/45/94/bc295babb3062a731f52621cdc992d123111282e291abaf23faa413443ea/regex-2024.11.6-cp313-cp313-win_amd64.whl", hash = "sha256:2b3361af3198667e99927da8b84c1b010752fa4b1115ee30beaa332cabc3ef1a", size = 273545, upload-time = "2024-11-06T20:11:15Z" }, + { url = "https://files.pythonhosted.org/packages/44/0f/207b37e6e08d548fac0aa00bf0b7464126315d58ab5161216b8cb3abb2aa/regex-2024.11.6-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:3a51ccc315653ba012774efca4f23d1d2a8a8f278a6072e29c7147eee7da446b", size = 482777, upload-time = "2024-11-06T20:11:16.752Z" }, + { url = "https://files.pythonhosted.org/packages/5a/5a/586bafa294c5d2451265d3685815606c61e620f469cac3b946fff0a4aa48/regex-2024.11.6-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:ad182d02e40de7459b73155deb8996bbd8e96852267879396fb274e8700190e3", size = 287751, upload-time = "2024-11-06T20:11:18.913Z" }, + { url = "https://files.pythonhosted.org/packages/08/92/9df786fad8a4e0766bfc9a2e334c5f0757356070c9639b2ec776b8cdef3d/regex-2024.11.6-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:ba9b72e5643641b7d41fa1f6d5abda2c9a263ae835b917348fc3c928182ad467", size = 284552, upload-time = "2024-11-06T20:11:21.005Z" }, + { url = "https://files.pythonhosted.org/packages/0a/27/0b3cf7d9fbe43301aa3473d54406019a7380abe4e3c9ae250bac13c4fdb3/regex-2024.11.6-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:40291b1b89ca6ad8d3f2b82782cc33807f1406cf68c8d440861da6304d8ffbbd", size = 783587, upload-time = "2024-11-06T20:11:23.17Z" }, + { url = "https://files.pythonhosted.org/packages/89/38/499b32cbb61163af60a5c5ff26aacea7836fe7e3d821e76af216e996088c/regex-2024.11.6-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:cdf58d0e516ee426a48f7b2c03a332a4114420716d55769ff7108c37a09951bf", size = 822904, upload-time = "2024-11-06T20:11:25.49Z" }, + { url = "https://files.pythonhosted.org/packages/3f/a4/e3b11c643e5ae1059a08aeef971973f0c803d2a9ae2e7a86f97c68146a6c/regex-2024.11.6-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:a36fdf2af13c2b14738f6e973aba563623cb77d753bbbd8d414d18bfaa3105dd", size = 809900, upload-time = "2024-11-06T20:11:27.382Z" }, + { url = "https://files.pythonhosted.org/packages/5a/c8/dc7153ceb5bcc344f5c4f0291ea45925a5f00009afa3849e91561ac2e847/regex-2024.11.6-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d1cee317bfc014c2419a76bcc87f071405e3966da434e03e13beb45f8aced1a6", size = 785105, upload-time = "2024-11-06T20:11:29.428Z" }, + { url = "https://files.pythonhosted.org/packages/2a/29/841489ea52013062b22625fbaf49b0916aeb62bae2e56425ac30f9dead46/regex-2024.11.6-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:50153825ee016b91549962f970d6a4442fa106832e14c918acd1c8e479916c4f", size = 773033, upload-time = "2024-11-06T20:11:32.175Z" }, + { url = "https://files.pythonhosted.org/packages/3e/4e/4a0da5e87f7c2dc73a8505785d5af2b1a19c66f4645b93caa50b7eb08242/regex-2024.11.6-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:ea1bfda2f7162605f6e8178223576856b3d791109f15ea99a9f95c16a7636fb5", size = 702374, upload-time = "2024-11-06T20:11:34.182Z" }, + { url = "https://files.pythonhosted.org/packages/94/6e/444e66346600d11e8a0f4bb31611973cffa772d5033ba1cf1f15de8a0d52/regex-2024.11.6-cp38-cp38-musllinux_1_2_aarch64.whl", hash = "sha256:df951c5f4a1b1910f1a99ff42c473ff60f8225baa1cdd3539fe2819d9543e9df", size = 769990, upload-time = "2024-11-06T20:11:36.813Z" }, + { url = "https://files.pythonhosted.org/packages/da/28/95c3ed6cd51b27f54e59940400e2a3ddd3f8bbbc3aaf947e57a67104ecbd/regex-2024.11.6-cp38-cp38-musllinux_1_2_i686.whl", hash = "sha256:072623554418a9911446278f16ecb398fb3b540147a7828c06e2011fa531e773", size = 775345, upload-time = "2024-11-06T20:11:39.079Z" }, + { url = "https://files.pythonhosted.org/packages/07/5d/0cd19cf44d96a7aa31526611c24235d21d27c23b65201cb2c5cac508dd42/regex-2024.11.6-cp38-cp38-musllinux_1_2_ppc64le.whl", hash = "sha256:f654882311409afb1d780b940234208a252322c24a93b442ca714d119e68086c", size = 840379, upload-time = "2024-11-06T20:11:41.208Z" }, + { url = "https://files.pythonhosted.org/packages/2a/13/ec3f8d85b789ee1c6ffbdfd4092fd901416716317ee17bf51aa2890bac96/regex-2024.11.6-cp38-cp38-musllinux_1_2_s390x.whl", hash = "sha256:89d75e7293d2b3e674db7d4d9b1bee7f8f3d1609428e293771d1a962617150cc", size = 845842, upload-time = "2024-11-06T20:11:43.709Z" }, + { url = "https://files.pythonhosted.org/packages/50/cb/7170247e65afea2bf9204bcb2682f292b0a3a57d112478da199b84d59792/regex-2024.11.6-cp38-cp38-musllinux_1_2_x86_64.whl", hash = "sha256:f65557897fc977a44ab205ea871b690adaef6b9da6afda4790a2484b04293a5f", size = 775026, upload-time = "2024-11-06T20:11:46.11Z" }, + { url = "https://files.pythonhosted.org/packages/cc/06/c817c9201f09b7d9dd033039ba90d8197c91e9fe2984141f2d1de270c159/regex-2024.11.6-cp38-cp38-win32.whl", hash = "sha256:6f44ec28b1f858c98d3036ad5d7d0bfc568bdd7a74f9c24e25f41ef1ebfd81a4", size = 261738, upload-time = "2024-11-06T20:11:48.611Z" }, + { url = "https://files.pythonhosted.org/packages/cf/69/c39e16320400842eb4358c982ef5fc680800866f35ebfd4dd38a22967ce0/regex-2024.11.6-cp38-cp38-win_amd64.whl", hash = "sha256:bb8f74f2f10dbf13a0be8de623ba4f9491faf58c24064f32b65679b021ed0001", size = 274094, upload-time = "2024-11-06T20:11:50.641Z" }, + { url = "https://files.pythonhosted.org/packages/89/23/c4a86df398e57e26f93b13ae63acce58771e04bdde86092502496fa57f9c/regex-2024.11.6-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:5704e174f8ccab2026bd2f1ab6c510345ae8eac818b613d7d73e785f1310f839", size = 482682, upload-time = "2024-11-06T20:11:52.65Z" }, + { url = "https://files.pythonhosted.org/packages/3c/8b/45c24ab7a51a1658441b961b86209c43e6bb9d39caf1e63f46ce6ea03bc7/regex-2024.11.6-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:220902c3c5cc6af55d4fe19ead504de80eb91f786dc102fbd74894b1551f095e", size = 287679, upload-time = "2024-11-06T20:11:55.011Z" }, + { url = "https://files.pythonhosted.org/packages/7a/d1/598de10b17fdafc452d11f7dada11c3be4e379a8671393e4e3da3c4070df/regex-2024.11.6-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:5e7e351589da0850c125f1600a4c4ba3c722efefe16b297de54300f08d734fbf", size = 284578, upload-time = "2024-11-06T20:11:57.033Z" }, + { url = "https://files.pythonhosted.org/packages/49/70/c7eaa219efa67a215846766fde18d92d54cb590b6a04ffe43cef30057622/regex-2024.11.6-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5056b185ca113c88e18223183aa1a50e66507769c9640a6ff75859619d73957b", size = 782012, upload-time = "2024-11-06T20:11:59.218Z" }, + { url = "https://files.pythonhosted.org/packages/89/e5/ef52c7eb117dd20ff1697968219971d052138965a4d3d9b95e92e549f505/regex-2024.11.6-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:2e34b51b650b23ed3354b5a07aab37034d9f923db2a40519139af34f485f77d0", size = 820580, upload-time = "2024-11-06T20:12:01.969Z" }, + { url = "https://files.pythonhosted.org/packages/5f/3f/9f5da81aff1d4167ac52711acf789df13e789fe6ac9545552e49138e3282/regex-2024.11.6-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:5670bce7b200273eee1840ef307bfa07cda90b38ae56e9a6ebcc9f50da9c469b", size = 809110, upload-time = "2024-11-06T20:12:04.786Z" }, + { url = "https://files.pythonhosted.org/packages/86/44/2101cc0890c3621b90365c9ee8d7291a597c0722ad66eccd6ffa7f1bcc09/regex-2024.11.6-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:08986dce1339bc932923e7d1232ce9881499a0e02925f7402fb7c982515419ef", size = 780919, upload-time = "2024-11-06T20:12:06.944Z" }, + { url = "https://files.pythonhosted.org/packages/ce/2e/3e0668d8d1c7c3c0d397bf54d92fc182575b3a26939aed5000d3cc78760f/regex-2024.11.6-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:93c0b12d3d3bc25af4ebbf38f9ee780a487e8bf6954c115b9f015822d3bb8e48", size = 771515, upload-time = "2024-11-06T20:12:09.9Z" }, + { url = "https://files.pythonhosted.org/packages/a6/49/1bc4584254355e3dba930a3a2fd7ad26ccba3ebbab7d9100db0aff2eedb0/regex-2024.11.6-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:764e71f22ab3b305e7f4c21f1a97e1526a25ebdd22513e251cf376760213da13", size = 696957, upload-time = "2024-11-06T20:12:12.319Z" }, + { url = "https://files.pythonhosted.org/packages/c8/dd/42879c1fc8a37a887cd08e358af3d3ba9e23038cd77c7fe044a86d9450ba/regex-2024.11.6-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:f056bf21105c2515c32372bbc057f43eb02aae2fda61052e2f7622c801f0b4e2", size = 768088, upload-time = "2024-11-06T20:12:15.149Z" }, + { url = "https://files.pythonhosted.org/packages/89/96/c05a0fe173cd2acd29d5e13c1adad8b706bcaa71b169e1ee57dcf2e74584/regex-2024.11.6-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:69ab78f848845569401469da20df3e081e6b5a11cb086de3eed1d48f5ed57c95", size = 774752, upload-time = "2024-11-06T20:12:17.416Z" }, + { url = "https://files.pythonhosted.org/packages/b5/f3/a757748066255f97f14506483436c5f6aded7af9e37bca04ec30c90ca683/regex-2024.11.6-cp39-cp39-musllinux_1_2_ppc64le.whl", hash = "sha256:86fddba590aad9208e2fa8b43b4c098bb0ec74f15718bb6a704e3c63e2cef3e9", size = 838862, upload-time = "2024-11-06T20:12:19.639Z" }, + { url = "https://files.pythonhosted.org/packages/5c/93/c6d2092fd479dcaeea40fc8fa673822829181ded77d294a7f950f1dda6e2/regex-2024.11.6-cp39-cp39-musllinux_1_2_s390x.whl", hash = "sha256:684d7a212682996d21ca12ef3c17353c021fe9de6049e19ac8481ec35574a70f", size = 842622, upload-time = "2024-11-06T20:12:21.841Z" }, + { url = "https://files.pythonhosted.org/packages/ff/9c/daa99532c72f25051a90ef90e1413a8d54413a9e64614d9095b0c1c154d0/regex-2024.11.6-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:a03e02f48cd1abbd9f3b7e3586d97c8f7a9721c436f51a5245b3b9483044480b", size = 772713, upload-time = "2024-11-06T20:12:24.785Z" }, + { url = "https://files.pythonhosted.org/packages/13/5d/61a533ccb8c231b474ac8e3a7d70155b00dfc61af6cafdccd1947df6d735/regex-2024.11.6-cp39-cp39-win32.whl", hash = "sha256:41758407fc32d5c3c5de163888068cfee69cb4c2be844e7ac517a52770f9af57", size = 261756, upload-time = "2024-11-06T20:12:26.975Z" }, + { url = "https://files.pythonhosted.org/packages/dc/7b/e59b7f7c91ae110d154370c24133f947262525b5d6406df65f23422acc17/regex-2024.11.6-cp39-cp39-win_amd64.whl", hash = "sha256:b2837718570f95dd41675328e111345f9b7095d821bac435aac173ac80b19983", size = 274110, upload-time = "2024-11-06T20:12:29.368Z" }, +] + +[[package]] +name = "requests" +version = "2.31.0" +source = { registry = "https://pypi.org/simple" } +resolution-markers = [ + "python_full_version < '3.8'", +] +dependencies = [ + { name = "certifi", marker = "python_full_version < '3.8'" }, + { name = "charset-normalizer", marker = "python_full_version < '3.8'" }, + { name = "idna", marker = "python_full_version < '3.8'" }, + { name = "urllib3", version = "2.0.7", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.8'" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/9d/be/10918a2eac4ae9f02f6cfe6414b7a155ccd8f7f9d4380d62fd5b955065c3/requests-2.31.0.tar.gz", hash = "sha256:942c5a758f98d790eaed1a29cb6eefc7ffb0d1cf7af05c3d2791656dbd6ad1e1", size = 110794, upload-time = "2023-05-22T15:12:44.175Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/70/8e/0e2d847013cb52cd35b38c009bb167a1a26b2ce6cd6965bf26b47bc0bf44/requests-2.31.0-py3-none-any.whl", hash = "sha256:58cd2187c01e70e6e26505bca751777aa9f2ee0b7f4300988b709f44e013003f", size = 62574, upload-time = "2023-05-22T15:12:42.313Z" }, +] + +[[package]] +name = "requests" +version = "2.32.4" +source = { registry = "https://pypi.org/simple" } +resolution-markers = [ + "python_full_version >= '3.8.1' and python_full_version < '3.9'", + "python_full_version >= '3.8' and python_full_version < '3.8.1'", +] +dependencies = [ + { name = "certifi", marker = "python_full_version == '3.8.*'" }, + { name = "charset-normalizer", marker = "python_full_version == '3.8.*'" }, + { name = "idna", marker = "python_full_version == '3.8.*'" }, + { name = "urllib3", version = "2.2.3", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version == '3.8.*'" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/e1/0a/929373653770d8a0d7ea76c37de6e41f11eb07559b103b1c02cafb3f7cf8/requests-2.32.4.tar.gz", hash = "sha256:27d0316682c8a29834d3264820024b62a36942083d52caf2f14c0591336d3422", size = 135258, upload-time = "2025-06-09T16:43:07.34Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/7c/e4/56027c4a6b4ae70ca9de302488c5ca95ad4a39e190093d6c1a8ace08341b/requests-2.32.4-py3-none-any.whl", hash = "sha256:27babd3cda2a6d50b30443204ee89830707d396671944c998b5975b031ac2b2c", size = 64847, upload-time = "2025-06-09T16:43:05.728Z" }, +] + +[[package]] +name = "requests" +version = "2.32.5" +source = { registry = "https://pypi.org/simple" } +resolution-markers = [ + "python_full_version >= '3.12'", + "python_full_version == '3.11.*'", + "python_full_version == '3.10.*'", + "python_full_version == '3.9.*'", +] +dependencies = [ + { name = "certifi", marker = "python_full_version >= '3.9'" }, + { name = "charset-normalizer", marker = "python_full_version >= '3.9'" }, + { name = "idna", marker = "python_full_version >= '3.9'" }, + { name = "urllib3", version = "2.5.0", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.9'" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/c9/74/b3ff8e6c8446842c3f5c837e9c3dfcfe2018ea6ecef224c710c85ef728f4/requests-2.32.5.tar.gz", hash = "sha256:dbba0bac56e100853db0ea71b82b4dfd5fe2bf6d3754a8893c3af500cec7d7cf", size = 134517, upload-time = "2025-08-18T20:46:02.573Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/1e/db/4254e3eabe8020b458f1a747140d32277ec7a271daf1d235b70dc0b4e6e3/requests-2.32.5-py3-none-any.whl", hash = "sha256:2462f94637a34fd532264295e186976db0f5d453d1cdd31473c85a6a161affb6", size = 64738, upload-time = "2025-08-18T20:46:00.542Z" }, +] + +[[package]] +name = "ruff" +version = "0.14.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/41/b9/9bd84453ed6dd04688de9b3f3a4146a1698e8faae2ceeccce4e14c67ae17/ruff-0.14.0.tar.gz", hash = "sha256:62ec8969b7510f77945df916de15da55311fade8d6050995ff7f680afe582c57", size = 5452071, upload-time = "2025-10-07T18:21:55.763Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/3a/4e/79d463a5f80654e93fa653ebfb98e0becc3f0e7cf6219c9ddedf1e197072/ruff-0.14.0-py3-none-linux_armv6l.whl", hash = "sha256:58e15bffa7054299becf4bab8a1187062c6f8cafbe9f6e39e0d5aface455d6b3", size = 12494532, upload-time = "2025-10-07T18:21:00.373Z" }, + { url = "https://files.pythonhosted.org/packages/ee/40/e2392f445ed8e02aa6105d49db4bfff01957379064c30f4811c3bf38aece/ruff-0.14.0-py3-none-macosx_10_12_x86_64.whl", hash = "sha256:838d1b065f4df676b7c9957992f2304e41ead7a50a568185efd404297d5701e8", size = 13160768, upload-time = "2025-10-07T18:21:04.73Z" }, + { url = "https://files.pythonhosted.org/packages/75/da/2a656ea7c6b9bd14c7209918268dd40e1e6cea65f4bb9880eaaa43b055cd/ruff-0.14.0-py3-none-macosx_11_0_arm64.whl", hash = "sha256:703799d059ba50f745605b04638fa7e9682cc3da084b2092feee63500ff3d9b8", size = 12363376, upload-time = "2025-10-07T18:21:07.833Z" }, + { url = "https://files.pythonhosted.org/packages/42/e2/1ffef5a1875add82416ff388fcb7ea8b22a53be67a638487937aea81af27/ruff-0.14.0-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3ba9a8925e90f861502f7d974cc60e18ca29c72bb0ee8bfeabb6ade35a3abde7", size = 12608055, upload-time = "2025-10-07T18:21:10.72Z" }, + { url = "https://files.pythonhosted.org/packages/4a/32/986725199d7cee510d9f1dfdf95bf1efc5fa9dd714d0d85c1fb1f6be3bc3/ruff-0.14.0-py3-none-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:e41f785498bd200ffc276eb9e1570c019c1d907b07cfb081092c8ad51975bbe7", size = 12318544, upload-time = "2025-10-07T18:21:13.741Z" }, + { url = "https://files.pythonhosted.org/packages/9a/ed/4969cefd53315164c94eaf4da7cfba1f267dc275b0abdd593d11c90829a3/ruff-0.14.0-py3-none-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:30a58c087aef4584c193aebf2700f0fbcfc1e77b89c7385e3139956fa90434e2", size = 14001280, upload-time = "2025-10-07T18:21:16.411Z" }, + { url = "https://files.pythonhosted.org/packages/ab/ad/96c1fc9f8854c37681c9613d825925c7f24ca1acfc62a4eb3896b50bacd2/ruff-0.14.0-py3-none-manylinux_2_17_ppc64.manylinux2014_ppc64.whl", hash = "sha256:f8d07350bc7af0a5ce8812b7d5c1a7293cf02476752f23fdfc500d24b79b783c", size = 15027286, upload-time = "2025-10-07T18:21:19.577Z" }, + { url = "https://files.pythonhosted.org/packages/b3/00/1426978f97df4fe331074baf69615f579dc4e7c37bb4c6f57c2aad80c87f/ruff-0.14.0-py3-none-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:eec3bbbf3a7d5482b5c1f42d5fc972774d71d107d447919fca620b0be3e3b75e", size = 14451506, upload-time = "2025-10-07T18:21:22.779Z" }, + { url = "https://files.pythonhosted.org/packages/58/d5/9c1cea6e493c0cf0647674cca26b579ea9d2a213b74b5c195fbeb9678e15/ruff-0.14.0-py3-none-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:16b68e183a0e28e5c176d51004aaa40559e8f90065a10a559176713fcf435206", size = 13437384, upload-time = "2025-10-07T18:21:25.758Z" }, + { url = "https://files.pythonhosted.org/packages/29/b4/4cd6a4331e999fc05d9d77729c95503f99eae3ba1160469f2b64866964e3/ruff-0.14.0-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:eb732d17db2e945cfcbbc52af0143eda1da36ca8ae25083dd4f66f1542fdf82e", size = 13447976, upload-time = "2025-10-07T18:21:28.83Z" }, + { url = "https://files.pythonhosted.org/packages/3b/c0/ac42f546d07e4f49f62332576cb845d45c67cf5610d1851254e341d563b6/ruff-0.14.0-py3-none-manylinux_2_31_riscv64.whl", hash = "sha256:c958f66ab884b7873e72df38dcabee03d556a8f2ee1b8538ee1c2bbd619883dd", size = 13682850, upload-time = "2025-10-07T18:21:31.842Z" }, + { url = "https://files.pythonhosted.org/packages/5f/c4/4b0c9bcadd45b4c29fe1af9c5d1dc0ca87b4021665dfbe1c4688d407aa20/ruff-0.14.0-py3-none-musllinux_1_2_aarch64.whl", hash = "sha256:7eb0499a2e01f6e0c285afc5bac43ab380cbfc17cd43a2e1dd10ec97d6f2c42d", size = 12449825, upload-time = "2025-10-07T18:21:35.074Z" }, + { url = "https://files.pythonhosted.org/packages/4b/a8/e2e76288e6c16540fa820d148d83e55f15e994d852485f221b9524514730/ruff-0.14.0-py3-none-musllinux_1_2_armv7l.whl", hash = "sha256:4c63b2d99fafa05efca0ab198fd48fa6030d57e4423df3f18e03aa62518c565f", size = 12272599, upload-time = "2025-10-07T18:21:38.08Z" }, + { url = "https://files.pythonhosted.org/packages/18/14/e2815d8eff847391af632b22422b8207704222ff575dec8d044f9ab779b2/ruff-0.14.0-py3-none-musllinux_1_2_i686.whl", hash = "sha256:668fce701b7a222f3f5327f86909db2bbe99c30877c8001ff934c5413812ac02", size = 13193828, upload-time = "2025-10-07T18:21:41.216Z" }, + { url = "https://files.pythonhosted.org/packages/44/c6/61ccc2987cf0aecc588ff8f3212dea64840770e60d78f5606cd7dc34de32/ruff-0.14.0-py3-none-musllinux_1_2_x86_64.whl", hash = "sha256:a86bf575e05cb68dcb34e4c7dfe1064d44d3f0c04bbc0491949092192b515296", size = 13628617, upload-time = "2025-10-07T18:21:44.04Z" }, + { url = "https://files.pythonhosted.org/packages/73/e6/03b882225a1b0627e75339b420883dc3c90707a8917d2284abef7a58d317/ruff-0.14.0-py3-none-win32.whl", hash = "sha256:7450a243d7125d1c032cb4b93d9625dea46c8c42b4f06c6b709baac168e10543", size = 12367872, upload-time = "2025-10-07T18:21:46.67Z" }, + { url = "https://files.pythonhosted.org/packages/41/77/56cf9cf01ea0bfcc662de72540812e5ba8e9563f33ef3d37ab2174892c47/ruff-0.14.0-py3-none-win_amd64.whl", hash = "sha256:ea95da28cd874c4d9c922b39381cbd69cb7e7b49c21b8152b014bd4f52acddc2", size = 13464628, upload-time = "2025-10-07T18:21:50.318Z" }, + { url = "https://files.pythonhosted.org/packages/c6/2a/65880dfd0e13f7f13a775998f34703674a4554906167dce02daf7865b954/ruff-0.14.0-py3-none-win_arm64.whl", hash = "sha256:f42c9495f5c13ff841b1da4cb3c2a42075409592825dada7c5885c2c844ac730", size = 12565142, upload-time = "2025-10-07T18:21:53.577Z" }, +] + +[[package]] +name = "sbol2" +version = "1.4.1" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "deprecated" }, + { name = "lxml", version = "5.4.0", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.8'" }, + { name = "lxml", version = "6.0.2", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.8'" }, + { name = "packaging", version = "24.0", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.8'" }, + { name = "packaging", version = "25.0", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.8'" }, + { name = "python-dateutil" }, + { name = "rdflib", version = "6.2.0", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.8'" }, + { name = "rdflib", version = "6.3.2", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.8' and python_full_version < '3.8.1'" }, + { name = "rdflib", version = "7.2.1", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.8.1'" }, + { name = "requests", version = "2.31.0", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.8'" }, + { name = "requests", version = "2.32.4", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version == '3.8.*'" }, + { name = "requests", version = "2.32.5", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.9'" }, + { name = "urllib3", version = "2.0.7", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.8'" }, + { name = "urllib3", version = "2.2.3", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version == '3.8.*'" }, + { name = "urllib3", version = "2.5.0", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.9'" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/11/33/ff71da4c107897dc6e9a11557afe2ff3e391bc578ae4606ad7b9f8237ddf/sbol2-1.4.1.tar.gz", hash = "sha256:e43725df270718489c75392d00ac633165ed87f2f33898105649a6bea122c035", size = 10581853, upload-time = "2022-04-14T14:06:27.128Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/ab/09/ee6ebdba66f54847c9ef116bc101b7723e1b6a821f7c617f6059771014d4/sbol2-1.4.1-py3-none-any.whl", hash = "sha256:73ae876a47ae8d8991681e4f871391b7f3ff5bfec9ec35a9ab097b7beae2d684", size = 8487937, upload-time = "2022-04-14T14:06:22.146Z" }, +] + +[[package]] +name = "sbol2build" +version = "0.0b1" +source = { editable = "." } +dependencies = [ + { name = "biopython", version = "1.81", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.8'" }, + { name = "biopython", version = "1.83", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version == '3.8.*'" }, + { name = "biopython", version = "1.85", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.9'" }, + { name = "pydna", version = "5.0.0", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.8'" }, + { name = "pydna", version = "5.4.0", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version == '3.8.*'" }, + { name = "pydna", version = "5.5.3", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.9'" }, + { name = "sbol2" }, +] + +[package.optional-dependencies] +test = [ + { name = "pytest" }, + { name = "pytest-cov", version = "4.1.0", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.8'" }, + { name = "pytest-cov", version = "5.0.0", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version == '3.8.*'" }, + { name = "pytest-cov", version = "6.2.0", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.9'" }, +] + +[package.dev-dependencies] +dev = [ + { name = "ruff" }, +] + +[package.metadata] +requires-dist = [ + { name = "biopython" }, + { name = "pydna" }, + { name = "pytest", marker = "extra == 'test'", specifier = "<5.0.0" }, + { name = "pytest-cov", extras = ["all"], marker = "extra == 'test'" }, + { name = "sbol2" }, +] +provides-extras = ["test"] + +[package.metadata.requires-dev] +dev = [{ name = "ruff", specifier = ">=0.14.0" }] + +[[package]] +name = "seguid" +version = "0.2.1" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/1e/59/8e4a40a2e963dadc327da83efb1e5a8f69baf4f6ba88b663ad42fe5253ec/seguid-0.2.1.tar.gz", hash = "sha256:cc5482aea6264d5370076a82559b7ccd0810d4e38489437a9e9118affa9762e5", size = 11763, upload-time = "2025-07-27T08:36:04.982Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/57/14/412c97e1e2ad05c2dad34f30cec8ddb8b010f118fff8f7b4e2817f0ff7ff/seguid-0.2.1-py3-none-any.whl", hash = "sha256:10767009dcee3ee1e1227e68b047e5bde82224de1fec11162c3afc4238ca6e08", size = 14656, upload-time = "2025-07-27T08:36:03.809Z" }, +] + +[[package]] +name = "setuptools" +version = "68.0.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/dc/98/5f896af066c128669229ff1aa81553ac14cfb3e5e74b6b44594132b8540e/setuptools-68.0.0.tar.gz", hash = "sha256:baf1fdb41c6da4cd2eae722e135500da913332ab3f2f5c7d33af9b492acb5235", size = 2194111, upload-time = "2023-06-19T15:53:05.082Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/c7/42/be1c7bbdd83e1bfb160c94b9cafd8e25efc7400346cf7ccdbdb452c467fa/setuptools-68.0.0-py3-none-any.whl", hash = "sha256:11e52c67415a381d10d6b462ced9cfb97066179f0e871399e006c4ab101fc85f", size = 804037, upload-time = "2023-06-19T15:53:03.089Z" }, +] + +[[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, upload-time = "2024-12-04T17:35:28.174Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/b7/ce/149a00dd41f10bc29e5921b496af8b574d8413afcd5e30dfa0ed46c2cc5e/six-1.17.0-py2.py3-none-any.whl", hash = "sha256:4721f391ed90541fddacab5acf947aa0d3dc7d27b2e1e8eda2be8970586c3274", size = 11050, upload-time = "2024-12-04T17:35:26.475Z" }, +] + +[[package]] +name = "tomli" +version = "2.0.1" +source = { registry = "https://pypi.org/simple" } +resolution-markers = [ + "python_full_version < '3.8'", +] +sdist = { url = "https://files.pythonhosted.org/packages/c0/3f/d7af728f075fb08564c5949a9c95e44352e23dee646869fa104a3b2060a3/tomli-2.0.1.tar.gz", hash = "sha256:de526c12914f0c550d15924c62d72abc48d6fe7364aa87328337a31007fe8a4f", size = 15164, upload-time = "2022-02-08T10:54:04.006Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/97/75/10a9ebee3fd790d20926a90a2547f0bf78f371b2f13aa822c759680ca7b9/tomli-2.0.1-py3-none-any.whl", hash = "sha256:939de3e7a6161af0c887ef91b7d41a53e7c5a1ca976325f429cb46ea9bc30ecc", size = 12757, upload-time = "2022-02-08T10:54:02.017Z" }, +] + +[[package]] +name = "tomli" +version = "2.3.0" +source = { registry = "https://pypi.org/simple" } +resolution-markers = [ + "python_full_version == '3.11.*'", + "python_full_version == '3.10.*'", + "python_full_version == '3.9.*'", + "python_full_version >= '3.8.1' and python_full_version < '3.9'", + "python_full_version >= '3.8' and python_full_version < '3.8.1'", +] +sdist = { url = "https://files.pythonhosted.org/packages/52/ed/3f73f72945444548f33eba9a87fc7a6e969915e7b1acc8260b30e1f76a2f/tomli-2.3.0.tar.gz", hash = "sha256:64be704a875d2a59753d80ee8a533c3fe183e3f06807ff7dc2232938ccb01549", size = 17392, upload-time = "2025-10-08T22:01:47.119Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/b3/2e/299f62b401438d5fe1624119c723f5d877acc86a4c2492da405626665f12/tomli-2.3.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:88bd15eb972f3664f5ed4b57c1634a97153b4bac4479dcb6a495f41921eb7f45", size = 153236, upload-time = "2025-10-08T22:01:00.137Z" }, + { url = "https://files.pythonhosted.org/packages/86/7f/d8fffe6a7aefdb61bced88fcb5e280cfd71e08939da5894161bd71bea022/tomli-2.3.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:883b1c0d6398a6a9d29b508c331fa56adbcdff647f6ace4dfca0f50e90dfd0ba", size = 148084, upload-time = "2025-10-08T22:01:01.63Z" }, + { url = "https://files.pythonhosted.org/packages/47/5c/24935fb6a2ee63e86d80e4d3b58b222dafaf438c416752c8b58537c8b89a/tomli-2.3.0-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:d1381caf13ab9f300e30dd8feadb3de072aeb86f1d34a8569453ff32a7dea4bf", size = 234832, upload-time = "2025-10-08T22:01:02.543Z" }, + { url = "https://files.pythonhosted.org/packages/89/da/75dfd804fc11e6612846758a23f13271b76d577e299592b4371a4ca4cd09/tomli-2.3.0-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:a0e285d2649b78c0d9027570d4da3425bdb49830a6156121360b3f8511ea3441", size = 242052, upload-time = "2025-10-08T22:01:03.836Z" }, + { url = "https://files.pythonhosted.org/packages/70/8c/f48ac899f7b3ca7eb13af73bacbc93aec37f9c954df3c08ad96991c8c373/tomli-2.3.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:0a154a9ae14bfcf5d8917a59b51ffd5a3ac1fd149b71b47a3a104ca4edcfa845", size = 239555, upload-time = "2025-10-08T22:01:04.834Z" }, + { url = "https://files.pythonhosted.org/packages/ba/28/72f8afd73f1d0e7829bfc093f4cb98ce0a40ffc0cc997009ee1ed94ba705/tomli-2.3.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:74bf8464ff93e413514fefd2be591c3b0b23231a77f901db1eb30d6f712fc42c", size = 245128, upload-time = "2025-10-08T22:01:05.84Z" }, + { url = "https://files.pythonhosted.org/packages/b6/eb/a7679c8ac85208706d27436e8d421dfa39d4c914dcf5fa8083a9305f58d9/tomli-2.3.0-cp311-cp311-win32.whl", hash = "sha256:00b5f5d95bbfc7d12f91ad8c593a1659b6387b43f054104cda404be6bda62456", size = 96445, upload-time = "2025-10-08T22:01:06.896Z" }, + { url = "https://files.pythonhosted.org/packages/0a/fe/3d3420c4cb1ad9cb462fb52967080575f15898da97e21cb6f1361d505383/tomli-2.3.0-cp311-cp311-win_amd64.whl", hash = "sha256:4dc4ce8483a5d429ab602f111a93a6ab1ed425eae3122032db7e9acf449451be", size = 107165, upload-time = "2025-10-08T22:01:08.107Z" }, + { url = "https://files.pythonhosted.org/packages/ff/b7/40f36368fcabc518bb11c8f06379a0fd631985046c038aca08c6d6a43c6e/tomli-2.3.0-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:d7d86942e56ded512a594786a5ba0a5e521d02529b3826e7761a05138341a2ac", size = 154891, upload-time = "2025-10-08T22:01:09.082Z" }, + { url = "https://files.pythonhosted.org/packages/f9/3f/d9dd692199e3b3aab2e4e4dd948abd0f790d9ded8cd10cbaae276a898434/tomli-2.3.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:73ee0b47d4dad1c5e996e3cd33b8a76a50167ae5f96a2607cbe8cc773506ab22", size = 148796, upload-time = "2025-10-08T22:01:10.266Z" }, + { url = "https://files.pythonhosted.org/packages/60/83/59bff4996c2cf9f9387a0f5a3394629c7efa5ef16142076a23a90f1955fa/tomli-2.3.0-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:792262b94d5d0a466afb5bc63c7daa9d75520110971ee269152083270998316f", size = 242121, upload-time = "2025-10-08T22:01:11.332Z" }, + { url = "https://files.pythonhosted.org/packages/45/e5/7c5119ff39de8693d6baab6c0b6dcb556d192c165596e9fc231ea1052041/tomli-2.3.0-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:4f195fe57ecceac95a66a75ac24d9d5fbc98ef0962e09b2eddec5d39375aae52", size = 250070, upload-time = "2025-10-08T22:01:12.498Z" }, + { url = "https://files.pythonhosted.org/packages/45/12/ad5126d3a278f27e6701abde51d342aa78d06e27ce2bb596a01f7709a5a2/tomli-2.3.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:e31d432427dcbf4d86958c184b9bfd1e96b5b71f8eb17e6d02531f434fd335b8", size = 245859, upload-time = "2025-10-08T22:01:13.551Z" }, + { url = "https://files.pythonhosted.org/packages/fb/a1/4d6865da6a71c603cfe6ad0e6556c73c76548557a8d658f9e3b142df245f/tomli-2.3.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:7b0882799624980785240ab732537fcfc372601015c00f7fc367c55308c186f6", size = 250296, upload-time = "2025-10-08T22:01:14.614Z" }, + { url = "https://files.pythonhosted.org/packages/a0/b7/a7a7042715d55c9ba6e8b196d65d2cb662578b4d8cd17d882d45322b0d78/tomli-2.3.0-cp312-cp312-win32.whl", hash = "sha256:ff72b71b5d10d22ecb084d345fc26f42b5143c5533db5e2eaba7d2d335358876", size = 97124, upload-time = "2025-10-08T22:01:15.629Z" }, + { url = "https://files.pythonhosted.org/packages/06/1e/f22f100db15a68b520664eb3328fb0ae4e90530887928558112c8d1f4515/tomli-2.3.0-cp312-cp312-win_amd64.whl", hash = "sha256:1cb4ed918939151a03f33d4242ccd0aa5f11b3547d0cf30f7c74a408a5b99878", size = 107698, upload-time = "2025-10-08T22:01:16.51Z" }, + { url = "https://files.pythonhosted.org/packages/89/48/06ee6eabe4fdd9ecd48bf488f4ac783844fd777f547b8d1b61c11939974e/tomli-2.3.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:5192f562738228945d7b13d4930baffda67b69425a7f0da96d360b0a3888136b", size = 154819, upload-time = "2025-10-08T22:01:17.964Z" }, + { url = "https://files.pythonhosted.org/packages/f1/01/88793757d54d8937015c75dcdfb673c65471945f6be98e6a0410fba167ed/tomli-2.3.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:be71c93a63d738597996be9528f4abe628d1adf5e6eb11607bc8fe1a510b5dae", size = 148766, upload-time = "2025-10-08T22:01:18.959Z" }, + { url = "https://files.pythonhosted.org/packages/42/17/5e2c956f0144b812e7e107f94f1cc54af734eb17b5191c0bbfb72de5e93e/tomli-2.3.0-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:c4665508bcbac83a31ff8ab08f424b665200c0e1e645d2bd9ab3d3e557b6185b", size = 240771, upload-time = "2025-10-08T22:01:20.106Z" }, + { url = "https://files.pythonhosted.org/packages/d5/f4/0fbd014909748706c01d16824eadb0307115f9562a15cbb012cd9b3512c5/tomli-2.3.0-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:4021923f97266babc6ccab9f5068642a0095faa0a51a246a6a02fccbb3514eaf", size = 248586, upload-time = "2025-10-08T22:01:21.164Z" }, + { url = "https://files.pythonhosted.org/packages/30/77/fed85e114bde5e81ecf9bc5da0cc69f2914b38f4708c80ae67d0c10180c5/tomli-2.3.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:a4ea38c40145a357d513bffad0ed869f13c1773716cf71ccaa83b0fa0cc4e42f", size = 244792, upload-time = "2025-10-08T22:01:22.417Z" }, + { url = "https://files.pythonhosted.org/packages/55/92/afed3d497f7c186dc71e6ee6d4fcb0acfa5f7d0a1a2878f8beae379ae0cc/tomli-2.3.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:ad805ea85eda330dbad64c7ea7a4556259665bdf9d2672f5dccc740eb9d3ca05", size = 248909, upload-time = "2025-10-08T22:01:23.859Z" }, + { url = "https://files.pythonhosted.org/packages/f8/84/ef50c51b5a9472e7265ce1ffc7f24cd4023d289e109f669bdb1553f6a7c2/tomli-2.3.0-cp313-cp313-win32.whl", hash = "sha256:97d5eec30149fd3294270e889b4234023f2c69747e555a27bd708828353ab606", size = 96946, upload-time = "2025-10-08T22:01:24.893Z" }, + { url = "https://files.pythonhosted.org/packages/b2/b7/718cd1da0884f281f95ccfa3a6cc572d30053cba64603f79d431d3c9b61b/tomli-2.3.0-cp313-cp313-win_amd64.whl", hash = "sha256:0c95ca56fbe89e065c6ead5b593ee64b84a26fca063b5d71a1122bf26e533999", size = 107705, upload-time = "2025-10-08T22:01:26.153Z" }, + { url = "https://files.pythonhosted.org/packages/19/94/aeafa14a52e16163008060506fcb6aa1949d13548d13752171a755c65611/tomli-2.3.0-cp314-cp314-macosx_10_13_x86_64.whl", hash = "sha256:cebc6fe843e0733ee827a282aca4999b596241195f43b4cc371d64fc6639da9e", size = 154244, upload-time = "2025-10-08T22:01:27.06Z" }, + { url = "https://files.pythonhosted.org/packages/db/e4/1e58409aa78eefa47ccd19779fc6f36787edbe7d4cd330eeeedb33a4515b/tomli-2.3.0-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:4c2ef0244c75aba9355561272009d934953817c49f47d768070c3c94355c2aa3", size = 148637, upload-time = "2025-10-08T22:01:28.059Z" }, + { url = "https://files.pythonhosted.org/packages/26/b6/d1eccb62f665e44359226811064596dd6a366ea1f985839c566cd61525ae/tomli-2.3.0-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:c22a8bf253bacc0cf11f35ad9808b6cb75ada2631c2d97c971122583b129afbc", size = 241925, upload-time = "2025-10-08T22:01:29.066Z" }, + { url = "https://files.pythonhosted.org/packages/70/91/7cdab9a03e6d3d2bb11beae108da5bdc1c34bdeb06e21163482544ddcc90/tomli-2.3.0-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:0eea8cc5c5e9f89c9b90c4896a8deefc74f518db5927d0e0e8d4a80953d774d0", size = 249045, upload-time = "2025-10-08T22:01:31.98Z" }, + { url = "https://files.pythonhosted.org/packages/15/1b/8c26874ed1f6e4f1fcfeb868db8a794cbe9f227299402db58cfcc858766c/tomli-2.3.0-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:b74a0e59ec5d15127acdabd75ea17726ac4c5178ae51b85bfe39c4f8a278e879", size = 245835, upload-time = "2025-10-08T22:01:32.989Z" }, + { url = "https://files.pythonhosted.org/packages/fd/42/8e3c6a9a4b1a1360c1a2a39f0b972cef2cc9ebd56025168c4137192a9321/tomli-2.3.0-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:b5870b50c9db823c595983571d1296a6ff3e1b88f734a4c8f6fc6188397de005", size = 253109, upload-time = "2025-10-08T22:01:34.052Z" }, + { url = "https://files.pythonhosted.org/packages/22/0c/b4da635000a71b5f80130937eeac12e686eefb376b8dee113b4a582bba42/tomli-2.3.0-cp314-cp314-win32.whl", hash = "sha256:feb0dacc61170ed7ab602d3d972a58f14ee3ee60494292d384649a3dc38ef463", size = 97930, upload-time = "2025-10-08T22:01:35.082Z" }, + { url = "https://files.pythonhosted.org/packages/b9/74/cb1abc870a418ae99cd5c9547d6bce30701a954e0e721821df483ef7223c/tomli-2.3.0-cp314-cp314-win_amd64.whl", hash = "sha256:b273fcbd7fc64dc3600c098e39136522650c49bca95df2d11cf3b626422392c8", size = 107964, upload-time = "2025-10-08T22:01:36.057Z" }, + { url = "https://files.pythonhosted.org/packages/54/78/5c46fff6432a712af9f792944f4fcd7067d8823157949f4e40c56b8b3c83/tomli-2.3.0-cp314-cp314t-macosx_10_13_x86_64.whl", hash = "sha256:940d56ee0410fa17ee1f12b817b37a4d4e4dc4d27340863cc67236c74f582e77", size = 163065, upload-time = "2025-10-08T22:01:37.27Z" }, + { url = "https://files.pythonhosted.org/packages/39/67/f85d9bd23182f45eca8939cd2bc7050e1f90c41f4a2ecbbd5963a1d1c486/tomli-2.3.0-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:f85209946d1fe94416debbb88d00eb92ce9cd5266775424ff81bc959e001acaf", size = 159088, upload-time = "2025-10-08T22:01:38.235Z" }, + { url = "https://files.pythonhosted.org/packages/26/5a/4b546a0405b9cc0659b399f12b6adb750757baf04250b148d3c5059fc4eb/tomli-2.3.0-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:a56212bdcce682e56b0aaf79e869ba5d15a6163f88d5451cbde388d48b13f530", size = 268193, upload-time = "2025-10-08T22:01:39.712Z" }, + { url = "https://files.pythonhosted.org/packages/42/4f/2c12a72ae22cf7b59a7fe75b3465b7aba40ea9145d026ba41cb382075b0e/tomli-2.3.0-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:c5f3ffd1e098dfc032d4d3af5c0ac64f6d286d98bc148698356847b80fa4de1b", size = 275488, upload-time = "2025-10-08T22:01:40.773Z" }, + { url = "https://files.pythonhosted.org/packages/92/04/a038d65dbe160c3aa5a624e93ad98111090f6804027d474ba9c37c8ae186/tomli-2.3.0-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:5e01decd096b1530d97d5d85cb4dff4af2d8347bd35686654a004f8dea20fc67", size = 272669, upload-time = "2025-10-08T22:01:41.824Z" }, + { url = "https://files.pythonhosted.org/packages/be/2f/8b7c60a9d1612a7cbc39ffcca4f21a73bf368a80fc25bccf8253e2563267/tomli-2.3.0-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:8a35dd0e643bb2610f156cca8db95d213a90015c11fee76c946aa62b7ae7e02f", size = 279709, upload-time = "2025-10-08T22:01:43.177Z" }, + { url = "https://files.pythonhosted.org/packages/7e/46/cc36c679f09f27ded940281c38607716c86cf8ba4a518d524e349c8b4874/tomli-2.3.0-cp314-cp314t-win32.whl", hash = "sha256:a1f7f282fe248311650081faafa5f4732bdbfef5d45fe3f2e702fbc6f2d496e0", size = 107563, upload-time = "2025-10-08T22:01:44.233Z" }, + { url = "https://files.pythonhosted.org/packages/84/ff/426ca8683cf7b753614480484f6437f568fd2fda2edbdf57a2d3d8b27a0b/tomli-2.3.0-cp314-cp314t-win_amd64.whl", hash = "sha256:70a251f8d4ba2d9ac2542eecf008b3c8a9fc5c3f9f02c56a9d7952612be2fdba", size = 119756, upload-time = "2025-10-08T22:01:45.234Z" }, + { url = "https://files.pythonhosted.org/packages/77/b8/0135fadc89e73be292b473cb820b4f5a08197779206b33191e801feeae40/tomli-2.3.0-py3-none-any.whl", hash = "sha256:e95b1af3c5b07d9e643909b5abbec77cd9f1217e6d0bca72b0234736b9fb1f1b", size = 14408, upload-time = "2025-10-08T22:01:46.04Z" }, +] + +[[package]] +name = "typing-extensions" +version = "4.7.1" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/3c/8b/0111dd7d6c1478bf83baa1cab85c686426c7a6274119aceb2bd9d35395ad/typing_extensions-4.7.1.tar.gz", hash = "sha256:b75ddc264f0ba5615db7ba217daeb99701ad295353c45f9e95963337ceeeffb2", size = 72876, upload-time = "2023-07-02T14:20:55.045Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/ec/6b/63cc3df74987c36fe26157ee12e09e8f9db4de771e0f3404263117e75b95/typing_extensions-4.7.1-py3-none-any.whl", hash = "sha256:440d5dd3af93b060174bf433bccd69b0babc3b15b1a8dca43789fd7f61514b36", size = 33232, upload-time = "2023-07-02T14:20:53.275Z" }, +] + +[[package]] +name = "urllib3" +version = "2.0.7" +source = { registry = "https://pypi.org/simple" } +resolution-markers = [ + "python_full_version < '3.8'", +] +sdist = { url = "https://files.pythonhosted.org/packages/af/47/b215df9f71b4fdba1025fc05a77db2ad243fa0926755a52c5e71659f4e3c/urllib3-2.0.7.tar.gz", hash = "sha256:c97dfde1f7bd43a71c8d2a58e369e9b2bf692d1334ea9f9cae55add7d0dd0f84", size = 282546, upload-time = "2023-10-17T17:46:50.542Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/d2/b2/b157855192a68541a91ba7b2bbcb91f1b4faa51f8bae38d8005c034be524/urllib3-2.0.7-py3-none-any.whl", hash = "sha256:fdb6d215c776278489906c2f8916e6e7d4f5a9b602ccbcfdf7f016fc8da0596e", size = 124213, upload-time = "2023-10-17T17:46:48.538Z" }, +] + +[[package]] +name = "urllib3" +version = "2.2.3" +source = { registry = "https://pypi.org/simple" } +resolution-markers = [ + "python_full_version >= '3.8.1' and python_full_version < '3.9'", + "python_full_version >= '3.8' and python_full_version < '3.8.1'", +] +sdist = { url = "https://files.pythonhosted.org/packages/ed/63/22ba4ebfe7430b76388e7cd448d5478814d3032121827c12a2cc287e2260/urllib3-2.2.3.tar.gz", hash = "sha256:e7d814a81dad81e6caf2ec9fdedb284ecc9c73076b62654547cc64ccdcae26e9", size = 300677, upload-time = "2024-09-12T10:52:18.401Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/ce/d9/5f4c13cecde62396b0d3fe530a50ccea91e7dfc1ccf0e09c228841bb5ba8/urllib3-2.2.3-py3-none-any.whl", hash = "sha256:ca899ca043dcb1bafa3e262d73aa25c465bfb49e0bd9dd5d59f1d0acba2f8fac", size = 126338, upload-time = "2024-09-12T10:52:16.589Z" }, +] + +[[package]] +name = "urllib3" +version = "2.5.0" +source = { registry = "https://pypi.org/simple" } +resolution-markers = [ + "python_full_version >= '3.12'", + "python_full_version == '3.11.*'", + "python_full_version == '3.10.*'", + "python_full_version == '3.9.*'", +] +sdist = { url = "https://files.pythonhosted.org/packages/15/22/9ee70a2574a4f4599c47dd506532914ce044817c7752a79b6a51286319bc/urllib3-2.5.0.tar.gz", hash = "sha256:3fc47733c7e419d4bc3f6b3dc2b4f890bb743906a30d56ba4a5bfa4bbff92760", size = 393185, upload-time = "2025-06-18T14:07:41.644Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/a7/c2/fe1e52489ae3122415c51f387e221dd0773709bad6c6cdaa599e8a2c5185/urllib3-2.5.0-py3-none-any.whl", hash = "sha256:e6b01673c0fa6a13e374b50871808eb3bf7046c4b125b216f6bf1cc604cff0dc", size = 129795, upload-time = "2025-06-18T14:07:40.39Z" }, +] + +[[package]] +name = "wcwidth" +version = "0.2.14" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/24/30/6b0809f4510673dc723187aeaf24c7f5459922d01e2f794277a3dfb90345/wcwidth-0.2.14.tar.gz", hash = "sha256:4d478375d31bc5395a3c55c40ccdf3354688364cd61c4f6adacaa9215d0b3605", size = 102293, upload-time = "2025-09-22T16:29:53.023Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/af/b5/123f13c975e9f27ab9c0770f514345bd406d0e8d3b7a0723af9d43f710af/wcwidth-0.2.14-py2.py3-none-any.whl", hash = "sha256:a7bb560c8aee30f9957e5f9895805edd20602f2d7f720186dfd906e82b4982e1", size = 37286, upload-time = "2025-09-22T16:29:51.641Z" }, +] + +[[package]] +name = "wheel" +version = "0.45.1" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/8a/98/2d9906746cdc6a6ef809ae6338005b3f21bb568bea3165cfc6a243fdc25c/wheel-0.45.1.tar.gz", hash = "sha256:661e1abd9198507b1409a20c02106d9670b2576e916d58f520316666abca6729", size = 107545, upload-time = "2024-11-23T00:18:23.513Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/0b/2c/87f3254fd8ffd29e4c02732eee68a83a1d3c346ae39bc6822dcbcb697f2b/wheel-0.45.1-py3-none-any.whl", hash = "sha256:708e7481cc80179af0e556bbf0cc00b8444c7321e2700b8d8580231d13017248", size = 72494, upload-time = "2024-11-23T00:18:21.207Z" }, +] + +[[package]] +name = "wrapt" +version = "1.16.0" +source = { registry = "https://pypi.org/simple" } +resolution-markers = [ + "python_full_version < '3.8'", +] +sdist = { url = "https://files.pythonhosted.org/packages/95/4c/063a912e20bcef7124e0df97282a8af3ff3e4b603ce84c481d6d7346be0a/wrapt-1.16.0.tar.gz", hash = "sha256:5f370f952971e7d17c7d1ead40e49f32345a7f7a5373571ef44d800d06b1899d", size = 53972, upload-time = "2023-11-09T06:33:30.191Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/a8/c6/5375258add3777494671d8cec27cdf5402abd91016dee24aa2972c61fedf/wrapt-1.16.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:ffa565331890b90056c01db69c0fe634a776f8019c143a5ae265f9c6bc4bd6d4", size = 37315, upload-time = "2023-11-09T06:31:34.487Z" }, + { url = "https://files.pythonhosted.org/packages/32/12/e11adfde33444986135d8881b401e4de6cbb4cced046edc6b464e6ad7547/wrapt-1.16.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:e4fdb9275308292e880dcbeb12546df7f3e0f96c6b41197e0cf37d2826359020", size = 38160, upload-time = "2023-11-09T06:31:36.931Z" }, + { url = "https://files.pythonhosted.org/packages/70/7d/3dcc4a7e96f8d3e398450ec7703db384413f79bd6c0196e0e139055ce00f/wrapt-1.16.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:bb2dee3874a500de01c93d5c71415fcaef1d858370d405824783e7a8ef5db440", size = 80419, upload-time = "2023-11-09T06:31:38.956Z" }, + { url = "https://files.pythonhosted.org/packages/d1/c4/8dfdc3c2f0b38be85c8d9fdf0011ebad2f54e40897f9549a356bebb63a97/wrapt-1.16.0-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:2a88e6010048489cda82b1326889ec075a8c856c2e6a256072b28eaee3ccf487", size = 72669, upload-time = "2023-11-09T06:31:40.741Z" }, + { url = "https://files.pythonhosted.org/packages/49/83/b40bc1ad04a868b5b5bcec86349f06c1ee1ea7afe51dc3e46131e4f39308/wrapt-1.16.0-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ac83a914ebaf589b69f7d0a1277602ff494e21f4c2f743313414378f8f50a4cf", size = 80271, upload-time = "2023-11-09T06:31:42.566Z" }, + { url = "https://files.pythonhosted.org/packages/19/d4/cd33d3a82df73a064c9b6401d14f346e1d2fb372885f0295516ec08ed2ee/wrapt-1.16.0-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:73aa7d98215d39b8455f103de64391cb79dfcad601701a3aa0dddacf74911d72", size = 84748, upload-time = "2023-11-09T06:31:44.718Z" }, + { url = "https://files.pythonhosted.org/packages/ef/58/2fde309415b5fa98fd8f5f4a11886cbf276824c4c64d45a39da342fff6fe/wrapt-1.16.0-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:807cc8543a477ab7422f1120a217054f958a66ef7314f76dd9e77d3f02cdccd0", size = 77522, upload-time = "2023-11-09T06:31:46.343Z" }, + { url = "https://files.pythonhosted.org/packages/07/44/359e4724a92369b88dbf09878a7cde7393cf3da885567ea898e5904049a3/wrapt-1.16.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:bf5703fdeb350e36885f2875d853ce13172ae281c56e509f4e6eca049bdfb136", size = 84780, upload-time = "2023-11-09T06:31:48.006Z" }, + { url = "https://files.pythonhosted.org/packages/88/8f/706f2fee019360cc1da652353330350c76aa5746b4e191082e45d6838faf/wrapt-1.16.0-cp310-cp310-win32.whl", hash = "sha256:f6b2d0c6703c988d334f297aa5df18c45e97b0af3679bb75059e0e0bd8b1069d", size = 35335, upload-time = "2023-11-09T06:31:49.517Z" }, + { url = "https://files.pythonhosted.org/packages/19/2b/548d23362e3002ebbfaefe649b833fa43f6ca37ac3e95472130c4b69e0b4/wrapt-1.16.0-cp310-cp310-win_amd64.whl", hash = "sha256:decbfa2f618fa8ed81c95ee18a387ff973143c656ef800c9f24fb7e9c16054e2", size = 37528, upload-time = "2023-11-09T06:31:50.803Z" }, + { url = "https://files.pythonhosted.org/packages/fd/03/c188ac517f402775b90d6f312955a5e53b866c964b32119f2ed76315697e/wrapt-1.16.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:1a5db485fe2de4403f13fafdc231b0dbae5eca4359232d2efc79025527375b09", size = 37313, upload-time = "2023-11-09T06:31:52.168Z" }, + { url = "https://files.pythonhosted.org/packages/0f/16/ea627d7817394db04518f62934a5de59874b587b792300991b3c347ff5e0/wrapt-1.16.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:75ea7d0ee2a15733684badb16de6794894ed9c55aa5e9903260922f0482e687d", size = 38164, upload-time = "2023-11-09T06:31:53.522Z" }, + { url = "https://files.pythonhosted.org/packages/7f/a7/f1212ba098f3de0fd244e2de0f8791ad2539c03bef6c05a9fcb03e45b089/wrapt-1.16.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a452f9ca3e3267cd4d0fcf2edd0d035b1934ac2bd7e0e57ac91ad6b95c0c6389", size = 80890, upload-time = "2023-11-09T06:31:55.247Z" }, + { url = "https://files.pythonhosted.org/packages/b7/96/bb5e08b3d6db003c9ab219c487714c13a237ee7dcc572a555eaf1ce7dc82/wrapt-1.16.0-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:43aa59eadec7890d9958748db829df269f0368521ba6dc68cc172d5d03ed8060", size = 73118, upload-time = "2023-11-09T06:31:57.023Z" }, + { url = "https://files.pythonhosted.org/packages/6e/52/2da48b35193e39ac53cfb141467d9f259851522d0e8c87153f0ba4205fb1/wrapt-1.16.0-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:72554a23c78a8e7aa02abbd699d129eead8b147a23c56e08d08dfc29cfdddca1", size = 80746, upload-time = "2023-11-09T06:31:58.686Z" }, + { url = "https://files.pythonhosted.org/packages/11/fb/18ec40265ab81c0e82a934de04596b6ce972c27ba2592c8b53d5585e6bcd/wrapt-1.16.0-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:d2efee35b4b0a347e0d99d28e884dfd82797852d62fcd7ebdeee26f3ceb72cf3", size = 85668, upload-time = "2023-11-09T06:31:59.992Z" }, + { url = "https://files.pythonhosted.org/packages/0f/ef/0ecb1fa23145560431b970418dce575cfaec555ab08617d82eb92afc7ccf/wrapt-1.16.0-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:6dcfcffe73710be01d90cae08c3e548d90932d37b39ef83969ae135d36ef3956", size = 78556, upload-time = "2023-11-09T06:32:01.942Z" }, + { url = "https://files.pythonhosted.org/packages/25/62/cd284b2b747f175b5a96cbd8092b32e7369edab0644c45784871528eb852/wrapt-1.16.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:eb6e651000a19c96f452c85132811d25e9264d836951022d6e81df2fff38337d", size = 85712, upload-time = "2023-11-09T06:32:03.686Z" }, + { url = "https://files.pythonhosted.org/packages/e5/a7/47b7ff74fbadf81b696872d5ba504966591a3468f1bc86bca2f407baef68/wrapt-1.16.0-cp311-cp311-win32.whl", hash = "sha256:66027d667efe95cc4fa945af59f92c5a02c6f5bb6012bff9e60542c74c75c362", size = 35327, upload-time = "2023-11-09T06:32:05.284Z" }, + { url = "https://files.pythonhosted.org/packages/cf/c3/0084351951d9579ae83a3d9e38c140371e4c6b038136909235079f2e6e78/wrapt-1.16.0-cp311-cp311-win_amd64.whl", hash = "sha256:aefbc4cb0a54f91af643660a0a150ce2c090d3652cf4052a5397fb2de549cd89", size = 37523, upload-time = "2023-11-09T06:32:07.17Z" }, + { url = "https://files.pythonhosted.org/packages/92/17/224132494c1e23521868cdd57cd1e903f3b6a7ba6996b7b8f077ff8ac7fe/wrapt-1.16.0-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:5eb404d89131ec9b4f748fa5cfb5346802e5ee8836f57d516576e61f304f3b7b", size = 37614, upload-time = "2023-11-09T06:32:08.859Z" }, + { url = "https://files.pythonhosted.org/packages/6a/d7/cfcd73e8f4858079ac59d9db1ec5a1349bc486ae8e9ba55698cc1f4a1dff/wrapt-1.16.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:9090c9e676d5236a6948330e83cb89969f433b1943a558968f659ead07cb3b36", size = 38316, upload-time = "2023-11-09T06:32:10.719Z" }, + { url = "https://files.pythonhosted.org/packages/7e/79/5ff0a5c54bda5aec75b36453d06be4f83d5cd4932cc84b7cb2b52cee23e2/wrapt-1.16.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:94265b00870aa407bd0cbcfd536f17ecde43b94fb8d228560a1e9d3041462d73", size = 86322, upload-time = "2023-11-09T06:32:12.592Z" }, + { url = "https://files.pythonhosted.org/packages/c4/81/e799bf5d419f422d8712108837c1d9bf6ebe3cb2a81ad94413449543a923/wrapt-1.16.0-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:f2058f813d4f2b5e3a9eb2eb3faf8f1d99b81c3e51aeda4b168406443e8ba809", size = 79055, upload-time = "2023-11-09T06:32:14.394Z" }, + { url = "https://files.pythonhosted.org/packages/62/62/30ca2405de6a20448ee557ab2cd61ab9c5900be7cbd18a2639db595f0b98/wrapt-1.16.0-cp312-cp312-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:98b5e1f498a8ca1858a1cdbffb023bfd954da4e3fa2c0cb5853d40014557248b", size = 87291, upload-time = "2023-11-09T06:32:16.201Z" }, + { url = "https://files.pythonhosted.org/packages/49/4e/5d2f6d7b57fc9956bf06e944eb00463551f7d52fc73ca35cfc4c2cdb7aed/wrapt-1.16.0-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:14d7dc606219cdd7405133c713f2c218d4252f2a469003f8c46bb92d5d095d81", size = 90374, upload-time = "2023-11-09T06:32:18.052Z" }, + { url = "https://files.pythonhosted.org/packages/a6/9b/c2c21b44ff5b9bf14a83252a8b973fb84923764ff63db3e6dfc3895cf2e0/wrapt-1.16.0-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:49aac49dc4782cb04f58986e81ea0b4768e4ff197b57324dcbd7699c5dfb40b9", size = 83896, upload-time = "2023-11-09T06:32:19.533Z" }, + { url = "https://files.pythonhosted.org/packages/14/26/93a9fa02c6f257df54d7570dfe8011995138118d11939a4ecd82cb849613/wrapt-1.16.0-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:418abb18146475c310d7a6dc71143d6f7adec5b004ac9ce08dc7a34e2babdc5c", size = 91738, upload-time = "2023-11-09T06:32:20.989Z" }, + { url = "https://files.pythonhosted.org/packages/a2/5b/4660897233eb2c8c4de3dc7cefed114c61bacb3c28327e64150dc44ee2f6/wrapt-1.16.0-cp312-cp312-win32.whl", hash = "sha256:685f568fa5e627e93f3b52fda002c7ed2fa1800b50ce51f6ed1d572d8ab3e7fc", size = 35568, upload-time = "2023-11-09T06:32:22.715Z" }, + { url = "https://files.pythonhosted.org/packages/5c/cc/8297f9658506b224aa4bd71906447dea6bb0ba629861a758c28f67428b91/wrapt-1.16.0-cp312-cp312-win_amd64.whl", hash = "sha256:dcdba5c86e368442528f7060039eda390cc4091bfd1dca41e8046af7c910dda8", size = 37653, upload-time = "2023-11-09T06:32:24.533Z" }, + { url = "https://files.pythonhosted.org/packages/47/cf/c2861bc5e0d5f4f277e1cefd7b3f8904794cc58469d35eaa82032a84e1c9/wrapt-1.16.0-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:a0ea261ce52b5952bf669684a251a66df239ec6d441ccb59ec7afa882265d593", size = 37069, upload-time = "2023-11-09T06:32:40.288Z" }, + { url = "https://files.pythonhosted.org/packages/54/39/04409d9fc89f77bce37b98545b6ee7247ad11df28373206536eea078a390/wrapt-1.16.0-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7bd2d7ff69a2cac767fbf7a2b206add2e9a210e57947dd7ce03e25d03d2de292", size = 77587, upload-time = "2023-11-09T06:32:41.818Z" }, + { url = "https://files.pythonhosted.org/packages/26/dd/1ea7cb367962a6132ab163e7b2d270049e0f471f0238d0e55cfd27219721/wrapt-1.16.0-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:9159485323798c8dc530a224bd3ffcf76659319ccc7bbd52e01e73bd0241a0c5", size = 69969, upload-time = "2023-11-09T06:32:43.405Z" }, + { url = "https://files.pythonhosted.org/packages/7f/46/896369f2550d1ecb5e776f532aada5e77e5e13f821045978cf3d7f3f236b/wrapt-1.16.0-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a86373cf37cd7764f2201b76496aba58a52e76dedfaa698ef9e9688bfd9e41cf", size = 77483, upload-time = "2023-11-09T06:32:45.011Z" }, + { url = "https://files.pythonhosted.org/packages/bf/42/1241b88440ccf8adbf78c81c8899001459102031cc52668cc4e749d9987e/wrapt-1.16.0-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:73870c364c11f03ed072dda68ff7aea6d2a3a5c3fe250d917a429c7432e15228", size = 82832, upload-time = "2023-11-09T06:32:46.57Z" }, + { url = "https://files.pythonhosted.org/packages/03/60/67dbc0624f1c86cce6150c0b2e13d906009fd6d33128add60a8a2d23137d/wrapt-1.16.0-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:b935ae30c6e7400022b50f8d359c03ed233d45b725cfdd299462f41ee5ffba6f", size = 75782, upload-time = "2023-11-09T06:32:47.924Z" }, + { url = "https://files.pythonhosted.org/packages/8e/5f/574076e289c42e7c1c2abe944fd9dafb5adcb20b36577d4966ddef145539/wrapt-1.16.0-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:db98ad84a55eb09b3c32a96c576476777e87c520a34e2519d3e59c44710c002c", size = 82949, upload-time = "2023-11-09T06:32:49.259Z" }, + { url = "https://files.pythonhosted.org/packages/78/98/6307b4da5080432c5a37b69da92ae0582fd284441025014047e98a002ea1/wrapt-1.16.0-cp37-cp37m-win32.whl", hash = "sha256:9153ed35fc5e4fa3b2fe97bddaa7cbec0ed22412b85bcdaf54aeba92ea37428c", size = 35182, upload-time = "2023-11-09T06:32:51.53Z" }, + { url = "https://files.pythonhosted.org/packages/66/a5/50e6a2bd4cbf6671012771ec35085807a375da5e61540bc5f62de62ba955/wrapt-1.16.0-cp37-cp37m-win_amd64.whl", hash = "sha256:66dfbaa7cfa3eb707bbfcd46dab2bc6207b005cbc9caa2199bcbc81d95071a00", size = 37314, upload-time = "2023-11-09T06:32:52.835Z" }, + { url = "https://files.pythonhosted.org/packages/fe/9e/d3bc95e75670ba15c5b25ecf07fc49941843e2678d777ca59339348d1c96/wrapt-1.16.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:1dd50a2696ff89f57bd8847647a1c363b687d3d796dc30d4dd4a9d1689a706f0", size = 37320, upload-time = "2023-11-09T06:32:54.263Z" }, + { url = "https://files.pythonhosted.org/packages/72/b5/0c9be75f826c8e8d583a4ab312552d63d9f7c0768710146a22ac59bda4a9/wrapt-1.16.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:44a2754372e32ab315734c6c73b24351d06e77ffff6ae27d2ecf14cf3d229202", size = 38163, upload-time = "2023-11-09T06:32:55.819Z" }, + { url = "https://files.pythonhosted.org/packages/69/21/b2ba809bafc9b6265e359f9c259c6d9a52a16cf6be20c72d95e76da609dd/wrapt-1.16.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8e9723528b9f787dc59168369e42ae1c3b0d3fadb2f1a71de14531d321ee05b0", size = 83535, upload-time = "2023-11-09T06:32:57.268Z" }, + { url = "https://files.pythonhosted.org/packages/58/43/d72e625edb5926483c9868214d25b5e7d5858ace6a80c9dfddfbadf4d8f9/wrapt-1.16.0-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:dbed418ba5c3dce92619656802cc5355cb679e58d0d89b50f116e4a9d5a9603e", size = 75975, upload-time = "2023-11-09T06:32:58.668Z" }, + { url = "https://files.pythonhosted.org/packages/ef/c6/56e718e2c58a4078518c14d97e531ef1e9e8a5c1ddafdc0d264a92be1a1a/wrapt-1.16.0-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:941988b89b4fd6b41c3f0bfb20e92bd23746579736b7343283297c4c8cbae68f", size = 83363, upload-time = "2023-11-09T06:33:00.529Z" }, + { url = "https://files.pythonhosted.org/packages/34/49/589db6fa2d5d428b71716815bca8b39196fdaeea7c247a719ed2f93b0ab4/wrapt-1.16.0-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:6a42cd0cfa8ffc1915aef79cb4284f6383d8a3e9dcca70c445dcfdd639d51267", size = 87739, upload-time = "2023-11-09T06:33:02.761Z" }, + { url = "https://files.pythonhosted.org/packages/c5/40/3eabe06c8dc54fada7364f34e8caa562efe3bf3f769bf3258de9c785a27f/wrapt-1.16.0-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:1ca9b6085e4f866bd584fb135a041bfc32cab916e69f714a7d1d397f8c4891ca", size = 80700, upload-time = "2023-11-09T06:33:05.225Z" }, + { url = "https://files.pythonhosted.org/packages/15/4e/081f59237b620a124b035f1229f55db40841a9339fdb8ef60b4decc44df9/wrapt-1.16.0-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:d5e49454f19ef621089e204f862388d29e6e8d8b162efce05208913dde5b9ad6", size = 87783, upload-time = "2023-11-09T06:33:07.929Z" }, + { url = "https://files.pythonhosted.org/packages/3a/ad/9d26a33bc80444ff97b937f94611f3b986fd40f735823558dfdf05ef9db8/wrapt-1.16.0-cp38-cp38-win32.whl", hash = "sha256:c31f72b1b6624c9d863fc095da460802f43a7c6868c5dda140f51da24fd47d7b", size = 35332, upload-time = "2023-11-09T06:33:09.647Z" }, + { url = "https://files.pythonhosted.org/packages/01/db/4b29ba5f97d2a0aa97ec41eba1036b7c3eaf6e61e1f4639420cec2463a01/wrapt-1.16.0-cp38-cp38-win_amd64.whl", hash = "sha256:490b0ee15c1a55be9c1bd8609b8cecd60e325f0575fc98f50058eae366e01f41", size = 37524, upload-time = "2023-11-09T06:33:11.083Z" }, + { url = "https://files.pythonhosted.org/packages/70/cc/b92e1da2cad6a9f8ee481000ece07a35e3b24e041e60ff8b850c079f0ebf/wrapt-1.16.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:9b201ae332c3637a42f02d1045e1d0cccfdc41f1f2f801dafbaa7e9b4797bfc2", size = 37314, upload-time = "2023-11-09T06:33:12.535Z" }, + { url = "https://files.pythonhosted.org/packages/4a/cc/3402bcc897978be00fef608cd9e3e39ec8869c973feeb5e1e277670e5ad2/wrapt-1.16.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:2076fad65c6736184e77d7d4729b63a6d1ae0b70da4868adeec40989858eb3fb", size = 38162, upload-time = "2023-11-09T06:33:14.102Z" }, + { url = "https://files.pythonhosted.org/packages/28/d3/4f079f649c515727c127c987b2ec2e0816b80d95784f2d28d1a57d2a1029/wrapt-1.16.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c5cd603b575ebceca7da5a3a251e69561bec509e0b46e4993e1cac402b7247b8", size = 80235, upload-time = "2023-11-09T06:33:15.446Z" }, + { url = "https://files.pythonhosted.org/packages/a3/1c/226c2a4932e578a2241dcb383f425995f80224b446f439c2e112eb51c3a6/wrapt-1.16.0-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:b47cfad9e9bbbed2339081f4e346c93ecd7ab504299403320bf85f7f85c7d46c", size = 72553, upload-time = "2023-11-09T06:33:17.315Z" }, + { url = "https://files.pythonhosted.org/packages/b1/e7/459a8a4f40f2fa65eb73cb3f339e6d152957932516d18d0e996c7ae2d7ae/wrapt-1.16.0-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f8212564d49c50eb4565e502814f694e240c55551a5f1bc841d4fcaabb0a9b8a", size = 80129, upload-time = "2023-11-09T06:33:18.858Z" }, + { url = "https://files.pythonhosted.org/packages/da/6f/6d0b3c4983f1fc764a422989dabc268ee87d937763246cd48aa92f1eed1e/wrapt-1.16.0-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:5f15814a33e42b04e3de432e573aa557f9f0f56458745c2074952f564c50e664", size = 84550, upload-time = "2023-11-09T06:33:20.267Z" }, + { url = "https://files.pythonhosted.org/packages/96/e8/27ef35cf61e5147c1c3abcb89cfbb8d691b2bb8364803fcc950140bc14d8/wrapt-1.16.0-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:db2e408d983b0e61e238cf579c09ef7020560441906ca990fe8412153e3b291f", size = 77352, upload-time = "2023-11-09T06:33:22.041Z" }, + { url = "https://files.pythonhosted.org/packages/b6/ad/7a0766341081bfd9f18a7049e4d6d45586ae5c5bb0a640f05e2f558e849c/wrapt-1.16.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:edfad1d29c73f9b863ebe7082ae9321374ccb10879eeabc84ba3b69f2579d537", size = 84626, upload-time = "2023-11-09T06:33:23.634Z" }, + { url = "https://files.pythonhosted.org/packages/09/43/b26852e9c45a1aac0d14b1080b25b612fa840ba99739c5fc55db07b7ce08/wrapt-1.16.0-cp39-cp39-win32.whl", hash = "sha256:ed867c42c268f876097248e05b6117a65bcd1e63b779e916fe2e33cd6fd0d3c3", size = 35327, upload-time = "2023-11-09T06:33:25.43Z" }, + { url = "https://files.pythonhosted.org/packages/74/f2/96ed140b08743f7f68d5bda35a2a589600781366c3da96f056043d258b1a/wrapt-1.16.0-cp39-cp39-win_amd64.whl", hash = "sha256:eb1b046be06b0fce7249f1d025cd359b4b80fc1c3e24ad9eca33e0dcdb2e4a35", size = 37526, upload-time = "2023-11-09T06:33:26.882Z" }, + { url = "https://files.pythonhosted.org/packages/ff/21/abdedb4cdf6ff41ebf01a74087740a709e2edb146490e4d9beea054b0b7a/wrapt-1.16.0-py3-none-any.whl", hash = "sha256:6906c4100a8fcbf2fa735f6059214bb13b97f75b1a61777fcf6432121ef12ef1", size = 23362, upload-time = "2023-11-09T06:33:28.271Z" }, +] + +[[package]] +name = "wrapt" +version = "1.17.3" +source = { registry = "https://pypi.org/simple" } +resolution-markers = [ + "python_full_version >= '3.12'", + "python_full_version == '3.11.*'", + "python_full_version == '3.10.*'", + "python_full_version == '3.9.*'", + "python_full_version >= '3.8.1' and python_full_version < '3.9'", + "python_full_version >= '3.8' and python_full_version < '3.8.1'", +] +sdist = { url = "https://files.pythonhosted.org/packages/95/8f/aeb76c5b46e273670962298c23e7ddde79916cb74db802131d49a85e4b7d/wrapt-1.17.3.tar.gz", hash = "sha256:f66eb08feaa410fe4eebd17f2a2c8e2e46d3476e9f8c783daa8e09e0faa666d0", size = 55547, upload-time = "2025-08-12T05:53:21.714Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/3f/23/bb82321b86411eb51e5a5db3fb8f8032fd30bd7c2d74bfe936136b2fa1d6/wrapt-1.17.3-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:88bbae4d40d5a46142e70d58bf664a89b6b4befaea7b2ecc14e03cedb8e06c04", size = 53482, upload-time = "2025-08-12T05:51:44.467Z" }, + { url = "https://files.pythonhosted.org/packages/45/69/f3c47642b79485a30a59c63f6d739ed779fb4cc8323205d047d741d55220/wrapt-1.17.3-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:e6b13af258d6a9ad602d57d889f83b9d5543acd471eee12eb51f5b01f8eb1bc2", size = 38676, upload-time = "2025-08-12T05:51:32.636Z" }, + { url = "https://files.pythonhosted.org/packages/d1/71/e7e7f5670c1eafd9e990438e69d8fb46fa91a50785332e06b560c869454f/wrapt-1.17.3-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:fd341868a4b6714a5962c1af0bd44f7c404ef78720c7de4892901e540417111c", size = 38957, upload-time = "2025-08-12T05:51:54.655Z" }, + { url = "https://files.pythonhosted.org/packages/de/17/9f8f86755c191d6779d7ddead1a53c7a8aa18bccb7cea8e7e72dfa6a8a09/wrapt-1.17.3-cp310-cp310-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:f9b2601381be482f70e5d1051a5965c25fb3625455a2bf520b5a077b22afb775", size = 81975, upload-time = "2025-08-12T05:52:30.109Z" }, + { url = "https://files.pythonhosted.org/packages/f2/15/dd576273491f9f43dd09fce517f6c2ce6eb4fe21681726068db0d0467096/wrapt-1.17.3-cp310-cp310-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:343e44b2a8e60e06a7e0d29c1671a0d9951f59174f3709962b5143f60a2a98bd", size = 83149, upload-time = "2025-08-12T05:52:09.316Z" }, + { url = "https://files.pythonhosted.org/packages/0c/c4/5eb4ce0d4814521fee7aa806264bf7a114e748ad05110441cd5b8a5c744b/wrapt-1.17.3-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:33486899acd2d7d3066156b03465b949da3fd41a5da6e394ec49d271baefcf05", size = 82209, upload-time = "2025-08-12T05:52:10.331Z" }, + { url = "https://files.pythonhosted.org/packages/31/4b/819e9e0eb5c8dc86f60dfc42aa4e2c0d6c3db8732bce93cc752e604bb5f5/wrapt-1.17.3-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:e6f40a8aa5a92f150bdb3e1c44b7e98fb7113955b2e5394122fa5532fec4b418", size = 81551, upload-time = "2025-08-12T05:52:31.137Z" }, + { url = "https://files.pythonhosted.org/packages/f8/83/ed6baf89ba3a56694700139698cf703aac9f0f9eb03dab92f57551bd5385/wrapt-1.17.3-cp310-cp310-win32.whl", hash = "sha256:a36692b8491d30a8c75f1dfee65bef119d6f39ea84ee04d9f9311f83c5ad9390", size = 36464, upload-time = "2025-08-12T05:53:01.204Z" }, + { url = "https://files.pythonhosted.org/packages/2f/90/ee61d36862340ad7e9d15a02529df6b948676b9a5829fd5e16640156627d/wrapt-1.17.3-cp310-cp310-win_amd64.whl", hash = "sha256:afd964fd43b10c12213574db492cb8f73b2f0826c8df07a68288f8f19af2ebe6", size = 38748, upload-time = "2025-08-12T05:53:00.209Z" }, + { url = "https://files.pythonhosted.org/packages/bd/c3/cefe0bd330d389c9983ced15d326f45373f4073c9f4a8c2f99b50bfea329/wrapt-1.17.3-cp310-cp310-win_arm64.whl", hash = "sha256:af338aa93554be859173c39c85243970dc6a289fa907402289eeae7543e1ae18", size = 36810, upload-time = "2025-08-12T05:52:51.906Z" }, + { url = "https://files.pythonhosted.org/packages/52/db/00e2a219213856074a213503fdac0511203dceefff26e1daa15250cc01a0/wrapt-1.17.3-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:273a736c4645e63ac582c60a56b0acb529ef07f78e08dc6bfadf6a46b19c0da7", size = 53482, upload-time = "2025-08-12T05:51:45.79Z" }, + { url = "https://files.pythonhosted.org/packages/5e/30/ca3c4a5eba478408572096fe9ce36e6e915994dd26a4e9e98b4f729c06d9/wrapt-1.17.3-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:5531d911795e3f935a9c23eb1c8c03c211661a5060aab167065896bbf62a5f85", size = 38674, upload-time = "2025-08-12T05:51:34.629Z" }, + { url = "https://files.pythonhosted.org/packages/31/25/3e8cc2c46b5329c5957cec959cb76a10718e1a513309c31399a4dad07eb3/wrapt-1.17.3-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:0610b46293c59a3adbae3dee552b648b984176f8562ee0dba099a56cfbe4df1f", size = 38959, upload-time = "2025-08-12T05:51:56.074Z" }, + { url = "https://files.pythonhosted.org/packages/5d/8f/a32a99fc03e4b37e31b57cb9cefc65050ea08147a8ce12f288616b05ef54/wrapt-1.17.3-cp311-cp311-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:b32888aad8b6e68f83a8fdccbf3165f5469702a7544472bdf41f582970ed3311", size = 82376, upload-time = "2025-08-12T05:52:32.134Z" }, + { url = "https://files.pythonhosted.org/packages/31/57/4930cb8d9d70d59c27ee1332a318c20291749b4fba31f113c2f8ac49a72e/wrapt-1.17.3-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:8cccf4f81371f257440c88faed6b74f1053eef90807b77e31ca057b2db74edb1", size = 83604, upload-time = "2025-08-12T05:52:11.663Z" }, + { url = "https://files.pythonhosted.org/packages/a8/f3/1afd48de81d63dd66e01b263a6fbb86e1b5053b419b9b33d13e1f6d0f7d0/wrapt-1.17.3-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:d8a210b158a34164de8bb68b0e7780041a903d7b00c87e906fb69928bf7890d5", size = 82782, upload-time = "2025-08-12T05:52:12.626Z" }, + { url = "https://files.pythonhosted.org/packages/1e/d7/4ad5327612173b144998232f98a85bb24b60c352afb73bc48e3e0d2bdc4e/wrapt-1.17.3-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:79573c24a46ce11aab457b472efd8d125e5a51da2d1d24387666cd85f54c05b2", size = 82076, upload-time = "2025-08-12T05:52:33.168Z" }, + { url = "https://files.pythonhosted.org/packages/bb/59/e0adfc831674a65694f18ea6dc821f9fcb9ec82c2ce7e3d73a88ba2e8718/wrapt-1.17.3-cp311-cp311-win32.whl", hash = "sha256:c31eebe420a9a5d2887b13000b043ff6ca27c452a9a22fa71f35f118e8d4bf89", size = 36457, upload-time = "2025-08-12T05:53:03.936Z" }, + { url = "https://files.pythonhosted.org/packages/83/88/16b7231ba49861b6f75fc309b11012ede4d6b0a9c90969d9e0db8d991aeb/wrapt-1.17.3-cp311-cp311-win_amd64.whl", hash = "sha256:0b1831115c97f0663cb77aa27d381237e73ad4f721391a9bfb2fe8bc25fa6e77", size = 38745, upload-time = "2025-08-12T05:53:02.885Z" }, + { url = "https://files.pythonhosted.org/packages/9a/1e/c4d4f3398ec073012c51d1c8d87f715f56765444e1a4b11e5180577b7e6e/wrapt-1.17.3-cp311-cp311-win_arm64.whl", hash = "sha256:5a7b3c1ee8265eb4c8f1b7d29943f195c00673f5ab60c192eba2d4a7eae5f46a", size = 36806, upload-time = "2025-08-12T05:52:53.368Z" }, + { url = "https://files.pythonhosted.org/packages/9f/41/cad1aba93e752f1f9268c77270da3c469883d56e2798e7df6240dcb2287b/wrapt-1.17.3-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:ab232e7fdb44cdfbf55fc3afa31bcdb0d8980b9b95c38b6405df2acb672af0e0", size = 53998, upload-time = "2025-08-12T05:51:47.138Z" }, + { url = "https://files.pythonhosted.org/packages/60/f8/096a7cc13097a1869fe44efe68dace40d2a16ecb853141394047f0780b96/wrapt-1.17.3-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:9baa544e6acc91130e926e8c802a17f3b16fbea0fd441b5a60f5cf2cc5c3deba", size = 39020, upload-time = "2025-08-12T05:51:35.906Z" }, + { url = "https://files.pythonhosted.org/packages/33/df/bdf864b8997aab4febb96a9ae5c124f700a5abd9b5e13d2a3214ec4be705/wrapt-1.17.3-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:6b538e31eca1a7ea4605e44f81a48aa24c4632a277431a6ed3f328835901f4fd", size = 39098, upload-time = "2025-08-12T05:51:57.474Z" }, + { url = "https://files.pythonhosted.org/packages/9f/81/5d931d78d0eb732b95dc3ddaeeb71c8bb572fb01356e9133916cd729ecdd/wrapt-1.17.3-cp312-cp312-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:042ec3bb8f319c147b1301f2393bc19dba6e176b7da446853406d041c36c7828", size = 88036, upload-time = "2025-08-12T05:52:34.784Z" }, + { url = "https://files.pythonhosted.org/packages/ca/38/2e1785df03b3d72d34fc6252d91d9d12dc27a5c89caef3335a1bbb8908ca/wrapt-1.17.3-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:3af60380ba0b7b5aeb329bc4e402acd25bd877e98b3727b0135cb5c2efdaefe9", size = 88156, upload-time = "2025-08-12T05:52:13.599Z" }, + { url = "https://files.pythonhosted.org/packages/b3/8b/48cdb60fe0603e34e05cffda0b2a4adab81fd43718e11111a4b0100fd7c1/wrapt-1.17.3-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:0b02e424deef65c9f7326d8c19220a2c9040c51dc165cddb732f16198c168396", size = 87102, upload-time = "2025-08-12T05:52:14.56Z" }, + { url = "https://files.pythonhosted.org/packages/3c/51/d81abca783b58f40a154f1b2c56db1d2d9e0d04fa2d4224e357529f57a57/wrapt-1.17.3-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:74afa28374a3c3a11b3b5e5fca0ae03bef8450d6aa3ab3a1e2c30e3a75d023dc", size = 87732, upload-time = "2025-08-12T05:52:36.165Z" }, + { url = "https://files.pythonhosted.org/packages/9e/b1/43b286ca1392a006d5336412d41663eeef1ad57485f3e52c767376ba7e5a/wrapt-1.17.3-cp312-cp312-win32.whl", hash = "sha256:4da9f45279fff3543c371d5ababc57a0384f70be244de7759c85a7f989cb4ebe", size = 36705, upload-time = "2025-08-12T05:53:07.123Z" }, + { url = "https://files.pythonhosted.org/packages/28/de/49493f962bd3c586ab4b88066e967aa2e0703d6ef2c43aa28cb83bf7b507/wrapt-1.17.3-cp312-cp312-win_amd64.whl", hash = "sha256:e71d5c6ebac14875668a1e90baf2ea0ef5b7ac7918355850c0908ae82bcb297c", size = 38877, upload-time = "2025-08-12T05:53:05.436Z" }, + { url = "https://files.pythonhosted.org/packages/f1/48/0f7102fe9cb1e8a5a77f80d4f0956d62d97034bbe88d33e94699f99d181d/wrapt-1.17.3-cp312-cp312-win_arm64.whl", hash = "sha256:604d076c55e2fdd4c1c03d06dc1a31b95130010517b5019db15365ec4a405fc6", size = 36885, upload-time = "2025-08-12T05:52:54.367Z" }, + { url = "https://files.pythonhosted.org/packages/fc/f6/759ece88472157acb55fc195e5b116e06730f1b651b5b314c66291729193/wrapt-1.17.3-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:a47681378a0439215912ef542c45a783484d4dd82bac412b71e59cf9c0e1cea0", size = 54003, upload-time = "2025-08-12T05:51:48.627Z" }, + { url = "https://files.pythonhosted.org/packages/4f/a9/49940b9dc6d47027dc850c116d79b4155f15c08547d04db0f07121499347/wrapt-1.17.3-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:54a30837587c6ee3cd1a4d1c2ec5d24e77984d44e2f34547e2323ddb4e22eb77", size = 39025, upload-time = "2025-08-12T05:51:37.156Z" }, + { url = "https://files.pythonhosted.org/packages/45/35/6a08de0f2c96dcdd7fe464d7420ddb9a7655a6561150e5fc4da9356aeaab/wrapt-1.17.3-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:16ecf15d6af39246fe33e507105d67e4b81d8f8d2c6598ff7e3ca1b8a37213f7", size = 39108, upload-time = "2025-08-12T05:51:58.425Z" }, + { url = "https://files.pythonhosted.org/packages/0c/37/6faf15cfa41bf1f3dba80cd3f5ccc6622dfccb660ab26ed79f0178c7497f/wrapt-1.17.3-cp313-cp313-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:6fd1ad24dc235e4ab88cda009e19bf347aabb975e44fd5c2fb22a3f6e4141277", size = 88072, upload-time = "2025-08-12T05:52:37.53Z" }, + { url = "https://files.pythonhosted.org/packages/78/f2/efe19ada4a38e4e15b6dff39c3e3f3f73f5decf901f66e6f72fe79623a06/wrapt-1.17.3-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:0ed61b7c2d49cee3c027372df5809a59d60cf1b6c2f81ee980a091f3afed6a2d", size = 88214, upload-time = "2025-08-12T05:52:15.886Z" }, + { url = "https://files.pythonhosted.org/packages/40/90/ca86701e9de1622b16e09689fc24b76f69b06bb0150990f6f4e8b0eeb576/wrapt-1.17.3-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:423ed5420ad5f5529db9ce89eac09c8a2f97da18eb1c870237e84c5a5c2d60aa", size = 87105, upload-time = "2025-08-12T05:52:17.914Z" }, + { url = "https://files.pythonhosted.org/packages/fd/e0/d10bd257c9a3e15cbf5523025252cc14d77468e8ed644aafb2d6f54cb95d/wrapt-1.17.3-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:e01375f275f010fcbf7f643b4279896d04e571889b8a5b3f848423d91bf07050", size = 87766, upload-time = "2025-08-12T05:52:39.243Z" }, + { url = "https://files.pythonhosted.org/packages/e8/cf/7d848740203c7b4b27eb55dbfede11aca974a51c3d894f6cc4b865f42f58/wrapt-1.17.3-cp313-cp313-win32.whl", hash = "sha256:53e5e39ff71b3fc484df8a522c933ea2b7cdd0d5d15ae82e5b23fde87d44cbd8", size = 36711, upload-time = "2025-08-12T05:53:10.074Z" }, + { url = "https://files.pythonhosted.org/packages/57/54/35a84d0a4d23ea675994104e667ceff49227ce473ba6a59ba2c84f250b74/wrapt-1.17.3-cp313-cp313-win_amd64.whl", hash = "sha256:1f0b2f40cf341ee8cc1a97d51ff50dddb9fcc73241b9143ec74b30fc4f44f6cb", size = 38885, upload-time = "2025-08-12T05:53:08.695Z" }, + { url = "https://files.pythonhosted.org/packages/01/77/66e54407c59d7b02a3c4e0af3783168fff8e5d61def52cda8728439d86bc/wrapt-1.17.3-cp313-cp313-win_arm64.whl", hash = "sha256:7425ac3c54430f5fc5e7b6f41d41e704db073309acfc09305816bc6a0b26bb16", size = 36896, upload-time = "2025-08-12T05:52:55.34Z" }, + { url = "https://files.pythonhosted.org/packages/02/a2/cd864b2a14f20d14f4c496fab97802001560f9f41554eef6df201cd7f76c/wrapt-1.17.3-cp314-cp314-macosx_10_13_universal2.whl", hash = "sha256:cf30f6e3c077c8e6a9a7809c94551203c8843e74ba0c960f4a98cd80d4665d39", size = 54132, upload-time = "2025-08-12T05:51:49.864Z" }, + { url = "https://files.pythonhosted.org/packages/d5/46/d011725b0c89e853dc44cceb738a307cde5d240d023d6d40a82d1b4e1182/wrapt-1.17.3-cp314-cp314-macosx_10_13_x86_64.whl", hash = "sha256:e228514a06843cae89621384cfe3a80418f3c04aadf8a3b14e46a7be704e4235", size = 39091, upload-time = "2025-08-12T05:51:38.935Z" }, + { url = "https://files.pythonhosted.org/packages/2e/9e/3ad852d77c35aae7ddebdbc3b6d35ec8013af7d7dddad0ad911f3d891dae/wrapt-1.17.3-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:5ea5eb3c0c071862997d6f3e02af1d055f381b1d25b286b9d6644b79db77657c", size = 39172, upload-time = "2025-08-12T05:51:59.365Z" }, + { url = "https://files.pythonhosted.org/packages/c3/f7/c983d2762bcce2326c317c26a6a1e7016f7eb039c27cdf5c4e30f4160f31/wrapt-1.17.3-cp314-cp314-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:281262213373b6d5e4bb4353bc36d1ba4084e6d6b5d242863721ef2bf2c2930b", size = 87163, upload-time = "2025-08-12T05:52:40.965Z" }, + { url = "https://files.pythonhosted.org/packages/e4/0f/f673f75d489c7f22d17fe0193e84b41540d962f75fce579cf6873167c29b/wrapt-1.17.3-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:dc4a8d2b25efb6681ecacad42fca8859f88092d8732b170de6a5dddd80a1c8fa", size = 87963, upload-time = "2025-08-12T05:52:20.326Z" }, + { url = "https://files.pythonhosted.org/packages/df/61/515ad6caca68995da2fac7a6af97faab8f78ebe3bf4f761e1b77efbc47b5/wrapt-1.17.3-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:373342dd05b1d07d752cecbec0c41817231f29f3a89aa8b8843f7b95992ed0c7", size = 86945, upload-time = "2025-08-12T05:52:21.581Z" }, + { url = "https://files.pythonhosted.org/packages/d3/bd/4e70162ce398462a467bc09e768bee112f1412e563620adc353de9055d33/wrapt-1.17.3-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:d40770d7c0fd5cbed9d84b2c3f2e156431a12c9a37dc6284060fb4bec0b7ffd4", size = 86857, upload-time = "2025-08-12T05:52:43.043Z" }, + { url = "https://files.pythonhosted.org/packages/2b/b8/da8560695e9284810b8d3df8a19396a6e40e7518059584a1a394a2b35e0a/wrapt-1.17.3-cp314-cp314-win32.whl", hash = "sha256:fbd3c8319de8e1dc79d346929cd71d523622da527cca14e0c1d257e31c2b8b10", size = 37178, upload-time = "2025-08-12T05:53:12.605Z" }, + { url = "https://files.pythonhosted.org/packages/db/c8/b71eeb192c440d67a5a0449aaee2310a1a1e8eca41676046f99ed2487e9f/wrapt-1.17.3-cp314-cp314-win_amd64.whl", hash = "sha256:e1a4120ae5705f673727d3253de3ed0e016f7cd78dc463db1b31e2463e1f3cf6", size = 39310, upload-time = "2025-08-12T05:53:11.106Z" }, + { url = "https://files.pythonhosted.org/packages/45/20/2cda20fd4865fa40f86f6c46ed37a2a8356a7a2fde0773269311f2af56c7/wrapt-1.17.3-cp314-cp314-win_arm64.whl", hash = "sha256:507553480670cab08a800b9463bdb881b2edeed77dc677b0a5915e6106e91a58", size = 37266, upload-time = "2025-08-12T05:52:56.531Z" }, + { url = "https://files.pythonhosted.org/packages/77/ed/dd5cf21aec36c80443c6f900449260b80e2a65cf963668eaef3b9accce36/wrapt-1.17.3-cp314-cp314t-macosx_10_13_universal2.whl", hash = "sha256:ed7c635ae45cfbc1a7371f708727bf74690daedc49b4dba310590ca0bd28aa8a", size = 56544, upload-time = "2025-08-12T05:51:51.109Z" }, + { url = "https://files.pythonhosted.org/packages/8d/96/450c651cc753877ad100c7949ab4d2e2ecc4d97157e00fa8f45df682456a/wrapt-1.17.3-cp314-cp314t-macosx_10_13_x86_64.whl", hash = "sha256:249f88ed15503f6492a71f01442abddd73856a0032ae860de6d75ca62eed8067", size = 40283, upload-time = "2025-08-12T05:51:39.912Z" }, + { url = "https://files.pythonhosted.org/packages/d1/86/2fcad95994d9b572db57632acb6f900695a648c3e063f2cd344b3f5c5a37/wrapt-1.17.3-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:5a03a38adec8066d5a37bea22f2ba6bbf39fcdefbe2d91419ab864c3fb515454", size = 40366, upload-time = "2025-08-12T05:52:00.693Z" }, + { url = "https://files.pythonhosted.org/packages/64/0e/f4472f2fdde2d4617975144311f8800ef73677a159be7fe61fa50997d6c0/wrapt-1.17.3-cp314-cp314t-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:5d4478d72eb61c36e5b446e375bbc49ed002430d17cdec3cecb36993398e1a9e", size = 108571, upload-time = "2025-08-12T05:52:44.521Z" }, + { url = "https://files.pythonhosted.org/packages/cc/01/9b85a99996b0a97c8a17484684f206cbb6ba73c1ce6890ac668bcf3838fb/wrapt-1.17.3-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:223db574bb38637e8230eb14b185565023ab624474df94d2af18f1cdb625216f", size = 113094, upload-time = "2025-08-12T05:52:22.618Z" }, + { url = "https://files.pythonhosted.org/packages/25/02/78926c1efddcc7b3aa0bc3d6b33a822f7d898059f7cd9ace8c8318e559ef/wrapt-1.17.3-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:e405adefb53a435f01efa7ccdec012c016b5a1d3f35459990afc39b6be4d5056", size = 110659, upload-time = "2025-08-12T05:52:24.057Z" }, + { url = "https://files.pythonhosted.org/packages/dc/ee/c414501ad518ac3e6fe184753632fe5e5ecacdcf0effc23f31c1e4f7bfcf/wrapt-1.17.3-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:88547535b787a6c9ce4086917b6e1d291aa8ed914fdd3a838b3539dc95c12804", size = 106946, upload-time = "2025-08-12T05:52:45.976Z" }, + { url = "https://files.pythonhosted.org/packages/be/44/a1bd64b723d13bb151d6cc91b986146a1952385e0392a78567e12149c7b4/wrapt-1.17.3-cp314-cp314t-win32.whl", hash = "sha256:41b1d2bc74c2cac6f9074df52b2efbef2b30bdfe5f40cb78f8ca22963bc62977", size = 38717, upload-time = "2025-08-12T05:53:15.214Z" }, + { url = "https://files.pythonhosted.org/packages/79/d9/7cfd5a312760ac4dd8bf0184a6ee9e43c33e47f3dadc303032ce012b8fa3/wrapt-1.17.3-cp314-cp314t-win_amd64.whl", hash = "sha256:73d496de46cd2cdbdbcce4ae4bcdb4afb6a11234a1df9c085249d55166b95116", size = 41334, upload-time = "2025-08-12T05:53:14.178Z" }, + { url = "https://files.pythonhosted.org/packages/46/78/10ad9781128ed2f99dbc474f43283b13fea8ba58723e98844367531c18e9/wrapt-1.17.3-cp314-cp314t-win_arm64.whl", hash = "sha256:f38e60678850c42461d4202739f9bf1e3a737c7ad283638251e79cc49effb6b6", size = 38471, upload-time = "2025-08-12T05:52:57.784Z" }, + { url = "https://files.pythonhosted.org/packages/74/2b/035dfac90dcf051e892d777c0921a979047f9fba8ad47555957c06bca89d/wrapt-1.17.3-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:70d86fa5197b8947a2fa70260b48e400bf2ccacdcab97bb7de47e3d1e6312225", size = 53237, upload-time = "2025-08-12T05:51:52.096Z" }, + { url = "https://files.pythonhosted.org/packages/b3/85/af1173e9ca8e5bd30371c2367fed2f02e07d0a41869adfd8ce0e2dac25e0/wrapt-1.17.3-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:df7d30371a2accfe4013e90445f6388c570f103d61019b6b7c57e0265250072a", size = 38469, upload-time = "2025-08-12T05:51:41.418Z" }, + { url = "https://files.pythonhosted.org/packages/6a/b1/cbe84085aa5a8decf9bd4af53159e64270110781b810f3df7fa5672a2b1a/wrapt-1.17.3-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:caea3e9c79d5f0d2c6d9ab96111601797ea5da8e6d0723f77eabb0d4068d2b2f", size = 38728, upload-time = "2025-08-12T05:52:01.704Z" }, + { url = "https://files.pythonhosted.org/packages/f5/69/f1353697728dab653f1d4267c4a5d4448f1d8cf1f5dda5b4ffbcf2d68904/wrapt-1.17.3-cp38-cp38-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:758895b01d546812d1f42204bd443b8c433c44d090248bf22689df673ccafe00", size = 84873, upload-time = "2025-08-12T05:52:47.077Z" }, + { url = "https://files.pythonhosted.org/packages/94/7f/681648d484ba20d8bde8e128f84775439ff15c0c2bb4a98fb3dd15c3dc16/wrapt-1.17.3-cp38-cp38-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:02b551d101f31694fc785e58e0720ef7d9a10c4e62c1c9358ce6f63f23e30a56", size = 85962, upload-time = "2025-08-12T05:52:25.127Z" }, + { url = "https://files.pythonhosted.org/packages/bd/ba/656e1a9fd72d5b0110e86eeafb51ed4e2b1fab83f5ceb933315b3b13bb4b/wrapt-1.17.3-cp38-cp38-musllinux_1_2_aarch64.whl", hash = "sha256:656873859b3b50eeebe6db8b1455e99d90c26ab058db8e427046dbc35c3140a5", size = 84277, upload-time = "2025-08-12T05:52:26.208Z" }, + { url = "https://files.pythonhosted.org/packages/21/25/2f16a3f05a465a29675c7ce835e87e34525d5f302b52f7ba4d5665b25697/wrapt-1.17.3-cp38-cp38-musllinux_1_2_x86_64.whl", hash = "sha256:a9a2203361a6e6404f80b99234fe7fb37d1fc73487b5a78dc1aa5b97201e0f22", size = 83790, upload-time = "2025-08-12T05:52:48.107Z" }, + { url = "https://files.pythonhosted.org/packages/3f/2e/488624ef15112dd5f4e5706e48dd8b493155b1887b6c8f92c08c17d55431/wrapt-1.17.3-cp38-cp38-win32.whl", hash = "sha256:55cbbc356c2842f39bcc553cf695932e8b30e30e797f961860afb308e6b1bb7c", size = 36399, upload-time = "2025-08-12T05:53:17.249Z" }, + { url = "https://files.pythonhosted.org/packages/44/13/dc0dfdc88f84d70ee4cc3a5a9a8088e6ce6cb47ecf7665daec82220367e9/wrapt-1.17.3-cp38-cp38-win_amd64.whl", hash = "sha256:ad85e269fe54d506b240d2d7b9f5f2057c2aa9a2ea5b32c66f8902f768117ed2", size = 38681, upload-time = "2025-08-12T05:53:16.239Z" }, + { url = "https://files.pythonhosted.org/packages/41/be/be9b3b0a461ee3e30278706f3f3759b9b69afeedef7fe686036286c04ac6/wrapt-1.17.3-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:30ce38e66630599e1193798285706903110d4f057aab3168a34b7fdc85569afc", size = 53485, upload-time = "2025-08-12T05:51:53.11Z" }, + { url = "https://files.pythonhosted.org/packages/b3/a8/8f61d6b8f526efc8c10e12bf80b4206099fea78ade70427846a37bc9cbea/wrapt-1.17.3-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:65d1d00fbfb3ea5f20add88bbc0f815150dbbde3b026e6c24759466c8b5a9ef9", size = 38675, upload-time = "2025-08-12T05:51:42.885Z" }, + { url = "https://files.pythonhosted.org/packages/48/f1/23950c29a25637b74b322f9e425a17cc01a478f6afb35138ecb697f9558d/wrapt-1.17.3-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:a7c06742645f914f26c7f1fa47b8bc4c91d222f76ee20116c43d5ef0912bba2d", size = 38956, upload-time = "2025-08-12T05:52:03.149Z" }, + { url = "https://files.pythonhosted.org/packages/43/46/dd0791943613885f62619f18ee6107e6133237a6b6ed8a9ecfac339d0b4f/wrapt-1.17.3-cp39-cp39-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:7e18f01b0c3e4a07fe6dfdb00e29049ba17eadbc5e7609a2a3a4af83ab7d710a", size = 81745, upload-time = "2025-08-12T05:52:49.62Z" }, + { url = "https://files.pythonhosted.org/packages/dd/ec/bb2d19bd1a614cc4f438abac13ae26c57186197920432d2a915183b15a8b/wrapt-1.17.3-cp39-cp39-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:0f5f51a6466667a5a356e6381d362d259125b57f059103dd9fdc8c0cf1d14139", size = 82833, upload-time = "2025-08-12T05:52:27.738Z" }, + { url = "https://files.pythonhosted.org/packages/8d/eb/66579aea6ad36f07617fedca8e282e49c7c9bab64c63b446cfe4f7f47a49/wrapt-1.17.3-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:59923aa12d0157f6b82d686c3fd8e1166fa8cdfb3e17b42ce3b6147ff81528df", size = 81889, upload-time = "2025-08-12T05:52:29.023Z" }, + { url = "https://files.pythonhosted.org/packages/04/9c/a56b5ac0e2473bdc3fb11b22dd69ff423154d63861cf77911cdde5e38fd2/wrapt-1.17.3-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:46acc57b331e0b3bcb3e1ca3b421d65637915cfcd65eb783cb2f78a511193f9b", size = 81344, upload-time = "2025-08-12T05:52:50.869Z" }, + { url = "https://files.pythonhosted.org/packages/93/4c/9bd735c42641d81cb58d7bfb142c58f95c833962d15113026705add41a07/wrapt-1.17.3-cp39-cp39-win32.whl", hash = "sha256:3e62d15d3cfa26e3d0788094de7b64efa75f3a53875cdbccdf78547aed547a81", size = 36462, upload-time = "2025-08-12T05:53:19.623Z" }, + { url = "https://files.pythonhosted.org/packages/f0/ea/0b72f29cb5ebc16eb55c57dc0c98e5de76fc97f435fd407f7d409459c0a6/wrapt-1.17.3-cp39-cp39-win_amd64.whl", hash = "sha256:1f23fa283f51c890eda8e34e4937079114c74b4c81d2b2f1f1d94948f5cc3d7f", size = 38740, upload-time = "2025-08-12T05:53:18.271Z" }, + { url = "https://files.pythonhosted.org/packages/c3/8b/9eae65fb92321e38dbfec7719b87d840a4b92fde83fd1bbf238c5488d055/wrapt-1.17.3-cp39-cp39-win_arm64.whl", hash = "sha256:24c2ed34dc222ed754247a2702b1e1e89fdbaa4016f324b4b8f1a802d4ffe87f", size = 36806, upload-time = "2025-08-12T05:52:58.765Z" }, + { url = "https://files.pythonhosted.org/packages/1f/f6/a933bd70f98e9cf3e08167fc5cd7aaaca49147e48411c0bd5ae701bb2194/wrapt-1.17.3-py3-none-any.whl", hash = "sha256:7171ae35d2c33d326ac19dd8facb1e82e5fd04ef8c6c0e394d7af55a55051c22", size = 23591, upload-time = "2025-08-12T05:53:20.674Z" }, +] + +[[package]] +name = "zipp" +version = "3.15.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/00/27/f0ac6b846684cecce1ee93d32450c45ab607f65c2e0255f0092032d91f07/zipp-3.15.0.tar.gz", hash = "sha256:112929ad649da941c23de50f356a2b5570c954b65150642bccdd66bf194d224b", size = 18454, upload-time = "2023-02-25T02:17:22.503Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/5b/fa/c9e82bbe1af6266adf08afb563905eb87cab83fde00a0a08963510621047/zipp-3.15.0-py3-none-any.whl", hash = "sha256:48904fc76a60e542af151aded95726c1a5c34ed43ab4134b597665c86d7ad556", size = 6758, upload-time = "2023-02-25T02:17:20.807Z" }, +] From b29beb0abd2009c946a80a0914c71262cff7b191 Mon Sep 17 00:00:00 2001 From: Ryan Greer Date: Tue, 14 Oct 2025 15:59:54 -0600 Subject: [PATCH 11/27] docstrings and spelling fix --- src/sbol2build/abstract_translator.py | 45 ++++++++++++++++++++++++--- 1 file changed, 41 insertions(+), 4 deletions(-) diff --git a/src/sbol2build/abstract_translator.py b/src/sbol2build/abstract_translator.py index 6c0535a..e81090c 100644 --- a/src/sbol2build/abstract_translator.py +++ b/src/sbol2build/abstract_translator.py @@ -37,6 +37,16 @@ def __repr__(self) -> str: def extract_fusion_sites( plasmid: sbol2.ComponentDefinition, doc: sbol2.Document ) -> List[sbol2.ComponentDefinition]: + """ + Returns all fusion site component definitions from a plasmid. + + Args: + plasmid: :class:`sbol2.ComponentDefinition` representing the plasmid. + doc: :class:`sbol2.Document` containing component definitions. + + Returns: + A list of fusion site component definitions. + """ fusion_sites = [] for component in plasmid.components: definition = doc.getComponentDefinition(component.definition) @@ -49,6 +59,16 @@ def extract_fusion_sites( def extract_design_parts( design: sbol2.ComponentDefinition, doc: sbol2.Document ) -> List[sbol2.ComponentDefinition]: + """ + Returns definitions of parts in a design in sequential order. + + Args: + design: :class:`sbol2.ComponentDefinition` to extract parts from. + doc: :class:`sbol2.Document` containing all component definitions. + + Returns: + A list of component definitions in sequential order. + """ component_list = [c for c in design.getInSequentialOrder()] return [ doc.getComponentDefinition(component.definition) for component in component_list @@ -95,16 +115,32 @@ def construct_plasmid_dict( return plasmid_dict -def get_compatibile_plasmids( +def get_compatible_plasmids( plasmid_dict: Dict[str, List[MocloPlasmid]], backbone: MocloPlasmid -): +) -> List[MocloPlasmid]: + """ + Returns a list of MocloPlasmid objects that can form a compatible assembly + with the given backbone plasmid. The function selects one plasmid from each + entry in the dictionary, ensuring that adjacent plasmids have matching fusion sites, + and that the first and last plasmids are compatible with the backbone. + + Args: + plasmid_dict: A dictionary mapping assembly positions or categories to lists + of MocloPlasmid objects. + backbone: The backbone MocloPlasmid whose fusion sites define compatibility. + + Returns: + A list of compatible MocloPlasmid objects forming a sequential assembly. + """ selected_plasmids = [] match_to = backbone match_idx = 0 for i, key in enumerate(plasmid_dict): for plasmid in plasmid_dict[key]: - if plasmid.fusion_sites[0] == match_to.fusion_sites[match_idx]: + if ( + plasmid.fusion_sites[0] == match_to.fusion_sites[match_idx] + ): # TODO add error handling if no compatible plasmid found print( f"matched {plasmid.name} with {match_to.name} on fusion site {plasmid.fusion_sites[0]}!" ) @@ -112,6 +148,7 @@ def get_compatibile_plasmids( match_to = plasmid match_idx = 1 break + # TODO edge case where second fusion site does not match terminator fusion site will not be caught by current logic return selected_plasmids @@ -132,4 +169,4 @@ def translate_abstract_to_plasmids( plasmid_dict = construct_plasmid_dict(ordered_part_definitions, plasmid_collection) backbone_plasmid = MocloPlasmid(backbone_def.displayId, backbone_def, backbone_doc) - return get_compatibile_plasmids(plasmid_dict, backbone_plasmid) + return get_compatible_plasmids(plasmid_dict, backbone_plasmid) From ef5d4cff0cc18e2e3208bf6ea5a2925eb1f8bf6d Mon Sep 17 00:00:00 2001 From: Ryan Greer Date: Thu, 16 Oct 2025 14:02:01 -0600 Subject: [PATCH 12/27] fixed last part mismatch error --- notebooks/test_notebook.ipynb | 40 +++++++++++++++------------ src/sbol2build/abstract_translator.py | 14 +++++++++- 2 files changed, 35 insertions(+), 19 deletions(-) diff --git a/notebooks/test_notebook.ipynb b/notebooks/test_notebook.ipynb index ab6b55d..3d115e7 100644 --- a/notebooks/test_notebook.ipynb +++ b/notebooks/test_notebook.ipynb @@ -113,37 +113,34 @@ "metadata": {}, "outputs": [], "source": [ - "import sys\n", - "import os\n", "import sbol2\n", "\n", - "sys.path.insert(0, os.path.abspath(os.path.join(os.getcwd(), \"..\", \"src\")))\n", "from sbol2build.abstract_translator import translate_abstract_to_plasmids" ] }, { "cell_type": "code", - "execution_count": null, + "execution_count": 2, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ - "found: https://synbiohub.org/user/Gon/CIDARMoCloParts/J23100/1 in https://synbiohub.org/user/Gon/CIDARMoCloPlasmidKit/pJ23100_EB/1 with ['Fusion_Site_B', 'Fusion_Site_E']\n", "found: https://synbiohub.org/user/Gon/CIDARMoCloParts/J23100/1 in https://synbiohub.org/user/Gon/CIDARMoCloPlasmidKit/pJ23100_AB/1 with ['Fusion_Site_A', 'Fusion_Site_B']\n", "found: https://synbiohub.org/user/Gon/CIDARMoCloParts/J23100/1 in https://synbiohub.org/user/Gon/CIDARMoCloPlasmidKit/pJ23100_GB/1 with ['Fusion_Site_G', 'Fusion_Site_B']\n", - "found: https://synbiohub.org/user/Gon/CIDARMoCloParts/J23100/1 in https://synbiohub.org/user/Gon/CIDARMoCloPlasmidKit/pJ23100_FB/1 with ['Fusion_Site_F', 'Fusion_Site_B']\n", + "found: https://synbiohub.org/user/Gon/CIDARMoCloParts/J23100/1 in https://synbiohub.org/user/Gon/CIDARMoCloPlasmidKit/pJ23100_FB/1 with ['Fusion_Site_B', 'Fusion_Site_F']\n", + "found: https://synbiohub.org/user/Gon/CIDARMoCloParts/J23100/1 in https://synbiohub.org/user/Gon/CIDARMoCloPlasmidKit/pJ23100_EB/1 with ['Fusion_Site_B', 'Fusion_Site_E']\n", "found: https://synbiohub.org/user/Gon/CIDARMoCloParts/B0034/1 in https://synbiohub.org/user/Gon/CIDARMoCloPlasmidKit/pB0034_BC/1 with ['Fusion_Site_C', 'Fusion_Site_B']\n", - "found: https://synbiohub.org/user/Gon/CIDARMoCloParts/E0030_yfp/1 in https://synbiohub.org/user/Gon/CIDARMoCloPlasmidKit/pE0030_CD/1 with ['Fusion_Site_C', 'Fusion_Site_D']\n", - "found: https://synbiohub.org/user/Gon/CIDARMoCloParts/B0015/1 in https://synbiohub.org/user/Gon/CIDARMoCloPlasmidKit/pB0015_DG/1 with ['Fusion_Site_D', 'Fusion_Site_G']\n", - "found: https://synbiohub.org/user/Gon/CIDARMoCloParts/B0015/1 in https://synbiohub.org/user/Gon/CIDARMoCloPlasmidKit/pB0015_DH/1 with ['Fusion_Site_H', 'Fusion_Site_D']\n", - "found: https://synbiohub.org/user/Gon/CIDARMoCloParts/B0015/1 in https://synbiohub.org/user/Gon/CIDARMoCloPlasmidKit/pB0015_DF/1 with ['Fusion_Site_F', 'Fusion_Site_D']\n", + "found: https://synbiohub.org/user/Gon/CIDARMoCloParts/E0030_yfp/1 in https://synbiohub.org/user/Gon/CIDARMoCloPlasmidKit/pE0030_CD/1 with ['Fusion_Site_D', 'Fusion_Site_C']\n", + "found: https://synbiohub.org/user/Gon/CIDARMoCloParts/B0015/1 in https://synbiohub.org/user/Gon/CIDARMoCloPlasmidKit/pB0015_DG/1 with ['Fusion_Site_G', 'Fusion_Site_D']\n", "found: https://synbiohub.org/user/Gon/CIDARMoCloParts/B0015/1 in https://synbiohub.org/user/Gon/CIDARMoCloPlasmidKit/pB0015_DE/1 with ['Fusion_Site_E', 'Fusion_Site_D']\n", - "matched J23100_A_B with UJHDBOTD_A_F on fusion site A!\n", - "matched B0034_B_C with J23100_A_B on fusion site B!\n", - "matched E0030_yfp_C_D with B0034_B_C on fusion site C!\n", - "matched B0015_D_G with E0030_yfp_C_D on fusion site D!\n" + "found: https://synbiohub.org/user/Gon/CIDARMoCloParts/B0015/1 in https://synbiohub.org/user/Gon/CIDARMoCloPlasmidKit/pB0015_DH/1 with ['Fusion_Site_D', 'Fusion_Site_H']\n", + "found: https://synbiohub.org/user/Gon/CIDARMoCloParts/B0015/1 in https://synbiohub.org/user/Gon/CIDARMoCloPlasmidKit/pB0015_DF/1 with ['Fusion_Site_D', 'Fusion_Site_F']\n", + "matched J23100_A_B with UJHDBOTD_A_F on fusion site A! (new)\n", + "matched B0034_B_C with J23100_A_B on fusion site B! (new)\n", + "matched E0030_yfp_C_D with B0034_B_C on fusion site C! (new)\n", + "matched final component B0015_D_F with E0030_yfp_C_D and UJHDBOTD_A_Fon fusion sites (D, F)!\n" ] } ], @@ -173,9 +170,16 @@ ")" ] }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "use `pip install -e .` and restart kernel to reload latest version of local package" + ] + }, { "cell_type": "code", - "execution_count": 3, + "execution_count": null, "metadata": {}, "outputs": [ { @@ -192,9 +196,9 @@ " Name: E0030_yfp_C_D\n", " Definition: https://synbiohub.org/user/Gon/CIDARMoCloPlasmidKit/pE0030_CD/1\n", " Fusion Sites: ['C', 'D'], MocloPlasmid:\n", - " Name: B0015_D_G\n", - " Definition: https://synbiohub.org/user/Gon/CIDARMoCloPlasmidKit/pB0015_DG/1\n", - " Fusion Sites: ['D', 'G']]\n", + " Name: B0015_D_F\n", + " Definition: https://synbiohub.org/user/Gon/CIDARMoCloPlasmidKit/pB0015_DF/1\n", + " Fusion Sites: ['D', 'F']]\n", "Design........................0\n", "Build.........................0\n", "Test..........................0\n", diff --git a/src/sbol2build/abstract_translator.py b/src/sbol2build/abstract_translator.py index e81090c..de239d5 100644 --- a/src/sbol2build/abstract_translator.py +++ b/src/sbol2build/abstract_translator.py @@ -139,7 +139,18 @@ def get_compatible_plasmids( for i, key in enumerate(plasmid_dict): for plasmid in plasmid_dict[key]: if ( - plasmid.fusion_sites[0] == match_to.fusion_sites[match_idx] + i == len(plasmid_dict) - 1 + and plasmid.fusion_sites[0] == match_to.fusion_sites[match_idx] + and plasmid.fusion_sites[1] == backbone.fusion_sites[1] + ): + print( + f"matched final component {plasmid.name} with {match_to.name} and {backbone.name} on fusion sites ({plasmid.fusion_sites[0]}, {plasmid.fusion_sites[1]})!" + ) + selected_plasmids.append(plasmid) + break + elif ( + i < len(plasmid_dict) - 1 + and plasmid.fusion_sites[0] == match_to.fusion_sites[match_idx] ): # TODO add error handling if no compatible plasmid found print( f"matched {plasmid.name} with {match_to.name} on fusion site {plasmid.fusion_sites[0]}!" @@ -149,6 +160,7 @@ def get_compatible_plasmids( match_idx = 1 break # TODO edge case where second fusion site does not match terminator fusion site will not be caught by current logic + # 10/14: rethink implementation, will likely need to be different for combinatorial designs return selected_plasmids From 12bbcae098140776d792c578c840af1dfd75605e Mon Sep 17 00:00:00 2001 From: Ryan Greer Date: Mon, 20 Oct 2025 15:13:32 -0600 Subject: [PATCH 13/27] adapting sbol2build to support new plasmid specs --- src/sbol2build/sbol2build.py | 58 ++++++++++++++++++++++-------------- 1 file changed, 36 insertions(+), 22 deletions(-) diff --git a/src/sbol2build/sbol2build.py b/src/sbol2build/sbol2build.py index 263033b..8aef9fa 100644 --- a/src/sbol2build/sbol2build.py +++ b/src/sbol2build/sbol2build.py @@ -4,6 +4,7 @@ from pydna.dseqrecord import Dseqrecord from itertools import product from typing import List, Union, Tuple +from .constants import DNA_TYPES sbol2.Config.setHomespace("https://SBOL2Build.org") sbol2.Config.setOption(sbol2.ConfigOptions.SBOL_COMPLIANT_URIS, True) @@ -182,7 +183,9 @@ def is_circular(obj: sbol2.ComponentDefinition) -> bool: :param obj: design to be checked :return: true if circular """ - return any(n == sbol2.SO_CIRCULAR for n in obj.types) + return any(n == sbol2.SO_CIRCULAR for n in obj.types) or any( + n == "http://identifiers.org/so/SO:0000637" for n in obj.roles + ) # temporarily allowing 'engineered plasmid' role to qualify as circular def part_digestion( @@ -217,9 +220,11 @@ def part_digestion( reactant_displayId = reactant.displayId reactant_component_definition = reactant - if sbol2.BIOPAX_DNA not in reactant_component_definition.types: + types = set(reactant_component_definition.types or []) + + if not types.intersection(DNA_TYPES): raise TypeError( - f"The reactant should has a DNA type. Types found {reactant.types}." + f"The reactant should have a DNA type. Types found: {reactant.types}." ) if len(reactant_component_definition.sequences) != 1: raise ValueError( @@ -265,21 +270,20 @@ def part_digestion( reactant_seq = document.getSequence(reactant_seq).elements # Dseqrecord is from PyDNA package with reactant sequence ds_reactant = Dseqrecord(reactant_seq, circular=circular) - digested_reactant = ds_reactant.cut( - restriction_enzymes_pydna - ) # TODO see if ds_reactant.cut is working, causing problems downstream + digested_reactant = ds_reactant.cut(restriction_enzymes_pydna) if len(digested_reactant) < 2 or len(digested_reactant) > 3: raise ValueError( f"Not supported number of products. Found{len(digested_reactant)}" ) - # TODO select them based on content rather than size. elif circular and len(digested_reactant) == 2: part_extract, backbone = sorted(digested_reactant, key=len) elif linear and len(digested_reactant) == 3: prefix, part_extract, suffix = digested_reactant else: - raise ValueError("The reactant has no valid topology type") + raise ValueError( + f"Reactant {reactant_component_definition.displayId} has no valid topology type, with {len(digested_reactant)} digested products, types: {reactant_component_definition.types}, and roles: {reactant_component_definition.roles}" + ) # Compute the length of single strand sticky ends or fusion sites product_5_prime_ss_strand, product_5_prime_ss_end = ( @@ -290,7 +294,7 @@ def part_digestion( ) product_sequence = str(part_extract.seq) prod_component_definition, prod_seq = dna_componentdefinition_with_sequence( - identity=f"{reactant.functionalComponents[0].displayId}_extracted_part", + identity=f"{reactant.displayId if isinstance(reactant, sbol2.ComponentDefinition) else reactant.functionalComponents[0].displayId}_extracted_part", sequence=product_sequence, **kwargs, ) @@ -466,13 +470,13 @@ def backbone_digestion( reactant_displayId = reactant.displayId reactant_component_definition = reactant - if sbol2.BIOPAX_DNA not in reactant_component_definition.types: + types = set(reactant_component_definition.types or []) + + if not types.intersection(DNA_TYPES): raise TypeError( - f"The reactant should has a DNA type. Types founded {reactant.types}." + f"The reactant should have a DNA type. Types found: {reactant.types}." ) - if ( - len(reactant_component_definition.sequences) != 1 - ): # TODO review if true for MD, maybe for MD it will be 5 + if len(reactant_component_definition.sequences) != 1: raise ValueError( f"The reactant needs to have precisely one sequence. The input reactant has {len(reactant.sequences)} sequences" ) @@ -522,7 +526,7 @@ def backbone_digestion( if len(digested_reactant) < 2 or len(digested_reactant) > 3: raise ValueError( - f"Not supported number of products. Found{len(digested_reactant)}" + f"Not supported number of products. Found: {len(digested_reactant)}" ) # TODO make more specific for buildplanner # TODO select them based on content rather than size. elif circular and len(digested_reactant) == 2: @@ -1038,7 +1042,9 @@ def __init__( self.document.add(self.restriction_enzyme) self.composites = [] - def run(self) -> List[Tuple[sbol2.ComponentDefinition, sbol2.Sequence]]: + def run( + self, plasmids_in_module_definitions=False + ) -> List[Tuple[sbol2.ComponentDefinition, sbol2.Sequence]]: """Runs full assembly simulation. `document` parameter of golden_gate_assembly_plan object is updated by reference to include assembly plan ModuleDefinition and all related information. @@ -1048,19 +1054,27 @@ def run(self) -> List[Tuple[sbol2.ComponentDefinition, sbol2.Sequence]]: :return: List of all composites generated, in the form of tuples of ComponentDefinition and Sequence. """ for part_doc in self.parts_in_backbone: - md = part_doc.getModuleDefinition( - "https://sbolcanvas.org/module1" - ) # change to toplevel or some other index? + if plasmids_in_module_definitions: + topLevel = part_doc.getModuleDefinition( + "https://sbolcanvas.org/module1" + ) # TODO change to toplevel or some other index? + else: + topLevel = part_doc.componentDefinitions[0] extracts_tuple_list, _ = part_digestion( - md, [self.restriction_enzyme], self.assembly_plan, part_doc + topLevel, [self.restriction_enzyme], self.assembly_plan, part_doc ) # make sure assembly plan is pass-by-reference append_extracts_to_doc(extracts_tuple_list, self.document) self.extracted_parts.append(extracts_tuple_list[0][0]) - md = self.backbone.getModuleDefinition("https://sbolcanvas.org/module1") + if plasmids_in_module_definitions: + topLevel = self.backbone.getModuleDefinition( + "https://sbolcanvas.org/module1" + ) # TODO change to toplevel or some other index? + else: + topLevel = self.backbone.componentDefinitions[0] extracts_tuple_list, _ = backbone_digestion( - md, [self.restriction_enzyme], self.assembly_plan, self.backbone + topLevel, [self.restriction_enzyme], self.assembly_plan, self.backbone ) append_extracts_to_doc(extracts_tuple_list, self.document) From 39e743cd70c691a79ea44889ab3de1809d62977f Mon Sep 17 00:00:00 2001 From: Ryan Greer Date: Mon, 20 Oct 2025 15:16:35 -0600 Subject: [PATCH 14/27] tests and constants for sbol2build adjustments --- src/sbol2build/constants.py | 7 +- tests/test_core.py | 297 +++++++++++++++++++++++++----------- 2 files changed, 214 insertions(+), 90 deletions(-) diff --git a/src/sbol2build/constants.py b/src/sbol2build/constants.py index e2dd996..e8a77cf 100644 --- a/src/sbol2build/constants.py +++ b/src/sbol2build/constants.py @@ -7,4 +7,9 @@ "F": "CGCT", "G": "TGCC", "H": "ACTA", -} \ No newline at end of file +} + +DNA_TYPES = { # TODO see about restricting dna types to only accept dna + "http://www.biopax.org/release/biopax-level3.owl#Dna", + "http://www.biopax.org/release/biopax-level3.owl#DnaRegion", +} diff --git a/tests/test_core.py b/tests/test_core.py index 776de04..acc6fad 100644 --- a/tests/test_core.py +++ b/tests/test_core.py @@ -1,34 +1,47 @@ import sbol2 -import filecmp import os import sys -import tempfile import unittest -from pathlib import Path -sys.path.insert(0, os.path.abspath(os.path.join(os.path.dirname(__file__), '../src'))) +sys.path.insert(0, os.path.abspath(os.path.join(os.path.dirname(__file__), "../src"))) + +from sbol2build import ( + golden_gate_assembly_plan, + rebase_restriction_enzyme, + backbone_digestion, + part_digestion, + ligation, +) -from sbol2build import golden_gate_assembly_plan, rebase_restriction_enzyme, backbone_digestion, part_digestion, ligation class Test_Core_Functions(unittest.TestCase): def test_part_digestion(self): doc = sbol2.Document() - doc.read('tests/test_files/pro_in_bb.xml') + doc.read("tests/test_files/pro_in_bb.xml") - md = doc.getModuleDefinition('https://sbolcanvas.org/module1') - assembly_plan = sbol2.ModuleDefinition('assembly_plan') + md = doc.getModuleDefinition("https://sbolcanvas.org/module1") + assembly_plan = sbol2.ModuleDefinition("assembly_plan") - parts_list, assembly_plan = part_digestion(md, [rebase_restriction_enzyme('BsaI')], assembly_plan, doc) + parts_list, assembly_plan = part_digestion( + md, [rebase_restriction_enzyme("BsaI")], assembly_plan, doc + ) product_doc = sbol2.Document() for extract, sequence in parts_list: product_doc.add(extract) product_doc.add(sequence) product_doc.add(assembly_plan) - + extract = parts_list[0][0] - self.assertEqual(extract.roles, ['https://identifiers.org/so/SO:0000915'], "Part digestion extracted part missing engineered insert role") #engineered insert role - self.assertTrue('http://identifiers.org/so/SO:0000987' in extract.types, "Part digestion extracted part missing linear DNA type") + self.assertEqual( + extract.roles, + ["https://identifiers.org/so/SO:0000915"], + "Part digestion extracted part missing engineered insert role", + ) # engineered insert role + self.assertTrue( + "http://identifiers.org/so/SO:0000987" in extract.types, + "Part digestion extracted part missing linear DNA type", + ) # ensure extracted part has 5prime, part from sbolcanvas, and 3prime for anno in parts_list[0][0].sequenceAnnotations: @@ -36,41 +49,75 @@ def test_part_digestion(self): comp_obj = product_doc.find(comp_uri) comp_def = product_doc.find(comp_obj.definition) - if 'three_prime_oh' in comp_obj.displayId: - self.assertEqual(comp_def.roles, ['http://identifiers.org/so/SO:0001933'], 'Part digestion missing 3 prime role') - elif 'five_prime_oh' in comp_obj.displayId: - self.assertEqual(comp_def.roles, ['http://identifiers.org/so/SO:0001932'], 'Part digestion missing 5 prime role') + if "three_prime_oh" in comp_obj.displayId: + self.assertEqual( + comp_def.roles, + ["http://identifiers.org/so/SO:0001933"], + "Part digestion missing 3 prime role", + ) + elif "five_prime_oh" in comp_obj.displayId: + self.assertEqual( + comp_def.roles, + ["http://identifiers.org/so/SO:0001932"], + "Part digestion missing 5 prime role", + ) else: - self.assertTrue(comp_def.identity in doc.componentDefinitions, 'Digested part missing reference to part from original document') #check that old part has been transcribed to new doc, in extracted part + self.assertTrue( + comp_def.identity in doc.componentDefinitions, + "Digested part missing reference to part from original document", + ) # check that old part has been transcribed to new doc, in extracted part - # check that wasderivedfroms match, assembly plan records all interactions, + # check that wasderivedfroms match, assembly plan records all interactions, contains_restriction, contains_reactant, contains_product = False, False, False for participation in assembly_plan.interactions[0].participations: - if participation.displayId == 'restriction': - self.assertTrue('http://identifiers.org/biomodels.sbo/SBO:0000019' in participation.roles, "Restriction participation missing 'modifier' role") + if participation.displayId == "restriction": + self.assertTrue( + "http://identifiers.org/biomodels.sbo/SBO:0000019" + in participation.roles, + "Restriction participation missing 'modifier' role", + ) contains_restriction = True - elif 'reactant' in participation.displayId: - self.assertTrue('http://identifiers.org/biomodels.sbo/SBO:0000010' in participation.roles, "Restriction reactant participation missing 'reactant' role") + elif "reactant" in participation.displayId: + self.assertTrue( + "http://identifiers.org/biomodels.sbo/SBO:0000010" + in participation.roles, + "Restriction reactant participation missing 'reactant' role", + ) contains_reactant = True - elif 'product' in participation.displayId: - self.assertTrue('http://identifiers.org/biomodels.sbo/SBO:0000011' in participation.roles, "Restriction product participation missing 'product' role") + elif "product" in participation.displayId: + self.assertTrue( + "http://identifiers.org/biomodels.sbo/SBO:0000011" + in participation.roles, + "Restriction product participation missing 'product' role", + ) contains_product = True - - self.assertTrue(contains_product, 'Digestion Assembly plan missing product participation') - self.assertTrue(contains_reactant, 'Digestion Assembly plan missing reactant participation') - self.assertTrue(contains_restriction, 'Digestion Assembly plan missing restriction participation') + + self.assertTrue( + contains_product, "Digestion Assembly plan missing product participation" + ) + self.assertTrue( + contains_reactant, "Digestion Assembly plan missing reactant participation" + ) + self.assertTrue( + contains_restriction, + "Digestion Assembly plan missing restriction participation", + ) sbol_validation_result = product_doc.validate() - self.assertEqual(sbol_validation_result, 'Valid.', 'Part Digestion SBOL validation failed') + self.assertEqual( + sbol_validation_result, "Valid.", "Part Digestion SBOL validation failed" + ) def test_backbone_digestion(self): doc = sbol2.Document() - doc.read('tests/test_files/backbone.xml') + doc.read("tests/test_files/backbone.xml") - md = doc.getModuleDefinition('https://sbolcanvas.org/module1') - assembly_plan = sbol2.ModuleDefinition('assembly_plan') + md = doc.getModuleDefinition("https://sbolcanvas.org/module1") + assembly_plan = sbol2.ModuleDefinition("assembly_plan") - parts_list, assembly_plan = backbone_digestion(md, [rebase_restriction_enzyme('BsaI')], assembly_plan, doc) + parts_list, assembly_plan = backbone_digestion( + md, [rebase_restriction_enzyme("BsaI")], assembly_plan, doc + ) product_doc = sbol2.Document() for extract, sequence in parts_list: @@ -79,7 +126,11 @@ def test_backbone_digestion(self): product_doc.add(assembly_plan) extract = parts_list[0][0] - self.assertEqual(extract.roles, ['https://identifiers.org/so/SO:0000755'], "Backbone digestion extracted part missing plasmid vector role") #plasmid vector + self.assertEqual( + extract.roles, + ["https://identifiers.org/so/SO:0000755"], + "Backbone digestion extracted part missing plasmid vector role", + ) # plasmid vector # ensure extracted part has 5prime, part from sbolcanvas, and 3prime for anno in parts_list[0][0].sequenceAnnotations: @@ -87,76 +138,120 @@ def test_backbone_digestion(self): comp_obj = product_doc.find(comp_uri) comp_def = product_doc.find(comp_obj.definition) - if 'three_prime_oh' in comp_obj.displayId: - self.assertEqual(comp_def.roles, ['http://identifiers.org/so/SO:0001933'], 'Part digestion missing 3 prime role') - elif 'five_prime_oh' in comp_obj.displayId: - self.assertEqual(comp_def.roles, ['http://identifiers.org/so/SO:0001932'], 'Part digestion missing 5 prime role') + if "three_prime_oh" in comp_obj.displayId: + self.assertEqual( + comp_def.roles, + ["http://identifiers.org/so/SO:0001933"], + "Part digestion missing 3 prime role", + ) + elif "five_prime_oh" in comp_obj.displayId: + self.assertEqual( + comp_def.roles, + ["http://identifiers.org/so/SO:0001932"], + "Part digestion missing 5 prime role", + ) else: - self.assertTrue(comp_def.identity in doc.componentDefinitions, 'Digested part missing reference to part from original document') #check that old part has been transcribed to new doc, in extracted part + self.assertTrue( + comp_def.identity in doc.componentDefinitions, + "Digested part missing reference to part from original document", + ) # check that old part has been transcribed to new doc, in extracted part - # check that wasderivedfroms match, assembly plan records all interactions, + # check that wasderivedfroms match, assembly plan records all interactions, contains_restriction, contains_reactant, contains_product = False, False, False for participation in assembly_plan.interactions[0].participations: - if participation.displayId == 'restriction': - self.assertTrue('http://identifiers.org/biomodels.sbo/SBO:0000019' in participation.roles, "Restriction participation missing 'modifier' role") + if participation.displayId == "restriction": + self.assertTrue( + "http://identifiers.org/biomodels.sbo/SBO:0000019" + in participation.roles, + "Restriction participation missing 'modifier' role", + ) contains_restriction = True - elif 'reactant' in participation.displayId: - self.assertTrue('http://identifiers.org/biomodels.sbo/SBO:0000010' in participation.roles, "Restriction reactant participation missing 'reactant' role") + elif "reactant" in participation.displayId: + self.assertTrue( + "http://identifiers.org/biomodels.sbo/SBO:0000010" + in participation.roles, + "Restriction reactant participation missing 'reactant' role", + ) contains_reactant = True - elif 'product' in participation.displayId: - self.assertTrue('http://identifiers.org/biomodels.sbo/SBO:0000011' in participation.roles, "Restriction product participation missing 'product' role") + elif "product" in participation.displayId: + self.assertTrue( + "http://identifiers.org/biomodels.sbo/SBO:0000011" + in participation.roles, + "Restriction product participation missing 'product' role", + ) contains_product = True - - self.assertTrue(contains_product, 'Digestion Assembly plan missing product participation') - self.assertTrue(contains_reactant, 'Digestion Assembly plan missing reactant participation') - self.assertTrue(contains_restriction, 'Digestion Assembly plan missing restriction participation') + + self.assertTrue( + contains_product, "Digestion Assembly plan missing product participation" + ) + self.assertTrue( + contains_reactant, "Digestion Assembly plan missing reactant participation" + ) + self.assertTrue( + contains_restriction, + "Digestion Assembly plan missing restriction participation", + ) sbol_validation_result = product_doc.validate() - self.assertEqual(sbol_validation_result, 'Valid.', 'Backbone Digestion SBOL validation failed') + self.assertEqual( + sbol_validation_result, + "Valid.", + "Backbone Digestion SBOL validation failed", + ) def test_ligation(self): ligation_doc = sbol2.Document() temp_doc = sbol2.Document() reactants_list = [] - assembly_plan = sbol2.ModuleDefinition('assembly_plan') - parts = ['tests/test_files/pro_in_bb.xml','tests/test_files/rbs_in_bb.xml', 'tests/test_files/cds_in_bb.xml', 'tests/test_files/terminator_in_bb.xml'] + assembly_plan = sbol2.ModuleDefinition("assembly_plan") + parts = [ + "tests/test_files/pro_in_bb.xml", + "tests/test_files/rbs_in_bb.xml", + "tests/test_files/cds_in_bb.xml", + "tests/test_files/terminator_in_bb.xml", + ] for i, part in enumerate(parts): temp_doc.read(part) - md = temp_doc.getModuleDefinition('https://sbolcanvas.org/module1') - extracts_tuple_list, assembly_plan = part_digestion(md, [rebase_restriction_enzyme('BsaI')], assembly_plan, temp_doc) + md = temp_doc.getModuleDefinition("https://sbolcanvas.org/module1") + extracts_tuple_list, assembly_plan = part_digestion( + md, [rebase_restriction_enzyme("BsaI")], assembly_plan, temp_doc + ) for extract, sequence in extracts_tuple_list: try: ligation_doc.add(extract) ligation_doc.add(sequence) - except Exception as e: - if '' in str(e): + except Exception as e: + if "" in str(e): pass else: - print(e) + print(e) reactants_list.append(extracts_tuple_list[0][0]) - temp_doc.read('tests/test_files/backbone.xml') + temp_doc.read("tests/test_files/backbone.xml") # run digestion, extract component + sequence, add to ligation_doc, reactants_list - md = temp_doc.getModuleDefinition('https://sbolcanvas.org/module1') - extracts_tuple_list, assembly_plan = backbone_digestion(md, [rebase_restriction_enzyme('BsaI')], assembly_plan, temp_doc) + md = temp_doc.getModuleDefinition("https://sbolcanvas.org/module1") + extracts_tuple_list, assembly_plan = backbone_digestion( + md, [rebase_restriction_enzyme("BsaI")], assembly_plan, temp_doc + ) for extract, seq in extracts_tuple_list: try: - ligation_doc.add(extract) #add only extracted definitions and and sequences from digestion + ligation_doc.add( + extract + ) # add only extracted definitions and and sequences from digestion ligation_doc.add(seq) - except Exception as e: - if '' in str(e): + except Exception as e: + if "" in str(e): pass else: - print(e) + print(e) ligation_doc.add(assembly_plan) reactants_list.append(extracts_tuple_list[0][0]) - - ligation_doc.add(rebase_restriction_enzyme('BsaI')) + ligation_doc.add(rebase_restriction_enzyme("BsaI")) pl = ligation(reactants_list, assembly_plan, ligation_doc) @@ -164,16 +259,28 @@ def test_ligation(self): for obj in p: ligation_doc.add(obj) - if (type(obj) == sbol2.ComponentDefinition): - self.assertTrue('http://identifiers.org/so/SO:0000988' in obj.types, "Ligation product missing circular DNA type") - self.assertTrue('http://www.biopax.org/release/biopax-level3.owl#DnaRegion' in obj.types, "Ligation product missing DNA region type") - self.assertTrue('http://identifiers.org/so/SO:0000804' in obj.roles, "Ligation product missing engineered region role") + if type(obj) is sbol2.ComponentDefinition: + self.assertTrue( + "http://identifiers.org/so/SO:0000988" in obj.types, + "Ligation product missing circular DNA type", + ) + self.assertTrue( + "http://www.biopax.org/release/biopax-level3.owl#DnaRegion" + in obj.types, + "Ligation product missing DNA region type", + ) + self.assertTrue( + "http://identifiers.org/so/SO:0000804" in obj.roles, + "Ligation product missing engineered region role", + ) locations = [] for anno in obj.sequenceAnnotations: for location in anno.locations: - locations.append((anno.identity, location.start, location.end)) + locations.append( + (anno.identity, location.start, location.end) + ) locations.sort(key=lambda x: x[1]) @@ -181,40 +288,52 @@ def test_ligation(self): current_end = locations[i][2] next_start = locations[i + 1][1] - self.assertEqual(current_end + 1, next_start, + self.assertEqual( + current_end + 1, + next_start, f"Mismatch in continuity: {locations[i][0]} ends at {current_end}, " - f"but {locations[i + 1][0]} starts at {next_start}") + f"but {locations[i + 1][0]} starts at {next_start}", + ) sbol_validation_result = ligation_doc.validate() - self.assertEqual(sbol_validation_result, 'Valid.', 'Ligation SBOL validation failed') - + self.assertEqual( + sbol_validation_result, "Valid.", "Ligation SBOL validation failed" + ) + def test_golden_gate(self): pro_doc = sbol2.Document() - pro_doc.read('tests/test_files/pro_in_bb.xml') - + pro_doc.read("tests/test_files/pro_in_bb.xml") + rbs_doc = sbol2.Document() - rbs_doc.read('tests/test_files/rbs_in_bb.xml') + rbs_doc.read("tests/test_files/rbs_in_bb.xml") cds_doc = sbol2.Document() - cds_doc.read('tests/test_files/cds_in_bb.xml') - + cds_doc.read("tests/test_files/cds_in_bb.xml") + ter_doc = sbol2.Document() - ter_doc.read('tests/test_files/terminator_in_bb.xml') + ter_doc.read("tests/test_files/terminator_in_bb.xml") bb_doc = sbol2.Document() - bb_doc.read('tests/test_files/backbone.xml') + bb_doc.read("tests/test_files/backbone.xml") part_docs = [pro_doc, rbs_doc, cds_doc, ter_doc] assembly_doc = sbol2.Document() - assembly_obj = golden_gate_assembly_plan('testassem', part_docs, bb_doc, 'BsaI', assembly_doc) + assembly_obj = golden_gate_assembly_plan( + "testassem", part_docs, bb_doc, "BsaI", assembly_doc + ) - composites = assembly_obj.run() + composites = assembly_obj.run(plasmids_in_module_definitions=True) - assembly_doc.write('validation_assembly.xml') + self.assertEqual(len(composites), 1) + + assembly_doc.write("validation_assembly.xml") sbol_validation_result = assembly_doc.validate() - self.assertEqual(sbol_validation_result, 'Valid.', 'Assembly SBOL validation failed') + self.assertEqual( + sbol_validation_result, "Valid.", "Assembly SBOL validation failed" + ) + -if __name__ == '__main__': - unittest.main() \ No newline at end of file +if __name__ == "__main__": + unittest.main() From 6c05074c9d003bf9f7287aa4b3d5d1c4b00515d9 Mon Sep 17 00:00:00 2001 From: Ryan Greer Date: Thu, 30 Oct 2025 13:06:23 -0600 Subject: [PATCH 15/27] added test command --- README.md | 3 +++ 1 file changed, 3 insertions(+) diff --git a/README.md b/README.md index 948ac25..9e5c4bf 100644 --- a/README.md +++ b/README.md @@ -17,3 +17,6 @@ It was developed to support build functionality and workflows in [SynBioSuite](h ## Documentation Please visit the documentation with API reference and tutorials at Read the Docs: [sbol2build.rtfd.io](https://sbol2build.readthedocs.io) + +#### Running tests: +`python -m unittest discover -s tests` \ No newline at end of file From fd222cd7fb49a0c68f7439425e676d3821353047 Mon Sep 17 00:00:00 2001 From: Ryan Greer Date: Thu, 30 Oct 2025 13:11:34 -0600 Subject: [PATCH 16/27] combining abstract design translation with existing sbol2build assembly plan --- notebooks/test_notebook.ipynb | 339 ++++++++++++++++++---------------- 1 file changed, 184 insertions(+), 155 deletions(-) diff --git a/notebooks/test_notebook.ipynb b/notebooks/test_notebook.ipynb index 3d115e7..fd151c5 100644 --- a/notebooks/test_notebook.ipynb +++ b/notebooks/test_notebook.ipynb @@ -1,83 +1,31 @@ { "cells": [ { - "cell_type": "code", - "execution_count": 4, + "cell_type": "markdown", "metadata": {}, - "outputs": [], "source": [ - "import sbol2build as s2b" + "# Abstract Translator Test Case (in style of api call)" ] }, { "cell_type": "code", - "execution_count": 5, + "execution_count": 1, "metadata": {}, "outputs": [], "source": [ - "bsai = s2b.rebase_restriction_enzyme(\"BsaI\")" - ] - }, - { - "cell_type": "code", - "execution_count": 6, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "" - ] - }, - "execution_count": 6, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "bsai" - ] - }, - { - "cell_type": "code", - "execution_count": 7, - "metadata": {}, - "outputs": [ - { - "ename": "AttributeError", - "evalue": "module 'sbol2build' has no attribute 'dna_componentdefinition_with_sequence'", - "output_type": "error", - "traceback": [ - "\u001b[31m---------------------------------------------------------------------------\u001b[39m", - "\u001b[31mAttributeError\u001b[39m Traceback (most recent call last)", - "\u001b[36mCell\u001b[39m\u001b[36m \u001b[39m\u001b[32mIn[7]\u001b[39m\u001b[32m, line 1\u001b[39m\n\u001b[32m----> \u001b[39m\u001b[32m1\u001b[39m pro = \u001b[43ms2b\u001b[49m\u001b[43m.\u001b[49m\u001b[43mdna_componentdefinition_with_sequence\u001b[49m(\u001b[33m'\u001b[39m\u001b[33mpromoter\u001b[39m\u001b[33m'\u001b[39m, \u001b[33m'\u001b[39m\u001b[33macgt\u001b[39m\u001b[33m'\u001b[39m)\n", - "\u001b[31mAttributeError\u001b[39m: module 'sbol2build' has no attribute 'dna_componentdefinition_with_sequence'" - ] - } - ], - "source": [ - "pro = s2b.dna_componentdefinition_with_sequence(\"promoter\", \"acgt\")" + "import sbol2\n", + "\n", + "from sbol2build.abstract_translator import (\n", + " translate_abstract_to_plasmids,\n", + " extract_toplevel_definition,\n", + ")" ] }, { - "cell_type": "code", - "execution_count": null, + "cell_type": "markdown", "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "(,\n", - " )" - ] - }, - "execution_count": 5, - "metadata": {}, - "output_type": "execute_result" - } - ], "source": [ - "pro" + "use `pip install -e .` and restart kernel to reload latest version of local package" ] }, { @@ -86,148 +34,229 @@ "metadata": {}, "outputs": [ { - "data": { - "text/plain": [ - "'acgt'" - ] - }, - "execution_count": 7, - "metadata": {}, - "output_type": "execute_result" + "name": "stdout", + "output_type": "stream", + "text": [ + "Design........................0\n", + "Build.........................0\n", + "Test..........................0\n", + "Analysis......................0\n", + "ComponentDefinition...........7\n", + "ModuleDefinition..............0\n", + "Model.........................0\n", + "Sequence......................7\n", + "Collection....................0\n", + "Activity......................0\n", + "Plan..........................0\n", + "Agent.........................0\n", + "Attachment....................0\n", + "CombinatorialDerivation.......0\n", + "Implementation................0\n", + "SampleRoster..................0\n", + "Experiment....................0\n", + "ExperimentalData..............0\n", + "Annotation Objects............0\n", + "---\n", + "Total: .........................14\n", + "\n", + "DVK_AE\n", + "found: https://synbiohub.org/user/Gon/CIDARMoCloParts/J23100/1 in https://synbiohub.org/user/Gon/CIDARMoCloPlasmidsKit/pJ23100_EB/1 with ['Fusion_Site_E', 'Fusion_Site_B']\n", + "found: https://synbiohub.org/user/Gon/CIDARMoCloParts/J23100/1 in https://synbiohub.org/user/Gon/CIDARMoCloPlasmidsKit/pJ23100_FB/1 with ['Fusion_Site_B', 'Fusion_Site_F']\n", + "found: https://synbiohub.org/user/Gon/CIDARMoCloParts/J23100/1 in https://synbiohub.org/user/Gon/CIDARMoCloPlasmidsKit/pJ23100_AB/1 with ['Fusion_Site_A', 'Fusion_Site_B']\n", + "found: https://synbiohub.org/user/Gon/CIDARMoCloParts/J23100/1 in https://synbiohub.org/user/Gon/CIDARMoCloPlasmidsKit/pJ23100_GB/1 with ['Fusion_Site_G', 'Fusion_Site_B']\n", + "found: https://synbiohub.org/user/Gon/CIDARMoCloParts/B0034/1 in https://synbiohub.org/user/Gon/CIDARMoCloPlasmidsKit/pB0034_BC/1 with ['Fusion_Site_B', 'Fusion_Site_C']\n", + "found: https://synbiohub.org/user/Gon/CIDARMoCloParts/E0030_yfp/1 in https://synbiohub.org/user/Gon/CIDARMoCloPlasmidsKit/pE0030_CD/1 with ['Fusion_Site_D', 'Fusion_Site_C']\n", + "found: https://synbiohub.org/user/Gon/CIDARMoCloParts/B0015/1 in https://synbiohub.org/user/Gon/CIDARMoCloPlasmidsKit/pB0015_DF/1 with ['Fusion_Site_F', 'Fusion_Site_D']\n", + "found: https://synbiohub.org/user/Gon/CIDARMoCloParts/B0015/1 in https://synbiohub.org/user/Gon/CIDARMoCloPlasmidsKit/pB0015_DG/1 with ['Fusion_Site_D', 'Fusion_Site_G']\n", + "found: https://synbiohub.org/user/Gon/CIDARMoCloParts/B0015/1 in https://synbiohub.org/user/Gon/CIDARMoCloPlasmidsKit/pB0015_DE/1 with ['Fusion_Site_E', 'Fusion_Site_D']\n", + "found: https://synbiohub.org/user/Gon/CIDARMoCloParts/B0015/1 in https://synbiohub.org/user/Gon/CIDARMoCloPlasmidsKit/pB0015_DH/1 with ['Fusion_Site_H', 'Fusion_Site_D']\n", + "matched J23100_A_B with DVK_AE_A_E on fusion site A!\n", + "matched B0034_B_C with J23100_A_B on fusion site B!\n", + "matched E0030_yfp_C_D with B0034_B_C on fusion site C!\n", + "matched final component B0015_D_E with E0030_yfp_C_D and DVK_AE_A_E on fusion sites (D, E)!\n" + ] } ], "source": [ - "pro[1].elements" + "plasmid_collection = sbol2.Document()\n", + "sbh = sbol2.PartShop(\"https://synbiohub.org\")\n", + "sbh.pull(\n", + " \"https://synbiohub.org/user/Gon/CIDARMoCloPlasmidsKit/CIDARMoCloPlasmidsKit_collection/1/b7fdc21c6601a61d3166073a9e50f2c3843e1df5/share\",\n", + " plasmid_collection,\n", + ")\n", + "sbh.pull(\n", + " \"https://synbiohub.org/user/Gon/CIDARMoCloParts/CIDARMoCloParts_collection/1/038feff5f9c6c9b35cc95586ed6b14ec9bd3fea5/share\",\n", + " plasmid_collection,\n", + ")\n", + "\n", + "abstract_design_doc = sbol2.Document()\n", + "abstract_design_doc.read(\"tests/test_files/moclo_parts_circuit.xml\")\n", + "\n", + "backbone_doc = sbol2.Document()\n", + "sbh.pull(\n", + " \"https://synbiohub.org/user/Gon/CIDARMoCloPlasmidsKit/DVK_AE/1/647c5b2458567dcce6b0a37178d352b8ffa9a7fe/share\",\n", + " backbone_doc,\n", + ")\n", + "\n", + "print(extract_toplevel_definition(backbone_doc).displayId)\n", + "\n", + "mocloplasmid_list = translate_abstract_to_plasmids(\n", + " abstract_design_doc, plasmid_collection, backbone_doc\n", + ")" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ - "# Abstract Translator Test Case (in style of api call)" + "## Run through OG sbol2build" ] }, { "cell_type": "code", - "execution_count": 1, + "execution_count": 4, "metadata": {}, "outputs": [], "source": [ - "import sbol2\n", + "from sbol2build.abstract_translator import extract_design_parts\n", + "\n", "\n", - "from sbol2build.abstract_translator import translate_abstract_to_plasmids" + "def copy_sequences(component_definition, target_doc, collection_doc):\n", + " \"\"\"Copy all sequences referenced by a ComponentDefinition into target_doc.\"\"\"\n", + " subdefinitions = extract_design_parts(component_definition, collection_doc)\n", + "\n", + " for seq_uri in component_definition.sequences:\n", + " seq_obj = component_definition.doc.find(seq_uri)\n", + " if seq_obj is not None:\n", + " seq_obj.copy(target_doc)\n", + "\n", + " for subdefinition in subdefinitions:\n", + " print(subdefinition.displayId)\n", + " subdefinition.copy(target_doc)\n", + " for seq_uri in subdefinition.sequences:\n", + " seq_obj = component_definition.doc.find(seq_uri)\n", + " if seq_obj is not None:\n", + " seq_obj.copy(target_doc)" ] }, { "cell_type": "code", - "execution_count": 2, + "execution_count": null, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ - "found: https://synbiohub.org/user/Gon/CIDARMoCloParts/J23100/1 in https://synbiohub.org/user/Gon/CIDARMoCloPlasmidKit/pJ23100_AB/1 with ['Fusion_Site_A', 'Fusion_Site_B']\n", - "found: https://synbiohub.org/user/Gon/CIDARMoCloParts/J23100/1 in https://synbiohub.org/user/Gon/CIDARMoCloPlasmidKit/pJ23100_GB/1 with ['Fusion_Site_G', 'Fusion_Site_B']\n", - "found: https://synbiohub.org/user/Gon/CIDARMoCloParts/J23100/1 in https://synbiohub.org/user/Gon/CIDARMoCloPlasmidKit/pJ23100_FB/1 with ['Fusion_Site_B', 'Fusion_Site_F']\n", - "found: https://synbiohub.org/user/Gon/CIDARMoCloParts/J23100/1 in https://synbiohub.org/user/Gon/CIDARMoCloPlasmidKit/pJ23100_EB/1 with ['Fusion_Site_B', 'Fusion_Site_E']\n", - "found: https://synbiohub.org/user/Gon/CIDARMoCloParts/B0034/1 in https://synbiohub.org/user/Gon/CIDARMoCloPlasmidKit/pB0034_BC/1 with ['Fusion_Site_C', 'Fusion_Site_B']\n", - "found: https://synbiohub.org/user/Gon/CIDARMoCloParts/E0030_yfp/1 in https://synbiohub.org/user/Gon/CIDARMoCloPlasmidKit/pE0030_CD/1 with ['Fusion_Site_D', 'Fusion_Site_C']\n", - "found: https://synbiohub.org/user/Gon/CIDARMoCloParts/B0015/1 in https://synbiohub.org/user/Gon/CIDARMoCloPlasmidKit/pB0015_DG/1 with ['Fusion_Site_G', 'Fusion_Site_D']\n", - "found: https://synbiohub.org/user/Gon/CIDARMoCloParts/B0015/1 in https://synbiohub.org/user/Gon/CIDARMoCloPlasmidKit/pB0015_DE/1 with ['Fusion_Site_E', 'Fusion_Site_D']\n", - "found: https://synbiohub.org/user/Gon/CIDARMoCloParts/B0015/1 in https://synbiohub.org/user/Gon/CIDARMoCloPlasmidKit/pB0015_DH/1 with ['Fusion_Site_D', 'Fusion_Site_H']\n", - "found: https://synbiohub.org/user/Gon/CIDARMoCloParts/B0015/1 in https://synbiohub.org/user/Gon/CIDARMoCloPlasmidKit/pB0015_DF/1 with ['Fusion_Site_D', 'Fusion_Site_F']\n", - "matched J23100_A_B with UJHDBOTD_A_F on fusion site A! (new)\n", - "matched B0034_B_C with J23100_A_B on fusion site B! (new)\n", - "matched E0030_yfp_C_D with B0034_B_C on fusion site C! (new)\n", - "matched final component B0015_D_F with E0030_yfp_C_D and UJHDBOTD_A_Fon fusion sites (D, F)!\n" + "Fusion_Site_A\n", + "J23100\n", + "Fusion_Site_B\n", + "dva_backbone_core\n", + "https://SBOL2Build.org/example/1 [('pJ23100_AB_extracted_part', 'GGAGTTGA'), ('pJ23100_AB_five_prime_oh', 'GGAG'), ('Fusion_Site_A', 'GGAG'), ('J23100', 'TTGACGGC'), ('pJ23100_AB_three_prime_oh', 'TACT'), ('Fusion_Site_B', 'TACT')]\n", + "Fusion_Site_B\n", + "B0034\n", + "Fusion_Site_C\n", + "dva_backbone_core\n", + "https://SBOL2Build.org/example/1 [('pB0034_BC_extracted_part', 'TACTAGAG'), ('pB0034_BC_five_prime_oh', 'TACT'), ('Fusion_Site_B', 'TACT'), ('B0034', 'AGAGAAAG'), ('pB0034_BC_three_prime_oh', 'AATG'), ('Fusion_Site_C', 'AATG')]\n", + "Fusion_Site_C\n", + "E0030_yfp\n", + "Fusion_Site_D\n", + "dva_backbone_core\n", + "https://SBOL2Build.org/example/1 [('pE0030_CD_extracted_part', 'AATGATGG'), ('pE0030_CD_five_prime_oh', 'AATG'), ('Fusion_Site_C', 'AATG'), ('E0030_yfp', 'ATGGTGAG'), ('pE0030_CD_three_prime_oh', 'AGGT'), ('Fusion_Site_D', 'AGGT')]\n", + "Fusion_Site_D\n", + "B0015\n", + "Fusion_Site_E\n", + "dva_backbone_core\n", + "https://SBOL2Build.org/example/1 [('pB0015_DE_extracted_part', 'AGGTCCAG'), ('pB0015_DE_five_prime_oh', 'AGGT'), ('Fusion_Site_D', 'AGGT'), ('B0015', 'CCAGGCAT'), ('pB0015_DE_three_prime_oh', 'GCTT'), ('Fusion_Site_E', 'GCTT')]\n" ] } ], "source": [ - "plasmid_collection = sbol2.Document()\n", - "sbh = sbol2.PartShop(\"https://synbiohub.org\")\n", - "sbh.pull(\n", - " \"https://synbiohub.org/user/Gon/CIDARMoCloPlasmidKit/CIDARMoCloPlasmidKit_collection/1/893dd0b07a2eb4b9d0a70be6307d2af4c4a7c132/share\",\n", - " plasmid_collection,\n", - ")\n", - "sbh.pull(\n", - " \"https://synbiohub.org/user/Gon/CIDARMoCloParts/CIDARMoCloParts_collection/1/038feff5f9c6c9b35cc95586ed6b14ec9bd3fea5/share\",\n", - " plasmid_collection,\n", + "from sbol2build import (\n", + " golden_gate_assembly_plan,\n", + " part_digestion,\n", + " rebase_restriction_enzyme,\n", ")\n", "\n", - "abstract_design_doc = sbol2.Document()\n", - "abstract_design_doc.read(\"tests/test_files/moclo_parts_circuit.xml\")\n", + "part_documents = []\n", + "restriction_enzyme = rebase_restriction_enzyme(\"BsaI\")\n", + "assembly_plan = sbol2.ModuleDefinition()\n", "\n", - "backbone_doc = sbol2.Document()\n", - "sbh.pull(\n", - " \"https://synbiohub.org/user/ryangreer/gonzaloplasmids/module1/1/9d94ff284e1963ad6a2b00e99520ee5437994370/share\",\n", - " backbone_doc,\n", - ")\n", + "for mocloPlasmid in mocloplasmid_list:\n", + " new_doc = sbol2.Document()\n", + " mocloPlasmid.definition.copy(new_doc)\n", + " copy_sequences(mocloPlasmid.definition, new_doc, plasmid_collection)\n", + " part_documents.append(new_doc)\n", "\n", - "list = translate_abstract_to_plasmids(\n", - " abstract_design_doc, plasmid_collection, backbone_doc\n", + " # Run digestion\n", + " extracted, assembly_md = part_digestion(\n", + " mocloPlasmid.definition, [restriction_enzyme], assembly_plan, new_doc\n", + " )\n", + " print(assembly_md, [(c.displayId, s.elements[:8]) for c, s in extracted])\n", + "\n", + "# not finding second fusion site on any of the part digestions\n", + "assembly_doc = sbol2.Document()\n", + "assembly_obj = golden_gate_assembly_plan(\n", + " \"composite_2\", part_documents, backbone_doc, \"BsaI\", assembly_doc\n", ")" ] }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "use `pip install -e .` and restart kernel to reload latest version of local package" - ] - }, { "cell_type": "code", - "execution_count": null, + "execution_count": 6, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ - "[MocloPlasmid:\n", - " Name: J23100_A_B\n", - " Definition: https://synbiohub.org/user/Gon/CIDARMoCloPlasmidKit/pJ23100_AB/1\n", - " Fusion Sites: ['A', 'B'], MocloPlasmid:\n", - " Name: B0034_B_C\n", - " Definition: https://synbiohub.org/user/Gon/CIDARMoCloPlasmidKit/pB0034_BC/1\n", - " Fusion Sites: ['B', 'C'], MocloPlasmid:\n", - " Name: E0030_yfp_C_D\n", - " Definition: https://synbiohub.org/user/Gon/CIDARMoCloPlasmidKit/pE0030_CD/1\n", - " Fusion Sites: ['C', 'D'], MocloPlasmid:\n", - " Name: B0015_D_F\n", - " Definition: https://synbiohub.org/user/Gon/CIDARMoCloPlasmidKit/pB0015_DF/1\n", - " Fusion Sites: ['D', 'F']]\n", - "Design........................0\n", - "Build.........................0\n", - "Test..........................0\n", - "Analysis......................0\n", - "ComponentDefinition...........82\n", - "ModuleDefinition..............13\n", - "Model.........................0\n", - "Sequence......................74\n", - "Collection....................2\n", - "Activity......................0\n", - "Plan..........................0\n", - "Agent.........................0\n", - "Attachment....................0\n", - "CombinatorialDerivation.......0\n", - "Implementation................0\n", - "SampleRoster..................0\n", - "Experiment....................0\n", - "ExperimentalData..............0\n", - "Annotation Objects............50\n", - "---\n", - "Total: .........................221\n", - "\n" + "adding: pJ23100_AB_extracted_part\n", + "adding: pJ23100_AB_five_prime_oh\n", + "adding: Fusion_Site_A\n", + "adding: J23100\n", + "adding: pJ23100_AB_three_prime_oh\n", + "adding: Fusion_Site_B\n", + "adding: pB0034_BC_extracted_part\n", + "adding: pB0034_BC_five_prime_oh\n", + "adding: Fusion_Site_B\n", + "adding: B0034\n", + "adding: pB0034_BC_three_prime_oh\n", + "adding: Fusion_Site_C\n", + "adding: pE0030_CD_extracted_part\n", + "adding: pE0030_CD_five_prime_oh\n", + "adding: Fusion_Site_C\n", + "adding: E0030_yfp\n", + "adding: pE0030_CD_three_prime_oh\n", + "adding: Fusion_Site_D\n", + "adding: pB0015_DE_extracted_part\n", + "adding: pB0015_DE_five_prime_oh\n", + "adding: Fusion_Site_D\n", + "adding: B0015\n", + "adding: pB0015_DE_three_prime_oh\n", + "adding: Fusion_Site_E\n", + "adding: DVK_AE_extracted_backbone\n", + "adding: DVK_AE_three_prime_oh\n", + "adding: Fusion_Site_A\n", + "adding: DVK_AE_five_prime_oh\n", + "adding: Fusion_Site_E\n", + "adding: dvk_backbone_core\n", + "adding: composite_1\n" ] + }, + { + "data": { + "text/plain": [ + "'Valid.'" + ] + }, + "execution_count": 6, + "metadata": {}, + "output_type": "execute_result" } ], "source": [ - "print(list)\n", - "\n", - "print(plasmid_collection)" + "assembly_obj.run()\n", + "assembly_doc.write(\"abstract_assembly_plan.xml\")" ] }, { From 9c42721705b868e2675146a7a7e3c2c9d188b086 Mon Sep 17 00:00:00 2001 From: Ryan Greer Date: Thu, 30 Oct 2025 13:13:53 -0600 Subject: [PATCH 17/27] now comparing .lower version of both sequences for finding parts --- src/sbol2build/sbol2build.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/sbol2build/sbol2build.py b/src/sbol2build/sbol2build.py index 8aef9fa..e3d312d 100644 --- a/src/sbol2build/sbol2build.py +++ b/src/sbol2build/sbol2build.py @@ -372,7 +372,7 @@ def part_digestion( extracts_list.append((three_prime_oh_definition, three_prime_sequence)) extracts_list.append((definition, seq)) # add scars to list - elif seq.elements.lower() == product_sequence[4:-4]: + elif seq.elements.lower() == product_sequence[4:-4].lower(): original_part_def_URI = definition.identity extracts_list.append((definition, seq)) @@ -626,7 +626,7 @@ def backbone_digestion( extracts_list.append((three_prime_oh_definition, three_prime_sequence)) extracts_list.append((definition, seq)) # add scars to list - elif seq.elements.lower() == product_sequence[4:-4]: + elif seq.elements.lower() == product_sequence[4:-4].lower(): original_backbone_def_URI = definition.identity extracts_list.append((definition, seq)) From 36484cfc8d2689d8224a1b5c5a2927859a19fcc2 Mon Sep 17 00:00:00 2001 From: Ryan Greer Date: Thu, 30 Oct 2025 13:16:21 -0600 Subject: [PATCH 18/27] extract_toplevel_definition general implementation --- src/sbol2build/abstract_translator.py | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/src/sbol2build/abstract_translator.py b/src/sbol2build/abstract_translator.py index de239d5..faf1871 100644 --- a/src/sbol2build/abstract_translator.py +++ b/src/sbol2build/abstract_translator.py @@ -76,10 +76,7 @@ def extract_design_parts( def extract_toplevel_definition(doc: sbol2.Document) -> sbol2.ComponentDefinition: - module = doc.moduleDefinitions[0] - functional_component = module.functionalComponents[0] - - return doc.getComponentDefinition(functional_component.definition) + return doc.componentDefinitions[0] def construct_plasmid_dict( From 3dc7b080524ac8b3e3a736a0e62cc29c9b94b6a2 Mon Sep 17 00:00:00 2001 From: Ryan Greer Date: Fri, 31 Oct 2025 11:06:42 -0600 Subject: [PATCH 19/27] fixes to support multi composite assembly plans --- src/sbol2build/sbol2build.py | 37 ++++++++++++++++++++++++++++-------- 1 file changed, 29 insertions(+), 8 deletions(-) diff --git a/src/sbol2build/sbol2build.py b/src/sbol2build/sbol2build.py index e3d312d..db6a755 100644 --- a/src/sbol2build/sbol2build.py +++ b/src/sbol2build/sbol2build.py @@ -29,19 +29,26 @@ def rebase_restriction_enzyme(name: str, **kwargs) -> sbol2.ComponentDefinition: def dna_componentdefinition_with_sequence( - identity: str, sequence: str, **kwargs + identity: str, sequence: str, molecule: bool = False, **kwargs ) -> Tuple[sbol2.ComponentDefinition, sbol2.Sequence]: """Creates a DNA ComponentDefinition and its Sequence. :param identity: The identity of the Component. The identity of Sequence is also identity with the suffix '_seq'. :param sequence: The DNA sequence of the Component encoded in IUPAC. + :param molecule: Boolean value: true if type should be DNA molecule, false if DNA region :param kwargs: Keyword arguments of any other Component attribute. :return: A tuple of ComponentDefinition and Sequence. """ comp_seq = sbol2.Sequence( f"{identity}_seq", elements=sequence, encoding=sbol2.SBOL_ENCODING_IUPAC ) - dna_comp = sbol2.ComponentDefinition(identity, sbol2.BIOPAX_DNA, **kwargs) + dna_comp = sbol2.ComponentDefinition( + identity, + "http://www.biopax.org/release/biopax-level3.owl#Dna" + if molecule + else sbol2.BIOPAX_DNA, + **kwargs, + ) dna_comp.sequences = [comp_seq] return dna_comp, comp_seq @@ -853,6 +860,7 @@ def ligation( for composite in list_of_composites_per_assembly: # a composite of the form [A,B,C] # calculate sequence composite_sequence_str = "" + participations = [] prev_three_prime = ( composite[len(composite) - 1].components[1].definition ) # componentdefinitionuri @@ -901,8 +909,8 @@ def ligation( scar_definition.roles = ["http://identifiers.org/so/SO:0001953"] temp_extract_components.append(scar_definition.identity) - document.add(scar_definition) - document.add(scar_sequence) + add_object_to_doc(scar_definition, document) + add_object_to_doc(scar_sequence, document) scar_location = sbol2.Range( uri=f"Ligation_Scar_{number_to_suffix(scar_index)}_location", @@ -946,7 +954,7 @@ def ligation( # create dna component and sequence composite_component_definition, composite_seq = ( dna_componentdefinition_with_sequence( - f"composite_{composite_number}", composite_sequence_str + f"composite_{composite_number}", composite_sequence_str, molecule=True ) ) composite_component_definition.name = f"composite_{composite_number}" @@ -994,7 +1002,7 @@ def ligation( def append_extracts_to_doc( extract_tuples: List[Tuple[sbol2.ComponentDefinition, sbol2.Sequence]], doc: sbol2.Document, -): +) -> None: """Helper function for batch adding :class:`sbol2.ComponentDefinition` and :class:`sbol2.Sequence` to an :class:`sbol2.Document` :param extract_tuples: list of tuples of :class:`sbol2.ComponentDefinition` and :class:`sbol2.Sequence` @@ -1003,8 +1011,8 @@ def append_extracts_to_doc( for extract, sequence in extract_tuples: try: print("adding: " + extract.displayId) - doc.add(extract) - doc.add(sequence) + add_object_to_doc(extract, doc) + add_object_to_doc(sequence, doc) except Exception as e: if "" in str(e): pass @@ -1012,6 +1020,19 @@ def append_extracts_to_doc( raise e +def add_object_to_doc( + obj: sbol2.SBOLObject, + doc: sbol2.Document, +) -> None: + try: + doc.add(obj) + except Exception as e: + if "" in str(e): + pass + else: + raise e + + class golden_gate_assembly_plan: """Creates an Assembly Plan. From 6dbdae7d3fa5cfa3c77cc926cc489eee5ee79ca8 Mon Sep 17 00:00:00 2001 From: Ryan Greer Date: Fri, 31 Oct 2025 11:11:13 -0600 Subject: [PATCH 20/27] ligation product type: DNA region -> DNA molecule --- notebooks/test_notebook.ipynb | 126 ++++-- tests/test_abstract.py | 5 + tests/test_core.py | 4 +- tests/test_files/combinatorial_1.xml | 343 ++++++++++++++++ tests/test_files/moclo_parts_circuit.xml | 308 ++++++++++++++ tests/test_files/pJ23100_AB.xml | 402 ++++++++++++++++++ tests/test_files/pj23100_digest.xml | 498 +++++++++++++++++++++++ 7 files changed, 1652 insertions(+), 34 deletions(-) create mode 100644 tests/test_abstract.py create mode 100644 tests/test_files/combinatorial_1.xml create mode 100644 tests/test_files/moclo_parts_circuit.xml create mode 100644 tests/test_files/pJ23100_AB.xml create mode 100644 tests/test_files/pj23100_digest.xml diff --git a/notebooks/test_notebook.ipynb b/notebooks/test_notebook.ipynb index fd151c5..d7237b2 100644 --- a/notebooks/test_notebook.ipynb +++ b/notebooks/test_notebook.ipynb @@ -30,45 +30,23 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 2, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ - "Design........................0\n", - "Build.........................0\n", - "Test..........................0\n", - "Analysis......................0\n", - "ComponentDefinition...........7\n", - "ModuleDefinition..............0\n", - "Model.........................0\n", - "Sequence......................7\n", - "Collection....................0\n", - "Activity......................0\n", - "Plan..........................0\n", - "Agent.........................0\n", - "Attachment....................0\n", - "CombinatorialDerivation.......0\n", - "Implementation................0\n", - "SampleRoster..................0\n", - "Experiment....................0\n", - "ExperimentalData..............0\n", - "Annotation Objects............0\n", - "---\n", - "Total: .........................14\n", - "\n", "DVK_AE\n", "found: https://synbiohub.org/user/Gon/CIDARMoCloParts/J23100/1 in https://synbiohub.org/user/Gon/CIDARMoCloPlasmidsKit/pJ23100_EB/1 with ['Fusion_Site_E', 'Fusion_Site_B']\n", - "found: https://synbiohub.org/user/Gon/CIDARMoCloParts/J23100/1 in https://synbiohub.org/user/Gon/CIDARMoCloPlasmidsKit/pJ23100_FB/1 with ['Fusion_Site_B', 'Fusion_Site_F']\n", + "found: https://synbiohub.org/user/Gon/CIDARMoCloParts/J23100/1 in https://synbiohub.org/user/Gon/CIDARMoCloPlasmidsKit/pJ23100_FB/1 with ['Fusion_Site_F', 'Fusion_Site_B']\n", "found: https://synbiohub.org/user/Gon/CIDARMoCloParts/J23100/1 in https://synbiohub.org/user/Gon/CIDARMoCloPlasmidsKit/pJ23100_AB/1 with ['Fusion_Site_A', 'Fusion_Site_B']\n", - "found: https://synbiohub.org/user/Gon/CIDARMoCloParts/J23100/1 in https://synbiohub.org/user/Gon/CIDARMoCloPlasmidsKit/pJ23100_GB/1 with ['Fusion_Site_G', 'Fusion_Site_B']\n", + "found: https://synbiohub.org/user/Gon/CIDARMoCloParts/J23100/1 in https://synbiohub.org/user/Gon/CIDARMoCloPlasmidsKit/pJ23100_GB/1 with ['Fusion_Site_B', 'Fusion_Site_G']\n", "found: https://synbiohub.org/user/Gon/CIDARMoCloParts/B0034/1 in https://synbiohub.org/user/Gon/CIDARMoCloPlasmidsKit/pB0034_BC/1 with ['Fusion_Site_B', 'Fusion_Site_C']\n", "found: https://synbiohub.org/user/Gon/CIDARMoCloParts/E0030_yfp/1 in https://synbiohub.org/user/Gon/CIDARMoCloPlasmidsKit/pE0030_CD/1 with ['Fusion_Site_D', 'Fusion_Site_C']\n", "found: https://synbiohub.org/user/Gon/CIDARMoCloParts/B0015/1 in https://synbiohub.org/user/Gon/CIDARMoCloPlasmidsKit/pB0015_DF/1 with ['Fusion_Site_F', 'Fusion_Site_D']\n", - "found: https://synbiohub.org/user/Gon/CIDARMoCloParts/B0015/1 in https://synbiohub.org/user/Gon/CIDARMoCloPlasmidsKit/pB0015_DG/1 with ['Fusion_Site_D', 'Fusion_Site_G']\n", - "found: https://synbiohub.org/user/Gon/CIDARMoCloParts/B0015/1 in https://synbiohub.org/user/Gon/CIDARMoCloPlasmidsKit/pB0015_DE/1 with ['Fusion_Site_E', 'Fusion_Site_D']\n", + "found: https://synbiohub.org/user/Gon/CIDARMoCloParts/B0015/1 in https://synbiohub.org/user/Gon/CIDARMoCloPlasmidsKit/pB0015_DG/1 with ['Fusion_Site_G', 'Fusion_Site_D']\n", + "found: https://synbiohub.org/user/Gon/CIDARMoCloParts/B0015/1 in https://synbiohub.org/user/Gon/CIDARMoCloPlasmidsKit/pB0015_DE/1 with ['Fusion_Site_D', 'Fusion_Site_E']\n", "found: https://synbiohub.org/user/Gon/CIDARMoCloParts/B0015/1 in https://synbiohub.org/user/Gon/CIDARMoCloPlasmidsKit/pB0015_DH/1 with ['Fusion_Site_H', 'Fusion_Site_D']\n", "matched J23100_A_B with DVK_AE_A_E on fusion site A!\n", "matched B0034_B_C with J23100_A_B on fusion site B!\n", @@ -114,7 +92,7 @@ }, { "cell_type": "code", - "execution_count": 4, + "execution_count": 3, "metadata": {}, "outputs": [], "source": [ @@ -141,7 +119,7 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 4, "metadata": {}, "outputs": [ { @@ -194,7 +172,6 @@ " )\n", " print(assembly_md, [(c.displayId, s.elements[:8]) for c, s in extracted])\n", "\n", - "# not finding second fusion site on any of the part digestions\n", "assembly_doc = sbol2.Document()\n", "assembly_obj = golden_gate_assembly_plan(\n", " \"composite_2\", part_documents, backbone_doc, \"BsaI\", assembly_doc\n", @@ -203,7 +180,7 @@ }, { "cell_type": "code", - "execution_count": 6, + "execution_count": 5, "metadata": {}, "outputs": [ { @@ -249,7 +226,7 @@ "'Valid.'" ] }, - "execution_count": 6, + "execution_count": 5, "metadata": {}, "output_type": "execute_result" } @@ -259,6 +236,91 @@ "assembly_doc.write(\"abstract_assembly_plan.xml\")" ] }, + { + "cell_type": "code", + "execution_count": 6, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "[, , , , ]\n", + "adding: pJ23100_AB_extracted_part\n", + "adding: pJ23100_AB_five_prime_oh\n", + "adding: Fusion_Site_A\n", + "adding: J23100\n", + "adding: pJ23100_AB_three_prime_oh\n", + "adding: Fusion_Site_B\n", + "adding: pB0034_BC_extracted_part\n", + "adding: pB0034_BC_five_prime_oh\n", + "adding: Fusion_Site_B\n", + "adding: B0034\n", + "adding: pB0034_BC_three_prime_oh\n", + "adding: Fusion_Site_C\n", + "adding: pE0030_CD_extracted_part\n", + "adding: pE0030_CD_five_prime_oh\n", + "adding: Fusion_Site_C\n", + "adding: E0030_yfp\n", + "adding: pE0030_CD_three_prime_oh\n", + "adding: Fusion_Site_D\n", + "adding: pB0015_DE_extracted_part\n", + "adding: pB0015_DE_five_prime_oh\n", + "adding: Fusion_Site_D\n", + "adding: B0015\n", + "adding: pB0015_DE_three_prime_oh\n", + "adding: Fusion_Site_E\n", + "adding: pB0032_BC_extracted_part\n", + "adding: B0032\n", + "adding: pB0032_BC_five_prime_oh\n", + "adding: Fusion_Site_B\n", + "adding: pB0032_BC_three_prime_oh\n", + "adding: Fusion_Site_C\n", + "adding: DVK_AE_extracted_backbone\n", + "adding: DVK_AE_three_prime_oh\n", + "adding: Fusion_Site_A\n", + "adding: DVK_AE_five_prime_oh\n", + "adding: Fusion_Site_E\n", + "adding: dvk_backbone_core\n", + "adding: composite_1\n", + "adding: composite_2\n" + ] + }, + { + "data": { + "text/plain": [ + "'Valid.'" + ] + }, + "execution_count": 6, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "rbs_2 = sbol2.Document()\n", + "sbh.pull(\n", + " \"https://synbiohub.org/user/Gon/CIDARMoCloPlasmidsKit/pB0032_BC/1/620c77db9353a6d4a2bd5fe4fdbe080e6bc379c2/share\",\n", + " rbs_2,\n", + ")\n", + "\n", + "part_documents.append(rbs_2)\n", + "\n", + "print(part_documents)\n", + "\n", + "comb_assembly_doc = sbol2.Document()\n", + "comb_assembly_obj = golden_gate_assembly_plan(\n", + " \"combinatorial_assembly_plan\",\n", + " part_documents,\n", + " backbone_doc,\n", + " \"BsaI\",\n", + " comb_assembly_doc,\n", + ")\n", + "\n", + "comb_assembly_obj.run()\n", + "comb_assembly_doc.write(\"comb_assembly_plan.xml\")" + ] + }, { "cell_type": "code", "execution_count": null, diff --git a/tests/test_abstract.py b/tests/test_abstract.py new file mode 100644 index 0000000..f704746 --- /dev/null +++ b/tests/test_abstract.py @@ -0,0 +1,5 @@ +# test 1: test same abstract design with each possible circuit selection, ensure the promoter and terminator shift accordingly + +# test 2: inaccessible part in abstract design -> should throw informative error message + +# test 3: (FUTURE) abstract design with multiple TUs diff --git a/tests/test_core.py b/tests/test_core.py index acc6fad..8953a4d 100644 --- a/tests/test_core.py +++ b/tests/test_core.py @@ -265,9 +265,9 @@ def test_ligation(self): "Ligation product missing circular DNA type", ) self.assertTrue( - "http://www.biopax.org/release/biopax-level3.owl#DnaRegion" + "http://www.biopax.org/release/biopax-level3.owl#Dna" in obj.types, - "Ligation product missing DNA region type", + "Ligation product missing DNA Molecule type", ) self.assertTrue( "http://identifiers.org/so/SO:0000804" in obj.roles, diff --git a/tests/test_files/combinatorial_1.xml b/tests/test_files/combinatorial_1.xml new file mode 100644 index 0000000..5891d76 --- /dev/null +++ b/tests/test_files/combinatorial_1.xml @@ -0,0 +1,343 @@ + + + + + B0015 + 1 + B0015 + MoClo Basic Part: Double terminator (B0010:B0012) + + + + + 26479688 + + + + + + + E0040m_gfp + 1 + E0040m_gfp + MoClo Basic Part: CDS - Fluorescent protein. Green. Modified from Bba_E0040 to fix illegal site. + + + + + 26479688 + + + + + + + abstract_combinatorial + 1 + moclo abstract combinatorial design + + + + + + J23100_1 + 1 + + + + + + + + B0015_4 + 1 + + + + + + + + E0040m_gfp_3 + 1 + + + + + + + + RBS_HFQr_2 + 1 + + + + + + + + abstract_combinatorialAnnotation0 + 1 + + + + location0 + 1 + 1 + 35 + + + + + + + + + + abstract_combinatorialAnnotation1 + 1 + + + + location1 + 1 + + + + + + + + + + abstract_combinatorialAnnotation3 + 1 + + + + location3 + 1 + 756 + 884 + + + + + + + + + + abstract_combinatorialAnnotation2 + 1 + + + + location2 + 1 + 36 + 755 + + + + + + + + + + abstract_combinatorialConstraint3 + 1 + + + + + + + + + abstract_combinatorialConstraint1 + 1 + + + + + + + + + abstract_combinatorialConstraint2 + 1 + + + + + + + + + + J23100 + 1 + J23100 + MoClo Basic Part: Constitutive promoter - Anderson series - high strength + + + + + 26479688 + + + + + + + RBS_HFQr + 1 + RBS + + + + + + E0040m_gfp_sequence + 1 + E0040m_gfp Sequence + + + + 26479688 + ATGCGTAAAGGAGAAGAACTTTTCACTGGAGTTGTCCCAATTCTTGTTGAATTAGATGGTGATGTTAATGGGCACAAATTTTCTGTCAGTGGAGAGGGTGAAGGTGATGCAACATACGGAAAACTTACCCTTAAATTTATTTGCACTACTGGAAAACTACCTGTTCCATGGCCAACACTTGTCACTACTTTCGGTTATGGTGTTCAATGCTTTGCGAGATACCCAGATCATATGAAACAGCATGACTTTTTCAAGAGTGCCATGCCCGAAGGTTATGTACAGGAAAGAACTATATTTTTCAAAGATGACGGGAACTACAAGACACGTGCTGAAGTCAAGTTTGAAGGTGATACCCTTGTTAATAGAATCGAGTTAAAAGGTATTGATTTTAAAGAAGATGGAAACATTCTTGGACACAAATTGGAATACAACTATAACTCACACAATGTATACATCATGGCAGACAAACAAAAGAATGGAATCAAAGTTAACTTCAAAATTAGACACAACATTGAAGATGGAAGCGTTCAACTAGCAGACCATTATCAACAAAATACTCCAATTGGCGATGGCCCTGTCCTTTTACCAGACAACCATTACCTGTCCACACAATCTGCCCTTTCGAAAGATCCCAACGAAAAGAGAGATCACATGGTCCTTCTTGAGTTTGTAACAGCTGCTGGGATTACACATGGCATGGATGAACTATACAAATAATAA + + + + + J23100_sequence + 1 + J23100 Sequence + + + + 26479688 + TTGACGGCTAGCTCAGTCCTAGGTACAGTGCTAGC + + + + + abstract_combinatorial_sequence + TTGACGGCTAGCTCAGTCCTAGGTACAGTGCTAGCATGCGTAAAGGAGAAGAACTTTTCACTGGAGTTGTCCCAATTCTTGTTGAATTAGATGGTGATGTTAATGGGCACAAATTTTCTGTCAGTGGAGAGGGTGAAGGTGATGCAACATACGGAAAACTTACCCTTAAATTTATTTGCACTACTGGAAAACTACCTGTTCCATGGCCAACACTTGTCACTACTTTCGGTTATGGTGTTCAATGCTTTGCGAGATACCCAGATCATATGAAACAGCATGACTTTTTCAAGAGTGCCATGCCCGAAGGTTATGTACAGGAAAGAACTATATTTTTCAAAGATGACGGGAACTACAAGACACGTGCTGAAGTCAAGTTTGAAGGTGATACCCTTGTTAATAGAATCGAGTTAAAAGGTATTGATTTTAAAGAAGATGGAAACATTCTTGGACACAAATTGGAATACAACTATAACTCACACAATGTATACATCATGGCAGACAAACAAAAGAATGGAATCAAAGTTAACTTCAAAATTAGACACAACATTGAAGATGGAAGCGTTCAACTAGCAGACCATTATCAACAAAATACTCCAATTGGCGATGGCCCTGTCCTTTTACCAGACAACCATTACCTGTCCACACAATCTGCCCTTTCGAAAGATCCCAACGAAAAGAGAGATCACATGGTCCTTCTTGAGTTTGTAACAGCTGCTGGGATTACACATGGCATGGATGAACTATACAAATAATAACCAGGCATCAAATAAAACGAAAGGCTCAGTCGAAAGACTGGGCCTTTCGTTTTATCTGTTGTTTGTCGGTGAACGCTCTCTACTAGAGTCACACTGGCTCACCTTCGGGTGGGCCTTTCTGCGTTTATA + + + + + B0015_sequence + 1 + B0015 Sequence + + + + 26479688 + CCAGGCATCAAATAAAACGAAAGGCTCAGTCGAAAGACTGGGCCTTTCGTTTTATCTGTTGTTTGTCGGTGAACGCTCTCTACTAGAGTCACACTGGCTCACCTTCGGGTGGGCCTTTCTGCGTTTATA + + + + + abstract_combinatorial_Layout + + + + 455.0 + 339.0 + 200.0 + 100.0 + container + + + + + 0.0 + 50.0 + 200.0 + 1.0 + backbone + + + + + 0.0 + 0.0 + 50.0 + 100.0 + J23100_1 + + + + + + 50.0 + 0.0 + 50.0 + 100.0 + RBS_HFQr_2 + + + + + + 100.0 + 0.0 + 50.0 + 100.0 + E0040m_gfp_3 + + + + + + 150.0 + 0.0 + 50.0 + 100.0 + B0015_4 + + + + + + + J23100_Layout + + + + + B0015_Layout + + + + + RBS_HFQr_Layout + + + + + E0040m_gfp_Layout + + + + + combinatorialRBSs + combinatorial RBSs + + + + + + RBS_HFQr_2_VariableComponent + + + + + + + + diff --git a/tests/test_files/moclo_parts_circuit.xml b/tests/test_files/moclo_parts_circuit.xml new file mode 100644 index 0000000..a71bac7 --- /dev/null +++ b/tests/test_files/moclo_parts_circuit.xml @@ -0,0 +1,308 @@ + + + + + moclo_circuit + + + + i6TQvNp91_28 + + + + + + + + + i6TQvNp91 + 1 + + + + + + + E0030_yfp_3 + 1 + + + + + + + + B0034_2 + 1 + + + + + + + + J23100_1 + 1 + + + + + + + + B0015_4 + 1 + + + + + + + + i6TQvNp91Annotation2 + 1 + + + + location2 + 1 + + + + + + + + + + i6TQvNp91Annotation1 + 1 + + + + location1 + 1 + + + + + + + + + + i6TQvNp91Annotation0 + 1 + + + + location0 + 1 + + + + + + + + + + i6TQvNp91Annotation3 + 1 + + + + location3 + 1 + + + + + + + + + + i6TQvNp91Constraint2 + 1 + + + + + + + + + i6TQvNp91Constraint3 + 1 + + + + + + + + + i6TQvNp91Constraint1 + 1 + + + + + + + + + B0015 + 1 + B0015 + MoClo Basic Part: Double terminator (B0010:B0012) + + + + + 26479688 + + + + + + E0030_yfp + 1 + E0030_yfp + MoClo Basic Part: CDS - Fluorescent protein. Yellow. + + + + + 26479688 + + + + + + J23100 + 1 + J23100 + MoClo Basic Part: Constitutive promoter - Anderson series - high strength + + + + + 26479688 + + + + + + B0034 + 1 + B0034 + MoClo Basic Part: RBS - Weiss RBS, high strength. Modified from Bba_B0034 to adjust spacing in MC system. + + + + + 26479688 + + + + + + J23100_Layout + + + + + moclo_circuit_Layout + + + + 720.0 + 339.0 + 200.0 + 100.0 + i6TQvNp91_28 + + + + + + + B0015_Layout + + + + + i6TQvNp91_Layout + + + + 720.0 + 339.0 + 200.0 + 100.0 + container + + + + + 0.0 + 50.0 + 200.0 + 1.0 + backbone + + + + + 0.0 + 0.0 + 50.0 + 100.0 + J23100_1 + + + + + + 50.0 + 0.0 + 50.0 + 100.0 + B0034_2 + + + + + + 100.0 + 0.0 + 50.0 + 100.0 + E0030_yfp_3 + + + + + + 150.0 + 0.0 + 50.0 + 100.0 + B0015_4 + + + + + + + E0030_yfp_Layout + + + + + B0034_Layout + + + diff --git a/tests/test_files/pJ23100_AB.xml b/tests/test_files/pJ23100_AB.xml new file mode 100644 index 0000000..d43bd38 --- /dev/null +++ b/tests/test_files/pJ23100_AB.xml @@ -0,0 +1,402 @@ + + + + + pJ23100_AB + 1 + pJ23100_AB + + + + + + + + + J23100_3 + 1 + + + + + + + + + + Fusion_Site_B_4 + 1 + + + + + + + + + + Fusion_Site_A_2 + 1 + + + + + + + + + + dva_backbone_core_5 + 1 + + + + + + + + + + pJ23100_ABAnnotation0 + 1 + + + + + + location0 + 1 + + + 1 + 4 + + + + + + + + + + pJ23100_ABAnnotation1 + 1 + + + + + + location1 + 1 + + + 5 + 39 + + + + + + + + + + pJ23100_ABAnnotation2 + 1 + + + + + + location2 + 1 + + + 40 + 43 + + + + + + + + + + pJ23100_ABAnnotation3 + 1 + + + + + + location3 + 1 + + + 44 + 2210 + + + + + + + + + + pJ23100_ABConstraint1 + 1 + + + + + + + + + + + pJ23100_ABConstraint2 + 1 + + + + + + + + + + + pJ23100_ABConstraint3 + 1 + + + + + + + + + + + + Fusion_Site_A + 1 + Fusion_Site_A + MoClo standard fusion site A + + + + 26479688 + + + + + + + Fusion_Site_B + 1 + Fusion_Site_B + MoClo standard fusion site B + + + + 26479688 + + + + + + + J23100 + 1 + J23100 + MoClo Basic Part: Constitutive promoter - Anderson series - high strength + + + + 26479688 + + + + + + + dva_backbone_core + 1 + This is the backbone core for Destination Vector Ampicillin (DVA) plasmids. Based on the pSB1A2 plasmid and contains an ampicillin resistance gene and a high copy number origin of replication. + + + 26479688 + + + + + + Component_ori + 1 + + + 26479688 + + + + + + + + Component_amp + 1 + + + 26479688 + + + + + + + + origin_of_replication_pSB1A2_annotation + 1 + + + 26479688 + + + + ori + 1 + + + 26479688 + 272 + 860 + + + + + + + + + + amp_region_annotation + 1 + + + 26479688 + + + + amp + 1 + + + 26479688 + 1031 + 1996 + + + + + + + + + + + amp_region + 1 + Ampicillin resistance gene from the pSB1A2 plasmid. + + + 26479688 + + + + + + + origin_of_replication_pSB1A2 + 1 + Origin of replication from the pSB1A2/pSB1K3 plasmid. pSB1A2 is a high copy number plasmid. The replication origin is a pUC19-derived pMB1 (copy number of 100-300 per cell + + + 26479688 + + + + + + + pJ23100_AB_sequence + 1 + + + GGAGTTGACGGCTAGCTCAGTCCTAGGTACAGTGCTAGCTACTtccagtcgggaaacctgtcgtgccagctgcattaatgaatcggccaacgcgcggggaagacgtgcttagagacctactagtagcggccgctgcaggcttcctcgctcactgactcgctgcgctcggtcgttcggctgcggcgagcggtatcagctcactcaaaggcggtaatacggttatccacagaatcaggggataacgcaggaaagaacatgtgagcaaaaggccagcaaaaggccaggaaccgtaaaaaggccgcgttgctggcgtttttccacaggctccgcccccctgacgagcatcacaaaaatcgacgctcaagtcagaggtggcgaaacccgacaggactataaagataccaggcgtttccccctggaagctccctcgtgcgctctcctgttccgaccctgccgcttaccggatacctgtccgcctttctcccttcgggaagcgtggcgctttctcatagctcacgctgtaggtatctcagttcggtgtaggtcgttcgctccaagctgggctgtgtgcacgaaccccccgttcagcccgaccgctgcgccttatccggtaactatcgtcttgagtccaacccggtaagacacgacttatcgccactggcagcagccactggtaacaggattagcagagcgaggtatgtaggcggtgctacagagttcttgaagtggtggcctaactacggctacactagaagaacagtatttggtatctgcgctctgctgaagccagttaccttcggaaaaagagttggtagctcttgatccggcaaacaaaccaccgctggtagcggtggtttttttgtttgcaagcagcagattacgcgcagaaaaaaaggatctcaagaagatcctttgatcttttctacggggtctgacgctcagtggaacgaaaactcacgttaagggattttggtcatgagattatcaaaaaggatcttcacctagatccttttaaattaaaaatgaagttttaaatcaatctaaagtatatatgagtaaacttggtctgacagttaccaatgcttaatcagtgaggcacctatctcagcgatctgtctatttcgttcatccatagttgcctgactccccgtcgtgtagataactacgatacgggagggcttaccatctggccccagtgctgcaatgataccgcgcgacccacgctcaccggctccagatttatcagcaataaaccagccagccggaagggccgagcgcagaagtggtcctgcaactttatccgcctccatccagtctattaattgttgccgggaagctagagtaagtagttcgccagttaatagtttgcgcaacgttgttgccattgctacaggcatcgtggtgtcacgctcgtcgtttggtatggcttcattcagctccggttcccaacgatcaaggcgagttacatgatcccccatgttgtgcaaaaaagcggttagctccttcggtcctccgatcgttgtcagaagtaagttggccgcagtgttatcactcatggttatggcagcactgcataattctcttactgtcatgccatccgtaagatgcttttctgtgactggtgagtactcaaccaagtcattctgagaatagtgtatgcggcgaccgagttgctcttgcccggcgtcaatacgggataataccgcgccacatagcagaactttaaaagtgctcatcattggaaaacgttcttcggggcgaaaactctcaaggatcttaccgctgttgagatccagttcgatgtaacccactcgtgcacccaactgatcttcagcatcttttactttcaccagcgtttctgggtgagcaaaaacaggaaggcaaaatgccgcaaaaaagggaataagggcgacacggaaatgttgaatactcatactcttcctttttcaatattattgaagcatttatcagggttattgtctcatgagcggatacatatttgaatgtatttagaaaaataaacaaataggggttccgcgcacatttccccgaaaagtgccacctgacgtctaagaaaccattattatcatgacattaacctataaaaataggcgtatcacgaggcagaatttcagataaaaaaaatccttagctttcgctaaggatgatttctggaattcgcggccgcttctagagactagtgggtctca + + + + + Fusion_Site_A_sequence + 1 + Fusion_Site_A Sequence + + + GGAG + + + + + Fusion_Site_B_sequence + 1 + Fusion_Site_B Sequence + + + TACT + + + + + J23100_sequence + 1 + J23100 Sequence + + + TTGACGGCTAGCTCAGTCCTAGGTACAGTGCTAGC + + + + + dva_backbone_core_seq + 1 + + + 26479688 + agagacctactagtagcggccgctgcaggcttcctcgctcactgactcgctgcgctcggtcgttcggctgcggcgagcggtatcagctcactcaaaggcggtaatacggttatccacagaatcaggggataacgcaggaaagaacatgtgagcaaaaggccagcaaaaggccaggaaccgtaaaaaggccgcgttgctggcgtttttccacaggctccgcccccctgacgagcatcacaaaaatcgacgctcaagtcagaggtggcgaaacccgacaggactataaagataccaggcgtttccccctggaagctccctcgtgcgctctcctgttccgaccctgccgcttaccggatacctgtccgcctttctcccttcgggaagcgtggcgctttctcatagctcacgctgtaggtatctcagttcggtgtaggtcgttcgctccaagctgggctgtgtgcacgaaccccccgttcagcccgaccgctgcgccttatccggtaactatcgtcttgagtccaacccggtaagacacgacttatcgccactggcagcagccactggtaacaggattagcagagcgaggtatgtaggcggtgctacagagttcttgaagtggtggcctaactacggctacactagaagaacagtatttggtatctgcgctctgctgaagccagttaccttcggaaaaagagttggtagctcttgatccggcaaacaaaccaccgctggtagcggtggtttttttgtttgcaagcagcagattacgcgcagaaaaaaaggatctcaagaagatcctttgatcttttctacggggtctgacgctcagtggaacgaaaactcacgttaagggattttggtcatgagattatcaaaaaggatcttcacctagatccttttaaattaaaaatgaagttttaaatcaatctaaagtatatatgagtaaacttggtctgacagttaccaatgcttaatcagtgaggcacctatctcagcgatctgtctatttcgttcatccatagttgcctgactccccgtcgtgtagataactacgatacgggagggcttaccatctggccccagtgctgcaatgataccgcgcgacccacgctcaccggctccagatttatcagcaataaaccagccagccggaagggccgagcgcagaagtggtcctgcaactttatccgcctccatccagtctattaattgttgccgggaagctagagtaagtagttcgccagttaatagtttgcgcaacgttgttgccattgctacaggcatcgtggtgtcacgctcgtcgtttggtatggcttcattcagctccggttcccaacgatcaaggcgagttacatgatcccccatgttgtgcaaaaaagcggttagctccttcggtcctccgatcgttgtcagaagtaagttggccgcagtgttatcactcatggttatggcagcactgcataattctcttactgtcatgccatccgtaagatgcttttctgtgactggtgagtactcaaccaagtcattctgagaatagtgtatgcggcgaccgagttgctcttgcccggcgtcaatacgggataataccgcgccacatagcagaactttaaaagtgctcatcattggaaaacgttcttcggggcgaaaactctcaaggatcttaccgctgttgagatccagttcgatgtaacccactcgtgcacccaactgatcttcagcatcttttactttcaccagcgtttctgggtgagcaaaaacaggaaggcaaaatgccgcaaaaaagggaataagggcgacacggaaatgttgaatactcatactcttcctttttcaatattattgaagcatttatcagggttattgtctcatgagcggatacatatttgaatgtatttagaaaaataaacaaataggggttccgcgcacatttccccgaaaagtgccacctgacgtctaagaaaccattattatcatgacattaacctataaaaataggcgtatcacgaggcagaatttcagataaaaaaaatccttagctttcgctaaggatgatttctggaattcgcggccgcttctagagactagtgggtctca + + + + + amp_region_seq + 1 + + + 26479688 + cgcggaacccctatttgtttatttttctaaatacattcaaatatgtatccgctcatgagacaataaccctgataaatgcttcaataatattgaaaaaggaagagtatgagtattcaacatttccgtgtcgcccttattcccttttttgcggcattttgccttcctgtttttgctcacccagaaacgctggtgaaagtaaaagatgctgaagatcagttgggtgcacgagtgggttacatcgaactggatctcaacagcggtaagatccttgagagttttcgccccgaagaacgttttccaatgatgagcacttttaaagttctgctatgtggcgcggtattatcccgtattgacgccgggcaagagcaactcggtcgccgcatacactattctcagaatgacttggttgagtactcaccagtcacagaaaagcatcttacggatggcatgacagtaagagaattatgcagtgctgccataaccatgagtgataacactgcggccaacttacttctgacaacgatcggaggaccgaaggagctaaccgcttttttgcacaacatgggggatcatgtaactcgccttgatcgttgggaaccggagctgaatgaagccataccaaacgacgagcgtgacaccacgatgcctgtagcaatggcaacaacgttgcgcaaactattaactggcgaactacttactctagcttcccggcaacaattaatagactggatggaggcggataaagttgcaggaccacttctgcgctcggcccttccggctggctggtttattgctgataaatctggagccggtgagcgtgggtcgcgcggtatcattgcagcactggggccagatggtaagccctcccgtatcgtagttatctacacgacggggagtcaggcaactatggatgaacgaaatagacagatcgctgagataggtgcctcactgattaagcattggtaa + + + + + origin_of_replication_seq + 1 + + + 26479688 + ttgagatcctttttttctgcgcgtaatctgctgcttgcaaacaaaaaaaccaccgctaccagcggtggtttgtttgccggatcaagagctaccaactctttttccgaaggtaactggcttcagcagagcgcagataccaaatactgttcttctagtgtagccgtagttaggccaccacttcaagaactctgtagcaccgcctacatacctcgctctgctaatcctgttaccagtggctgctgccagtggcgataagtcgtgtcttaccgggttggactcaagacgatagttaccggataaggcgcagcggtcgggctgaacggggggttcgtgcacacagcccagcttggagcgaacgacctacaccgaactgagatacctacagcgtgagctatgagaaagcgccacgcttcccgaagggagaaaggcggacaggtatccggtaagcggcagggtcggaacaggagagcgcacgagggagcttccagggggaaacgcctggtatctttatagtcctgtcgggtttcgccacctctgacttgagcgtcgatttttgtgatgctcgtcaggggggcggagcctgtggaaa + + + \ No newline at end of file diff --git a/tests/test_files/pj23100_digest.xml b/tests/test_files/pj23100_digest.xml new file mode 100644 index 0000000..e7da9ac --- /dev/null +++ b/tests/test_files/pj23100_digest.xml @@ -0,0 +1,498 @@ + + + + + Fusion_Site_A + 1 + Fusion_Site_A + MoClo standard fusion site A + + + + 26479688 + + + + + + + J23100 + 1 + J23100 + MoClo Basic Part: Constitutive promoter - Anderson series - high strength + + + + 26479688 + + + + + + + amp_region + 1 + Ampicillin resistance gene from the pSB1A2 plasmid. + + + 26479688 + + + + + + + pJ23100_abDigest + 1 + please work + + + + + + + Fusion_Site_A_2 + 1 + + + + + + + + dva_backbone_core_5 + 1 + + + + + + + + J23100_3 + 1 + + + + + + + + Fusion_Site_B_4 + 1 + + + + + + + + pJ23100_abDigestAnnotation2 + 1 + + + + location2 + 1 + 40 + 43 + + + + + + + + + + pJ23100_abDigestAnnotation3 + 1 + + + + location3 + 1 + 44 + 2143 + + + + + + + + + + pJ23100_abDigestAnnotation1 + 1 + + + + location1 + 1 + 5 + 39 + + + + + + + + + + pJ23100_abDigestAnnotation0 + 1 + + + + location0 + 1 + 1 + 4 + + + + + + + + + + pJ23100_abDigestConstraint2 + 1 + + + + + + + + + pJ23100_abDigestConstraint1 + 1 + + + + + + + + + pJ23100_abDigestConstraint3 + 1 + + + + + + + + + + Fusion_Site_B + 1 + Fusion_Site_B + MoClo standard fusion site B + + + + 26479688 + + + + + + + dva_backbone_core + 1 + This is the backbone core for Destination Vector Ampicillin (DVA) plasmids. Based on the pSB1A2 plasmid and contains an ampicillin resistance gene and a high copy number origin of replication. + + + 26479688 + + + + + + Component_amp + 1 + + + 26479688 + + + + + + + + Component_ori + 1 + + + 26479688 + + + + + + + + origin_of_replication_pSB1A2_annotation + 1 + + + 26479688 + + + + ori + 1 + + + 26479688 + 272 + 860 + + + + + + + + + + amp_region_annotation + 1 + + + 26479688 + + + + amp + 1 + + + 26479688 + 1031 + 1996 + + + + + + + + + + + origin_of_replication_pSB1A2 + 1 + Origin of replication from the pSB1A2/pSB1K3 plasmid. pSB1A2 is a high copy number plasmid. The replication origin is a pUC19-derived pMB1 (copy number of 100-300 per cell + + + 26479688 + + + + + + + pJ23100_abDigest_sequence + GGAGTTGACGGCTAGCTCAGTCCTAGGTACAGTGCTAGCTACTagagacctactagtagcggccgctgcaggcttcctcgctcactgactcgctgcgctcggtcgttcggctgcggcgagcggtatcagctcactcaaaggcggtaatacggttatccacagaatcaggggataacgcaggaaagaacatgtgagcaaaaggccagcaaaaggccaggaaccgtaaaaaggccgcgttgctggcgtttttccacaggctccgcccccctgacgagcatcacaaaaatcgacgctcaagtcagaggtggcgaaacccgacaggactataaagataccaggcgtttccccctggaagctccctcgtgcgctctcctgttccgaccctgccgcttaccggatacctgtccgcctttctcccttcgggaagcgtggcgctttctcatagctcacgctgtaggtatctcagttcggtgtaggtcgttcgctccaagctgggctgtgtgcacgaaccccccgttcagcccgaccgctgcgccttatccggtaactatcgtcttgagtccaacccggtaagacacgacttatcgccactggcagcagccactggtaacaggattagcagagcgaggtatgtaggcggtgctacagagttcttgaagtggtggcctaactacggctacactagaagaacagtatttggtatctgcgctctgctgaagccagttaccttcggaaaaagagttggtagctcttgatccggcaaacaaaccaccgctggtagcggtggtttttttgtttgcaagcagcagattacgcgcagaaaaaaaggatctcaagaagatcctttgatcttttctacggggtctgacgctcagtggaacgaaaactcacgttaagggattttggtcatgagattatcaaaaaggatcttcacctagatccttttaaattaaaaatgaagttttaaatcaatctaaagtatatatgagtaaacttggtctgacagttaccaatgcttaatcagtgaggcacctatctcagcgatctgtctatttcgttcatccatagttgcctgactccccgtcgtgtagataactacgatacgggagggcttaccatctggccccagtgctgcaatgataccgcgcgacccacgctcaccggctccagatttatcagcaataaaccagccagccggaagggccgagcgcagaagtggtcctgcaactttatccgcctccatccagtctattaattgttgccgggaagctagagtaagtagttcgccagttaatagtttgcgcaacgttgttgccattgctacaggcatcgtggtgtcacgctcgtcgtttggtatggcttcattcagctccggttcccaacgatcaaggcgagttacatgatcccccatgttgtgcaaaaaagcggttagctccttcggtcctccgatcgttgtcagaagtaagttggccgcagtgttatcactcatggttatggcagcactgcataattctcttactgtcatgccatccgtaagatgcttttctgtgactggtgagtactcaaccaagtcattctgagaatagtgtatgcggcgaccgagttgctcttgcccggcgtcaatacgggataataccgcgccacatagcagaactttaaaagtgctcatcattggaaaacgttcttcggggcgaaaactctcaaggatcttaccgctgttgagatccagttcgatgtaacccactcgtgcacccaactgatcttcagcatcttttactttcaccagcgtttctgggtgagcaaaaacaggaaggcaaaatgccgcaaaaaagggaataagggcgacacggaaatgttgaatactcatactcttcctttttcaatattattgaagcatttatcagggttattgtctcatgagcggatacatatttgaatgtatttagaaaaataaacaaataggggttccgcgcacatttccccgaaaagtgccacctgacgtctaagaaaccattattatcatgacattaacctataaaaataggcgtatcacgaggcagaatttcagataaaaaaaatccttagctttcgctaaggatgatttctggaattcgcggccgcttctagagactagtgggtctca + + + + + Fusion_Site_B_sequence + 1 + Fusion_Site_B Sequence + + + TACT + + + + + origin_of_replication_seq + 1 + + + 26479688 + ttgagatcctttttttctgcgcgtaatctgctgcttgcaaacaaaaaaaccaccgctaccagcggtggtttgtttgccggatcaagagctaccaactctttttccgaaggtaactggcttcagcagagcgcagataccaaatactgttcttctagtgtagccgtagttaggccaccacttcaagaactctgtagcaccgcctacatacctcgctctgctaatcctgttaccagtggctgctgccagtggcgataagtcgtgtcttaccgggttggactcaagacgatagttaccggataaggcgcagcggtcgggctgaacggggggttcgtgcacacagcccagcttggagcgaacgacctacaccgaactgagatacctacagcgtgagctatgagaaagcgccacgcttcccgaagggagaaaggcggacaggtatccggtaagcggcagggtcggaacaggagagcgcacgagggagcttccagggggaaacgcctggtatctttatagtcctgtcgggtttcgccacctctgacttgagcgtcgatttttgtgatgctcgtcaggggggcggagcctgtggaaa + + + + + amp_region_seq + 1 + + + 26479688 + cgcggaacccctatttgtttatttttctaaatacattcaaatatgtatccgctcatgagacaataaccctgataaatgcttcaataatattgaaaaaggaagagtatgagtattcaacatttccgtgtcgcccttattcccttttttgcggcattttgccttcctgtttttgctcacccagaaacgctggtgaaagtaaaagatgctgaagatcagttgggtgcacgagtgggttacatcgaactggatctcaacagcggtaagatccttgagagttttcgccccgaagaacgttttccaatgatgagcacttttaaagttctgctatgtggcgcggtattatcccgtattgacgccgggcaagagcaactcggtcgccgcatacactattctcagaatgacttggttgagtactcaccagtcacagaaaagcatcttacggatggcatgacagtaagagaattatgcagtgctgccataaccatgagtgataacactgcggccaacttacttctgacaacgatcggaggaccgaaggagctaaccgcttttttgcacaacatgggggatcatgtaactcgccttgatcgttgggaaccggagctgaatgaagccataccaaacgacgagcgtgacaccacgatgcctgtagcaatggcaacaacgttgcgcaaactattaactggcgaactacttactctagcttcccggcaacaattaatagactggatggaggcggataaagttgcaggaccacttctgcgctcggcccttccggctggctggtttattgctgataaatctggagccggtgagcgtgggtcgcgcggtatcattgcagcactggggccagatggtaagccctcccgtatcgtagttatctacacgacggggagtcaggcaactatggatgaacgaaatagacagatcgctgagataggtgcctcactgattaagcattggtaa + + + + + J23100_sequence + 1 + J23100 Sequence + + + TTGACGGCTAGCTCAGTCCTAGGTACAGTGCTAGC + + + + + Fusion_Site_A_sequence + 1 + Fusion_Site_A Sequence + + + GGAG + + + + + dva_backbone_core_seq + 1 + + + 26479688 + agagacctactagtagcggccgctgcaggcttcctcgctcactgactcgctgcgctcggtcgttcggctgcggcgagcggtatcagctcactcaaaggcggtaatacggttatccacagaatcaggggataacgcaggaaagaacatgtgagcaaaaggccagcaaaaggccaggaaccgtaaaaaggccgcgttgctggcgtttttccacaggctccgcccccctgacgagcatcacaaaaatcgacgctcaagtcagaggtggcgaaacccgacaggactataaagataccaggcgtttccccctggaagctccctcgtgcgctctcctgttccgaccctgccgcttaccggatacctgtccgcctttctcccttcgggaagcgtggcgctttctcatagctcacgctgtaggtatctcagttcggtgtaggtcgttcgctccaagctgggctgtgtgcacgaaccccccgttcagcccgaccgctgcgccttatccggtaactatcgtcttgagtccaacccggtaagacacgacttatcgccactggcagcagccactggtaacaggattagcagagcgaggtatgtaggcggtgctacagagttcttgaagtggtggcctaactacggctacactagaagaacagtatttggtatctgcgctctgctgaagccagttaccttcggaaaaagagttggtagctcttgatccggcaaacaaaccaccgctggtagcggtggtttttttgtttgcaagcagcagattacgcgcagaaaaaaaggatctcaagaagatcctttgatcttttctacggggtctgacgctcagtggaacgaaaactcacgttaagggattttggtcatgagattatcaaaaaggatcttcacctagatccttttaaattaaaaatgaagttttaaatcaatctaaagtatatatgagtaaacttggtctgacagttaccaatgcttaatcagtgaggcacctatctcagcgatctgtctatttcgttcatccatagttgcctgactccccgtcgtgtagataactacgatacgggagggcttaccatctggccccagtgctgcaatgataccgcgcgacccacgctcaccggctccagatttatcagcaataaaccagccagccggaagggccgagcgcagaagtggtcctgcaactttatccgcctccatccagtctattaattgttgccgggaagctagagtaagtagttcgccagttaatagtttgcgcaacgttgttgccattgctacaggcatcgtggtgtcacgctcgtcgtttggtatggcttcattcagctccggttcccaacgatcaaggcgagttacatgatcccccatgttgtgcaaaaaagcggttagctccttcggtcctccgatcgttgtcagaagtaagttggccgcagtgttatcactcatggttatggcagcactgcataattctcttactgtcatgccatccgtaagatgcttttctgtgactggtgagtactcaaccaagtcattctgagaatagtgtatgcggcgaccgagttgctcttgcccggcgtcaatacgggataataccgcgccacatagcagaactttaaaagtgctcatcattggaaaacgttcttcggggcgaaaactctcaaggatcttaccgctgttgagatccagttcgatgtaacccactcgtgcacccaactgatcttcagcatcttttactttcaccagcgtttctgggtgagcaaaaacaggaaggcaaaatgccgcaaaaaagggaataagggcgacacggaaatgttgaatactcatactcttcctttttcaatattattgaagcatttatcagggttattgtctcatgagcggatacatatttgaatgtatttagaaaaataaacaaataggggttccgcgcacatttccccgaaaagtgccacctgacgtctaagaaaccattattatcatgacattaacctataaaaataggcgtatcacgaggcagaatttcagataaaaaaaatccttagctttcgctaaggatgatttctggaattcgcggccgcttctagagactagtgggtctca + + + + + Fusion_Site_B_Layout + + + + + J23100_Layout + + + + + amp_region_Layout + + + + + origin_of_replication_pSB1A2_Layout + + + + + dva_backbone_core_Layout + + + + 0.0 + 0.0 + 50.0 + 100.0 + container + + + + + 0.0 + 0.0 + 0.0 + 0.0 + backbone + + + + + 0.0 + 0.0 + 50.0 + 100.0 + Component_ori + + + + + + 0.0 + 0.0 + 50.0 + 100.0 + Component_amp + + + + + + + pJ23100_abDigest_Layout + + + + 455.0 + 334.5 + 152.0 + 100.0 + container + + + + + 0.0 + 50.0 + 152.0 + 1.0 + backbone + + + + + 1.0 + 0.0 + 50.0 + 100.0 + Fusion_Site_A_2 + + + + + + 51.0 + 0.0 + 50.0 + 100.0 + J23100_3 + + + + + + 101.0 + 0.0 + 50.0 + 100.0 + Fusion_Site_B_4 + + + + + + 151.0 + 0.0 + 1.0 + 100.0 + dva_backbone_core_5 + + + + + + + Fusion_Site_A_Layout + + + From e882dee4cd261e482622acc9a1ed8680f9b8dde2 Mon Sep 17 00:00:00 2001 From: Ryan Greer Date: Mon, 3 Nov 2025 19:00:26 -0700 Subject: [PATCH 21/27] combinatorial abstract design testing --- notebooks/comb_design.ipynb | 429 ++++++++++++++++++++++++++++++++++ notebooks/test_notebook.ipynb | 43 ++-- 2 files changed, 458 insertions(+), 14 deletions(-) create mode 100644 notebooks/comb_design.ipynb diff --git a/notebooks/comb_design.ipynb b/notebooks/comb_design.ipynb new file mode 100644 index 0000000..ead09ff --- /dev/null +++ b/notebooks/comb_design.ipynb @@ -0,0 +1,429 @@ +{ + "cells": [ + { + "cell_type": "code", + "execution_count": 1, + "id": "814099af", + "metadata": {}, + "outputs": [], + "source": [ + "import sbol2\n", + "from typing import Dict, List\n", + "from sbol2build.abstract_translator import extract_design_parts" + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "id": "2f1ab216", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Design........................0\n", + "Build.........................0\n", + "Test..........................0\n", + "Analysis......................0\n", + "ComponentDefinition...........5\n", + "ModuleDefinition..............0\n", + "Model.........................0\n", + "Sequence......................4\n", + "Collection....................0\n", + "Activity......................0\n", + "Plan..........................0\n", + "Agent.........................0\n", + "Attachment....................0\n", + "CombinatorialDerivation.......1\n", + "Implementation................0\n", + "SampleRoster..................0\n", + "Experiment....................0\n", + "ExperimentalData..............0\n", + "Annotation Objects............5\n", + "---\n", + "Total: .........................15\n", + "\n" + ] + } + ], + "source": [ + "abstract_doc = sbol2.Document()\n", + "abstract_doc.read(\"tests/test_files/combinatorial_1.xml\")\n", + "print(abstract_doc)" + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "id": "f0fb25d5", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "https://sbolcanvas.org/abstract_combinatorial/1\n" + ] + } + ], + "source": [ + "toplevel = abstract_doc.componentDefinitions[\n", + " 2\n", + "] # TODO develop approach to extract toplevel definition in non MD documents; maybe check for annotations or subcomponents\n", + "print(toplevel)" + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "id": "c36c9c45", + "metadata": {}, + "outputs": [], + "source": [ + "parts = extract_design_parts(toplevel, abstract_doc)" + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "id": "bf3932d9", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "https://synbiohub.org/user/Gon/CIDARMoCloParts/J23100/1\n", + "https://sbolcanvas.org/RBS_HFQr/1\n", + "https://synbiohub.org/user/Gon/CIDARMoCloParts/E0040m_gfp/1\n", + "https://synbiohub.org/user/Gon/CIDARMoCloParts/B0015/1\n" + ] + } + ], + "source": [ + "for part in parts:\n", + " print(part)" + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "id": "ecd909f4", + "metadata": {}, + "outputs": [], + "source": [ + "def extract_combinatorial_design_parts(\n", + " design: sbol2.ComponentDefinition, doc: sbol2.Document, plasmid_doc\n", + ") -> Dict[str, List[sbol2.ComponentDefinition]]:\n", + " \"\"\"\n", + " Extracts and returns a mapping of component definitions from a combinatorial design, in order.\n", + "\n", + " Retrieves the components in sequential order from the given design.\n", + " Variants of combinatinatorial components are entered in a list corresponding to the URI of the component in the abstract design.\n", + "\n", + " Args:\n", + " design:\n", + " The :class:`sbol2.ComponentDefinition` representing the top-level design\n", + " from which to extract parts.\n", + " doc:\n", + " The primary :class:`sbol2.Document` containing the base component definitions\n", + " and combinatorial derivations.\n", + " plasmid_doc:\n", + " An additional :class:`sbol2.Document` used to resolve component variants\n", + " (plasmid-specific variants referenced by combinatorial derivations).\n", + "\n", + " Returns:\n", + " Dict[str, List[sbol2.ComponentDefinition]]:\n", + " A dictionary mapping component identities to lists\n", + " of corresponding component definitions.\n", + "\n", + " - Sequential design components map to lists containing a single definition.\n", + " - Combinatorial variable components map to lists of variant definitions.\n", + " \"\"\"\n", + " component_list = [c for c in design.getInSequentialOrder()]\n", + " component_dict = {\n", + " component.identity: [doc.getComponentDefinition(component.definition)]\n", + " for component in component_list\n", + " }\n", + "\n", + " for deriv in doc.combinatorialderivations:\n", + " for component in deriv.variableComponents:\n", + " component_dict[component.variable] = [\n", + " plasmid_doc.getComponentDefinition(var) for var in component.variants\n", + " ]\n", + "\n", + " return component_dict" + ] + }, + { + "cell_type": "markdown", + "id": "0ee4be8f", + "metadata": {}, + "source": [ + "### Problem: variant definitions are not included in sbolCanvas abstract combinatorial design document, only references\n", + "#### Solution: references can be resolved by pulling from plasmid collection" + ] + }, + { + "cell_type": "code", + "execution_count": 7, + "id": "4fef4173", + "metadata": {}, + "outputs": [], + "source": [ + "plasmid_collection = sbol2.Document()\n", + "sbh = sbol2.PartShop(\"https://synbiohub.org\")\n", + "sbh.pull(\n", + " \"https://synbiohub.org/user/Gon/CIDARMoCloPlasmidsKit/CIDARMoCloPlasmidsKit_collection/1/b7fdc21c6601a61d3166073a9e50f2c3843e1df5/share\",\n", + " plasmid_collection,\n", + ")" + ] + }, + { + "cell_type": "code", + "execution_count": 8, + "id": "5d87a7fd", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "https://sbolcanvas.org/abstract_combinatorial/J23100_1/1:\n", + "J23100\n", + "https://sbolcanvas.org/abstract_combinatorial/RBS_HFQr_2/1:\n", + "B0032\n", + "B0033\n", + "https://sbolcanvas.org/abstract_combinatorial/E0040m_gfp_3/1:\n", + "E0040m_gfp\n", + "https://sbolcanvas.org/abstract_combinatorial/B0015_4/1:\n", + "B0015\n" + ] + } + ], + "source": [ + "dict = extract_combinatorial_design_parts(toplevel, abstract_doc, plasmid_collection)\n", + "\n", + "for key, value in dict.items():\n", + " print(f\"{key}:\")\n", + " for element in value:\n", + " print(element.displayId)" + ] + }, + { + "cell_type": "code", + "execution_count": 9, + "id": "59be7c31", + "metadata": {}, + "outputs": [], + "source": [ + "import itertools\n", + "\n", + "\n", + "def enumerate_design_variants(component_dict):\n", + " \"\"\"\n", + " Given a dict mapping variable component identities to lists of ComponentDefinitions,\n", + " generate all possible design combinations as lists of ComponentDefinitions\n", + " (in consistent order of keys).\n", + " \"\"\"\n", + " keys = list(component_dict.keys())\n", + " variant_lists = [component_dict[k] for k in keys]\n", + "\n", + " # Cartesian product across all variant lists\n", + " all_variants = list(itertools.product(*variant_lists))\n", + "\n", + " # Convert tuples to lists (optional) for clarity\n", + " all_variants = [list(combo) for combo in all_variants]\n", + "\n", + " return all_variants" + ] + }, + { + "cell_type": "code", + "execution_count": 10, + "id": "f2c774c9", + "metadata": {}, + "outputs": [], + "source": [ + "from sbol2build.abstract_translator import (\n", + " construct_plasmid_dict,\n", + " extract_toplevel_definition,\n", + " get_compatible_plasmids,\n", + " MocloPlasmid,\n", + ")\n", + "\n", + "enumerated = enumerate_design_variants(dict)\n", + "\n", + "plasmid_dicts = []\n", + "\n", + "# for design in enumerated:\n", + "# plasmid_dicts.append(construct_plasmid_dict(design, plasmid_collection))" + ] + }, + { + "cell_type": "code", + "execution_count": 18, + "id": "0470f3f9", + "metadata": {}, + "outputs": [], + "source": [ + "def translate_abstract_to_plasmids(\n", + " abstract_design_doc: sbol2.Document,\n", + " plasmid_collection: sbol2.Document,\n", + " backbone_doc: sbol2.Document,\n", + "):\n", + " backbone_def = extract_toplevel_definition(backbone_doc)\n", + " backbone_plasmid = MocloPlasmid(backbone_def.displayId, backbone_def, backbone_doc)\n", + "\n", + " # combinatorial design\n", + " if len(abstract_design_doc.combinatorialderivations) > 0:\n", + " abstract_design_def = abstract_design_doc.getComponentDefinition(\n", + " abstract_design_doc.combinatorialderivations[0].masterTemplate\n", + " )\n", + "\n", + " combinatorial_part_dict = extract_combinatorial_design_parts(\n", + " abstract_design_def, abstract_design_doc, plasmid_collection\n", + " )\n", + " enumerated_part_list = enumerate_design_variants(combinatorial_part_dict)\n", + "\n", + " final_plasmid_list = []\n", + "\n", + " for design in enumerated_part_list:\n", + " plasmid_dict = construct_plasmid_dict(design, plasmid_collection)\n", + " final_plasmid_list += get_compatible_plasmids(\n", + " plasmid_dict, backbone_plasmid\n", + " )\n", + "\n", + " return set(final_plasmid_list)\n", + "\n", + " # generic design\n", + " else:\n", + " abstract_design_def = extract_toplevel_definition(abstract_design_doc)\n", + "\n", + " ordered_part_definitions = extract_design_parts(\n", + " abstract_design_def, abstract_design_doc\n", + " )\n", + "\n", + " plasmid_dict = construct_plasmid_dict(\n", + " ordered_part_definitions, plasmid_collection\n", + " )\n", + "\n", + " return get_compatible_plasmids(plasmid_dict, backbone_plasmid)" + ] + }, + { + "cell_type": "code", + "execution_count": 19, + "id": "97ee6712", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "found: https://synbiohub.org/user/Gon/CIDARMoCloParts/J23100/1 in https://synbiohub.org/user/Gon/CIDARMoCloPlasmidsKit/pJ23100_AB/1 with ['Fusion_Site_B', 'Fusion_Site_A']\n", + "found: https://synbiohub.org/user/Gon/CIDARMoCloParts/J23100/1 in https://synbiohub.org/user/Gon/CIDARMoCloPlasmidsKit/pJ23100_GB/1 with ['Fusion_Site_B', 'Fusion_Site_G']\n", + "found: https://synbiohub.org/user/Gon/CIDARMoCloParts/J23100/1 in https://synbiohub.org/user/Gon/CIDARMoCloPlasmidsKit/pJ23100_FB/1 with ['Fusion_Site_F', 'Fusion_Site_B']\n", + "found: https://synbiohub.org/user/Gon/CIDARMoCloParts/J23100/1 in https://synbiohub.org/user/Gon/CIDARMoCloPlasmidsKit/pJ23100_EB/1 with ['Fusion_Site_B', 'Fusion_Site_E']\n", + "found: https://synbiohub.org/user/Gon/CIDARMoCloParts/B0032/1 in https://synbiohub.org/user/Gon/CIDARMoCloPlasmidsKit/pB0032_BC/1 with ['Fusion_Site_C', 'Fusion_Site_B']\n", + "found: https://synbiohub.org/user/Gon/CIDARMoCloParts/E0040m_gfp/1 in https://synbiohub.org/user/Gon/CIDARMoCloPlasmidsKit/pE0040_CD/1 with ['Fusion_Site_D', 'Fusion_Site_C']\n", + "found: https://synbiohub.org/user/Gon/CIDARMoCloParts/B0015/1 in https://synbiohub.org/user/Gon/CIDARMoCloPlasmidsKit/pB0015_DG/1 with ['Fusion_Site_G', 'Fusion_Site_D']\n", + "found: https://synbiohub.org/user/Gon/CIDARMoCloParts/B0015/1 in https://synbiohub.org/user/Gon/CIDARMoCloPlasmidsKit/pB0015_DF/1 with ['Fusion_Site_F', 'Fusion_Site_D']\n", + "found: https://synbiohub.org/user/Gon/CIDARMoCloParts/B0015/1 in https://synbiohub.org/user/Gon/CIDARMoCloPlasmidsKit/pB0015_DE/1 with ['Fusion_Site_D', 'Fusion_Site_E']\n", + "found: https://synbiohub.org/user/Gon/CIDARMoCloParts/B0015/1 in https://synbiohub.org/user/Gon/CIDARMoCloPlasmidsKit/pB0015_DH/1 with ['Fusion_Site_D', 'Fusion_Site_H']\n", + "matched J23100_A_B with DVK_AE_A_E on fusion site A!\n", + "matched B0032_B_C with J23100_A_B on fusion site B!\n", + "matched E0040m_gfp_C_D with B0032_B_C on fusion site C!\n", + "matched final component B0015_D_E with E0040m_gfp_C_D and DVK_AE_A_E on fusion sites (D, E)!\n", + "found: https://synbiohub.org/user/Gon/CIDARMoCloParts/J23100/1 in https://synbiohub.org/user/Gon/CIDARMoCloPlasmidsKit/pJ23100_AB/1 with ['Fusion_Site_B', 'Fusion_Site_A']\n", + "found: https://synbiohub.org/user/Gon/CIDARMoCloParts/J23100/1 in https://synbiohub.org/user/Gon/CIDARMoCloPlasmidsKit/pJ23100_GB/1 with ['Fusion_Site_B', 'Fusion_Site_G']\n", + "found: https://synbiohub.org/user/Gon/CIDARMoCloParts/J23100/1 in https://synbiohub.org/user/Gon/CIDARMoCloPlasmidsKit/pJ23100_FB/1 with ['Fusion_Site_F', 'Fusion_Site_B']\n", + "found: https://synbiohub.org/user/Gon/CIDARMoCloParts/J23100/1 in https://synbiohub.org/user/Gon/CIDARMoCloPlasmidsKit/pJ23100_EB/1 with ['Fusion_Site_B', 'Fusion_Site_E']\n", + "found: https://synbiohub.org/user/Gon/CIDARMoCloParts/B0033/1 in https://synbiohub.org/user/Gon/CIDARMoCloPlasmidsKit/pB0033_BC/1 with ['Fusion_Site_B', 'Fusion_Site_C']\n", + "found: https://synbiohub.org/user/Gon/CIDARMoCloParts/E0040m_gfp/1 in https://synbiohub.org/user/Gon/CIDARMoCloPlasmidsKit/pE0040_CD/1 with ['Fusion_Site_D', 'Fusion_Site_C']\n", + "found: https://synbiohub.org/user/Gon/CIDARMoCloParts/B0015/1 in https://synbiohub.org/user/Gon/CIDARMoCloPlasmidsKit/pB0015_DG/1 with ['Fusion_Site_G', 'Fusion_Site_D']\n", + "found: https://synbiohub.org/user/Gon/CIDARMoCloParts/B0015/1 in https://synbiohub.org/user/Gon/CIDARMoCloPlasmidsKit/pB0015_DF/1 with ['Fusion_Site_F', 'Fusion_Site_D']\n", + "found: https://synbiohub.org/user/Gon/CIDARMoCloParts/B0015/1 in https://synbiohub.org/user/Gon/CIDARMoCloPlasmidsKit/pB0015_DE/1 with ['Fusion_Site_D', 'Fusion_Site_E']\n", + "found: https://synbiohub.org/user/Gon/CIDARMoCloParts/B0015/1 in https://synbiohub.org/user/Gon/CIDARMoCloPlasmidsKit/pB0015_DH/1 with ['Fusion_Site_D', 'Fusion_Site_H']\n", + "matched J23100_A_B with DVK_AE_A_E on fusion site A!\n", + "matched B0033_B_C with J23100_A_B on fusion site B!\n", + "matched E0040m_gfp_C_D with B0033_B_C on fusion site C!\n", + "matched final component B0015_D_E with E0040m_gfp_C_D and DVK_AE_A_E on fusion sites (D, E)!\n" + ] + }, + { + "data": { + "text/plain": [ + "{MocloPlasmid:\n", + " Name: B0015_D_E\n", + " Definition: https://synbiohub.org/user/Gon/CIDARMoCloPlasmidsKit/pB0015_DE/1\n", + " Fusion Sites: ['D', 'E'],\n", + " MocloPlasmid:\n", + " Name: B0032_B_C\n", + " Definition: https://synbiohub.org/user/Gon/CIDARMoCloPlasmidsKit/pB0032_BC/1\n", + " Fusion Sites: ['B', 'C'],\n", + " MocloPlasmid:\n", + " Name: B0033_B_C\n", + " Definition: https://synbiohub.org/user/Gon/CIDARMoCloPlasmidsKit/pB0033_BC/1\n", + " Fusion Sites: ['B', 'C'],\n", + " MocloPlasmid:\n", + " Name: E0040m_gfp_C_D\n", + " Definition: https://synbiohub.org/user/Gon/CIDARMoCloPlasmidsKit/pE0040_CD/1\n", + " Fusion Sites: ['C', 'D'],\n", + " MocloPlasmid:\n", + " Name: J23100_A_B\n", + " Definition: https://synbiohub.org/user/Gon/CIDARMoCloPlasmidsKit/pJ23100_AB/1\n", + " Fusion Sites: ['A', 'B']}" + ] + }, + "execution_count": 19, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "bb_doc = sbol2.Document()\n", + "sbh.pull(\n", + " \"https://synbiohub.org/user/Gon/CIDARMoCloPlasmidsKit/DVK_AE/1/647c5b2458567dcce6b0a37178d352b8ffa9a7fe/share\",\n", + " bb_doc,\n", + ")\n", + "\n", + "translate_abstract_to_plasmids(\n", + " abstract_design_doc=abstract_doc,\n", + " plasmid_collection=plasmid_collection,\n", + " backbone_doc=bb_doc,\n", + ")" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "06f2668c", + "metadata": {}, + "outputs": [], + "source": [] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python (buildplanner)", + "language": "python", + "name": "buildplanner" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.13.7" + } + }, + "nbformat": 4, + "nbformat_minor": 5 +} diff --git a/notebooks/test_notebook.ipynb b/notebooks/test_notebook.ipynb index d7237b2..a6fd52c 100644 --- a/notebooks/test_notebook.ipynb +++ b/notebooks/test_notebook.ipynb @@ -9,7 +9,7 @@ }, { "cell_type": "code", - "execution_count": 1, + "execution_count": 8, "metadata": {}, "outputs": [], "source": [ @@ -30,7 +30,7 @@ }, { "cell_type": "code", - "execution_count": 2, + "execution_count": 9, "metadata": {}, "outputs": [ { @@ -38,20 +38,33 @@ "output_type": "stream", "text": [ "DVK_AE\n", - "found: https://synbiohub.org/user/Gon/CIDARMoCloParts/J23100/1 in https://synbiohub.org/user/Gon/CIDARMoCloPlasmidsKit/pJ23100_EB/1 with ['Fusion_Site_E', 'Fusion_Site_B']\n", - "found: https://synbiohub.org/user/Gon/CIDARMoCloParts/J23100/1 in https://synbiohub.org/user/Gon/CIDARMoCloPlasmidsKit/pJ23100_FB/1 with ['Fusion_Site_F', 'Fusion_Site_B']\n", "found: https://synbiohub.org/user/Gon/CIDARMoCloParts/J23100/1 in https://synbiohub.org/user/Gon/CIDARMoCloPlasmidsKit/pJ23100_AB/1 with ['Fusion_Site_A', 'Fusion_Site_B']\n", "found: https://synbiohub.org/user/Gon/CIDARMoCloParts/J23100/1 in https://synbiohub.org/user/Gon/CIDARMoCloPlasmidsKit/pJ23100_GB/1 with ['Fusion_Site_B', 'Fusion_Site_G']\n", + "found: https://synbiohub.org/user/Gon/CIDARMoCloParts/J23100/1 in https://synbiohub.org/user/Gon/CIDARMoCloPlasmidsKit/pJ23100_FB/1 with ['Fusion_Site_F', 'Fusion_Site_B']\n", + "found: https://synbiohub.org/user/Gon/CIDARMoCloParts/J23100/1 in https://synbiohub.org/user/Gon/CIDARMoCloPlasmidsKit/pJ23100_EB/1 with ['Fusion_Site_E', 'Fusion_Site_B']\n", "found: https://synbiohub.org/user/Gon/CIDARMoCloParts/B0034/1 in https://synbiohub.org/user/Gon/CIDARMoCloPlasmidsKit/pB0034_BC/1 with ['Fusion_Site_B', 'Fusion_Site_C']\n", "found: https://synbiohub.org/user/Gon/CIDARMoCloParts/E0030_yfp/1 in https://synbiohub.org/user/Gon/CIDARMoCloPlasmidsKit/pE0030_CD/1 with ['Fusion_Site_D', 'Fusion_Site_C']\n", - "found: https://synbiohub.org/user/Gon/CIDARMoCloParts/B0015/1 in https://synbiohub.org/user/Gon/CIDARMoCloPlasmidsKit/pB0015_DF/1 with ['Fusion_Site_F', 'Fusion_Site_D']\n", "found: https://synbiohub.org/user/Gon/CIDARMoCloParts/B0015/1 in https://synbiohub.org/user/Gon/CIDARMoCloPlasmidsKit/pB0015_DG/1 with ['Fusion_Site_G', 'Fusion_Site_D']\n", + "found: https://synbiohub.org/user/Gon/CIDARMoCloParts/B0015/1 in https://synbiohub.org/user/Gon/CIDARMoCloPlasmidsKit/pB0015_DF/1 with ['Fusion_Site_F', 'Fusion_Site_D']\n", "found: https://synbiohub.org/user/Gon/CIDARMoCloParts/B0015/1 in https://synbiohub.org/user/Gon/CIDARMoCloPlasmidsKit/pB0015_DE/1 with ['Fusion_Site_D', 'Fusion_Site_E']\n", "found: https://synbiohub.org/user/Gon/CIDARMoCloParts/B0015/1 in https://synbiohub.org/user/Gon/CIDARMoCloPlasmidsKit/pB0015_DH/1 with ['Fusion_Site_H', 'Fusion_Site_D']\n", "matched J23100_A_B with DVK_AE_A_E on fusion site A!\n", "matched B0034_B_C with J23100_A_B on fusion site B!\n", "matched E0030_yfp_C_D with B0034_B_C on fusion site C!\n", - "matched final component B0015_D_E with E0030_yfp_C_D and DVK_AE_A_E on fusion sites (D, E)!\n" + "matched final component B0015_D_E with E0030_yfp_C_D and DVK_AE_A_E on fusion sites (D, E)!\n", + "[MocloPlasmid:\n", + " Name: J23100_A_B\n", + " Definition: https://synbiohub.org/user/Gon/CIDARMoCloPlasmidsKit/pJ23100_AB/1\n", + " Fusion Sites: ['A', 'B'], MocloPlasmid:\n", + " Name: B0034_B_C\n", + " Definition: https://synbiohub.org/user/Gon/CIDARMoCloPlasmidsKit/pB0034_BC/1\n", + " Fusion Sites: ['B', 'C'], MocloPlasmid:\n", + " Name: E0030_yfp_C_D\n", + " Definition: https://synbiohub.org/user/Gon/CIDARMoCloPlasmidsKit/pE0030_CD/1\n", + " Fusion Sites: ['C', 'D'], MocloPlasmid:\n", + " Name: B0015_D_E\n", + " Definition: https://synbiohub.org/user/Gon/CIDARMoCloPlasmidsKit/pB0015_DE/1\n", + " Fusion Sites: ['D', 'E']]\n" ] } ], @@ -80,7 +93,9 @@ "\n", "mocloplasmid_list = translate_abstract_to_plasmids(\n", " abstract_design_doc, plasmid_collection, backbone_doc\n", - ")" + ")\n", + "\n", + "print(mocloplasmid_list)" ] }, { @@ -92,7 +107,7 @@ }, { "cell_type": "code", - "execution_count": 3, + "execution_count": 10, "metadata": {}, "outputs": [], "source": [ @@ -119,7 +134,7 @@ }, { "cell_type": "code", - "execution_count": 4, + "execution_count": 11, "metadata": {}, "outputs": [ { @@ -180,7 +195,7 @@ }, { "cell_type": "code", - "execution_count": 5, + "execution_count": 12, "metadata": {}, "outputs": [ { @@ -226,7 +241,7 @@ "'Valid.'" ] }, - "execution_count": 5, + "execution_count": 12, "metadata": {}, "output_type": "execute_result" } @@ -238,14 +253,14 @@ }, { "cell_type": "code", - "execution_count": 6, + "execution_count": 13, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ - "[, , , , ]\n", + "[, , , , ]\n", "adding: pJ23100_AB_extracted_part\n", "adding: pJ23100_AB_five_prime_oh\n", "adding: Fusion_Site_A\n", @@ -292,7 +307,7 @@ "'Valid.'" ] }, - "execution_count": 6, + "execution_count": 13, "metadata": {}, "output_type": "execute_result" } From 96a338e41c36fcccf4e1ea8e77f8921c8e6115b0 Mon Sep 17 00:00:00 2001 From: Ryan Greer Date: Mon, 3 Nov 2025 19:01:00 -0700 Subject: [PATCH 22/27] moving notebook functions into main code --- src/sbol2build/abstract_translator.py | 159 ++++++++++++++++++++++++-- 1 file changed, 149 insertions(+), 10 deletions(-) diff --git a/src/sbol2build/abstract_translator.py b/src/sbol2build/abstract_translator.py index faf1871..137c605 100644 --- a/src/sbol2build/abstract_translator.py +++ b/src/sbol2build/abstract_translator.py @@ -1,5 +1,6 @@ import sbol2 -from typing import Dict, List +import itertools +from typing import Dict, List, Set from .constants import FUSION_SITES @@ -33,6 +34,14 @@ def __repr__(self) -> str: f" Fusion Sites: {self.fusion_sites or 'Not found'}" ) + def __eq__(self, other): + if not isinstance(other, MocloPlasmid): + return False + return self.definition == other.definition + + def __hash__(self): + return hash(self.definition) + def extract_fusion_sites( plasmid: sbol2.ComponentDefinition, doc: sbol2.Document @@ -75,13 +84,91 @@ def extract_design_parts( ] +def extract_combinatorial_design_parts( + design: sbol2.ComponentDefinition, doc: sbol2.Document, plasmid_doc +) -> Dict[str, List[sbol2.ComponentDefinition]]: + """ + Extracts and returns a mapping of component definitions from a combinatorial design, in order. + Variants of combinatinatorial components are entered in a list corresponding to the URI of the component in the abstract design. + + Args: + design: + The :class:`sbol2.ComponentDefinition` representing the top-level design + from which to extract parts. + doc: + The primary :class:`sbol2.Document` containing the base component definitions + and combinatorial derivations. + plasmid_doc: + An additional :class:`sbol2.Document` used to resolve component variants + (plasmid-specific variants referenced by combinatorial derivations). + + Returns: + Dict[str, List[sbol2.ComponentDefinition]]: + A dictionary mapping component identities to lists + of variable component definitions. + + - Sequential design components map to lists containing a single definition. + - Combinatorial variable components map to lists of variant definitions. + """ + component_list = [c for c in design.getInSequentialOrder()] + component_dict = { + component.identity: [doc.getComponentDefinition(component.definition)] + for component in component_list + } + + for deriv in doc.combinatorialderivations: + for component in deriv.variableComponents: + component_dict[component.variable] = [ + plasmid_doc.getComponentDefinition(var) for var in component.variants + ] + + return component_dict + + def extract_toplevel_definition(doc: sbol2.Document) -> sbol2.ComponentDefinition: return doc.componentDefinitions[0] +def enumerate_design_variants(component_dict): + """ + Given a dict mapping variable component identities to lists of ComponentDefinitions, + generate all possible design combinations as lists of ComponentDefinitions + (in consistent order of keys). + """ + keys = list(component_dict.keys()) + variant_lists = [component_dict[k] for k in keys] + + # Cartesian product across all variant lists + all_variants = list(itertools.product(*variant_lists)) + + all_variants = [list(combo) for combo in all_variants] + + return all_variants + + def construct_plasmid_dict( part_list: List[sbol2.ComponentDefinition], plasmid_collection: sbol2.Document ) -> Dict[str, List[MocloPlasmid]]: + """ + Builds a mapping from part display IDs to lists of compatible MoCloPlasmid objects. + + For each part in the given list, this function searches the provided plasmid + collection for plasmids that contain the part as a component. + Each matching plasmid is wrapped in a `MocloPlasmid` object and added to the + dictionary under the part's display ID. + + Args: + part_list: + List of :class:`sbol2.ComponentDefinition` objects representing + the parts to match. + plasmid_collection: + The :class:`sbol2.Document` containing plasmids to search through. + + Returns: + Dict[str, List[MocloPlasmid]]: + A dictionary mapping each part display ID to a list of corresponding + `MocloPlasmid` objects found in the collection. + """ plasmid_dict = {} for part in part_list: for plasmid in plasmid_collection.componentDefinitions: @@ -162,20 +249,72 @@ def get_compatible_plasmids( return selected_plasmids -# TODO potenitally replace each componentdefinition with a SBH URI, or extract definitions from SBH before calling def translate_abstract_to_plasmids( abstract_design_doc: sbol2.Document, plasmid_collection: sbol2.Document, backbone_doc: sbol2.Document, -): - abstract_design_def = extract_toplevel_definition(abstract_design_doc) - backbone_def = extract_toplevel_definition(backbone_doc) +) -> Set[MocloPlasmid]: + """ + Translates an abstract SBOLCanvas design into a set of compatible MoClo plasmid assemblies. - ordered_part_definitions = extract_design_parts( - abstract_design_def, abstract_design_doc - ) + Takes an abstract design, identifies the appropriate component + definitions and combinatorial derivations, and produces all possible plasmid + combinations that can be assembled using the provided backbone and plasmid + collection. - plasmid_dict = construct_plasmid_dict(ordered_part_definitions, plasmid_collection) + Args: + abstract_design_doc: + The :class:`sbol2.Document` representing the abstract genetic design. + May include either a single component definition (generic design) or + one or more combinatorial derivations (combinatorial design). + plasmid_collection: + The :class:`sbol2.Document` containing the available MoClo plasmid + components used for matching and assembly. + backbone_doc: + The :class:`sbol2.Document` defining the backbone plasmid into which + parts are assembled. + + Returns: + Set[MocloPlasmid]: + - For combinatorial designs: a **set** of unique compatible plasmids + (`MocloPlasmid` objects) representing all enumerated design variants. + - For generic designs: a **set** of compatible plasmids for the single + design instance. + """ + backbone_def = extract_toplevel_definition(backbone_doc) backbone_plasmid = MocloPlasmid(backbone_def.displayId, backbone_def, backbone_doc) - return get_compatible_plasmids(plasmid_dict, backbone_plasmid) + # combinatorial design + if len(abstract_design_doc.combinatorialderivations) > 0: + abstract_design_def = abstract_design_doc.getComponentDefinition( + abstract_design_doc.combinatorialderivations[0].masterTemplate + ) + + combinatorial_part_dict = extract_combinatorial_design_parts( + abstract_design_def, abstract_design_doc, plasmid_collection + ) + enumerated_part_list = enumerate_design_variants(combinatorial_part_dict) + + final_plasmid_list = [] + + for design in enumerated_part_list: + plasmid_dict = construct_plasmid_dict(design, plasmid_collection) + final_plasmid_list += get_compatible_plasmids( + plasmid_dict, backbone_plasmid + ) + + return set(final_plasmid_list) + + # generic design + else: + abstract_design_def = extract_toplevel_definition(abstract_design_doc) + + ordered_part_definitions = extract_design_parts( + abstract_design_def, abstract_design_doc + ) + + plasmid_dict = construct_plasmid_dict( + ordered_part_definitions, plasmid_collection + ) + + return set(get_compatible_plasmids(plasmid_dict, backbone_plasmid)) From 76865c92e160f9aaa4d491fe9cedbccb96c0ee0f Mon Sep 17 00:00:00 2001 From: Ryan Greer Date: Tue, 4 Nov 2025 16:23:05 -0700 Subject: [PATCH 23/27] documentation --- README.md | 35 ++++++++++++++++++++++++++- src/sbol2build/abstract_translator.py | 2 +- 2 files changed, 35 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index 9e5c4bf..92a10af 100644 --- a/README.md +++ b/README.md @@ -18,5 +18,38 @@ It was developed to support build functionality and workflows in [SynBioSuite](h Please visit the documentation with API reference and tutorials at Read the Docs: [sbol2build.rtfd.io](https://sbol2build.readthedocs.io) +## Environment Setup + +If you are interested in contributing to **BuildPlanner**, please set up your local development environment with the same tools used in CI and linting. + +### 1. Install [uv](https://docs.astral.sh/uv/) + +`uv` manages all Python dependencies (including dev tools) with a lockfile for reproducibility. + +#### Linux/Bash +```bash +curl -LsSf https://astral.sh/uv/install.sh | sh +``` +#### Mac OSX with Homebrew +```bash +brew install uv +``` +### 2. Sync dependencies +```bash +uv sync --all-groups +``` +This will create a virtual environment with the dependiencies. Activate using: +```bash +source .venv/bin/activate +``` + +### 3. Install pre-commit hooks +We use pre-commit to automatically run the Ruff linter before every commit. +Install and enable the hooks with: +```bash +uv run pre-commit install +``` + + #### Running tests: -`python -m unittest discover -s tests` \ No newline at end of file +`uv run python -m unittest discover -s tests` \ No newline at end of file diff --git a/src/sbol2build/abstract_translator.py b/src/sbol2build/abstract_translator.py index 137c605..462a22a 100644 --- a/src/sbol2build/abstract_translator.py +++ b/src/sbol2build/abstract_translator.py @@ -205,7 +205,7 @@ def get_compatible_plasmids( """ Returns a list of MocloPlasmid objects that can form a compatible assembly with the given backbone plasmid. The function selects one plasmid from each - entry in the dictionary, ensuring that adjacent plasmids have matching fusion sites, + entry in the dictionary, ensuring that adjacent plasmids have matching MoClo fusion sites, and that the first and last plasmids are compatible with the backbone. Args: From 0665c73a6f0a9bc2cca2bac68a77584f49c0abd2 Mon Sep 17 00:00:00 2001 From: Ryan Greer Date: Wed, 5 Nov 2025 14:12:20 -0700 Subject: [PATCH 24/27] changed from set to duplicate-removed list to preserve plasmid order --- src/sbol2build/abstract_translator.py | 42 +++++++++++++++++++++------ 1 file changed, 33 insertions(+), 9 deletions(-) diff --git a/src/sbol2build/abstract_translator.py b/src/sbol2build/abstract_translator.py index 462a22a..5d51e10 100644 --- a/src/sbol2build/abstract_translator.py +++ b/src/sbol2build/abstract_translator.py @@ -1,6 +1,6 @@ import sbol2 import itertools -from typing import Dict, List, Set +from typing import Dict, List from .constants import FUSION_SITES @@ -84,6 +84,24 @@ def extract_design_parts( ] +def copy_sequences(component_definition, target_doc, collection_doc): + """Copy all sequences referenced by a ComponentDefinition into target_doc.""" + subdefinitions = extract_design_parts(component_definition, collection_doc) + + for seq_uri in component_definition.sequences: + seq_obj = component_definition.doc.find(seq_uri) + if seq_obj is not None: + seq_obj.copy(target_doc) + + for subdefinition in subdefinitions: + print(subdefinition.displayId) + subdefinition.copy(target_doc) + for seq_uri in subdefinition.sequences: + seq_obj = component_definition.doc.find(seq_uri) + if seq_obj is not None: + seq_obj.copy(target_doc) + + def extract_combinatorial_design_parts( design: sbol2.ComponentDefinition, doc: sbol2.Document, plasmid_doc ) -> Dict[str, List[sbol2.ComponentDefinition]]: @@ -253,7 +271,7 @@ def translate_abstract_to_plasmids( abstract_design_doc: sbol2.Document, plasmid_collection: sbol2.Document, backbone_doc: sbol2.Document, -) -> Set[MocloPlasmid]: +) -> List[MocloPlasmid]: """ Translates an abstract SBOLCanvas design into a set of compatible MoClo plasmid assemblies. @@ -275,10 +293,10 @@ def translate_abstract_to_plasmids( parts are assembled. Returns: - Set[MocloPlasmid]: - - For combinatorial designs: a **set** of unique compatible plasmids + List[MocloPlasmid]: + - For combinatorial designs: a list of unique compatible plasmids (`MocloPlasmid` objects) representing all enumerated design variants. - - For generic designs: a **set** of compatible plasmids for the single + - For generic designs: a list of compatible plasmids for the single design instance. """ backbone_def = extract_toplevel_definition(backbone_doc) @@ -295,15 +313,21 @@ def translate_abstract_to_plasmids( ) enumerated_part_list = enumerate_design_variants(combinatorial_part_dict) - final_plasmid_list = [] + seen = set() + ordered_unique_plasmids = [] for design in enumerated_part_list: plasmid_dict = construct_plasmid_dict(design, plasmid_collection) - final_plasmid_list += get_compatible_plasmids( + compatible_plasmids = get_compatible_plasmids( plasmid_dict, backbone_plasmid ) - return set(final_plasmid_list) + for plasmid in compatible_plasmids: + if plasmid not in seen: + seen.add(plasmid) + ordered_unique_plasmids.append(plasmid) + + return ordered_unique_plasmids # generic design else: @@ -317,4 +341,4 @@ def translate_abstract_to_plasmids( ordered_part_definitions, plasmid_collection ) - return set(get_compatible_plasmids(plasmid_dict, backbone_plasmid)) + return get_compatible_plasmids(plasmid_dict, backbone_plasmid) From 578553750bae89203a9aa6c079a5af1a5d1d64b7 Mon Sep 17 00:00:00 2001 From: Ryan Greer Date: Wed, 5 Nov 2025 14:13:09 -0700 Subject: [PATCH 25/27] simple test for two design. add more soon --- tests/test_abstract.py | 97 ++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 97 insertions(+) diff --git a/tests/test_abstract.py b/tests/test_abstract.py index f704746..54d7d8c 100644 --- a/tests/test_abstract.py +++ b/tests/test_abstract.py @@ -3,3 +3,100 @@ # test 2: inaccessible part in abstract design -> should throw informative error message # test 3: (FUTURE) abstract design with multiple TUs + +import sbol2 +import os +import sys +import unittest +from sbol2build.abstract_translator import ( + translate_abstract_to_plasmids, + copy_sequences, +) + +from sbol2build import ( + golden_gate_assembly_plan, +) + +sys.path.insert(0, os.path.abspath(os.path.join(os.path.dirname(__file__), "../src"))) + + +class Test_Abstract_Translation_Functions(unittest.TestCase): + @classmethod + def setUpClass(cls): + cls.sbh = sbol2.PartShop("https://synbiohub.org") + + cls.plasmid_collection = sbol2.Document() + cls.sbh.pull( + "https://synbiohub.org/user/Gon/CIDARMoCloPlasmidsKit/CIDARMoCloPlasmidsKit_collection/1/b7fdc21c6601a61d3166073a9e50f2c3843e1df5/share", + cls.plasmid_collection, + ) + + cls.DVK_AE_doc = sbol2.Document() + cls.sbh.pull( + "https://synbiohub.org/user/Gon/CIDARMoCloPlasmidsKit/DVK_AE/1/647c5b2458567dcce6b0a37178d352b8ffa9a7fe/share", + cls.DVK_AE_doc, + ) + + def test_simple_abstract_translation(self): + abstract_design_doc = sbol2.Document() + abstract_design_doc.read("tests/test_files/moclo_parts_circuit.xml") + + mocloplasmid_list = translate_abstract_to_plasmids( + abstract_design_doc, self.plasmid_collection, self.DVK_AE_doc + ) + + self.assertEqual( + len(mocloplasmid_list), + 4, + "There should be 4 plasmids in the abstract translation", + ) + + prev_site = "A" + for plas in mocloplasmid_list: + self.assertEqual(prev_site, plas.fusion_sites[0], mocloplasmid_list) + prev_site = plas.fusion_sites[1] + + def test_two_rbs_combinatorial_translation(self): + comb_doc = sbol2.Document() + comb_doc.read("tests/test_files/combinatorial_1.xml") + + comb_plasmid_list = translate_abstract_to_plasmids( + comb_doc, self.plasmid_collection, self.DVK_AE_doc + ) + + self.assertEqual( + len(comb_plasmid_list), + 5, + "There should be 5 plasmids in the abstract translation", + ) + + # Run through sbol2build to test composite count + part_documents = [] + + for mocloPlasmid in comb_plasmid_list: + temp_doc = sbol2.Document() + mocloPlasmid.definition.copy(temp_doc) + copy_sequences(mocloPlasmid.definition, temp_doc, self.plasmid_collection) + part_documents.append(temp_doc) + + assembly_doc = sbol2.Document() + assembly_obj = golden_gate_assembly_plan( + "combinatorial_rbs_assembly_plan", + part_documents, + self.DVK_AE_doc, + "BsaI", + assembly_doc, + ) + + composite_list = assembly_obj.run() + assembly_doc.write("comb_assembly.xml") + + self.assertEqual( + len(composite_list), + 2, + "Combinatorial assembly failed to produce 2 composites", + ) + + +if __name__ == "__main__": + unittest.main() From 63a4cfc6bcb90b87aea22dc318ef100c8015baa8 Mon Sep 17 00:00:00 2001 From: Ryan Greer Date: Wed, 5 Nov 2025 15:10:30 -0700 Subject: [PATCH 26/27] test path fix --- tests/test_abstract.py | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/tests/test_abstract.py b/tests/test_abstract.py index 54d7d8c..474baa4 100644 --- a/tests/test_abstract.py +++ b/tests/test_abstract.py @@ -5,9 +5,12 @@ # test 3: (FUTURE) abstract design with multiple TUs import sbol2 -import os -import sys import unittest +import sys +import os + +sys.path.insert(0, os.path.abspath(os.path.join(os.path.dirname(__file__), "../src"))) + from sbol2build.abstract_translator import ( translate_abstract_to_plasmids, copy_sequences, @@ -17,8 +20,6 @@ golden_gate_assembly_plan, ) -sys.path.insert(0, os.path.abspath(os.path.join(os.path.dirname(__file__), "../src"))) - class Test_Abstract_Translation_Functions(unittest.TestCase): @classmethod From 2a7010347a9f50e383bda0540c0f9d529fbe91aa Mon Sep 17 00:00:00 2001 From: Ryan Greer Date: Thu, 6 Nov 2025 14:04:27 -0700 Subject: [PATCH 27/27] added 3pro 3rbs test case for combinatorial design --- tests/test_abstract.py | 43 +++ .../complex_combinatorial_abstract.xml | 332 ++++++++++++++++++ 2 files changed, 375 insertions(+) create mode 100644 tests/test_files/complex_combinatorial_abstract.xml diff --git a/tests/test_abstract.py b/tests/test_abstract.py index 474baa4..00ba486 100644 --- a/tests/test_abstract.py +++ b/tests/test_abstract.py @@ -98,6 +98,49 @@ def test_two_rbs_combinatorial_translation(self): "Combinatorial assembly failed to produce 2 composites", ) + def test_complex_combinatorial_translation( + self, + ): # testing combinatorial design with 3 variable promoters and RBSs + complex_comb_doc = sbol2.Document() + complex_comb_doc.read("tests/test_files/complex_combinatorial_abstract.xml") + + comb_plasmid_list = translate_abstract_to_plasmids( + complex_comb_doc, self.plasmid_collection, self.DVK_AE_doc + ) + + self.assertEqual( + len(comb_plasmid_list), + 8, + f"There should be 8 plasmids in the abstract translation, found {len(comb_plasmid_list)}", + ) + + # Run through sbol2build to test composite count + part_documents = [] + + for mocloPlasmid in comb_plasmid_list: + temp_doc = sbol2.Document() + mocloPlasmid.definition.copy(temp_doc) + copy_sequences(mocloPlasmid.definition, temp_doc, self.plasmid_collection) + part_documents.append(temp_doc) + + assembly_doc = sbol2.Document() + assembly_obj = golden_gate_assembly_plan( + "complex_combinatorial_assembly_plan", + part_documents, + self.DVK_AE_doc, + "BsaI", + assembly_doc, + ) + + composite_list = assembly_obj.run() + assembly_doc.write("complex_comb_assembly.xml") + + self.assertEqual( + len(composite_list), + 9, + f"Combinatorial assembly failed to produce 9 composites, found {len(composite_list)}", + ) + if __name__ == "__main__": unittest.main() diff --git a/tests/test_files/complex_combinatorial_abstract.xml b/tests/test_files/complex_combinatorial_abstract.xml new file mode 100644 index 0000000..c41e036 --- /dev/null +++ b/tests/test_files/complex_combinatorial_abstract.xml @@ -0,0 +1,332 @@ + + + + + dEOuAjnj + 1 + + + + + + + Pro_cV9w_1 + 1 + + + + + + + + B0015_4 + 1 + + + + + + + + RBS_IU5T_2 + 1 + + + + + + + + E0040m_gfp_3 + 1 + + + + + + + + dEOuAjnjAnnotation0 + 1 + + + + location0 + 1 + + + + + + + + + + dEOuAjnjAnnotation3 + 1 + + + + location3 + 1 + 721 + 849 + + + + + + + + + + dEOuAjnjAnnotation1 + 1 + + + + location1 + 1 + + + + + + + + + + dEOuAjnjAnnotation2 + 1 + + + + location2 + 1 + 1 + 720 + + + + + + + + + + dEOuAjnjConstraint2 + 1 + + + + + + + + + dEOuAjnjConstraint3 + 1 + + + + + + + + + dEOuAjnjConstraint1 + 1 + + + + + + + + + + Pro_cV9w + 1 + Pro + + + + + + B0015 + 1 + B0015 + MoClo Basic Part: Double terminator (B0010:B0012) + + + + + 26479688 + + + + + + + E0040m_gfp + 1 + E0040m_gfp + MoClo Basic Part: CDS - Fluorescent protein. Green. Modified from Bba_E0040 to fix illegal site. + + + + + 26479688 + + + + + + + RBS_IU5T + 1 + RBS + + + + + + dEOuAjnj_sequence + ATGCGTAAAGGAGAAGAACTTTTCACTGGAGTTGTCCCAATTCTTGTTGAATTAGATGGTGATGTTAATGGGCACAAATTTTCTGTCAGTGGAGAGGGTGAAGGTGATGCAACATACGGAAAACTTACCCTTAAATTTATTTGCACTACTGGAAAACTACCTGTTCCATGGCCAACACTTGTCACTACTTTCGGTTATGGTGTTCAATGCTTTGCGAGATACCCAGATCATATGAAACAGCATGACTTTTTCAAGAGTGCCATGCCCGAAGGTTATGTACAGGAAAGAACTATATTTTTCAAAGATGACGGGAACTACAAGACACGTGCTGAAGTCAAGTTTGAAGGTGATACCCTTGTTAATAGAATCGAGTTAAAAGGTATTGATTTTAAAGAAGATGGAAACATTCTTGGACACAAATTGGAATACAACTATAACTCACACAATGTATACATCATGGCAGACAAACAAAAGAATGGAATCAAAGTTAACTTCAAAATTAGACACAACATTGAAGATGGAAGCGTTCAACTAGCAGACCATTATCAACAAAATACTCCAATTGGCGATGGCCCTGTCCTTTTACCAGACAACCATTACCTGTCCACACAATCTGCCCTTTCGAAAGATCCCAACGAAAAGAGAGATCACATGGTCCTTCTTGAGTTTGTAACAGCTGCTGGGATTACACATGGCATGGATGAACTATACAAATAATAACCAGGCATCAAATAAAACGAAAGGCTCAGTCGAAAGACTGGGCCTTTCGTTTTATCTGTTGTTTGTCGGTGAACGCTCTCTACTAGAGTCACACTGGCTCACCTTCGGGTGGGCCTTTCTGCGTTTATA + + + + + B0015_sequence + 1 + B0015 Sequence + + + + CCAGGCATCAAATAAAACGAAAGGCTCAGTCGAAAGACTGGGCCTTTCGTTTTATCTGTTGTTTGTCGGTGAACGCTCTCTACTAGAGTCACACTGGCTCACCTTCGGGTGGGCCTTTCTGCGTTTATA + + + + + E0040m_gfp_sequence + 1 + E0040m_gfp Sequence + + + + ATGCGTAAAGGAGAAGAACTTTTCACTGGAGTTGTCCCAATTCTTGTTGAATTAGATGGTGATGTTAATGGGCACAAATTTTCTGTCAGTGGAGAGGGTGAAGGTGATGCAACATACGGAAAACTTACCCTTAAATTTATTTGCACTACTGGAAAACTACCTGTTCCATGGCCAACACTTGTCACTACTTTCGGTTATGGTGTTCAATGCTTTGCGAGATACCCAGATCATATGAAACAGCATGACTTTTTCAAGAGTGCCATGCCCGAAGGTTATGTACAGGAAAGAACTATATTTTTCAAAGATGACGGGAACTACAAGACACGTGCTGAAGTCAAGTTTGAAGGTGATACCCTTGTTAATAGAATCGAGTTAAAAGGTATTGATTTTAAAGAAGATGGAAACATTCTTGGACACAAATTGGAATACAACTATAACTCACACAATGTATACATCATGGCAGACAAACAAAAGAATGGAATCAAAGTTAACTTCAAAATTAGACACAACATTGAAGATGGAAGCGTTCAACTAGCAGACCATTATCAACAAAATACTCCAATTGGCGATGGCCCTGTCCTTTTACCAGACAACCATTACCTGTCCACACAATCTGCCCTTTCGAAAGATCCCAACGAAAAGAGAGATCACATGGTCCTTCTTGAGTTTGTAACAGCTGCTGGGATTACACATGGCATGGATGAACTATACAAATAATAA + + + + + Pro_cV9w_Layout + + + + + B0015_Layout + + + + + dEOuAjnj_Layout + + + + 433.0 + 334.5 + 200.0 + 100.0 + container + + + + + 0.0 + 50.0 + 200.0 + 1.0 + backbone + + + + + 0.0 + 0.0 + 50.0 + 100.0 + Pro_cV9w_1 + + + + + + 50.0 + 0.0 + 50.0 + 100.0 + RBS_IU5T_2 + + + + + + 100.0 + 0.0 + 50.0 + 100.0 + E0040m_gfp_3 + + + + + + 150.0 + 0.0 + 50.0 + 100.0 + B0015_4 + + + + + + + RBS_IU5T_Layout + + + + + E0040m_gfp_Layout + + + + + combinatorial21 + 3_RBS_Comb + + + + + + RBS_IU5T_2_VariableComponent + + + + + + + + + + + Pro_cV9w_1_VariableComponent + + + + + + + + +